@@ -88,6 +88,8 @@ var optab = []Optab{
88
88
{AADD , C_ADDCON , C_NONE , C_NONE , C_REG , 4 , 4 , 0 },
89
89
{AADD , C_UCON , C_REG , C_NONE , C_REG , 20 , 4 , 0 },
90
90
{AADD , C_UCON , C_NONE , C_NONE , C_REG , 20 , 4 , 0 },
91
+ {AADDIS , C_ADDCON , C_REG , C_NONE , C_REG , 20 , 4 , 0 },
92
+ {AADDIS , C_ADDCON , C_NONE , C_NONE , C_REG , 20 , 4 , 0 },
91
93
{AADD , C_LCON , C_REG , C_NONE , C_REG , 22 , 12 , 0 },
92
94
{AADD , C_LCON , C_NONE , C_NONE , C_REG , 22 , 12 , 0 },
93
95
{AADDC , C_REG , C_REG , C_NONE , C_REG , 2 , 4 , 0 },
@@ -104,6 +106,8 @@ var optab = []Optab{
104
106
{AANDCC , C_ANDCON , C_REG , C_NONE , C_REG , 58 , 4 , 0 },
105
107
{AANDCC , C_UCON , C_NONE , C_NONE , C_REG , 59 , 4 , 0 },
106
108
{AANDCC , C_UCON , C_REG , C_NONE , C_REG , 59 , 4 , 0 },
109
+ {AANDISCC , C_ANDCON , C_NONE , C_NONE , C_REG , 59 , 4 , 0 },
110
+ {AANDISCC , C_ANDCON , C_REG , C_NONE , C_REG , 59 , 4 , 0 },
107
111
{AANDCC , C_LCON , C_NONE , C_NONE , C_REG , 23 , 12 , 0 },
108
112
{AANDCC , C_LCON , C_REG , C_NONE , C_REG , 23 , 12 , 0 },
109
113
{AMULLW , C_REG , C_REG , C_NONE , C_REG , 2 , 4 , 0 },
@@ -124,6 +128,8 @@ var optab = []Optab{
124
128
{AOR , C_ANDCON , C_REG , C_NONE , C_REG , 58 , 4 , 0 },
125
129
{AOR , C_UCON , C_NONE , C_NONE , C_REG , 59 , 4 , 0 },
126
130
{AOR , C_UCON , C_REG , C_NONE , C_REG , 59 , 4 , 0 },
131
+ {AORIS , C_ANDCON , C_NONE , C_NONE , C_REG , 59 , 4 , 0 },
132
+ {AORIS , C_ANDCON , C_REG , C_NONE , C_REG , 59 , 4 , 0 },
127
133
{AOR , C_LCON , C_NONE , C_NONE , C_REG , 23 , 12 , 0 },
128
134
{AOR , C_LCON , C_REG , C_NONE , C_REG , 23 , 12 , 0 },
129
135
{ADIVW , C_REG , C_REG , C_NONE , C_REG , 2 , 4 , 0 }, /* op r1[,r2],r3 */
@@ -1522,7 +1528,6 @@ func buildop(ctxt *obj.Link) {
1522
1528
1523
1529
case AAND : /* logical op Rb,Rs,Ra; no literal */
1524
1530
opset (AANDN , r0 )
1525
-
1526
1531
opset (AANDNCC , r0 )
1527
1532
opset (AEQV , r0 )
1528
1533
opset (AEQVCC , r0 )
@@ -1677,9 +1682,12 @@ func buildop(ctxt *obj.Link) {
1677
1682
opset (ANEGV , r0 )
1678
1683
opset (ANEGVCC , r0 )
1679
1684
1680
- case AOR : /* or/xor Rb,Rs,Ra; ori/xori $uimm,Rs,Ra; oris/xoris $uimm,Rs,Ra */
1685
+ case AOR : /* or/xor Rb,Rs,Ra; ori/xori $uimm,Rs,R */
1681
1686
opset (AXOR , r0 )
1682
1687
1688
+ case AORIS : /* oris/xoris $uimm,Rs,Ra */
1689
+ opset (AXORIS , r0 )
1690
+
1683
1691
case ASLW :
1684
1692
opset (ASLWCC , r0 )
1685
1693
opset (ASRW , r0 )
@@ -1792,7 +1800,9 @@ func buildop(ctxt *obj.Link) {
1792
1800
opset (AFTSQRT , r0 )
1793
1801
1794
1802
case AADD ,
1795
- AANDCC , /* and. Rb,Rs,Ra; andi. $uimm,Rs,Ra; andis. $uimm,Rs,Ra */
1803
+ AADDIS ,
1804
+ AANDCC , /* and. Rb,Rs,Ra; andi. $uimm,Rs,Ra */
1805
+ AANDISCC ,
1796
1806
AFMOVSX ,
1797
1807
AFMOVSZ ,
1798
1808
ALSW ,
@@ -2624,7 +2634,7 @@ func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) {
2624
2634
2625
2635
//if(dlm) reloc(&p->from, p->pc, 0);
2626
2636
2627
- case 20 : /* add $ucon,,r */
2637
+ case 20 : /* add $ucon,,r | addis $addcon,r,r */
2628
2638
v := c .regoff (& p .From )
2629
2639
2630
2640
r := int (p .Reg )
@@ -2634,7 +2644,11 @@ func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) {
2634
2644
if p .As == AADD && (r0iszero == 0 /*TypeKind(100016)*/ && p .Reg == 0 || r0iszero != 0 /*TypeKind(100016)*/ && p .To .Reg == 0 ) {
2635
2645
c .ctxt .Diag ("literal operation on R0\n %v" , p )
2636
2646
}
2637
- o1 = AOP_IRR (c .opirr (- p .As ), uint32 (p .To .Reg ), uint32 (r ), uint32 (v )>> 16 )
2647
+ if p .As == AADDIS {
2648
+ o1 = AOP_IRR (c .opirr (p .As ), uint32 (p .To .Reg ), uint32 (r ), uint32 (v ))
2649
+ } else {
2650
+ o1 = AOP_IRR (c .opirr (AADDIS ), uint32 (p .To .Reg ), uint32 (r ), uint32 (v )>> 16 )
2651
+ }
2638
2652
2639
2653
case 22 : /* add $lcon,r1,r2 ==> cau+or+add */ /* could do add/sub more efficiently */
2640
2654
if p .To .Reg == REGTMP || p .Reg == REGTMP {
@@ -3063,14 +3077,23 @@ func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) {
3063
3077
}
3064
3078
o1 = LOP_IRR (c .opirr (p .As ), uint32 (p .To .Reg ), uint32 (r ), uint32 (v ))
3065
3079
3066
- case 59 : /* or/and $ucon,,r */
3080
+ case 59 : /* or/xor/ and $ucon,,r | oris/xoris/andis $addcon,r ,r */
3067
3081
v := c .regoff (& p .From )
3068
3082
3069
3083
r := int (p .Reg )
3070
3084
if r == 0 {
3071
3085
r = int (p .To .Reg )
3072
3086
}
3073
- o1 = LOP_IRR (c .opirr (- p .As ), uint32 (p .To .Reg ), uint32 (r ), uint32 (v )>> 16 ) /* oris, xoris, andis */
3087
+ switch p .As {
3088
+ case AOR :
3089
+ o1 = LOP_IRR (c .opirr (AORIS ), uint32 (p .To .Reg ), uint32 (r ), uint32 (v )>> 16 ) /* oris, xoris, andis. */
3090
+ case AXOR :
3091
+ o1 = LOP_IRR (c .opirr (AXORIS ), uint32 (p .To .Reg ), uint32 (r ), uint32 (v )>> 16 )
3092
+ case AANDCC :
3093
+ o1 = LOP_IRR (c .opirr (AANDCC ), uint32 (p .To .Reg ), uint32 (r ), uint32 (v )>> 16 )
3094
+ default :
3095
+ o1 = LOP_IRR (c .opirr (p .As ), uint32 (p .To .Reg ), uint32 (r ), uint32 (v ))
3096
+ }
3074
3097
3075
3098
case 60 : /* tw to,a,b */
3076
3099
r := int (c .regoff (& p .From ) & 31 )
@@ -4442,13 +4465,13 @@ func (c *ctxt9) opirr(a obj.As) uint32 {
4442
4465
return OPVCC (12 , 0 , 0 , 0 )
4443
4466
case AADDCCC :
4444
4467
return OPVCC (13 , 0 , 0 , 0 )
4445
- case - AADD :
4446
- return OPVCC (15 , 0 , 0 , 0 ) /* ADDIS/CAU */
4468
+ case AADDIS :
4469
+ return OPVCC (15 , 0 , 0 , 0 ) /* ADDIS */
4447
4470
4448
4471
case AANDCC :
4449
4472
return OPVCC (28 , 0 , 0 , 0 )
4450
- case - AANDCC :
4451
- return OPVCC (29 , 0 , 0 , 0 ) /* ANDIS./ANDIU. */
4473
+ case AANDISCC :
4474
+ return OPVCC (29 , 0 , 0 , 0 ) /* ANDIS. */
4452
4475
4453
4476
case ABR :
4454
4477
return OPVCC (18 , 0 , 0 , 0 )
@@ -4506,8 +4529,8 @@ func (c *ctxt9) opirr(a obj.As) uint32 {
4506
4529
4507
4530
case AOR :
4508
4531
return OPVCC (24 , 0 , 0 , 0 )
4509
- case - AOR :
4510
- return OPVCC (25 , 0 , 0 , 0 ) /* ORIS/ORIU */
4532
+ case AORIS :
4533
+ return OPVCC (25 , 0 , 0 , 0 ) /* ORIS */
4511
4534
4512
4535
case ARLWMI :
4513
4536
return OPVCC (20 , 0 , 0 , 0 ) /* rlwimi */
@@ -4584,8 +4607,8 @@ func (c *ctxt9) opirr(a obj.As) uint32 {
4584
4607
4585
4608
case AXOR :
4586
4609
return OPVCC (26 , 0 , 0 , 0 ) /* XORIL */
4587
- case - AXOR :
4588
- return OPVCC (27 , 0 , 0 , 0 ) /* XORIU */
4610
+ case AXORIS :
4611
+ return OPVCC (27 , 0 , 0 , 0 ) /* XORIS */
4589
4612
}
4590
4613
4591
4614
c .ctxt .Diag ("bad opcode i/r or i/r/r %v" , a )
0 commit comments