Skip to content

Commit eeb1ba7

Browse files
eric fangcherrymui
eric fang
authored andcommitted
cmd/compile/obj/arm64: fix encoding error of FMOVD/FMOVS $0|ZR
Previously the first operand of FMOVD and FMOVS could be $0, which would be converted to the ZR register. This is prohibited by CL 404316, also it broken the encoding of "FMOVD/FMOVS ZR, Rn", this CL restores this instruction format and fixes the encoding issue. Fixes #54655. Fixes #54729. Change-Id: I9c42cd41296bed7ffd601609bd8ecaa27d11e659 Reviewed-on: https://go-review.googlesource.com/c/go/+/425188 Run-TryBot: Eric Fang <eric.fang@arm.com> Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Bryan Mills <bcmills@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
1 parent 7393049 commit eeb1ba7

File tree

3 files changed

+8
-2
lines changed

3 files changed

+8
-2
lines changed

Diff for: src/cmd/asm/internal/asm/testdata/arm64.s

+4
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,10 @@ TEXT foo(SB), DUPOK|NOSPLIT, $-8
234234
FMOVD $(0.1796875), F2 // 02f0681e
235235
FMOVS $(0.96875), F3 // 03f02d1e
236236
FMOVD $(28.0), F4 // 0490671e
237+
FMOVD $0, F0 // e003679e
238+
FMOVS $0, F0 // e003271e
239+
FMOVD ZR, F0 // e003679e
240+
FMOVS ZR, F0 // e003271e
237241
VUADDW V9.B8, V12.H8, V14.H8 // 8e11292e
238242
VUADDW V13.H4, V10.S4, V11.S4 // 4b116d2e
239243
VUADDW V21.S2, V24.D2, V29.D2 // 1d13b52e

Diff for: src/cmd/internal/obj/arm64/asm7.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -3884,13 +3884,13 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
38843884
case 29: /* op Rn, Rd */
38853885
fc := c.aclass(&p.From)
38863886
tc := c.aclass(&p.To)
3887-
if (p.As == AFMOVD || p.As == AFMOVS) && (fc == C_REG || tc == C_REG) {
3887+
if (p.As == AFMOVD || p.As == AFMOVS) && (fc == C_REG || fc == C_ZREG || tc == C_REG) {
38883888
// FMOV Rx, Fy or FMOV Fy, Rx
38893889
o1 = FPCVTI(0, 0, 0, 0, 6)
38903890
if p.As == AFMOVD {
38913891
o1 |= 1<<31 | 1<<22 // 64-bit
38923892
}
3893-
if fc == C_REG {
3893+
if fc == C_REG || fc == C_ZREG {
38943894
o1 |= 1 << 16 // FMOV Rx, Fy
38953895
}
38963896
} else {

Diff for: src/cmd/internal/obj/arm64/obj7.go

+2
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ var zrReplace = map[obj.As]bool{
6969
AADCW: true,
7070
AADCS: true,
7171
AADCSW: true,
72+
AFMOVD: true,
73+
AFMOVS: true,
7274
}
7375

7476
func (c *ctxt7) stacksplit(p *obj.Prog, framesize int32) *obj.Prog {

0 commit comments

Comments
 (0)