@@ -267,51 +267,51 @@ 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 inline void gen_qemu_ldl_l ( TCGv t0 , TCGv t1 , int flags )
294
+ static void gen_ldt ( DisasContext * ctx , TCGv dest , TCGv addr )
295
295
{
296
- tcg_gen_qemu_ld_i64 (t0 , t1 , flags , MO_LESL );
297
- tcg_gen_mov_i64 (cpu_lock_addr , t1 );
298
- tcg_gen_mov_i64 (cpu_lock_value , t0 );
296
+ tcg_gen_qemu_ld_i64 (dest , addr , ctx -> mem_idx , MO_LEQ );
299
297
}
300
298
301
- static inline void gen_qemu_ldq_l (TCGv t0 , TCGv t1 , int flags )
299
+ static void gen_load_fp (DisasContext * ctx , int ra , int rb , int32_t disp16 ,
300
+ void (* func )(DisasContext * , TCGv , TCGv ))
302
301
{
303
- tcg_gen_qemu_ld_i64 (t0 , t1 , flags , MO_LEQ );
304
- tcg_gen_mov_i64 (cpu_lock_addr , t1 );
305
- tcg_gen_mov_i64 (cpu_lock_value , t0 );
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
+ }
306
309
}
307
310
308
- static inline void gen_load_mem (DisasContext * ctx ,
309
- void (* tcg_gen_qemu_load )(TCGv t0 , TCGv t1 ,
310
- int flags ),
311
- int ra , int rb , int32_t disp16 , bool fp ,
312
- bool clear )
311
+ static void gen_load_int (DisasContext * ctx , int ra , int rb , int32_t disp16 ,
312
+ MemOp op , bool clear , bool locked )
313
313
{
314
- TCGv tmp , addr , va ;
314
+ TCGv addr , dest ;
315
315
316
316
/* LDQ_U with ra $31 is UNOP. Other various loads are forms of
317
317
prefetches, which we can treat as nops. No worries about
@@ -320,72 +320,75 @@ static inline void gen_load_mem(DisasContext *ctx,
320
320
return ;
321
321
}
322
322
323
- tmp = tcg_temp_new ();
324
- addr = load_gpr (ctx , rb );
325
-
326
- if (disp16 ) {
327
- tcg_gen_addi_i64 (tmp , addr , disp16 );
328
- addr = tmp ;
329
- }
323
+ addr = tcg_temp_new ();
324
+ tcg_gen_addi_i64 (addr , load_gpr (ctx , rb ), disp16 );
330
325
if (clear ) {
331
- tcg_gen_andi_i64 (tmp , addr , ~0x7 );
332
- addr = tmp ;
326
+ tcg_gen_andi_i64 (addr , addr , ~0x7 );
333
327
}
334
328
335
- va = ( fp ? cpu_fir [ ra ] : ctx -> ir [ra ]) ;
336
- tcg_gen_qemu_load ( va , addr , ctx -> mem_idx );
329
+ dest = ctx -> ir [ra ];
330
+ tcg_gen_qemu_ld_i64 ( dest , addr , ctx -> mem_idx , op );
337
331
338
- tcg_temp_free (tmp );
332
+ if (locked ) {
333
+ tcg_gen_mov_i64 (cpu_lock_addr , addr );
334
+ tcg_gen_mov_i64 (cpu_lock_value , dest );
335
+ }
336
+ tcg_temp_free (addr );
339
337
}
340
338
341
- static inline void gen_qemu_stf ( TCGv t0 , TCGv t1 , int flags )
339
+ static void gen_stf ( DisasContext * ctx , TCGv src , TCGv addr )
342
340
{
343
341
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 );
342
+ gen_helper_f_to_memory (tmp32 , addr );
343
+ tcg_gen_qemu_st_i32 (tmp32 , addr , ctx -> mem_idx , MO_LEUL );
346
344
tcg_temp_free_i32 (tmp32 );
347
345
}
348
346
349
- static inline void gen_qemu_stg ( TCGv t0 , TCGv t1 , int flags )
347
+ static void gen_stg ( DisasContext * ctx , TCGv src , TCGv addr )
350
348
{
351
349
TCGv tmp = tcg_temp_new ();
352
- gen_helper_g_to_memory (tmp , t0 );
353
- tcg_gen_qemu_st_i64 (tmp , t1 , flags , MO_LEQ );
350
+ gen_helper_g_to_memory (tmp , src );
351
+ tcg_gen_qemu_st_i64 (tmp , addr , ctx -> mem_idx , MO_LEQ );
354
352
tcg_temp_free (tmp );
355
353
}
356
354
357
- static inline void gen_qemu_sts ( TCGv t0 , TCGv t1 , int flags )
355
+ static void gen_sts ( DisasContext * ctx , TCGv src , TCGv addr )
358
356
{
359
357
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 );
358
+ gen_helper_s_to_memory (tmp32 , src );
359
+ tcg_gen_qemu_st_i32 (tmp32 , addr , ctx -> mem_idx , MO_LEUL );
362
360
tcg_temp_free_i32 (tmp32 );
363
361
}
364
362
365
- static inline void gen_store_mem (DisasContext * ctx ,
366
- void (* tcg_gen_qemu_store )(TCGv t0 , TCGv t1 ,
367
- int flags ),
368
- int ra , int rb , int32_t disp16 , bool fp ,
369
- bool clear )
363
+ static void gen_stt (DisasContext * ctx , TCGv src , TCGv addr )
370
364
{
371
- TCGv tmp , addr , va ;
365
+ tcg_gen_qemu_st_i64 (src , addr , ctx -> mem_idx , MO_LEQ );
366
+ }
372
367
373
- tmp = tcg_temp_new ();
374
- addr = load_gpr (ctx , rb );
368
+ static void gen_store_fp (DisasContext * ctx , int ra , int rb , int32_t disp16 ,
369
+ void (* func )(DisasContext * , TCGv , TCGv ))
370
+ {
371
+ TCGv addr = tcg_temp_new ();
372
+ tcg_gen_addi_i64 (addr , load_gpr (ctx , rb ), disp16 );
373
+ func (ctx , load_fpr (ctx , ra ), addr );
374
+ tcg_temp_free (addr );
375
+ }
375
376
376
- if (disp16 ) {
377
- tcg_gen_addi_i64 (tmp , addr , disp16 );
378
- addr = tmp ;
379
- }
377
+ static void gen_store_int (DisasContext * ctx , int ra , int rb , int32_t disp16 ,
378
+ MemOp op , bool clear )
379
+ {
380
+ TCGv addr , src ;
381
+
382
+ addr = tcg_temp_new ();
383
+ tcg_gen_addi_i64 (addr , load_gpr (ctx , rb ), disp16 );
380
384
if (clear ) {
381
- tcg_gen_andi_i64 (tmp , addr , ~0x7 );
382
- addr = tmp ;
385
+ tcg_gen_andi_i64 (addr , addr , ~0x7 );
383
386
}
384
387
385
- va = ( fp ? load_fpr ( ctx , ra ) : load_gpr (ctx , ra ) );
386
- tcg_gen_qemu_store ( va , addr , ctx -> mem_idx );
388
+ src = load_gpr (ctx , ra );
389
+ tcg_gen_qemu_st_i64 ( src , addr , ctx -> mem_idx , op );
387
390
388
- tcg_temp_free (tmp );
391
+ tcg_temp_free (addr );
389
392
}
390
393
391
394
static DisasJumpType gen_store_conditional (DisasContext * ctx , int ra , int rb ,
@@ -1480,30 +1483,30 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
1480
1483
case 0x0A :
1481
1484
/* LDBU */
1482
1485
REQUIRE_AMASK (BWX );
1483
- gen_load_mem (ctx , & tcg_gen_qemu_ld8u , ra , rb , disp16 , 0 , 0 );
1486
+ gen_load_int (ctx , ra , rb , disp16 , MO_UB , 0 , 0 );
1484
1487
break ;
1485
1488
case 0x0B :
1486
1489
/* LDQ_U */
1487
- gen_load_mem (ctx , & tcg_gen_qemu_ld64 , ra , rb , disp16 , 0 , 1 );
1490
+ gen_load_int (ctx , ra , rb , disp16 , MO_LEQ , 1 , 0 );
1488
1491
break ;
1489
1492
case 0x0C :
1490
1493
/* LDWU */
1491
1494
REQUIRE_AMASK (BWX );
1492
- gen_load_mem (ctx , & tcg_gen_qemu_ld16u , ra , rb , disp16 , 0 , 0 );
1495
+ gen_load_int (ctx , ra , rb , disp16 , MO_LEUW , 0 , 0 );
1493
1496
break ;
1494
1497
case 0x0D :
1495
1498
/* STW */
1496
1499
REQUIRE_AMASK (BWX );
1497
- gen_store_mem (ctx , & tcg_gen_qemu_st16 , ra , rb , disp16 , 0 , 0 );
1500
+ gen_store_int (ctx , ra , rb , disp16 , MO_LEUW , 0 );
1498
1501
break ;
1499
1502
case 0x0E :
1500
1503
/* STB */
1501
1504
REQUIRE_AMASK (BWX );
1502
- gen_store_mem (ctx , & tcg_gen_qemu_st8 , ra , rb , disp16 , 0 , 0 );
1505
+ gen_store_int (ctx , ra , rb , disp16 , MO_UB , 0 );
1503
1506
break ;
1504
1507
case 0x0F :
1505
1508
/* STQ_U */
1506
- gen_store_mem (ctx , & tcg_gen_qemu_st64 , ra , rb , disp16 , 0 , 1 );
1509
+ gen_store_int (ctx , ra , rb , disp16 , MO_LEQ , 1 );
1507
1510
break ;
1508
1511
1509
1512
case 0x10 :
@@ -2458,11 +2461,15 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
2458
2461
break ;
2459
2462
case 0x2 :
2460
2463
/* Longword physical access with lock (hw_ldl_l/p) */
2461
- gen_qemu_ldl_l (va , addr , MMU_PHYS_IDX );
2464
+ tcg_gen_qemu_ld_i64 (va , addr , MMU_PHYS_IDX , MO_LESL );
2465
+ tcg_gen_mov_i64 (cpu_lock_addr , addr );
2466
+ tcg_gen_mov_i64 (cpu_lock_value , va );
2462
2467
break ;
2463
2468
case 0x3 :
2464
2469
/* Quadword physical access with lock (hw_ldq_l/p) */
2465
- gen_qemu_ldq_l (va , addr , MMU_PHYS_IDX );
2470
+ tcg_gen_qemu_ld_i64 (va , addr , MMU_PHYS_IDX , MO_LEQ );
2471
+ tcg_gen_mov_i64 (cpu_lock_addr , addr );
2472
+ tcg_gen_mov_i64 (cpu_lock_value , va );
2466
2473
break ;
2467
2474
case 0x4 :
2468
2475
/* Longword virtual PTE fetch (hw_ldl/v) */
@@ -2776,66 +2783,66 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
2776
2783
case 0x20 :
2777
2784
/* LDF */
2778
2785
REQUIRE_FEN ;
2779
- gen_load_mem (ctx , & gen_qemu_ldf , ra , rb , disp16 , 1 , 0 );
2786
+ gen_load_fp (ctx , ra , rb , disp16 , gen_ldf );
2780
2787
break ;
2781
2788
case 0x21 :
2782
2789
/* LDG */
2783
2790
REQUIRE_FEN ;
2784
- gen_load_mem (ctx , & gen_qemu_ldg , ra , rb , disp16 , 1 , 0 );
2791
+ gen_load_fp (ctx , ra , rb , disp16 , gen_ldg );
2785
2792
break ;
2786
2793
case 0x22 :
2787
2794
/* LDS */
2788
2795
REQUIRE_FEN ;
2789
- gen_load_mem (ctx , & gen_qemu_lds , ra , rb , disp16 , 1 , 0 );
2796
+ gen_load_fp (ctx , ra , rb , disp16 , gen_lds );
2790
2797
break ;
2791
2798
case 0x23 :
2792
2799
/* LDT */
2793
2800
REQUIRE_FEN ;
2794
- gen_load_mem (ctx , & tcg_gen_qemu_ld64 , ra , rb , disp16 , 1 , 0 );
2801
+ gen_load_fp (ctx , ra , rb , disp16 , gen_ldt );
2795
2802
break ;
2796
2803
case 0x24 :
2797
2804
/* STF */
2798
2805
REQUIRE_FEN ;
2799
- gen_store_mem (ctx , & gen_qemu_stf , ra , rb , disp16 , 1 , 0 );
2806
+ gen_store_fp (ctx , ra , rb , disp16 , gen_stf );
2800
2807
break ;
2801
2808
case 0x25 :
2802
2809
/* STG */
2803
2810
REQUIRE_FEN ;
2804
- gen_store_mem (ctx , & gen_qemu_stg , ra , rb , disp16 , 1 , 0 );
2811
+ gen_store_fp (ctx , ra , rb , disp16 , gen_stg );
2805
2812
break ;
2806
2813
case 0x26 :
2807
2814
/* STS */
2808
2815
REQUIRE_FEN ;
2809
- gen_store_mem (ctx , & gen_qemu_sts , ra , rb , disp16 , 1 , 0 );
2816
+ gen_store_fp (ctx , ra , rb , disp16 , gen_sts );
2810
2817
break ;
2811
2818
case 0x27 :
2812
2819
/* STT */
2813
2820
REQUIRE_FEN ;
2814
- gen_store_mem (ctx , & tcg_gen_qemu_st64 , ra , rb , disp16 , 1 , 0 );
2821
+ gen_store_fp (ctx , ra , rb , disp16 , gen_stt );
2815
2822
break ;
2816
2823
case 0x28 :
2817
2824
/* LDL */
2818
- gen_load_mem (ctx , & tcg_gen_qemu_ld32s , ra , rb , disp16 , 0 , 0 );
2825
+ gen_load_int (ctx , ra , rb , disp16 , MO_LESL , 0 , 0 );
2819
2826
break ;
2820
2827
case 0x29 :
2821
2828
/* LDQ */
2822
- gen_load_mem (ctx , & tcg_gen_qemu_ld64 , ra , rb , disp16 , 0 , 0 );
2829
+ gen_load_int (ctx , ra , rb , disp16 , MO_LEQ , 0 , 0 );
2823
2830
break ;
2824
2831
case 0x2A :
2825
2832
/* LDL_L */
2826
- gen_load_mem (ctx , & gen_qemu_ldl_l , ra , rb , disp16 , 0 , 0 );
2833
+ gen_load_int (ctx , ra , rb , disp16 , MO_LESL , 0 , 1 );
2827
2834
break ;
2828
2835
case 0x2B :
2829
2836
/* LDQ_L */
2830
- gen_load_mem (ctx , & gen_qemu_ldq_l , ra , rb , disp16 , 0 , 0 );
2837
+ gen_load_int (ctx , ra , rb , disp16 , MO_LEQ , 0 , 1 );
2831
2838
break ;
2832
2839
case 0x2C :
2833
2840
/* STL */
2834
- gen_store_mem (ctx , & tcg_gen_qemu_st32 , ra , rb , disp16 , 0 , 0 );
2841
+ gen_store_int (ctx , ra , rb , disp16 , MO_LEUL , 0 );
2835
2842
break ;
2836
2843
case 0x2D :
2837
2844
/* STQ */
2838
- gen_store_mem (ctx , & tcg_gen_qemu_st64 , ra , rb , disp16 , 0 , 0 );
2845
+ gen_store_int (ctx , ra , rb , disp16 , MO_LEQ , 0 );
2839
2846
break ;
2840
2847
case 0x2E :
2841
2848
/* STL_C */
0 commit comments