? t1 Index: Codex86.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/Codex86.i3,v retrieving revision 1.35 diff -u -r1.35 Codex86.i3 --- Codex86.i3 2 Mar 2010 12:52:29 -0000 1.35 +++ Codex86.i3 8 Mar 2010 04:46:36 -0000 @@ -245,9 +245,9 @@ OpCode { "NEG", -1, -1, 16_F6, 3, -1, -1 }, OpCode { "NOT", -1, -1, 16_F6, 2, -1, -1 }, OpCode { "LEA", -1, -1, -1, 0, -1, 16_8C }, - OpCode { "SHL", -1, 16_C1, 16_D2, 4, 16_D3, -1 }, (* rmr is reg/mem/cl, not reg/mem/reg *) - OpCode { "SAR", -1, 16_C1, 16_D2, 7, -1, -1 }, - OpCode { "SHR", -1, 16_C1, 16_D2, 5, 16_D3, -1 }, (* rmr is reg/mem/cl, not reg/mem/reg *) + OpCode { "SHL", -1, 16_C1, 16_D2, 4, 16_D3, -1 }, (* rmr is reg/mem/cl, not reg/mem/anyreg *) + OpCode { "SAR", -1, 16_C1, 16_D2, 7, 16_D3, -1 }, (* rmr is reg/mem/cl, not reg/mem/anyreg *) + OpCode { "SHR", -1, 16_C1, 16_D2, 5, 16_D3, -1 }, (* rmr is reg/mem/cl, not reg/mem/anyreg *) OpCode { "SHLD", -1, 16_A4, -1, -1, 16_A5, -1 }, (* third register always CL, imsize always 1 *) OpCode { "SHRD", -1, 16_AC, -1, -1, 16_AD, -1 }, (* third register always CL, imsize always 1 *) OpCode { "ROL", -1, 16_C1, 16_D2, 0, -1, -1 }, Index: Codex86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/Codex86.m3,v retrieving revision 1.107 diff -u -r1.107 Codex86.m3 --- Codex86.m3 7 Mar 2010 07:09:37 -0000 1.107 +++ Codex86.m3 8 Mar 2010 04:46:36 -0000 @@ -400,8 +400,9 @@ END testOp; PROCEDURE shift_double_immediate(t: T; singleOp: Op; READONLY destA: ARRAY OperandPart OF Operand; READONLY imm: TIntN.T) = - VAR left := ORD(singleOp = Op.oSHL); - right := ORD(singleOp = Op.oSHR); + VAR right_signed := (singleOp = Op.oSAR); + left := ORD(singleOp = Op.oSHL); + right := ORD((singleOp = Op.oSHR) OR right_signed); doubleOp := VAL(left * ORD(Op.oSHLD) + right * ORD(Op.oSHRD), Op); immMinus32: TIntN.T; BEGIN @@ -414,7 +415,11 @@ ELSE movOp1(t, destA[left], destA[right]); END; - binOp1(t, Op.oXOR, destA[right], destA[right]); + IF right_signed THEN + immOp1(t, singleOp, destA[right], TIntN.ThirtyOne); + ELSE + binOp1(t, Op.oXOR, destA[right], destA[right]); + END; ELSE (* left shift low into high or right shift high into low *) shift_double_op(t, doubleOp, destA[left], destA[right], Operand{loc := OLoc.imm, imm := imm}); @@ -479,8 +484,9 @@ END unOp_double; PROCEDURE shift_double_ecx(t: T; singleOp: Op; READONLY destA: ARRAY OperandPart OF Operand) = - VAR left := ORD(singleOp = Op.oSHL); - right := ORD(singleOp = Op.oSHR); + VAR right_signed := (singleOp = Op.oSAR); + left := ORD(singleOp = Op.oSHL); + right := ORD((singleOp = Op.oSHR) OR right_signed); doubleOp := VAL(left * ORD(Op.oSHLD) + right * ORD(Op.oSHRD), Op); end_label := t.reserve_labels(1, TRUE); BEGIN @@ -490,7 +496,11 @@ testOp(t, t.reg[ECX], Operand{loc := OLoc.imm, imm := TIntN.ThirtyTwo}); brOp(t, Cond.E, end_label); t.movOp(destA[left], destA[right]); - t.binOp(Op.oXOR, destA[right], destA[right]); + IF right_signed THEN + t.immOp(t, singleOp, destA[right], TIntN.ThirtyOne); + ELSE + t.binOp(Op.oXOR, destA[right], destA[right]); + END; t.set_label(end_label); END shift_double_ecx; @@ -580,7 +590,7 @@ (* shifts by a constant 1 have a smaller encoding available *) - IF op IN SET OF Op{Op.oSHL, Op.oSHR} AND TIntN.EQ(imm, TIntN.One) THEN + IF op IN SET OF Op{Op.oSHL, Op.oSHR, Op.oSAR} AND TIntN.EQ(imm, TIntN.One) THEN INC(ins.opcode, 16_10); ins.imsize := 0; END; @@ -612,13 +622,14 @@ <* ASSERT NOT TypeIs64(destA[0].optype) *> <* ASSERT NOT TypeIs64(destA[destSize - 1].optype) *> - IF (immSize = 2) AND (op IN SET OF Op{Op.oCMP, Op.oADD, Op.oSUB, Op.oSHL, Op.oSHR}) THEN + IF (immSize = 2) AND (op IN SET OF Op{Op.oCMP, Op.oADD, Op.oSUB, Op.oSHL, Op.oSHR, Op.oSAR}) THEN CASE op OF | Op.oADD => add_double_immediate(t, destA, immA); | Op.oSUB => subtract_double_immediate(t, destA, immA); | Op.oCMP => compare_double_immediate(t, destA, immA); | Op.oSHL, - Op.oSHR => shift_double_immediate(t, op, destA, imm); + Op.oSHR, + Op.oSAR => shift_double_immediate(t, op, destA, imm); ELSE <* ASSERT FALSE *> END @@ -1199,7 +1210,8 @@ | Op.oNOT => unOp_double(t, op, destA); | Op.oNEG => negate_double(t, destA); | Op.oSHL, - Op.oSHR => shift_double_ecx(t, op, destA); + Op.oSHR, + Op.oSAR => shift_double_ecx(t, op, destA); ELSE <* ASSERT FALSE *> END Index: M3x86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/M3x86.m3,v retrieving revision 1.162 diff -u -r1.162 M3x86.m3 --- M3x86.m3 7 Mar 2010 14:17:45 -0000 1.162 +++ M3x86.m3 8 Mar 2010 04:46:37 -0000 @@ -2514,7 +2514,6 @@ PROCEDURE extract (u: U; t: IType; sign_extend: BOOLEAN) = (* s2.t := Word.Extract(s2.t, s1.t, s0.t); IF sign_extend THEN SignExtend s2 END; pop(2) *) - VAR builtin := Builtin.extract64; BEGIN IF u.debug THEN u.wr.Cmd ("extract"); @@ -2532,14 +2531,14 @@ END; IF sign_extend THEN - builtin := Builtin.extract_and_sign_extend64; + Err(u, "extract: stack.doextract should have handled all sign_extend cases"); END; - start_int_proc (u, builtin); + start_int_proc (u, Builtin.extract64); pop_param(u, Type.Word32); (* n *) pop_param(u, Type.Word32); (* m *) pop_param(u, Type.Word64); (* value *) - call_64 (u, builtin); + call_64 (u, Builtin.extract64); END extract; PROCEDURE extract_n (u: U; t: IType; sign_extend: BOOLEAN; n: INTEGER) = @@ -2562,8 +2561,12 @@ Err(u, "extract_n: stack.doextract_n should have handled all 32bit cases"); END; + IF sign_extend THEN + Err(u, "extract_n: stack.doextract_n should have handled all sign_extend cases"); + END; + u.vstack.pushimmI(n, Type.Word32); - extract(u, t, sign_extend); + extract(u, t, sign_extend := FALSE); END extract_n; PROCEDURE extract_mn (u: U; t: IType; sign_extend: BOOLEAN; m, n: INTEGER) = @@ -2587,9 +2590,13 @@ Err(u, "extract_mn: stack.doextract_mn should have handled all 32bit cases"); END; + IF sign_extend THEN + Err(u, "extract_mn: stack.doextract_mn should have handled all sign_extend cases"); + END; + u.vstack.pushimmI(m, Type.Word32); u.vstack.pushimmI(n, Type.Word32); - extract(u, t, sign_extend); + extract(u, t, sign_extend := FALSE); END extract_mn; PROCEDURE insert (u: U; t: IType) = @@ -3019,7 +3026,7 @@ udiv64, umod64, div64, mod64, rotate_left64, rotate_right64, rotate64, - insert64, extract64, extract_and_sign_extend64 + insert64, extract64 }; (* union .. sym_difference -> (n_bits, *c, *b, *a): Void @@ -3066,8 +3073,7 @@ BP { "m3_rotate_right64",3, Type.Word64, "__stdcall" }, BP { "m3_rotate64", 3, Type.Word64, "__stdcall" }, BP { "m3_insert64", 6, Type.Word64, "__stdcall" }, - BP { "m3_extract64", 4, Type.Word64, "__stdcall" }, - BP { "m3_extract_and_sign_extend64", 4, Type.Word64, "__stdcall" } + BP { "m3_extract64", 4, Type.Word64, "__stdcall" } }; Index: Stackx86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/Stackx86.m3,v retrieving revision 1.120 diff -u -r1.120 Stackx86.m3 --- Stackx86.m3 7 Mar 2010 14:17:45 -0000 1.120 +++ Stackx86.m3 8 Mar 2010 04:46:37 -0000 @@ -1818,7 +1818,6 @@ PROCEDURE doextract_mn (t: T; type: IType; sign_extend: BOOLEAN; m, n: INTEGER): BOOLEAN = VAR andval, tint: TIntN.T; - is64 := TypeIs64(type); uint_type := IntType[UnsignedType[type]]; max := TIntN.T{x := uint_type.max}; typeBitSize := uint_type.size; @@ -1838,10 +1837,6 @@ WITH stack0 = pos(t, 0, "extract_mn"), stop0 = t.vstack[stack0] DO - IF is64 AND stop0.loc # OLoc.imm THEN - RETURN FALSE; - END; - IF stop0.loc = OLoc.imm THEN TWordN.Shift(stop0.imm, -m, stop0.imm); TWordN.Shift(max, n - typeBitSize, tint); @@ -1857,8 +1852,6 @@ RETURN TRUE; END; - <* ASSERT NOT is64 *> - IF sign_extend THEN find(t, stack0, Force.anyreg); IF (m + n) < typeBitSize THEN