@@ -192,6 +192,8 @@ var optab = []Optab{
192
192
{AADD , C_BITCON , C_RSP , C_NONE , C_RSP , 62 , 8 , 0 , 0 , 0 },
193
193
{AADD , C_BITCON , C_NONE , C_NONE , C_RSP , 62 , 8 , 0 , 0 , 0 },
194
194
{ACMP , C_BITCON , C_RSP , C_NONE , C_NONE , 62 , 8 , 0 , 0 , 0 },
195
+ {AADD , C_ADDCON2 , C_RSP , C_NONE , C_RSP , 48 , 8 , 0 , 0 , 0 },
196
+ {AADD , C_ADDCON2 , C_NONE , C_NONE , C_RSP , 48 , 8 , 0 , 0 , 0 },
195
197
{AADD , C_VCON , C_RSP , C_NONE , C_RSP , 13 , 8 , 0 , LFROM , 0 },
196
198
{AADD , C_VCON , C_NONE , C_NONE , C_RSP , 13 , 8 , 0 , LFROM , 0 },
197
199
{ACMP , C_VCON , C_REG , C_NONE , C_NONE , 13 , 8 , 0 , LFROM , 0 },
@@ -1046,6 +1048,7 @@ func (c *ctxt7) addpool(p *obj.Prog, a *obj.Addr) {
1046
1048
C_NOREG4K ,
1047
1049
C_LOREG ,
1048
1050
C_LACON ,
1051
+ C_ADDCON2 ,
1049
1052
C_LCON ,
1050
1053
C_VCON :
1051
1054
if a .Name == obj .NAME_EXTERN {
@@ -1537,6 +1540,10 @@ func (c *ctxt7) aclass(a *obj.Addr) int {
1537
1540
return C_BITCON
1538
1541
}
1539
1542
1543
+ if 0 <= v && v <= 0xffffff {
1544
+ return C_ADDCON2
1545
+ }
1546
+
1540
1547
if uint64 (v ) == uint64 (uint32 (v )) || v == int64 (int32 (v )) {
1541
1548
return C_LCON
1542
1549
}
@@ -1595,7 +1602,12 @@ func (c *ctxt7) oplook(p *obj.Prog) *Optab {
1595
1602
}
1596
1603
a1 = int (p .From .Class )
1597
1604
if a1 == 0 {
1598
- a1 = c .aclass (& p .From ) + 1
1605
+ a0 := c .aclass (& p .From )
1606
+ // do not break C_ADDCON2 when S bit is set
1607
+ if (p .As == AADDS || p .As == AADDSW || p .As == ASUBS || p .As == ASUBSW ) && a0 == C_ADDCON2 {
1608
+ a0 = C_LCON
1609
+ }
1610
+ a1 = a0 + 1
1599
1611
p .From .Class = int8 (a1 )
1600
1612
}
1601
1613
@@ -1681,8 +1693,13 @@ func cmp(a int, b int) bool {
1681
1693
return true
1682
1694
}
1683
1695
1696
+ case C_ADDCON2 :
1697
+ if b == C_ZCON || b == C_ADDCON || b == C_ADDCON0 {
1698
+ return true
1699
+ }
1700
+
1684
1701
case C_LCON :
1685
- if b == C_ZCON || b == C_BITCON || b == C_ADDCON || b == C_ADDCON0 || b == C_ABCON || b == C_ABCON0 || b == C_MBCON || b == C_MOVCON {
1702
+ if b == C_ZCON || b == C_BITCON || b == C_ADDCON || b == C_ADDCON0 || b == C_ABCON || b == C_ABCON0 || b == C_MBCON || b == C_MOVCON || b == C_ADDCON2 {
1686
1703
return true
1687
1704
}
1688
1705
@@ -3474,6 +3491,19 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
3474
3491
}
3475
3492
o1 |= 0x1c1 << 21 | uint32 (rs & 31 )<< 16 | uint32 (rb & 31 )<< 5 | uint32 (rt & 31 )
3476
3493
3494
+ case 48 : /* ADD $C_ADDCON2, Rm, Rd */
3495
+ op := c .opirr (p , p .As )
3496
+ if op & Sbit != 0 {
3497
+ c .ctxt .Diag ("can not break addition/subtraction when S bit is set" , p )
3498
+ }
3499
+ rt := int (p .To .Reg )
3500
+ r := int (p .Reg )
3501
+ if r == 0 {
3502
+ r = rt
3503
+ }
3504
+ o1 = c .oaddi (p , int32 (op ), int32 (c .regoff (& p .From )) & 0x000fff , r , rt )
3505
+ o2 = c .oaddi (p , int32 (op ), int32 (c .regoff (& p .From )) & 0xfff000 , rt , rt )
3506
+
3477
3507
case 50 : /* sys/sysl */
3478
3508
o1 = c .opirr (p , p .As )
3479
3509
0 commit comments