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