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:
parent
22d1318e7b
commit
8086ce44c4
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user