Revision ecbb5ea1 target-alpha/op_helper.c
b/target-alpha/op_helper.c | ||
---|---|---|
158 | 158 |
|
159 | 159 |
uint64_t helper_subqv (uint64_t op1, uint64_t op2) |
160 | 160 |
{ |
161 |
uint64_t tmp = op1;
|
|
162 |
op1 -= op2;
|
|
163 |
if (unlikely(((~tmp) ^ op1 ^ (-1ULL)) & ((~tmp) ^ op2) & (1ULL << 63))) {
|
|
161 |
uint64_t res;
|
|
162 |
res = op1 - op2;
|
|
163 |
if (unlikely((op1 ^ op2) & (res ^ op1) & (1ULL << 63))) {
|
|
164 | 164 |
helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW); |
165 | 165 |
} |
166 |
return op1;
|
|
166 |
return res;
|
|
167 | 167 |
} |
168 | 168 |
|
169 | 169 |
uint64_t helper_sublv (uint64_t op1, uint64_t op2) |
170 | 170 |
{ |
171 |
uint64_t tmp = op1;
|
|
172 |
op1 = (uint32_t)(op1 - op2);
|
|
173 |
if (unlikely(((~tmp) ^ op1 ^ (-1UL)) & ((~tmp) ^ op2) & (1UL << 31))) {
|
|
171 |
uint32_t res;
|
|
172 |
res = op1 - op2;
|
|
173 |
if (unlikely((op1 ^ op2) & (res ^ op1) & (1UL << 31))) {
|
|
174 | 174 |
helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW); |
175 | 175 |
} |
176 |
return op1;
|
|
176 |
return res;
|
|
177 | 177 |
} |
178 | 178 |
|
179 | 179 |
uint64_t helper_mullv (uint64_t op1, uint64_t op2) |
Also available in: Unified diff