date and time created 88/10/19 11:45:49 by bostic
[unix-history] / usr / src / old / pcc / ccom.vax / table.c
index 1765071..a3b01ce 100644 (file)
@@ -1,5 +1,8 @@
-static char *sccsid ="@(#)table.c      1.3 (Berkeley) %G%";
-# include "mfile2"
+#ifndef lint
+static char *sccsid ="@(#)table.c      1.33 (Berkeley) %G%";
+#endif lint
+
+# include "pass2.h"
 
 # define WPTR TPTRTO|TINT|TLONG|TFLOAT|TDOUBLE|TPOINT|TUNSIGNED|TULONG
 # define AWD SNAME|SOREG|SCON|STARNM|STARREG
 
 # define WPTR TPTRTO|TINT|TLONG|TFLOAT|TDOUBLE|TPOINT|TUNSIGNED|TULONG
 # define AWD SNAME|SOREG|SCON|STARNM|STARREG
@@ -13,18 +16,6 @@ static char *sccsid ="@(#)table.c    1.3 (Berkeley) %G%";
 
 struct optab  table[] = {
 
 
 struct optab  table[] = {
 
-PCONV, INAREG|INTAREG,
-       SAREG|AWD,      TCHAR|TSHORT,
-       SANY,   TPOINT,
-               NAREG|NASL,     RESC1,
-               "       cvtZLl  AL,A1\n",
-
-PCONV, INAREG|INTAREG,
-       SAREG|AWD,      TUCHAR|TUSHORT,
-       SANY,   TPOINT,
-               NAREG|NASL,     RESC1,
-               "       movzZLl AL,A1\n",
-
        /* the following entry is to fix a problem with
           the manner that the first pass handles the
           type of a shift expression                 */
        /* the following entry is to fix a problem with
           the manner that the first pass handles the
           type of a shift expression                 */
@@ -34,7 +25,7 @@ PCONV,        INAREG|INTAREG,
                NAREG|NASL,     RLEFT,
                "",
 
                NAREG|NASL,     RLEFT,
                "",
 
-#ifdef FORT
+#if defined(FORT) || defined(SPRECC)
 SCONV, INTAREG|FORCC,
        SAREG|AWD,      TDOUBLE,
        SANY,   TFLOAT,
 SCONV, INTAREG|FORCC,
        SAREG|AWD,      TDOUBLE,
        SANY,   TFLOAT,
@@ -42,23 +33,24 @@ SCONV,      INTAREG|FORCC,
                "       cvtdf   AL,A1\n",
 
 SCONV, INTAREG|FORCC,
                "       cvtdf   AL,A1\n",
 
 SCONV, INTAREG|FORCC,
-       SAREG|AWD,      ANYSIGNED|TUNSIGNED|TULONG|TFLOAT,
+       SAREG|AWD,      ANYSIGNED,
        SANY,   TFLOAT,
                NAREG|NASL,     RESC1|RESCC,
                "       cvtZLf  AL,TA1\n",
        SANY,   TFLOAT,
                NAREG|NASL,     RESC1|RESCC,
                "       cvtZLf  AL,TA1\n",
-
-SCONV, INTAREG|FORCC,
-       SAREG|AWD,      TUCHAR|TUSHORT,
-       SANY,   TFLOAT,
-               NAREG|NASL,     RESC1|RESCC,
-               "       movzZLl AL,A1\n cvtlf   A1,TA1\n",
 #endif
 
 #endif
 
-SCONV, INTAREG|FORCC,
-       SAREG|AWD,      TUCHAR|TUSHORT,
-       SANY,   TFLOAT|TDOUBLE,
-               NAREG|NASL,     RESC1|RESCC,
-               "       movzZLl AL,A1\n cvtld   A1,A1\n",
+/* take care of redundant conversions introduced by reclaim() */
+SCONV, INTAREG,
+       STAREG, TWORD,
+       SANY,   TWORD,
+               0,      RLEFT,
+               "",
+
+SCONV, INTAREG,
+       STAREG, TDOUBLE,
+       SANY,   TDOUBLE,
+               0,      RLEFT,
+               "",
 
 SCONV, INTAREG|FORCC,
        SAREG|AWD,      TANY,
 
 SCONV, INTAREG|FORCC,
        SAREG|AWD,      TANY,
@@ -66,6 +58,11 @@ SCONV,       INTAREG|FORCC,
                NAREG|NASL,     RESC1|RESCC,
                "       ZA\n",
 
                NAREG|NASL,     RESC1|RESCC,
                "       ZA\n",
 
+SCONV, FORARG,
+       SAREG|AWD,      TANY,
+       SANY,   TANY,
+               NAREG|NASL,     RNULL,
+               "       ZV\n",
 
 INIT,  FOREFF,
        SCON,   TANY,
 
 INIT,  FOREFF,
        SCON,   TANY,
@@ -85,6 +82,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,
@@ -92,9 +90,10 @@ GOTO,        FOREFF,
        SANY,   TANY,
                0,      RNOP,
                "       jbr     CL\n",
        SANY,   TANY,
                0,      RNOP,
                "       jbr     CL\n",
+#endif
 
 GOTO,  FOREFF,
 
 GOTO,  FOREFF,
-       AWD,    TANY,
+       SNAME|SOREG,    TANY,
        SANY,   TANY,
                0,      RNOP,
                "       jmp     *AL\n",
        SANY,   TANY,
                0,      RNOP,
                "       jmp     *AL\n",
@@ -160,29 +159,36 @@ OPLOG,    FORCC,
                "       cmpl    AL,AR\nZP",
 
 OPLOG, FORCC,
                "       cmpl    AL,AR\nZP",
 
 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,
-       SAREG|AWD,      TCHAR|TUCHAR,
-       SAREG|AWD,      TCHAR|TUCHAR,
+       SAREG|AWD,      TUSHORT,
+       SAREG|AWD,      TUSHORT,
                0,      RESCC,
                0,      RESCC,
-               "       cmpb    AL,AR\nZP",
+               "       cmpw    AL,AR\nZP",
 
 OPLOG, FORCC,
 
 OPLOG, FORCC,
-       SAREG|AWD,      TSHORT|TUSHORT,
-       SSCON,  TANY,
+       SAREG|AWD,      TCHAR,
+       SAREG|AWD,      TCHAR,
                0,      RESCC,
                0,      RESCC,
-               "       cmpw    AL,AR\nZP",
+               "       cmpb    AL,AR\nZP",
 
 OPLOG, FORCC,
 
 OPLOG, FORCC,
-       SAREG|AWD,      TCHAR|TUCHAR,
-       SCCON,  TANY,
+       SAREG|AWD,      TUCHAR,
+       SAREG|AWD,      TUCHAR,
                0,      RESCC,
                "       cmpb    AL,AR\nZP",
 
                0,      RESCC,
                "       cmpb    AL,AR\nZP",
 
+/* optim2() handles degenerate comparisons with constants */
+OPLOG, FORCC,
+       SAREG|AWD,      TCHAR|TUCHAR|TSHORT|TUSHORT,
+       SCON,   ANYFIXED,
+               0,      RESCC,
+               "       cmpZL   AL,AR\nZP",
+
 OPLOG, FORCC,
        SAREG|AWD,      TDOUBLE,
        SAREG|AWD,      TDOUBLE,
 OPLOG, FORCC,
        SAREG|AWD,      TDOUBLE,
        SAREG|AWD,      TDOUBLE,
@@ -190,22 +196,25 @@ OPLOG,    FORCC,
                "       cmpd    AL,AR\nZP",
 
 OPLOG, FORCC,
                "       cmpd    AL,AR\nZP",
 
 OPLOG, FORCC,
-       SAREG|AWD,      TDOUBLE,
        SAREG|AWD,      TFLOAT,
        SAREG|AWD,      TFLOAT,
-               NAREG,  RESCC,
-               "       cvtfd   AR,A1\n cmpd    AL,A1\nZP",
+       SAREG|AWD,      TFLOAT,
+               0,      RESCC,
+               "       cmpf    AL,AR\nZP",
 
 
+#ifdef FORT
+/* this really ought to be taken care of farther upstream... XXX */
 OPLOG, FORCC,
        SAREG|AWD,      TFLOAT,
        SAREG|AWD,      TDOUBLE,
 OPLOG, FORCC,
        SAREG|AWD,      TFLOAT,
        SAREG|AWD,      TDOUBLE,
-               NAREG,  RESCC,
+               NAREG|NASL,     RESCC,
                "       cvtfd   AL,A1\n cmpd    A1,AR\nZP",
 
 OPLOG, FORCC,
                "       cvtfd   AL,A1\n cmpd    A1,AR\nZP",
 
 OPLOG, FORCC,
+       SAREG|AWD,      TDOUBLE,
        SAREG|AWD,      TFLOAT,
        SAREG|AWD,      TFLOAT,
-       SAREG|AWD,      TFLOAT,
-               0,      RESCC,
-               "       cmpf    AL,AR\nZP",
+               NAREG|NASR,     RESCC,
+               "       cvtfd   AR,A1\n cmpd    AL,A1\nZP",
+#endif
 
 CCODES,        INAREG|INTAREG,
        SANY,   TANY,
 
 CCODES,        INAREG|INTAREG,
        SANY,   TANY,
@@ -213,27 +222,11 @@ CCODES,   INAREG|INTAREG,
                NAREG,  RESC1,
                "       movl    $1,A1\nZN",
 
                NAREG,  RESC1,
                "       movl    $1,A1\nZN",
 
-#ifdef FORT
-UNARY CALL,    INTAREG,
-       SCON,   TANY,
-       SANY,   TFLOAT,
-               NAREG|NASL,     RESC1,
-               "       calls   ZC,CL\n",
-
-UNARY CALL,    INTAREG,
-       SCON,   TANY,
-       SANY,   TWORD|TCHAR|TUCHAR|TSHORT|TUSHORT|TDOUBLE,
-               NAREG|NASL,     RESC1, /* should be register 0 */
-               "       calls   ZC,CL\n",
-
-#else
-
 UNARY CALL,    INTAREG,
        SCON,   TANY,
        SANY,   TWORD|TCHAR|TUCHAR|TSHORT|TUSHORT|TFLOAT|TDOUBLE,
                NAREG|NASL,     RESC1,
                "       calls   ZC,CL\n",
 UNARY CALL,    INTAREG,
        SCON,   TANY,
        SANY,   TWORD|TCHAR|TUCHAR|TSHORT|TUSHORT|TFLOAT|TDOUBLE,
                NAREG|NASL,     RESC1,
                "       calls   ZC,CL\n",
-#endif
 
 UNARY CALL,    INTAREG,
        SAREG,  TANY,
 
 UNARY CALL,    INTAREG,
        SAREG,  TANY,
@@ -255,7 +248,7 @@ UNARY CALL, INAREG|INTAREG,
 
 ASG RS,        INAREG|FOREFF|FORCC,
        SAREG,  TWORD,
 
 ASG RS,        INAREG|FOREFF|FORCC,
        SAREG,  TWORD,
-       SCON,   TINT,
+       SCON,   TINT|TUNSIGNED,
                0,      RLEFT|RESCC,
                "       extzv   AR,ZU,AL,AL\n",
 
                0,      RLEFT|RESCC,
                "       extzv   AR,ZU,AL,AL\n",
 
@@ -273,7 +266,7 @@ ASG RS,     INAREG|FOREFF|FORCC,
 
 RS,    INAREG|INTAREG|FORCC,
        SAREG,  TWORD,
 
 RS,    INAREG|INTAREG|FORCC,
        SAREG,  TWORD,
-       SCON,   TINT,
+       SCON,   TINT|TUNSIGNED,
                NAREG|NASL,     RESC1|RESCC,
                "       extzv   AR,ZU,AL,A1\n",
 
                NAREG|NASL,     RESC1|RESCC,
                "       extzv   AR,ZU,AL,A1\n",
 
@@ -314,79 +307,59 @@ LS,       INAREG|INTAREG|FORCC,
                "       ZB      AR,A1\n ashl    A1,AL,A1\n",
 
 INCR,  FOREFF,
                "       ZB      AR,A1\n ashl    A1,AL,A1\n",
 
 INCR,  FOREFF,
-       AWD,    TANY,
-       SCON,   TANY,
-               0,      RLEFT,
-               "       ZE\n",
-
-DECR,  FOREFF,
-       AWD,    TANY,
-       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,
-       AWD,    TANY,
-       SCON,   TANY,
-               NAREG,  RESC1,
-               "       ZD\n",
-
-DECR,  INAREG|INTAREG,
-       AWD,    TANY,
-       SCON,   TANY,
-               NAREG,  RESC1,
-               "       ZD\n",
-
 INCR,  INAREG|INTAREG,
 INCR,  INAREG|INTAREG,
-       SAREG,  TWORD,
-       SCON,   TANY,
+       SAREG|AWD,      TANY,
+       SCON|SNAME,     TANY,
                NAREG,  RESC1,
                "       ZD\n",
 
 DECR,  INAREG|INTAREG,
                NAREG,  RESC1,
                "       ZD\n",
 
 DECR,  INAREG|INTAREG,
-       SAREG,  TWORD,
-       SCON,   TANY,
+       SAREG|AWD,      TANY,
+       SCON|SNAME,     TANY,
                NAREG,  RESC1,
                "       ZD\n",
 
 ASSIGN,        INAREG|FOREFF|FORCC,
                NAREG,  RESC1,
                "       ZD\n",
 
 ASSIGN,        INAREG|FOREFF|FORCC,
-       SAREG|AWD,      TDOUBLE,
+       SAREG|AWD,      TFLOAT|TDOUBLE,
        SAREG|AWD,      TUCHAR|TUSHORT,
                NAREG|NASR,     RLEFT|RESCC,
        SAREG|AWD,      TUCHAR|TUSHORT,
                NAREG|NASR,     RLEFT|RESCC,
-               "       movzZRl AR,A1\n cvtld   A1,AL\n",
-
-ASSIGN,        INAREG|FOREFF|FORCC,
-       SAREG|AWD,      TFLOAT,
-       SAREG|AWD,      TUCHAR|TUSHORT,
-               NAREG|NASR,     RLEFT|RESCC,
-               "       movzZRl AR,A1\n cvtlf   A1,AL\n",
+               "       ZA\n",
 
 ASSIGN,        INAREG|FOREFF|FORCC,
        SAREG|AWD,      TANY,
        SAREG|AWD,      TANY,
 
 ASSIGN,        INAREG|FOREFF|FORCC,
        SAREG|AWD,      TANY,
        SAREG|AWD,      TANY,
-               0,      RLEFT|RRIGHT|RESCC,
+               0,      RLEFT|RESCC,
                "       ZA\n",
 
                "       ZA\n",
 
-ASSIGN,        INAREG|FOREFF,
+ASSIGN,        FOREFF,
        SFLD,   TANY,
        SAREG|AWD,      TWORD,
        SFLD,   TANY,
        SAREG|AWD,      TWORD,
-               0,      RRIGHT,
+               0,      RNOP,
                "       insv    AR,$H,$S,AL\n",
 
                "       insv    AR,$H,$S,AL\n",
 
+ASSIGN,        INAREG,
+       SFLD,   ANYSIGNED,
+       SAREG|AWD,      TWORD,
+               NAREG,  RESC1,
+               "       insv    AR,$H,$S,AL\n   extv    $H,$S,AL,A1\n",
+
+ASSIGN,        INAREG,
+       SFLD,   ANYUSIGNED,
+       SAREG|AWD,      TWORD,
+               NAREG,  RESC1,
+               "       insv    AR,$H,$S,AL\n   extzv   $H,$S,AL,A1\n",
+
 ASSIGN,        INAREG|FOREFF|FORCC,
        SAREG|AWD,      TWORD,
        SFLD,   ANYSIGNED,
 ASSIGN,        INAREG|FOREFF|FORCC,
        SAREG|AWD,      TWORD,
        SFLD,   ANYSIGNED,
@@ -406,11 +379,23 @@ UNARY MUL,        FOREFF,
                0,      RNULL,
                "       HELP HELP HELP\n",
 
                0,      RNULL,
                "       HELP HELP HELP\n",
 
+OREG,  INTEMP,
+       SANY,   TANY,
+       SOREG,  TDOUBLE,
+               2*NTEMP,        RESC1,
+               "       movq    AR,A1\n",
+
+OREG,  INTEMP,
+       SANY,   TANY,
+       SOREG,  TANY,
+               NTEMP,  RESC1,
+               "       movZR   AR,A1\n",
+
 REG,   INTEMP,
        SANY,   TANY,
        SAREG,  TDOUBLE,
                2*NTEMP,        RESC1,
 REG,   INTEMP,
        SANY,   TANY,
        SAREG,  TDOUBLE,
                2*NTEMP,        RESC1,
-               "       movd    AR,A1\n",
+               "       movq    AR,A1\n",
 
 REG,   INTEMP,
        SANY,   TANY,
 
 REG,   INTEMP,
        SANY,   TANY,
@@ -418,8 +403,8 @@ REG,        INTEMP,
                NTEMP,  RESC1,
                "       movZF   AR,A1\n",
 
                NTEMP,  RESC1,
                "       movZF   AR,A1\n",
 
-#ifdef FORT
- REG,  FORARG,
+#if defined(FORT) || defined(SPRECC)
+REG,   FORARG,
        SANY,   TANY,
        SAREG,  TFLOAT,
                0,      RNULL,
        SANY,   TANY,
        SAREG,  TFLOAT,
                0,      RNULL,
@@ -429,7 +414,7 @@ REG,        FORARG,
        SANY,   TANY,
        SAREG,  TDOUBLE,
                0,      RNULL,
        SANY,   TANY,
        SAREG,  TDOUBLE,
                0,      RNULL,
-               "       movZR   AR,-(sp)\n",
+               "       mov   AR,-(sp)\n",
 #endif
 
 OPLEAF,        FOREFF,
 #endif
 
 OPLEAF,        FOREFF,
@@ -452,79 +437,42 @@ OPLTYPE,  FORCC,
 
 OPLTYPE,       FORARG,
        SANY,   TANY,
 
 OPLTYPE,       FORARG,
        SANY,   TANY,
-       SANY,   TWORD,
-               0,      RNULL,
-               "       pushl   AR\n",
-
-OPLTYPE,       FORARG,
-       SANY,   TANY,
-       SANY,   TCHAR|TSHORT,
-               0,      RNULL,
-               "       cvtZRl  AR,-(sp)\n",
-
-OPLTYPE,       FORARG,
-       SANY,   TANY,
-       SANY,   TUCHAR|TUSHORT,
-               0,      RNULL,
-               "       movzZRl AR,-(sp)\n",
-
-OPLTYPE,       FORARG,
-       SANY,   TANY,
-       SANY,   TDOUBLE,
-               0,      RNULL,
-               "       movd    AR,-(sp)\n",
-
-OPLTYPE,       FORARG,
        SANY,   TANY,
        SANY,   TANY,
-       SANY,   TFLOAT,
                0,      RNULL,
                0,      RNULL,
-               "       cvtfd   AR,-(sp)\n",
+               "       ZV\n",
 
 
-#ifdef FORT
+#if defined(FORT) || defined(SPRECC)
 UNARY MINUS,   INTAREG|FORCC,
 UNARY MINUS,   INTAREG|FORCC,
-       SAREG|AWD,      TINT|TUNSIGNED|TLONG|TULONG|TFLOAT|TDOUBLE,
+       SAREG|AWD,      TFLOAT,
        SANY,   TANY,
                NAREG|NASL,     RESC1|RESCC,
                "       mnegZL  TAL,A1\n",
 
        SANY,   TANY,
                NAREG|NASL,     RESC1|RESCC,
                "       mnegZL  TAL,A1\n",
 
-#else
+#endif
 
 UNARY MINUS,   INTAREG|FORCC,
 
 UNARY MINUS,   INTAREG|FORCC,
-       SAREG|AWD,      TINT|TUNSIGNED|TLONG|TULONG|TDOUBLE,
+       SAREG|AWD,      TWORD|TDOUBLE,
        SANY,   TANY,
                NAREG|NASL,     RESC1|RESCC,
                "       mnegZL  AL,A1\n",
        SANY,   TANY,
                NAREG|NASL,     RESC1|RESCC,
                "       mnegZL  AL,A1\n",
-#endif
 
 COMPL, INTAREG|FORCC,
 
 COMPL, INTAREG|FORCC,
-       SAREG|AWD,      TINT|TUNSIGNED,
+       SAREG|AWD,      TWORD,
        SANY,   TANY,
                NAREG|NASL,     RESC1|RESCC,
                "       mcomZL  AL,A1\n",
 
        SANY,   TANY,
                NAREG|NASL,     RESC1|RESCC,
                "       mcomZL  AL,A1\n",
 
-COMPL, INTAREG|FORCC,
-       SAREG|AWD,      ANYSIGNED|ANYUSIGNED,
-       SANY,   TANY,
-               NAREG|NASL,     RESC1|RESCC,
-               "       cvtZLl  AL,A1\n mcoml   A1,A1\n",
-
-AND,   FORCC,
-       SAREG|AWD,      TWORD,
-       SCON,   TWORD,
-               0,      RESCC,
-               "       bitl    ZZ,AL\n",
-
 AND,   FORCC,
 AND,   FORCC,
-       SAREG|AWD,      TSHORT|TUSHORT,
-       SSCON,  TWORD,
-               0,      RESCC,
-               "       bitw    ZZ,AL\n",
+       SAREG|AWD,      TCHAR|TSHORT,
+       SCON,   ANYFIXED,
+               NAREG|NASL,     RESCC,
+               "       ZZ\n",
 
 AND,   FORCC,
 
 AND,   FORCC,
-       SAREG|AWD,      TCHAR|TUCHAR,
-       SCCON,  TWORD,
+       SAREG|AWD,      TWORD|ANYUSIGNED,
+       SCON,   ANYFIXED,
                0,      RESCC,
                0,      RESCC,
-               "       bitb    ZZ,AL\n",
+               "       ZZ\n",
 
 ASG AND,       INAREG|FOREFF|FORCC,
        SAREG,  TWORD,
 
 ASG AND,       INAREG|FOREFF|FORCC,
        SAREG,  TWORD,
@@ -532,6 +480,64 @@ ASG AND,   INAREG|FOREFF|FORCC,
                0,      RLEFT|RESCC,
                "       bicl2   AR,AL\n",
 
                0,      RLEFT|RESCC,
                "       bicl2   AR,AL\n",
 
+/* General cases for DIV and ASG DIV are handled below with OPMUL */
+/* Some special cases are handled in optim2() */
+
+DIV,   INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TUNSIGNED|TULONG,
+       SCON,   ANYUSIGNED,
+               NAREG|NEVEN,    RESC1|RESCC,
+               "       movl    AL,A1\n clrl    U1\n    ediv    AR,A1,A1,U1\n",
+
+ASG DIV,       INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TINT|TLONG|TUNSIGNED|TULONG,
+       SMCON,  ANYUSIGNED,
+               0,      RLEFT|RESCC,
+               "       ZJ\n",
+
+ASG DIV,       INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TINT|TLONG|TUNSIGNED|TULONG,
+       SCON,   ANYUSIGNED,
+               NAREG|NEVEN,    RLEFT|RESCC,
+               "       movl    AL,A1\n clrl    U1\n    ediv    AR,A1,AL,U1\n",
+
+MOD,   INAREG|INTAREG,
+       SAREG|AWD,      TINT|TLONG,
+       SAREG|AWD,      TINT|TLONG,
+               NAREG,  RESC1,
+               "       divl3   AR,AL,A1\n      mull2   AR,A1\n subl3   A1,AL,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,A1\n clrl    U1\n    ediv    AR,A1,U1,A1\n",
+
+/* should only see UNSIGNED lhs here if converted from UCHAR/USHORT lhs */
+ASG MOD,       INAREG|FOREFF|FORCC,
+       SAREG|AWD,      TINT|TLONG|TUNSIGNED|TULONG,
+       SAREG|AWD,      TINT|TLONG,
+               NAREG,  RLEFT|RESCC,
+               "       divl3   AR,AL,A1\n      mull2   AR,A1\n subl2   A1,AL\n",
+
+ASG MOD,       INAREG|FOREFF,
+       SAREG|AWD,      TINT|TLONG|TUNSIGNED|TULONG,
+       SMCON,  ANYUSIGNED,
+               0,      RLEFT,
+               "       ZJ\n",
+
+ASG MOD,       INAREG|FOREFF,
+       SAREG|AWD,      TINT|TLONG|TUNSIGNED|TULONG,
+       SCON,   ANYUSIGNED,
+               NAREG|NEVEN,    RLEFT,
+               "       movl    AL,A1\n clrl    U1\n    ediv    AR,A1,A1,AL\n",
+
 ASG OPMUL,     INAREG|FOREFF|FORCC,
        SAREG|AWD,      TINT|TUNSIGNED|TLONG|TULONG,
        SAREG|AWD,      TINT|TUNSIGNED|TLONG|TULONG,
 ASG OPMUL,     INAREG|FOREFF|FORCC,
        SAREG|AWD,      TINT|TUNSIGNED|TLONG|TULONG,
        SAREG|AWD,      TINT|TUNSIGNED|TLONG|TULONG,
@@ -550,102 +556,30 @@ OPMUL,   INAREG|INTAREG|FORCC,
                NAREG|NASL|NASR,        RESC1|RESCC,
                "       OL3     AR,AL,A1\n",
 
                NAREG|NASL|NASR,        RESC1|RESCC,
                "       OL3     AR,AL,A1\n",
 
-ASG MOD,       INAREG|INTAREG|FOREFF|FORCC,
-       SAREG,  TINT|TUNSIGNED|TLONG|TULONG,
-       SAREG|AWD,      TINT|TUNSIGNED|TLONG|TULONG,
-               NAREG,  RLEFT|RESCC,
-               "       divl3   AR,AL,A1\n      mull2   AR,A1\n subl2   A1,AL\n",
-
-MOD,   INAREG|INTAREG,
-       SAREG|AWD,      TINT|TUNSIGNED|TLONG|TULONG,
-       SAREG|AWD,      TINT|TUNSIGNED|TLONG|TULONG,
-               NAREG,  RESC1,
-               "       divl3   AR,AL,A1\n      mull2   AR,A1\n subl3   A1,AL,A1\n",
-
 ASG PLUS,      INAREG|FOREFF|FORCC,
 ASG PLUS,      INAREG|FOREFF|FORCC,
-       SAREG,  TPOINT|TINT|TLONG|TUNSIGNED|TULONG,
-       SONE,   TINT|TLONG,
-               0,      RLEFT|RESCC,
-               "       incZL   AL\n",
-
-ASG PLUS,      INAREG|FOREFF|FORCC,
-       AWD,    ANYSIGNED|ANYUSIGNED,
-       SONE,   TINT|TLONG,
+       SAREG|AWD,      ANYFIXED,
+       SONE,   TANY,
                0,      RLEFT|RESCC,
                "       incZL   AL\n",
 
                0,      RLEFT|RESCC,
                "       incZL   AL\n",
 
-ASG PLUS,      INAREG|FOREFF|FORCC,
-       SAREG,  TSHORT|TCHAR,
-       SONE,   TINT|TLONG,
-               0,      RLEFT|RESCC,
-               "       incZL   AL\n    cvtZLl  AL,AL\n",
-
-ASG PLUS,      INAREG|FOREFF|FORCC,
-       SAREG,  TUSHORT|TUCHAR,
-       SONE,   TINT|TLONG,
-               0,      RLEFT|RESCC,
-               "       incZL   AL\n    movzZLl AL,AL\n",
-
 ASG MINUS,     INAREG|FOREFF|FORCC,
 ASG MINUS,     INAREG|FOREFF|FORCC,
-       SAREG,  TPOINT|TINT|TLONG|TUNSIGNED|TULONG,
-       SONE,   TINT|TLONG,
-               0,      RLEFT|RESCC,
-               "       decZL   AL\n",
-
-ASG MINUS,     INAREG|FOREFF|FORCC,
-       AWD,    ANYSIGNED|ANYUSIGNED,
-       SONE,   TINT|TLONG,
+       SAREG|AWD,      ANYFIXED,
+       SONE,   TANY,
                0,      RLEFT|RESCC,
                "       decZL   AL\n",
 
                0,      RLEFT|RESCC,
                "       decZL   AL\n",
 
-ASG MINUS,     INAREG|FOREFF|FORCC,
-       SAREG,  TSHORT|TCHAR,
-       SONE,   TINT|TLONG,
-               0,      RLEFT|RESCC,
-               "       decZL   AL\n    cvtZLl  AL,AL\n",
-
-ASG MINUS,     INAREG|FOREFF|FORCC,
-       SAREG,  TUSHORT|TUCHAR,
-       SONE,   TINT|TLONG,
-               0,      RLEFT|RESCC,
-               "       decZL   AL\n    movzZLl AL,AL\n",
-
 PLUS,  INAREG|INTAREG|FORCC,
        STAREG, TWORD,
        SONE,   TWORD,
                0,      RLEFT|RESCC,
                "       incZL   AL\n",
 
 PLUS,  INAREG|INTAREG|FORCC,
        STAREG, TWORD,
        SONE,   TWORD,
                0,      RLEFT|RESCC,
                "       incZL   AL\n",
 
-PLUS,  INAREG|INTAREG|FORCC,
-       STAREG, TSHORT|TCHAR,
-       SONE,   TWORD,
-               0,      RLEFT|RESCC,
-               "       incZL   AL\n    cvtZLl  AL,AL\n",
-
-PLUS,  INAREG|INTAREG|FORCC,
-       STAREG, TUSHORT|TUCHAR,
-       SONE,   TWORD,
-               0,      RLEFT|RESCC,
-               "       incZL   AL\n    movzZLl AL,AL\n",
-
 MINUS, INAREG|INTAREG|FORCC,
        STAREG, TWORD,
        SONE,   TWORD,
                0,      RLEFT|RESCC,
                "       decZL   AL\n",
 
 MINUS, INAREG|INTAREG|FORCC,
        STAREG, TWORD,
        SONE,   TWORD,
                0,      RLEFT|RESCC,
                "       decZL   AL\n",
 
-MINUS, INAREG|INTAREG|FORCC,
-       STAREG, TSHORT|TCHAR,
-       SONE,   TWORD,
-               0,      RLEFT|RESCC,
-               "       decZL   AL\n    cvtZLl  AL,AL\n",
-
-MINUS, INAREG|INTAREG|FORCC,
-       STAREG, TUSHORT|TUCHAR,
-       SONE,   TWORD,
-               0,      RLEFT|RESCC,
-               "       decZL   AL\n    movzZLl AL,AL\n",
-
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
        SAREG|AWD,      TWORD,
        SAREG|AWD,      TWORD,
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
        SAREG|AWD,      TWORD,
        SAREG|AWD,      TWORD,
@@ -653,58 +587,52 @@ ASG OPSIMP,       INAREG|FOREFF|FORCC,
                "       OL2     AR,AL\n",
 
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
                "       OL2     AR,AL\n",
 
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
-       SAREG,  TWORD,
-       SAREG,  TSHORT|TUSHORT|TCHAR|TUCHAR,
+       AWD,    TSHORT|TUSHORT,
+       SAREG|SNAME|STARNM,     TSHORT|TUSHORT|TINT|TUNSIGNED|TLONG|TULONG,
                0,      RLEFT|RESCC,
                0,      RLEFT|RESCC,
-               "       OL2     AR,AL\n",
+               "       OW2     AR,AL\n",
 
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
        AWD,    TSHORT|TUSHORT,
 
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
        AWD,    TSHORT|TUSHORT,
-       SAREG|AWD,      TSHORT|TUSHORT,
+       SSOREG, TSHORT|TUSHORT|TINT|TUNSIGNED|TLONG|TULONG,
                0,      RLEFT|RESCC,
                "       OW2     AR,AL\n",
 
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
        AWD,    TSHORT|TUSHORT,
                0,      RLEFT|RESCC,
                "       OW2     AR,AL\n",
 
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
        AWD,    TSHORT|TUSHORT,
-       SSCON,  TWORD,
+       SSCON,  ANYFIXED,
                0,      RLEFT|RESCC,
                "       OW2     AR,AL\n",
 
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
                0,      RLEFT|RESCC,
                "       OW2     AR,AL\n",
 
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
-       AWD,    TCHAR|TUCHAR,
-       SAREG|AWD,      TCHAR|TUCHAR,
+       AWD,    TSHORT|TUSHORT,
+       AWD,    TSHORT|TUSHORT,
                0,      RLEFT|RESCC,
                0,      RLEFT|RESCC,
-               "       OB2     AR,AL\n",
+               "       OW2     AR,AL\n",
 
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
        AWD,    TCHAR|TUCHAR,
 
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
        AWD,    TCHAR|TUCHAR,
-       SCCON,  TWORD,
+       SSOREG, ANYFIXED,
                0,      RLEFT|RESCC,
                "       OB2     AR,AL\n",
 
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
                0,      RLEFT|RESCC,
                "       OB2     AR,AL\n",
 
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
-       SAREG,  TSHORT,
-       SAREG|AWD,      ANYFIXED,
-               0,      RLEFT|RESCC,
-               "       OW2     AR,AL\n cvtZLl  AL,AL\n",
-
-ASG OPSIMP,    INAREG|FOREFF|FORCC,
-       SAREG,  TUSHORT,
-       SAREG|AWD,      ANYFIXED,
+       AWD,    TCHAR|TUCHAR,
+       SAREG|SNAME|STARNM,     ANYFIXED,
                0,      RLEFT|RESCC,
                0,      RLEFT|RESCC,
-               "       OW2     AR,AL\n movzZLl AL,AL\n",
+               "       OB2     AR,AL\n",
 
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
 
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
-       SAREG,  TCHAR,
-       SAREG|AWD,      ANYFIXED,
+       AWD,    TCHAR|TUCHAR,
+       SCCON,  ANYFIXED,
                0,      RLEFT|RESCC,
                0,      RLEFT|RESCC,
-               "       OB2     AR,AL\n cvtZLl  AL,AL\n",
+               "       OB2     AR,AL\n",
 
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
 
 ASG OPSIMP,    INAREG|FOREFF|FORCC,
-       SAREG,  TUCHAR,
-       SAREG|AWD,      ANYFIXED,
+       AWD,    TCHAR|TUCHAR,
+       AWD,    TCHAR|TUCHAR,
                0,      RLEFT|RESCC,
                0,      RLEFT|RESCC,
-               "       OB2     AR,AL\n movzZLl AL,AL\n",
+               "       OB2     AR,AL\n",
 
 OPSIMP,        INAREG|INTAREG|FORCC,
        STAREG, ANYFIXED,
 
 OPSIMP,        INAREG|INTAREG|FORCC,
        STAREG, ANYFIXED,
@@ -728,13 +656,11 @@ ASG OPFLOAT,      INAREG|FOREFF|FORCC,
        SAREG|AWD,      TFLOAT,
        SAREG|AWD,      TFLOAT,
                0,      RLEFT|RESCC,
        SAREG|AWD,      TFLOAT,
        SAREG|AWD,      TFLOAT,
                0,      RLEFT|RESCC,
+#if defined(FORT) || defined(SPRECC)
+               "       OF2     AR,TAL\n",
+#else
                "       OF2     AR,AL\n",
                "       OF2     AR,AL\n",
-
-ASG OPFLOAT,   INAREG|FOREFF|FORCC,
-       SAREG|AWD,      TDOUBLE,
-       SAREG|AWD,      TFLOAT,
-               NAREG|NASR,     RLEFT|RESCC,
-               "       cvtfd   AR,A1\n OD2     A1,AL\n",
+#endif
 
 ASG OPFLOAT,   INAREG|INTAREG|FOREFF|FORCC,
        SAREG|AWD,      TFLOAT,
 
 ASG OPFLOAT,   INAREG|INTAREG|FOREFF|FORCC,
        SAREG|AWD,      TFLOAT,
@@ -742,6 +668,16 @@ ASG OPFLOAT,       INAREG|INTAREG|FOREFF|FORCC,
                NAREG,  RLEFT|RESC1|RESCC,
                "       cvtfd   AL,A1\n OD2     AR,A1\n cvtdf   A1,AL\n",
 
                NAREG,  RLEFT|RESC1|RESCC,
                "       cvtfd   AL,A1\n OD2     AR,A1\n cvtdf   A1,AL\n",
 
+ASG OPFLOAT,   INAREG|FOREFF|FORCC,
+       SAREG|AWD,      ANYFIXED,
+#ifndef SPRECC
+       SAREG|AWD,      TDOUBLE,                /* force FLOAT to register */
+#else
+       SAREG|AWD,      TFLOAT|TDOUBLE,
+#endif
+               NAREG,  RLEFT|RESCC,    /* usable() knows we need a reg pair */
+               "       ZG\n",
+
 OPFLOAT,       INAREG|INTAREG|FORCC,
        STAREG, TDOUBLE,
        SAREG|AWD,      TDOUBLE,
 OPFLOAT,       INAREG|INTAREG|FORCC,
        STAREG, TDOUBLE,
        SAREG|AWD,      TDOUBLE,
@@ -754,37 +690,33 @@ OPFLOAT,  INAREG|INTAREG|FORCC,
                NAREG|NASL|NASR,        RESC1|RESCC,
                "       OD3     AR,AL,A1\n",
 
                NAREG|NASL|NASR,        RESC1|RESCC,
                "       OD3     AR,AL,A1\n",
 
+#if defined(FORT) || defined(SPRECC)
 OPFLOAT,       INAREG|INTAREG|FORCC,
 OPFLOAT,       INAREG|INTAREG|FORCC,
+       STAREG,         TFLOAT,
        SAREG|AWD,      TFLOAT,
        SAREG|AWD,      TFLOAT,
-       SAREG|AWD,      TDOUBLE,
-               NAREG|NASL,     RESC1|RESCC,
-               "       cvtfd   AL,A1\n OD2     AR,A1\n",
-
-OPFLOAT,       INAREG|INTAREG|FORCC,
-       SAREG|AWD,      TDOUBLE,
-       SAREG|AWD,      TFLOAT,
-               NAREG|NASR,     RESC1|RESCC,
-               "       cvtfd   AR,A1\n OD3     A1,AL,A1\n",
-
-#ifdef FORT
-OPFLOAT,       INAREG|INTAREG|FORCC,
-       STAREG, TFLOAT,
-    SAREG|AWD,  TFLOAT,
                0,      RLEFT|RESCC,
                0,      RLEFT|RESCC,
-               "       OF2     TAR,AL\n",
+               "       OF2     AR,TAL\n",
 
 OPFLOAT,       INAREG|INTAREG|FORCC,
        SAREG|AWD,      TFLOAT,
        SAREG|AWD,      TFLOAT,
                NAREG|NASL|NASR,        RESC1|RESCC,
                "       OF3     AR,AL,TA1\n",
 
 OPFLOAT,       INAREG|INTAREG|FORCC,
        SAREG|AWD,      TFLOAT,
        SAREG|AWD,      TFLOAT,
                NAREG|NASL|NASR,        RESC1|RESCC,
                "       OF3     AR,AL,TA1\n",
+#endif
 
 
-#else
+#ifdef FORT
+/* perform some implicit conversions XXX SHOULD FIX f77 FRONT END */
 OPFLOAT,       INAREG|INTAREG|FORCC,
        SAREG|AWD,      TFLOAT,
 OPFLOAT,       INAREG|INTAREG|FORCC,
        SAREG|AWD,      TFLOAT,
+       SAREG|AWD,      TDOUBLE,
+               NAREG|NASL,     RESC1|RESCC,
+               "       cvtfd   AL,A1\n OD2     AR,A1\n",
+
+OPFLOAT,       INAREG|INTAREG|FORCC,
+       SAREG|AWD,      TDOUBLE,
        SAREG|AWD,      TFLOAT,
        SAREG|AWD,      TFLOAT,
-               NAREG|NASL|NASR,        RESC1|RESCC,
-               "       OF3     AR,AL,A1\n      cvtfd   A1,A1\n",
+               NAREG|NASR,     RESC1|RESCC,
+               "       cvtfd   AR,A1\n OD3     A1,AL,A1\n",
 #endif
 
        /* Default actions for hard trees ... */
 #endif
 
        /* Default actions for hard trees ... */
@@ -819,7 +751,6 @@ INIT, DF(INIT),
 
 OPUNARY, DF(UNARY MINUS),
 
 
 OPUNARY, DF(UNARY MINUS),
 
-
 ASG OPANY, DF(ASG PLUS),
 
 OPANY, DF(BITYPE),
 ASG OPANY, DF(ASG PLUS),
 
 OPANY, DF(BITYPE),