? t1 ? t2 ? t3 ? t4 ? t5 Index: M3x86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/M3x86.m3,v retrieving revision 1.167 diff -u -w -r1.167 M3x86.m3 --- M3x86.m3 11 Mar 2010 15:29:14 -0000 1.167 +++ M3x86.m3 13 Mar 2010 14:53:32 -0000 @@ -27,7 +27,7 @@ IMPORT Wrx86, Stackx86, Codex86; FROM Stackx86 IMPORT MaxMin, ShiftType; -FROM Codex86 IMPORT Cond, Op, FOp, FIm, unscond, revcond, FloatBytes; +FROM Codex86 IMPORT Cond, Op, FOp, unscond, revcond, FloatBytes; TYPE RuntimeHook = REF RECORD @@ -1845,7 +1845,7 @@ u.wr.NL (); END; - condset(u, CompareOpCond [op], t); + condset(u, op, t); END compare; PROCEDURE add (u: U; t: AType) = @@ -2204,7 +2204,7 @@ pop_param(u, Type.Addr); call_int_proc (u, proc); u.vstack.pushimmT(TZero, Type.Word32); - condset(u, CompareOpCond [op], t); + condset(u, op, t); ELSE proc := CompareOpProc [op]; start_int_proc (u, proc); @@ -3950,23 +3950,14 @@ (*---------------------------------------------------------- produce code ---*) -PROCEDURE intregcmp (u: U; tozero: BOOLEAN; type: Type): BOOLEAN = +PROCEDURE intregcmp (u: U; type: Type): BOOLEAN = BEGIN - IF tozero THEN - u.vstack.doimm(Op.oCMP, TZero, FALSE); - RETURN FALSE; - ELSE RETURN u.vstack.dobin(Op.oCMP, TRUE, FALSE, type); - END END intregcmp; -PROCEDURE fltregcmp (u: U; tozero: BOOLEAN): BOOLEAN = +PROCEDURE fltregcmp (u: U): BOOLEAN = VAR reversed := FALSE; BEGIN - IF tozero THEN - u.cg.immFOp(FOp.fCOMP, FIm.Z); - u.vstack.discard(1); - ELSE IF u.cg.ftop_inmem THEN u.cg.binFOp(FOp.fCOMP, 1); ELSE @@ -3974,7 +3965,6 @@ reversed := TRUE; END; u.vstack.discard(2); - END; u.vstack.unlock(); u.vstack.corrupt(EAX, operandPart := 0); @@ -3984,13 +3974,16 @@ RETURN reversed; END fltregcmp; -PROCEDURE condset (u: U; cond: Cond; t: ZType) = +PROCEDURE condset (u: U; op: CompareOp; t: ZType) = VAR reversed := FALSE; + cond := CompareOpCond[op]; BEGIN + <* ASSERT cond # Cond.Z AND cond # Cond.NZ *> + IF Target.FloatType[t] THEN - reversed := fltregcmp(u, cond < Cond.E); + reversed := fltregcmp(u); ELSE - reversed := intregcmp(u, cond < Cond.E, t); + reversed := intregcmp(u, t); END; IF reversed THEN