Skip to content

Commit 4526353

Browse files
committed
target/alpha: Reorg fp memory operations
Pass in the context to each mini-helper, instead of an incorrectly named "flags". Separate gen_load_fp and gen_store_fp, away from the integer helpers. Reviewed-by: Philippe Mathieu-Daudé <[email protected]> Signed-off-by: Richard Henderson <[email protected]>
1 parent ee26ce6 commit 4526353

File tree

1 file changed

+57
-26
lines changed

1 file changed

+57
-26
lines changed

target/alpha/translate.c

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -267,30 +267,47 @@ static inline DisasJumpType gen_invalid(DisasContext *ctx)
267267
return gen_excp(ctx, EXCP_OPCDEC, 0);
268268
}
269269

270-
static inline void gen_qemu_ldf(TCGv t0, TCGv t1, int flags)
270+
static void gen_ldf(DisasContext *ctx, TCGv dest, TCGv addr)
271271
{
272272
TCGv_i32 tmp32 = tcg_temp_new_i32();
273-
tcg_gen_qemu_ld_i32(tmp32, t1, flags, MO_LEUL);
274-
gen_helper_memory_to_f(t0, tmp32);
273+
tcg_gen_qemu_ld_i32(tmp32, addr, ctx->mem_idx, MO_LEUL);
274+
gen_helper_memory_to_f(dest, tmp32);
275275
tcg_temp_free_i32(tmp32);
276276
}
277277

278-
static inline void gen_qemu_ldg(TCGv t0, TCGv t1, int flags)
278+
static void gen_ldg(DisasContext *ctx, TCGv dest, TCGv addr)
279279
{
280280
TCGv tmp = tcg_temp_new();
281-
tcg_gen_qemu_ld_i64(tmp, t1, flags, MO_LEQ);
282-
gen_helper_memory_to_g(t0, tmp);
281+
tcg_gen_qemu_ld_i64(tmp, addr, ctx->mem_idx, MO_LEQ);
282+
gen_helper_memory_to_g(dest, tmp);
283283
tcg_temp_free(tmp);
284284
}
285285

286-
static inline void gen_qemu_lds(TCGv t0, TCGv t1, int flags)
286+
static void gen_lds(DisasContext *ctx, TCGv dest, TCGv addr)
287287
{
288288
TCGv_i32 tmp32 = tcg_temp_new_i32();
289-
tcg_gen_qemu_ld_i32(tmp32, t1, flags, MO_LEUL);
290-
gen_helper_memory_to_s(t0, tmp32);
289+
tcg_gen_qemu_ld_i32(tmp32, addr, ctx->mem_idx, MO_LEUL);
290+
gen_helper_memory_to_s(dest, tmp32);
291291
tcg_temp_free_i32(tmp32);
292292
}
293293

294+
static void gen_ldt(DisasContext *ctx, TCGv dest, TCGv addr)
295+
{
296+
tcg_gen_qemu_ld_i64(dest, addr, ctx->mem_idx, MO_LEQ);
297+
}
298+
299+
static void gen_load_fp(DisasContext *ctx, int ra, int rb, int32_t disp16,
300+
void (*func)(DisasContext *, TCGv, TCGv))
301+
{
302+
/* Loads to $f31 are prefetches, which we can treat as nops. */
303+
if (likely(ra != 31)) {
304+
TCGv addr = tcg_temp_new();
305+
tcg_gen_addi_i64(addr, load_gpr(ctx, rb), disp16);
306+
func(ctx, cpu_fir[ra], addr);
307+
tcg_temp_free(addr);
308+
}
309+
}
310+
294311
static inline void gen_qemu_ldl_l(TCGv t0, TCGv t1, int flags)
295312
{
296313
tcg_gen_qemu_ld_i64(t0, t1, flags, MO_LESL);
@@ -338,30 +355,44 @@ static inline void gen_load_mem(DisasContext *ctx,
338355
tcg_temp_free(tmp);
339356
}
340357

341-
static inline void gen_qemu_stf(TCGv t0, TCGv t1, int flags)
358+
static void gen_stf(DisasContext *ctx, TCGv src, TCGv addr)
342359
{
343360
TCGv_i32 tmp32 = tcg_temp_new_i32();
344-
gen_helper_f_to_memory(tmp32, t0);
345-
tcg_gen_qemu_st_i32(tmp32, t1, flags, MO_LEUL);
361+
gen_helper_f_to_memory(tmp32, addr);
362+
tcg_gen_qemu_st_i32(tmp32, addr, ctx->mem_idx, MO_LEUL);
346363
tcg_temp_free_i32(tmp32);
347364
}
348365

349-
static inline void gen_qemu_stg(TCGv t0, TCGv t1, int flags)
366+
static void gen_stg(DisasContext *ctx, TCGv src, TCGv addr)
350367
{
351368
TCGv tmp = tcg_temp_new();
352-
gen_helper_g_to_memory(tmp, t0);
353-
tcg_gen_qemu_st_i64(tmp, t1, flags, MO_LEQ);
369+
gen_helper_g_to_memory(tmp, src);
370+
tcg_gen_qemu_st_i64(tmp, addr, ctx->mem_idx, MO_LEQ);
354371
tcg_temp_free(tmp);
355372
}
356373

357-
static inline void gen_qemu_sts(TCGv t0, TCGv t1, int flags)
374+
static void gen_sts(DisasContext *ctx, TCGv src, TCGv addr)
358375
{
359376
TCGv_i32 tmp32 = tcg_temp_new_i32();
360-
gen_helper_s_to_memory(tmp32, t0);
361-
tcg_gen_qemu_st_i32(tmp32, t1, flags, MO_LEUL);
377+
gen_helper_s_to_memory(tmp32, src);
378+
tcg_gen_qemu_st_i32(tmp32, addr, ctx->mem_idx, MO_LEUL);
362379
tcg_temp_free_i32(tmp32);
363380
}
364381

382+
static void gen_stt(DisasContext *ctx, TCGv src, TCGv addr)
383+
{
384+
tcg_gen_qemu_st_i64(src, addr, ctx->mem_idx, MO_LEQ);
385+
}
386+
387+
static void gen_store_fp(DisasContext *ctx, int ra, int rb, int32_t disp16,
388+
void (*func)(DisasContext *, TCGv, TCGv))
389+
{
390+
TCGv addr = tcg_temp_new();
391+
tcg_gen_addi_i64(addr, load_gpr(ctx, rb), disp16);
392+
func(ctx, load_fpr(ctx, ra), addr);
393+
tcg_temp_free(addr);
394+
}
395+
365396
static inline void gen_store_mem(DisasContext *ctx,
366397
void (*tcg_gen_qemu_store)(TCGv t0, TCGv t1,
367398
int flags),
@@ -2776,42 +2807,42 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
27762807
case 0x20:
27772808
/* LDF */
27782809
REQUIRE_FEN;
2779-
gen_load_mem(ctx, &gen_qemu_ldf, ra, rb, disp16, 1, 0);
2810+
gen_load_fp(ctx, ra, rb, disp16, gen_ldf);
27802811
break;
27812812
case 0x21:
27822813
/* LDG */
27832814
REQUIRE_FEN;
2784-
gen_load_mem(ctx, &gen_qemu_ldg, ra, rb, disp16, 1, 0);
2815+
gen_load_fp(ctx, ra, rb, disp16, gen_ldg);
27852816
break;
27862817
case 0x22:
27872818
/* LDS */
27882819
REQUIRE_FEN;
2789-
gen_load_mem(ctx, &gen_qemu_lds, ra, rb, disp16, 1, 0);
2820+
gen_load_fp(ctx, ra, rb, disp16, gen_lds);
27902821
break;
27912822
case 0x23:
27922823
/* LDT */
27932824
REQUIRE_FEN;
2794-
gen_load_mem(ctx, &tcg_gen_qemu_ld64, ra, rb, disp16, 1, 0);
2825+
gen_load_fp(ctx, ra, rb, disp16, gen_ldt);
27952826
break;
27962827
case 0x24:
27972828
/* STF */
27982829
REQUIRE_FEN;
2799-
gen_store_mem(ctx, &gen_qemu_stf, ra, rb, disp16, 1, 0);
2830+
gen_store_fp(ctx, ra, rb, disp16, gen_stf);
28002831
break;
28012832
case 0x25:
28022833
/* STG */
28032834
REQUIRE_FEN;
2804-
gen_store_mem(ctx, &gen_qemu_stg, ra, rb, disp16, 1, 0);
2835+
gen_store_fp(ctx, ra, rb, disp16, gen_stg);
28052836
break;
28062837
case 0x26:
28072838
/* STS */
28082839
REQUIRE_FEN;
2809-
gen_store_mem(ctx, &gen_qemu_sts, ra, rb, disp16, 1, 0);
2840+
gen_store_fp(ctx, ra, rb, disp16, gen_sts);
28102841
break;
28112842
case 0x27:
28122843
/* STT */
28132844
REQUIRE_FEN;
2814-
gen_store_mem(ctx, &tcg_gen_qemu_st64, ra, rb, disp16, 1, 0);
2845+
gen_store_fp(ctx, ra, rb, disp16, gen_stt);
28152846
break;
28162847
case 0x28:
28172848
/* LDL */

0 commit comments

Comments
 (0)