]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.5] cmd/asm: handle CMPF and CMPD on ARM
authorRob Pike <r@golang.org>
Wed, 2 Sep 2015 20:11:26 +0000 (13:11 -0700)
committerAndrew Gerrand <adg@golang.org>
Tue, 8 Sep 2015 23:23:05 +0000 (23:23 +0000)
These instructions are special cases that were missed in the translation.
The second argument must go into the Reg field not the To field.

Fixes #12458

For Go 1.5.1

Change-Id: Iad57c60c7e38e3bcfafda483ed5037ce670e8816
Reviewed-on: https://go-review.googlesource.com/14183
Reviewed-by: Dave Cheney <dave@cheney.net>
Reviewed-by: Russ Cox <rsc@golang.org>
Reviewed-on: https://go-review.googlesource.com/14358
Reviewed-by: Chris Broadfoot <cbro@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
src/cmd/asm/internal/arch/arm.go
src/cmd/asm/internal/asm/asm.go
src/cmd/asm/internal/asm/testdata/arm.out
src/cmd/asm/internal/asm/testdata/arm.s

index c03021446061a7bd0aaf5bd234ca36c8516d7cbe..8df994e8d19ee7a8d2835ca3abee6939f054bbf2 100644 (file)
@@ -121,6 +121,15 @@ func IsARMMRC(op int) bool {
        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
index 7ac8bf49de8295c46c39f9a8d167b85d164d0f04..3563c1a34c636e95d52ff34e65c65f24d4e6d54e 100644 (file)
@@ -463,6 +463,11 @@ func (p *Parser) asmInstruction(op int, cond string, a []obj.Addr) {
                                }
                                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])
index 7501db3e5aac462e848c2eeb6412bcebd9c7db4e..1af3999783b9faaecd81faa0ebab967ce1e3e3ed 100644 (file)
@@ -56,4 +56,6 @@
 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
index b8bdfb201a168a566a9537c9ea004f98b3493312..95fee50bdf82d3527551aa212a5d42f222066d7c 100644 (file)
@@ -282,6 +282,10 @@ TEXT       foo(SB), 0, $0
        JMP     foo(SB)
        CALL    foo(SB)
 
+// CMPF and CMPD are special.
+       CMPF F1, F2
+       CMPD F1, F2
+
 //
 // END
 //