Index: m3middle/src/TInt.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/TInt.i3,v retrieving revision 1.17 diff -u -r1.17 TInt.i3 --- m3middle/src/TInt.i3 20 Jan 2010 15:01:32 -0000 1.17 +++ m3middle/src/TInt.i3 21 Jan 2010 08:04:53 -0000 @@ -45,22 +45,23 @@ (* Minimum and Maximum values for Signed and Unsigned values with specified bit count. *) - MinS8 = Int{NUMBER (IBytes), IBytes{16_80,16_FF,..}}; - MinS16 = Int{NUMBER (IBytes), IBytes{16_00,16_80,16_FF,..}}; - MinS32 = Int{NUMBER (IBytes), IBytes{16_00,16_00,16_00,16_80,16_FF,..}}; - MinS64 = Int{NUMBER (IBytes), IBytes{16_00,16_00,16_00,16_00,16_00,16_00,16_00,16_80}}; - MaxS8 = Int{NUMBER (IBytes), IBytes{16_7F,16_00,..}}; - MaxS16 = Int{NUMBER (IBytes), IBytes{16_FF,16_7F,16_00,..}}; - MaxS32 = Int{NUMBER (IBytes), IBytes{16_FF,16_FF,16_FF,16_7F,16_00,..}}; - MaxS64 = Int{NUMBER (IBytes), IBytes{16_FF,16_FF,16_FF,16_FF,16_FF,16_FF,16_FF,16_7F}}; - MinU8 = Zero; - MinU16 = Zero; - MinU32 = Zero; - MinU64 = Zero; - MaxU8 = Int{NUMBER (IBytes), IBytes{16_FF,16_00,..}}; - MaxU16 = Int{NUMBER (IBytes), IBytes{16_FF,16_FF,16_00,..}}; - MaxU32 = Int{NUMBER (IBytes), IBytes{16_FF,16_FF,16_FF,16_FF,16_00,..}}; - MaxU64 = Int{NUMBER (IBytes), IBytes{16_FF,16_FF,16_FF,16_FF,16_FF,16_FF,16_FF,16_FF}}; + MinS8 = Int{NUMBER (IBytes), IBytes{16_80,16_FF,..}}; + MinS16 = Int{NUMBER (IBytes), IBytes{16_00,16_80,16_FF,..}}; + MinS32 = Int{NUMBER (IBytes), IBytes{16_00,16_00,16_00,16_80,16_FF,..}}; + AbsMinS32 = Int{NUMBER (IBytes), IBytes{16_00,16_00,16_00,16_80,16_00,..}}; (* absolute value of MinS32 *) + MinS64 = Int{NUMBER (IBytes), IBytes{16_00,16_00,16_00,16_00,16_00,16_00,16_00,16_80}}; + MaxS8 = Int{NUMBER (IBytes), IBytes{16_7F,16_00,..}}; + MaxS16 = Int{NUMBER (IBytes), IBytes{16_FF,16_7F,16_00,..}}; + MaxS32 = Int{NUMBER (IBytes), IBytes{16_FF,16_FF,16_FF,16_7F,16_00,..}}; + MaxS64 = Int{NUMBER (IBytes), IBytes{16_FF,16_FF,16_FF,16_FF,16_FF,16_FF,16_FF,16_7F}}; + MinU8 = Zero; + MinU16 = Zero; + MinU32 = Zero; + MinU64 = Zero; + MaxU8 = Int{NUMBER (IBytes), IBytes{16_FF,16_00,..}}; + MaxU16 = Int{NUMBER (IBytes), IBytes{16_FF,16_FF,16_00,..}}; + MaxU32 = Int{NUMBER (IBytes), IBytes{16_FF,16_FF,16_FF,16_FF,16_00,..}}; + MaxU64 = Int{NUMBER (IBytes), IBytes{16_FF,16_FF,16_FF,16_FF,16_FF,16_FF,16_FF,16_FF}}; PROCEDURE FromInt (x: INTEGER; n: CARDINAL; VAR i: Int): BOOLEAN; (* converts a host integer 'x' to a target integer 'i' *) Index: m3back/src/Codex86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/Codex86.m3,v retrieving revision 1.7 diff -u -r1.7 Codex86.m3 --- m3back/src/Codex86.m3 20 Jan 2010 15:01:31 -0000 1.7 +++ m3back/src/Codex86.m3 21 Jan 2010 08:04:53 -0000 @@ -381,8 +381,13 @@ VAR ins: Instruction; BEGIN <* ASSERT dest.loc = OLoc.register OR dest.loc = OLoc.mem *> - IF NOT TInt.ToInt(imm, ins.imm) THEN - t.Err("immOp: unable to convert immediate to INTEGER"); + IF NOT TInt.ToInt(imm, ins.imm) THEN + IF TInt.EQ(imm, TInt.AbsMinS32) THEN + ins.imm := 16_80000000; + t.Warn("immOp: unable to convert immediate to INTEGER"); + ELSE + t.Err("immOp: unable to convert immediate to INTEGER"); + END; END; IF TInt.GE(imm, TInt.MinS8) AND TInt.LE(imm, TInt.MaxS8) THEN ins.imsize := 1; Index: m3back/src/M3x86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/M3x86.m3,v retrieving revision 1.12 diff -u -r1.12 M3x86.m3 --- m3back/src/M3x86.m3 21 Jan 2010 07:40:35 -0000 1.12 +++ m3back/src/M3x86.m3 21 Jan 2010 08:04:53 -0000 @@ -1742,12 +1742,11 @@ u.wr.NL (); END; - u.vstack.pushimm(0); + u.vstack.pushimmT(TZero); END load_nil; PROCEDURE load_integer (u: U; t: IType; READONLY i: Target.Int) = (* push ; s0.t := i *) - VAR int: INTEGER; BEGIN IF u.debug THEN u.wr.Cmd ("load_integer"); @@ -1756,11 +1755,8 @@ u.wr.NL (); END; - IF NOT TInt.ToInt(i, int) THEN - u.Err("load_integer: failed to convert target integer"); - END; u.vstack.unlock(); - u.vstack.pushimm(int); + u.vstack.pushimmT(i); END load_integer; PROCEDURE load_float (u: U; t: RType; READONLY f: Target.Float) = @@ -2011,7 +2007,7 @@ load_stack_param (u, Type.Addr, 1); pop_param (u, Type.Addr); u.vstack.discard (2); - u.vstack.pushimm (s * 8); + u.vstack.pushimmI (s * 8); pop_param (u, Type.Int32); call_int_proc (u, Builtin.set_union); END set_union; @@ -2030,7 +2026,7 @@ load_stack_param (u, Type.Addr, 1); pop_param (u, Type.Addr); u.vstack.discard (2); - u.vstack.pushimm (s * 8); + u.vstack.pushimmI (s * 8); pop_param (u, Type.Int32); call_int_proc (u, Builtin.set_difference); END set_difference; @@ -2049,7 +2045,7 @@ load_stack_param (u, Type.Addr, 1); pop_param (u, Type.Addr); u.vstack.discard (2); - u.vstack.pushimm (s * 8); + u.vstack.pushimmI (s * 8); pop_param (u, Type.Int32); call_int_proc (u, Builtin.set_intersection); END set_intersection; @@ -2068,7 +2064,7 @@ load_stack_param (u, Type.Addr, 1); pop_param (u, Type.Addr); u.vstack.discard (2); - u.vstack.pushimm (s * 8); + u.vstack.pushimmI (s * 8); pop_param (u, Type.Int32); call_int_proc (u, Builtin.set_sym_difference); END set_sym_difference; @@ -2105,12 +2101,12 @@ IF op = CompareOp.EQ OR op = CompareOp.NE THEN proc := Builtin.memcmp; start_int_proc (u, proc); - u.vstack.pushimm(s); + u.vstack.pushimmI(s); pop_param(u, Type.Addr); pop_param(u, Type.Addr); pop_param(u, Type.Addr); call_int_proc (u, proc); - u.vstack.pushimm(0); + u.vstack.pushimmT(TZero); condset(u, CompareOpCond [op], t); ELSE proc := CompareOpProc [op]; @@ -2118,7 +2114,7 @@ u.vstack.swap(); pop_param(u, Type.Addr); pop_param(u, Type.Addr); - u.vstack.pushimm(s * 8); + u.vstack.pushimmI(s * 8); pop_param(u, Type.Int32); call_int_proc (u, proc); END; @@ -2807,7 +2803,7 @@ start_int_proc (u, Builtin.memset); pop_param (u, z); - u.vstack.pushimm (0); + u.vstack.pushimmT (TZero); pop_param (u, Type.Int32); pop_param (u, Type.Addr); call_int_proc (u, Builtin.memset); @@ -3701,7 +3697,7 @@ END; IF realproc.lev = 0 THEN - u.vstack.pushimm(0); + u.vstack.pushimmT(TZero); ELSE u.vstack.unlock(); u.vstack.pushnew(Type.Addr, Force.anyreg); Index: m3back/src/Stackx86.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/Stackx86.i3,v retrieving revision 1.3 diff -u -r1.3 Stackx86.i3 --- m3back/src/Stackx86.i3 20 Jan 2010 15:01:31 -0000 1.3 +++ m3back/src/Stackx86.i3 21 Jan 2010 08:04:53 -0000 @@ -41,7 +41,8 @@ set_warning_handler (warn: WarningHandler); push (READONLY mvar: MVar); pushnew (type: MType; force: Force; set := RegSet {}); - pushimm (imm: INTEGER); + pushimmI (imm: INTEGER); + pushimmT (imm: Target.Int); pop (READONLY mvar: MVar); doloadaddress (v: x86Var; o: ByteOffset); dobin (op: Op; symmetric, overwritesdest: BOOLEAN): BOOLEAN; Index: m3back/src/Stackx86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/Stackx86.m3,v retrieving revision 1.7 diff -u -r1.7 Stackx86.m3 --- m3back/src/Stackx86.m3 21 Jan 2010 07:40:35 -0000 1.7 +++ m3back/src/Stackx86.m3 21 Jan 2010 08:04:53 -0000 @@ -61,7 +61,8 @@ set_warning_handler := set_warning_handler; push := push; pushnew := pushnew; - pushimm := pushimm; + pushimmI := pushimmI; + pushimmT := pushimmT; pop := pop; doloadaddress := doloadaddress; dobin := dobin; @@ -608,7 +609,7 @@ RETURN -1; END pos; -PROCEDURE pushimm (t: T; imm: INTEGER) = +PROCEDURE pushimmT (t: T; imm: Target.Int) = BEGIN IF t.stacktop = t.vstacklimit THEN expand_stack(t); @@ -616,14 +617,21 @@ WITH stack0 = t.vstack[t.stacktop] DO stack0.loc := OLoc.imm; - IF NOT TInt.FromInt(imm, Target.Integer.bytes, stack0.imm) THEN - t.Err("pushimm: unable to convert to target integer"); - END; + stack0.imm := imm; stack0.stackp := t.stacktop; END; INC(t.stacktop); - END pushimm; + END pushimmT; + +PROCEDURE pushimmI (t: T; immI: INTEGER) = + VAR immT: Target.Int; + BEGIN + IF NOT TInt.FromInt(immI, Target.Integer.bytes, immT) THEN + t.Err("pushimmI: unable to convert to target integer"); + END; + t.pushimmT(immT); + END pushimmI; PROCEDURE pushnew (t: T; type: MType; force: Force; set := RegSet {}) = VAR hintaddr := type = Type.Addr;