Fix a goof originally discovered in the vax compiler -- in an assignment,
[unix-history] / usr / src / old / pcc / ccom.tahoe / table.c
index 7b55c68..dedecf2 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)table.c    1.5 (Berkeley) %G%";
+static char sccsid[] = "@(#)table.c    1.22 (Berkeley) %G%";
 #endif
 
 # include "pass2.h"
 #endif
 
 # include "pass2.h"
@@ -14,6 +14,7 @@ static char sccsid[] = "@(#)table.c   1.5 (Berkeley) %G%";
 
 struct optab  table[] = {
 
 
 struct optab  table[] = {
 
+#ifdef REG_CHAR
 PCONV, INAREG|INTAREG,
        SAREG|AWD,      TCHAR|TSHORT,
        SANY,   TPOINT,
 PCONV, INAREG|INTAREG,
        SAREG|AWD,      TCHAR|TSHORT,
        SANY,   TPOINT,
@@ -25,6 +26,7 @@ PCONV,        INAREG|INTAREG,
        SANY,   TPOINT,
                NAREG|NASL,     RESC1,
                "       movzZLl AL,A1\n",
        SANY,   TPOINT,
                NAREG|NASL,     RESC1,
                "       movzZLl AL,A1\n",
+#endif
 
        /* the following entry is to fix a problem with
           the manner that the first pass handles the
 
        /* the following entry is to fix a problem with
           the manner that the first pass handles the
@@ -35,6 +37,25 @@ PCONV,       INAREG|INTAREG,
                NAREG|NASL,     RLEFT,
                "",
 
                NAREG|NASL,     RLEFT,
                "",
 
+/* take care of redundant conversions introduced by reclaim() */
+SCONV, INAREG|INTAREG,
+       STAREG, TWORD,
+       SANY,   TWORD,
+               0,      RLEFT,
+               "",
+
+SCONV, INAREG|INTAREG,
+       SAREG|AWD,      ANYFIXED,
+       SANY,   ANYFIXED,
+               NAREG|NASL,     RESC1,
+               "       ZU\n",
+
+SCONV, FORCC,
+       SAREG|AWD,      ANYFIXED,
+       SANY,   ANYFIXED,
+               NAREG|NASL,     RESCC,
+               "       ZV\n",
+
 SCONV, INAREG|INTAREG|FORCC,
        SAREG|AWD,      TDOUBLE,
        SANY,   TFLOAT,
 SCONV, INAREG|INTAREG|FORCC,
        SAREG|AWD,      TDOUBLE,
        SANY,   TFLOAT,
@@ -48,28 +69,31 @@ SCONV,      INAREG|INTAREG|FORCC,
                "       ldfd    AL\n    std     A1\n",
 
 SCONV, INAREG|INTAREG|FORCC,
                "       ldfd    AL\n    std     A1\n",
 
 SCONV, INAREG|INTAREG|FORCC,
-       SAREG|AWD,      TINT|TUNSIGNED,
+       SAREG|AWD,      TINT,
        SANY,   TFLOAT|TDOUBLE,
                NAREG|NASL,     RESC1|RESCC,
                "       cvlZR   AL\n    stZR    TA1\n",
 
        SANY,   TFLOAT|TDOUBLE,
                NAREG|NASL,     RESC1|RESCC,
                "       cvlZR   AL\n    stZR    TA1\n",
 
+/* the hard stuff */
+/* XXX how about TUCHAR|TUSHORT to TFLOAT|TDOUBLE? */
 SCONV, INAREG|INTAREG|FORCC,
 SCONV, INAREG|INTAREG|FORCC,
-       SAREG|AWD,      TFLOAT|TDOUBLE,
-       SANY,   ANYFIXED,
+       SAREG|AWD,      TUNSIGNED,
+       SANY,   TFLOAT|TDOUBLE,
                NAREG|NASL,     RESC1|RESCC,
                NAREG|NASL,     RESC1|RESCC,
-               "       ldZL    AL\n    cvZLl   A1\n",
+               "       ZY\n",
 
 
-SCONV, INAREG|INTAREG,
-       SAREG|AWD,      ANYFIXED,
-       SANY,   ANYFIXED,
+SCONV, INAREG|INTAREG|FORCC,
+       SAREG|AWD,      TFLOAT|TDOUBLE,
+       SANY,   ANYUSIGNED,
                NAREG|NASL,     RESC1|RESCC,
                NAREG|NASL,     RESC1|RESCC,
-               "ZU",
+               "       ZW\n",
 
 
+/* XXX need to trim significance here? */
 SCONV, INAREG|INTAREG|FORCC,
 SCONV, INAREG|INTAREG|FORCC,
-       SAREG|AWD,      ANYFIXED,
-       SANY,   ANYFIXED,
+       SAREG|AWD,      TFLOAT|TDOUBLE,
+       SANY,   ANYSIGNED,
                NAREG|NASL,     RESC1|RESCC,
                NAREG|NASL,     RESC1|RESCC,
-               "ZV",
+               "       ldZL    AL\n    cvZLl   A1\n",
 
 INIT,  FOREFF,
        SCON,   TANY,
 
 INIT,  FOREFF,
        SCON,   TANY,
@@ -89,6 +113,7 @@ INIT,        FOREFF,
                0,      RNOP,
                "       .byte   CL\n",
 
                0,      RNOP,
                "       .byte   CL\n",
 
+#ifdef FORT
        /* for the use of fortran only */
 
 GOTO,  FOREFF,
        /* for the use of fortran only */
 
 GOTO,  FOREFF,
@@ -96,6 +121,7 @@ GOTO,        FOREFF,
        SANY,   TANY,
                0,      RNOP,
                "       jbr     CL\n",
        SANY,   TANY,
                0,      RNOP,
                "       jbr     CL\n",
+#endif
 
 GOTO,  FOREFF,
        AWD,    TANY,
 
 GOTO,  FOREFF,
        AWD,    TANY,
@@ -145,39 +171,60 @@ OPLOG,    FORCC,
                0,      RESCC,
                "       cmpl    AL,AR\nZP",
 
                0,      RESCC,
                "       cmpl    AL,AR\nZP",
 
+/* more grot: constants in unsigned char/short comparisons sign-extend */
+/* optim2() ensures that SCCON/SSCON iff high bit is not set */
+OPLOG, FORCC,
+       SAREG|AWD,      TUCHAR,
+       SCCON,  TANY,
+               0,      RESCC,
+               "       cmpZL   AL,AR\nZP",
+
+OPLOG, FORCC,
+       AWD,            TUCHAR,
+       SCON,   TANY,
+               NAREG,  RESCC,
+               "       movzZLl AL,A1\n cmpl    A1,AR\nZP",
+
+OPLOG, FORCC,
+       SAREG|AWD,      TUSHORT,
+       SSCON,  TANY,
+               0,      RESCC,
+               "       cmpZL   AL,AR\nZP",
+
 OPLOG, FORCC,
        AWD,            TUSHORT,
        SCON,   TANY,
                NAREG,  RESCC,
 OPLOG, FORCC,
        AWD,            TUSHORT,
        SCON,   TANY,
                NAREG,  RESCC,
-               "       movzwl  AL,A1\n cmpw    A1,AR\nZP",
+               "       movzZLl AL,A1\n cmpl    A1,AR\nZP",
 
 
+/* optim2() handles degenerate comparisons with constants */
 OPLOG, FORCC,
 OPLOG, FORCC,
-       SAREG|AWD,      TSHORT|TUSHORT,
+       SAREG|AWD,      TCHAR|TSHORT,
        SCON,   TANY,
                0,      RESCC,
        SCON,   TANY,
                0,      RESCC,
-               "       cmpw    AL,ZZ\nZP",
+               "       cmpZL   AL,AR\nZP",
 
 OPLOG, FORCC,
 
 OPLOG, FORCC,
-       SAREG|AWD,      TSHORT|TUSHORT,
-       SAREG|AWD,      TSHORT|TUSHORT,
+       SAREG|AWD,      TSHORT,
+       SAREG|AWD,      TSHORT,
                0,      RESCC,
                "       cmpw    AL,AR\nZP",
 
 OPLOG, FORCC,
                0,      RESCC,
                "       cmpw    AL,AR\nZP",
 
 OPLOG, FORCC,
-       AWD,            TUCHAR,
-       SCON,           TANY,
-               NAREG,  RESCC,
-               "       movzbl  AL,A1\n cmpb    A1,AR\nZP",
+       SAREG|AWD,      TUSHORT,
+       SAREG|AWD,      TUSHORT,
+               0,      RESCC,
+               "       cmpw    AL,AR\nZP",
 
 OPLOG, FORCC,
 
 OPLOG, FORCC,
-       SAREG|AWD,      TCHAR|TUCHAR,
-       SCON,   TANY,
+       SAREG|AWD,      TCHAR,
+       SAREG|AWD,      TCHAR,
                0,      RESCC,
                0,      RESCC,
-               "       cmpb    AL,ZZ\nZP",
+               "       cmpb    AL,AR\nZP",
 
 OPLOG, FORCC,
 
 OPLOG, FORCC,
-       SAREG|AWD,      TCHAR|TUCHAR,
-       SAREG|AWD,      TCHAR|TUCHAR,
+       SAREG|AWD,      TUCHAR,
+       SAREG|AWD,      TUCHAR,
                0,      RESCC,
                "       cmpb    AL,AR\nZP",
 
                0,      RESCC,
                "       cmpb    AL,AR\nZP",
 
@@ -199,6 +246,22 @@ OPLOG,     FORCC,
                0,      RESCC,
                "       cmpZL2  AL,AR\nZP",
 
                0,      RESCC,
                "       cmpZL2  AL,AR\nZP",
 
+#ifdef FORT
+/* some implicit conversions made explicit to help f77 out (sigh) */
+OPLOG, FORCC,
+       SAREG|AWD,      TFLOAT,
+       SAREG|AWD,      TDOUBLE,
+               0,      RESCC,
+               "       ldfd    AL\n    cmpd    AR\nZP",
+
+/* ought to flip this comparison, save an instruction */
+OPLOG, FORCC,
+       SAREG|AWD,      TDOUBLE,
+       SAREG|AWD,      TFLOAT,
+               NAREG|NEVEN|NASR,       RESCC,
+               "       ldfd    AR\n    std     A1\n    cmpd2   AL,A1\nZP",
+#endif
+
 CCODES,        INAREG|INTAREG,
        SANY,   TANY,
        SANY,   TANY,
 CCODES,        INAREG|INTAREG,
        SANY,   TANY,
        SANY,   TANY,
@@ -272,54 +335,40 @@ OPSHFT,   INAREG|INTAREG|FORCC,
                "       ZB      AR,A1\n ZH      A1,AL,A1\n",
 
 INCR,  FOREFF,
                "       ZB      AR,A1\n ZH      A1,AL,A1\n",
 
 INCR,  FOREFF,
-       AWD,    TWORD,
-       SCON,   TANY,
-               0,      RLEFT,
-               "       ZE\n",
-
-DECR,  FOREFF,
-       AWD,    TWORD,
-       SCON,   TANY,
-               0,      RLEFT,
-               "       ZE\n",
-
-INCR,  FOREFF,
-       SAREG,  TWORD,
-       SCON,   TANY,
+       SAREG|AWD,      TANY,
+       SCON|SNAME,     TANY,
                0,      RLEFT,
                "       ZE\n",
 
 DECR,  FOREFF,
                0,      RLEFT,
                "       ZE\n",
 
 DECR,  FOREFF,
-       SAREG,  TWORD,
-       SCON,   TANY,
+       SAREG|AWD,      TANY,
+       SCON|SNAME,     TANY,
                0,      RLEFT,
                "       ZE\n",
 
                0,      RLEFT,
                "       ZE\n",
 
-/* jwf INCR and DECR for SAREG TCHAR|TSHORT matched by ASG PLUS etc */
-
 INCR,  INAREG|INTAREG,
 INCR,  INAREG|INTAREG,
-       AWD,    TANY,
-       SCON,   TANY,
+       SAREG|AWD,      TANY,
+       SCON|SNAME,     TANY,
                NAREG,  RESC1,
                "       ZD\n",
 
 DECR,  INAREG|INTAREG,
                NAREG,  RESC1,
                "       ZD\n",
 
 DECR,  INAREG|INTAREG,
-       AWD,    TANY,
-       SCON,   TANY,
+       SAREG|AWD,      TANY,
+       SCON|SNAME,     TANY,
                NAREG,  RESC1,
                "       ZD\n",
 
                NAREG,  RESC1,
                "       ZD\n",
 
-INCR,  INAREG|INTAREG,
-       SAREG,  TWORD,
-       SCON,   TANY,
-               NAREG,  RESC1,
-               "       ZD\n",
+ASSIGN,        INAREG|FOREFF,
+       SAREG|AWD,      ANYFIXED,
+       SAREG|AWD,      ANYFIXED,
+               0,      RLEFT,
+               "       ZU\n",
 
 
-DECR,  INAREG|INTAREG,
-       SAREG,  TWORD,
-       SCON,   TANY,
-               NAREG,  RESC1,
-               "       ZD\n",
+ASSIGN,        FORCC,
+       SAREG|AWD,      ANYFIXED,
+       SAREG|AWD,      ANYFIXED,
+               0,      RESCC,
+               "       ZV\n",
 
 ASSIGN,        INAREG|FOREFF|FORCC,
        SIREG,  TDOUBLE,
 
 ASSIGN,        INAREG|FOREFF|FORCC,
        SIREG,  TDOUBLE,
@@ -351,6 +400,18 @@ ASSIGN,    INAREG|FOREFF|FORCC,
                0,      RLEFT|RRIGHT|RESCC,
                "       movl    UR,UL\n movl    AR,AL\n",
 
                0,      RLEFT|RRIGHT|RESCC,
                "       movl    UR,UL\n movl    AR,AL\n",
 
+ASSIGN,        INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TDOUBLE,
+       STARNM, TDOUBLE,
+               0,      RLEFT|RRIGHT|RESCC,
+               "       ldd     AR\n    std     AL\n",
+
+ASSIGN,        INAREG|FOREFF|FORCC,
+       STARNM, TDOUBLE,
+       SAREG|AWD,      TDOUBLE,
+               0,      RLEFT|RRIGHT|RESCC,
+               "       ldd     AR\n    std     AL\n",
+
 ASSIGN,        INAREG|FOREFF|FORCC,
        SAREG|AWD,      TFLOAT,
        SZERO,  TANY,
 ASSIGN,        INAREG|FOREFF|FORCC,
        SAREG|AWD,      TFLOAT,
        SZERO,  TANY,
@@ -364,10 +425,60 @@ ASSIGN,   INAREG|FOREFF|FORCC,
                "       movl    AR,TAL\n",
 
 ASSIGN,        INAREG|FOREFF|FORCC,
                "       movl    AR,TAL\n",
 
 ASSIGN,        INAREG|FOREFF|FORCC,
-       SAREG|AWD,      ANYFIXED,
-       SAREG|AWD,      ANYFIXED,
-               0,      RLEFT|RRIGHT|RESCC,
-               "       ZA\n",
+       SAREG|AWD,      TFLOAT,
+       SAREG|AWD,      TDOUBLE,
+               0,      RLEFT|RESCC,
+               "       ldd     AR\n    cvdf\n  stf     AL\n",
+
+ASSIGN,        INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TDOUBLE,
+       SAREG|AWD,      TFLOAT,
+               0,      RLEFT|RESCC,
+               "       ldfd    AR\n    std     AL\n",
+
+ASSIGN,        INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TFLOAT|TDOUBLE,
+       SAREG|AWD,      TINT,
+               0,      RLEFT|RESCC,
+               "       cvlZL   AR\n    stZL    AL\n",
+
+/* XXX need to trim significance here? */
+ASSIGN,        INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TINT,
+       SAREG|AWD,      TFLOAT|TDOUBLE,
+               0,      RLEFT|RESCC,
+               "       ldZR    AR\n    cvZRl   AL\n",
+
+/* unfortunately assignments are exempt from type balancing */
+ASSIGN,        INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TCHAR|TUCHAR|TSHORT|TUSHORT,
+       SAREG|AWD,      TFLOAT|TDOUBLE,
+               NAREG|NASR,     RLEFT|RESCC,
+               "       ldZR    AR\n    cvZRl   A1\n    cvtlZL  A1,AL\n",
+
+ASSIGN,        INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TFLOAT|TDOUBLE,
+       SAREG|AWD,      TCHAR|TSHORT,
+               NAREG|NASR,     RLEFT|RESCC,
+               "       cvtZRl  AR,A1\n cvlZL   A1\n    stZL    AL\n",
+
+ASSIGN,        INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TFLOAT|TDOUBLE,
+       SAREG|AWD,      TUCHAR|TUSHORT,
+               NAREG|NASR,     RLEFT|RESCC,
+               "       movzZRl AR,A1\n cvlZL   A1\n    stZL    AL\n",
+
+ASSIGN, INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TUNSIGNED,
+       SAREG|AWD,      TFLOAT|TDOUBLE,
+               0,      RLEFT,
+               "       ZW\n",
+
+ASSIGN, INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TFLOAT|TDOUBLE,
+       SAREG|AWD,      TUNSIGNED,
+               0,      RLEFT,
+               "       ZY\n",
 
 ASSIGN,        INAREG|FOREFF,
        SFLD,   TANY,
 
 ASSIGN,        INAREG|FOREFF,
        SFLD,   TANY,
@@ -375,19 +486,32 @@ ASSIGN,   INAREG|FOREFF,
                0,      RRIGHT,
                "       andl2   N,AL\n",
 
                0,      RRIGHT,
                "       andl2   N,AL\n",
 
-ASSIGN,        INAREG|FOREFF,
+ASSIGN,        FOREFF,
        SFLD,   TANY,
        SCON,   TANY,
        SFLD,   TANY,
        SCON,   TANY,
-               0,      RRIGHT,
+               0,      RNOP,
                "       andl2   N,AL\n  orl2    ZF,AL\n",
 
                "       andl2   N,AL\n  orl2    ZF,AL\n",
 
-ASSIGN,        INAREG|FOREFF,
+ASSIGN,        INAREG,
+       SFLD,   TANY,
+       SCON,   TANY,
+               NAREG,  RESC1,
+               "       andl2   N,AL\n  orl2    ZF,AL\n ZI\n",
+
+ASSIGN,        FOREFF,
        SFLD,   TANY,
        SAREG|AWD,      TWORD,
        SFLD,   TANY,
        SAREG|AWD,      TWORD,
-               NAREG|NASL,     RRIGHT,
+               NAREG|NASR,     RNOP,
                "       shll    $H,AR,A1\n      andl2   M,A1\n  andl2   N,AL\n\
        orl2    A1,AL\n",
 
                "       shll    $H,AR,A1\n      andl2   M,A1\n  andl2   N,AL\n\
        orl2    A1,AL\n",
 
+ASSIGN,        INAREG,
+       SFLD,   TANY,
+       SAREG|AWD,      TWORD,
+               NAREG,  RESC1,
+               "       shll    $H,AR,A1\n      andl2   M,A1\n  andl2   N,AL\n\
+       orl2    A1,AL\n ZI\n",
+
 /* dummy UNARY MUL entry to get U* to possibly match OPLTYPE */
 UNARY MUL,     FOREFF,
        SCC,    TANY,
 /* dummy UNARY MUL entry to get U* to possibly match OPLTYPE */
 UNARY MUL,     FOREFF,
        SCC,    TANY,
@@ -419,6 +543,18 @@ REG,       FORARG,
                0,      RNULL,
                "       pushl   UR\n    pushl   AR\n",
 
                0,      RNULL,
                "       pushl   UR\n    pushl   AR\n",
 
+OREG,  INTEMP,
+       SANY,   TANY,
+       SOREG,  TDOUBLE,
+               2*NTEMP,        RESC1,
+               "       movl    UR,U1\n movl    AR,A1\n",
+
+OREG,  INTEMP,
+       SANY,   TANY,
+       SOREG,  TANY,
+               NTEMP,  RESC1,
+               "       movl    AR,A1\n",
+
 OPLEAF,        FOREFF,
        SANY,   TANY,
        SAREG|AWD,      TANY,
 OPLEAF,        FOREFF,
        SANY,   TANY,
        SAREG|AWD,      TANY,
@@ -443,6 +579,12 @@ OPLTYPE,   INAREG|INTAREG,
                NAREG,          RESC1,
                "       movl    AR,A1\n movl    UR,U1\n",
 
                NAREG,          RESC1,
                "       movl    AR,A1\n movl    UR,U1\n",
 
+OPLTYPE,       INAREG|INTAREG,
+       SANY,   TANY,
+       STARNM, TDOUBLE,
+               NAREG|NASR,     RESC1,
+               "       ldd     AR\n    std     A1\n",
+
 OPLTYPE,       INAREG|INTAREG,
        SANY,   TANY,
        SZERO,  TANY,
 OPLTYPE,       INAREG|INTAREG,
        SANY,   TANY,
        SZERO,  TANY,
@@ -459,13 +601,7 @@ OPLTYPE,   INAREG|INTAREG,
        SANY,   TANY,
        SANY,   ANYFIXED,
                NAREG|NASR,     RESC1,
        SANY,   TANY,
        SANY,   ANYFIXED,
                NAREG|NASR,     RESC1,
-               "       ZA\n",
-
-OPLTYPE,       FORCC,
-       SANY,   TANY,
-       SIREG,  TDOUBLE,
-               0,      RESCC,
-               "       ldd     AR\n    tstd\n",
+               "       ZU\n",
 
 OPLTYPE,       FORCC,
        SANY,   TANY,
 
 OPLTYPE,       FORCC,
        SANY,   TANY,
@@ -517,10 +653,16 @@ OPLTYPE,  FORARG,
 
 OPLTYPE,       FORARG,
        SANY,   TANY,
 
 OPLTYPE,       FORARG,
        SANY,   TANY,
-       SAREG|AWD,      TDOUBLE,
+       SAREG|SNAME|SOREG,      TDOUBLE,
                0,      RNULL,
                "       pushl   UR\n    pushl   AR\n",
 
                0,      RNULL,
                "       pushl   UR\n    pushl   AR\n",
 
+OPLTYPE,       FORARG,
+       SANY,   TANY,
+       STARNM, TDOUBLE,
+               0,      RNULL,
+               "       ldd     AR\n    pushd\n",
+
 OPLTYPE,       FORARG,
        SANY,   TANY,
        SAREG|AWD,      TFLOAT,
 OPLTYPE,       FORARG,
        SANY,   TANY,
        SAREG|AWD,      TFLOAT,
@@ -549,7 +691,7 @@ COMPL,      INAREG|INTAREG|FORCC,
        SAREG|AWD,      ANYFIXED,
        SANY,   TANY,
                NAREG|NASL,     RESC1|RESCC,
        SAREG|AWD,      ANYFIXED,
        SANY,   TANY,
                NAREG|NASL,     RESC1|RESCC,
-               "       cvtZLl  AL,A1\n mcoml   A1,A1\n",
+               "       movzZLl AL,A1\n mcoml   A1,A1\n",
 
 AND,   FORCC,
        SAREG|AWD,      TWORD,
 
 AND,   FORCC,
        SAREG|AWD,      TWORD,
@@ -581,72 +723,66 @@ AND,      FORCC,
                0,      RESCC,
                "       bitb    AR,AL\n",
 
                0,      RESCC,
                "       bitb    AR,AL\n",
 
-ASG DIV,       INAREG|FOREFF|FORCC, /* should have been done in mip */
-       SAREG|AWD,      ANYFIXED,
-       SONE,   TWORD,
-               0,      RLEFT|RESCC,
-               "       tstZL   AL\n",
+/* General cases for DIV and ASG DIV are handled below with OPMUL */
+/* Some special cases are handled in optim2() */
 
 
-ASG DIV,       INAREG|FOREFF|FORCC,
-       SAREG|AWD,      TUCHAR|TUSHORT,
-       SAREG|AWD,      TUCHAR|TUSHORT,
-               2*NAREG,        RLEFT|RESC1|RESCC,
-               "ZX     OL2     A2,A1\n cvtlZL  A1,AL\n",
+DIV,   INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TUNSIGNED|TULONG,
+       SCON,   ANYUSIGNED,
+               NAREG|NEVEN,    RESC1|RESCC,
+               "       movl    AL,U1\n clrl    A1\n    ediv    AR,A1,A1,U1\n",
 
 ASG DIV,       INAREG|FOREFF|FORCC,
 
 ASG DIV,       INAREG|FOREFF|FORCC,
-       SAREG|AWD,      TWORD,
-       SAREG|AWD,      TUNSIGNED,
-               3*NAREG|NEVEN,  RLEFT|RESCC,
-               "ZM     OE      AR,A1,A2,A3\n   movl    A2,AL\n",
-
-DIV,   INAREG|INTAREG|FORCC,
-       SAREG|AWD,      TUCHAR|TUSHORT,
-       SAREG|AWD,      TUCHAR|TUSHORT,
-               2*NAREG,        RESC1|RESCC,
-               "ZX     OL2     A2,A1\n",       
+       SAREG|AWD,      TINT|TLONG|TUNSIGNED|TULONG,
+       SMCON,  ANYUSIGNED,
+               0,      RLEFT|RESCC,
+               "       ZJ\n",
 
 
-DIV,   INAREG|INTAREG|FORCC,
-       SAREG|AWD,      TWORD,
-       SAREG|AWD,      TUNSIGNED,
-               3*NAREG|NEVEN,  RESC2|RESCC,
-               "ZM     OE      AR,A1,A2,A3\n",
+ASG DIV,       INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TINT|TLONG|TUNSIGNED|TULONG,
+       SCON,   ANYUSIGNED,
+               NAREG|NEVEN,    RLEFT|RESCC,
+               "       movl    AL,U1\n clrl    A1\n    ediv    AR,A1,AL,U1\n",
 
 
+MOD,   INAREG|INTAREG,
+       SAREG|AWD,      TINT|TLONG,
+       SAREG|AWD,      TINT|TLONG,
+               NAREG|NEVEN,    RESC1,
+               "       ZM      ediv    AR,A1,U1,A1\n",
+
+MOD,   INAREG|FOREFF,
+       SAREG|AWD,      TUNSIGNED|TULONG,
+       SMCON,  ANYUSIGNED,
+               NAREG|NASL,     RLEFT|RESC1,
+               "       ZJ\n",
+
+MOD,   INAREG|FOREFF,
+       SAREG|AWD,      TUNSIGNED|TULONG,
+       SCON,   ANYUSIGNED,
+               NAREG|NEVEN,    RESC1,
+               "       movl    AL,U1\n clrl    A1\n    ediv    AR,A1,U1,A1\n",
+
+/* should only see UNSIGNED lhs here if converted from UCHAR/USHORT lhs */
+/* beware -- the ediv remainder operand must be a register */
 ASG MOD,       INAREG|FOREFF,
 ASG MOD,       INAREG|FOREFF,
-       SAREG|AWD,      ANYFIXED,
-       SONE,   TWORD,
-               0,      RLEFT,
-               "       clrZL   AL\n",
+       SAREG|AWD,      TINT|TLONG|TUNSIGNED|TULONG,
+       SAREG|AWD,      TINT|TLONG,
+               NAREG|NEVEN,    RLEFT|RESCC,
+               "       ZM      ediv    AR,A1,U1,A1\n   movl    A1,AL\n",
 
 
-MOD,   INAREG|INTAREG,
-       STAREG, TWORD,
-       SONE,   TWORD,
+ASG MOD,       INAREG|FOREFF,
+       SAREG|AWD,      TINT|TLONG|TUNSIGNED|TULONG,
+       SMCON,  ANYUSIGNED,
                0,      RLEFT,
                0,      RLEFT,
-               "       clrl    AL\n",
-
-MOD,   INAREG|INTAREG,
-       SAREG|AWD,      ANYFIXED,
-       SONE,   TWORD,
-               0,      RESC1,
-               "       clrl    A1\n",
+               "       ZJ\n",
 
 ASG MOD,       INAREG|FOREFF,
 
 ASG MOD,       INAREG|FOREFF,
-       SAREG|AWD,      TWORD,
-       SAREG|AWD,      TWORD,
-               3*NAREG|NEVEN,  RLEFT,
-               "ZM     OE      AR,A1,A2,A3\n   movl    A3,AL\n",
-
-MOD,   INAREG|INTAREG,
-       SAREG|AWD,      TWORD,
-       SAREG|AWD,      TWORD,
-               3*NAREG|NEVEN,  RESC3,
-               "ZM     OE      AR,A1,A2,A3\n",
-
-ASG MUL,       INAREG|FOREFF|FORCC,
-       SAREG|AWD,      TCHAR|TUCHAR,
-       SAREG|AWD,      TCHAR|TUCHAR,
-               2*NAREG,        RLEFT|RESCC,
-               "ZX     OL2     A2,A1\n cvtlb   A1,AL\n",
+       SAREG|AWD,      TINT|TLONG|TUNSIGNED|TULONG,
+       SCON,   ANYUSIGNED,
+               NAREG|NEVEN,    RLEFT,
+               "       movl    AL,U1\n clrl    A1\n    ediv    AR,A1,U1,A1\n   movl    A1,AL\n",
 
 
+/* XXX is this supposed to help on overflow? */
 ASG MUL,       INAREG|FOREFF|FORCC,
        SAREG|AWD,      TUNSIGNED,
        SAREG|AWD,      TUNSIGNED|TINT,
 ASG MUL,       INAREG|FOREFF|FORCC,
        SAREG|AWD,      TUNSIGNED,
        SAREG|AWD,      TUNSIGNED|TINT,
@@ -667,12 +803,6 @@ ASG OPMUL, INAREG|FOREFF|FORCC,
 
 MUL,   INAREG|INTAREG|FORCC,
        STAREG,         TUNSIGNED,
 
 MUL,   INAREG|INTAREG|FORCC,
        STAREG,         TUNSIGNED,
-       SAREG|AWD,      TUNSIGNED|TINT, 
-               NAREG|NEVEN,    RLEFT|RESCC,
-               "       emul    AR,AL,$0,A1\n   movl    U1,AL\n",
-
-MUL,   INAREG|INTAREG|FORCC,
-       STAREG,         TUNSIGNED|TINT,
        SAREG|AWD,      TUNSIGNED,
                NAREG|NEVEN,    RLEFT|RESCC,
                "       emul    AR,AL,$0,A1\n   movl    U1,AL\n",
        SAREG|AWD,      TUNSIGNED,
                NAREG|NEVEN,    RLEFT|RESCC,
                "       emul    AR,AL,$0,A1\n   movl    U1,AL\n",
@@ -683,20 +813,8 @@ OPMUL,     INAREG|INTAREG|FORCC,
                0,      RLEFT|RESCC,
                "       OL2     AR,AL\n",
 
                0,      RLEFT|RESCC,
                "       OL2     AR,AL\n",
 
-MUL,   INAREG|INTAREG|FORCC,
-       SAREG|AWD,      TCHAR|TUCHAR,
-       SAREG|AWD,      TCHAR|TUCHAR,
-               2*NAREG,        RESC1|RESCC,
-               "ZX     mull2   A2,A1\n",
-
 MUL,   INAREG|INTAREG|FORCC,
        SAREG|AWD,      TUNSIGNED,
 MUL,   INAREG|INTAREG|FORCC,
        SAREG|AWD,      TUNSIGNED,
-       SAREG|AWD,      TUNSIGNED|TINT, 
-               NAREG|NEVEN,    RESC1|RESCC,
-               "       emul    AR,AL,$0,A1\n   movl    U1,A1\n",
-
-MUL,   INAREG|INTAREG|FORCC,
-       SAREG|AWD,      TUNSIGNED|TINT,
        SAREG|AWD,      TUNSIGNED,
                NAREG|NEVEN,    RESC1|RESCC,
                "       emul    AR,AL,$0,A1\n   movl    U1,A1\n",
        SAREG|AWD,      TUNSIGNED,
                NAREG|NEVEN,    RESC1|RESCC,
                "       emul    AR,AL,$0,A1\n   movl    U1,A1\n",
@@ -707,6 +825,7 @@ OPMUL,      INAREG|INTAREG|FORCC,
                NAREG|NASL|NASR,        RESC1|RESCC,
                "       OL3     AR,AL,A1\n",
 
                NAREG|NASL|NASR,        RESC1|RESCC,
                "       OL3     AR,AL,A1\n",
 
+#ifdef REG_CHAR
 ASG PLUS,      INAREG|FOREFF|FORCC,
        SAREG,  TWORD,
        SONE,   TINT,
 ASG PLUS,      INAREG|FOREFF|FORCC,
        SAREG,  TWORD,
        SONE,   TINT,
@@ -730,6 +849,19 @@ ASG MINUS, INAREG|FOREFF|FORCC,
        SONE,   TINT,
                0,      RLEFT|RESCC,
                "       decZL   AL\n",
        SONE,   TINT,
                0,      RLEFT|RESCC,
                "       decZL   AL\n",
+#else
+ASG PLUS,       INAREG|FOREFF|FORCC,
+       SAREG|AWD,      ANYFIXED,
+       SONE,   TANY,
+               0,      RLEFT|RESCC,
+               "       incZL   AL\n",
+
+ASG MINUS,       INAREG|FOREFF|FORCC,
+       SAREG|AWD,      ANYFIXED,
+       SONE,   TANY,
+               0,      RLEFT|RESCC,
+               "       decZL   AL\n",
+#endif
 
 PLUS,  INAREG|INTAREG|FORCC,
        STAREG, TWORD,
 
 PLUS,  INAREG|INTAREG|FORCC,
        STAREG, TWORD,
@@ -827,6 +959,36 @@ ASG OPFLOAT,       INAREG|FOREFF|FORCC,
                0,      RLEFT|RESCC,
                "       ldd     AL\n    OD      AR\n    std     AL\n",
 
                0,      RLEFT|RESCC,
                "       ldd     AL\n    OD      AR\n    std     AL\n",
 
+ASG PLUS,      INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TDOUBLE,
+       SAREG|AWD,      TFLOAT,
+               NAREG|NASL,     RLEFT|RESCC,
+               "       ldfd    AR\n    OD      AL\n    std     AL\n",
+
+ASG MUL,       INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TDOUBLE,
+       SAREG|AWD,      TFLOAT,
+               NAREG|NASL,     RLEFT|RESCC,
+               "       ldfd    AR\n    OD      AL\n    std     AL\n",
+
+ASG OPFLOAT,   INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TDOUBLE,
+       SAREG|AWD,      TFLOAT,
+               NAREG|NASL,     RLEFT|RESCC,
+               "       ldfd    AR\n    std     A1\n    ldd     AL\n    OD      A1\n    std     AL\n",
+
+ASG OPFLOAT,   INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TFLOAT,
+       SAREG|AWD,      TDOUBLE,
+               0,      RLEFT|RESCC,
+               "       ldfd    AL\n    OD      AR\n    cvdf\n  stf     TAL\n",
+
+ASG OPFLOAT,   INAREG|FOREFF,
+       SAREG|AWD,      ANYFIXED,
+       SAREG|AWD,      TFLOAT|TDOUBLE,
+               NAREG,  RLEFT|RESCC,    /* usable() knows we may need a reg pair */
+               "       ZG\n",
+
 OPSIMP,        INAREG|INTAREG,
        SAREG,  TFLOAT|TDOUBLE,
        SZERO,  TANY,
 OPSIMP,        INAREG|INTAREG,
        SAREG,  TFLOAT|TDOUBLE,
        SZERO,  TANY,
@@ -844,13 +1006,25 @@ OPSIMP,  INAREG|INTAREG|FORCC,
                "       movl    AL,A1\n",
 
 OPSIMP,        INAREG|INTAREG|FORCC,
                "       movl    AL,A1\n",
 
 OPSIMP,        INAREG|INTAREG|FORCC,
-       AWD,    TDOUBLE,
+       SIREG,  TDOUBLE,
+       SZERO,  TANY,
+               NAREG,  RESC1|RESCC,
+               "       ldd     AL\n    std     A1\n",
+
+OPSIMP,        INAREG|INTAREG|FORCC,
+       SAREG|SNAME|SOREG,      TDOUBLE,
        SZERO,  TANY,
                NAREG,  RESC1|RESCC,
                "       movl    UL,U1\n movl    AL,A1\n",
 
 MUL,   INAREG|INTAREG|FORCC,
        SZERO,  TANY,
                NAREG,  RESC1|RESCC,
                "       movl    UL,U1\n movl    AL,A1\n",
 
 MUL,   INAREG|INTAREG|FORCC,
-       SAREG|AWD,      TDOUBLE,
+       SIREG,  TDOUBLE,
+       SZERO,  TANY,
+               NAREG|NASR,     RESC1|RESCC,
+               "       cvld    $0\n    std     A1\n",
+
+MUL,   INAREG|INTAREG|FORCC,
+       SAREG|SNAME|SOREG,      TDOUBLE,
        SZERO,  TANY,
                NAREG|NASR,     RESC1|RESCC,
                "       clrl    U1\n    clrl    A1\n",
        SZERO,  TANY,
                NAREG|NASR,     RESC1|RESCC,
                "       clrl    U1\n    clrl    A1\n",