src/cmd/asm/internal/arch/arm.go | 9 +++++++++ src/cmd/asm/internal/asm/asm.go | 5 +++++ src/cmd/asm/internal/asm/testdata/arm.out | 4 +++- src/cmd/asm/internal/asm/testdata/arm.s | 4 ++++ diff --git a/src/cmd/asm/internal/arch/arm.go b/src/cmd/asm/internal/arch/arm.go index c03021446061a7bd0aaf5bd234ca36c8516d7cbe..8df994e8d19ee7a8d2835ca3abee6939f054bbf2 100644 --- a/src/cmd/asm/internal/arch/arm.go +++ b/src/cmd/asm/internal/arch/arm.go @@ -121,6 +121,15 @@ } return false } +// IsARMFloatCmp reports whether the op is a floating comparison instruction. +func IsARMFloatCmp(op int) bool { + switch op { + case arm.ACMPF, arm.ACMPD: + return true + } + return false +} + // ARMMRCOffset implements the peculiar encoding of the MRC and MCR instructions. // The difference between MRC and MCR is represented by a bit high in the word, not // in the usual way by the opcode itself. Asm must use AMRC for both instructions, so diff --git a/src/cmd/asm/internal/asm/asm.go b/src/cmd/asm/internal/asm/asm.go index 7ac8bf49de8295c46c39f9a8d167b85d164d0f04..3563c1a34c636e95d52ff34e65c65f24d4e6d54e 100644 --- a/src/cmd/asm/internal/asm/asm.go +++ b/src/cmd/asm/internal/asm/asm.go @@ -463,6 +463,11 @@ break } p.errorf("unrecognized addressing for %s", obj.Aconv(op)) } + if arch.IsARMFloatCmp(op) { + prog.From = a[0] + prog.Reg = p.getRegister(prog, op, &a[1]) + break + } } else if p.arch.Thechar == '7' && arch.IsARM64CMP(op) { prog.From = a[0] prog.Reg = p.getRegister(prog, op, &a[1]) diff --git a/src/cmd/asm/internal/asm/testdata/arm.out b/src/cmd/asm/internal/asm/testdata/arm.out index 7501db3e5aac462e848c2eeb6412bcebd9c7db4e..1af3999783b9faaecd81faa0ebab967ce1e3e3ed 100644 --- a/src/cmd/asm/internal/asm/testdata/arm.out +++ b/src/cmd/asm/internal/asm/testdata/arm.out @@ -56,4 +56,6 @@ 280 00055 (testdata/arm.s:280) JMP foo(SB) 281 00056 (testdata/arm.s:281) CALL foo(SB) 282 00057 (testdata/arm.s:282) JMP foo(SB) 283 00058 (testdata/arm.s:283) CALL foo(SB) -292 00059 (testdata/arm.s:292) END +286 00059 (testdata/arm.s:286) CMPF F1, F2 +287 00060 (testdata/arm.s:287) CMPD F1, F2 +296 00061 (testdata/arm.s:296) END diff --git a/src/cmd/asm/internal/asm/testdata/arm.s b/src/cmd/asm/internal/asm/testdata/arm.s index b8bdfb201a168a566a9537c9ea004f98b3493312..95fee50bdf82d3527551aa212a5d42f222066d7c 100644 --- a/src/cmd/asm/internal/asm/testdata/arm.s +++ b/src/cmd/asm/internal/asm/testdata/arm.s @@ -282,6 +282,10 @@ BL foo(SB) JMP foo(SB) CALL foo(SB) +// CMPF and CMPD are special. + CMPF F1, F2 + CMPD F1, F2 + // // END //