Commit 5335a145a178630a8d157cd927c5bd697d1e362e
1 parent
00d3b8f5
Add vpks{h, w}{s, u}s, vpku{h, w}us, and vpku{h, w}um 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@6182 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
51 additions
and
0 deletions
target-ppc/helper.h
... | ... | @@ -169,6 +169,14 @@ DEF_HELPER_4(vmsumubm, void, avr, avr, avr, avr) |
169 | 169 | DEF_HELPER_4(vmsummbm, void, avr, avr, avr, avr) |
170 | 170 | DEF_HELPER_4(vsel, void, avr, avr, avr, avr) |
171 | 171 | DEF_HELPER_4(vperm, void, avr, avr, avr, avr) |
172 | +DEF_HELPER_3(vpkshss, void, avr, avr, avr) | |
173 | +DEF_HELPER_3(vpkshus, void, avr, avr, avr) | |
174 | +DEF_HELPER_3(vpkswss, void, avr, avr, avr) | |
175 | +DEF_HELPER_3(vpkswus, void, avr, avr, avr) | |
176 | +DEF_HELPER_3(vpkuhus, void, avr, avr, avr) | |
177 | +DEF_HELPER_3(vpkuwus, void, avr, avr, avr) | |
178 | +DEF_HELPER_3(vpkuhum, void, avr, avr, avr) | |
179 | +DEF_HELPER_3(vpkuwum, void, avr, avr, avr) | |
172 | 180 | |
173 | 181 | DEF_HELPER_1(efscfsi, i32, i32) |
174 | 182 | DEF_HELPER_1(efscfui, i32, i32) | ... | ... |
target-ppc/op_helper.c
... | ... | @@ -2190,6 +2190,41 @@ void helper_vperm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c) |
2190 | 2190 | *r = result; |
2191 | 2191 | } |
2192 | 2192 | |
2193 | +#if defined(WORDS_BIGENDIAN) | |
2194 | +#define PKBIG 1 | |
2195 | +#else | |
2196 | +#define PKBIG 0 | |
2197 | +#endif | |
2198 | +#define VPK(suffix, from, to, cvt, dosat) \ | |
2199 | + void helper_vpk##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \ | |
2200 | + { \ | |
2201 | + int i; \ | |
2202 | + int sat = 0; \ | |
2203 | + ppc_avr_t result; \ | |
2204 | + ppc_avr_t *a0 = PKBIG ? a : b; \ | |
2205 | + ppc_avr_t *a1 = PKBIG ? b : a; \ | |
2206 | + VECTOR_FOR_INORDER_I (i, from) { \ | |
2207 | + result.to[i] = cvt(a0->from[i], &sat); \ | |
2208 | + result.to[i+ARRAY_SIZE(r->from)] = cvt(a1->from[i], &sat); \ | |
2209 | + } \ | |
2210 | + *r = result; \ | |
2211 | + if (dosat && sat) { \ | |
2212 | + env->vscr |= (1 << VSCR_SAT); \ | |
2213 | + } \ | |
2214 | + } | |
2215 | +#define I(x, y) (x) | |
2216 | +VPK(shss, s16, s8, cvtshsb, 1) | |
2217 | +VPK(shus, s16, u8, cvtshub, 1) | |
2218 | +VPK(swss, s32, s16, cvtswsh, 1) | |
2219 | +VPK(swus, s32, u16, cvtswuh, 1) | |
2220 | +VPK(uhus, u16, u8, cvtuhub, 1) | |
2221 | +VPK(uwus, u32, u16, cvtuwuh, 1) | |
2222 | +VPK(uhum, u16, u8, I, 0) | |
2223 | +VPK(uwum, u32, u16, I, 0) | |
2224 | +#undef I | |
2225 | +#undef VPK | |
2226 | +#undef PKBIG | |
2227 | + | |
2193 | 2228 | #define VROTATE(suffix, element) \ |
2194 | 2229 | void helper_vrl##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \ |
2195 | 2230 | { \ | ... | ... |
target-ppc/translate.c
... | ... | @@ -6273,6 +6273,14 @@ GEN_VXFORM(vsubcuw, 0, 22); |
6273 | 6273 | GEN_VXFORM(vrlb, 2, 0); |
6274 | 6274 | GEN_VXFORM(vrlh, 2, 1); |
6275 | 6275 | GEN_VXFORM(vrlw, 2, 2); |
6276 | +GEN_VXFORM(vpkuhum, 7, 0); | |
6277 | +GEN_VXFORM(vpkuwum, 7, 1); | |
6278 | +GEN_VXFORM(vpkuhus, 7, 2); | |
6279 | +GEN_VXFORM(vpkuwus, 7, 3); | |
6280 | +GEN_VXFORM(vpkshus, 7, 4); | |
6281 | +GEN_VXFORM(vpkswus, 7, 5); | |
6282 | +GEN_VXFORM(vpkshss, 7, 6); | |
6283 | +GEN_VXFORM(vpkswss, 7, 7); | |
6276 | 6284 | |
6277 | 6285 | #define GEN_VXFORM_NOA(name, opc2, opc3) \ |
6278 | 6286 | GEN_HANDLER(name, 0x04, opc2, opc3, 0x001f0000, PPC_ALTIVEC) \ | ... | ... |