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,7 +201,7 @@ static void ppc_heathrow_init (ram_addr_t ram_size, int vga_ram_size,
201 if (linux_boot) { 201 if (linux_boot) {
202 kernel_base = KERNEL_LOAD_ADDR; 202 kernel_base = KERNEL_LOAD_ADDR;
203 /* now we can load the kernel */ 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 NULL, NULL, NULL); 205 NULL, NULL, NULL);
206 if (kernel_size < 0) 206 if (kernel_size < 0)
207 kernel_size = load_aout(kernel_filename, kernel_base, 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,6 +170,18 @@ DEF_HELPER_3(vaddcuw, void, avr, avr, avr)
170 DEF_HELPER_3(vsubcuw, void, avr, avr, avr) 170 DEF_HELPER_3(vsubcuw, void, avr, avr, avr)
171 DEF_HELPER_2(lvsl, void, avr, tl); 171 DEF_HELPER_2(lvsl, void, avr, tl);
172 DEF_HELPER_2(lvsr, void, avr, tl); 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 DEF_HELPER_3(vrlb, void, avr, avr, avr) 185 DEF_HELPER_3(vrlb, void, avr, avr, avr)
174 DEF_HELPER_3(vrlh, void, avr, avr, avr) 186 DEF_HELPER_3(vrlh, void, avr, avr, avr)
175 DEF_HELPER_3(vrlw, void, avr, avr, avr) 187 DEF_HELPER_3(vrlw, void, avr, avr, avr)
target-ppc/op_helper.c
@@ -2082,6 +2082,45 @@ VARITH(uwm, u32) @@ -2082,6 +2082,45 @@ VARITH(uwm, u32)
2082 #undef VARITH_DO 2082 #undef VARITH_DO
2083 #undef VARITH 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 #define VAVG_DO(name, element, etype) \ 2124 #define VAVG_DO(name, element, etype) \
2086 void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \ 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,6 +6341,18 @@ GEN_VXFORM(vslo, 6, 16);
6341 GEN_VXFORM(vsro, 6, 17); 6341 GEN_VXFORM(vsro, 6, 17);
6342 GEN_VXFORM(vaddcuw, 0, 6); 6342 GEN_VXFORM(vaddcuw, 0, 6);
6343 GEN_VXFORM(vsubcuw, 0, 22); 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 GEN_VXFORM(vrlb, 2, 0); 6356 GEN_VXFORM(vrlb, 2, 0);
6345 GEN_VXFORM(vrlh, 2, 1); 6357 GEN_VXFORM(vrlh, 2, 1);
6346 GEN_VXFORM(vrlw, 2, 2); 6358 GEN_VXFORM(vrlw, 2, 2);