Revision 99a0949b target-ppc/op_helper.c
b/target-ppc/op_helper.c | ||
---|---|---|
1782 | 1782 |
#if !defined (CONFIG_USER_ONLY) |
1783 | 1783 |
target_ulong helper_rac (target_ulong addr) |
1784 | 1784 |
{ |
1785 |
mmu_ctx_t ctx;
|
|
1785 |
a_mmu_ctx ctx;
|
|
1786 | 1786 |
int nb_BATs; |
1787 | 1787 |
target_ulong ret = 0; |
1788 | 1788 |
|
... | ... | |
1996 | 1996 |
#undef SATCVT |
1997 | 1997 |
|
1998 | 1998 |
#define LVE(name, access, swap, element) \ |
1999 |
void helper_##name (ppc_avr_t *r, target_ulong addr) \
|
|
1999 |
void helper_##name (union ppc_avr *r, target_ulong addr) \
|
|
2000 | 2000 |
{ \ |
2001 | 2001 |
size_t n_elems = ARRAY_SIZE(r->element); \ |
2002 | 2002 |
int adjust = HI_IDX*(n_elems-1); \ |
... | ... | |
2015 | 2015 |
#undef I |
2016 | 2016 |
#undef LVE |
2017 | 2017 |
|
2018 |
void helper_lvsl (ppc_avr_t *r, target_ulong sh)
|
|
2018 |
void helper_lvsl (union ppc_avr *r, target_ulong sh)
|
|
2019 | 2019 |
{ |
2020 | 2020 |
int i, j = (sh & 0xf); |
2021 | 2021 |
|
... | ... | |
2024 | 2024 |
} |
2025 | 2025 |
} |
2026 | 2026 |
|
2027 |
void helper_lvsr (ppc_avr_t *r, target_ulong sh)
|
|
2027 |
void helper_lvsr (union ppc_avr *r, target_ulong sh)
|
|
2028 | 2028 |
{ |
2029 | 2029 |
int i, j = 0x10 - (sh & 0xf); |
2030 | 2030 |
|
... | ... | |
2034 | 2034 |
} |
2035 | 2035 |
|
2036 | 2036 |
#define STVE(name, access, swap, element) \ |
2037 |
void helper_##name (ppc_avr_t *r, target_ulong addr) \
|
|
2037 |
void helper_##name (union ppc_avr *r, target_ulong addr) \
|
|
2038 | 2038 |
{ \ |
2039 | 2039 |
size_t n_elems = ARRAY_SIZE(r->element); \ |
2040 | 2040 |
int adjust = HI_IDX*(n_elems-1); \ |
... | ... | |
2053 | 2053 |
#undef I |
2054 | 2054 |
#undef LVE |
2055 | 2055 |
|
2056 |
void helper_mtvscr (ppc_avr_t *r)
|
|
2056 |
void helper_mtvscr (union ppc_avr *r)
|
|
2057 | 2057 |
{ |
2058 | 2058 |
#if defined(HOST_WORDS_BIGENDIAN) |
2059 | 2059 |
env->vscr = r->u32[3]; |
... | ... | |
2063 | 2063 |
set_flush_to_zero(vscr_nj, &env->vec_status); |
2064 | 2064 |
} |
2065 | 2065 |
|
2066 |
void helper_vaddcuw (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
|
|
2066 |
void helper_vaddcuw (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b)
|
|
2067 | 2067 |
{ |
2068 | 2068 |
int i; |
2069 | 2069 |
for (i = 0; i < ARRAY_SIZE(r->u32); i++) { |
... | ... | |
2071 | 2071 |
} |
2072 | 2072 |
} |
2073 | 2073 |
|
2074 |
#define VARITH_DO(name, op, element) \ |
|
2075 |
void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
|
2076 |
{ \ |
|
2077 |
int i; \ |
|
2078 |
for (i = 0; i < ARRAY_SIZE(r->element); i++) { \ |
|
2079 |
r->element[i] = a->element[i] op b->element[i]; \ |
|
2080 |
} \ |
|
2074 |
#define VARITH_DO(name, op, element) \
|
|
2075 |
void helper_v##name (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b) \
|
|
2076 |
{ \
|
|
2077 |
int i; \
|
|
2078 |
for (i = 0; i < ARRAY_SIZE(r->element); i++) { \
|
|
2079 |
r->element[i] = a->element[i] op b->element[i]; \
|
|
2080 |
} \
|
|
2081 | 2081 |
} |
2082 | 2082 |
#define VARITH(suffix, element) \ |
2083 | 2083 |
VARITH_DO(add##suffix, +, element) \ |
... | ... | |
2089 | 2089 |
#undef VARITH |
2090 | 2090 |
|
2091 | 2091 |
#define VARITHFP(suffix, func) \ |
2092 |
void helper_v##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
|
2092 |
void helper_v##suffix (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b)\
|
|
2093 | 2093 |
{ \ |
2094 | 2094 |
int i; \ |
2095 | 2095 |
for (i = 0; i < ARRAY_SIZE(r->f); i++) { \ |
... | ... | |
2109 | 2109 |
} |
2110 | 2110 |
|
2111 | 2111 |
#define VARITHSAT_DO(name, op, optype, cvt, element) \ |
2112 |
void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
|
2112 |
void helper_v##name (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b) \
|
|
2113 | 2113 |
{ \ |
2114 | 2114 |
int sat = 0; \ |
2115 | 2115 |
int i; \ |
... | ... | |
2142 | 2142 |
#undef VARITHSAT_UNSIGNED |
2143 | 2143 |
|
2144 | 2144 |
#define VAVG_DO(name, element, etype) \ |
2145 |
void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
|
2145 |
void helper_v##name (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b)\
|
|
2146 | 2146 |
{ \ |
2147 | 2147 |
int i; \ |
2148 | 2148 |
for (i = 0; i < ARRAY_SIZE(r->element); i++) { \ |
... | ... | |
2161 | 2161 |
#undef VAVG |
2162 | 2162 |
|
2163 | 2163 |
#define VCF(suffix, cvt, element) \ |
2164 |
void helper_vcf##suffix (ppc_avr_t *r, ppc_avr_t *b, uint32_t uim) \
|
|
2164 |
void helper_vcf##suffix (union ppc_avr *r, union ppc_avr *b, uint32_t uim) \
|
|
2165 | 2165 |
{ \ |
2166 | 2166 |
int i; \ |
2167 | 2167 |
for (i = 0; i < ARRAY_SIZE(r->f); i++) { \ |
... | ... | |
2174 | 2174 |
#undef VCF |
2175 | 2175 |
|
2176 | 2176 |
#define VCMP_DO(suffix, compare, element, record) \ |
2177 |
void helper_vcmp##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
|
2177 |
void helper_vcmp##suffix (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b) \
|
|
2178 | 2178 |
{ \ |
2179 | 2179 |
uint32_t ones = (uint32_t)-1; \ |
2180 | 2180 |
uint32_t all = ones; \ |
... | ... | |
2210 | 2210 |
#undef VCMP |
2211 | 2211 |
|
2212 | 2212 |
#define VCMPFP_DO(suffix, compare, order, record) \ |
2213 |
void helper_vcmp##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
|
2213 |
void helper_vcmp##suffix (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b) \
|
|
2214 | 2214 |
{ \ |
2215 | 2215 |
uint32_t ones = (uint32_t)-1; \ |
2216 | 2216 |
uint32_t all = ones; \ |
... | ... | |
2243 | 2243 |
#undef VCMPFP_DO |
2244 | 2244 |
#undef VCMPFP |
2245 | 2245 |
|
2246 |
static inline void vcmpbfp_internal(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b,
|
|
2246 |
static inline void vcmpbfp_internal(union ppc_avr *r, union ppc_avr *a, union ppc_avr *b,
|
|
2247 | 2247 |
int record) |
2248 | 2248 |
{ |
2249 | 2249 |
int i; |
... | ... | |
2267 | 2267 |
} |
2268 | 2268 |
} |
2269 | 2269 |
|
2270 |
void helper_vcmpbfp (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
|
|
2270 |
void helper_vcmpbfp (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b)
|
|
2271 | 2271 |
{ |
2272 | 2272 |
vcmpbfp_internal(r, a, b, 0); |
2273 | 2273 |
} |
2274 | 2274 |
|
2275 |
void helper_vcmpbfp_dot (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
|
|
2275 |
void helper_vcmpbfp_dot (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b)
|
|
2276 | 2276 |
{ |
2277 | 2277 |
vcmpbfp_internal(r, a, b, 1); |
2278 | 2278 |
} |
2279 | 2279 |
|
2280 | 2280 |
#define VCT(suffix, satcvt, element) \ |
2281 |
void helper_vct##suffix (ppc_avr_t *r, ppc_avr_t *b, uint32_t uim) \
|
|
2281 |
void helper_vct##suffix (union ppc_avr *r, union ppc_avr *b, uint32_t uim) \
|
|
2282 | 2282 |
{ \ |
2283 | 2283 |
int i; \ |
2284 | 2284 |
int sat = 0; \ |
... | ... | |
2304 | 2304 |
VCT(sxs, cvtsdsw, s32) |
2305 | 2305 |
#undef VCT |
2306 | 2306 |
|
2307 |
void helper_vmaddfp (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
|
|
2307 |
void helper_vmaddfp (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b, union ppc_avr *c)
|
|
2308 | 2308 |
{ |
2309 | 2309 |
int i; |
2310 | 2310 |
for (i = 0; i < ARRAY_SIZE(r->f); i++) { |
... | ... | |
2322 | 2322 |
} |
2323 | 2323 |
} |
2324 | 2324 |
|
2325 |
void helper_vmhaddshs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
|
|
2325 |
void helper_vmhaddshs (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b, union ppc_avr *c)
|
|
2326 | 2326 |
{ |
2327 | 2327 |
int sat = 0; |
2328 | 2328 |
int i; |
... | ... | |
2338 | 2338 |
} |
2339 | 2339 |
} |
2340 | 2340 |
|
2341 |
void helper_vmhraddshs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
|
|
2341 |
void helper_vmhraddshs (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b, union ppc_avr *c)
|
|
2342 | 2342 |
{ |
2343 | 2343 |
int sat = 0; |
2344 | 2344 |
int i; |
... | ... | |
2355 | 2355 |
} |
2356 | 2356 |
|
2357 | 2357 |
#define VMINMAX_DO(name, compare, element) \ |
2358 |
void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
|
2358 |
void helper_v##name (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b) \
|
|
2359 | 2359 |
{ \ |
2360 | 2360 |
int i; \ |
2361 | 2361 |
for (i = 0; i < ARRAY_SIZE(r->element); i++) { \ |
... | ... | |
2379 | 2379 |
#undef VMINMAX |
2380 | 2380 |
|
2381 | 2381 |
#define VMINMAXFP(suffix, rT, rF) \ |
2382 |
void helper_v##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
|
2382 |
void helper_v##suffix (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b) \
|
|
2383 | 2383 |
{ \ |
2384 | 2384 |
int i; \ |
2385 | 2385 |
for (i = 0; i < ARRAY_SIZE(r->f); i++) { \ |
... | ... | |
2396 | 2396 |
VMINMAXFP(maxfp, b, a) |
2397 | 2397 |
#undef VMINMAXFP |
2398 | 2398 |
|
2399 |
void helper_vmladduhm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
|
|
2399 |
void helper_vmladduhm (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b, union ppc_avr *c)
|
|
2400 | 2400 |
{ |
2401 | 2401 |
int i; |
2402 | 2402 |
for (i = 0; i < ARRAY_SIZE(r->s16); i++) { |
... | ... | |
2406 | 2406 |
} |
2407 | 2407 |
|
2408 | 2408 |
#define VMRG_DO(name, element, highp) \ |
2409 |
void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
|
2409 |
void helper_v##name (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b) \
|
|
2410 | 2410 |
{ \ |
2411 |
ppc_avr_t result; \
|
|
2411 |
union ppc_avr result; \
|
|
2412 | 2412 |
int i; \ |
2413 | 2413 |
size_t n_elems = ARRAY_SIZE(r->element); \ |
2414 | 2414 |
for (i = 0; i < n_elems/2; i++) { \ |
... | ... | |
2440 | 2440 |
#undef MRGHI |
2441 | 2441 |
#undef MRGLO |
2442 | 2442 |
|
2443 |
void helper_vmsummbm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
|
|
2443 |
void helper_vmsummbm (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b, union ppc_avr *c)
|
|
2444 | 2444 |
{ |
2445 | 2445 |
int32_t prod[16]; |
2446 | 2446 |
int i; |
... | ... | |
2454 | 2454 |
} |
2455 | 2455 |
} |
2456 | 2456 |
|
2457 |
void helper_vmsumshm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
|
|
2457 |
void helper_vmsumshm (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b, union ppc_avr *c)
|
|
2458 | 2458 |
{ |
2459 | 2459 |
int32_t prod[8]; |
2460 | 2460 |
int i; |
... | ... | |
2468 | 2468 |
} |
2469 | 2469 |
} |
2470 | 2470 |
|
2471 |
void helper_vmsumshs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
|
|
2471 |
void helper_vmsumshs (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b, union ppc_avr *c)
|
|
2472 | 2472 |
{ |
2473 | 2473 |
int32_t prod[8]; |
2474 | 2474 |
int i; |
... | ... | |
2488 | 2488 |
} |
2489 | 2489 |
} |
2490 | 2490 |
|
2491 |
void helper_vmsumubm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
|
|
2491 |
void helper_vmsumubm (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b, union ppc_avr *c)
|
|
2492 | 2492 |
{ |
2493 | 2493 |
uint16_t prod[16]; |
2494 | 2494 |
int i; |
... | ... | |
2502 | 2502 |
} |
2503 | 2503 |
} |
2504 | 2504 |
|
2505 |
void helper_vmsumuhm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
|
|
2505 |
void helper_vmsumuhm (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b, union ppc_avr *c)
|
|
2506 | 2506 |
{ |
2507 | 2507 |
uint32_t prod[8]; |
2508 | 2508 |
int i; |
... | ... | |
2516 | 2516 |
} |
2517 | 2517 |
} |
2518 | 2518 |
|
2519 |
void helper_vmsumuhs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
|
|
2519 |
void helper_vmsumuhs (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b, union ppc_avr *c)
|
|
2520 | 2520 |
{ |
2521 | 2521 |
uint32_t prod[8]; |
2522 | 2522 |
int i; |
... | ... | |
2537 | 2537 |
} |
2538 | 2538 |
|
2539 | 2539 |
#define VMUL_DO(name, mul_element, prod_element, evenp) \ |
2540 |
void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
|
2540 |
void helper_v##name (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b) \
|
|
2541 | 2541 |
{ \ |
2542 | 2542 |
int i; \ |
2543 | 2543 |
VECTOR_FOR_INORDER_I(i, prod_element) { \ |
... | ... | |
2558 | 2558 |
#undef VMUL_DO |
2559 | 2559 |
#undef VMUL |
2560 | 2560 |
|
2561 |
void helper_vnmsubfp (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
|
|
2561 |
void helper_vnmsubfp (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b, union ppc_avr *c)
|
|
2562 | 2562 |
{ |
2563 | 2563 |
int i; |
2564 | 2564 |
for (i = 0; i < ARRAY_SIZE(r->f); i++) { |
... | ... | |
2577 | 2577 |
} |
2578 | 2578 |
} |
2579 | 2579 |
|
2580 |
void helper_vperm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
|
|
2580 |
void helper_vperm (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b, union ppc_avr *c)
|
|
2581 | 2581 |
{ |
2582 |
ppc_avr_t result;
|
|
2582 |
union ppc_avr result;
|
|
2583 | 2583 |
int i; |
2584 | 2584 |
VECTOR_FOR_INORDER_I (i, u8) { |
2585 | 2585 |
int s = c->u8[i] & 0x1f; |
... | ... | |
2602 | 2602 |
#else |
2603 | 2603 |
#define PKBIG 0 |
2604 | 2604 |
#endif |
2605 |
void helper_vpkpx (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
|
|
2605 |
void helper_vpkpx (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b)
|
|
2606 | 2606 |
{ |
2607 | 2607 |
int i, j; |
2608 |
ppc_avr_t result;
|
|
2608 |
union ppc_avr result;
|
|
2609 | 2609 |
#if defined(HOST_WORDS_BIGENDIAN) |
2610 |
const ppc_avr_t *x[2] = { a, b };
|
|
2610 |
const union ppc_avr *x[2] = { a, b };
|
|
2611 | 2611 |
#else |
2612 |
const ppc_avr_t *x[2] = { b, a };
|
|
2612 |
const union ppc_avr *x[2] = { b, a };
|
|
2613 | 2613 |
#endif |
2614 | 2614 |
|
2615 | 2615 |
VECTOR_FOR_INORDER_I (i, u64) { |
... | ... | |
2624 | 2624 |
} |
2625 | 2625 |
|
2626 | 2626 |
#define VPK(suffix, from, to, cvt, dosat) \ |
2627 |
void helper_vpk##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
|
2627 |
void helper_vpk##suffix (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b) \
|
|
2628 | 2628 |
{ \ |
2629 | 2629 |
int i; \ |
2630 | 2630 |
int sat = 0; \ |
2631 |
ppc_avr_t result; \
|
|
2632 |
ppc_avr_t *a0 = PKBIG ? a : b; \
|
|
2633 |
ppc_avr_t *a1 = PKBIG ? b : a; \
|
|
2631 |
union ppc_avr result; \
|
|
2632 |
union ppc_avr *a0 = PKBIG ? a : b; \
|
|
2633 |
union ppc_avr *a1 = PKBIG ? b : a; \
|
|
2634 | 2634 |
VECTOR_FOR_INORDER_I (i, from) { \ |
2635 | 2635 |
result.to[i] = cvt(a0->from[i], &sat); \ |
2636 | 2636 |
result.to[i+ARRAY_SIZE(r->from)] = cvt(a1->from[i], &sat); \ |
... | ... | |
2653 | 2653 |
#undef VPK |
2654 | 2654 |
#undef PKBIG |
2655 | 2655 |
|
2656 |
void helper_vrefp (ppc_avr_t *r, ppc_avr_t *b)
|
|
2656 |
void helper_vrefp (union ppc_avr *r, union ppc_avr *b)
|
|
2657 | 2657 |
{ |
2658 | 2658 |
int i; |
2659 | 2659 |
for (i = 0; i < ARRAY_SIZE(r->f); i++) { |
... | ... | |
2664 | 2664 |
} |
2665 | 2665 |
|
2666 | 2666 |
#define VRFI(suffix, rounding) \ |
2667 |
void helper_vrfi##suffix (ppc_avr_t *r, ppc_avr_t *b) \
|
|
2667 |
void helper_vrfi##suffix (union ppc_avr *r, union ppc_avr *b) \
|
|
2668 | 2668 |
{ \ |
2669 | 2669 |
int i; \ |
2670 | 2670 |
float_status s = env->vec_status; \ |
... | ... | |
2682 | 2682 |
#undef VRFI |
2683 | 2683 |
|
2684 | 2684 |
#define VROTATE(suffix, element) \ |
2685 |
void helper_vrl##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
|
2685 |
void helper_vrl##suffix (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b) \
|
|
2686 | 2686 |
{ \ |
2687 | 2687 |
int i; \ |
2688 | 2688 |
for (i = 0; i < ARRAY_SIZE(r->element); i++) { \ |
... | ... | |
2696 | 2696 |
VROTATE(w, u32) |
2697 | 2697 |
#undef VROTATE |
2698 | 2698 |
|
2699 |
void helper_vrsqrtefp (ppc_avr_t *r, ppc_avr_t *b)
|
|
2699 |
void helper_vrsqrtefp (union ppc_avr *r, union ppc_avr *b)
|
|
2700 | 2700 |
{ |
2701 | 2701 |
int i; |
2702 | 2702 |
for (i = 0; i < ARRAY_SIZE(r->f); i++) { |
... | ... | |
2707 | 2707 |
} |
2708 | 2708 |
} |
2709 | 2709 |
|
2710 |
void helper_vsel (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
|
|
2710 |
void helper_vsel (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b, union ppc_avr *c)
|
|
2711 | 2711 |
{ |
2712 | 2712 |
r->u64[0] = (a->u64[0] & ~c->u64[0]) | (b->u64[0] & c->u64[0]); |
2713 | 2713 |
r->u64[1] = (a->u64[1] & ~c->u64[1]) | (b->u64[1] & c->u64[1]); |
2714 | 2714 |
} |
2715 | 2715 |
|
2716 |
void helper_vlogefp (ppc_avr_t *r, ppc_avr_t *b)
|
|
2716 |
void helper_vlogefp (union ppc_avr *r, union ppc_avr *b)
|
|
2717 | 2717 |
{ |
2718 | 2718 |
int i; |
2719 | 2719 |
for (i = 0; i < ARRAY_SIZE(r->f); i++) { |
... | ... | |
2734 | 2734 |
* shift counts are not identical. We check to make sure that they are |
2735 | 2735 |
* to conform to what real hardware appears to do. */ |
2736 | 2736 |
#define VSHIFT(suffix, leftp) \ |
2737 |
void helper_vs##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
|
2737 |
void helper_vs##suffix (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b) \
|
|
2738 | 2738 |
{ \ |
2739 | 2739 |
int shift = b->u8[LO_IDX*15] & 0x7; \ |
2740 | 2740 |
int doit = 1; \ |
... | ... | |
2763 | 2763 |
#undef RIGHT |
2764 | 2764 |
|
2765 | 2765 |
#define VSL(suffix, element) \ |
2766 |
void helper_vsl##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
|
2766 |
void helper_vsl##suffix (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b) \
|
|
2767 | 2767 |
{ \ |
2768 | 2768 |
int i; \ |
2769 | 2769 |
for (i = 0; i < ARRAY_SIZE(r->element); i++) { \ |
... | ... | |
2777 | 2777 |
VSL(w, u32) |
2778 | 2778 |
#undef VSL |
2779 | 2779 |
|
2780 |
void helper_vsldoi (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t shift)
|
|
2780 |
void helper_vsldoi (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b, uint32_t shift)
|
|
2781 | 2781 |
{ |
2782 | 2782 |
int sh = shift & 0xf; |
2783 | 2783 |
int i; |
2784 |
ppc_avr_t result;
|
|
2784 |
union ppc_avr result;
|
|
2785 | 2785 |
|
2786 | 2786 |
#if defined(HOST_WORDS_BIGENDIAN) |
2787 | 2787 |
for (i = 0; i < ARRAY_SIZE(r->u8); i++) { |
... | ... | |
2805 | 2805 |
*r = result; |
2806 | 2806 |
} |
2807 | 2807 |
|
2808 |
void helper_vslo (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
|
|
2808 |
void helper_vslo (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b)
|
|
2809 | 2809 |
{ |
2810 | 2810 |
int sh = (b->u8[LO_IDX*0xf] >> 3) & 0xf; |
2811 | 2811 |
|
... | ... | |
2826 | 2826 |
#define SPLAT_ELEMENT(element) (ARRAY_SIZE(r->element)-1 - _SPLAT_MASKED(element)) |
2827 | 2827 |
#endif |
2828 | 2828 |
#define VSPLT(suffix, element) \ |
2829 |
void helper_vsplt##suffix (ppc_avr_t *r, ppc_avr_t *b, uint32_t splat) \
|
|
2829 |
void helper_vsplt##suffix (union ppc_avr *r, union ppc_avr *b, uint32_t splat) \
|
|
2830 | 2830 |
{ \ |
2831 | 2831 |
uint32_t s = b->element[SPLAT_ELEMENT(element)]; \ |
2832 | 2832 |
int i; \ |
... | ... | |
2842 | 2842 |
#undef _SPLAT_MASKED |
2843 | 2843 |
|
2844 | 2844 |
#define VSPLTI(suffix, element, splat_type) \ |
2845 |
void helper_vspltis##suffix (ppc_avr_t *r, uint32_t splat) \
|
|
2845 |
void helper_vspltis##suffix (union ppc_avr *r, uint32_t splat) \
|
|
2846 | 2846 |
{ \ |
2847 | 2847 |
splat_type x = (int8_t)(splat << 3) >> 3; \ |
2848 | 2848 |
int i; \ |
... | ... | |
2856 | 2856 |
#undef VSPLTI |
2857 | 2857 |
|
2858 | 2858 |
#define VSR(suffix, element) \ |
2859 |
void helper_vsr##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
|
2859 |
void helper_vsr##suffix (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b) \
|
|
2860 | 2860 |
{ \ |
2861 | 2861 |
int i; \ |
2862 | 2862 |
for (i = 0; i < ARRAY_SIZE(r->element); i++) { \ |
... | ... | |
2873 | 2873 |
VSR(w, u32) |
2874 | 2874 |
#undef VSR |
2875 | 2875 |
|
2876 |
void helper_vsro (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
|
|
2876 |
void helper_vsro (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b)
|
|
2877 | 2877 |
{ |
2878 | 2878 |
int sh = (b->u8[LO_IDX*0xf] >> 3) & 0xf; |
2879 | 2879 |
|
... | ... | |
2886 | 2886 |
#endif |
2887 | 2887 |
} |
2888 | 2888 |
|
2889 |
void helper_vsubcuw (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
|
|
2889 |
void helper_vsubcuw (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b)
|
|
2890 | 2890 |
{ |
2891 | 2891 |
int i; |
2892 | 2892 |
for (i = 0; i < ARRAY_SIZE(r->u32); i++) { |
... | ... | |
2894 | 2894 |
} |
2895 | 2895 |
} |
2896 | 2896 |
|
2897 |
void helper_vsumsws (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
|
|
2897 |
void helper_vsumsws (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b)
|
|
2898 | 2898 |
{ |
2899 | 2899 |
int64_t t; |
2900 | 2900 |
int i, upper; |
2901 |
ppc_avr_t result;
|
|
2901 |
union ppc_avr result;
|
|
2902 | 2902 |
int sat = 0; |
2903 | 2903 |
|
2904 | 2904 |
#if defined(HOST_WORDS_BIGENDIAN) |
... | ... | |
2919 | 2919 |
} |
2920 | 2920 |
} |
2921 | 2921 |
|
2922 |
void helper_vsum2sws (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
|
|
2922 |
void helper_vsum2sws (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b)
|
|
2923 | 2923 |
{ |
2924 | 2924 |
int i, j, upper; |
2925 |
ppc_avr_t result;
|
|
2925 |
union ppc_avr result;
|
|
2926 | 2926 |
int sat = 0; |
2927 | 2927 |
|
2928 | 2928 |
#if defined(HOST_WORDS_BIGENDIAN) |
... | ... | |
2945 | 2945 |
} |
2946 | 2946 |
} |
2947 | 2947 |
|
2948 |
void helper_vsum4sbs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
|
|
2948 |
void helper_vsum4sbs (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b)
|
|
2949 | 2949 |
{ |
2950 | 2950 |
int i, j; |
2951 | 2951 |
int sat = 0; |
... | ... | |
2963 | 2963 |
} |
2964 | 2964 |
} |
2965 | 2965 |
|
2966 |
void helper_vsum4shs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
|
|
2966 |
void helper_vsum4shs (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b)
|
|
2967 | 2967 |
{ |
2968 | 2968 |
int sat = 0; |
2969 | 2969 |
int i; |
... | ... | |
2979 | 2979 |
} |
2980 | 2980 |
} |
2981 | 2981 |
|
2982 |
void helper_vsum4ubs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
|
|
2982 |
void helper_vsum4ubs (union ppc_avr *r, union ppc_avr *a, union ppc_avr *b)
|
|
2983 | 2983 |
{ |
2984 | 2984 |
int i, j; |
2985 | 2985 |
int sat = 0; |
... | ... | |
3005 | 3005 |
#define UPKLO 1 |
3006 | 3006 |
#endif |
3007 | 3007 |
#define VUPKPX(suffix, hi) \ |
3008 |
void helper_vupk##suffix (ppc_avr_t *r, ppc_avr_t *b) \
|
|
3008 |
void helper_vupk##suffix (union ppc_avr *r, union ppc_avr *b) \
|
|
3009 | 3009 |
{ \ |
3010 | 3010 |
int i; \ |
3011 |
ppc_avr_t result; \
|
|
3011 |
union ppc_avr result; \
|
|
3012 | 3012 |
for (i = 0; i < ARRAY_SIZE(r->u32); i++) { \ |
3013 | 3013 |
uint16_t e = b->u16[hi ? i : i+4]; \ |
3014 | 3014 |
uint8_t a = (e >> 15) ? 0xff : 0; \ |
... | ... | |
3024 | 3024 |
#undef VUPKPX |
3025 | 3025 |
|
3026 | 3026 |
#define VUPK(suffix, unpacked, packee, hi) \ |
3027 |
void helper_vupk##suffix (ppc_avr_t *r, ppc_avr_t *b) \
|
|
3027 |
void helper_vupk##suffix (union ppc_avr *r, union ppc_avr *b) \
|
|
3028 | 3028 |
{ \ |
3029 | 3029 |
int i; \ |
3030 |
ppc_avr_t result; \
|
|
3030 |
union ppc_avr result; \
|
|
3031 | 3031 |
if (hi) { \ |
3032 | 3032 |
for (i = 0; i < ARRAY_SIZE(r->unpacked); i++) { \ |
3033 | 3033 |
result.unpacked[i] = b->packee[i]; \ |
... | ... | |
3921 | 3921 |
/* Helpers for 4xx TLB management */ |
3922 | 3922 |
target_ulong helper_4xx_tlbre_lo (target_ulong entry) |
3923 | 3923 |
{ |
3924 |
ppcemb_tlb_t *tlb;
|
|
3924 |
a_ppcemb_tlb *tlb;
|
|
3925 | 3925 |
target_ulong ret; |
3926 | 3926 |
int size; |
3927 | 3927 |
|
... | ... | |
3940 | 3940 |
|
3941 | 3941 |
target_ulong helper_4xx_tlbre_hi (target_ulong entry) |
3942 | 3942 |
{ |
3943 |
ppcemb_tlb_t *tlb;
|
|
3943 |
a_ppcemb_tlb *tlb;
|
|
3944 | 3944 |
target_ulong ret; |
3945 | 3945 |
|
3946 | 3946 |
entry &= 0x3F; |
... | ... | |
3955 | 3955 |
|
3956 | 3956 |
void helper_4xx_tlbwe_hi (target_ulong entry, target_ulong val) |
3957 | 3957 |
{ |
3958 |
ppcemb_tlb_t *tlb;
|
|
3958 |
a_ppcemb_tlb *tlb;
|
|
3959 | 3959 |
target_ulong page, end; |
3960 | 3960 |
|
3961 | 3961 |
LOG_SWTLB("%s entry %d val " TARGET_FMT_lx "\n", __func__, (int)entry, |
... | ... | |
4010 | 4010 |
|
4011 | 4011 |
void helper_4xx_tlbwe_lo (target_ulong entry, target_ulong val) |
4012 | 4012 |
{ |
4013 |
ppcemb_tlb_t *tlb;
|
|
4013 |
a_ppcemb_tlb *tlb;
|
|
4014 | 4014 |
|
4015 | 4015 |
LOG_SWTLB("%s entry %i val " TARGET_FMT_lx "\n", __func__, (int)entry, |
4016 | 4016 |
val); |
... | ... | |
4039 | 4039 |
/* PowerPC 440 TLB management */ |
4040 | 4040 |
void helper_440_tlbwe (uint32_t word, target_ulong entry, target_ulong value) |
4041 | 4041 |
{ |
4042 |
ppcemb_tlb_t *tlb;
|
|
4042 |
a_ppcemb_tlb *tlb;
|
|
4043 | 4043 |
target_ulong EPN, RPN, size; |
4044 | 4044 |
int do_flush_tlbs; |
4045 | 4045 |
|
... | ... | |
4101 | 4101 |
|
4102 | 4102 |
target_ulong helper_440_tlbre (uint32_t word, target_ulong entry) |
4103 | 4103 |
{ |
4104 |
ppcemb_tlb_t *tlb;
|
|
4104 |
a_ppcemb_tlb *tlb;
|
|
4105 | 4105 |
target_ulong ret; |
4106 | 4106 |
int size; |
4107 | 4107 |
|
Also available in: Unified diff