Commit fb951ff5c0b598f7a4dff0fd59d5167345c3337a
1 parent
dc485d28
Convert disas_neon_data_insn and helpers not to use cpu_T.
Signed-off-by: Filip Navara <filip.navara@gmail.com>
Showing
1 changed file
with
273 additions
and
298 deletions
target-arm/translate.c
@@ -188,13 +188,9 @@ static void store_reg(DisasContext *s, int reg, TCGv var) | @@ -188,13 +188,9 @@ static void store_reg(DisasContext *s, int reg, TCGv var) | ||
188 | 188 | ||
189 | #define gen_op_addl_T1_im(im) tcg_gen_addi_i32(cpu_T[1], cpu_T[1], im) | 189 | #define gen_op_addl_T1_im(im) tcg_gen_addi_i32(cpu_T[1], cpu_T[1], im) |
190 | #define gen_op_addl_T0_T1() tcg_gen_add_i32(cpu_T[0], cpu_T[0], cpu_T[1]) | 190 | #define gen_op_addl_T0_T1() tcg_gen_add_i32(cpu_T[0], cpu_T[0], cpu_T[1]) |
191 | -#define gen_op_subl_T0_T1() tcg_gen_sub_i32(cpu_T[0], cpu_T[0], cpu_T[1]) | ||
192 | -#define gen_op_rsbl_T0_T1() tcg_gen_sub_i32(cpu_T[0], cpu_T[1], cpu_T[0]) | ||
193 | 191 | ||
194 | #define gen_op_andl_T0_T1() tcg_gen_and_i32(cpu_T[0], cpu_T[0], cpu_T[1]) | 192 | #define gen_op_andl_T0_T1() tcg_gen_and_i32(cpu_T[0], cpu_T[0], cpu_T[1]) |
195 | -#define gen_op_xorl_T0_T1() tcg_gen_xor_i32(cpu_T[0], cpu_T[0], cpu_T[1]) | ||
196 | #define gen_op_orl_T0_T1() tcg_gen_or_i32(cpu_T[0], cpu_T[0], cpu_T[1]) | 193 | #define gen_op_orl_T0_T1() tcg_gen_or_i32(cpu_T[0], cpu_T[0], cpu_T[1]) |
197 | -#define gen_op_notl_T0() tcg_gen_not_i32(cpu_T[0], cpu_T[0]) | ||
198 | #define gen_op_notl_T1() tcg_gen_not_i32(cpu_T[1], cpu_T[1]) | 194 | #define gen_op_notl_T1() tcg_gen_not_i32(cpu_T[1], cpu_T[1]) |
199 | 195 | ||
200 | #define gen_op_shll_T1_im(im) tcg_gen_shli_i32(cpu_T[1], cpu_T[1], im) | 196 | #define gen_op_shll_T1_im(im) tcg_gen_shli_i32(cpu_T[1], cpu_T[1], im) |
@@ -209,7 +205,6 @@ static void store_reg(DisasContext *s, int reg, TCGv var) | @@ -209,7 +205,6 @@ static void store_reg(DisasContext *s, int reg, TCGv var) | ||
209 | #define gen_sxtb16(var) gen_helper_sxtb16(var, var) | 205 | #define gen_sxtb16(var) gen_helper_sxtb16(var, var) |
210 | #define gen_uxtb16(var) gen_helper_uxtb16(var, var) | 206 | #define gen_uxtb16(var) gen_helper_uxtb16(var, var) |
211 | 207 | ||
212 | -#define gen_op_mul_T0_T1() tcg_gen_mul_i32(cpu_T[0], cpu_T[0], cpu_T[1]) | ||
213 | 208 | ||
214 | #define gen_set_cpsr(var, mask) gen_helper_cpsr_write(var, tcg_const_i32(mask)) | 209 | #define gen_set_cpsr(var, mask) gen_helper_cpsr_write(var, tcg_const_i32(mask)) |
215 | /* Set NZCV flags from the high 4 bits of var. */ | 210 | /* Set NZCV flags from the high 4 bits of var. */ |
@@ -1118,14 +1113,6 @@ neon_reg_offset (int reg, int n) | @@ -1118,14 +1113,6 @@ neon_reg_offset (int reg, int n) | ||
1118 | return vfp_reg_offset(0, sreg); | 1113 | return vfp_reg_offset(0, sreg); |
1119 | } | 1114 | } |
1120 | 1115 | ||
1121 | -/* FIXME: Remove these. */ | ||
1122 | -#define neon_T0 cpu_T[0] | ||
1123 | -#define neon_T1 cpu_T[1] | ||
1124 | -#define NEON_GET_REG(T, reg, n) \ | ||
1125 | - tcg_gen_ld_i32(neon_##T, cpu_env, neon_reg_offset(reg, n)) | ||
1126 | -#define NEON_SET_REG(T, reg, n) \ | ||
1127 | - tcg_gen_st_i32(neon_##T, cpu_env, neon_reg_offset(reg, n)) | ||
1128 | - | ||
1129 | static TCGv neon_load_reg(int reg, int pass) | 1116 | static TCGv neon_load_reg(int reg, int pass) |
1130 | { | 1117 | { |
1131 | TCGv tmp = new_tmp(); | 1118 | TCGv tmp = new_tmp(); |
@@ -3485,31 +3472,25 @@ static void gen_nop_hint(DisasContext *s, int val) | @@ -3485,31 +3472,25 @@ static void gen_nop_hint(DisasContext *s, int val) | ||
3485 | } | 3472 | } |
3486 | } | 3473 | } |
3487 | 3474 | ||
3488 | -/* These macros help make the code more readable when migrating from the | ||
3489 | - old dyngen helpers. They should probably be removed when | ||
3490 | - T0/T1 are removed. */ | ||
3491 | -#define CPU_T001 cpu_T[0], cpu_T[0], cpu_T[1] | ||
3492 | -#define CPU_T0E01 cpu_T[0], cpu_env, cpu_T[0], cpu_T[1] | ||
3493 | - | ||
3494 | #define CPU_V001 cpu_V0, cpu_V0, cpu_V1 | 3475 | #define CPU_V001 cpu_V0, cpu_V0, cpu_V1 |
3495 | 3476 | ||
3496 | -static inline int gen_neon_add(int size) | 3477 | +static inline int gen_neon_add(int size, TCGv t0, TCGv t1) |
3497 | { | 3478 | { |
3498 | switch (size) { | 3479 | switch (size) { |
3499 | - case 0: gen_helper_neon_add_u8(CPU_T001); break; | ||
3500 | - case 1: gen_helper_neon_add_u16(CPU_T001); break; | ||
3501 | - case 2: gen_op_addl_T0_T1(); break; | 3480 | + case 0: gen_helper_neon_add_u8(t0, t0, t1); break; |
3481 | + case 1: gen_helper_neon_add_u16(t0, t0, t1); break; | ||
3482 | + case 2: tcg_gen_add_i32(t0, t0, t1); break; | ||
3502 | default: return 1; | 3483 | default: return 1; |
3503 | } | 3484 | } |
3504 | return 0; | 3485 | return 0; |
3505 | } | 3486 | } |
3506 | 3487 | ||
3507 | -static inline void gen_neon_rsb(int size) | 3488 | +static inline void gen_neon_rsb(int size, TCGv t0, TCGv t1) |
3508 | { | 3489 | { |
3509 | switch (size) { | 3490 | switch (size) { |
3510 | - case 0: gen_helper_neon_sub_u8(cpu_T[0], cpu_T[1], cpu_T[0]); break; | ||
3511 | - case 1: gen_helper_neon_sub_u16(cpu_T[0], cpu_T[1], cpu_T[0]); break; | ||
3512 | - case 2: gen_op_rsbl_T0_T1(); break; | 3491 | + case 0: gen_helper_neon_sub_u8(t0, t1, t0); break; |
3492 | + case 1: gen_helper_neon_sub_u16(t0, t1, t0); break; | ||
3493 | + case 2: tcg_gen_sub_i32(t0, t1, t0); break; | ||
3513 | default: return; | 3494 | default: return; |
3514 | } | 3495 | } |
3515 | } | 3496 | } |
@@ -3529,22 +3510,22 @@ static inline void gen_neon_rsb(int size) | @@ -3529,22 +3510,22 @@ static inline void gen_neon_rsb(int size) | ||
3529 | #define GEN_NEON_INTEGER_OP_ENV(name) do { \ | 3510 | #define GEN_NEON_INTEGER_OP_ENV(name) do { \ |
3530 | switch ((size << 1) | u) { \ | 3511 | switch ((size << 1) | u) { \ |
3531 | case 0: \ | 3512 | case 0: \ |
3532 | - gen_helper_neon_##name##_s8(cpu_T[0], cpu_env, cpu_T[0], cpu_T[1]); \ | 3513 | + gen_helper_neon_##name##_s8(tmp, cpu_env, tmp, tmp2); \ |
3533 | break; \ | 3514 | break; \ |
3534 | case 1: \ | 3515 | case 1: \ |
3535 | - gen_helper_neon_##name##_u8(cpu_T[0], cpu_env, cpu_T[0], cpu_T[1]); \ | 3516 | + gen_helper_neon_##name##_u8(tmp, cpu_env, tmp, tmp2); \ |
3536 | break; \ | 3517 | break; \ |
3537 | case 2: \ | 3518 | case 2: \ |
3538 | - gen_helper_neon_##name##_s16(cpu_T[0], cpu_env, cpu_T[0], cpu_T[1]); \ | 3519 | + gen_helper_neon_##name##_s16(tmp, cpu_env, tmp, tmp2); \ |
3539 | break; \ | 3520 | break; \ |
3540 | case 3: \ | 3521 | case 3: \ |
3541 | - gen_helper_neon_##name##_u16(cpu_T[0], cpu_env, cpu_T[0], cpu_T[1]); \ | 3522 | + gen_helper_neon_##name##_u16(tmp, cpu_env, tmp, tmp2); \ |
3542 | break; \ | 3523 | break; \ |
3543 | case 4: \ | 3524 | case 4: \ |
3544 | - gen_helper_neon_##name##_s32(cpu_T[0], cpu_env, cpu_T[0], cpu_T[1]); \ | 3525 | + gen_helper_neon_##name##_s32(tmp, cpu_env, tmp, tmp2); \ |
3545 | break; \ | 3526 | break; \ |
3546 | case 5: \ | 3527 | case 5: \ |
3547 | - gen_helper_neon_##name##_u32(cpu_T[0], cpu_env, cpu_T[0], cpu_T[1]); \ | 3528 | + gen_helper_neon_##name##_u32(tmp, cpu_env, tmp, tmp2); \ |
3548 | break; \ | 3529 | break; \ |
3549 | default: return 1; \ | 3530 | default: return 1; \ |
3550 | }} while (0) | 3531 | }} while (0) |
@@ -3552,73 +3533,53 @@ static inline void gen_neon_rsb(int size) | @@ -3552,73 +3533,53 @@ static inline void gen_neon_rsb(int size) | ||
3552 | #define GEN_NEON_INTEGER_OP(name) do { \ | 3533 | #define GEN_NEON_INTEGER_OP(name) do { \ |
3553 | switch ((size << 1) | u) { \ | 3534 | switch ((size << 1) | u) { \ |
3554 | case 0: \ | 3535 | case 0: \ |
3555 | - gen_helper_neon_##name##_s8(cpu_T[0], cpu_T[0], cpu_T[1]); \ | 3536 | + gen_helper_neon_##name##_s8(tmp, tmp, tmp2); \ |
3556 | break; \ | 3537 | break; \ |
3557 | case 1: \ | 3538 | case 1: \ |
3558 | - gen_helper_neon_##name##_u8(cpu_T[0], cpu_T[0], cpu_T[1]); \ | 3539 | + gen_helper_neon_##name##_u8(tmp, tmp, tmp2); \ |
3559 | break; \ | 3540 | break; \ |
3560 | case 2: \ | 3541 | case 2: \ |
3561 | - gen_helper_neon_##name##_s16(cpu_T[0], cpu_T[0], cpu_T[1]); \ | 3542 | + gen_helper_neon_##name##_s16(tmp, tmp, tmp2); \ |
3562 | break; \ | 3543 | break; \ |
3563 | case 3: \ | 3544 | case 3: \ |
3564 | - gen_helper_neon_##name##_u16(cpu_T[0], cpu_T[0], cpu_T[1]); \ | 3545 | + gen_helper_neon_##name##_u16(tmp, tmp, tmp2); \ |
3565 | break; \ | 3546 | break; \ |
3566 | case 4: \ | 3547 | case 4: \ |
3567 | - gen_helper_neon_##name##_s32(cpu_T[0], cpu_T[0], cpu_T[1]); \ | 3548 | + gen_helper_neon_##name##_s32(tmp, tmp, tmp2); \ |
3568 | break; \ | 3549 | break; \ |
3569 | case 5: \ | 3550 | case 5: \ |
3570 | - gen_helper_neon_##name##_u32(cpu_T[0], cpu_T[0], cpu_T[1]); \ | 3551 | + gen_helper_neon_##name##_u32(tmp, tmp, tmp2); \ |
3571 | break; \ | 3552 | break; \ |
3572 | default: return 1; \ | 3553 | default: return 1; \ |
3573 | }} while (0) | 3554 | }} while (0) |
3574 | 3555 | ||
3575 | -static inline void | ||
3576 | -gen_neon_movl_scratch_T0(int scratch) | 3556 | +static TCGv neon_load_scratch(int scratch) |
3577 | { | 3557 | { |
3578 | - uint32_t offset; | ||
3579 | - | ||
3580 | - offset = offsetof(CPUARMState, vfp.scratch[scratch]); | ||
3581 | - tcg_gen_st_i32(cpu_T[0], cpu_env, offset); | ||
3582 | -} | ||
3583 | - | ||
3584 | -static inline void | ||
3585 | -gen_neon_movl_scratch_T1(int scratch) | ||
3586 | -{ | ||
3587 | - uint32_t offset; | ||
3588 | - | ||
3589 | - offset = offsetof(CPUARMState, vfp.scratch[scratch]); | ||
3590 | - tcg_gen_st_i32(cpu_T[1], cpu_env, offset); | ||
3591 | -} | ||
3592 | - | ||
3593 | -static inline void | ||
3594 | -gen_neon_movl_T0_scratch(int scratch) | ||
3595 | -{ | ||
3596 | - uint32_t offset; | ||
3597 | - | ||
3598 | - offset = offsetof(CPUARMState, vfp.scratch[scratch]); | ||
3599 | - tcg_gen_ld_i32(cpu_T[0], cpu_env, offset); | 3558 | + TCGv tmp = new_tmp(); |
3559 | + tcg_gen_ld_i32(tmp, cpu_env, offsetof(CPUARMState, vfp.scratch[scratch])); | ||
3560 | + return tmp; | ||
3600 | } | 3561 | } |
3601 | - | ||
3602 | -static inline void | ||
3603 | -gen_neon_movl_T1_scratch(int scratch) | 3562 | + |
3563 | +static void neon_store_scratch(int scratch, TCGv var) | ||
3604 | { | 3564 | { |
3605 | - uint32_t offset; | ||
3606 | - | ||
3607 | - offset = offsetof(CPUARMState, vfp.scratch[scratch]); | ||
3608 | - tcg_gen_ld_i32(cpu_T[1], cpu_env, offset); | 3565 | + tcg_gen_st_i32(var, cpu_env, offsetof(CPUARMState, vfp.scratch[scratch])); |
3566 | + dead_tmp(var); | ||
3609 | } | 3567 | } |
3610 | - | ||
3611 | -static inline void gen_neon_get_scalar(int size, int reg) | 3568 | + |
3569 | +static inline TCGv neon_get_scalar(int size, int reg) | ||
3612 | { | 3570 | { |
3571 | + TCGv tmp; | ||
3613 | if (size == 1) { | 3572 | if (size == 1) { |
3614 | - NEON_GET_REG(T0, reg >> 1, reg & 1); | 3573 | + tmp = neon_load_reg(reg >> 1, reg & 1); |
3615 | } else { | 3574 | } else { |
3616 | - NEON_GET_REG(T0, reg >> 2, (reg >> 1) & 1); | ||
3617 | - if (reg & 1) | ||
3618 | - gen_neon_dup_low16(cpu_T[0]); | ||
3619 | - else | ||
3620 | - gen_neon_dup_high16(cpu_T[0]); | 3575 | + tmp = neon_load_reg(reg >> 2, (reg >> 1) & 1); |
3576 | + if (reg & 1) { | ||
3577 | + gen_neon_dup_low16(tmp); | ||
3578 | + } else { | ||
3579 | + gen_neon_dup_high16(tmp); | ||
3580 | + } | ||
3621 | } | 3581 | } |
3582 | + return tmp; | ||
3622 | } | 3583 | } |
3623 | 3584 | ||
3624 | static void gen_neon_unzip_u8(TCGv t0, TCGv t1) | 3585 | static void gen_neon_unzip_u8(TCGv t0, TCGv t1) |
@@ -3715,18 +3676,19 @@ static void gen_neon_zip_u16(TCGv t0, TCGv t1) | @@ -3715,18 +3676,19 @@ static void gen_neon_zip_u16(TCGv t0, TCGv t1) | ||
3715 | static void gen_neon_unzip(int reg, int q, int tmp, int size) | 3676 | static void gen_neon_unzip(int reg, int q, int tmp, int size) |
3716 | { | 3677 | { |
3717 | int n; | 3678 | int n; |
3679 | + TCGv t0, t1; | ||
3718 | 3680 | ||
3719 | for (n = 0; n < q + 1; n += 2) { | 3681 | for (n = 0; n < q + 1; n += 2) { |
3720 | - NEON_GET_REG(T0, reg, n); | ||
3721 | - NEON_GET_REG(T1, reg, n + 1); | 3682 | + t0 = neon_load_reg(reg, n); |
3683 | + t1 = neon_load_reg(reg, n + 1); | ||
3722 | switch (size) { | 3684 | switch (size) { |
3723 | - case 0: gen_neon_unzip_u8(cpu_T[0], cpu_T[1]); break; | ||
3724 | - case 1: gen_neon_zip_u16(cpu_T[0], cpu_T[1]); break; /* zip and unzip are the same. */ | 3685 | + case 0: gen_neon_unzip_u8(t0, t1); break; |
3686 | + case 1: gen_neon_zip_u16(t0, t1); break; /* zip and unzip are the same. */ | ||
3725 | case 2: /* no-op */; break; | 3687 | case 2: /* no-op */; break; |
3726 | default: abort(); | 3688 | default: abort(); |
3727 | } | 3689 | } |
3728 | - gen_neon_movl_T0_scratch(tmp + n); | ||
3729 | - gen_neon_movl_T1_scratch(tmp + n + 1); | 3690 | + neon_store_scratch(tmp + n, t0); |
3691 | + neon_store_scratch(tmp + n + 1, t1); | ||
3730 | } | 3692 | } |
3731 | } | 3693 | } |
3732 | 3694 | ||
@@ -4160,10 +4122,6 @@ static inline void gen_neon_mull(TCGv_i64 dest, TCGv a, TCGv b, int size, int u) | @@ -4160,10 +4122,6 @@ static inline void gen_neon_mull(TCGv_i64 dest, TCGv a, TCGv b, int size, int u) | ||
4160 | break; | 4122 | break; |
4161 | default: abort(); | 4123 | default: abort(); |
4162 | } | 4124 | } |
4163 | - if (size < 2) { | ||
4164 | - dead_tmp(b); | ||
4165 | - dead_tmp(a); | ||
4166 | - } | ||
4167 | } | 4125 | } |
4168 | 4126 | ||
4169 | /* Translate a NEON data processing instruction. Return nonzero if the | 4127 | /* Translate a NEON data processing instruction. Return nonzero if the |
@@ -4296,6 +4254,7 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -4296,6 +4254,7 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
4296 | pairwise = 0; | 4254 | pairwise = 0; |
4297 | break; | 4255 | break; |
4298 | } | 4256 | } |
4257 | + | ||
4299 | for (pass = 0; pass < (q ? 4 : 2); pass++) { | 4258 | for (pass = 0; pass < (q ? 4 : 2); pass++) { |
4300 | 4259 | ||
4301 | if (pairwise) { | 4260 | if (pairwise) { |
@@ -4305,16 +4264,16 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -4305,16 +4264,16 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
4305 | else | 4264 | else |
4306 | n = 0; | 4265 | n = 0; |
4307 | if (pass < q + 1) { | 4266 | if (pass < q + 1) { |
4308 | - NEON_GET_REG(T0, rn, n); | ||
4309 | - NEON_GET_REG(T1, rn, n + 1); | 4267 | + tmp = neon_load_reg(rn, n); |
4268 | + tmp2 = neon_load_reg(rn, n + 1); | ||
4310 | } else { | 4269 | } else { |
4311 | - NEON_GET_REG(T0, rm, n); | ||
4312 | - NEON_GET_REG(T1, rm, n + 1); | 4270 | + tmp = neon_load_reg(rm, n); |
4271 | + tmp2 = neon_load_reg(rm, n + 1); | ||
4313 | } | 4272 | } |
4314 | } else { | 4273 | } else { |
4315 | /* Elementwise. */ | 4274 | /* Elementwise. */ |
4316 | - NEON_GET_REG(T0, rn, pass); | ||
4317 | - NEON_GET_REG(T1, rm, pass); | 4275 | + tmp = neon_load_reg(rn, pass); |
4276 | + tmp2 = neon_load_reg(rm, pass); | ||
4318 | } | 4277 | } |
4319 | switch (op) { | 4278 | switch (op) { |
4320 | case 0: /* VHADD */ | 4279 | case 0: /* VHADD */ |
@@ -4329,35 +4288,35 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -4329,35 +4288,35 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
4329 | case 3: /* Logic ops. */ | 4288 | case 3: /* Logic ops. */ |
4330 | switch ((u << 2) | size) { | 4289 | switch ((u << 2) | size) { |
4331 | case 0: /* VAND */ | 4290 | case 0: /* VAND */ |
4332 | - gen_op_andl_T0_T1(); | 4291 | + tcg_gen_and_i32(tmp, tmp, tmp2); |
4333 | break; | 4292 | break; |
4334 | case 1: /* BIC */ | 4293 | case 1: /* BIC */ |
4335 | - gen_op_bicl_T0_T1(); | 4294 | + tcg_gen_bic_i32(tmp, tmp, tmp2); |
4336 | break; | 4295 | break; |
4337 | case 2: /* VORR */ | 4296 | case 2: /* VORR */ |
4338 | - gen_op_orl_T0_T1(); | 4297 | + tcg_gen_or_i32(tmp, tmp, tmp2); |
4339 | break; | 4298 | break; |
4340 | case 3: /* VORN */ | 4299 | case 3: /* VORN */ |
4341 | - gen_op_notl_T1(); | ||
4342 | - gen_op_orl_T0_T1(); | 4300 | + tcg_gen_not_i32(tmp2, tmp2); |
4301 | + tcg_gen_or_i32(tmp, tmp, tmp2); | ||
4343 | break; | 4302 | break; |
4344 | case 4: /* VEOR */ | 4303 | case 4: /* VEOR */ |
4345 | - gen_op_xorl_T0_T1(); | 4304 | + tcg_gen_xor_i32(tmp, tmp, tmp2); |
4346 | break; | 4305 | break; |
4347 | case 5: /* VBSL */ | 4306 | case 5: /* VBSL */ |
4348 | - tmp = neon_load_reg(rd, pass); | ||
4349 | - gen_neon_bsl(cpu_T[0], cpu_T[0], cpu_T[1], tmp); | ||
4350 | - dead_tmp(tmp); | 4307 | + tmp3 = neon_load_reg(rd, pass); |
4308 | + gen_neon_bsl(tmp, tmp, tmp2, tmp3); | ||
4309 | + dead_tmp(tmp3); | ||
4351 | break; | 4310 | break; |
4352 | case 6: /* VBIT */ | 4311 | case 6: /* VBIT */ |
4353 | - tmp = neon_load_reg(rd, pass); | ||
4354 | - gen_neon_bsl(cpu_T[0], cpu_T[0], tmp, cpu_T[1]); | ||
4355 | - dead_tmp(tmp); | 4312 | + tmp3 = neon_load_reg(rd, pass); |
4313 | + gen_neon_bsl(tmp, tmp, tmp3, tmp2); | ||
4314 | + dead_tmp(tmp3); | ||
4356 | break; | 4315 | break; |
4357 | case 7: /* VBIF */ | 4316 | case 7: /* VBIF */ |
4358 | - tmp = neon_load_reg(rd, pass); | ||
4359 | - gen_neon_bsl(cpu_T[0], tmp, cpu_T[0], cpu_T[1]); | ||
4360 | - dead_tmp(tmp); | 4317 | + tmp3 = neon_load_reg(rd, pass); |
4318 | + gen_neon_bsl(tmp, tmp3, tmp, tmp2); | ||
4319 | + dead_tmp(tmp3); | ||
4361 | break; | 4320 | break; |
4362 | } | 4321 | } |
4363 | break; | 4322 | break; |
@@ -4396,18 +4355,19 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -4396,18 +4355,19 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
4396 | break; | 4355 | break; |
4397 | case 15: /* VABA */ | 4356 | case 15: /* VABA */ |
4398 | GEN_NEON_INTEGER_OP(abd); | 4357 | GEN_NEON_INTEGER_OP(abd); |
4399 | - NEON_GET_REG(T1, rd, pass); | ||
4400 | - gen_neon_add(size); | 4358 | + dead_tmp(tmp2); |
4359 | + tmp2 = neon_load_reg(rd, pass); | ||
4360 | + gen_neon_add(size, tmp, tmp2); | ||
4401 | break; | 4361 | break; |
4402 | case 16: | 4362 | case 16: |
4403 | if (!u) { /* VADD */ | 4363 | if (!u) { /* VADD */ |
4404 | - if (gen_neon_add(size)) | 4364 | + if (gen_neon_add(size, tmp, tmp2)) |
4405 | return 1; | 4365 | return 1; |
4406 | } else { /* VSUB */ | 4366 | } else { /* VSUB */ |
4407 | switch (size) { | 4367 | switch (size) { |
4408 | - case 0: gen_helper_neon_sub_u8(CPU_T001); break; | ||
4409 | - case 1: gen_helper_neon_sub_u16(CPU_T001); break; | ||
4410 | - case 2: gen_op_subl_T0_T1(); break; | 4368 | + case 0: gen_helper_neon_sub_u8(tmp, tmp, tmp2); break; |
4369 | + case 1: gen_helper_neon_sub_u16(tmp, tmp, tmp2); break; | ||
4370 | + case 2: tcg_gen_sub_i32(tmp, tmp, tmp2); break; | ||
4411 | default: return 1; | 4371 | default: return 1; |
4412 | } | 4372 | } |
4413 | } | 4373 | } |
@@ -4415,42 +4375,43 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -4415,42 +4375,43 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
4415 | case 17: | 4375 | case 17: |
4416 | if (!u) { /* VTST */ | 4376 | if (!u) { /* VTST */ |
4417 | switch (size) { | 4377 | switch (size) { |
4418 | - case 0: gen_helper_neon_tst_u8(CPU_T001); break; | ||
4419 | - case 1: gen_helper_neon_tst_u16(CPU_T001); break; | ||
4420 | - case 2: gen_helper_neon_tst_u32(CPU_T001); break; | 4378 | + case 0: gen_helper_neon_tst_u8(tmp, tmp, tmp2); break; |
4379 | + case 1: gen_helper_neon_tst_u16(tmp, tmp, tmp2); break; | ||
4380 | + case 2: gen_helper_neon_tst_u32(tmp, tmp, tmp2); break; | ||
4421 | default: return 1; | 4381 | default: return 1; |
4422 | } | 4382 | } |
4423 | } else { /* VCEQ */ | 4383 | } else { /* VCEQ */ |
4424 | switch (size) { | 4384 | switch (size) { |
4425 | - case 0: gen_helper_neon_ceq_u8(CPU_T001); break; | ||
4426 | - case 1: gen_helper_neon_ceq_u16(CPU_T001); break; | ||
4427 | - case 2: gen_helper_neon_ceq_u32(CPU_T001); break; | 4385 | + case 0: gen_helper_neon_ceq_u8(tmp, tmp, tmp2); break; |
4386 | + case 1: gen_helper_neon_ceq_u16(tmp, tmp, tmp2); break; | ||
4387 | + case 2: gen_helper_neon_ceq_u32(tmp, tmp, tmp2); break; | ||
4428 | default: return 1; | 4388 | default: return 1; |
4429 | } | 4389 | } |
4430 | } | 4390 | } |
4431 | break; | 4391 | break; |
4432 | case 18: /* Multiply. */ | 4392 | case 18: /* Multiply. */ |
4433 | switch (size) { | 4393 | switch (size) { |
4434 | - case 0: gen_helper_neon_mul_u8(CPU_T001); break; | ||
4435 | - case 1: gen_helper_neon_mul_u16(CPU_T001); break; | ||
4436 | - case 2: gen_op_mul_T0_T1(); break; | 4394 | + case 0: gen_helper_neon_mul_u8(tmp, tmp, tmp2); break; |
4395 | + case 1: gen_helper_neon_mul_u16(tmp, tmp, tmp2); break; | ||
4396 | + case 2: tcg_gen_mul_i32(tmp, tmp, tmp2); break; | ||
4437 | default: return 1; | 4397 | default: return 1; |
4438 | } | 4398 | } |
4439 | - NEON_GET_REG(T1, rd, pass); | 4399 | + dead_tmp(tmp2); |
4400 | + tmp2 = neon_load_reg(rd, pass); | ||
4440 | if (u) { /* VMLS */ | 4401 | if (u) { /* VMLS */ |
4441 | - gen_neon_rsb(size); | 4402 | + gen_neon_rsb(size, tmp, tmp2); |
4442 | } else { /* VMLA */ | 4403 | } else { /* VMLA */ |
4443 | - gen_neon_add(size); | 4404 | + gen_neon_add(size, tmp, tmp2); |
4444 | } | 4405 | } |
4445 | break; | 4406 | break; |
4446 | case 19: /* VMUL */ | 4407 | case 19: /* VMUL */ |
4447 | if (u) { /* polynomial */ | 4408 | if (u) { /* polynomial */ |
4448 | - gen_helper_neon_mul_p8(CPU_T001); | 4409 | + gen_helper_neon_mul_p8(tmp, tmp, tmp2); |
4449 | } else { /* Integer */ | 4410 | } else { /* Integer */ |
4450 | switch (size) { | 4411 | switch (size) { |
4451 | - case 0: gen_helper_neon_mul_u8(CPU_T001); break; | ||
4452 | - case 1: gen_helper_neon_mul_u16(CPU_T001); break; | ||
4453 | - case 2: gen_op_mul_T0_T1(); break; | 4412 | + case 0: gen_helper_neon_mul_u8(tmp, tmp, tmp2); break; |
4413 | + case 1: gen_helper_neon_mul_u16(tmp, tmp, tmp2); break; | ||
4414 | + case 2: tcg_gen_mul_i32(tmp, tmp, tmp2); break; | ||
4454 | default: return 1; | 4415 | default: return 1; |
4455 | } | 4416 | } |
4456 | } | 4417 | } |
@@ -4464,14 +4425,14 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -4464,14 +4425,14 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
4464 | case 22: /* Hultiply high. */ | 4425 | case 22: /* Hultiply high. */ |
4465 | if (!u) { /* VQDMULH */ | 4426 | if (!u) { /* VQDMULH */ |
4466 | switch (size) { | 4427 | switch (size) { |
4467 | - case 1: gen_helper_neon_qdmulh_s16(CPU_T0E01); break; | ||
4468 | - case 2: gen_helper_neon_qdmulh_s32(CPU_T0E01); break; | 4428 | + case 1: gen_helper_neon_qdmulh_s16(tmp, cpu_env, tmp, tmp2); break; |
4429 | + case 2: gen_helper_neon_qdmulh_s32(tmp, cpu_env, tmp, tmp2); break; | ||
4469 | default: return 1; | 4430 | default: return 1; |
4470 | } | 4431 | } |
4471 | } else { /* VQRDHMUL */ | 4432 | } else { /* VQRDHMUL */ |
4472 | switch (size) { | 4433 | switch (size) { |
4473 | - case 1: gen_helper_neon_qrdmulh_s16(CPU_T0E01); break; | ||
4474 | - case 2: gen_helper_neon_qrdmulh_s32(CPU_T0E01); break; | 4434 | + case 1: gen_helper_neon_qrdmulh_s16(tmp, cpu_env, tmp, tmp2); break; |
4435 | + case 2: gen_helper_neon_qrdmulh_s32(tmp, cpu_env, tmp, tmp2); break; | ||
4475 | default: return 1; | 4436 | default: return 1; |
4476 | } | 4437 | } |
4477 | } | 4438 | } |
@@ -4480,88 +4441,91 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -4480,88 +4441,91 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
4480 | if (u) | 4441 | if (u) |
4481 | return 1; | 4442 | return 1; |
4482 | switch (size) { | 4443 | switch (size) { |
4483 | - case 0: gen_helper_neon_padd_u8(CPU_T001); break; | ||
4484 | - case 1: gen_helper_neon_padd_u16(CPU_T001); break; | ||
4485 | - case 2: gen_op_addl_T0_T1(); break; | 4444 | + case 0: gen_helper_neon_padd_u8(tmp, tmp, tmp2); break; |
4445 | + case 1: gen_helper_neon_padd_u16(tmp, tmp, tmp2); break; | ||
4446 | + case 2: tcg_gen_add_i32(tmp, tmp, tmp2); break; | ||
4486 | default: return 1; | 4447 | default: return 1; |
4487 | } | 4448 | } |
4488 | break; | 4449 | break; |
4489 | case 26: /* Floating point arithnetic. */ | 4450 | case 26: /* Floating point arithnetic. */ |
4490 | switch ((u << 2) | size) { | 4451 | switch ((u << 2) | size) { |
4491 | case 0: /* VADD */ | 4452 | case 0: /* VADD */ |
4492 | - gen_helper_neon_add_f32(CPU_T001); | 4453 | + gen_helper_neon_add_f32(tmp, tmp, tmp2); |
4493 | break; | 4454 | break; |
4494 | case 2: /* VSUB */ | 4455 | case 2: /* VSUB */ |
4495 | - gen_helper_neon_sub_f32(CPU_T001); | 4456 | + gen_helper_neon_sub_f32(tmp, tmp, tmp2); |
4496 | break; | 4457 | break; |
4497 | case 4: /* VPADD */ | 4458 | case 4: /* VPADD */ |
4498 | - gen_helper_neon_add_f32(CPU_T001); | 4459 | + gen_helper_neon_add_f32(tmp, tmp, tmp2); |
4499 | break; | 4460 | break; |
4500 | case 6: /* VABD */ | 4461 | case 6: /* VABD */ |
4501 | - gen_helper_neon_abd_f32(CPU_T001); | 4462 | + gen_helper_neon_abd_f32(tmp, tmp, tmp2); |
4502 | break; | 4463 | break; |
4503 | default: | 4464 | default: |
4504 | return 1; | 4465 | return 1; |
4505 | } | 4466 | } |
4506 | break; | 4467 | break; |
4507 | case 27: /* Float multiply. */ | 4468 | case 27: /* Float multiply. */ |
4508 | - gen_helper_neon_mul_f32(CPU_T001); | 4469 | + gen_helper_neon_mul_f32(tmp, tmp, tmp2); |
4509 | if (!u) { | 4470 | if (!u) { |
4510 | - NEON_GET_REG(T1, rd, pass); | 4471 | + dead_tmp(tmp2); |
4472 | + tmp2 = neon_load_reg(rd, pass); | ||
4511 | if (size == 0) { | 4473 | if (size == 0) { |
4512 | - gen_helper_neon_add_f32(CPU_T001); | 4474 | + gen_helper_neon_add_f32(tmp, tmp, tmp2); |
4513 | } else { | 4475 | } else { |
4514 | - gen_helper_neon_sub_f32(cpu_T[0], cpu_T[1], cpu_T[0]); | 4476 | + gen_helper_neon_sub_f32(tmp, tmp2, tmp); |
4515 | } | 4477 | } |
4516 | } | 4478 | } |
4517 | break; | 4479 | break; |
4518 | case 28: /* Float compare. */ | 4480 | case 28: /* Float compare. */ |
4519 | if (!u) { | 4481 | if (!u) { |
4520 | - gen_helper_neon_ceq_f32(CPU_T001); | 4482 | + gen_helper_neon_ceq_f32(tmp, tmp, tmp2); |
4521 | } else { | 4483 | } else { |
4522 | if (size == 0) | 4484 | if (size == 0) |
4523 | - gen_helper_neon_cge_f32(CPU_T001); | 4485 | + gen_helper_neon_cge_f32(tmp, tmp, tmp2); |
4524 | else | 4486 | else |
4525 | - gen_helper_neon_cgt_f32(CPU_T001); | 4487 | + gen_helper_neon_cgt_f32(tmp, tmp, tmp2); |
4526 | } | 4488 | } |
4527 | break; | 4489 | break; |
4528 | case 29: /* Float compare absolute. */ | 4490 | case 29: /* Float compare absolute. */ |
4529 | if (!u) | 4491 | if (!u) |
4530 | return 1; | 4492 | return 1; |
4531 | if (size == 0) | 4493 | if (size == 0) |
4532 | - gen_helper_neon_acge_f32(CPU_T001); | 4494 | + gen_helper_neon_acge_f32(tmp, tmp, tmp2); |
4533 | else | 4495 | else |
4534 | - gen_helper_neon_acgt_f32(CPU_T001); | 4496 | + gen_helper_neon_acgt_f32(tmp, tmp, tmp2); |
4535 | break; | 4497 | break; |
4536 | case 30: /* Float min/max. */ | 4498 | case 30: /* Float min/max. */ |
4537 | if (size == 0) | 4499 | if (size == 0) |
4538 | - gen_helper_neon_max_f32(CPU_T001); | 4500 | + gen_helper_neon_max_f32(tmp, tmp, tmp2); |
4539 | else | 4501 | else |
4540 | - gen_helper_neon_min_f32(CPU_T001); | 4502 | + gen_helper_neon_min_f32(tmp, tmp, tmp2); |
4541 | break; | 4503 | break; |
4542 | case 31: | 4504 | case 31: |
4543 | if (size == 0) | 4505 | if (size == 0) |
4544 | - gen_helper_recps_f32(cpu_T[0], cpu_T[0], cpu_T[1], cpu_env); | 4506 | + gen_helper_recps_f32(tmp, tmp, tmp2, cpu_env); |
4545 | else | 4507 | else |
4546 | - gen_helper_rsqrts_f32(cpu_T[0], cpu_T[0], cpu_T[1], cpu_env); | 4508 | + gen_helper_rsqrts_f32(tmp, tmp, tmp2, cpu_env); |
4547 | break; | 4509 | break; |
4548 | default: | 4510 | default: |
4549 | abort(); | 4511 | abort(); |
4550 | } | 4512 | } |
4513 | + dead_tmp(tmp2); | ||
4514 | + | ||
4551 | /* Save the result. For elementwise operations we can put it | 4515 | /* Save the result. For elementwise operations we can put it |
4552 | straight into the destination register. For pairwise operations | 4516 | straight into the destination register. For pairwise operations |
4553 | we have to be careful to avoid clobbering the source operands. */ | 4517 | we have to be careful to avoid clobbering the source operands. */ |
4554 | if (pairwise && rd == rm) { | 4518 | if (pairwise && rd == rm) { |
4555 | - gen_neon_movl_scratch_T0(pass); | 4519 | + neon_store_scratch(pass, tmp); |
4556 | } else { | 4520 | } else { |
4557 | - NEON_SET_REG(T0, rd, pass); | 4521 | + neon_store_reg(rd, pass, tmp); |
4558 | } | 4522 | } |
4559 | 4523 | ||
4560 | } /* for pass */ | 4524 | } /* for pass */ |
4561 | if (pairwise && rd == rm) { | 4525 | if (pairwise && rd == rm) { |
4562 | for (pass = 0; pass < (q ? 4 : 2); pass++) { | 4526 | for (pass = 0; pass < (q ? 4 : 2); pass++) { |
4563 | - gen_neon_movl_T0_scratch(pass); | ||
4564 | - NEON_SET_REG(T0, rd, pass); | 4527 | + tmp = neon_load_scratch(pass); |
4528 | + neon_store_reg(rd, pass, tmp); | ||
4565 | } | 4529 | } |
4566 | } | 4530 | } |
4567 | /* End of 3 register same size operations. */ | 4531 | /* End of 3 register same size operations. */ |
@@ -4658,8 +4622,9 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -4658,8 +4622,9 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
4658 | neon_store_reg64(cpu_V0, rd + pass); | 4622 | neon_store_reg64(cpu_V0, rd + pass); |
4659 | } else { /* size < 3 */ | 4623 | } else { /* size < 3 */ |
4660 | /* Operands in T0 and T1. */ | 4624 | /* Operands in T0 and T1. */ |
4661 | - gen_op_movl_T1_im(imm); | ||
4662 | - NEON_GET_REG(T0, rm, pass); | 4625 | + tmp = neon_load_reg(rm, pass); |
4626 | + tmp2 = new_tmp(); | ||
4627 | + tcg_gen_movi_i32(tmp2, imm); | ||
4663 | switch (op) { | 4628 | switch (op) { |
4664 | case 0: /* VSHR */ | 4629 | case 0: /* VSHR */ |
4665 | case 1: /* VSRA */ | 4630 | case 1: /* VSRA */ |
@@ -4676,9 +4641,9 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -4676,9 +4641,9 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
4676 | break; | 4641 | break; |
4677 | case 5: /* VSHL, VSLI */ | 4642 | case 5: /* VSHL, VSLI */ |
4678 | switch (size) { | 4643 | switch (size) { |
4679 | - case 0: gen_helper_neon_shl_u8(CPU_T001); break; | ||
4680 | - case 1: gen_helper_neon_shl_u16(CPU_T001); break; | ||
4681 | - case 2: gen_helper_neon_shl_u32(CPU_T001); break; | 4644 | + case 0: gen_helper_neon_shl_u8(tmp, tmp, tmp2); break; |
4645 | + case 1: gen_helper_neon_shl_u16(tmp, tmp, tmp2); break; | ||
4646 | + case 2: gen_helper_neon_shl_u32(tmp, tmp, tmp2); break; | ||
4682 | default: return 1; | 4647 | default: return 1; |
4683 | } | 4648 | } |
4684 | break; | 4649 | break; |
@@ -4687,18 +4652,20 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -4687,18 +4652,20 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
4687 | break; | 4652 | break; |
4688 | case 7: /* VQSHLU */ | 4653 | case 7: /* VQSHLU */ |
4689 | switch (size) { | 4654 | switch (size) { |
4690 | - case 0: gen_helper_neon_qshl_u8(CPU_T0E01); break; | ||
4691 | - case 1: gen_helper_neon_qshl_u16(CPU_T0E01); break; | ||
4692 | - case 2: gen_helper_neon_qshl_u32(CPU_T0E01); break; | 4655 | + case 0: gen_helper_neon_qshl_u8(tmp, cpu_env, tmp, tmp2); break; |
4656 | + case 1: gen_helper_neon_qshl_u16(tmp, cpu_env, tmp, tmp2); break; | ||
4657 | + case 2: gen_helper_neon_qshl_u32(tmp, cpu_env, tmp, tmp2); break; | ||
4693 | default: return 1; | 4658 | default: return 1; |
4694 | } | 4659 | } |
4695 | break; | 4660 | break; |
4696 | } | 4661 | } |
4662 | + dead_tmp(tmp2); | ||
4697 | 4663 | ||
4698 | if (op == 1 || op == 3) { | 4664 | if (op == 1 || op == 3) { |
4699 | /* Accumulate. */ | 4665 | /* Accumulate. */ |
4700 | - NEON_GET_REG(T1, rd, pass); | ||
4701 | - gen_neon_add(size); | 4666 | + tmp2 = neon_load_reg(rd, pass); |
4667 | + gen_neon_add(size, tmp2, tmp); | ||
4668 | + dead_tmp(tmp2); | ||
4702 | } else if (op == 4 || (op == 5 && u)) { | 4669 | } else if (op == 4 || (op == 5 && u)) { |
4703 | /* Insert */ | 4670 | /* Insert */ |
4704 | switch (size) { | 4671 | switch (size) { |
@@ -4726,12 +4693,13 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -4726,12 +4693,13 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
4726 | default: | 4693 | default: |
4727 | abort(); | 4694 | abort(); |
4728 | } | 4695 | } |
4729 | - tmp = neon_load_reg(rd, pass); | ||
4730 | - tcg_gen_andi_i32(cpu_T[0], cpu_T[0], imm); | ||
4731 | - tcg_gen_andi_i32(tmp, tmp, ~imm); | ||
4732 | - tcg_gen_or_i32(cpu_T[0], cpu_T[0], tmp); | 4696 | + tmp2 = neon_load_reg(rd, pass); |
4697 | + tcg_gen_andi_i32(tmp, tmp, imm); | ||
4698 | + tcg_gen_andi_i32(tmp2, tmp2, ~imm); | ||
4699 | + tcg_gen_or_i32(tmp, tmp, tmp2); | ||
4700 | + dead_tmp(tmp2); | ||
4733 | } | 4701 | } |
4734 | - NEON_SET_REG(T0, rd, pass); | 4702 | + neon_store_reg(rd, pass, tmp); |
4735 | } | 4703 | } |
4736 | } /* for pass */ | 4704 | } /* for pass */ |
4737 | } else if (op < 10) { | 4705 | } else if (op < 10) { |
@@ -4893,9 +4861,6 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -4893,9 +4861,6 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
4893 | if (invert) | 4861 | if (invert) |
4894 | imm = ~imm; | 4862 | imm = ~imm; |
4895 | 4863 | ||
4896 | - if (op != 14 || !invert) | ||
4897 | - gen_op_movl_T1_im(imm); | ||
4898 | - | ||
4899 | for (pass = 0; pass < (q ? 4 : 2); pass++) { | 4864 | for (pass = 0; pass < (q ? 4 : 2); pass++) { |
4900 | if (op & 1 && op < 12) { | 4865 | if (op & 1 && op < 12) { |
4901 | tmp = neon_load_reg(rd, pass); | 4866 | tmp = neon_load_reg(rd, pass); |
@@ -4962,11 +4927,11 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -4962,11 +4927,11 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
4962 | always aligned so will never overlap with wide | 4927 | always aligned so will never overlap with wide |
4963 | destinations in problematic ways. */ | 4928 | destinations in problematic ways. */ |
4964 | if (rd == rm && !src2_wide) { | 4929 | if (rd == rm && !src2_wide) { |
4965 | - NEON_GET_REG(T0, rm, 1); | ||
4966 | - gen_neon_movl_scratch_T0(2); | 4930 | + tmp = neon_load_reg(rm, 1); |
4931 | + neon_store_scratch(2, tmp); | ||
4967 | } else if (rd == rn && !src1_wide) { | 4932 | } else if (rd == rn && !src1_wide) { |
4968 | - NEON_GET_REG(T0, rn, 1); | ||
4969 | - gen_neon_movl_scratch_T0(2); | 4933 | + tmp = neon_load_reg(rn, 1); |
4934 | + neon_store_scratch(2, tmp); | ||
4970 | } | 4935 | } |
4971 | TCGV_UNUSED(tmp3); | 4936 | TCGV_UNUSED(tmp3); |
4972 | for (pass = 0; pass < 2; pass++) { | 4937 | for (pass = 0; pass < 2; pass++) { |
@@ -4975,9 +4940,7 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -4975,9 +4940,7 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
4975 | TCGV_UNUSED(tmp); | 4940 | TCGV_UNUSED(tmp); |
4976 | } else { | 4941 | } else { |
4977 | if (pass == 1 && rd == rn) { | 4942 | if (pass == 1 && rd == rn) { |
4978 | - gen_neon_movl_T0_scratch(2); | ||
4979 | - tmp = new_tmp(); | ||
4980 | - tcg_gen_mov_i32(tmp, cpu_T[0]); | 4943 | + tmp = neon_load_scratch(2); |
4981 | } else { | 4944 | } else { |
4982 | tmp = neon_load_reg(rn, pass); | 4945 | tmp = neon_load_reg(rn, pass); |
4983 | } | 4946 | } |
@@ -4990,9 +4953,7 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -4990,9 +4953,7 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
4990 | TCGV_UNUSED(tmp2); | 4953 | TCGV_UNUSED(tmp2); |
4991 | } else { | 4954 | } else { |
4992 | if (pass == 1 && rd == rm) { | 4955 | if (pass == 1 && rd == rm) { |
4993 | - gen_neon_movl_T0_scratch(2); | ||
4994 | - tmp2 = new_tmp(); | ||
4995 | - tcg_gen_mov_i32(tmp2, cpu_T[0]); | 4956 | + tmp2 = neon_load_scratch(2); |
4996 | } else { | 4957 | } else { |
4997 | tmp2 = neon_load_reg(rm, pass); | 4958 | tmp2 = neon_load_reg(rm, pass); |
4998 | } | 4959 | } |
@@ -5035,6 +4996,8 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -5035,6 +4996,8 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
5035 | case 8: case 9: case 10: case 11: case 12: case 13: | 4996 | case 8: case 9: case 10: case 11: case 12: case 13: |
5036 | /* VMLAL, VQDMLAL, VMLSL, VQDMLSL, VMULL, VQDMULL */ | 4997 | /* VMLAL, VQDMLAL, VMLSL, VQDMLSL, VMULL, VQDMULL */ |
5037 | gen_neon_mull(cpu_V0, tmp, tmp2, size, u); | 4998 | gen_neon_mull(cpu_V0, tmp, tmp2, size, u); |
4999 | + dead_tmp(tmp2); | ||
5000 | + dead_tmp(tmp); | ||
5038 | break; | 5001 | break; |
5039 | case 14: /* Polynomial VMULL */ | 5002 | case 14: /* Polynomial VMULL */ |
5040 | cpu_abort(env, "Polynomial VMULL not implemented"); | 5003 | cpu_abort(env, "Polynomial VMULL not implemented"); |
@@ -5123,55 +5086,56 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -5123,55 +5086,56 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
5123 | case 9: /* Floating point VMUL scalar */ | 5086 | case 9: /* Floating point VMUL scalar */ |
5124 | case 12: /* VQDMULH scalar */ | 5087 | case 12: /* VQDMULH scalar */ |
5125 | case 13: /* VQRDMULH scalar */ | 5088 | case 13: /* VQRDMULH scalar */ |
5126 | - gen_neon_get_scalar(size, rm); | ||
5127 | - gen_neon_movl_scratch_T0(0); | 5089 | + tmp = neon_get_scalar(size, rm); |
5090 | + neon_store_scratch(0, tmp); | ||
5128 | for (pass = 0; pass < (u ? 4 : 2); pass++) { | 5091 | for (pass = 0; pass < (u ? 4 : 2); pass++) { |
5129 | - if (pass != 0) | ||
5130 | - gen_neon_movl_T0_scratch(0); | ||
5131 | - NEON_GET_REG(T1, rn, pass); | 5092 | + tmp = neon_load_scratch(0); |
5093 | + tmp2 = neon_load_reg(rn, pass); | ||
5132 | if (op == 12) { | 5094 | if (op == 12) { |
5133 | if (size == 1) { | 5095 | if (size == 1) { |
5134 | - gen_helper_neon_qdmulh_s16(CPU_T0E01); | 5096 | + gen_helper_neon_qdmulh_s16(tmp, cpu_env, tmp, tmp2); |
5135 | } else { | 5097 | } else { |
5136 | - gen_helper_neon_qdmulh_s32(CPU_T0E01); | 5098 | + gen_helper_neon_qdmulh_s32(tmp, cpu_env, tmp, tmp2); |
5137 | } | 5099 | } |
5138 | } else if (op == 13) { | 5100 | } else if (op == 13) { |
5139 | if (size == 1) { | 5101 | if (size == 1) { |
5140 | - gen_helper_neon_qrdmulh_s16(CPU_T0E01); | 5102 | + gen_helper_neon_qrdmulh_s16(tmp, cpu_env, tmp, tmp2); |
5141 | } else { | 5103 | } else { |
5142 | - gen_helper_neon_qrdmulh_s32(CPU_T0E01); | 5104 | + gen_helper_neon_qrdmulh_s32(tmp, cpu_env, tmp, tmp2); |
5143 | } | 5105 | } |
5144 | } else if (op & 1) { | 5106 | } else if (op & 1) { |
5145 | - gen_helper_neon_mul_f32(CPU_T001); | 5107 | + gen_helper_neon_mul_f32(tmp, tmp, tmp2); |
5146 | } else { | 5108 | } else { |
5147 | switch (size) { | 5109 | switch (size) { |
5148 | - case 0: gen_helper_neon_mul_u8(CPU_T001); break; | ||
5149 | - case 1: gen_helper_neon_mul_u16(CPU_T001); break; | ||
5150 | - case 2: gen_op_mul_T0_T1(); break; | 5110 | + case 0: gen_helper_neon_mul_u8(tmp, tmp, tmp2); break; |
5111 | + case 1: gen_helper_neon_mul_u16(tmp, tmp, tmp2); break; | ||
5112 | + case 2: tcg_gen_mul_i32(tmp, tmp, tmp2); break; | ||
5151 | default: return 1; | 5113 | default: return 1; |
5152 | } | 5114 | } |
5153 | } | 5115 | } |
5116 | + dead_tmp(tmp2); | ||
5154 | if (op < 8) { | 5117 | if (op < 8) { |
5155 | /* Accumulate. */ | 5118 | /* Accumulate. */ |
5156 | - NEON_GET_REG(T1, rd, pass); | 5119 | + tmp2 = neon_load_reg(rd, pass); |
5157 | switch (op) { | 5120 | switch (op) { |
5158 | case 0: | 5121 | case 0: |
5159 | - gen_neon_add(size); | 5122 | + gen_neon_add(size, tmp, tmp2); |
5160 | break; | 5123 | break; |
5161 | case 1: | 5124 | case 1: |
5162 | - gen_helper_neon_add_f32(CPU_T001); | 5125 | + gen_helper_neon_add_f32(tmp, tmp, tmp2); |
5163 | break; | 5126 | break; |
5164 | case 4: | 5127 | case 4: |
5165 | - gen_neon_rsb(size); | 5128 | + gen_neon_rsb(size, tmp, tmp2); |
5166 | break; | 5129 | break; |
5167 | case 5: | 5130 | case 5: |
5168 | - gen_helper_neon_sub_f32(cpu_T[0], cpu_T[1], cpu_T[0]); | 5131 | + gen_helper_neon_sub_f32(tmp, tmp2, tmp); |
5169 | break; | 5132 | break; |
5170 | default: | 5133 | default: |
5171 | abort(); | 5134 | abort(); |
5172 | } | 5135 | } |
5136 | + dead_tmp(tmp2); | ||
5173 | } | 5137 | } |
5174 | - NEON_SET_REG(T0, rd, pass); | 5138 | + neon_store_reg(rd, pass, tmp); |
5175 | } | 5139 | } |
5176 | break; | 5140 | break; |
5177 | case 2: /* VMLAL sclar */ | 5141 | case 2: /* VMLAL sclar */ |
@@ -5183,19 +5147,17 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -5183,19 +5147,17 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
5183 | if (size == 0 && (op == 3 || op == 7 || op == 11)) | 5147 | if (size == 0 && (op == 3 || op == 7 || op == 11)) |
5184 | return 1; | 5148 | return 1; |
5185 | 5149 | ||
5186 | - gen_neon_get_scalar(size, rm); | ||
5187 | - NEON_GET_REG(T1, rn, 1); | 5150 | + tmp2 = neon_get_scalar(size, rm); |
5151 | + tmp3 = neon_load_reg(rn, 1); | ||
5188 | 5152 | ||
5189 | for (pass = 0; pass < 2; pass++) { | 5153 | for (pass = 0; pass < 2; pass++) { |
5190 | if (pass == 0) { | 5154 | if (pass == 0) { |
5191 | tmp = neon_load_reg(rn, 0); | 5155 | tmp = neon_load_reg(rn, 0); |
5192 | } else { | 5156 | } else { |
5193 | - tmp = new_tmp(); | ||
5194 | - tcg_gen_mov_i32(tmp, cpu_T[1]); | 5157 | + tmp = tmp3; |
5195 | } | 5158 | } |
5196 | - tmp2 = new_tmp(); | ||
5197 | - tcg_gen_mov_i32(tmp2, cpu_T[0]); | ||
5198 | gen_neon_mull(cpu_V0, tmp, tmp2, size, u); | 5159 | gen_neon_mull(cpu_V0, tmp, tmp2, size, u); |
5160 | + dead_tmp(tmp); | ||
5199 | if (op == 6 || op == 7) { | 5161 | if (op == 6 || op == 7) { |
5200 | gen_neon_negl(cpu_V0, size); | 5162 | gen_neon_negl(cpu_V0, size); |
5201 | } | 5163 | } |
@@ -5221,6 +5183,9 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -5221,6 +5183,9 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
5221 | } | 5183 | } |
5222 | neon_store_reg64(cpu_V0, rd + pass); | 5184 | neon_store_reg64(cpu_V0, rd + pass); |
5223 | } | 5185 | } |
5186 | + | ||
5187 | + dead_tmp(tmp2); | ||
5188 | + | ||
5224 | break; | 5189 | break; |
5225 | default: /* 14 and 15 are RESERVED */ | 5190 | default: /* 14 and 15 are RESERVED */ |
5226 | return 1; | 5191 | return 1; |
@@ -5287,25 +5252,24 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -5287,25 +5252,24 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
5287 | if (size == 3) | 5252 | if (size == 3) |
5288 | return 1; | 5253 | return 1; |
5289 | for (pass = 0; pass < (q ? 2 : 1); pass++) { | 5254 | for (pass = 0; pass < (q ? 2 : 1); pass++) { |
5290 | - NEON_GET_REG(T0, rm, pass * 2); | ||
5291 | - NEON_GET_REG(T1, rm, pass * 2 + 1); | 5255 | + tmp = neon_load_reg(rm, pass * 2); |
5256 | + tmp2 = neon_load_reg(rm, pass * 2 + 1); | ||
5292 | switch (size) { | 5257 | switch (size) { |
5293 | - case 0: tcg_gen_bswap32_i32(cpu_T[0], cpu_T[0]); break; | ||
5294 | - case 1: gen_swap_half(cpu_T[0]); break; | 5258 | + case 0: tcg_gen_bswap32_i32(tmp, tmp); break; |
5259 | + case 1: gen_swap_half(tmp); break; | ||
5295 | case 2: /* no-op */ break; | 5260 | case 2: /* no-op */ break; |
5296 | default: abort(); | 5261 | default: abort(); |
5297 | } | 5262 | } |
5298 | - NEON_SET_REG(T0, rd, pass * 2 + 1); | 5263 | + neon_store_reg(rd, pass * 2 + 1, tmp); |
5299 | if (size == 2) { | 5264 | if (size == 2) { |
5300 | - NEON_SET_REG(T1, rd, pass * 2); | 5265 | + neon_store_reg(rd, pass * 2, tmp2); |
5301 | } else { | 5266 | } else { |
5302 | - gen_op_movl_T0_T1(); | ||
5303 | switch (size) { | 5267 | switch (size) { |
5304 | - case 0: tcg_gen_bswap32_i32(cpu_T[0], cpu_T[0]); break; | ||
5305 | - case 1: gen_swap_half(cpu_T[0]); break; | 5268 | + case 0: tcg_gen_bswap32_i32(tmp2, tmp2); break; |
5269 | + case 1: gen_swap_half(tmp2); break; | ||
5306 | default: abort(); | 5270 | default: abort(); |
5307 | } | 5271 | } |
5308 | - NEON_SET_REG(T0, rd, pass * 2); | 5272 | + neon_store_reg(rd, pass * 2, tmp2); |
5309 | } | 5273 | } |
5310 | } | 5274 | } |
5311 | break; | 5275 | break; |
@@ -5335,10 +5299,10 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -5335,10 +5299,10 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
5335 | case 33: /* VTRN */ | 5299 | case 33: /* VTRN */ |
5336 | if (size == 2) { | 5300 | if (size == 2) { |
5337 | for (n = 0; n < (q ? 4 : 2); n += 2) { | 5301 | for (n = 0; n < (q ? 4 : 2); n += 2) { |
5338 | - NEON_GET_REG(T0, rm, n); | ||
5339 | - NEON_GET_REG(T1, rd, n + 1); | ||
5340 | - NEON_SET_REG(T1, rm, n); | ||
5341 | - NEON_SET_REG(T0, rd, n + 1); | 5302 | + tmp = neon_load_reg(rm, n); |
5303 | + tmp2 = neon_load_reg(rd, n + 1); | ||
5304 | + neon_store_reg(rm, n, tmp2); | ||
5305 | + neon_store_reg(rd, n + 1, tmp); | ||
5342 | } | 5306 | } |
5343 | } else { | 5307 | } else { |
5344 | goto elementwise; | 5308 | goto elementwise; |
@@ -5358,16 +5322,16 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -5358,16 +5322,16 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
5358 | {0, 2, 4, 6, 1, 3, 5, 7}; | 5322 | {0, 2, 4, 6, 1, 3, 5, 7}; |
5359 | for (n = 0; n < 8; n++) { | 5323 | for (n = 0; n < 8; n++) { |
5360 | int reg = (n < 4) ? rd : rm; | 5324 | int reg = (n < 4) ? rd : rm; |
5361 | - gen_neon_movl_T0_scratch(unzip_order_q[n]); | ||
5362 | - NEON_SET_REG(T0, reg, n % 4); | 5325 | + tmp = neon_load_scratch(unzip_order_q[n]); |
5326 | + neon_store_reg(reg, n % 4, tmp); | ||
5363 | } | 5327 | } |
5364 | } else { | 5328 | } else { |
5365 | static int unzip_order[4] = | 5329 | static int unzip_order[4] = |
5366 | {0, 4, 1, 5}; | 5330 | {0, 4, 1, 5}; |
5367 | for (n = 0; n < 4; n++) { | 5331 | for (n = 0; n < 4; n++) { |
5368 | int reg = (n < 2) ? rd : rm; | 5332 | int reg = (n < 2) ? rd : rm; |
5369 | - gen_neon_movl_T0_scratch(unzip_order[n]); | ||
5370 | - NEON_SET_REG(T0, reg, n % 2); | 5333 | + tmp = neon_load_scratch(unzip_order[n]); |
5334 | + neon_store_reg(reg, n % 2, tmp); | ||
5371 | } | 5335 | } |
5372 | } | 5336 | } |
5373 | break; | 5337 | break; |
@@ -5380,21 +5344,21 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -5380,21 +5344,21 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
5380 | return 1; | 5344 | return 1; |
5381 | count = (q ? 4 : 2); | 5345 | count = (q ? 4 : 2); |
5382 | for (n = 0; n < count; n++) { | 5346 | for (n = 0; n < count; n++) { |
5383 | - NEON_GET_REG(T0, rd, n); | ||
5384 | - NEON_GET_REG(T1, rd, n); | 5347 | + tmp = neon_load_reg(rd, n); |
5348 | + tmp2 = neon_load_reg(rd, n); | ||
5385 | switch (size) { | 5349 | switch (size) { |
5386 | - case 0: gen_neon_zip_u8(cpu_T[0], cpu_T[1]); break; | ||
5387 | - case 1: gen_neon_zip_u16(cpu_T[0], cpu_T[1]); break; | 5350 | + case 0: gen_neon_zip_u8(tmp, tmp2); break; |
5351 | + case 1: gen_neon_zip_u16(tmp, tmp2); break; | ||
5388 | case 2: /* no-op */; break; | 5352 | case 2: /* no-op */; break; |
5389 | default: abort(); | 5353 | default: abort(); |
5390 | } | 5354 | } |
5391 | - gen_neon_movl_scratch_T0(n * 2); | ||
5392 | - gen_neon_movl_scratch_T1(n * 2 + 1); | 5355 | + neon_store_scratch(n * 2, tmp); |
5356 | + neon_store_scratch(n * 2 + 1, tmp2); | ||
5393 | } | 5357 | } |
5394 | for (n = 0; n < count * 2; n++) { | 5358 | for (n = 0; n < count * 2; n++) { |
5395 | int reg = (n < count) ? rd : rm; | 5359 | int reg = (n < count) ? rd : rm; |
5396 | - gen_neon_movl_T0_scratch(n); | ||
5397 | - NEON_SET_REG(T0, reg, n % count); | 5360 | + tmp = neon_load_scratch(n); |
5361 | + neon_store_reg(reg, n % count, tmp); | ||
5398 | } | 5362 | } |
5399 | break; | 5363 | break; |
5400 | case 36: case 37: /* VMOVN, VQMOVUN, VQMOVN */ | 5364 | case 36: case 37: /* VMOVN, VQMOVUN, VQMOVN */ |
@@ -5437,124 +5401,132 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -5437,124 +5401,132 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
5437 | if (op == 30 || op == 31 || op >= 58) { | 5401 | if (op == 30 || op == 31 || op >= 58) { |
5438 | tcg_gen_ld_f32(cpu_F0s, cpu_env, | 5402 | tcg_gen_ld_f32(cpu_F0s, cpu_env, |
5439 | neon_reg_offset(rm, pass)); | 5403 | neon_reg_offset(rm, pass)); |
5404 | + TCGV_UNUSED(tmp); | ||
5440 | } else { | 5405 | } else { |
5441 | - NEON_GET_REG(T0, rm, pass); | 5406 | + tmp = neon_load_reg(rm, pass); |
5442 | } | 5407 | } |
5443 | switch (op) { | 5408 | switch (op) { |
5444 | case 1: /* VREV32 */ | 5409 | case 1: /* VREV32 */ |
5445 | switch (size) { | 5410 | switch (size) { |
5446 | - case 0: tcg_gen_bswap32_i32(cpu_T[0], cpu_T[0]); break; | ||
5447 | - case 1: gen_swap_half(cpu_T[0]); break; | 5411 | + case 0: tcg_gen_bswap32_i32(tmp, tmp); break; |
5412 | + case 1: gen_swap_half(tmp); break; | ||
5448 | default: return 1; | 5413 | default: return 1; |
5449 | } | 5414 | } |
5450 | break; | 5415 | break; |
5451 | case 2: /* VREV16 */ | 5416 | case 2: /* VREV16 */ |
5452 | if (size != 0) | 5417 | if (size != 0) |
5453 | return 1; | 5418 | return 1; |
5454 | - gen_rev16(cpu_T[0]); | 5419 | + gen_rev16(tmp); |
5455 | break; | 5420 | break; |
5456 | case 8: /* CLS */ | 5421 | case 8: /* CLS */ |
5457 | switch (size) { | 5422 | switch (size) { |
5458 | - case 0: gen_helper_neon_cls_s8(cpu_T[0], cpu_T[0]); break; | ||
5459 | - case 1: gen_helper_neon_cls_s16(cpu_T[0], cpu_T[0]); break; | ||
5460 | - case 2: gen_helper_neon_cls_s32(cpu_T[0], cpu_T[0]); break; | 5423 | + case 0: gen_helper_neon_cls_s8(tmp, tmp); break; |
5424 | + case 1: gen_helper_neon_cls_s16(tmp, tmp); break; | ||
5425 | + case 2: gen_helper_neon_cls_s32(tmp, tmp); break; | ||
5461 | default: return 1; | 5426 | default: return 1; |
5462 | } | 5427 | } |
5463 | break; | 5428 | break; |
5464 | case 9: /* CLZ */ | 5429 | case 9: /* CLZ */ |
5465 | switch (size) { | 5430 | switch (size) { |
5466 | - case 0: gen_helper_neon_clz_u8(cpu_T[0], cpu_T[0]); break; | ||
5467 | - case 1: gen_helper_neon_clz_u16(cpu_T[0], cpu_T[0]); break; | ||
5468 | - case 2: gen_helper_clz(cpu_T[0], cpu_T[0]); break; | 5431 | + case 0: gen_helper_neon_clz_u8(tmp, tmp); break; |
5432 | + case 1: gen_helper_neon_clz_u16(tmp, tmp); break; | ||
5433 | + case 2: gen_helper_clz(tmp, tmp); break; | ||
5469 | default: return 1; | 5434 | default: return 1; |
5470 | } | 5435 | } |
5471 | break; | 5436 | break; |
5472 | case 10: /* CNT */ | 5437 | case 10: /* CNT */ |
5473 | if (size != 0) | 5438 | if (size != 0) |
5474 | return 1; | 5439 | return 1; |
5475 | - gen_helper_neon_cnt_u8(cpu_T[0], cpu_T[0]); | 5440 | + gen_helper_neon_cnt_u8(tmp, tmp); |
5476 | break; | 5441 | break; |
5477 | case 11: /* VNOT */ | 5442 | case 11: /* VNOT */ |
5478 | if (size != 0) | 5443 | if (size != 0) |
5479 | return 1; | 5444 | return 1; |
5480 | - gen_op_notl_T0(); | 5445 | + tcg_gen_not_i32(tmp, tmp); |
5481 | break; | 5446 | break; |
5482 | case 14: /* VQABS */ | 5447 | case 14: /* VQABS */ |
5483 | switch (size) { | 5448 | switch (size) { |
5484 | - case 0: gen_helper_neon_qabs_s8(cpu_T[0], cpu_env, cpu_T[0]); break; | ||
5485 | - case 1: gen_helper_neon_qabs_s16(cpu_T[0], cpu_env, cpu_T[0]); break; | ||
5486 | - case 2: gen_helper_neon_qabs_s32(cpu_T[0], cpu_env, cpu_T[0]); break; | 5449 | + case 0: gen_helper_neon_qabs_s8(tmp, cpu_env, tmp); break; |
5450 | + case 1: gen_helper_neon_qabs_s16(tmp, cpu_env, tmp); break; | ||
5451 | + case 2: gen_helper_neon_qabs_s32(tmp, cpu_env, tmp); break; | ||
5487 | default: return 1; | 5452 | default: return 1; |
5488 | } | 5453 | } |
5489 | break; | 5454 | break; |
5490 | case 15: /* VQNEG */ | 5455 | case 15: /* VQNEG */ |
5491 | switch (size) { | 5456 | switch (size) { |
5492 | - case 0: gen_helper_neon_qneg_s8(cpu_T[0], cpu_env, cpu_T[0]); break; | ||
5493 | - case 1: gen_helper_neon_qneg_s16(cpu_T[0], cpu_env, cpu_T[0]); break; | ||
5494 | - case 2: gen_helper_neon_qneg_s32(cpu_T[0], cpu_env, cpu_T[0]); break; | 5457 | + case 0: gen_helper_neon_qneg_s8(tmp, cpu_env, tmp); break; |
5458 | + case 1: gen_helper_neon_qneg_s16(tmp, cpu_env, tmp); break; | ||
5459 | + case 2: gen_helper_neon_qneg_s32(tmp, cpu_env, tmp); break; | ||
5495 | default: return 1; | 5460 | default: return 1; |
5496 | } | 5461 | } |
5497 | break; | 5462 | break; |
5498 | case 16: case 19: /* VCGT #0, VCLE #0 */ | 5463 | case 16: case 19: /* VCGT #0, VCLE #0 */ |
5499 | - gen_op_movl_T1_im(0); | 5464 | + tmp2 = tcg_const_i32(0); |
5500 | switch(size) { | 5465 | switch(size) { |
5501 | - case 0: gen_helper_neon_cgt_s8(CPU_T001); break; | ||
5502 | - case 1: gen_helper_neon_cgt_s16(CPU_T001); break; | ||
5503 | - case 2: gen_helper_neon_cgt_s32(CPU_T001); break; | 5466 | + case 0: gen_helper_neon_cgt_s8(tmp, tmp, tmp2); break; |
5467 | + case 1: gen_helper_neon_cgt_s16(tmp, tmp, tmp2); break; | ||
5468 | + case 2: gen_helper_neon_cgt_s32(tmp, tmp, tmp2); break; | ||
5504 | default: return 1; | 5469 | default: return 1; |
5505 | } | 5470 | } |
5471 | + tcg_temp_free(tmp2); | ||
5506 | if (op == 19) | 5472 | if (op == 19) |
5507 | - gen_op_notl_T0(); | 5473 | + tcg_gen_not_i32(tmp, tmp); |
5508 | break; | 5474 | break; |
5509 | case 17: case 20: /* VCGE #0, VCLT #0 */ | 5475 | case 17: case 20: /* VCGE #0, VCLT #0 */ |
5510 | - gen_op_movl_T1_im(0); | 5476 | + tmp2 = tcg_const_i32(0); |
5511 | switch(size) { | 5477 | switch(size) { |
5512 | - case 0: gen_helper_neon_cge_s8(CPU_T001); break; | ||
5513 | - case 1: gen_helper_neon_cge_s16(CPU_T001); break; | ||
5514 | - case 2: gen_helper_neon_cge_s32(CPU_T001); break; | 5478 | + case 0: gen_helper_neon_cge_s8(tmp, tmp, tmp2); break; |
5479 | + case 1: gen_helper_neon_cge_s16(tmp, tmp, tmp2); break; | ||
5480 | + case 2: gen_helper_neon_cge_s32(tmp, tmp, tmp2); break; | ||
5515 | default: return 1; | 5481 | default: return 1; |
5516 | } | 5482 | } |
5483 | + tcg_temp_free(tmp2); | ||
5517 | if (op == 20) | 5484 | if (op == 20) |
5518 | - gen_op_notl_T0(); | 5485 | + tcg_gen_not_i32(tmp, tmp); |
5519 | break; | 5486 | break; |
5520 | case 18: /* VCEQ #0 */ | 5487 | case 18: /* VCEQ #0 */ |
5521 | - gen_op_movl_T1_im(0); | 5488 | + tmp2 = tcg_const_i32(0); |
5522 | switch(size) { | 5489 | switch(size) { |
5523 | - case 0: gen_helper_neon_ceq_u8(CPU_T001); break; | ||
5524 | - case 1: gen_helper_neon_ceq_u16(CPU_T001); break; | ||
5525 | - case 2: gen_helper_neon_ceq_u32(CPU_T001); break; | 5490 | + case 0: gen_helper_neon_ceq_u8(tmp, tmp, tmp2); break; |
5491 | + case 1: gen_helper_neon_ceq_u16(tmp, tmp, tmp2); break; | ||
5492 | + case 2: gen_helper_neon_ceq_u32(tmp, tmp, tmp2); break; | ||
5526 | default: return 1; | 5493 | default: return 1; |
5527 | } | 5494 | } |
5495 | + tcg_temp_free(tmp2); | ||
5528 | break; | 5496 | break; |
5529 | case 22: /* VABS */ | 5497 | case 22: /* VABS */ |
5530 | switch(size) { | 5498 | switch(size) { |
5531 | - case 0: gen_helper_neon_abs_s8(cpu_T[0], cpu_T[0]); break; | ||
5532 | - case 1: gen_helper_neon_abs_s16(cpu_T[0], cpu_T[0]); break; | ||
5533 | - case 2: tcg_gen_abs_i32(cpu_T[0], cpu_T[0]); break; | 5499 | + case 0: gen_helper_neon_abs_s8(tmp, tmp); break; |
5500 | + case 1: gen_helper_neon_abs_s16(tmp, tmp); break; | ||
5501 | + case 2: tcg_gen_abs_i32(tmp, tmp); break; | ||
5534 | default: return 1; | 5502 | default: return 1; |
5535 | } | 5503 | } |
5536 | break; | 5504 | break; |
5537 | case 23: /* VNEG */ | 5505 | case 23: /* VNEG */ |
5538 | - gen_op_movl_T1_im(0); | ||
5539 | if (size == 3) | 5506 | if (size == 3) |
5540 | return 1; | 5507 | return 1; |
5541 | - gen_neon_rsb(size); | 5508 | + tmp2 = tcg_const_i32(0); |
5509 | + gen_neon_rsb(size, tmp, tmp2); | ||
5510 | + tcg_temp_free(tmp2); | ||
5542 | break; | 5511 | break; |
5543 | case 24: case 27: /* Float VCGT #0, Float VCLE #0 */ | 5512 | case 24: case 27: /* Float VCGT #0, Float VCLE #0 */ |
5544 | - gen_op_movl_T1_im(0); | ||
5545 | - gen_helper_neon_cgt_f32(CPU_T001); | 5513 | + tmp2 = tcg_const_i32(0); |
5514 | + gen_helper_neon_cgt_f32(tmp, tmp, tmp2); | ||
5515 | + tcg_temp_free(tmp2); | ||
5546 | if (op == 27) | 5516 | if (op == 27) |
5547 | - gen_op_notl_T0(); | 5517 | + tcg_gen_not_i32(tmp, tmp); |
5548 | break; | 5518 | break; |
5549 | case 25: case 28: /* Float VCGE #0, Float VCLT #0 */ | 5519 | case 25: case 28: /* Float VCGE #0, Float VCLT #0 */ |
5550 | - gen_op_movl_T1_im(0); | ||
5551 | - gen_helper_neon_cge_f32(CPU_T001); | 5520 | + tmp2 = tcg_const_i32(0); |
5521 | + gen_helper_neon_cge_f32(tmp, tmp, tmp2); | ||
5522 | + tcg_temp_free(tmp2); | ||
5552 | if (op == 28) | 5523 | if (op == 28) |
5553 | - gen_op_notl_T0(); | 5524 | + tcg_gen_not_i32(tmp, tmp); |
5554 | break; | 5525 | break; |
5555 | case 26: /* Float VCEQ #0 */ | 5526 | case 26: /* Float VCEQ #0 */ |
5556 | - gen_op_movl_T1_im(0); | ||
5557 | - gen_helper_neon_ceq_f32(CPU_T001); | 5527 | + tmp2 = tcg_const_i32(0); |
5528 | + gen_helper_neon_ceq_f32(tmp, tmp, tmp2); | ||
5529 | + tcg_temp_free(tmp2); | ||
5558 | break; | 5530 | break; |
5559 | case 30: /* Float VABS */ | 5531 | case 30: /* Float VABS */ |
5560 | gen_vfp_abs(0); | 5532 | gen_vfp_abs(0); |
@@ -5563,24 +5535,24 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -5563,24 +5535,24 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
5563 | gen_vfp_neg(0); | 5535 | gen_vfp_neg(0); |
5564 | break; | 5536 | break; |
5565 | case 32: /* VSWP */ | 5537 | case 32: /* VSWP */ |
5566 | - NEON_GET_REG(T1, rd, pass); | ||
5567 | - NEON_SET_REG(T1, rm, pass); | 5538 | + tmp2 = neon_load_reg(rd, pass); |
5539 | + neon_store_reg(rm, pass, tmp2); | ||
5568 | break; | 5540 | break; |
5569 | case 33: /* VTRN */ | 5541 | case 33: /* VTRN */ |
5570 | - NEON_GET_REG(T1, rd, pass); | 5542 | + tmp2 = neon_load_reg(rd, pass); |
5571 | switch (size) { | 5543 | switch (size) { |
5572 | - case 0: gen_neon_trn_u8(cpu_T[0], cpu_T[1]); break; | ||
5573 | - case 1: gen_neon_trn_u16(cpu_T[0], cpu_T[1]); break; | 5544 | + case 0: gen_neon_trn_u8(tmp, tmp2); break; |
5545 | + case 1: gen_neon_trn_u16(tmp, tmp2); break; | ||
5574 | case 2: abort(); | 5546 | case 2: abort(); |
5575 | default: return 1; | 5547 | default: return 1; |
5576 | } | 5548 | } |
5577 | - NEON_SET_REG(T1, rm, pass); | 5549 | + neon_store_reg(rm, pass, tmp2); |
5578 | break; | 5550 | break; |
5579 | case 56: /* Integer VRECPE */ | 5551 | case 56: /* Integer VRECPE */ |
5580 | - gen_helper_recpe_u32(cpu_T[0], cpu_T[0], cpu_env); | 5552 | + gen_helper_recpe_u32(tmp, tmp, cpu_env); |
5581 | break; | 5553 | break; |
5582 | case 57: /* Integer VRSQRTE */ | 5554 | case 57: /* Integer VRSQRTE */ |
5583 | - gen_helper_rsqrte_u32(cpu_T[0], cpu_T[0], cpu_env); | 5555 | + gen_helper_rsqrte_u32(tmp, tmp, cpu_env); |
5584 | break; | 5556 | break; |
5585 | case 58: /* Float VRECPE */ | 5557 | case 58: /* Float VRECPE */ |
5586 | gen_helper_recpe_f32(cpu_F0s, cpu_F0s, cpu_env); | 5558 | gen_helper_recpe_f32(cpu_F0s, cpu_F0s, cpu_env); |
@@ -5608,7 +5580,7 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -5608,7 +5580,7 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
5608 | tcg_gen_st_f32(cpu_F0s, cpu_env, | 5580 | tcg_gen_st_f32(cpu_F0s, cpu_env, |
5609 | neon_reg_offset(rd, pass)); | 5581 | neon_reg_offset(rd, pass)); |
5610 | } else { | 5582 | } else { |
5611 | - NEON_SET_REG(T0, rd, pass); | 5583 | + neon_store_reg(rd, pass, tmp); |
5612 | } | 5584 | } |
5613 | } | 5585 | } |
5614 | break; | 5586 | break; |
@@ -5641,21 +5613,24 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | @@ -5641,21 +5613,24 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) | ||
5641 | } else if ((insn & 0x380) == 0) { | 5613 | } else if ((insn & 0x380) == 0) { |
5642 | /* VDUP */ | 5614 | /* VDUP */ |
5643 | if (insn & (1 << 19)) { | 5615 | if (insn & (1 << 19)) { |
5644 | - NEON_SET_REG(T0, rm, 1); | 5616 | + tmp = neon_load_reg(rm, 1); |
5645 | } else { | 5617 | } else { |
5646 | - NEON_SET_REG(T0, rm, 0); | 5618 | + tmp = neon_load_reg(rm, 0); |
5647 | } | 5619 | } |
5648 | if (insn & (1 << 16)) { | 5620 | if (insn & (1 << 16)) { |
5649 | - gen_neon_dup_u8(cpu_T[0], ((insn >> 17) & 3) * 8); | 5621 | + gen_neon_dup_u8(tmp, ((insn >> 17) & 3) * 8); |
5650 | } else if (insn & (1 << 17)) { | 5622 | } else if (insn & (1 << 17)) { |
5651 | if ((insn >> 18) & 1) | 5623 | if ((insn >> 18) & 1) |
5652 | - gen_neon_dup_high16(cpu_T[0]); | 5624 | + gen_neon_dup_high16(tmp); |
5653 | else | 5625 | else |
5654 | - gen_neon_dup_low16(cpu_T[0]); | 5626 | + gen_neon_dup_low16(tmp); |
5655 | } | 5627 | } |
5656 | for (pass = 0; pass < (q ? 4 : 2); pass++) { | 5628 | for (pass = 0; pass < (q ? 4 : 2); pass++) { |
5657 | - NEON_SET_REG(T0, rd, pass); | 5629 | + tmp2 = new_tmp(); |
5630 | + tcg_gen_mov_i32(tmp2, tmp); | ||
5631 | + neon_store_reg(rd, pass, tmp2); | ||
5658 | } | 5632 | } |
5633 | + dead_tmp(tmp); | ||
5659 | } else { | 5634 | } else { |
5660 | return 1; | 5635 | return 1; |
5661 | } | 5636 | } |