/* Back patch a branch */
void
label(Inst *i, ulong pc)
{
Adres *a;
switch(i->op) {
case ABA:
case ABCC:
case ABCS:
case ABE:
case ABG:
case ABGE:
case ABGU:
case ABL:
case ABLE:
case ABLEU:
case ABN:
case ABNE:
case ABNEG:
case ABPOS:
case ABVC:
case ABVS:
case AJMPL:
case AJMP:
case AFBA:
case AFBE:
case AFBG:
case AFBGE:
case AFBL:
case AFBLE:
case AFBLG:
case AFBN:
case AFBNE:
case AFBO:
case AFBU:
case AFBUE:
case AFBUG:
case AFBUGE:
case AFBUL:
case AFBULE:
break;
default:
fatal("label not branch");
}
a = &i->dst;
a->type = A_BRANCH;
a->ival = pc;
}
/* Select code for arithmetic operations */
void
codmop(Node *o, Node *l, Node *r, Node *dst)
{
int op;
op = AGOK;
switch(o->type) {
case OADD:
case OADDEQ:
switch(o->t->type) {
default:
op = AADD;
break;
case TFLOAT:
op = AFADDD;
break;
}
break;
case OSUB:
case OSUBEQ:
switch(o->t->type) {
default:
op = ASUB;
break;
case TFLOAT:
op = AFSUBD;
break;
}
break;
case OMUL:
case OMULEQ:
switch(o->t->type) {
default:
op = AMUL;
break;
case TFLOAT:
op = AFMULD;
break;
}
break;
case ODIV:
case ODIVEQ:
switch(o->t->type) {
default:
op = ADIV;
break;
case TUINT:
case TSUINT:
op = ADIVL;
break;
case TFLOAT:
op = AFDIVD;
break;
}
break;
case OMOD:
case OMODEQ:
switch(o->t->type) {
default:
op = AMOD;
break;
case TUINT:
case TSUINT:
op = AMODL;
break;
}
break;
case OALSH:
case OLSH:
case OLSHEQ:
op = ASLL;
break;
case ORSH:
case ORSHEQ:
op = ASRL;
break;
case OXOR:
case OXOREQ:
op = AXOR;
break;
case OLOR:
case OOREQ:
op = AOR;
break;
case OLAND:
case OANDEQ:
op = AAND;
break;
case OARSH:
op = ASRA;
break;
}
instruction(op, l, r, dst);
}