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