From: Cherry Zhang Date: Mon, 18 Apr 2016 16:21:51 +0000 (-0400) Subject: cmd/compile/internal/arm: fix comparison & conditional branch for SSA on ARM X-Git-Tag: go1.7beta1~562 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=7c6b48ffba9e0ea8ed846d194fe30189863f17f0;p=gostls13.git cmd/compile/internal/arm: fix comparison & conditional branch for SSA on ARM 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 --- diff --git a/src/cmd/compile/internal/arm/ssa.go b/src/cmd/compile/internal/arm/ssa.go index e6211d00b7..ca10f1c508 100644 --- a/src/cmd/compile/internal/arm/ssa.go +++ b/src/cmd/compile/internal/arm/ssa.go @@ -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)