diff options
author | Cherry Zhang <cherryyz@google.com> | 2016-05-18 18:14:36 -0400 |
---|---|---|
committer | Cherry Zhang <cherryyz@google.com> | 2016-06-02 13:01:09 +0000 |
commit | 8756d9253f56f28167543fbd41c15e5695e654b2 (patch) | |
tree | bae261d966f74e115a7775d9cd69e697156e7c37 /src/cmd/compile/internal/ssa/flagalloc.go | |
parent | 31e13c83c26c5addad6c9a15a8f06a11edc7c519 (diff) | |
download | go-8756d9253f56f28167543fbd41c15e5695e654b2.tar.gz go-8756d9253f56f28167543fbd41c15e5695e654b2.zip |
[dev.ssa] cmd/compile: decompose 64-bit integer on ARM
Introduce dec64 rules to (generically) decompose 64-bit integer on
32-bit architectures. 64-bit integer is composed/decomposed with
Int64Make/Hi/Lo ops, as for complex types.
The idea of dealing with Add64 is the following:
(Add64 (Int64Make xh xl) (Int64Make yh yl))
->
(Int64Make
(Add32withcarry xh yh (Select0 (Add32carry xl yl)))
(Select1 (Add32carry xl yl)))
where Add32carry returns a tuple (flags,uint32). Select0 and Select1
read the first and the second component of the tuple, respectively.
The two Add32carry will be CSE'd.
Similarly for multiplication, Mul32uhilo returns a tuple (hi, lo).
Also add support of KeepAlive, to fix build after merge.
Tests addressed_ssa.go, array_ssa.go, break_ssa.go, chan_ssa.go,
cmp_ssa.go, ctl_ssa.go, map_ssa.go, and string_ssa.go in
cmd/compile/internal/gc/testdata passed.
Progress on SSA for ARM. Still not complete.
Updates #15365.
Change-Id: I7867c76785a456312de5d8398a6b3f7ca5a4f7ec
Reviewed-on: https://go-review.googlesource.com/23213
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/ssa/flagalloc.go')
-rw-r--r-- | src/cmd/compile/internal/ssa/flagalloc.go | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/flagalloc.go b/src/cmd/compile/internal/ssa/flagalloc.go index c6dc8d7f91..85c75e99d6 100644 --- a/src/cmd/compile/internal/ssa/flagalloc.go +++ b/src/cmd/compile/internal/ssa/flagalloc.go @@ -95,9 +95,18 @@ func flagalloc(f *Func) { continue } // Recalculate a + var c1 *Value + if a.Op == OpARMCarry { + // Pseudo-op does not generate flags, its arg actually does + //TODO: generalize this condition? + c1 = a.Args[0].copyInto(b) + } c := a.copyInto(b) // Update v. v.SetArg(i, c) + if c1 != nil { + c.SetArg(0, c1) + } // Remember the most-recently computed flag value. flag = a } |