Revision 8142cddd target-ppc/op_helper.c
b/target-ppc/op_helper.c | ||
---|---|---|
2534 | 2534 |
} |
2535 | 2535 |
} |
2536 | 2536 |
|
2537 |
void helper_vsumsws (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) |
|
2538 |
{ |
|
2539 |
int64_t t; |
|
2540 |
int i, upper; |
|
2541 |
ppc_avr_t result; |
|
2542 |
int sat = 0; |
|
2543 |
|
|
2544 |
#if defined(WORDS_BIGENDIAN) |
|
2545 |
upper = ARRAY_SIZE(r->s32)-1; |
|
2546 |
#else |
|
2547 |
upper = 0; |
|
2548 |
#endif |
|
2549 |
t = (int64_t)b->s32[upper]; |
|
2550 |
for (i = 0; i < ARRAY_SIZE(r->s32); i++) { |
|
2551 |
t += a->s32[i]; |
|
2552 |
result.s32[i] = 0; |
|
2553 |
} |
|
2554 |
result.s32[upper] = cvtsdsw(t, &sat); |
|
2555 |
*r = result; |
|
2556 |
|
|
2557 |
if (sat) { |
|
2558 |
env->vscr |= (1 << VSCR_SAT); |
|
2559 |
} |
|
2560 |
} |
|
2561 |
|
|
2562 |
void helper_vsum2sws (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) |
|
2563 |
{ |
|
2564 |
int i, j, upper; |
|
2565 |
ppc_avr_t result; |
|
2566 |
int sat = 0; |
|
2567 |
|
|
2568 |
#if defined(WORDS_BIGENDIAN) |
|
2569 |
upper = 1; |
|
2570 |
#else |
|
2571 |
upper = 0; |
|
2572 |
#endif |
|
2573 |
for (i = 0; i < ARRAY_SIZE(r->u64); i++) { |
|
2574 |
int64_t t = (int64_t)b->s32[upper+i*2]; |
|
2575 |
result.u64[i] = 0; |
|
2576 |
for (j = 0; j < ARRAY_SIZE(r->u64); j++) { |
|
2577 |
t += a->s32[2*i+j]; |
|
2578 |
} |
|
2579 |
result.s32[upper+i*2] = cvtsdsw(t, &sat); |
|
2580 |
} |
|
2581 |
|
|
2582 |
*r = result; |
|
2583 |
if (sat) { |
|
2584 |
env->vscr |= (1 << VSCR_SAT); |
|
2585 |
} |
|
2586 |
} |
|
2587 |
|
|
2588 |
void helper_vsum4sbs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) |
|
2589 |
{ |
|
2590 |
int i, j; |
|
2591 |
int sat = 0; |
|
2592 |
|
|
2593 |
for (i = 0; i < ARRAY_SIZE(r->s32); i++) { |
|
2594 |
int64_t t = (int64_t)b->s32[i]; |
|
2595 |
for (j = 0; j < ARRAY_SIZE(r->s32); j++) { |
|
2596 |
t += a->s8[4*i+j]; |
|
2597 |
} |
|
2598 |
r->s32[i] = cvtsdsw(t, &sat); |
|
2599 |
} |
|
2600 |
|
|
2601 |
if (sat) { |
|
2602 |
env->vscr |= (1 << VSCR_SAT); |
|
2603 |
} |
|
2604 |
} |
|
2605 |
|
|
2606 |
void helper_vsum4shs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) |
|
2607 |
{ |
|
2608 |
int sat = 0; |
|
2609 |
int i; |
|
2610 |
|
|
2611 |
for (i = 0; i < ARRAY_SIZE(r->s32); i++) { |
|
2612 |
int64_t t = (int64_t)b->s32[i]; |
|
2613 |
t += a->s16[2*i] + a->s16[2*i+1]; |
|
2614 |
r->s32[i] = cvtsdsw(t, &sat); |
|
2615 |
} |
|
2616 |
|
|
2617 |
if (sat) { |
|
2618 |
env->vscr |= (1 << VSCR_SAT); |
|
2619 |
} |
|
2620 |
} |
|
2621 |
|
|
2622 |
void helper_vsum4ubs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) |
|
2623 |
{ |
|
2624 |
int i, j; |
|
2625 |
int sat = 0; |
|
2626 |
|
|
2627 |
for (i = 0; i < ARRAY_SIZE(r->u32); i++) { |
|
2628 |
uint64_t t = (uint64_t)b->u32[i]; |
|
2629 |
for (j = 0; j < ARRAY_SIZE(r->u32); j++) { |
|
2630 |
t += a->u8[4*i+j]; |
|
2631 |
} |
|
2632 |
r->u32[i] = cvtuduw(t, &sat); |
|
2633 |
} |
|
2634 |
|
|
2635 |
if (sat) { |
|
2636 |
env->vscr |= (1 << VSCR_SAT); |
|
2637 |
} |
|
2638 |
} |
|
2639 |
|
|
2537 | 2640 |
#if defined(WORDS_BIGENDIAN) |
2538 | 2641 |
#define UPKHI 1 |
2539 | 2642 |
#define UPKLO 0 |
Also available in: Unified diff