1*5c23704eSSong Gao/* SPDX-License-Identifier: GPL-2.0-or-later */ 2*5c23704eSSong Gao/* 3*5c23704eSSong Gao * Copyright (c) 2021 Loongson Technology Corporation Limited 4*5c23704eSSong Gao */ 5*5c23704eSSong Gao 6*5c23704eSSong Gaostatic bool gen_load(DisasContext *ctx, arg_rr_i *a, MemOp mop) 7*5c23704eSSong Gao{ 8*5c23704eSSong Gao TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE); 9*5c23704eSSong Gao TCGv addr = gpr_src(ctx, a->rj, EXT_NONE); 10*5c23704eSSong Gao 11*5c23704eSSong Gao addr = make_address_i(ctx, addr, a->imm); 12*5c23704eSSong Gao 13*5c23704eSSong Gao tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop); 14*5c23704eSSong Gao gen_set_gpr(a->rd, dest, EXT_NONE); 15*5c23704eSSong Gao return true; 16*5c23704eSSong Gao} 17*5c23704eSSong Gao 18*5c23704eSSong Gaostatic bool gen_store(DisasContext *ctx, arg_rr_i *a, MemOp mop) 19*5c23704eSSong Gao{ 20*5c23704eSSong Gao TCGv data = gpr_src(ctx, a->rd, EXT_NONE); 21*5c23704eSSong Gao TCGv addr = gpr_src(ctx, a->rj, EXT_NONE); 22*5c23704eSSong Gao 23*5c23704eSSong Gao addr = make_address_i(ctx, addr, a->imm); 24*5c23704eSSong Gao 25*5c23704eSSong Gao tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, mop); 26*5c23704eSSong Gao return true; 27*5c23704eSSong Gao} 28*5c23704eSSong Gao 29*5c23704eSSong Gaostatic bool gen_loadx(DisasContext *ctx, arg_rrr *a, MemOp mop) 30*5c23704eSSong Gao{ 31*5c23704eSSong Gao TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE); 32*5c23704eSSong Gao TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE); 33*5c23704eSSong Gao TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE); 34*5c23704eSSong Gao TCGv addr = make_address_x(ctx, src1, src2); 35*5c23704eSSong Gao 36*5c23704eSSong Gao tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop); 37*5c23704eSSong Gao gen_set_gpr(a->rd, dest, EXT_NONE); 38*5c23704eSSong Gao 39*5c23704eSSong Gao return true; 40*5c23704eSSong Gao} 41*5c23704eSSong Gao 42*5c23704eSSong Gaostatic bool gen_storex(DisasContext *ctx, arg_rrr *a, MemOp mop) 43*5c23704eSSong Gao{ 44*5c23704eSSong Gao TCGv data = gpr_src(ctx, a->rd, EXT_NONE); 45*5c23704eSSong Gao TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE); 46*5c23704eSSong Gao TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE); 47*5c23704eSSong Gao TCGv addr = make_address_x(ctx, src1, src2); 48*5c23704eSSong Gao 49*5c23704eSSong Gao tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, mop); 50*5c23704eSSong Gao 51*5c23704eSSong Gao return true; 52*5c23704eSSong Gao} 53*5c23704eSSong Gao 54*5c23704eSSong Gaostatic bool gen_load_gt(DisasContext *ctx, arg_rrr *a, MemOp mop) 55*5c23704eSSong Gao{ 56*5c23704eSSong Gao TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE); 57*5c23704eSSong Gao TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE); 58*5c23704eSSong Gao TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE); 59*5c23704eSSong Gao 60*5c23704eSSong Gao gen_helper_asrtgt_d(tcg_env, src1, src2); 61*5c23704eSSong Gao src1 = make_address_i(ctx, src1, 0); 62*5c23704eSSong Gao tcg_gen_qemu_ld_tl(dest, src1, ctx->mem_idx, mop); 63*5c23704eSSong Gao gen_set_gpr(a->rd, dest, EXT_NONE); 64*5c23704eSSong Gao 65*5c23704eSSong Gao return true; 66*5c23704eSSong Gao} 67*5c23704eSSong Gao 68*5c23704eSSong Gaostatic bool gen_load_le(DisasContext *ctx, arg_rrr *a, MemOp mop) 69*5c23704eSSong Gao{ 70*5c23704eSSong Gao TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE); 71*5c23704eSSong Gao TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE); 72*5c23704eSSong Gao TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE); 73*5c23704eSSong Gao 74*5c23704eSSong Gao gen_helper_asrtle_d(tcg_env, src1, src2); 75*5c23704eSSong Gao src1 = make_address_i(ctx, src1, 0); 76*5c23704eSSong Gao tcg_gen_qemu_ld_tl(dest, src1, ctx->mem_idx, mop); 77*5c23704eSSong Gao gen_set_gpr(a->rd, dest, EXT_NONE); 78*5c23704eSSong Gao 79*5c23704eSSong Gao return true; 80*5c23704eSSong Gao} 81*5c23704eSSong Gao 82*5c23704eSSong Gaostatic bool gen_store_gt(DisasContext *ctx, arg_rrr *a, MemOp mop) 83*5c23704eSSong Gao{ 84*5c23704eSSong Gao TCGv data = gpr_src(ctx, a->rd, EXT_NONE); 85*5c23704eSSong Gao TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE); 86*5c23704eSSong Gao TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE); 87*5c23704eSSong Gao 88*5c23704eSSong Gao gen_helper_asrtgt_d(tcg_env, src1, src2); 89*5c23704eSSong Gao src1 = make_address_i(ctx, src1, 0); 90*5c23704eSSong Gao tcg_gen_qemu_st_tl(data, src1, ctx->mem_idx, mop); 91*5c23704eSSong Gao 92*5c23704eSSong Gao return true; 93*5c23704eSSong Gao} 94*5c23704eSSong Gao 95*5c23704eSSong Gaostatic bool gen_store_le(DisasContext *ctx, arg_rrr *a, MemOp mop) 96*5c23704eSSong Gao{ 97*5c23704eSSong Gao TCGv data = gpr_src(ctx, a->rd, EXT_NONE); 98*5c23704eSSong Gao TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE); 99*5c23704eSSong Gao TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE); 100*5c23704eSSong Gao 101*5c23704eSSong Gao gen_helper_asrtle_d(tcg_env, src1, src2); 102*5c23704eSSong Gao src1 = make_address_i(ctx, src1, 0); 103*5c23704eSSong Gao tcg_gen_qemu_st_tl(data, src1, ctx->mem_idx, mop); 104*5c23704eSSong Gao 105*5c23704eSSong Gao return true; 106*5c23704eSSong Gao} 107*5c23704eSSong Gao 108*5c23704eSSong Gaostatic bool trans_preld(DisasContext *ctx, arg_preld *a) 109*5c23704eSSong Gao{ 110*5c23704eSSong Gao return true; 111*5c23704eSSong Gao} 112*5c23704eSSong Gao 113*5c23704eSSong Gaostatic bool trans_preldx(DisasContext *ctx, arg_preldx * a) 114*5c23704eSSong Gao{ 115*5c23704eSSong Gao return true; 116*5c23704eSSong Gao} 117*5c23704eSSong Gao 118*5c23704eSSong Gaostatic bool trans_dbar(DisasContext *ctx, arg_dbar * a) 119*5c23704eSSong Gao{ 120*5c23704eSSong Gao tcg_gen_mb(TCG_BAR_SC | TCG_MO_ALL); 121*5c23704eSSong Gao return true; 122*5c23704eSSong Gao} 123*5c23704eSSong Gao 124*5c23704eSSong Gaostatic bool trans_ibar(DisasContext *ctx, arg_ibar *a) 125*5c23704eSSong Gao{ 126*5c23704eSSong Gao ctx->base.is_jmp = DISAS_STOP; 127*5c23704eSSong Gao return true; 128*5c23704eSSong Gao} 129*5c23704eSSong Gao 130*5c23704eSSong Gaostatic bool gen_ldptr(DisasContext *ctx, arg_rr_i *a, MemOp mop) 131*5c23704eSSong Gao{ 132*5c23704eSSong Gao TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE); 133*5c23704eSSong Gao TCGv addr = gpr_src(ctx, a->rj, EXT_NONE); 134*5c23704eSSong Gao 135*5c23704eSSong Gao addr = make_address_i(ctx, addr, a->imm); 136*5c23704eSSong Gao 137*5c23704eSSong Gao tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop); 138*5c23704eSSong Gao gen_set_gpr(a->rd, dest, EXT_NONE); 139*5c23704eSSong Gao return true; 140*5c23704eSSong Gao} 141*5c23704eSSong Gao 142*5c23704eSSong Gaostatic bool gen_stptr(DisasContext *ctx, arg_rr_i *a, MemOp mop) 143*5c23704eSSong Gao{ 144*5c23704eSSong Gao TCGv data = gpr_src(ctx, a->rd, EXT_NONE); 145*5c23704eSSong Gao TCGv addr = gpr_src(ctx, a->rj, EXT_NONE); 146*5c23704eSSong Gao 147*5c23704eSSong Gao addr = make_address_i(ctx, addr, a->imm); 148*5c23704eSSong Gao 149*5c23704eSSong Gao tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, mop); 150*5c23704eSSong Gao return true; 151*5c23704eSSong Gao} 152*5c23704eSSong Gao 153*5c23704eSSong GaoTRANS(ld_b, ALL, gen_load, MO_SB) 154*5c23704eSSong GaoTRANS(ld_h, ALL, gen_load, MO_TESW) 155*5c23704eSSong GaoTRANS(ld_w, ALL, gen_load, MO_TESL) 156*5c23704eSSong GaoTRANS(ld_d, 64, gen_load, MO_TEUQ) 157*5c23704eSSong GaoTRANS(st_b, ALL, gen_store, MO_UB) 158*5c23704eSSong GaoTRANS(st_h, ALL, gen_store, MO_TEUW) 159*5c23704eSSong GaoTRANS(st_w, ALL, gen_store, MO_TEUL) 160*5c23704eSSong GaoTRANS(st_d, 64, gen_store, MO_TEUQ) 161*5c23704eSSong GaoTRANS(ld_bu, ALL, gen_load, MO_UB) 162*5c23704eSSong GaoTRANS(ld_hu, ALL, gen_load, MO_TEUW) 163*5c23704eSSong GaoTRANS(ld_wu, 64, gen_load, MO_TEUL) 164*5c23704eSSong GaoTRANS(ldx_b, 64, gen_loadx, MO_SB) 165*5c23704eSSong GaoTRANS(ldx_h, 64, gen_loadx, MO_TESW) 166*5c23704eSSong GaoTRANS(ldx_w, 64, gen_loadx, MO_TESL) 167*5c23704eSSong GaoTRANS(ldx_d, 64, gen_loadx, MO_TEUQ) 168*5c23704eSSong GaoTRANS(stx_b, 64, gen_storex, MO_UB) 169*5c23704eSSong GaoTRANS(stx_h, 64, gen_storex, MO_TEUW) 170*5c23704eSSong GaoTRANS(stx_w, 64, gen_storex, MO_TEUL) 171*5c23704eSSong GaoTRANS(stx_d, 64, gen_storex, MO_TEUQ) 172*5c23704eSSong GaoTRANS(ldx_bu, 64, gen_loadx, MO_UB) 173*5c23704eSSong GaoTRANS(ldx_hu, 64, gen_loadx, MO_TEUW) 174*5c23704eSSong GaoTRANS(ldx_wu, 64, gen_loadx, MO_TEUL) 175*5c23704eSSong GaoTRANS(ldptr_w, 64, gen_ldptr, MO_TESL) 176*5c23704eSSong GaoTRANS(stptr_w, 64, gen_stptr, MO_TEUL) 177*5c23704eSSong GaoTRANS(ldptr_d, 64, gen_ldptr, MO_TEUQ) 178*5c23704eSSong GaoTRANS(stptr_d, 64, gen_stptr, MO_TEUQ) 179*5c23704eSSong GaoTRANS(ldgt_b, 64, gen_load_gt, MO_SB) 180*5c23704eSSong GaoTRANS(ldgt_h, 64, gen_load_gt, MO_TESW) 181*5c23704eSSong GaoTRANS(ldgt_w, 64, gen_load_gt, MO_TESL) 182*5c23704eSSong GaoTRANS(ldgt_d, 64, gen_load_gt, MO_TEUQ) 183*5c23704eSSong GaoTRANS(ldle_b, 64, gen_load_le, MO_SB) 184*5c23704eSSong GaoTRANS(ldle_h, 64, gen_load_le, MO_TESW) 185*5c23704eSSong GaoTRANS(ldle_w, 64, gen_load_le, MO_TESL) 186*5c23704eSSong GaoTRANS(ldle_d, 64, gen_load_le, MO_TEUQ) 187*5c23704eSSong GaoTRANS(stgt_b, 64, gen_store_gt, MO_UB) 188*5c23704eSSong GaoTRANS(stgt_h, 64, gen_store_gt, MO_TEUW) 189*5c23704eSSong GaoTRANS(stgt_w, 64, gen_store_gt, MO_TEUL) 190*5c23704eSSong GaoTRANS(stgt_d, 64, gen_store_gt, MO_TEUQ) 191*5c23704eSSong GaoTRANS(stle_b, 64, gen_store_le, MO_UB) 192*5c23704eSSong GaoTRANS(stle_h, 64, gen_store_le, MO_TEUW) 193*5c23704eSSong GaoTRANS(stle_w, 64, gen_store_le, MO_TEUL) 194*5c23704eSSong GaoTRANS(stle_d, 64, gen_store_le, MO_TEUQ) 195