xref: /openbmc/qemu/target/loongarch/tcg/insn_trans/trans_memory.c.inc (revision 8188c3cda586dc445cac875b7d21c0c960dbe97e)
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