From: Alexandra Hájková Date: Wed, 1 Jul 2026 17:55:11 +0000 (-0400) Subject: Implement PMOVSXBW SSE4.1 for x86 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=96c0817e741907d198afbea30444fd12f4e7ff3d;p=thirdparty%2Fvalgrind.git Implement PMOVSXBW SSE4.1 for x86 Move test_PMOVSXBW from none/tests/amd64/sse4-64.c to none/tests/sse4-common.h so both amd64 and x86 implementations can share it. BZ: https://bugs.kde.org/show_bug.cgi?id=518221 --- diff --git a/NEWS b/NEWS index a43a927a6..7af162e81 100644 --- a/NEWS +++ b/NEWS @@ -42,6 +42,7 @@ are not entered into bugzilla tend to get forgotten about or ignored. 518217 Add PHMINPOSUW SSE4.1 support for x86 518218 Add PMULDQ SSE4.1 support for x86 518220 Add ROUNDPS, ROUNDSS, ROUNDPD, ROUNDSD SSE4.1 support for x86 +518221 Implement PMOVSXBW SSE4.1 for x86 520482 Advertise POPCNT on x86 via CPUID 520753 Advertise LZCNT via CPUID for x86 (32-bit) clients 520856 unhandled instruction bytes: 0x2E 0xFF 0x14 0x85 diff --git a/VEX/priv/guest_x86_toIR.c b/VEX/priv/guest_x86_toIR.c index 28637d4bc..70dd3d70c 100644 --- a/VEX/priv/guest_x86_toIR.c +++ b/VEX/priv/guest_x86_toIR.c @@ -13737,6 +13737,39 @@ DisResult disInstr_X86_WRK ( goto decode_success; } + /* 66 0F 38 20 /r = PMOVSXBW xmm1, xmm2/m64 + Packed Move with Sign Extend from Byte to Word (XMM) */ + if (sz == 2 + && insn[0] == 0x0F && insn[1] == 0x38 + && insn[2] == 0x20) { + IRTemp srcVec = newTemp(Ity_V128); + modrm = insn[3]; + UInt rG = gregOfRM(modrm); + + if (epartIsReg(modrm)) { + UInt rE = eregOfRM(modrm); + assign( srcVec, getXMMReg(rE) ); + DIP("pmovsxbw %s,%s\n", nameXMMReg(rE), nameXMMReg(rG)); + delta += 1 + 3; + } else { + addr = disAMode( &alen, sorb, delta+3, dis_buf ); + assign( srcVec, + unop( Iop_64UtoV128, loadLE( Ity_I64, mkexpr(addr) ) ) ); + DIP("pmovsxbw %s,%s\n", dis_buf, nameXMMReg(rG)); + delta += alen + 3; + } + + putXMMReg( rG, binop(Iop_SarN16x8, + binop(Iop_ShlN16x8, + binop(Iop_InterleaveLO8x16, + IRExpr_Const(IRConst_V128(0)), + mkexpr(srcVec)), + mkU8(8)), + mkU8(8)) ); + + goto decode_success; + } + /* 66 0F 3A 0B /r ib = ROUNDSD imm8, xmm2/m64, xmm1 66 0F 3A 0A /r ib = ROUNDSS imm8, xmm2/m32, xmm1 */ diff --git a/none/tests/amd64/sse4-64.c b/none/tests/amd64/sse4-64.c index c74b67549..97e6feaea 100644 --- a/none/tests/amd64/sse4-64.c +++ b/none/tests/amd64/sse4-64.c @@ -1132,18 +1132,6 @@ void test_EXTRACTPS ( void ) DO_imm_r_to_mandrscalar("extractps", 3, src, "d"); } - -void test_PMOVSXBW ( void ) -{ - V128 src, dst; - Int i; - for (i = 0; i < 10; i++) { - randV128(&src); - randV128(&dst); - DO_mandr_r("pmovsxbw", src, dst); - } -} - void test_PMOVSXBD ( void ) { V128 src, dst; diff --git a/none/tests/sse4-common.h b/none/tests/sse4-common.h index 159f816c7..d95a22d38 100644 --- a/none/tests/sse4-common.h +++ b/none/tests/sse4-common.h @@ -2504,4 +2504,15 @@ static inline void test_PCMPGTQ ( void ) } } +static inline void test_PMOVSXBW ( void ) +{ + V128 src, dst; + Int i; + for (i = 0; i < 10; i++) { + randV128(&src); + randV128(&dst); + DO_mandr_r("pmovsxbw", src, dst); + } +} + #endif /* __SSE4_COMMON_H */ diff --git a/none/tests/x86/sse4-x86.c b/none/tests/x86/sse4-x86.c index e2a6b29d7..3eae13b37 100644 --- a/none/tests/x86/sse4-x86.c +++ b/none/tests/x86/sse4-x86.c @@ -271,6 +271,7 @@ int main(void) test_ROUNDPS_w_mxcsr_rounding(); test_PMULDQ(); test_PCMPGTQ(); + test_PMOVSXBW(); return 0; } diff --git a/none/tests/x86/sse4-x86.stdout.exp b/none/tests/x86/sse4-x86.stdout.exp index cdb2fdd6b..274cf4704 100644 --- a/none/tests/x86/sse4-x86.stdout.exp +++ b/none/tests/x86/sse4-x86.stdout.exp @@ -3708,3 +3708,23 @@ r pcmpgtq ffffffffffffffff0000000000000000 fffffffffffffffe0000000000000001 0 m pcmpgtq ffffffffffffffff0000000000000000 fffffffffffffffe0000000000000001 0000000000000000ffffffffffffffff r pcmpgtq ffffffffffffffff0000000000000000 ffffffffffffffff0000000000000000 00000000000000000000000000000000 m pcmpgtq ffffffffffffffff0000000000000000 ffffffffffffffff0000000000000000 00000000000000000000000000000000 +r pmovsxbw 72464063d004536cde86ffa4bafd5cb2 68c8176ba4f520fd2ceec4454cf556b4 ffdeff86ffffffa4ffbafffd005cffb2 +m pmovsxbw 72464063d004536cde86ffa4bafd5cb2 68c8176ba4f520fd2ceec4454cf556b4 ffdeff86ffffffa4ffbafffd005cffb2 +r pmovsxbw 2c1f39c2b3c27f4e9ff2315b8b9efbc6 7bc417e7004de803045a45338b28525e ff9ffff20031005bff8bff9efffbffc6 +m pmovsxbw 2c1f39c2b3c27f4e9ff2315b8b9efbc6 7bc417e7004de803045a45338b28525e ff9ffff20031005bff8bff9efffbffc6 +r pmovsxbw f08ffeb670d8b2230451df7b3f254252 06bc206ec50515132d60c0417b8794d7 00040051ffdf007b003f002500420052 +m pmovsxbw f08ffeb670d8b2230451df7b3f254252 06bc206ec50515132d60c0417b8794d7 00040051ffdf007b003f002500420052 +r pmovsxbw 1ae38aaba3d52998e87186f2f29fef83 66fd2e6c8ea8e5d882ccb15c381eda4a ffe80071ff86fff2fff2ff9fffefff83 +m pmovsxbw 1ae38aaba3d52998e87186f2f29fef83 66fd2e6c8ea8e5d882ccb15c381eda4a ffe80071ff86fff2fff2ff9fffefff83 +r pmovsxbw 0665da0eea422058271ca1abc117bc84 f5d33d4ef8c392fee16a956edffadde4 0027001cffa1ffabffc10017ffbcff84 +m pmovsxbw 0665da0eea422058271ca1abc117bc84 f5d33d4ef8c392fee16a956edffadde4 0027001cffa1ffabffc10017ffbcff84 +r pmovsxbw 0f61e849deadd2109c1fac92c7996682 108a4a7e9fe158332505e6658c265cd1 ff9c001fffacff92ffc7ff990066ff82 +m pmovsxbw 0f61e849deadd2109c1fac92c7996682 108a4a7e9fe158332505e6658c265cd1 ff9c001fffacff92ffc7ff990066ff82 +r pmovsxbw 9325b2ca1da17c6c254623942132a8a8 146d506a1d8e7521296a222c5aae123d 002500460023ff9400210032ffa8ffa8 +m pmovsxbw 9325b2ca1da17c6c254623942132a8a8 146d506a1d8e7521296a222c5aae123d 002500460023ff9400210032ffa8ffa8 +r pmovsxbw edfc33fc43ab5a179d5c839beaed4023 5bca4b7d10572374cb65c5af659fba52 ff9d005cff83ff9bffeaffed00400023 +m pmovsxbw edfc33fc43ab5a179d5c839beaed4023 5bca4b7d10572374cb65c5af659fba52 ff9d005cff83ff9bffeaffed00400023 +r pmovsxbw 7931674aeb55a7bedf2f47943fd6e81f 42eb372214c79fd9e6c249daca04113f ffdf002f0047ff94003fffd6ffe8001f +m pmovsxbw 7931674aeb55a7bedf2f47943fd6e81f 42eb372214c79fd9e6c249daca04113f ffdf002f0047ff94003fffd6ffe8001f +r pmovsxbw 92114b22b12ea10cc989eb6c3bfa5cc7 251d11c7c46b24fc554d2c99a5e9d22e ffc9ff89ffeb006c003bfffa005cffc7 +m pmovsxbw 92114b22b12ea10cc989eb6c3bfa5cc7 251d11c7c46b24fc554d2c99a5e9d22e ffc9ff89ffeb006c003bfffa005cffc7