]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add SSE4.1 min/max instructions for x86 32 bit
authorAlexandra Hájková <ahajkova@redhat.com>
Tue, 2 Dec 2025 16:06:58 +0000 (11:06 -0500)
committerAlexandra Hájková <ahajkova@redhat.com>
Tue, 9 Dec 2025 11:44:24 +0000 (12:44 +0100)
Support pmaxsb, pminsb, pmaxuw, pminuw, pmaxud and pminud instructions
in guest_x86_toIR.c and host_x86_isel.c. Move test functions from
amd64/sse4-64.c to sse4-common.h and update none/tests/x86/sse4-x86.c
and sse4-x86.stdout.exp to test all min/max instructions.

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

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 6583e5807c7a9426e6c33667b7075d0ae6799477..723b716b5e6ccda8289019589b245444dd097d5b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -33,6 +33,7 @@ are not entered into bugzilla tend to get forgotten about or ignored.
 510416  Missing syswraps for file_getattr and file_setattr
 510563  Add missing syswraps for lsm_get_self_attr and lsm_set_self_attr
 510864  Add SSE4.1 PMAXSD and PMINSD instructions support for 32-bit x86
+512873  Add SSE4.1 min/max instructions for x86 32 bit
 511329  Darwin and FreeBSD: Move setting of carry flag out of
         ML_(do_syscall_for_client_WRK)
 511713  Refactor syscall argument handling
index a91551f562507eeb3e9bc35e4b2f02068976cc88..af4edf21e3cf182f85de15c1d5babfdc9bc01dfa 100644 (file)
@@ -12995,6 +12995,24 @@ DisResult disInstr_X86_WRK (
       goto decode_success;
    }
 
+   /* 66 0F 38 38 /r  - PMINSB xmm1, xmm2/m128
+      66 0F 38 3C /r  - PMAXSB xmm1, xmm2/m128
+      Minimum/Maximum of Packed Signed Byte Integers (XMM)
+   */
+   if (sz == 2
+       && insn[0] == 0x0F && insn[1] == 0x38
+       && (insn[2] == 0x38 || insn[2] == 0x3C)) {
+     /* FIXME: this needs an alignment check */
+     Bool isMAX = insn[2] == 0x3C;
+     delta = dis_SSEint_E_to_G(
+         sorb, delta+3,
+         isMAX ? "pmaxsb" : "pminsb",
+         isMAX ? Iop_Max8Sx16 : Iop_Min8Sx16,
+         False
+         );
+     goto decode_success;
+   }
+
    /* 66 0F 38 39 /r  - PMINSD xmm1, xmm2/m128
       66 0F 38 3D /r  - PMAXSD xmm1, xmm2/m128
       66 prefix (sz == 2): SSE2/SSE4 XMM instructions (128-bit)
@@ -13015,6 +13033,42 @@ DisResult disInstr_X86_WRK (
      goto decode_success;
    }
 
+   /* 66 0F 38 3A /r  - PMINUW xmm1, xmm2/m128
+      66 0F 38 3E /r  - PMAXUW xmm1, xmm2/m128
+      Minimum/Maximum of Packed Unsigned Word Integers (XMM)
+   */
+   if (sz == 2
+       && insn[0] == 0x0F && insn[1] == 0x38
+       && (insn[2] == 0x3A || insn[2] == 0x3E)) {
+     /* FIXME: this needs an alignment check */
+     Bool isMAX = insn[2] == 0x3E;
+     delta = dis_SSEint_E_to_G(
+         sorb, delta+3,
+         isMAX ? "pmaxuw" : "pminuw",
+         isMAX ? Iop_Max16Ux8 : Iop_Min16Ux8,
+         False
+         );
+     goto decode_success;
+   }
+
+   /* 66 0F 38 3B /r  - PMINUD xmm1, xmm2/m128
+      66 0F 38 3F /r  - PMAXUD xmm1, xmm2/m128
+      Minimum/Maximum of Packed Unsigned Doubleword Integers (XMM)
+   */
+   if (sz == 2
+       && insn[0] == 0x0F && insn[1] == 0x38
+       && (insn[2] == 0x3B || insn[2] == 0x3F)) {
+     /* FIXME: this needs an alignment check */
+     Bool isMAX = insn[2] == 0x3F;
+     delta = dis_SSEint_E_to_G(
+         sorb, delta+3,
+         isMAX ? "pmaxud" : "pminud",
+         isMAX ? Iop_Max32Ux4 : Iop_Min32Ux4,
+         False
+         );
+     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 0dbd0fb8a20fa008c1e1cd62bfe05cfd8921f087..72d6b46843810baa38a2b9a84a367c6d73c2e646 100644 (file)
@@ -3867,12 +3867,30 @@ static HReg iselVecExpr_wrk ( ISelEnv* env, const IRExpr* e )
       case Iop_NarrowBin16to8x16:
          fn = (HWord)h_generic_calc_NarrowBin16to8x16;
          goto do_SseAssistedBinary;
+      case Iop_Max8Sx16:
+         fn = (HWord)h_generic_calc_Max8Sx16;
+         goto do_SseAssistedBinary;
+      case Iop_Min8Sx16:
+         fn = (HWord)h_generic_calc_Min8Sx16;
+         goto do_SseAssistedBinary;
+      case Iop_Max16Ux8:
+         fn = (HWord)h_generic_calc_Max16Ux8;
+         goto do_SseAssistedBinary;
+      case Iop_Min16Ux8:
+         fn = (HWord)h_generic_calc_Min16Ux8;
+         goto do_SseAssistedBinary;
       case Iop_Max32Sx4:
          fn = (HWord)h_generic_calc_Max32Sx4;
          goto do_SseAssistedBinary;
       case Iop_Min32Sx4:
          fn = (HWord)h_generic_calc_Min32Sx4;
          goto do_SseAssistedBinary;
+      case Iop_Max32Ux4:
+         fn = (HWord)h_generic_calc_Max32Ux4;
+         goto do_SseAssistedBinary;
+      case Iop_Min32Ux4:
+         fn = (HWord)h_generic_calc_Min32Ux4;
+         goto do_SseAssistedBinary;
       do_SseAssistedBinary: {
          /* As with the amd64 case (where this is copied from) we
             generate pretty bad code. */
index fc30963448f5a118b85153b2b6a86cc7e81b5f11..f4207b858b9f960becd412832a83841071af74dd 100644 (file)
@@ -1492,71 +1492,6 @@ void test_PHMINPOSUW ( void )
    DO_mandr_r("phminposuw", src, dst);
 }
 
-void test_PMAXSB ( void )
-{
-   V128 src, dst;
-   Int i;
-   for (i = 0; i < 10; i++) {
-      randV128(&src);
-      randV128(&dst);
-      DO_mandr_r("pmaxsb", src, dst);
-   }
-}
-
-void test_PMAXUD ( void )
-{
-   V128 src, dst;
-   Int i;
-   for (i = 0; i < 10; i++) {
-      randV128(&src);
-      randV128(&dst);
-      DO_mandr_r("pmaxud", src, dst);
-   }
-}
-
-void test_PMAXUW ( void )
-{
-   V128 src, dst;
-   Int i;
-   for (i = 0; i < 10; i++) {
-      randV128(&src);
-      randV128(&dst);
-      DO_mandr_r("pmaxuw", src, dst);
-   }
-}
-
-void test_PMINSB ( void )
-{
-   V128 src, dst;
-   Int i;
-   for (i = 0; i < 10; i++) {
-      randV128(&src);
-      randV128(&dst);
-      DO_mandr_r("pminsb", src, dst);
-   }
-}
-
-void test_PMINUD ( void )
-{
-   V128 src, dst;
-   Int i;
-   for (i = 0; i < 10; i++) {
-      randV128(&src);
-      randV128(&dst);
-      DO_mandr_r("pminud", src, dst);
-   }
-}
-
-void test_PMINUW ( void )
-{
-   V128 src, dst;
-   Int i;
-   for (i = 0; i < 10; i++) {
-      randV128(&src);
-      randV128(&dst);
-      DO_mandr_r("pminuw", src, dst);
-   }
-}
 
 void test_PMOVSXBW ( void )
 {
index e3341186bd251768f10da877b118645dc5cf656d..1191d4bb0806e7c1070a1026a56946fbebf99b04 100644 (file)
@@ -274,4 +274,70 @@ static inline void test_PMINSD ( void )
    }
 }
 
+static inline void test_PMAXSB ( void )
+{
+   V128 src, dst;
+   Int i;
+   for (i = 0; i < 10; i++) {
+      randV128(&src);
+      randV128(&dst);
+      DO_mandr_r("pmaxsb", src, dst);
+   }
+}
+
+static inline void test_PMAXUD ( void )
+{
+   V128 src, dst;
+   Int i;
+   for (i = 0; i < 10; i++) {
+      randV128(&src);
+      randV128(&dst);
+      DO_mandr_r("pmaxud", src, dst);
+   }
+}
+
+static inline void test_PMAXUW ( void )
+{
+   V128 src, dst;
+   Int i;
+   for (i = 0; i < 10; i++) {
+      randV128(&src);
+      randV128(&dst);
+      DO_mandr_r("pmaxuw", src, dst);
+   }
+}
+
+static inline void test_PMINSB ( void )
+{
+   V128 src, dst;
+   Int i;
+   for (i = 0; i < 10; i++) {
+      randV128(&src);
+      randV128(&dst);
+      DO_mandr_r("pminsb", src, dst);
+   }
+}
+
+static inline void test_PMINUD ( void )
+{
+   V128 src, dst;
+   Int i;
+   for (i = 0; i < 10; i++) {
+      randV128(&src);
+      randV128(&dst);
+      DO_mandr_r("pminud", src, dst);
+   }
+}
+
+static inline void test_PMINUW ( void )
+{
+   V128 src, dst;
+   Int i;
+   for (i = 0; i < 10; i++) {
+      randV128(&src);
+      randV128(&dst);
+      DO_mandr_r("pminuw", src, dst);
+   }
+}
+
 #endif /* __SSE4_COMMON_H */
index f47f185bf642bf5ff4ad4535868d5b68433bda82..66423577524ed04b7d98e58368cdf7cda7bb16b8 100644 (file)
@@ -104,8 +104,14 @@ int main(void)
 {
    // ------ SSE 4.1 ------
    test_PINSRD();
+   test_PMAXSB();
    test_PMAXSD();
+   test_PMAXUD();
+   test_PMAXUW();
+   test_PMINSB();
    test_PMINSD();
+   test_PMINUD();
+   test_PMINUW();
 
    return 0;
 }
index 99822c46cf570ad4e379b41a2b159b4128432053..515c2276690b5e33343315259f8ef4a4ac904d66 100644 (file)
@@ -6,43 +6,163 @@ r     pinsrd $2 3bd127afa6e9c369 55555555555555555555555555555555 55555555a6e9c3
 m     pinsrd $2 3bd127afa6e9c369 55555555555555555555555555555555 55555555a6e9c3695555555555555555
 r     pinsrd $3 0d6a95fac528657d 55555555555555555555555555555555 c528657d555555555555555555555555
 m     pinsrd $3 0d6a95fac528657d 55555555555555555555555555555555 c528657d555555555555555555555555
-r     pmaxsd 60b160857d45c48447b8d8c0eeef1e50 b6d2fb5aa7bc5127fe9915e556a044b2 60b160857d45c48447b8d8c056a044b2
-m     pmaxsd 60b160857d45c48447b8d8c0eeef1e50 b6d2fb5aa7bc5127fe9915e556a044b2 60b160857d45c48447b8d8c056a044b2
-r     pmaxsd 19a348215c3a67fd399182c2dbcc2d38 065d77195d623e6b842adc6450659e17 19a348215d623e6b399182c250659e17
-m     pmaxsd 19a348215c3a67fd399182c2dbcc2d38 065d77195d623e6b842adc6450659e17 19a348215d623e6b399182c250659e17
-r     pmaxsd d89998df5035ed364a4bc43968bc40e5 cb509970b8136c85d740b80eb7839b97 d89998df5035ed364a4bc43968bc40e5
-m     pmaxsd d89998df5035ed364a4bc43968bc40e5 cb509970b8136c85d740b80eb7839b97 d89998df5035ed364a4bc43968bc40e5
-r     pmaxsd f9dd4a29f8c093db56b01a12b0ca1583 5ff85bc9535c191fd3a727d1a705f65d 5ff85bc9535c191f56b01a12b0ca1583
-m     pmaxsd f9dd4a29f8c093db56b01a12b0ca1583 5ff85bc9535c191fd3a727d1a705f65d 5ff85bc9535c191f56b01a12b0ca1583
-r     pmaxsd d8bc5c6dee699597398e0039cf03663d 20a1bb92cbc97fe8542da4983df76c96 20a1bb92ee699597542da4983df76c96
-m     pmaxsd d8bc5c6dee699597398e0039cf03663d 20a1bb92cbc97fe8542da4983df76c96 20a1bb92ee699597542da4983df76c96
-r     pmaxsd d182c916cebc2e17cfaff39be272ef40 6897b536bbe4da8a369dab4f9465b86e 6897b536cebc2e17369dab4fe272ef40
-m     pmaxsd d182c916cebc2e17cfaff39be272ef40 6897b536bbe4da8a369dab4f9465b86e 6897b536cebc2e17369dab4fe272ef40
-r     pmaxsd 407b8d9035449b06f4e06e2205236eb7 95264321bf3b68b255c2b9e2c95c9810 407b8d9035449b0655c2b9e205236eb7
-m     pmaxsd 407b8d9035449b06f4e06e2205236eb7 95264321bf3b68b255c2b9e2c95c9810 407b8d9035449b0655c2b9e205236eb7
-r     pmaxsd 81f2a547be8d181184ededbc53239dcf 019963bf7459630b8d69483df7e8c6a9 019963bf7459630b8d69483d53239dcf
-m     pmaxsd 81f2a547be8d181184ededbc53239dcf 019963bf7459630b8d69483df7e8c6a9 019963bf7459630b8d69483d53239dcf
-r     pmaxsd f0350ca70523e0e45ba1ec54e87d39b3 0a3e0f7c75cb0842b95ed64d3b13ff64 0a3e0f7c75cb08425ba1ec543b13ff64
-m     pmaxsd f0350ca70523e0e45ba1ec54e87d39b3 0a3e0f7c75cb0842b95ed64d3b13ff64 0a3e0f7c75cb08425ba1ec543b13ff64
-r     pmaxsd e98ebd1ca893312a54cae7d5e13dfe91 0a5f45c55f1c9202b76ddefcb0ebfe6e 0a5f45c55f1c920254cae7d5e13dfe91
-m     pmaxsd e98ebd1ca893312a54cae7d5e13dfe91 0a5f45c55f1c9202b76ddefcb0ebfe6e 0a5f45c55f1c920254cae7d5e13dfe91
-r     pminsd c84ab713406845904d325b2d5a70a792 5f490104ced83ff86262dd37727c80f3 c84ab713ced83ff84d325b2d5a70a792
-m     pminsd c84ab713406845904d325b2d5a70a792 5f490104ced83ff86262dd37727c80f3 c84ab713ced83ff84d325b2d5a70a792
-r     pminsd e9b5f3f66b2e58c121a6c3476d21f1e5 63483da65c8c49d096084deb9ed0411e e9b5f3f65c8c49d096084deb9ed0411e
-m     pminsd e9b5f3f66b2e58c121a6c3476d21f1e5 63483da65c8c49d096084deb9ed0411e e9b5f3f65c8c49d096084deb9ed0411e
-r     pminsd a81b6e33c572a86aacf29b0f395c98b4 73a8f718a8c3ec352e2dac0350f6fd1c a81b6e33a8c3ec35acf29b0f395c98b4
-m     pminsd a81b6e33c572a86aacf29b0f395c98b4 73a8f718a8c3ec352e2dac0350f6fd1c a81b6e33a8c3ec35acf29b0f395c98b4
-r     pminsd 61c82534e9bf6f37c9e25f72d82e582b ecb42ac54b0966d4089b756aa3f77018 ecb42ac5e9bf6f37c9e25f72a3f77018
-m     pminsd 61c82534e9bf6f37c9e25f72d82e582b ecb42ac54b0966d4089b756aa3f77018 ecb42ac5e9bf6f37c9e25f72a3f77018
-r     pminsd 6f07136773a2ead356428c5a66a2ec77 28bad218e4ebf159ff1f240eb3e1553f 28bad218e4ebf159ff1f240eb3e1553f
-m     pminsd 6f07136773a2ead356428c5a66a2ec77 28bad218e4ebf159ff1f240eb3e1553f 28bad218e4ebf159ff1f240eb3e1553f
-r     pminsd 3026343700a654eb2ddd9db4ffc411c4 8404eb7f0cf4ca6fee8536da9dbf68bc 8404eb7f00a654ebee8536da9dbf68bc
-m     pminsd 3026343700a654eb2ddd9db4ffc411c4 8404eb7f0cf4ca6fee8536da9dbf68bc 8404eb7f00a654ebee8536da9dbf68bc
-r     pminsd ff6f850f2c57ea2a2c810e6dc1a1833d 5cdf726562b02dc2b39925ba7d9d67bc ff6f850f2c57ea2ab39925bac1a1833d
-m     pminsd ff6f850f2c57ea2a2c810e6dc1a1833d 5cdf726562b02dc2b39925ba7d9d67bc ff6f850f2c57ea2ab39925bac1a1833d
-r     pminsd 372f015d9242e83d2ef85b6fc544fd0f 0c9761367fac55ff28276f9a6e880c6b 0c9761369242e83d28276f9ac544fd0f
-m     pminsd 372f015d9242e83d2ef85b6fc544fd0f 0c9761367fac55ff28276f9a6e880c6b 0c9761369242e83d28276f9ac544fd0f
-r     pminsd 36b2a38dcef18acf0e0f01a829ba3c66 f078b65e01737fd22bfa8f668c8b14f4 f078b65ecef18acf0e0f01a88c8b14f4
-m     pminsd 36b2a38dcef18acf0e0f01a829ba3c66 f078b65e01737fd22bfa8f668c8b14f4 f078b65ecef18acf0e0f01a88c8b14f4
-r     pminsd 57436a097df30b8daa927a03090dfc6d 65ce6d498492e7e796df010bf4b23b84 57436a098492e7e796df010bf4b23b84
-m     pminsd 57436a097df30b8daa927a03090dfc6d 65ce6d498492e7e796df010bf4b23b84 57436a098492e7e796df010bf4b23b84
+r     pmaxsb 60b160857d45c48447b8d8c0eeef1e50 b6d2fb5aa7bc5127fe9915e556a044b2 60d2605a7d45512747b815e556ef4450
+m     pmaxsb 60b160857d45c48447b8d8c0eeef1e50 b6d2fb5aa7bc5127fe9915e556a044b2 60d2605a7d45512747b815e556ef4450
+r     pmaxsb 19a348215c3a67fd399182c2dbcc2d38 065d77195d623e6b842adc6450659e17 195d77215d62676b392adc6450652d38
+m     pmaxsb 19a348215c3a67fd399182c2dbcc2d38 065d77195d623e6b842adc6450659e17 195d77215d62676b392adc6450652d38
+r     pmaxsb d89998df5035ed364a4bc43968bc40e5 cb509970b8136c85d740b80eb7839b97 d850997050356c364a4bc43968bc40e5
+m     pmaxsb d89998df5035ed364a4bc43968bc40e5 cb509970b8136c85d740b80eb7839b97 d850997050356c364a4bc43968bc40e5
+r     pmaxsb f9dd4a29f8c093db56b01a12b0ca1583 5ff85bc9535c191fd3a727d1a705f65d 5ff85b29535c191f56b02712b005155d
+m     pmaxsb f9dd4a29f8c093db56b01a12b0ca1583 5ff85bc9535c191fd3a727d1a705f65d 5ff85b29535c191f56b02712b005155d
+r     pmaxsb d8bc5c6dee699597398e0039cf03663d 20a1bb92cbc97fe8542da4983df76c96 20bc5c6dee697fe8542d00393d036c3d
+m     pmaxsb d8bc5c6dee699597398e0039cf03663d 20a1bb92cbc97fe8542da4983df76c96 20bc5c6dee697fe8542d00393d036c3d
+r     pmaxsb d182c916cebc2e17cfaff39be272ef40 6897b536bbe4da8a369dab4f9465b86e 6897c936cee42e1736aff34fe272ef6e
+m     pmaxsb d182c916cebc2e17cfaff39be272ef40 6897b536bbe4da8a369dab4f9465b86e 6897c936cee42e1736aff34fe272ef6e
+r     pmaxsb 407b8d9035449b06f4e06e2205236eb7 95264321bf3b68b255c2b9e2c95c9810 407b43213544680655e06e22055c6e10
+m     pmaxsb 407b8d9035449b06f4e06e2205236eb7 95264321bf3b68b255c2b9e2c95c9810 407b43213544680655e06e22055c6e10
+r     pmaxsb 81f2a547be8d181184ededbc53239dcf 019963bf7459630b8d69483df7e8c6a9 01f26347745963118d69483d5323c6cf
+m     pmaxsb 81f2a547be8d181184ededbc53239dcf 019963bf7459630b8d69483df7e8c6a9 01f26347745963118d69483d5323c6cf
+r     pmaxsb f0350ca70523e0e45ba1ec54e87d39b3 0a3e0f7c75cb0842b95ed64d3b13ff64 0a3e0f7c752308425b5eec543b7d3964
+m     pmaxsb f0350ca70523e0e45ba1ec54e87d39b3 0a3e0f7c75cb0842b95ed64d3b13ff64 0a3e0f7c752308425b5eec543b7d3964
+r     pmaxsb e98ebd1ca893312a54cae7d5e13dfe91 0a5f45c55f1c9202b76ddefcb0ebfe6e 0a5f451c5f1c312a546de7fce13dfe6e
+m     pmaxsb e98ebd1ca893312a54cae7d5e13dfe91 0a5f45c55f1c9202b76ddefcb0ebfe6e 0a5f451c5f1c312a546de7fce13dfe6e
+r     pmaxsd c84ab713406845904d325b2d5a70a792 5f490104ced83ff86262dd37727c80f3 5f490104406845906262dd37727c80f3
+m     pmaxsd c84ab713406845904d325b2d5a70a792 5f490104ced83ff86262dd37727c80f3 5f490104406845906262dd37727c80f3
+r     pmaxsd e9b5f3f66b2e58c121a6c3476d21f1e5 63483da65c8c49d096084deb9ed0411e 63483da66b2e58c121a6c3476d21f1e5
+m     pmaxsd e9b5f3f66b2e58c121a6c3476d21f1e5 63483da65c8c49d096084deb9ed0411e 63483da66b2e58c121a6c3476d21f1e5
+r     pmaxsd a81b6e33c572a86aacf29b0f395c98b4 73a8f718a8c3ec352e2dac0350f6fd1c 73a8f718c572a86a2e2dac0350f6fd1c
+m     pmaxsd a81b6e33c572a86aacf29b0f395c98b4 73a8f718a8c3ec352e2dac0350f6fd1c 73a8f718c572a86a2e2dac0350f6fd1c
+r     pmaxsd 61c82534e9bf6f37c9e25f72d82e582b ecb42ac54b0966d4089b756aa3f77018 61c825344b0966d4089b756ad82e582b
+m     pmaxsd 61c82534e9bf6f37c9e25f72d82e582b ecb42ac54b0966d4089b756aa3f77018 61c825344b0966d4089b756ad82e582b
+r     pmaxsd 6f07136773a2ead356428c5a66a2ec77 28bad218e4ebf159ff1f240eb3e1553f 6f07136773a2ead356428c5a66a2ec77
+m     pmaxsd 6f07136773a2ead356428c5a66a2ec77 28bad218e4ebf159ff1f240eb3e1553f 6f07136773a2ead356428c5a66a2ec77
+r     pmaxsd 3026343700a654eb2ddd9db4ffc411c4 8404eb7f0cf4ca6fee8536da9dbf68bc 302634370cf4ca6f2ddd9db4ffc411c4
+m     pmaxsd 3026343700a654eb2ddd9db4ffc411c4 8404eb7f0cf4ca6fee8536da9dbf68bc 302634370cf4ca6f2ddd9db4ffc411c4
+r     pmaxsd ff6f850f2c57ea2a2c810e6dc1a1833d 5cdf726562b02dc2b39925ba7d9d67bc 5cdf726562b02dc22c810e6d7d9d67bc
+m     pmaxsd ff6f850f2c57ea2a2c810e6dc1a1833d 5cdf726562b02dc2b39925ba7d9d67bc 5cdf726562b02dc22c810e6d7d9d67bc
+r     pmaxsd 372f015d9242e83d2ef85b6fc544fd0f 0c9761367fac55ff28276f9a6e880c6b 372f015d7fac55ff2ef85b6f6e880c6b
+m     pmaxsd 372f015d9242e83d2ef85b6fc544fd0f 0c9761367fac55ff28276f9a6e880c6b 372f015d7fac55ff2ef85b6f6e880c6b
+r     pmaxsd 36b2a38dcef18acf0e0f01a829ba3c66 f078b65e01737fd22bfa8f668c8b14f4 36b2a38d01737fd22bfa8f6629ba3c66
+m     pmaxsd 36b2a38dcef18acf0e0f01a829ba3c66 f078b65e01737fd22bfa8f668c8b14f4 36b2a38d01737fd22bfa8f6629ba3c66
+r     pmaxsd 57436a097df30b8daa927a03090dfc6d 65ce6d498492e7e796df010bf4b23b84 65ce6d497df30b8daa927a03090dfc6d
+m     pmaxsd 57436a097df30b8daa927a03090dfc6d 65ce6d498492e7e796df010bf4b23b84 65ce6d497df30b8daa927a03090dfc6d
+r     pmaxud f5304f3e3ad1a923dc4c446c804bf950 c5e48064a393c8e947a34273c10a3c47 f5304f3ea393c8e9dc4c446cc10a3c47
+m     pmaxud f5304f3e3ad1a923dc4c446c804bf950 c5e48064a393c8e947a34273c10a3c47 f5304f3ea393c8e9dc4c446cc10a3c47
+r     pmaxud 6ec34f98a2199d3c810bdacfab80ee3d 6d08ed19fa045f841810cd8c109ed568 6ec34f98fa045f84810bdacfab80ee3d
+m     pmaxud 6ec34f98a2199d3c810bdacfab80ee3d 6d08ed19fa045f841810cd8c109ed568 6ec34f98fa045f84810bdacfab80ee3d
+r     pmaxud 1c4a678450562685769ab818a5b7985e b984aed62671e865e6f21d40fc7bc013 b984aed650562685e6f21d40fc7bc013
+m     pmaxud 1c4a678450562685769ab818a5b7985e b984aed62671e865e6f21d40fc7bc013 b984aed650562685e6f21d40fc7bc013
+r     pmaxud 5d0f926ce1157eaa95c45b338afcb3df 05a5c205c3659f388e17b17da2acb976 5d0f926ce1157eaa95c45b33a2acb976
+m     pmaxud 5d0f926ce1157eaa95c45b338afcb3df 05a5c205c3659f388e17b17da2acb976 5d0f926ce1157eaa95c45b33a2acb976
+r     pmaxud 8b5fccbef0e1e256bc563e0c775bfaed acb722146c6cbfa9ea4a022e1d3d7dbb acb72214f0e1e256ea4a022e775bfaed
+m     pmaxud 8b5fccbef0e1e256bc563e0c775bfaed acb722146c6cbfa9ea4a022e1d3d7dbb acb72214f0e1e256ea4a022e775bfaed
+r     pmaxud 048612e51a468e36c51cdd8f87e12ab4 0c05cb6ebd128663d7568e3e8a3ac80e 0c05cb6ebd128663d7568e3e8a3ac80e
+m     pmaxud 048612e51a468e36c51cdd8f87e12ab4 0c05cb6ebd128663d7568e3e8a3ac80e 0c05cb6ebd128663d7568e3e8a3ac80e
+r     pmaxud 22cf5e4cfad1bdf58de2b4a9d799ff5f 80ddba7e53e42d123208cf9b04b0569c 80ddba7efad1bdf58de2b4a9d799ff5f
+m     pmaxud 22cf5e4cfad1bdf58de2b4a9d799ff5f 80ddba7e53e42d123208cf9b04b0569c 80ddba7efad1bdf58de2b4a9d799ff5f
+r     pmaxud 4288ae612c0dad40f0733f448390351b 6489eab2c96df363d52c4330a7aae391 6489eab2c96df363f0733f44a7aae391
+m     pmaxud 4288ae612c0dad40f0733f448390351b 6489eab2c96df363d52c4330a7aae391 6489eab2c96df363f0733f44a7aae391
+r     pmaxud c1fbfd8f4d8698c2cb9dfb4ea5d18713 14575775bc3a12029d8e66ea90352a18 c1fbfd8fbc3a1202cb9dfb4ea5d18713
+m     pmaxud c1fbfd8f4d8698c2cb9dfb4ea5d18713 14575775bc3a12029d8e66ea90352a18 c1fbfd8fbc3a1202cb9dfb4ea5d18713
+r     pmaxud f9754842f9c9ba28f82a63b15c68b274 ec91fe34c7d6c79a66fab2b3db5ce85e f9754842f9c9ba28f82a63b1db5ce85e
+m     pmaxud f9754842f9c9ba28f82a63b15c68b274 ec91fe34c7d6c79a66fab2b3db5ce85e f9754842f9c9ba28f82a63b1db5ce85e
+r     pmaxuw 474289e7cb61501e54e7f35bc162726a 4784d95987cd4ed80c3ca578a32bd88e 4784d959cb61501e54e7f35bc162d88e
+m     pmaxuw 474289e7cb61501e54e7f35bc162726a 4784d95987cd4ed80c3ca578a32bd88e 4784d959cb61501e54e7f35bc162d88e
+r     pmaxuw 08aebee85fda964fbba02737f3c98220 837be65197abe2686b1fba2604afb8d5 837be65197abe268bba0ba26f3c9b8d5
+m     pmaxuw 08aebee85fda964fbba02737f3c98220 837be65197abe2686b1fba2604afb8d5 837be65197abe268bba0ba26f3c9b8d5
+r     pmaxuw 9605e2b252c1c86809217c310baca0c3 fbc4208894fdc0f55f706da71bf2425f fbc4e2b294fdc8685f707c311bf2a0c3
+m     pmaxuw 9605e2b252c1c86809217c310baca0c3 fbc4208894fdc0f55f706da71bf2425f fbc4e2b294fdc8685f707c311bf2a0c3
+r     pmaxuw 4e92f1b240a122141a366d352714867e 0aaa836b194e242cc5fc3ae904033357 4e92f1b240a1242cc5fc6d352714867e
+m     pmaxuw 4e92f1b240a122141a366d352714867e 0aaa836b194e242cc5fc3ae904033357 4e92f1b240a1242cc5fc6d352714867e
+r     pmaxuw 8ca3e752c306df00caab752f630ff07e 0e780c65c22b4ab8778d9ed6d9eb46ea 8ca3e752c306df00caab9ed6d9ebf07e
+m     pmaxuw 8ca3e752c306df00caab752f630ff07e 0e780c65c22b4ab8778d9ed6d9eb46ea 8ca3e752c306df00caab9ed6d9ebf07e
+r     pmaxuw ac82c1007a7d3cd8f54b130cdaa89cef 627bb6e12d1f6d4651ef145cb9b83843 ac82c1007a7d6d46f54b145cdaa89cef
+m     pmaxuw ac82c1007a7d3cd8f54b130cdaa89cef 627bb6e12d1f6d4651ef145cb9b83843 ac82c1007a7d6d46f54b145cdaa89cef
+r     pmaxuw 0a7c7a27fe91744777e3c0b6a9ec44fc 61ff7d4df3b6ca8131f01866bd76c58f 61ff7d4dfe91ca8177e3c0b6bd76c58f
+m     pmaxuw 0a7c7a27fe91744777e3c0b6a9ec44fc 61ff7d4df3b6ca8131f01866bd76c58f 61ff7d4dfe91ca8177e3c0b6bd76c58f
+r     pmaxuw 02dd0e32eecfc5fa2c3ffa1aebe6a4d2 69505d14b27d9d16f25b26e0042fa9fa 69505d14eecfc5faf25bfa1aebe6a9fa
+m     pmaxuw 02dd0e32eecfc5fa2c3ffa1aebe6a4d2 69505d14b27d9d16f25b26e0042fa9fa 69505d14eecfc5faf25bfa1aebe6a9fa
+r     pmaxuw f0f1798fe3c1699cf02b3b25bca27a9c d4ba52a206ff21b170fbbab6a7f19faf f0f1798fe3c1699cf02bbab6bca29faf
+m     pmaxuw f0f1798fe3c1699cf02b3b25bca27a9c d4ba52a206ff21b170fbbab6a7f19faf f0f1798fe3c1699cf02bbab6bca29faf
+r     pmaxuw 3004b7a97cf69dda9f7301c1392d8087 0088596389c893fd879d51d4c5c764db 3004b7a989c89dda9f7351d4c5c78087
+m     pmaxuw 3004b7a97cf69dda9f7301c1392d8087 0088596389c893fd879d51d4c5c764db 3004b7a989c89dda9f7351d4c5c78087
+r     pminsb 1e61c5ec52f79c6015e3c8dc7e9273bf 47086cc3da642fa7130d662777beb4a9 1e08c5c3daf79ca713e3c8dc7792b4a9
+m     pminsb 1e61c5ec52f79c6015e3c8dc7e9273bf 47086cc3da642fa7130d662777beb4a9 1e08c5c3daf79ca713e3c8dc7792b4a9
+r     pminsb 16559ec50352a3d92d460a61a5dd0f6f 0784892e9360315bf0177599dbe14b46 078489c59352a3d9f0170a99a5dd0f46
+m     pminsb 16559ec50352a3d92d460a61a5dd0f6f 0784892e9360315bf0177599dbe14b46 078489c59352a3d9f0170a99a5dd0f46
+r     pminsb 742c3e9e2b92eef2c569453ccd1b0fc4 9a49ac115048d4c4f987fa170d3ce4dd 9a2cac9e2b92d4c4c587fa17cd1be4c4
+m     pminsb 742c3e9e2b92eef2c569453ccd1b0fc4 9a49ac115048d4c4f987fa170d3ce4dd 9a2cac9e2b92d4c4c587fa17cd1be4c4
+r     pminsb 9432a2e46543b956b819f459105730e9 5da3cfd6aea6558e0c28728e28dc3c9c 94a3a2d6aea6b98eb819f48e10dc309c
+m     pminsb 9432a2e46543b956b819f459105730e9 5da3cfd6aea6558e0c28728e28dc3c9c 94a3a2d6aea6b98eb819f48e10dc309c
+r     pminsb d2b3c4044ef23fb2e22093a48a9d2e0b adddf0eb4808f06704c857e949cc0fac adb3c4eb48f2f0b2e2c893a48a9d0fac
+m     pminsb d2b3c4044ef23fb2e22093a48a9d2e0b adddf0eb4808f06704c857e949cc0fac adb3c4eb48f2f0b2e2c893a48a9d0fac
+r     pminsb 89fba268812abdb21e4a9e0958fac555 e4450ababbfae0f9bc3127138b19183c 89fba2ba81fabdb2bc319e098bfac53c
+m     pminsb 89fba268812abdb21e4a9e0958fac555 e4450ababbfae0f9bc3127138b19183c 89fba2ba81fabdb2bc319e098bfac53c
+r     pminsb 1755377e9a786f014a6592749579b0f4 5f2619b1a20662f012305efa0acd1475 172619b19a0662f0123092fa95cdb0f4
+m     pminsb 1755377e9a786f014a6592749579b0f4 5f2619b1a20662f012305efa0acd1475 172619b19a0662f0123092fa95cdb0f4
+r     pminsb d70f7fb13667914c413cead25e27ac14 7acb193b9abab2f9e1917689e3f6bf86 d7cb19b19aba91f9e191ea89e3f6ac86
+m     pminsb d70f7fb13667914c413cead25e27ac14 7acb193b9abab2f9e1917689e3f6bf86 d7cb19b19aba91f9e191ea89e3f6ac86
+r     pminsb 2573776df1835e3ede9a220dce0e75e0 918107c43ea20cc00420edac31a0d599 918107c4f1830cc0de9aedaccea0d599
+m     pminsb 2573776df1835e3ede9a220dce0e75e0 918107c43ea20cc00420edac31a0d599 918107c4f1830cc0de9aedaccea0d599
+r     pminsb 5cce191e65591384ff4cb613013cc685 0194ddb82b49abf059a93d4f11d611db 0194ddb82b49ab84ffa9b61301d6c685
+m     pminsb 5cce191e65591384ff4cb613013cc685 0194ddb82b49abf059a93d4f11d611db 0194ddb82b49ab84ffa9b61301d6c685
+r     pminsd da6c63303173ecc97e1e22cf15bd5c2f 24509983fc3bcc36baf7e45e9fa43077 da6c6330fc3bcc36baf7e45e9fa43077
+m     pminsd da6c63303173ecc97e1e22cf15bd5c2f 24509983fc3bcc36baf7e45e9fa43077 da6c6330fc3bcc36baf7e45e9fa43077
+r     pminsd fa99500fef6024ba39dce32c239cf309 570037914d04ab3d05d75ec6f616ee9a fa99500fef6024ba05d75ec6f616ee9a
+m     pminsd fa99500fef6024ba39dce32c239cf309 570037914d04ab3d05d75ec6f616ee9a fa99500fef6024ba05d75ec6f616ee9a
+r     pminsd 17a0dc273ba9f8030a52741849e54740 f6f2b14fbb3184b2141625713239066f f6f2b14fbb3184b20a5274183239066f
+m     pminsd 17a0dc273ba9f8030a52741849e54740 f6f2b14fbb3184b2141625713239066f f6f2b14fbb3184b20a5274183239066f
+r     pminsd 8fcf04e5b2dca44fcf4c517ea3a413ff 5d700527e24d9241c57eb74d70183523 8fcf04e5b2dca44fc57eb74da3a413ff
+m     pminsd 8fcf04e5b2dca44fcf4c517ea3a413ff 5d700527e24d9241c57eb74d70183523 8fcf04e5b2dca44fc57eb74da3a413ff
+r     pminsd bc70c3b3ef84644b6295f64a4ce61473 e8c72e865de41295f2db8f44cbbf37e2 bc70c3b3ef84644bf2db8f44cbbf37e2
+m     pminsd bc70c3b3ef84644b6295f64a4ce61473 e8c72e865de41295f2db8f44cbbf37e2 bc70c3b3ef84644bf2db8f44cbbf37e2
+r     pminsd fcd015ff8f2e73a3a0fae06860b606c7 f34428d9c8833f5b78fb29445f3bc8d7 f34428d98f2e73a3a0fae0685f3bc8d7
+m     pminsd fcd015ff8f2e73a3a0fae06860b606c7 f34428d9c8833f5b78fb29445f3bc8d7 f34428d98f2e73a3a0fae0685f3bc8d7
+r     pminsd a93bf6332d650e0266478ac4fc21a428 da30ef8bc0b5573e34a901384a97a32f a93bf633c0b5573e34a90138fc21a428
+m     pminsd a93bf6332d650e0266478ac4fc21a428 da30ef8bc0b5573e34a901384a97a32f a93bf633c0b5573e34a90138fc21a428
+r     pminsd 20fd62bd65b571158e48704b3c31abc2 f9da7f07e00794eb00b0940ba5e08516 f9da7f07e00794eb8e48704ba5e08516
+m     pminsd 20fd62bd65b571158e48704b3c31abc2 f9da7f07e00794eb00b0940ba5e08516 f9da7f07e00794eb8e48704ba5e08516
+r     pminsd be625608d5abd787f5c90ee73af5d7c0 ac8dd5bbc503330eb9dd5dab8e212ab7 ac8dd5bbc503330eb9dd5dab8e212ab7
+m     pminsd be625608d5abd787f5c90ee73af5d7c0 ac8dd5bbc503330eb9dd5dab8e212ab7 ac8dd5bbc503330eb9dd5dab8e212ab7
+r     pminsd ddb5cd8016d27d057796e0861576e44f 4e94ec120b386f523bfcd80321664d3e ddb5cd800b386f523bfcd8031576e44f
+m     pminsd ddb5cd8016d27d057796e0861576e44f 4e94ec120b386f523bfcd80321664d3e ddb5cd800b386f523bfcd8031576e44f
+r     pminud db43c391c6b69f3af17a6312e7c28d9a 3d3cc0784c2f856363d9810079bbabd9 3d3cc0784c2f856363d9810079bbabd9
+m     pminud db43c391c6b69f3af17a6312e7c28d9a 3d3cc0784c2f856363d9810079bbabd9 3d3cc0784c2f856363d9810079bbabd9
+r     pminud 125934a781e479d33d431279cce48fce d4d14e592776b1ef0b40d58cb22d00b1 125934a72776b1ef0b40d58cb22d00b1
+m     pminud 125934a781e479d33d431279cce48fce d4d14e592776b1ef0b40d58cb22d00b1 125934a72776b1ef0b40d58cb22d00b1
+r     pminud df411d2ee2e7467c38bb69a6e1e9a617 6f9f902235982fa010fd4e94e9c808f5 6f9f902235982fa010fd4e94e1e9a617
+m     pminud df411d2ee2e7467c38bb69a6e1e9a617 6f9f902235982fa010fd4e94e9c808f5 6f9f902235982fa010fd4e94e1e9a617
+r     pminud 9e477892854b43e0beafe48541dc8da0 69f2843d15223a224edb6a053a967ecf 69f2843d15223a224edb6a053a967ecf
+m     pminud 9e477892854b43e0beafe48541dc8da0 69f2843d15223a224edb6a053a967ecf 69f2843d15223a224edb6a053a967ecf
+r     pminud acb9433f079dacacabeb000208c90296 20162517609f0f22a1a7a4c9c0a51f6b 20162517079dacaca1a7a4c908c90296
+m     pminud acb9433f079dacacabeb000208c90296 20162517609f0f22a1a7a4c9c0a51f6b 20162517079dacaca1a7a4c908c90296
+r     pminud 63e279a20368bc8bdb3b370954bcbf24 ef56701db49bea4ce52e79ce9700a7f7 63e279a20368bc8bdb3b370954bcbf24
+m     pminud 63e279a20368bc8bdb3b370954bcbf24 ef56701db49bea4ce52e79ce9700a7f7 63e279a20368bc8bdb3b370954bcbf24
+r     pminud 200d17261638b12a2a6a07863ec28077 31005fb9ada2074bf63a63fedcb4d29c 200d17261638b12a2a6a07863ec28077
+m     pminud 200d17261638b12a2a6a07863ec28077 31005fb9ada2074bf63a63fedcb4d29c 200d17261638b12a2a6a07863ec28077
+r     pminud 3f871736dc9ac5357446eb65e4e703bb 445ef059e641a1ccb097e047aacc5b89 3f871736dc9ac5357446eb65aacc5b89
+m     pminud 3f871736dc9ac5357446eb65e4e703bb 445ef059e641a1ccb097e047aacc5b89 3f871736dc9ac5357446eb65aacc5b89
+r     pminud 1c9c7740ef193457959960926235021b 83bd1e68fb03f57bef136b941e54ffe8 1c9c7740ef193457959960921e54ffe8
+m     pminud 1c9c7740ef193457959960926235021b 83bd1e68fb03f57bef136b941e54ffe8 1c9c7740ef193457959960921e54ffe8
+r     pminud 139832afee423c3d6930e0fad3ba39c4 4969e55289753f038f7980d1535979e5 139832af89753f036930e0fa535979e5
+m     pminud 139832afee423c3d6930e0fad3ba39c4 4969e55289753f038f7980d1535979e5 139832af89753f036930e0fa535979e5
+r     pminuw 80c745ef729f1792ccd7e987538166e1 f4ad41832c22ba116c949cea66e687ae 80c741832c2217926c949cea538166e1
+m     pminuw 80c745ef729f1792ccd7e987538166e1 f4ad41832c22ba116c949cea66e687ae 80c741832c2217926c949cea538166e1
+r     pminuw bf75aa6c1abe01039a5af627ff97439f ded72f677f96a350623139cb7207e36c bf752f671abe0103623139cb7207439f
+m     pminuw bf75aa6c1abe01039a5af627ff97439f ded72f677f96a350623139cb7207e36c bf752f671abe0103623139cb7207439f
+r     pminuw 2ced5f927f2b383caf8484c5f3078d2a 6431aa6a1e5e366d4c1cd56194c94a4e 2ced5f921e5e366d4c1c84c594c94a4e
+m     pminuw 2ced5f927f2b383caf8484c5f3078d2a 6431aa6a1e5e366d4c1cd56194c94a4e 2ced5f921e5e366d4c1c84c594c94a4e
+r     pminuw 237d5fcd3f71f6e8e6230d4d4add00ad e309aef8a605af130821eb96e737777e 237d5fcd3f71af1308210d4d4add00ad
+m     pminuw 237d5fcd3f71f6e8e6230d4d4add00ad e309aef8a605af130821eb96e737777e 237d5fcd3f71af1308210d4d4add00ad
+r     pminuw 006fa689f61c78b41d010fab20265755 b5a9377eb31749ef710cf757885d2728 006f377eb31749ef1d010fab20262728
+m     pminuw 006fa689f61c78b41d010fab20265755 b5a9377eb31749ef710cf757885d2728 006f377eb31749ef1d010fab20262728
+r     pminuw 1f1030333fb8fa4b2feb05cb92ed4f4d 385e4166df2141ad63a8769192481679 1f1030333fb841ad2feb05cb92481679
+m     pminuw 1f1030333fb8fa4b2feb05cb92ed4f4d 385e4166df2141ad63a8769192481679 1f1030333fb841ad2feb05cb92481679
+r     pminuw dbacfa35b7d2b75af8ad6b99bb3fa4c2 c673c91ec9aed3f8b9c3e32f2103009d c673c91eb7d2b75ab9c36b992103009d
+m     pminuw dbacfa35b7d2b75af8ad6b99bb3fa4c2 c673c91ec9aed3f8b9c3e32f2103009d c673c91eb7d2b75ab9c36b992103009d
+r     pminuw 928efefdf9f5ec8d5313bd01b82612e0 bc36ca100a4a3a7d5127ba1c529aa0bf 928eca100a4a3a7d5127ba1c529a12e0
+m     pminuw 928efefdf9f5ec8d5313bd01b82612e0 bc36ca100a4a3a7d5127ba1c529aa0bf 928eca100a4a3a7d5127ba1c529a12e0
+r     pminuw 9f043af6a1aed58f1ee978efa4b054d2 76f140aa4182b4e706a17746411ab40c 76f13af64182b4e706a17746411a54d2
+m     pminuw 9f043af6a1aed58f1ee978efa4b054d2 76f140aa4182b4e706a17746411ab40c 76f13af64182b4e706a17746411a54d2
+r     pminuw 5e58aa8b4c88ae0d34fa174f9ce927c4 51f2275707e17ae4b3fd9698098ef5b0 51f2275707e17ae434fa174f098e27c4
+m     pminuw 5e58aa8b4c88ae0d34fa174f9ce927c4 51f2275707e17ae4b3fd9698098ef5b0 51f2275707e17ae434fa174f098e27c4