- register NODE *l, *r;
- register wfrom, wto;
- int oltype;
-
- l = getlr(p, '1');
- oltype = l->in.type, l->in.type = r->in.type;
- r = getlr(p, 'L');
- wfrom = tlen(r), wto = tlen(l);
- if (wfrom == wto) /* e.g. int -> unsigned */
- goto done;
- /*
- * Conversion in registers requires care
- * as cvt and movz instruction don't work
- * as expected (they end up as plain mov's).
- */
- if (l->in.op == REG && r->in.op == REG) {
- if ((wfrom < wto && ISUNSIGNED(r->in.type)) ||
- (wto < wfrom && ISUNSIGNED(l->in.type))) {
- /* unsigned, mask */
- if (r->tn.rval != l->tn.rval) {
- printf("\tandl3\t$%d,", (1<<(wto*SZCHAR))-1);
- adrput(r);
- putchar(',');
- } else
- printf("\tandl2\t$%d,", (1<<(wto*SZCHAR))-1);
- adrput(l);
- } else { /* effect sign-extend */
- printf("\tpushl\t"); adrput(r);
- printf("\n\tcvt"); prtype(l);
- printf("l\t%d(sp),", sizeof (int) - wto); adrput(l);
- printf("\n\tmovab\t4(sp),sp");
- }
- /*
- * If condition codes are required then we must generate a
- * test of the appropriate type.
- */
- if (forcc) {
- printf("\n\tcmp");
- prtype(l);
- putchar('\t');
- printf("$0,");
- adrput(l);
- }