diff options
author | Matthew Dempsky <mdempsky@google.com> | 2017-04-20 10:31:39 -0700 |
---|---|---|
committer | Matthew Dempsky <mdempsky@google.com> | 2017-04-20 18:34:14 +0000 |
commit | 263ba3ac7b9062e22f9dbbc6f11bfb760907de45 (patch) | |
tree | 78d684ee9dd7cb00384a6cee6eb864f972cc13e7 /src/cmd/compile/internal/mips | |
parent | 7f9832254c78266cf8f3bbd632c806e5c71b6d5a (diff) | |
download | go-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.go | 2 | ||||
-rw-r--r-- | src/cmd/compile/internal/mips/ggen.go | 55 |
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 |