]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Implement PMOVSXBW SSE4.1 for x86
authorAlexandra Hájková <ahajkova@redhat.com>
Wed, 1 Jul 2026 17:55:11 +0000 (13:55 -0400)
committerAlexandra Hájková <ahajkova@redhat.com>
Fri, 3 Jul 2026 11:10:45 +0000 (13:10 +0200)
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

NEWS
VEX/priv/guest_x86_toIR.c
none/tests/amd64/sse4-64.c
none/tests/sse4-common.h
none/tests/x86/sse4-x86.c
none/tests/x86/sse4-x86.stdout.exp

diff --git a/NEWS b/NEWS
index a43a927a6a4bf404b98a1c8a95c875254f1f5668..7af162e8167eddc17025c7dbf2f1ad0147ccc927 100644 (file)
--- 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
index 28637d4bc3c349754646771487efd914eebfeafc..70dd3d70c0998ec47f00b48adc51e4f19934907d 100644 (file)
@@ -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
    */
index c74b6754993a8ddd472d259d407f10876ad5b0e6..97e6feaea2aee553d82d49c6511445218fd92a66 100644 (file)
@@ -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;
index 159f816c72090fc22d856fe14495bc2da7a676f1..d95a22d38bd6f9e57f29575d185a62378992da2c 100644 (file)
@@ -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 */
index e2a6b29d77c71fbdfab80782ce0bba88f55a4a78..3eae13b37e6d834520d766d0454892c291dfce4d 100644 (file)
@@ -271,6 +271,7 @@ int main(void)
    test_ROUNDPS_w_mxcsr_rounding();
    test_PMULDQ();
    test_PCMPGTQ();
+   test_PMOVSXBW();
 
    return 0;
 }
index cdb2fdd6b2453d90ed9ccb67ebdf33a0cd6a8556..274cf4704fc193d2c06f6504ba280c67a2614399 100644 (file)
@@ -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