<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body class='hmmessage'><FONT size=2>
currently set <,>,<=,>= are implemented merely as<BR>
integer <,>,<=,>=<BR>
 <BR>
This is wrong.<BR>
 <BR>
I believe it should be:<BR>
 <BR>
a < b => (a & b) == a<BR>
a <= b => (a & b) == a (same as <=)<BR>
a > b => (a & b) == b<BR>
a >= b => (a & b) == b (same as >)<BR>
 <BR>
The bug is in the frontend.<BR>
 <BR>
m3-sys\m3front\src\misc\CG.m3.<BR>
 <BR>
The code should be /something/ like:<BR>
 <BR>
PROCEDURE Set_compare (s: Size; op: Cmp) =<BR>
VAR tmp: Val;<BR>
  swap := FALSE;<BR>
BEGIN<BR>
  (* a op b => BOOLEAN *)<BR>
  IF Force_pair (commute := TRUE) THEN<BR>
    op := M3CG.SwappedCompare [op];<BR>
  END;<BR>
  IF (s <= Target.Integer.size) THEN<BR>
    IF (op = Cmp.EQ) OR (op = Cmp.NE) THEN<BR>
      cg.compare (Target.Word.cg_type, Target.Integer.cg_type, op);<BR>
    ELSE<BR>
      (* set a is less than or equal to set b, if all of set a's members are in set b. *)<BR>
      IF (op = Cmp.LT) OR (op = Cmp.LE) THEN<BR>
        swap := TRUE;<BR>
        Swap ();<BR>
      END;<BR>
<STRONG>      tmp := Pop ();</STRONG><BR>
<STRONG>      Push (tmp);</STRONG><BR>
      IF swap THEN<BR>
        Swap ();<BR>
      END;<BR>
<STRONG>       cg.and (Target.Integer.cg_type);</STRONG><BR>
<STRONG>       Push (tmp);</STRONG><BR>
      SimpleIndirectLoad (tmp^, Target.Word.cg_type);<BR>
      EVAL Force_pair (commute := TRUE);<BR>
<STRONG>       cg.compare (Target.Word.cg_type, Target.Integer.cg_type, Cmp.EQ);</STRONG><BR>
      SPop (1, "Set_compare");<BR>
      Free (tmp);<BR>
    END;<BR>
  ELSE<BR>
    cg.set_compare (AsBytes (s), op, Target.Integer.cg_type);<BR>
  END;<BR>
  SPop (2, "Set_compare");<BR>
  SPush (Type.Int32);<BR>
END Set_compare;<BR>
 <BR>
though this doesn't quite drive all the machinery correctly, since it yields assertion failures in the compiler due to an unbalanced software stack.<BR>
upgrade works, but the test case (p155) fails assertions in the integrated backend.<BR>
 <BR>
I'd love to figure this out but have to do other stuff for now.<BR>
Anyone (if there is anyone) familiar with what all is being pushed and popped around here should be able to figure it out easily from this mail.<BR>
Otherwise I'll stare at more later.<BR>
 <BR>
ps: "small" sets should probably be anything up to the number of bits in longint, rather than int or pointer, since that is probably efficient enough at the next level down. This is tangential.<BR>
 <BR>
- Jay<BR></FONT></body>
</html>