Commit d1258698f5c295a2c34258ea6bcf406794ff6e95

Authored by aurel32
1 parent b04ae981

Add vsel and vperm 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@6180 c046a42c-6fe2-441c-8c8c-71466251a162
target-ppc/helper.h
... ... @@ -167,6 +167,8 @@ DEF_HELPER_2(vupklsb, void, avr, avr)
167 167 DEF_HELPER_2(vupklsh, void, avr, avr)
168 168 DEF_HELPER_4(vmsumubm, void, avr, avr, avr, avr)
169 169 DEF_HELPER_4(vmsummbm, void, avr, avr, avr, avr)
  170 +DEF_HELPER_4(vsel, void, avr, avr, avr, avr)
  171 +DEF_HELPER_4(vperm, void, avr, avr, avr, avr)
170 172  
171 173 DEF_HELPER_1(efscfsi, i32, i32)
172 174 DEF_HELPER_1(efscfui, i32, i32)
... ...
target-ppc/op_helper.c
... ... @@ -2143,6 +2143,26 @@ VMUL(uh, u16, u32)
2143 2143 #undef VMUL_DO
2144 2144 #undef VMUL
2145 2145  
  2146 +void helper_vperm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
  2147 +{
  2148 + ppc_avr_t result;
  2149 + int i;
  2150 + VECTOR_FOR_INORDER_I (i, u8) {
  2151 + int s = c->u8[i] & 0x1f;
  2152 +#if defined(WORDS_BIGENDIAN)
  2153 + int index = s & 0xf;
  2154 +#else
  2155 + int index = 15 - (s & 0xf);
  2156 +#endif
  2157 + if (s & 0x10) {
  2158 + result.u8[i] = b->u8[index];
  2159 + } else {
  2160 + result.u8[i] = a->u8[index];
  2161 + }
  2162 + }
  2163 + *r = result;
  2164 +}
  2165 +
2146 2166 #define VROTATE(suffix, element) \
2147 2167 void helper_vrl##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
2148 2168 { \
... ... @@ -2158,6 +2178,12 @@ VROTATE(h, u16)
2158 2178 VROTATE(w, u32)
2159 2179 #undef VROTATE
2160 2180  
  2181 +void helper_vsel (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
  2182 +{
  2183 + r->u64[0] = (a->u64[0] & ~c->u64[0]) | (b->u64[0] & c->u64[0]);
  2184 + r->u64[1] = (a->u64[1] & ~c->u64[1]) | (b->u64[1] & c->u64[1]);
  2185 +}
  2186 +
2161 2187 #define VSL(suffix, element) \
2162 2188 void helper_vsl##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
2163 2189 { \
... ...
target-ppc/translate.c
... ... @@ -6377,6 +6377,7 @@ GEN_HANDLER(vsldoi, 0x04, 0x16, 0xFF, 0x00000400, PPC_ALTIVEC)
6377 6377 }
6378 6378  
6379 6379 GEN_VAFORM_PAIRED(vmsumubm, vmsummbm, 18)
  6380 +GEN_VAFORM_PAIRED(vsel, vperm, 21)
6380 6381  
6381 6382 /*** SPE extension ***/
6382 6383 /* Register moves */
... ...