} else
p1 = gins(a, n, N);
p1->to = addr;
- p1->reg = w;
if(debug['g'])
print("%P [ignore previous line]\n", p1);
sudoclean();
if(res->op == OREGISTER) {
p1 = gins(a, N, res);
p1->from = addr;
- p1->reg = w;
} else {
regalloc(&n2, n->type, N);
p1 = gins(a, N, &n2);
p1->from = addr;
- p1->reg = w;
gins(a, &n2, res);
regfree(&n2);
}
if(sudoaddable(a, nr, &addr, &w)) {
p1 = gins(a, N, &n1);
p1->from = addr;
- p1->reg = w;
gmove(&n1, res);
sudoclean();
regfree(&n1);
tmp.op = OADDR;
tmp.left = &n2;
p1 = gins(AMOVW, &tmp, &n3);
- p1->reg = w;
} else {
nodconst(&n1, t, w);
gins(optoas(OMUL, t), &n1, &n2);
* naddr of func generates code for address of func.
* if using opcode that can take address implicitly,
* call afunclit to fix up the argument.
+ * also fix up direct register references to be D_OREG.
*/
void
afunclit(Addr *a)
{
- if(a->type == D_ADDR && a->name == D_EXTERN) {
+ if(a->type == D_ADDR && a->name == D_EXTERN || a->type == D_REG) {
a->type = D_OREG;
}
}
int o, i;
int oary[10];
int64 v;
- Node n1, n2, n3, *nn, *l, *r;
+ Node n1, n2, n3, n4, *nn, *l, *r;
Node *reg, *reg1;
Prog *p1;
Type *t;
nodconst(&n2, types[TUINT32], v);
regalloc(&n3, types[TUINT32], N);
cgen(&n2, &n3);
- p1 = gins(optoas(OCMP, types[TUINT32]), &n1, N);
+ regalloc(&n4, n1.type, N);
+ cgen(&n1, &n4);
+ p1 = gins(optoas(OCMP, types[TUINT32]), &n4, N);
raddr(&n3, p1);
+ regfree(&n4);
regfree(&n3);
p1 = gbranch(optoas(OGT, types[TUINT32]), T);
ginscall(throwindex, 0);
export F=$(basename $i .go)
dir=$(dirname $i)
export D=$dir
- sed '/^\/\//!q; s|//||g; s|./\$A.out|$E &|' $i >$RUNFILE
+ sed '/^\/\//!q' $i | sed 's@//@@; $d' |sed 's|./\$A.out|$E &|' >$RUNFILE
if ! sh $RUNFILE >$TMP1FILE 2>$TMP2FILE
then
echo