Revision dc99a3f2 target-sparc/op.c

b/target-sparc/op.c
171 171

  
172 172
#define FLAG_SET(x) ((env->psr&x)?1:0)
173 173

  
174
void OPPROTO op_add_T1_T0_cc(void)
175
{
176
    target_ulong src1;
177

  
178
    src1 = T0;
179
    T0 += T1;
180
    env->psr = 0;
181
#ifdef TARGET_SPARC64
182
    if (!(T0 & 0xffffffff))
183
        env->psr |= PSR_ZERO;
184
    if ((int32_t) T0 < 0)
185
        env->psr |= PSR_NEG;
186
    if ((T0 & 0xffffffff) < (src1 & 0xffffffff))
187
        env->psr |= PSR_CARRY;
188
    if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &
189
         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
190
        env->psr |= PSR_OVF;
191

  
192
    env->xcc = 0;
193
    if (!T0)
194
        env->xcc |= PSR_ZERO;
195
    if ((int64_t) T0 < 0)
196
        env->xcc |= PSR_NEG;
197
    if (T0 < src1)
198
        env->xcc |= PSR_CARRY;
199
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63))
200
        env->xcc |= PSR_OVF;
201
#else
202
    if (!T0)
203
        env->psr |= PSR_ZERO;
204
    if ((int32_t) T0 < 0)
205
        env->psr |= PSR_NEG;
206
    if (T0 < src1)
207
        env->psr |= PSR_CARRY;
208
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
209
        env->psr |= PSR_OVF;
210
#endif
211
    FORCE_RET();
212
}
213

  
214
void OPPROTO op_addx_T1_T0_cc(void)
215
{
216
    target_ulong src1;
217
    src1 = T0;
218
    if (FLAG_SET(PSR_CARRY))
219
    {
220
      T0 += T1 + 1;
221
      env->psr = 0;
222
#ifdef TARGET_SPARC64
223
      if ((T0 & 0xffffffff) <= (src1 & 0xffffffff))
224
        env->psr |= PSR_CARRY;
225
      env->xcc = 0;
226
      if (T0 <= src1)
227
        env->xcc |= PSR_CARRY;
228
#else
229
      if (T0 <= src1)
230
        env->psr |= PSR_CARRY;
231
#endif
232
    }
233
    else
234
    {
235
      T0 += T1;
236
      env->psr = 0;
237
#ifdef TARGET_SPARC64
238
      if ((T0 & 0xffffffff) < (src1 & 0xffffffff))
239
        env->psr |= PSR_CARRY;
240
      env->xcc = 0;
241
      if (T0 < src1)
242
        env->xcc |= PSR_CARRY;
243
#else
244
      if (T0 < src1)
245
        env->psr |= PSR_CARRY;
246
#endif
247
    }
248
#ifdef TARGET_SPARC64
249
    if (!(T0 & 0xffffffff))
250
        env->psr |= PSR_ZERO;
251
    if ((int32_t) T0 < 0)
252
        env->psr |= PSR_NEG;
253
    if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &
254
         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
255
        env->psr |= PSR_OVF;
256

  
257
    if (!T0)
258
        env->xcc |= PSR_ZERO;
259
    if ((int64_t) T0 < 0)
260
        env->xcc |= PSR_NEG;
261
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63))
262
        env->xcc |= PSR_OVF;
263
#else
264
    if (!T0)
265
        env->psr |= PSR_ZERO;
266
    if ((int32_t) T0 < 0)
267
        env->psr |= PSR_NEG;
268
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
269
        env->psr |= PSR_OVF;
270
#endif
271
    FORCE_RET();
272
}
273

  
274
void OPPROTO op_tadd_T1_T0_cc(void)
275
{
276
    target_ulong src1;
277

  
278
    src1 = T0;
279
    T0 += T1;
280
    env->psr = 0;
281
#ifdef TARGET_SPARC64
282
    if (!(T0 & 0xffffffff))
283
        env->psr |= PSR_ZERO;
284
    if ((int32_t) T0 < 0)
285
        env->psr |= PSR_NEG;
286
    if ((T0 & 0xffffffff) < (src1 & 0xffffffff))
287
        env->psr |= PSR_CARRY;
288
    if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &
289
         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
290
        env->psr |= PSR_OVF;
291
    if ((src1 & 0x03) || (T1 & 0x03))
292
        env->psr |= PSR_OVF;
293

  
294
    env->xcc = 0;
295
    if (!T0)
296
        env->xcc |= PSR_ZERO;
297
    if ((int64_t) T0 < 0)
298
        env->xcc |= PSR_NEG;
299
    if (T0 < src1)
300
        env->xcc |= PSR_CARRY;
301
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63))
302
        env->xcc |= PSR_OVF;
303
#else
304
    if (!T0)
305
        env->psr |= PSR_ZERO;
306
    if ((int32_t) T0 < 0)
307
        env->psr |= PSR_NEG;
308
    if (T0 < src1)
309
        env->psr |= PSR_CARRY;
310
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
311
        env->psr |= PSR_OVF;
312
    if ((src1 & 0x03) || (T1 & 0x03))
313
        env->psr |= PSR_OVF;
314
#endif
315
    FORCE_RET();
316
}
317

  
318
void OPPROTO op_tadd_T1_T0_ccTV(void)
319
{
320
    target_ulong src1;
321

  
322
    if ((T0 & 0x03) || (T1 & 0x03)) {
323
        raise_exception(TT_TOVF);
324
        FORCE_RET();
325
        return;
326
    }
327

  
328
    src1 = T0;
329
    T0 += T1;
330

  
331
#ifdef TARGET_SPARC64
332
    if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &
333
         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
334
        raise_exception(TT_TOVF);
335
#else
336
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
337
        raise_exception(TT_TOVF);
338
#endif
339

  
340
    env->psr = 0;
341
#ifdef TARGET_SPARC64
342
    if (!(T0 & 0xffffffff))
343
        env->psr |= PSR_ZERO;
344
    if ((int32_t) T0 < 0)
345
        env->psr |= PSR_NEG;
346
    if ((T0 & 0xffffffff) < (src1 & 0xffffffff))
347
        env->psr |= PSR_CARRY;
348

  
349
    env->xcc = 0;
350
    if (!T0)
351
        env->xcc |= PSR_ZERO;
352
    if ((int64_t) T0 < 0)
353
        env->xcc |= PSR_NEG;
354
    if (T0 < src1)
355
        env->xcc |= PSR_CARRY;
356
#else
357
    if (!T0)
358
        env->psr |= PSR_ZERO;
359
    if ((int32_t) T0 < 0)
360
        env->psr |= PSR_NEG;
361
    if (T0 < src1)
362
        env->psr |= PSR_CARRY;
363
#endif
364
    FORCE_RET();
365
}
366

  
367
void OPPROTO op_sub_T1_T0_cc(void)
368
{
369
    target_ulong src1;
370

  
371
    src1 = T0;
372
    T0 -= T1;
373
    env->psr = 0;
374
#ifdef TARGET_SPARC64
375
    if (!(T0 & 0xffffffff))
376
        env->psr |= PSR_ZERO;
377
    if ((int32_t) T0 < 0)
378
        env->psr |= PSR_NEG;
379
    if ((src1 & 0xffffffff) < (T1 & 0xffffffff))
380
        env->psr |= PSR_CARRY;
381
    if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &
382
         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
383
        env->psr |= PSR_OVF;
384

  
385
    env->xcc = 0;
386
    if (!T0)
387
        env->xcc |= PSR_ZERO;
388
    if ((int64_t) T0 < 0)
389
        env->xcc |= PSR_NEG;
390
    if (src1 < T1)
391
        env->xcc |= PSR_CARRY;
392
    if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63))
393
        env->xcc |= PSR_OVF;
394
#else
395
    if (!T0)
396
        env->psr |= PSR_ZERO;
397
    if ((int32_t) T0 < 0)
398
        env->psr |= PSR_NEG;
399
    if (src1 < T1)
400
        env->psr |= PSR_CARRY;
401
    if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
402
        env->psr |= PSR_OVF;
403
#endif
404
    FORCE_RET();
405
}
406

  
407
void OPPROTO op_subx_T1_T0_cc(void)
408
{
409
    target_ulong src1;
410
    src1 = T0;
411
    if (FLAG_SET(PSR_CARRY))
412
    {
413
      T0 -= T1 + 1;
414
      env->psr = 0;
415
#ifdef TARGET_SPARC64
416
      if ((src1 & 0xffffffff) <= (T1 & 0xffffffff))
417
        env->psr |= PSR_CARRY;
418
      env->xcc = 0;
419
      if (src1 <= T1)
420
        env->xcc |= PSR_CARRY;
421
#else
422
      if (src1 <= T1)
423
        env->psr |= PSR_CARRY;
424
#endif
425
    }
426
    else
427
    {
428
      T0 -= T1;
429
      env->psr = 0;
430
#ifdef TARGET_SPARC64
431
      if ((src1 & 0xffffffff) < (T1 & 0xffffffff))
432
        env->psr |= PSR_CARRY;
433
      env->xcc = 0;
434
      if (src1 < T1)
435
        env->xcc |= PSR_CARRY;
436
#else
437
      if (src1 < T1)
438
        env->psr |= PSR_CARRY;
439
#endif
440
    }
441
#ifdef TARGET_SPARC64
442
    if (!(T0 & 0xffffffff))
443
        env->psr |= PSR_ZERO;
444
    if ((int32_t) T0 < 0)
445
        env->psr |= PSR_NEG;
446
    if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &
447
         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
448
        env->psr |= PSR_OVF;
449

  
450
    if (!T0)
451
        env->xcc |= PSR_ZERO;
452
    if ((int64_t) T0 < 0)
453
        env->xcc |= PSR_NEG;
454
    if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63))
455
        env->xcc |= PSR_OVF;
456
#else
457
    if (!T0)
458
        env->psr |= PSR_ZERO;
459
    if ((int32_t) T0 < 0)
460
        env->psr |= PSR_NEG;
461
    if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
462
        env->psr |= PSR_OVF;
463
#endif
464
    FORCE_RET();
465
}
466

  
467
void OPPROTO op_tsub_T1_T0_cc(void)
468
{
469
    target_ulong src1;
470

  
471
    src1 = T0;
472
    T0 -= T1;
473
    env->psr = 0;
474
#ifdef TARGET_SPARC64
475
    if (!(T0 & 0xffffffff))
476
        env->psr |= PSR_ZERO;
477
    if ((int32_t) T0 < 0)
478
        env->psr |= PSR_NEG;
479
    if ((src1 & 0xffffffff) < (T1 & 0xffffffff))
480
        env->psr |= PSR_CARRY;
481
    if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &
482
         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
483
        env->psr |= PSR_OVF;
484
    if ((src1 & 0x03) || (T1 & 0x03))
485
        env->psr |= PSR_OVF;
486

  
487
    env->xcc = 0;
488
    if (!T0)
489
        env->xcc |= PSR_ZERO;
490
    if ((int64_t) T0 < 0)
491
        env->xcc |= PSR_NEG;
492
    if (src1 < T1)
493
        env->xcc |= PSR_CARRY;
494
    if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63))
495
        env->xcc |= PSR_OVF;
496
#else
497
    if (!T0)
498
        env->psr |= PSR_ZERO;
499
    if ((int32_t) T0 < 0)
500
        env->psr |= PSR_NEG;
501
    if (src1 < T1)
502
        env->psr |= PSR_CARRY;
503
    if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
504
        env->psr |= PSR_OVF;
505
    if ((src1 & 0x03) || (T1 & 0x03))
506
        env->psr |= PSR_OVF;
507
#endif
508
    FORCE_RET();
509
}
510

  
511
void OPPROTO op_tsub_T1_T0_ccTV(void)
512
{
513
    target_ulong src1;
514

  
515
    if ((T0 & 0x03) || (T1 & 0x03))
516
        raise_exception(TT_TOVF);
517

  
518
    src1 = T0;
519
    T0 -= T1;
520

  
521
#ifdef TARGET_SPARC64
522
    if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &
523
         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
524
        raise_exception(TT_TOVF);
525
#else
526
    if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
527
        raise_exception(TT_TOVF);
528
#endif
529

  
530
    env->psr = 0;
531
#ifdef TARGET_SPARC64
532
    if (!(T0 & 0xffffffff))
533
        env->psr |= PSR_ZERO;
534
    if ((int32_t) T0 < 0)
535
        env->psr |= PSR_NEG;
536
    if ((src1 & 0xffffffff) < (T1 & 0xffffffff))
537
        env->psr |= PSR_CARRY;
538

  
539
    env->xcc = 0;
540
    if (!T0)
541
        env->xcc |= PSR_ZERO;
542
    if ((int64_t) T0 < 0)
543
        env->xcc |= PSR_NEG;
544
    if (src1 < T1)
545
        env->xcc |= PSR_CARRY;
546
#else
547
    if (!T0)
548
        env->psr |= PSR_ZERO;
549
    if ((int32_t) T0 < 0)
550
        env->psr |= PSR_NEG;
551
    if (src1 < T1)
552
        env->psr |= PSR_CARRY;
553
#endif
554
    FORCE_RET();
555
}
556

  
557 174
void OPPROTO op_umul_T1_T0(void)
558 175
{
559 176
    uint64_t res;
......
652 269
    FORCE_RET();
653 270
}
654 271

  
655
void OPPROTO op_div_cc(void)
656
{
657
    env->psr = 0;
658
#ifdef TARGET_SPARC64
659
    if (!T0)
660
        env->psr |= PSR_ZERO;
661
    if ((int32_t) T0 < 0)
662
        env->psr |= PSR_NEG;
663
    if (T1)
664
        env->psr |= PSR_OVF;
665

  
666
    env->xcc = 0;
667
    if (!T0)
668
        env->xcc |= PSR_ZERO;
669
    if ((int64_t) T0 < 0)
670
        env->xcc |= PSR_NEG;
671
#else
672
    if (!T0)
673
        env->psr |= PSR_ZERO;
674
    if ((int32_t) T0 < 0)
675
        env->psr |= PSR_NEG;
676
    if (T1)
677
        env->psr |= PSR_OVF;
678
#endif
679
    FORCE_RET();
680
}
681

  
682 272
#ifdef TARGET_SPARC64
683 273
void OPPROTO op_udivx_T1_T0(void)
684 274
{
......
702 292
}
703 293
#endif
704 294

  
705
void OPPROTO op_logic_T0_cc(void)
706
{
707
    env->psr = 0;
708
#ifdef TARGET_SPARC64
709
    if (!(T0 & 0xffffffff))
710
        env->psr |= PSR_ZERO;
711
    if ((int32_t) T0 < 0)
712
        env->psr |= PSR_NEG;
713

  
714
    env->xcc = 0;
715
    if (!T0)
716
        env->xcc |= PSR_ZERO;
717
    if ((int64_t) T0 < 0)
718
        env->xcc |= PSR_NEG;
719
#else
720
    if (!T0)
721
        env->psr |= PSR_ZERO;
722
    if ((int32_t) T0 < 0)
723
        env->psr |= PSR_NEG;
724
#endif
725
    FORCE_RET();
726
}
727

  
728 295
/* Load and store */
729 296
#define MEMSUFFIX _raw
730 297
#include "op_mem.h"

Also available in: Unified diff