diff options
author | David Chase <drchase@google.com> | 2015-08-28 14:24:10 -0400 |
---|---|---|
committer | David Chase <drchase@google.com> | 2015-08-28 20:20:43 +0000 |
commit | 525785885e42b26e6936e5d91386518218cff4d7 (patch) | |
tree | c083ab508fe0846f0696abe2085b1f9539f384c2 /src/cmd/compile/internal/ssa/decompose.go | |
parent | e0e4068c6e6cebb586bbffa36962c7fc6cb595e0 (diff) | |
download | go-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.go | 27 |
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() |