The situation with unsigned char/short comparisons and constants was worse
[unix-history] / usr / src / old / pcc / ccom.tahoe / table.c
index b9e16ee..9e18185 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)table.c    1.15 (Berkeley) %G%";
+static char sccsid[] = "@(#)table.c    1.20 (Berkeley) %G%";
 #endif
 
 # include "pass2.h"
 #endif
 
 # include "pass2.h"
@@ -47,13 +47,13 @@ SCONV,      INAREG|INTAREG,
 SCONV, INAREG|INTAREG,
        SAREG|AWD,      ANYFIXED,
        SANY,   ANYFIXED,
 SCONV, INAREG|INTAREG,
        SAREG|AWD,      ANYFIXED,
        SANY,   ANYFIXED,
-               NAREG|NASL,     RESC1|RESCC,
+               NAREG|NASL,     RESC1,
                "       ZU\n",
 
 SCONV, FORCC,
        SAREG|AWD,      ANYFIXED,
        SANY,   ANYFIXED,
                "       ZU\n",
 
 SCONV, FORCC,
        SAREG|AWD,      ANYFIXED,
        SANY,   ANYFIXED,
-               NAREG|NASL,     RESC1|RESCC,
+               NAREG|NASL,     RESCC,
                "       ZV\n",
 
 SCONV, INAREG|INTAREG|FORCC,
                "       ZV\n",
 
 SCONV, INAREG|INTAREG|FORCC,
@@ -171,22 +171,35 @@ OPLOG,    FORCC,
                0,      RESCC,
                "       cmpl    AL,AR\nZP",
 
                0,      RESCC,
                "       cmpl    AL,AR\nZP",
 
-/* tahoe won't handle uns char/short equality/inequality with mem and const */
-EQ,    FORCC,
-       AWD,            TUCHAR|TUSHORT,
+/* 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,
        SCON,   TANY,
                NAREG,  RESCC,
-               "       movzZLl AL,A1\n cmpZL   A1,AR\nZP",
+               "       movzZLl AL,A1\n cmp   A1,AR\nZP",
 
 
-NE,    FORCC,
-       AWD,            TUCHAR|TUSHORT,
+OPLOG, FORCC,
+       SAREG|AWD,      TUSHORT,
+       SSCON,  TANY,
+               0,      RESCC,
+               "       cmpZL   AL,AR\nZP",
+
+OPLOG, FORCC,
+       AWD,            TUSHORT,
        SCON,   TANY,
                NAREG,  RESCC,
        SCON,   TANY,
                NAREG,  RESCC,
-               "       movzZLl AL,A1\n cmpZL   A1,AR\nZP",
+               "       movzZLl AL,A1\n cmp   A1,AR\nZP",
 
 /* optim2() handles degenerate comparisons with constants */
 OPLOG, FORCC,
 
 /* optim2() handles degenerate comparisons with constants */
 OPLOG, FORCC,
-       SAREG|AWD,      TCHAR|TUCHAR|TSHORT|TUSHORT,
+       SAREG|AWD,      TCHAR|TSHORT,
        SCON,   TANY,
                0,      RESCC,
                "       cmpZL   AL,AR\nZP",
        SCON,   TANY,
                0,      RESCC,
                "       cmpZL   AL,AR\nZP",
@@ -322,13 +335,13 @@ 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,
-       SAREG|AWD,      TWORD,
+       SAREG|AWD,      TANY,
        SCON|SNAME,     TANY,
                0,      RLEFT,
                "       ZE\n",
 
 DECR,  FOREFF,
        SCON|SNAME,     TANY,
                0,      RLEFT,
                "       ZE\n",
 
 DECR,  FOREFF,
-       SAREG|AWD,      TWORD,
+       SAREG|AWD,      TANY,
        SCON|SNAME,     TANY,
                0,      RLEFT,
                "       ZE\n",
        SCON|SNAME,     TANY,
                0,      RLEFT,
                "       ZE\n",
@@ -345,12 +358,18 @@ DECR,     INAREG|INTAREG,
                NAREG,  RESC1,
                "       ZD\n",
 
                NAREG,  RESC1,
                "       ZD\n",
 
-ASSIGN,        INAREG|FOREFF|FORCC,
+ASSIGN,        INAREG|FOREFF,
        SAREG|AWD,      ANYFIXED,
        SAREG|AWD,      ANYFIXED,
        SAREG|AWD,      ANYFIXED,
        SAREG|AWD,      ANYFIXED,
-               0,      RLEFT|RRIGHT|RESCC,
+               0,      RLEFT,
                "       ZU\n",
 
                "       ZU\n",
 
+ASSIGN,        FORCC,
+       SAREG|AWD,      ANYFIXED,
+       SAREG|AWD,      ANYFIXED,
+               0,      RESCC,
+               "       ZV\n",
+
 ASSIGN,        INAREG|FOREFF|FORCC,
        SIREG,  TDOUBLE,
        SZERO,  TANY,
 ASSIGN,        INAREG|FOREFF|FORCC,
        SIREG,  TDOUBLE,
        SZERO,  TANY,
@@ -381,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,
@@ -536,6 +567,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,
@@ -608,6 +645,12 @@ OPLTYPE,   FORARG,
                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,
@@ -708,11 +751,12 @@ MOD,      INAREG|FOREFF,
                "       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 */
                "       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,
        SAREG|AWD,      TINT|TLONG|TUNSIGNED|TULONG,
        SAREG|AWD,      TINT|TLONG,
                NAREG|NEVEN,    RLEFT|RESCC,
 ASG MOD,       INAREG|FOREFF,
        SAREG|AWD,      TINT|TLONG|TUNSIGNED|TULONG,
        SAREG|AWD,      TINT|TLONG,
                NAREG|NEVEN,    RLEFT|RESCC,
-               "       ZM      ediv    AR,A1,A1,AL\n",
+               "       ZM      ediv    AR,A1,U1,A1\n   movl    A1,AL\n",
 
 ASG MOD,       INAREG|FOREFF,
        SAREG|AWD,      TINT|TLONG|TUNSIGNED|TULONG,
 
 ASG MOD,       INAREG|FOREFF,
        SAREG|AWD,      TINT|TLONG|TUNSIGNED|TULONG,
@@ -724,7 +768,7 @@ ASG MOD,    INAREG|FOREFF,
        SAREG|AWD,      TINT|TLONG|TUNSIGNED|TULONG,
        SCON,   ANYUSIGNED,
                NAREG|NEVEN,    RLEFT,
        SAREG|AWD,      TINT|TLONG|TUNSIGNED|TULONG,
        SCON,   ANYUSIGNED,
                NAREG|NEVEN,    RLEFT,
-               "       movl    AL,U1\n clrl    A1\n    ediv    AR,A1,A1,AL\n",
+               "       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,
 
 /* XXX is this supposed to help on overflow? */
 ASG MUL,       INAREG|FOREFF|FORCC,