trans_fmemory.c.inc (4258B)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Copyright (c) 2021 Loongson Technology Corporation Limited 4 */ 5 6 static void maybe_nanbox_load(TCGv freg, MemOp mop) 7 { 8 if ((mop & MO_SIZE) == MO_32) { 9 gen_nanbox_s(freg, freg); 10 } 11 } 12 13 static bool gen_fload_i(DisasContext *ctx, arg_fr_i *a, MemOp mop) 14 { 15 TCGv addr = gpr_src(ctx, a->rj, EXT_NONE); 16 TCGv temp = NULL; 17 18 CHECK_FPE; 19 20 if (a->imm) { 21 temp = tcg_temp_new(); 22 tcg_gen_addi_tl(temp, addr, a->imm); 23 addr = temp; 24 } 25 26 tcg_gen_qemu_ld_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop); 27 maybe_nanbox_load(cpu_fpr[a->fd], mop); 28 29 if (temp) { 30 tcg_temp_free(temp); 31 } 32 33 return true; 34 } 35 36 static bool gen_fstore_i(DisasContext *ctx, arg_fr_i *a, MemOp mop) 37 { 38 TCGv addr = gpr_src(ctx, a->rj, EXT_NONE); 39 TCGv temp = NULL; 40 41 CHECK_FPE; 42 43 if (a->imm) { 44 temp = tcg_temp_new(); 45 tcg_gen_addi_tl(temp, addr, a->imm); 46 addr = temp; 47 } 48 49 tcg_gen_qemu_st_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop); 50 51 if (temp) { 52 tcg_temp_free(temp); 53 } 54 return true; 55 } 56 57 static bool gen_floadx(DisasContext *ctx, arg_frr *a, MemOp mop) 58 { 59 TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE); 60 TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE); 61 TCGv addr; 62 63 CHECK_FPE; 64 65 addr = tcg_temp_new(); 66 tcg_gen_add_tl(addr, src1, src2); 67 tcg_gen_qemu_ld_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop); 68 maybe_nanbox_load(cpu_fpr[a->fd], mop); 69 tcg_temp_free(addr); 70 71 return true; 72 } 73 74 static bool gen_fstorex(DisasContext *ctx, arg_frr *a, MemOp mop) 75 { 76 TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE); 77 TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE); 78 TCGv addr; 79 80 CHECK_FPE; 81 82 addr = tcg_temp_new(); 83 tcg_gen_add_tl(addr, src1, src2); 84 tcg_gen_qemu_st_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop); 85 tcg_temp_free(addr); 86 87 return true; 88 } 89 90 static bool gen_fload_gt(DisasContext *ctx, arg_frr *a, MemOp mop) 91 { 92 TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE); 93 TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE); 94 TCGv addr; 95 96 CHECK_FPE; 97 98 addr = tcg_temp_new(); 99 gen_helper_asrtgt_d(cpu_env, src1, src2); 100 tcg_gen_add_tl(addr, src1, src2); 101 tcg_gen_qemu_ld_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop); 102 maybe_nanbox_load(cpu_fpr[a->fd], mop); 103 tcg_temp_free(addr); 104 105 return true; 106 } 107 108 static bool gen_fstore_gt(DisasContext *ctx, arg_frr *a, MemOp mop) 109 { 110 TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE); 111 TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE); 112 TCGv addr; 113 114 CHECK_FPE; 115 116 addr = tcg_temp_new(); 117 gen_helper_asrtgt_d(cpu_env, src1, src2); 118 tcg_gen_add_tl(addr, src1, src2); 119 tcg_gen_qemu_st_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop); 120 tcg_temp_free(addr); 121 122 return true; 123 } 124 125 static bool gen_fload_le(DisasContext *ctx, arg_frr *a, MemOp mop) 126 { 127 TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE); 128 TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE); 129 TCGv addr; 130 131 CHECK_FPE; 132 133 addr = tcg_temp_new(); 134 gen_helper_asrtle_d(cpu_env, src1, src2); 135 tcg_gen_add_tl(addr, src1, src2); 136 tcg_gen_qemu_ld_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop); 137 maybe_nanbox_load(cpu_fpr[a->fd], mop); 138 tcg_temp_free(addr); 139 140 return true; 141 } 142 143 static bool gen_fstore_le(DisasContext *ctx, arg_frr *a, MemOp mop) 144 { 145 TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE); 146 TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE); 147 TCGv addr; 148 149 CHECK_FPE; 150 151 addr = tcg_temp_new(); 152 gen_helper_asrtle_d(cpu_env, src1, src2); 153 tcg_gen_add_tl(addr, src1, src2); 154 tcg_gen_qemu_st_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop); 155 tcg_temp_free(addr); 156 157 return true; 158 } 159 160 TRANS(fld_s, gen_fload_i, MO_TEUL) 161 TRANS(fst_s, gen_fstore_i, MO_TEUL) 162 TRANS(fld_d, gen_fload_i, MO_TEUQ) 163 TRANS(fst_d, gen_fstore_i, MO_TEUQ) 164 TRANS(fldx_s, gen_floadx, MO_TEUL) 165 TRANS(fldx_d, gen_floadx, MO_TEUQ) 166 TRANS(fstx_s, gen_fstorex, MO_TEUL) 167 TRANS(fstx_d, gen_fstorex, MO_TEUQ) 168 TRANS(fldgt_s, gen_fload_gt, MO_TEUL) 169 TRANS(fldgt_d, gen_fload_gt, MO_TEUQ) 170 TRANS(fldle_s, gen_fload_le, MO_TEUL) 171 TRANS(fldle_d, gen_fload_le, MO_TEUQ) 172 TRANS(fstgt_s, gen_fstore_gt, MO_TEUL) 173 TRANS(fstgt_d, gen_fstore_gt, MO_TEUQ) 174 TRANS(fstle_s, gen_fstore_le, MO_TEUL) 175 TRANS(fstle_d, gen_fstore_le, MO_TEUQ)