diff options
author | Cherry Zhang <cherryyz@google.com> | 2016-05-31 11:27:16 -0400 |
---|---|---|
committer | Cherry Zhang <cherryyz@google.com> | 2016-06-06 14:06:38 +0000 |
commit | 59e11d782717407fcdf288664a48beb52336d42a (patch) | |
tree | 28b83cc70123899022a86b4e4e3761e6b74868ce /src/cmd/compile/internal/ssa/decompose.go | |
parent | e78d90beebbb6fde602ceb3999535ac4b49da295 (diff) | |
download | go-59e11d782717407fcdf288664a48beb52336d42a.tar.gz go-59e11d782717407fcdf288664a48beb52336d42a.zip |
[dev.ssa] cmd/compile: handle floating point on ARM
Machine supports (or the runtime simulates in soft float mode)
(u)int32<->float conversions. The frontend rewrites int64<->float
conversions to call to runtime function.
For int64->float32 conversion, the frontend generates
. . AS u(100) l(10) tc(1)
. . . NAME-main.~r1 u(1) a(true) g(1) l(9) x(8+0) class(PPARAMOUT) f(1) float32
. . . CALLFUNC u(100) l(10) tc(1) float32
. . . . NAME-runtime.int64tofloat64 u(1) a(true) x(0+0) class(PFUNC) tc(1) used(true) FUNC-func(int64) float64
The CALLFUNC node has type float32, whereas runtime.int64tofloat64
returns float64. The legacy backend implicitly makes a float64->float32
conversion. The SSA backend does not do implicit conversion, so we
insert an explicit CONV here.
All cmd/compile/internal/gc/testdata/*_ssa.go tests passed.
Progress on SSA for ARM. Still not complete.
Update #15365.
Change-Id: I30937c8ff977271246b068f48224693776804339
Reviewed-on: https://go-review.googlesource.com/23652
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 | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/decompose.go b/src/cmd/compile/internal/ssa/decompose.go index 0ee5f53291..08cc1b9dee 100644 --- a/src/cmd/compile/internal/ssa/decompose.go +++ b/src/cmd/compile/internal/ssa/decompose.go @@ -94,6 +94,8 @@ func decomposeBuiltIn(f *Func) { f.NamedValues[dataName] = append(f.NamedValues[dataName], data) } delete(f.NamedValues, name) + case t.IsFloat(): + // floats are never decomposed, even ones bigger than IntSize case t.Size() > f.Config.IntSize: f.Unimplementedf("undecomposed named type %s %s", name, t) default: @@ -115,6 +117,8 @@ func decomposeBuiltInPhi(v *Value) { decomposeSlicePhi(v) case v.Type.IsInterface(): decomposeInterfacePhi(v) + case v.Type.IsFloat(): + // floats are never decomposed, even ones bigger than IntSize case v.Type.Size() > v.Block.Func.Config.IntSize: v.Unimplementedf("undecomposed type %s", v.Type) } |