@@ -2581,9 +2581,18 @@ class G4_Areg final : public G4_VarBase
2581
2581
void *operator new (size_t sz, Mem_Manager& m) {return m.alloc (sz);}
2582
2582
void emit (std::ostream& output, bool symbolreg=false );
2583
2583
2584
- bool isNullReg () const { return getArchRegType () == AREG_NULL; }
2585
- bool isFlag () const { return getArchRegType () == AREG_F0 ||
2586
- getArchRegType () == AREG_F1; }
2584
+ bool isNullReg () const { return getArchRegType () == AREG_NULL; }
2585
+ bool isFlag () const
2586
+ {
2587
+ switch (getArchRegType ())
2588
+ {
2589
+ case AREG_F0:
2590
+ case AREG_F1:
2591
+ return true ;
2592
+ default :
2593
+ return false ;
2594
+ }
2595
+ }
2587
2596
bool isIpReg () const { return getArchRegType () == AREG_IP; }
2588
2597
bool isA0 () const { return getArchRegType () == AREG_A0; }
2589
2598
bool isNReg () const { return getArchRegType () == AREG_N0 ||
@@ -2604,6 +2613,12 @@ class G4_Areg final : public G4_VarBase
2604
2613
{
2605
2614
unsigned short rNum = UNDEFINED_SHORT;
2606
2615
valid = true ;
2616
+
2617
+ if (isFlag ())
2618
+ {
2619
+ return getFlagNum ();
2620
+ }
2621
+
2607
2622
switch (getArchRegType ()) {
2608
2623
case AREG_NULL:
2609
2624
case AREG_A0:
@@ -2615,15 +2630,13 @@ class G4_Areg final : public G4_VarBase
2615
2630
case AREG_CR0:
2616
2631
case AREG_TM0:
2617
2632
case AREG_N0:
2618
- case AREG_F0:
2619
2633
case AREG_IP:
2620
2634
case AREG_TDR0:
2621
2635
case AREG_SP:
2622
2636
rNum = 0 ;
2623
2637
break ;
2624
2638
case AREG_ACC1:
2625
2639
case AREG_N1:
2626
- case AREG_F1:
2627
2640
rNum = 1 ;
2628
2641
break ;
2629
2642
default :
@@ -2643,6 +2656,20 @@ class G4_Areg final : public G4_VarBase
2643
2656
}
2644
2657
return rIndNum;
2645
2658
}
2659
+
2660
+ int getFlagNum () const
2661
+ {
2662
+ switch (getArchRegType ())
2663
+ {
2664
+ case AREG_F0:
2665
+ return 0 ;
2666
+ case AREG_F1:
2667
+ return 1 ;
2668
+ default :
2669
+ assert (false && " should only be called on flag ARF" );
2670
+ return -1 ;
2671
+ }
2672
+ }
2646
2673
};
2647
2674
2648
2675
class G4_Imm : public G4_Operand
@@ -3426,23 +3453,20 @@ class G4_Predicate final : public G4_Operand
3426
3453
control (ctrl), align16Control(PRED_ALIGN16_DEFAULT)
3427
3454
{
3428
3455
top_dcl = getBase ()->asRegVar ()->getDeclare ();
3429
-
3456
+ MUST_BE_TRUE (flag-> isFlag (), ERROR_INTERNAL_ARGUMENT);
3430
3457
if (getBase ()->asRegVar ()->getPhyReg ())
3431
3458
{
3432
3459
left_bound = srOff * 16 ;
3433
- MUST_BE_TRUE (flag-> isFlag (), ERROR_INTERNAL_ARGUMENT);
3460
+
3434
3461
byteOffset = srOff * 2 ;
3435
3462
3436
- if (getBase ()->asRegVar ()->getPhyReg ()->asAreg ()->getArchRegType () == AREG_F1)
3437
- {
3438
- left_bound += 32 ;
3439
- byteOffset += 4 ;
3440
- }
3463
+ auto flagNum = getBase ()->asRegVar ()->getPhyReg ()->asAreg ()->getFlagNum ();
3464
+ left_bound += flagNum * 32 ;
3465
+ byteOffset += flagNum * 4 ;
3441
3466
}
3442
3467
else
3443
3468
{
3444
3469
left_bound = 0 ;
3445
- MUST_BE_TRUE (flag->isFlag (), ERROR_INTERNAL_ARGUMENT);
3446
3470
byteOffset = 0 ;
3447
3471
}
3448
3472
}
@@ -3456,15 +3480,7 @@ class G4_Predicate final : public G4_Operand
3456
3480
unsigned short getRegOff ()
3457
3481
{
3458
3482
MUST_BE_TRUE (getBase ()->isAreg (), ERROR_INTERNAL_ARGUMENT);
3459
-
3460
- if (getBase ()->asRegVar ()->getPhyReg ()->asAreg ()->getArchRegType () == AREG_F0)
3461
- {
3462
- return 0 ;
3463
- }
3464
- else
3465
- {
3466
- return 1 ;
3467
- }
3483
+ return getBase ()->asRegVar ()->getPhyReg ()->asAreg ()->getFlagNum ();
3468
3484
}
3469
3485
3470
3486
G4_PredState getState () { return state; }
@@ -3549,20 +3565,19 @@ class G4_CondMod final : public G4_Operand
3549
3565
if (flag != nullptr )
3550
3566
{
3551
3567
top_dcl = getBase ()->asRegVar ()->getDeclare ();
3552
-
3568
+ MUST_BE_TRUE (flag-> isFlag (), ERROR_INTERNAL_ARGUMENT);
3553
3569
if (getBase ()->asRegVar ()->getPhyReg ())
3554
3570
{
3555
3571
left_bound = off * 16 ;
3556
- MUST_BE_TRUE (flag->isFlag (), ERROR_INTERNAL_ARGUMENT);
3557
3572
byteOffset = off * 2 ;
3558
- if (flag-> asAreg ()-> getArchRegType () == AREG_F1) {
3559
- left_bound += 32 ;
3560
- byteOffset += 4 ;
3561
- }
3573
+
3574
+ auto flagNum = getBase ()-> asRegVar ()-> getPhyReg ()-> asAreg ()-> getFlagNum () ;
3575
+ left_bound += flagNum * 32 ;
3576
+ byteOffset += flagNum * 4 ;
3562
3577
}
3563
- else {
3578
+ else
3579
+ {
3564
3580
left_bound = 0 ;
3565
- MUST_BE_TRUE (flag->isFlag (), ERROR_INTERNAL_ARGUMENT);
3566
3581
byteOffset = 0 ;
3567
3582
}
3568
3583
}
@@ -3573,18 +3588,11 @@ class G4_CondMod final : public G4_Operand
3573
3588
G4_CondMod (G4_CondMod &cMod);
3574
3589
void *operator new (size_t sz, Mem_Manager& m) {return m.alloc (sz);}
3575
3590
G4_CondModifier getMod () { return mod; }
3576
- unsigned short getRegOff () {
3591
+ unsigned short getRegOff () const
3592
+ {
3577
3593
MUST_BE_TRUE (getBase ()->isAreg (), ERROR_INTERNAL_ARGUMENT);
3578
3594
MUST_BE_TRUE (getBase ()->asRegVar ()->getPhyReg (), " getRegOff is called for non-PhyReg" );
3579
-
3580
- if (getBase ()->asRegVar ()->getPhyReg ()->asAreg ()->getArchRegType () == AREG_F0)
3581
- {
3582
- return 0 ;
3583
- }
3584
- else
3585
- {
3586
- return 1 ;
3587
- }
3595
+ return getBase ()->asRegVar ()->getPhyReg ()->asAreg ()->getFlagNum ();
3588
3596
}
3589
3597
unsigned short getSubRegOff () { return subRegOff; }
3590
3598
bool sameCondMod (G4_CondMod& prd);
@@ -3972,6 +3980,21 @@ class PhyRegPool
3972
3980
G4_Areg* getF1Reg () { return ARF_Table[AREG_F1]; }
3973
3981
G4_Areg* getTDRReg () { return ARF_Table[AREG_TDR0]; }
3974
3982
G4_Areg* getSPReg () { return ARF_Table[AREG_SP]; }
3983
+
3984
+ // map int to flag areg
3985
+ G4_Areg* getFlagAreg (int flagNum)
3986
+ {
3987
+ switch (flagNum)
3988
+ {
3989
+ case 0 :
3990
+ return getF0Reg ();
3991
+ case 1 :
3992
+ return getF1Reg ();
3993
+ default :
3994
+ assert (false && " unexpected flag register value" );
3995
+ return nullptr ;
3996
+ }
3997
+ }
3975
3998
};
3976
3999
3977
4000
inline int G4_INST::getNumSrc () const
0 commit comments