Revision 04acd307 target-alpha/op_helper.c

b/target-alpha/op_helper.c
163 163
    return tmp;
164 164
}
165 165

  
166
void helper_addqv (void)
166
uint64_t helper_addqv (uint64_t op1, uint64_t op2)
167 167
{
168
    T2 = T0;
169
    T0 += T1;
170
    if (unlikely((T2 ^ T1 ^ (-1ULL)) & (T2 ^ T0) & (1ULL << 63))) {
168
    uint64_t tmp = op1;
169
    op1 += op2;
170
    if (unlikely((tmp ^ op2 ^ (-1ULL)) & (tmp ^ op1) & (1ULL << 63))) {
171 171
        helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW);
172 172
    }
173
    return op1;
173 174
}
174 175

  
175
void helper_addlv (void)
176
uint64_t helper_addlv (uint64_t op1, uint64_t op2)
176 177
{
177
    T2 = T0;
178
    T0 = (uint32_t)(T0 + T1);
179
    if (unlikely((T2 ^ T1 ^ (-1UL)) & (T2 ^ T0) & (1UL << 31))) {
178
    uint64_t tmp = op1;
179
    op1 = (uint32_t)(op1 + op2);
180
    if (unlikely((tmp ^ op2 ^ (-1UL)) & (tmp ^ op1) & (1UL << 31))) {
180 181
        helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW);
181 182
    }
183
    return op1;
182 184
}
183 185

  
184
void helper_subqv (void)
186
uint64_t helper_subqv (uint64_t op1, uint64_t op2)
185 187
{
186
    T2 = T0;
187
    T0 -= T1;
188
    if (unlikely(((~T2) ^ T0 ^ (-1ULL)) & ((~T2) ^ T1) & (1ULL << 63))) {
188
    uint64_t tmp = op1;
189
    op1 -= op2;
190
    if (unlikely(((~tmp) ^ op1 ^ (-1ULL)) & ((~tmp) ^ op2) & (1ULL << 63))) {
189 191
        helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW);
190 192
    }
193
    return op1;
191 194
}
192 195

  
193
void helper_sublv (void)
196
uint64_t helper_sublv (uint64_t op1, uint64_t op2)
194 197
{
195
    T2 = T0;
196
    T0 = (uint32_t)(T0 - T1);
197
    if (unlikely(((~T2) ^ T0 ^ (-1UL)) & ((~T2) ^ T1) & (1UL << 31))) {
198
    uint64_t tmp = op1;
199
    op1 = (uint32_t)(op1 - op2);
200
    if (unlikely(((~tmp) ^ op1 ^ (-1UL)) & ((~tmp) ^ op2) & (1UL << 31))) {
198 201
        helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW);
199 202
    }
203
    return op1;
200 204
}
201 205

  
202
void helper_mullv (void)
206
uint64_t helper_mullv (uint64_t op1, uint64_t op2)
203 207
{
204
    int64_t res = (int64_t)T0 * (int64_t)T1;
208
    int64_t res = (int64_t)op1 * (int64_t)op2;
205 209

  
206 210
    if (unlikely((int32_t)res != res)) {
207 211
        helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW);
208 212
    }
209
    T0 = (int64_t)((int32_t)res);
213
    return (int64_t)((int32_t)res);
210 214
}
211 215

  
212
void helper_mulqv ()
216
uint64_t helper_mulqv (uint64_t op1, uint64_t op2)
213 217
{
214 218
    uint64_t tl, th;
215 219

  
216
    muls64(&tl, &th, T0, T1);
220
    muls64(&tl, &th, op1, op2);
217 221
    /* If th != 0 && th != -1, then we had an overflow */
218 222
    if (unlikely((th + 1) > 1)) {
219 223
        helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW);
220 224
    }
221
    T0 = tl;
225
    return tl;
226
}
227

  
228
uint64_t helper_umulh (uint64_t op1, uint64_t op2)
229
{
230
    uint64_t tl, th;
231

  
232
    mulu64(&tl, &th, op1, op2);
233
    return th;
222 234
}
223 235

  
224 236
uint64_t helper_ctpop (uint64_t arg)
......
340 352
    return byte_zap(val, ~((0xFF << (mask & 7)) >> 8));
341 353
}
342 354

  
343
void helper_cmpbge (void)
355
uint64_t helper_cmpbge (uint64_t op1, uint64_t op2)
344 356
{
345 357
    uint8_t opa, opb, res;
346 358
    int i;
347 359

  
348 360
    res = 0;
349 361
    for (i = 0; i < 7; i++) {
350
        opa = T0 >> (i * 8);
351
        opb = T1 >> (i * 8);
362
        opa = op1 >> (i * 8);
363
        opb = op2 >> (i * 8);
352 364
        if (opa >= opb)
353 365
            res |= 1 << i;
354 366
    }
355
    T0 = res;
367
    return res;
356 368
}
357 369

  
358 370
void helper_cmov_fir (int freg)

Also available in: Unified diff