Commit 5ab09f33495b3c644aae33e0bcfbad8e6a469cc7

Authored by aurel32
1 parent b0f3b8fa

Add v{add, sub}{s, u}{b, h, w}s instructions

Nathan Froyd <froydnj@codesourcery.com>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6254 c046a42c-6fe2-441c-8c8c-71466251a162
hw/ppc_oldworld.c
... ... @@ -201,7 +201,7 @@ static void ppc_heathrow_init (ram_addr_t ram_size, int vga_ram_size,
201 201 if (linux_boot) {
202 202 kernel_base = KERNEL_LOAD_ADDR;
203 203 /* now we can load the kernel */
204   - kernel_size = load_elf(kernel_filename, kernel_base - 0xc0000000ULL,
  204 + kernel_size = load_elf(kernel_filename, kernel_base - 0x00000000ULL,
205 205 NULL, NULL, NULL);
206 206 if (kernel_size < 0)
207 207 kernel_size = load_aout(kernel_filename, kernel_base,
... ...
target-ppc/helper.h
... ... @@ -170,6 +170,18 @@ DEF_HELPER_3(vaddcuw, void, avr, avr, avr)
170 170 DEF_HELPER_3(vsubcuw, void, avr, avr, avr)
171 171 DEF_HELPER_2(lvsl, void, avr, tl);
172 172 DEF_HELPER_2(lvsr, void, avr, tl);
  173 +DEF_HELPER_3(vaddsbs, void, avr, avr, avr)
  174 +DEF_HELPER_3(vaddshs, void, avr, avr, avr)
  175 +DEF_HELPER_3(vaddsws, void, avr, avr, avr)
  176 +DEF_HELPER_3(vsubsbs, void, avr, avr, avr)
  177 +DEF_HELPER_3(vsubshs, void, avr, avr, avr)
  178 +DEF_HELPER_3(vsubsws, void, avr, avr, avr)
  179 +DEF_HELPER_3(vaddubs, void, avr, avr, avr)
  180 +DEF_HELPER_3(vadduhs, void, avr, avr, avr)
  181 +DEF_HELPER_3(vadduws, void, avr, avr, avr)
  182 +DEF_HELPER_3(vsububs, void, avr, avr, avr)
  183 +DEF_HELPER_3(vsubuhs, void, avr, avr, avr)
  184 +DEF_HELPER_3(vsubuws, void, avr, avr, avr)
173 185 DEF_HELPER_3(vrlb, void, avr, avr, avr)
174 186 DEF_HELPER_3(vrlh, void, avr, avr, avr)
175 187 DEF_HELPER_3(vrlw, void, avr, avr, avr)
... ...
target-ppc/op_helper.c
... ... @@ -2082,6 +2082,45 @@ VARITH(uwm, u32)
2082 2082 #undef VARITH_DO
2083 2083 #undef VARITH
2084 2084  
  2085 +#define VARITHSAT_CASE(type, op, cvt, element) \
  2086 + { \
  2087 + type result = (type)a->element[i] op (type)b->element[i]; \
  2088 + r->element[i] = cvt(result, &sat); \
  2089 + }
  2090 +
  2091 +#define VARITHSAT_DO(name, op, optype, cvt, element) \
  2092 + void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
  2093 + { \
  2094 + int sat = 0; \
  2095 + int i; \
  2096 + for (i = 0; i < ARRAY_SIZE(r->element); i++) { \
  2097 + switch (sizeof(r->element[0])) { \
  2098 + case 1: VARITHSAT_CASE(optype, op, cvt, element); break; \
  2099 + case 2: VARITHSAT_CASE(optype, op, cvt, element); break; \
  2100 + case 4: VARITHSAT_CASE(optype, op, cvt, element); break; \
  2101 + } \
  2102 + } \
  2103 + if (sat) { \
  2104 + env->vscr |= (1 << VSCR_SAT); \
  2105 + } \
  2106 + }
  2107 +#define VARITHSAT_SIGNED(suffix, element, optype, cvt) \
  2108 + VARITHSAT_DO(adds##suffix##s, +, optype, cvt, element) \
  2109 + VARITHSAT_DO(subs##suffix##s, -, optype, cvt, element)
  2110 +#define VARITHSAT_UNSIGNED(suffix, element, optype, cvt) \
  2111 + VARITHSAT_DO(addu##suffix##s, +, optype, cvt, element) \
  2112 + VARITHSAT_DO(subu##suffix##s, -, optype, cvt, element)
  2113 +VARITHSAT_SIGNED(b, s8, int16_t, cvtshsb)
  2114 +VARITHSAT_SIGNED(h, s16, int32_t, cvtswsh)
  2115 +VARITHSAT_SIGNED(w, s32, int64_t, cvtsdsw)
  2116 +VARITHSAT_UNSIGNED(b, u8, uint16_t, cvtshub)
  2117 +VARITHSAT_UNSIGNED(h, u16, uint32_t, cvtswuh)
  2118 +VARITHSAT_UNSIGNED(w, u32, uint64_t, cvtsduw)
  2119 +#undef VARITHSAT_CASE
  2120 +#undef VARITHSAT_DO
  2121 +#undef VARITHSAT_SIGNED
  2122 +#undef VARITHSAT_UNSIGNED
  2123 +
2085 2124 #define VAVG_DO(name, element, etype) \
2086 2125 void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
2087 2126 { \
... ...
target-ppc/translate.c
... ... @@ -6341,6 +6341,18 @@ GEN_VXFORM(vslo, 6, 16);
6341 6341 GEN_VXFORM(vsro, 6, 17);
6342 6342 GEN_VXFORM(vaddcuw, 0, 6);
6343 6343 GEN_VXFORM(vsubcuw, 0, 22);
  6344 +GEN_VXFORM(vaddubs, 0, 8);
  6345 +GEN_VXFORM(vadduhs, 0, 9);
  6346 +GEN_VXFORM(vadduws, 0, 10);
  6347 +GEN_VXFORM(vaddsbs, 0, 12);
  6348 +GEN_VXFORM(vaddshs, 0, 13);
  6349 +GEN_VXFORM(vaddsws, 0, 14);
  6350 +GEN_VXFORM(vsububs, 0, 24);
  6351 +GEN_VXFORM(vsubuhs, 0, 25);
  6352 +GEN_VXFORM(vsubuws, 0, 26);
  6353 +GEN_VXFORM(vsubsbs, 0, 28);
  6354 +GEN_VXFORM(vsubshs, 0, 29);
  6355 +GEN_VXFORM(vsubsws, 0, 30);
6344 6356 GEN_VXFORM(vrlb, 2, 0);
6345 6357 GEN_VXFORM(vrlh, 2, 1);
6346 6358 GEN_VXFORM(vrlw, 2, 2);
... ...