@@ -3359,20 +3359,18 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
3359
3359
}
3360
3360
o1 = c .opirr (p , p .As )
3361
3361
3362
- rt := int ( p .To .Reg )
3362
+ rt , r := p .To .Reg , p . Reg
3363
3363
if p .To .Type == obj .TYPE_NONE {
3364
3364
if (o1 & Sbit ) == 0 {
3365
3365
c .ctxt .Diag ("ineffective ZR destination\n %v" , p )
3366
3366
}
3367
3367
rt = REGZERO
3368
3368
}
3369
-
3370
- r := int (p .Reg )
3371
3369
if r == obj .REG_NONE {
3372
3370
r = rt
3373
3371
}
3374
3372
v := c .regoff (& p .From )
3375
- o1 = c .oaddi (p , int32 ( o1 ) , v , r , rt )
3373
+ o1 = c .oaddi (p , p . As , v , rt , r )
3376
3374
3377
3375
case 3 : /* op R<<n[,R],R (shifted register) */
3378
3376
o1 = c .oprrr (p , p .As )
@@ -3400,36 +3398,32 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
3400
3398
o1 |= (uint32 (r & 31 ) << 5 ) | uint32 (rt & 31 )
3401
3399
3402
3400
case 4 : /* mov $addcon, R; mov $recon, R; mov $racon, R; mov $addcon2, R */
3403
- rt := int (p .To .Reg )
3404
- r := int (o .param )
3405
-
3401
+ rt , r := p .To .Reg , o .param
3406
3402
if r == obj .REG_NONE {
3407
3403
r = REGZERO
3408
3404
} else if r == REGFROM {
3409
- r = int ( p .From .Reg )
3405
+ r = p .From .Reg
3410
3406
}
3411
3407
if r == obj .REG_NONE {
3412
3408
r = REGSP
3413
3409
}
3414
3410
3415
3411
v := c .regoff (& p .From )
3416
- var op int32
3412
+ a := AADD
3417
3413
if v < 0 {
3414
+ a = ASUB
3418
3415
v = - v
3419
- op = int32 (c .opirr (p , ASUB ))
3420
- } else {
3421
- op = int32 (c .opirr (p , AADD ))
3422
3416
}
3423
3417
3424
- if int ( o .size (c .ctxt , p ) ) == 8 {
3418
+ if o .size (c .ctxt , p ) == 8 {
3425
3419
// NOTE: this case does not use REGTMP. If it ever does,
3426
3420
// remove the NOTUSETMP flag in optab.
3427
- o1 = c .oaddi (p , op , v & 0xfff000 , r , rt )
3428
- o2 = c .oaddi (p , op , v & 0x000fff , rt , rt )
3421
+ o1 = c .oaddi (p , a , v & 0xfff000 , rt , r )
3422
+ o2 = c .oaddi (p , a , v & 0x000fff , rt , rt )
3429
3423
break
3430
3424
}
3431
3425
3432
- o1 = c .oaddi (p , op , v , r , rt )
3426
+ o1 = c .oaddi (p , a , v , rt , r )
3433
3427
3434
3428
case 5 : /* b s; bl s */
3435
3429
o1 = c .opbra (p , p .As )
@@ -3889,9 +3883,9 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
3889
3883
c .ctxt .Diag ("unexpected long move, op %v tab %v\n %v" , p .As , o .as , p )
3890
3884
}
3891
3885
3892
- r := int ( p .To .Reg )
3886
+ r := p .To .Reg
3893
3887
if r == obj .REG_NONE {
3894
- r = int ( o .param )
3888
+ r = o .param
3895
3889
}
3896
3890
3897
3891
v := c .regoff (& p .To )
@@ -3910,7 +3904,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
3910
3904
goto storeusepool
3911
3905
}
3912
3906
3913
- o1 = c .oaddi (p , int32 ( c . opirr ( p , AADD )) , hi , r , REGTMP )
3907
+ o1 = c .oaddi (p , AADD , hi , REGTMP , r )
3914
3908
o2 = c .olsr12u (p , c .opstr (p , p .As ), ((v - hi )>> uint (s ))& 0xFFF , REGTMP , p .From .Reg )
3915
3909
break
3916
3910
@@ -3919,7 +3913,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
3919
3913
c .ctxt .Diag ("REGTMP used in large offset store: %v" , p )
3920
3914
}
3921
3915
o1 = c .omovlit (AMOVD , p , & p .To , REGTMP )
3922
- o2 = c .olsxrr (p , int32 (c .opstrr (p , p .As , false )), int (p .From .Reg ), r , REGTMP )
3916
+ o2 = c .olsxrr (p , int32 (c .opstrr (p , p .As , false )), int (p .From .Reg ), int ( r ) , REGTMP )
3923
3917
3924
3918
case 31 : /* movT L(R), R -> ldrT */
3925
3919
// if offset L can be split into hi+lo, and both fit into instructions, do
@@ -3933,9 +3927,9 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
3933
3927
c .ctxt .Diag ("unexpected long move, op %v tab %v\n %v" , p .As , o .as , p )
3934
3928
}
3935
3929
3936
- r := int ( p .From .Reg )
3930
+ r := p .From .Reg
3937
3931
if r == obj .REG_NONE {
3938
- r = int ( o .param )
3932
+ r = o .param
3939
3933
}
3940
3934
3941
3935
v := c .regoff (& p .From )
@@ -3954,7 +3948,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
3954
3948
goto loadusepool
3955
3949
}
3956
3950
3957
- o1 = c .oaddi (p , int32 ( c . opirr ( p , AADD )) , hi , r , REGTMP )
3951
+ o1 = c .oaddi (p , AADD , hi , REGTMP , r )
3958
3952
o2 = c .olsr12u (p , c .opldr (p , p .As ), ((v - hi )>> uint (s ))& 0xFFF , REGTMP , p .To .Reg )
3959
3953
break
3960
3954
@@ -3963,7 +3957,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
3963
3957
c .ctxt .Diag ("REGTMP used in large offset load: %v" , p )
3964
3958
}
3965
3959
o1 = c .omovlit (AMOVD , p , & p .From , REGTMP )
3966
- o2 = c .olsxrr (p , int32 (c .opldrr (p , p .As , false )), int (p .To .Reg ), r , REGTMP )
3960
+ o2 = c .olsxrr (p , int32 (c .opldrr (p , p .As , false )), int (p .To .Reg ), int ( r ) , REGTMP )
3967
3961
3968
3962
case 32 : /* mov $con, R -> movz/movn */
3969
3963
o1 = c .omovconst (p .As , p , & p .From , int (p .To .Reg ))
@@ -4234,13 +4228,12 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
4234
4228
if op & Sbit != 0 {
4235
4229
c .ctxt .Diag ("can not break addition/subtraction when S bit is set" , p )
4236
4230
}
4237
- rt := int (p .To .Reg )
4238
- r := int (p .Reg )
4231
+ rt , r := p .To .Reg , p .Reg
4239
4232
if r == obj .REG_NONE {
4240
4233
r = rt
4241
4234
}
4242
- o1 = c .oaddi (p , int32 ( op ) , c .regoff (& p .From )& 0x000fff , r , rt )
4243
- o2 = c .oaddi (p , int32 ( op ) , c .regoff (& p .From )& 0xfff000 , rt , rt )
4235
+ o1 = c .oaddi (p , p . As , c .regoff (& p .From )& 0x000fff , rt , r )
4236
+ o2 = c .oaddi (p , p . As , c .regoff (& p .From )& 0xfff000 , rt , rt )
4244
4237
4245
4238
case 50 : /* sys/sysl */
4246
4239
o1 = c .opirr (p , p .As )
@@ -7097,17 +7090,20 @@ func (c *ctxt7) opstrr(p *obj.Prog, a obj.As, extension bool) uint32 {
7097
7090
return 0
7098
7091
}
7099
7092
7100
- func (c * ctxt7 ) oaddi (p * obj.Prog , o1 int32 , v int32 , r int , rt int ) uint32 {
7093
+ func (c * ctxt7 ) oaddi (p * obj.Prog , a obj.As , v int32 , rd , rn int16 ) uint32 {
7094
+ op := c .opirr (p , a )
7095
+
7101
7096
if (v & 0xFFF000 ) != 0 {
7102
7097
if v & 0xFFF != 0 {
7103
7098
c .ctxt .Diag ("%v misuses oaddi" , p )
7104
7099
}
7105
7100
v >>= 12
7106
- o1 |= 1 << 22
7101
+ op |= 1 << 22
7107
7102
}
7108
7103
7109
- o1 |= ((v & 0xFFF ) << 10 ) | (int32 (r & 31 ) << 5 ) | int32 (rt & 31 )
7110
- return uint32 (o1 )
7104
+ op |= (uint32 (v & 0xFFF ) << 10 ) | (uint32 (rn & 31 ) << 5 ) | uint32 (rd & 31 )
7105
+
7106
+ return op
7111
7107
}
7112
7108
7113
7109
func (c * ctxt7 ) oaddi12 (p * obj.Prog , v int32 , rd , rn int16 ) uint32 {
@@ -7120,7 +7116,7 @@ func (c *ctxt7) oaddi12(p *obj.Prog, v int32, rd, rn int16) uint32 {
7120
7116
a = ASUB
7121
7117
v = - v
7122
7118
}
7123
- return c .oaddi (p , int32 ( c . opirr ( p , a )) , v , int ( rn ), int ( rd ) )
7119
+ return c .oaddi (p , a , v , rd , rn )
7124
7120
}
7125
7121
7126
7122
/*
0 commit comments