case OADD:
case OMUL:
a = optoas(n->op, nl->type);
- goto sbop;
+ if(a != AIMULB)
+ goto sbop;
+ cgen_bmul(n->op, nl, nr, res);
+ break;
// asymmetric binary
case OSUB:
;
}
+void
+cgen_bmul(int op, Node *nl, Node *nr, Node *res)
+{
+ Node n1, n2;
+ Type *t;
+ int a;
+
+ t = types[TUINT16];
+ if(issigned[nl->type->etype])
+ t = types[TINT16];
+
+ if(nl->ullman >= nr->ullman) {
+ regalloc(&n1, t, nl);
+ cgen(nl, &n1);
+ regalloc(&n2, t, nr);
+ cgen(nr, &n2);
+ } else {
+ regalloc(&n2, t, nr);
+ cgen(nr, &n2);
+ regalloc(&n1, t, nl);
+ cgen(nl, &n1);
+ }
+ a = optoas(op, t);
+ gins(a, &n2, &n1);
+ gmove(&n1, res);
+ regfree(&n1);
+ regfree(&n2);
+}
+
void
checklabels(void)
{
void cgen_proc(Node*);
void cgen_callret(Node*, Node*);
void cgen_div(int, Node*, Node*, Node*);
+void cgen_bmul(int, Node*, Node*, Node*);
void cgen_shift(int, Node*, Node*, Node*);
void genpanic(void);
int needconvert(Type*, Type*);