diff options
| author | Shenghou Ma <minux@golang.org> | 2015-04-04 01:47:55 -0400 |
|---|---|---|
| committer | Minux Ma <minux@golang.org> | 2015-04-08 05:22:41 +0000 |
| commit | a175fa3bc3a69b4090eb594af9203d0f0fb9cf44 (patch) | |
| tree | f147fbf9802d12775024e4c39a9cd8f6b87fd403 /src/cmd | |
| parent | 35599e281b1c07f0a1cd9f334a7939bd28ec537c (diff) | |
| download | go-a175fa3bc3a69b4090eb594af9203d0f0fb9cf44.tar.xz | |
cmd/asm/internal/asm: parse arm64 register pairs for LDP/STP
Add test, and while we're at here, also add a test for ARM.
Fixes #10343.
Change-Id: Ic914df8233d4f1f495e2cc0743fbd37b7671bc91
Signed-off-by: Shenghou Ma <minux@golang.org>
Reviewed-on: https://go-review.googlesource.com/8472
Reviewed-by: Aram Hăvărneanu <aram@mgk.ro>
Reviewed-by: Rob Pike <r@golang.org>
Diffstat (limited to 'src/cmd')
| -rw-r--r-- | src/cmd/asm/internal/asm/operand_test.go | 2 | ||||
| -rw-r--r-- | src/cmd/asm/internal/asm/parse.go | 10 |
2 files changed, 8 insertions, 4 deletions
diff --git a/src/cmd/asm/internal/asm/operand_test.go b/src/cmd/asm/internal/asm/operand_test.go index 1b10a3ad10..b9154a91e9 100644 --- a/src/cmd/asm/internal/asm/operand_test.go +++ b/src/cmd/asm/internal/asm/operand_test.go @@ -287,6 +287,7 @@ var armOperandTests = []operandTest{ {"retlo+12(FP)", "retlo+12(FP)"}, {"runtime·_sfloat2(SB)", "runtime._sfloat2(SB)"}, {"·AddUint32(SB)", "\"\".AddUint32(SB)"}, + {"(R1, R3)", "(R1, R3)"}, } var ppc64OperandTests = []operandTest{ @@ -424,4 +425,5 @@ var arm64OperandTests = []operandTest{ {"$runtime·badsystemstack(SB)", "$runtime.badsystemstack(SB)"}, {"ZR", "ZR"}, {"(ZR)", "(ZR)"}, + {"(R29, RSP)", "(R29, RSP)"}, } diff --git a/src/cmd/asm/internal/asm/parse.go b/src/cmd/asm/internal/asm/parse.go index 81d7cccd0e..6b67451d5f 100644 --- a/src/cmd/asm/internal/asm/parse.go +++ b/src/cmd/asm/internal/asm/parse.go @@ -461,7 +461,7 @@ func (p *Parser) register(name string, prefix rune) (r1, r2 int16, scale int8, o char := p.arch.Thechar switch p.next().ScanToken { case ',': - if char != '5' { + if char != '5' && char != '7' { p.errorf("illegal register pair syntax") return } @@ -629,15 +629,17 @@ func (p *Parser) registerIndirect(a *obj.Addr, prefix rune) { a.Reg = r1 if r2 != 0 { // TODO: Consistency in the encoding would be nice here. - if p.arch.Thechar == '5' { - // Special form for ARM: destination register pair (R1, R2). + if p.arch.Thechar == '5' || p.arch.Thechar == '7' { + // Special form + // ARM: destination register pair (R1, R2). + // ARM64: register pair (R1, R2) for LDP/STP. if prefix != 0 || scale != 0 { p.errorf("illegal address mode for register pair") return } a.Type = obj.TYPE_REGREG a.Offset = int64(r2) - // Nothing may follow; this is always a pure destination. + // Nothing may follow return } if p.arch.Thechar == '9' { |
