? t1 ? t2 Index: M3x86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/M3x86.m3,v retrieving revision 1.161 diff -u -r1.161 M3x86.m3 --- M3x86.m3 7 Mar 2010 12:39:14 -0000 1.161 +++ M3x86.m3 7 Mar 2010 14:16:45 -0000 @@ -2527,9 +2527,14 @@ RETURN; END; + IF NOT TypeIs64(t) THEN + Err(u, "extract: stack.doextract should have handled all 32bit cases"); + END; + IF sign_extend THEN builtin := Builtin.extract_and_sign_extend64; END; + start_int_proc (u, builtin); pop_param(u, Type.Word32); (* n *) pop_param(u, Type.Word32); (* m *) @@ -2553,6 +2558,10 @@ RETURN; END; + IF NOT TypeIs64(t) THEN + Err(u, "extract_n: stack.doextract_n should have handled all 32bit cases"); + END; + u.vstack.pushimmI(n, Type.Word32); extract(u, t, sign_extend); END extract_n; @@ -2574,6 +2583,10 @@ RETURN; END; + IF NOT TypeIs64(t) THEN + Err(u, "extract_mn: stack.doextract_mn should have handled all 32bit cases"); + END; + u.vstack.pushimmI(m, Type.Word32); u.vstack.pushimmI(n, Type.Word32); extract(u, t, sign_extend); @@ -2591,6 +2604,11 @@ IF u.vstack.doinsert(t) THEN RETURN; END; + + IF NOT TypeIs64(t) THEN + Err(u, "insert: stack.doinsert should have handled all 32bit cases"); + END; + start_int_proc (u, Builtin.insert64); pop_param(u, Type.Word32); pop_param(u, Type.Word32); @@ -2612,6 +2630,11 @@ IF u.vstack.doinsert_n(t, n) THEN RETURN; END; + + IF NOT TypeIs64(t) THEN + Err(u, "insert_n: stack.doinsert_n should have handled all 32bit cases"); + END; + u.vstack.pushimmI(n, Type.Word32); u.insert(t); END insert_n; @@ -2630,6 +2653,11 @@ IF u.vstack.doinsert_mn(t, m, n) THEN RETURN; END; + + IF NOT TypeIs64(t) THEN + Err(u, "insert_mn: stack.doinsert_mn should have handled all 32bit cases"); + END; + u.vstack.pushimmI(m, Type.Word32); u.vstack.pushimmI(n, Type.Word32); u.insert(t); @@ -2987,9 +3015,11 @@ set_union, set_difference, set_intersection, set_sym_difference, set_range, set_lt, set_le, set_gt, set_ge, memmove, memcpy, memset, memcmp, - mul64, udiv64, umod64, + mul64, + udiv64, umod64, div64, mod64, - rotate_left64, rotate_right64, rotate64, insert64, extract64, extract_and_sign_extend64 + rotate_left64, rotate_right64, rotate64, + insert64, extract64, extract_and_sign_extend64 }; (* union .. sym_difference -> (n_bits, *c, *b, *a): Void Index: Stackx86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/Stackx86.m3,v retrieving revision 1.119 diff -u -r1.119 Stackx86.m3 --- Stackx86.m3 7 Mar 2010 12:44:11 -0000 1.119 +++ Stackx86.m3 7 Mar 2010 14:16:45 -0000 @@ -1715,18 +1715,22 @@ END doextract; PROCEDURE doextract_n (t: T; type: IType; sign_extend: BOOLEAN; n: INTEGER): BOOLEAN = - VAR tn, typeBitSizeMinusN, andval: TIntN.T; + VAR andval: TIntN.T; int: INTEGER; is64 := TypeIs64(type); uint_type := IntType[UnsignedType[type]]; max := TIntN.T{x := uint_type.max}; typeBitSize := uint_type.size; - typeBitSizeT := TIntN.T{x := Target.Int{typeBitSize, 0, ..}}; + (* typeBitSizeT := TIntN.T{x := Target.Int{typeBitSize, 0, ..}}; + * tn: TIntN.T; + * typeBitSizeMinusN: TIntN.T; + *) BEGIN IF n < 0 THEN Err(t, "doextract_n: n must be positive"); END; + IF sign_extend AND (n < 1) THEN Err(t, "doextract_n: n must at least 1 if sign extending"); END; @@ -1737,6 +1741,14 @@ stop0 = t.vstack[stack0], stop1 = t.vstack[stack1] DO + IF sign_extend AND stop0.loc # OLoc.imm THEN + + (* Code for this is not reachable and not testable. *) + + Err(t, "doextract: sign_extend requires constant m/n"); + + END; + IF is64 AND (stop0.loc # OLoc.imm OR stop1.loc # OLoc.imm) THEN RETURN FALSE; END; @@ -1753,32 +1765,38 @@ IF sign_extend THEN - corrupt(t, ECX, operandPart := 0); - t.reguse[ECX].locked := TRUE; + Err(t, "doextract: sign_extend requires constant m/n"); - find(t, stack0, Force.any); - find(t, stack1, Force.anyreg); - IF stop0.loc = OLoc.mem AND CG_Bytes[stop0.mvar.mvar_type] < 4 THEN - find(t, stack0, Force.anyreg); - END; + (* This is not reachable and not testable. + * + * corrupt(t, ECX, operandPart := 0); + * t.reguse[ECX].locked := TRUE; + * + * find(t, stack0, Force.any); + * find(t, stack1, Force.anyreg); + * IF stop0.loc = OLoc.mem AND CG_Bytes[stop0.mvar.mvar_type] < 4 THEN + * find(t, stack0, Force.anyreg); + * END; + * + * IF NOT TIntN.FromHostInteger(n, Target.Integer.bytes, tn) THEN + * Err(t, "doextract_n: failed to convert n to target integer"); + * END; + * + * IF NOT TIntN.Subtract(typeBitSizeT, tn, typeBitSizeMinusN) THEN + * Err(t, "doextract_n: Subtract overflowed"); + * END; + * + * <* ASSERT NOT is64 *> + * + * t.cg.movImmI(t.cg.reg[ECX], typeBitSize - n); + * t.cg.binOp(Op.oSUB, t.cg.reg[ECX], stop0); + * t.cg.unOp(Op.oSHL, stop1); + * + * IF n < typeBitSize THEN + * t.cg.immOp(Op.oSAR, stop1, typeBitSizeMinusN); + * END + *) - IF NOT TIntN.FromHostInteger(n, Target.Integer.bytes, tn) THEN - Err(t, "doextract_n: failed to convert n to target integer"); - END; - - IF NOT TIntN.Subtract(typeBitSizeT, tn, typeBitSizeMinusN) THEN - Err(t, "doextract_n: Subtract overflowed"); - END; - - <* ASSERT NOT is64 *> - - t.cg.movImmI(t.cg.reg[ECX], typeBitSize - n); - t.cg.binOp(Op.oSUB, t.cg.reg[ECX], stop0); - t.cg.unOp(Op.oSHL, stop1); - - IF n < typeBitSize THEN - t.cg.immOp(Op.oSAR, stop1, typeBitSizeMinusN); - END ELSE find(t, stack0, Force.regset, RegSet { ECX }); find(t, stack1, Force.anyreg);