Commit ff8ef2a8613fad811e75d16a3570a8e8ea4b0655
1 parent
98daeaf6
Get rid of gen_set_psr_T0 and replace it by gen_set_psr/gen_set_psr_im.
Signed-off-by: Filip Navara <filip.navara@gmail.com>
Showing
1 changed file
with
24 additions
and
20 deletions
target-arm/translate.c
| ... | ... | @@ -3418,8 +3418,8 @@ static uint32_t msr_mask(CPUState *env, DisasContext *s, int flags, int spsr) { |
| 3418 | 3418 | return mask; |
| 3419 | 3419 | } |
| 3420 | 3420 | |
| 3421 | -/* Returns nonzero if access to the PSR is not permitted. */ | |
| 3422 | -static int gen_set_psr_T0(DisasContext *s, uint32_t mask, int spsr) | |
| 3421 | +/* Returns nonzero if access to the PSR is not permitted. Marks t0 as dead. */ | |
| 3422 | +static int gen_set_psr(DisasContext *s, uint32_t mask, int spsr, TCGv t0) | |
| 3423 | 3423 | { |
| 3424 | 3424 | TCGv tmp; |
| 3425 | 3425 | if (spsr) { |
| ... | ... | @@ -3429,16 +3429,26 @@ static int gen_set_psr_T0(DisasContext *s, uint32_t mask, int spsr) |
| 3429 | 3429 | |
| 3430 | 3430 | tmp = load_cpu_field(spsr); |
| 3431 | 3431 | tcg_gen_andi_i32(tmp, tmp, ~mask); |
| 3432 | - tcg_gen_andi_i32(cpu_T[0], cpu_T[0], mask); | |
| 3433 | - tcg_gen_or_i32(tmp, tmp, cpu_T[0]); | |
| 3432 | + tcg_gen_andi_i32(t0, t0, mask); | |
| 3433 | + tcg_gen_or_i32(tmp, tmp, t0); | |
| 3434 | 3434 | store_cpu_field(tmp, spsr); |
| 3435 | 3435 | } else { |
| 3436 | - gen_set_cpsr(cpu_T[0], mask); | |
| 3436 | + gen_set_cpsr(t0, mask); | |
| 3437 | 3437 | } |
| 3438 | + dead_tmp(t0); | |
| 3438 | 3439 | gen_lookup_tb(s); |
| 3439 | 3440 | return 0; |
| 3440 | 3441 | } |
| 3441 | 3442 | |
| 3443 | +/* Returns nonzero if access to the PSR is not permitted. */ | |
| 3444 | +static int gen_set_psr_im(DisasContext *s, uint32_t mask, int spsr, uint32_t val) | |
| 3445 | +{ | |
| 3446 | + TCGv tmp; | |
| 3447 | + tmp = new_tmp(); | |
| 3448 | + tcg_gen_movi_i32(tmp, val); | |
| 3449 | + return gen_set_psr(s, mask, spsr, tmp); | |
| 3450 | +} | |
| 3451 | + | |
| 3442 | 3452 | /* Generate an old-style exception return. Marks pc as dead. */ |
| 3443 | 3453 | static void gen_exception_return(DisasContext *s, TCGv pc) |
| 3444 | 3454 | { |
| ... | ... | @@ -5889,8 +5899,7 @@ static void disas_arm_insn(CPUState * env, DisasContext *s) |
| 5889 | 5899 | val |= (insn & 0x1f); |
| 5890 | 5900 | } |
| 5891 | 5901 | if (mask) { |
| 5892 | - gen_op_movl_T0_im(val); | |
| 5893 | - gen_set_psr_T0(s, mask, 0); | |
| 5902 | + gen_set_psr_im(s, mask, 0, val); | |
| 5894 | 5903 | } |
| 5895 | 5904 | return; |
| 5896 | 5905 | } |
| ... | ... | @@ -5930,9 +5939,8 @@ static void disas_arm_insn(CPUState * env, DisasContext *s) |
| 5930 | 5939 | shift = ((insn >> 8) & 0xf) * 2; |
| 5931 | 5940 | if (shift) |
| 5932 | 5941 | val = (val >> shift) | (val << (32 - shift)); |
| 5933 | - gen_op_movl_T0_im(val); | |
| 5934 | 5942 | i = ((insn & (1 << 22)) != 0); |
| 5935 | - if (gen_set_psr_T0(s, msr_mask(env, s, (insn >> 16) & 0xf, i), i)) | |
| 5943 | + if (gen_set_psr_im(s, msr_mask(env, s, (insn >> 16) & 0xf, i), i, val)) | |
| 5936 | 5944 | goto illegal_op; |
| 5937 | 5945 | } |
| 5938 | 5946 | } |
| ... | ... | @@ -5946,9 +5954,9 @@ static void disas_arm_insn(CPUState * env, DisasContext *s) |
| 5946 | 5954 | case 0x0: /* move program status register */ |
| 5947 | 5955 | if (op1 & 1) { |
| 5948 | 5956 | /* PSR = reg */ |
| 5949 | - gen_movl_T0_reg(s, rm); | |
| 5957 | + tmp = load_reg(s, rm); | |
| 5950 | 5958 | i = ((op1 & 2) != 0); |
| 5951 | - if (gen_set_psr_T0(s, msr_mask(env, s, (insn >> 16) & 0xf, i), i)) | |
| 5959 | + if (gen_set_psr(s, msr_mask(env, s, (insn >> 16) & 0xf, i), i, tmp)) | |
| 5952 | 5960 | goto illegal_op; |
| 5953 | 5961 | } else { |
| 5954 | 5962 | /* reg = PSR */ |
| ... | ... | @@ -7677,10 +7685,10 @@ static int disas_thumb2_insn(CPUState *env, DisasContext *s, uint16_t insn_hw1) |
| 7677 | 7685 | case 1: /* msr spsr. */ |
| 7678 | 7686 | if (IS_M(env)) |
| 7679 | 7687 | goto illegal_op; |
| 7680 | - gen_movl_T0_reg(s, rn); | |
| 7681 | - if (gen_set_psr_T0(s, | |
| 7688 | + tmp = load_reg(s, rn); | |
| 7689 | + if (gen_set_psr(s, | |
| 7682 | 7690 | msr_mask(env, s, (insn >> 8) & 0xf, op == 1), |
| 7683 | - op == 1)) | |
| 7691 | + op == 1, tmp)) | |
| 7684 | 7692 | goto illegal_op; |
| 7685 | 7693 | break; |
| 7686 | 7694 | case 2: /* cps, nop-hint. */ |
| ... | ... | @@ -7707,8 +7715,7 @@ static int disas_thumb2_insn(CPUState *env, DisasContext *s, uint16_t insn_hw1) |
| 7707 | 7715 | imm |= (insn & 0x1f); |
| 7708 | 7716 | } |
| 7709 | 7717 | if (offset) { |
| 7710 | - gen_op_movl_T0_im(imm); | |
| 7711 | - gen_set_psr_T0(s, offset, 0); | |
| 7718 | + gen_set_psr_im(s, offset, 0, imm); | |
| 7712 | 7719 | } |
| 7713 | 7720 | break; |
| 7714 | 7721 | case 3: /* Special control operations. */ |
| ... | ... | @@ -8603,10 +8610,7 @@ static void disas_thumb_insn(CPUState *env, DisasContext *s) |
| 8603 | 8610 | shift = CPSR_A | CPSR_I | CPSR_F; |
| 8604 | 8611 | else |
| 8605 | 8612 | shift = 0; |
| 8606 | - | |
| 8607 | - val = ((insn & 7) << 6) & shift; | |
| 8608 | - gen_op_movl_T0_im(val); | |
| 8609 | - gen_set_psr_T0(s, shift, 0); | |
| 8613 | + gen_set_psr_im(s, shift, 0, ((insn & 7) << 6) & shift); | |
| 8610 | 8614 | } |
| 8611 | 8615 | break; |
| 8612 | 8616 | ... | ... |