@@ -308,27 +308,10 @@ static void gen_load_fp(DisasContext *ctx, int ra, int rb, int32_t disp16,
308
308
}
309
309
}
310
310
311
- static inline void gen_qemu_ldl_l (TCGv t0 , TCGv t1 , int flags )
311
+ static void gen_load_int (DisasContext * ctx , int ra , int rb , int32_t disp16 ,
312
+ MemOp op , bool clear , bool locked )
312
313
{
313
- tcg_gen_qemu_ld_i64 (t0 , t1 , flags , MO_LESL );
314
- tcg_gen_mov_i64 (cpu_lock_addr , t1 );
315
- tcg_gen_mov_i64 (cpu_lock_value , t0 );
316
- }
317
-
318
- static inline void gen_qemu_ldq_l (TCGv t0 , TCGv t1 , int flags )
319
- {
320
- tcg_gen_qemu_ld_i64 (t0 , t1 , flags , MO_LEQ );
321
- tcg_gen_mov_i64 (cpu_lock_addr , t1 );
322
- tcg_gen_mov_i64 (cpu_lock_value , t0 );
323
- }
324
-
325
- static inline void gen_load_mem (DisasContext * ctx ,
326
- void (* tcg_gen_qemu_load )(TCGv t0 , TCGv t1 ,
327
- int flags ),
328
- int ra , int rb , int32_t disp16 , bool fp ,
329
- bool clear )
330
- {
331
- TCGv tmp , addr , va ;
314
+ TCGv addr , dest ;
332
315
333
316
/* LDQ_U with ra $31 is UNOP. Other various loads are forms of
334
317
prefetches, which we can treat as nops. No worries about
@@ -337,22 +320,20 @@ static inline void gen_load_mem(DisasContext *ctx,
337
320
return ;
338
321
}
339
322
340
- tmp = tcg_temp_new ();
341
- addr = load_gpr (ctx , rb );
342
-
343
- if (disp16 ) {
344
- tcg_gen_addi_i64 (tmp , addr , disp16 );
345
- addr = tmp ;
346
- }
323
+ addr = tcg_temp_new ();
324
+ tcg_gen_addi_i64 (addr , load_gpr (ctx , rb ), disp16 );
347
325
if (clear ) {
348
- tcg_gen_andi_i64 (tmp , addr , ~0x7 );
349
- addr = tmp ;
326
+ tcg_gen_andi_i64 (addr , addr , ~0x7 );
350
327
}
351
328
352
- va = ( fp ? cpu_fir [ ra ] : ctx -> ir [ra ]) ;
353
- 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 );
354
331
355
- 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 );
356
337
}
357
338
358
339
static void gen_stf (DisasContext * ctx , TCGv src , TCGv addr )
@@ -393,30 +374,21 @@ static void gen_store_fp(DisasContext *ctx, int ra, int rb, int32_t disp16,
393
374
tcg_temp_free (addr );
394
375
}
395
376
396
- static inline void gen_store_mem (DisasContext * ctx ,
397
- void (* tcg_gen_qemu_store )(TCGv t0 , TCGv t1 ,
398
- int flags ),
399
- int ra , int rb , int32_t disp16 , bool fp ,
400
- bool clear )
377
+ static void gen_store_int (DisasContext * ctx , int ra , int rb , int32_t disp16 ,
378
+ MemOp op , bool clear )
401
379
{
402
- TCGv tmp , addr , va ;
403
-
404
- tmp = tcg_temp_new ();
405
- addr = load_gpr (ctx , rb );
380
+ TCGv addr , src ;
406
381
407
- if (disp16 ) {
408
- tcg_gen_addi_i64 (tmp , addr , disp16 );
409
- addr = tmp ;
410
- }
382
+ addr = tcg_temp_new ();
383
+ tcg_gen_addi_i64 (addr , load_gpr (ctx , rb ), disp16 );
411
384
if (clear ) {
412
- tcg_gen_andi_i64 (tmp , addr , ~0x7 );
413
- addr = tmp ;
385
+ tcg_gen_andi_i64 (addr , addr , ~0x7 );
414
386
}
415
387
416
- va = ( fp ? load_fpr ( ctx , ra ) : load_gpr (ctx , ra ) );
417
- 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 );
418
390
419
- tcg_temp_free (tmp );
391
+ tcg_temp_free (addr );
420
392
}
421
393
422
394
static DisasJumpType gen_store_conditional (DisasContext * ctx , int ra , int rb ,
@@ -1511,30 +1483,30 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
1511
1483
case 0x0A :
1512
1484
/* LDBU */
1513
1485
REQUIRE_AMASK (BWX );
1514
- 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 );
1515
1487
break ;
1516
1488
case 0x0B :
1517
1489
/* LDQ_U */
1518
- 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 );
1519
1491
break ;
1520
1492
case 0x0C :
1521
1493
/* LDWU */
1522
1494
REQUIRE_AMASK (BWX );
1523
- 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 );
1524
1496
break ;
1525
1497
case 0x0D :
1526
1498
/* STW */
1527
1499
REQUIRE_AMASK (BWX );
1528
- gen_store_mem (ctx , & tcg_gen_qemu_st16 , ra , rb , disp16 , 0 , 0 );
1500
+ gen_store_int (ctx , ra , rb , disp16 , MO_LEUW , 0 );
1529
1501
break ;
1530
1502
case 0x0E :
1531
1503
/* STB */
1532
1504
REQUIRE_AMASK (BWX );
1533
- gen_store_mem (ctx , & tcg_gen_qemu_st8 , ra , rb , disp16 , 0 , 0 );
1505
+ gen_store_int (ctx , ra , rb , disp16 , MO_UB , 0 );
1534
1506
break ;
1535
1507
case 0x0F :
1536
1508
/* STQ_U */
1537
- gen_store_mem (ctx , & tcg_gen_qemu_st64 , ra , rb , disp16 , 0 , 1 );
1509
+ gen_store_int (ctx , ra , rb , disp16 , MO_LEQ , 1 );
1538
1510
break ;
1539
1511
1540
1512
case 0x10 :
@@ -2489,11 +2461,15 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
2489
2461
break ;
2490
2462
case 0x2 :
2491
2463
/* Longword physical access with lock (hw_ldl_l/p) */
2492
- 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 );
2493
2467
break ;
2494
2468
case 0x3 :
2495
2469
/* Quadword physical access with lock (hw_ldq_l/p) */
2496
- 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 );
2497
2473
break ;
2498
2474
case 0x4 :
2499
2475
/* Longword virtual PTE fetch (hw_ldl/v) */
@@ -2846,27 +2822,27 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
2846
2822
break ;
2847
2823
case 0x28 :
2848
2824
/* LDL */
2849
- 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 );
2850
2826
break ;
2851
2827
case 0x29 :
2852
2828
/* LDQ */
2853
- 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 );
2854
2830
break ;
2855
2831
case 0x2A :
2856
2832
/* LDL_L */
2857
- 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 );
2858
2834
break ;
2859
2835
case 0x2B :
2860
2836
/* LDQ_L */
2861
- 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 );
2862
2838
break ;
2863
2839
case 0x2C :
2864
2840
/* STL */
2865
- gen_store_mem (ctx , & tcg_gen_qemu_st32 , ra , rb , disp16 , 0 , 0 );
2841
+ gen_store_int (ctx , ra , rb , disp16 , MO_LEUL , 0 );
2866
2842
break ;
2867
2843
case 0x2D :
2868
2844
/* STQ */
2869
- gen_store_mem (ctx , & tcg_gen_qemu_st64 , ra , rb , disp16 , 0 , 0 );
2845
+ gen_store_int (ctx , ra , rb , disp16 , MO_LEQ , 0 );
2870
2846
break ;
2871
2847
case 0x2E :
2872
2848
/* STL_C */
0 commit comments