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