Revision eae07261

b/target-ppc/helper.h
182 182
DEF_HELPER_4(vmhraddshs, void, avr, avr, avr, avr)
183 183
DEF_HELPER_4(vmsumuhm, void, avr, avr, avr, avr)
184 184
DEF_HELPER_4(vmsumuhs, void, avr, avr, avr, avr)
185
DEF_HELPER_4(vmsumshm, void, avr, avr, avr, avr)
186
DEF_HELPER_4(vmsumshs, void, avr, avr, avr, avr)
185 187

  
186 188
DEF_HELPER_1(efscfsi, i32, i32)
187 189
DEF_HELPER_1(efscfui, i32, i32)
b/target-ppc/op_helper.c
2166 2166
    }
2167 2167
}
2168 2168

  
2169
void helper_vmsumshm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
2170
{
2171
    int32_t prod[8];
2172
    int i;
2173

  
2174
    for (i = 0; i < ARRAY_SIZE(r->s16); i++) {
2175
        prod[i] = a->s16[i] * b->s16[i];
2176
    }
2177

  
2178
    VECTOR_FOR_INORDER_I(i, s32) {
2179
        r->s32[i] = c->s32[i] + prod[2*i] + prod[2*i+1];
2180
    }
2181
}
2182

  
2183
void helper_vmsumshs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
2184
{
2185
    int32_t prod[8];
2186
    int i;
2187
    int sat = 0;
2188

  
2189
    for (i = 0; i < ARRAY_SIZE(r->s16); i++) {
2190
        prod[i] = (int32_t)a->s16[i] * b->s16[i];
2191
    }
2192

  
2193
    VECTOR_FOR_INORDER_I (i, s32) {
2194
        int64_t t = (int64_t)c->s32[i] + prod[2*i] + prod[2*i+1];
2195
        r->u32[i] = cvtsdsw(t, &sat);
2196
    }
2197

  
2198
    if (sat) {
2199
        env->vscr |= (1 << VSCR_SAT);
2200
    }
2201
}
2202

  
2169 2203
void helper_vmsumubm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
2170 2204
{
2171 2205
    uint16_t prod[16];
b/target-ppc/translate.c
6389 6389

  
6390 6390
GEN_VAFORM_PAIRED(vmsumubm, vmsummbm, 18)
6391 6391
GEN_VAFORM_PAIRED(vmsumuhm, vmsumuhs, 19)
6392
GEN_VAFORM_PAIRED(vmsumshm, vmsumshs, 20)
6392 6393
GEN_VAFORM_PAIRED(vsel, vperm, 21)
6393 6394

  
6394 6395
/***                           SPE extension                               ***/

Also available in: Unified diff