[dev.ssa] cmd/compile: prepare for some load+op combining
Rename StoreConst to ValAndOff so we can use it for other ops.
Make ValAndOff print nicely.
Add some notes & checks related to my aborted attempt to
implement combined CMP+load ops.
Change-Id: I2f901d12d42bc5a82879af0334806aa184a97e27
Reviewed-on: https://go-review.googlesource.com/18947
Run-TryBot: David Chase <drchase@google.com>
Reviewed-by: David Chase <drchase@google.com>
diff --git a/src/cmd/compile/internal/ssa/value.go b/src/cmd/compile/internal/ssa/value.go
index 420c408..7e6e544 100644
--- a/src/cmd/compile/internal/ssa/value.go
+++ b/src/cmd/compile/internal/ssa/value.go
@@ -61,16 +61,22 @@
func (v *Value) LongString() string {
s := fmt.Sprintf("v%d = %s", v.ID, v.Op.String())
s += " <" + v.Type.String() + ">"
- if v.AuxInt != 0 {
- s += fmt.Sprintf(" [%d]", v.AuxInt)
-
- switch {
- case v.Op == OpConst32F || v.Op == OpConst64F:
- s += fmt.Sprintf("(%g)", math.Float64frombits(uint64(v.AuxInt)))
- case v.Op == OpConstBool && v.AuxInt == 0:
- s += " (false)"
- case v.Op == OpConstBool && v.AuxInt == 1:
- s += " (true)"
+ // TODO: use some operator property flags to decide
+ // what is encoded in the AuxInt field.
+ switch v.Op {
+ case OpConst32F, OpConst64F:
+ s += fmt.Sprintf(" [%g]", math.Float64frombits(uint64(v.AuxInt)))
+ case OpConstBool:
+ if v.AuxInt == 0 {
+ s += " [false]"
+ } else {
+ s += " [true]"
+ }
+ case OpAMD64MOVBstoreconst, OpAMD64MOVWstoreconst, OpAMD64MOVLstoreconst, OpAMD64MOVQstoreconst:
+ s += fmt.Sprintf(" [%s]", ValAndOff(v.AuxInt))
+ default:
+ if v.AuxInt != 0 {
+ s += fmt.Sprintf(" [%d]", v.AuxInt)
}
}
if v.Aux != nil {
@@ -132,6 +138,11 @@
c.Aux = v.Aux
c.AuxInt = v.AuxInt
c.AddArgs(v.Args...)
+ for _, a := range v.Args {
+ if a.Type.IsMemory() {
+ v.Fatalf("can't move a value with a memory arg %s", v.LongString())
+ }
+ }
return c
}