Index: Codex86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/Codex86.m3,v retrieving revision 1.106 diff -u -r1.106 Codex86.m3 --- Codex86.m3 2 Mar 2010 14:14:34 -0000 1.106 +++ Codex86.m3 7 Mar 2010 07:08:38 -0000 @@ -526,10 +526,10 @@ IF shiftCount.loc = OLoc.imm THEN IF TWordN.GT(shiftCount.imm, TWordN.Max8) THEN - t.Err("shift_double_op: shift count must fit in a byte:" & TIntN.ToDiagnosticText(shiftCount.imm)); + Err(t, "shift_double_op: shift count must fit in a byte:" & TIntN.ToDiagnosticText(shiftCount.imm)); END; IF NOT TIntN.ToHostInteger(shiftCount.imm, ins.imm) THEN - t.Err("shift_double_op: ToHostInteger(shiftCount.imm) failed:" & TIntN.ToDiagnosticText(shiftCount.imm)); + Err(t, "shift_double_op: ToHostInteger(shiftCount.imm) failed:" & TIntN.ToDiagnosticText(shiftCount.imm)); END; ins.imsize := 1; ins.opcode := opcode[op].imm8; @@ -549,7 +549,7 @@ <* ASSERT dest.loc = OLoc.register OR dest.loc = OLoc.mem *> IF NOT TIntN.ToHostInteger(imm, ins.imm) THEN - t.Err("immOp1: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(imm)); + Err(t, "immOp1: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(imm)); END; IF TIntN.GE(imm, TIntN.Min8) AND TIntN.LE(imm, TIntN.Max8) THEN @@ -682,12 +682,11 @@ <* ASSERT NOT TypeIs64(destA[destSize - 1].optype) *> IF srcSize # destSize THEN - t.Err("binOp: size mismatch: destSize:" & Fmt.Int(destSize) + Err(t, "binOp: size mismatch: destSize:" & Fmt.Int(destSize) & " srcSize:" & Fmt.Int(srcSize) & " src.optype:" & Target.TypeNames[src.optype] & " dest.optype:" & Target.TypeNames[dest.optype]); END; - <* ASSERT srcSize = destSize *> IF srcSize = 2 THEN CASE op OF @@ -741,7 +740,7 @@ | 4 => ins.sib := 16_80; | 8 => ins.sib := 16_C0; ELSE - t.Err("tableOp called with invalid scale parameter"); + Err(t, "tableOp called with invalid scale parameter"); END; INC(ins.sib, index.reg[0] * 8); INC(ins.sib, 5); @@ -799,13 +798,12 @@ BEGIN IF srcSize # destSize THEN - t.Err("swapOp: size mismatch: destSize:" & Fmt.Int(destSize) + Err(t, "swapOp: size mismatch: destSize:" & Fmt.Int(destSize) & " srcSize:" & Fmt.Int(srcSize) & " src.optype:" & Target.TypeNames[src.optype] & " dest.optype:" & Target.TypeNames[dest.optype]); END; - <* ASSERT srcSize = destSize *> <* ASSERT NOT TypeIs64(srcA[0].optype) *> <* ASSERT NOT TypeIs64(destA[0].optype) *> <* ASSERT NOT TypeIs64(srcA[srcSize - 1].optype) *> @@ -906,7 +904,7 @@ | Type.Int16 => ins.opcode := 16_BF; ins.escape := TRUE; mnemonic := "MOVSX"; ELSE - t.Err("Unknown type of size other than dword in movOp"); + Err(t, "Unknown type of size other than dword in movOp"); END; build_modrm(t, src, dest, ins); Mn(t, mnemonic); MnOp(t, dest); MnOp(t, src); @@ -948,13 +946,12 @@ BEGIN IF srcSize # destSize THEN - t.Err("movOp: size mismatch: destSize:" & Fmt.Int(destSize) + Err(t, "movOp: size mismatch: destSize:" & Fmt.Int(destSize) & " srcSize:" & Fmt.Int(srcSize) & " src.optype:" & Target.TypeNames[src.optype] & " dest.optype:" & Target.TypeNames[dest.optype]); END; - <* ASSERT srcSize = destSize *> <* ASSERT NOT TypeIs64(srcA[0].optype) *> <* ASSERT NOT TypeIs64(destA[0].optype) *> <* ASSERT NOT TypeIs64(srcA[srcSize - 1].optype) *> @@ -985,7 +982,7 @@ VAR ins: Instruction; BEGIN IF NOT TIntN.ToHostInteger(imm, ins.imm) THEN - t.Err("movImmT: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(imm)); + Err(t, "movImmT: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(imm)); END; IF dest.loc # OLoc.register THEN <* ASSERT dest.loc = OLoc.mem *> @@ -1010,7 +1007,7 @@ VAR immT: TIntN.T; BEGIN IF NOT TIntN.FromHostInteger(imm, BYTESIZE(imm), immT) THEN - t.Err("movImmI: unable to convert INTEGER to TIntN.T"); + Err(t, "movImmI: unable to convert INTEGER to TIntN.T"); END; t.movImmT(dest, immT); END movImmI; @@ -1023,8 +1020,7 @@ | OLoc.imm => ins.opcode := 16_68; IF NOT TIntN.ToHostInteger(src.imm, ins.imm) THEN - t.Err("pushOp: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(src.imm)); - <* ASSERT FALSE *> + Err(t, "pushOp: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(src.imm)); END; ins.imsize := 4; writecode(t, ins); @@ -1038,7 +1034,7 @@ writecode(t, ins); log_global_var(t, src.mvar, -4); ELSE - t.Err("Tried to push an fstack element to the integer stack"); + Err(t, "Tried to push an fstack element to the integer stack"); END END pushOp1; @@ -1061,7 +1057,7 @@ Mn(t, "POP"); MnOp(t, dest); CASE dest.loc OF | OLoc.imm => - t.Err("Tried to pop into an immediate stack element"); + Err(t, "Tried to pop into an immediate stack element"); | OLoc.register => ins.opcode := 16_58 + dest.reg[0]; writecode(t, ins); @@ -1072,7 +1068,7 @@ writecode(t, ins); log_global_var(t, dest.mvar, -4); ELSE - t.Err("Tried to pop an fstack element from the integer stack"); + Err(t, "Tried to pop an fstack element from the integer stack"); END END popOp1; @@ -1115,18 +1111,15 @@ IF index.loc = OLoc.imm THEN IF NOT TIntN.ToHostInteger(index.imm, ins.imm) THEN - t.Err("bitOp: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(index.imm)); - <* ASSERT FALSE *> + Err(t, "bitOp: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(index.imm)); END; ins.opcode := op.bitIndexInImm8Opcode1; build_modrm(t, bits, t.opcode[op.bitIndexInImm8Opcode2], ins); - t.Err("bitOp: untested, non-working code reached #1"); - <* ASSERT FALSE *> + Err(t, "bitOp: untested, non-working code reached #1"); ELSE ins.opcode := op.bitIndexInRegOpcode; IF bits.loc = OLoc.mem THEN - t.Err("bitOp: untested, non-working code reached #2"); - <* ASSERT FALSE *> + Err(t, "bitOp: untested, non-working code reached #2"); <*NOWARN*>build_modrm(t, bits, index, ins); ELSE load_like_helper(t, index.reg[0], bits, 0, ins); @@ -1243,7 +1236,7 @@ build_modrm(t, t.reg[dest.reg[0]], dest, ins); ins.opcode := 16_69; IF NOT TIntN.ToHostInteger(src.imm, ins.imm) THEN - t.Err("imulOp: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(src.imm)); + Err(t, "imulOp: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(src.imm)); END; ins.imsize := 4; writecode(t, ins); @@ -1555,7 +1548,7 @@ ins.escape := TRUE; mnemonic := "MOVSX"; ELSE - t.Err("Unknown type of size other than dword in load_ind"); + Err(t, "Unknown type of size other than dword in load_ind"); END; END; Mn(t, mnemonic, " ", RegName[r]); MnPtr(t, ind, offset, type); @@ -1593,7 +1586,7 @@ | 4 => ins.opcode := 16_8B; type := Type.Int32; ELSE - t.Err("Illegal size in fast_load_ind"); + Err(t, "Illegal size in fast_load_ind"); END; Mn(t, "MOV ", RegName[r]); MnPtr(t, ind, offset, type); @@ -1622,8 +1615,7 @@ ins.mrm_present := TRUE; ins.modrm := r * 8 + ind.reg[0]; IF offset # 0 THEN - t.Err("load_like_helper: untested path #1 (offset # 0)"); - <* ASSERT FALSE *> + Err(t, "load_like_helper: untested path #1 (offset # 0)"); ins.disp := offset; <* NOWARN *> IF offset > -16_81 AND offset < 16_80 THEN ins.dsize := 1; @@ -1634,8 +1626,7 @@ END; END; IF ind.reg[0] = ESP THEN - t.Err("load_like_helper: untested path #2 (reg # ESP)"); - <* ASSERT FALSE *> + Err(t, "load_like_helper: untested path #2 (reg # ESP)"); ins.sib := 16_24; <* NOWARN *> ins.sib_present := TRUE; END; @@ -1650,7 +1641,7 @@ IF val.loc = OLoc.imm THEN ins.opcode := 16_C6; IF NOT TIntN.ToHostInteger(val.imm, ins.imm) THEN - t.Err("store_ind1: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(val.imm)); + Err(t, "store_ind1: unable to convert immediate to INTEGER:" & TIntN.ToDiagnosticText(val.imm)); END; ins.imsize := CG_Bytes[type]; END; @@ -1856,7 +1847,7 @@ check_label(t, label, "set_label"); WITH lab = t.labarr[label] DO IF NOT lab.no_address THEN - t.Err("Duplicate label definition"); + Err(t, "Duplicate label definition"); END; lab.offset := t.obj.cursor(Seg.Text) + offset; lab.no_address := FALSE; @@ -1870,7 +1861,7 @@ PROCEDURE check_label(t: T; label: Label; place: TEXT) = BEGIN IF label >= t.next_label_id THEN - t.Err("Tried to reference unknown label in " & place); + Err(t, "Tried to reference unknown label in " & place); END END check_label; @@ -2048,7 +2039,7 @@ PROCEDURE fstack_check (t: T; depth: INTEGER; place: TEXT) = BEGIN IF t.fstacksize < depth THEN - t.Err("Floating stack underflow in " & place); + Err(t, "Floating stack underflow in " & place); END; IF t.ftop_inmem THEN IF t.fstackloaded + 1 < depth THEN @@ -2082,10 +2073,10 @@ PROCEDURE fstack_wipeup(t: T; wipeup: INTEGER) = BEGIN IF wipeup + t.fstackloaded > 8 THEN - t.Err("Stack overflow in fstack_wipeup"); + Err(t, "Stack overflow in fstack_wipeup"); END; IF wipeup > t.fspilltop THEN - t.Err("Not enough spilled fstack elements to replace in fstack_wipeup"); + Err(t, "Not enough spilled fstack elements to replace in fstack_wipeup"); END; FOR i := 1 TO wipeup DO retrieve_temp(t); @@ -2557,5 +2548,11 @@ RETURN code; END New; +PROCEDURE Err(t: T; err: TEXT) = + BEGIN + t.Err(err); + <* ASSERT FALSE *> + END Err; + BEGIN END Codex86. Index: Stackx86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/Stackx86.m3,v retrieving revision 1.114 diff -u -r1.114 Stackx86.m3 --- Stackx86.m3 7 Mar 2010 04:45:20 -0000 1.114 +++ Stackx86.m3 7 Mar 2010 07:08:38 -0000 @@ -265,11 +265,10 @@ t.cg.wrFlush(); FOR r := 0 TO NRegs DO - IF NOT (t.reguse[r].stackp = -1) THEN - t.Err("r:" & RegName[r] + IF t.reguse[r].stackp # -1 THEN + Err(t, "r:" & RegName[r] & " t.reguse[r].stackp:" & Fmt.Int(t.reguse[r].stackp)); END; - <* ASSERT t.reguse[r].stackp = -1 *> t.reguse[r] := InitRegister(); END END clearall; @@ -307,7 +306,7 @@ FOR i := 0 TO size - 1 DO CASE op.loc OF OLoc.fstack => - t.Err("Tried to put a float in an int register in 'find'"); + Err(t, "Tried to put a float in an int register in 'find'"); | OLoc.mem => in[i] := inreg(t, opA[i].mvar, set); IF size > 1 THEN @@ -755,7 +754,7 @@ IF pos >= 0 THEN RETURN pos; ELSE - t.Err("Stack underflow in " & place); + Err(t, "Stack underflow in " & place); END END; RETURN -1; @@ -779,7 +778,7 @@ VAR immT: TIntN.T; BEGIN IF NOT TIntN.FromHostInteger(immI, Target.Integer.bytes, immT) THEN - t.Err("pushimmI: unable to convert to target integer"); + Err(t, "pushimmI: unable to convert to target integer"); END; t.pushimmT(immT, type); END pushimmI; @@ -889,7 +888,7 @@ srcSize: OperandSize := 1; BEGIN IF t.stacktop < 1 THEN - t.Err("Stack underflow in pop"); + Err(t, "Stack underflow in pop"); END; WITH src_stack0 = t.vstack[t.stacktop - 1] DO @@ -913,13 +912,12 @@ END; srcSize := SplitOperand(src_stack0, src_opA); - IF NOT (srcSize = destSize) THEN - t.Err(" srcSize:" & Fmt.Int(srcSize) + IF srcSize # destSize THEN + Err(t, " srcSize:" & Fmt.Int(srcSize) & " destSize:" & Fmt.Int(destSize) & " dest_mvar.mvar_type:" & Target.TypeNames[dest_mvar.mvar_type] & " src_stack0.optype:" & Target.TypeNames[src_stack0.optype]); END; - <* ASSERT srcSize = destSize *> IF dest_mvar.var.loc = VLoc.temp AND dest_mvar.var.parent # t.current_proc THEN indreg := pickreg(t, AllRegisters, TRUE); @@ -973,13 +971,13 @@ 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 TIntN.FromHostInteger(o, Target.Integer.bytes, to) THEN - t.Err("doloadaddress: unable to convert o"); + Err(t, "doloadaddress: unable to convert o"); END; IF NOT TIntN.FromHostInteger(v.offset, Target.Integer.bytes, tvoffset) THEN - t.Err("doloadaddress: unable to convert v.offset"); + Err(t, "doloadaddress: unable to convert v.offset"); END; IF NOT TIntN.Add(to, tvoffset, ti) THEN - t.Err("dloadaddress: Add overflowed"); + Err(t, "dloadaddress: Add overflowed"); END; t.cg.immOp(Op.oADD, t.cg.reg[stop0.reg[0]], ti); @@ -1006,9 +1004,8 @@ stop1 = t.vstack[stack1] DO IF GetTypeSize(stop0.optype) # GetTypeSize(stop1.optype) THEN - t.Err("findbin: stop0.optype:" & Target.TypeNames[stop0.optype] & " stop1.optype:" & Target.TypeNames[stop1.optype]); + Err(t, "findbin: stop0.optype:" & Target.TypeNames[stop0.optype] & " stop1.optype:" & Target.TypeNames[stop1.optype]); END; - <* ASSERT GetTypeSize(stop0.optype) = GetTypeSize(stop1.optype) *> IF symmetric THEN IF stop0.loc = OLoc.register OR stop1.loc = OLoc.imm OR @@ -1068,17 +1065,15 @@ WITH destop = t.vstack[dest], srcop = t.vstack[src] DO - IF NOT (GetTypeSize(destop.optype) = GetTypeSize(srcop.optype) - AND (GetTypeSize(destop.optype) = GetTypeSize(type))) THEN - t.Err(" GetTypeSize(destop.optype):" & Fmt.Int(GetTypeSize(destop.optype)) + IF (GetTypeSize(destop.optype) # GetTypeSize(srcop.optype)) + OR (GetTypeSize(destop.optype) # GetTypeSize(type)) THEN + Err(t, " GetTypeSize(destop.optype):" & Fmt.Int(GetTypeSize(destop.optype)) & " GetTypeSize(srcop.optype):" & Fmt.Int(GetTypeSize(srcop.optype)) & " GetTypeSize(type):" & Fmt.Int(GetTypeSize(type)) & " destop.optype:" & Target.TypeNames[destop.optype] & " srcop.optype:" & Target.TypeNames[srcop.optype] & " type:" & Target.TypeNames[type]); END; - <* ASSERT GetTypeSize(destop.optype) = GetTypeSize(srcop.optype) *> - <* ASSERT GetTypeSize(destop.optype) = GetTypeSize(type) *> size := SplitOperand(srcop, srcA); EVAL SplitOperand(destop, destA); @@ -1346,7 +1341,7 @@ stop0 = t.vstack[stack0] DO IF stop0.loc = OLoc.imm THEN IF NOT TIntN.Negate(stop0.imm, neg) THEN - t.Err("doneg: Negate overflowed"); + Err(t, "doneg: Negate overflowed"); END; stop0.imm := neg; ELSE @@ -1366,7 +1361,7 @@ stop0 = t.vstack[stack0] DO IF stop0.loc = OLoc.imm THEN IF NOT TIntN.Abs(stop0.imm, stop0.imm) THEN - t.Err("doabs: Abs overflowed"); + Err(t, "doabs: Abs overflowed"); END; ELSE find(t, stack0, Force.anytemp); @@ -1415,7 +1410,7 @@ IF stop0.loc = OLoc.imm AND TWordN.LT(stop0.imm, TIntN.SixtyFour) THEN IF stop1.loc = OLoc.imm THEN IF NOT TIntN.ToHostInteger(stop0.imm, shiftCount) THEN - t.Err("doshift: unable to convert target integer to host integer"); + Err(t, "doshift: unable to convert target integer to host integer"); END; (* shift constant by a constant *) @@ -1450,7 +1445,7 @@ t.cg.immOp(Op.oSHL, stop1, stop0.imm); (* positive shift is left shift *) ELSE IF NOT TIntN.Negate(stop0.imm, tShiftCount) THEN - t.Err("doshift: Negate overflowed"); + Err(t, "doshift: Negate overflowed"); END; t.cg.immOp(Op.oSHR, stop1, tShiftCount); (* negative shift is right shift *) END; @@ -1542,7 +1537,7 @@ IF stop0.loc = OLoc.imm THEN IF stop1.loc = OLoc.imm THEN IF NOT TIntN.ToHostInteger(stop0.imm, rotateCount) THEN - t.Err("dorotate: failed to convert rotateCount to host integer"); + Err(t, "dorotate: failed to convert rotateCount to host integer"); END; TWordN.Rotate(stop1.imm, rotateCount, stop1.imm); ELSE @@ -1559,7 +1554,7 @@ t.cg.immOp(Op.oROL, stop1, stop0.imm); ELSE IF NOT TIntN.Negate(stop0.imm, stop0.imm) THEN - t.Err("dorotate: negate overflowed"); + Err(t, "dorotate: negate overflowed"); END; TWordN.And(stop0.imm, BitCountMask[type], stop0.imm); t.cg.immOp(Op.oROR, stop1, stop0.imm); @@ -1630,7 +1625,7 @@ IF stop0.loc = OLoc.imm THEN discard(t, 1); IF NOT TIntN.ToHostInteger(stop0.imm, int) THEN - t.Err("doextract: failed to convert to host integer"); + Err(t, "doextract: failed to convert to host integer"); END; RETURN doextract_n(t, type, sign, int); END; @@ -1645,10 +1640,9 @@ (* The method used here does not work for extracting zero bits. * Make sure we are not asked to do that. *) - IF NOT (stop2.loc = OLoc.imm AND TIntN.NE(stop2.imm, TZero)) THEN - t.Err("doextract: not able to extract and sign extend zero bits"); + IF (stop2.loc # OLoc.imm) OR TIntN.EQ(stop2.imm, TZero) THEN + Err(t, "doextract: not able to extract and sign extend zero bits"); END; - <* ASSERT stop2.loc = OLoc.imm AND TIntN.NE(stop2.imm, TZero) *> find(t, stack0, Force.regset, RegSet { ECX }); find(t, stack1, Force.any); @@ -1718,7 +1712,7 @@ IF stop0.loc = OLoc.imm THEN discard(t, 1); IF NOT TIntN.ToHostInteger(stop0.imm, int) THEN - t.Err("doextract_n: failed to convert to host integer"); + Err(t, "doextract_n: failed to convert to host integer"); END; RETURN doextract_mn(t, type, sign, int, n); END; @@ -1736,11 +1730,11 @@ END; IF NOT TIntN.FromHostInteger(n, Target.Integer.bytes, tn) THEN - t.Err("doextract_n: failed to convert n to target integer"); + Err(t, "doextract_n: failed to convert n to target integer"); END; IF NOT TIntN.Subtract(typeBitSizeT, tn, typeBitSizeMinusN) THEN - t.Err("doextract_n: Subtract overflowed"); + Err(t, "doextract_n: Subtract overflowed"); END; <* ASSERT NOT is64 *> @@ -1808,14 +1802,14 @@ find(t, stack0, Force.anyreg); IF (m + n) < typeBitSize THEN IF NOT TIntN.FromHostInteger(typeBitSize - (m + n), Target.Integer.bytes, tint) THEN - t.Err("doextract_mn: failed to convert " & Fmt.Int(typeBitSize) & " - (m + n) to target integer"); + Err(t, "doextract_mn: failed to convert " & Fmt.Int(typeBitSize) & " - (m + n) to target integer"); END; t.cg.immOp(Op.oSHL, stop0, tint); END; IF n < typeBitSize THEN IF NOT TIntN.FromHostInteger(typeBitSize - n, Target.Integer.bytes, tint) THEN - t.Err("doextract_mn: failed to convert " & Fmt.Int(typeBitSize) & " - n to target integer"); + Err(t, "doextract_mn: failed to convert " & Fmt.Int(typeBitSize) & " - n to target integer"); END; t.cg.immOp(Op.oSAR, stop0, tint); END @@ -1828,7 +1822,7 @@ IF m > 0 THEN IF NOT TIntN.FromHostInteger(m, Target.Integer.bytes, tint) THEN - t.Err("doextract_mn: failed to m to target integer"); + Err(t, "doextract_mn: failed to m to target integer"); END; t.cg.immOp(Op.oSHR, stop0, tint); END @@ -1866,7 +1860,7 @@ IF stop0.loc = OLoc.imm THEN discard(t, 1); IF NOT TIntN.ToHostInteger(stop0.imm, int) THEN - t.Err("doinsert: failed to convert to host integer"); + Err(t, "doinsert: failed to convert to host integer"); END; RETURN doinsert_n(t, type, int); END; @@ -1911,7 +1905,7 @@ IF stop1.loc = OLoc.imm THEN IF NOT TIntN.ToHostInteger(stop1.imm, int) THEN - t.Err("failed to convert stop1.imm to host integer"); + Err(t, "failed to convert stop1.imm to host integer"); END; TWordN.Shift(max, int, tint); t.cg.immOp(Op.oXOR, t.cg.reg[maskreg], tint); @@ -1957,7 +1951,7 @@ IF stop0.loc = OLoc.imm THEN discard(t, 1); IF NOT TIntN.ToHostInteger(stop0.imm, m) THEN - t.Err("doinsert_n: failed to convert to host integer"); + Err(t, "doinsert_n: failed to convert to host integer"); END; RETURN doinsert_mn(t, type, m, n); END; @@ -2051,7 +2045,7 @@ IF m # 0 THEN IF NOT TIntN.FromHostInteger(m, Target.Integer.bytes, tint_m) THEN - t.Err("doinsert_mn: unable to convert m to target integer"); + Err(t, "doinsert_mn: unable to convert m to target integer"); END; t.cg.immOp(Op.oSHL, stop0, tint_m); END @@ -2263,10 +2257,10 @@ IF stop0.loc = OLoc.imm THEN IF NOT TIntN.FromHostInteger(size, Target.Integer.bytes, tsize) THEN - t.Err("doindex_address: failed to convert size to target integer"); + Err(t, "doindex_address: failed to convert size to target integer"); END; IF NOT TIntN.Multiply(stop0.imm, tsize, tint) THEN - t.Err("doindex_address: multiply overflowed"); + Err(t, "doindex_address: multiply overflowed"); END; stop0.imm := tint; ELSE @@ -2298,7 +2292,7 @@ ELSIF shift > 0 THEN IF NOT TIntN.FromHostInteger(shift, Target.Integer.bytes, tshift) THEN - t.Err("doindex_address: failed to convert size to target integer"); + Err(t, "doindex_address: failed to convert size to target integer"); END; t.cg.immOp(Op.oSHL, stop0, tshift); newdest(t, stop0); @@ -2512,7 +2506,7 @@ VAR size: OperandSize := 1; BEGIN IF depth > t.stacktop THEN - t.Err("Stack underflow in stack_discard"); + Err(t, "Stack underflow in stack_discard"); END; FOR i := t.stacktop - depth TO t.stacktop - 1 DO WITH stackp = t.vstack[i] DO @@ -2716,5 +2710,11 @@ wr.OutT (" }"); END DebugMVar; +PROCEDURE Err(t: T; err: TEXT) = + BEGIN + t.Err(err); + <* ASSERT FALSE *> + END Err; + BEGIN END Stackx86.