return;
                }
-               o = reg[REGARG];
+               o = 0;
+               if(REGARG >= 0)
+                       o = reg[REGARG];
                gargs(r, &nod, &nod1);
                if(l->addable < INDEXED) {
                        reglcgen(&nod, l, nn);
                        regfree(&nod);
                } else
                        gopcode(OFUNC, n->type, Z, l);
-               if(REGARG)
+               if(REGARG >= 0)
                        if(o != reg[REGARG])
                                reg[REGARG]--;
                if(nn != Z) {
 
        case ACALL:     /* funny */
                if(REGEXT && v->type <= REGEXT && v->type > exregoffset)
                        return 2;
-               if(REGARG && v->type == REGARG)
+               if(REGARG >= 0 && v->type == REGARG)
                        return 2;
 
                if(s != A) {
                return 3;
 
        case ATEXT:     /* funny */
-               if(REGARG && v->type == REGARG)
+               if(REGARG >= 0 && v->type == REGARG)
                        return 3;
                return 0;
        }
 
                        sugen(n, tn2, n->type->width);
                return;
        }
-       if(REGARG && curarg == 0 && typechlpv[n->type->etype]) {
+       if(REGARG >= 0 && curarg == 0 && typechlpv[n->type->etype]) {
                regaalloc1(tn1, n);
                if(n->complex >= FNX) {
                        cgen(*fnxp, tn1);
 void
 regaalloc1(Node *n, Node *nn)
 {
-       if(REGARG == 0)
-               diag(n, "regaalloc1 and REGARG==0");
+       if(REGARG < 0)
+               diag(n, "regaalloc1 and REGARG<0");
        nodreg(n, nn, REGARG);
        reg[REGARG]++;
        curarg = align(curarg, nn->type, Aarg1);
        p->from.sym = s;
        p->from.scale = textflag;
        textflag = 0;
-       
+
        if(s->class == CSTATIC)
                p->from.type = D_STATIC;
        naddr(n, &p->to);
 
 schar  ewidth[NTYPE] =
 {
-       -1,             /*[TXXX]*/      
-       SZ_CHAR,        /*[TCHAR]*/     
+       -1,             /*[TXXX]*/
+       SZ_CHAR,        /*[TCHAR]*/
        SZ_CHAR,        /*[TUCHAR]*/
        SZ_SHORT,       /*[TSHORT]*/
        SZ_SHORT,       /*[TUSHORT]*/
 {
        0,                              /*[TXXX]*/
        BCHAR|BUCHAR,                   /*[TCHAR]*/
-       BCHAR|BUCHAR,                   /*[TUCHAR]*/    
+       BCHAR|BUCHAR,                   /*[TUCHAR]*/
        BSHORT|BUSHORT,                 /*[TSHORT]*/
        BSHORT|BUSHORT,                 /*[TUSHORT]*/
-       BINT|BUINT|BLONG|BULONG,        /*[TINT]*/              
+       BINT|BUINT|BLONG|BULONG,        /*[TINT]*/
        BINT|BUINT|BLONG|BULONG,        /*[TUINT]*/
        BINT|BUINT|BLONG|BULONG,        /*[TLONG]*/
        BINT|BUINT|BLONG|BULONG,        /*[TULONG]*/
 
        T_SCONST        = 1<<5,
        T_64            = 1<<6,
 
-       REGARG          = 0,
+       REGARG          = -1,
        REGRET          = D_AX,
        FREGRET         = D_X0,
        REGSP           = D_SP,
 
                        regfree(&nod);
                } else
                        gopcode(OFUNC, n->type, Z, l);
-               if(REGARG && reg[REGARG])
+               if(REGARG >= 0 && reg[REGARG])
                        reg[REGARG]--;
                if(nn != Z) {
                        regret(&nod, n);
 
                return 3;
 
        case ACALL:     /* funny */
-               if(REGARG && v->type == REGARG)
+               if(REGARG >= 0 && v->type == REGARG)
                        return 2;
 
                if(s != A) {
 
                        sugen(n, tn2, n->type->width);
                return;
        }
-       if(REGARG && curarg == 0 && typeilp[n->type->etype]) {
+       if(REGARG >= 0 && curarg == 0 && typeilp[n->type->etype]) {
                regaalloc1(tn1, n);
                if(n->complex >= FNX) {
                        cgen(*fnxp, tn1);
 
 schar  ewidth[NTYPE] =
 {
-       -1,             /*[TXXX]*/      
-       SZ_CHAR,        /*[TCHAR]*/     
+       -1,             /*[TXXX]*/
+       SZ_CHAR,        /*[TCHAR]*/
        SZ_CHAR,        /*[TUCHAR]*/
        SZ_SHORT,       /*[TSHORT]*/
        SZ_SHORT,       /*[TUSHORT]*/
 {
        0,                              /*[TXXX]*/
        BCHAR|BUCHAR,                   /*[TCHAR]*/
-       BCHAR|BUCHAR,                   /*[TUCHAR]*/    
+       BCHAR|BUCHAR,                   /*[TUCHAR]*/
        BSHORT|BUSHORT,                 /*[TSHORT]*/
        BSHORT|BUSHORT,                 /*[TUSHORT]*/
-       BINT|BUINT|BLONG|BULONG|BIND,   /*[TINT]*/              
+       BINT|BUINT|BLONG|BULONG|BIND,   /*[TINT]*/
        BINT|BUINT|BLONG|BULONG|BIND,   /*[TUINT]*/
        BINT|BUINT|BLONG|BULONG|BIND,   /*[TLONG]*/
        BINT|BUINT|BLONG|BULONG|BIND,   /*[TULONG]*/
 
        T_SCONST        = 1<<5,
        T_OFFSET2       = 1<<6,
 
-       REGARG          = 0,
+       REGARG          = -1,
        REGRET          = D_AX,
        FREGRET         = D_F0,
        REGSP           = D_SP,
 
        /*
         * isolate first argument
         */
-       if(REGARG) {
+       if(REGARG >= 0) {
                if(typesuv[thisfn->link->etype]) {
                        nod1 = *nodret->left;
                        nodreg(&nod, &nod1, REGARG);
                gbranch(OGOTO);         /* entry */
                sp = p;
 
-               /* 
-                * if there are no incoming labels in the 
+               /*
+                * if there are no incoming labels in the
                 * body and the top's not reachable, warn
                 */
                if(!canreach && warnreach && deadheads(n)) {
 
                patch(spc, pc);
                gen(l->right->right);   /* inc */
-               patch(sp, pc);  
+               patch(sp, pc);
                if(l->left != Z) {      /* test */
                        bcomplex(l->left, Z);
                        patch(p, breakpc);
                 * Don't complain about unreachable break statements.
                 * There are breaks hidden in yacc's output and some people
                 * write return; break; in their switch statements out of habit.
-                * However, don't confuse the analysis by inserting an 
+                * However, don't confuse the analysis by inserting an
                 * unreachable reference to breakpc either.
                 */
                if(!canreach)
                                canreach = 1;
                                gen(n->right->right);
                                /*
-                                * treat constant ifs as regular ifs for 
+                                * treat constant ifs as regular ifs for
                                 * reachability warnings.
                                 */
                                if(!canreach && oldreach && debug['w'] < 2)
                                canreach = 1;
                                supgen(n->right->right);
                                /*
-                                * treat constant ifs as regular ifs for 
+                                * treat constant ifs as regular ifs for
                                 * reachability warnings.
                                 */
                                if(!oldreach && canreach && debug['w'] < 2)