aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssa/lower.go
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2015-05-28 16:45:33 -0700
committerKeith Randall <khr@golang.org>2015-05-30 06:08:26 +0000
commita9cec30fdcc549282e0a5d520edb2eaf60f3061a (patch)
treedbcd629c320607cb71e523e25e27349add3eed29 /src/cmd/compile/internal/ssa/lower.go
parentb0da62903d045f6d3e832ba1181387a1e9ad33f1 (diff)
downloadgo-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.go92
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
- }
- }
}