? m3back/src/t1 Index: m3back/src/Codex86.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/Codex86.i3,v retrieving revision 1.30 diff -u -r1.30 Codex86.i3 --- m3back/src/Codex86.i3 26 Feb 2010 11:02:32 -0000 1.30 +++ m3back/src/Codex86.i3 26 Feb 2010 12:47:59 -0000 @@ -8,10 +8,10 @@ INTERFACE Codex86; -IMPORT M3CG, M3ObjFile, TFloat; +IMPORT M3CG, M3ObjFile, TFloat, Target; FROM M3CG IMPORT MType, Label, ByteOffset; FROM M3CG_Ops IMPORT ErrorHandler; -IMPORT M3x86Rep, Wrx86, M3BackInt; +IMPORT M3x86Rep, Wrx86; FROM M3x86Rep IMPORT Operand, NRegs, MVar, x86Var, x86Proc, Regno; TYPE T <: Public; @@ -45,14 +45,14 @@ fstack_swap (); fstack_discard (); f_loadlit (READONLY flarr: FloatBytes; type: MType); - immOp (op: Op; READONLY dest: Operand; READONLY imm: M3BackInt.Int); + immOp (op: Op; READONLY dest: Operand; READONLY imm: Target.IntN); binOp (op: Op; READONLY dest, src: Operand); tableOp (op: Op; READONLY dest, index: Operand; scale: INTEGER; table: MVar); swapOp (READONLY dest, src: Operand); movOp (READONLY dest, src: Operand); movDummyReloc (READONLY dest: Operand; sym: INTEGER); - movImmT (READONLY dest: Operand; imm: M3BackInt.Int); + movImmT (READONLY dest: Operand; imm: Target.IntN); movImmI (READONLY dest: Operand; imm: INTEGER); MOVSWOp (); STOSWOp (); Index: m3back/src/Codex86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/Codex86.m3,v retrieving revision 1.92 diff -u -r1.92 Codex86.m3 --- m3back/src/Codex86.m3 26 Feb 2010 11:02:32 -0000 1.92 +++ m3back/src/Codex86.m3 26 Feb 2010 12:47:59 -0000 @@ -9,7 +9,7 @@ MODULE Codex86; IMPORT Fmt, TargetMap, M3x86Rep, M3ID, M3CG_Ops, Word, M3ObjFile, Wrx86; -IMPORT M3BackInt, Target, TInt; +IMPORT TIntN, Target, TInt; FROM TargetMap IMPORT CG_Bytes; @@ -379,16 +379,16 @@ writecode(t, ins); END noargOp; -PROCEDURE immOp1 (t: T; op: Op; READONLY dest: Operand; READONLY imm: M3BackInt.Int) = +PROCEDURE immOp1 (t: T; op: Op; READONLY dest: Operand; READONLY imm: Target.IntN) = VAR ins: Instruction; BEGIN <* ASSERT dest.loc = OLoc.register OR dest.loc = OLoc.mem *> - IF NOT M3BackInt.ToInt(imm, ins.imm) THEN - t.Err("immOp1: unable to convert immediate to INTEGER:" & M3BackInt.ToDiagnosticText(imm)); + IF NOT TIntN.ToHostInteger(imm, ins.imm) THEN + t.Err("immOp1: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(imm)); END; - IF M3BackInt.GE(imm, M3BackInt.Int8.min) AND M3BackInt.LE(imm, M3BackInt.Int8.max) THEN + IF TIntN.GE(imm, Target.Int8.minN) AND TIntN.LE(imm, Target.Int8.maxN) THEN ins.imsize := 1; ELSE ins.imsize := 4; @@ -416,7 +416,7 @@ (* shifts by a constant 1 have a smaller encoding available *) - IF op IN SET OF Op{Op.oSHL, Op.oSHR} AND M3BackInt.EQ(imm, M3BackInt.One) THEN + IF op IN SET OF Op{Op.oSHL, Op.oSHR} AND TIntN.EQ(imm, TIntN.One) THEN INC(ins.opcode, 16_10); ins.imsize := 0; END; @@ -437,13 +437,13 @@ END END immOp1; -PROCEDURE immOp (t: T; op: Op; READONLY dest: Operand; READONLY imm: M3BackInt.Int) = +PROCEDURE immOp (t: T; op: Op; READONLY dest: Operand; READONLY imm: Target.IntN) = VAR destA: ARRAY OperandPart OF Operand; - immA: ARRAY OperandPart OF M3BackInt.Int; + immA: ARRAY OperandPart OF Target.IntN; immSize := SplitImm(dest.optype, imm, immA); destSize := SplitOperand(dest, destA); compare_label: Label; - immMinus32: M3BackInt.Int; + immMinus32: Target.IntN; shiftCount := Operand{loc := OLoc.imm, imm := imm}; BEGIN @@ -467,9 +467,9 @@ t.set_label(compare_label); | Op.oSHL => - IF M3BackInt.GE(imm, M3BackInt.ThirtyTwo) THEN - IF M3BackInt.NE(imm, M3BackInt.ThirtyTwo) THEN - EVAL M3BackInt.Subtract(imm, M3BackInt.ThirtyTwo, immMinus32); + IF TIntN.GE(imm, TIntN.ThirtyTwo) THEN + IF TIntN.NE(imm, TIntN.ThirtyTwo) THEN + EVAL TIntN.Subtract(imm, TIntN.ThirtyTwo, immMinus32); (* Ideally we'd do a virtual move in the register alloator. *) movOp1(t, destA[1], destA[0]); immOp1(t, op, destA[1], immMinus32); @@ -484,9 +484,9 @@ END | Op.oSHR => - IF M3BackInt.GE(imm, M3BackInt.ThirtyTwo) THEN - IF M3BackInt.NE(imm, M3BackInt.ThirtyTwo) THEN - EVAL M3BackInt.Subtract(imm, M3BackInt.ThirtyTwo, immMinus32); + IF TIntN.GE(imm, TIntN.ThirtyTwo) THEN + IF TIntN.NE(imm, TIntN.ThirtyTwo) THEN + EVAL TIntN.Subtract(imm, TIntN.ThirtyTwo, immMinus32); (* Ideally we'd do a virtual move in the register alloator. *) movOp1(t, destA[0], destA[1]); immOp1(t, op, destA[0], immMinus32); @@ -551,11 +551,11 @@ <* ASSERT src.loc = OLoc.register *> <* ASSERT shiftCount.loc = OLoc.register OR shiftCount.loc = OLoc.imm *> <* ASSERT shiftCount.loc # OLoc.register OR shiftCount.reg[0] = ECX *> - <* ASSERT shiftCount.loc # OLoc.imm OR (M3BackInt.GE(shiftCount.imm, M3BackInt.Int8.min) AND M3BackInt.LE(shiftCount.imm, M3BackInt.Int8.max)) *> + <* ASSERT shiftCount.loc # OLoc.imm OR (TIntN.GE(shiftCount.imm, Target.Int8.minN) AND TIntN.LE(shiftCount.imm, Target.Int8.maxN)) *> IF shiftCount.loc = OLoc.imm THEN - IF NOT M3BackInt.ToInt(shiftCount.imm, ins.imm) THEN - t.Err("binOp: unable to convert immediate to INTEGER:" & M3BackInt.ToDiagnosticText(shiftCount.imm)); + IF NOT TIntN.ToHostInteger(shiftCount.imm, ins.imm) THEN + t.Err("binOp: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(shiftCount.imm)); END; ins.imsize := 1; ELSE @@ -908,11 +908,11 @@ t.obj.relocate(t.textsym, t.obj.cursor(Seg.Text) - 4, sym); END movDummyReloc; -PROCEDURE movImmT (t: T; READONLY dest: Operand; imm: M3BackInt.Int) = +PROCEDURE movImmT (t: T; READONLY dest: Operand; imm: Target.IntN) = VAR ins: Instruction; BEGIN - IF NOT M3BackInt.ToInt(imm, ins.imm) THEN - t.Err("movImmT: unable to convert immediate to INTEGER:" & M3BackInt.ToDiagnosticText(imm)); + IF NOT TIntN.ToHostInteger(imm, ins.imm) THEN + t.Err("movImmT: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(imm)); END; IF dest.loc # OLoc.register THEN <* ASSERT dest.loc = OLoc.mem *> @@ -923,7 +923,7 @@ ins.imsize := CG_Bytes[dest.mvar.mvar_type]; writecode(t, ins); log_global_var(t, dest.mvar, -4 - CG_Bytes[dest.mvar.mvar_type]); - ELSIF M3BackInt.EQ(imm, TZero) THEN + ELSIF TIntN.EQ(imm, TZero) THEN binOp(t, Op.oXOR, dest, dest); ELSE ins.opcode := 16_B8 + dest.reg[0]; @@ -934,10 +934,10 @@ END movImmT; PROCEDURE movImmI (t: T; READONLY dest: Operand; imm: INTEGER) = - VAR immT: M3BackInt.Int; + VAR immT: Target.IntN; BEGIN - IF NOT M3BackInt.FromInt(imm, BYTESIZE(imm), immT) THEN - t.Err("movImmI: unable to convert INTEGER to M3BackInt.Int"); + IF NOT TIntN.FromHostInteger(imm, BYTESIZE(imm), immT) THEN + t.Err("movImmI: unable to convert INTEGER to Target.IntN"); END; t.movImmT(dest, immT); END movImmI; @@ -949,8 +949,8 @@ CASE src.loc OF | OLoc.imm => ins.opcode := 16_68; - IF NOT M3BackInt.ToInt(src.imm, ins.imm) THEN - t.Err("pushOp: unable to convert immediate to INTEGER:" & M3BackInt.ToDiagnosticText(src.imm)); + IF NOT TIntN.ToHostInteger(src.imm, ins.imm) THEN + t.Err("pushOp: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(src.imm)); END; ins.imsize := 4; writecode(t, ins); @@ -1040,8 +1040,8 @@ <* ASSERT bits.loc = OLoc.register *> IF index.loc = OLoc.imm THEN - IF NOT M3BackInt.ToInt(index.imm, ins.imm) THEN - t.Err("bitOp: unable to convert immediate to INTEGER:" & M3BackInt.ToDiagnosticText(index.imm)); + IF NOT TIntN.ToHostInteger(index.imm, ins.imm) THEN + t.Err("bitOp: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(index.imm)); <* ASSERT FALSE *> END; ins.opcode := op.bitIndexInImm8Opcode1; @@ -1172,8 +1172,8 @@ IF src.loc = OLoc.imm THEN build_modrm(t, t.reg[dest.reg[0]], dest, ins); ins.opcode := 16_69; - IF NOT M3BackInt.ToInt(src.imm, ins.imm) THEN - t.Err("imulOp: unable to convert immediate to INTEGER:" & M3BackInt.ToDiagnosticText(src.imm)); + IF NOT TIntN.ToHostInteger(src.imm, ins.imm) THEN + t.Err("imulOp: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(src.imm)); END; ins.imsize := 4; writecode(t, ins); @@ -1573,8 +1573,8 @@ ins.opcode := 16_88; IF val.loc = OLoc.imm THEN ins.opcode := 16_C6; - IF NOT M3BackInt.ToInt(val.imm, ins.imm) THEN - t.Err("store_ind1: unable to convert immediate to INTEGER:" & M3BackInt.ToDiagnosticText(val.imm)); + IF NOT TIntN.ToHostInteger(val.imm, ins.imm) THEN + t.Err("store_ind1: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(val.imm)); END; ins.imsize := CG_Bytes[type]; END; @@ -2039,7 +2039,7 @@ CASE op.loc OF OLoc.fstack => Mn (t, " FST"); | OLoc.register => Mn (t, " ", RegName[op.reg[0]]); - | OLoc.imm => Mn (t, " $", M3BackInt.ToText (op.imm)); + | OLoc.imm => Mn (t, " $", TIntN.ToText (op.imm)); | OLoc.mem => MnMVar (t, op.mvar); END END @@ -2096,10 +2096,10 @@ END; END MnProc; -PROCEDURE MnImmTInt(t: T; READONLY imm: M3BackInt.Int) = +PROCEDURE MnImmTInt(t: T; READONLY imm: Target.IntN) = BEGIN IF t.debug THEN - Mn(t, " $", M3BackInt.ToText (imm)); + Mn(t, " $", TIntN.ToText (imm)); END; END MnImmTInt; Index: m3back/src/M3x86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/M3x86.m3,v retrieving revision 1.142 diff -u -r1.142 M3x86.m3 --- m3back/src/M3x86.m3 26 Feb 2010 11:02:32 -0000 1.142 +++ m3back/src/M3x86.m3 26 Feb 2010 12:47:59 -0000 @@ -9,7 +9,7 @@ IMPORT Wr, Text, Fmt, IntRefTbl, Word; IMPORT M3CG, M3ID, M3CG_Ops, Target, TFloat; -IMPORT M3BackInt, M3BackWord; +IMPORT TIntN, TWordN; IMPORT M3ObjFile, TargetMap; FROM TargetMap IMPORT CG_Bytes; @@ -249,11 +249,10 @@ runtime := NEW (IntRefTbl.Default).init (20)); BEGIN - M3BackInt.Init(); - IntType[Type. Int32] := M3BackInt.Int32; - IntType[Type. Int64] := M3BackInt.Int64; - IntType[Type.Word32] := M3BackInt.Word32; - IntType[Type.Word64] := M3BackInt.Word64; + IntType[Type. Int32] := Target.Int32; + IntType[Type. Int64] := Target.Int64; + IntType[Type.Word32] := Target.Word32; + IntType[Type.Word64] := Target.Word64; IF logfile # NIL THEN u.debug := TRUE; @@ -496,8 +495,8 @@ PROCEDURE declare_subrange (u: U; t, domain: TypeUID; READONLY xmin, xmax: Target.Int; s: BitSize) = - VAR min := M3BackInt.FromTargetInt(xmin, NUMBER(xmin)); - max := M3BackInt.FromTargetInt(xmax, NUMBER(xmax)); + VAR min := TIntN.FromTargetInt(xmin, NUMBER(xmin)); + max := TIntN.FromTargetInt(xmax, NUMBER(xmax)); BEGIN IF u.debug THEN u.wr.Cmd ("declare_subrange"); @@ -1099,7 +1098,7 @@ IF u.debug THEN u.wr.Cmd ("init_int"); u.wr.Int (o); - u.wr.TInt (M3BackInt.FromTargetInt(value, CG_Bytes[t])); + u.wr.TInt (TIntN.FromTargetInt(value, CG_Bytes[t])); u.wr.TName (t); u.wr.NL (); END; @@ -1365,7 +1364,7 @@ u.cg.pushOp(u.cg.reg[EBP]); u.cg.movOp(u.cg.reg[EBP], u.cg.reg[ESP]); - u.cg.immOp(Op.oSUB, u.cg.reg[ESP], M3BackInt.Word16.max); + u.cg.immOp(Op.oSUB, u.cg.reg[ESP], Target.Word16.maxN); u.procframe_ptr := u.obj.cursor(Seg.Text) - 4; u.cg.pushOp(u.cg.reg[EBX]); @@ -1797,7 +1796,7 @@ PROCEDURE load_integer (u: U; t: IType; READONLY j: Target.Int) = (* push ; s0.t := i *) - VAR i := M3BackInt.FromTargetInt(j, CG_Bytes[t]); + VAR i := TIntN.FromTargetInt(j, CG_Bytes[t]); BEGIN IF u.debug THEN u.wr.Cmd ("load_integer"); @@ -2136,7 +2135,7 @@ stack1 = u.vstack.pos(1, "set_singleton") DO (* Better would be: - IF u.vstack.loc(stack0) # OLoc.imm OR M3BackWord.GT(u.vstack.op(stack0).imm, M3BackInt.MaxU8) THEN + IF u.vstack.loc(stack0) # OLoc.imm OR TWordN.GT(u.vstack.op(stack0).imm, TIntN.MaxU8) THEN u.vstack.find(stack0, Force.anyreg); ELSE u.vstack.find(stack0, Force.any); @@ -2257,7 +2256,7 @@ <* ASSERT u.vstack.loc(stack0) # OLoc.imm *> - (*IF u.vstack.loc(stack0) # OLoc.imm OR M3BackWord.GT(u.vstack.op(stack0).imm, M3BackInt.MaxU8) THEN*) + (*IF u.vstack.loc(stack0) # OLoc.imm OR TWordN.GT(u.vstack.op(stack0).imm, TIntN.MaxU8) THEN*) u.vstack.find(stack0, Force.anyreg); (*ELSE*) (*u.vstack.find(stack0, Force.any);*) @@ -2273,7 +2272,7 @@ PROCEDURE not (u: U; t: IType) = (* s0.t := Word.Not (s0.t) *) - VAR not: M3BackInt.Int; + VAR not: Target.IntN; BEGIN IF u.debug THEN u.wr.Cmd ("not"); @@ -2283,7 +2282,7 @@ WITH stack0 = u.vstack.pos(0, "not") DO IF u.vstack.loc(stack0) = OLoc.imm THEN - M3BackWord.Not (u.vstack.op(stack0).imm, not); + TWordN.Not (u.vstack.op(stack0).imm, not); u.vstack.set_imm(stack0, not); ELSE u.vstack.unlock(); @@ -2348,8 +2347,8 @@ PROCEDURE shift_left (u: U; t: IType) = (* s1.t := Word.Shift (s1.t, s0.t) ; pop *) - VAR shiftResult: M3BackInt.Int; - and: M3BackInt.Int; + VAR shiftResult: Target.IntN; + and: Target.IntN; shiftCount: INTEGER; BEGIN IF u.debug THEN @@ -2363,27 +2362,27 @@ stack1 = u.vstack.pos(1, "shift_left") DO IF u.vstack.loc(stack0) = OLoc.imm THEN IF u.vstack.loc(stack1) = OLoc.imm THEN - IF NOT M3BackInt.ToInt(u.vstack.op(stack0).imm, shiftCount) THEN + IF NOT TIntN.ToHostInteger(u.vstack.op(stack0).imm, shiftCount) THEN u.Err("unable to convert shift count to host integer"); END; (* shift constant by a constant *) - M3BackWord.Shift(u.vstack.op(stack1).imm, shiftCount, shiftResult); + TWordN.Shift(u.vstack.op(stack1).imm, shiftCount, shiftResult); u.vstack.set_imm(stack1, shiftResult); ELSE (* shift non-constant by a constant *) - M3BackWord.And(u.vstack.op(stack0).imm, MaximumShift[t], and); + TWordN.And(u.vstack.op(stack0).imm, MaximumShift[t], and); u.vstack.set_imm(stack0, and); - IF M3BackInt.NE(u.vstack.op(stack0).imm, TZero) THEN + IF TIntN.NE(u.vstack.op(stack0).imm, TZero) THEN u.vstack.find(stack1, Force.anytemp); u.cg.immOp(Op.oSHL, u.vstack.op(stack1), u.vstack.op(stack0).imm); u.vstack.newdest(u.vstack.op(stack1)); END END ELSE - IF (u.vstack.loc(stack1) # OLoc.imm) OR M3BackInt.NE(u.vstack.op(stack1).imm, TZero) THEN + IF (u.vstack.loc(stack1) # OLoc.imm) OR TIntN.NE(u.vstack.op(stack1).imm, TZero) THEN (* shift non-constant *) @@ -2410,8 +2409,8 @@ PROCEDURE shift_right (u: U; t: IType) = (* s1.t := Word.Shift (s1.t, -s0.t) ; pop *) VAR shiftCount: INTEGER; - shift: M3BackInt.Int; - and: M3BackInt.Int; + shift: Target.IntN; + and: Target.IntN; BEGIN IF u.debug THEN u.wr.Cmd ("shift_right"); @@ -2427,18 +2426,18 @@ (* shift constant by a constant *) - IF NOT M3BackInt.ToInt(u.vstack.op(stack0).imm, shiftCount) THEN + IF NOT TIntN.ToHostInteger(u.vstack.op(stack0).imm, shiftCount) THEN u.Err("unable to convert shift count to host integer"); END; - M3BackWord.Shift(u.vstack.op(stack1).imm, -shiftCount, shift); + TWordN.Shift(u.vstack.op(stack1).imm, -shiftCount, shift); u.vstack.set_imm(stack1, shift); ELSE (* shift a non-constant by a constant *) - M3BackWord.And(u.vstack.op(stack0).imm, MaximumShift[t], and); + TWordN.And(u.vstack.op(stack0).imm, MaximumShift[t], and); u.vstack.set_imm(stack0, and); - IF M3BackInt.NE(u.vstack.op(stack0).imm, TZero) THEN + IF TIntN.NE(u.vstack.op(stack0).imm, TZero) THEN u.vstack.find(stack1, Force.anytemp); u.cg.immOp(Op.oSHR, u.vstack.op(stack1), u.vstack.op(stack0).imm); u.vstack.newdest(u.vstack.op(stack1)); @@ -2448,7 +2447,7 @@ (* shift a non-constant or non-zero *) - IF ((u.vstack.loc(stack1) # OLoc.imm) OR (M3BackInt.NE(u.vstack.op(stack1).imm, TZero))) THEN + IF ((u.vstack.loc(stack1) # OLoc.imm) OR (TIntN.NE(u.vstack.op(stack1).imm, TZero))) THEN IF Is64(t) THEN do_custom_calling_convention_shift_64 (u, Builtin.shift_right_64); RETURN; @@ -2488,8 +2487,8 @@ PROCEDURE rotate_left (u: U; t: IType) = (* s1.t := Word.Rotate (s1.t, s0.t) ; pop *) VAR rotateCount: INTEGER; - rotate: M3BackInt.Int; - and: M3BackInt.Int; + rotate: Target.IntN; + and: Target.IntN; BEGIN IF u.debug THEN u.wr.Cmd ("rotate_left"); @@ -2502,13 +2501,13 @@ stack1 = u.vstack.pos(1, "rotate_left") DO IF u.vstack.loc(stack0) = OLoc.imm THEN IF u.vstack.loc(stack1) = OLoc.imm THEN - IF NOT M3BackInt.ToInt(u.vstack.op(stack0).imm, rotateCount) THEN + IF NOT TIntN.ToHostInteger(u.vstack.op(stack0).imm, rotateCount) THEN u.Err("unable to convert rotate count to host integer"); END; - M3BackWord.Rotate(u.vstack.op(stack1).imm, rotateCount, rotate); + TWordN.Rotate(u.vstack.op(stack1).imm, rotateCount, rotate); u.vstack.set_imm(stack1, rotate); ELSE - M3BackWord.And(u.vstack.op(stack0).imm, MaximumShift[t], and); + TWordN.And(u.vstack.op(stack0).imm, MaximumShift[t], and); u.vstack.set_imm(stack0, and); IF Is64(t) THEN do_rotate_or_shift_64(u, Builtin.rotate_left64); @@ -2541,8 +2540,8 @@ PROCEDURE rotate_right (u: U; t: IType) = (* s1.t := Word.Rotate (s1.t, -s0.t) ; pop *) VAR rotateCount: INTEGER; - rotate: M3BackInt.Int; - and: M3BackInt.Int; + rotate: Target.IntN; + and: Target.IntN; BEGIN IF u.debug THEN u.wr.Cmd ("rotate_right"); @@ -2555,13 +2554,13 @@ stack1 = u.vstack.pos(1, "rotate_right") DO IF u.vstack.loc(stack0) = OLoc.imm THEN IF u.vstack.loc(stack1) = OLoc.imm THEN - IF NOT M3BackInt.ToInt(u.vstack.op(stack0).imm, rotateCount) THEN + IF NOT TIntN.ToHostInteger(u.vstack.op(stack0).imm, rotateCount) THEN u.Err("unable to convert rotate count to host integer"); END; - M3BackWord.Rotate(u.vstack.op(stack1).imm, -rotateCount, rotate); + TWordN.Rotate(u.vstack.op(stack1).imm, -rotateCount, rotate); u.vstack.set_imm(stack1, rotate); ELSE - M3BackWord.And(u.vstack.op(stack0).imm, MaximumShift[t], and); + TWordN.And(u.vstack.op(stack0).imm, MaximumShift[t], and); u.vstack.set_imm(stack0, and); IF Is64(t) THEN do_rotate_or_shift_64(u, Builtin.rotate_right64); @@ -2776,7 +2775,7 @@ (* Mem[s2.A:s0.z] := Mem[s1.A:s0.z]; pop(3)*) CONST Mover = ARRAY BOOLEAN OF Builtin { Builtin.memcpy, Builtin.memmove }; VAR n: INTEGER; mover := Mover [overlap]; - shift: M3BackInt.Int; + shift: Target.IntN; BEGIN IF u.debug THEN u.wr.Cmd ("copy_n"); @@ -2788,7 +2787,7 @@ WITH stack0 = u.vstack.pos(0, "copy_n") DO IF u.vstack.loc(stack0) = OLoc.imm THEN - IF NOT M3BackInt.ToInt(u.vstack.op(stack0).imm, n) THEN + IF NOT TIntN.ToHostInteger(u.vstack.op(stack0).imm, n) THEN u.Err("copy_n: unable to convert to host integer"); END; u.vstack.discard(1); @@ -2802,9 +2801,9 @@ u.vstack.unlock(); CASE CG_Bytes[t] OF - 2 => shift := M3BackInt.One; - | 4 => shift := M3BackInt.Two; - | 8 => shift := M3BackInt.Three; + 2 => shift := TIntN.One; + | 4 => shift := TIntN.Two; + | 8 => shift := TIntN.Three; ELSE u.Err("Unknown MType size in copy_n"); END; @@ -2851,7 +2850,7 @@ END inline_copy; PROCEDURE string_copy (u: U; n, size: INTEGER; forward: BOOLEAN) = - VAR tn, tNMinus1, tsize, tint: M3BackInt.Int; + VAR tn, tNMinus1, tsize, tint: Target.IntN; BEGIN u.vstack.corrupt(ECX, operandPart := 0); u.cg.movImmI(u.cg.reg[ECX], n); @@ -2859,16 +2858,16 @@ IF forward THEN u.cg.noargOp(Op.oCLD); ELSE - IF NOT M3BackInt.FromInt(n, M3BackInt.Integer.bytes, tn) THEN + IF NOT TIntN.FromHostInteger(n, Target.Integer.bytes, tn) THEN u.Err("string_copy: unable to convert n to target int"); END; - IF NOT M3BackInt.FromInt(size, M3BackInt.Integer.bytes, tsize) THEN + IF NOT TIntN.FromHostInteger(size, Target.Integer.bytes, tsize) THEN u.Err("string_copy: unable to convert size to target int"); END; - IF NOT M3BackInt.Subtract(tn, M3BackInt.One, tNMinus1) THEN + IF NOT TIntN.Subtract(tn, TIntN.One, tNMinus1) THEN u.Err("string_copy: Subtract overflowed"); END; - IF NOT M3BackInt.Multiply(tNMinus1, tsize, tint) THEN + IF NOT TIntN.Multiply(tNMinus1, tsize, tint) THEN u.Err("string_copy: Multiply overflowed"); END; u.cg.immOp(Op.oADD, u.cg.reg[ESI], tint); @@ -2967,7 +2966,7 @@ PROCEDURE zero_n (u: U; z: IType; t: MType) = (* Mem[s1.A:s0.z] := 0; pop(2) *) VAR n: INTEGER; - shift: M3BackInt.Int; + shift: Target.IntN; BEGIN IF u.debug THEN u.wr.Cmd ("zero_n"); @@ -2978,7 +2977,7 @@ WITH stack0 = u.vstack.pos(0, "zero_n") DO IF u.vstack.loc(stack0) = OLoc.imm THEN - IF NOT M3BackInt.ToInt(u.vstack.op(stack0).imm, n) THEN + IF NOT TIntN.ToHostInteger(u.vstack.op(stack0).imm, n) THEN u.Err("zero_n: unable to convert to host integer"); END; u.vstack.discard(1); @@ -2993,9 +2992,9 @@ u.vstack.find(stack0, Force.anyreg); CASE CG_Bytes[t] OF - 2 => shift := M3BackInt.One; - | 4 => shift := M3BackInt.Two; - | 8 => shift := M3BackInt.Three; + 2 => shift := TIntN.One; + | 4 => shift := TIntN.Two; + | 8 => shift := TIntN.Three; ELSE u.Err("Unknown MType size in zero_n"); END; @@ -3206,7 +3205,7 @@ u.vstack.unlock(); WITH stack0 = u.vstack.pos(0, "check_nil") DO IF u.vstack.loc(stack0) = OLoc.imm THEN - IF M3BackInt.EQ(u.vstack.op(stack0).imm, TZero) THEN + IF TIntN.EQ(u.vstack.op(stack0).imm, TZero) THEN reportfault(u, code); END ELSE @@ -3228,7 +3227,7 @@ PROCEDURE check_lo (u: U; t: IType; READONLY j: Target.Int; code: RuntimeError) = (* IF (s0.t < i) THEN abort(code) *) VAR safelab: Label; - i := M3BackInt.FromTargetInt(j, CG_Bytes[t]); + i := TIntN.FromTargetInt(j, CG_Bytes[t]); BEGIN IF u.debug THEN u.wr.Cmd ("check_lo"); @@ -3241,14 +3240,14 @@ u.vstack.unlock(); WITH stack0 = u.vstack.pos(0, "check_lo") DO IF u.vstack.loc(stack0) = OLoc.imm THEN - IF M3BackInt.LT(u.vstack.op(stack0).imm, i) THEN + IF TIntN.LT(u.vstack.op(stack0).imm, i) THEN reportfault(u, code); END ELSE u.vstack.find(stack0, Force.anyreg); - IF M3BackInt.GE(u.vstack.lower(u.vstack.reg(stack0)), i) THEN + IF TIntN.GE(u.vstack.lower(u.vstack.reg(stack0)), i) THEN (* ok *) - ELSIF M3BackInt.LT(u.vstack.upper(u.vstack.reg(stack0)), i) THEN + ELSIF TIntN.LT(u.vstack.upper(u.vstack.reg(stack0)), i) THEN reportfault(u, code); ELSE u.cg.immOp(Op.oCMP, u.vstack.op(stack0), i); @@ -3265,7 +3264,7 @@ PROCEDURE check_hi (u: U; t: IType; READONLY j: Target.Int; code: RuntimeError) = (* IF (i < s0.t) THEN abort(code) *) VAR safelab: Label; - i := M3BackInt.FromTargetInt(j, CG_Bytes[t]); + i := TIntN.FromTargetInt(j, CG_Bytes[t]); BEGIN IF u.debug THEN u.wr.Cmd ("check_hi"); @@ -3278,14 +3277,14 @@ u.vstack.unlock(); WITH stack0 = u.vstack.pos(0, "check_hi") DO IF u.vstack.loc(stack0) = OLoc.imm THEN - IF M3BackInt.LT(i, u.vstack.op(stack0).imm) THEN + IF TIntN.LT(i, u.vstack.op(stack0).imm) THEN reportfault(u, code); END ELSE u.vstack.find(stack0, Force.anyreg); - IF M3BackInt.LE(u.vstack.upper(u.vstack.reg(stack0)), i) THEN + IF TIntN.LE(u.vstack.upper(u.vstack.reg(stack0)), i) THEN (* ok *) - ELSIF M3BackInt.GT(u.vstack.lower(u.vstack.reg(stack0)), i) THEN + ELSIF TIntN.GT(u.vstack.lower(u.vstack.reg(stack0)), i) THEN reportfault(u, code); ELSE u.cg.immOp(Op.oCMP, u.vstack.op(stack0), i); @@ -3301,10 +3300,10 @@ PROCEDURE check_range (u: U; t: IType; READONLY xa, xb: Target.Int; code: RuntimeError) = (* IF (s0.t < a) OR (b < s0.t) THEN abort(code) *) - VAR lo, hi: M3BackInt.Int; + VAR lo, hi: Target.IntN; safelab, outrange: Label; - a := M3BackInt.FromTargetInt(xa, CG_Bytes[t]); - b := M3BackInt.FromTargetInt(xb, CG_Bytes[t]); + a := TIntN.FromTargetInt(xa, CG_Bytes[t]); + b := TIntN.FromTargetInt(xb, CG_Bytes[t]); BEGIN IF u.debug THEN u.wr.Cmd ("check_range"); @@ -3318,7 +3317,7 @@ WITH stack0 = u.vstack.pos(0, "check_range") DO IF u.vstack.loc(stack0) = OLoc.imm THEN lo := u.vstack.op(stack0).imm; - IF M3BackInt.LT(lo, a) OR M3BackInt.LT(b, lo) THEN + IF TIntN.LT(lo, a) OR TIntN.LT(b, lo) THEN reportfault(u, code); END; RETURN; @@ -3328,15 +3327,15 @@ WITH reg = u.vstack.reg(stack0) DO lo := u.vstack.lower(reg); hi := u.vstack.upper(reg); - IF M3BackInt.LE(a, lo) AND M3BackInt.LE(hi, b) THEN + IF TIntN.LE(a, lo) AND TIntN.LE(hi, b) THEN (* ok *) - ELSIF M3BackInt.LT(hi, a) OR M3BackInt.LT(b, lo) THEN + ELSIF TIntN.LT(hi, a) OR TIntN.LT(b, lo) THEN reportfault(u, code); - ELSIF M3BackInt.LE(hi, b) THEN + ELSIF TIntN.LE(hi, b) THEN check_lo(u, t, xa, code); - ELSIF M3BackInt.GE(lo, a) THEN + ELSIF TIntN.GE(lo, a) THEN check_hi(u, t, xb, code); - ELSIF M3BackInt.EQ(a, TZero) THEN + ELSIF TIntN.EQ(a, TZero) THEN (* 0 <= x <= b ==> UNSIGNED(x) <= b *) safelab := u.cg.reserve_labels(1, TRUE); u.cg.immOp(Op.oCMP, u.vstack.op(stack0), b); @@ -3383,7 +3382,7 @@ stack1 = u.vstack.pos(1, "check_index") DO IF u.vstack.loc(stack0) = OLoc.imm AND u.vstack.loc(stack1) = OLoc.imm THEN - IF M3BackWord.LE(u.vstack.op(stack0).imm, u.vstack.op(stack1).imm) THEN + IF TWordN.LE(u.vstack.op(stack0).imm, u.vstack.op(stack1).imm) THEN reportfault(u, code); END ELSE @@ -3504,7 +3503,7 @@ PROCEDURE add_offset (u: U; i: INTEGER) = (* s0.A := s0.A + i *) - VAR ti, imm_plus_i: M3BackInt.Int; + VAR ti, imm_plus_i: Target.IntN; BEGIN IF u.debug THEN u.wr.Cmd ("add_offset"); @@ -3512,14 +3511,14 @@ u.wr.NL (); END; - IF NOT M3BackInt.FromInt(i, M3BackInt.Integer.bytes, ti) THEN + IF NOT TIntN.FromHostInteger(i, Target.Integer.bytes, ti) THEN u.Err("add_offset: failed to convert i to target integer"); END; u.vstack.unlock(); WITH stack0 = u.vstack.pos(0, "add_offset") DO IF u.vstack.loc(stack0) = OLoc.imm THEN - IF NOT M3BackInt.Add(u.vstack.op(stack0).imm, ti, imm_plus_i) THEN + IF NOT TIntN.Add(u.vstack.op(stack0).imm, ti, imm_plus_i) THEN u.Err("add_offset: Add overflowed"); END; u.vstack.set_imm(stack0, imm_plus_i); @@ -3697,9 +3696,9 @@ IF Target.FloatType [t] THEN <* ASSERT depth = 0 *> IF t = Type.Reel THEN - u.cg.immOp(Op.oSUB, u.cg.reg[ESP], M3BackInt.Four); + u.cg.immOp(Op.oSUB, u.cg.reg[ESP], TIntN.Four); ELSE - u.cg.immOp(Op.oSUB, u.cg.reg[ESP], M3BackInt.Eight); + u.cg.immOp(Op.oSUB, u.cg.reg[ESP], TIntN.Eight); END; u.cg.f_storeind(u.cg.reg[ESP], 0, t); ELSE @@ -3725,7 +3724,7 @@ * NOTE that we implement call by value, the struct is * copied to temporary space on the machine stack *) - VAR ts: M3BackInt.Int; + VAR ts: Target.IntN; BEGIN IF u.debug THEN u.wr.Cmd ("pop_struct"); @@ -3749,13 +3748,13 @@ WITH stack0 = u.vstack.pos(0, "pop_struct") DO - IF NOT M3BackInt.FromInt(s, M3BackInt.Integer.bytes, ts) THEN + IF NOT TIntN.FromHostInteger(s, Target.Integer.bytes, ts) THEN u.Err("pop_struct: unable to convert s to target int"); END; (* if the struct is "large", use rep mov to copy it to the machine stack *) - IF M3BackInt.GT(ts, M3BackInt.ThirtyTwo) THEN + IF TIntN.GT(ts, TIntN.ThirtyTwo) THEN u.cg.immOp(Op.oSUB, u.cg.reg[ESP], ts); u.vstack.find(stack0, Force.regset, RegSet { ESI }); @@ -3843,10 +3842,10 @@ RETURN 2; END SplitMVar; -PROCEDURE SplitImm(type: Type; READONLY imm: M3BackInt.Int; VAR immA: ARRAY OperandPart OF M3BackInt.Int): OperandSize = +PROCEDURE SplitImm(type: Type; READONLY imm: Target.IntN; VAR immA: ARRAY OperandPart OF Target.IntN): OperandSize = BEGIN - M3BackWord.And(imm, M3BackInt.Word32.max, immA[0]); - M3BackWord.RightShift(imm, 32, immA[1]); + TWordN.And(imm, Target.Word32.maxN, immA[0]); + TWordN.RightShift(imm, 32, immA[1]); RETURN GetTypeSize(type); END SplitImm; @@ -3864,7 +3863,7 @@ PROCEDURE SplitOperand(READONLY op: Operand; VAR opA: ARRAY OperandPart OF Operand): OperandSize = VAR type := op.optype; mvarA: ARRAY OperandPart OF MVar; - immA: ARRAY OperandPart OF M3BackInt.Int; + immA: ARRAY OperandPart OF Target.IntN; BEGIN opA[0] := op; @@ -3901,7 +3900,7 @@ PROCEDURE call_direct (u: U; p: Proc; t: Type) = VAR realproc := NARROW(p, x86Proc); - call_param_size: M3BackInt.Int; + call_param_size: Target.IntN; (* call the procedure identified by block b. The procedure returns a value of type t. *) BEGIN @@ -3935,7 +3934,7 @@ IF (NOT realproc.stdcall) (* => caller cleans *) AND u.call_param_size[u.in_proc_call - 1] > 0 THEN - IF NOT M3BackInt.FromInt(u.call_param_size[u.in_proc_call - 1], M3BackInt.Integer.bytes, call_param_size) THEN + IF NOT TIntN.FromHostInteger(u.call_param_size[u.in_proc_call - 1], Target.Integer.bytes, call_param_size) THEN u.Err("call_direct: unable to convert param_size to target integer"); END; u.cg.immOp(Op.oADD, u.cg.reg[ESP], call_param_size); @@ -3962,7 +3961,7 @@ PROCEDURE call_indirect (u: U; t: Type; cc: CallingConvention) = (* call the procedure whose address is in s0.A and pop s0. The procedure returns a value of type t. *) - VAR call_param_size: M3BackInt.Int; + VAR call_param_size: Target.IntN; BEGIN IF u.debug THEN u.wr.Cmd ("call_indirect"); @@ -3994,7 +3993,7 @@ (* caller-cleans calling convention *) - IF NOT M3BackInt.FromInt(u.call_param_size[u.in_proc_call - 1], M3BackInt.Integer.bytes, call_param_size) THEN + IF NOT TIntN.FromHostInteger(u.call_param_size[u.in_proc_call - 1], Target.Integer.bytes, call_param_size) THEN u.Err("call_indirect: unable to convert param_size to target integer"); END; @@ -4038,11 +4037,11 @@ t := Type.Int32; | Type.Word8 => (* 8-bit unsigned integer *) - u.cg.immOp (Op.oAND, u.cg.reg[EAX], M3BackInt.Word8.max); (* EAX &= 16_FF *) + u.cg.immOp (Op.oAND, u.cg.reg[EAX], Target.Word8.maxN); (* EAX &= 16_FF *) t := Type.Word32; | Type.Word16 => (* 16-bit unsigned integer *) - u.cg.immOp (Op.oAND, u.cg.reg[EAX], M3BackInt.Word16.max); (* EAX &= 16_FFFF *) + u.cg.immOp (Op.oAND, u.cg.reg[EAX], Target.Word16.maxN); (* EAX &= 16_FFFF *) t := Type.Word32; ELSE (* value is ok *) Index: m3back/src/M3x86Rep.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/M3x86Rep.i3,v retrieving revision 1.36 diff -u -r1.36 M3x86Rep.i3 --- m3back/src/M3x86Rep.i3 26 Feb 2010 11:02:33 -0000 1.36 +++ m3back/src/M3x86Rep.i3 26 Feb 2010 12:48:00 -0000 @@ -8,7 +8,7 @@ INTERFACE M3x86Rep; -IMPORT M3CG, M3ID, M3BackInt; +IMPORT M3CG, M3ID, TIntN, Target; FROM M3CG IMPORT ByteOffset, ByteSize, Alignment; FROM M3CG IMPORT Var, Proc, Name; @@ -99,7 +99,7 @@ loc: OLoc; mvar: MVar := NoStore; reg : Regno := 0; (* seems like it should be -1 *) - imm: INTEGER := 0; (* This might change to M3BackInt.Int. *) + imm: INTEGER := 0; (* This might change to Target.IntN. *) stackp: INTEGER := 0; (* this field might go away; seems like it should be -1 *) opcode := FALSE; END; @@ -108,7 +108,7 @@ loc: OLoc; mvar: MVar := NoStore; reg := ARRAY OperandPart OF Regno{0, ..}; (* seems like it should be -1 *) - imm: M3BackInt.Int := M3BackInt.Zero; + imm: Target.IntN := TIntN.Zero; optype: Type := Type.Void; stackp: INTEGER := 0; (* seems like it should be -1 *) opcode := FALSE; @@ -141,24 +141,24 @@ PROCEDURE IsInt (t: Type): BOOLEAN; (* IsSigned *) PROCEDURE Is64 (t: Type): BOOLEAN; PROCEDURE SplitMVar(READONLY mvar: MVar; VAR mvarA: ARRAY OperandPart OF MVar): OperandSize; -PROCEDURE SplitImm(type: Type; READONLY imm: M3BackInt.Int; VAR immA: ARRAY OperandPart OF M3BackInt.Int): OperandSize; +PROCEDURE SplitImm(type: Type; READONLY imm: Target.IntN; VAR immA: ARRAY OperandPart OF Target.IntN): OperandSize; PROCEDURE SplitOperand(READONLY op: Operand; VAR opA: ARRAY OperandPart OF Operand): OperandSize; PROCEDURE GetOperandSize(READONLY op: Operand): OperandSize; PROCEDURE GetTypeSize(type: Type): OperandSize; -CONST TZero = M3BackInt.Zero; +CONST TZero = TIntN.Zero; CONST UnsignedType = ARRAY IType OF IType { Type.Word32, Type.Word32, Type.Word64, Type.Word64 }; -CONST MaximumShift = ARRAY IType OF M3BackInt.Int { M3BackInt.ThirtyOne, M3BackInt.ThirtyOne, - M3BackInt.SixtyThree, M3BackInt.SixtyThree }; +CONST MaximumShift = ARRAY IType OF Target.IntN { TIntN.ThirtyOne, TIntN.ThirtyOne, + TIntN.SixtyThree, TIntN.SixtyThree }; -CONST MinimumShift = ARRAY IType OF M3BackInt.Int { M3BackInt.MThirtyOne, M3BackInt.MThirtyOne, - M3BackInt.MSixtyThree, M3BackInt.MSixtyThree }; +CONST MinimumShift = ARRAY IType OF Target.IntN { TIntN.MThirtyOne, TIntN.MThirtyOne, + TIntN.MSixtyThree, TIntN.MSixtyThree }; CONST BitCountMask = MaximumShift; -VAR(*CONST*) IntType: ARRAY IType OF M3BackInt.Int_type; +VAR(*CONST*) IntType: ARRAY IType OF Target.Int_type; END M3x86Rep. Index: m3back/src/Stackx86.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/Stackx86.i3,v retrieving revision 1.20 diff -u -r1.20 Stackx86.i3 --- m3back/src/Stackx86.i3 26 Feb 2010 11:02:33 -0000 1.20 +++ m3back/src/Stackx86.i3 26 Feb 2010 12:48:00 -0000 @@ -11,7 +11,7 @@ FROM M3CG IMPORT Type, MType, ZType, IType, Sign, ByteOffset; FROM M3CG_Ops IMPORT ErrorHandler; -IMPORT M3x86Rep, Codex86, Wrx86, M3BackInt; +IMPORT M3x86Rep, Codex86, Wrx86, Target; FROM M3x86Rep IMPORT Operand, OLoc, MVar, Regno, Force, RegSet, FlToInt; FROM M3x86Rep IMPORT x86Proc, x86Var, OperandPart; @@ -34,7 +34,7 @@ corrupt (reg: Regno; operandPart: OperandPart); set_fstack (stackp: INTEGER); set_mvar (stackp: INTEGER; READONLY mvar: MVar); - set_imm (stackp: INTEGER; READONLY imm: M3BackInt.Int); + set_imm (stackp: INTEGER; READONLY imm: Target.IntN); loc (stackp: INTEGER): OLoc; op (stackp: INTEGER): Operand; pos (depth: INTEGER; place: TEXT): INTEGER; @@ -43,7 +43,7 @@ push (READONLY mvar: MVar); pushnew (type: MType; force: Force; set := RegSet {}); pushimmI (imm: INTEGER; type: Type); - pushimmT (imm: M3BackInt.Int; type: Type); + pushimmT (imm: Target.IntN; type: Type); pop (READONLY mvar: MVar); doloadaddress (v: x86Var; o: ByteOffset); dobin (op: Op; symmetric, overwritesdest: BOOLEAN; type: Type): BOOLEAN; @@ -70,16 +70,16 @@ doindex_address (shift, size: INTEGER; neg: BOOLEAN); docopy (type: MType; overlap: BOOLEAN); docopy_n (n: INTEGER; type: MType; overlap: BOOLEAN); - doimm (op: Op; READONLY imm: M3BackInt.Int; overwritesdest: BOOLEAN); + doimm (op: Op; READONLY imm: Target.IntN; overwritesdest: BOOLEAN); newdest (READONLY op: Operand); init (); end (); set_current_proc (p: x86Proc); reg (stackp: INTEGER): Regno; - lower (reg: Regno): M3BackInt.Int; - set_lower (reg: Regno; low: M3BackInt.Int); - upper (reg: Regno): M3BackInt.Int; - set_upper (reg: Regno; up: M3BackInt.Int); + lower (reg: Regno): Target.IntN; + set_lower (reg: Regno; low: Target.IntN); + upper (reg: Regno): Target.IntN; + set_upper (reg: Regno; up: Target.IntN); non_nil (reg: Regno): BOOLEAN; set_non_nil (reg: Regno); END; Index: m3back/src/Stackx86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/Stackx86.m3,v retrieving revision 1.100 diff -u -r1.100 Stackx86.m3 --- m3back/src/Stackx86.m3 26 Feb 2010 11:02:33 -0000 1.100 +++ m3back/src/Stackx86.m3 26 Feb 2010 12:48:00 -0000 @@ -9,7 +9,7 @@ IMPORT M3ID, M3CG, TargetMap, M3CG_Ops, M3x86Rep, Codex86, Wrx86; -IMPORT M3BackInt, M3BackWord; +IMPORT TIntN, TWordN; IMPORT Target, Fmt; FROM Target IMPORT FloatType; FROM TargetMap IMPORT CG_Bytes, CG_Align_bytes; @@ -33,7 +33,7 @@ vstacklimit := 0; reguse : ARRAY [0 .. NRegs] OF Register; current_proc : x86Proc; - rmode : ARRAY FlToInt OF M3BackInt.Int; + rmode : ARRAY FlToInt OF Target.IntN; lowset_table : x86Var; highset_table : x86Var; OVERRIDES @@ -102,9 +102,9 @@ Register = RECORD stackp : INTEGER := -1; last_store : MVar := NoStore; - last_imm : M3BackInt.Int := TZero; - lowbound : M3BackInt.Int; - upbound : M3BackInt.Int; + last_imm : Target.IntN := TZero; + lowbound : Target.IntN; + upbound : Target.IntN; imm : BOOLEAN := FALSE; locked : BOOLEAN := FALSE; non_nil : BOOLEAN := FALSE; @@ -113,7 +113,7 @@ PROCEDURE InitRegister(locked: BOOLEAN := FALSE):Register = BEGIN - RETURN Register { locked := locked, lowbound := M3BackInt.Integer.min, upbound := M3BackInt.Integer.max }; + RETURN Register { locked := locked, lowbound := Target.Integer.minN, upbound := Target.Integer.maxN }; END InitRegister; (*-------------------------------------------- register handling routines ---*) @@ -558,13 +558,13 @@ RETURN bestreg; END inreg; -PROCEDURE immreg (t: T; READONLY imm: M3BackInt.Int; set: RegSet:= RegSet {}): Regno = +PROCEDURE immreg (t: T; READONLY imm: Target.IntN; set: RegSet:= RegSet {}): Regno = VAR minprec := HighPrec * HighPrec; prec := 0; bestreg: Regno := -1; BEGIN FOR i := 0 TO NRegs DO - IF t.reguse[i].imm AND M3BackInt.EQ(imm, t.reguse[i].last_imm) THEN + IF t.reguse[i].imm AND TIntN.EQ(imm, t.reguse[i].last_imm) THEN prec := precedence(t, i); IF (set # RegSet {}) AND (NOT i IN set) THEN prec := prec * HighPrec; @@ -736,7 +736,7 @@ t.vstack[stackp].mvar := mvar; END set_mvar; -PROCEDURE set_imm (t: T; stackp: INTEGER; READONLY imm: M3BackInt.Int) = +PROCEDURE set_imm (t: T; stackp: INTEGER; READONLY imm: Target.IntN) = BEGIN t.vstack[stackp].loc := OLoc.imm; t.vstack[stackp].imm := imm; @@ -764,7 +764,7 @@ RETURN -1; END pos; -PROCEDURE pushimmT (t: T; imm: M3BackInt.Int; type: Type) = +PROCEDURE pushimmT (t: T; imm: Target.IntN; type: Type) = BEGIN maybe_expand_stack(t); @@ -779,9 +779,9 @@ END pushimmT; PROCEDURE pushimmI (t: T; immI: INTEGER; type: Type) = - VAR immT: M3BackInt.Int; + VAR immT: Target.IntN; BEGIN - IF NOT M3BackInt.FromInt(immI, M3BackInt.Integer.bytes, immT) THEN + IF NOT TIntN.FromHostInteger(immI, Target.Integer.bytes, immT) THEN t.Err("pushimmI: unable to convert to target integer"); END; t.pushimmT(immT, type); @@ -967,7 +967,7 @@ END pop; PROCEDURE doloadaddress (t: T; v: x86Var; o: ByteOffset) = - VAR to, tvoffset, ti: M3BackInt.Int; + VAR to, tvoffset, ti: Target.IntN; BEGIN unlock(t); pushnew(t, Type.Addr, Force.anyreg); @@ -975,13 +975,13 @@ WITH stop0 = t.vstack[pos(t, 0, "doloadaddress")] DO IF v.loc = VLoc.temp AND v.parent # t.current_proc THEN t.cg.get_frame(stop0.reg[0], v.parent, t.current_proc); - IF NOT M3BackInt.FromInt(o, M3BackInt.Integer.bytes, to) THEN + IF NOT TIntN.FromHostInteger(o, Target.Integer.bytes, to) THEN t.Err("doloadaddress: unable to convert o"); END; - IF NOT M3BackInt.FromInt(v.offset, M3BackInt.Integer.bytes, tvoffset) THEN + IF NOT TIntN.FromHostInteger(v.offset, Target.Integer.bytes, tvoffset) THEN t.Err("doloadaddress: unable to convert v.offset"); END; - IF NOT M3BackInt.Add(to, tvoffset, ti) THEN + IF NOT TIntN.Add(to, tvoffset, ti) THEN t.Err("dloadaddress: Add overflowed"); END; t.cg.immOp(Op.oADD, t.cg.reg[stop0.reg[0]], ti); @@ -1315,7 +1315,7 @@ END END domod; -PROCEDURE doimm (t: T; op: Op; READONLY imm: M3BackInt.Int; overwritesdest: BOOLEAN) = +PROCEDURE doimm (t: T; op: Op; READONLY imm: Target.IntN; overwritesdest: BOOLEAN) = BEGIN unlock(t); @@ -1324,7 +1324,7 @@ IF (stop0.loc = OLoc.mem AND ((overwritesdest AND NOT stop0.mvar.var.stack_temp) OR CG_Bytes[stop0.mvar.mvar_type] = 2 OR - (CG_Bytes[stop0.mvar.mvar_type] = 1 AND (M3BackInt.GT(imm, M3BackInt.Int8.max) OR M3BackInt.LT(imm, M3BackInt.Int8.min))))) + (CG_Bytes[stop0.mvar.mvar_type] = 1 AND (TIntN.GT(imm, Target.Int8.maxN) OR TIntN.LT(imm, Target.Int8.minN))))) OR stop0.loc = OLoc.imm THEN find(t, stack0, Force.anyreg); ELSE @@ -1342,13 +1342,13 @@ END doimm; PROCEDURE doneg (t: T) = - VAR neg: M3BackInt.Int; + VAR neg: Target.IntN; BEGIN unlock(t); WITH stack0 = pos(t, 0, "doneg"), stop0 = t.vstack[stack0] DO IF stop0.loc = OLoc.imm THEN - IF NOT M3BackInt.Negate(stop0.imm, neg) THEN + IF NOT TIntN.Negate(stop0.imm, neg) THEN t.Err("doneg: Negate overflowed"); END; stop0.imm := neg; @@ -1368,7 +1368,7 @@ WITH stack0 = pos(t, 0, "doabs"), stop0 = t.vstack[stack0] DO IF stop0.loc = OLoc.imm THEN - IF NOT M3BackInt.Abs(stop0.imm, stop0.imm) THEN + IF NOT TIntN.Abs(stop0.imm, stop0.imm) THEN t.Err("doabs: Abs overflowed"); END; ELSE @@ -1401,8 +1401,8 @@ PROCEDURE doshift (t: T; type: IType): BOOLEAN = VAR ovflshift, leftlab, endlab: Label; - tShiftCount: M3BackInt.Int; - shiftResult: M3BackInt.Int; + tShiftCount: Target.IntN; + shiftResult: Target.IntN; shiftCount: INTEGER; is64 := Is64(type); BEGIN @@ -1415,39 +1415,39 @@ IF stop0.loc = OLoc.imm THEN IF stop1.loc = OLoc.imm THEN - IF NOT M3BackInt.ToInt(stop0.imm, shiftCount) THEN + IF NOT TIntN.ToHostInteger(stop0.imm, shiftCount) THEN t.Err("doshift: unable to convert target integer to host integer"); END; (* shift constant by a constant *) - M3BackWord.Shift(stop1.imm, shiftCount, shiftResult); + TWordN.Shift(stop1.imm, shiftCount, shiftResult); stop1.imm := shiftResult; ELSE (* shift non-constant by a constant *) - IF M3BackInt.NE(stop0.imm, TZero) THEN + IF TIntN.NE(stop0.imm, TZero) THEN (* shift non-constant by a non-zero constant *) find(t, stack1, Force.anytemp); - IF M3BackInt.GT(stop0.imm, MaximumShift[type]) - OR M3BackInt.LT(stop0.imm, MinimumShift[type]) THEN + IF TIntN.GT(stop0.imm, MaximumShift[type]) + OR TIntN.LT(stop0.imm, MinimumShift[type]) THEN (* shifting "too far" just yields zero *) t.cg.binOp(Op.oXOR, stop1, stop1); - ELSIF M3BackInt.GT(stop0.imm, TZero) THEN + ELSIF TIntN.GT(stop0.imm, TZero) THEN (* positive shift is left shift *) t.cg.immOp(Op.oSHL, stop1, stop0.imm); ELSE - IF NOT M3BackInt.Negate(stop0.imm, tShiftCount) THEN + IF NOT TIntN.Negate(stop0.imm, tShiftCount) THEN t.Err("doshift: Negate overflowed"); END; @@ -1462,7 +1462,7 @@ END ELSE - IF ((stop1.loc # OLoc.imm) OR (M3BackInt.NE(stop1.imm, TZero))) THEN + IF ((stop1.loc # OLoc.imm) OR (TIntN.NE(stop1.imm, TZero))) THEN (* shift by a non-constant *) @@ -1485,7 +1485,7 @@ t.cg.brOp(Cond.GE, leftlab); t.cg.unOp(Op.oNEG, stop0); - t.cg.immOp(Op.oCMP, stop0, M3BackInt.ThirtyTwo); + t.cg.immOp(Op.oCMP, stop0, TIntN.ThirtyTwo); t.cg.brOp(Cond.GE, ovflshift); t.cg.unOp(Op.oSHR, stop1); t.cg.brOp(Cond.Always, endlab); @@ -1495,7 +1495,7 @@ t.cg.brOp(Cond.Always, endlab); t.cg.set_label(leftlab); (* .leftlab *) - t.cg.immOp(Op.oCMP, stop0, M3BackInt.ThirtyTwo); + t.cg.immOp(Op.oCMP, stop0, TIntN.ThirtyTwo); t.cg.brOp(Cond.GE, ovflshift); t.cg.unOp(Op.oSHL, stop1); t.cg.set_label(endlab); @@ -1526,12 +1526,12 @@ IF stop0.loc = OLoc.imm THEN IF stop1.loc = OLoc.imm THEN - IF NOT M3BackInt.ToInt(stop0.imm, rotateCount) THEN + IF NOT TIntN.ToHostInteger(stop0.imm, rotateCount) THEN t.Err("dorotate: failed to convert rotateCount to host integer"); END; - M3BackWord.Rotate(stop1.imm, rotateCount, stop1.imm); + TWordN.Rotate(stop1.imm, rotateCount, stop1.imm); ELSE - IF M3BackInt.NE(stop0.imm, TZero) THEN + IF TIntN.NE(stop0.imm, TZero) THEN IF is64 THEN (* needs work *) RETURN FALSE; @@ -1539,14 +1539,14 @@ find(t, stack1, Force.anytemp); - IF M3BackInt.GT(stop0.imm, TZero) THEN - M3BackWord.And(stop0.imm, BitCountMask[type], stop0.imm); + IF TIntN.GT(stop0.imm, TZero) THEN + TWordN.And(stop0.imm, BitCountMask[type], stop0.imm); t.cg.immOp(Op.oROL, stop1, stop0.imm); ELSE - IF NOT M3BackInt.Negate(stop0.imm, stop0.imm) THEN + IF NOT TIntN.Negate(stop0.imm, stop0.imm) THEN t.Err("dorotate: negate overflowed"); END; - M3BackWord.And(stop0.imm, BitCountMask[type], stop0.imm); + TWordN.And(stop0.imm, BitCountMask[type], stop0.imm); t.cg.immOp(Op.oROR, stop1, stop0.imm); END; @@ -1555,7 +1555,7 @@ END ELSE - IF ((stop0.loc # OLoc.imm) OR (M3BackInt.NE(stop0.imm, TZero))) THEN + IF ((stop0.loc # OLoc.imm) OR (TIntN.NE(stop0.imm, TZero))) THEN IF is64 THEN (* needs work *) RETURN FALSE; @@ -1614,7 +1614,7 @@ IF stop0.loc = OLoc.imm THEN discard(t, 1); - IF NOT M3BackInt.ToInt(stop0.imm, int) THEN + IF NOT TIntN.ToHostInteger(stop0.imm, int) THEN t.Err("doextract: failed to convert to host integer"); END; RETURN doextract_n(t, type, sign, int); @@ -1643,7 +1643,7 @@ ELSE IF stop1.loc = OLoc.imm THEN - M3BackWord.And(stop1.imm, BitCountMask[type], stop1.imm); + TWordN.And(stop1.imm, BitCountMask[type], stop1.imm); ELSE find(t, stack1, Force.regset, RegSet { ECX }); END; @@ -1672,7 +1672,7 @@ END doextract; PROCEDURE doextract_n (t: T; type: IType; sign: BOOLEAN; n: INTEGER): BOOLEAN = - VAR tn, t32MinusN, andval: M3BackInt.Int; + VAR tn, t32MinusN, andval: Target.IntN; int: INTEGER; uint_type := IntType[UnsignedType[type]]; is64 := Is64(type); @@ -1690,7 +1690,7 @@ IF stop0.loc = OLoc.imm THEN discard(t, 1); - IF NOT M3BackInt.ToInt(stop0.imm, int) THEN + IF NOT TIntN.ToHostInteger(stop0.imm, int) THEN t.Err("doextract_n: failed to convert to host integer"); END; RETURN doextract_mn(t, type, sign, int, n); @@ -1706,11 +1706,11 @@ find(t, stack0, Force.anyreg); END; - IF NOT M3BackInt.FromInt(n, M3BackInt.Integer.bytes, tn) THEN + IF NOT TIntN.FromHostInteger(n, Target.Integer.bytes, tn) THEN t.Err("doextract_n: failed to convert n to target integer"); END; - IF NOT M3BackInt.Subtract(M3BackInt.ThirtyTwo, tn, t32MinusN) THEN + IF NOT TIntN.Subtract(TIntN.ThirtyTwo, tn, t32MinusN) THEN t.Err("doextract_n: Subtract overflowed"); END; @@ -1728,7 +1728,7 @@ t.cg.unOp(Op.oSHR, stop1); IF n < uint_type.size THEN - M3BackWord.Shift(uint_type.max, n - uint_type.size, andval); + TWordN.Shift(uint_type.maxN, n - uint_type.size, andval); t.cg.immOp(Op.oAND, stop1, andval); END END; @@ -1741,7 +1741,7 @@ END doextract_n; PROCEDURE doextract_mn (t: T; type: IType; sign: BOOLEAN; m, n: INTEGER): BOOLEAN = - VAR andval, tint: M3BackInt.Int; + VAR andval, tint: Target.IntN; is64 := Is64(type); BEGIN @@ -1754,15 +1754,15 @@ END; IF stop0.loc = OLoc.imm THEN - M3BackWord.Shift(stop0.imm, -m, stop0.imm); - M3BackWord.Shift(M3BackInt.Word32.max, n - 32, tint); - M3BackWord.And(stop0.imm, tint, stop0.imm); + TWordN.Shift(stop0.imm, -m, stop0.imm); + TWordN.Shift(Target.Word32.maxN, n - 32, tint); + TWordN.And(stop0.imm, tint, stop0.imm); IF sign THEN - M3BackWord.Shift(M3BackInt.One, n - 1, tint); - M3BackWord.And(stop0.imm, tint, tint); - IF M3BackInt.NE(tint, TZero) THEN - M3BackWord.Shift(M3BackInt.Word32.max, n, tint); - M3BackWord.Or(stop0.imm, tint, stop0.imm); + TWordN.Shift(TIntN.One, n - 1, tint); + TWordN.And(stop0.imm, tint, tint); + IF TIntN.NE(tint, TZero) THEN + TWordN.Shift(Target.Word32.maxN, n, tint); + TWordN.Or(stop0.imm, tint, stop0.imm); END; END; RETURN TRUE; @@ -1771,14 +1771,14 @@ IF sign THEN find(t, stack0, Force.anyreg); IF (m + n) < 32 THEN - IF NOT M3BackInt.FromInt(32 - (m + n), M3BackInt.Integer.bytes, tint) THEN + IF NOT TIntN.FromHostInteger(32 - (m + n), Target.Integer.bytes, tint) THEN t.Err("doextract_mn: failed to convert 32 - (m + n) to target integer"); END; t.cg.immOp(Op.oSHL, stop0, tint); END; IF n < 32 THEN - IF NOT M3BackInt.FromInt(32 - n, M3BackInt.Integer.bytes, tint) THEN + IF NOT TIntN.FromHostInteger(32 - n, Target.Integer.bytes, tint) THEN t.Err("doextract_mn: failed to convert 32 - n to target integer"); END; t.cg.immOp(Op.oSAR, stop0, tint); @@ -1786,12 +1786,12 @@ ELSE find(t, stack0, Force.anyreg); IF (m + n) < 32 THEN - M3BackWord.Shift(M3BackInt.Word32.max, m + n - 32, andval); + TWordN.Shift(Target.Word32.maxN, m + n - 32, andval); t.cg.immOp(Op.oAND, stop0, andval); END; IF m > 0 THEN - IF NOT M3BackInt.FromInt(m, M3BackInt.Integer.bytes, tint) THEN + IF NOT TIntN.FromHostInteger(m, Target.Integer.bytes, tint) THEN t.Err("doextract_mn: failed to m to target integer"); END; t.cg.immOp(Op.oSHR, stop0, tint); @@ -1807,7 +1807,7 @@ PROCEDURE doinsert (t: T; type: IType): BOOLEAN = VAR maskreg: Regno; tbl: MVar; int: INTEGER; - tint: M3BackInt.Int; + tint: Target.IntN; is64 := Is64(type); BEGIN @@ -1827,14 +1827,14 @@ IF stop0.loc = OLoc.imm THEN discard(t, 1); - IF NOT M3BackInt.ToInt(stop0.imm, int) THEN + IF NOT TIntN.ToHostInteger(stop0.imm, int) THEN t.Err("doinsert: failed to convert to host integer"); END; RETURN doinsert_n(t, type, int); END; IF stop1.loc = OLoc.imm THEN - M3BackWord.And(stop1.imm, BitCountMask[type], stop1.imm); + TWordN.And(stop1.imm, BitCountMask[type], stop1.imm); ELSE find(t, stack1, Force.regset, RegSet { ECX }); END; @@ -1859,7 +1859,7 @@ t.cg.binOp(Op.oAND, stop2, t.cg.reg[maskreg]); IF stop1.loc = OLoc.imm THEN - IF M3BackInt.NE(stop1.imm, TZero) THEN + IF TIntN.NE(stop1.imm, TZero) THEN t.cg.immOp(Op.oSHL, stop2, stop1.imm); t.cg.immOp(Op.oADD, stop0, stop1.imm); END @@ -1872,10 +1872,10 @@ t.cg.tableOp(Op.oMOV, t.cg.reg[maskreg], stop0, 4, tbl); IF stop1.loc = OLoc.imm THEN - IF NOT M3BackInt.ToInt(stop1.imm, int) THEN + IF NOT TIntN.ToHostInteger(stop1.imm, int) THEN t.Err("failed to convert stop1.imm to host integer"); END; - M3BackWord.Shift(M3BackInt.Word32.max, int, tint); + TWordN.Shift(Target.Word32.maxN, int, tint); t.cg.immOp(Op.oXOR, t.cg.reg[maskreg], tint); ELSE ImportHighSet (t, tbl); @@ -1897,7 +1897,7 @@ PROCEDURE doinsert_n (t: T; type: IType; n: INTEGER): BOOLEAN = VAR tbl: MVar; maskreg: Regno; m: INTEGER; - tint: M3BackInt.Int; + tint: Target.IntN; is64 := Is64(type); BEGIN @@ -1915,7 +1915,7 @@ IF stop0.loc = OLoc.imm THEN discard(t, 1); - IF NOT M3BackInt.ToInt(stop0.imm, m) THEN + IF NOT TIntN.ToHostInteger(stop0.imm, m) THEN t.Err("doinsert_n: failed to convert to host integer"); END; RETURN doinsert_mn(t, type, m, n); @@ -1933,7 +1933,7 @@ corrupt(t, maskreg, operandPart := 0); IF n # 32 THEN - M3BackWord.Shift(M3BackInt.Word32.max, n - 32, tint); + TWordN.Shift(Target.Word32.maxN, n - 32, tint); t.cg.immOp(Op.oAND, stop1, tint); END; @@ -1963,7 +1963,7 @@ END doinsert_n; PROCEDURE doinsert_mn (t: T; type: IType; m, n: INTEGER): BOOLEAN = - VAR tint_m, mask_m, mask_m_n, mask: M3BackInt.Int; + VAR tint_m, mask_m, mask_m_n, mask: Target.IntN; uint_type := IntType[UnsignedType[type]]; is64 := Is64(type); BEGIN @@ -1987,31 +1987,31 @@ find(t, stack1, Force.anyreg); END; - M3BackWord.Shift(uint_type.max, n - uint_type.size, mask); + TWordN.Shift(uint_type.maxN, n - uint_type.size, mask); IF stop0.loc = OLoc.imm THEN - M3BackWord.And(stop0.imm, mask, stop0.imm); - M3BackWord.Shift(stop0.imm, m, stop0.imm); + TWordN.And(stop0.imm, mask, stop0.imm); + TWordN.Shift(stop0.imm, m, stop0.imm); ELSE IF (n + m) < uint_type.size THEN t.cg.immOp(Op.oAND, stop0, mask); END; IF m # 0 THEN - IF NOT M3BackInt.FromInt(m, M3BackInt.Integer.bytes, tint_m) THEN + IF NOT TIntN.FromHostInteger(m, Target.Integer.bytes, tint_m) THEN t.Err("doinsert_mn: unable to convert m to target integer"); END; t.cg.immOp(Op.oSHL, stop0, tint_m); END END; - M3BackWord.Shift(uint_type.max, m, mask_m); - M3BackWord.Shift(uint_type.max, m + n - uint_type.size, mask_m_n); - M3BackWord.Xor(mask_m, mask_m_n, mask); + TWordN.Shift(uint_type.maxN, m, mask_m); + TWordN.Shift(uint_type.maxN, m + n - uint_type.size, mask_m_n); + TWordN.Xor(mask_m, mask_m_n, mask); - IF M3BackWord.NE(mask, uint_type.max) THEN + IF TWordN.NE(mask, uint_type.maxN) THEN IF stop1.loc = OLoc.imm THEN - M3BackWord.And(stop1.imm, mask, stop1.imm); + TWordN.And(stop1.imm, mask, stop1.imm); ELSE t.cg.immOp(Op.oAND, stop1, mask); END @@ -2019,15 +2019,15 @@ IF stop1.loc = OLoc.imm THEN IF stop0.loc = OLoc.imm THEN - M3BackWord.Or(stop1.imm, stop0.imm, stop1.imm); + TWordN.Or(stop1.imm, stop0.imm, stop1.imm); ELSE swap(t); - IF stop0.loc # OLoc.imm OR M3BackInt.NE(stop0.imm, TZero) THEN + IF stop0.loc # OLoc.imm OR TIntN.NE(stop0.imm, TZero) THEN t.cg.binOp(Op.oOR, stop1, stop0); END END ELSE - IF stop0.loc # OLoc.imm OR M3BackInt.NE(stop0.imm, TZero) THEN + IF stop0.loc # OLoc.imm OR TIntN.NE(stop0.imm, TZero) THEN t.cg.binOp(Op.oOR, stop1, stop0); END END; @@ -2197,9 +2197,9 @@ PROCEDURE doindex_address (t: T; shift, size: INTEGER; neg: BOOLEAN) = VAR imsize: INTEGER; muldest: Regno; - tsize: M3BackInt.Int; - tshift: M3BackInt.Int; - tint: M3BackInt.Int; + tsize: Target.IntN; + tshift: Target.IntN; + tint: Target.IntN; BEGIN unlock(t); WITH stack0 = pos(t, 0, "doindex_address"), @@ -2210,10 +2210,10 @@ find(t, stack1, Force.anyreg, RegSet {}, TRUE); IF stop0.loc = OLoc.imm THEN - IF NOT M3BackInt.FromInt(size, M3BackInt.Integer.bytes, tsize) THEN + IF NOT TIntN.FromHostInteger(size, Target.Integer.bytes, tsize) THEN t.Err("doindex_address: failed to convert size to target integer"); END; - IF NOT M3BackInt.Multiply(stop0.imm, tsize, tint) THEN + IF NOT TIntN.Multiply(stop0.imm, tsize, tint) THEN t.Err("doindex_address: multiply overflowed"); END; stop0.imm := tint; @@ -2245,7 +2245,7 @@ END ELSIF shift > 0 THEN - IF NOT M3BackInt.FromInt(shift, M3BackInt.Integer.bytes, tshift) THEN + IF NOT TIntN.FromHostInteger(shift, Target.Integer.bytes, tshift) THEN t.Err("doindex_address: failed to convert size to target integer"); END; t.cg.immOp(Op.oSHL, stop0, tshift); @@ -2384,9 +2384,9 @@ t.cg.memFOp(FOp.fSTCW, statusop.mvar); t.cg.movOp(t.cg.reg[statreg], statusop); - t.cg.immOp(Op.oAND, t.cg.reg[statreg], M3BackInt.F3FF); + t.cg.immOp(Op.oAND, t.cg.reg[statreg], TIntN.F3FF); - IF M3BackInt.NE(t.rmode[mode], TZero) THEN + IF TIntN.NE(t.rmode[mode], TZero) THEN t.cg.immOp(Op.oOR, t.cg.reg[statreg], t.rmode[mode]); END; @@ -2433,8 +2433,8 @@ FOR i := 0 TO GetTypeSize(op.optype) - 1 DO WITH z = t.reguse[op.reg[i]] DO z.last_store := NoStore; - z.upbound := M3BackInt.Integer.max; - z.lowbound := M3BackInt.Integer.min; + z.upbound := Target.Integer.maxN; + z.lowbound := Target.Integer.minN; z.imm := FALSE; z.non_nil := FALSE; END; @@ -2488,22 +2488,22 @@ RETURN t.vstack[stackp].reg[0]; END reg; -PROCEDURE lower (t: T; reg: Regno): M3BackInt.Int = +PROCEDURE lower (t: T; reg: Regno): Target.IntN = BEGIN RETURN t.reguse[reg].lowbound; END lower; -PROCEDURE upper (t: T; reg: Regno): M3BackInt.Int = +PROCEDURE upper (t: T; reg: Regno): Target.IntN = BEGIN RETURN t.reguse[reg].upbound; END upper; -PROCEDURE set_lower (t: T; reg: Regno; newlow: M3BackInt.Int) = +PROCEDURE set_lower (t: T; reg: Regno; newlow: Target.IntN) = BEGIN t.reguse[reg].lowbound := newlow; END set_lower; -PROCEDURE set_upper (t: T; reg: Regno; newup: M3BackInt.Int) = +PROCEDURE set_upper (t: T; reg: Regno; newup: Target.IntN) = BEGIN t.reguse[reg].upbound := newup; END set_upper; @@ -2532,16 +2532,16 @@ WITH z = t.reguse[i] DO z.stackp := -1; z.last_store := NoStore; - z.upbound := M3BackInt.Integer.max; - z.lowbound := M3BackInt.Integer.min; + z.upbound := Target.Integer.maxN; + z.lowbound := Target.Integer.minN; z.imm := FALSE; z.non_nil := FALSE; z.locked := FALSE; END; END; - t.rmode := ARRAY FlToInt OF M3BackInt.Int - { TZero, M3BackInt.x0400, M3BackInt.x0800, M3BackInt.x0F00 }; + t.rmode := ARRAY FlToInt OF Target.IntN + { TZero, TIntN.x0400, TIntN.x0800, TIntN.x0F00 }; t.lowset_table := NIL; t.highset_table := NIL; END init; @@ -2621,7 +2621,7 @@ wr.OutT (OLocName [op.loc]); wr.OutT (" mvar: "); DebugMVar (op.mvar, wr); wr.OutT (" reg: "); wr.OutT (RegName [op.reg[0]]); - wr.OutT (" imm: "); wr.OutT (M3BackInt.ToText (op.imm)); + wr.OutT (" imm: "); wr.OutT (TIntN.ToText (op.imm)); wr.OutT (" stackp: "); wr.OutI (op.stackp); IF (op.opcode) THEN wr.OutT (" OPCODE"); END; END DebugOp; @@ -2634,14 +2634,14 @@ IF r.last_store # NoStore THEN wr.OutT (" mvar: "); DebugMVar (r.last_store, wr); END; - IF (NOT M3BackInt.EQ(r.last_imm, TZero)) THEN - wr.OutT (" imm: "); wr.OutT (M3BackInt.ToText (r.last_imm)); + IF (NOT TIntN.EQ(r.last_imm, TZero)) THEN + wr.OutT (" imm: "); wr.OutT (TIntN.ToText (r.last_imm)); END; - IF (NOT M3BackInt.EQ(r.lowbound, M3BackInt.Integer.min)) THEN - wr.OutT (" lo: "); wr.OutT (M3BackInt.ToText (r.lowbound)); + IF (NOT TIntN.EQ(r.lowbound, Target.Integer.minN)) THEN + wr.OutT (" lo: "); wr.OutT (TIntN.ToText (r.lowbound)); END; - IF (NOT M3BackInt.EQ(r.upbound, M3BackInt.Integer.max)) THEN - wr.OutT (" hi: "); wr.OutT (M3BackInt.ToText (r.upbound)); + IF (NOT TIntN.EQ(r.upbound, Target.Integer.maxN)) THEN + wr.OutT (" hi: "); wr.OutT (TIntN.ToText (r.upbound)); END; IF (r.imm # FALSE) THEN wr.OutT (" IMMED"); Index: m3back/src/Wrx86.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/Wrx86.i3,v retrieving revision 1.6 diff -u -r1.6 Wrx86.i3 --- m3back/src/Wrx86.i3 26 Feb 2010 11:02:33 -0000 1.6 +++ m3back/src/Wrx86.i3 26 Feb 2010 12:48:00 -0000 @@ -8,7 +8,7 @@ INTERFACE Wrx86; -IMPORT Wr, M3BackInt, Target; +IMPORT Wr, Target; FROM M3CG IMPORT Name, TypeUID; FROM M3CG IMPORT Var, Proc, Label; @@ -29,7 +29,7 @@ Lab (i: Label); Tipe (t: TypeUID); Int (i: INTEGER); - TInt (READONLY i: M3BackInt.Int); + TInt (READONLY i: Target.IntN); BInt (i: INTEGER); Txt (t: TEXT); OutC (c: CHAR); Index: m3back/src/Wrx86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/Wrx86.m3,v retrieving revision 1.14 diff -u -r1.14 Wrx86.m3 --- m3back/src/Wrx86.m3 26 Feb 2010 11:02:33 -0000 1.14 +++ m3back/src/Wrx86.m3 26 Feb 2010 12:48:00 -0000 @@ -9,7 +9,7 @@ MODULE Wrx86; IMPORT Wr, Thread, Text; -IMPORT M3Buf, M3ID, M3CG, M3BackInt, Target, TFloat; +IMPORT M3Buf, M3ID, M3CG, TIntN, Target, TFloat; FROM M3CG IMPORT Name, TypeUID; FROM M3CG IMPORT Var, Proc, Label, No_label; @@ -152,15 +152,15 @@ OutI (t, i); END Int; -PROCEDURE TInt (t: T; READONLY i: M3BackInt.Int) = +PROCEDURE TInt (t: T; READONLY i: Target.IntN) = VAR - buf : ARRAY [0..BITSIZE (M3BackInt.Integer)] OF CHAR; - len := M3BackInt.ToChars (i, buf); + buf : ARRAY [0..BITSIZE (Target.IntN)] OF CHAR; + len := TIntN.ToChars (i, buf); BEGIN OutC (t, ' '); OutS (t, SUBARRAY (buf, 0, len)); OutC (t, ' '); - OutT (t, M3BackInt.ToDiagnosticText(i)); + OutT (t, TIntN.ToDiagnosticText(i)); END TInt; PROCEDURE BInt (t: T; i: INTEGER) = @@ -171,8 +171,8 @@ (********* PROCEDURE BInt (t: T; i: INTEGER) = - VAR x := i MOD M3BackInt.Byte; - y := i DIV M3BackInt.Byte; + VAR x := i MOD TIntN.Byte; + y := i DIV TIntN.Byte; BEGIN IF (x = 0) THEN Int (t, y); Index: m3back/src/m3makefile =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/m3makefile,v retrieving revision 1.6 diff -u -r1.6 m3makefile --- m3back/src/m3makefile 26 Feb 2010 11:02:33 -0000 1.6 +++ m3back/src/m3makefile 26 Feb 2010 12:48:00 -0000 @@ -11,8 +11,6 @@ import ("m3middle") import ("m3objfile") -module ("M3BackInt") -module ("M3BackWord") Module ("M3x86") interface ("M3x86Rep") module ("Wrx86") Index: m3middle/src/TInt.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/TInt.i3,v retrieving revision 1.28 diff -u -r1.28 TInt.i3 --- m3middle/src/TInt.i3 26 Feb 2010 11:08:56 -0000 1.28 +++ m3middle/src/TInt.i3 26 Feb 2010 12:48:00 -0000 @@ -109,4 +109,16 @@ PROCEDURE Chop (VAR i: Int; n: CARDINAL); (* Extract the low-order 'n' bytes of 'i', sign extended. *) +PROCEDURE SignExtend(VAR a: Int; n: CARDINAL); +(* sign extend from n to the precision of Int *) + +PROCEDURE SignedTruncate(VAR a: Int; n: CARDINAL): BOOLEAN; +(* truncate to n bytes; return FALSE if the value did not previously fit *) + +PROCEDURE ZeroExtend(VAR a: Int; n: CARDINAL); +(* zero extend from n bytes to the precision of Int *) + +PROCEDURE UnsignedTruncate(VAR a: Int; n: CARDINAL): BOOLEAN; +(* truncate to n bytes; return FALSE if the value did not previously fit *) + END TInt. Index: m3middle/src/TInt.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/TInt.m3,v retrieving revision 1.27 diff -u -r1.27 TInt.m3 --- m3middle/src/TInt.m3 25 Feb 2010 13:06:40 -0000 1.27 +++ m3middle/src/TInt.m3 26 Feb 2010 12:48:00 -0000 @@ -23,6 +23,73 @@ Digits = ARRAY [0..9] OF CHAR { '0','1','2','3','4','5','6','7','8','9'}; Ten = Int{10,0,..}; +PROCEDURE SignExtend(VAR a: Int; n: CARDINAL) = +(* + sign extend from n to the precision of Int +*) + VAR extend := 0; + BEGIN + + IF Word.And(a[n - 1], SignMask) # 0 THEN + extend := Mask; + END; + FOR i := n TO LAST(a) DO + a[i] := extend; + END; + END SignExtend; + +PROCEDURE SignedTruncate(VAR a: Int; n: CARDINAL): BOOLEAN = +(* + truncate to n bytes + return FALSE if the value did not previously fit +*) + VAR result := TRUE; + extend := 0; + BEGIN + <* ASSERT n # 0 *> + <* ASSERT n <= NUMBER(a) *> + + IF Word.And(a[LAST(a)], SignMask) # 0 THEN + extend := Mask; + END; + FOR i := n TO LAST(a) DO + IF a[i] # extend THEN + result := FALSE; + a[i] := extend; + END; + END; + + RETURN result; + END SignedTruncate; + +PROCEDURE ZeroExtend(VAR a: Int; n: CARDINAL) = +(* + zero extend from n bytes to the precision of Int +*) + BEGIN + <*ASSERT n # 0*> + FOR i := n TO LAST(a) DO + a[i] := 0; + END; + END ZeroExtend; + +PROCEDURE UnsignedTruncate(VAR a: Int; n: CARDINAL): BOOLEAN = +(* + truncate to n bytes + return FALSE if the value did not previously fit +*) + VAR result := TRUE; + BEGIN + <*ASSERT n # 0*> + FOR i := n TO LAST(a) DO + IF a[i] # 0 THEN + result := FALSE; + a[i] := 0; + END; + END; + RETURN result; + END UnsignedTruncate; + PROCEDURE FromInt (x: INTEGER; VAR r: Int): BOOLEAN = BEGIN FOR i := 0 TO LAST(Int) DO Index: m3middle/src/TIntN.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/TIntN.i3,v retrieving revision 1.1 diff -u -r1.1 TIntN.i3 --- m3middle/src/TIntN.i3 26 Feb 2010 11:14:51 -0000 1.1 +++ m3middle/src/TIntN.i3 26 Feb 2010 12:48:00 -0000 @@ -2,11 +2,11 @@ (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* *) -(* File: M3BackInt.i3 *) +(* File: TIntN.i3 *) (* Last Modified On Thu Mar 10 13:42:53 PST 1994 By kalsow *) (* Modified On Thu May 20 08:20:38 PDT 1993 By muller *) -INTERFACE M3BackInt; (* also known as TInt *) +INTERFACE TIntN; (* also known as TInt *) (* Modula-3 target description @@ -19,110 +19,84 @@ *) IMPORT Target, TInt; - -TYPE - Int = (* OPAQUE *) RECORD - n: CARDINAL := NUMBER (Target.Int); (* only bytes [0..n-1] contain valid bits *) - x := TInt.Zero; (* default is Zero *) - END; +FROM Target IMPORT Int, IntN; CONST - Zero = Int{x := TInt.Zero}; - One = Int{x := TInt.One}; - Two = Int{x := TInt.Two}; - Three = Int{x := TInt.Three}; - Four = Int{x := TInt.Four}; - Eight = Int{x := TInt.Eight}; - ThirtyOne = Int{x := TInt.ThirtyOne}; - ThirtyTwo = Int{x := TInt.ThirtyTwo}; - SixtyThree= Int{x := TInt.SixtyThree}; - F3FF = Int{x := TInt.F3FF}; - x0400 = Int{x := TInt.x0400}; - x0800 = Int{x := TInt.x0800}; - x0F00 = Int{x := TInt.x0F00}; - MaxU8 = Int{x := TInt.MaxU8}; + Zero = IntN{x := TInt.Zero}; + One = IntN{x := TInt.One}; + Two = IntN{x := TInt.Two}; + Three = IntN{x := TInt.Three}; + Four = IntN{x := TInt.Four}; + Eight = IntN{x := TInt.Eight}; + ThirtyOne = IntN{x := TInt.ThirtyOne}; + ThirtyTwo = IntN{x := TInt.ThirtyTwo}; + SixtyThree= IntN{x := TInt.SixtyThree}; + F3FF = IntN{x := TInt.F3FF}; + x0400 = IntN{x := TInt.x0400}; + x0800 = IntN{x := TInt.x0800}; + x0F00 = IntN{x := TInt.x0F00}; + MaxU8 = IntN{x := TInt.MaxU8}; (* 'M' for Minus (negative) *) - MOne = Int{x := TInt.MOne}; - MThirtyOne = Int{x := TInt.MThirtyOne}; - MSixtyThree= Int{x := TInt.MSixtyThree}; + MOne = IntN{x := TInt.MOne}; + MThirtyOne = IntN{x := TInt.MThirtyOne}; + MSixtyThree= IntN{x := TInt.MSixtyThree}; -PROCEDURE FromInt (x: INTEGER; n: CARDINAL; VAR i: Int): BOOLEAN; +PROCEDURE FromHostInteger (x: INTEGER; n: CARDINAL; VAR i: IntN): BOOLEAN; (* converts a host integer 'x' to a target integer 'i' *) -PROCEDURE ToInt (READONLY i: Int; VAR x: INTEGER): BOOLEAN; +PROCEDURE ToHostInteger (READONLY i: IntN; VAR x: INTEGER): BOOLEAN; (* converts a target integer 'i' to a host integer 'x' *) -PROCEDURE Abs (READONLY a: Int; VAR r: Int): BOOLEAN; +PROCEDURE Abs (READONLY a: IntN; VAR r: IntN): BOOLEAN; (* returns a if a >= 0, -a if a < 0, or overflow *) -PROCEDURE Add (READONLY a, b: Int; VAR i: Int): BOOLEAN; +PROCEDURE Add (READONLY a, b: IntN; VAR i: IntN): BOOLEAN; (* returns 'a + b' unless there's an overflow *) -PROCEDURE Subtract (READONLY a, b: Int; VAR i: Int): BOOLEAN; +PROCEDURE Subtract (READONLY a, b: IntN; VAR i: IntN): BOOLEAN; (* returns 'a - b' unless there's an overflow *) -PROCEDURE Negate (READONLY a: Int; VAR r: Int): BOOLEAN; +PROCEDURE Negate (READONLY a: IntN; VAR r: IntN): BOOLEAN; (* returns '-a' unless there's an overflow *) -PROCEDURE Multiply (READONLY a, b: Int; VAR i: Int): BOOLEAN; +PROCEDURE Multiply (READONLY a, b: IntN; VAR i: IntN): BOOLEAN; (* returns 'a * b' unless there's an overflow *) -PROCEDURE Div (READONLY a, b: Int; VAR i: Int): BOOLEAN; +PROCEDURE Div (READONLY a, b: IntN; VAR i: IntN): BOOLEAN; (* returns 'a DIV b' unless there's an overflow *) -PROCEDURE Mod (READONLY a, b: Int; VAR i: Int): BOOLEAN; +PROCEDURE Mod (READONLY a, b: IntN; VAR i: IntN): BOOLEAN; (* returns 'a MOD b' unless there's an overflow *) -PROCEDURE EQ (READONLY a, b: Int): BOOLEAN; +PROCEDURE EQ (READONLY a, b: IntN): BOOLEAN; (* returns 'a = b' *) -PROCEDURE NE (READONLY a, b: Int): BOOLEAN; +PROCEDURE NE (READONLY a, b: IntN): BOOLEAN; (* returns 'a # b' *) -PROCEDURE LT (READONLY a, b: Int): BOOLEAN; +PROCEDURE LT (READONLY a, b: IntN): BOOLEAN; (* returns 'a < b' *) -PROCEDURE GT (READONLY a, b: Int): BOOLEAN; +PROCEDURE GT (READONLY a, b: IntN): BOOLEAN; (* returns 'a > b' *) -PROCEDURE LE (READONLY a, b: Int): BOOLEAN; +PROCEDURE LE (READONLY a, b: IntN): BOOLEAN; (* returns 'a <= b' *) -PROCEDURE GE (READONLY a, b: Int): BOOLEAN; +PROCEDURE GE (READONLY a, b: IntN): BOOLEAN; (* returns 'a >= b' *) -PROCEDURE ToText (READONLY i: Int): TEXT; +PROCEDURE ToText (READONLY i: IntN): TEXT; (* converts 'i' to a printable string. *) -PROCEDURE ToChars (READONLY i: Int; VAR buf: ARRAY OF CHAR): INTEGER; +PROCEDURE ToChars (READONLY i: IntN; VAR buf: ARRAY OF CHAR): INTEGER; (* converts 'i' to a printable string in 'buf'. Returns the number of characters in the string. Returns -1 if 'buf' is too short. *) -PROCEDURE FromTargetInt (READONLY i: Target.Int; byteSize: CARDINAL): Int; - -TYPE - Int_type = RECORD (* Like Target.Int_type *) - size : CARDINAL; (* bit size *) - bytes : CARDINAL; (* byte size *) - min : Int; (* minimum value of this type *) - max : Int; (* maximum value of this type *) - END; - -VAR (* CONST *) - Integer: Int_type; - Int8: Int_type; - Int16: Int_type; - Int32: Int_type; - Int64: Int_type; - Word8: Int_type; - Word16: Int_type; - Word32: Int_type; - Word64: Int_type; - -PROCEDURE Init(); +PROCEDURE FromTargetInt (READONLY i: Int; byteSize: CARDINAL): IntN; -PROCEDURE ToDiagnosticText(a: Int): TEXT; +PROCEDURE ToDiagnosticText(a: IntN): TEXT; -END M3BackInt. +END TIntN. Index: m3middle/src/TIntN.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/TIntN.m3,v retrieving revision 1.1 diff -u -r1.1 TIntN.m3 --- m3middle/src/TIntN.m3 26 Feb 2010 12:30:48 -0000 1.1 +++ m3middle/src/TIntN.m3 26 Feb 2010 12:48:00 -0000 @@ -2,91 +2,59 @@ (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* *) -(* File: M3BackInt.m3 *) +(* File: TIntN.m3 *) (* Last Modified On Tue Jul 12 08:31:56 PDT 1994 By kalsow *) (* Modified On Thu May 20 08:46:32 PDT 1993 By muller *) -MODULE M3BackInt; (* also known as TInt *) +MODULE TIntN; (* TInt but with specified precision, in bytes *) -IMPORT Target, Word, Text, Fmt, TInt; +IMPORT Fmt, TInt; +FROM Target IMPORT Int, IntN; -CONST - Mask = 16_FF; - SignMask = 16_80; - -PROCEDURE SignExtend(READONLY a: Int): Target.Int = -(* - sign extend to the precision of Target.Int -*) - VAR b: Target.Int; - extend := 0; +PROCEDURE ToInt(READONLY a: IntN): Int = + VAR b: Int; BEGIN - - <* ASSERT LAST(a.x) = LAST(b) *> - - FOR i := 0 TO a.n - 1 DO - b[i] := a.x[i]; - END; - IF Word.And(a.x[a.n - 1], SignMask) # 0 THEN - extend := Mask; - END; - FOR i := a.n TO LAST(b) DO - b[i] := extend; - END; + b := a.x; + TInt.SignExtend(b, a.n); RETURN b; - END SignExtend; + END ToInt; -PROCEDURE SignedTruncate(VAR a: Int; n: CARDINAL): BOOLEAN = -(* - check that it fits, by seeing if the sign extension is correct -*) - VAR extend := 0; +PROCEDURE FromInt(VAR a: IntN; n: CARDINAL): BOOLEAN = BEGIN <* ASSERT n # 0 *> - <* ASSERT n <= NUMBER(a.x) *> - - IF Word.And(a.x[LAST(a.x)], SignMask) # 0 THEN - extend := Mask; - END; - FOR i := n TO LAST(a.x) DO - IF a.x[i] # extend THEN - RETURN FALSE; - END; - END; + <* ASSERT n <= NUMBER(Int) *> a.n := n; + RETURN TInt.SignedTruncate(a.x, n); + END FromInt; - RETURN TRUE; - - END SignedTruncate; - -PROCEDURE FromInt (x: INTEGER; n: CARDINAL; VAR r: Int): BOOLEAN = +PROCEDURE FromHostInteger (x: INTEGER; n: CARDINAL; VAR r: IntN): BOOLEAN = BEGIN - RETURN TInt.FromInt(x, r.x) AND SignedTruncate(r, n); - END FromInt; + RETURN TInt.FromInt(x, r.x) AND FromInt(r, n); + END FromHostInteger; -PROCEDURE ToInt (READONLY r: Int; VAR x: INTEGER): BOOLEAN = - VAR r4 := r; +PROCEDURE ToHostInteger (READONLY r: IntN; VAR x: INTEGER): BOOLEAN = + VAR i := r; BEGIN - r4.n := 4; - RETURN TInt.ToInt(SignExtend(r4), x); - END ToInt; + i.n := BYTESIZE(INTEGER); + RETURN TInt.ToInt(ToInt(i), x); + END ToHostInteger; -PROCEDURE Add (READONLY a, b: Int; VAR r: Int): BOOLEAN = +PROCEDURE Add (READONLY a, b: IntN; VAR r: IntN): BOOLEAN = BEGIN - RETURN TInt.Add(SignExtend(a), SignExtend(b), r.x) AND SignedTruncate(r, MIN(a.n, b.n)); + RETURN TInt.Add(ToInt(a), ToInt(b), r.x) AND FromInt(r, MIN(a.n, b.n)); END Add; -PROCEDURE Subtract (READONLY a, b: Int; VAR r: Int): BOOLEAN = +PROCEDURE Subtract (READONLY a, b: IntN; VAR r: IntN): BOOLEAN = BEGIN - RETURN TInt.Subtract(SignExtend(a), SignExtend(b), r.x) AND SignedTruncate(r, MIN(a.n, b.n)); + RETURN TInt.Subtract(ToInt(a), ToInt(b), r.x) AND FromInt(r, MIN(a.n, b.n)); END Subtract; -PROCEDURE Negate (READONLY a: Int; VAR r: Int): BOOLEAN = +PROCEDURE Negate (READONLY a: IntN; VAR r: IntN): BOOLEAN = BEGIN RETURN Subtract(Zero, a, r); END Negate; -PROCEDURE Abs (READONLY a: Int; VAR r: Int): BOOLEAN = +PROCEDURE Abs (READONLY a: IntN; VAR r: IntN): BOOLEAN = BEGIN IF GE(a, Zero) THEN r := a; @@ -95,94 +63,72 @@ RETURN Negate(a, r); END Abs; -PROCEDURE Multiply (READONLY a, b: Int; VAR r: Int): BOOLEAN = +PROCEDURE Multiply (READONLY a, b: IntN; VAR r: IntN): BOOLEAN = BEGIN - RETURN TInt.Multiply(SignExtend(a), SignExtend(b), r.x) AND SignedTruncate(r, MIN(a.n, b.n)); + RETURN TInt.Multiply(ToInt(a), ToInt(b), r.x) AND FromInt(r, MIN(a.n, b.n)); END Multiply; -PROCEDURE Div (READONLY num, den: Int; VAR q: Int): BOOLEAN = +PROCEDURE Div (READONLY num, den: IntN; VAR q: IntN): BOOLEAN = BEGIN - RETURN TInt.Div(SignExtend(num), SignExtend(den), q.x) AND SignedTruncate(q, MIN(num.n, den.n)); + RETURN TInt.Div(ToInt(num), ToInt(den), q.x) AND FromInt(q, MIN(num.n, den.n)); END Div; -PROCEDURE Mod (READONLY num, den: Int; VAR r: Int): BOOLEAN = +PROCEDURE Mod (READONLY num, den: IntN; VAR r: IntN): BOOLEAN = BEGIN - RETURN TInt.Mod(SignExtend(num), SignExtend(den), r.x) AND SignedTruncate(r, MIN(num.n, den.n)); + RETURN TInt.Mod(ToInt(num), ToInt(den), r.x) AND FromInt(r, MIN(num.n, den.n)); END Mod; -PROCEDURE EQ (READONLY a, b: Int): BOOLEAN = +PROCEDURE EQ (READONLY a, b: IntN): BOOLEAN = BEGIN - RETURN TInt.EQ(SignExtend(a), SignExtend(b)); + RETURN TInt.EQ(ToInt(a), ToInt(b)); END EQ; -PROCEDURE LT (READONLY a, b: Int): BOOLEAN = +PROCEDURE LT (READONLY a, b: IntN): BOOLEAN = BEGIN - RETURN TInt.LT(SignExtend(a), SignExtend(b)); + RETURN TInt.LT(ToInt(a), ToInt(b)); END LT; -PROCEDURE LE (READONLY a, b: Int): BOOLEAN = +PROCEDURE LE (READONLY a, b: IntN): BOOLEAN = BEGIN - RETURN EQ (a, b) OR LT (a, b); + RETURN TInt.LE(ToInt(a), ToInt(b)); END LE; -PROCEDURE NE (READONLY a, b: Int): BOOLEAN = +PROCEDURE NE (READONLY a, b: IntN): BOOLEAN = BEGIN - RETURN NOT EQ (a, b); + RETURN TInt.NE(ToInt(a), ToInt(b)); END NE; -PROCEDURE GT (READONLY a, b: Int): BOOLEAN = +PROCEDURE GT (READONLY a, b: IntN): BOOLEAN = BEGIN - RETURN LT (b, a); + RETURN TInt.GT(ToInt(a), ToInt(b)); END GT; -PROCEDURE GE (READONLY a, b: Int): BOOLEAN = +PROCEDURE GE (READONLY a, b: IntN): BOOLEAN = BEGIN - RETURN LE(b, a); + RETURN TInt.GE(ToInt(a), ToInt(b)); END GE; -PROCEDURE ToText (READONLY r: Int): TEXT = - VAR result : ARRAY [0..BITSIZE (Int)] OF CHAR; +PROCEDURE ToText (READONLY r: IntN): TEXT = BEGIN - RETURN Text.FromChars(SUBARRAY(result, 0, ToChars(r, result))); + RETURN TInt.ToText(ToInt(r)); END ToText; -PROCEDURE ToChars (READONLY r: Int; VAR buf: ARRAY OF CHAR): INTEGER = +PROCEDURE ToChars (READONLY r: IntN; VAR buf: ARRAY OF CHAR): INTEGER = BEGIN - RETURN TInt.ToChars(SignExtend(r), buf); + RETURN TInt.ToChars(ToInt(r), buf); END ToChars; -PROCEDURE FromTargetInt (READONLY i: Target.Int; byteSize: CARDINAL): Int = +PROCEDURE FromTargetInt (READONLY i: Int; byteSize: CARDINAL): IntN = BEGIN - RETURN Int{n := byteSize, x := i}; + RETURN IntN{n := byteSize, x := i}; END FromTargetInt; -PROCEDURE InitInt(VAR a: Int_type; READONLY b: Target.Int_type) = - BEGIN - a.size := b.size; - a.bytes := b.bytes; - a.min := FromTargetInt(b.min, 8); - a.max := FromTargetInt(b.max, 8); - END InitInt; - -PROCEDURE Init() = - BEGIN - InitInt(Int8, Target.Int8); - InitInt(Int16, Target.Int16); - InitInt(Int32, Target.Int32); - InitInt(Int64, Target.Int64); - InitInt(Word8, Target.Word8); - InitInt(Word16, Target.Word16); - InitInt(Word32, Target.Word32); - InitInt(Word64, Target.Word64); - InitInt(Integer, Target.Integer); - END Init; - -PROCEDURE ToDiagnosticText(a: Int): TEXT = +PROCEDURE ToDiagnosticText(a: IntN): TEXT = BEGIN RETURN "n:" & Fmt.Unsigned(a.n) & ",x:" & TargetIntToDiagnosticText(a.x); END ToDiagnosticText; -PROCEDURE TargetIntToDiagnosticText(a: Target.Int): TEXT = +PROCEDURE TargetIntToDiagnosticText(a: Int): TEXT = VAR t := ""; BEGIN FOR i := FIRST(a) TO LAST(a) DO @@ -195,4 +141,4 @@ END TargetIntToDiagnosticText; BEGIN -END M3BackInt. +END TIntN. Index: m3middle/src/TWordN.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/TWordN.i3,v retrieving revision 1.1 diff -u -r1.1 TWordN.i3 --- m3middle/src/TWordN.i3 26 Feb 2010 11:14:51 -0000 1.1 +++ m3middle/src/TWordN.i3 26 Feb 2010 12:48:00 -0000 @@ -2,11 +2,11 @@ (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* *) -(* File: M3BackWord.i3 *) +(* File: TWordN.i3 *) (* Last Modified On Fri Nov 19 09:32:50 PST 1993 By kalsow *) (* Modified On Thu May 20 08:20:38 PDT 1993 By muller *) -INTERFACE M3BackWord; (* also known as TWord *) +INTERFACE TWordN; (* also known as TWord *) (* Modula-3 target description @@ -18,61 +18,61 @@ otherwise they return FALSE. *) -FROM M3BackInt IMPORT Int; +FROM Target IMPORT IntN; -PROCEDURE Add (READONLY a, b: Int; VAR i: Int); +PROCEDURE Add (READONLY a, b: IntN; VAR i: IntN); (* returns 'Word.Plus (a, b)' *) -PROCEDURE Subtract (READONLY a, b: Int; VAR i: Int); +PROCEDURE Subtract (READONLY a, b: IntN; VAR i: IntN); (* returns 'Word.Minus (a, b)' *) -PROCEDURE Multiply (READONLY a, b: Int; VAR i: Int); +PROCEDURE Multiply (READONLY a, b: IntN; VAR i: IntN); (* returns 'Word.Times (a, b)' *) -PROCEDURE Div (READONLY a, b: Int; VAR i: Int): BOOLEAN; +PROCEDURE Div (READONLY a, b: IntN; VAR i: IntN): BOOLEAN; (* returns 'Word.Divide (a, b)' unless b is zero. *) -PROCEDURE Mod (READONLY a, b: Int; VAR i: Int): BOOLEAN; +PROCEDURE Mod (READONLY a, b: IntN; VAR i: IntN): BOOLEAN; (* returns 'Word.Mod (a, b)' unless b is zero. *) -PROCEDURE DivMod (READONLY x, y: Int; VAR q, r: Int); +PROCEDURE DivMod (READONLY x, y: IntN; VAR q, r: IntN); (* returns 'q = x DIV y', and 'r = x MOD y', but assumes that 'y # 0' *) -PROCEDURE LT (READONLY a, b: Int): BOOLEAN; (* a < b *) -PROCEDURE LE (READONLY a, b: Int): BOOLEAN; (* a <= b *) -PROCEDURE EQ (READONLY a, b: Int): BOOLEAN; (* a = b *) -PROCEDURE NE (READONLY a, b: Int): BOOLEAN; (* a # b *) -PROCEDURE GE (READONLY a, b: Int): BOOLEAN; (* a >= b *) -PROCEDURE GT (READONLY a, b: Int): BOOLEAN; (* a > b *) +PROCEDURE LT (READONLY a, b: IntN): BOOLEAN; (* a < b *) +PROCEDURE LE (READONLY a, b: IntN): BOOLEAN; (* a <= b *) +PROCEDURE EQ (READONLY a, b: IntN): BOOLEAN; (* a = b *) +PROCEDURE NE (READONLY a, b: IntN): BOOLEAN; (* a # b *) +PROCEDURE GE (READONLY a, b: IntN): BOOLEAN; (* a >= b *) +PROCEDURE GT (READONLY a, b: IntN): BOOLEAN; (* a > b *) -PROCEDURE And (READONLY a, b: Int; VAR i: Int); +PROCEDURE And (READONLY a, b: IntN; VAR i: IntN); (* returns 'Word.And (a, b)' *) -PROCEDURE Or (READONLY a, b: Int; VAR i: Int); +PROCEDURE Or (READONLY a, b: IntN; VAR i: IntN); (* returns 'Word.Or (a, b)' *) -PROCEDURE Xor (READONLY a, b: Int; VAR i: Int); +PROCEDURE Xor (READONLY a, b: IntN; VAR i: IntN); (* returns 'Word.Xor (a, b)' *) -PROCEDURE Not (READONLY a: Int; VAR i: Int); +PROCEDURE Not (READONLY a: IntN; VAR i: IntN); (* returns 'Word.Not (a)' *) -PROCEDURE Shift (READONLY x: Int; n: INTEGER; VAR r: Int); +PROCEDURE Shift (READONLY x: IntN; n: INTEGER; VAR r: IntN); (* returns 'Word.Shift (x, n)' *) -PROCEDURE LeftShift (READONLY x: Int; n: CARDINAL; VAR r: Int); +PROCEDURE LeftShift (READONLY x: IntN; n: CARDINAL; VAR r: IntN); (* returns 'Word.LeftShift (x, n)' *) -PROCEDURE RightShift (READONLY x: Int; n: CARDINAL; VAR r: Int); +PROCEDURE RightShift (READONLY x: IntN; n: CARDINAL; VAR r: IntN); (* returns 'Word.RightShift (x, n)' *) -PROCEDURE Rotate (READONLY x: Int; n: INTEGER; VAR r: Int); +PROCEDURE Rotate (READONLY x: IntN; n: INTEGER; VAR r: IntN); (* returns 'Word.Rotate (x, n)' *) -PROCEDURE Extract (READONLY x: Int; i, n: CARDINAL; VAR r: Int): BOOLEAN; +PROCEDURE Extract (READONLY x: IntN; i, n: CARDINAL; VAR r: IntN): BOOLEAN; (* returns 'Word.Extract (x, i, n)' *) -PROCEDURE Insert (READONLY x, y: Int; i, n: CARDINAL; VAR r: Int): BOOLEAN; +PROCEDURE Insert (READONLY x, y: IntN; i, n: CARDINAL; VAR r: IntN): BOOLEAN; (* returns 'Word.Insert (x, y, i, n)' *) -END M3BackWord. +END TWordN. Index: m3middle/src/TWordN.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/TWordN.m3,v retrieving revision 1.1 diff -u -r1.1 TWordN.m3 --- m3middle/src/TWordN.m3 26 Feb 2010 11:14:54 -0000 1.1 +++ m3middle/src/TWordN.m3 26 Feb 2010 12:48:00 -0000 @@ -2,175 +2,167 @@ (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* *) -(* File: M3BackWord.m3 *) +(* File: TWordN.m3 *) (* Last Modified On Fri Nov 19 09:32:56 PST 1993 By kalsow *) (* Modified On Thu May 20 08:46:32 PDT 1993 By muller *) -MODULE M3BackWord; (* also known as TWord *) +MODULE TWordN; (* also known as TWord *) -IMPORT M3BackInt, TWord, TInt, Target; -FROM M3BackInt IMPORT Int; +IMPORT TWord, TInt; +FROM Target IMPORT Int, IntN; (*------------------------------------------- unsigned integer operations ---*) -PROCEDURE ZeroExtend(READONLY a: Int): Target.Int = -(* - zero extend to the precision of Target.Int -*) - VAR b: Target.Int; - BEGIN - FOR i := 0 TO a.n - 1 DO - b[i] := a.x[i]; - END; - FOR i := a.n TO LAST(b) DO - b[i] := 0; - END; +PROCEDURE ToInt(READONLY a: IntN): Int = + VAR b: Int; + BEGIN + b:= a.x; + TInt.ZeroExtend(b, a.n); RETURN b; - END ZeroExtend; + END ToInt; -PROCEDURE UnsignedTruncate(VAR a: Int; n: CARDINAL) = +PROCEDURE FromInt(VAR a: IntN; n: CARDINAL) = BEGIN <*ASSERT n # 0*> a.n := n; - FOR i := n TO LAST(a.x) DO - a.x[i] := 0; - END; - END UnsignedTruncate; + (* overflow always ignored *) + EVAL TInt.UnsignedTruncate(a.x, n); + END FromInt; -PROCEDURE Add (READONLY a, b: Int; VAR r: Int) = +PROCEDURE Add (READONLY a, b: IntN; VAR r: IntN) = BEGIN - TWord.Add(ZeroExtend(a), ZeroExtend(b), r.x); - UnsignedTruncate(r, MIN(a.n, b.n)); + TWord.Add(ToInt(a), ToInt(b), r.x); + FromInt(r, MIN(a.n, b.n)); END Add; -PROCEDURE Subtract (READONLY a, b: Int; VAR r: Int) = +PROCEDURE Subtract (READONLY a, b: IntN; VAR r: IntN) = BEGIN - TWord.Subtract(ZeroExtend(a), ZeroExtend(b), r.x); - UnsignedTruncate(r, MIN(a.n, b.n)); + TWord.Subtract(ToInt(a), ToInt(b), r.x); + FromInt(r, MIN(a.n, b.n)); END Subtract; -PROCEDURE Multiply (READONLY a, b: Int; VAR r: Int) = +PROCEDURE Multiply (READONLY a, b: IntN; VAR r: IntN) = BEGIN - TWord.Multiply(ZeroExtend(a), ZeroExtend(b), r.x); - UnsignedTruncate(r, MIN(a.n, b.n)); + TWord.Multiply(ToInt(a), ToInt(b), r.x); + FromInt(r, MIN(a.n, b.n)); END Multiply; -PROCEDURE Div (READONLY num, den: Int; VAR q: Int): BOOLEAN = +PROCEDURE Div (READONLY num, den: IntN; VAR q: IntN): BOOLEAN = VAR result: BOOLEAN; BEGIN - result := TWord.Div(ZeroExtend(num), ZeroExtend(den), q.x); - UnsignedTruncate(q, MIN(num.n, den.n)); + result := TWord.Div(ToInt(num), ToInt(den), q.x); + FromInt(q, MIN(num.n, den.n)); RETURN result; END Div; -PROCEDURE Mod (READONLY num, den: Int; VAR r: Int): BOOLEAN = +PROCEDURE Mod (READONLY num, den: IntN; VAR r: IntN): BOOLEAN = VAR result: BOOLEAN; BEGIN - result := TWord.Mod(ZeroExtend(num), ZeroExtend(den), r.x); - UnsignedTruncate(r, MIN(num.n, den.n)); + result := TWord.Mod(ToInt(num), ToInt(den), r.x); + FromInt(r, MIN(num.n, den.n)); RETURN result; END Mod; -PROCEDURE DivMod (READONLY x, y: Int; VAR q, r: Int) = +PROCEDURE DivMod (READONLY x, y: IntN; VAR q, r: IntN) = BEGIN - TWord.DivMod(ZeroExtend(x), ZeroExtend(y), q.x, r.x); - UnsignedTruncate(r, MIN(x.n, y.n)); - UnsignedTruncate(q, MIN(x.n, y.n)); + TWord.DivMod(ToInt(x), ToInt(y), q.x, r.x); + FromInt(r, MIN(x.n, y.n)); + FromInt(q, MIN(x.n, y.n)); END DivMod; -PROCEDURE LT (READONLY a, b: Int): BOOLEAN = +PROCEDURE LT (READONLY a, b: IntN): BOOLEAN = BEGIN - RETURN TWord.LT(ZeroExtend(a), ZeroExtend(b)); + RETURN TWord.LT(ToInt(a), ToInt(b)); END LT; -PROCEDURE LE (READONLY a, b: Int): BOOLEAN = +PROCEDURE LE (READONLY a, b: IntN): BOOLEAN = BEGIN - RETURN TWord.LE(ZeroExtend(a), ZeroExtend(b)); + RETURN TWord.LE(ToInt(a), ToInt(b)); END LE; -PROCEDURE EQ (READONLY a, b: Int): BOOLEAN = +PROCEDURE EQ (READONLY a, b: IntN): BOOLEAN = BEGIN - RETURN TInt.EQ(ZeroExtend(a), ZeroExtend(b)); + RETURN TInt.EQ(ToInt(a), ToInt(b)); END EQ; -PROCEDURE NE (READONLY a, b: Int): BOOLEAN = +PROCEDURE NE (READONLY a, b: IntN): BOOLEAN = BEGIN - RETURN NOT EQ(a, b); + RETURN TInt.NE(ToInt(a), ToInt(b)); END NE; -PROCEDURE GE (READONLY a, b: Int): BOOLEAN = +PROCEDURE GE (READONLY a, b: IntN): BOOLEAN = BEGIN - RETURN LE(b, a); + RETURN TWord.GE(ToInt(a), ToInt(b)); END GE; -PROCEDURE GT (READONLY a, b: Int): BOOLEAN = +PROCEDURE GT (READONLY a, b: IntN): BOOLEAN = BEGIN - RETURN LT(b, a); + RETURN TWord.GT(ToInt(a), ToInt(b)); END GT; -PROCEDURE And (READONLY a, b: Int; VAR r: Int) = +PROCEDURE And (READONLY a, b: IntN; VAR r: IntN) = BEGIN - TWord.And(ZeroExtend(a), ZeroExtend(b), r.x); - UnsignedTruncate(r, MIN(a.n, b.n)); + TWord.And(ToInt(a), ToInt(b), r.x); + FromInt(r, MIN(a.n, b.n)); END And; -PROCEDURE Or (READONLY a, b: Int; VAR r: Int) = +PROCEDURE Or (READONLY a, b: IntN; VAR r: IntN) = BEGIN - TWord.Or(ZeroExtend(a), ZeroExtend(b), r.x); - UnsignedTruncate(r, MIN(a.n, b.n)); + TWord.Or(ToInt(a), ToInt(b), r.x); + FromInt(r, MIN(a.n, b.n)); END Or; -PROCEDURE Xor (READONLY a, b: Int; VAR r: Int) = +PROCEDURE Xor (READONLY a, b: IntN; VAR r: IntN) = BEGIN - TWord.Xor(ZeroExtend(a), ZeroExtend(b), r.x); - UnsignedTruncate(r, MIN(a.n, b.n)); + TWord.Xor(ToInt(a), ToInt(b), r.x); + FromInt(r, MIN(a.n, b.n)); END Xor; -PROCEDURE Not (READONLY a: Int; VAR r: Int) = +PROCEDURE Not (READONLY a: IntN; VAR r: IntN) = BEGIN - TWord.Not(ZeroExtend(a), r.x); - UnsignedTruncate(r, a.n); + TWord.Not(ToInt(a), r.x); + FromInt(r, a.n); END Not; -PROCEDURE LeftShift (READONLY a: Int; b: CARDINAL; VAR r: Int) = +PROCEDURE LeftShift (READONLY a: IntN; b: CARDINAL; VAR r: IntN) = BEGIN - TWord.LeftShift(ZeroExtend(a), b, r.x); - UnsignedTruncate(r, a.n); + TWord.LeftShift(ToInt(a), b, r.x); + FromInt(r, a.n); END LeftShift; -PROCEDURE RightShift (READONLY a: Int; b: CARDINAL; VAR r: Int) = +PROCEDURE RightShift (READONLY a: IntN; b: CARDINAL; VAR r: IntN) = BEGIN - TWord.RightShift(ZeroExtend(a), b, r.x); - UnsignedTruncate(r, a.n); + TWord.RightShift(ToInt(a), b, r.x); + FromInt(r, a.n); END RightShift; -PROCEDURE Shift (READONLY a: Int; b: INTEGER; VAR r: Int) = +PROCEDURE Shift (READONLY a: IntN; b: INTEGER; VAR r: IntN) = BEGIN - TWord.Shift(ZeroExtend(a), b, r.x); - UnsignedTruncate(r, a.n); + TWord.Shift(ToInt(a), b, r.x); + FromInt(r, a.n); END Shift; -PROCEDURE Rotate (READONLY a: Int; b: INTEGER; VAR r: Int) = +PROCEDURE Rotate (READONLY a: IntN; b: INTEGER; VAR r: IntN) = BEGIN - TWord.Rotate(ZeroExtend(a), b, a.n, r.x); - UnsignedTruncate(r, a.n); + TWord.Rotate(ToInt(a), b, a.n, r.x); + FromInt(r, a.n); END Rotate; -PROCEDURE Extract (READONLY x: Int; i, n: CARDINAL; VAR r: Int): BOOLEAN = +PROCEDURE Extract (READONLY x: IntN; i, n: CARDINAL; VAR r: IntN): BOOLEAN = VAR result: BOOLEAN; BEGIN - result := TWord.Extract(ZeroExtend(x), i, n, r.x); - UnsignedTruncate(r, x.n); + result := TWord.Extract(ToInt(x), i, n, r.x); + FromInt(r, x.n); RETURN result; END Extract; -PROCEDURE Insert (READONLY x, y: Int; i, n: CARDINAL; VAR r: Int): BOOLEAN = +PROCEDURE Insert (READONLY x, y: IntN; i, n: CARDINAL; VAR r: IntN): BOOLEAN = VAR result: BOOLEAN; BEGIN - result := TWord.Insert(ZeroExtend(x), ZeroExtend(y), i, n, r.x); - UnsignedTruncate(r, MIN(x.n, y.n)); + result := TWord.Insert(ToInt(x), ToInt(y), i, n, r.x); + FromInt(r, MIN(x.n, y.n)); RETURN result; END Insert; BEGIN -END M3BackWord. +END TWordN. Index: m3middle/src/Target.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/Target.i3,v retrieving revision 1.50 diff -u -r1.50 Target.i3 --- m3middle/src/Target.i3 18 Feb 2010 02:33:06 -0000 1.50 +++ m3middle/src/Target.i3 26 Feb 2010 12:48:00 -0000 @@ -199,6 +199,13 @@ Int = (* OPAQUE *) ARRAY [0..7] OF IByte; IByte = BITS 8 FOR [0..16_ff]; + (* Int but with user-specified precision *) + + IntN = (* OPAQUE *) RECORD + n: CARDINAL := NUMBER (Int); (* only bytes [0..n-1] contain valid bits *) + x: Int; (* default is Zero *) + END; + TYPE Int_type = RECORD cg_type : CGType; (* representation *) @@ -207,7 +214,9 @@ pack : CARDINAL; (* minimum width bit packing *) bytes : CARDINAL; (* byte size *) min : Int; (* minimum value of this type *) + minN : IntN; (* minimum value of this type *) max : Int; (* maximum value of this type *) + maxN : IntN; (* maximum value of this type *) END; (*------------------------------------------------- floating point values ---*) Index: m3middle/src/Target.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/Target.m3,v retrieving revision 1.86 diff -u -r1.86 Target.m3 --- m3middle/src/Target.m3 18 Feb 2010 02:33:06 -0000 1.86 +++ m3middle/src/Target.m3 26 Feb 2010 12:48:00 -0000 @@ -120,10 +120,10 @@ Char := Word8; Void.cg_type := CGType.Void; - Void.size := 0; + <* ASSERT Void.size = 0 *> Void.align := Byte; - Void.min := Int{0,..}; - Void.max := Int{0,..}; + <* ASSERT Void.min = Int{0,..} *> + <* ASSERT Void.max = Int{0,..} *> Real.cg_type := CGType.Reel; Real.pre := Precision.Short; @@ -477,6 +477,8 @@ i.align := MIN (i.align, max_align); i.bytes := i.size DIV Byte; i.pack := (i.size + i.align - 1) DIV i.align * i.align; + i.minN.x := i.min; + i.maxN.x := i.max; END FixI; PROCEDURE FixF (VAR f: Float_type; max_align: INTEGER) = Index: m3middle/src/m3makefile =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/m3makefile,v retrieving revision 1.3 diff -u -r1.3 m3makefile --- m3middle/src/m3makefile 14 Jan 2010 11:29:18 -0000 1.3 +++ m3middle/src/m3makefile 26 Feb 2010 12:48:00 -0000 @@ -16,7 +16,9 @@ Module ("Target") Module ("TargetMap") Module ("TInt") +Module ("TIntN") Module ("TWord") +Module ("TWordN") Module ("TFloat") Module ("M3FP")