Commit 5335a145a178630a8d157cd927c5bd697d1e362e

Authored by aurel32
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
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) \
... ...