aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/obj/util.go
diff options
context:
space:
mode:
authorfanzha02 <fannie.zhang@arm.com>2017-12-08 08:19:32 +0000
committerBrad Fitzpatrick <bradfitz@golang.org>2018-04-09 18:20:41 +0000
commit31700b83b5d9bdc2ddc474fd72b809a7b585d6da (patch)
treefe4f875dfd824522743ad9d912d1c414fd582879 /src/cmd/internal/obj/util.go
parent14393c5cd4fed812c87ba45fe4e2b8d07c02e8fa (diff)
downloadgo-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.go19
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.