@@ -267,30 +267,47 @@ static inline DisasJumpType gen_invalid(DisasContext *ctx)
267
267
return gen_excp (ctx , EXCP_OPCDEC , 0 );
268
268
}
269
269
270
- static inline void gen_qemu_ldf ( TCGv t0 , TCGv t1 , int flags )
270
+ static void gen_ldf ( DisasContext * ctx , TCGv dest , TCGv addr )
271
271
{
272
272
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 );
275
275
tcg_temp_free_i32 (tmp32 );
276
276
}
277
277
278
- static inline void gen_qemu_ldg ( TCGv t0 , TCGv t1 , int flags )
278
+ static void gen_ldg ( DisasContext * ctx , TCGv dest , TCGv addr )
279
279
{
280
280
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 );
283
283
tcg_temp_free (tmp );
284
284
}
285
285
286
- static inline void gen_qemu_lds ( TCGv t0 , TCGv t1 , int flags )
286
+ static void gen_lds ( DisasContext * ctx , TCGv dest , TCGv addr )
287
287
{
288
288
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 );
291
291
tcg_temp_free_i32 (tmp32 );
292
292
}
293
293
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
+
294
311
static inline void gen_qemu_ldl_l (TCGv t0 , TCGv t1 , int flags )
295
312
{
296
313
tcg_gen_qemu_ld_i64 (t0 , t1 , flags , MO_LESL );
@@ -338,30 +355,44 @@ static inline void gen_load_mem(DisasContext *ctx,
338
355
tcg_temp_free (tmp );
339
356
}
340
357
341
- static inline void gen_qemu_stf ( TCGv t0 , TCGv t1 , int flags )
358
+ static void gen_stf ( DisasContext * ctx , TCGv src , TCGv addr )
342
359
{
343
360
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 );
346
363
tcg_temp_free_i32 (tmp32 );
347
364
}
348
365
349
- static inline void gen_qemu_stg ( TCGv t0 , TCGv t1 , int flags )
366
+ static void gen_stg ( DisasContext * ctx , TCGv src , TCGv addr )
350
367
{
351
368
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 );
354
371
tcg_temp_free (tmp );
355
372
}
356
373
357
- static inline void gen_qemu_sts ( TCGv t0 , TCGv t1 , int flags )
374
+ static void gen_sts ( DisasContext * ctx , TCGv src , TCGv addr )
358
375
{
359
376
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 );
362
379
tcg_temp_free_i32 (tmp32 );
363
380
}
364
381
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
+
365
396
static inline void gen_store_mem (DisasContext * ctx ,
366
397
void (* tcg_gen_qemu_store )(TCGv t0 , TCGv t1 ,
367
398
int flags ),
@@ -2776,42 +2807,42 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
2776
2807
case 0x20 :
2777
2808
/* LDF */
2778
2809
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 );
2780
2811
break ;
2781
2812
case 0x21 :
2782
2813
/* LDG */
2783
2814
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 );
2785
2816
break ;
2786
2817
case 0x22 :
2787
2818
/* LDS */
2788
2819
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 );
2790
2821
break ;
2791
2822
case 0x23 :
2792
2823
/* LDT */
2793
2824
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 );
2795
2826
break ;
2796
2827
case 0x24 :
2797
2828
/* STF */
2798
2829
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 );
2800
2831
break ;
2801
2832
case 0x25 :
2802
2833
/* STG */
2803
2834
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 );
2805
2836
break ;
2806
2837
case 0x26 :
2807
2838
/* STS */
2808
2839
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 );
2810
2841
break ;
2811
2842
case 0x27 :
2812
2843
/* STT */
2813
2844
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 );
2815
2846
break ;
2816
2847
case 0x28 :
2817
2848
/* LDL */
0 commit comments