mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: remove gins
The only remaining consumers of gins were ginsnop and arch-independent opcodes like GVARDEF. Rewrite ginsnop to create and populate progs directly. Move arch-independent opcodes to package gc and simplify. Delete some now unused code. There is more. Step one towards eliminating gc.Node.Reg. Change-Id: I7c34cd8a848f6fc3b030705ab8e293838e0b6c20 Reviewed-on: https://go-review.googlesource.com/29220 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
a06e931abe
commit
ad7732a9ac
22 changed files with 62 additions and 973 deletions
|
|
@ -34,7 +34,6 @@ import (
|
|||
"cmd/compile/internal/gc"
|
||||
"cmd/internal/obj"
|
||||
"cmd/internal/obj/arm"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
var resvd = []int{
|
||||
|
|
@ -42,85 +41,6 @@ var resvd = []int{
|
|||
arm.REG_R10, // reserved for g
|
||||
}
|
||||
|
||||
/*
|
||||
* generate one instruction:
|
||||
* as f, t
|
||||
*/
|
||||
func gins(as obj.As, f *gc.Node, t *gc.Node) *obj.Prog {
|
||||
// Node nod;
|
||||
// int32 v;
|
||||
|
||||
if f != nil && f.Op == gc.OINDEX {
|
||||
gc.Fatalf("gins OINDEX not implemented")
|
||||
}
|
||||
|
||||
// gc.Regalloc(&nod, ®node, Z);
|
||||
// v = constnode.vconst;
|
||||
// gc.Cgen(f->right, &nod);
|
||||
// constnode.vconst = v;
|
||||
// idx.reg = nod.reg;
|
||||
// gc.Regfree(&nod);
|
||||
if t != nil && t.Op == gc.OINDEX {
|
||||
gc.Fatalf("gins OINDEX not implemented")
|
||||
}
|
||||
|
||||
// gc.Regalloc(&nod, ®node, Z);
|
||||
// v = constnode.vconst;
|
||||
// gc.Cgen(t->right, &nod);
|
||||
// constnode.vconst = v;
|
||||
// idx.reg = nod.reg;
|
||||
// gc.Regfree(&nod);
|
||||
|
||||
p := gc.Prog(as)
|
||||
gc.Naddr(&p.From, f)
|
||||
gc.Naddr(&p.To, t)
|
||||
|
||||
switch as {
|
||||
case arm.ABL:
|
||||
if p.To.Type == obj.TYPE_REG {
|
||||
p.To.Type = obj.TYPE_MEM
|
||||
}
|
||||
|
||||
case arm.ACMP, arm.ACMPF, arm.ACMPD:
|
||||
if t != nil {
|
||||
if f.Op != gc.OREGISTER {
|
||||
/* generate a comparison
|
||||
TODO(kaib): one of the args can actually be a small constant. relax the constraint and fix call sites.
|
||||
*/
|
||||
gc.Fatalf("bad operands to gcmp")
|
||||
}
|
||||
p.From = p.To
|
||||
p.To = obj.Addr{}
|
||||
raddr(f, p)
|
||||
}
|
||||
|
||||
case arm.AMULU:
|
||||
if f != nil && f.Op != gc.OREGISTER {
|
||||
gc.Fatalf("bad operands to mul")
|
||||
}
|
||||
|
||||
case arm.AMOVW:
|
||||
if (p.From.Type == obj.TYPE_MEM || p.From.Type == obj.TYPE_ADDR || p.From.Type == obj.TYPE_CONST) && (p.To.Type == obj.TYPE_MEM || p.To.Type == obj.TYPE_ADDR) {
|
||||
gc.Fatalf("gins double memory")
|
||||
}
|
||||
|
||||
case arm.AADD:
|
||||
if p.To.Type == obj.TYPE_MEM {
|
||||
gc.Fatalf("gins arith to mem")
|
||||
}
|
||||
|
||||
case arm.ARSB:
|
||||
if p.From.Type == obj.TYPE_NONE {
|
||||
gc.Fatalf("rsb with no from")
|
||||
}
|
||||
}
|
||||
|
||||
if gc.Debug['g'] != 0 {
|
||||
fmt.Printf("%v\n", p)
|
||||
}
|
||||
return p
|
||||
}
|
||||
|
||||
/*
|
||||
* insert n into reg slot of p
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue