Commit 79f85c3ae96b9406809c3ee53881d1d891691c5f
1 parent
de5f2484
Add vupk{h,l}px 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@6176 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
34 additions
and
0 deletions
target-ppc/helper.h
| @@ -159,6 +159,8 @@ DEF_HELPER_4(vsldoi, void, avr, avr, avr, i32) | @@ -159,6 +159,8 @@ DEF_HELPER_4(vsldoi, void, avr, avr, avr, i32) | ||
| 159 | DEF_HELPER_3(vspltb, void, avr, avr, i32) | 159 | DEF_HELPER_3(vspltb, void, avr, avr, i32) |
| 160 | DEF_HELPER_3(vsplth, void, avr, avr, i32) | 160 | DEF_HELPER_3(vsplth, void, avr, avr, i32) |
| 161 | DEF_HELPER_3(vspltw, void, avr, avr, i32) | 161 | DEF_HELPER_3(vspltw, void, avr, avr, i32) |
| 162 | +DEF_HELPER_2(vupkhpx, void, avr, avr) | ||
| 163 | +DEF_HELPER_2(vupklpx, void, avr, avr) | ||
| 162 | 164 | ||
| 163 | DEF_HELPER_1(efscfsi, i32, i32) | 165 | DEF_HELPER_1(efscfsi, i32, i32) |
| 164 | DEF_HELPER_1(efscfui, i32, i32) | 166 | DEF_HELPER_1(efscfui, i32, i32) |
target-ppc/op_helper.c
| @@ -2248,6 +2248,35 @@ void helper_vsubcuw (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) | @@ -2248,6 +2248,35 @@ void helper_vsubcuw (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) | ||
| 2248 | } | 2248 | } |
| 2249 | } | 2249 | } |
| 2250 | 2250 | ||
| 2251 | +#if defined(WORDS_BIGENDIAN) | ||
| 2252 | +#define UPKHI 1 | ||
| 2253 | +#define UPKLO 0 | ||
| 2254 | +#else | ||
| 2255 | +#define UPKHI 0 | ||
| 2256 | +#define UPKLO 1 | ||
| 2257 | +#endif | ||
| 2258 | +#define VUPKPX(suffix, hi) \ | ||
| 2259 | + void helper_vupk##suffix (ppc_avr_t *r, ppc_avr_t *b) \ | ||
| 2260 | + { \ | ||
| 2261 | + int i; \ | ||
| 2262 | + ppc_avr_t result; \ | ||
| 2263 | + for (i = 0; i < ARRAY_SIZE(r->u32); i++) { \ | ||
| 2264 | + uint16_t e = b->u16[hi ? i : i+4]; \ | ||
| 2265 | + uint8_t a = (e >> 15) ? 0xff : 0; \ | ||
| 2266 | + uint8_t r = (e >> 10) & 0x1f; \ | ||
| 2267 | + uint8_t g = (e >> 5) & 0x1f; \ | ||
| 2268 | + uint8_t b = e & 0x1f; \ | ||
| 2269 | + result.u32[i] = (a << 24) | (r << 16) | (g << 8) | b; \ | ||
| 2270 | + } \ | ||
| 2271 | + *r = result; \ | ||
| 2272 | + } | ||
| 2273 | +VUPKPX(lpx, UPKLO) | ||
| 2274 | +VUPKPX(hpx, UPKHI) | ||
| 2275 | +#undef VUPKPX | ||
| 2276 | + | ||
| 2277 | +#undef UPKHI | ||
| 2278 | +#undef UPKLO | ||
| 2279 | + | ||
| 2251 | #undef VECTOR_FOR_INORDER_I | 2280 | #undef VECTOR_FOR_INORDER_I |
| 2252 | #undef HI_IDX | 2281 | #undef HI_IDX |
| 2253 | #undef LO_IDX | 2282 | #undef LO_IDX |
target-ppc/translate.c
| @@ -6289,6 +6289,9 @@ GEN_VXFORM(vrlw, 2, 2); | @@ -6289,6 +6289,9 @@ GEN_VXFORM(vrlw, 2, 2); | ||
| 6289 | tcg_temp_free_ptr(rd); \ | 6289 | tcg_temp_free_ptr(rd); \ |
| 6290 | } | 6290 | } |
| 6291 | 6291 | ||
| 6292 | +GEN_VXFORM_NOA(vupkhpx, 7, 13); | ||
| 6293 | +GEN_VXFORM_NOA(vupklpx, 7, 15); | ||
| 6294 | + | ||
| 6292 | #define GEN_VXFORM_SIMM(name, opc2, opc3) \ | 6295 | #define GEN_VXFORM_SIMM(name, opc2, opc3) \ |
| 6293 | GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_ALTIVEC) \ | 6296 | GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_ALTIVEC) \ |
| 6294 | { \ | 6297 | { \ |