Routines are now called with calls instead of jsb. We use ap as argument
authorem <none@none>
Fri, 18 Jan 1985 15:39:07 +0000 (15:39 +0000)
committerem <none@none>
Fri, 18 Jan 1985 15:39:07 +0000 (15:39 +0000)
pointer register. EM_BSIZE is required to be a constant.

mach/vax4/cg/table

index 0d7504b..45ad60b 100644 (file)
@@ -1,22 +1,16 @@
 "$Header$"
-#define SL 8
-#define SSL "8"
-#define DL 0
-#define SDL ""
-
 #define LOCLABS                /* define if target assembler recognizes local labels */
 #define REGVARS                /* define for register variables */
-
 /*#define DORCK                /* define if you want RCK */
-/*#define FLOAT4       /* define if you want better 4-byte FP arithmetic */
+#define FLOAT4         /* define if you want better 4-byte FP arithmetic */
+#define FLOAT8         /* define if you want better 8-byte FP arithmetic */
+
+#define NC nocoercions :
+#define BSIZE 4
 
 EM_PSIZE = 4
 EM_WSIZE = 4
-#ifndef REGVARS
-EM_BSIZE = SL
-#endif REGVARS
-
-#define NC nocoercions :
+EM_BSIZE = BSIZE
 
 /****************************************************************
  * VAX 11 Back end table.                                      *
@@ -35,8 +29,9 @@ EM_BSIZE = SL
  ****************************************************************/
 
 REGISTERS:
+AP     = ("ap",4),ArgumentPointer.
 LB     = ("fp",4),LocaLBase.
-R0     = ("r0",4),REG,RRET.
+R0     = ("r0",4),REG.
 R1     = ("r1",4),REG.
 R2     = ("r2",4),REG.
 R3     = ("r3",4),REG.
@@ -59,17 +54,21 @@ R9  = ("r9",4),REG.
 RA     = ("r10",4),REG.
 RB     = ("r11",4),REG.
 #endif REGVARS
-QR0    = ("r0",8,R0,R1),QREG,QRET.
+QR0    = ("r0",8,R0,R1),QREG.
 QR2    = ("r2",8,R2,R3),QREG.
+#ifndef REGVARS
 QR4    = ("r4",8,R4,R5),QREG.
 QR6    = ("r6",8,R6,R7),QREG.
 QR8    = ("r8",8,R8,R9),QREG.
 QRA    = ("r10",8,RA,RB),QREG.
+#endif REGVARS
 QR1    = ("r1",8,R1,R2),QREG.
+#ifndef REGVARS
 QR3    = ("r3",8,R3,R4),QREG.
 QR5    = ("r5",8,R5,R6),QREG.
 QR7    = ("r7",8,R7,R8),QREG.
 QR9    = ("r9",8,R9,RA),QREG.
+#endif REGVARS
 
 TOKENS:
 
@@ -79,11 +78,11 @@ CONST2 =    {INT num;}              4 cost=(4,3)  "$%[num]"
 CONST4 =       {INT num;}              4 cost=(4,3)  "$%[num]"
 CONST8 =       {STRING ind;}           8 cost=(8,6)  "$%[ind]"
 FCONST8 =      {INT num;}              8 cost=(8,6)  "$0f%[num].0"
-LOCAL1 =       {INT num,size;}         4 cost=(2,6)  "%[num](fp)"
-LOCAL2 =       {INT num,size;}         4 cost=(2,6)  "%[num](fp)"
-LOCAL4 =       {INT num,size;}         4 cost=(2,6)  "%[num](fp)"
-LOCAL8 =       {INT num,size;}         8 cost=(2,6)  "%[num](fp)"
-ADDR_LOCAL =   {INT num;}              4 cost=(2,6)  "%[num](fp)"
+LOCAL1 =       {REGISTER reg; INT num,size;}   4 cost=(2,6)  "%[num](%[reg])"
+LOCAL2 =       {REGISTER reg; INT num,size;}   4 cost=(2,6)  "%[num](%[reg])"
+LOCAL4 =       {REGISTER reg; INT num,size;}   4 cost=(2,6)  "%[num](%[reg])"
+LOCAL8 =       {REGISTER reg; INT num,size;}   8 cost=(2,9)  "%[num](%[reg])"
+ADDR_LOCAL =   {REGISTER reg; INT num;}        4 cost=(2,6)  "%[num](%[reg])"
 ADDR_EXTERNAL =        {STRING ind;}           4 cost=(4,6)  "%[ind]"
 EXTERNAL1 =    {STRING ind;}           4 cost=(4,6)  "%[ind]"
 EXTERNAL2 =    {STRING ind;}           4 cost=(4,6)  "%[ind]"
@@ -188,7 +187,9 @@ source4 =   REG + regdef4 + displ4 + displdef4 + LocaLBase +
 #ifdef REGVARS
                + RREG + reginc4 + regdec4
 #endif REGVARS
-noaddr4 =      source4 - REG - displ4 - EXTERNAL4
+dups4 =                CONST + regdef1 + displ1 + LOCAL1 +
+               REG +   regdef2 + displ2 + LOCAL2 +
+               RREG +  regdef4 + displ4 + LOCAL4 + DOUBLE
 source8 =      QREG + regdef8 + displ8 + displdef8 +
                EXTERNAL8 + reldef8 + CONST8 + LOCAL8
                + extind8 + displind8 + extdefind8 + displdefind8
@@ -198,7 +199,6 @@ source8 =   QREG + regdef8 + displ8 + displdef8 +
 source1or2 =   source1 + source2
 source1or2or4 = source1or2 + source4
 source2or4 =   source2 + source4
-registers =    QREG + REG
 nonexist1 =    adispl + ADDR_EXTERNAL + ADDR_LOCAL
 aextind =      aextind2 + aextind4 + aextind8
 adisplind =    adisplind1 + adisplind2 + adisplind4 + adisplind8
@@ -217,8 +217,8 @@ regch4 =    reginc1 + regdec1 + reginc2 + regdec2 + reginc4 + regdec4
 regch8 =       reginc8 + regdec8
 regch =                regch4 + regch8
 #endif REGVARS
-displs =       displ1 + displ2 + displ4 + displ8
-               regdef1 + regdef2 + regdef4 + regdef8
+displs =       displ1 + displ2 + displ4 + displ8 +
+               regdef1 + regdef2 + regdef4 + regdef8
 #ifdef REGVARS
                + regch
 #endif REGVARS
@@ -235,19 +235,19 @@ displaced =       displs + displdefs + reldefs
 externals =    EXTERNALS + displaced + extinds
 extandloc =    externals + LOCALS
 #ifdef REGVARS
-reg4 =         REG + RREG
+reg4 =         REG + RREG + LocaLBase
 reg8 =         QREG
 #else REGVARS
 reg4 =         REG
 reg8 =         QREG
 #endif REGVARS
 sreg4 =        REG * SCRATCH
-nosreg4 =      source4 - sreg4
 sreg8 =        QREG * SCRATCH
-nosreg8 =      source8 - sreg8
 bigsource4 =   source1or2or4 + nonexist
 bigsource8 =   source8 + FCONST8
 all =          bigsource4 + bigsource8
+scr =          ALL - (EXTERNALS + LOCALS + ADDR_LOCAL + ADDR_EXTERNAL + CONST
+                       + DOUBLE)
 #ifdef REGVARS
 #define REMEXTANDLOC remove(externals) remove(LOCALS,inreg(%[num])==0)
 #define REMREG(x) remove(regch,%[reg]==regvar(x))
@@ -261,111 +261,105 @@ CODE:
  * Group 1 : Load instructions * 
  ********************************/
 
-loc $1>=0 && $1<256    | |     | {CONST1, $1}                          | |
-loc $1>=256 && $1<65536        | |     | {CONST2, $1}                          | |
-loc            | |             | {CONST4, $1}                          | |
-loc loc $1==0 && $2==0 | |     | {FCONST8, 0}                          | |
+loc $1>=0 && $1<256    | |     | {CONST1,$1}                           | |
+loc $1>=256 && $1<65536        | |     | {CONST2,$1}                           | |
+loc            | |             | {CONST4,$1}                           | |
+loc loc $1==0 && $2==0 | |     | {FCONST8,0}                           | |
 ldc            | |             | {CONST8,$1}                           | |
 #ifdef REGVARS
 lol inreg($1)==2 | |           | regvar($1)                            | |
 #endif REGVARS
-lol            | |             | {LOCAL4, $1, 4}                       | |
-loe            | |             | {EXTERNAL4, $1}                       | |
+lol $1 < 0     | |             | {LOCAL4,LB,$1,4}                      | |
+lol $1 >= 0    | |             | {LOCAL4,AP,$1,4}                      | |
+loe            | |             | {EXTERNAL4,$1}                        | |
 #ifdef REGVARS
 lil inreg($1)==2 | |   REMREG($1)      | {regdef4,regvar($1)}          | |
 #endif REGVARS
-lil            | |             | {displdef4,LB, tostring($1)}          | |
+lil $1 < 0     | |             | {displdef4,LB,tostring($1)}           | |
+lil $1 >= 0    | |             | {displdef4,AP,tostring($1)}           | |
 lof            | |             |                       | adp $1 loi 4  |
-lal            | |             | {ADDR_LOCAL, $1}                      | |
-lae            | |             | {ADDR_EXTERNAL, $1}                   | |
+lal $1 < 0     | |             | {ADDR_LOCAL,LB,$1}                    | |
+lal $1 >= 0    | |             | {ADDR_LOCAL,AP,$1}                    | |
+lae            | |             | {ADDR_EXTERNAL,$1}                    | |
 lxl $1==0      | |             | LB                                    | |
-lxl $1>0       | |     remove(ALL)
+lxl $1==1      | |             | {LOCAL4,AP,BSIZE,4}                   | |
+lxl $1 > 1     | |     remove(scr)
                        move({CONST4,$1},R0)
                        "jsb\t.lxl"
                        erase(R0)                               | R0    | |
-lxa            | |     remove(ALL)
+lxa $1==0      | |             | {ADDR_LOCAL,AP,BSIZE}                 | |
+lxa $1==1      | |             | {LOCAL4,AP,BSIZE,4}                   | lpb |
+lxa $1 > 1     | |     remove(scr)
                        move({CONST4,$1},R0)
                        "jsb\t.lxa"
                        erase(R0)                               | R0    | |
-loi $1==1      | NC adispl |
-                               | {displ1,%[1.reg],%[1.ind]}            | |
-...            | reg4 |        | {regdef1,%[1]}                        | |
-...            | NC ADDR_LOCAL | | {LOCAL1, %[1.num],1}        | |
-...            | displ4 |
-                               | {displdef1,%[1.reg],%[1.ind]}         | |
-...            | NC LOCAL4 |
-                               | {displdef1, LB, tostring(%[1.num])}   | |
-...            | NC ADDR_EXTERNAL |
-                               | {EXTERNAL1,%[1.ind]}                  | |
-...            | NC EXTERNAL4 |
-                               | {reldef1,%[1.ind]}                    | |
+loi $1==1      | NC adispl |   | {displ1,%[1.reg],%[1.ind]}            | |
+...            | NC ADDR_LOCAL | | {LOCAL1,%[1.reg],%[1.num],1}        | |
+...            | NC LOCAL4 |   | {displdef1,%[1.reg],tostring(%[1.num])} | |
+...            | NC regdef4 |  | {displdef1,%[1.reg],"0"}              | |
+...            | NC displ4 |   | {displdef1,%[1.reg],%[1.ind]}         | |
+...            | NC ADDR_EXTERNAL | | {EXTERNAL1,%[1.ind]}             | |
+...            | NC EXTERNAL4 | | {reldef1,%[1.ind]}                   | |
 ...            | NC adisplind1 |
                        | {displind1,%[1.ireg],%[1.reg],%[1.ind]}       | |
 ...            | NC aextdefind1 |
                                | {extdefind1,%[1.ireg],%[1.ind]}       | |
 ...            | NC adispldefind1 |
                        | {displdefind1,%[1.ireg],%[1.reg],%[1.ind]}    | |
-loi $1==2      | NC adispl |
-                               | {displ2,%[1.reg],%[1.ind]}            | |
-...            | reg4 |        | {regdef2,%[1]}                        | |
-...            | NC ADDR_LOCAL | | {LOCAL2, %[1.num],2}        | |
-...            | displ4 |
-                               | {displdef2,%[1.reg],%[1.ind]}         | |
-...            | NC ADDR_EXTERNAL |
-                               | {EXTERNAL2,%[1.ind]}                  | |
-...            | NC EXTERNAL4 |
-                               | {reldef2,%[1.ind]}                    | |
-...            | NC aextind2 |
-                               | {extind2,%[1.ireg],%[1.ind]}          | |
+...            | reg4 |        | {regdef1,%[1]}                        | |
+loi $1==2      | NC adispl |   | {displ2,%[1.reg],%[1.ind]}            | |
+...            | NC ADDR_LOCAL | | {LOCAL2,%[1.reg],%[1.num],2}        | |
+...            | NC LOCAL4 |   | {displdef2,%[1.reg],tostring(%[1.num])} | |
+...            | NC regdef4 |  | {displdef2,%[1.reg],"0"}              | |
+...            | NC displ4 |   | {displdef2,%[1.reg],%[1.ind]}         | |
+...            | NC ADDR_EXTERNAL | | {EXTERNAL2,%[1.ind]}             | |
+...            | NC EXTERNAL4 | | {reldef2,%[1.ind]}                   | |
+...            | NC aextind2 | | {extind2,%[1.ireg],%[1.ind]}  | |
 ...            | NC adisplind2 |
                        | {displind2,%[1.ireg],%[1.reg],%[1.ind]}       | |
 ...            | NC aextdefind2 |
                                | {extdefind2,%[1.ireg],%[1.ind]}       | |
 ...            | NC adispldefind2 |
                        | {displdefind2,%[1.ireg],%[1.reg],%[1.ind]}    | |
-loi $1==4      | NC adispl |
-                               | {displ4,%[1.reg],%[1.ind]}            | |
-...            | reg4 |        | {regdef4,%[1]}                        | |
-...            | NC ADDR_LOCAL | | {LOCAL4, %[1.num],4}        | |
-...            | displ4 |
-                               | {displdef4,%[1.reg],%[1.ind]}         | |
-...            | NC ADDR_EXTERNAL |
-                               | {EXTERNAL4,%[1.ind]}                  | |
-...            | NC EXTERNAL4 |
-                               | {reldef4,%[1.ind]}                    | |
-...            | NC aextind4 |
-                               | {extind4,%[1.ireg],%[1.ind]}          | |
+...            | reg4 |        | {regdef2,%[1]}                        | |
+loi $1==4      | NC adispl |   | {displ4,%[1.reg],%[1.ind]}            | |
+...            | NC ADDR_LOCAL | | {LOCAL4,%[1.reg],%[1.num],4}        | |
+...            | NC LOCAL4 |   | {displdef4,%[1.reg],tostring(%[1.num])} | |
+...            | NC regdef4 |  | {displdef4,%[1.reg],"0"}              | |
+...            | NC displ4 |   | {displdef4,%[1.reg],%[1.ind]}         | |
+...            | NC ADDR_EXTERNAL | | {EXTERNAL4,%[1.ind]}             | |
+...            | NC EXTERNAL4 | | {reldef4,%[1.ind]}                   | |
+...            | NC aextind4 | | {extind4,%[1.ireg],%[1.ind]}          | |
 ...            | NC adisplind4 |
                        | {displind4,%[1.ireg],%[1.reg],%[1.ind]}       | |
 ...            | NC aextdefind4 |
                                | {extdefind4,%[1.ireg],%[1.ind]}       | |
 ...            | NC adispldefind4 |
                        | {displdefind4,%[1.ireg],%[1.reg],%[1.ind]}    | |
-loi $1==8      | NC adispl |
-                               | {displ8,%[1.reg],%[1.ind]}            | |
-...            | reg4 |        | {regdef8,%[1]}                        | |
-...            | NC ADDR_LOCAL | | {LOCAL8, %[1.num],8}        | |
-...            | displ4 |
-                               | {displdef8,%[1.reg],%[1.ind]}         | |
-...            | NC ADDR_EXTERNAL |
-                               | {EXTERNAL8,%[1.ind]}                  | |
-...            | NC EXTERNAL4 |
-                               | {reldef8,%[1.ind]}                    | |
-...            | NC aextind8 |
-                               | {extind8,%[1.ireg],%[1.ind]}          | |
+...            | reg4 |        | {regdef4,%[1]}                        | |
+loi $1==8      | NC adispl |   | {displ8,%[1.reg],%[1.ind]}            | |
+...            | NC ADDR_LOCAL | | {LOCAL8,%[1.reg],%[1.num],8}        | |
+...            | NC LOCAL4 |   | {displdef8,%[1.reg],tostring(%[1.num])} | |
+...            | NC regdef4 |  | {displdef8,%[1.reg],"0"}              | |
+...            | NC displ4 |   | {displdef8,%[1.reg],%[1.ind]} | |
+...            | NC ADDR_EXTERNAL | | {EXTERNAL8,%[1.ind]}             | |
+...            | NC EXTERNAL4 | | {reldef8,%[1.ind]}                   | |
+...            | NC aextind8 | | {extind8,%[1.ireg],%[1.ind]}          | |
 ...            | NC adisplind8 |
                        | {displind8,%[1.ireg],%[1.reg],%[1.ind]}       | |
 ...            | NC aextdefind8 |           
                                | {extdefind8,%[1.ireg],%[1.ind]}       | |
 ...            | NC adispldefind8 |    
                        | {displdefind8,%[1.ireg],%[1.reg],%[1.ind]}    | |
+...            | reg4 |        | {regdef8,%[1]}                        | |
 loi $1>8 && $1<=16
-               | reg4 | | {displ8,%[1],tostring($1-8)} %[1]    | loi $1-8 |
 ...            | NC ADDR_EXTERNAL |    
                                | {EXTERNAL8,%[1.ind]+"+"+tostring($1-8)}
                                %[1]                            | loi $1-8 |
 ...            | NC ADDR_LOCAL |
-                               | {LOCAL8,%[1.num]+$1-8,8} %[1] | loi $1-8 |    
+                               | {LOCAL8,%[1.reg],%[1.num]+$1-8,8} %[1]
+                                                               | loi $1-8 |    
+               | reg4 | | {displ8,%[1],tostring($1-8)} %[1]    | loi $1-8 |
 loi            | sreg4 |
                        remove(ALL)
                        allocate(REG={CONST4,$1/4})
@@ -378,7 +372,7 @@ loi         | sreg4 |
                        "sobgtr\t%[a],.-3"
 #endif
                        erase(%[a])                             |       | |
-los $1==4      | |     remove(ALL)
+los $1==4      | STACK |
                        move({CONST1,4},R0)
                        "jsb\t.los"
                        erase(R0)                               |       | |
@@ -387,10 +381,11 @@ los !defined($1) | source1or2or4 |
                        move(%[1],R0)
                        "jsb\t.los"
                        erase(R0)                               |       | |
-ldl            | |             | {LOCAL8, $1, 8}                       | |
-lde            | |             | {EXTERNAL8, $1}                       | |
+ldl $1<0       | |             | {LOCAL8,LB,$1,8}                      | |
+ldl $1>=0      | |             | {LOCAL8,AP,$1,8}                      | |
+lde            | |             | {EXTERNAL8,$1}                        | |
 ldf            | |             |               | adp $1 loi 8  |
-lpi            | |             | {ADDR_EXTERNAL, $1}                   | |
+lpi            | |             | {ADDR_EXTERNAL,$1}                    | |
 
 /********************************
  * Group 2 : Store instructions *
@@ -400,35 +395,46 @@ lpi               | |             | {ADDR_EXTERNAL, $1}                   | |
 stl inreg($1)==2 | NC bigsource4 |
                        remove(regvar($1))
                        move(%[1],regvar($1))           |       | |
-...            | |     remove(ALL)
+...            | STACK |
                        "movl\t(sp)+,%(regvar($1)%)"    |       | | (3,7)
 #endif REGVARS
-stl            | NC bigsource4 |
+stl $1 < 0     | NC bigsource4 |
                        remove(displaced)
-                       remove(LOCALS, %[num] <= $1+3 && %[num]+%[size] > $1)
-                       move(%[1], {LOCAL4,$1, 4})              |       | |
-...            | |     remove(ALL)
+                       remove(LOCALS,%[num] <= $1+3 && %[num]+%[size] > $1)
+                       move(%[1],{LOCAL4,LB,$1,4})             |       | |
+...            | STACK |
                        "movl\t(sp)+,$1(fp)"            |       | | (5,14)
+stl $1 >= 0    | NC bigsource4 |
+                       remove(displaced)
+                       remove(LOCALS,%[num] <= $1+3 && %[num]+%[size] > $1)
+                       move(%[1],{LOCAL4,AP,$1,4})             |       | |
+...            | STACK |
+                       "movl\t(sp)+,$1(ap)"            |       | | (5,14)
 ste            | NC bigsource4 |
                        remove(externals)
-                       move(%[1],{EXTERNAL4, $1})              |       | |
-...            | |     remove(ALL)
+                       move(%[1],{EXTERNAL4,$1})               |       | |
+...            | STACK |
                        "movl\t(sp)+,$1"                |       | | (7,14)
 #ifdef REGVARS
 sil inreg($1)==2 | NC bigsource4 |
                        REMEXTANDLOC
                        move(%[1],{regdef4,regvar($1)}) |       | |
-...            | |     remove(ALL)
+...            | STACK |
                        "movl\t(sp)+,(%(regvar($1)%))"  |       | | (3,10)
 #endif REGVARS
-sil            | NC bigsource4 |
+sil $1 < 0     | NC bigsource4 |
                        REMEXTANDLOC
-                       move(%[1],{displdef4,LB, tostring($1)}) |       | |
-...            | |     remove(ALL)
+                       move(%[1],{displdef4,LB,tostring($1)})  |       | |
+...            | STACK |
                        "movl\t(sp)+,*$1(fp)"           |       | | (5,17)
+sil $1 >= 0    | NC bigsource4 |
+                       REMEXTANDLOC
+                       move(%[1],{displdef4,AP,tostring($1)})  |       | |
+...            | STACK |
+                       "movl\t(sp)+,*$1(ap)"           |       | | (5,17)
 stf            | |                             | | adp $1 sti 4 |
 /*** C-problem: f(c) char c; {
-                       write(1, &c, 1);
+                       write(1,&c,1);
                }
                You don't know where the character is put in the word,
                so the CEM-compiler generates: (shorts analogously)
@@ -442,13 +448,8 @@ sti $1==1  | NC adispl source1or2or4 |
                        remove(displaced)
                        remove(LOCALS,
                                %[num]<=%[1.num] && %[num]+%[size]>%[1.num])
-                       move(%[2],{LOCAL1,%[1.num],1})          |       | |
-...            | NC ADDR_LOCAL STACK |
-                       "cvtlb\t(sp)+,%[1]"             |       | | (3,7)+%[1]
-...            | reg4 source1or2or4 |
-                       REMEXTANDLOC
-                       move(%[2],{regdef1,%[1]})               |       | |
-...            | displ4 source1or2or4 |
+                       move(%[2],{LOCAL1,%[1.reg],%[1.num],1}) |       | |
+...            | NC displ4 source1or2or4 |
                        REMEXTANDLOC
                        move(%[2],{displdef1,%[1.reg],%[1.ind]}) |      | |
 ...            | NC ADDR_EXTERNAL source1or2or4 |
@@ -468,18 +469,20 @@ sti $1==1 | NC adispl source1or2or4 |
                        REMEXTANDLOC
                        move(%[2],{displdefind1,%[1.ireg],%[1.reg],%[1.ind]})
                                                                |       | |
+...            | reg4 source1or2or4 |
+                       REMEXTANDLOC
+                       move(%[2],{regdef1,%[1]})               |       | |
+...            | NC nonexist1+aind1 STACK |
+                       "cvtlb\t(sp)+,%[1]"             |       | | (3,7)+%[1]
 sti $1==2      | NC adispl source1or2or4 |
                        REMEXTANDLOC
                        move(%[2],{displ2,%[1.reg],%[1.ind]}) | | |
-...            | reg4 source1or2or4 |
-                       REMEXTANDLOC
-                       move(%[2],{regdef2,%[1]})               |       | |
 ...            | NC ADDR_LOCAL source1or2or4 |
                        remove(displaced)
                        remove(LOCALS,
                                %[num]<=%[1.num] && %[num]+%[size]>%[1.num])
-                       move(%[2],{LOCAL2,%[1.num],2})          |       | |
-...            | displ4 source1or2or4 |
+                       move(%[2],{LOCAL2,%[1.reg],%[1.num],2}) |       | |
+...            | NC displ4 source1or2or4 |
                        REMEXTANDLOC
                        move(%[2],{displdef2,%[1.reg],%[1.ind]}) |      | |
 ...            | NC ADDR_EXTERNAL source1or2or4 |
@@ -501,18 +504,21 @@ sti $1==2 | NC adispl source1or2or4 |
                        REMEXTANDLOC
                        move(%[2],{displdefind2,%[1.ireg],%[1.reg],%[1.ind]})
                                                                |       | |
+...            | reg4 source1or2or4 |
+                       REMEXTANDLOC
+                       move(%[2],{regdef2,%[1]})               |       | |
 sti $1==4      | NC adispl bigsource4 |
                        REMEXTANDLOC
                        move(%[2],{displ4,%[1.reg],%[1.ind]}) | | |
 ...            | NC ADDR_LOCAL |               | | stl %[1.num] |
 ...            | NC ADDR_EXTERNAL |            | | ste %[1.ind] |
-...            | adispl |
-                       remove(ALL)
-                       "movl\t(sp)+,%[1]"              |       | | (3,7)+%[1]
-...            | reg4 bigsource4 |
+...            | NC LOCAL4 bigsource4 |
                        REMEXTANDLOC
-                       move(%[2],{regdef4,%[1]})               |       | |
-...            | displ4 bigsource4 |
+                       move(%[2],{displdef4,%[1.reg],tostring(%[1.num])} | | |
+...            | NC regdef4 bigsource4 |
+                       REMEXTANDLOC
+                       move(%[2],{displdef4,%[1.reg],"0"} |            | |
+...            | NC displ4 bigsource4 |
                        REMEXTANDLOC
                        move(%[2],{displdef4,%[1.reg],%[1.ind]}) |      | |
 ...            | NC EXTERNAL4 bigsource4 |
@@ -531,17 +537,27 @@ sti $1==4 | NC adispl bigsource4 |
                        REMEXTANDLOC
                        move(%[2],{displdefind4,%[1.ireg],%[1.reg],%[1.ind]})
                                                                |       | |
+...            | NC nonexist1+aind4 STACK |
+                       "movl\t(sp)+,%[1]"              |       | | (3,7)+%[1]
+...            | reg4 bigsource4 |
+                       REMEXTANDLOC
+                       move(%[2],{regdef4,%[1]})               |       | |
+...            | reg4 STACK |
+                       "movl\t(sp)+,(%[1])"            |       | | (3,10)
 sti $1==8      | NC adispl bigsource8 |
                        REMEXTANDLOC
                        move(%[2],{displ8,%[1.reg],%[1.ind]}) | | |
 ...            | NC ADDR_LOCAL |               | | sdl %[1.num] |
 ...            | NC ADDR_EXTERNAL |            | | sde %[1.ind] |
-...            | reg4 bigsource8 |
-                       REMEXTANDLOC
-                       move(%[2],{regdef8,%[1]})               |       | |
-...            | displ4 bigsource8 |
+...            | NC displ4 bigsource8 |
                        REMEXTANDLOC
                        move(%[2],{displdef8,%[1.reg],%[1.ind]}) |      | |
+...            | NC LOCAL4 bigsource8 |
+                       REMEXTANDLOC
+                       move(%[2],{displdef8,%[1.reg],tostring(%[1.num])} | | |
+...            | NC regdef4 bigsource8 |
+                       REMEXTANDLOC
+                       move(%[2],{displdef8,%[1.reg],"0"} |            | |
 ...            | NC EXTERNAL4 bigsource8 |
                        REMEXTANDLOC
                        move(%[2],{reldef8,%[1.ind]})           |       | |
@@ -558,9 +574,12 @@ sti $1==8  | NC adispl bigsource8 |
                        REMEXTANDLOC
                        move(%[2],{displdefind8,%[1.ireg],%[1.reg],%[1.ind]})
                                                                |       | |
+...            | reg4 bigsource8 |
+                       REMEXTANDLOC
+                       move(%[2],{regdef8,%[1]})               |       | |
 sti            | sreg4 |
                        remove(ALL)
-                       allocate(REG={CONST4, $1/4})
+                       allocate(REG={CONST4,$1/4})
 #ifdef LOCLABS
                        "1:\nmovl\t(sp)+,(%[1])+"
                        "sobgtr\t%[a],1b"
@@ -578,25 +597,36 @@ sts !defined($1) | source4 |
                        move(%[1],R0)
                        "jsb\t.sts"
                        erase(R0)                               |       | |
-sdl            | NC bigsource8 |
+sdl $1 < 0     | NC bigsource8 |
                        remove(displaced)
-                       remove(LOCALS, %[num]<=$1+7 && %[num]+%[size]>$1)
-                       move(%[1],{LOCAL8,$1, 8})               |       | |
+                       remove(LOCALS,%[num]<=$1+7 && %[num]+%[size]>$1)
+                       move(%[1],{LOCAL8,LB,$1,8})             |       | |
 ...            | NC bigsource4 bigsource4 |
                        remove(displaced)
-                       remove(LOCALS, %[num]<=$1+7 && %[num]+%[size]>$1)
-                       move(%[1], {LOCAL4,$1,4})
-                       move(%[2], {LOCAL4,$1+4,4})             |       | |
-...            | |     remove(ALL)
+                       remove(LOCALS,%[num]<=$1+7 && %[num]+%[size]>$1)
+                       move(%[1],{LOCAL4,LB,$1,4})
+                       move(%[2],{LOCAL4,LB,$1+4,4})           |       | |
+...            | STACK |
                        "movq\t(sp)+,$1(fp)"            |       | | (5,14)
+sdl $1 >= 0    | NC bigsource8 |
+                       remove(displaced)
+                       remove(LOCALS,%[num]<=$1+7 && %[num]+%[size]>$1)
+                       move(%[1],{LOCAL8,AP,$1,8})             |       | |
+...            | NC bigsource4 bigsource4 |
+                       remove(displaced)
+                       remove(LOCALS,%[num]<=$1+7 && %[num]+%[size]>$1)
+                       move(%[1],{LOCAL4,AP,$1,4})
+                       move(%[2],{LOCAL4,AP,$1+4,4})           |       | |
+...            | STACK |
+                       "movq\t(sp)+,$1(ap)"            |       | | (5,14)
 sde            | NC bigsource8 |
                        remove(externals)
-                       move(%[1], {EXTERNAL8, $1})             |       | |
+                       move(%[1],{EXTERNAL8,$1})               |       | |
 ...            | bigsource4 bigsource4 |
                        remove(externals)
-                       move(%[1], {EXTERNAL4, $1})
-                       move(%[2], {EXTERNAL4, $1+"+4"})        |       | |
-...            | |     remove(ALL)
+                       move(%[1],{EXTERNAL4,$1})
+                       move(%[2],{EXTERNAL4,$1+"+4"})  |       | |
+...            | STACK |
                        "movq\t(sp)+,$1"                |       | | (7,14)
 sdf            | |                                     | | adp $1 sti 8 |
 
@@ -612,7 +642,7 @@ adi $1==4   | source4 sreg4 |
                        "addl2\t%[2],%[1]"
                        erase(%[1])
                        setcc(%[1])             | %[1]  | | (3,4) + %[2]
-...            | NC nosreg4 nosreg4 |
+...            | source4 source4 |
                        allocate(%[1],%[2],REG)
                        "addl3\t%[1],%[2],%[a]"
                        setcc(%[a])             | %[a]  | | (4,4)+%[1]+%[2]
@@ -624,11 +654,18 @@ adi stl $1==4 && inreg($2)==2
                        erase(regvar($2))
                        setcc(regvar($2))       |       | |
 #endif REGVARS
-adi stl $1==4  | source4 source4 |
+adi stl $1==4 && $2<0
+               | source4 source4 |
                        remove(displaced)
-                       remove(LOCALS, %[num]<=$2+3 && %[num]+%[size]>$2)
+                       remove(LOCALS,%[num]<=$2+3 && %[num]+%[size]>$2)
                        "addl3\t%[1],%[2],$2(fp)"
-                       setcc({LOCAL4,$2, 4})           |       | |
+                       setcc({LOCAL4,LB,$2,4})         |       | |
+adi stl $1==4 && $2>=0
+               | source4 source4 |
+                       remove(displaced)
+                       remove(LOCALS,%[num]<=$2+3 && %[num]+%[size]>$2)
+                       "addl3\t%[1],%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4})         |       | |
 #ifdef REGVARS
 adi sil $1==4 && inreg($2)==2
                | source4 source4 |
@@ -636,10 +673,16 @@ adi sil $1==4 && inreg($2)==2
                        "addl3\t%[1],%[2],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)})     |       | |
 #endif REGVARS
-adi sil $1==4  | source4 source4 |
+adi sil $1==4 && $2<0
+               | source4 source4 |
                        REMEXTANDLOC
                        "addl3\t%[1],%[2],*$2(fp)"
                        setcc({displdef4,LB,tostring($2)})      |       | |
+adi sil $1==4 && $2>=0
+               | source4 source4 |
+                       REMEXTANDLOC
+                       "addl3\t%[1],%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})      |       | |
 adi ste $1==4  | source4 source4 |
                        remove(externals)
                        "addl3\t%[1],%[2],$2"
@@ -652,7 +695,7 @@ sbi $1==4   | source4 sreg4 |
                        "subl2\t%[1],%[2]"
                        erase(%[2])
                        setcc(%[2])             | %[2]  | | (3,4) + %[1]
-...            | NC source4 nosreg4 |
+...            | source4 source4 |
                        allocate(%[1],%[2],REG)
                        "subl3\t%[1],%[2],%[a]"
                        setcc(%[a])             | %[a]  | | (4,4)+%[1]+%[2]
@@ -664,11 +707,18 @@ sbi stl $1==4 && inreg($2)==2
                        erase(regvar($2))
                        setcc(regvar($2))       |       | |
 #endif REGVARS
-sbi stl $1==4  | source4 source4 |
+sbi stl $1==4 && $2<0
+               | source4 source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $2+3 && %[num]+%[size] > $2))
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
                        "subl3\t%[1],%[2],$2(fp)"
-                       setcc({LOCAL4,$2, 4})           |       | |
+                       setcc({LOCAL4,LB,$2,4})         |       | |
+sbi stl $1==4 && $2>=0
+               | source4 source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
+                       "subl3\t%[1],%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4})         |       | |
 #ifdef REGVARS
 sbi sil $1==4 && inreg($2)==2
                | source4 source4 |
@@ -676,10 +726,16 @@ sbi sil $1==4 && inreg($2)==2
                        "subl3\t%[1],%[2],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)})     |       | |
 #endif REGVARS
-sbi sil $1==4  | source4 source4 |
+sbi sil $1==4 && $2<0
+               | source4 source4 |
                        REMEXTANDLOC
                        "subl3\t%[1],%[2],*$2(fp)"
                        setcc({displdef4,LB,tostring($2)})      |       | |
+sbi sil $1==4 && $2>=0
+               | source4 source4 |
+                       REMEXTANDLOC
+                       "subl3\t%[1],%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})      |       | |
 sbi ste $1==4  | source4 source4 |
                        remove(externals)
                        "subl3\t%[1],%[2],$2"
@@ -696,10 +752,10 @@ mli $1==4 | source4 sreg4 |
                        "mull2\t%[2],%[1]"
                        erase(%[1])
                        setcc(%[1])             | %[1]  | | (3,16) + %[2]
-...            | NC nosreg4 nosreg4 |
+...            | source4 source4 |
                        allocate(%[1],%[2],REG)
                        "mull3\t%[1],%[2],%[a]"
-                       setcc(%[a])         | %[a]  | | (4,16)+%[1]+%[2]
+                       setcc(%[a])             | %[a]  | | (4,16)+%[1]+%[2]
 #ifdef REGVARS
 mli stl $1==4 && inreg($2)==2
                | source4 source4 |
@@ -708,11 +764,18 @@ mli stl $1==4 && inreg($2)==2
                        erase(regvar($2))
                        setcc(regvar($2))       |       | |
 #endif REGVARS
-mli stl $1==4  | source4 source4 |
+mli stl $1==4 && $2<0
+               | source4 source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $2+3 && %[num]+%[size] > $2))
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
                        "mull3\t%[1],%[2],$2(fp)"
-                       setcc({LOCAL4,$2, 4})           |       | |
+                       setcc({LOCAL4,LB,$2,4})         |       | |
+mli stl $1==4 && $2>=0
+               | source4 source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
+                       "mull3\t%[1],%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4})         |       | |
 #ifdef REGVARS
 mli sil $1==4 && inreg($2)==2
                | source4 source4 |
@@ -720,10 +783,16 @@ mli sil $1==4 && inreg($2)==2
                        "mull3\t%[1],%[2],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)})     |       | |
 #endif REGVARS
-mli sil $1==4  | source4 source4 |
+mli sil $1==4 && $2<0
+               | source4 source4 |
                        REMEXTANDLOC
                        "mull3\t%[1],%[2],*$2(fp)"
                        setcc({displdef4,LB,tostring($2)})      |       | |
+mli sil $1==4 && $2>=0
+               | source4 source4 |
+                       REMEXTANDLOC
+                       "mull3\t%[1],%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})      |       | |
 mli ste $1==4  | source4 source4 |
                        remove(externals)
                        "mull3\t%[1],%[2],$2"
@@ -736,7 +805,7 @@ dvi $1==4   | source4 sreg4 |
                        "divl2\t%[1],%[2]"
                        erase(%[2])
                        setcc(%[2])                 | %[2]  | | (3,98) + %[1]
-...            | NC source4 nosreg4 |
+...            | source4 source4 |
                        allocate(%[1],%[2],REG)
                        "divl3\t%[1],%[2],%[a]"
                        setcc(%[a])             | %[a]  | | (4,98)+%[1]+%[2]
@@ -748,11 +817,18 @@ dvi stl $1==4 && inreg($2)==2
                        erase(regvar($2))
                        setcc(regvar($2))       |       | |
 #endif REGVARS
-dvi stl $1==4  | source4 source4 |
+dvi stl $1==4 && $2<0
+               | source4 source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $2+3 && %[num]+%[size] > $2))
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
                        "divl3\t%[1],%[2],$2(fp)"
-                       setcc({LOCAL4,$2, 4})           |       | |
+                       setcc({LOCAL4,LB,$2,4})         |       | |
+dvi stl $1==4 && $2>=0
+               | source4 source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
+                       "divl3\t%[1],%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4})         |       | |
 #ifdef REGVARS
 dvi sil $1==4 && inreg($2)==2
                | source4 source4 |
@@ -760,10 +836,16 @@ dvi sil $1==4 && inreg($2)==2
                        "divl3\t%[1],%[2],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)})     |       | |
 #endif REGVARS
-dvi sil $1==4  | source4 source4 |
+dvi sil $1==4 && $2<0
+               | source4 source4 |
                        REMEXTANDLOC
                        "divl3\t%[1],%[2],*$2(fp)"
                        setcc({displdef4,LB,tostring($2)})      |       | |
+dvi sil $1==4 && $2>=0
+               | source4 source4 |
+                       REMEXTANDLOC
+                       "divl3\t%[1],%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})      |       | |
 dvi ste $1==4  | source4 source4 |
                        remove(externals)
                        "divl3\t%[1],%[2],$2"
@@ -789,14 +871,24 @@ rmi stl $1==4 && inreg($2)==2
                        erase(regvar($2))
                        setcc(regvar($2))               |       | |
 #endif REGVARS
-rmi stl $1==4  | source4 source4 |
+rmi stl $1==4 && $2<0
+               | source4 source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num]<=$2+3 && %[num]+%[size]>$2))
+                       remove(LOCALS,(%[num]<=$2+3 && %[num]+%[size]>$2))
                        allocate(REG)
                        "divl3\t%[1],%[2],%[a]"
                        "mull2\t%[1],%[a]"
                        "subl3\t%[a],%[2],$2(fp)"
-                       setcc({LOCAL4, $2, 4})          |       | |
+                       setcc({LOCAL4,LB,$2,4})         |       | |
+rmi stl $1==4 && $2>=0
+               | source4 source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num]<=$2+3 && %[num]+%[size]>$2))
+                       allocate(REG)
+                       "divl3\t%[1],%[2],%[a]"
+                       "mull2\t%[1],%[a]"
+                       "subl3\t%[a],%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4})         |       | |
 #ifdef REGVARS
 rmi sil $1==4 && inreg($2)==2
                | source4 source4 |
@@ -807,20 +899,29 @@ rmi sil $1==4 && inreg($2)==2
                        "subl3\t%[a],%[2],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)})     |       | |
 #endif REGVARS
-rmi sil $1==4  | source4 source4 |
+rmi sil $1==4 && $2<0
+               | source4 source4 |
                        REMEXTANDLOC
                        allocate(REG)
                        "divl3\t%[1],%[2],%[a]"
                        "mull2\t%[1],%[a]"
                        "subl3\t%[a],%[2],*$2(fp)"
-                       setcc({displdef4, LB, tostring($2)})    |       | |
+                       setcc({displdef4,LB,tostring($2)})      |       | |
+rmi sil $1==4 && $2>=0
+               | source4 source4 |
+                       REMEXTANDLOC
+                       allocate(REG)
+                       "divl3\t%[1],%[2],%[a]"
+                       "mull2\t%[1],%[a]"
+                       "subl3\t%[a],%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})      |       | |
 rmi ste $1==4  | source4 source4 |
                        remove(externals)
                        allocate(REG)
                        "divl3\t%[1],%[2],%[a]"
                        "mull2\t%[1],%[a]"
                        "subl3\t%[a],%[2],$2"
-                       setcc({EXTERNAL4, $2})                  |       | |
+                       setcc({EXTERNAL4,$2})                   |       | |
 rmi !defined($1) | source4 |
                        remove(ALL)
                        move(%[1],R0)
@@ -838,11 +939,18 @@ ngi stl $1==4 && inreg($2)==2
                        erase(regvar($2))
                        setcc(regvar($2))               |       | |
 #endif REGVARS
-ngi stl $1==4  | source4 |
+ngi stl $1==4 && $2<0
+               | source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $2+3 && %[num]+%[size] > $2))
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
                        "mnegl\t%[1],$2(fp)"
-                       setcc({LOCAL4,$2, 4})           |       | |
+                       setcc({LOCAL4,LB,$2,4})         |       | |
+ngi stl $1==4 && $2>=0
+               | source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
+                       "mnegl\t%[1],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4})         |       | |
 #ifdef REGVARS
 ngi sil $1==4 && inreg($2)==2
                | source4 |
@@ -850,10 +958,16 @@ ngi sil $1==4 && inreg($2)==2
                        "mnegl\t%[1],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)})     |       | |
 #endif REGVARS
-ngi sil $1==4  | source4 |
+ngi sil $1==4 && $2<0
+               | source4 |
                        REMEXTANDLOC
                        "mnegl\t%[1],*$2(fp)"
                        setcc({displdef4,LB,tostring($2)})      |       | |
+ngi sil $1==4 && $2>=0
+               | source4 |
+                       REMEXTANDLOC
+                       "mnegl\t%[1],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})      |       | |
 ngi ste $1==4  | source4 |
                        remove(externals)
                        "mnegl\t%[1],$2"
@@ -874,11 +988,18 @@ sli stl $1==4 && inreg($2)==2
                        erase(regvar($2))
                        setcc(regvar($2))       |       | |
 #endif REGVARS
-sli stl $1==4  | source4 source4 |
+sli stl $1==4 && $2<0
+               | source4 source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $2+3 && %[num]+%[size] > $2))
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
                        "ashl\t%[1],%[2],$2(fp)"
-                       setcc({LOCAL4, $2, 4})  |       | |
+                       setcc({LOCAL4,LB,$2,4}) |       | |
+sli stl $1==4 && $2>=0
+               | source4 source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
+                       "ashl\t%[1],%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4}) |       | |
 #ifdef REGVARS
 sli sil $1==4 && inreg($2)==2
                | source4 source4 |
@@ -886,20 +1007,26 @@ sli sil $1==4 && inreg($2)==2
                        "ashl\t%[1],%[2],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)})     |       | |
 #endif REGVARS
-sli sil $1==4  | source4 source4 |
+sli sil $1==4 && $2<0
+               | source4 source4 |
                        REMEXTANDLOC
                        "ashl\t%[1],%[2],*$2(fp)"
-                       setcc({displdef4, LB, tostring($2)})    |       | |
+                       setcc({displdef4,LB,tostring($2)})      |       | |
+sli sil $1==4 && $2>=0
+               | source4 source4 |
+                       REMEXTANDLOC
+                       "ashl\t%[1],%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})      |       | |
 sli ste $1==4  | source4 source4 |
                        remove(externals)
                        "ashl\t%[1],%[2],$2"
-                       setcc({EXTERNAL4, $2})  |       | | (8,10)+%[1]+%[2]
+                       setcc({EXTERNAL4,$2})   |       | | (8,10)+%[1]+%[2]
 sli !defined($1) | source4 |
                        remove(ALL)
                        move(%[1],R0)
                        "jsb\t.sli"
                        erase(R0)                               |       | |
-sri $1==4      | source4-CONST source4 |
+sri $1==4      | source4 source4 |
                        allocate(%[1],REG)
                        "mnegl\t%[1],%[a]"
                        "ashl\t%[a],%[2],%[a]"
@@ -910,66 +1037,94 @@ sri $1==4        | source4-CONST source4 |
                        setcc(%[a])             | %[a]  | | (4,4)+%[1]+%[2]
 #ifdef REGVARS
 sri stl $1==4 && inreg($2)==2
-               | source4-CONST source4 |
+               | source4 source4 |
                        remove(regvar($2))
-                       allocate(%[1], REG)
+                       allocate(%[1],REG)
                        "mnegl\t%[1],%[a]"
                        "ashl\t%[a],%[2],%(regvar($2)%)"
                        erase(regvar($2))
                        setcc(regvar($2))       |       | | (9,14)+%[1]+%[2]
-...            | CONST source4 |
+...            | NC CONST source4 |
                        remove(regvar($2))
                        "ashl\t$$%(0-%[1.num]%),%[2],%(regvar($2)%)"
                        erase(regvar($2))
                        setcc(regvar($2))       |       | | (6,10)+%[1]+%[2]
 #endif REGVARS
-sri stl $1==4  | source4-CONST source4 |
+sri stl $1==4 && $2<0
+               | source4 source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $2+3 && %[num]+%[size] > $2))
-                       allocate(%[1], REG)
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
+                       allocate(%[1],REG)
                        "mnegl\t%[1],%[a]"
                        "ashl\t%[a],%[2],$2(fp)"
-                       setcc({LOCAL4, $2, 4}) |        | | (9,11)+%[1]+%[2]
-...            | CONST source4 |
+                       setcc({LOCAL4,LB,$2,4}) |       | | (9,11)+%[1]+%[2]
+...            | NC CONST source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $2+3 && %[num]+%[size] > $2))
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
                        "ashl\t$$%(0-%[1.num]%),%[2],$2(fp)"
-                       setcc({LOCAL4, $2, 4}) |        | | (6,7)+%[1]+%[2]
+                       setcc({LOCAL4,LB,$2,4}) |       | | (6,7)+%[1]+%[2]
+sri stl $1==4 && $2>=0
+               | source4 source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
+                       allocate(%[1],REG)
+                       "mnegl\t%[1],%[a]"
+                       "ashl\t%[a],%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4}) |       | | (9,11)+%[1]+%[2]
+...            | NC CONST source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
+                       "ashl\t$$%(0-%[1.num]%),%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4}) |       | | (6,7)+%[1]+%[2]
 #ifdef REGVARS
 sri sil $1==4 && inreg($2)==2
-               | source4-CONST source4 |
+               | source4 source4 |
                        REMEXTANDLOC
-                       allocate(%[1], REG)
+                       allocate(%[1],REG)
                        "mnegl\t%[1],%[a]"
                        "ashl\t%[a],%[2],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)}) |   | | (9,14)+%[1]+%[2]
-...            | CONST source4 |
+...            | NC CONST source4 |
                        REMEXTANDLOC
                        "ashl\t$$%(0-%[1.num]%),%[2],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)}) |   | | (6,10)+%[1]+%[2]
 #endif REGVARS
-sri sil $1==4  | source4-CONST source4 |
+sri sil $1==4 && $2<0
+               | source4 source4 |
                        REMEXTANDLOC
-                       allocate(%[1], REG)
+                       allocate(%[1],REG)
                        "mnegl\t%[1],%[a]"
                        "ashl\t%[a],%[2],*$2(fp)"
-                       setcc({displdef4, LB, tostring($2)})
+                       setcc({displdef4,LB,tostring($2)})
                                                |       | | (9,17)+%[1]+%[2]
-...            | CONST source4 |
+...            | NC CONST source4 |
                        REMEXTANDLOC
                        "ashl\t$$%(0-%[1.num]%),%[2],*$2(fp)"
-                       setcc({displdef4, LB, tostring($2)})
+                       setcc({displdef4,LB,tostring($2)})
                                                |       | | (6,13)+%[1]+%[2]
-sri ste $1==4  | source4-CONST source4 |
+sri sil $1==4 && $2>=0
+               | source4 source4 |
+                       REMEXTANDLOC
+                       allocate(%[1],REG)
+                       "mnegl\t%[1],%[a]"
+                       "ashl\t%[a],%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})
+                                               |       | | (9,17)+%[1]+%[2]
+...            | NC CONST source4 |
+                       REMEXTANDLOC
+                       "ashl\t$$%(0-%[1.num]%),%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})
+                                               |       | | (6,13)+%[1]+%[2]
+sri ste $1==4  | source4 source4 |
                        remove(externals)
-                       allocate(%[1], REG)
+                       allocate(%[1],REG)
                        "mnegl\t%[1],%[a]"
                        "ashl\t%[a],%[2],$2"
-                       setcc({EXTERNAL4, $2})  |       | | (11,14)+%[1]+%[2]
-...            | CONST source4 |
+                       setcc({EXTERNAL4,$2})   |       | | (11,14)+%[1]+%[2]
+...            | NC CONST source4 |
                        remove(externals)
                        "ashl\t$$%(0-%[1.num]%),%[2],$2"
-                       setcc({EXTERNAL4, $2})  |       | | (8,10)+%[1]+%[2]
+                       setcc({EXTERNAL4,$2})   |       | | (8,10)+%[1]+%[2]
 sri !defined($1) | source4 |
                        remove(ALL)
                        move(%[1],R0)
@@ -983,14 +1138,14 @@ sri !defined($1) | source4 |
 adu            | |                             |       | adi $1 |
 sbu            | |                             |       | sbi $1 |
 mlu            | |                             |       | mli $1 |
-dvu $1==4      | |     remove(ALL)
+dvu $1==4      | STACK |
                        "jsb\t.dvu4"            | R0    | |
 dvu !defined($1) | source1or2or4 |
                        remove(ALL)
                        move(%[1],R0)
                        "jsb\t.dvu"
                        erase(R0)                       |       | |
-rmu $1==4      | |     remove(ALL)
+rmu $1==4      | STACK |
                        "jsb\t.rmu4"                    | R0    | |
 rmu !defined($1) | source1or2or4 |
                        remove(ALL)
@@ -998,7 +1153,7 @@ rmu !defined($1) | source1or2or4 |
                        "jsb\t.rmu"
                        erase(R0)                       |       | |
 slu            | |                                     |       | sli $1 |
-sru $1==4      | source4-CONST source4 |
+sru $1==4      | source4 source4 |
                        allocate(%[1],REG,QREG)
                        "mnegl\t%[1],%[a]"
                        move(%[2],%[b.1])
@@ -1021,7 +1176,12 @@ sru !defined($1) | source1or2or4 |
  * Group 5 : Floating point arithmetic *
  ****************************************/
 
-adf $1==4      | source4 sreg4 |
+adf $1==4      | source4 source4 |
+                       allocate(%[1],%[2],REG)
+                       "addf3\t%[1],%[2],%[a]"
+                       setcc(%[a])             | %[a]  | | (4,8)+%[1]+%[2]
+#ifdef FLOAT4
+...            | source4 sreg4 |
                        "addf2\t%[1],%[2]"
                        erase(%[2])
                        setcc(%[2])             | %[2]  | | (3,8) + %[1]
@@ -1029,26 +1189,53 @@ adf $1==4       | source4 sreg4 |
                        "addf2\t%[2],%[1]"
                        erase(%[1])
                        setcc(%[1])             | %[1]  | | (3,8) + %[2]
-...            | NC nosreg4 nosreg4 |
-                       allocate(%[1],%[2],REG)
-                       "addf3\t%[1],%[2],%[a]"
-                       setcc(%[a])             | %[a]  | | (4,8)+%[1]+%[2]
-#ifdef FLOAT4
-adf stl $1==4  | source4 source4 |
+#ifdef REGVARS
+adf stl $1==4 && inreg($2)==2
+               | source4 source4 |
+                       remove(regvar($2))
+                       "addf3\t%[1],%[2],%(regvar($2)%)"
+                       erase(regvar($2))       |       | |
+#endif REGVARS
+adf stl $1==4 && $2<0
+               | source4 source4 |
                        remove(displaced)
-                       remove(LOCALS, %[num] <= $2+3 && %[num]+%[size] > $2)
+                       remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
                        "addf3\t%[1],%[2],$2(fp)"
-                       setcc({LOCAL4,$2, 4})    |         | |
-adf sil $1==4  | source4 source4 |
+                       setcc({LOCAL4,LB,$2,4}) |          | |
+adf stl $1==4 && $2>=0
+               | source4 source4 |
+                       remove(displaced)
+                       remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
+                       "addf3\t%[1],%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4}) |          | |
+#ifdef REGVARS
+adf sil $1==4 && inreg($2)==2
+               | source4 source4 |
+                       remove(regvar($2))
+                       "addf3\t%[1],%[2],(%(regvar($2)%))"
+                       setcc(regvar($2))       |       | |
+#endif REGVARS
+adf sil $1==4 && $2<0
+               | source4 source4 |
                        REMEXTANDLOC
                        "addf3\t%[1],%[2],*$2(fp)"
                        setcc({displdef4,LB,tostring($2)})      |       | |
+adf sil $1==4 && $2>=0
+               | source4 source4 |
+                       REMEXTANDLOC
+                       "addf3\t%[1],%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})      |       | |
 adf ste $1==4  | source4 source4 |
                        remove(externals)
                        "addf3\t%[1],%[2],$2"
                        setcc({EXTERNAL4,$2})   |       | |
-#endif
-adf $1==8      | source8 sreg8 |
+#endif FLOAT4
+adf $1==8      | source8 source8 |
+                       allocate(%[1],%[2],QREG)
+                       "addd3\t%[1],%[2],%[a]"
+                       setcc(%[a])             | %[a]  | | (4,14)+%[1]+%[2]
+#ifdef FLOAT8
+...            | source8 sreg8 |
                        "addd2\t%[1],%[2]"
                        erase(%[2])
                        setcc(%[2])             | %[2]  | | (3,14) + %[1]
@@ -1056,68 +1243,114 @@ adf $1==8      | source8 sreg8 |
                        "addd2\t%[2],%[1]"
                        erase(%[1])
                        setcc(%[1])             | %[1]  | | (3,14) + %[2]
-...            | NC nosreg8 source8-sreg8 |
-                       allocate(%[1],%[2],QREG)
-                       "addd3\t%[1],%[2],%[a]"
-                       setcc(%[a])             | %[a]  | | (4,14)+%[1]+%[2]
-adf sdl $1==8  | source8 source8 |
+adf sdl $1==8 && $2<0
+               | source8 source8 |
                        remove(displaced)
-                       remove(LOCALS, %[num] <= $2+7 && %[num]+%[size] > $2)
+                       remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
                        "addd3\t%[1],%[2],$2(fp)"
-                       setcc({LOCAL8,$2, 8})    |         | |
+                       setcc({LOCAL8,LB,$2,8})    |       | |
+adf sdl $1==8 && $2>=0
+               | source8 source8 |
+                       remove(displaced)
+                       remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
+                       "addd3\t%[1],%[2],$2(ap)"
+                       setcc({LOCAL8,AP,$2,8})    |       | |
 adf sde $1==8  | source8 source8 |
                        remove(externals)
                        "addd3\t%[1],%[2],$2"
                        setcc({EXTERNAL8,$2})   |       | |
+#endif FLOAT8
 adf !defined($1) | source4 |
                        remove(ALL)
                        move(%[1],R0)
                        "jsb\t.adf"              |       | |
-sbf $1==4      | source4 sreg4 |
-                       "subf2\t%[1],%[2]"
-                       erase(%[2])
-                       setcc(%[2])             | %[2]  | | (3,8) + %[1]
-...            | NC source4 nosreg4 |
+sbf $1==4      | source4 source4 |
                        allocate(%[1],%[2],REG)
                        "subf3\t%[1],%[2],%[a]"
                        setcc(%[a])             | %[a]  | | (4,8)+%[1]+%[2]
 #ifdef FLOAT4
-sbf stl $1==4  | source4 source4 |
+...            | NC source4 sreg4 |
+                       "subf2\t%[1],%[2]"
+                       erase(%[2])
+                       setcc(%[2])             | %[2]  | | (3,8) + %[1]
+#ifdef REGVARS
+sbf stl $1==4 && inreg($2)==2
+               | source4 source4 |
+                       remove(regvar($2))
+                       "subf3\t%[1],%[2],%(regvar($2)%)"
+                       erase(regvar($2))
+                       setcc(regvar($2))       |       | |
+#endif REGVARS
+sbf stl $1==4 $2<0
+               | source4 source4 |
                        remove(displaced)
-                       remove(LOCALS, %[num] <= $2+3 && %[num]+%[size] > $2)
+                       remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
                        "subf3\t%[1],%[2],$2(fp)"
-                       setcc({LOCAL4,$2, 4})    |         | |
-sbf sil $1==4  | source4 source4 |
+                       setcc({LOCAL4,LB,$2,4})    |    | |
+sbf stl $1==4 && $2>=0
+               | source4 source4 |
+                       remove(displaced)
+                       remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
+                       "subf3\t%[1],%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4}) |       | |
+#ifdef REGVARS
+sbf sil $1==4 && inreg($2)==2
+               | source4 source4 |
+                       remove(regvar($2))
+                       "subf3\t%[1],%[2],(%(regvar($2)%))"
+                       setcc(regvar($2))       |       | |
+#endif REGVARS
+sbf sil $1==4 && $2<0
+               | source4 source4 |
                        REMEXTANDLOC
                        "subf3\t%[1],%[2],*$2(fp)"
                        setcc({displdef4,LB,tostring($2)})      |       | |
+sbf sil $1==4 && $2>=0
+               | source4 source4 |
+                       REMEXTANDLOC
+                       "subf3\t%[1],%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})      |       | |
 sbf ste $1==4  | source4 source4 |
                        remove(externals)
                        "subf3\t%[1],%[2],$2"
                        setcc({EXTERNAL4,$2})   |       | |
-#endif
-sbf $1==8      | source8 sreg8 |
-                       "subd2\t%[1],%[2]"
-                       erase(%[2])
-                       setcc(%[2])             | %[2]  | | (3,14) + %[1]
-...            | NC source8 nosreg8 |
+#endif FLOAT4
+sbf $1==8      | source8 source8 |
                        allocate(%[1],%[2],QREG)
                        "subd3\t%[1],%[2],%[a]"
                        setcc(%[a])             | %[a]  | | (4,14)+%[1]+%[2]
-sbf sdl $1==8  | source8 source8 |
+#ifdef FLOAT8
+...            | source8 sreg8 |
+                       "subd2\t%[1],%[2]"
+                       erase(%[2])
+                       setcc(%[2])             | %[2]  | | (3,14) + %[1]
+sbf sdl $1==8 && $2<0
+               | source8 source8 |
                        remove(displaced)
-                       remove(LOCALS, %[num] <= $2+7 && %[num]+%[size] > $2)
+                       remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
                        "subd3\t%[1],%[2],$2(fp)"
-                       setcc({LOCAL8,$2, 8})    |         | |
+                       setcc({LOCAL8,LB,$2,8})    |       | |
+sbf sdl $1==8 && $2>=0
+               | source8 source8 |
+                       remove(displaced)
+                       remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
+                       "subd3\t%[1],%[2],$2(ap)"
+                       setcc({LOCAL8,AP,$2,8})    |       | |
 sbf sde $1==8  | source8 source8 |
                        remove(externals)
                        "subd3\t%[1],%[2],$2"
                        setcc({EXTERNAL8,$2})   |       | |
+#endif FLOAT8
 sbf !defined($1) | source1or2or4 |
                        remove(ALL)
                        move(%[1],R0)
                        "jsb\t.sbf"              |       | |
-mlf $1==4      | source4 sreg4 |
+mlf $1==4      | source4 source4 |
+                       allocate(%[1],%[2],REG)
+                       "mulf3\t%[1],%[2],%[a]"
+                       setcc(%[a])             | %[a]  | | (4,12)+%[1]+%[2]
+#ifdef FLOAT4
+...            | source4 sreg4 |
                        "mulf2\t%[1],%[2]"
                        erase(%[2])
                        setcc(%[2])             | %[2]  | | (3,12) + %[1]
@@ -1125,26 +1358,53 @@ mlf $1==4       | source4 sreg4 |
                        "mulf2\t%[2],%[1]"
                        erase(%[1])
                        setcc(%[1])             | %[1]  | | (3,12) + %[2]
-...            | NC nosreg4 nosreg4 |
-                       allocate(%[1],%[2],REG)
-                       "mulf3\t%[1],%[2],%[a]"
-                       setcc(%[a])             | %[a]  | | (4,12)+%[1]+%[2]
-#ifdef FLOAT4
-mlf stl $1==4  | source4 source4 |
+#ifdef REGVARS
+mlf stl $1==4 && inreg($2)==2
+               | source4 source4 |
+                       remove(regvar($2))
+                       "mulf3\t%[1],%[2],%(regvar($2)%)"
+                       erase(regvar($2))       |       | |
+#endif REGVARS
+mlf stl $1==4 && $2<0
+               | source4 source4 |
                        remove(displaced)
-                       remove(LOCALS, %[num] <= $2+3 && %[num]+%[size] > $2)
+                       remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
                        "mulf3\t%[1],%[2],$2(fp)"
-                       setcc({LOCAL4,$2, 4})    |         | |
-mlf sil $1==4  | source4 source4 |
+                       setcc({LOCAL4,LB,$2,4}) |          | |
+mlf stl $1==4 && $2>=0
+               | source4 source4 |
+                       remove(displaced)
+                       remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
+                       "mulf3\t%[1],%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4}) |       | |
+#ifdef REGVARS
+mlf sil $1==4 && inreg($2)==2
+               | source4 source4 |
+                       remove(regvar($2))
+                       "mulf3\t%[1],%[2],(%(regvar($2)%))"
+                       setcc(regvar($2))       |       | |
+#endif REGVARS
+mlf sil $1==4 && $2<0
+               | source4 source4 |
                        REMEXTANDLOC
                        "mulf3\t%[1],%[2],*$2(fp)"
-                       setcc({displdef4,LB,tostring($2)})    |    | |
+                       setcc({displdef4,LB,tostring($2)})      |          | |
+mlf sil $1==4 && $2>=0
+               | source4 source4 |
+                       REMEXTANDLOC
+                       "mulf3\t%[1],%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})      |          | |
 mlf ste $1==4  | source4 source4 |
                        remove(externals)
                        "mulf3\t%[1],%[2],$2"
                        setcc({EXTERNAL4,$2})   |       | |
-#endif
-mlf $1==8      | source8 sreg8 |
+#endif FLOAT4
+mlf $1==8      | source8 source8 |
+                       allocate(%[1],%[2],QREG)
+                       "muld3\t%[1],%[2],%[a]"
+                       setcc(%[a])             | %[a]  | | (4,20)+%[1]+%[2]
+#ifdef FLOAT8
+...            | source8 sreg8 |
                        "muld2\t%[1],%[2]"
                        erase(%[2])
                        setcc(%[2])             | %[2]  | | (3,20) + %[1]
@@ -1152,63 +1412,104 @@ mlf $1==8      | source8 sreg8 |
                        "muld2\t%[2],%[1]"
                        erase(%[1])
                        setcc(%[1])             | %[1]  | | (3,20) + %[2]
-...            | NC nosreg8 source8-sreg8 |
-                       allocate(%[1],%[2],QREG)
-                       "muld3\t%[1],%[2],%[a]"
-                       setcc(%[a])             | %[a]  | | (4,20)+%[1]+%[2]
-mlf sdl $1==8  | source8 source8 |
+mlf sdl $1==8 && $2<0
+               | source8 source8 |
                        remove(displaced)
-                       remove(LOCALS, %[num] <= $2+7 && %[num]+%[size] > $2)
+                       remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
                        "muld3\t%[1],%[2],$2(fp)"
-                       setcc({LOCAL8,$2, 8})    |         | |
+                       setcc({LOCAL8,LB,$2,8}) |          | |
+mlf sdl $1==8 && $2>=0
+               | source8 source8 |
+                       remove(displaced)
+                       remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
+                       "muld3\t%[1],%[2],$2(ap)"
+                       setcc({LOCAL8,AP,$2,8}) |          | |
 mlf sde $1==8  | source8 source8 |
                        remove(externals)
                        "muld3\t%[1],%[2],$2"
                        setcc({EXTERNAL8,$2})   |       | |
+#endif FLOAT8
 mlf !defined($1) | source1or2or4 |
                        remove(ALL)
                        move(%[1],R0)
                        "jsb\t.mlf"              |       | |
-dvf $1==4      | source4 sreg4 |
-                       "divf2\t%[1],%[2]"
-                       erase(%[2])
-                       setcc(%[2])             | %[2]  | | (3,46) + %[1]
-...            | NC source4 nosreg4 |
+dvf $1==4      | source4 source4 |
                        allocate(%[1],%[2],REG)
                        "divf3\t%[1],%[2],%[a]"
                        setcc(%[a])             | %[a]  | | (4,46)+%[1]+%[2]
 #ifdef FLOAT4
-dvf stl $1==4  | source4 source4 |
+...            | source4 sreg4 |
+                       "divf2\t%[1],%[2]"
+                       erase(%[2])
+                       setcc(%[2])             | %[2]  | | (3,46) + %[1]
+#ifdef REGVARS
+dvf stl $1==4 && inreg($2)==2
+               | source4 source4 |
+                       remove(regvar($2))
+                       "divf3\t%[1],%[2],%(regvar($2)%)"
+                       erase(regvar($2))
+                       setcc(regvar($2))       |       | |
+#endif REGVARS
+dvf stl $1==4 && $2<0
+               | source4 source4 |
                        remove(displaced)
-                       remove(LOCALS, %[num] <= $2+3 && %[num]+%[size] > $2)
+                       remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
                        "divf3\t%[1],%[2],$2(fp)"
-                       setcc({LOCAL4,$2, 4})    |         | |
-dvf sil $1==4  | source4 source4 |
+                       setcc({LOCAL4,LB,$2,4}) |          | |
+dvf stl $1==4 && $2>=0
+               | source4 source4 |
+                       remove(displaced)
+                       remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
+                       "divf3\t%[1],%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4}) |          | |
+#ifdef REGVARS
+dvf sil $1==4 && inreg($2)==2
+               | source4 source4 |
+                       remove(regvar($2))
+                       "divf3\t%[1],%[2],(%(regvar($2)%))"
+                       setcc(regvar($2))               |          | |
+#endif REGVARS
+dvf sil $1==4 && $2<0
+               | source4 source4 |
                        REMEXTANDLOC
                        "divf3\t%[1],%[2],*$2(fp)"
-                       setcc({displdef4,LB,tostring($2)})    |    | |
+                       setcc({displdef4,LB,tostring($2)})      |          | |
+dvf sil $1==4 &&$2>=0
+               | source4 source4 |
+                       REMEXTANDLOC
+                       "divf3\t%[1],%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})      |          | |
 dvf ste $1==4  | source4 source4 |
                        remove(externals)
                        "divf3\t%[1],%[2],$2"
                        setcc({EXTERNAL4,$2})   |       | |
-#endif
-dvf $1==8      | source8 sreg8 |
-                       "divd2\t%[1],%[2]"
-                       erase(%[2])
-                       setcc(%[2])             | %[2]  | | (3,80) + %[1]
-...            | NC source8 nosreg8 |
+#endif FLOAT4
+dvf $1==8      | source8 source8 |
                        allocate(%[1],%[2],QREG)
                        "divd3\t%[1],%[2],%[a]"
                        setcc(%[a])             | %[a]  | | (4,80)+%[1]+%[2]
-dvf sdl $1==8  | source8 source8 |
+#ifdef FLOAT8
+...            | source8 sreg8 |
+                       "divd2\t%[1],%[2]"
+                       erase(%[2])
+                       setcc(%[2])             | %[2]  | | (3,80) + %[1]
+dvf sdl $1==8 && $2<0
+               | source8 source8 |
                        remove(displaced)
-                       remove(LOCALS, %[num] <= $2+7 && %[num]+%[size] > $2)
+                       remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
                        "divd3\t%[1],%[2],$2(fp)"
-                       setcc({LOCAL8,$2, 8})    |         | |
+                       setcc({LOCAL8,LB,$2,8}) |          | |
+dvf sdl $1==8 && $2>=0
+               | source8 source8 |
+                       remove(displaced)
+                       remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
+                       "divd3\t%[1],%[2],$2(ap)"
+                       setcc({LOCAL8,AP,$2,8}) |          | |
 dvf sde $1==8  | source8 source8 |
                        remove(externals)
                        "divd3\t%[1],%[2],$2"
                        setcc({EXTERNAL8,$2})   |       | |
+#endif FLOAT8
 dvf !defined($1) | source1or2or4 |
                        remove(ALL)
                        move(%[1],R0)
@@ -1218,54 +1519,84 @@ ngf $1==4       | source4 |
                        "mnegf\t%[1],%[a]"
                        setcc(%[a])             | %[a]  | |
 #ifdef FLOAT4
-ngf stl $1==4  | source4 |
+#ifdef REGVARS
+ngf stl $1==4 && inreg($2)==2
+               | source4 |
+                       remove(regvar($2))
+                       "mnegf\t%[1],%(regvar($2)%)"
+                       erase(regvar($2))
+                       setcc(regvar($2))       |       | |
+#endif REGVARS
+ngf stl $1==4 $2<0
+               | source4 |
                        remove(displaced)
-                       remove(LOCALS, %[num] <= $2+3 && %[num]+%[size] > $2)
+                       remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
                        "mnegf\t%[1],$2(fp)"
-                       setcc({LOCAL4,$2, 4})    |         | |
-ngf sil $1==4  | source4 |
+                       setcc({LOCAL4,LB,$2,4}) |          | |
+ngf stl $1==4 && $2>=0
+               | source4 |
+                       remove(displaced)
+                       remove(LOCALS,%[num] <= $2+3 && %[num]+%[size] > $2)
+                       "mnegf\t%[1],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4}) |          | |
+#ifdef REGVARS
+ngf sil $1==4 && inreg($2)==2
+               | source4 |
+                       remove(regvar($2))
+                       "mnegf\t%[1],(%(regvar($2)%))"
+                       setcc(regvar($2))       |          | |
+#endif REGVARS
+ngf sil $1==4 && $2<0
+               | source4 |
                        REMEXTANDLOC
                        "mnegf\t%[1],*$2(fp)"
-                       setcc({displdef4,LB,tostring($2)})    |    | |
+                       setcc({displdef4,LB,tostring($2)})      |          | |
+ngf sil $1==4 && $2>=0
+               | source4 |
+                       REMEXTANDLOC
+                       "mnegf\t%[1],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})      |          | |
 ngf ste $1==4  | source4 |
                        remove(externals)
                        "mnegf\t%[1],$2"
                        setcc({EXTERNAL4,$2})   |       | |
-#endif
+#endif FLOAT4
 ngf $1==8      | source8 |
                        allocate(%[1],QREG)
                        "mnegd\t%[1],%[a]"
                        setcc(%[a])             | %[a]  | |
-ngf sdl $1==8  | source8 |
+#ifdef FLOAT8
+ngf sdl $1==8 && $2<0
+               | source8 |
                        remove(displaced)
-                       remove(LOCALS, %[num] <= $2+7 && %[num]+%[size] > $2)
+                       remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
                        "mnegd\t%[1],$2(fp)"
-                       setcc({LOCAL8,$2, 8})    |         | |
+                       setcc({LOCAL8,LB,$2,8}) |          | |
+ngf sdl $1==8 && $2>=0
+               | source8 |
+                       remove(displaced)
+                       remove(LOCALS,%[num] <= $2+7 && %[num]+%[size] > $2)
+                       "mnegd\t%[1],$2(ap)"
+                       setcc({LOCAL8,AP,$2,8}) |          | |
 ngf sde $1==8  | source8 |
                        remove(externals)
                        "mnegd\t%[1],$2"
                        setcc({EXTERNAL8,$2})   |       | |
+#endif FLOAT8
 ngf !defined($1) | source1or2or4 |
                        remove(ALL)
                        move(%[1],R0)
                        "jsb\t.ngf"              |       | |
-loc loc loc cif fif $1==1 && $2==4 && $3==4 && $5==4
-               | source4 |
-                       allocate(%[1],REG,REG)
-                       "emodf\t%[1],$$0,$$0f1.0,%[b],%[a]"
-                       /* Don't trust the integer part in %[b], *
-                        * integer overflow might occur.         */
-                       "subf3\t%[a],%[1],%[b]" | %[a] %[b]     | |
-loc loc loc cif fif $1==1 && $2==4 && $3==8 && $5==8
-               | source8 |
-                       allocate(%[1],QREG,QREG)
-                       "emodd\t%[1],$$0,$$0f1.0,%[b],%[a]"
-                       "subd3\t%[a],%[1],%[b]" | %[a] %[b]     | |
 fif $1==4      | source4 source4 |
-                       allocate(%[1],%[2],REG,REG,REG)
+                       allocate(%[1],%[2],REG,REG)
                        "mulf3\t%[1],%[2],%[a]"
-                       "emodf\t%[a],$$0,$$0f1.0,%[b],%[c]"
-                       "subf2\t%[c],%[a]"      | %[c] %[a]     | |
+                       "emodf\t%[a],$$0,$$0f1.0,-(sp),%[b]"
+                       /*
+                        * Don't trust the integer part.
+                        * Overflow could occur.
+                        */
+                       "tstl\t(sp)+"
+                       "subf2\t%[b],%[a]"      | %[b] %[a]     | |
 fif $1==8      | source8 source8 |
                        allocate(%[1],%[2],QREG,QREG)
                        "muld3\t%[1],%[2],%[a]"
@@ -1300,46 +1631,66 @@ fef !defined($1) | source1or2or4 |
  ********************************/
 
 adp $1==0      | | | | |
-adp            | NC adispl |
-                       | {adispl,%[1.reg],%[1.ind]+"+"+tostring($1)} | |
-...            | NC ADDR_EXTERNAL |
-                               | {ADDR_EXTERNAL,%[1.ind]+"+"+tostring($1)} | |
-...            | NC ADDR_LOCAL |       | {ADDR_LOCAL,%[1.num]+$1} | |
-...            | reg4 |        | {adispl,%[1],tostring($1)}              | |
+adp            | NC ADDR_EXTERNAL |
+                       | {ADDR_EXTERNAL,%[1.ind]+"+"+tostring($1)} | |
+...            | NC ADDR_LOCAL |
+                       | {ADDR_LOCAL,%[1.reg],%[1.num]+$1} | |
 ...            | NC adisplind1 |
                        | {adisplind1,%[1.ireg],%[1.reg],
                                        %[1.ind]+"+"+tostring($1)} | |
-...            | NC adisplind2 |
-                       | {adisplind2,%[1.ireg],%[1.reg],
-                                       %[1.ind]+"+"+tostring($1)} | |
-...            | NC adisplind4 |
-                       | {adisplind4,%[1.ireg],%[1.reg],
-                                       %[1.ind]+"+"+tostring($1)} | |
-...            | NC adisplind8 |
-                       | {adisplind8,%[1.ireg],%[1.reg],
-                                       %[1.ind]+"+"+tostring($1)} | |
-...            | NC aextind2 |
-                       | {aextind2,%[1.ireg],%[1.ind]+"+"+tostring($1)} | |
-...            | NC aextind4 |
-                       | {aextind4,%[1.ireg],%[1.ind]+"+"+tostring($1)} | |
-...            | NC aextind8 |
-                       | {aextind8,%[1.ireg],%[1.ind]+"+"+tostring($1)} | |
+...            | NC adispldefind1 |
+                       allocate(%[1.ireg],REG)
+                       "addl3\t$$$1,%[1.ireg],%[a]"
+                       | {adispldefind1,%[a],%[1.reg],%[1.ind]}        | |
+...            | NC aextdefind1 |
+                       allocate(%[1],REG)
+                       "addl3\t$$$1,%[1.ireg],%[a]"
+                       | {aextdefind1,%[a],%[1.ind]}   | |
+...            | NC adispl | | {adispl,%[1.reg],%[1.ind]+"+"+tostring($1)} | |
+...            | reg4 |        | {adispl,%[1],tostring($1)}              | |
+adp stl                | | | {CONST4,$1}               | adi 4 stl $2 |
+adp ste                | | | {CONST4,$1}               | adi 4 ste $2 |
+adp dup $2==4  | | | {CONST4,$1}               | adi 4 dup 4 |
+adp lol stf    | | | {CONST4,$1}               | adi 4 lol $2 stf $3 |
+adp lol sti $3==4
+               | | | {CONST4,$1}               | adi 4 lol $2 sti 4 |
+adp loe sti $3==4
+               | | | {CONST4,$1}               | adi 4 loe $2 sti 4 |
+adp cms $2==4  | | | {CONST4,$1}               | adi 4 cms 4 |
+loe lof adp loe stf $1==$4 && $2==$5
+               | |     REMEXTANDLOC
+                       allocate(REG={EXTERNAL4,$1})
+                       "addl2\t$$$3,$2(%[a])"          |       | |
+lol lof adp lol stf $1<0 && $1==$4 && inreg($1)!=2 && $2==$5
+               | |     REMEXTANDLOC
+                       allocate(REG={LOCAL4,LB,$1,4})
+                       "addl2\t$$$3,$2(%[a])"          |       | |
+lol lof adp lol stf $1>=0 && $1==$4 && inreg($1)!=2 && $2==$5
+               | |     REMEXTANDLOC
+                       allocate(REG={LOCAL4,AP,$1,4})
+                       "addl2\t$$$3,$2(%[a])"          |       | |
 ads $1==4      | NC reg4 adispl |
-                               | {adisplind1,%[1],%[2.reg],%[2.ind]}   | |
+                       | {adisplind1,%[1],%[2.reg],%[2.ind]}   | |
 ...            | NC reg4 ADDR_LOCAL |
-                               | {adisplind1,%[1],LB,tostring(%[2.num])} | |
+                       | {adisplind1,%[1],%[2.reg],tostring(%[2.num])} | |
 ...            | NC reg4 ADDR_EXTERNAL |
-                               | {adispl,%[1],%[2.ind]}        | |
+                       | {adispl,%[1],%[2.ind]}                | |
+...            | NC reg4 aextind2 |
+                       | {adisplind2,%[2.ireg],%[1],%[2.ind]}  | |
+...            | NC reg4 aextind4 |
+                       | {adisplind4,%[2.ireg],%[1],%[2.ind]}  | |
+...            | NC reg4 aextind8 |
+                       | {adisplind8,%[2.ireg],%[1],%[2.ind]}  | |
 ...            | NC reg4 displ4 |
-                               | {adispldefind1,%[1],%[2.reg],%[2.ind]} | |
+                       | {adispldefind1,%[1],%[2.reg],%[2.ind]}        | |
 ...            | NC reg4 LOCAL4 |
-                               | {adispldefind1,%[1],LB,tostring(%[2.num])} | |
+                       | {adispldefind1,%[1],%[2.reg],tostring(%[2.num])} | |
+...            | NC reg4 regdef4 |
+                       | {adispldefind1,%[1],%[2.reg],"0"}     | |
 ...            | NC reg4 EXTERNAL4 |
-                               | {aextdefind1,%[1],%[2.ind]}           | |
-...            | source4 source4 |
-                       allocate(%[1],%[2],REG)
-                       "addl3\t%[1],%[2],%[a]"
-                       setcc(%[a])             | %[a]  | | (4,4)+%[1]+%[2]
+                       | {aextdefind1,%[1],%[2.ind]}           | |
+...            | NC reg4 reg4 |        | {adisplind1,%[1],%[2],"0"}    | |
+...            | |                             | adi 4 |
 ads            | |             |               | loc $1 loc 4 cii ads 4 |
 ads !defined($1) | |           |               | loc 4 cii ads 4 |
 sbs $1==4      | |             |               | sbu $1 |
@@ -1353,6 +1704,16 @@ adp dup sil adp $1==(0-$4) && $2==4
                | reg4 | | %[1] %[1]    | adp $1 sil $3 |
 adp dup loe sti adp $1==(0-$5) && $2==4 && $4==4
                | reg4 | | %[1] %[1]    | adp $1 loe $3 sti 4 |
+dup adp lol sti $1==4 && $4==4
+               | bigsource4 |
+                       allocate(REG=%[1])
+                       | %[a] %[1] {CONST4,$2}
+                               | adi 4 lol $3 sti 4 |
+dup adp loe sti $1==4 && $4==4
+               | bigsource4 |
+                       allocate(REG=%[1])
+                       | %[a] %[1] {CONST4,$2}
+                               | adi 4 loe $3 sti 4 |
 #ifdef REGVARS
 lol lol adp stl loi $1==$4 && $2==$1 && inreg($1)==2 && $3==1 && $5==1
                | |     remove(regvar($1))
@@ -1466,21 +1827,32 @@ lol adp stl $1==$3 && inreg($1)==2
                        "addl2\t$$$2,%(regvar($1)%)"
                        erase(regvar($1))               |       | |
 #endif REGVARS
-lol adp stl $1==$3
+lol adp stl $1==$3 && $1<0
                | |     remove(displaced)
-                       remove(LOCALS, %[num] <= $1+3 && %[num]+%[size] > $1)
-                       "addl2\t$$$2,$1(fp)" 
-                       setcc({LOCAL4,$1,4})    |       | |
-lol lol adp stl $1==$4 && $2==$4
+                       remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
+                       "addl2\t$$$2,$1(ap)" 
+                       setcc({LOCAL4,LB,$1,4}) |       | |
+lol adp stl $1==$3 && $1>=0
+               | |     remove(displaced)
+                       remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
+                       "addl2\t$$$2,$1(ap)" 
+                       setcc({LOCAL4,AP,$1,4}) |       | |
+lol lol adp stl $1==$4 && $2==$4 && $2<0
                | |     remove(displaced)
-                       remove(LOCALS, %[num] <= $1+3 && %[num]+%[size] > $1)
-                       allocate(REG={LOCAL4,$1,4})
+                       remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
+                       allocate(REG={LOCAL4,LB,$1,4})
                        "addl2\t$$$3,$1(fp)"
-                       setcc({LOCAL4,$1,4})    | %[a]  | |
+                       setcc({LOCAL4,LB,$1,4}) | %[a]  | |
+lol lol adp stl $1==$4 && $2==$4
+               | |     remove(displaced)
+                       remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
+                       allocate(REG={LOCAL4,AP,$1,4})
+                       "addl2\t$$$3,$1(ap)"
+                       setcc({LOCAL4,AP,$1,4}) | %[a]  | |
 #ifdef REGVARS
 lil lil adp sil $1==$2 && $1==$4 && inreg($1)==2
                | |     REMEXTANDLOC
-                       allocate(REG={regdef4, regvar($1)})
+                       allocate(REG={regdef4,regvar($1)})
                        "addl2\t$$$3,(%(regvar($1)%))"  | %[a]  | |
 #endif
 loe adp ste $1==$3
@@ -1498,17 +1870,51 @@ loe loe adp ste $1==$4 && $2==$1
 lil inc dup sil $3==4 && $1==$4        | | | | lil $1 loc 1 adi 4 sil $1 lil $1 |
 lil dec dup sil $3==4 && $1==$4        | | | | lil $1 loc 1 sbi 4 sil $1 lil $1 |
 inc            |       |       | {CONST1,1}    | adi 4 |
+loe lof inc loe stf $1==$4 && $2==$5
+               | |     REMEXTANDLOC
+                       allocate(REG={EXTERNAL4,$1})
+                       "incl\t$2(%[a])"
+                       setcc({displ4,%[a],tostring($2)})       |       | |
+lol lof inc lol stf $1<0 && $1==$4 && inreg($1)!=2 && $2==$5
+               | |     REMEXTANDLOC
+                       allocate(REG={LOCAL4,LB,$1,4})
+                       "incl\t$2(%[a])"
+                       setcc({displ4,%[a],tostring($2)})       |       | |
+lol lof inc lol stf $1>=0 && $1==$4 && inreg($1)!=2 && $2==$5
+               | |     REMEXTANDLOC
+                       allocate(REG={LOCAL4,AP,$1,4})
+                       "incl\t$2(%[a])"
+                       setcc({displ4,%[a],tostring($2)})       |       | |
 dec            |       |       | {CONST1,1}    | sbi 4 |
+loe lof dec loe stf $1==$4 && $2==$5
+               | |     REMEXTANDLOC
+                       allocate(REG={EXTERNAL4,$1})
+                       "decl\t$2(%[a])"
+                       setcc({displ4,%[a],tostring($2)})       |       | |
+lol lof dec lol stf $1<0 && $1==$4 && inreg($1)!=2 && $2==$5
+               | |     REMEXTANDLOC
+                       allocate(REG={LOCAL4,LB,$1,4})
+                       "decl\t$2(%[a])"
+                       setcc({displ4,%[a],tostring($2)})       |       | |
+lol lof dec lol stf $1>=0 && $1==$4 && inreg($1)!=2 && $2==$5
+               | |     REMEXTANDLOC
+                       allocate(REG={LOCAL4,AP,$1,4})
+                       "decl\t$2(%[a])"
+                       setcc({displ4,%[a],tostring($2)})       |       | |
 #ifdef REGVARS
 inl inreg($1)==2 | |   remove(regvar($1))
                        "incl\t%(regvar($1)%)"
                        erase(regvar($1))
                        setcc(regvar($1))       |       | |
 #endif REGVARS
-inl            | |     remove(displaced)
-                       remove(LOCALS, %[num] <= $1+3 && %[num]+%[size] > $1)
+inl $1<0       | |     remove(displaced)
+                       remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
                        "incl\t$1(fp)"
-                       setcc({LOCAL4,$1, 4})    |         | |
+                       setcc({LOCAL4,LB,$1,4}) |       | |
+inl $1>=0      | |     remove(displaced)
+                       remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
+                       "incl\t$1(ap)"
+                       setcc({LOCAL4,AP,$1,4}) |       | |
 #ifdef REGVARS
 lol inl $1==$2 && inreg($1)==2
                | |     remove(regvar($1))
@@ -1519,17 +1925,21 @@ lol inl $1==$2 && inreg($1)==2
 #endif REGVARS
 ine            | |     remove(externals)
                        "incl\t$1"
-                       setcc({EXTERNAL4, $1})  |       | |
+                       setcc({EXTERNAL4,$1})   |       | |
 #ifdef REGVARS
 del inreg($1)==2 | |   remove(regvar($1))
                        "decl\t%(regvar($1)%)"
                        erase(regvar($1))
                        setcc(regvar($1))       |       | |
 #endif REGVARS
-del            | |     remove(displaced)
-                       remove(LOCALS, %[num] <= $1+3 && %[num]+%[size] > $1)
+del $1<0       | |     remove(displaced)
+                       remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
                        "decl\t$1(fp)"
-                       setcc({LOCAL4,$1, 4})    |         | |
+                       setcc({LOCAL4,LB,$1,4}) |       | |
+del $1>=0      | |     remove(displaced)
+                       remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
+                       "decl\t$1(ap)"
+                       setcc({LOCAL4,AP,$1,4}) |       | |
 #ifdef REGVARS
 lol del $1==$2 && inreg($1)==2
                | |     remove(regvar($1))
@@ -1540,38 +1950,50 @@ lol del $1==$2 && inreg($1)==2
 #endif REGVARS
 dee            | |     remove(externals)
                        "decl\t$1"
-                       setcc({EXTERNAL4, $1})  |       | |
+                       setcc({EXTERNAL4,$1})   |       | |
 #ifdef REGVARS
 zrl inreg($1)==2 | |   remove(regvar($1))
                        "clrl\t%(regvar($1)%)"
                        erase(regvar($1))
-                       setcc(regvar($1))       |          | |
+                       setcc(regvar($1))       |       | |
 #endif REGVARS
-zrl            | |     remove(displaced)
-                       remove(LOCALS,%[num] <= $1+3 && %[num]+%[size] > $1)
+zrl $1<0       | |     remove(displaced)
+                       remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
                        "clrl\t$1(fp)"
-                       setcc({LOCAL4,$1, 4})    |         | |
-zrl zrl $1==$2+4       
+                       setcc({LOCAL4,LB,$1,4}) |       | |
+zrl $1>=0      | |     remove(displaced)
+                       remove(LOCALS,%[num]<=$1+3 && %[num]+%[size]>$1)
+                       "clrl\t$1(ap)"
+                       setcc({LOCAL4,AP,$1,4}) |       | |
+zrl zrl $1==$2+4 && $1<0
 #ifdef REGVARS
        && inreg($1)<2 && inreg($2)<2
 #endif REGVARS
                | |     remove(displaced)
-                       remove(LOCALS, %[num] <= $2+7 && %[num]+%[size] > $2)
+                       remove(LOCALS,%[num]<=$2+7 && %[num]+%[size]>$2)
                        "clrq\t$2(fp)"
-                       setcc({LOCAL8,$2, 8})   |       | |
+                       setcc({LOCAL8,LB,$2,8}) |       | |
+zrl zrl $1==$2+4 && $1>=0
+#ifdef REGVARS
+       && inreg($1)<2 && inreg($2)<2
+#endif REGVARS
+               | |     remove(displaced)
+                       remove(LOCALS,%[num]<=$2+7 && %[num]+%[size]>$2)
+                       "clrq\t$2(ap)"
+                       setcc({LOCAL8,AP,$2,8}) |       | |
 zrl zrl $1==$2-4 | |                           |       | zrl $2 zrl $1 |
 zre            | |     remove(externals)
                        "clrl\t$1"
-                       setcc({EXTERNAL4, $1})  |       | |
+                       setcc({EXTERNAL4,$1})   |       | |
 zrf $1==4      | |             | {CONST4,0}            | |
 zrf $1==8      | |             | {FCONST8,0}           | |
 zer $1==4      | |             | {CONST4,0}                            | |
 zer $1==8      | |     allocate(QREG)
                        "clrq\t%[a]"            | %[a]  | |
-zer $1<=32     | |     remove(ALL)
+zer $1<=32     | STACK |
                        "clrq\t-(sp)"           |       | zer $1-8 |
-zer defined($1)        | |     remove(ALL)
-                       move({CONST4,$1/4}, R0)
+zer defined($1)        | STACK |
+                       move({CONST4,$1/4},R0)
 #ifdef LOCLABS
                        "1:\tclrl\t-(sp)"
                        "sobgtr\tr0,1b"
@@ -1596,22 +2018,22 @@ zer !defined($1) | source1or2or4 |
  * Group 8 : Convertions       *
  ********************************/
 
-cii            | |     remove(ALL)
+cii            | STACK |
                        "jsb\t.cii"             |       | |
-cfi            | |     remove(ALL)
+cfi            | STACK |
                        "jsb\t.cfi"             |       | |
-cfu            | |     remove(ALL)
+cfu            | STACK |
                        "jsb\t.cfu"             |       | |
-cuf            | |     remove(ALL)
+cuf            | STACK |
                        "jsb\t.cuf"             |       | |
-cif            | |     remove(ALL)
+cif            | STACK |
                        "jsb\t.cif"             |       | |
-cff            | |     remove(ALL)
+cff            | STACK |
                        "jsb\t.cff"             |       | |
-cuu            | |     remove(ALL)
+cuu            | STACK |
                        "jsb\t.cuu"             |       | |
 ciu            | |                             |       | cuu |
-cui            | |     remove(ALL)
+cui            | STACK |
                        "jsb\t.cui"             |       | |
 loc loc cii $1==1 && $2==2     | source1or2or4 |
                        allocate(%[1],REG)
@@ -1625,15 +2047,22 @@ loc loc cii stl $1==1 && $2==4 && inreg($4)==2
                        erase(regvar($1))
                        setcc(regvar($4))       |       | |
 #endif REGVARS
-loc loc cii stl $1==1 && $2==4 | source1or2or4 |
+loc loc cii stl $1==1 && $2==4 && $4<0
+               | source1or2or4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $4+3 && %[num]+%[size] > $4))
+                       remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
                        "cvtbl\t%[1],$4(fp)"
-                       setcc({LOCAL4,$4, 4})   |       | |
+                       setcc({LOCAL4,LB,$4,4}) |       | |
+loc loc cii stl $1==1 && $2==4 && $4>=0
+               | source1or2or4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
+                       "cvtbl\t%[1],$4(ap)"
+                       setcc({LOCAL4,AP,$4,4}) |       | |
 loc loc cii ste $1==1 && $2==4 | source1or2or4 |
                        remove(externals)
                        "cvtbl\t%[1],$4"
-                       setcc({EXTERNAL4, $4})  |       | |
+                       setcc({EXTERNAL4,$4})   |       | |
 loc loc cii $1==1 && $2==4     | source1or2or4 |
                        allocate(%[1],REG)
                        "cvtbl\t%[1],%[a]"
@@ -1646,15 +2075,22 @@ loc loc cii stl $1==2 && $2==4 && inreg($4)==2
                        erase(regvar($4))
                        setcc(regvar($4))       |       | |
 #endif REGVARS
-loc loc cii stl $1==2 && $2==4 | source2or4 |
+loc loc cii stl $1==2 && $2==4 && $4<0
+               | source2or4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $4+3 && %[num]+%[size] > $4))
+                       remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
                        "cvtwl\t%[1],$4(fp)"
-                       setcc({LOCAL4,$4, 4})   |       | |
+                       setcc({LOCAL4,LB,$4,4}) |       | |
+loc loc cii stl $1==2 && $2==4 && $4>=0
+               | source2or4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
+                       "cvtwl\t%[1],$4(ap)"
+                       setcc({LOCAL4,AP,$4,4}) |       | |
 loc loc cii ste $1==2 && $2==4 | source2or4 |
                        remove(externals)
                        "cvtwl\t%[1],$4"
-                       setcc({EXTERNAL4, $4})  |       | |
+                       setcc({EXTERNAL4,$4})   |       | |
 loc loc cii $1==2 && $2==4     | source2or4 |
                        allocate(%[1],REG)
                        "cvtwl\t%[1],%[a]"
@@ -1664,6 +2100,7 @@ loc loc cii $1==4 && $2==1  | | |                             | |
 loc loc cii $1==4 && $2==2  | | |                                  | |
 loc loc cui $1==$2     |       |       |       |       |
 loc loc ciu    |       |       |       | loc $1 loc $2 cuu     |
+#ifdef FLOAT4
 #ifdef REGVARS
 loc loc cfi stl $1==4 && $2==4 && inreg($4)==2
                | source4 |
@@ -1672,19 +2109,28 @@ loc loc cfi stl $1==4 && $2==4 && inreg($4)==2
                        erase(regvar($4))
                        setcc(regvar($4))       |       | |
 #endif REGVARS
-loc loc cfi stl $1==4 && $2==4 | source4 |
+loc loc cfi stl $1==4 && $2==4 && $4<0
+               | source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $4+3 && %[num]+%[size] > $4))
+                       remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
                        "cvtfl\t%[1],$4(fp)"
-                       setcc({LOCAL4,$4, 4}) | | |
+                       setcc({LOCAL4,AP,$4,4}) |       | |
+loc loc cfi stl $1==4 && $2==4 && $4>=0
+               | source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
+                       "cvtfl\t%[1],$4(ap)"
+                       setcc({LOCAL4,AP,$4,4}) |       | |
 loc loc cfi ste $1==4 && $2==4 | source4 |
                        remove(externals)
                        "cvtfl\t%[1],$4"
-                       setcc({EXTERNAL4, $4})  |       | |
+                       setcc({EXTERNAL4,$4})   |       | |
+#endif FLOAT4
 loc loc cfi $1==4 && $2==4     | source4 |
                        allocate(%[1],REG)
                        "cvtfl\t%[1],%[a]"
                        setcc(%[a])             | %[a]  | | (3,4) + %[1]
+#ifdef FLOAT8
 #ifdef REGVARS
 loc loc cfi stl $1==8 && $2==4 && inreg($4)==2
                | source8 |
@@ -1693,19 +2139,28 @@ loc loc cfi stl $1==8 && $2==4 && inreg($4)==2
                        erase(regvar($4))
                        setcc(regvar($4))       |       | |
 #endif REGVARS
-loc loc cfi stl $1==8 && $2==4 | source8 |
+loc loc cfi stl $1==8 && $2==4 && $4<0
+               | source8 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $4+3 && %[num]+%[size] > $4))
+                       remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
                        "cvtdl\t%[1],$4(fp)"
-                       setcc({LOCAL4,$4, 4})   |       | |
+                       setcc({LOCAL4,LB,$4,4}) |       | |
+loc loc cfi stl $1==8 && $2==4 && $4>=0
+               | source8 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
+                       "cvtdl\t%[1],$4(ap)"
+                       setcc({LOCAL4,AP,$4,4}) |       | |
 loc loc cfi ste $1==8 && $2==4 | source8 |
                        remove(externals)
                        "cvtdl\t%[1],$4"
-                       setcc({EXTERNAL4, $4})  |       | |
+                       setcc({EXTERNAL4,$4})   |       | |
+#endif FLOAT8
 loc loc cfi $1==8 && $2==4     | source8 |
                        allocate(%[1],REG)
                        "cvtdl\t%[1],%[a]"
                        setcc(%[a])             | %[a]  | |
+#ifdef FLOAT4
 #ifdef REGVARS
 loc loc cif stl $1==4 && $2==4 && inreg($4)==2
                | source4 |
@@ -1714,17 +2169,25 @@ loc loc cif stl $1==4 && $2==4 && inreg($4)==2
                        erase(regvar($4))
                        setcc(regvar($4))       |       | |
 #endif REGVARS
-loc loc cif stl $1==4 && $2==4 | source4 |
+loc loc cif stl $1==4 && $2==4 && $4<0
+               | source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $4+3 && %[num]+%[size] > $4))
+                       remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
                        "cvtlf\t%[1],$4(fp)"    |       | |
+loc loc cif stl $1==4 && $2==4 && $4>=0
+               | source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
+                       "cvtlf\t%[1],$4(ap)"    |       | |
 loc loc cif ste $1==4 && $2==4 | source4 |
                        remove(externals)
                        "cvtlf\t%[1],$4"        |       | |
+#endif FLOAT4
 loc loc cif $1==4 && $2==4     | source4 |
                        allocate(%[1],REG)
                        "cvtlf\t%[1],%[a]"      | %[a]  | |
-/* No double registervariables yet...
+#ifdef FLOAT8
+/* No double registervariables
 #ifdef REGVARS
 loc loc cif sdl $1==4 && $2==8 && inreg($4)==2
                | source4 |
@@ -1734,10 +2197,16 @@ loc loc cif sdl $1==4 && $2==8 && inreg($4)==2
                        setcc(regvar($4))       |       | |
 #endif REGVARS
 */
-loc loc cif sdl $1==4 && $2==8 | source4 |
+loc loc cif sdl $1==4 && $2==8 && $4<0
+               | source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $4+3 && %[num]+%[size] > $4))
+                       remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
                        "cvtld\t%[1],$4(fp)"    |       | |
+loc loc cif sdl $1==4 && $2==8 && $4>=0
+               | source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
+                       "cvtld\t%[1],$4(ap)"    |       | |
 loc loc cif sde $1==4 && $2==8 | source4 |
                        remove(externals)
                        "cvtld\t%[1],$4"        |       | |
@@ -1746,6 +2215,7 @@ loc loc loc cif $1!=0 && $2==4 && $3==8   | |     | {FCONST8,$1}  | |
  * doesn't handle 0f0.0 (and other numbers that have the 0x4000 bit off
  * in the exponent) right.
  */
+#endif FLOAT8
 loc loc cif $1==4 && $2==8     | source4 |
                        allocate(%[1],QREG)
                        "cvtld\t%[1],%[a]"      | %[a]  | |
@@ -1755,6 +2225,8 @@ loc loc cfu $1==4 | source4 |
 loc loc cfu $1==8      | source8 |
                        allocate(%[1],QREG=%[1])
                        "bicl2\t$$32768,%[a]"   | %[a]  | loc $1 loc $2 cfi |
+#ifdef FLOAT8
+/* No double registervariables
 #ifdef REGVARS
 loc loc cff sdl $1==4 && $2==8 && inreg($4)==2
                | source4 |
@@ -1763,16 +2235,25 @@ loc loc cff sdl $1==4 && $2==8 && inreg($4)==2
                        erase(regvar($4))
                        setcc(regvar($4))       |       | |
 #endif REGVARS
-loc loc cff sdl $1==4 && $2==8 | source4 |
+*/
+loc loc cff sdl $1==4 && $2==8 && $4<0
+               | source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $4+7 && %[num]+%[size] > $4))
+                       remove(LOCALS,(%[num] <= $4+7 && %[num]+%[size] > $4))
                        "cvtfd\t%[1],$4(fp)"    |       | |
+loc loc cff sdl $1==4 && $2==8 && $4>=0
+               | source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $4+7 && %[num]+%[size] > $4))
+                       "cvtfd\t%[1],$4(ap)"    |       | |
 loc loc cff sde $1==4 && $2==8 | source4 |
                        remove(externals)
                        "cvtfd\t%[1],$4"        |       | |
+#endif FLOAT8
 loc loc cff $1==4 && $2==8     | source4 |
                        allocate(%[1],QREG)
                        "cvtfd\t%[1],%[a]"      | %[a]  | |
+#ifdef FLOAT4
 #ifdef REGVARS
 loc loc cff stl $1==8 && $2==4 && inreg($4)==2
                | source8 |
@@ -1781,13 +2262,20 @@ loc loc cff stl $1==8 && $2==4 && inreg($4)==2
                        erase(regvar($4))
                        setcc(regvar($4))       |       | |
 #endif REGVARS
-loc loc cff stl $1==8 && $2==4 | source8 |
+loc loc cff stl $1==8 && $2==4 && $4<0
+               | source8 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $4+3 && %[num]+%[size] > $4))
+                       remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
                        "cvtdf\t%[1],$4(fp)"    |       | |
+loc loc cff stl $1==8 && $2==4 && $4>=0
+               | source8 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
+                       "cvtdf\t%[1],$4(ap)"    |       | |
 loc loc cff ste $1==8 && $2==4 | source8 |
                        remove(externals)
                        "cvtdf\t%[1],$4"        |       | |
+#endif FLOAT4
 loc loc cff $1==8 && $2==4     | source8 |
                        allocate(%[1],REG)
                        "cvtdf\t%[1],%[a]"      | %[a]  | |
@@ -1799,15 +2287,22 @@ loc loc cuu stl $1==2 && $2==4 && inreg($4)==2
                        erase(regvar($4))
                        setcc(regvar($4))       |       | |
 #endif REGVARS
-loc loc cuu stl $1==2 && $2==4 | source2or4 |
+loc loc cuu stl $1==2 && $2==4 && $4<0
+               | source2or4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $4+3 && %[num]+%[size] > $4))
+                       remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
                        "movzwl\t%[1],$4(fp)"
-                       setcc({LOCAL4,$4, 4})   |       | |
+                       setcc({LOCAL4,LB,$4,4}) |       | |
+loc loc cuu stl $1==2 && $2==4 && $4>=0
+               | source2or4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $4+3 && %[num]+%[size] > $4))
+                       "movzwl\t%[1],$4(ap)"
+                       setcc({LOCAL4,AP,$4,4}) |       | |
 loc loc cuu ste $1==2 && $2==4 | source2or4 |
                        remove(externals)
                        "movzwl\t%[1],$4"
-                       setcc({EXTERNAL4, $4})  |       | |
+                       setcc({EXTERNAL4,$4})   |       | |
 loc loc cuu $1==2 && $2==4     | source2or4 |
                        allocate(%[1],REG)
                        "movzwl\t%[1],%[a]"
@@ -1822,35 +2317,19 @@ and $1==4       | source4 source4 |
                        "mcoml\t%[1],%[a]"
                        "bicl3\t%[a],%[2],%[a]"
                        setcc(%[a])             | %[a]  | | (7,6)+%[1]+%[2]
-...            | CONST source4 |
+...            | NC CONST source4 |
                        allocate(%[2],REG)
                        "bicl3\t$$~%[1.num],%[2],%[a]"
                        setcc(%[a])             | %[a]  | | (4,3)+%[1]+%[2]
-...            | source4 CONST |
+...            | NC source4 CONST |
                        allocate(%[1],REG)
                        "bicl3\t$$~%[2.num],%[1],%[a]"
                        setcc(%[a])             | %[a]  | | (4,3)+%[1]+%[2]
-and zeq $1==4  | source1 source1 |
-                       remove(ALL)
-                       "bitb\t%[1],%[2]"
-                       "jeql\t$2"      |       | |
-...            | source2 source2 |
-                       remove(ALL)
-                       "bitw\t%[1],%[2]"
-                       "jeql\t$2"      |       | |
-...            | source4 source4 |
+and zeq $1==4  | source4 source4 |
                        remove(ALL)
                        "bitl\t%[1],%[2]"
                        "jeql\t$2"      |       | |
-and zne $1==4  | source1 source1 |
-                       remove(ALL)
-                       "bitb\t%[1],%[2]"
-                       "jneq\t$2"      |       | |
-...            | source2 source2 |
-                       remove(ALL)
-                       "bitw\t%[1],%[2]"
-                       "jneq\t$2"      |       | |
-...            | source4 source4 |
+and zne $1==4  | source4 source4 |
                        remove(ALL)
                        "bitl\t%[1],%[2]"
                        "jneq\t$2"      |       | |
@@ -1867,92 +2346,136 @@ and tne $1==4  | source4 source4 |
                        erase(%[a])             | %[a]  | |
 #ifdef REGVARS
 and stl $1==4 && inreg($2)==2
-               | source4-CONST source4 |
+               | source4 source4 |
                        remove(regvar($2))
                        allocate(%[1],REG)
                        "mcoml\t%[1],%[a]"
                        "bicl3\t%[a],%[2],%(regvar($2)%)"
                        erase(regvar($2))
                        setcc(regvar($2))       |       | | (8,8)+%[1]+%[2]
-...            | CONST source4 |
+...            | NC CONST source4 |
                        remove(regvar($2))
                        "bicl3\t$$~%[1.num],%[2],%(regvar($2)%)"
                        erase(regvar($2))
                        setcc(regvar($2))       |       | | (4,4)+%[1]+%[2]
-...            | source4 CONST |
+...            | NC source4 CONST |
                        remove(regvar($2))
                        "bicl3\t$$~%[2.num],%[1],%(regvar($2)%)"
                        erase(regvar($2))
                        setcc(regvar($2))       |       | | (4,4)+%[1]+%[2]
 #endif REGVARS
-and stl $1==4  | source4-CONST source4 |
+and stl $1==4 && $2<0
+               | source4 source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $2+3 && %[num]+%[size] > $2))
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
                        allocate(%[1],REG)
                        "mcoml\t%[1],%[a]"
                        "bicl3\t%[a],%[2],$2(fp)"
-                       setcc({LOCAL4,$2, 4})   |       | | (9,12)+%[1]+%[2]
+                       setcc({LOCAL4,LB,$2,4}) |       | | (9,12)+%[1]+%[2]
 ...            | NC CONST source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $2+3 && %[num]+%[size] > $2))
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
                        "bicl3\t$$~%[1.num],%[2],$2(fp)"
-                       setcc({LOCAL4,$2, 4})   |       | | (6,9)+%[1]+%[2]
+                       setcc({LOCAL4,LB,$2,4}) |       | | (6,9)+%[1]+%[2]
 ...            | NC source4 CONST |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $2+3 && %[num]+%[size] > $2))
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
                        "bicl3\t$$~%[2.num],%[1],$2(fp)"
-                       setcc({LOCAL4,$2, 4})   |       | | (6,9)+%[1]+%[2]
+                       setcc({LOCAL4,LB,$2,4}) |       | | (6,9)+%[1]+%[2]
+and stl $1==4 && $2>=0
+               | source4 source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
+                       allocate(%[1],REG)
+                       "mcoml\t%[1],%[a]"
+                       "bicl3\t%[a],%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4}) |       | | (9,12)+%[1]+%[2]
+...            | NC CONST source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
+                       "bicl3\t$$~%[1.num],%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4}) |       | | (6,9)+%[1]+%[2]
+...            | NC source4 CONST |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
+                       "bicl3\t$$~%[2.num],%[1],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4}) |       | | (6,9)+%[1]+%[2]
 #ifdef REGVARS
 and sil $1==4 && inreg($2)==2
-               | source4-CONST source4 |
+               | source4 source4 |
                        REMEXTANDLOC
                        allocate(%[1],REG)
                        "mcoml\t%[1],%[a]"
                        "bicl3\t%[a],%[2],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)})
                                                |       | | (9,15)+%[1]+%[2]
-...            | CONST source4 |
+...            | NC CONST source4 |
                        REMEXTANDLOC
                        "bicl3\t$$~%[1.num],%[2],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)})
                                                |       | | (6,12)+%[1]+%[2]
-...            | source4 CONST |
+...            | NC source4 CONST |
                        REMEXTANDLOC
                        "bicl3\t$$~%[2.num],%[1],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)})
                                                |       | | (6,12)+%[1]+%[2]
 #endif REGVARS
-and sil $1==4  | source4-CONST source4 |
+and sil $1==4 && $2<0
+               | source4 source4 |
                        REMEXTANDLOC
                        allocate(%[1],REG)
                        "mcoml\t%[1],%[a]"
                        "bicl3\t%[a],%[2],*$2(fp)"
                        setcc({displdef4,LB,tostring($2)})
                                                |       | | (9,15)+%[1]+%[2]
-...            | CONST source4 |
+...            | NC CONST source4 |
                        REMEXTANDLOC
                        "bicl3\t$$~%[1.num],%[2],*$2(fp)"
                        setcc({displdef4,LB,tostring($2)})
                                                |       | | (6,12)+%[1]+%[2]
-...            | source4 CONST |
+...            | NC source4 CONST |
                        REMEXTANDLOC
                        "bicl3\t$$~%[2.num],%[1],*$2(fp)"
                        setcc({displdef4,LB,tostring($2)})
                                                |       | | (6,12)+%[1]+%[2]
-and ste $1==4  | source4-CONST source4 |
+and sil $1==4 && $2>=0
+               | source4 source4 |
+                       REMEXTANDLOC
+                       allocate(%[1],REG)
+                       "mcoml\t%[1],%[a]"
+                       "bicl3\t%[a],%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})
+                                               |       | | (9,15)+%[1]+%[2]
+...            | NC CONST source4 |
+                       REMEXTANDLOC
+                       "bicl3\t$$~%[1.num],%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})
+                                               |       | | (6,12)+%[1]+%[2]
+...            | NC source4 CONST |
+                       REMEXTANDLOC
+                       "bicl3\t$$~%[2.num],%[1],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})
+                                               |       | | (6,12)+%[1]+%[2]
+and ste $1==4  | source4 source4 |
                        remove(externals)
                        allocate(%[1],REG)
                        "mcoml\t%[1],%[a]"
                        "bicl3\t%[a],%[2],$2"
                        setcc({EXTERNAL4,$2})   |       | | (11,12)+%[1]+%[2]
-...            | CONST source4 |
+...            | NC CONST source4 |
                        remove(externals)
                        "bicl3\t$$~%[1.num],%[2],$2"
                        setcc({EXTERNAL4,$2})   |       | | (8,9)+%[1]+%[2]
-...            | source4 CONST |
+...            | NC source4 CONST |
                        remove(externals)
                        "bicl3\t$$~%[2.num],%[1],$2"
                        setcc({EXTERNAL4,$2})   |       | | (8,9)+%[1]+%[2]
+and $1==8      | sreg8 sreg8 |
+                       "mcoml\t%[1.1],%[1.1]"
+                       "mcoml\t%[1.2],%[1.2]"
+                       "bicl2\t%[1.1],%[2.1]"
+                       "bicl2\t%[1.2],%[2.2]"
+                       erase(%[1]) erase(%[2]) | %[2]  | |
 and defined($1) | |    remove(ALL)
                        move({CONST4,$1},R0)
                        "jsb\t.and"
@@ -1962,15 +2485,15 @@ and !defined($1) | source4 |
                        move(%[1],R0)
                        "jsb\t.and"
                        erase(R0)               |       | |
-ior $1==4      | NC source4 source4 |
+ior $1==4      | source4 source4 |
                        allocate(%[1],%[2],REG)
                        "bisl3\t%[1],%[2],%[a]"
                        setcc(%[a])             | %[a]  | | (4,4)+%[1]+%[2]
-...            | sreg4 source4 |
+...            | NC sreg4 source4 |
                        "bisl2\t%[2],%[1]"
                        erase(%[1])
                        setcc(%[1])             | %[1]  | | (3,4) + %[2]
-...            | source4 sreg4 |
+...            | NC source4 sreg4 |
                        "bisl2\t%[1],%[2]"
                        erase(%[2])
                        setcc(%[2])             | %[2]  | | (3,4) + %[1]
@@ -1982,11 +2505,18 @@ ior stl $1==4 && inreg($2)==2
                        erase(regvar($2))
                        setcc(regvar($2))       |       | |
 #endif REGVARS
-ior stl $1==4  | source4 source4 |
+ior stl $1==4 && $2<0
+               | source4 source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $2+3 && %[num]+%[size] > $2))
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
                        "bisl3\t%[1],%[2],$2(fp)"
-                       setcc({LOCAL4,$2, 4})   |       | |
+                       setcc({LOCAL4,LB,$2,4}) |       | |
+ior stl $1==4 && $2>=0
+               | source4 source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
+                       "bisl3\t%[1],%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4}) |       | |
 #ifdef REGVARS
 ior sil $1==4 && inreg($2)==2
                | source4 source4 |
@@ -1994,16 +2524,26 @@ ior sil $1==4 && inreg($2)==2
                        "bisl3\t%[1],%[2],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)})     |       | |
 #endif REGVARS
-ior sil $1==4  | source4 source4 |
+ior sil $1==4 && $2<0
+               | source4 source4 |
                        REMEXTANDLOC
                        "bisl3\t%[1],%[2],*$2(fp)"
                        setcc({displdef4,LB,tostring($2)}) |    | |
+ior sil $1==4 && $2>=0
+               | source4 source4 |
+                       REMEXTANDLOC
+                       "bisl3\t%[1],%[2],*$2(ap)"
+                       setcc({displdef4,LB,tostring($2)}) |    | |
 ior ste $1==4  | source4 source4 |
                        remove(externals)
                        "bisl3\t%[1],%[2],$2"
                        setcc({EXTERNAL4,$2})   |       | |
-ior defined($1) | |    remove(ALL)
-                       move({CONST4, $1},R0)
+ior $1==8      | sreg8 sreg8 |
+                       "bisl2\t%[1.1],%[2.1]"
+                       "bisl2\t%[1.2],%[2.2]"
+                       erase(%[2])             | %[2]  | |
+ior defined($1) | STACK |
+                       move({CONST4,$1},R0)
                        "jsb\t.ior"
                        erase(R0)               |       | |
 ior !defined($1) | source4 |
@@ -2031,11 +2571,18 @@ xor stl $1==4 && inreg($2)==2
                        erase(regvar($2))
                        setcc(regvar($2))       |       | |
 #endif REGVARS
-xor stl $1==4  | source4 source4 |
+xor stl $1==4 && $2<0
+               | source4 source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $2+3 && %[num]+%[size] > $2))
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
                        "xorl3\t%[1],%[2],$2(fp)"
-                       setcc({LOCAL4,$2, 4})   |       | |
+                       setcc({LOCAL4,LB,$2,4}) |       | |
+xor stl $1==4 && $2>=0
+               | source4 source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
+                       "xorl3\t%[1],%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4}) |       | |
 #ifdef REGVARS
 xor sil $1==4 && inreg($2)==2
                | source4 source4 |
@@ -2043,16 +2590,22 @@ xor sil $1==4 && inreg($2)==2
                        "xorl3\t%[1],%[2],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)})     |       | |
 #endif REGVARS
-xor sil $1==4  | source4 source4 |
+xor sil $1==4 && $2<0
+               | source4 source4 |
                        REMEXTANDLOC
                        "xorl3\t%[1],%[2],*$2(fp)"
                        setcc({displdef4,LB,tostring($2)}) |    | |
+xor sil $1==4 && $2>=0
+               | source4 source4 |
+                       REMEXTANDLOC
+                       "xorl3\t%[1],%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)}) |    | |
 xor ste $1==4  | source4 source4 |
                        remove(externals)
                        "xorl3\t%[1],%[2],$2"
                        setcc({EXTERNAL4,$2})   |       | |
-xor defined($1) | |    remove(ALL)
-                       move({CONST4, $1},R0)
+xor defined($1) | STACK |
+                       move({CONST4,$1},R0)
                        "jsb\t.xor"
                        erase(R0)               |       | |
 xor !defined($1) | source4 |
@@ -2072,11 +2625,18 @@ com stl $1==4 && inreg($2)==2
                        erase(regvar($2))
                        setcc(regvar($2))       |       | |
 #endif REGVARS
-com stl $1==4  | source4 |
+com stl $1==4 && $2<0
+               | source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $2+3 && %[num]+%[size] > $2))
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
                        "mcoml\t%[1],$2(fp)"
-                       setcc({LOCAL4,$2, 4}) | | |
+                       setcc({LOCAL4,LB,$2,4}) |       | |
+com stl $1==4 && $2>=0
+               | source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
+                       "mcoml\t%[1],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4}) |       | |
 #ifdef REGVARS
 com sil $1==4 && inreg($2)==2
                | source4 |
@@ -2084,15 +2644,21 @@ com sil $1==4 && inreg($2)==2
                        "mcoml\t%[1],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)})     |       | |
 #endif REGVARS
-com sil $1==4  | source4 |
+com sil $1==4 && $2<0
+               | source4 |
                        REMEXTANDLOC
                        "mcoml\t%[1],*$2(fp)"
                        setcc({displdef4,LB,tostring($2)}) |    | |
+com sil $1==4 && $2>=0
+               | source4 |
+                       REMEXTANDLOC
+                       "mcoml\t%[1],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)}) |    | |
 com ste $1==4  | source4 |
                        remove(externals)
                        "mcoml\t%[1],$2"
                        setcc({EXTERNAL4,$2})   |       | |
-com defined($1) | |    remove(ALL)
+com defined($1) | STACK |
                        move({CONST4,$1},R0)
                        "jsb\t.com"
                        erase(R0)               |       | |
@@ -2114,11 +2680,18 @@ rol stl $1==4 && inreg($2)==2
                        erase(regvar($2))
                        setcc(regvar($2))       |       | |
 #endif REGVARS
-rol stl $1==4  | source4 source4 |
+rol stl $1==4 && $2<0
+               | source4 source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $2+3 && %[num]+%[size] > $2))
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
                        "rotl\t%[1],%[2],$2(fp)"
-                       setcc({LOCAL4,$2, 4})   |       | |
+                       setcc({LOCAL4,LB,$2,4}) |       | |
+rol stl $1==4 && $2>=0
+               | source4 source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
+                       "rotl\t%[1],%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4}) |       | |
 #ifdef REGVARS
 rol sil $1==4 && inreg($2)==2
                | source4 source4 |
@@ -2126,10 +2699,16 @@ rol sil $1==4 && inreg($2)==2
                        "rotl\t%[1],%[2],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)})     |       | |
 #endif REGVARS
-rol sil $1==4  | source4 source4 |
+rol sil $1==4 && $2<0
+               | source4 source4 |
                        REMEXTANDLOC
                        "rotl\t%[1],%[2],*$2(fp)"
                        setcc({displdef4,LB,tostring($2)})      |       | |
+rol sil $1==4 && $2>=0
+               | source4 source4 |
+                       REMEXTANDLOC
+                       "rotl\t%[1],%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})      |       | |
 rol ste $1==4  | source4 source4 |
                        remove(externals)
                        "rotl\t%[1],%[2],$2"
@@ -2139,72 +2718,98 @@ rol !defined($1) | source4 |
                        move(%[1],R0)
                        "jsb\t.rol"
                        erase(R0)               |       | |
-ror $1==4      | source4-CONST source4 |
+ror $1==4      | source4 source4 |
                        allocate(%[1],REG)
                        "subl3\t%[1],$$32,%[a]"
                        "rotl\t%[a],%[2],%[a]"
                        setcc(%[a])             | %[a]  | |
-...            | CONST source4 |
+...            | NC CONST source4 |
                        allocate(%[2],REG)
                        "rotl\t$$%(32-%[1.num]%),%[2],%[a]"
                        setcc(%[a])             | %[a]  | |
 #ifdef REGVARS
 ror stl $1==4 && inreg($2)==2
-               | source4-CONST source4 |
+               | source4 source4 |
                        remove(regvar($2))
                        allocate(%[1],REG)
                        "subl3\t%[1],$$32,%[a]"
                        "rotl\t%[a],%[2],%(regvar($2)%)"
                        erase(regvar($2))
                        setcc(regvar($2))       |       | |
-...            | CONST source4 |
+...            | NC CONST source4 |
                        remove(regvar($2))
                        "rotl\t$$%(32-%[1.num]%),%[2],%(regvar($2)%)"
                        erase(regvar($2))
                        setcc(regvar($2))       |       | |
 #endif REGVARS
-ror stl $1==4  | source4-CONST source4 |
+ror stl $1==4 && $2<0
+               | source4 source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $2+3 && %[num]+%[size] > $2))
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
                        allocate(%[1],REG)
                        "subl3\t%[1],$$32,%[a]"
                        "rotl\t%[a],%[2],$2(fp)"
-                       setcc({LOCAL4,$2, 4})   |       | |
-...            | CONST source4 |
+                       setcc({LOCAL4,LB,$2,4}) |       | |
+...            | NC CONST source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $2+3 && %[num]+%[size] > $2))
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
                        "rotl\t$$%(32-%[1.num]%),%[2],$2(fp)"
-                       setcc({LOCAL4,$2, 4})   |       | |
+                       setcc({LOCAL4,LB,$2,4}) |       | |
+ror stl $1==4 && $2>=0
+               | source4 source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
+                       allocate(%[1],REG)
+                       "subl3\t%[1],$$32,%[a]"
+                       "rotl\t%[a],%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4}) |       | |
+...            | NC CONST source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $2+3 && %[num]+%[size] > $2))
+                       "rotl\t$$%(32-%[1.num]%),%[2],$2(ap)"
+                       setcc({LOCAL4,AP,$2,4}) |       | |
 #ifdef REGVARS
 ror sil $1==4 && inreg($2)==2
-               | source4-CONST source4 |
+               | source4 source4 |
                        REMEXTANDLOC
                        allocate(%[1],REG)
                        "subl3\t%[1],$$32,%[a]"
                        "rotl\t%[a],%[2],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)})     |       | |
-...            | CONST source4 |
+...            | NC CONST source4 |
                        REMEXTANDLOC
                        "rotl\t$$%(32-%[1.num]%),%[2],(%(regvar($2)%))"
                        setcc({regdef4,regvar($2)})     |       | |
 #endif REGVARS
-ror sil $1==4  | source4-CONST source4 |
+ror sil $1==4 && $2<0
+               | source4 source4 |
                        REMEXTANDLOC
                        allocate(%[1],REG)
                        "subl3\t%[1],$$32,%[a]"
                        "rotl\t%[a],%[2],*$2(fp)"
                        setcc({displdef4,LB,tostring($2)})      |       | |
-...            | CONST source4 |
+...            | NC CONST source4 |
                        REMEXTANDLOC
                        "rotl\t$$%(32-%[1.num]%),%[2],*$2(fp)"
                        setcc({displdef4,LB,tostring($2)})      |       | |
-ror ste $1==4  | source4-CONST source4 |
+ror sil $1==4 && $2>=0
+               | source4 source4 |
+                       REMEXTANDLOC
+                       allocate(%[1],REG)
+                       "subl3\t%[1],$$32,%[a]"
+                       "rotl\t%[a],%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})      |       | |
+...            | NC CONST source4 |
+                       REMEXTANDLOC
+                       "rotl\t$$%(32-%[1.num]%),%[2],*$2(ap)"
+                       setcc({displdef4,AP,tostring($2)})      |       | |
+ror ste $1==4  | source4 source4 |
                        remove(externals)
                        allocate(%[1],REG)
                        "subl3\t%[1],$$32,%[a]"
                        "rotl\t%[a],%[2],$2"
                        setcc({EXTERNAL4,$2})   |       | |
-...            | CONST source4 |
+...            | NC CONST source4 |
                        remove(externals)
                        "rotl\t$$%(32-%[1.num]%),%[2],$2"
                        setcc({EXTERNAL4,$2})   |       | |
@@ -2213,7 +2818,8 @@ ror !defined($1) | source4 |
                        move(%[1],R0)
                        "jsb\t.ror"
                        erase(R0)               |       | |
-com and $1==4 && $2==4 | source4 source4 |
+com and $1==4 && $2==4
+               | source4 source4 |
                        allocate(%[1],%[2],REG)
                        "bicl3\t%[1],%[2],%[a]"
                        setcc(%[a])             | %[a]  | | (4,4)+%[1]+%[2]
@@ -2221,9 +2827,6 @@ com and $1==4 && $2==4    | source4 source4 |
                        "bicl2\t%[1],%[2]"
                        erase(%[2])
                        setcc(%[2])             | %[2]  | | (3,4) + %[1]
-...            | source4 source4 |
-                       remove(ALL)
-                       "bicl3\t%[1],%[2],(sp)+" |      | | (4,7)+%[1]+%[2]
 #ifdef REGVARS
 com and stl $1==4 && $2==4 && inreg($3)==2
                | source4 source4 |
@@ -2232,11 +2835,18 @@ com and stl $1==4 && $2==4 && inreg($3)==2
                        erase(regvar($3))
                        setcc(regvar($3))       |       | |
 #endif REGVARS
-com and stl $1==4 && $2==4     | source4 source4 |
+com and stl $1==4 && $2==4 && $3<0
+               | source4 source4 |
                        remove(displaced)
-                       remove(LOCALS, (%[num] <= $3+3 && %[num]+%[size] > $3))
+                       remove(LOCALS,(%[num] <= $3+3 && %[num]+%[size] > $3))
                        "bicl3\t%[1],%[2],$3(fp)"
-                       setcc({LOCAL4,$3, 4})   |       | |
+                       setcc({LOCAL4,AP,$3,4}) |       | |
+com and stl $1==4 && $2==4 && $3>=0
+               | source4 source4 |
+                       remove(displaced)
+                       remove(LOCALS,(%[num] <= $3+3 && %[num]+%[size] > $3))
+                       "bicl3\t%[1],%[2],$3(ap)"
+                       setcc({LOCAL4,AP,$3,4}) |       | |
 #ifdef REGVARS
 com and sil $1==4 && $2==4 && inreg($3)==2
                | source4 source4 |
@@ -2244,16 +2854,23 @@ com and sil $1==4 && $2==4 && inreg($3)==2
                        "bicl3\t%[1],%[2],(%(regvar($3)%))"
                        setcc({regdef4,regvar($3)})     |       | |
 #endif REGVARS
-com and sil $1==4 && $2==4     | source4 source4 |
+com and sil $1==4 && $2==4 && $3<0
+               | source4 source4 |
                        REMEXTANDLOC
                        "bicl3\t%[1],%[2],*$3(fp)"
                        setcc({displdef4,LB,tostring($3)})      |       | |
-com and ste $1==4 &&$2==4      | source4 source4 |
+com and sil $1==4 && $2==4 && $3>=0
+               | source4 source4 |
+                       REMEXTANDLOC
+                       "bicl3\t%[1],%[2],*$3(ap)"
+                       setcc({displdef4,AP,tostring($3)})      |       | |
+com and ste $1==4 &&$2==4
+               | source4 source4 |
                        remove(externals)
                        "bicl3\t%[1],%[2],$3"
                        setcc({EXTERNAL4,$3})   |       | |
-com and $1==$2 | |     remove(ALL)
-                       move({CONST4, $1}, R0)
+com and $1==$2 | STACK |
+                       move({CONST4,$1},R0)
                        "jsb\t.cmand"
                        erase(R0)               |       | |
 
@@ -2262,11 +2879,11 @@ com and $1==$2  | |     remove(ALL)
  ********************************/
 
 loc inn $1==0 && $2==4 | source4 |
-                       allocate(%[1], REG)
+                       allocate(%[1],REG)
                        "bicl3\t$$~1,%[1],%[a]"
                        setcc(%[a])             | %[a]  | |
 loc inn $2==4  | source4 |
-                       allocate(%[1], REG)
+                       allocate(%[1],REG)
                        "ashl\t$$%(0-$1%),%[1],%[a]"
                        "bicl2\t$$~1,%[a]"
                        setcc(%[a])             | %[a]  | |
@@ -2327,8 +2944,8 @@ loc inn zne $2==8 && $1>=32       /* Second half. */
                        remove(ALL)
                        "bitl\t%[2],$$%(1<<($1-32)%)"
                        "jneq\t$3"              |       | |
-inn defined($1) | |    remove(ALL)
-                       move({CONST4, $1},R0)
+inn defined($1) | STACK |
+                       move({CONST4,$1},R0)
                        "jsb\t.inn"
                        erase(R0)               | R1    | |
 inn !defined($1) | source4 |
@@ -2337,8 +2954,8 @@ inn !defined($1) | source4 |
                        "jsb\t.inn"
                        erase(R0)               | R1    | |
 set $1==4      | source4 | |   {CONST4,1} %[1] | sli 4 |
-set defined($1) | |    remove(ALL)
-                       move({CONST4, $1},R0)
+set defined($1) | STACK |
+                       move({CONST4,$1},R0)
                        "jsb\t.setx"
                        erase(R0)               |       | |
 set !defined($1) | source4 |
@@ -2356,48 +2973,24 @@ lae aar $2==4 && rom(1,3)==2    | | | | loc 1 sli 4 ads 4 adp 0-2*rom(1,1) |
 lae aar $2==4 && rom(1,3)==4   | | | | loc 2 sli 4 ads 4 adp 0-4*rom(1,1) |
 lae aar $2==4 && rom(1,3)==8   | | | | loc 3 sli 4 ads 4 adp 0-8*rom(1,1) |
 lae aar $2==4 && defined(rom(1,3)) && rom(1,1)==0
-               | source4 source4 |
-                       allocate(%[1],REG)
-                       "mull3\t$$%(rom(1,3)%),%[1],%[a]"
-                       "addl2\t%[2],%[a]"
-                       setcc(%[a])             | %[a]  | | (10,20)+%[1]+%[2]
-...            | NC source4 adispl |
-                       allocate(%[1],REG)
-                       "mull3\t$$%(rom(1,3)%),%[1],%[a]"
-                       "addl2\t%[2.reg],%[a]"
-                       setcc(%[a])
-                       | {adispl,%[a],%[2.ind]}        | | (10,20)+%[1]
-...            | NC source4 ADDR_LOCAL |
+               | source4 adispl |
                        allocate(%[1],REG)
                        "mull3\t$$%(rom(1,3)%),%[1],%[a]"
-                       "addl2\tfp,%[a]"
-                       setcc(%[a])
-                       | {adispl,%[a],tostring(%[2.num])} | | (10,20)+%[1]
+                       | {adisplind1,%[a],%[2.reg],%[2.ind]}   | | (8,10)+%[1]
 ...            | NC source4 ADDR_EXTERNAL |
                        allocate(%[1],REG)
                        "mull3\t$$%(rom(1,3)%),%[1],%[a]"
-                       setcc(%[a])
                        | {adispl,%[a],%[2.ind]}        | | (7,16)+%[1]
 lae aar $2==4 && defined(rom(1,3))
                | source4 adispl |
                        allocate(%[1],REG)
                        "mull3\t$$%(rom(1,3)%),%[1],%[a]"
-                       "addl2\t%[2.reg],%[a]"
-                       setcc(%[a])
-                       | {adispl,%[a],
+                       | {adisplind1,%[a],%[2.reg],
                                %[2.ind]+"+"+tostring(0-rom(1,1)*rom(1,3))}
-                               | | (10,20)+%[1]
-...            | NC source4 source4 |
-                       allocate(%[1],REG)
-                       "mull3\t$$%(rom(1,3)%),%[1],%[a]"
-                       "addl2\t%[2],%[a]"
-                       setcc(%[a])
-                       | {adispl,%[a],tostring(0-rom(1,1)*rom(1,3))}
-                               | | (10,20)+%[1]+%[2]
+                               | | (8,10)+%[1]
 ...            | NC source4 ADDR_EXTERNAL |
                        allocate(%[1],REG)
                        "mull3\t$$%(rom(1,3)%),%[1],%[a]"
-                       setcc(%[a])
                        | {adispl,%[a],
                                %[2.ind]+"+"+tostring(0-rom(1,1)*rom(1,3))}
                                | | (7,16)+%[1]
@@ -2420,7 +3013,7 @@ loc sli ads $1==3 && $2==4 && $3==4
                                | {adispldefind8,%[1],%[2.reg],%[2.ind]} | |
 ...            | reg4 EXTERNAL4 |
                                | {aextdefind8,%[1],%[2.ind]} | |
-aar $1==4      | |     remove(ALL)
+aar $1==4      | STACK |
                        "jsb\t.aar4"             | R0   | |
 aar !defined($1) | source4 |
                        remove(ALL)
@@ -2429,14 +3022,14 @@ aar !defined($1) | source4 |
                        erase(R0)               | R0    | |
 lae sar defined(rom(1,3))      | | |   | lae $1 aar $2 sti rom(1,3)    |
 lae lar defined(rom(1,3))      | | |   | lae $1 aar $2 loi rom(1,3)    |
-sar $1==4      | |     remove(ALL)
+sar $1==4      | STACK |
                        "jsb\t.sar4"             |       | |
 sar !defined($1) | source4 |
                        remove(ALL)
                        move(%[1],R0)
                        "jsb\t.sar"
                        erase(R0)               |       | |
-lar $1==4      | |     remove(ALL)
+lar $1==4      | STACK |
                        "jsb\t.lar4"             |       | |
 lar !defined($1) | source4 |
                        remove(ALL)
@@ -2566,7 +3159,7 @@ cms $1==4 | source4 source4 |
 #endif
                        setcc(%[a])
                        erase(%[a])             | %[a]  | |
-cms defined($1) | |    remove(ALL)
+cms defined($1) | STACK |
                        move({CONST1,$1},R0)
                        "jsb\t.cms"
                        setcc(R0)
@@ -2797,8 +3390,7 @@ cmi tlt $1==4     | source4 source4 |
 #endif
                        erase(%[a])
                        setcc(%[a])             | %[a]  | |
-...            | NC source1or2 source1or2 |
-                                               | %[2] %[1] | cmu 4 tlt |
+...            | NC source1or2 source1or2 |    | %[2] %[1] | cmu 4 tlt |
 cmi tle $1==4  | source4 source4 |
                        allocate(REG={CONST4,0})
                        "cmpl\t%[1],%[2]"
@@ -2811,8 +3403,7 @@ cmi tle $1==4     | source4 source4 |
 #endif
                        erase(%[a])
                        setcc(%[a])             |  %[a]  | |
-...            | NC source1or2 source1or2 |
-                                               | %[2] %[1] | cmu 4 tle |
+...            | NC source1or2 source1or2 |    | %[2] %[1] | cmu 4 tle |
 cmi teq $1==4  | source4 source4 |
                        allocate(REG={CONST4,0})
                        "cmpl\t%[1],%[2]"
@@ -2825,8 +3416,7 @@ cmi teq $1==4     | source4 source4 |
 #endif
                        erase(%[a])
                        setcc(%[a])             | %[a]  | |
-...            | NC source1or2 source1or2 |
-                                               | %[2] %[1] | cmu 4 teq |
+...            | NC source1or2 source1or2 |    | %[2] %[1] | cmu 4 teq |
 cmi tne $1==4  | source4 source4 |
                        allocate(REG={CONST4,0})
                        "cmpl\t%[1],%[2]"
@@ -2839,8 +3429,7 @@ cmi tne $1==4     | source4 source4 |
 #endif
                        erase(%[a])
                        setcc(%[a])             | %[a]  | |
-...            | NC source1or2 source1or2 |
-                                               | %[2] %[1] | cmu 4 tne |
+...            | NC source1or2 source1or2 |    | %[2] %[1] | cmu 4 tne |
 cmi tge $1==4  | source4 source4 |
                        allocate(REG={CONST4,0})
                        "cmpl\t%[1],%[2]"
@@ -2853,8 +3442,7 @@ cmi tge $1==4     | source4 source4 |
 #endif
                        erase(%[a])
                        setcc(%[a])             | %[a]  | |
-...            | NC source1or2 source1or2 |
-                                               | %[2] %[1] | cmu 4 tge |
+...            | NC source1or2 source1or2 |    | %[2] %[1] | cmu 4 tge |
 cmi tgt $1==4  | source4 source4 |
                        allocate(REG={CONST4,0})
                        "cmpl\t%[1],%[2]"
@@ -2867,8 +3455,7 @@ cmi tgt $1==4     | source4 source4 |
 #endif
                        erase(%[a])
                        setcc(%[a])             | %[a]  | |
-...            | NC source1or2 source1or2 |
-                                               | %[2] %[1] | cmu 4 tgt |
+...            | NC source1or2 source1or2 |    | %[2] %[1] | cmu 4 tgt |
 cmi tlt and $1==4 && $3==4
                | source4 source4 sreg4 |
                        "cmpl\t%[2],%[1]"
@@ -3013,6 +3600,7 @@ cmi tgt ior $1==4 && $3==4
 #endif
                        setcc(%[3])
                        erase(%[3])             | %[3]  | |
+#ifdef FLOAT4
 cmf tlt $1==4  | source4 source4 |
                        allocate(REG={CONST1,0})
                        "cmpf\t%[1],%[2]"
@@ -3085,6 +3673,8 @@ cmf tgt $1==4     | source4 source4 |
 #endif
                        erase(%[a])
                        setcc(%[a])             | %[a]  | |
+#endif FLOAT4
+#ifdef FLOAT8
 cmf tlt $1==8  | source8 source8 |
                        allocate(%[1],%[2],REG)
                        "cmpd\t%[1],%[2]"
@@ -3182,6 +3772,7 @@ cmf tgt $1==8     | source8 source8 |
 #endif
                        erase(%[a])
                        setcc(%[a])             | %[a]  | |
+#endif FLOAT8
 /* Remember that cmu was replaced by cmp. */
 cmp tlt        | source4 source4 |
                        allocate(REG={CONST1,0})
@@ -3550,7 +4141,7 @@ zlt               | source4 STACK |
                        test(%[1])
                        "jlss\t$1"
                        samecc                  |       | |
-...            | NC source1or2 |       |       | |
+...            | NC source1or2 |       | %[1]  | asp 4 |
 zle            | source4 STACK |
                        test(%[1])
                        "jleq\t$1"
@@ -3568,7 +4159,7 @@ zge               | source4 STACK |
                        test(%[1])
                        "jgeq\t$1"
                        samecc                  |       | |
-...            | NC source1or2 |       |       | bra $1 |
+...            | NC source1or2 |       | %[1]  | asp 4 bra $1 |
 zgt            | source4 STACK |
                        test(%[1])
                        "jgtr\t$1"
@@ -3641,36 +4232,38 @@ cms zne $1==4   | |                             |       | cmp zne $2 |
  * Group 14 : Procedure call instructions      *
  ************************************************/
 
-cai            | |     remove(ALL)
-                       "jsb\t*(sp)+"            |       | | (2,10)
-...            | reg4 |
+cai asp $2%4 == 0 && $2>=0
+               | reg4 |
+                       remove(ALL)
+                       "calls\t$$%($2/4%),(%[1])"      |       | |
+cai            | reg4 |
                        remove(ALL)
-                       "jsb\t(%[1])"            |       | | (2,7)
+                       "calls\t$$0,(%[1])"             |       | |
+cal asp $2%4 == 0 && $2>=0
+               | |     remove(ALL)
+                       "calls\t$$%($2/4%),$1"          |       | |
 cal            | |     remove(ALL)
-                       "jsb\t$1"                |       | |
-lfr $1==4      | |                             | R0    | |
-lfr $1==8      | |                             | QR0   | |
-asp ret $2==0  | |                             |       | ret 0 |
-ass ret $2==0  | |                             |       | ret 0 |
-asp lfr ret $2==$3 | |                         |       | ret 0 |
-ass lfr ret $2==$3 | |                         |       | ret 0 |
-lfr ret $1==$2 | |                             |       | ret 0 |
-#ifdef REGVARS
-ret $1==0      | |     remove(ALL)
-                       return                  |       | |
-#else REGVARS
-ret $1==0      | |     remove(ALL)
-                       "movl\tfp,sp"
-                       "movl\t(sp)+,fp"
-                       "rsb"                   |       | |
-#endif REGVARS
-ret $1==4      | bigsource4 |
-                       move(%[1],R0)           | | ret 0 |
-ret $1==8      | bigsource8 |
-                       move(%[1],QR0)          | | ret 0 |
-...            | bigsource4 bigsource4 |
+                       "calls\t$$0,$1"                 |       | |
+lfr $1==4      | |                                     | R0    | |
+lfr $1==8      | |                                     | QR0   | |
+asp ret $2==0  | | "ret"                               |       | |
+ass ret $2==0  | | "ret"                               |       | |
+asp lfr ret $2==$3 | | "ret"                           |       | |
+ass lfr ret $2==$3 | | "ret"                           |       | |
+lfr ret $1==$2 | | "ret"                               |       | |
+ret $1==0      | | "ret"                               |       | |
+ret $1==4      | NC bigsource4 |
                        move(%[1],R0)
-                       move(%[2],R1)           | | ret 0 |
+                       "ret"                           |       | |
+...            | STACK |
+                       "movl\t(sp)+,r0"
+                       "ret"                           |       | |
+ret $1==8      | NC bigsource8 |
+                       move(%[1],QR0)
+                       "ret"                           |       | |
+...            | STACK |
+                       "movq\t(sp)+,r0"
+                       "ret"                           |       | |
 
 /********************************
  * Group 15 : Miscellaneous    *
@@ -3679,22 +4272,22 @@ ret $1==8       | bigsource8 |
 #ifdef REGVARS
 asp $1==4      | bigsource4 - regch4 |         |       | |
 #else REGVARS
-asp $1==4      | NC bigsource4 |       |       | |
+asp $1==4      | NC bigsource4 |               |       | |
 #endif REGVARS
-...            | |     remove(ALL)
+...            | STACK |
                        "tstl\t(sp)+"           |       | | (2,7)
-asp $1>0       | |     remove(ALL)
+asp $1>0       | STACK |
                        "addl2\t$$$1,sp"        |       | |
 asp $1==(0-4)  | |                             | {CONST4,0} | |
 asp $1==(0-8)  | |                             | {CONST8,"0"} | |
-asp            | |     remove(ALL)
+asp            | STACK |
                        "subl2\t$$%(0-$1%),sp"  |       | |
 ass $1==4      | source4 |
                        remove(ALL)
                        "addl2\t%[1],sp"        |       | |
 ass !defined($1) | source4 |
                        remove(ALL)
-                       move(%[1],R2)
+                       move(%[1],R2)   /* R2 <= leave return area intact. */
                        "jsb\t.ass"
                        erase(R2)               |       | |
 blm $1==4      | nonexist1 nonexist1 |
@@ -3715,7 +4308,7 @@ blm $1==16        | sreg4 sreg4 |
                        erase(%[1]) erase(%[2]) |       | |
 blm            | sreg4 sreg4 |
                        remove(ALL)
-                       allocate(REG={CONST1, $1/4})
+                       allocate(REG={CONST1,$1/4})
 #ifdef LOCLABS
                        "1:\nmovl\t(%[2])+,(%[1])+"
                        "sobgtr\t%[a],1b"
@@ -3725,8 +4318,7 @@ blm               | sreg4 sreg4 |
 #endif
                        erase(%[1]) erase(%[2]) erase(%[a])
                                                |       | |
-bls $1==4      | |
-                       remove(ALL)
+bls $1==4      | |     remove(ALL)
                        move({CONST1,4},R0)
                        "jsb\t.bls"
                        erase(R0)               |       | |
@@ -3735,36 +4327,29 @@ bls !defined($1) | source4 |
                        move(%[1],R0)
                        "jsb\t.bls"
                        erase(R0)               |       | |
-csa $1==4      | |     remove(ALL)
-                       "jmp\t.csa4"            |        | |
+csa $1==4      | STACK |
+                       "jmp\t.csa4"            |       | |
 csa !defined($1) | source4 |
                        remove(ALL)
                        move(%[1],R0)
                        "jmp\t.csa"
                        erase(R0)               |       | |
-csb $1==4      | |     remove(ALL)
-                       "jmp\t.csb4"             |       | |
+csb $1==4      | STACK |
+                       "jmp\t.csb4"            |       | |
 csb !defined($1) | source4 |
                        remove(ALL)
                        move(%[1],R0)
                        "jmp\t.csb"
                        erase(R0)               |       | |
-dch            | |     |       | loi 4 |
+dch            | reg4  |       | {displ4,%[1],"12"}    |       | |
 dup stl $1==4  | |     |       | stl $2 lol $2 |
-#ifdef REGVARS
-dup sil $1==4 && inreg($2)==2
-               | bigsource4 |
-                       REMEXTANDLOC
-                       move(%[1],{regdef4,regvar($2)})
-                                               | {regdef4,regvar($2)}  | |
-#endif REGVARS
-dup $1==4      | reg4+regdef4 |                | %[1] %[1]     | |
+dup $1==4      | dups4 |               | %[1] %[1]     | |
 #ifdef REGVARS
 dup $1==8      | bigsource8-regch8 |           | %[1] %[1]     | |
 #else REGVARS
 dup $1==8      | bigsource8 |                  | %[1] %[1]     | |
 #endif REGVARS
-dup            | |     remove(ALL)
+dup            | STACK |
                        allocate(REG,REG={CONST1,$1/4})
                        "addl3\tsp,$$$1,%[a]"
 #ifdef LOCLABS
@@ -3795,7 +4380,7 @@ dus !defined($1) | source4 |
                        erase(R0)               |       | |
 exg $1==4      | bigsource4 bigsource4 |       | %[1] %[2] | |
 exg $1==8      | bigsource8 bigsource8 |       | %[1] %[2] | |
-exg defined($1) | |    remove(ALL)
+exg defined($1) | STACK |
                        move({CONST4,$1},R0)
                        "jsb\t.exg"
                        erase(R0)               |       | |
@@ -3809,11 +4394,11 @@ lim             | |     allocate(REG)
                        "movl\t.trpim,%[a]"     | %[a]  | |
 lin            | |     "movl\t$$$1,hol0"       |       | |
 lni            | |     "incl\thol0"            |       | |
-gto            | |     remove(ALL)
+gto            | STACK |
                        "pushl\t$$$1"
                        "jmp\t.gto"             |       | |
 lor $1==0      | |                             | LB    | |
-lor $1==1      | |     remove(ALL)
+lor $1==1      | STACK |
                        allocate(REG)
                        "movl\tsp,%[a]"         | %[a]  | |
 lor $1==2      | |     allocate(REG)
@@ -3823,12 +4408,12 @@ lpb             | bigsource4 |
                        move(%[1],R0)
                        "jsb\t.lpb"
                        erase(R0)               | R0    | |
-mon            | |     remove(ALL)
+mon            | STACK |
                        "jsb\t.mon"             |       | |
-nop            | |     remove(ALL)
+nop            | STACK |
                        "jsb\t.nop"             |       | |
 #ifdef DORCK
-rck $1==4      | |     remove(ALL)
+rck $1==4      | STACK |
                        "jsb\t.rck4"            |       | |
 rck !defined($1) | source4 |
                        remove(ALL)
@@ -3844,21 +4429,21 @@ rck defined($1) | bigsource4 |          |       | |
 rck !defined($1) | bigsource4 bigsource4 |     |       | |
 #endif REGVARS
 #endif DORCK
-rtt            | |                             |       | ret 0 |
-sig            | |     remove(ALL)
-                       "jsb\t.sig"              |       | |
-sim            | |     remove(ALL)
-                       "jsb\t.sim"              |       | |
+rtt            | | "ret"                       |       | |
+sig            | STACK |
+                       "jsb\t.sig"             |       | |
+sim            | STACK |
+                       "jsb\t.sim"             |       | |
 str $1==0      | source4 |
                        remove(ALL)
-                       "movl\t%[1],fp"          |       | |
+                       "jsb\t.strlb"           |       | |
 str $1==1      | source4 |
                        remove(ALL)
-                       "movl\t%[1],sp"          |       | |
-str $1==2      | |     remove(ALL)
-                       "jsb\t.strhp"            |       | |
-trp            | |     remove(ALL)
-                       "jsb\t.trp"              |       | |
+                       "movl\t%[1],sp"         |       | |
+str $1==2      | STACK |
+                       "jsb\t.strhp"           |       | |
+trp            | STACK |
+                       "jsb\t.trp"             |       | |
 
 /********************************
  * Coercions:                  *
@@ -3872,6 +4457,10 @@ trp              | |     remove(ALL)
 | source2 |    allocate(%[1],REG=%[1])         | %[a]  | |
 | bigsource4 | allocate(%[1],REG=%[1])         | %[a]  | |
 | bigsource8 | allocate(%[1],QREG=%[1])        | %[a]  | |
+| reg4 |                       | {adispl,%[1],"0"}     | |
+| ADDR_LOCAL | | {adispl,%[1.reg],tostring(%[1.num])}  | |
+| bigsource4-adispl-reg4-ADDR_LOCAL |
+               allocate(%[1],REG=%[1]) | {adispl,%[a],"0"}     | |
 
 /********************************
  * B: From STACK to register   *
@@ -3894,50 +4483,46 @@ trp             | |     remove(ALL)
 | regdef8 |    | {displ4,%[1.reg],"4"} {regdef4,%[1.reg]}              | |
 | displ8 |     | {displ4,%[1.reg],%[1.ind]+"+4"}
                  {displ4,%[1.reg],%[1.ind]}                            | |
-| LOCAL8 |     | {LOCAL4,%[1.num]+4,4} {LOCAL4,%[1.num],4}             | |
+| LOCAL8 |     | {LOCAL4,%[1.reg],%[1.num]+4,4} {LOCAL4,%[1.reg],%[1.num],4}| |
 | EXTERNAL8 |  | {EXTERNAL4,%[1.ind]+"+4"} {EXTERNAL4,%[1.ind]}        | |
 | QREG |       | %[1.2] %[1.1]                         | |
 | regdef4 |    | {displ4,%[1.reg],"0"}                 | |
-| ADDR_LOCAL | | {adispl,LB,tostring(%[1.num])}        | |
-| reg4 |       | {adispl,%[1],"0"}                     | |
-| LOCAL4 |     | {displ4,LB,tostring(%[1.num])}        | |
-| nonexist+source4-reg4-adispl-ADDR_LOCAL |
-               allocate(%[1],REG=%[1]) | {adispl,%[a],"0"} | |
+| LOCAL4 |     | {displ4,%[1.reg],tostring(%[1.num])}  | |
 
 MOVES:
-(CONST %[num]==0, source1,     "clrb\t%[2]",           (2,4)+%[2])
-(CONST %[num]==0, source2,     "clrw\t%[2]",           (2,4)+%[2])
-(CONST %[num]==0, source4,     "clrl\t%[2]"
+(CONST %[num]==0,source1,      "clrb\t%[2]",           (2,4)+%[2])
+(CONST %[num]==0,source2,      "clrw\t%[2]",           (2,4)+%[2])
+(CONST %[num]==0,source4,      "clrl\t%[2]"
                                setcc(%[2]),            (2,4)+%[2])
-(CONST %[num]<0 && ufit(0-%[num],6), source2,
+(CONST %[num]<0 && ufit(0-%[num],6),source2,
                                "mnegw\t$$%(0-%[1.num]%),%[2]"
                                setcc(%[2]),            (2,4)+%[2])
-(CONST ufit(%[num],8) && !ufit(%[num],6), source2,
+(CONST ufit(%[num],8) && !ufit(%[num],6),source2,
                                "movzbw\t%[1],%[2]"
                                setcc(%[2]),            (2,4)+%[2])
-(CONST sfit(%[num],8) && !ufit(%[num],6), source2,
+(CONST sfit(%[num],8) && !ufit(%[num],6),source2,
                                "cvtbw\t%[1],%[2]"
                                setcc(%[2]),            (2,4)+%[2])
-(CONST %[num]<0 && ufit(0-%[num],6), source4,
+(CONST %[num]<0 && ufit(0-%[num],6),source4,
                                "mnegl\t$$%(0-%[1.num]%),%[2]"
                                setcc(%[2]),            (2,4)+%[2])
-(CONST ufit(%[num],8) && !ufit(%[num],6), source4,
+(CONST ufit(%[num],8) && !ufit(%[num],6),source4,
                                "movzbl\t%[1],%[2]"
                                setcc(%[2]),            (2,4)+%[2])
-(CONST sfit(%[num],8) && !ufit(%[num],6), source4,
+(CONST sfit(%[num],8) && !ufit(%[num],6),source4,
                                "cvtbl\t%[1],%[2]"
                                setcc(%[2]),            (2,4)+%[2])
-(CONST ufit(%[num],16) && !ufit(%[num],6), source4,
+(CONST ufit(%[num],16) && !ufit(%[num],6),source4,
                                "movzwl\t%[1],%[2]"
                                setcc(%[2]),            (2,4)+%[2])
-(CONST sfit(%[num],16) && !ufit(%[num],6), source4,
+(CONST sfit(%[num],16) && !ufit(%[num],6),source4,
                                "cvtwl\t%[1],%[2]"
                                setcc(%[2]),            (2,4)+%[2])
-(CONST8 %[ind]=="0", source8,  "clrq\t%[2]"
+(CONST8 %[ind]=="0",source8,   "clrq\t%[2]"
                                setcc(%[2]),            (2,4)+%[2])
-(FCONST8 %[num]==0, source8,   "clrq\t%[2]"
+(FCONST8 %[num]==0,source8,    "clrq\t%[2]"
                                setcc(%[2]),            (2,4)+%[2])
-(FCONST8, source8,             "movd\t%[1],%[2]"
+(FCONST8,source8,              "movd\t%[1],%[2]"
                                setcc(%[2]),            (3,4)+%[1]+%[2])
 #ifdef REGVARS
 /* Tokens with side effects should not be remembered. */
@@ -3950,35 +4535,35 @@ MOVES:
 (reginc8+regdec8,reg8,         "movq\t%[1],%[2]"
                                setcc(%[2]) erase(%[2]),(3,7)+%[1])
 #endif REGVARS
-(source8, source8,             "movq\t%[1],%[2]"
+(source8,source8,              "movq\t%[1],%[2]"
                                setcc(%[2]),            (3,4)+%[1]+%[2])
-(source4, source4,             "movl\t%[1],%[2]"
+(source4,source4,              "movl\t%[1],%[2]"
                                setcc(%[2]),            (3,4)+%[1]+%[2])
-(source2, source2,             "movw\t%[1],%[2]"
+(source2,source2,              "movw\t%[1],%[2]"
                                setcc(%[2]),            (3,4)+%[1]+%[2])
-(source1, source1,             "movb\t%[1],%[2]"
+(source1,source1,              "movb\t%[1],%[2]"
                                setcc(%[2]),            (3,4)+%[1]+%[2])
-(source1, source2,             "movzbw\t%[1],%[2]"
+(source1,source2,              "movzbw\t%[1],%[2]"
                                setcc(%[2]),            (3,4)+%[1]+%[2])
-(source1, source4,             "movzbl\t%[1],%[2]"
+(source1,source4,              "movzbl\t%[1],%[2]"
                                setcc(%[2]),            (3,4)+%[1]+%[2])
-(source2, source4,             "movzwl\t%[1],%[2]"
+(source2,source4,              "movzwl\t%[1],%[2]"
                                setcc(%[2]),            (3,4)+%[1]+%[2])
-(source2, source1,             "cvtwb\t%[1],%[2]"
+(source2,source1,              "cvtwb\t%[1],%[2]"
                                setcc(%[2]),            (3,4)+%[1]+%[2])
-(source4, source1,             "cvtlb\t%[1],%[2]"
+(source4,source1,              "cvtlb\t%[1],%[2]"
                                setcc(%[2]),            (3,4)+%[1]+%[2])
-(source4, source2,             "cvtlw\t%[1],%[2]"
+(source4,source2,              "cvtlw\t%[1],%[2]"
                                setcc(%[2]),            (3,4)+%[1]+%[2])
-(aind1, source4,               "movab\t%[1],%[2]"
+(aind1,source4,                "movab\t%[1],%[2]"
                                setcc(%[2]),            (3,4)+%[1]+%[2])
-(aind2, source4,               "movaw\t%[1],%[2]"
+(aind2,source4,                "movaw\t%[1],%[2]"
                                setcc(%[2]),            (3,4)+%[1]+%[2])
-(aind4, source4,               "moval\t%[1],%[2]"
+(aind4,source4,                "moval\t%[1],%[2]"
                                setcc(%[2]),            (3,4)+%[1]+%[2])
-(aind8, source4,               "movaq\t%[1],%[2]"
+(aind8,source4,                "movaq\t%[1],%[2]"
                                setcc(%[2]),            (3,4)+%[1]+%[2])
-(nonexist1, source4,           "movab\t%[1],%[2]"
+(nonexist1,source4,            "movab\t%[1],%[2]"
                                setcc(%[2]),            (3,4)+%[1]+%[2])
 TESTS:
 (source1,      "tstb\t%[1]"             ,(2,4) + %[1])
@@ -3987,30 +4572,30 @@ TESTS:
 
 STACKS:
 
-(CONST %[num]==0, ,
+(CONST %[num]==0,,
                "clrl\t-(sp)",          (2,7))
-(CONST %[num]<0 && ufit(0-%[num],6), ,
+(CONST %[num]<0 && ufit(0-%[num],6),,
                "mnegl\t$$%(0-%[1.num]%),-(sp)",
                                        (2,7) + %[1])
-(CONST ufit(%[num],6), ,
+(CONST ufit(%[num],6),,
                "pushl\t%[1]",          (2,7) + %[1])
-(CONST8 %[ind]=="0", ,
+(CONST8 %[ind]=="0",,
                "clrq\t-(sp)",          (2,10))
-(CONST sfit(%[num],8), ,
+(CONST sfit(%[num],8),,
                "cvtbl\t%[1],-(sp)",    (3,7) + %[1])
-(source1, ,    "movzbl\t%[1],-(sp)",   (3,7) + %[1])
-(CONST sfit(%[num],16), ,
+(source1,    "movzbl\t%[1],-(sp)",   (3,7) + %[1])
+(CONST sfit(%[num],16),,
                "cvtwl\t%[1],-(sp)",    (3,7) + %[1])
-(source2, ,    "movzwl\t%[1],-(sp)",   (3,7) + %[1])
-(source4, ,    "pushl\t%[1]"
+(source2,    "movzwl\t%[1],-(sp)",   (3,7) + %[1])
+(source4,    "pushl\t%[1]"
                setcc(%[1]),            (2,7) + %[1])
-(source8, ,    "movq\t%[1],-(sp)"
+(source8,    "movq\t%[1],-(sp)"
                setcc(%[1]),            (3,10)+ %[1])
-(nonexist1, ,  "pushal\t%[1]",         (2,7) + %[1])
-(FCONST8 %[num]==0, ,
+(nonexist1,  "pushal\t%[1]",         (2,7) + %[1])
+(FCONST8 %[num]==0,,
                "clrq\t-(sp)",          (2,10))
-(FCONST8, ,    "movd\t%[1],-(sp)",     (3,10) + %[1])
-(aind1, ,      "pushab\t%[1]",         (2,7) + %[1])
-(aind2, ,      "pushaw\t%[1]",         (2,7) + %[1])
-(aind4, ,      "pushal\t%[1]",         (2,7) + %[1])
-(aind8, ,      "pushaq\t%[1]",         (2,7) + %[1])
+(FCONST8,    "movd\t%[1],-(sp)",     (3,10) + %[1])
+(aind1,      "pushab\t%[1]",         (2,7) + %[1])
+(aind2,      "pushaw\t%[1]",         (2,7) + %[1])
+(aind4,      "pushal\t%[1]",         (2,7) + %[1])
+(aind8,      "pushaq\t%[1]",         (2,7) + %[1])