]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/arm: fix comparison & conditional branch for SSA on ARM
authorCherry Zhang <cherryyz@google.com>
Mon, 18 Apr 2016 16:21:51 +0000 (12:21 -0400)
committerMinux Ma <minux@golang.org>
Thu, 21 Apr 2016 16:01:05 +0000 (16:01 +0000)
Progress on SSA for ARM. Still not complete. Now Fibonacci function compiles
and runs correctly.

The old backend swaps the operands for CMP instruction. This CL does the same
on SSA backend, and uses conditional branch accordingly.

Updates #15365.

Change-Id: I117e17feb22f03d936608bd232f76970e4bbe21a
Reviewed-on: https://go-review.googlesource.com/22187
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/arm/ssa.go

index e6211d00b7e921e07af6e70f54b5fe72f9589d56..ca10f1c5082fa92f65916435823a4ec257a3932c 100644 (file)
@@ -91,8 +91,10 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
        case ssa.OpARMCMP:
                p := gc.Prog(v.Op.Asm())
                p.From.Type = obj.TYPE_REG
-               p.From.Reg = gc.SSARegNum(v.Args[0])
-               p.Reg = gc.SSARegNum(v.Args[1])
+               // Special layout in ARM assembly
+               // Comparing to x86, the operands of ARM's CMP are reversed.
+               p.From.Reg = gc.SSARegNum(v.Args[1])
+               p.Reg = gc.SSARegNum(v.Args[0])
        case ssa.OpARMMOVWload:
                p := gc.Prog(v.Op.Asm())
                p.From.Type = obj.TYPE_MEM
@@ -142,7 +144,7 @@ func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
        case ssa.BlockRet:
                gc.Prog(obj.ARET)
        case ssa.BlockARMLT:
-               p := gc.Prog(arm.ABGE)
+               p := gc.Prog(arm.ABLT)
                p.To.Type = obj.TYPE_BRANCH
                s.Branches = append(s.Branches, gc.Branch{p, b.Succs[0]})
                p = gc.Prog(obj.AJMP)