Commit e4e6bee78704c431547714c0bc1eea537e1fb3ed
1 parent
27a4edb3
Add vsplt{b,h,w} instructions.
Signed-off-by: Nathan Froyd <froydnj@codesourcery.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6174 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
30 additions
and
0 deletions
target-ppc/helper.h
... | ... | @@ -156,6 +156,9 @@ 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 | 158 | DEF_HELPER_4(vsldoi, void, avr, avr, avr, i32) |
159 | +DEF_HELPER_3(vspltb, void, avr, avr, i32) | |
160 | +DEF_HELPER_3(vsplth, void, avr, avr, i32) | |
161 | +DEF_HELPER_3(vspltw, void, avr, avr, i32) | |
159 | 162 | |
160 | 163 | DEF_HELPER_1(efscfsi, i32, i32) |
161 | 164 | DEF_HELPER_1(efscfui, i32, i32) | ... | ... |
target-ppc/op_helper.c
... | ... | @@ -2186,6 +2186,29 @@ void helper_vslo (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) |
2186 | 2186 | #endif |
2187 | 2187 | } |
2188 | 2188 | |
2189 | +/* Experimental testing shows that hardware masks the immediate. */ | |
2190 | +#define _SPLAT_MASKED(element) (splat & (ARRAY_SIZE(r->element) - 1)) | |
2191 | +#if defined(WORDS_BIGENDIAN) | |
2192 | +#define SPLAT_ELEMENT(element) _SPLAT_MASKED(element) | |
2193 | +#else | |
2194 | +#define SPLAT_ELEMENT(element) (ARRAY_SIZE(r->element)-1 - _SPLAT_MASKED(element)) | |
2195 | +#endif | |
2196 | +#define VSPLT(suffix, element) \ | |
2197 | + void helper_vsplt##suffix (ppc_avr_t *r, ppc_avr_t *b, uint32_t splat) \ | |
2198 | + { \ | |
2199 | + uint32_t s = b->element[SPLAT_ELEMENT(element)]; \ | |
2200 | + int i; \ | |
2201 | + for (i = 0; i < ARRAY_SIZE(r->element); i++) { \ | |
2202 | + r->element[i] = s; \ | |
2203 | + } \ | |
2204 | + } | |
2205 | +VSPLT(b, u8) | |
2206 | +VSPLT(h, u16) | |
2207 | +VSPLT(w, u32) | |
2208 | +#undef VSPLT | |
2209 | +#undef SPLAT_ELEMENT | |
2210 | +#undef _SPLAT_MASKED | |
2211 | + | |
2189 | 2212 | #define VSR(suffix, element) \ |
2190 | 2213 | void helper_vsr##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \ |
2191 | 2214 | { \ | ... | ... |
target-ppc/translate.c
... | ... | @@ -6308,6 +6308,10 @@ GEN_VXFORM(vrlw, 2, 2); |
6308 | 6308 | tcg_temp_free_ptr(rd); \ |
6309 | 6309 | } |
6310 | 6310 | |
6311 | +GEN_VXFORM_UIMM(vspltb, 6, 8); | |
6312 | +GEN_VXFORM_UIMM(vsplth, 6, 9); | |
6313 | +GEN_VXFORM_UIMM(vspltw, 6, 10); | |
6314 | + | |
6311 | 6315 | GEN_HANDLER(vsldoi, 0x04, 0x16, 0xFF, 0x00000400, PPC_ALTIVEC) |
6312 | 6316 | { |
6313 | 6317 | TCGv_ptr ra, rb, rd; | ... | ... |