mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.ssa] cmd/compile: handle boolean values for SSA on ARM
Fix hardcoded flag register mask in ssa/flagalloc.go by auto-generating the mask. Also fix a mistake (in previous CL) about conditional branches. Progress on SSA backend for ARM. Still not complete. Now "container/ring" package compiles and tests passed. Updates #15365. Change-Id: Id7c8805c30dbb8107baedb485ed0f71f59ed6ea8 Reviewed-on: https://go-review.googlesource.com/23093 Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
e2848de9ef
commit
ccaed50c7b
11 changed files with 616 additions and 49 deletions
|
|
@ -193,7 +193,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
|||
case ssa.OpARMMOVBreg,
|
||||
ssa.OpARMMOVBUreg,
|
||||
ssa.OpARMMOVHreg,
|
||||
ssa.OpARMMOVHUreg:
|
||||
ssa.OpARMMOVHUreg,
|
||||
ssa.OpARMMVN:
|
||||
if v.Type.IsMemory() {
|
||||
v.Fatalf("memory operand for %s", v.LongString())
|
||||
}
|
||||
|
|
@ -270,12 +271,37 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
|||
ssa.OpARMLessEqualU,
|
||||
ssa.OpARMGreaterThanU,
|
||||
ssa.OpARMGreaterEqualU:
|
||||
v.Fatalf("pseudo-op made it to output: %s", v.LongString())
|
||||
// generate boolean values
|
||||
// use conditional move
|
||||
p := gc.Prog(arm.AMOVW)
|
||||
p.From.Type = obj.TYPE_CONST
|
||||
p.From.Offset = 0
|
||||
p.To.Type = obj.TYPE_REG
|
||||
p.To.Reg = gc.SSARegNum(v)
|
||||
p = gc.Prog(arm.AMOVW)
|
||||
p.Scond = condBits[v.Op]
|
||||
p.From.Type = obj.TYPE_CONST
|
||||
p.From.Offset = 1
|
||||
p.To.Type = obj.TYPE_REG
|
||||
p.To.Reg = gc.SSARegNum(v)
|
||||
default:
|
||||
v.Unimplementedf("genValue not implemented: %s", v.LongString())
|
||||
}
|
||||
}
|
||||
|
||||
var condBits = map[ssa.Op]uint8{
|
||||
ssa.OpARMEqual: arm.C_SCOND_EQ,
|
||||
ssa.OpARMNotEqual: arm.C_SCOND_NE,
|
||||
ssa.OpARMLessThan: arm.C_SCOND_LT,
|
||||
ssa.OpARMLessThanU: arm.C_SCOND_LO,
|
||||
ssa.OpARMLessEqual: arm.C_SCOND_LE,
|
||||
ssa.OpARMLessEqualU: arm.C_SCOND_LS,
|
||||
ssa.OpARMGreaterThan: arm.C_SCOND_GT,
|
||||
ssa.OpARMGreaterThanU: arm.C_SCOND_HI,
|
||||
ssa.OpARMGreaterEqual: arm.C_SCOND_GE,
|
||||
ssa.OpARMGreaterEqualU: arm.C_SCOND_HS,
|
||||
}
|
||||
|
||||
var blockJump = map[ssa.BlockKind]struct {
|
||||
asm, invasm obj.As
|
||||
}{
|
||||
|
|
@ -285,8 +311,8 @@ var blockJump = map[ssa.BlockKind]struct {
|
|||
ssa.BlockARMGE: {arm.ABGE, arm.ABLT},
|
||||
ssa.BlockARMLE: {arm.ABLE, arm.ABGT},
|
||||
ssa.BlockARMGT: {arm.ABGT, arm.ABLE},
|
||||
ssa.BlockARMULT: {arm.ABCS, arm.ABCC},
|
||||
ssa.BlockARMUGE: {arm.ABCC, arm.ABCS},
|
||||
ssa.BlockARMULT: {arm.ABLO, arm.ABHS},
|
||||
ssa.BlockARMUGE: {arm.ABHS, arm.ABLO},
|
||||
ssa.BlockARMUGT: {arm.ABHI, arm.ABLS},
|
||||
ssa.BlockARMULE: {arm.ABLS, arm.ABHI},
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue