diff options
author | Kai Backman <kaib@golang.org> | 2009-05-28 14:25:54 -0700 |
---|---|---|
committer | Kai Backman <kaib@golang.org> | 2009-05-28 14:25:54 -0700 |
commit | a3e3696086d7f8bae5edc2e853259638fc01dd62 (patch) | |
tree | f35b56e8ceaf9bf0767f5a11d16fbb6f3d335966 /src/cmd/5g/gsubr.c | |
parent | ecc04ec0581a69df0bec7cfba6954f165b1ebb8a (diff) | |
download | golang-a3e3696086d7f8bae5edc2e853259638fc01dd62.tar.gz |
Rebooted 5g effort from 6g. Tons of minor fixes and tweaks to
get the code going.
R=rsc
APPROVED=rsc
DELTA=4752 (1723 added, 948 deleted, 2081 changed)
OCL=29403
CL=29530
Diffstat (limited to 'src/cmd/5g/gsubr.c')
-rw-r--r-- | src/cmd/5g/gsubr.c | 2471 |
1 files changed, 1252 insertions, 1219 deletions
diff --git a/src/cmd/5g/gsubr.c b/src/cmd/5g/gsubr.c index 85b14e029..ba68a697a 100644 --- a/src/cmd/5g/gsubr.c +++ b/src/cmd/5g/gsubr.c @@ -152,8 +152,6 @@ ggloblsym(Sym *s, int32 width, int dupok) p = gins(AGLOBL, N, N); p->from.type = D_EXTERN; - if(s == symstringl || s == symstringc) - p->from.type = D_STATIC; p->from.index = D_NONE; p->from.sym = s; p->to.type = D_CONST; @@ -192,51 +190,51 @@ afunclit(Addr *a) } } +// TODO(kaib): probably not needed. static int resvd[] = { // D_DI, // for movstring // D_SI, // for movstring -// D_AX, // for divide -// D_CX, // for shift -// D_DX, // for divide -// D_SP, // for stack -// D_R14, // reserved for m -// D_R15, // reserved for u +// D_AX, // for divide +// D_CX, // for shift +// D_DX, // for divide +// REGSP, // for stack +// D_R14, // reserved for m +// D_R15, // reserved for u }; +// TODO(kaib): As per rsc this is probably overcomplicated for arm void ginit(void) { -// int i; - -// for(i=0; i<nelem(reg); i++) -// reg[i] = 1; -// for(i=D_AX; i<=D_R15; i++) -// reg[i] = 0; -// for(i=D_X0; i<=D_X7; i++) -// reg[i] = 0; - -// for(i=0; i<nelem(resvd); i++) -// reg[resvd[i]]++; - fatal("ginit_unimplemented"); +// int i; + +// for(i=0; i<nelem(reg); i++) +// reg[i] = 1; +// for(i=D_AX; i<=D_R15; i++) +// reg[i] = 0; +// for(i=D_X0; i<=D_X7; i++) +// reg[i] = 0; + +// for(i=0; i<nelem(resvd); i++) +// reg[resvd[i]]++; } void gclean(void) { -// int i; - -// for(i=0; i<nelem(resvd); i++) -// reg[resvd[i]]--; - -// for(i=D_AX; i<=D_R15; i++) -// if(reg[i]) -// yyerror("reg %R left allocated\n", i); -// for(i=D_X0; i<=D_X7; i++) -// if(reg[i]) -// yyerror("reg %R left allocated\n", i); - fatal("gclean_unimplemented"); +// int i; + +// for(i=0; i<nelem(resvd); i++) +// reg[resvd[i]]--; + +// for(i=D_AX; i<=D_R15; i++) +// if(reg[i]) +// yyerror("reg %R left allocated\n", i); +// for(i=D_X0; i<=D_X7; i++) +// if(reg[i]) +// yyerror("reg %R left allocated\n", i); } /* @@ -247,75 +245,74 @@ gclean(void) void regalloc(Node *n, Type *t, Node *o) { -// int i, et; - -// if(t == T) -// fatal("regalloc: t nil"); -// et = simtype[t->etype]; - -// switch(et) { -// case TINT8: -// case TUINT8: -// case TINT16: -// case TUINT16: -// case TINT32: -// case TUINT32: -// case TINT64: -// case TUINT64: -// case TPTR32: -// case TPTR64: -// case TBOOL: -// if(o != N && o->op == OREGISTER) { -// i = o->val.u.reg; -// if(i >= D_AX && i <= D_R15) -// goto out; -// } -// for(i=D_AX; i<=D_R15; i++) -// if(reg[i] == 0) -// goto out; - -// yyerror("out of fixed registers"); -// goto err; - -// case TFLOAT32: -// case TFLOAT64: -// case TFLOAT80: -// if(o != N && o->op == OREGISTER) { -// i = o->val.u.reg; -// if(i >= D_X0 && i <= D_X7) -// goto out; -// } -// for(i=D_X0; i<=D_X7; i++) -// if(reg[i] == 0) -// goto out; -// yyerror("out of floating registers"); -// goto err; -// } -// yyerror("regalloc: unknown type %T", t); +// int i, et; + +// if(t == T) +// fatal("regalloc: t nil"); +// et = simtype[t->etype]; + +// switch(et) { +// case TINT8: +// case TUINT8: +// case TINT16: +// case TUINT16: +// case TINT32: +// case TUINT32: +// case TINT64: +// case TUINT64: +// case TPTR32: +// case TPTR64: +// case TBOOL: +// if(o != N && o->op == OREGISTER) { +// i = o->val.u.reg; +// if(i >= D_AX && i <= D_R15) +// goto out; +// } +// for(i=D_AX; i<=D_R15; i++) +// if(reg[i] == 0) +// goto out; + +// yyerror("out of fixed registers"); +// goto err; + +// case TFLOAT32: +// case TFLOAT64: +// case TFLOAT80: +// if(o != N && o->op == OREGISTER) { +// i = o->val.u.reg; +// if(i >= D_X0 && i <= D_X7) +// goto out; +// } +// for(i=D_X0; i<=D_X7; i++) +// if(reg[i] == 0) +// goto out; +// yyerror("out of floating registers"); +// goto err; +// } +// yyerror("regalloc: unknown type %T", t); // err: -// nodreg(n, t, 0); -// return; +// nodreg(n, t, 0); +// return; // out: -// reg[i]++; -// nodreg(n, t, i); - fatal("regalloc_unimplemented"); +// reg[i]++; +// nodreg(n, t, i); } void regfree(Node *n) { - int i; - - if(n->op != OREGISTER && n->op != OINDREG) - fatal("regfree: not a register"); - i = n->val.u.reg; - if(i < 0 || i >= sizeof(reg)) - fatal("regfree: reg out of range"); - if(reg[i] <= 0) - fatal("regfree: reg not allocated"); - reg[i]--; +// int i; + +// if(n->op != OREGISTER && n->op != OINDREG) +// fatal("regfree: not a register"); +// i = n->val.u.reg; +// if(i < 0 || i >= sizeof(reg)) +// fatal("regfree: reg out of range"); +// if(reg[i] <= 0) +// fatal("regfree: reg not allocated"); +// reg[i]--; } /* @@ -348,56 +345,55 @@ nodindreg(Node *n, Type *t, int r) Node* nodarg(Type *t, int fp) { -// Node *n; -// Type *first; -// Iter savet; - -// // entire argument struct, not just one arg -// if(t->etype == TSTRUCT && t->funarg) { -// n = nod(ONAME, N, N); -// n->sym = lookup(".args"); -// n->type = t; -// first = structfirst(&savet, &t); -// if(first == nil) -// fatal("nodarg: bad struct"); -// if(first->width == BADWIDTH) -// fatal("nodarg: offset not computed for %T", t); -// n->xoffset = first->width; -// n->addable = 1; -// goto fp; -// } - -// if(t->etype != TFIELD) -// fatal("nodarg: not field %T", t); - -// n = nod(ONAME, N, N); -// n->type = t->type; -// n->sym = t->sym; -// if(t->width == BADWIDTH) -// fatal("nodarg: offset not computed for %T", t); -// n->xoffset = t->width; -// n->addable = 1; - -// fp: -// switch(fp) { -// case 0: // output arg -// n->op = OINDREG; -// n->val.u.reg = D_SP; -// break; - -// case 1: // input arg -// n->class = PPARAM; -// break; - -// case 2: // offset output arg -// fatal("shouldnt be used"); -// n->op = OINDREG; -// n->val.u.reg = D_SP; -// n->xoffset += types[tptr]->width; -// break; -// } -// return n; - fatal("nodarg_unimplemented"); + Node *n; + Type *first; + Iter savet; + + // entire argument struct, not just one arg + if(t->etype == TSTRUCT && t->funarg) { + n = nod(ONAME, N, N); + n->sym = lookup(".args"); + n->type = t; + first = structfirst(&savet, &t); + if(first == nil) + fatal("nodarg: bad struct"); + if(first->width == BADWIDTH) + fatal("nodarg: offset not computed for %T", t); + n->xoffset = first->width; + n->addable = 1; + goto fp; + } + + if(t->etype != TFIELD) + fatal("nodarg: not field %T", t); + + n = nod(ONAME, N, N); + n->type = t->type; + n->sym = t->sym; + if(t->width == BADWIDTH) + fatal("nodarg: offset not computed for %T", t); + n->xoffset = t->width; + n->addable = 1; + +fp: + switch(fp) { + case 0: // output arg + n->op = OINDREG; + n->val.u.reg = REGRET; + break; + + case 1: // input arg + n->class = PPARAM; + break; + + case 2: // offset output arg +fatal("shouldnt be used"); + n->op = OINDREG; + n->val.u.reg = REGSP; + n->xoffset += types[tptr]->width; + break; + } + return n; } /* @@ -420,327 +416,324 @@ gconreg(int as, vlong c, int reg) * generate move: * t = f */ +// TODO(kaib): Crib the new gmove from 8g void gmove(Node *f, Node *t) { -// int ft, tt, t64, a; -// Node nod, nod1, nod2, nod3, nodc; -// Prog *p1, *p2; - -// ft = simtype[f->type->etype]; -// tt = simtype[t->type->etype]; - -// t64 = 0; -// if(tt == TINT64 || tt == TUINT64 || tt == TPTR64) -// t64 = 1; - -// if(debug['M']) -// print("gop: %O %O[%E],%O[%E]\n", OAS, -// f->op, ft, t->op, tt); -// if(isfloat[ft] && f->op == OCONST) { -// /* TO DO: pick up special constants, possibly preloaded */ -// if(mpgetflt(f->val.u.fval) == 0.0) { -// regalloc(&nod, t->type, t); -// gins(AXORPD, &nod, &nod); -// gmove(&nod, t); -// regfree(&nod); -// return; -// } -// } -// /* -// * load -// */ -// if(f->op == ONAME || f->op == OINDREG || -// f->op == OIND || f->op == OINDEX) -// switch(ft) { -// case TINT8: -// a = AMOVBLSX; -// if(t64) -// a = AMOVBQSX; -// goto ld; -// case TBOOL: -// case TUINT8: -// a = AMOVBLZX; -// if(t64) -// a = AMOVBQZX; -// goto ld; -// case TINT16: -// a = AMOVWLSX; -// if(t64) -// a = AMOVWQSX; -// goto ld; -// case TUINT16: -// a = AMOVWLZX; -// if(t64) -// a = AMOVWQZX; -// goto ld; -// case TINT32: -// if(isfloat[tt]) { -// regalloc(&nod, t->type, t); -// if(tt == TFLOAT64) -// a = ACVTSL2SD; -// else -// a = ACVTSL2SS; -// gins(a, f, &nod); -// gmove(&nod, t); -// regfree(&nod); -// return; -// } -// a = AMOVL; -// if(t64) -// a = AMOVLQSX; -// goto ld; -// case TUINT32: -// case TPTR32: -// a = AMOVL; -// if(t64) -// a = AMOVLQZX; -// goto ld; -// case TINT64: -// if(isfloat[tt]) { -// regalloc(&nod, t->type, t); -// if(tt == TFLOAT64) -// a = ACVTSQ2SD; -// else -// a = ACVTSQ2SS; -// gins(a, f, &nod); -// gmove(&nod, t); -// regfree(&nod); -// return; -// } -// case TUINT64: -// case TPTR64: -// a = AMOVQ; - -// ld: -// regalloc(&nod, f->type, t); -// nod.type = t64? types[TINT64]: types[TINT32]; -// gins(a, f, &nod); -// gmove(&nod, t); -// regfree(&nod); -// return; - -// case TFLOAT32: -// a = AMOVSS; -// goto fld; -// case TFLOAT64: -// a = AMOVSD; -// fld: -// regalloc(&nod, f->type, t); -// if(tt != TFLOAT64 && tt != TFLOAT32){ /* TO DO: why is this here */ -// dump("odd tree", f); -// nod.type = t64? types[TINT64]: types[TINT32]; -// } -// gins(a, f, &nod); -// gmove(&nod, t); -// regfree(&nod); -// return; -// } + int ft, tt, t64, a; + Node nod, nod1, nod2, nod3, nodc; + Prog *p1, *p2; -// /* -// * store -// */ -// if(t->op == ONAME || t->op == OINDREG || -// t->op == OIND || t->op == OINDEX) -// switch(tt) { -// case TBOOL: -// case TINT8: -// case TUINT8: -// a = AMOVB; -// goto st; -// case TINT16: -// case TUINT16: -// a = AMOVW; -// goto st; -// case TINT32: -// case TUINT32: -// a = AMOVL; -// goto st; -// case TINT64: -// case TUINT64: -// a = AMOVQ; -// goto st; - -// case TPTR32: -// case TPTR64: -// /* -// * store to pointer. -// */ -// if(tt == TPTR32) -// a = AMOVL; -// else -// a = AMOVQ; -// switch(t->op) { -// default: -// dump("gmove to", t); -// fatal("gmove t %O", t->op); - -// case OINDREG: -// if(t->val.u.reg != D_SP) -// goto refcount; -// break; - -// case ONAME: -// switch(t->class) { -// default: -// dump("gmove", t); -// fatal("gmove t %O class %d reg %R", t->op, t->class, t->val.u.reg); -// case PEXTERN: -// goto refcount; -// break; -// case PAUTO: -// case PPARAM: -// case PPARAMOUT: -// break; -// } -// break; -// } -// goto st; - -// st: -// // 64-bit immediates only allowed for move into registers. -// // this is not a move into a register. -// if(f->op == OCONST || (f->op == OLITERAL && !t64)) { -// gins(a, f, t); -// return; -// } -// fst: -// regalloc(&nod, t->type, f); -// gmove(f, &nod); -// gins(a, &nod, t); -// regfree(&nod); -// return; - -// refcount: -// if(!debug['r']) -// goto st; -// // for now, mark ref count updates with AXCHGQ. -// // using a temporary on the left, so no semantic -// // changes. code is likely slower, but still correct. -// if(t64) -// a = AXCHGQ; -// else -// a = AXCHGL; -// regalloc(&nod, t->type, f); -// gmove(f, &nod); -// gins(a, &nod, t); -// regfree(&nod); -// return; - -// case TFLOAT32: -// a = AMOVSS; -// goto fst; -// case TFLOAT64: -// a = AMOVSD; -// goto fst; -// } + ft = simtype[f->type->etype]; + tt = simtype[t->type->etype]; -// /* -// * convert -// */ -// switch(CASE(ft, tt)) { -// default: -// /* -// * integer to integer -// ******** -// * a = AGOK; break; - -// * case CASE(TBOOL, TBOOL): -// * case CASE(TINT8, TBOOL): -// * case CASE(TUINT8, TBOOL): -// * case CASE(TINT16, TBOOL): -// * case CASE(TUINT16, TBOOL): -// * case CASE(TINT32, TBOOL): -// * case CASE(TUINT32, TBOOL): -// * case CASE(TPTR64, TBOOL): - -// * case CASE(TBOOL, TINT8): -// * case CASE(TINT8, TINT8): -// * case CASE(TUINT8, TINT8): -// * case CASE(TINT16, TINT8): -// * case CASE(TUINT16, TINT8): -// * case CASE(TINT32, TINT8): -// * case CASE(TUINT32, TINT8): -// * case CASE(TPTR64, TINT8): - -// * case CASE(TBOOL, TUINT8): -// * case CASE(TINT8, TUINT8): -// * case CASE(TUINT8, TUINT8): -// * case CASE(TINT16, TUINT8): -// * case CASE(TUINT16, TUINT8): -// * case CASE(TINT32, TUINT8): -// * case CASE(TUINT32, TUINT8): -// * case CASE(TPTR64, TUINT8): - -// * case CASE(TINT16, TINT16): -// * case CASE(TUINT16, TINT16): -// * case CASE(TINT32, TINT16): -// * case CASE(TUINT32, TINT16): -// * case CASE(TPTR64, TINT16): - -// * case CASE(TINT16, TUINT16): -// * case CASE(TUINT16, TUINT16): -// * case CASE(TINT32, TUINT16): -// * case CASE(TUINT32, TUINT16): -// * case CASE(TPTR64, TUINT16): - -// * case CASE(TINT64, TUINT): -// * case CASE(TINT64, TUINT32): -// * case CASE(TUINT64, TUINT32): -// *****/ -// a = AMOVL; -// break; - -// case CASE(TINT64, TINT8): -// case CASE(TINT64, TINT16): -// case CASE(TINT64, TINT32): -// case CASE(TUINT64, TINT8): -// case CASE(TUINT64, TINT16): -// case CASE(TUINT64, TINT32): -// a = AMOVLQSX; // this looks bad -// break; - -// case CASE(TINT32, TINT64): -// case CASE(TINT32, TPTR64): -// a = AMOVLQSX; -// break; - -// case CASE(TUINT32, TINT64): -// case CASE(TUINT32, TUINT64): -// case CASE(TUINT32, TPTR64): -// case CASE(TPTR32, TINT64): -// case CASE(TPTR32, TUINT64): -// case CASE(TPTR32, TPTR64): -// a = AMOVLQZX; -// break; - -// case CASE(TPTR64, TINT64): -// case CASE(TINT64, TINT64): -// case CASE(TUINT64, TINT64): -// case CASE(TINT64, TUINT64): -// case CASE(TUINT64, TUINT64): -// case CASE(TPTR64, TUINT64): -// case CASE(TINT64, TPTR64): -// case CASE(TUINT64, TPTR64): -// case CASE(TPTR64, TPTR64): -// a = AMOVQ; -// break; - -// case CASE(TINT16, TINT32): -// case CASE(TINT16, TUINT32): -// a = AMOVWLSX; + t64 = 0; + if(tt == TINT64 || tt == TUINT64 || tt == TPTR64) + t64 = 1; + + if(debug['M']) + print("gop: %O %O[%E],%O[%E]\n", OAS, + f->op, ft, t->op, tt); +/* + * load + */ + if(f->op == ONAME || f->op == OINDREG || + f->op == OIND || f->op == OINDEX) + fatal("gmove load not implemented"); +// switch(ft) { +// case TINT8: +// a = AMOVBLSX; +// if(t64) +// a = AMOVBQSX; +// goto ld; +// case TBOOL: +// case TUINT8: +// a = AMOVBLZX; +// if(t64) +// a = AMOVBQZX; +// goto ld; +// case TINT16: +// a = AMOVWLSX; +// if(t64) +// a = AMOVWQSX; +// goto ld; +// case TUINT16: +// a = AMOVWLZX; +// if(t64) +// a = AMOVWQZX; +// goto ld; +// case TINT32: +// if(isfloat[tt]) { +// regalloc(&nod, t->type, t); +// if(tt == TFLOAT64) +// a = ACVTSL2SD; +// else +// a = ACVTSL2SS; +// gins(a, f, &nod); +// gmove(&nod, t); +// regfree(&nod); +// return; +// } +// a = AMOVL; +// if(t64) +// a = AMOVLQSX; +// goto ld; +// case TUINT32: +// case TPTR32: +// a = AMOVL; +// if(t64) +// a = AMOVLQZX; +// goto ld; +// case TINT64: +// if(isfloat[tt]) { +// regalloc(&nod, t->type, t); +// if(tt == TFLOAT64) +// a = ACVTSQ2SD; +// else +// a = ACVTSQ2SS; +// gins(a, f, &nod); +// gmove(&nod, t); +// regfree(&nod); +// return; +// } +// case TUINT64: +// case TPTR64: +// a = AMOVQ; + +// ld: +// regalloc(&nod, f->type, t); +// nod.type = t64? types[TINT64]: types[TINT32]; +// gins(a, f, &nod); +// gmove(&nod, t); +// regfree(&nod); +// return; + +// case TFLOAT32: +// a = AMOVSS; +// goto fld; +// case TFLOAT64: +// a = AMOVSD; +// fld: +// regalloc(&nod, f->type, t); +// if(tt != TFLOAT64 && tt != TFLOAT32){ /* TO DO: why is this here */ +// dump("odd tree", f); +// nod.type = t64? types[TINT64]: types[TINT32]; +// } +// gins(a, f, &nod); +// gmove(&nod, t); +// regfree(&nod); +// return; +// } + +/* + * store + */ + if(t->op == ONAME || t->op == OINDREG || + t->op == OIND || t->op == OINDEX) + + switch(tt) { + case TBOOL: + case TINT8: + case TUINT8: + a = AMOVB; + goto st; + case TINT16: + case TUINT16: + a = AMOVH; + goto st; + case TINT32: + case TUINT32: + a = AMOVW; + goto st; + case TINT64: + case TUINT64: + fatal("gmove TINT64 and TUINT64 not implemented"); +// a = AMOVQ; + goto st; + + case TPTR64: + fatal("gmove TPTR64 not implemented"); + break; + + case TPTR32: + /* + * store to pointer. + */ + a = AMOVW; + switch(t->op) { + default: + dump("gmove to", t); + fatal("gmove t %O", t->op); + + case OINDREG: + if(t->val.u.reg != REGSP) + goto refcount; + break; + + case ONAME: + switch(t->class) { + default: + dump("gmove", t); + fatal("gmove t %O class %d reg %R", t->op, t->class, t->val.u.reg); + case PEXTERN: + goto refcount; + break; + case PAUTO: + case PPARAM: + case PPARAMOUT: + break; + } + break; + } + goto st; + + st: + // 64-bit immediates only allowed for move into registers. + // this is not a move into a register. + if(f->op == OLITERAL && !t64) { + gins(a, f, t); + return; + } + fst: + regalloc(&nod, t->type, f); + gmove(f, &nod); + gins(a, &nod, t); + regfree(&nod); + return; + + refcount: + fatal("gmove refcount not implemented"); +// if(!debug['r']) +// goto st; +// // for now, mark ref count updates with AXCHGQ. +// // using a temporary on the left, so no semantic +// // changes. code is likely slower, but still correct. +// if(t64) +// a = AXCHGQ; +// else +// a = AXCHGL; +// regalloc(&nod, t->type, f); +// gmove(f, &nod); +// gins(a, &nod, t); +// regfree(&nod); + return; + + case TFLOAT32: + a = AMOVW; + goto fst; + case TFLOAT64: + fatal("gmove TFLOAT64 not implemented"); +// a = AMOVSD; + goto fst; + } + +/* + * convert + */ + fatal("gmove convert not implemented"); +// switch(CASE(ft, tt)) { +// default: +/* + * integer to integer + ******** + * a = AGOK; break; + + * case CASE(TBOOL, TBOOL): + * case CASE(TINT8, TBOOL): + * case CASE(TUINT8, TBOOL): + * case CASE(TINT16, TBOOL): + * case CASE(TUINT16, TBOOL): + * case CASE(TINT32, TBOOL): + * case CASE(TUINT32, TBOOL): + * case CASE(TPTR64, TBOOL): + + * case CASE(TBOOL, TINT8): + * case CASE(TINT8, TINT8): + * case CASE(TUINT8, TINT8): + * case CASE(TINT16, TINT8): + * case CASE(TUINT16, TINT8): + * case CASE(TINT32, TINT8): + * case CASE(TUINT32, TINT8): + * case CASE(TPTR64, TINT8): + + * case CASE(TBOOL, TUINT8): + * case CASE(TINT8, TUINT8): + * case CASE(TUINT8, TUINT8): + * case CASE(TINT16, TUINT8): + * case CASE(TUINT16, TUINT8): + * case CASE(TINT32, TUINT8): + * case CASE(TUINT32, TUINT8): + * case CASE(TPTR64, TUINT8): + + * case CASE(TINT16, TINT16): + * case CASE(TUINT16, TINT16): + * case CASE(TINT32, TINT16): + * case CASE(TUINT32, TINT16): + * case CASE(TPTR64, TINT16): + + * case CASE(TINT16, TUINT16): + * case CASE(TUINT16, TUINT16): + * case CASE(TINT32, TUINT16): + * case CASE(TUINT32, TUINT16): + * case CASE(TPTR64, TUINT16): + + * case CASE(TINT64, TUINT): + * case CASE(TINT64, TUINT32): + * case CASE(TUINT64, TUINT32): + *****/ +// a = AMOVL; +// break; + +// case CASE(TINT64, TINT8): +// case CASE(TINT64, TINT16): +// case CASE(TINT64, TINT32): +// case CASE(TUINT64, TINT8): +// case CASE(TUINT64, TINT16): +// case CASE(TUINT64, TINT32): +// a = AMOVLQSX; // this looks bad +// break; + +// case CASE(TINT32, TINT64): +// case CASE(TINT32, TPTR64): +// a = AMOVLQSX; +// break; + +// case CASE(TUINT32, TINT64): +// case CASE(TUINT32, TUINT64): +// case CASE(TUINT32, TPTR64): +// case CASE(TPTR32, TINT64): +// case CASE(TPTR32, TUINT64): +// case CASE(TPTR32, TPTR64): +// a = AMOVLQZX; +// break; + +// case CASE(TPTR64, TINT64): +// case CASE(TINT64, TINT64): +// case CASE(TUINT64, TINT64): +// case CASE(TINT64, TUINT64): +// case CASE(TUINT64, TUINT64): +// case CASE(TPTR64, TUINT64): +// case CASE(TINT64, TPTR64): +// case CASE(TUINT64, TPTR64): +// case CASE(TPTR64, TPTR64): +// a = AMOVQ; +// break; + +// case CASE(TINT16, TINT32): +// case CASE(TINT16, TUINT32): +// a = AMOVWLSX; // // if(f->op == OCONST) { // // f->val.vval &= 0xffff; // // if(f->val.vval & 0x8000) // // f->val.vval |= 0xffff0000; // // a = AMOVL; // // } -// break; +// break; -// case CASE(TINT16, TINT64): -// case CASE(TINT16, TUINT64): -// case CASE(TINT16, TPTR64): -// a = AMOVWQSX; +// case CASE(TINT16, TINT64): +// case CASE(TINT16, TUINT64): +// case CASE(TINT16, TPTR64): +// a = AMOVWQSX; // // if(f->op == OCONST) { // // f->val.vval &= 0xffff; // // if(f->val.vval & 0x8000){ @@ -749,44 +742,44 @@ gmove(Node *f, Node *t) // // } // // a = AMOVL; // // } -// break; +// break; -// case CASE(TUINT16, TINT32): -// case CASE(TUINT16, TUINT32): -// a = AMOVWLZX; +// case CASE(TUINT16, TINT32): +// case CASE(TUINT16, TUINT32): +// a = AMOVWLZX; // // if(f->op == OCONST) { // // f->val.vval &= 0xffff; // // a = AMOVL; // // } -// break; +// break; -// case CASE(TUINT16, TINT64): -// case CASE(TUINT16, TUINT64): -// case CASE(TUINT16, TPTR64): -// a = AMOVWQZX; +// case CASE(TUINT16, TINT64): +// case CASE(TUINT16, TUINT64): +// case CASE(TUINT16, TPTR64): +// a = AMOVWQZX; // // if(f->op == OCONST) { // // f->val.vval &= 0xffff; // // a = AMOVL; /* MOVL also zero-extends to 64 bits */ // // } -// break; +// break; -// case CASE(TINT8, TINT16): -// case CASE(TINT8, TUINT16): -// case CASE(TINT8, TINT32): -// case CASE(TINT8, TUINT32): -// a = AMOVBLSX; +// case CASE(TINT8, TINT16): +// case CASE(TINT8, TUINT16): +// case CASE(TINT8, TINT32): +// case CASE(TINT8, TUINT32): +// a = AMOVBLSX; // // if(f->op == OCONST) { // // f->val.vval &= 0xff; // // if(f->val.vval & 0x80) // // f->val.vval |= 0xffffff00; // // a = AMOVL; // // } -// break; +// break; -// case CASE(TINT8, TINT64): -// case CASE(TINT8, TUINT64): -// case CASE(TINT8, TPTR64): -// a = AMOVBQSX; +// case CASE(TINT8, TINT64): +// case CASE(TINT8, TUINT64): +// case CASE(TINT8, TPTR64): +// a = AMOVBQSX; // // if(f->op == OCONST) { // // f->val.vval &= 0xff; // // if(f->val.vval & 0x80){ @@ -795,198 +788,197 @@ gmove(Node *f, Node *t) // // } // // a = AMOVQ; // // } -// break; - -// case CASE(TBOOL, TINT16): -// case CASE(TBOOL, TUINT16): -// case CASE(TBOOL, TINT32): -// case CASE(TBOOL, TUINT32): -// case CASE(TUINT8, TINT16): -// case CASE(TUINT8, TUINT16): -// case CASE(TUINT8, TINT32): -// case CASE(TUINT8, TUINT32): -// a = AMOVBLZX; +// break; + +// case CASE(TBOOL, TINT16): +// case CASE(TBOOL, TUINT16): +// case CASE(TBOOL, TINT32): +// case CASE(TBOOL, TUINT32): +// case CASE(TUINT8, TINT16): +// case CASE(TUINT8, TUINT16): +// case CASE(TUINT8, TINT32): +// case CASE(TUINT8, TUINT32): +// a = AMOVBLZX; // // if(f->op == OCONST) { // // f->val.vval &= 0xff; // // a = AMOVL; // // } -// break; - -// case CASE(TBOOL, TINT64): -// case CASE(TBOOL, TUINT64): -// case CASE(TBOOL, TPTR64): -// case CASE(TUINT8, TINT64): -// case CASE(TUINT8, TUINT64): -// case CASE(TUINT8, TPTR64): -// a = AMOVBQZX; +// break; + +// case CASE(TBOOL, TINT64): +// case CASE(TBOOL, TUINT64): +// case CASE(TBOOL, TPTR64): +// case CASE(TUINT8, TINT64): +// case CASE(TUINT8, TUINT64): +// case CASE(TUINT8, TPTR64): +// a = AMOVBQZX; // // if(f->op == OCONST) { // // f->val.vval &= 0xff; // // a = AMOVL; /* zero-extends to 64-bits */ // // } -// break; +// break; // /* // * float to fix // */ -// case CASE(TFLOAT32, TINT8): -// case CASE(TFLOAT32, TINT16): -// case CASE(TFLOAT32, TINT32): -// regalloc(&nod, t->type, N); -// gins(ACVTTSS2SL, f, &nod); -// gmove(&nod, t); -// regfree(&nod); -// return; - -// case CASE(TFLOAT32, TBOOL): -// case CASE(TFLOAT32, TUINT8): -// case CASE(TFLOAT32, TUINT16): -// case CASE(TFLOAT32, TUINT32): -// case CASE(TFLOAT32, TINT64): -// case CASE(TFLOAT32, TUINT64): -// case CASE(TFLOAT32, TPTR64): -// regalloc(&nod, t->type, N); -// gins(ACVTTSS2SQ, f, &nod); -// gmove(&nod, t); -// regfree(&nod); -// return; - -// case CASE(TFLOAT64, TINT8): -// case CASE(TFLOAT64, TINT16): -// case CASE(TFLOAT64, TINT32): -// regalloc(&nod, t->type, N); -// gins(ACVTTSD2SL, f, &nod); -// gmove(&nod, t); -// regfree(&nod); -// return; - -// case CASE(TFLOAT64, TBOOL): -// case CASE(TFLOAT64, TUINT8): -// case CASE(TFLOAT64, TUINT16): -// case CASE(TFLOAT64, TUINT32): -// case CASE(TFLOAT64, TINT64): -// case CASE(TFLOAT64, TUINT64): -// case CASE(TFLOAT64, TPTR64): -// regalloc(&nod, t->type, N); -// gins(ACVTTSD2SQ, f, &nod); -// gmove(&nod, t); -// regfree(&nod); -// return; +// case CASE(TFLOAT32, TINT8): +// case CASE(TFLOAT32, TINT16): +// case CASE(TFLOAT32, TINT32): +// regalloc(&nod, t->type, N); +// gins(ACVTTSS2SL, f, &nod); +// gmove(&nod, t); +// regfree(&nod); +// return; + +// case CASE(TFLOAT32, TBOOL): +// case CASE(TFLOAT32, TUINT8): +// case CASE(TFLOAT32, TUINT16): +// case CASE(TFLOAT32, TUINT32): +// case CASE(TFLOAT32, TINT64): +// case CASE(TFLOAT32, TUINT64): +// case CASE(TFLOAT32, TPTR64): +// regalloc(&nod, t->type, N); +// gins(ACVTTSS2SQ, f, &nod); +// gmove(&nod, t); +// regfree(&nod); +// return; + +// case CASE(TFLOAT64, TINT8): +// case CASE(TFLOAT64, TINT16): +// case CASE(TFLOAT64, TINT32): +// regalloc(&nod, t->type, N); +// gins(ACVTTSD2SL, f, &nod); +// gmove(&nod, t); +// regfree(&nod); +// return; + +// case CASE(TFLOAT64, TBOOL): +// case CASE(TFLOAT64, TUINT8): +// case CASE(TFLOAT64, TUINT16): +// case CASE(TFLOAT64, TUINT32): +// case CASE(TFLOAT64, TINT64): +// case CASE(TFLOAT64, TUINT64): +// case CASE(TFLOAT64, TPTR64): +// regalloc(&nod, t->type, N); +// gins(ACVTTSD2SQ, f, &nod); +// gmove(&nod, t); +// regfree(&nod); +// return; // /* // * uvlong to float // */ -// case CASE(TUINT64, TFLOAT64): -// case CASE(TUINT64, TFLOAT32): -// a = ACVTSQ2SS; -// if(tt == TFLOAT64) -// a = ACVTSQ2SD; -// regalloc(&nod, f->type, f); -// gmove(f, &nod); -// regalloc(&nod1, t->type, t); -// nodconst(&nodc, types[TUINT64], 0); -// gins(ACMPQ, &nod, &nodc); -// p1 = gbranch(AJLT, T); -// gins(a, &nod, &nod1); -// p2 = gbranch(AB, T); -// patch(p1, pc); -// regalloc(&nod2, f->type, N); -// regalloc(&nod3, f->type, N); -// gmove(&nod, &nod2); -// nodconst(&nodc, types[TUINT64], 1); -// gins(ASHRQ, &nodc, &nod2); -// gmove(&nod, &nod3); -// gins(AANDL, &nodc, &nod3); -// gins(AORQ, &nod3, &nod2); -// gins(a, &nod2, &nod1); -// gins(tt == TFLOAT64? AADDSD: AADDSS, &nod1, &nod1); -// regfree(&nod2); -// regfree(&nod3); -// patch(p2, pc); -// regfree(&nod); -// regfree(&nod1); -// return; - -// case CASE(TUINT32, TFLOAT64): -// case CASE(TUINT32, TFLOAT32): -// a = ACVTSQ2SS; -// if(tt == TFLOAT64) -// a = ACVTSQ2SD; -// regalloc(&nod, f->type, f); -// gins(AMOVLQZX, f, &nod); -// regalloc(&nod1, t->type, t); -// gins(a, &nod, &nod1); -// gmove(&nod1, t); -// regfree(&nod); -// regfree(&nod1); -// return; +// case CASE(TUINT64, TFLOAT64): +// case CASE(TUINT64, TFLOAT32): +// a = ACVTSQ2SS; +// if(tt == TFLOAT64) +// a = ACVTSQ2SD; +// regalloc(&nod, f->type, f); +// gmove(f, &nod); +// regalloc(&nod1, t->type, t); +// nodconst(&nodc, types[TUINT64], 0); +// gins(ACMPQ, &nod, &nodc); +// p1 = gbranch(AJLT, T); +// gins(a, &nod, &nod1); +// p2 = gbranch(AJMP, T); +// patch(p1, pc); +// regalloc(&nod2, f->type, N); +// regalloc(&nod3, f->type, N); +// gmove(&nod, &nod2); +// nodconst(&nodc, types[TUINT64], 1); +// gins(ASHRQ, &nodc, &nod2); +// gmove(&nod, &nod3); +// gins(AANDL, &nodc, &nod3); +// gins(AORQ, &nod3, &nod2); +// gins(a, &nod2, &nod1); +// gins(tt == TFLOAT64? AADDSD: AADDSS, &nod1, &nod1); +// regfree(&nod2); +// regfree(&nod3); +// patch(p2, pc); +// regfree(&nod); +// regfree(&nod1); +// return; + +// case CASE(TUINT32, TFLOAT64): +// case CASE(TUINT32, TFLOAT32): +// a = ACVTSQ2SS; +// if(tt == TFLOAT64) +// a = ACVTSQ2SD; +// regalloc(&nod, f->type, f); +// gins(AMOVLQZX, f, &nod); +// regalloc(&nod1, t->type, t); +// gins(a, &nod, &nod1); +// gmove(&nod1, t); +// regfree(&nod); +// regfree(&nod1); +// return; // /* // * fix to float // */ -// case CASE(TINT64, TFLOAT32): -// case CASE(TPTR64, TFLOAT32): -// regalloc(&nod, t->type, t); -// gins(ACVTSQ2SS, f, &nod); -// gmove(&nod, t); -// regfree(&nod); -// return; - -// case CASE(TINT64, TFLOAT64): -// case CASE(TPTR64, TFLOAT64): -// regalloc(&nod, t->type, t); -// gins(ACVTSQ2SD, f, &nod); -// gmove(&nod, t); -// regfree(&nod); -// return; - -// case CASE(TBOOL, TFLOAT32): -// case CASE(TINT8, TFLOAT32): -// case CASE(TUINT8, TFLOAT32): -// case CASE(TINT16, TFLOAT32): -// case CASE(TUINT16, TFLOAT32): -// case CASE(TINT32, TFLOAT32): -// regalloc(&nod, t->type, t); -// gins(ACVTSL2SS, f, &nod); -// gmove(&nod, t); -// regfree(&nod); -// return; - -// case CASE(TBOOL, TFLOAT64): -// case CASE(TINT8, TFLOAT64): -// case CASE(TUINT8, TFLOAT64): -// case CASE(TINT16, TFLOAT64): -// case CASE(TUINT16, TFLOAT64): -// case CASE(TINT32, TFLOAT64): -// regalloc(&nod, t->type, t); -// gins(ACVTSL2SD, f, &nod); -// gmove(&nod, t); -// regfree(&nod); -// return; +// case CASE(TINT64, TFLOAT32): +// case CASE(TPTR64, TFLOAT32): +// regalloc(&nod, t->type, t); +// gins(ACVTSQ2SS, f, &nod); +// gmove(&nod, t); +// regfree(&nod); +// return; + +// case CASE(TINT64, TFLOAT64): +// case CASE(TPTR64, TFLOAT64): +// regalloc(&nod, t->type, t); +// gins(ACVTSQ2SD, f, &nod); +// gmove(&nod, t); +// regfree(&nod); +// return; + +// case CASE(TBOOL, TFLOAT32): +// case CASE(TINT8, TFLOAT32): +// case CASE(TUINT8, TFLOAT32): +// case CASE(TINT16, TFLOAT32): +// case CASE(TUINT16, TFLOAT32): +// case CASE(TINT32, TFLOAT32): +// regalloc(&nod, t->type, t); +// gins(ACVTSL2SS, f, &nod); +// gmove(&nod, t); +// regfree(&nod); +// return; + +// case CASE(TBOOL, TFLOAT64): +// case CASE(TINT8, TFLOAT64): +// case CASE(TUINT8, TFLOAT64): +// case CASE(TINT16, TFLOAT64): +// case CASE(TUINT16, TFLOAT64): +// case CASE(TINT32, TFLOAT64): +// regalloc(&nod, t->type, t); +// gins(ACVTSL2SD, f, &nod); +// gmove(&nod, t); +// regfree(&nod); +// return; // /* // * float to float // */ -// case CASE(TFLOAT32, TFLOAT32): -// a = AMOVSS; -// break; -// case CASE(TFLOAT64, TFLOAT32): -// a = ACVTSD2SS; -// break; -// case CASE(TFLOAT32, TFLOAT64): -// a = ACVTSS2SD; -// break; -// case CASE(TFLOAT64, TFLOAT64): -// a = AMOVSD; -// break; -// } -// if(a == AMOVQ || -// a == AMOVSD || -// a == AMOVSS || -// (a == AMOVL && f->type->width == t->type->width)) /* TO DO: check AMOVL */ -// if(samaddr(f, t)) -// return; -// gins(a, f, t); - fatal("gmove_unimplemented"); +// case CASE(TFLOAT32, TFLOAT32): +// a = AMOVSS; +// break; +// case CASE(TFLOAT64, TFLOAT32): +// a = ACVTSD2SS; +// break; +// case CASE(TFLOAT32, TFLOAT64): +// a = ACVTSS2SD; +// break; +// case CASE(TFLOAT64, TFLOAT64): +// a = AMOVSD; +// break; +// } +// if(a == AMOVQ || +// a == AMOVSD || +// a == AMOVSS || +// (a == AMOVL && f->type->width == t->type->width)) /* TO DO: check AMOVL */ +// if(samaddr(f, t)) +// return; + gins(a, f, t); } int @@ -1061,10 +1053,10 @@ naddr(Node *n, Addr *a) fatal("naddr: bad %O %D", n->op, a); break; -// case OREGISTER: -// a->type = n->val.u.reg; -// a->sym = S; -// break; +// case OREGISTER: +// a->type = n->val.u.reg; +// a->sym = S; +// break; // case OINDEX: // case OIND: @@ -1086,25 +1078,29 @@ naddr(Node *n, Addr *a) // } // break; -// case OINDREG: -// a->type = n->val.u.reg+D_INDIR; -// a->sym = n->sym; -// a->offset = n->xoffset; -// break; +// case OINDREG: +// a->type = n->val.u.reg+D_INDIR; +// a->sym = n->sym; +// a->offset = n->xoffset; +// break; -// case OPARAM: -// // n->left is PHEAP ONAME for stack parameter. -// // compute address of actual parameter on stack. -// a->etype = n->left->type->etype; -// a->offset = n->xoffset; -// a->sym = n->left->sym; -// a->type = D_PARAM; -// break; +// case OPARAM: +// // n->left is PHEAP ONAME for stack parameter. +// // compute address of actual parameter on stack. +// a->etype = simtype[n->left->type->etype]; +// a->width = n->left->type->width; +// a->offset = n->xoffset; +// a->sym = n->left->sym; +// a->type = D_PARAM; +// break; case ONAME: a->etype = 0; - if(n->type != T) + a->width = 0; + if(n->type != T) { a->etype = simtype[n->type->etype]; + a->width = n->type->width; + } a->offset = n->xoffset; a->sym = n->sym; if(a->sym == S) @@ -1112,8 +1108,8 @@ naddr(Node *n, Addr *a) if(n->method) { if(n->type != T) if(n->type->sym != S) - if(n->type->sym->opackage != nil) - a->sym = pkglookup(a->sym->name, n->type->sym->opackage); + if(n->type->sym->package != nil) + a->sym = pkglookup(a->sym->name, n->type->sym->package); } switch(n->class) { @@ -1151,11 +1147,7 @@ naddr(Node *n, Addr *a) a->offset = mpgetfix(n->val.u.xval); break; case CTSTR: - a->etype = simtype[n->etype]; - a->sym = symstringl; - a->type = D_STATIC; - a->offset = symstringl->offset; - stringpool(n); + datagostring(n->val.u.sval, a); break; case CTBOOL: a->sym = S; @@ -1170,20 +1162,20 @@ naddr(Node *n, Addr *a) } break; -// case OADDR: -// naddr(n->left, a); -// if(a->type >= D_INDIR) { -// a->type -= D_INDIR; -// break; -// } -// if(a->type == D_EXTERN || a->type == D_STATIC || -// a->type == D_AUTO || a->type == D_PARAM) -// if(a->index == D_NONE) { -// a->index = a->type; -// a->type = D_ADDR; -// break; -// } -// fatal("naddr: OADDR\n"); +// case OADDR: +// naddr(n->left, a); +// if(a->type >= D_INDIR) { +// a->type -= D_INDIR; +// break; +// } +// if(a->type == D_EXTERN || a->type == D_STATIC || +// a->type == D_AUTO || a->type == D_PARAM) +// if(a->index == D_NONE) { +// a->index = a->type; +// a->type = D_ADDR; +// break; +// } +// fatal("naddr: OADDR\n"); // case OADD: // if(n->right->op == OLITERAL) { @@ -1207,528 +1199,527 @@ naddr(Node *n, Addr *a) int optoas(int op, Type *t) { -// int a; - -// if(t == T) -// fatal("optoas: t is nil"); - -// a = AGOK; -// switch(CASE(op, simtype[t->etype])) { -// default: -// fatal("optoas: no entry %O-%T", op, t); -// break; - -// case CASE(OADDR, TPTR32): -// a = ALEAL; -// break; - -// case CASE(OADDR, TPTR64): -// a = ALEAQ; -// break; - -// case CASE(OEQ, TBOOL): -// case CASE(OEQ, TINT8): -// case CASE(OEQ, TUINT8): -// case CASE(OEQ, TINT16): -// case CASE(OEQ, TUINT16): -// case CASE(OEQ, TINT32): -// case CASE(OEQ, TUINT32): -// case CASE(OEQ, TINT64): -// case CASE(OEQ, TUINT64): -// case CASE(OEQ, TPTR32): -// case CASE(OEQ, TPTR64): -// case CASE(OEQ, TFLOAT32): -// case CASE(OEQ, TFLOAT64): -// a = AJEQ; -// break; - -// case CASE(ONE, TBOOL): -// case CASE(ONE, TINT8): -// case CASE(ONE, TUINT8): -// case CASE(ONE, TINT16): -// case CASE(ONE, TUINT16): -// case CASE(ONE, TINT32): -// case CASE(ONE, TUINT32): -// case CASE(ONE, TINT64): -// case CASE(ONE, TUINT64): -// case CASE(ONE, TPTR32): -// case CASE(ONE, TPTR64): -// case CASE(ONE, TFLOAT32): -// case CASE(ONE, TFLOAT64): -// a = AJNE; -// break; - -// case CASE(OLT, TINT8): -// case CASE(OLT, TINT16): -// case CASE(OLT, TINT32): -// case CASE(OLT, TINT64): -// a = AJLT; -// break; - -// case CASE(OLT, TUINT8): -// case CASE(OLT, TUINT16): -// case CASE(OLT, TUINT32): -// case CASE(OLT, TUINT64): -// case CASE(OGT, TFLOAT32): -// case CASE(OGT, TFLOAT64): -// a = AJCS; -// break; - -// case CASE(OLE, TINT8): -// case CASE(OLE, TINT16): -// case CASE(OLE, TINT32): -// case CASE(OLE, TINT64): -// a = AJLE; -// break; - -// case CASE(OLE, TUINT8): -// case CASE(OLE, TUINT16): -// case CASE(OLE, TUINT32): -// case CASE(OLE, TUINT64): -// case CASE(OGE, TFLOAT32): -// case CASE(OGE, TFLOAT64): -// a = AJLS; -// break; - -// case CASE(OGT, TINT8): -// case CASE(OGT, TINT16): -// case CASE(OGT, TINT32): -// case CASE(OGT, TINT64): -// a = AJGT; -// break; - -// case CASE(OGT, TUINT8): -// case CASE(OGT, TUINT16): -// case CASE(OGT, TUINT32): -// case CASE(OGT, TUINT64): -// case CASE(OLT, TFLOAT32): -// case CASE(OLT, TFLOAT64): -// a = AJHI; -// break; - -// case CASE(OGE, TINT8): -// case CASE(OGE, TINT16): -// case CASE(OGE, TINT32): -// case CASE(OGE, TINT64): -// a = AJGE; -// break; - -// case CASE(OGE, TUINT8): -// case CASE(OGE, TUINT16): -// case CASE(OGE, TUINT32): -// case CASE(OGE, TUINT64): -// case CASE(OLE, TFLOAT32): -// case CASE(OLE, TFLOAT64): -// a = AJCC; -// break; - -// case CASE(OCMP, TBOOL): -// case CASE(OCMP, TINT8): -// case CASE(OCMP, TUINT8): -// a = ACMPB; -// break; - -// case CASE(OCMP, TINT16): -// case CASE(OCMP, TUINT16): -// a = ACMPW; -// break; - -// case CASE(OCMP, TINT32): -// case CASE(OCMP, TUINT32): -// case CASE(OCMP, TPTR32): -// a = ACMPL; -// break; - -// case CASE(OCMP, TINT64): -// case CASE(OCMP, TUINT64): -// case CASE(OCMP, TPTR64): -// a = ACMPQ; -// break; - -// case CASE(OCMP, TFLOAT32): -// a = AUCOMISS; -// break; - -// case CASE(OCMP, TFLOAT64): -// a = AUCOMISD; -// break; - -// case CASE(OAS, TBOOL): -// case CASE(OAS, TINT8): -// case CASE(OAS, TUINT8): -// a = AMOVB; -// break; - -// case CASE(OAS, TINT16): -// case CASE(OAS, TUINT16): -// a = AMOVW; -// break; - -// case CASE(OAS, TINT32): -// case CASE(OAS, TUINT32): -// case CASE(OAS, TPTR32): -// a = AMOVL; -// break; - -// case CASE(OAS, TINT64): -// case CASE(OAS, TUINT64): -// case CASE(OAS, TPTR64): -// a = AMOVQ; -// break; - -// case CASE(OAS, TFLOAT32): -// a = AMOVSS; -// break; - -// case CASE(OAS, TFLOAT64): -// a = AMOVSD; -// break; - -// case CASE(OADD, TINT8): -// case CASE(OADD, TUINT8): -// a = AADDB; -// break; - -// case CASE(OADD, TINT16): -// case CASE(OADD, TUINT16): -// a = AADDW; -// break; - -// case CASE(OADD, TINT32): -// case CASE(OADD, TUINT32): -// case CASE(OADD, TPTR32): -// a = AADDL; -// break; - -// case CASE(OADD, TINT64): -// case CASE(OADD, TUINT64): -// case CASE(OADD, TPTR64): -// a = AADDQ; -// break; - -// case CASE(OADD, TFLOAT32): -// a = AADDSS; -// break; - -// case CASE(OADD, TFLOAT64): -// a = AADDSD; -// break; - -// case CASE(OSUB, TINT8): -// case CASE(OSUB, TUINT8): -// a = ASUBB; -// break; - -// case CASE(OSUB, TINT16): -// case CASE(OSUB, TUINT16): -// a = ASUBW; -// break; - -// case CASE(OSUB, TINT32): -// case CASE(OSUB, TUINT32): -// case CASE(OSUB, TPTR32): -// a = ASUBL; -// break; - -// case CASE(OSUB, TINT64): -// case CASE(OSUB, TUINT64): -// case CASE(OSUB, TPTR64): -// a = ASUBQ; -// break; - -// case CASE(OSUB, TFLOAT32): -// a = ASUBSS; -// break; - -// case CASE(OSUB, TFLOAT64): -// a = ASUBSD; -// break; - -// case CASE(OINC, TINT8): -// case CASE(OINC, TUINT8): -// a = AINCB; -// break; - -// case CASE(OINC, TINT16): -// case CASE(OINC, TUINT16): -// a = AINCW; -// break; - -// case CASE(OINC, TINT32): -// case CASE(OINC, TUINT32): -// case CASE(OINC, TPTR32): -// a = AINCL; -// break; - -// case CASE(OINC, TINT64): -// case CASE(OINC, TUINT64): -// case CASE(OINC, TPTR64): -// a = AINCQ; -// break; - -// case CASE(ODEC, TINT8): -// case CASE(ODEC, TUINT8): -// a = ADECB; -// break; - -// case CASE(ODEC, TINT16): -// case CASE(ODEC, TUINT16): -// a = ADECW; -// break; - -// case CASE(ODEC, TINT32): -// case CASE(ODEC, TUINT32): -// case CASE(ODEC, TPTR32): -// a = ADECL; -// break; - -// case CASE(ODEC, TINT64): -// case CASE(ODEC, TUINT64): -// case CASE(ODEC, TPTR64): -// a = ADECQ; -// break; - -// case CASE(OMINUS, TINT8): -// case CASE(OMINUS, TUINT8): -// a = ANEGB; -// break; - -// case CASE(OMINUS, TINT16): -// case CASE(OMINUS, TUINT16): -// a = ANEGW; -// break; - -// case CASE(OMINUS, TINT32): -// case CASE(OMINUS, TUINT32): -// case CASE(OMINUS, TPTR32): -// a = ANEGL; -// break; - -// case CASE(OMINUS, TINT64): -// case CASE(OMINUS, TUINT64): -// case CASE(OMINUS, TPTR64): -// a = ANEGQ; -// break; - -// case CASE(OAND, TINT8): -// case CASE(OAND, TUINT8): -// a = AANDB; -// break; - -// case CASE(OAND, TINT16): -// case CASE(OAND, TUINT16): -// a = AANDW; -// break; - -// case CASE(OAND, TINT32): -// case CASE(OAND, TUINT32): -// case CASE(OAND, TPTR32): -// a = AANDL; -// break; - -// case CASE(OAND, TINT64): -// case CASE(OAND, TUINT64): -// case CASE(OAND, TPTR64): -// a = AANDQ; -// break; - -// case CASE(OOR, TINT8): -// case CASE(OOR, TUINT8): -// a = AORB; -// break; - -// case CASE(OOR, TINT16): -// case CASE(OOR, TUINT16): -// a = AORW; -// break; - -// case CASE(OOR, TINT32): -// case CASE(OOR, TUINT32): -// case CASE(OOR, TPTR32): -// a = AORL; -// break; - -// case CASE(OOR, TINT64): -// case CASE(OOR, TUINT64): -// case CASE(OOR, TPTR64): -// a = AORQ; -// break; - -// case CASE(OXOR, TINT8): -// case CASE(OXOR, TUINT8): -// a = AXORB; -// break; - -// case CASE(OXOR, TINT16): -// case CASE(OXOR, TUINT16): -// a = AXORW; -// break; - -// case CASE(OXOR, TINT32): -// case CASE(OXOR, TUINT32): -// case CASE(OXOR, TPTR32): -// a = AXORL; -// break; - -// case CASE(OXOR, TINT64): -// case CASE(OXOR, TUINT64): -// case CASE(OXOR, TPTR64): -// a = AXORQ; -// break; - -// case CASE(OLSH, TINT8): -// case CASE(OLSH, TUINT8): -// a = ASHLB; -// break; - -// case CASE(OLSH, TINT16): -// case CASE(OLSH, TUINT16): -// a = ASHLW; -// break; - -// case CASE(OLSH, TINT32): -// case CASE(OLSH, TUINT32): -// case CASE(OLSH, TPTR32): -// a = ASHLL; -// break; - -// case CASE(OLSH, TINT64): -// case CASE(OLSH, TUINT64): -// case CASE(OLSH, TPTR64): -// a = ASHLQ; -// break; - -// case CASE(ORSH, TUINT8): -// a = ASHRB; -// break; - -// case CASE(ORSH, TUINT16): -// a = ASHRW; -// break; - -// case CASE(ORSH, TUINT32): -// case CASE(ORSH, TPTR32): -// a = ASHRL; -// break; - -// case CASE(ORSH, TUINT64): -// case CASE(ORSH, TPTR64): -// a = ASHRQ; -// break; - -// case CASE(ORSH, TINT8): -// a = ASARB; -// break; - -// case CASE(ORSH, TINT16): -// a = ASARW; -// break; - -// case CASE(ORSH, TINT32): -// a = ASARL; -// break; - -// case CASE(ORSH, TINT64): -// a = ASARQ; -// break; - -// case CASE(OMUL, TINT8): -// case CASE(OMUL, TUINT8): -// a = AIMULB; -// break; - -// case CASE(OMUL, TINT16): -// case CASE(OMUL, TUINT16): -// a = AIMULW; -// break; - -// case CASE(OMUL, TINT32): -// case CASE(OMUL, TUINT32): -// case CASE(OMUL, TPTR32): -// a = AIMULL; -// break; - -// case CASE(OMUL, TINT64): -// case CASE(OMUL, TUINT64): -// case CASE(OMUL, TPTR64): -// a = AIMULQ; -// break; - -// case CASE(OMUL, TFLOAT32): -// a = AMULSS; -// break; - -// case CASE(OMUL, TFLOAT64): -// a = AMULSD; -// break; - -// case CASE(ODIV, TINT8): -// case CASE(OMOD, TINT8): -// a = AIDIVB; -// break; - -// case CASE(ODIV, TUINT8): -// case CASE(OMOD, TUINT8): -// a = ADIVB; -// break; - -// case CASE(ODIV, TINT16): -// case CASE(OMOD, TINT16): -// a = AIDIVW; -// break; - -// case CASE(ODIV, TUINT16): -// case CASE(OMOD, TUINT16): -// a = ADIVW; -// break; - -// case CASE(ODIV, TINT32): -// case CASE(OMOD, TINT32): -// a = AIDIVL; -// break; - -// case CASE(ODIV, TUINT32): -// case CASE(ODIV, TPTR32): -// case CASE(OMOD, TUINT32): -// case CASE(OMOD, TPTR32): -// a = ADIVL; -// break; - -// case CASE(ODIV, TINT64): -// case CASE(OMOD, TINT64): -// a = AIDIVQ; -// break; - -// case CASE(ODIV, TUINT64): -// case CASE(ODIV, TPTR64): -// case CASE(OMOD, TUINT64): -// case CASE(OMOD, TPTR64): -// a = ADIVQ; -// break; - -// case CASE(OEXTEND, TINT16): -// a = ACWD; -// break; - -// case CASE(OEXTEND, TINT32): -// a = ACDQ; -// break; - -// case CASE(OEXTEND, TINT64): -// a = ACQO; -// break; - -// case CASE(ODIV, TFLOAT32): -// a = ADIVSS; -// break; - -// case CASE(ODIV, TFLOAT64): -// a = ADIVSD; -// break; - -// } -// return a; - fatal("optoas_unimplemented"); + int a; + + if(t == T) + fatal("optoas: t is nil"); + + a = AGOK; + switch(CASE(op, simtype[t->etype])) { + default: + fatal("optoas: no entry %O-%T", op, t); + break; + +/* case CASE(OADDR, TPTR32): + a = ALEAL; + break; + + case CASE(OADDR, TPTR64): + a = ALEAQ; + break; +*/ + case CASE(OEQ, TBOOL): + case CASE(OEQ, TINT8): + case CASE(OEQ, TUINT8): + case CASE(OEQ, TINT16): + case CASE(OEQ, TUINT16): + case CASE(OEQ, TINT32): + case CASE(OEQ, TUINT32): + case CASE(OEQ, TINT64): + case CASE(OEQ, TUINT64): + case CASE(OEQ, TPTR32): + case CASE(OEQ, TPTR64): + case CASE(OEQ, TFLOAT32): + case CASE(OEQ, TFLOAT64): + a = ABEQ; + break; + + case CASE(ONE, TBOOL): + case CASE(ONE, TINT8): + case CASE(ONE, TUINT8): + case CASE(ONE, TINT16): + case CASE(ONE, TUINT16): + case CASE(ONE, TINT32): + case CASE(ONE, TUINT32): + case CASE(ONE, TINT64): + case CASE(ONE, TUINT64): + case CASE(ONE, TPTR32): + case CASE(ONE, TPTR64): + case CASE(ONE, TFLOAT32): + case CASE(ONE, TFLOAT64): + a = ABNE; + break; + + case CASE(OLT, TINT8): + case CASE(OLT, TINT16): + case CASE(OLT, TINT32): + case CASE(OLT, TINT64): + a = ABLT; + break; + + case CASE(OLT, TUINT8): + case CASE(OLT, TUINT16): + case CASE(OLT, TUINT32): + case CASE(OLT, TUINT64): + case CASE(OGT, TFLOAT32): + case CASE(OGT, TFLOAT64): + a = ABCS; + break; + + case CASE(OLE, TINT8): + case CASE(OLE, TINT16): + case CASE(OLE, TINT32): + case CASE(OLE, TINT64): + a = ABLE; + break; + + case CASE(OLE, TUINT8): + case CASE(OLE, TUINT16): + case CASE(OLE, TUINT32): + case CASE(OLE, TUINT64): + case CASE(OGE, TFLOAT32): + case CASE(OGE, TFLOAT64): + a = ABLS; + break; + + case CASE(OGT, TINT8): + case CASE(OGT, TINT16): + case CASE(OGT, TINT32): + case CASE(OGT, TINT64): + a = ABGT; + break; + + case CASE(OGT, TUINT8): + case CASE(OGT, TUINT16): + case CASE(OGT, TUINT32): + case CASE(OGT, TUINT64): + case CASE(OLT, TFLOAT32): + case CASE(OLT, TFLOAT64): + a = ABHI; + break; + + case CASE(OGE, TINT8): + case CASE(OGE, TINT16): + case CASE(OGE, TINT32): + case CASE(OGE, TINT64): + a = ABGE; + break; + + case CASE(OGE, TUINT8): + case CASE(OGE, TUINT16): + case CASE(OGE, TUINT32): + case CASE(OGE, TUINT64): + case CASE(OLE, TFLOAT32): + case CASE(OLE, TFLOAT64): + a = ABCC; + break; + + case CASE(OCMP, TBOOL): + case CASE(OCMP, TINT8): + case CASE(OCMP, TUINT8): + a = ACMP; + break; + +// case CASE(OCMP, TINT16): +// case CASE(OCMP, TUINT16): +// a = ACMPW; +// break; + +// case CASE(OCMP, TINT32): +// case CASE(OCMP, TUINT32): +// case CASE(OCMP, TPTR32): +// a = ACMPL; +// break; + +// case CASE(OCMP, TINT64): +// case CASE(OCMP, TUINT64): +// case CASE(OCMP, TPTR64): +// a = ACMPQ; +// break; + +// case CASE(OCMP, TFLOAT32): +// a = AUCOMISS; +// break; + +// case CASE(OCMP, TFLOAT64): +// a = AUCOMISD; +// break; + +// case CASE(OAS, TBOOL): +// case CASE(OAS, TINT8): +// case CASE(OAS, TUINT8): +// a = AMOVB; +// break; + +// case CASE(OAS, TINT16): +// case CASE(OAS, TUINT16): +// a = AMOVW; +// break; + +// case CASE(OAS, TINT32): +// case CASE(OAS, TUINT32): +// case CASE(OAS, TPTR32): +// a = AMOVL; +// break; + +// case CASE(OAS, TINT64): +// case CASE(OAS, TUINT64): +// case CASE(OAS, TPTR64): +// a = AMOVQ; +// break; + +// case CASE(OAS, TFLOAT32): +// a = AMOVSS; +// break; + +// case CASE(OAS, TFLOAT64): +// a = AMOVSD; +// break; + +// case CASE(OADD, TINT8): +// case CASE(OADD, TUINT8): +// a = AADDB; +// break; + +// case CASE(OADD, TINT16): +// case CASE(OADD, TUINT16): +// a = AADDW; +// break; + +// case CASE(OADD, TINT32): +// case CASE(OADD, TUINT32): +// case CASE(OADD, TPTR32): +// a = AADDL; +// break; + +// case CASE(OADD, TINT64): +// case CASE(OADD, TUINT64): +// case CASE(OADD, TPTR64): +// a = AADDQ; +// break; + +// case CASE(OADD, TFLOAT32): +// a = AADDSS; +// break; + +// case CASE(OADD, TFLOAT64): +// a = AADDSD; +// break; + +// case CASE(OSUB, TINT8): +// case CASE(OSUB, TUINT8): +// a = ASUBB; +// break; + +// case CASE(OSUB, TINT16): +// case CASE(OSUB, TUINT16): +// a = ASUBW; +// break; + +// case CASE(OSUB, TINT32): +// case CASE(OSUB, TUINT32): +// case CASE(OSUB, TPTR32): +// a = ASUBL; +// break; + +// case CASE(OSUB, TINT64): +// case CASE(OSUB, TUINT64): +// case CASE(OSUB, TPTR64): +// a = ASUBQ; +// break; + +// case CASE(OSUB, TFLOAT32): +// a = ASUBSS; +// break; + +// case CASE(OSUB, TFLOAT64): +// a = ASUBSD; +// break; + +// case CASE(OINC, TINT8): +// case CASE(OINC, TUINT8): +// a = AINCB; +// break; + +// case CASE(OINC, TINT16): +// case CASE(OINC, TUINT16): +// a = AINCW; +// break; + +// case CASE(OINC, TINT32): +// case CASE(OINC, TUINT32): +// case CASE(OINC, TPTR32): +// a = AINCL; +// break; + +// case CASE(OINC, TINT64): +// case CASE(OINC, TUINT64): +// case CASE(OINC, TPTR64): +// a = AINCQ; +// break; + +// case CASE(ODEC, TINT8): +// case CASE(ODEC, TUINT8): +// a = ADECB; +// break; + +// case CASE(ODEC, TINT16): +// case CASE(ODEC, TUINT16): +// a = ADECW; +// break; + +// case CASE(ODEC, TINT32): +// case CASE(ODEC, TUINT32): +// case CASE(ODEC, TPTR32): +// a = ADECL; +// break; + +// case CASE(ODEC, TINT64): +// case CASE(ODEC, TUINT64): +// case CASE(ODEC, TPTR64): +// a = ADECQ; +// break; + +// case CASE(OMINUS, TINT8): +// case CASE(OMINUS, TUINT8): +// a = ANEGB; +// break; + +// case CASE(OMINUS, TINT16): +// case CASE(OMINUS, TUINT16): +// a = ANEGW; +// break; + +// case CASE(OMINUS, TINT32): +// case CASE(OMINUS, TUINT32): +// case CASE(OMINUS, TPTR32): +// a = ANEGL; +// break; + +// case CASE(OMINUS, TINT64): +// case CASE(OMINUS, TUINT64): +// case CASE(OMINUS, TPTR64): +// a = ANEGQ; +// break; + +// case CASE(OAND, TINT8): +// case CASE(OAND, TUINT8): +// a = AANDB; +// break; + +// case CASE(OAND, TINT16): +// case CASE(OAND, TUINT16): +// a = AANDW; +// break; + +// case CASE(OAND, TINT32): +// case CASE(OAND, TUINT32): +// case CASE(OAND, TPTR32): +// a = AANDL; +// break; + +// case CASE(OAND, TINT64): +// case CASE(OAND, TUINT64): +// case CASE(OAND, TPTR64): +// a = AANDQ; +// break; + +// case CASE(OOR, TINT8): +// case CASE(OOR, TUINT8): +// a = AORB; +// break; + +// case CASE(OOR, TINT16): +// case CASE(OOR, TUINT16): +// a = AORW; +// break; + +// case CASE(OOR, TINT32): +// case CASE(OOR, TUINT32): +// case CASE(OOR, TPTR32): +// a = AORL; +// break; + +// case CASE(OOR, TINT64): +// case CASE(OOR, TUINT64): +// case CASE(OOR, TPTR64): +// a = AORQ; +// break; + +// case CASE(OXOR, TINT8): +// case CASE(OXOR, TUINT8): +// a = AXORB; +// break; + +// case CASE(OXOR, TINT16): +// case CASE(OXOR, TUINT16): +// a = AXORW; +// break; + +// case CASE(OXOR, TINT32): +// case CASE(OXOR, TUINT32): +// case CASE(OXOR, TPTR32): +// a = AXORL; +// break; + +// case CASE(OXOR, TINT64): +// case CASE(OXOR, TUINT64): +// case CASE(OXOR, TPTR64): +// a = AXORQ; +// break; + +// case CASE(OLSH, TINT8): +// case CASE(OLSH, TUINT8): +// a = ASHLB; +// break; + +// case CASE(OLSH, TINT16): +// case CASE(OLSH, TUINT16): +// a = ASHLW; +// break; + +// case CASE(OLSH, TINT32): +// case CASE(OLSH, TUINT32): +// case CASE(OLSH, TPTR32): +// a = ASHLL; +// break; + +// case CASE(OLSH, TINT64): +// case CASE(OLSH, TUINT64): +// case CASE(OLSH, TPTR64): +// a = ASHLQ; +// break; + +// case CASE(ORSH, TUINT8): +// a = ASHRB; +// break; + +// case CASE(ORSH, TUINT16): +// a = ASHRW; +// break; + +// case CASE(ORSH, TUINT32): +// case CASE(ORSH, TPTR32): +// a = ASHRL; +// break; + +// case CASE(ORSH, TUINT64): +// case CASE(ORSH, TPTR64): +// a = ASHRQ; +// break; + +// case CASE(ORSH, TINT8): +// a = ASARB; +// break; + +// case CASE(ORSH, TINT16): +// a = ASARW; +// break; + +// case CASE(ORSH, TINT32): +// a = ASARL; +// break; + +// case CASE(ORSH, TINT64): +// a = ASARQ; +// break; + +// case CASE(OMUL, TINT8): +// case CASE(OMUL, TUINT8): +// a = AIMULB; +// break; + +// case CASE(OMUL, TINT16): +// case CASE(OMUL, TUINT16): +// a = AIMULW; +// break; + +// case CASE(OMUL, TINT32): +// case CASE(OMUL, TUINT32): +// case CASE(OMUL, TPTR32): +// a = AIMULL; +// break; + +// case CASE(OMUL, TINT64): +// case CASE(OMUL, TUINT64): +// case CASE(OMUL, TPTR64): +// a = AIMULQ; +// break; + +// case CASE(OMUL, TFLOAT32): +// a = AMULSS; +// break; + +// case CASE(OMUL, TFLOAT64): +// a = AMULSD; +// break; + +// case CASE(ODIV, TINT8): +// case CASE(OMOD, TINT8): +// a = AIDIVB; +// break; + +// case CASE(ODIV, TUINT8): +// case CASE(OMOD, TUINT8): +// a = ADIVB; +// break; + +// case CASE(ODIV, TINT16): +// case CASE(OMOD, TINT16): +// a = AIDIVW; +// break; + +// case CASE(ODIV, TUINT16): +// case CASE(OMOD, TUINT16): +// a = ADIVW; +// break; + +// case CASE(ODIV, TINT32): +// case CASE(OMOD, TINT32): +// a = AIDIVL; +// break; + +// case CASE(ODIV, TUINT32): +// case CASE(ODIV, TPTR32): +// case CASE(OMOD, TUINT32): +// case CASE(OMOD, TPTR32): +// a = ADIVL; +// break; + +// case CASE(ODIV, TINT64): +// case CASE(OMOD, TINT64): +// a = AIDIVQ; +// break; + +// case CASE(ODIV, TUINT64): +// case CASE(ODIV, TPTR64): +// case CASE(OMOD, TUINT64): +// case CASE(OMOD, TPTR64): +// a = ADIVQ; +// break; + +// case CASE(OEXTEND, TINT16): +// a = ACWD; +// break; + +// case CASE(OEXTEND, TINT32): +// a = ACDQ; +// break; + +// case CASE(OEXTEND, TINT64): +// a = ACQO; +// break; + +// case CASE(ODIV, TFLOAT32): +// a = ADIVSS; +// break; + +// case CASE(ODIV, TFLOAT64): +// a = ADIVSD; +// break; + + } + return a; } enum @@ -1762,12 +1753,12 @@ sudoclean(void) * to release the register used for a. */ int -sudoaddable(Node *n, Addr *a) +sudoaddable(int as, Node *n, Addr *a) { int o, i, w; int oary[10]; - vlong v; - Node n1, n2, *nn, *l, *r; + int64 v; + Node n1, n2, n3, *nn, *l, *r; Node *reg, *reg1; Prog *p1; Type *t; @@ -1776,8 +1767,13 @@ sudoaddable(Node *n, Addr *a) return 0; switch(n->op) { - default: - return 0; + case OLITERAL: + if(n->val.ctype != CTINT) + break; + v = mpgetfix(n->val.u.xval); + if(v >= 32000 || v <= -32000) + break; + goto lit; case ODOT: case ODOTPTR: @@ -1796,12 +1792,46 @@ sudoaddable(Node *n, Addr *a) reg1->op = OEMPTY; goto oindex; } + return 0; + +lit: + fatal("sudoaddable lit not implemented"); +// switch(as) { +// default: +// return 0; +// case AADDB: case AADDW: case AADDL: case AADDQ: +// case ASUBB: case ASUBW: case ASUBL: case ASUBQ: +// case AANDB: case AANDW: case AANDL: case AANDQ: +// case AORB: case AORW: case AORL: case AORQ: +// case AXORB: case AXORW: case AXORL: case AXORQ: +// case AINCB: case AINCW: case AINCL: case AINCQ: +// case ADECB: case ADECW: case ADECL: case ADECQ: +// case AMOVB: case AMOVW: case AMOVL: case AMOVQ: +// break; +// } + +// cleani += 2; +// reg = &clean[cleani-1]; +// reg1 = &clean[cleani-2]; +// reg->op = OEMPTY; +// reg1->op = OEMPTY; +// naddr(n, a); +// goto yes; odot: o = dotoffset(n, oary, &nn); if(nn == N) goto no; + if(nn->addable && o == 1 && oary[0] >= 0) { + // directly addressable set of DOTs + n1 = *nn; + n1.type = n->type; + n1.xoffset += oary[0]; + naddr(&n1, a); + goto yes; + } + regalloc(reg, types[tptr], N); n1 = *reg; n1.op = OINDREG; @@ -1813,13 +1843,13 @@ odot: n1.xoffset = -(oary[0]+1); } - fatal("sudoaddable_unimplemented"); -// for(i=1; i<o; i++) { -// if(oary[i] >= 0) -// fatal("cant happen"); -// gins(AMOVQ, &n1, reg); -// n1.xoffset = -(oary[i]+1); -// } + fatal("sudoaddable odot not implemented"); +// for(i=1; i<o; i++) { +// if(oary[i] >= 0) +// fatal("cant happen"); +// gins(AMOVQ, &n1, reg); +// n1.xoffset = -(oary[i]+1); +// } a->type = D_NONE; a->index = D_NONE; @@ -1875,7 +1905,10 @@ oindex: if(issigned[r->type->etype]) t = types[TINT64]; regalloc(reg1, t, N); - cgen(r, reg1); + regalloc(&n3, r->type, reg1); + cgen(r, &n3); + gmove(&n3, reg1); + regfree(&n3); // load the array (reg) if(l->ullman <= r->ullman) { @@ -1912,12 +1945,12 @@ oindex: gmove(&n2, reg); } - fatal("sudoaddable_unimplemented"); -// naddr(reg1, a); -// a->offset = 0; -// a->scale = w; -// a->index = a->type; -// a->type = reg->val.u.reg + D_INDIR; + fatal("sudoaddable oindex not implemented"); +// naddr(reg1, a); +// a->offset = 0; +// a->scale = w; +// a->index = a->type; +// a->type = reg->val.u.reg + D_INDIR; goto yes; |