p.Reg = arm.REGSP
p = appendpp(p, obj.ADUFFZERO, obj.TYPE_NONE, 0, 0, obj.TYPE_MEM, 0, 0)
f := gc.Sysfunc("duffzero")
- p.To = gc.Naddr(f)
+ gc.Naddr(&p.To, f)
gc.Afunclit(&p.To, f)
p.To.Offset = 4 * (128 - cnt/int64(gc.Widthptr))
} else {
// constnode.vconst = v;
// idx.reg = nod.reg;
// regfree(&nod);
- var af obj.Addr
- var at obj.Addr
- if f != nil {
- af = gc.Naddr(f)
- }
- if t != nil {
- at = gc.Naddr(t)
- }
p := gc.Prog(as)
- if f != nil {
- p.From = af
- }
- if t != nil {
- p.To = at
- }
+ gc.Naddr(&p.From, f)
+ gc.Naddr(&p.To, t)
+
if gc.Debug['g'] != 0 {
fmt.Printf("%v\n", p)
}
*/
func raddr(n *gc.Node, p *obj.Prog) {
var a obj.Addr
-
- a = gc.Naddr(n)
+ gc.Naddr(&a, n)
if a.Type != obj.TYPE_REG {
if n != nil {
gc.Fatal("bad in raddr: %v", gc.Oconv(int(n.Op), 0))
reg1 := &clean[cleani-2]
reg.Op = gc.OEMPTY
reg1.Op = gc.OEMPTY
- *a = gc.Naddr(n)
+ gc.Naddr(a, n)
return true
case gc.ODOT,
n1.Type = n.Type
n1.Xoffset += oary[0]
- *a = gc.Naddr(&n1)
+ gc.Naddr(a, &n1)
return true
}
a.Type = obj.TYPE_NONE
a.Name = obj.NAME_NONE
n1.Type = n.Type
- *a = gc.Naddr(&n1)
+ gc.Naddr(a, &n1)
return true
case gc.OINDEX:
}
}
- var af obj.Addr
- if f != nil {
- af = gc.Naddr(f)
- }
- var at obj.Addr
- if t != nil {
- at = gc.Naddr(t)
- }
p := gc.Prog(as)
- if f != nil {
- p.From = af
- }
- if t != nil {
- p.To = at
- }
+ gc.Naddr(&p.From, f)
+ gc.Naddr(&p.To, t)
+
if gc.Debug['g'] != 0 {
fmt.Printf("%v\n", p)
}
w = 8
}
- if w != 0 && ((f != nil && af.Width < int64(w)) || (t != nil && at.Width > int64(w))) {
+ if w != 0 && ((f != nil && p.From.Width < int64(w)) || (t != nil && p.To.Width > int64(w))) {
gc.Dump("f", f)
gc.Dump("t", t)
- gc.Fatal("bad width: %v (%d, %d)\n", p, af.Width, at.Width)
+ gc.Fatal("bad width: %v (%d, %d)\n", p, p.From.Width, p.To.Width)
}
if p.To.Type == obj.TYPE_ADDR && w > 0 {
reg1 := &clean[cleani-2]
reg.Op = gc.OEMPTY
reg1.Op = gc.OEMPTY
- *a = gc.Naddr(n)
+ gc.Naddr(a, n)
return true
case gc.ODOT,
n1.Type = n.Type
n1.Xoffset += oary[0]
- *a = gc.Naddr(&n1)
+ gc.Naddr(a, &n1)
return true
}
a.Type = obj.TYPE_NONE
a.Index = obj.TYPE_NONE
fixlargeoffset(&n1)
- *a = gc.Naddr(&n1)
+ gc.Naddr(a, &n1)
return true
case gc.OINDEX:
p.Reg = arm64.REGRT1
p = appendpp(p, obj.ADUFFZERO, obj.TYPE_NONE, 0, 0, obj.TYPE_MEM, 0, 0)
f := gc.Sysfunc("duffzero")
- p.To = gc.Naddr(f)
+ gc.Naddr(&p.To, f)
gc.Afunclit(&p.To, f)
p.To.Offset = 4 * (128 - cnt/int64(gc.Widthptr))
} else {
// TODO(austin): Add self-move test like in 6g (but be careful
// of truncation moves)
- af := obj.Addr(obj.Addr{})
+ p := gc.Prog(as)
+ gc.Naddr(&p.From, f)
+ gc.Naddr(&p.To, t)
- at := obj.Addr(obj.Addr{})
- if f != nil {
- af = gc.Naddr(f)
- }
- if t != nil {
- at = gc.Naddr(t)
- }
- p := (*obj.Prog)(gc.Prog(as))
- if f != nil {
- p.From = af
- }
- if t != nil {
- p.To = at
- }
if gc.Debug['g'] != 0 {
fmt.Printf("%v\n", p)
}
w = 4
case arm64.AMOVD:
- if af.Type == obj.TYPE_CONST || af.Type == obj.TYPE_ADDR {
+ if p.From.Type == obj.TYPE_CONST || p.From.Type == obj.TYPE_ADDR {
break
}
w = 8
}
- if w != 0 && ((f != nil && af.Width < int64(w)) || (t != nil && at.Type != obj.TYPE_REG && at.Width > int64(w))) {
+ if w != 0 && ((f != nil && p.From.Width < int64(w)) || (t != nil && p.To.Type != obj.TYPE_REG && p.To.Width > int64(w))) {
gc.Dump("f", f)
gc.Dump("t", t)
- gc.Fatal("bad width: %v (%d, %d)\n", p, af.Width, at.Width)
+ gc.Fatal("bad width: %v (%d, %d)\n", p, p.From.Width, p.To.Width)
}
return p
func raddr(n *gc.Node, p *obj.Prog) {
var a obj.Addr
- a = gc.Naddr(n)
+ gc.Naddr(&a, n)
if a.Type != obj.TYPE_REG {
if n != nil {
gc.Fatal("bad in raddr: %v", gc.Oconv(int(n.Op), 0))
}
}
- var af obj.Addr
- var at obj.Addr
- if f != nil {
- af = gc.Naddr(f)
- }
- if t != nil {
- at = gc.Naddr(t)
- }
p := gc.Prog(as)
- if f != nil {
- p.From = af
- }
- if t != nil {
- p.To = at
- }
+ gc.Naddr(&p.From, f)
+ gc.Naddr(&p.To, t)
+
if gc.Debug['g'] != 0 {
fmt.Printf("%v\n", p)
}
w = 4
}
- if true && w != 0 && f != nil && (af.Width > int64(w) || at.Width > int64(w)) {
+ if true && w != 0 && f != nil && (p.From.Width > int64(w) || p.To.Width > int64(w)) {
gc.Dump("bad width from:", f)
gc.Dump("bad width to:", t)
- gc.Fatal("bad width: %v (%d, %d)\n", p, af.Width, at.Width)
+ gc.Fatal("bad width: %v (%d, %d)\n", p, p.From.Width, p.To.Width)
}
if p.To.Type == obj.TYPE_ADDR && w > 0 {
p.Reg = ppc64.REGSP
p = appendpp(p, obj.ADUFFZERO, obj.TYPE_NONE, 0, 0, obj.TYPE_MEM, 0, 0)
f := gc.Sysfunc("duffzero")
- p.To = gc.Naddr(f)
+ gc.Naddr(&p.To, f)
gc.Afunclit(&p.To, f)
p.To.Offset = 4 * (128 - cnt/int64(gc.Widthptr))
} else {
// TODO(austin): Add self-move test like in 6g (but be careful
// of truncation moves)
- af := obj.Addr(obj.Addr{})
+ p := gc.Prog(as)
+ gc.Naddr(&p.From, f)
+ gc.Naddr(&p.To, t)
- at := obj.Addr(obj.Addr{})
- if f != nil {
- af = gc.Naddr(f)
- }
- if t != nil {
- at = gc.Naddr(t)
- }
- p := (*obj.Prog)(gc.Prog(as))
- if f != nil {
- p.From = af
- }
- if t != nil {
- p.To = at
- }
if gc.Debug['g'] != 0 {
fmt.Printf("%v\n", p)
}
case ppc64.AMOVD,
ppc64.AMOVDU:
- if af.Type == obj.TYPE_CONST || af.Type == obj.TYPE_ADDR {
+ if p.From.Type == obj.TYPE_CONST || p.From.Type == obj.TYPE_ADDR {
break
}
w = 8
}
- if w != 0 && ((f != nil && af.Width < int64(w)) || (t != nil && at.Type != obj.TYPE_REG && at.Width > int64(w))) {
+ if w != 0 && ((f != nil && p.From.Width < int64(w)) || (t != nil && p.To.Type != obj.TYPE_REG && p.To.Width > int64(w))) {
gc.Dump("f", f)
gc.Dump("t", t)
- gc.Fatal("bad width: %v (%d, %d)\n", p, af.Width, at.Width)
+ gc.Fatal("bad width: %v (%d, %d)\n", p, p.From.Width, p.To.Width)
}
return p
}
}
-func Naddr(n *Node) (a obj.Addr) {
+// Naddr rewrites a to refer to n.
+// It assumes that a is zeroed on entry.
+func Naddr(a *obj.Addr, n *Node) {
if n == nil {
return
}
switch n.Op {
default:
a := a // copy to let escape into Ctxt.Dconv
- Fatal("naddr: bad %v %v", Oconv(int(n.Op), 0), Ctxt.Dconv(&a))
+ Fatal("naddr: bad %v %v", Oconv(int(n.Op), 0), Ctxt.Dconv(a))
case OREGISTER:
a.Type = obj.TYPE_REG
a.Offset = n.Xoffset
case OCFUNC:
- a = Naddr(n.Left)
+ Naddr(a, n.Left)
a.Sym = Linksym(n.Left.Sym)
case ONAME:
a.Offset = Mpgetfix(n.Val.U.Xval)
case CTSTR:
- datagostring(n.Val.U.Sval, &a)
+ datagostring(n.Val.U.Sval, a)
case CTBOOL:
a.Sym = nil
}
case OADDR:
- a = Naddr(n.Left)
+ Naddr(a, n.Left)
a.Etype = uint8(Tptr)
if Thearch.Thechar != '5' && Thearch.Thechar != '7' && Thearch.Thechar != '9' { // TODO(rsc): Do this even for arm, ppc64.
a.Width = int64(Widthptr)
}
if a.Type != obj.TYPE_MEM {
a := a // copy to let escape into Ctxt.Dconv
- Fatal("naddr: OADDR %v (from %v)", Ctxt.Dconv(&a), Oconv(int(n.Left.Op), 0))
+ Fatal("naddr: OADDR %v (from %v)", Ctxt.Dconv(a), Oconv(int(n.Left.Op), 0))
}
a.Type = obj.TYPE_ADDR
// itable of interface value
case OITAB:
- a = Naddr(n.Left)
+ Naddr(a, n.Left)
if a.Type == obj.TYPE_CONST && a.Offset == 0 {
break // itab(nil)
// pointer in a string or slice
case OSPTR:
- a = Naddr(n.Left)
+ Naddr(a, n.Left)
if a.Type == obj.TYPE_CONST && a.Offset == 0 {
break // ptr(nil)
// len of string or slice
case OLEN:
- a = Naddr(n.Left)
+ Naddr(a, n.Left)
if a.Type == obj.TYPE_CONST && a.Offset == 0 {
break // len(nil)
// cap of string or slice
case OCAP:
- a = Naddr(n.Left)
+ Naddr(a, n.Left)
if a.Type == obj.TYPE_CONST && a.Offset == 0 {
break // cap(nil)
Nodconst(&to, Types[TINT32], int64(index))
pcdata := unlinkedprog(obj.APCDATA)
pcdata.Lineno = prog.Lineno
- pcdata.From = Naddr(&from)
- pcdata.To = Naddr(&to)
+ Naddr(&pcdata.From, &from)
+ Naddr(&pcdata.To, &to)
return pcdata
}