]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add SSE4.1 PMULLD instruction for x86 32 bit
authorAlexandra Hájková <ahajkova@redhat.com>
Wed, 17 Dec 2025 11:59:19 +0000 (06:59 -0500)
committerAlexandra Hájková <ahajkova@redhat.com>
Fri, 26 Dec 2025 08:17:48 +0000 (09:17 +0100)
Support pmulld (packed multiply 32-bit doubleword integers) instruction
in guest_x86_toIR.c and host_x86_isel.c. Add test function to
sse4-common.h and update none/tests/x86/sse4-x86.c to test the
instruction.

BZ: https://bugs.kde.org/show_bug.cgi?id=513475

NEWS
VEX/priv/guest_x86_toIR.c
VEX/priv/host_x86_isel.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 5650083a16538fde48e53e613145b38b96f4bca6..4a2593eaf198094179a672ab79b47e59b76c0ea8 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -54,6 +54,7 @@ are not entered into bugzilla tend to get forgotten about or ignored.
 513257  Add missing syswraps for lsm_list_modules
 513522  m_libcassert.c: 'ordered comparison of pointer with integer zero'
         compiler warning
+513475  Add SSE4.1 PMULLD instruction for x86 32 bit
 
 To see details of a given bug, visit
   https://bugs.kde.org/show_bug.cgi?id=XXXXXX
index af4edf21e3cf182f85de15c1d5babfdc9bc01dfa..bd4ccd54bbd813d70e8703d8f57510fd92504463 100644 (file)
@@ -13069,6 +13069,38 @@ DisResult disInstr_X86_WRK (
      goto decode_success;
    }
 
+   /* 66 0F 38 40 /r  - PMULLD xmm1, xmm2/m128
+      32x4 integer multiply from xmm2/m128 to xmm1 */
+   if (sz == 2
+       && insn[0] == 0x0F && insn[1] == 0x38 && insn[2] == 0x40) {
+
+      modrm = insn[3];
+
+      IRTemp argL = newTemp(Ity_V128);
+      IRTemp argR = newTemp(Ity_V128);
+
+      if (epartIsReg(modrm)) {
+         assign( argL, getXMMReg( eregOfRM(modrm) ) );
+         delta += 3+1;
+         DIP( "pmulld %s,%s\n",
+              nameXMMReg( eregOfRM(modrm) ),
+              nameXMMReg( gregOfRM(modrm) ) );
+      } else {
+         addr = disAMode( &alen, sorb, delta+3, dis_buf );
+         assign( argL, loadLE( Ity_V128, mkexpr(addr) ));
+         delta += 3+alen;
+         DIP( "pmulld %s,%s\n",
+              dis_buf, nameXMMReg( gregOfRM(modrm) ) );
+      }
+
+      assign(argR, getXMMReg( gregOfRM(modrm) ));
+
+      putXMMReg( gregOfRM(modrm),
+                 binop( Iop_Mul32x4, mkexpr(argL), mkexpr(argR)) );
+
+      goto decode_success;
+   }
+
    /* 66 0F 3A 0B /r ib = ROUNDSD imm8, xmm2/m64, xmm1
       (Partial implementation only -- only deal with cases where
       the rounding mode is specified directly by the immediate byte.)
index 22a5702c05148c4940f77ec1cda5350fe064cbe6..773235cda4233a2cd6760eb244d5c102512337b0 100644 (file)
@@ -3891,6 +3891,9 @@ static HReg iselVecExpr_wrk ( ISelEnv* env, const IRExpr* e )
       case Iop_Min32Ux4:
          fn = (HWord)h_generic_calc_Min32Ux4;
          goto do_SseAssistedBinary;
+      case Iop_Mul32x4:
+         fn = (HWord)h_generic_calc_Mul32x4;
+         goto do_SseAssistedBinary;
       do_SseAssistedBinary: {
          /* As with the amd64 case (where this is copied from) we
             generate pretty bad code. */
index f4207b858b9f960becd412832a83841071af74dd..a4614016e75b92b606b8c9b40a3deffc450bd2fb 100644 (file)
@@ -1637,18 +1637,6 @@ void test_PMULDQ ( void )
 }
 
 
-void test_PMULLD ( void )
-{
-   V128 src, dst;
-   Int i;
-   for (i = 0; i < 10; i++) {
-      randV128(&src);
-      randV128(&dst);
-      DO_mandr_r("pmulld", src, dst);
-   }
-}
-
-
 void test_POPCNTQ ( void )
 {
    ULong block[4];
index 1191d4bb0806e7c1070a1026a56946fbebf99b04..5576c1f73518f63b3938cfa6f54f4510c3db3646 100644 (file)
@@ -340,4 +340,15 @@ static inline void test_PMINUW ( void )
    }
 }
 
+static inline void test_PMULLD ( void )
+{
+   V128 src, dst;
+   Int i;
+   for (i = 0; i < 10; i++) {
+      randV128(&src);
+      randV128(&dst);
+      DO_mandr_r("pmulld", src, dst);
+   }
+}
+
 #endif /* __SSE4_COMMON_H */
index 66423577524ed04b7d98e58368cdf7cda7bb16b8..f65e6467d1236deab2187d9b22947f0bdad1a8a4 100644 (file)
@@ -112,6 +112,7 @@ int main(void)
    test_PMINSD();
    test_PMINUD();
    test_PMINUW();
+   test_PMULLD();
 
    return 0;
 }
index 515c2276690b5e33343315259f8ef4a4ac904d66..de3810a0ed80edd18ab015e0671e93e6ffb18c96 100644 (file)
@@ -166,3 +166,23 @@ r     pminuw 9f043af6a1aed58f1ee978efa4b054d2 76f140aa4182b4e706a17746411ab40c 7
 m     pminuw 9f043af6a1aed58f1ee978efa4b054d2 76f140aa4182b4e706a17746411ab40c 76f13af64182b4e706a17746411a54d2
 r     pminuw 5e58aa8b4c88ae0d34fa174f9ce927c4 51f2275707e17ae4b3fd9698098ef5b0 51f2275707e17ae434fa174f098e27c4
 m     pminuw 5e58aa8b4c88ae0d34fa174f9ce927c4 51f2275707e17ae4b3fd9698098ef5b0 51f2275707e17ae434fa174f098e27c4
+r     pmulld 2ad7482a960fb2b27014160ebbdb47e4 a7837c83faf3cb1d360794fec60222d6 869c457ee570642a5f0ff9e410a26098
+m     pmulld 2ad7482a960fb2b27014160ebbdb47e4 a7837c83faf3cb1d360794fec60222d6 869c457ee570642a5f0ff9e410a26098
+r     pmulld 61cd123e19cf1e2bb001f1161e946f5c d5f13a9ab645e140698bec649583f5aa 0ddd054c30e255c077f47498e538ff18
+m     pmulld 61cd123e19cf1e2bb001f1161e946f5c d5f13a9ab645e140698bec649583f5aa 0ddd054c30e255c077f47498e538ff18
+r     pmulld 5e86033374552e23ce8e2455e0205c58 37885d08d662faf92a541ab7911c2b5a 4b71a098414e0e0bf5309ac32c833ef0
+m     pmulld 5e86033374552e23ce8e2455e0205c58 37885d08d662faf92a541ab7911c2b5a 4b71a098414e0e0bf5309ac32c833ef0
+r     pmulld 7c4e1775412d1d47a8872cb61d8aca05 2993e139f7d64ff4532f9ae1d7da8010 85300e0d0562d0aca71dc7f678f12050
+m     pmulld 7c4e1775412d1d47a8872cb61d8aca05 2993e139f7d64ff4532f9ae1d7da8010 85300e0d0562d0aca71dc7f678f12050
+r     pmulld 19714a711ce1284318b88425f2de758f 0760c299b42e1fdcc2e9e9cf82c7aff8 107f1f896d68b6943d2586eb5a07a388
+m     pmulld 19714a711ce1284318b88425f2de758f 0760c299b42e1fdcc2e9e9cf82c7aff8 107f1f896d68b6943d2586eb5a07a388
+r     pmulld 8f3a9991a2ff8bc2fceca88e7b281821 2d39fd95a9f5a45d514c816eaff2763f f528ae65bf080d7ae6c7fb04282f261f
+m     pmulld 8f3a9991a2ff8bc2fceca88e7b281821 2d39fd95a9f5a45d514c816eaff2763f f528ae65bf080d7ae6c7fb04282f261f
+r     pmulld 3cf6fe426e1281712ef114ddd37570e8 f76b8d9773b81b24de24e0a879648e11 f35052ee3a791ee4558b1108f20d2f68
+m     pmulld 3cf6fe426e1281712ef114ddd37570e8 f76b8d9773b81b24de24e0a879648e11 f35052ee3a791ee4558b1108f20d2f68
+r     pmulld 7af177f11da748fc8b9145fe16d0390f c1426e0dae01c0dd433f816bfd2bb699 9ceea53da123018c3d7f3f2a1387c3f7
+m     pmulld 7af177f11da748fc8b9145fe16d0390f c1426e0dae01c0dd433f816bfd2bb699 9ceea53da123018c3d7f3f2a1387c3f7
+r     pmulld a77700084a491a0ef099b6dd61462ec3 e70a9c61f55fce335d68e1a25652a804 306be308b0b974caedc5f4da103eb30c
+m     pmulld a77700084a491a0ef099b6dd61462ec3 e70a9c61f55fce335d68e1a25652a804 306be308b0b974caedc5f4da103eb30c
+r     pmulld 1dd493f59184345437d5e366d0e20c30 c50f1401e45b82d3086a7a39a1e6217d edbeb7f57c65c93cb53a3db645122370
+m     pmulld 1dd493f59184345437d5e366d0e20c30 c50f1401e45b82d3086a7a39a1e6217d edbeb7f57c65c93cb53a3db645122370