1
0
mirror of https://github.com/golang/go synced 2024-10-04 15:21:22 -06:00

[dev.ssa] cmd/compile: unify OpARMMOVWaddr cases

Minor code cleanup. Done as part of understanding
OpARMMOVWaddr, since other architectures will
need to do something similar.

Change-Id: Iea2ecf3defb4f884e63902c369cd55e4647bce7a
Reviewed-on: https://go-review.googlesource.com/24157
Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
Josh Bleecher Snyder 2016-06-15 15:56:52 -07:00
parent 22d1318e7b
commit 8086ce44c4

View File

@ -369,19 +369,12 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
p.From.Offset = v.AuxInt p.From.Offset = v.AuxInt
p.Reg = gc.SSARegNum(v.Args[0]) p.Reg = gc.SSARegNum(v.Args[0])
case ssa.OpARMMOVWaddr: case ssa.OpARMMOVWaddr:
if v.Aux == nil { p := gc.Prog(arm.AMOVW)
// MOVW $off(SP), R p.From.Type = obj.TYPE_ADDR
if reg := gc.SSAReg(v.Args[0]); reg.Name() != "SP" { p.To.Type = obj.TYPE_REG
v.Fatalf("arg/auto symbol with non-SP base register %s", reg.Name()) p.To.Reg = gc.SSARegNum(v)
}
p := gc.Prog(arm.AMOVW) var wantreg string
p.From.Type = obj.TYPE_ADDR
p.From.Reg = arm.REGSP
p.From.Offset = v.AuxInt
p.To.Type = obj.TYPE_REG
p.To.Reg = gc.SSARegNum(v)
break
}
// MOVW $sym+off(base), R // MOVW $sym+off(base), R
// the assembler expands it as the following: // the assembler expands it as the following:
// - base is SP: add constant offset to SP (R13) // - base is SP: add constant offset to SP (R13)
@ -391,19 +384,21 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
default: default:
v.Fatalf("aux is of unknown type %T", v.Aux) v.Fatalf("aux is of unknown type %T", v.Aux)
case *ssa.ExternSymbol: case *ssa.ExternSymbol:
if reg := gc.SSAReg(v.Args[0]); reg.Name() != "SB" { wantreg = "SB"
v.Fatalf("extern symbol with non-SB base register %s", reg.Name()) gc.AddAux(&p.From, v)
}
case *ssa.ArgSymbol, *ssa.AutoSymbol: case *ssa.ArgSymbol, *ssa.AutoSymbol:
if reg := gc.SSAReg(v.Args[0]); reg.Name() != "SP" { wantreg = "SP"
v.Fatalf("arg/auto symbol with non-SP base register %s", reg.Name()) gc.AddAux(&p.From, v)
} case nil:
// No sym, just MOVW $off(SP), R
wantreg = "SP"
p.From.Reg = arm.REGSP
p.From.Offset = v.AuxInt
} }
p := gc.Prog(arm.AMOVW) if reg := gc.SSAReg(v.Args[0]); reg.Name() != wantreg {
p.From.Type = obj.TYPE_ADDR v.Fatalf("bad reg %s for symbol type %T, want %s", reg.Name(), v.Aux, wantreg)
gc.AddAux(&p.From, v) }
p.To.Type = obj.TYPE_REG
p.To.Reg = gc.SSARegNum(v)
case ssa.OpARMMOVBload, case ssa.OpARMMOVBload,
ssa.OpARMMOVBUload, ssa.OpARMMOVBUload,
ssa.OpARMMOVHload, ssa.OpARMMOVHload,