-struct functbl {
- int fop;
- TWORD ftype;
- char *func;
- } opfunc[] = {
- MUL, LONG, "lmul",
- DIV, LONG, "ldiv",
- MOD, LONG, "lrem",
- ASG MUL, LONG, "almul",
- ASG DIV, LONG, "aldiv",
- ASG MOD, LONG, "alrem",
- MUL, ULONG, "lmul",
- DIV, ULONG, "uldiv",
- MOD, ULONG, "ulrem",
- ASG MUL, ULONG, "almul",
- ASG DIV, ULONG, "auldiv",
- ASG MOD, ULONG, "aulrem",
- 0, 0, 0 };
-
-hardops(p) register NODE *p; {
- /* change hard to do operators into function calls.
- for pdp11 do long * / % */
- register NODE *q;
- register struct functbl *f;
- register o;
- register TWORD t;
-
- o = p->op;
- t = p->type;
- if( t!=LONG && t!=ULONG ) return;
-
- for( f=opfunc; f->fop; f++ ) {
- if( o==f->fop && t==f->ftype ) goto convert;
- }
- return;
-
- /* need address of left node for ASG OP */
- /* WARNING - this won't work for long in a REG */
- convert:
- if( asgop( o ) ) {
- switch( p->left->op ) {
-
- case UNARY MUL: /* convert to address */
- p->left->op = FREE;
- p->left = p->left->left;
- break;
-
- case NAME: /* convert to ICON pointer */
- p->left->op = ICON;
- p->left->type = INCREF( p->left->type );
- break;
-
- case OREG: /* convert OREG to address */
- p->left->op = REG;
- p->left->type = INCREF( p->left->type );
- if( p->left->lval != 0 ) {
- q = talloc();
- q->op = PLUS;
- q->rall = NOPREF;
- q->type = p->left->type;
- q->left = p->left;
- q->right = talloc();
-
- q->right->op = ICON;
- q->right->rall = NOPREF;
- q->right->type = INT;
- q->right->name[0] = '\0';
- q->right->lval = p->left->lval;
- q->right->rval = 0;
-
- p->left->lval = 0;
- p->left = q;
- }
- break;
-
- default:
- cerror( "Bad address for hard ops" );
- /* NO RETURN */
-
- }
- }
-
- /* build comma op for args to function */
- q = talloc();
- q->op = CM;
- q->rall = NOPREF;
- q->type = INT;
- q->left = p->left;
- q->right = p->right;
- p->op = CALL;
- p->right = q;
-
- /* put function name in left node of call */
- p->left = q = talloc();
- q->op = ICON;
- q->rall = NOPREF;
- q->type = INCREF( FTN + p->type );
- strcpy( q->name, f->func );
- q->lval = 0;
- q->rval = 0;
-
- return;
-
- }
-