diff options
author | Keith Randall <khr@golang.org> | 2015-05-28 16:45:33 -0700 |
---|---|---|
committer | Keith Randall <khr@golang.org> | 2015-05-30 06:08:26 +0000 |
commit | a9cec30fdcc549282e0a5d520edb2eaf60f3061a (patch) | |
tree | dbcd629c320607cb71e523e25e27349add3eed29 /src/cmd/compile/internal/ssa/lower.go | |
parent | b0da62903d045f6d3e832ba1181387a1e9ad33f1 (diff) | |
download | go-a9cec30fdcc549282e0a5d520edb2eaf60f3061a.tar.gz go-a9cec30fdcc549282e0a5d520edb2eaf60f3061a.zip |
[dev.ssa] cmd/compile/internal/ssa: Implement block rewriting rules
Change-Id: I47e5349e34fc18118c4d35bf433f875b958cc3e5
Reviewed-on: https://go-review.googlesource.com/10495
Reviewed-by: Alan Donovan <adonovan@google.com>
Diffstat (limited to 'src/cmd/compile/internal/ssa/lower.go')
-rw-r--r-- | src/cmd/compile/internal/ssa/lower.go | 92 |
1 files changed, 2 insertions, 90 deletions
diff --git a/src/cmd/compile/internal/ssa/lower.go b/src/cmd/compile/internal/ssa/lower.go index 44f0b83fa8..ebed4f2607 100644 --- a/src/cmd/compile/internal/ssa/lower.go +++ b/src/cmd/compile/internal/ssa/lower.go @@ -6,12 +6,12 @@ package ssa import "log" -//go:generate go run rulegen/rulegen.go rulegen/lower_amd64.rules lowerAmd64 lowerAmd64.go +//go:generate go run rulegen/rulegen.go rulegen/lower_amd64.rules lowerBlockAMD64 lowerValueAMD64 lowerAmd64.go // convert to machine-dependent ops func lower(f *Func) { // repeat rewrites until we find no more rewrites - applyRewrite(f, f.Config.lower) + applyRewrite(f, f.Config.lowerBlock, f.Config.lowerValue) // Check for unlowered opcodes, fail if we find one. for _, b := range f.Blocks { @@ -21,92 +21,4 @@ func lower(f *Func) { } } } - - // additional pass for 386/amd64, link condition codes directly to blocks - // TODO: do generically somehow? Special "block" rewrite rules? - for _, b := range f.Blocks { - for { - switch b.Kind { - case BlockIf: - switch b.Control.Op { - case OpSETL: - b.Kind = BlockLT - b.Control = b.Control.Args[0] - continue - case OpSETNE: - b.Kind = BlockNE - b.Control = b.Control.Args[0] - continue - case OpSETB: - b.Kind = BlockULT - b.Control = b.Control.Args[0] - continue - case OpMOVBload: - b.Kind = BlockNE - b.Control = b.NewValue2(OpTESTB, TypeFlags, nil, b.Control, b.Control) - continue - // TODO: others - } - case BlockLT: - if b.Control.Op == OpInvertFlags { - b.Kind = BlockGT - b.Control = b.Control.Args[0] - continue - } - case BlockGT: - if b.Control.Op == OpInvertFlags { - b.Kind = BlockLT - b.Control = b.Control.Args[0] - continue - } - case BlockLE: - if b.Control.Op == OpInvertFlags { - b.Kind = BlockGE - b.Control = b.Control.Args[0] - continue - } - case BlockGE: - if b.Control.Op == OpInvertFlags { - b.Kind = BlockLE - b.Control = b.Control.Args[0] - continue - } - case BlockULT: - if b.Control.Op == OpInvertFlags { - b.Kind = BlockUGT - b.Control = b.Control.Args[0] - continue - } - case BlockUGT: - if b.Control.Op == OpInvertFlags { - b.Kind = BlockULT - b.Control = b.Control.Args[0] - continue - } - case BlockULE: - if b.Control.Op == OpInvertFlags { - b.Kind = BlockUGE - b.Control = b.Control.Args[0] - continue - } - case BlockUGE: - if b.Control.Op == OpInvertFlags { - b.Kind = BlockULE - b.Control = b.Control.Args[0] - continue - } - case BlockEQ: - if b.Control.Op == OpInvertFlags { - b.Control = b.Control.Args[0] - continue - } - case BlockNE: - if b.Control.Op == OpInvertFlags { - b.Control = b.Control.Args[0] - continue - } - } - break - } - } } |