aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssa/decompose.go
diff options
context:
space:
mode:
authorDavid Chase <drchase@google.com>2015-08-28 14:24:10 -0400
committerDavid Chase <drchase@google.com>2015-08-28 20:20:43 +0000
commit525785885e42b26e6936e5d91386518218cff4d7 (patch)
treec083ab508fe0846f0696abe2085b1f9539f384c2 /src/cmd/compile/internal/ssa/decompose.go
parente0e4068c6e6cebb586bbffa36962c7fc6cb595e0 (diff)
downloadgo-525785885e42b26e6936e5d91386518218cff4d7.tar.gz
go-525785885e42b26e6936e5d91386518218cff4d7.zip
[dev.ssa] cmd/compile: add compose/decompose for complex, phi, constants
Still to do: arithmetic Change-Id: I31fd23b34980c9ed4b4e304b8597134b2ba6ca5c Reviewed-on: https://go-review.googlesource.com/14024 Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/ssa/decompose.go')
-rw-r--r--src/cmd/compile/internal/ssa/decompose.go27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/decompose.go b/src/cmd/compile/internal/ssa/decompose.go
index 534ffc269e..a2dfdc16ab 100644
--- a/src/cmd/compile/internal/ssa/decompose.go
+++ b/src/cmd/compile/internal/ssa/decompose.go
@@ -14,6 +14,8 @@ func decompose(f *Func) {
continue
}
switch {
+ case v.Type.IsComplex():
+ decomposeComplexPhi(v)
case v.Type.IsString():
decomposeStringPhi(v)
case v.Type.IsSlice():
@@ -72,6 +74,31 @@ func decomposeSlicePhi(v *Value) {
v.AddArg(cap)
}
+func decomposeComplexPhi(v *Value) {
+ fe := v.Block.Func.Config.fe
+ var partType Type
+ if v.Type.Size() == 8 {
+ partType = fe.TypeFloat32()
+ } else if v.Type.Size() == 16 {
+ partType = fe.TypeFloat64()
+ } else {
+ panic("Whoops, are sizes in bytes or bits?")
+ }
+
+ real := v.Block.NewValue0(v.Line, OpPhi, partType)
+ imag := v.Block.NewValue0(v.Line, OpPhi, partType)
+ for _, a := range v.Args {
+ real.AddArg(a.Block.NewValue1(v.Line, OpComplexReal, partType, a))
+ imag.AddArg(a.Block.NewValue1(v.Line, OpComplexImag, partType, a))
+ }
+ v.Op = OpComplexMake
+ v.AuxInt = 0
+ v.Aux = nil
+ v.resetArgs()
+ v.AddArg(real)
+ v.AddArg(imag)
+}
+
func decomposeInterfacePhi(v *Value) {
ptrType := v.Block.Func.Config.fe.TypeBytePtr()