arch.MAXWIDTH = 1 << 50
arch.ZeroRange = zerorange
- arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnop
return p
}
-func zeroAuto(pp *gc.Progs, n *gc.Node) {
- // Note: this code must not clobber any registers.
- op := x86.AMOVQ
- if gc.Widthptr == 4 {
- op = x86.AMOVL
- }
- sym := n.Sym.Linksym()
- size := n.Type.Size()
- for i := int64(0); i < size; i += int64(gc.Widthptr) {
- p := pp.Prog(op)
- p.From.Type = obj.TYPE_CONST
- p.From.Offset = 0
- p.To.Type = obj.TYPE_MEM
- p.To.Name = obj.NAME_AUTO
- p.To.Reg = x86.REG_SP
- p.To.Offset = n.Xoffset + i
- p.To.Sym = sym
- }
-}
-
func ginsnop(pp *gc.Progs) *obj.Prog {
// This is a hardware nop (1-byte 0x90) instruction,
// even though we describe it as an explicit XCHGL here.
arch.MAXWIDTH = (1 << 32) - 1
arch.SoftFloat = objabi.GOARM == 5
arch.ZeroRange = zerorange
- arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnop
return p
}
-func zeroAuto(pp *gc.Progs, n *gc.Node) {
- // Note: this code must not clobber any registers.
- sym := n.Sym.Linksym()
- size := n.Type.Size()
- p := pp.Prog(arm.AMOVW)
- p.From.Type = obj.TYPE_CONST
- p.From.Offset = 0
- p.To.Type = obj.TYPE_REG
- p.To.Reg = arm.REGTMP
- for i := int64(0); i < size; i += 4 {
- p := pp.Prog(arm.AMOVW)
- p.From.Type = obj.TYPE_REG
- p.From.Reg = arm.REGTMP
- p.To.Type = obj.TYPE_MEM
- p.To.Name = obj.NAME_AUTO
- p.To.Reg = arm.REGSP
- p.To.Offset = n.Xoffset + i
- p.To.Sym = sym
- }
-}
-
func ginsnop(pp *gc.Progs) *obj.Prog {
p := pp.Prog(arm.AAND)
p.From.Type = obj.TYPE_REG
arch.PadFrame = padframe
arch.ZeroRange = zerorange
- arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnop
return p
}
-func zeroAuto(pp *gc.Progs, n *gc.Node) {
- // Note: this code must not clobber any registers.
- sym := n.Sym.Linksym()
- size := n.Type.Size()
- for i := int64(0); i < size; i += 8 {
- p := pp.Prog(arm64.AMOVD)
- p.From.Type = obj.TYPE_REG
- p.From.Reg = arm64.REGZERO
- p.To.Type = obj.TYPE_MEM
- p.To.Name = obj.NAME_AUTO
- p.To.Reg = arm64.REGSP
- p.To.Offset = n.Xoffset + i
- p.To.Sym = sym
- }
-}
-
func ginsnop(pp *gc.Progs) *obj.Prog {
p := pp.Prog(arm64.AHINT)
p.From.Type = obj.TYPE_CONST
// SSAGenBlock emits end-of-block Progs. SSAGenValue should be called
// for all values in the block before SSAGenBlock.
SSAGenBlock func(s *SSAGenState, b, next *ssa.Block)
-
- // ZeroAuto emits code to zero the given auto stack variable.
- // ZeroAuto must not use any non-temporary registers.
- // ZeroAuto will only be called for variables which contain a pointer.
- ZeroAuto func(*Progs, *Node)
}
var thearch Arch
arch.MAXWIDTH = (1 << 31) - 1
arch.SoftFloat = (objabi.GOMIPS == "softfloat")
arch.ZeroRange = zerorange
- arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnop
arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {}
return p
}
-func zeroAuto(pp *gc.Progs, n *gc.Node) {
- // Note: this code must not clobber any registers.
- sym := n.Sym.Linksym()
- size := n.Type.Size()
- for i := int64(0); i < size; i += 4 {
- p := pp.Prog(mips.AMOVW)
- p.From.Type = obj.TYPE_REG
- p.From.Reg = mips.REGZERO
- p.To.Type = obj.TYPE_MEM
- p.To.Name = obj.NAME_AUTO
- p.To.Reg = mips.REGSP
- p.To.Offset = n.Xoffset + i
- p.To.Sym = sym
- }
-}
-
func ginsnop(pp *gc.Progs) *obj.Prog {
p := pp.Prog(mips.ANOR)
p.From.Type = obj.TYPE_REG
arch.MAXWIDTH = 1 << 50
arch.SoftFloat = objabi.GOMIPS64 == "softfloat"
arch.ZeroRange = zerorange
- arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnop
return p
}
-func zeroAuto(pp *gc.Progs, n *gc.Node) {
- // Note: this code must not clobber any registers.
- sym := n.Sym.Linksym()
- size := n.Type.Size()
- for i := int64(0); i < size; i += 8 {
- p := pp.Prog(mips.AMOVV)
- p.From.Type = obj.TYPE_REG
- p.From.Reg = mips.REGZERO
- p.To.Type = obj.TYPE_MEM
- p.To.Name = obj.NAME_AUTO
- p.To.Reg = mips.REGSP
- p.To.Offset = n.Xoffset + i
- p.To.Sym = sym
- }
-}
-
func ginsnop(pp *gc.Progs) *obj.Prog {
p := pp.Prog(mips.ANOR)
p.From.Type = obj.TYPE_REG
arch.MAXWIDTH = 1 << 60
arch.ZeroRange = zerorange
- arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnopdefer
return p
}
-func zeroAuto(pp *gc.Progs, n *gc.Node) {
- // Note: this code must not clobber any registers.
- sym := n.Sym.Linksym()
- size := n.Type.Size()
- for i := int64(0); i < size; i += 8 {
- p := pp.Prog(ppc64.AMOVD)
- p.From.Type = obj.TYPE_REG
- p.From.Reg = ppc64.REGZERO
- p.To.Type = obj.TYPE_MEM
- p.To.Name = obj.NAME_AUTO
- p.To.Reg = ppc64.REGSP
- p.To.Offset = n.Xoffset + i
- p.To.Sym = sym
- }
-}
-
func ginsnop(pp *gc.Progs) *obj.Prog {
p := pp.Prog(ppc64.AOR)
p.From.Type = obj.TYPE_REG
arch.MAXWIDTH = 1 << 50
arch.ZeroRange = zerorange
- arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnop
return p
}
-func zeroAuto(pp *gc.Progs, n *gc.Node) {
- // Note: this code must not clobber any registers or the
- // condition code.
- sym := n.Sym.Linksym()
- size := n.Type.Size()
- for i := int64(0); i < size; i += int64(gc.Widthptr) {
- p := pp.Prog(s390x.AMOVD)
- p.From.Type = obj.TYPE_CONST
- p.From.Offset = 0
- p.To.Type = obj.TYPE_MEM
- p.To.Name = obj.NAME_AUTO
- p.To.Reg = s390x.REGSP
- p.To.Offset = n.Xoffset + i
- p.To.Sym = sym
- }
-}
-
func ginsnop(pp *gc.Progs) *obj.Prog {
return pp.Prog(s390x.ANOPH)
}
arch.MAXWIDTH = 1 << 50
arch.ZeroRange = zeroRange
- arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnop
return p
}
-func zeroAuto(pp *gc.Progs, n *gc.Node) {
- sym := n.Sym.Linksym()
- size := n.Type.Size()
- for i := int64(0); i < size; i += 8 {
- p := pp.Prog(wasm.AGet)
- p.From = obj.Addr{Type: obj.TYPE_REG, Reg: wasm.REG_SP}
-
- p = pp.Prog(wasm.AI64Const)
- p.From = obj.Addr{Type: obj.TYPE_CONST, Offset: 0}
-
- p = pp.Prog(wasm.AI64Store)
- p.To = obj.Addr{Type: obj.TYPE_MEM, Name: obj.NAME_AUTO, Offset: n.Xoffset + i, Sym: sym}
- }
-}
-
func ginsnop(pp *gc.Progs) *obj.Prog {
return pp.Prog(wasm.ANop)
}
arch.MAXWIDTH = (1 << 32) - 1
arch.ZeroRange = zerorange
- arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnop
return p
}
-func zeroAuto(pp *gc.Progs, n *gc.Node) {
- // Note: this code must not clobber any registers.
- sym := n.Sym.Linksym()
- size := n.Type.Size()
- for i := int64(0); i < size; i += 4 {
- p := pp.Prog(x86.AMOVL)
- p.From.Type = obj.TYPE_CONST
- p.From.Offset = 0
- p.To.Type = obj.TYPE_MEM
- p.To.Name = obj.NAME_AUTO
- p.To.Reg = x86.REG_SP
- p.To.Offset = n.Xoffset + i
- p.To.Sym = sym
- }
-}
-
func ginsnop(pp *gc.Progs) *obj.Prog {
// See comment in ../amd64/ggen.go.
p := pp.Prog(x86.AXCHGL)