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,6 +156,9 @@ DEF_HELPER_3(vrlb, void, avr, avr, avr) | ||
156 | DEF_HELPER_3(vrlh, void, avr, avr, avr) | 156 | DEF_HELPER_3(vrlh, void, avr, avr, avr) |
157 | DEF_HELPER_3(vrlw, void, avr, avr, avr) | 157 | DEF_HELPER_3(vrlw, void, avr, avr, avr) |
158 | DEF_HELPER_4(vsldoi, void, avr, avr, avr, i32) | 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 | DEF_HELPER_1(efscfsi, i32, i32) | 163 | DEF_HELPER_1(efscfsi, i32, i32) |
161 | DEF_HELPER_1(efscfui, i32, i32) | 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,6 +2186,29 @@ void helper_vslo (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) | ||
2186 | #endif | 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 | #define VSR(suffix, element) \ | 2212 | #define VSR(suffix, element) \ |
2190 | void helper_vsr##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \ | 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,6 +6308,10 @@ GEN_VXFORM(vrlw, 2, 2); | ||
6308 | tcg_temp_free_ptr(rd); \ | 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 | GEN_HANDLER(vsldoi, 0x04, 0x16, 0xFF, 0x00000400, PPC_ALTIVEC) | 6315 | GEN_HANDLER(vsldoi, 0x04, 0x16, 0xFF, 0x00000400, PPC_ALTIVEC) |
6312 | { | 6316 | { |
6313 | TCGv_ptr ra, rb, rd; | 6317 | TCGv_ptr ra, rb, rd; |