Lines Matching defs:a
4 * A tnum tracks knowledge about the bits of a value. Each bit can be either
37 struct tnum tnum_lshift(struct tnum a, u8 shift)
39 return TNUM(a.value << shift, a.mask << shift);
42 struct tnum tnum_rshift(struct tnum a, u8 shift)
44 return TNUM(a.value >> shift, a.mask >> shift);
47 struct tnum tnum_arshift(struct tnum a, u8 min_shift, u8 insn_bitness)
49 /* if a.value is negative, arithmetic shifting by minimum shift
51 * If a.value is nonnegative, arithmetic shifting by minimum shift
55 return TNUM((u32)(((s32)a.value) >> min_shift),
56 (u32)(((s32)a.mask) >> min_shift));
58 return TNUM((s64)a.value >> min_shift,
59 (s64)a.mask >> min_shift);
62 struct tnum tnum_add(struct tnum a, struct tnum b)
66 sm = a.mask + b.mask;
67 sv = a.value + b.value;
70 mu = chi | a.mask | b.mask;
74 struct tnum tnum_sub(struct tnum a, struct tnum b)
78 dv = a.value - b.value;
79 alpha = dv + a.mask;
82 mu = chi | a.mask | b.mask;
86 struct tnum tnum_neg(struct tnum a)
88 return tnum_sub(TNUM(0, 0), a);
91 struct tnum tnum_and(struct tnum a, struct tnum b)
95 alpha = a.value | a.mask;
97 v = a.value & b.value;
101 struct tnum tnum_or(struct tnum a, struct tnum b)
105 v = a.value | b.value;
106 mu = a.mask | b.mask;
110 struct tnum tnum_xor(struct tnum a, struct tnum b)
114 v = a.value ^ b.value;
115 mu = a.mask | b.mask;
119 /* Generate partial products by multiplying each bit in the multiplier (tnum a)
127 struct tnum tnum_mul(struct tnum a, struct tnum b)
129 u64 acc_v = a.value * b.value;
132 while (a.value || a.mask) {
133 /* LSB of tnum a is a certain 1 */
134 if (a.value & 1)
136 /* LSB of tnum a is uncertain */
137 else if (a.mask & 1)
140 a = tnum_rshift(a, 1);
146 /* Note that if a and b disagree - i.e. one has a 'known 1' where the other has
147 * a 'known 0' - this will return a 'known 1' for that bit.
149 struct tnum tnum_intersect(struct tnum a, struct tnum b)
153 v = a.value | b.value;
154 mu = a.mask & b.mask;
158 struct tnum tnum_cast(struct tnum a, u8 size)
160 a.value &= (1ULL << (size * 8)) - 1;
161 a.mask &= (1ULL << (size * 8)) - 1;
162 return a;
165 bool tnum_is_aligned(struct tnum a, u64 size)
169 return !((a.value | a.mask) & (size - 1));
172 bool tnum_in(struct tnum a, struct tnum b)
174 if (b.mask & ~a.mask)
176 b.value &= ~a.mask;
177 return a.value == b.value;
180 int tnum_sbin(char *str, size_t size, struct tnum a)
186 if (a.mask & 1)
188 else if (a.value & 1)
193 a.mask >>= 1;
194 a.value >>= 1;
200 struct tnum tnum_subreg(struct tnum a)
202 return tnum_cast(a, 4);
205 struct tnum tnum_clear_subreg(struct tnum a)
207 return tnum_lshift(tnum_rshift(a, 32), 32);
215 struct tnum tnum_const_subreg(struct tnum a, u32 value)
217 return tnum_with_subreg(a, tnum_const(value));