1
0
mirror of https://github.com/golang/go synced 2024-11-12 08:40:21 -07:00

cmd/asm: handle CMPF and CMPD on ARM

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>
This commit is contained in:
Rob Pike 2015-09-02 13:11:26 -07:00
parent d737639c4a
commit 36af087aef
4 changed files with 21 additions and 1 deletions

View 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

View File

@ -469,6 +469,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])

View File

@ -55,4 +55,6 @@
273 00055 (testdata/arm.s:273) CALL foo(SB)
274 00056 (testdata/arm.s:274) JMP foo(SB)
275 00057 (testdata/arm.s:275) CALL foo(SB)
284 00058 (testdata/arm.s:284) END
278 00058 (testdata/arm.s:278) CMPF F1, F2
279 00059 (testdata/arm.s:279) CMPD F1, F2
288 00060 (testdata/arm.s:288) END

View File

@ -274,6 +274,10 @@ TEXT foo(SB), 0, $0
JMP foo(SB)
CALL foo(SB)
// CMPF and CMPD are special.
CMPF F1, F2
CMPD F1, F2
//
// END
//