target-mips: Use new qemu_ld/st opcodes

Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
Aurelien Jarno 2013-12-11 08:35:27 +01:00
parent 8589467f94
commit 5f68f5ae44

View file

@ -1606,12 +1606,12 @@ static void gen_ld(DisasContext *ctx, uint32_t opc,
switch (opc) { switch (opc) {
#if defined(TARGET_MIPS64) #if defined(TARGET_MIPS64)
case OPC_LWU: case OPC_LWU:
tcg_gen_qemu_ld32u(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUL);
gen_store_gpr(t0, rt); gen_store_gpr(t0, rt);
opn = "lwu"; opn = "lwu";
break; break;
case OPC_LD: case OPC_LD:
tcg_gen_qemu_ld64(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
gen_store_gpr(t0, rt); gen_store_gpr(t0, rt);
opn = "ld"; opn = "ld";
break; break;
@ -1629,7 +1629,7 @@ static void gen_ld(DisasContext *ctx, uint32_t opc,
#endif #endif
tcg_gen_shli_tl(t1, t1, 3); tcg_gen_shli_tl(t1, t1, 3);
tcg_gen_andi_tl(t0, t0, ~7); tcg_gen_andi_tl(t0, t0, ~7);
tcg_gen_qemu_ld64(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
tcg_gen_shl_tl(t0, t0, t1); tcg_gen_shl_tl(t0, t0, t1);
tcg_gen_xori_tl(t1, t1, 63); tcg_gen_xori_tl(t1, t1, 63);
t2 = tcg_const_tl(0x7fffffffffffffffull); t2 = tcg_const_tl(0x7fffffffffffffffull);
@ -1650,7 +1650,7 @@ static void gen_ld(DisasContext *ctx, uint32_t opc,
#endif #endif
tcg_gen_shli_tl(t1, t1, 3); tcg_gen_shli_tl(t1, t1, 3);
tcg_gen_andi_tl(t0, t0, ~7); tcg_gen_andi_tl(t0, t0, ~7);
tcg_gen_qemu_ld64(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
tcg_gen_shr_tl(t0, t0, t1); tcg_gen_shr_tl(t0, t0, t1);
tcg_gen_xori_tl(t1, t1, 63); tcg_gen_xori_tl(t1, t1, 63);
t2 = tcg_const_tl(0xfffffffffffffffeull); t2 = tcg_const_tl(0xfffffffffffffffeull);
@ -1667,7 +1667,7 @@ static void gen_ld(DisasContext *ctx, uint32_t opc,
t1 = tcg_const_tl(pc_relative_pc(ctx)); t1 = tcg_const_tl(pc_relative_pc(ctx));
gen_op_addr_add(ctx, t0, t0, t1); gen_op_addr_add(ctx, t0, t0, t1);
tcg_temp_free(t1); tcg_temp_free(t1);
tcg_gen_qemu_ld64(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
gen_store_gpr(t0, rt); gen_store_gpr(t0, rt);
opn = "ldpc"; opn = "ldpc";
break; break;
@ -1676,32 +1676,32 @@ static void gen_ld(DisasContext *ctx, uint32_t opc,
t1 = tcg_const_tl(pc_relative_pc(ctx)); t1 = tcg_const_tl(pc_relative_pc(ctx));
gen_op_addr_add(ctx, t0, t0, t1); gen_op_addr_add(ctx, t0, t0, t1);
tcg_temp_free(t1); tcg_temp_free(t1);
tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
gen_store_gpr(t0, rt); gen_store_gpr(t0, rt);
opn = "lwpc"; opn = "lwpc";
break; break;
case OPC_LW: case OPC_LW:
tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
gen_store_gpr(t0, rt); gen_store_gpr(t0, rt);
opn = "lw"; opn = "lw";
break; break;
case OPC_LH: case OPC_LH:
tcg_gen_qemu_ld16s(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW);
gen_store_gpr(t0, rt); gen_store_gpr(t0, rt);
opn = "lh"; opn = "lh";
break; break;
case OPC_LHU: case OPC_LHU:
tcg_gen_qemu_ld16u(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUW);
gen_store_gpr(t0, rt); gen_store_gpr(t0, rt);
opn = "lhu"; opn = "lhu";
break; break;
case OPC_LB: case OPC_LB:
tcg_gen_qemu_ld8s(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_SB);
gen_store_gpr(t0, rt); gen_store_gpr(t0, rt);
opn = "lb"; opn = "lb";
break; break;
case OPC_LBU: case OPC_LBU:
tcg_gen_qemu_ld8u(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_UB);
gen_store_gpr(t0, rt); gen_store_gpr(t0, rt);
opn = "lbu"; opn = "lbu";
break; break;
@ -1713,7 +1713,7 @@ static void gen_ld(DisasContext *ctx, uint32_t opc,
#endif #endif
tcg_gen_shli_tl(t1, t1, 3); tcg_gen_shli_tl(t1, t1, 3);
tcg_gen_andi_tl(t0, t0, ~3); tcg_gen_andi_tl(t0, t0, ~3);
tcg_gen_qemu_ld32u(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUL);
tcg_gen_shl_tl(t0, t0, t1); tcg_gen_shl_tl(t0, t0, t1);
tcg_gen_xori_tl(t1, t1, 31); tcg_gen_xori_tl(t1, t1, 31);
t2 = tcg_const_tl(0x7fffffffull); t2 = tcg_const_tl(0x7fffffffull);
@ -1735,7 +1735,7 @@ static void gen_ld(DisasContext *ctx, uint32_t opc,
#endif #endif
tcg_gen_shli_tl(t1, t1, 3); tcg_gen_shli_tl(t1, t1, 3);
tcg_gen_andi_tl(t0, t0, ~3); tcg_gen_andi_tl(t0, t0, ~3);
tcg_gen_qemu_ld32u(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUL);
tcg_gen_shr_tl(t0, t0, t1); tcg_gen_shr_tl(t0, t0, t1);
tcg_gen_xori_tl(t1, t1, 31); tcg_gen_xori_tl(t1, t1, 31);
t2 = tcg_const_tl(0xfffffffeull); t2 = tcg_const_tl(0xfffffffeull);
@ -1774,7 +1774,7 @@ static void gen_st (DisasContext *ctx, uint32_t opc, int rt,
switch (opc) { switch (opc) {
#if defined(TARGET_MIPS64) #if defined(TARGET_MIPS64)
case OPC_SD: case OPC_SD:
tcg_gen_qemu_st64(t1, t0, ctx->mem_idx); tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
opn = "sd"; opn = "sd";
break; break;
case OPC_SDL: case OPC_SDL:
@ -1789,15 +1789,15 @@ static void gen_st (DisasContext *ctx, uint32_t opc, int rt,
break; break;
#endif #endif
case OPC_SW: case OPC_SW:
tcg_gen_qemu_st32(t1, t0, ctx->mem_idx); tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
opn = "sw"; opn = "sw";
break; break;
case OPC_SH: case OPC_SH:
tcg_gen_qemu_st16(t1, t0, ctx->mem_idx); tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUW);
opn = "sh"; opn = "sh";
break; break;
case OPC_SB: case OPC_SB:
tcg_gen_qemu_st8(t1, t0, ctx->mem_idx); tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_8);
opn = "sb"; opn = "sb";
break; break;
case OPC_SWL: case OPC_SWL:
@ -1868,9 +1868,7 @@ static void gen_flt_ldst (DisasContext *ctx, uint32_t opc, int ft,
case OPC_LWC1: case OPC_LWC1:
{ {
TCGv_i32 fp0 = tcg_temp_new_i32(); TCGv_i32 fp0 = tcg_temp_new_i32();
tcg_gen_qemu_ld_i32(fp0, t0, ctx->mem_idx, MO_TESL);
tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx);
tcg_gen_trunc_tl_i32(fp0, t0);
gen_store_fpr32(fp0, ft); gen_store_fpr32(fp0, ft);
tcg_temp_free_i32(fp0); tcg_temp_free_i32(fp0);
} }
@ -1879,12 +1877,8 @@ static void gen_flt_ldst (DisasContext *ctx, uint32_t opc, int ft,
case OPC_SWC1: case OPC_SWC1:
{ {
TCGv_i32 fp0 = tcg_temp_new_i32(); TCGv_i32 fp0 = tcg_temp_new_i32();
TCGv t1 = tcg_temp_new();
gen_load_fpr32(fp0, ft); gen_load_fpr32(fp0, ft);
tcg_gen_extu_i32_tl(t1, fp0); tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL);
tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
tcg_temp_free(t1);
tcg_temp_free_i32(fp0); tcg_temp_free_i32(fp0);
} }
opn = "swc1"; opn = "swc1";
@ -1892,8 +1886,7 @@ static void gen_flt_ldst (DisasContext *ctx, uint32_t opc, int ft,
case OPC_LDC1: case OPC_LDC1:
{ {
TCGv_i64 fp0 = tcg_temp_new_i64(); TCGv_i64 fp0 = tcg_temp_new_i64();
tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx);
gen_store_fpr64(ctx, fp0, ft); gen_store_fpr64(ctx, fp0, ft);
tcg_temp_free_i64(fp0); tcg_temp_free_i64(fp0);
} }
@ -1902,9 +1895,8 @@ static void gen_flt_ldst (DisasContext *ctx, uint32_t opc, int ft,
case OPC_SDC1: case OPC_SDC1:
{ {
TCGv_i64 fp0 = tcg_temp_new_i64(); TCGv_i64 fp0 = tcg_temp_new_i64();
gen_load_fpr64(ctx, fp0, ft); gen_load_fpr64(ctx, fp0, ft);
tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx); tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
tcg_temp_free_i64(fp0); tcg_temp_free_i64(fp0);
} }
opn = "sdc1"; opn = "sdc1";
@ -8652,7 +8644,7 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc,
{ {
TCGv_i32 fp0 = tcg_temp_new_i32(); TCGv_i32 fp0 = tcg_temp_new_i32();
tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
tcg_gen_trunc_tl_i32(fp0, t0); tcg_gen_trunc_tl_i32(fp0, t0);
gen_store_fpr32(fp0, fd); gen_store_fpr32(fp0, fd);
tcg_temp_free_i32(fp0); tcg_temp_free_i32(fp0);
@ -8664,8 +8656,7 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc,
check_cp1_registers(ctx, fd); check_cp1_registers(ctx, fd);
{ {
TCGv_i64 fp0 = tcg_temp_new_i64(); TCGv_i64 fp0 = tcg_temp_new_i64();
tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx);
gen_store_fpr64(ctx, fp0, fd); gen_store_fpr64(ctx, fp0, fd);
tcg_temp_free_i64(fp0); tcg_temp_free_i64(fp0);
} }
@ -8677,7 +8668,7 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc,
{ {
TCGv_i64 fp0 = tcg_temp_new_i64(); TCGv_i64 fp0 = tcg_temp_new_i64();
tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx); tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
gen_store_fpr64(ctx, fp0, fd); gen_store_fpr64(ctx, fp0, fd);
tcg_temp_free_i64(fp0); tcg_temp_free_i64(fp0);
} }
@ -8687,13 +8678,9 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc,
check_cop1x(ctx); check_cop1x(ctx);
{ {
TCGv_i32 fp0 = tcg_temp_new_i32(); TCGv_i32 fp0 = tcg_temp_new_i32();
TCGv t1 = tcg_temp_new();
gen_load_fpr32(fp0, fs); gen_load_fpr32(fp0, fs);
tcg_gen_extu_i32_tl(t1, fp0); tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL);
tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
tcg_temp_free_i32(fp0); tcg_temp_free_i32(fp0);
tcg_temp_free(t1);
} }
opn = "swxc1"; opn = "swxc1";
store = 1; store = 1;
@ -8703,9 +8690,8 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc,
check_cp1_registers(ctx, fs); check_cp1_registers(ctx, fs);
{ {
TCGv_i64 fp0 = tcg_temp_new_i64(); TCGv_i64 fp0 = tcg_temp_new_i64();
gen_load_fpr64(ctx, fp0, fs); gen_load_fpr64(ctx, fp0, fs);
tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx); tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
tcg_temp_free_i64(fp0); tcg_temp_free_i64(fp0);
} }
opn = "sdxc1"; opn = "sdxc1";
@ -8716,9 +8702,8 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc,
tcg_gen_andi_tl(t0, t0, ~0x7); tcg_gen_andi_tl(t0, t0, ~0x7);
{ {
TCGv_i64 fp0 = tcg_temp_new_i64(); TCGv_i64 fp0 = tcg_temp_new_i64();
gen_load_fpr64(ctx, fp0, fs); gen_load_fpr64(ctx, fp0, fs);
tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx); tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
tcg_temp_free_i64(fp0); tcg_temp_free_i64(fp0);
} }
opn = "suxc1"; opn = "suxc1";
@ -9286,30 +9271,30 @@ static void gen_mips16_save (DisasContext *ctx,
case 4: case 4:
gen_base_offset_addr(ctx, t0, 29, 12); gen_base_offset_addr(ctx, t0, 29, 12);
gen_load_gpr(t1, 7); gen_load_gpr(t1, 7);
tcg_gen_qemu_st32(t1, t0, ctx->mem_idx); tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
/* Fall through */ /* Fall through */
case 3: case 3:
gen_base_offset_addr(ctx, t0, 29, 8); gen_base_offset_addr(ctx, t0, 29, 8);
gen_load_gpr(t1, 6); gen_load_gpr(t1, 6);
tcg_gen_qemu_st32(t1, t0, ctx->mem_idx); tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
/* Fall through */ /* Fall through */
case 2: case 2:
gen_base_offset_addr(ctx, t0, 29, 4); gen_base_offset_addr(ctx, t0, 29, 4);
gen_load_gpr(t1, 5); gen_load_gpr(t1, 5);
tcg_gen_qemu_st32(t1, t0, ctx->mem_idx); tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
/* Fall through */ /* Fall through */
case 1: case 1:
gen_base_offset_addr(ctx, t0, 29, 0); gen_base_offset_addr(ctx, t0, 29, 0);
gen_load_gpr(t1, 4); gen_load_gpr(t1, 4);
tcg_gen_qemu_st32(t1, t0, ctx->mem_idx); tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
} }
gen_load_gpr(t0, 29); gen_load_gpr(t0, 29);
#define DECR_AND_STORE(reg) do { \ #define DECR_AND_STORE(reg) do { \
tcg_gen_subi_tl(t0, t0, 4); \ tcg_gen_subi_tl(t0, t0, 4); \
gen_load_gpr(t1, reg); \ gen_load_gpr(t1, reg); \
tcg_gen_qemu_st32(t1, t0, ctx->mem_idx); \ tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL); \
} while (0) } while (0)
if (do_ra) { if (do_ra) {
@ -9407,10 +9392,10 @@ static void gen_mips16_restore (DisasContext *ctx,
tcg_gen_addi_tl(t0, cpu_gpr[29], framesize); tcg_gen_addi_tl(t0, cpu_gpr[29], framesize);
#define DECR_AND_LOAD(reg) do { \ #define DECR_AND_LOAD(reg) do { \
tcg_gen_subi_tl(t0, t0, 4); \ tcg_gen_subi_tl(t0, t0, 4); \
tcg_gen_qemu_ld32s(t1, t0, ctx->mem_idx); \ tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL); \
gen_store_gpr(t1, reg); \ gen_store_gpr(t1, reg); \
} while (0) } while (0)
if (do_ra) { if (do_ra) {
@ -10935,7 +10920,7 @@ static void gen_ldxs (DisasContext *ctx, int base, int index, int rd)
gen_op_addr_add(ctx, t0, t1, t0); gen_op_addr_add(ctx, t0, t1, t0);
} }
tcg_gen_qemu_ld32s(t1, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
gen_store_gpr(t1, rd); gen_store_gpr(t1, rd);
tcg_temp_free(t0); tcg_temp_free(t0);
@ -10964,21 +10949,21 @@ static void gen_ldst_pair (DisasContext *ctx, uint32_t opc, int rd,
generate_exception(ctx, EXCP_RI); generate_exception(ctx, EXCP_RI);
return; return;
} }
tcg_gen_qemu_ld32s(t1, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
gen_store_gpr(t1, rd); gen_store_gpr(t1, rd);
tcg_gen_movi_tl(t1, 4); tcg_gen_movi_tl(t1, 4);
gen_op_addr_add(ctx, t0, t0, t1); gen_op_addr_add(ctx, t0, t0, t1);
tcg_gen_qemu_ld32s(t1, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
gen_store_gpr(t1, rd+1); gen_store_gpr(t1, rd+1);
opn = "lwp"; opn = "lwp";
break; break;
case SWP: case SWP:
gen_load_gpr(t1, rd); gen_load_gpr(t1, rd);
tcg_gen_qemu_st32(t1, t0, ctx->mem_idx); tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
tcg_gen_movi_tl(t1, 4); tcg_gen_movi_tl(t1, 4);
gen_op_addr_add(ctx, t0, t0, t1); gen_op_addr_add(ctx, t0, t0, t1);
gen_load_gpr(t1, rd+1); gen_load_gpr(t1, rd+1);
tcg_gen_qemu_st32(t1, t0, ctx->mem_idx); tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
opn = "swp"; opn = "swp";
break; break;
#ifdef TARGET_MIPS64 #ifdef TARGET_MIPS64
@ -10987,21 +10972,21 @@ static void gen_ldst_pair (DisasContext *ctx, uint32_t opc, int rd,
generate_exception(ctx, EXCP_RI); generate_exception(ctx, EXCP_RI);
return; return;
} }
tcg_gen_qemu_ld64(t1, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ);
gen_store_gpr(t1, rd); gen_store_gpr(t1, rd);
tcg_gen_movi_tl(t1, 8); tcg_gen_movi_tl(t1, 8);
gen_op_addr_add(ctx, t0, t0, t1); gen_op_addr_add(ctx, t0, t0, t1);
tcg_gen_qemu_ld64(t1, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ);
gen_store_gpr(t1, rd+1); gen_store_gpr(t1, rd+1);
opn = "ldp"; opn = "ldp";
break; break;
case SDP: case SDP:
gen_load_gpr(t1, rd); gen_load_gpr(t1, rd);
tcg_gen_qemu_st64(t1, t0, ctx->mem_idx); tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
tcg_gen_movi_tl(t1, 8); tcg_gen_movi_tl(t1, 8);
gen_op_addr_add(ctx, t0, t0, t1); gen_op_addr_add(ctx, t0, t0, t1);
gen_load_gpr(t1, rd+1); gen_load_gpr(t1, rd+1);
tcg_gen_qemu_st64(t1, t0, ctx->mem_idx); tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
opn = "sdp"; opn = "sdp";
break; break;
#endif #endif
@ -12672,23 +12657,23 @@ static void gen_mipsdsp_ld(DisasContext *ctx, uint32_t opc,
switch (opc) { switch (opc) {
case OPC_LBUX: case OPC_LBUX:
tcg_gen_qemu_ld8u(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_UB);
gen_store_gpr(t0, rd); gen_store_gpr(t0, rd);
opn = "lbux"; opn = "lbux";
break; break;
case OPC_LHX: case OPC_LHX:
tcg_gen_qemu_ld16s(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW);
gen_store_gpr(t0, rd); gen_store_gpr(t0, rd);
opn = "lhx"; opn = "lhx";
break; break;
case OPC_LWX: case OPC_LWX:
tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
gen_store_gpr(t0, rd); gen_store_gpr(t0, rd);
opn = "lwx"; opn = "lwx";
break; break;
#if defined(TARGET_MIPS64) #if defined(TARGET_MIPS64)
case OPC_LDX: case OPC_LDX:
tcg_gen_qemu_ld64(t0, t0, ctx->mem_idx); tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
gen_store_gpr(t0, rd); gen_store_gpr(t0, rd);
opn = "ldx"; opn = "ldx";
break; break;