You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
(122) |
Nov
(152) |
Dec
(69) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(6) |
Feb
(25) |
Mar
(73) |
Apr
(82) |
May
(24) |
Jun
(25) |
Jul
(10) |
Aug
(11) |
Sep
(10) |
Oct
(54) |
Nov
(203) |
Dec
(182) |
| 2004 |
Jan
(307) |
Feb
(305) |
Mar
(430) |
Apr
(312) |
May
(187) |
Jun
(342) |
Jul
(487) |
Aug
(637) |
Sep
(336) |
Oct
(373) |
Nov
(441) |
Dec
(210) |
| 2005 |
Jan
(385) |
Feb
(480) |
Mar
(636) |
Apr
(544) |
May
(679) |
Jun
(625) |
Jul
(810) |
Aug
(838) |
Sep
(634) |
Oct
(521) |
Nov
(965) |
Dec
(543) |
| 2006 |
Jan
(494) |
Feb
(431) |
Mar
(546) |
Apr
(411) |
May
(406) |
Jun
(322) |
Jul
(256) |
Aug
(401) |
Sep
(345) |
Oct
(542) |
Nov
(308) |
Dec
(481) |
| 2007 |
Jan
(427) |
Feb
(326) |
Mar
(367) |
Apr
(255) |
May
(244) |
Jun
(204) |
Jul
(223) |
Aug
(231) |
Sep
(354) |
Oct
(374) |
Nov
(497) |
Dec
(362) |
| 2008 |
Jan
(322) |
Feb
(482) |
Mar
(658) |
Apr
(422) |
May
(476) |
Jun
(396) |
Jul
(455) |
Aug
(267) |
Sep
(280) |
Oct
(253) |
Nov
(232) |
Dec
(304) |
| 2009 |
Jan
(486) |
Feb
(470) |
Mar
(458) |
Apr
(423) |
May
(696) |
Jun
(461) |
Jul
(551) |
Aug
(575) |
Sep
(134) |
Oct
(110) |
Nov
(157) |
Dec
(102) |
| 2010 |
Jan
(226) |
Feb
(86) |
Mar
(147) |
Apr
(117) |
May
(107) |
Jun
(203) |
Jul
(193) |
Aug
(238) |
Sep
(300) |
Oct
(246) |
Nov
(23) |
Dec
(75) |
| 2011 |
Jan
(133) |
Feb
(195) |
Mar
(315) |
Apr
(200) |
May
(267) |
Jun
(293) |
Jul
(353) |
Aug
(237) |
Sep
(278) |
Oct
(611) |
Nov
(274) |
Dec
(260) |
| 2012 |
Jan
(303) |
Feb
(391) |
Mar
(417) |
Apr
(441) |
May
(488) |
Jun
(655) |
Jul
(590) |
Aug
(610) |
Sep
(526) |
Oct
(478) |
Nov
(359) |
Dec
(372) |
| 2013 |
Jan
(467) |
Feb
(226) |
Mar
(391) |
Apr
(281) |
May
(299) |
Jun
(252) |
Jul
(311) |
Aug
(352) |
Sep
(481) |
Oct
(571) |
Nov
(222) |
Dec
(231) |
| 2014 |
Jan
(185) |
Feb
(329) |
Mar
(245) |
Apr
(238) |
May
(281) |
Jun
(399) |
Jul
(382) |
Aug
(500) |
Sep
(579) |
Oct
(435) |
Nov
(487) |
Dec
(256) |
| 2015 |
Jan
(338) |
Feb
(357) |
Mar
(330) |
Apr
(294) |
May
(191) |
Jun
(108) |
Jul
(142) |
Aug
(261) |
Sep
(190) |
Oct
(54) |
Nov
(83) |
Dec
(22) |
| 2016 |
Jan
(49) |
Feb
(89) |
Mar
(33) |
Apr
(50) |
May
(27) |
Jun
(34) |
Jul
(53) |
Aug
(53) |
Sep
(98) |
Oct
(206) |
Nov
(93) |
Dec
(53) |
| 2017 |
Jan
(65) |
Feb
(82) |
Mar
(102) |
Apr
(86) |
May
(187) |
Jun
(67) |
Jul
(23) |
Aug
(93) |
Sep
(65) |
Oct
(45) |
Nov
(35) |
Dec
(17) |
| 2018 |
Jan
(26) |
Feb
(35) |
Mar
(38) |
Apr
(32) |
May
(8) |
Jun
(43) |
Jul
(27) |
Aug
(30) |
Sep
(43) |
Oct
(42) |
Nov
(38) |
Dec
(67) |
| 2019 |
Jan
(32) |
Feb
(37) |
Mar
(53) |
Apr
(64) |
May
(49) |
Jun
(18) |
Jul
(14) |
Aug
(53) |
Sep
(25) |
Oct
(30) |
Nov
(49) |
Dec
(31) |
| 2020 |
Jan
(87) |
Feb
(45) |
Mar
(37) |
Apr
(51) |
May
(99) |
Jun
(36) |
Jul
(11) |
Aug
(14) |
Sep
(20) |
Oct
(24) |
Nov
(40) |
Dec
(23) |
| 2021 |
Jan
(14) |
Feb
(53) |
Mar
(85) |
Apr
(15) |
May
(19) |
Jun
(3) |
Jul
(14) |
Aug
(1) |
Sep
(57) |
Oct
(73) |
Nov
(56) |
Dec
(22) |
| 2022 |
Jan
(3) |
Feb
(22) |
Mar
(6) |
Apr
(55) |
May
(46) |
Jun
(39) |
Jul
(15) |
Aug
(9) |
Sep
(11) |
Oct
(34) |
Nov
(20) |
Dec
(36) |
| 2023 |
Jan
(79) |
Feb
(41) |
Mar
(99) |
Apr
(169) |
May
(48) |
Jun
(16) |
Jul
(16) |
Aug
(57) |
Sep
(19) |
Oct
|
Nov
|
Dec
|
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
|
|
|
1
(1) |
2
(2) |
3
(2) |
4
(3) |
5
(1) |
|
6
(2) |
7
|
8
|
9
|
10
(1) |
11
|
12
|
|
13
|
14
(2) |
15
(27) |
16
(1) |
17
(4) |
18
(4) |
19
|
|
20
|
21
(1) |
22
(2) |
23
|
24
(2) |
25
|
26
(2) |
|
27
|
28
(22) |
29
(5) |
30
(3) |
31
(6) |
|
|
|
From: Petar J. <pe...@so...> - 2017-08-22 14:06:00
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=a1e5547a44db46bab055b8907f129e5679b1d36a commit a1e5547a44db46bab055b8907f129e5679b1d36a Author: Petar Jovanovic <mip...@gm...> Date: Tue Aug 22 16:05:00 2017 +0200 mips: remove incorrect implementation of several Iops Remove incorrect implementation of Iop_DivModU64to32 Iop_DivModS64to32 Iop_DivModU128to64 Iop_DivModS128to64 Diff: --- VEX/priv/host_mips_isel.c | 66 ---------------------------------------- memcheck/tests/vbit-test/irops.c | 8 ++--- 2 files changed, 4 insertions(+), 70 deletions(-) diff --git a/VEX/priv/host_mips_isel.c b/VEX/priv/host_mips_isel.c index 2c49a6e..deb33f2 100644 --- a/VEX/priv/host_mips_isel.c +++ b/VEX/priv/host_mips_isel.c @@ -1188,36 +1188,6 @@ static HReg iselWordExpr_R_wrk(ISelEnv * env, IRExpr * e) return r_ccIR; } - if (e->Iex.Binop.op == Iop_DivModU64to32 || - e->Iex.Binop.op == Iop_DivModS64to32) { - HReg tLo = newVRegI(env); - HReg tHi = newVRegI(env); - HReg mask = newVRegI(env); - HReg tLo_1 = newVRegI(env); - HReg tHi_1 = newVRegI(env); - HReg r_dst = newVRegI(env); - Bool syned = toBool(e->Iex.Binop.op == Iop_DivModS64to32); - - HReg r_srcR = iselWordExpr_R(env, e->Iex.Binop.arg2); - HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1); - - addInstr(env, MIPSInstr_Div(syned, True, r_srcL, r_srcR)); - addInstr(env, MIPSInstr_Mfhi(tHi)); - addInstr(env, MIPSInstr_Mflo(tLo)); - - addInstr(env, MIPSInstr_Shft(Mshft_SLL, False, tHi_1, tHi, - MIPSRH_Imm(False, 32))); - - addInstr(env, MIPSInstr_LI(mask, 0xffffffff)); - addInstr(env, MIPSInstr_Alu(Malu_AND, tLo_1, tLo, - MIPSRH_Reg(mask))); - - addInstr(env, MIPSInstr_Alu(Malu_OR, r_dst, tHi_1, - MIPSRH_Reg(tLo_1))); - - return r_dst; - } - if (e->Iex.Binop.op == Iop_DivModU32to32 || e->Iex.Binop.op == Iop_DivModS32to32) { HReg tLo = newVRegI(env); @@ -2262,25 +2232,6 @@ static void iselInt128Expr_wrk(HReg * rHi, HReg * rLo, ISelEnv * env, return; } - case Iop_DivModU128to64: - case Iop_DivModS128to64: { - vassert(mode64); - HReg rHi1, rLo1; - iselInt128Expr(&rHi1, &rLo1, env, e->Iex.Binop.arg1); - - HReg r_srcR = iselWordExpr_R(env, e->Iex.Binop.arg2); - HReg tLo = newVRegI(env); - HReg tHi = newVRegI(env); - Bool syned = toBool(e->Iex.Binop.op == Iop_DivModS128to64); - - addInstr(env, MIPSInstr_Div(syned, False, rLo1, r_srcR)); - addInstr(env, MIPSInstr_Mfhi(tHi)); - addInstr(env, MIPSInstr_Mflo(tLo)); - *rHi = tHi; - *rLo = tLo; - return; - } - default: break; } @@ -2475,23 +2426,6 @@ static void iselInt64Expr_wrk(HReg * rHi, HReg * rLo, ISelEnv * env, IRExpr * e) return; } - case Iop_DivModS64to32: - case Iop_DivModU64to32: { - HReg r_sHi, r_sLo; - HReg tLo = newVRegI(env); - HReg tHi = newVRegI(env); - Bool syned = toBool(op_binop == Iop_DivModS64to32); - HReg r_srcR = iselWordExpr_R(env, e->Iex.Binop.arg2); - - iselInt64Expr(&r_sHi, &r_sLo, env, e->Iex.Binop.arg1); - addInstr(env, MIPSInstr_Div(syned, True, r_sLo, r_srcR)); - addInstr(env, MIPSInstr_Mfhi(tHi)); - addInstr(env, MIPSInstr_Mflo(tLo)); - *rHi = tHi; - *rLo = tLo; - - return; - } case Iop_DivModU32to32: case Iop_DivModS32to32: { diff --git a/memcheck/tests/vbit-test/irops.c b/memcheck/tests/vbit-test/irops.c index 946e932..7f9ce90 100644 --- a/memcheck/tests/vbit-test/irops.c +++ b/memcheck/tests/vbit-test/irops.c @@ -144,12 +144,12 @@ static irop_t irops[] = { { DEFOP(Iop_DivS32E, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 0, .ppc64 = 1, .ppc32 = 1, .mips32 = 0, .mips64 = 0 }, // On s390 the DivMod operations always appear in a certain context // So they cannot be tested in isolation on that platform. - { DEFOP(Iop_DivModU64to32, UNDEF_ALL), .s390x = 0, .amd64 = 1, .x86 = 1, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 1, .mips64 = 1 }, - { DEFOP(Iop_DivModS64to32, UNDEF_ALL), .s390x = 0, .amd64 = 1, .x86 = 1, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 1, .mips64 = 1 }, + { DEFOP(Iop_DivModU64to32, UNDEF_ALL), .s390x = 0, .amd64 = 1, .x86 = 1, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 0 }, + { DEFOP(Iop_DivModS64to32, UNDEF_ALL), .s390x = 0, .amd64 = 1, .x86 = 1, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 0 }, { DEFOP(Iop_DivModU32to32, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 1, .mips64 = 1 }, { DEFOP(Iop_DivModS32to32, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 1, .mips64 = 1 }, - { DEFOP(Iop_DivModU128to64, UNDEF_ALL), .s390x = 0, .amd64 = 1, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 1 }, // mips asserts - { DEFOP(Iop_DivModS128to64, UNDEF_ALL), .s390x = 0, .amd64 = 1, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 1 }, // mips asserts + { DEFOP(Iop_DivModU128to64, UNDEF_ALL), .s390x = 0, .amd64 = 1, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 0 }, // mips asserts + { DEFOP(Iop_DivModS128to64, UNDEF_ALL), .s390x = 0, .amd64 = 1, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 0 }, // mips asserts { DEFOP(Iop_DivModS64to64, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 1 }, // mips asserts { DEFOP(Iop_DivModU64to64, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 1 }, // mips asserts { DEFOP(Iop_8Uto16, UNDEF_ZEXT), .s390x = 1, .amd64 = 1, .x86 = 1, .arm = 0, .ppc64 = 1, .ppc32 = 1, .mips32 = 1, .mips64 = 1 }, |
|
From: Petar J. <pe...@so...> - 2017-08-22 14:06:00
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=5f3cc6c828a84683225c1ba14b4fc4c621c6b7d6 commit 5f3cc6c828a84683225c1ba14b4fc4c621c6b7d6 Author: Petar Jovanovic <mip...@gm...> Date: Tue Aug 22 15:53:15 2017 +0200 mips: reimplement handling of div, divu and ddivu Previous implementation misused some opcodes, and a side effect was dead code emission. To reimplement handling of these instructions, three new IoPs have been introduced: Iop_DivModU64to64, // :: I64,I64 -> I128 // of which lo half is div and hi half is mod Iop_DivModS32to32, // :: I32,I32 -> I64 // of which lo half is div and hi half is mod Iop_DivModU32to32, // :: I32,I32 -> I64 // of which lo half is div and hi half is mod Patch by Aleksandra Karadzic and Tamara Vlahovic. Diff: --- VEX/priv/guest_mips_toIR.c | 36 ++++++++++++++---------------- VEX/priv/host_mips_isel.c | 47 ++++++++++++++++++++++++++++++++++++++++ VEX/priv/ir_defs.c | 11 ++++++++-- VEX/pub/libvex_ir.h | 6 +++++ memcheck/mc_translate.c | 15 ++++++++++++- memcheck/tests/vbit-test/irops.c | 5 ++++- 6 files changed, 96 insertions(+), 24 deletions(-) diff --git a/VEX/priv/guest_mips_toIR.c b/VEX/priv/guest_mips_toIR.c index a73b5dc..d5215f1 100644 --- a/VEX/priv/guest_mips_toIR.c +++ b/VEX/priv/guest_mips_toIR.c @@ -15661,20 +15661,19 @@ static DisResult disInstr_MIPS_WRK ( Bool(*resteerOkFn) (/*opaque */void *, if (mode64) { t2 = newTemp(Ity_I64); - assign(t2, binop(Iop_DivModS64to32, - getIReg(rs), mkNarrowTo32(ty, getIReg(rt)))); + assign(t2, binop(Iop_DivModS32to32, + mkNarrowTo32(ty, getIReg(rs)), + mkNarrowTo32(ty, getIReg(rt)))); putHI(mkWidenFrom32(ty, unop(Iop_64HIto32, mkexpr(t2)), True)); putLO(mkWidenFrom32(ty, unop(Iop_64to32, mkexpr(t2)), True)); } else { t1 = newTemp(Ity_I64); - t2 = newTemp(Ity_I64); - assign(t1, unop(Iop_32Sto64, getIReg(rs))); - assign(t2, binop(Iop_DivModS64to32, mkexpr(t1), getIReg(rt))); + assign(t1, binop(Iop_DivModS32to32, getIReg(rs), getIReg(rt))); - putHI(unop(Iop_64HIto32, mkexpr(t2))); - putLO(unop(Iop_64to32, mkexpr(t2))); + putHI(unop(Iop_64HIto32, mkexpr(t1))); + putLO(unop(Iop_64to32, mkexpr(t1))); } break; @@ -15683,18 +15682,18 @@ static DisResult disInstr_MIPS_WRK ( Bool(*resteerOkFn) (/*opaque */void *, if (mode64) { t2 = newTemp(Ity_I64); - assign(t2, binop(Iop_DivModU64to32, - getIReg(rs), mkNarrowTo32(ty, getIReg(rt)))); + assign(t2, binop(Iop_DivModU32to32, + mkNarrowTo32(ty, getIReg(rs)), + mkNarrowTo32(ty, getIReg(rt)))); putHI(mkWidenFrom32(ty, unop(Iop_64HIto32, mkexpr(t2)), True)); putLO(mkWidenFrom32(ty, unop(Iop_64to32, mkexpr(t2)), True)); } else { t1 = newTemp(Ity_I64); - t2 = newTemp(Ity_I64); - assign(t1, unop(Iop_32Uto64, getIReg(rs))); - assign(t2, binop(Iop_DivModU64to32, mkexpr(t1), getIReg(rt))); - putHI(unop(Iop_64HIto32, mkexpr(t2))); - putLO(unop(Iop_64to32, mkexpr(t2))); + + assign(t1, binop(Iop_DivModU32to32, getIReg(rs), getIReg(rt))); + putHI(unop(Iop_64HIto32, mkexpr(t1))); + putLO(unop(Iop_64to32, mkexpr(t1))); } break; @@ -15731,14 +15730,11 @@ static DisResult disInstr_MIPS_WRK ( Bool(*resteerOkFn) (/*opaque */void *, case 0x1F: /* Doubleword Divide Unsigned DDIVU; MIPS64 check this */ DIP("ddivu r%u, r%u", rs, rt); t1 = newTemp(Ity_I128); - t2 = newTemp(Ity_I128); - assign(t1, binop(Iop_64HLto128, mkU64(0), getIReg(rs))); + assign(t1, binop(Iop_DivModU64to64, getIReg(rs), getIReg(rt))); - assign(t2, binop(Iop_DivModU128to64, mkexpr(t1), getIReg(rt))); - - putHI(unop(Iop_128HIto64, mkexpr(t2))); - putLO(unop(Iop_128to64, mkexpr(t2))); + putHI(unop(Iop_128HIto64, mkexpr(t1))); + putLO(unop(Iop_128to64, mkexpr(t1))); break; case 0x10: { /* MFHI */ diff --git a/VEX/priv/host_mips_isel.c b/VEX/priv/host_mips_isel.c index 0c51c07..2c49a6e 100644 --- a/VEX/priv/host_mips_isel.c +++ b/VEX/priv/host_mips_isel.c @@ -1218,6 +1218,36 @@ static HReg iselWordExpr_R_wrk(ISelEnv * env, IRExpr * e) return r_dst; } + if (e->Iex.Binop.op == Iop_DivModU32to32 || + e->Iex.Binop.op == Iop_DivModS32to32) { + HReg tLo = newVRegI(env); + HReg tHi = newVRegI(env); + HReg mask = newVRegI(env); + HReg tLo_1 = newVRegI(env); + HReg tHi_1 = newVRegI(env); + HReg r_dst = newVRegI(env); + Bool syned = toBool(e->Iex.Binop.op == Iop_DivModS32to32); + + HReg r_srcR = iselWordExpr_R(env, e->Iex.Binop.arg2); + HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1); + + addInstr(env, MIPSInstr_Div(syned, True, r_srcL, r_srcR)); + addInstr(env, MIPSInstr_Mfhi(tHi)); + addInstr(env, MIPSInstr_Mflo(tLo)); + + addInstr(env, MIPSInstr_Shft(Mshft_SLL, False, tHi_1, tHi, + MIPSRH_Imm(False, 32))); + + addInstr(env, MIPSInstr_LI(mask, 0xffffffff)); + addInstr(env, MIPSInstr_Alu(Malu_AND, tLo_1, tLo, + MIPSRH_Reg(mask))); + + addInstr(env, MIPSInstr_Alu(Malu_OR, r_dst, tHi_1, + MIPSRH_Reg(tLo_1))); + + return r_dst; + } + if (e->Iex.Binop.op == Iop_8HLto16 || e->Iex.Binop.op == Iop_16HLto32) { HReg tHi = iselWordExpr_R(env, e->Iex.Binop.arg1); @@ -2216,6 +2246,7 @@ static void iselInt128Expr_wrk(HReg * rHi, HReg * rLo, ISelEnv * env, *rLo = iselWordExpr_R(env, e->Iex.Binop.arg2); return; + case Iop_DivModU64to64: case Iop_DivModS64to64: { HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1); HReg r_srcR = iselWordExpr_R(env, e->Iex.Binop.arg2); @@ -2462,6 +2493,22 @@ static void iselInt64Expr_wrk(HReg * rHi, HReg * rLo, ISelEnv * env, IRExpr * e) return; } + case Iop_DivModU32to32: + case Iop_DivModS32to32: { + HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1); + HReg r_srcR = iselWordExpr_R(env, e->Iex.Binop.arg2); + HReg tLo = newVRegI(env); + HReg tHi = newVRegI(env); + Bool syned = toBool(e->Iex.Binop.op == Iop_DivModS32to32); + + addInstr(env, MIPSInstr_Div(syned, True, r_srcL, r_srcR)); + addInstr(env, MIPSInstr_Mfhi(tHi)); + addInstr(env, MIPSInstr_Mflo(tLo)); + *rHi = tHi; + *rLo = tLo; + return; + } + /* 32HLto64(e1,e2) */ case Iop_32HLto64: *rHi = iselWordExpr_R(env, e->Iex.Binop.arg1); diff --git a/VEX/priv/ir_defs.c b/VEX/priv/ir_defs.c index a853c2e..8822800 100644 --- a/VEX/priv/ir_defs.c +++ b/VEX/priv/ir_defs.c @@ -236,10 +236,14 @@ void ppIROp ( IROp op ) case Iop_DivModU64to32: vex_printf("DivModU64to32"); return; case Iop_DivModS64to32: vex_printf("DivModS64to32"); return; + case Iop_DivModU32to32: vex_printf("DivModU32to32"); return; + case Iop_DivModS32to32: vex_printf("DivModS32to32"); return; + case Iop_DivModU128to64: vex_printf("DivModU128to64"); return; case Iop_DivModS128to64: vex_printf("DivModS128to64"); return; case Iop_DivModS64to64: vex_printf("DivModS64to64"); return; + case Iop_DivModU64to64: vex_printf("DivModU64to64"); return; case Iop_16HIto8: vex_printf("16HIto8"); return; case Iop_16to8: vex_printf("16to8"); return; @@ -2758,12 +2762,15 @@ void typeOfPrimop ( IROp op, BINARY(Ity_I64,Ity_I64, Ity_I64); case Iop_DivModU64to32: case Iop_DivModS64to32: - BINARY(Ity_I64,Ity_I32, Ity_I64); + BINARY(Ity_I64, Ity_I32, Ity_I64); + + case Iop_DivModU32to32: case Iop_DivModS32to32: + BINARY(Ity_I32, Ity_I32, Ity_I64); case Iop_DivModU128to64: case Iop_DivModS128to64: BINARY(Ity_I128,Ity_I64, Ity_I128); - case Iop_DivModS64to64: + case Iop_DivModU64to64: case Iop_DivModS64to64: BINARY(Ity_I64,Ity_I64, Ity_I128); case Iop_16HIto8: case Iop_16to8: diff --git a/VEX/pub/libvex_ir.h b/VEX/pub/libvex_ir.h index fcac043..57fa9b6 100644 --- a/VEX/pub/libvex_ir.h +++ b/VEX/pub/libvex_ir.h @@ -503,6 +503,12 @@ typedef Iop_DivModS64to64, // :: I64,I64 -> I128 // of which lo half is div and hi half is mod + Iop_DivModU64to64, // :: I64,I64 -> I128 + // of which lo half is div and hi half is mod + Iop_DivModS32to32, // :: I32,I32 -> I64 + // of which lo half is div and hi half is mod + Iop_DivModU32to32, // :: I32,I32 -> I64 + // of which lo half is div and hi half is mod /* Integer conversions. Some of these are redundant (eg Iop_64to8 is the same as Iop_64to32 and then Iop_32to8), but diff --git a/memcheck/mc_translate.c b/memcheck/mc_translate.c index 8429301..980c1d7 100644 --- a/memcheck/mc_translate.c +++ b/memcheck/mc_translate.c @@ -3977,7 +3977,13 @@ IRAtom* expr2vbits_Binop ( MCEnv* mce, case Iop_32HLto64: return assignNew('V', mce, Ity_I64, binop(op, vatom1, vatom2)); - case Iop_DivModS64to64: + case Iop_DivModU64to64: + case Iop_DivModS64to64: { + IRAtom* vTmp64 = mkLazy2(mce, Ity_I64, vatom1, vatom2); + return assignNew('V', mce, Ity_I128, + binop(Iop_64HLto128, vTmp64, vTmp64)); + } + case Iop_MullS64: case Iop_MullU64: { IRAtom* vLo64 = mkLeft64(mce, mkUifU64(mce, vatom1,vatom2)); @@ -3986,6 +3992,13 @@ IRAtom* expr2vbits_Binop ( MCEnv* mce, binop(Iop_64HLto128, vHi64, vLo64)); } + case Iop_DivModU32to32: + case Iop_DivModS32to32: { + IRAtom* vTmp32 = mkLazy2(mce, Ity_I32, vatom1, vatom2); + return assignNew('V', mce, Ity_I64, + binop(Iop_32HLto64, vTmp32, vTmp32)); + } + case Iop_MullS32: case Iop_MullU32: { IRAtom* vLo32 = mkLeft32(mce, mkUifU32(mce, vatom1,vatom2)); diff --git a/memcheck/tests/vbit-test/irops.c b/memcheck/tests/vbit-test/irops.c index d0e8298..946e932 100644 --- a/memcheck/tests/vbit-test/irops.c +++ b/memcheck/tests/vbit-test/irops.c @@ -146,9 +146,12 @@ static irop_t irops[] = { // So they cannot be tested in isolation on that platform. { DEFOP(Iop_DivModU64to32, UNDEF_ALL), .s390x = 0, .amd64 = 1, .x86 = 1, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 1, .mips64 = 1 }, { DEFOP(Iop_DivModS64to32, UNDEF_ALL), .s390x = 0, .amd64 = 1, .x86 = 1, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 1, .mips64 = 1 }, + { DEFOP(Iop_DivModU32to32, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 1, .mips64 = 1 }, + { DEFOP(Iop_DivModS32to32, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 1, .mips64 = 1 }, { DEFOP(Iop_DivModU128to64, UNDEF_ALL), .s390x = 0, .amd64 = 1, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 1 }, // mips asserts { DEFOP(Iop_DivModS128to64, UNDEF_ALL), .s390x = 0, .amd64 = 1, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 1 }, // mips asserts - { DEFOP(Iop_DivModS64to64, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 0 }, // mips asserts + { DEFOP(Iop_DivModS64to64, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 1 }, // mips asserts + { DEFOP(Iop_DivModU64to64, UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 1 }, // mips asserts { DEFOP(Iop_8Uto16, UNDEF_ZEXT), .s390x = 1, .amd64 = 1, .x86 = 1, .arm = 0, .ppc64 = 1, .ppc32 = 1, .mips32 = 1, .mips64 = 1 }, { DEFOP(Iop_8Uto32, UNDEF_ZEXT), .s390x = 1, .amd64 = 1, .x86 = 1, .arm = 1, .ppc64 = 1, .ppc32 = 1, .mips32 = 1, .mips64 = 1 }, { DEFOP(Iop_8Uto64, UNDEF_ZEXT), .s390x = 1, .amd64 = 1, .x86 = 0, .arm = 0, .ppc64 = 1, .ppc32 = 0, .mips32 = 0, .mips64 = 1 }, // ppc32 assert |