diff options
| author | fanzha02 <fannie.zhang@arm.com> | 2017-12-08 08:19:32 +0000 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2018-04-09 18:20:41 +0000 |
| commit | 31700b83b5d9bdc2ddc474fd72b809a7b585d6da (patch) | |
| tree | fe4f875dfd824522743ad9d912d1c414fd582879 /src/cmd/internal/obj/util.go | |
| parent | 14393c5cd4fed812c87ba45fe4e2b8d07c02e8fa (diff) | |
| download | go-31700b83b5d9bdc2ddc474fd72b809a7b585d6da.tar.xz | |
cmd/internal/obj/arm64: add assembler support for load with register offset
The patch adds support for LDR(register offset) instruction.
And add the test cases and negative tests.
Change-Id: I5b32c6a5065afc4571116d4896f7ebec3c0416d3
Reviewed-on: https://go-review.googlesource.com/87955
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/cmd/internal/obj/util.go')
| -rw-r--r-- | src/cmd/internal/obj/util.go | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/cmd/internal/obj/util.go b/src/cmd/internal/obj/util.go index 3fc6113112..2d457fd503 100644 --- a/src/cmd/internal/obj/util.go +++ b/src/cmd/internal/obj/util.go @@ -214,7 +214,12 @@ func Dconv(p *Prog, a *Addr) string { case TYPE_MEM: str = Mconv(a) if a.Index != REG_NONE { - str += fmt.Sprintf("(%v*%d)", Rconv(int(a.Index)), int(a.Scale)) + if a.Scale == 0 { + // arm64 shifted or extended register offset, scale = 0. + str += fmt.Sprintf("(%v)", Rconv(int(a.Index))) + } else { + str += fmt.Sprintf("(%v*%d)", Rconv(int(a.Index)), int(a.Scale)) + } } case TYPE_CONST: @@ -294,7 +299,17 @@ func Mconv(a *Addr) string { case a.Offset == 0: str = fmt.Sprintf("(%v)", Rconv(int(a.Reg))) case a.Offset != 0: - str = fmt.Sprintf("%d(%v)", a.Offset, Rconv(int(a.Reg))) + switch objabi.GOARCH { + case "arm64": + // the register and the extension/shift are encoded in a.Offset. + if a.Index != 0 { + str = fmt.Sprintf("(%v)", Rconv(int(a.Reg))) + return str + } + fallthrough + default: + str = fmt.Sprintf("%d(%v)", a.Offset, Rconv(int(a.Reg))) + } } // Note: a.Reg == REG_NONE encodes the default base register for the NAME_ type. |
