+ 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;
+ }
+ return;
+ }
+