add comments and delete dead code
R=ken
OCL=22078
CL=22080
diff --git a/src/cmd/6g/cgen.c b/src/cmd/6g/cgen.c
index e735858..bddbfb3 100644
--- a/src/cmd/6g/cgen.c
+++ b/src/cmd/6g/cgen.c
@@ -4,6 +4,10 @@
#include "gg.h"
+/*
+ * generate:
+ * res = n;
+ */
void
cgen(Node *n, Node *res)
{
@@ -371,6 +375,10 @@
;
}
+/*
+ * generate:
+ * res = &n;
+ */
void
agen(Node *n, Node *res)
{
@@ -616,6 +624,14 @@
return 0;
}
+/*
+ * generate:
+ * newreg = &n;
+ * res = newreg
+ *
+ * on exit, a has been changed to be *newreg.
+ * caller must regfree(a).
+ */
void
igen(Node *n, Node *a, Node *res)
{
@@ -625,6 +641,10 @@
a->type = n->type;
}
+/*
+ * generate:
+ * if(n == true) goto to;
+ */
void
bgen(Node *n, int true, Prog *to)
{
@@ -819,6 +839,11 @@
;
}
+/*
+ * n is on stack, either local variable
+ * or return value from function call.
+ * return n's offset from SP.
+ */
int32
stkof(Node *n)
{
@@ -847,6 +872,10 @@
return -1000;
}
+/*
+ * block copy:
+ * memmove(&n, &ns, w);
+ */
void
sgen(Node *n, Node *ns, int32 w)
{
diff --git a/src/cmd/6g/gen.c b/src/cmd/6g/gen.c
index 511ea56..0d0a647 100644
--- a/src/cmd/6g/gen.c
+++ b/src/cmd/6g/gen.c
@@ -8,12 +8,6 @@
#include "gg.h"
#include "opt.h"
-enum
-{
- // random unused opcode
- AJMPX = AADDPD,
-};
-
void
compile(Node *fn)
{
@@ -334,7 +328,7 @@
break;
case OAS:
- cgen_as(n->left, n->right, n->op);
+ cgen_as(n->left, n->right);
break;
case OCALLMETH:
@@ -655,6 +649,9 @@
p->to.type = D_INDIR+D_AX;
}
+/*
+ * compute total size of f's in/out arguments.
+ */
int
argsize(Type *t)
{
@@ -684,6 +681,16 @@
return w;
}
+/*
+ * generate:
+ * call f
+ * if proc, generate:
+ * push f
+ * push argsize
+ * call newproc
+ * pop
+ * pop
+ */
void
ginscall(Node *f, int proc)
{
@@ -706,6 +713,10 @@
gins(ACALL, N, f);
}
+/*
+ * n is call to interface method.
+ * generate res = n.
+ */
void
cgen_callinter(Node *n, Node *res, int proc)
{
@@ -755,6 +766,9 @@
setmaxarg(n->left->type);
}
+/*
+ * generate call to non-interface method
+ */
void
cgen_callmeth(Node *n, int proc)
{
@@ -776,6 +790,10 @@
cgen_call(n, proc);
}
+/*
+ * generate function call;
+ * if proc, run call in new proc.
+ */
void
cgen_call(Node *n, int proc)
{
@@ -805,7 +823,7 @@
// call tempname pointer
if(n->left->ullman >= UINF) {
regalloc(&nod, types[tptr], N);
- cgen_as(&nod, &afun, 0);
+ cgen_as(&nod, &afun);
nod.type = t;
ginscall(&nod, proc);
regfree(&nod);
@@ -815,7 +833,7 @@
// call pointer
if(isptr[n->left->type->etype]) {
regalloc(&nod, types[tptr], N);
- cgen_as(&nod, n->left, 0);
+ cgen_as(&nod, n->left);
nod.type = t;
ginscall(&nod, proc);
regfree(&nod);
@@ -830,6 +848,9 @@
;
}
+/*
+ * generate code to start new proc running call n.
+ */
void
cgen_proc(Node *n)
{
@@ -852,6 +873,11 @@
}
+/*
+ * call to n has already been generated.
+ * generate:
+ * res = return value from call.
+ */
void
cgen_callret(Node *n, Node *res)
{
@@ -874,9 +900,14 @@
nod.xoffset = fp->width;
nod.type = fp->type;
- cgen_as(res, &nod, 0);
+ cgen_as(res, &nod);
}
+/*
+ * call to n has already been generated.
+ * generate:
+ * res = &return value from call.
+ */
void
cgen_aret(Node *n, Node *res)
{
@@ -909,6 +940,10 @@
gins(ALEAQ, &nod1, res);
}
+/*
+ * generate return.
+ * n->left is assignments to return values.
+ */
void
cgen_ret(Node *n)
{
@@ -916,6 +951,9 @@
gins(ARET, N, N);
}
+/*
+ * generate += *= etc.
+ */
void
cgen_asop(Node *n)
{
@@ -1038,8 +1076,13 @@
;
}
+/*
+ * generate assignment:
+ * nl = nr
+ * nr == N means zero nl.
+ */
void
-cgen_as(Node *nl, Node *nr, int op)
+cgen_as(Node *nl, Node *nr)
{
Node nc, n1;
Type *tl;
@@ -1052,8 +1095,8 @@
iszer = 0;
if(nr == N || isnil(nr)) {
if(nl->op == OLIST) {
- cgen_as(nl->left, nr, op);
- cgen_as(nl->right, nr, op);
+ cgen_as(nl->left, nr);
+ cgen_as(nl->right, nr);
return;
}
tl = nl->type;
@@ -1170,6 +1213,16 @@
return 1;
}
+/*
+ * generate division.
+ * caller must set:
+ * ax = allocated AX register
+ * dx = allocated DX register
+ * generates one of:
+ * res = nl / nr
+ * res = nl % nr
+ * according to op.
+ */
void
dodiv(int op, Node *nl, Node *nr, Node *res, Node *ax, Node *dx)
{
@@ -1193,7 +1246,7 @@
nodconst(&n4, t, 0);
gmove(&n4, dx);
} else
- gins(optoas(OFOR, t), N, N);
+ gins(optoas(OEXTEND, t), N, N);
cgen(nr, &n3);
} else {
cgen(nr, &n3);
@@ -1202,7 +1255,7 @@
nodconst(&n4, t, 0);
gmove(&n4, dx);
} else
- gins(optoas(OFOR, t), N, N);
+ gins(optoas(OEXTEND, t), N, N);
}
gins(a, &n3, N);
regfree(&n3);
@@ -1213,6 +1266,11 @@
gmove(dx, res);
}
+/*
+ * generate division according to op, one of:
+ * res = nl / nr
+ * res = nl % nr
+ */
void
cgen_div(int op, Node *nl, Node *nr, Node *res)
{
@@ -1233,6 +1291,11 @@
regfree(&dx);
}
+/*
+ * generate shift according to op, one of:
+ * res = nl << nr
+ * res = nl >> nr
+ */
void
cgen_shift(int op, Node *nl, Node *nr, Node *res)
{
@@ -1293,45 +1356,51 @@
;
}
+/*
+ * generate byte multiply:
+ * res = nl * nr
+ * no byte multiply instruction so have to do
+ * 16-bit multiply and take bottom half.
+ */
void
cgen_bmul(int op, Node *nl, Node *nr, Node *res)
{
- Node n1, n2, n3;
+ Node n1b, n2b, n1w, n2w;
Type *t;
int a;
if(nl->ullman >= nr->ullman) {
- regalloc(&n1, nl->type, res);
- cgen(nl, &n1);
- regalloc(&n2, nr->type, N);
- cgen(nr, &n2);
+ regalloc(&n1b, nl->type, res);
+ cgen(nl, &n1b);
+ regalloc(&n2b, nr->type, N);
+ cgen(nr, &n2b);
} else {
- regalloc(&n2, nr->type, N);
- cgen(nr, &n2);
- regalloc(&n1, nl->type, res);
- cgen(nl, &n1);
+ regalloc(&n2b, nr->type, N);
+ cgen(nr, &n2b);
+ regalloc(&n1b, nl->type, res);
+ cgen(nl, &n1b);
}
- // copy to short registers
+ // copy from byte to short registers
t = types[TUINT16];
if(issigned[nl->type->etype])
t = types[TINT16];
- regalloc(&n3, t, &n2);
- cgen(&n2, &n3);
- regfree(&n3);
+ regalloc(&n2w, t, &n2b);
+ cgen(&n2b, &n2w);
- regalloc(&n3, t, &n1);
- cgen(&n1, &n3);
+ regalloc(&n1w, t, &n1b);
+ cgen(&n1b, &n1w);
a = optoas(op, t);
- gins(a, &n2, &n1);
- cgen(&n3, &n1);
- cgen(&n1, res);
+ gins(a, &n2w, &n1w);
+ cgen(&n1w, &n1b);
+ cgen(&n1b, res);
- regfree(&n1);
- regfree(&n2);
- regfree(&n3);
+ regfree(&n1w);
+ regfree(&n2w);
+ regfree(&n1b);
+ regfree(&n2b);
}
void
diff --git a/src/cmd/6g/gg.h b/src/cmd/6g/gg.h
index 8d44d67..bd6f2a9 100644
--- a/src/cmd/6g/gg.h
+++ b/src/cmd/6g/gg.h
@@ -145,7 +145,7 @@
void selgen(Node*);
Node* lookdot(Node*, Node*, int);
void inarggen(void);
-void cgen_as(Node*, Node*, int);
+void cgen_as(Node*, Node*);
void cgen_asop(Node*);
void cgen_ret(Node*);
void cgen_call(Node*, int);
@@ -202,7 +202,6 @@
void gclean(void);
void regalloc(Node*, Type*, Node*);
void regfree(Node*);
-void regsalloc(Node*, Type*); // replace w tmpvar
void regret(Node*, Type*);
Node* nodarg(Type*, int);
void nodreg(Node*, Type*, int);
diff --git a/src/cmd/6g/gsubr.c b/src/cmd/6g/gsubr.c
index e19e85d..a4cb8cb 100644
--- a/src/cmd/6g/gsubr.c
+++ b/src/cmd/6g/gsubr.c
@@ -42,6 +42,10 @@
pcloc++;
}
+/*
+ * generate and return proc with p->as = as,
+ * linked into program. pc is next instruction.
+ */
Prog*
prog(int as)
{
@@ -63,6 +67,10 @@
return p;
}
+/*
+ * generate a branch.
+ * t is ignored.
+ */
Prog*
gbranch(int as, Type *t)
{
@@ -74,6 +82,9 @@
return p;
}
+/*
+ * patch previous branch to jump to to.
+ */
void
patch(Prog *p, Prog *to)
{
@@ -83,6 +94,9 @@
p->to.offset = to->loc;
}
+/*
+ * start a new Prog list.
+ */
Plist*
newplist(void)
{
@@ -147,6 +161,11 @@
yyerror("reg %R left allocated\n", i);
}
+/*
+ * allocate register of type t, leave in n.
+ * if o != N, o is desired fixed register.
+ * caller must regfree(n).
+ */
void
regalloc(Node *n, Type *t, Node *o)
{
@@ -228,6 +247,9 @@
fatal("regret");
}
+/*
+ * initialize n to be register r of type t.
+ */
void
nodreg(Node *n, Type *t, int r)
{
@@ -242,6 +264,9 @@
n->type = t;
}
+/*
+ * initialize n to be indirect of register r; n is type t.
+ */
void
nodindreg(Node *n, Type *t, int r)
{
@@ -314,6 +339,10 @@
}
}
+/*
+ * generate
+ * as $c, reg
+ */
void
gconreg(int as, vlong c, int reg)
{
@@ -326,6 +355,10 @@
#define CASE(a,b) (((a)<<16)|((b)<<0))
+/*
+ * generate move:
+ * t = f
+ */
void
gmove(Node *f, Node *t)
{
@@ -842,12 +875,6 @@
gins(a, f, t);
}
-void
-regsalloc(Node *f, Type *t)
-{
- fatal("regsalloc");
-}
-
int
samaddr(Node *f, Node *t)
{
@@ -864,6 +891,10 @@
return 0;
}
+/*
+ * generate one instruction:
+ * as f, t
+ */
Prog*
gins(int as, Node *f, Node *t)
{
@@ -898,6 +929,10 @@
return p;
}
+/*
+ * generate code to compute n;
+ * make a refer to result.
+ */
void
naddr(Node *n, Addr *a)
{
@@ -1043,6 +1078,9 @@
}
}
+/*
+ * return Axxx for Oxxx on type t.
+ */
int
optoas(int op, Type *t)
{
@@ -1545,15 +1583,15 @@
a = ADIVQ;
break;
- case CASE(OFOR, TINT16):
+ case CASE(OEXTEND, TINT16):
a = ACWD;
break;
- case CASE(OFOR, TINT32):
+ case CASE(OEXTEND, TINT32):
a = ACDQ;
break;
- case CASE(OFOR, TINT64):
+ case CASE(OEXTEND, TINT64):
a = ACQO;
break;
@@ -1584,22 +1622,6 @@
}
/*
- * return unsigned(op)
- * eg GT -> HS
- */
-int
-brunsigned(int a)
-{
- switch(a) {
- case AJLT: return AJGE;
- case AJGT: return AJLE;
- case AJLE: return AJGT;
- case AJGE: return AJLT;
- }
- return a;
-}
-
-/*
* return !(op)
* eg == <=> !=
*/
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index ce8dd42..5499b71 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -313,6 +313,8 @@
OLITERAL, OREGISTER, OINDREG,
OCONV, OCOMP, OKEY,
OBAD,
+
+ OEXTEND, // 6g internal
OEND,
};