From 356b87fa7bbba02debea59d2d03e1eca1750ccb6 Mon Sep 17 00:00:00 2001 From: Junyang Shao Date: Fri, 10 Apr 2026 17:14:35 +0000 Subject: cmd/asm, cmd/internal/obj/arm64: support memory with MUL VL imm offset This CL is generated by CL 765440. This CL supports this addressing pattern: (VL*imm)(Reg) (-VL*imm)(Reg) Change-Id: I4d1bab2ef6c4141699a47b28aa14b28cdee6cb3f Reviewed-on: https://go-review.googlesource.com/c/go/+/765420 LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com Reviewed-by: David Chase Commit-Queue: Junyang Shao --- src/cmd/asm/internal/asm/parse.go | 24 +++++++ src/cmd/asm/internal/asm/testdata/arm64sveenc.s | 77 +++++++++++++++++++++++ src/cmd/asm/internal/asm/testdata/arm64sveerror.s | 77 +++++++++++++++++++++++ 3 files changed, 178 insertions(+) (limited to 'src/cmd/asm') diff --git a/src/cmd/asm/internal/asm/parse.go b/src/cmd/asm/internal/asm/parse.go index 935be172cc..0094e305b0 100644 --- a/src/cmd/asm/internal/asm/parse.go +++ b/src/cmd/asm/internal/asm/parse.go @@ -472,6 +472,30 @@ func (p *Parser) operand(a *obj.Addr) { return } + // Detect (VL*imm) or (-VL*imm) pattern in ARM64 + if p.arch.Family == sys.ARM64 && len(p.input) >= 5 && p.input[0].ScanToken == '(' { + pos := 1 + sign := int64(1) + if p.input[pos].ScanToken == '-' { + sign = -1 + pos++ + } else if p.input[pos].ScanToken == '+' { + pos++ + } + if pos+3 < len(p.input) && p.input[pos].String() == "VL" && p.input[pos+1].ScanToken == '*' && p.input[pos+2].ScanToken == scanner.Int && p.input[pos+3].ScanToken == ')' { + imm := int64(p.atoi(p.input[pos+2].String())) + imm *= sign + a.Offset = imm + a.Scale = -32768 // bit 15 signals multiple of Vector Length + + // Remove the (VL*imm) tokens and let operand parse the remaining sequence (reg.T) + p.input = p.input[pos+4:] + p.inputPos = 0 + p.operand(a) + return + } + } + // Constant. haveConstant := false switch tok.ScanToken { diff --git a/src/cmd/asm/internal/asm/testdata/arm64sveenc.s b/src/cmd/asm/internal/asm/testdata/arm64sveenc.s index 04a1eb9b98..8fa3cc9c78 100644 --- a/src/cmd/asm/internal/asm/testdata/arm64sveenc.s +++ b/src/cmd/asm/internal/asm/testdata/arm64sveenc.s @@ -1209,4 +1209,81 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$-8 ZST1H 6(Z7.D), P4, [Z13.D] // edb0c3e4 ZST1W 12(Z0.S), P6, [Z25.S] // 19b863e5 ZST1W 12(Z0.D), P6, [Z25.D] // 19b843e5 + PLDR (-VL*2)(RSP), P5 // e51bbf85 + PPRFB (VL*1)(RSP), P3, PSTL3KEEP // ec0fc185 + PPRFD (VL*1)(RSP), P3, PSTL3KEEP // ec6fc185 + PPRFH (VL*1)(RSP), P3, PSTL3KEEP // ec2fc185 + PPRFW (VL*1)(RSP), P3, PSTL3KEEP // ec4fc185 + PSTR (-VL*2)(RSP), P5 // e51bbfe5 + ZLD1B (-VL*2)(R14), P4.Z, [Z13.B] // cdb10ea4 + ZLD1B (-VL*2)(R14), P4.Z, [Z13.H] // cdb12ea4 + ZLD1B (-VL*2)(R14), P4.Z, [Z13.S] // cdb14ea4 + ZLD1B (-VL*2)(R14), P4.Z, [Z13.D] // cdb16ea4 + ZLD1H (-VL*2)(R14), P4.Z, [Z13.H] // cdb1aea4 + ZLD1H (-VL*2)(R14), P4.Z, [Z13.S] // cdb1cea4 + ZLD1H (-VL*2)(R14), P4.Z, [Z13.D] // cdb1eea4 + ZLD1SB (-VL*2)(R14), P4.Z, [Z13.H] // cdb1cea5 + ZLD1SB (-VL*2)(R14), P4.Z, [Z13.S] // cdb1aea5 + ZLD1SB (-VL*2)(R14), P4.Z, [Z13.D] // cdb18ea5 + ZLD1SH (-VL*2)(R14), P4.Z, [Z13.S] // cdb12ea5 + ZLD1SH (-VL*2)(R14), P4.Z, [Z13.D] // cdb10ea5 + ZLD1SW (-VL*2)(R14), P4.Z, [Z13.D] // cdb18ea4 + ZLD2B (-VL*2)(R14), P4.Z, [Z13.B, Z14.B] // cdf12fa4 + ZLD2D (-VL*2)(R14), P4.Z, [Z13.D, Z14.D] // cdf1afa5 + ZLD2H (-VL*2)(R14), P4.Z, [Z13.H, Z14.H] // cdf1afa4 + ZLD2Q (-VL*2)(R14), P4.Z, [Z13.Q, Z14.Q] // cdf19fa4 + ZLD2W (-VL*2)(R14), P4.Z, [Z13.S, Z14.S] // cdf12fa5 + ZLD3B (-VL*3)(R10), P4.Z, [Z21.B, Z22.B, Z23.B] // 55f14fa4 + ZLD3D (-VL*3)(R10), P4.Z, [Z21.D, Z22.D, Z23.D] // 55f1cfa5 + ZLD3H (-VL*3)(R10), P4.Z, [Z21.H, Z22.H, Z23.H] // 55f1cfa4 + ZLD3Q (-VL*3)(R10), P4.Z, [Z21.Q, Z22.Q, Z23.Q] // 55f11fa5 + ZLD3W (-VL*3)(R10), P4.Z, [Z21.S, Z22.S, Z23.S] // 55f14fa5 + ZLD4B (VL*4)(R4), P6.Z, [Z25.B, Z26.B, Z27.B, Z28.B]// 99f861a4 + ZLD4D (VL*4)(R4), P6.Z, [Z25.D, Z26.D, Z27.D, Z28.D]// 99f8e1a5 + ZLD4H (VL*4)(R4), P6.Z, [Z25.H, Z26.H, Z27.H, Z28.H]// 99f8e1a4 + ZLD4Q (VL*4)(R4), P6.Z, [Z25.Q, Z26.Q, Z27.Q, Z28.Q]// 99f891a5 + ZLD4W (VL*4)(R4), P6.Z, [Z25.S, Z26.S, Z27.S, Z28.S]// 99f861a5 + ZLDNF1B (-VL*2)(R14), P4.Z, [Z13.B] // cdb11ea4 + ZLDNF1B (-VL*2)(R14), P4.Z, [Z13.H] // cdb13ea4 + ZLDNF1B (-VL*2)(R14), P4.Z, [Z13.S] // cdb15ea4 + ZLDNF1B (-VL*2)(R14), P4.Z, [Z13.D] // cdb17ea4 + ZLDNF1D (-VL*2)(R14), P4.Z, [Z13.D] // cdb1fea5 + ZLDNF1H (-VL*2)(R14), P4.Z, [Z13.H] // cdb1bea4 + ZLDNF1H (-VL*2)(R14), P4.Z, [Z13.S] // cdb1dea4 + ZLDNF1H (-VL*2)(R14), P4.Z, [Z13.D] // cdb1fea4 + ZLDNF1SB (-VL*2)(R14), P4.Z, [Z13.H] // cdb1dea5 + ZLDNF1SB (-VL*2)(R14), P4.Z, [Z13.S] // cdb1bea5 + ZLDNF1SB (-VL*2)(R14), P4.Z, [Z13.D] // cdb19ea5 + ZLDNF1SH (-VL*2)(R14), P4.Z, [Z13.S] // cdb13ea5 + ZLDNF1SH (-VL*2)(R14), P4.Z, [Z13.D] // cdb11ea5 + ZLDNF1SW (-VL*2)(R14), P4.Z, [Z13.D] // cdb19ea4 + ZLDNF1W (-VL*2)(R14), P4.Z, [Z13.S] // cdb15ea5 + ZLDNF1W (-VL*2)(R14), P4.Z, [Z13.D] // cdb17ea5 + ZLDNT1B (-VL*2)(R14), P4.Z, [Z13.B] // cdf10ea4 + ZLDNT1D (-VL*2)(R14), P4.Z, [Z13.D] // cdf18ea5 + ZLDNT1H (-VL*2)(R14), P4.Z, [Z13.H] // cdf18ea4 + ZLDNT1W (-VL*2)(R14), P4.Z, [Z13.S] // cdf10ea5 + ZLDR (-VL*2)(RSP), Z7 // e75bbf85 + ZST1B (-VL*2)(R14), P4, [Z13.B] // cdf10ee4 + ZST1H (-VL*2)(RSP), P1, [Z12.S] // ece7cee4 + ZST2B (-VL*2)(R14), P4, [Z13.B, Z14.B] // cdf13fe4 + ZST2D (-VL*2)(R14), P4, [Z13.D, Z14.D] // cdf1bfe5 + ZST2H (-VL*2)(R14), P4, [Z13.H, Z14.H] // cdf1bfe4 + ZST2Q (-VL*2)(R14), P4, [Z13.Q, Z14.Q] // cd114fe4 + ZST2W (-VL*2)(R14), P4, [Z13.S, Z14.S] // cdf13fe5 + ZST3B (-VL*3)(R10), P4, [Z21.B, Z22.B, Z23.B] // 55f15fe4 + ZST3D (-VL*3)(R10), P4, [Z21.D, Z22.D, Z23.D] // 55f1dfe5 + ZST3H (-VL*3)(R10), P4, [Z21.H, Z22.H, Z23.H] // 55f1dfe4 + ZST3Q (-VL*3)(R10), P4, [Z21.Q, Z22.Q, Z23.Q] // 55118fe4 + ZST3W (-VL*3)(R10), P4, [Z21.S, Z22.S, Z23.S] // 55f15fe5 + ZST4B (VL*4)(R4), P6, [Z25.B, Z26.B, Z27.B, Z28.B]// 99f871e4 + ZST4D (VL*4)(R4), P6, [Z25.D, Z26.D, Z27.D, Z28.D]// 99f8f1e5 + ZST4H (VL*4)(R4), P6, [Z25.H, Z26.H, Z27.H, Z28.H]// 99f8f1e4 + ZST4Q (VL*4)(R4), P6, [Z25.Q, Z26.Q, Z27.Q, Z28.Q]// 9918c1e4 + ZST4W (VL*4)(R4), P6, [Z25.S, Z26.S, Z27.S, Z28.S]// 99f871e5 + ZSTNT1B (-VL*2)(R14), P4, [Z13.B] // cdf11ee4 + ZSTNT1D (-VL*2)(R14), P4, [Z13.D] // cdf19ee5 + ZSTNT1H (-VL*2)(R14), P4, [Z13.H] // cdf19ee4 + ZSTNT1W (-VL*2)(R14), P4, [Z13.S] // cdf11ee5 + ZSTR (-VL*2)(RSP), Z7 // e75bbfe5 RET diff --git a/src/cmd/asm/internal/asm/testdata/arm64sveerror.s b/src/cmd/asm/internal/asm/testdata/arm64sveerror.s index ea33010739..4f06883bff 100644 --- a/src/cmd/asm/internal/asm/testdata/arm64sveerror.s +++ b/src/cmd/asm/internal/asm/testdata/arm64sveerror.s @@ -1208,4 +1208,81 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$-8 ZST1H 11(Z1.D), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" ZST1W 11(Z1.S), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" ZST1W 11(Z1.D), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + PLDR (VL*3)(RSP), P13.Z // ERROR "illegal combination from SVE" + PPRFB (VL*3)(RSP), P13.Z, PSTL3STRM // ERROR "illegal combination from SVE" + PPRFD (VL*3)(RSP), P13.Z, PSTL3STRM // ERROR "illegal combination from SVE" + PPRFH (VL*3)(RSP), P13.Z, PSTL3STRM // ERROR "illegal combination from SVE" + PPRFW (VL*3)(RSP), P13.Z, PSTL3STRM // ERROR "illegal combination from SVE" + PSTR (VL*3)(RSP), P13.Z // ERROR "illegal combination from SVE" + ZLD1B (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLD1B (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLD1B (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLD1B (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLD1H (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLD1H (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLD1H (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLD1SB (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLD1SB (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLD1SB (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLD1SH (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLD1SH (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLD1SW (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLD2B (VL*3)(RSP), P13.Z, [Z11.B, Z12.B] // ERROR "illegal combination from SVE" + ZLD2D (VL*3)(RSP), P13.Z, [Z11.B, Z12.B] // ERROR "illegal combination from SVE" + ZLD2H (VL*3)(RSP), P13.Z, [Z11.B, Z12.B] // ERROR "illegal combination from SVE" + ZLD2Q (VL*3)(RSP), P13.Z, [Z11.B, Z12.B] // ERROR "illegal combination from SVE" + ZLD2W (VL*3)(RSP), P13.Z, [Z11.B, Z12.B] // ERROR "illegal combination from SVE" + ZLD3B (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B] // ERROR "illegal combination from SVE" + ZLD3D (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B] // ERROR "illegal combination from SVE" + ZLD3H (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B] // ERROR "illegal combination from SVE" + ZLD3Q (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B] // ERROR "illegal combination from SVE" + ZLD3W (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B] // ERROR "illegal combination from SVE" + ZLD4B (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B, Z14.B]// ERROR "illegal combination from SVE" + ZLD4D (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B, Z14.B]// ERROR "illegal combination from SVE" + ZLD4H (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B, Z14.B]// ERROR "illegal combination from SVE" + ZLD4Q (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B, Z14.B]// ERROR "illegal combination from SVE" + ZLD4W (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B, Z14.B]// ERROR "illegal combination from SVE" + ZLDNF1B (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNF1B (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNF1B (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNF1B (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNF1D (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNF1H (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNF1H (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNF1H (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNF1SB (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNF1SB (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNF1SB (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNF1SH (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNF1SH (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNF1SW (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNF1W (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNF1W (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNT1B (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNT1D (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNT1H (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDNT1W (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZLDR (VL*3)(RSP), Z26.S // ERROR "illegal combination from SVE" + ZST1B (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZST1H (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZST2B (VL*3)(RSP), P13.Z, [Z11.B, Z12.B] // ERROR "illegal combination from SVE" + ZST2D (VL*3)(RSP), P13.Z, [Z11.B, Z12.B] // ERROR "illegal combination from SVE" + ZST2H (VL*3)(RSP), P13.Z, [Z11.B, Z12.B] // ERROR "illegal combination from SVE" + ZST2Q (VL*3)(RSP), P13.Z, [Z11.B, Z12.B] // ERROR "illegal combination from SVE" + ZST2W (VL*3)(RSP), P13.Z, [Z11.B, Z12.B] // ERROR "illegal combination from SVE" + ZST3B (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B] // ERROR "illegal combination from SVE" + ZST3D (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B] // ERROR "illegal combination from SVE" + ZST3H (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B] // ERROR "illegal combination from SVE" + ZST3Q (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B] // ERROR "illegal combination from SVE" + ZST3W (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B] // ERROR "illegal combination from SVE" + ZST4B (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B, Z14.B]// ERROR "illegal combination from SVE" + ZST4D (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B, Z14.B]// ERROR "illegal combination from SVE" + ZST4H (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B, Z14.B]// ERROR "illegal combination from SVE" + ZST4Q (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B, Z14.B]// ERROR "illegal combination from SVE" + ZST4W (VL*3)(RSP), P13.Z, [Z11.B, Z12.B, Z13.B, Z14.B]// ERROR "illegal combination from SVE" + ZSTNT1B (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZSTNT1D (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZSTNT1H (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZSTNT1W (VL*3)(RSP), P13.Z, [Z11.B] // ERROR "illegal combination from SVE" + ZSTR (VL*3)(RSP), Z26.S // ERROR "illegal combination from SVE" RET -- cgit v1.3