Revision 1497c961 target-arm/op.c

b/target-arm/op.c
425 425
    FORCE_RET();
426 426
}
427 427

  
428
/* misc */
429
#define SIGNBIT (uint32_t)0x80000000
430
/* saturating arithmetic  */
431
void OPPROTO op_addl_T0_T1_setq(void)
432
{
433
  uint32_t res;
434

  
435
  res = T0 + T1;
436
  if (((res ^ T0) & SIGNBIT) && !((T0 ^ T1) & SIGNBIT))
437
      env->QF = 1;
438

  
439
  T0 = res;
440
  FORCE_RET();
441
}
442

  
443
void OPPROTO op_addl_T0_T1_saturate(void)
444
{
445
  uint32_t res;
446

  
447
  res = T0 + T1;
448
  if (((res ^ T0) & SIGNBIT) && !((T0 ^ T1) & SIGNBIT)) {
449
      env->QF = 1;
450
      if (T0 & SIGNBIT)
451
          T0 = 0x80000000;
452
      else
453
          T0 = 0x7fffffff;
454
  }
455
  else
456
    T0 = res;
457

  
458
  FORCE_RET();
459
}
460

  
461
void OPPROTO op_subl_T0_T1_saturate(void)
462
{
463
  uint32_t res;
464

  
465
  res = T0 - T1;
466
  if (((res ^ T0) & SIGNBIT) && ((T0 ^ T1) & SIGNBIT)) {
467
      env->QF = 1;
468
      if (T0 & SIGNBIT)
469
          T0 = 0x80000000;
470
      else
471
          T0 = 0x7fffffff;
472
  }
473
  else
474
    T0 = res;
475

  
476
  FORCE_RET();
477
}
478

  
479
void OPPROTO op_double_T1_saturate(void)
480
{
481
  int32_t val;
482

  
483
  val = T1;
484
  if (val >= 0x40000000) {
485
      T1 = 0x7fffffff;
486
      env->QF = 1;
487
  } else if (val <= (int32_t)0xc0000000) {
488
      T1 = 0x80000000;
489
      env->QF = 1;
490
  } else {
491
      T1 = val << 1;
492
  }
493
  FORCE_RET();
494
}
495

  
496
/* Unsigned saturating arithmetic for NEON.  */
497
void OPPROTO op_addl_T0_T1_usaturate(void)
498
{
499
  uint32_t res;
500

  
501
  res = T0 + T1;
502
  if (res < T0) {
503
      env->QF = 1;
504
      T0 = 0xffffffff;
505
  } else {
506
      T0 = res;
507
  }
508

  
509
  FORCE_RET();
510
}
511

  
512
void OPPROTO op_subl_T0_T1_usaturate(void)
513
{
514
  uint32_t res;
515

  
516
  res = T0 - T1;
517
  if (res > T0) {
518
      env->QF = 1;
519
      T0 = 0;
520
  } else {
521
      T0 = res;
522
  }
523

  
524
  FORCE_RET();
525
}
526

  
527 428
/* exceptions */
528 429

  
529 430
void OPPROTO op_swi(void)

Also available in: Unified diff