Skip to content

Commit 86ce1cb

Browse files
zhangfanniecherrymui
authored andcommitted
cmd/internal/obj/arm64: reclassify 32-bit/64-bit constants
Current assembler saves constants in Offset which type is int64, causing 32-bit constants have a incorrect class. This CL reclassifies constants when opcodes are 32-bit variant, like MOVW, ANDW and ADDW, etc. Besides, this CL encodes some constants of ADDCON class as MOVs instructions. This CL changes the assembler behavior as follows. 1. go assembler ADDW $MOVCON, Rn, Rd previous version: MOVD $MOVCON, Rtmp; ADDW Rtmp, Rn, Rd current version: MOVW $MOVCON, Rtmp; ADDW Rtmp, Rn, Rd 2. go assembly MOVW $0xaaaaffff, R1 previous version: treats $0xaaaaffff as VCON, encodes it as MOVW 0x994, R1 (loads it from pool). current version: treats $0xaaaaffff as MOVCON, and encodes it into MOVW instructions. 3. go assembly MOVD $0x210000, R1 previous version: treats $0x210000 as ADDCON, loads it from pool current version: treats $0x210000 as MOVCON, and encodes it into MOVD instructions. Add the test cases. 1. Binary size before/after. binary size change pkg/linux_arm64 -1.534KB pkg/tool/linux_arm64 -0.718KB go -0.32KB gofmt no change 2. go1 benchmark result. name old time/op new time/op delta BinaryTree17-8 6.26s ± 1% 6.28s ± 1% ~ (p=0.105 n=10+10) Fannkuch11-8 5.40s ± 0% 5.39s ± 0% -0.29% (p=0.028 n=9+10) FmtFprintfEmpty-8 94.5ns ± 0% 95.0ns ± 0% +0.51% (p=0.000 n=10+9) FmtFprintfString-8 163ns ± 1% 159ns ± 1% -2.06% (p=0.000 n=10+9) FmtFprintfInt-8 200ns ± 1% 196ns ± 1% -1.99% (p=0.000 n=9+10) FmtFprintfIntInt-8 292ns ± 3% 284ns ± 1% -2.87% (p=0.001 n=10+9) FmtFprintfPrefixedInt-8 422ns ± 1% 420ns ± 1% -0.59% (p=0.015 n=10+10) FmtFprintfFloat-8 458ns ± 0% 463ns ± 1% +1.19% (p=0.000 n=9+10) FmtManyArgs-8 1.37µs ± 1% 1.35µs ± 1% -1.85% (p=0.000 n=10+10) GobDecode-8 15.5ms ± 1% 15.3ms ± 1% -1.82% (p=0.000 n=10+10) GobEncode-8 11.7ms ± 5% 11.7ms ± 2% ~ (p=0.549 n=10+9) Gzip-8 622ms ± 0% 624ms ± 0% +0.23% (p=0.000 n=10+9) Gunzip-8 73.6ms ± 0% 73.8ms ± 1% ~ (p=0.077 n=9+9) HTTPClientServer-8 115µs ± 1% 115µs ± 1% ~ (p=0.796 n=10+10) JSONEncode-8 31.1ms ± 2% 28.7ms ± 1% -7.98% (p=0.000 n=10+9) JSONDecode-8 145ms ± 0% 145ms ± 1% ~ (p=0.447 n=9+10) Mandelbrot200-8 9.67ms ± 0% 9.60ms ± 0% -0.76% (p=0.000 n=9+9) GoParse-8 7.56ms ± 1% 7.58ms ± 0% +0.21% (p=0.035 n=10+9) RegexpMatchEasy0_32-8 208ns ±10% 222ns ± 0% ~ (p=0.531 n=10+6) RegexpMatchEasy0_1K-8 699ns ± 4% 694ns ± 4% ~ (p=0.868 n=10+10) RegexpMatchEasy1_32-8 186ns ± 8% 190ns ±12% ~ (p=0.955 n=10+10) RegexpMatchEasy1_1K-8 1.13µs ± 1% 1.05µs ± 2% -6.64% (p=0.000 n=10+10) RegexpMatchMedium_32-8 316ns ± 7% 288ns ± 1% -8.68% (p=0.000 n=10+7) RegexpMatchMedium_1K-8 90.2µs ± 0% 85.5µs ± 2% -5.19% (p=0.000 n=10+10) RegexpMatchHard_32-8 5.53µs ± 0% 3.90µs ± 0% -29.52% (p=0.000 n=10+10) RegexpMatchHard_1K-8 119µs ± 0% 124µs ± 0% +4.29% (p=0.000 n=9+10) Revcomp-8 1.07s ± 0% 1.07s ± 0% ~ (p=0.094 n=9+9) Template-8 162ms ± 1% 160ms ± 2% ~ (p=0.089 n=10+10) TimeParse-8 756ns ± 2% 763ns ± 1% ~ (p=0.158 n=10+10) TimeFormat-8 758ns ± 1% 746ns ± 1% -1.52% (p=0.000 n=10+10) name old speed new speed delta GobDecode-8 49.4MB/s ± 1% 50.3MB/s ± 1% +1.84% (p=0.000 n=10+10) GobEncode-8 65.6MB/s ± 5% 65.4MB/s ± 2% ~ (p=0.549 n=10+9) Gzip-8 31.2MB/s ± 0% 31.1MB/s ± 0% -0.24% (p=0.000 n=9+9) Gunzip-8 264MB/s ± 0% 263MB/s ± 1% ~ (p=0.073 n=9+9) JSONEncode-8 62.3MB/s ± 2% 67.7MB/s ± 1% +8.67% (p=0.000 n=10+9) JSONDecode-8 13.4MB/s ± 0% 13.4MB/s ± 1% ~ (p=0.508 n=9+10) GoParse-8 7.66MB/s ± 1% 7.64MB/s ± 0% -0.23% (p=0.049 n=10+9) RegexpMatchEasy0_32-8 154MB/s ± 9% 143MB/s ± 3% ~ (p=0.303 n=10+7) RegexpMatchEasy0_1K-8 1.46GB/s ± 4% 1.47GB/s ± 4% ~ (p=0.912 n=10+10) RegexpMatchEasy1_32-8 172MB/s ± 9% 170MB/s ±12% ~ (p=0.971 n=10+10) RegexpMatchEasy1_1K-8 908MB/s ± 1% 972MB/s ± 2% +7.12% (p=0.000 n=10+10) RegexpMatchMedium_32-8 3.17MB/s ± 7% 3.46MB/s ± 1% +9.14% (p=0.000 n=10+7) RegexpMatchMedium_1K-8 11.3MB/s ± 0% 12.0MB/s ± 2% +5.51% (p=0.000 n=10+10) RegexpMatchHard_32-8 5.78MB/s ± 0% 8.21MB/s ± 0% +41.93% (p=0.000 n=9+10) RegexpMatchHard_1K-8 8.62MB/s ± 0% 8.27MB/s ± 0% -4.11% (p=0.000 n=9+10) Revcomp-8 237MB/s ± 0% 237MB/s ± 0% ~ (p=0.081 n=9+9) Template-8 12.0MB/s ± 1% 12.1MB/s ± 2% ~ (p=0.072 n=10+10) Change-Id: I080801f520366b42d5f9699954bd33106976a81b Reviewed-on: https://go-review.googlesource.com/c/120661 Run-TryBot: Ben Shi <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Cherry Zhang <[email protected]>
1 parent 1e8ecef commit 86ce1cb

File tree

4 files changed

+169
-32
lines changed

4 files changed

+169
-32
lines changed

src/cmd/asm/internal/asm/testdata/arm64.s

+29-1
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@ TEXT foo(SB), DUPOK|NOSPLIT, $-8
191191
FMOVD F4, (R2)(R6) // FMOVD F4, (R2)(R6*1) // 446826fc
192192
FMOVD F4, (R2)(R6<<3) // 447826fc
193193

194+
CMPW $40960, R0 // 1f284071
195+
CMPW $27745, R2 // 3b8c8d525f001b6b
196+
CMNW $0x3fffffc0, R2 // CMNW $1073741760, R2 // fb5f1a325f001b2b
197+
CMPW $0xffff0, R1 // CMPW $1048560, R1 // fb3f1c323f001b6b
198+
ADD $0x3fffffffc000, R5 // ADD $70368744161280, R5 // fb7f72b2a5001b8b
194199
// LTYPE1 imsr ',' spreg ','
195200
// {
196201
// outcode($1, &$2, $4, &nullgen);
@@ -226,13 +231,36 @@ TEXT foo(SB), DUPOK|NOSPLIT, $-8
226231
ANDS $0x22220000, R3, R4 // ANDS $572653568, R3, R4 // 5b44a4d264001bea
227232
BICS $0x22220000, R3, R4 // BICS $572653568, R3, R4 // 5b44a4d264003bea
228233

234+
EOR $0xe03fffffffffffff, R20, R22 // EOR $-2287828610704211969, R20, R22 // 96e243d2
235+
TSTW $0x600000006, R1 // TSTW $25769803782, R1 // 3f041f72
236+
ANDS $0xffff, R2 // ANDS $65535, R2 // 423c40f2
237+
AND $0x7fffffff, R3 // AND $2147483647, R3 // 63784092
238+
ANDS $0x0ffffffff80000000, R2 // ANDS $-2147483648, R2 // 428061f2
239+
AND $0xfffff, R2 // AND $1048575, R2 // 424c4092
240+
ANDW $0xf00fffff, R1 // ANDW $4027580415, R1 // 215c0412
241+
ANDSW $0xff00ffff, R1 // ANDSW $4278255615, R1 // 215c0872
242+
TSTW $0xff00ff, R1 // TSTW $16711935, R1 // 3f9c0072
243+
229244
AND $8, R0, RSP // 1f007d92
230245
ORR $8, R0, RSP // 1f007db2
231246
EOR $8, R0, RSP // 1f007dd2
232247
BIC $8, R0, RSP // 1ff87c92
233248
ORN $8, R0, RSP // 1ff87cb2
234249
EON $8, R0, RSP // 1ff87cd2
235250

251+
MOVD $0x3fffffffc000, R0 // MOVD $70368744161280, R0 // e07f72b2
252+
MOVW $0xaaaa0000, R1 // MOVW $2863267840, R1 // 4155b552
253+
MOVW $0xaaaaffff, R1 // MOVW $2863333375, R1 // a1aaaa12
254+
MOVW $0xaaaa, R1 // MOVW $43690, R1 // 41559552
255+
MOVW $0xffffaaaa, R1 // MOVW $4294945450, R1 // a1aa8a12
256+
MOVW $0xffff0000, R1 // MOVW $4294901760, R1 // e1ffbf52
257+
MOVD $0xffff00000000000, R1 // MOVD $1152903912420802560, R1 // e13f54b2
258+
MOVD $0x11110000, R1 // MOVD $286326784, R1 // 2122a2d2
259+
MOVD $0, R1 // 010080d2
260+
MOVD $-1, R1 // 01008092
261+
MOVD $0x210000, R0 // MOVD $2162688, R0 // 2004a0d2
262+
MOVD $0xffffffffffffaaaa, R1 // MOVD $-21846, R1 // a1aa8a92
263+
236264
//
237265
// CLS
238266
//
@@ -428,7 +456,7 @@ TEXT foo(SB), DUPOK|NOSPLIT, $-8
428456
CMP R22.SXTX, RSP // ffe336eb
429457

430458
CMP $0x22220000, RSP // CMP $572653568, RSP // 5b44a4d2ff633beb
431-
CMPW $0x22220000, RSP // CMPW $572653568, RSP // 5b44a4d2ff633b6b
459+
CMPW $0x22220000, RSP // CMPW $572653568, RSP // 5b44a452ff633b6b
432460

433461
// TST
434462
TST $15, R2 // 5f0c40f2

src/cmd/internal/obj/arm64/a.out.go

+1
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,7 @@ const (
407407
C_ABCON0 // could be C_ADDCON0 or C_BITCON
408408
C_ADDCON0 // 12-bit unsigned, unshifted
409409
C_ABCON // could be C_ADDCON or C_BITCON
410+
C_AMCON // could be C_ADDCON or C_MOVCON
410411
C_ADDCON // 12-bit unsigned, shifted left by 0 or 12
411412
C_MBCON // could be C_MOVCON or C_BITCON
412413
C_MOVCON // generated by a 16-bit constant, optionally inverted and/or shifted by multiple of 16

src/cmd/internal/obj/arm64/anames7.go

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ var cnames7 = []string{
2323
"ABCON0",
2424
"ADDCON0",
2525
"ABCON",
26+
"AMCON",
2627
"ADDCON",
2728
"MBCON",
2829
"MOVCON",

src/cmd/internal/obj/arm64/asm7.go

+138-31
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,10 @@ func OPBIT(x uint32) uint32 {
164164
return 1<<30 | 0<<29 | 0xD6<<21 | 0<<16 | x<<10
165165
}
166166

167+
func MOVCONST(d int64, s int, rt int) uint32 {
168+
return uint32(((d>>uint(s*16))&0xFFFF)<<5) | uint32(s)&3<<21 | uint32(rt&31)
169+
}
170+
167171
const (
168172
LFROM = 1 << 0
169173
LTO = 1 << 1
@@ -272,12 +276,10 @@ var optab = []Optab{
272276
/* MOVs that become MOVK/MOVN/MOVZ/ADD/SUB/OR */
273277
{AMOVW, C_MOVCON, C_NONE, C_NONE, C_REG, 32, 4, 0, 0, 0},
274278
{AMOVD, C_MOVCON, C_NONE, C_NONE, C_REG, 32, 4, 0, 0, 0},
275-
276-
// TODO: these don't work properly.
277-
// { AMOVW, C_ADDCON, C_NONE, C_REG, 2, 4, 0 , 0},
278-
// { AMOVD, C_ADDCON, C_NONE, C_REG, 2, 4, 0 , 0},
279279
{AMOVW, C_BITCON, C_NONE, C_NONE, C_REG, 32, 4, 0, 0, 0},
280280
{AMOVD, C_BITCON, C_NONE, C_NONE, C_REG, 32, 4, 0, 0, 0},
281+
{AMOVW, C_LCON, C_NONE, C_NONE, C_REG, 12, 4, 0, LFROM, 0},
282+
{AMOVD, C_VCON, C_NONE, C_NONE, C_REG, 12, 4, 0, LFROM, 0},
281283

282284
{AMOVK, C_VCON, C_NONE, C_NONE, C_REG, 33, 4, 0, 0, 0},
283285
{AMOVD, C_AACON, C_NONE, C_NONE, C_REG, 4, 4, REGFROM, 0, 0},
@@ -318,9 +320,7 @@ var optab = []Optab{
318320
{AWORD, C_NONE, C_NONE, C_NONE, C_LCON, 14, 4, 0, 0, 0},
319321
{AWORD, C_NONE, C_NONE, C_NONE, C_LEXT, 14, 4, 0, 0, 0},
320322
{AWORD, C_NONE, C_NONE, C_NONE, C_ADDR, 14, 4, 0, 0, 0},
321-
{AMOVW, C_VCON, C_NONE, C_NONE, C_REG, 12, 4, 0, LFROM, 0},
322323
{AMOVW, C_VCONADDR, C_NONE, C_NONE, C_REG, 68, 8, 0, 0, 0},
323-
{AMOVD, C_VCON, C_NONE, C_NONE, C_REG, 12, 4, 0, LFROM, 0},
324324
{AMOVD, C_VCONADDR, C_NONE, C_NONE, C_REG, 68, 8, 0, 0, 0},
325325
{AMOVB, C_REG, C_NONE, C_NONE, C_ADDR, 64, 12, 0, 0, 0},
326326
{AMOVBU, C_REG, C_NONE, C_NONE, C_ADDR, 64, 12, 0, 0, 0},
@@ -1105,6 +1105,23 @@ func isSTXPop(op obj.As) bool {
11051105
return false
11061106
}
11071107

1108+
func isANDWop(op obj.As) bool {
1109+
switch op {
1110+
case AANDW, AORRW, AEORW, AANDSW, ATSTW,
1111+
ABICW, AEONW, AORNW, ABICSW:
1112+
return true
1113+
}
1114+
return false
1115+
}
1116+
1117+
func isADDWop(op obj.As) bool {
1118+
switch op {
1119+
case AADDW, AADDSW, ASUBW, ASUBSW, ACMNW, ACMPW:
1120+
return true
1121+
}
1122+
return false
1123+
}
1124+
11081125
func isRegShiftOrExt(a *obj.Addr) bool {
11091126
return (a.Index-obj.RBaseARM64)&REG_EXT != 0 || (a.Index-obj.RBaseARM64)&REG_LSL != 0
11101127
}
@@ -1411,6 +1428,52 @@ func rclass(r int16) int {
14111428
return C_GOK
14121429
}
14131430

1431+
// con32class reclassifies the constant of 32-bit instruction. Becuase the constant type is 32-bit,
1432+
// but saved in Offset which type is int64, con32class treats it as uint32 type and reclassifies it.
1433+
func (c *ctxt7) con32class(a *obj.Addr) int {
1434+
v := uint32(a.Offset)
1435+
if v == 0 {
1436+
return C_ZCON
1437+
}
1438+
if isaddcon(int64(v)) {
1439+
if v <= 0xFFF {
1440+
if isbitcon(uint64(v)) {
1441+
return C_ABCON0
1442+
}
1443+
return C_ADDCON0
1444+
}
1445+
if isbitcon(uint64(v)) {
1446+
return C_ABCON
1447+
}
1448+
return C_ADDCON
1449+
}
1450+
1451+
t := movcon(int64(v))
1452+
if t >= 0 {
1453+
if isbitcon(uint64(v)) {
1454+
return C_MBCON
1455+
}
1456+
return C_MOVCON
1457+
}
1458+
1459+
t = movcon(int64(^v))
1460+
if t >= 0 {
1461+
if isbitcon(uint64(v)) {
1462+
return C_MBCON
1463+
}
1464+
return C_MOVCON
1465+
}
1466+
1467+
if isbitcon(uint64(v)) {
1468+
return C_BITCON
1469+
}
1470+
1471+
if 0 <= v && v <= 0xffffff {
1472+
return C_ADDCON2
1473+
}
1474+
return C_LCON
1475+
}
1476+
14141477
func (c *ctxt7) aclass(a *obj.Addr) int {
14151478
switch a.Type {
14161479
case obj.TYPE_NONE:
@@ -1517,6 +1580,12 @@ func (c *ctxt7) aclass(a *obj.Addr) int {
15171580
if isbitcon(uint64(v)) {
15181581
return C_ABCON
15191582
}
1583+
if movcon(v) >= 0 {
1584+
return C_AMCON
1585+
}
1586+
if movcon(^v) >= 0 {
1587+
return C_AMCON
1588+
}
15201589
return C_ADDCON
15211590
}
15221591

@@ -1609,6 +1678,34 @@ func (c *ctxt7) oplook(p *obj.Prog) *Optab {
16091678
}
16101679
a1 = a0 + 1
16111680
p.From.Class = int8(a1)
1681+
// more specific classification of 32-bit integers
1682+
if p.From.Type == obj.TYPE_CONST && p.From.Name == obj.NAME_NONE {
1683+
if p.As == AMOVW || isADDWop(p.As) {
1684+
ra0 := c.con32class(&p.From)
1685+
// do not break C_ADDCON2 when S bit is set
1686+
if (p.As == AADDSW || p.As == ASUBSW) && ra0 == C_ADDCON2 {
1687+
ra0 = C_LCON
1688+
}
1689+
a1 = ra0 + 1
1690+
p.From.Class = int8(a1)
1691+
}
1692+
if isANDWop(p.As) {
1693+
switch p.As {
1694+
case AANDW, AORRW, AEORW, AANDSW, ATSTW:
1695+
// For 32-bit logical instruction with constant,
1696+
// rewrite the high 32-bit to be a copy of the low
1697+
// 32-bit, so that the BITCON test can be shared
1698+
// for both 32-bit and 64-bit.
1699+
if a0 == C_BITCON {
1700+
break
1701+
}
1702+
fallthrough
1703+
default:
1704+
a1 = c.con32class(&p.From) + 1
1705+
p.From.Class = int8(a1)
1706+
}
1707+
}
1708+
}
16121709
}
16131710

16141711
a1--
@@ -1679,7 +1776,7 @@ func cmp(a int, b int) bool {
16791776
}
16801777

16811778
case C_ADDCON:
1682-
if b == C_ZCON || b == C_ABCON0 || b == C_ADDCON0 || b == C_ABCON {
1779+
if b == C_ZCON || b == C_ABCON0 || b == C_ADDCON0 || b == C_ABCON || b == C_AMCON {
16831780
return true
16841781
}
16851782

@@ -1689,7 +1786,7 @@ func cmp(a int, b int) bool {
16891786
}
16901787

16911788
case C_MOVCON:
1692-
if b == C_MBCON || b == C_ZCON || b == C_ADDCON0 {
1789+
if b == C_MBCON || b == C_ZCON || b == C_ADDCON0 || b == C_AMCON {
16931790
return true
16941791
}
16951792

@@ -1699,7 +1796,7 @@ func cmp(a int, b int) bool {
16991796
}
17001797

17011798
case C_LCON:
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 {
1799+
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 || b == C_AMCON {
17031800
return true
17041801
}
17051802

@@ -3501,8 +3598,8 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
35013598
if r == 0 {
35023599
r = rt
35033600
}
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)
3601+
o1 = c.oaddi(p, int32(op), int32(c.regoff(&p.From))&0x000fff, r, rt)
3602+
o2 = c.oaddi(p, int32(op), int32(c.regoff(&p.From))&0xfff000, rt, rt)
35063603

35073604
case 50: /* sys/sysl */
35083605
o1 = c.opirr(p, p.As)
@@ -3670,7 +3767,11 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
36703767
if p.Reg == REGTMP {
36713768
c.ctxt.Diag("cannot use REGTMP as source: %v\n", p)
36723769
}
3673-
o1 = c.omovconst(AMOVD, p, &p.From, REGTMP)
3770+
if isADDWop(p.As) || isANDWop(p.As) {
3771+
o1 = c.omovconst(AMOVW, p, &p.From, REGTMP)
3772+
} else {
3773+
o1 = c.omovconst(AMOVD, p, &p.From, REGTMP)
3774+
}
36743775

36753776
rt := int(p.To.Reg)
36763777
if p.To.Type == obj.TYPE_NONE {
@@ -6195,31 +6296,37 @@ func (c *ctxt7) omovconst(as obj.As, p *obj.Prog, a *obj.Addr, rt int) (o1 uint3
61956296
return o1
61966297
}
61976298

6198-
r := 32
6199-
if as == AMOVD {
6200-
r = 64
6299+
if as == AMOVW {
6300+
d := uint32(a.Offset)
6301+
s := movcon(int64(d))
6302+
if s < 0 || 16*s >= 32 {
6303+
d = ^d
6304+
s = movcon(int64(d))
6305+
if s < 0 || 16*s >= 32 {
6306+
c.ctxt.Diag("impossible 32-bit move wide: %#x\n%v", uint32(a.Offset), p)
6307+
}
6308+
o1 = c.opirr(p, AMOVNW)
6309+
} else {
6310+
o1 = c.opirr(p, AMOVZW)
6311+
}
6312+
o1 |= MOVCONST(int64(d), s, rt)
62016313
}
6202-
d := a.Offset
6203-
s := movcon(d)
6204-
if s < 0 || s >= r {
6205-
d = ^d
6206-
s = movcon(d)
6207-
if s < 0 || s >= r {
6208-
c.ctxt.Diag("impossible move wide: %#x\n%v", uint64(a.Offset), p)
6209-
}
6210-
if as == AMOVD {
6314+
if as == AMOVD {
6315+
d := a.Offset
6316+
s := movcon(d)
6317+
if s < 0 || 16*s >= 64 {
6318+
d = ^d
6319+
s = movcon(d)
6320+
if s < 0 || 16*s >= 64 {
6321+
c.ctxt.Diag("impossible 64-bit move wide: %#x\n%v", uint64(a.Offset), p)
6322+
}
62116323
o1 = c.opirr(p, AMOVN)
62126324
} else {
6213-
o1 = c.opirr(p, AMOVNW)
6214-
}
6215-
} else {
6216-
if as == AMOVD {
62176325
o1 = c.opirr(p, AMOVZ)
6218-
} else {
6219-
o1 = c.opirr(p, AMOVZW)
62206326
}
6327+
o1 |= MOVCONST(d, s, rt)
62216328
}
6222-
o1 |= uint32((((d >> uint(s*16)) & 0xFFFF) << 5) | int64((uint32(s)&3)<<21) | int64(rt&31))
6329+
62236330
return o1
62246331
}
62256332

0 commit comments

Comments
 (0)