Commit 32b6c8125c58a5b67867f8a47784068f6c8f9f04
1 parent
31741a27
Avoid writes to T1 except for loads/stores, convert some T0 uses to cpu_tmp0
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4130 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
41 additions
and
41 deletions
target-sparc/translate.c
| ... | ... | @@ -2885,12 +2885,12 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2885 | 2885 | rs2 = GET_FIELD(insn, 27, 31); |
| 2886 | 2886 | gen_movl_reg_TN(rs2, cpu_T[1]); |
| 2887 | 2887 | if (insn & (1 << 12)) { |
| 2888 | - tcg_gen_andi_i64(cpu_T[1], cpu_T[1], 0x3f); | |
| 2889 | - tcg_gen_shl_i64(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 2888 | + tcg_gen_andi_i64(cpu_tmp0, cpu_T[1], 0x3f); | |
| 2889 | + tcg_gen_shl_i64(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 2890 | 2890 | } else { |
| 2891 | - tcg_gen_andi_i64(cpu_T[1], cpu_T[1], 0x1f); | |
| 2891 | + tcg_gen_andi_i64(cpu_tmp0, cpu_T[1], 0x1f); | |
| 2892 | 2892 | tcg_gen_andi_i64(cpu_T[0], cpu_T[0], 0xffffffffULL); |
| 2893 | - tcg_gen_shl_i64(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 2893 | + tcg_gen_shl_i64(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 2894 | 2894 | } |
| 2895 | 2895 | } |
| 2896 | 2896 | gen_movl_TN_reg(rd, cpu_T[0]); |
| ... | ... | @@ -2909,12 +2909,12 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2909 | 2909 | rs2 = GET_FIELD(insn, 27, 31); |
| 2910 | 2910 | gen_movl_reg_TN(rs2, cpu_T[1]); |
| 2911 | 2911 | if (insn & (1 << 12)) { |
| 2912 | - tcg_gen_andi_i64(cpu_T[1], cpu_T[1], 0x3f); | |
| 2913 | - tcg_gen_shr_i64(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 2912 | + tcg_gen_andi_i64(cpu_tmp0, cpu_T[1], 0x3f); | |
| 2913 | + tcg_gen_shr_i64(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 2914 | 2914 | } else { |
| 2915 | - tcg_gen_andi_i64(cpu_T[1], cpu_T[1], 0x1f); | |
| 2915 | + tcg_gen_andi_i64(cpu_tmp0, cpu_T[1], 0x1f); | |
| 2916 | 2916 | tcg_gen_andi_i64(cpu_T[0], cpu_T[0], 0xffffffffULL); |
| 2917 | - tcg_gen_shr_i64(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 2917 | + tcg_gen_shr_i64(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 2918 | 2918 | } |
| 2919 | 2919 | } |
| 2920 | 2920 | gen_movl_TN_reg(rd, cpu_T[0]); |
| ... | ... | @@ -2934,12 +2934,12 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2934 | 2934 | rs2 = GET_FIELD(insn, 27, 31); |
| 2935 | 2935 | gen_movl_reg_TN(rs2, cpu_T[1]); |
| 2936 | 2936 | if (insn & (1 << 12)) { |
| 2937 | - tcg_gen_andi_i64(cpu_T[1], cpu_T[1], 0x3f); | |
| 2938 | - tcg_gen_sar_i64(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 2937 | + tcg_gen_andi_i64(cpu_tmp0, cpu_T[1], 0x3f); | |
| 2938 | + tcg_gen_sar_i64(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 2939 | 2939 | } else { |
| 2940 | - tcg_gen_andi_i64(cpu_T[1], cpu_T[1], 0x1f); | |
| 2940 | + tcg_gen_andi_i64(cpu_tmp0, cpu_T[1], 0x1f); | |
| 2941 | 2941 | tcg_gen_andi_i64(cpu_T[0], cpu_T[0], 0xffffffffULL); |
| 2942 | - tcg_gen_sar_i64(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 2942 | + tcg_gen_sar_i64(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 2943 | 2943 | } |
| 2944 | 2944 | } |
| 2945 | 2945 | gen_movl_TN_reg(rd, cpu_T[0]); |
| ... | ... | @@ -2984,20 +2984,20 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2984 | 2984 | tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]); |
| 2985 | 2985 | break; |
| 2986 | 2986 | case 0x5: |
| 2987 | - tcg_gen_xori_tl(cpu_T[1], cpu_T[1], -1); | |
| 2988 | - tcg_gen_and_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 2987 | + tcg_gen_xori_tl(cpu_tmp0, cpu_T[1], -1); | |
| 2988 | + tcg_gen_and_tl(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 2989 | 2989 | if (xop & 0x10) |
| 2990 | 2990 | gen_op_logic_cc(cpu_T[0]); |
| 2991 | 2991 | break; |
| 2992 | 2992 | case 0x6: |
| 2993 | - tcg_gen_xori_tl(cpu_T[1], cpu_T[1], -1); | |
| 2994 | - tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 2993 | + tcg_gen_xori_tl(cpu_tmp0, cpu_T[1], -1); | |
| 2994 | + tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 2995 | 2995 | if (xop & 0x10) |
| 2996 | 2996 | gen_op_logic_cc(cpu_T[0]); |
| 2997 | 2997 | break; |
| 2998 | 2998 | case 0x7: |
| 2999 | - tcg_gen_xori_tl(cpu_T[1], cpu_T[1], -1); | |
| 3000 | - tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 2999 | + tcg_gen_xori_tl(cpu_tmp0, cpu_T[1], -1); | |
| 3000 | + tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 3001 | 3001 | if (xop & 0x10) |
| 3002 | 3002 | gen_op_logic_cc(cpu_T[0]); |
| 3003 | 3003 | break; |
| ... | ... | @@ -3006,8 +3006,8 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3006 | 3006 | gen_op_addx_cc(cpu_T[0], cpu_T[0], cpu_T[1]); |
| 3007 | 3007 | else { |
| 3008 | 3008 | gen_mov_reg_C(cpu_tmp0, cpu_psr); |
| 3009 | - tcg_gen_add_tl(cpu_T[1], cpu_T[1], cpu_tmp0); | |
| 3010 | - tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 3009 | + tcg_gen_add_tl(cpu_tmp0, cpu_T[1], cpu_tmp0); | |
| 3010 | + tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 3011 | 3011 | } |
| 3012 | 3012 | break; |
| 3013 | 3013 | #ifdef TARGET_SPARC64 |
| ... | ... | @@ -3030,8 +3030,8 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3030 | 3030 | gen_op_subx_cc(cpu_T[0], cpu_T[0], cpu_T[1]); |
| 3031 | 3031 | else { |
| 3032 | 3032 | gen_mov_reg_C(cpu_tmp0, cpu_psr); |
| 3033 | - tcg_gen_add_tl(cpu_T[1], cpu_T[1], cpu_tmp0); | |
| 3034 | - tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 3033 | + tcg_gen_add_tl(cpu_tmp0, cpu_T[1], cpu_tmp0); | |
| 3034 | + tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 3035 | 3035 | } |
| 3036 | 3036 | break; |
| 3037 | 3037 | #ifdef TARGET_SPARC64 |
| ... | ... | @@ -3080,18 +3080,18 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3080 | 3080 | break; |
| 3081 | 3081 | #ifndef TARGET_SPARC64 |
| 3082 | 3082 | case 0x25: /* sll */ |
| 3083 | - tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 0x1f); | |
| 3084 | - tcg_gen_shl_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 3083 | + tcg_gen_andi_tl(cpu_tmp0, cpu_T[1], 0x1f); | |
| 3084 | + tcg_gen_shl_tl(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 3085 | 3085 | gen_movl_TN_reg(rd, cpu_T[0]); |
| 3086 | 3086 | break; |
| 3087 | 3087 | case 0x26: /* srl */ |
| 3088 | - tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 0x1f); | |
| 3089 | - tcg_gen_shr_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 3088 | + tcg_gen_andi_tl(cpu_tmp0, cpu_T[1], 0x1f); | |
| 3089 | + tcg_gen_shr_tl(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 3090 | 3090 | gen_movl_TN_reg(rd, cpu_T[0]); |
| 3091 | 3091 | break; |
| 3092 | 3092 | case 0x27: /* sra */ |
| 3093 | - tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 0x1f); | |
| 3094 | - tcg_gen_sar_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 3093 | + tcg_gen_andi_tl(cpu_tmp0, cpu_T[1], 0x1f); | |
| 3094 | + tcg_gen_sar_tl(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 3095 | 3095 | gen_movl_TN_reg(rd, cpu_T[0]); |
| 3096 | 3096 | break; |
| 3097 | 3097 | #endif |
| ... | ... | @@ -3451,12 +3451,12 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3451 | 3451 | tcg_const_tl(0), l1); |
| 3452 | 3452 | if (IS_IMM) { /* immediate */ |
| 3453 | 3453 | rs2 = GET_FIELD_SPs(insn, 0, 10); |
| 3454 | - tcg_gen_movi_tl(cpu_T[1], (int)rs2); | |
| 3454 | + tcg_gen_movi_tl(cpu_T[0], (int)rs2); | |
| 3455 | 3455 | } else { |
| 3456 | 3456 | rs2 = GET_FIELD_SP(insn, 0, 4); |
| 3457 | - gen_movl_reg_TN(rs2, cpu_T[1]); | |
| 3457 | + gen_movl_reg_TN(rs2, cpu_T[0]); | |
| 3458 | 3458 | } |
| 3459 | - gen_movl_TN_reg(rd, cpu_T[1]); | |
| 3459 | + gen_movl_TN_reg(rd, cpu_T[0]); | |
| 3460 | 3460 | gen_set_label(l1); |
| 3461 | 3461 | tcg_gen_discard_tl(r_cond); |
| 3462 | 3462 | break; |
| ... | ... | @@ -3494,12 +3494,12 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3494 | 3494 | tcg_const_tl(0), l1); |
| 3495 | 3495 | if (IS_IMM) { /* immediate */ |
| 3496 | 3496 | rs2 = GET_FIELD_SPs(insn, 0, 9); |
| 3497 | - tcg_gen_movi_tl(cpu_T[1], (int)rs2); | |
| 3497 | + tcg_gen_movi_tl(cpu_T[0], (int)rs2); | |
| 3498 | 3498 | } else { |
| 3499 | 3499 | rs2 = GET_FIELD_SP(insn, 0, 4); |
| 3500 | - gen_movl_reg_TN(rs2, cpu_T[1]); | |
| 3500 | + gen_movl_reg_TN(rs2, cpu_T[0]); | |
| 3501 | 3501 | } |
| 3502 | - gen_movl_TN_reg(rd, cpu_T[1]); | |
| 3502 | + gen_movl_TN_reg(rd, cpu_T[0]); | |
| 3503 | 3503 | gen_set_label(l1); |
| 3504 | 3504 | break; |
| 3505 | 3505 | } |
| ... | ... | @@ -3965,8 +3965,8 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3965 | 3965 | case 0x38: /* jmpl */ |
| 3966 | 3966 | { |
| 3967 | 3967 | if (rd != 0) { |
| 3968 | - tcg_gen_movi_tl(cpu_T[1], dc->pc); | |
| 3969 | - gen_movl_TN_reg(rd, cpu_T[1]); | |
| 3968 | + tcg_gen_movi_tl(cpu_tmp0, dc->pc); | |
| 3969 | + gen_movl_TN_reg(rd, cpu_tmp0); | |
| 3970 | 3970 | } |
| 3971 | 3971 | gen_mov_pc_npc(dc, cpu_T[2]); |
| 3972 | 3972 | tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(3)); |
| ... | ... | @@ -4081,9 +4081,9 @@ static void disas_sparc_insn(DisasContext * dc) |
| 4081 | 4081 | tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(7)); |
| 4082 | 4082 | ABI32_MASK(cpu_T[0]); |
| 4083 | 4083 | tcg_gen_qemu_ld64(cpu_tmp64, cpu_T[0], dc->mem_idx); |
| 4084 | - tcg_gen_trunc_i64_tl(cpu_T[0], cpu_tmp64); | |
| 4085 | - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 0xffffffffULL); | |
| 4086 | - gen_movl_TN_reg(rd + 1, cpu_T[0]); | |
| 4084 | + tcg_gen_trunc_i64_tl(cpu_tmp0, cpu_tmp64); | |
| 4085 | + tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, 0xffffffffULL); | |
| 4086 | + gen_movl_TN_reg(rd + 1, cpu_tmp0); | |
| 4087 | 4087 | tcg_gen_shri_i64(cpu_tmp64, cpu_tmp64, 32); |
| 4088 | 4088 | tcg_gen_trunc_i64_tl(cpu_T[1], cpu_tmp64); |
| 4089 | 4089 | tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 0xffffffffULL); |
| ... | ... | @@ -4151,8 +4151,8 @@ static void disas_sparc_insn(DisasContext * dc) |
| 4151 | 4151 | if (rd & 1) |
| 4152 | 4152 | goto illegal_insn; |
| 4153 | 4153 | tcg_gen_helper_0_2(helper_check_align, cpu_T[0], tcg_const_i32(7)); |
| 4154 | - gen_ldda_asi(cpu_T[0], cpu_T[1], cpu_T[0], insn); | |
| 4155 | - gen_movl_TN_reg(rd + 1, cpu_T[0]); | |
| 4154 | + gen_ldda_asi(cpu_tmp0, cpu_T[1], cpu_T[0], insn); | |
| 4155 | + gen_movl_TN_reg(rd + 1, cpu_tmp0); | |
| 4156 | 4156 | break; |
| 4157 | 4157 | case 0x19: /* load signed byte alternate */ |
| 4158 | 4158 | #ifndef TARGET_SPARC64 | ... | ... |