@@ -480,6 +480,7 @@ var optab = []Optab{
480
480
{AVTBL , C_ARNG , C_NONE , C_LIST , C_ARNG , 100 , 4 , 0 , 0 , 0 },
481
481
{AVUSHR , C_VCON , C_ARNG , C_NONE , C_ARNG , 95 , 4 , 0 , 0 , 0 },
482
482
{AVZIP1 , C_ARNG , C_ARNG , C_NONE , C_ARNG , 72 , 4 , 0 , 0 , 0 },
483
+ {AVUSHLL , C_VCON , C_ARNG , C_NONE , C_ARNG , 102 , 4 , 0 , 0 , 0 },
483
484
{AVUXTL , C_ARNG , C_NONE , C_NONE , C_ARNG , 102 , 4 , 0 , 0 , 0 },
484
485
485
486
/* conditional operations */
@@ -2751,6 +2752,9 @@ func buildop(ctxt *obj.Link) {
2751
2752
oprangeset (AVBSL , t )
2752
2753
oprangeset (AVBIT , t )
2753
2754
oprangeset (AVCMTST , t )
2755
+ oprangeset (AVUZP1 , t )
2756
+ oprangeset (AVUZP2 , t )
2757
+ oprangeset (AVBIF , t )
2754
2758
2755
2759
case AVADD :
2756
2760
oprangeset (AVSUB , t )
@@ -2801,6 +2805,9 @@ func buildop(ctxt *obj.Link) {
2801
2805
case AVUXTL :
2802
2806
oprangeset (AVUXTL2 , t )
2803
2807
2808
+ case AVUSHLL :
2809
+ oprangeset (AVUSHLL2 , t )
2810
+
2804
2811
case AVLD1R :
2805
2812
oprangeset (AVLD2 , t )
2806
2813
oprangeset (AVLD2R , t )
@@ -4177,7 +4184,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
4177
4184
rel .Add = 0
4178
4185
rel .Type = objabi .R_ARM64_GOTPCREL
4179
4186
4180
- case 72 : /* vaddp/vand/vcmeq/vorr/vadd/veor/vfmla/vfmls/vbit/vbsl/vcmtst/vsub Vm.<T>, Vn.<T>, Vd.<T> */
4187
+ case 72 : /* vaddp/vand/vcmeq/vorr/vadd/veor/vfmla/vfmls/vbit/vbsl/vcmtst/vsub/vbif/vuzip1/vuzip2 Vm.<T>, Vn.<T>, Vd.<T> */
4181
4188
af := int ((p .From .Reg >> 5 ) & 15 )
4182
4189
af3 := int ((p .Reg >> 5 ) & 15 )
4183
4190
at := int ((p .To .Reg >> 5 ) & 15 )
@@ -4219,7 +4226,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
4219
4226
}
4220
4227
4221
4228
switch p .As {
4222
- case AVORR , AVAND , AVEOR , AVBIT , AVBSL :
4229
+ case AVORR , AVAND , AVEOR , AVBIT , AVBSL , AVBIF :
4223
4230
if af != ARNG_16B && af != ARNG_8B {
4224
4231
c .ctxt .Diag ("invalid arrangement: %v" , p )
4225
4232
}
@@ -4233,7 +4240,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
4233
4240
size = 0
4234
4241
case AVBSL :
4235
4242
size = 1
4236
- case AVORR , AVBIT :
4243
+ case AVORR , AVBIT , AVBIF :
4237
4244
size = 2
4238
4245
case AVFMLA , AVFMLS :
4239
4246
if af == ARNG_2D {
@@ -5120,56 +5127,44 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
5120
5127
case 101 : // FOMVQ/FMOVD $vcon, Vd -> load from constant pool.
5121
5128
o1 = c .omovlit (p .As , p , & p .From , int (p .To .Reg ))
5122
5129
5123
- case 102 : // VUXTL{2} Vn.<Tb>, Vd.<Ta>
5124
- af := int ((p .From .Reg >> 5 ) & 15 )
5125
- at := int ((p .To .Reg >> 5 ) & 15 )
5126
- var Q , immh uint32
5127
- switch at {
5128
- case ARNG_8H :
5129
- if af == ARNG_8B {
5130
- immh = 1
5131
- Q = 0
5132
- } else if af == ARNG_16B {
5133
- immh = 1
5134
- Q = 1
5135
- } else {
5136
- c .ctxt .Diag ("operand mismatch: %v\n " , p )
5137
- }
5138
- case ARNG_4S :
5139
- if af == ARNG_4H {
5140
- immh = 2
5141
- Q = 0
5142
- } else if af == ARNG_8H {
5143
- immh = 2
5144
- Q = 1
5145
- } else {
5146
- c .ctxt .Diag ("operand mismatch: %v\n " , p )
5147
- }
5148
- case ARNG_2D :
5149
- if af == ARNG_2S {
5150
- immh = 4
5151
- Q = 0
5152
- } else if af == ARNG_4S {
5153
- immh = 4
5154
- Q = 1
5155
- } else {
5156
- c .ctxt .Diag ("operand mismatch: %v\n " , p )
5157
- }
5130
+ case 102 : /* vushll, vushll2, vuxtl, vuxtl2 */
5131
+ o1 = c .opirr (p , p .As )
5132
+ rf := p .Reg
5133
+ af := uint8 ((p .Reg >> 5 ) & 15 )
5134
+ at := uint8 ((p .To .Reg >> 5 ) & 15 )
5135
+ shift := int (p .From .Offset )
5136
+ if p .As == AVUXTL || p .As == AVUXTL2 {
5137
+ rf = p .From .Reg
5138
+ af = uint8 ((p .From .Reg >> 5 ) & 15 )
5139
+ shift = 0
5140
+ }
5141
+
5142
+ pack := func (q , x , y uint8 ) uint32 {
5143
+ return uint32 (q )<< 16 | uint32 (x )<< 8 | uint32 (y )
5144
+ }
5145
+
5146
+ var Q uint8 = uint8 (o1 >> 30 ) & 1
5147
+ var immh , width uint8
5148
+ switch pack (Q , af , at ) {
5149
+ case pack (0 , ARNG_8B , ARNG_8H ):
5150
+ immh , width = 1 , 8
5151
+ case pack (1 , ARNG_16B , ARNG_8H ):
5152
+ immh , width = 1 , 8
5153
+ case pack (0 , ARNG_4H , ARNG_4S ):
5154
+ immh , width = 2 , 16
5155
+ case pack (1 , ARNG_8H , ARNG_4S ):
5156
+ immh , width = 2 , 16
5157
+ case pack (0 , ARNG_2S , ARNG_2D ):
5158
+ immh , width = 4 , 32
5159
+ case pack (1 , ARNG_4S , ARNG_2D ):
5160
+ immh , width = 4 , 32
5158
5161
default :
5159
5162
c .ctxt .Diag ("operand mismatch: %v\n " , p )
5160
5163
}
5161
-
5162
- if p .As == AVUXTL && Q == 1 {
5163
- c .ctxt .Diag ("operand mismatch: %v\n " , p )
5164
+ if ! (0 <= shift && shift <= int (width - 1 )) {
5165
+ c .ctxt .Diag ("shift amount out of range: %v\n " , p )
5164
5166
}
5165
- if p .As == AVUXTL2 && Q == 0 {
5166
- c .ctxt .Diag ("operand mismatch: %v\n " , p )
5167
- }
5168
-
5169
- o1 = c .oprrr (p , p .As )
5170
- rf := int ((p .From .Reg ) & 31 )
5171
- rt := int ((p .To .Reg ) & 31 )
5172
- o1 |= Q << 30 | immh << 19 | uint32 ((rf & 31 )<< 5 ) | uint32 (rt & 31 )
5167
+ o1 |= uint32 (immh )<< 19 | uint32 (shift )<< 16 | uint32 (rf & 31 )<< 5 | uint32 (p .To .Reg & 31 )
5173
5168
}
5174
5169
out [0 ] = o1
5175
5170
out [1 ] = o2
@@ -5802,6 +5797,9 @@ func (c *ctxt7) oprrr(p *obj.Prog, a obj.As) uint32 {
5802
5797
case AVLD2R , AVLD4R :
5803
5798
return 0xD << 24 | 3 << 21
5804
5799
5800
+ case AVBIF :
5801
+ return 1 << 29 | 7 << 25 | 7 << 21 | 7 << 10
5802
+
5805
5803
case AVBIT :
5806
5804
return 1 << 29 | 0x75 << 21 | 7 << 10
5807
5805
@@ -5811,8 +5809,11 @@ func (c *ctxt7) oprrr(p *obj.Prog, a obj.As) uint32 {
5811
5809
case AVCMTST :
5812
5810
return 0xE << 24 | 1 << 21 | 0x23 << 10
5813
5811
5814
- case AVUXTL , AVUXTL2 :
5815
- return 0x5e << 23 | 0x29 << 10
5812
+ case AVUZP1 :
5813
+ return 7 << 25 | 3 << 11
5814
+
5815
+ case AVUZP2 :
5816
+ return 7 << 25 | 1 << 14 | 3 << 11
5816
5817
}
5817
5818
5818
5819
c .ctxt .Diag ("%v: bad rrr %d %v" , p , a , a )
@@ -6011,6 +6012,12 @@ func (c *ctxt7) opirr(p *obj.Prog, a obj.As) uint32 {
6011
6012
6012
6013
case AVSRI :
6013
6014
return 0x5E << 23 | 17 << 10
6015
+
6016
+ case AVUSHLL , AVUXTL :
6017
+ return 1 << 29 | 15 << 24 | 0x29 << 10
6018
+
6019
+ case AVUSHLL2 , AVUXTL2 :
6020
+ return 3 << 29 | 15 << 24 | 0x29 << 10
6014
6021
}
6015
6022
6016
6023
c .ctxt .Diag ("%v: bad irr %v" , p , a )
0 commit comments