+
+ if (ISUNSIGNED(lt)) {
+ putstr("\n\t");
+ s->in.op = SCONV;
+ s->in.left = r; /* we need only the type */
+ s->in.type = UNSIGNED;
+ float_to_unsigned(s);
+ } else {
+ putstr("\n\tcv");
+ prtype(r);
+ putstr("l\t");
+ if (lt == INT)
+ adrput(l);
+ else
+ adrput(resc);
+ }
+ if (lt != INT) {
+ putstr("\n\t");
+ s->in.op = ASSIGN;
+ s->in.left = l;
+ s->in.right = resc;
+ s->in.type = lt;
+ zzzcode(s, 'U');
+ }
+
+ s->in.op = FREE;
+ return;
+ }
+
+ case 'J': /* unsigned DIV/MOD with constant divisors */
+ {
+ register int ck = INAREG;
+ int label1, label2;
+
+ /* case constant <= 1 is handled by optim() in pass 1 */
+ /* case constant < 0x80000000 is handled in table */
+ switch( p->in.op ) {
+ /* case DIV: handled in optim2() */
+ case MOD:
+ if( p->in.left->in.op == REG &&
+ p->in.left->tn.rval == resc->tn.rval )
+ goto asgmod;
+ label1 = getlab();
+ expand(p, ck, "movl\tAL,A1\n\tcmpl\tA1,AR\n");
+ printf("\tjlssu\tL%d\n", label1);
+ expand(p, ck, "\tsubl2\tAR,A1\n");
+ printf("L%d:", label1);
+ break;
+ case ASG DIV:
+ label1 = getlab();
+ label2 = getlab();
+ expand(p, ck, "cmpl\tAL,AR\n");
+ printf("\tjgequ\tL%d\n", label1);
+ expand(p, ck, "\tmovl\t$1,AL\n");
+ printf("\tjbr\tL%d\nL%d:\n", label2, label1);
+ expand(p, ck, "\tclrl\tAL\n");
+ printf("L%d:", label2);
+ break;
+ case ASG MOD:
+ asgmod:
+ label1 = getlab();
+ expand(p, ck, "cmpl\tAL,AR\n");
+ printf("\tjlssu\tL%d\n", label1);
+ expand(p, ck, "\tsubl2\tAR,AL\n");
+ printf("L%d:", label1);
+ break;
+ }