aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssa/flagalloc.go
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2016-05-18 18:14:36 -0400
committerCherry Zhang <cherryyz@google.com>2016-06-02 13:01:09 +0000
commit8756d9253f56f28167543fbd41c15e5695e654b2 (patch)
treebae261d966f74e115a7775d9cd69e697156e7c37 /src/cmd/compile/internal/ssa/flagalloc.go
parent31e13c83c26c5addad6c9a15a8f06a11edc7c519 (diff)
downloadgo-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.go9
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
}