arm64/arm64asm: fix the wrong shifted register offset go assembler syntax

The current Go assembler encodes "MOVB R4, (R2)(R6)" as "44682638"
and encodes "MOVB R4, (R2)(R6<<0)" as "44782638", but the current
Go disassembler returns the same Go syntax "MOVB R4, (R3)(R6) for
the above two binarys. To match the assembler, this patch fixes the
wrong shifted register go syntax.

The fixed Go syntax:
  strb w4, [x2, x6, lsl #0]  ->   MOVB R4, (R2)(R6<<0)
  strb w4, [x2, x6]          ->   MOVB R4, (R2)(R6)

Change-Id: I60d4cdf1c04511891268efe510a18291fe0c0da6
Reviewed-on: https://go-review.googlesource.com/c/arch/+/214358
Run-TryBot: fannie zhang <Fannie.Zhang@arm.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Trust: fannie zhang <Fannie.Zhang@arm.com>
This commit is contained in:
fanzha02 2020-01-08 11:14:57 +00:00 коммит произвёл fannie zhang
Родитель 52c3e6f60c
Коммит 377592649d
3 изменённых файлов: 40 добавлений и 20 удалений

Просмотреть файл

@ -538,10 +538,12 @@ type MemExtend struct {
Extend ExtShift Extend ExtShift
// Amount indicates the index shift amount (but also see ShiftMustBeZero field below). // Amount indicates the index shift amount (but also see ShiftMustBeZero field below).
Amount uint8 Amount uint8
// ShiftMustBeZero is set to true when the shift amount must be 0, even if the // Refer to ARM reference manual, for byte load/store(register), the index
// Amount field is not 0. In GNU syntax, a #0 shift amount is printed if Amount // shift amount must be 0, encoded in "S" as 0 if omitted, or as 1 if present.
// is not 0 but ShiftMustBeZero is true; #0 is not printed if Amount is 0 and // a.ShiftMustBeZero is set true indicates the index shift amount must be 0.
// ShiftMustBeZero is true. Both cases represent shift by 0 bit. // In GNU syntax, a #0 shift amount is printed if Amount is 1 but ShiftMustBeZero
// is true; #0 is not printed if Amount is 0 and ShiftMustBeZero is true.
// Both cases represent shift by 0 bit.
ShiftMustBeZero bool ShiftMustBeZero bool
} }

Просмотреть файл

@ -595,14 +595,18 @@ func plan9Arg(inst *Inst, pc uint64, symname func(uint64) (string, uint64), arg
} }
if a.Extend == lsl { if a.Extend == lsl {
// Refer to ARM reference manual, for byte load/store(register), the index
// shift amount must be 0, encoded in "S" as 0 if omitted, or as 1 if present.
// a.Amount indicates the index shift amount, encoded in "S" field. // a.Amount indicates the index shift amount, encoded in "S" field.
// a.ShiftMustBeZero is set true when the index shift amount must be 0, // a.ShiftMustBeZero is set true indicates the index shift amount must be 0.
// even if the a.Amount field is not 0. // When a.ShiftMustBeZero is true, GNU syntax prints "[Xn, Xm lsl #0]" if "S"
// When a.ShiftMustBeZero is ture, GNU syntax prints #0 shift amount if // equals to 1, or prints "[Xn, Xm]" if "S" equals to 0.
// "S" equals to 1, or does not print #0 shift amount if "S" equals to 0.
// Go syntax should never print a zero index shift amount.
if a.Amount != 0 && !a.ShiftMustBeZero { if a.Amount != 0 && !a.ShiftMustBeZero {
index = fmt.Sprintf("(%s<<%d)", indexreg, a.Amount) index = fmt.Sprintf("(%s<<%d)", indexreg, a.Amount)
} else if a.ShiftMustBeZero && a.Amount == 1 {
// When a.ShiftMustBeZero is ture, Go syntax prints "(Rm<<0)" if "a.Amount"
// equals to 1.
index = fmt.Sprintf("(%s<<0)", indexreg)
} else { } else {
index = fmt.Sprintf("(%s)", indexreg) index = fmt.Sprintf("(%s)", indexreg)
} }

36
arm64/arm64asm/testdata/plan9cases.txt поставляемый
Просмотреть файл

@ -137,7 +137,7 @@ daeb66f8| MOVD (R30)(R6.SXTX), R26
8ca74238| MOVBU.P 42(R28), R12 8ca74238| MOVBU.P 42(R28), R12
4e5c5e38| MOVBU.W -27(R2), R14 4e5c5e38| MOVBU.W -27(R2), R14
03936d39| MOVBU 2916(R24), R3 03936d39| MOVBU 2916(R24), R3
577a6e38| MOVBU (R18)(R14), R23 577a6e38| MOVBU (R18)(R14<<0), R23
adb54678| MOVHU.P 107(R13), R13 adb54678| MOVHU.P 107(R13), R13
820f4c78| MOVHU.W 192(R28), R2 820f4c78| MOVHU.W 192(R28), R2
92787579| MOVHU 6844(R4), R18 92787579| MOVHU 6844(R4), R18
@ -147,7 +147,7 @@ fb478238| MOVB.P 36(RSP), R27
18ee9438| MOVB.W -178(R16), R24 18ee9438| MOVB.W -178(R16), R24
16b9c639| MOVBW 430(R8), R22 16b9c639| MOVBW 430(R8), R22
37958f39| MOVB 997(R9), R23 37958f39| MOVB 997(R9), R23
af7ae238| MOVBW (R21)(R2), R15 af7ae238| MOVBW (R21)(R2<<0), R15
1568fa38| MOVBW (R0)(R26), R21 1568fa38| MOVBW (R0)(R26), R21
744bbf38| MOVB (R27)(ZR.UXTW), R20 744bbf38| MOVB (R27)(ZR.UXTW), R20
f069a538| MOVB (R15)(R5), R16 f069a538| MOVB (R15)(R5), R16
@ -696,7 +696,7 @@ f5c3547d| MOVD 2656(RSP), V21
8e8a7bbd| FMOVS 15240(R20), F14 8e8a7bbd| FMOVS 15240(R20), F14
8e3c7afd| FMOVD 29816(R4), F14 8e3c7afd| FMOVD 29816(R4), F14
f2aeff3d| MOVD 65200(R23), V18 f2aeff3d| MOVD 65200(R23), V18
1d78793c| MOVD (R0)(R25), V29 1d78793c| MOVD (R0)(R25<<0), V29
b8f15d3c| VLDUR -33(R13), V24 b8f15d3c| VLDUR -33(R13), V24
95635c7c| VLDUR -58(R28), V21 95635c7c| VLDUR -58(R28), V21
27d046bc| VLDUR 109(R1), V7 27d046bc| VLDUR 109(R1), V7
@ -1143,7 +1143,7 @@ e1cd51b9| MOVWU 4556(R15), R1
0c554b38| MOVBU.P 181(R8), R12 0c554b38| MOVBU.P 181(R8), R12
054f5938| MOVBU.W -108(R24), R5 054f5938| MOVBU.W -108(R24), R5
1f206539| MOVBU 2376(R0), ZR 1f206539| MOVBU 2376(R0), ZR
73796a38| MOVBU (R11)(R10), R19 73796a38| MOVBU (R11)(R10<<0), R19
a8b74f78| MOVHU.P 251(R29), R8 a8b74f78| MOVHU.P 251(R29), R8
021e5e78| MOVHU.W -31(R16), R2 021e5e78| MOVHU.W -31(R16), R2
ec126b79| MOVHU 5512(R23), R12 ec126b79| MOVHU 5512(R23), R12
@ -1155,7 +1155,7 @@ eaf6c238| MOVBW.P 47(R23), R10
7d74c039| MOVBW 29(R3), R29 7d74c039| MOVBW 29(R3), R29
7d1f8539| MOVB 327(R27), R29 7d1f8539| MOVB 327(R27), R29
225bff38| MOVBW (R25)(ZR.UXTW), R2 225bff38| MOVBW (R25)(ZR.UXTW), R2
6a7bed38| MOVBW (R27)(R13), R10 6a7bed38| MOVBW (R27)(R13<<0), R10
0f69b538| MOVB (R8)(R21), R15 0f69b538| MOVB (R8)(R21), R15
c796cc78| MOVHW.P 201(R22), R7 c796cc78| MOVHW.P 201(R22), R7
50268e78| MOVH.P 226(R18), R16 50268e78| MOVH.P 226(R18), R16
@ -1701,7 +1701,7 @@ f5885e7d| MOVD 3908(R7), V21
0cc4e93d| MOVD 42768(R0), V12 0cc4e93d| MOVD 42768(R0), V12
e1c4211c| FMOVS 69159(PC), F1 e1c4211c| FMOVS 69159(PC), F1
2071c35c| FMOVD -124023(PC), F0 2071c35c| FMOVD -124023(PC), F0
ae79703c| MOVD (R13)(R16), V14 ae79703c| MOVD (R13)(R16<<0), V14
38fb67bc| FMOVS (R25)(R7.SXTX<<2), F24 38fb67bc| FMOVS (R25)(R7.SXTX<<2), F24
3e6b6dfc| FMOVD (R25)(R13), F30 3e6b6dfc| FMOVD (R25)(R13), F30
a278ff3c| MOVD (R5)(ZR<<4), V2 a278ff3c| MOVD (R5)(ZR<<4), V2
@ -1925,7 +1925,7 @@ d46e39bd| FMOVS F20, 14700(R22)
b84f30fd| FMOVD F24, 24728(R29) b84f30fd| FMOVD F24, 24728(R29)
3cee993d| MOVD V28, 26544(R17) 3cee993d| MOVD V28, 26544(R17)
4348293c| MOVD V3, (R2)(R9.UXTW) 4348293c| MOVD V3, (R2)(R9.UXTW)
ed7b253c| MOVD V13, (RSP)(R5) ed7b253c| MOVD V13, (RSP)(R5<<0)
8fc9357c| MOVD V15, (R12)(R21.SXTW) 8fc9357c| MOVD V15, (R12)(R21.SXTW)
87f832bc| FMOVS F7, (R4)(R18.SXTX<<2) 87f832bc| FMOVS F7, (R4)(R18.SXTX<<2)
f1ea38fc| FMOVD F17, (R23)(R24.SXTX) f1ea38fc| FMOVD F17, (R23)(R24.SXTX)
@ -2164,7 +2164,7 @@ b63e8038| MOVB.W 3(R21), R22
4491c939| MOVBW 612(R10), R4 4491c939| MOVBW 612(R10), R4
497e8039| MOVB 31(R18), R9 497e8039| MOVB 31(R18), R9
7d6bf638| MOVBW (R27)(R22), R29 7d6bf638| MOVBW (R27)(R22), R29
e578ba38| MOVB (R7)(R26), R5 e578ba38| MOVB (R7)(R26<<0), R5
9f06ca78| MOVHW.P 160(R20), ZR 9f06ca78| MOVHW.P 160(R20), ZR
15c59d78| MOVH.P -36(R8), R21 15c59d78| MOVH.P -36(R8), R21
c07fd278| MOVHW.W -217(R30), R0 c07fd278| MOVHW.W -217(R30), R0
@ -2309,7 +2309,7 @@ d21508f8| MOVD.P R18, 129(R14)
1b441b38| MOVB.P R27, -76(R0) 1b441b38| MOVB.P R27, -76(R0)
d69c0f38| MOVB.W R22, 249(R6) d69c0f38| MOVB.W R22, 249(R6)
b7ce0d39| MOVB R23, 883(R21) b7ce0d39| MOVB R23, 883(R21)
2b7b3938| MOVB R11, (R25)(R25) 2b7b3938| MOVB R11, (R25)(R25<<0)
4e771d78| MOVH.P R14, -41(R26) 4e771d78| MOVH.P R14, -41(R26)
64cc0b78| MOVH.W R4, 188(R3) 64cc0b78| MOVH.W R4, 188(R3)
07b90279| MOVH R7, 348(R8) 07b90279| MOVH R7, 348(R8)
@ -2940,7 +2940,7 @@ d41d13bc| FMOVS.W F20, -207(R14)
409503fd| FMOVD F0, 1832(R10) 409503fd| FMOVD F0, 1832(R10)
58a1963d| MOVD V24, 23168(R10) 58a1963d| MOVD V24, 23168(R10)
51c8253c| MOVD V17, (R2)(R5.SXTW) 51c8253c| MOVD V17, (R2)(R5.SXTW)
967b313c| MOVD V22, (R28)(R17) 967b313c| MOVD V22, (R28)(R17<<0)
b4683e7c| MOVD V20, (R5)(R30) b4683e7c| MOVD V20, (R5)(R30)
64d9a33c| MOVD V4, (R11)(R3.SXTW<<4) 64d9a33c| MOVD V4, (R11)(R3.SXTW<<4)
e5e1143c| MOVD V5, -178(R15) e5e1143c| MOVD V5, -178(R15)
@ -3950,7 +3950,7 @@ f0e5357d| MOVD V16, 6898(R15)
aeb813fd| FMOVD F14, 10096(R5) aeb813fd| FMOVD F14, 10096(R5)
2cc4943d| MOVD V12, 21264(R1) 2cc4943d| MOVD V12, 21264(R1)
e2f8263c| MOVD V2, (R7)(R6.SXTX) e2f8263c| MOVD V2, (R7)(R6.SXTX)
1d79373c| MOVD V29, (R8)(R23) 1d79373c| MOVD V29, (R8)(R23<<0)
bc70003c| MOVD V28, 7(R5) bc70003c| MOVD V28, 7(R5)
7190157c| MOVD V17, -167(R3) 7190157c| MOVD V17, -167(R3)
073309bc| FMOVS F7, 147(R24) 073309bc| FMOVS F7, 147(R24)
@ -4562,3 +4562,17 @@ bd00639e| UCVTFD R5, F29
0b3c030e| VMOV V0.B[1], R11 0b3c030e| VMOV V0.B[1], R11
2c3c0e0e| VMOV V1.H[3], R12 2c3c0e0e| VMOV V1.H[3], R12
d7061a6f| VUSHR $6, V22.H8, V23.H8 d7061a6f| VUSHR $6, V22.H8, V23.H8
44f82638| MOVB R4, (R2)(R6.SXTX)
44e82638| MOVB R4, (R2)(R6.SXTX)
44682638| MOVB R4, (R2)(R6)
44782638| MOVB R4, (R2)(R6<<0)
44e8a638| MOVB (R2)(R6.SXTX), R4
44f8a638| MOVB (R2)(R6.SXTX), R4
4468a638| MOVB (R2)(R6), R4
4478a638| MOVB (R2)(R6<<0), R4
44e86638| MOVBU (R2)(R6.SXTX), R4
44f86638| MOVBU (R2)(R6.SXTX), R4
44686638| MOVBU (R2)(R6), R4
44786638| MOVBU (R2)(R6<<0), R4
ae7bbe38| MOVB (R29)(R30<<0), R14
ae6bbe38| MOVB (R29)(R30), R14