Revision 1add6e23
b/target-ppc/helper.h | ||
---|---|---|
123 | 123 |
DEF_HELPER_3(vmaxub, void, avr, avr, avr) |
124 | 124 |
DEF_HELPER_3(vmaxuh, void, avr, avr, avr) |
125 | 125 |
DEF_HELPER_3(vmaxuw, void, avr, avr, avr) |
126 |
DEF_HELPER_3(vcmpequb, void, avr, avr, avr) |
|
127 |
DEF_HELPER_3(vcmpequh, void, avr, avr, avr) |
|
128 |
DEF_HELPER_3(vcmpequw, void, avr, avr, avr) |
|
129 |
DEF_HELPER_3(vcmpgtub, void, avr, avr, avr) |
|
130 |
DEF_HELPER_3(vcmpgtuh, void, avr, avr, avr) |
|
131 |
DEF_HELPER_3(vcmpgtuw, void, avr, avr, avr) |
|
132 |
DEF_HELPER_3(vcmpgtsb, void, avr, avr, avr) |
|
133 |
DEF_HELPER_3(vcmpgtsh, void, avr, avr, avr) |
|
134 |
DEF_HELPER_3(vcmpgtsw, void, avr, avr, avr) |
|
135 |
DEF_HELPER_3(vcmpequb_dot, void, avr, avr, avr) |
|
136 |
DEF_HELPER_3(vcmpequh_dot, void, avr, avr, avr) |
|
137 |
DEF_HELPER_3(vcmpequw_dot, void, avr, avr, avr) |
|
138 |
DEF_HELPER_3(vcmpgtub_dot, void, avr, avr, avr) |
|
139 |
DEF_HELPER_3(vcmpgtuh_dot, void, avr, avr, avr) |
|
140 |
DEF_HELPER_3(vcmpgtuw_dot, void, avr, avr, avr) |
|
141 |
DEF_HELPER_3(vcmpgtsb_dot, void, avr, avr, avr) |
|
142 |
DEF_HELPER_3(vcmpgtsh_dot, void, avr, avr, avr) |
|
143 |
DEF_HELPER_3(vcmpgtsw_dot, void, avr, avr, avr) |
|
126 | 144 |
DEF_HELPER_3(vmrglb, void, avr, avr, avr) |
127 | 145 |
DEF_HELPER_3(vmrglh, void, avr, avr, avr) |
128 | 146 |
DEF_HELPER_3(vmrglw, void, avr, avr, avr) |
b/target-ppc/op_helper.c | ||
---|---|---|
2101 | 2101 |
#undef VAVG_DO |
2102 | 2102 |
#undef VAVG |
2103 | 2103 |
|
2104 |
#define VCMP_DO(suffix, compare, element, record) \ |
|
2105 |
void helper_vcmp##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \ |
|
2106 |
{ \ |
|
2107 |
uint32_t ones = (uint32_t)-1; \ |
|
2108 |
uint32_t all = ones; \ |
|
2109 |
uint32_t none = 0; \ |
|
2110 |
int i; \ |
|
2111 |
for (i = 0; i < ARRAY_SIZE(r->element); i++) { \ |
|
2112 |
uint32_t result = (a->element[i] compare b->element[i] ? ones : 0x0); \ |
|
2113 |
switch (sizeof (a->element[0])) { \ |
|
2114 |
case 4: r->u32[i] = result; break; \ |
|
2115 |
case 2: r->u16[i] = result; break; \ |
|
2116 |
case 1: r->u8[i] = result; break; \ |
|
2117 |
} \ |
|
2118 |
all &= result; \ |
|
2119 |
none |= result; \ |
|
2120 |
} \ |
|
2121 |
if (record) { \ |
|
2122 |
env->crf[6] = ((all != 0) << 3) | ((none == 0) << 1); \ |
|
2123 |
} \ |
|
2124 |
} |
|
2125 |
#define VCMP(suffix, compare, element) \ |
|
2126 |
VCMP_DO(suffix, compare, element, 0) \ |
|
2127 |
VCMP_DO(suffix##_dot, compare, element, 1) |
|
2128 |
VCMP(equb, ==, u8) |
|
2129 |
VCMP(equh, ==, u16) |
|
2130 |
VCMP(equw, ==, u32) |
|
2131 |
VCMP(gtub, >, u8) |
|
2132 |
VCMP(gtuh, >, u16) |
|
2133 |
VCMP(gtuw, >, u32) |
|
2134 |
VCMP(gtsb, >, s8) |
|
2135 |
VCMP(gtsh, >, s16) |
|
2136 |
VCMP(gtsw, >, s32) |
|
2137 |
#undef VCMP_DO |
|
2138 |
#undef VCMP |
|
2139 |
|
|
2104 | 2140 |
void helper_vmhaddshs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c) |
2105 | 2141 |
{ |
2106 | 2142 |
int sat = 0; |
b/target-ppc/translate.c | ||
---|---|---|
6380 | 6380 |
GEN_VXRFORM1(name, name, #name, opc2, opc3) \ |
6381 | 6381 |
GEN_VXRFORM1(name##_dot, name##_, #name ".", opc2, (opc3 | (0x1 << 4))) |
6382 | 6382 |
|
6383 |
GEN_VXRFORM(vcmpequb, 3, 0) |
|
6384 |
GEN_VXRFORM(vcmpequh, 3, 1) |
|
6385 |
GEN_VXRFORM(vcmpequw, 3, 2) |
|
6386 |
GEN_VXRFORM(vcmpgtsb, 3, 12) |
|
6387 |
GEN_VXRFORM(vcmpgtsh, 3, 13) |
|
6388 |
GEN_VXRFORM(vcmpgtsw, 3, 14) |
|
6389 |
GEN_VXRFORM(vcmpgtub, 3, 8) |
|
6390 |
GEN_VXRFORM(vcmpgtuh, 3, 9) |
|
6391 |
GEN_VXRFORM(vcmpgtuw, 3, 10) |
|
6392 |
|
|
6383 | 6393 |
#define GEN_VXFORM_NOA(name, opc2, opc3) \ |
6384 | 6394 |
GEN_HANDLER(name, 0x04, opc2, opc3, 0x001f0000, PPC_ALTIVEC) \ |
6385 | 6395 |
{ \ |
Also available in: Unified diff