Revision 32b6c812
b/target-sparc/translate.c | ||
---|---|---|
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 |
Also available in: Unified diff