Skip to content

Commit 0c4444e

Browse files
amusmangopherbot
authored andcommitted
cmd/internal/obj: support arm64 FMOVQ large offset encoding
Support arm64 FMOVQ with large offset in immediate which is encoded using register offset instruction in opldrr or opstrr. This will help allowing folding immediate into new ssa ops FMOVQload and FMOVQstore. For example: FMOVQ F0, -20000(R0) is encoded as following: MOVD 3(PC), R27 FMOVQ F0, (R0)(R27) RET ffff b1e0 # constant value Change-Id: Ib71f92f6ff4b310bda004a440b1df41ffe164523 Reviewed-on: https://go-review.googlesource.com/c/go/+/716960 Reviewed-by: Cherry Mui <cherryyz@google.com> Auto-Submit: Michael Pratt <mpratt@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Pratt <mpratt@google.com>
1 parent 85bec79 commit 0c4444e

File tree

2 files changed

+8
-0
lines changed

2 files changed

+8
-0
lines changed

src/cmd/asm/internal/asm/testdata/arm64.s

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,8 @@ TEXT foo(SB), DUPOK|NOSPLIT, $-8
630630
FMOVS F1, 0x44332211(R2) // FMOVS F1, 1144201745(R2)
631631
FMOVD F1, 0x1007000(R2) // FMOVD F1, 16805888(R2)
632632
FMOVD F1, 0x44332211(R2) // FMOVD F1, 1144201745(R2)
633+
FMOVQ F1, 0x1003000(R2) // FMOVQ F1, 16789504(R2)
634+
FMOVQ F1, 0x44332211(R2) // FMOVQ F1, 1144201745(R2)
633635

634636
MOVB 0x1000000(R1), R2 // MOVB 16777216(R1), R2
635637
MOVB 0x44332211(R1), R2 // MOVB 1144201745(R1), R2
@@ -643,6 +645,8 @@ TEXT foo(SB), DUPOK|NOSPLIT, $-8
643645
FMOVS 0x44332211(R1), F2 // FMOVS 1144201745(R1), F2
644646
FMOVD 0x1000000(R1), F2 // FMOVD 16777216(R1), F2
645647
FMOVD 0x44332211(R1), F2 // FMOVD 1144201745(R1), F2
648+
FMOVQ 0x1000000(R1), F2 // FMOVQ 16777216(R1), F2
649+
FMOVQ 0x44332211(R1), F2 // FMOVQ 1144201745(R1), F2
646650

647651
// shifted or extended register offset.
648652
MOVD (R2)(R6.SXTW), R4 // 44c866f8

src/cmd/internal/obj/arm64/asm7.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7276,6 +7276,8 @@ func (c *ctxt7) opldrr(p *obj.Prog, a obj.As, rt, rn, rm int16, extension bool)
72767276
op = OptionS<<10 | 0x3<<21 | 0x17<<27 | 1<<26
72777277
case AFMOVD:
72787278
op = OptionS<<10 | 0x3<<21 | 0x1f<<27 | 1<<26
7279+
case AFMOVQ:
7280+
op = OptionS<<10 | 0x7<<21 | 0x07<<27 | 1<<26
72797281
default:
72807282
c.ctxt.Diag("bad opldrr %v\n%v", a, p)
72817283
return 0
@@ -7308,6 +7310,8 @@ func (c *ctxt7) opstrr(p *obj.Prog, a obj.As, rt, rn, rm int16, extension bool)
73087310
op = OptionS<<10 | 0x1<<21 | 0x17<<27 | 1<<26
73097311
case AFMOVD:
73107312
op = OptionS<<10 | 0x1<<21 | 0x1f<<27 | 1<<26
7313+
case AFMOVQ:
7314+
op = OptionS<<10 | 0x5<<21 | 0x07<<27 | 1<<26
73117315
default:
73127316
c.ctxt.Diag("bad opstrr %v\n%v", a, p)
73137317
return 0

0 commit comments

Comments
 (0)