Revision cd633b10
b/target-ppc/helper.h | ||
---|---|---|
155 | 155 |
DEF_HELPER_3(vrlb, void, avr, avr, avr) |
156 | 156 |
DEF_HELPER_3(vrlh, void, avr, avr, avr) |
157 | 157 |
DEF_HELPER_3(vrlw, void, avr, avr, avr) |
158 |
DEF_HELPER_4(vsldoi, void, avr, avr, avr, i32) |
|
158 | 159 |
|
159 | 160 |
DEF_HELPER_1(efscfsi, i32, i32) |
160 | 161 |
DEF_HELPER_1(efscfui, i32, i32) |
b/target-ppc/op_helper.c | ||
---|---|---|
2145 | 2145 |
VSL(w, u32) |
2146 | 2146 |
#undef VSL |
2147 | 2147 |
|
2148 |
void helper_vsldoi (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t shift) |
|
2149 |
{ |
|
2150 |
int sh = shift & 0xf; |
|
2151 |
int i; |
|
2152 |
ppc_avr_t result; |
|
2153 |
|
|
2154 |
#if defined(WORDS_BIGENDIAN) |
|
2155 |
for (i = 0; i < ARRAY_SIZE(r->u8); i++) { |
|
2156 |
int index = sh + i; |
|
2157 |
if (index > 0xf) { |
|
2158 |
result.u8[i] = b->u8[index-0x10]; |
|
2159 |
} else { |
|
2160 |
result.u8[i] = a->u8[index]; |
|
2161 |
} |
|
2162 |
} |
|
2163 |
#else |
|
2164 |
for (i = 0; i < ARRAY_SIZE(r->u8); i++) { |
|
2165 |
int index = (16 - sh) + i; |
|
2166 |
if (index > 0xf) { |
|
2167 |
result.u8[i] = a->u8[index-0x10]; |
|
2168 |
} else { |
|
2169 |
result.u8[i] = b->u8[index]; |
|
2170 |
} |
|
2171 |
} |
|
2172 |
#endif |
|
2173 |
*r = result; |
|
2174 |
} |
|
2175 |
|
|
2148 | 2176 |
void helper_vslo (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) |
2149 | 2177 |
{ |
2150 | 2178 |
int sh = (b->u8[LO_IDX*0xf] >> 3) & 0xf; |
b/target-ppc/translate.c | ||
---|---|---|
374 | 374 |
EXTRACT_HELPER(NB, 11, 5); |
375 | 375 |
/* Shift count */ |
376 | 376 |
EXTRACT_HELPER(SH, 11, 5); |
377 |
/* Vector shift count */ |
|
378 |
EXTRACT_HELPER(VSH, 6, 4); |
|
377 | 379 |
/* Mask start */ |
378 | 380 |
EXTRACT_HELPER(MB, 6, 5); |
379 | 381 |
/* Mask end */ |
... | ... | |
6268 | 6270 |
GEN_VXFORM(vrlh, 2, 1); |
6269 | 6271 |
GEN_VXFORM(vrlw, 2, 2); |
6270 | 6272 |
|
6273 |
GEN_HANDLER(vsldoi, 0x04, 0x16, 0xFF, 0x00000400, PPC_ALTIVEC) |
|
6274 |
{ |
|
6275 |
TCGv_ptr ra, rb, rd; |
|
6276 |
TCGv sh; |
|
6277 |
if (unlikely(!ctx->altivec_enabled)) { |
|
6278 |
gen_exception(ctx, POWERPC_EXCP_VPU); |
|
6279 |
return; |
|
6280 |
} |
|
6281 |
ra = gen_avr_ptr(rA(ctx->opcode)); |
|
6282 |
rb = gen_avr_ptr(rB(ctx->opcode)); |
|
6283 |
rd = gen_avr_ptr(rD(ctx->opcode)); |
|
6284 |
sh = tcg_const_i32(VSH(ctx->opcode)); |
|
6285 |
gen_helper_vsldoi (rd, ra, rb, sh); |
|
6286 |
tcg_temp_free_ptr(ra); |
|
6287 |
tcg_temp_free_ptr(rb); |
|
6288 |
tcg_temp_free_ptr(rd); |
|
6289 |
tcg_temp_free(sh); |
|
6290 |
} |
|
6291 |
|
|
6271 | 6292 |
/*** SPE extension ***/ |
6272 | 6293 |
/* Register moves */ |
6273 | 6294 |
|
Also available in: Unified diff