aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/mips
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2017-04-20 10:31:39 -0700
committerMatthew Dempsky <mdempsky@google.com>2017-04-20 18:34:14 +0000
commit263ba3ac7b9062e22f9dbbc6f11bfb760907de45 (patch)
tree78d684ee9dd7cb00384a6cee6eb864f972cc13e7 /src/cmd/compile/internal/mips
parent7f9832254c78266cf8f3bbd632c806e5c71b6d5a (diff)
downloadgo-263ba3ac7b9062e22f9dbbc6f11bfb760907de45.tar.gz
go-263ba3ac7b9062e22f9dbbc6f11bfb760907de45.zip
cmd/compile/internal/gc: make defframe arch-independent
The arch backends no longer depend on gc.Node. Passes toolstash-check -all. Change-Id: Ic7e49ae0a3ed155a2761c25e17cc341b46333fb4 Reviewed-on: https://go-review.googlesource.com/41196 Run-TryBot: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/mips')
-rw-r--r--src/cmd/compile/internal/mips/galign.go2
-rw-r--r--src/cmd/compile/internal/mips/ggen.go55
2 files changed, 4 insertions, 53 deletions
diff --git a/src/cmd/compile/internal/mips/galign.go b/src/cmd/compile/internal/mips/galign.go
index cb72b6d728..f0ef6cd100 100644
--- a/src/cmd/compile/internal/mips/galign.go
+++ b/src/cmd/compile/internal/mips/galign.go
@@ -18,7 +18,7 @@ func Init(arch *gc.Arch) {
}
arch.REGSP = mips.REGSP
arch.MAXWIDTH = (1 << 31) - 1
- arch.Defframe = defframe
+ arch.ZeroRange = zerorange
arch.Ginsnop = ginsnop
arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {}
arch.SSAGenValue = ssaGenValue
diff --git a/src/cmd/compile/internal/mips/ggen.go b/src/cmd/compile/internal/mips/ggen.go
index 05a1bb56ec..dafa341a13 100644
--- a/src/cmd/compile/internal/mips/ggen.go
+++ b/src/cmd/compile/internal/mips/ggen.go
@@ -10,64 +10,15 @@ import (
"cmd/internal/obj/mips"
)
-func defframe(pp *gc.Progs, fn *gc.Node, sz int64) {
- // fill in argument size, stack size
- pp.Text.To.Type = obj.TYPE_TEXTSIZE
-
- pp.Text.To.Val = int32(gc.Rnd(fn.Type.ArgWidth(), int64(gc.Widthptr)))
- frame := uint32(gc.Rnd(sz, int64(gc.Widthreg)))
- pp.Text.To.Offset = int64(frame)
-
- // insert code to zero ambiguously live variables
- // so that the garbage collector only sees initialized values
- // when it looks for pointers.
- p := pp.Text
-
- hi := int64(0)
- lo := hi
-
- // iterate through declarations - they are sorted in decreasing xoffset order.
- for _, n := range fn.Func.Dcl {
- if !n.Name.Needzero() {
- continue
- }
- if n.Class != gc.PAUTO {
- gc.Fatalf("needzero class %d", n.Class)
- }
- if n.Type.Width%int64(gc.Widthptr) != 0 || n.Xoffset%int64(gc.Widthptr) != 0 || n.Type.Width == 0 {
- gc.Fatalf("var %L has size %d offset %d", n, int(n.Type.Width), int(n.Xoffset))
- }
-
- if lo != hi && n.Xoffset+n.Type.Width >= lo-int64(2*gc.Widthreg) {
- // merge with range we already have
- lo = n.Xoffset
-
- continue
- }
-
- // zero old range
- p = zerorange(pp, p, int64(frame), lo, hi)
-
- // set new range
- hi = n.Xoffset + n.Type.Width
-
- lo = n.Xoffset
- }
-
- // zero final range
- zerorange(pp, p, int64(frame), lo, hi)
-}
-
// TODO(mips): implement DUFFZERO
-func zerorange(pp *gc.Progs, p *obj.Prog, frame int64, lo int64, hi int64) *obj.Prog {
+func zerorange(pp *gc.Progs, p *obj.Prog, off, cnt int64, _ *uint32) *obj.Prog {
- cnt := hi - lo
if cnt == 0 {
return p
}
if cnt < int64(4*gc.Widthptr) {
for i := int64(0); i < cnt; i += int64(gc.Widthptr) {
- p = pp.Appendpp(p, mips.AMOVW, obj.TYPE_REG, mips.REGZERO, 0, obj.TYPE_MEM, mips.REGSP, gc.Ctxt.FixedFrameSize()+frame+lo+i)
+ p = pp.Appendpp(p, mips.AMOVW, obj.TYPE_REG, mips.REGZERO, 0, obj.TYPE_MEM, mips.REGSP, gc.Ctxt.FixedFrameSize()+off+i)
}
} else {
//fmt.Printf("zerorange frame:%v, lo: %v, hi:%v \n", frame ,lo, hi)
@@ -77,7 +28,7 @@ func zerorange(pp *gc.Progs, p *obj.Prog, frame int64, lo int64, hi int64) *obj.
// MOVW R0, (Widthptr)r1
// ADD $Widthptr, r1
// BNE r1, r2, loop
- p = pp.Appendpp(p, mips.AADD, obj.TYPE_CONST, 0, gc.Ctxt.FixedFrameSize()+frame+lo-4, obj.TYPE_REG, mips.REGRT1, 0)
+ p = pp.Appendpp(p, mips.AADD, obj.TYPE_CONST, 0, gc.Ctxt.FixedFrameSize()+off-4, obj.TYPE_REG, mips.REGRT1, 0)
p.Reg = mips.REGSP
p = pp.Appendpp(p, mips.AADD, obj.TYPE_CONST, 0, cnt, obj.TYPE_REG, mips.REGRT2, 0)
p.Reg = mips.REGRT1