@@ -203,11 +203,16 @@ Bool pcmpXstrX_WRK ( /*OUT*/V128* resV,
203
203
even if they would probably work. Life is too short to have
204
204
unvalidated cases in the code base. */
205
205
switch (imm8 ) {
206
- case 0x00 : case 0x02 : case 0x08 : case 0x0A : case 0x0C : case 0x0E :
207
- case 0x12 : case 0x14 : case 0x18 : case 0x1A :
208
- case 0x30 : case 0x34 : case 0x38 : case 0x3A :
209
- case 0x40 : case 0x42 : case 0x44 : case 0x46 : case 0x4A :
210
- case 0x70 :
206
+ case 0x00 : case 0x02 :
207
+ case 0x08 : case 0x0A : case 0x0C : case 0x0E :
208
+ case 0x12 : case 0x14 :
209
+ case 0x18 : case 0x1A :
210
+ case 0x30 : case 0x34 :
211
+ case 0x38 : case 0x3A :
212
+ case 0x40 : case 0x42 : case 0x44 : case 0x46 :
213
+ case 0x4A :
214
+ case 0x62 :
215
+ case 0x70 : case 0x72 :
211
216
break ;
212
217
default :
213
218
return False ;
@@ -2050,6 +2055,166 @@ void istri_70 ( void )
2050
2055
}
2051
2056
2052
2057
2058
+ //////////////////////////////////////////////////////////
2059
+ // //
2060
+ // ISTRI_62 //
2061
+ // //
2062
+ //////////////////////////////////////////////////////////
2063
+
2064
+ UInt h_pcmpistri_62 ( V128 * argL , V128 * argR )
2065
+ {
2066
+ V128 block [2 ];
2067
+ memcpy (& block [0 ], argL , sizeof (V128 ));
2068
+ memcpy (& block [1 ], argR , sizeof (V128 ));
2069
+ ULong res , flags ;
2070
+ __asm__ __volatile__(
2071
+ "subq $1024, %%rsp" "\n\t"
2072
+ "movdqu 0(%2), %%xmm2" "\n\t"
2073
+ "movdqu 16(%2), %%xmm11" "\n\t"
2074
+ "pcmpistri $0x62, %%xmm2, %%xmm11" "\n\t"
2075
+ "pushfq" "\n\t"
2076
+ "popq %%rdx" "\n\t"
2077
+ "movq %%rcx, %0" "\n\t"
2078
+ "movq %%rdx, %1" "\n\t"
2079
+ "addq $1024, %%rsp" "\n\t"
2080
+ : /*out*/ "=r" (res ), "=r" (flags ) : "r" /*in*/ (& block [0 ])
2081
+ : "rcx" ,"rdx" ,"xmm0" ,"xmm2" ,"xmm11" ,"cc" ,"memory"
2082
+ );
2083
+ return ((flags & 0x8D5 ) << 16 ) | (res & 0xFFFF );
2084
+ }
2085
+
2086
+ UInt s_pcmpistri_62 ( V128 * argLU , V128 * argRU )
2087
+ {
2088
+ V128 resV ;
2089
+ UInt resOSZACP , resECX ;
2090
+ Bool ok
2091
+ = pcmpXstrX_WRK ( & resV , & resOSZACP , argLU , argRU ,
2092
+ zmask_from_V128 (argLU ),
2093
+ zmask_from_V128 (argRU ),
2094
+ 0x62 , False /*!isSTRM*/
2095
+ );
2096
+ assert (ok );
2097
+ resECX = resV .uInt [0 ];
2098
+ return (resOSZACP << 16 ) | resECX ;
2099
+ }
2100
+
2101
+ void istri_62 ( void )
2102
+ {
2103
+ char * wot = "62" ;
2104
+ UInt (* h )(V128 * ,V128 * ) = h_pcmpistri_62 ;
2105
+ UInt (* s )(V128 * ,V128 * ) = s_pcmpistri_62 ;
2106
+
2107
+ try_istri (wot ,h ,s , "abcdacbdabcdabcd" , "000000000000000a" );
2108
+ try_istri (wot ,h ,s , "abcdabcdabcdabcd" , "000000000000000b" );
2109
+ try_istri (wot ,h ,s , "abcdabcdabcdabcd" , "00000000000000ab" );
2110
+ try_istri (wot ,h ,s , "abcdabc0abcdabcd" , "000000000000abcd" );
2111
+
2112
+ try_istri (wot ,h ,s , "abcdabcdabcdabcd" , "000000000000abcd" );
2113
+ try_istri (wot ,h ,s , "0bcdabcdabcdabcd" , "000000000000abcd" );
2114
+ try_istri (wot ,h ,s , "abcdabcdabcda0cd" , "000000000000abcd" );
2115
+ try_istri (wot ,h ,s , "abcdabcdabcdab0d" , "000000000000abcd" );
2116
+ try_istri (wot ,h ,s , "abcdabcdabcdabc0" , "000000000000abcd" );
2117
+
2118
+ try_istri (wot ,h ,s , "abcdabcdabcdabcd" , "000000000000abcd" );
2119
+ try_istri (wot ,h ,s , "abcdabcdabcdabcd" , "000000000000a0cd" );
2120
+ try_istri (wot ,h ,s , "abcdabcdabcdabcd" , "000000000000ab0d" );
2121
+ try_istri (wot ,h ,s , "abcdabcdabcdabcd" , "000000000000abc0" );
2122
+
2123
+ try_istri (wot ,h ,s , "0000000000000000" , "0000000000000000" );
2124
+ try_istri (wot ,h ,s , "aaaaaaaaaaaaaaaa" , "aaaaaaaaaaaaaaaa" );
2125
+
2126
+ try_istri (wot ,h ,s , "0000abcdabcdabcd" , "000000000000abcd" );
2127
+ try_istri (wot ,h ,s , "0000abcdabcdabcd" , "000000000000dcba" );
2128
+ try_istri (wot ,h ,s , "0000abcdabcdabcd" , "000000000000bbbb" );
2129
+ try_istri (wot ,h ,s , "0000abcdabcdabcd" , "000000000000baba" );
2130
+
2131
+ try_istri (wot ,h ,s , "0000abcdabcdabcd" , "00000000000baba0" );
2132
+
2133
+ try_istri (wot ,h ,s , "0ddc0ffeebadf00d" , "00000000cafebabe" );
2134
+ try_istri (wot ,h ,s , "0ddc0ffeebadfeed" , "00000000cafebabe" );
2135
+ }
2136
+
2137
+
2138
+ //////////////////////////////////////////////////////////
2139
+ // //
2140
+ // ISTRI_72 //
2141
+ // //
2142
+ //////////////////////////////////////////////////////////
2143
+
2144
+ UInt h_pcmpistri_72 ( V128 * argL , V128 * argR )
2145
+ {
2146
+ V128 block [2 ];
2147
+ memcpy (& block [0 ], argL , sizeof (V128 ));
2148
+ memcpy (& block [1 ], argR , sizeof (V128 ));
2149
+ ULong res , flags ;
2150
+ __asm__ __volatile__(
2151
+ "subq $1024, %%rsp" "\n\t"
2152
+ "movdqu 0(%2), %%xmm2" "\n\t"
2153
+ "movdqu 16(%2), %%xmm11" "\n\t"
2154
+ "pcmpistri $0x72, %%xmm2, %%xmm11" "\n\t"
2155
+ "pushfq" "\n\t"
2156
+ "popq %%rdx" "\n\t"
2157
+ "movq %%rcx, %0" "\n\t"
2158
+ "movq %%rdx, %1" "\n\t"
2159
+ "addq $1024, %%rsp" "\n\t"
2160
+ : /*out*/ "=r" (res ), "=r" (flags ) : "r" /*in*/ (& block [0 ])
2161
+ : "rcx" ,"rdx" ,"xmm0" ,"xmm2" ,"xmm11" ,"cc" ,"memory"
2162
+ );
2163
+ return ((flags & 0x8D5 ) << 16 ) | (res & 0xFFFF );
2164
+ }
2165
+
2166
+ UInt s_pcmpistri_72 ( V128 * argLU , V128 * argRU )
2167
+ {
2168
+ V128 resV ;
2169
+ UInt resOSZACP , resECX ;
2170
+ Bool ok
2171
+ = pcmpXstrX_WRK ( & resV , & resOSZACP , argLU , argRU ,
2172
+ zmask_from_V128 (argLU ),
2173
+ zmask_from_V128 (argRU ),
2174
+ 0x72 , False /*!isSTRM*/
2175
+ );
2176
+ assert (ok );
2177
+ resECX = resV .uInt [0 ];
2178
+ return (resOSZACP << 16 ) | resECX ;
2179
+ }
2180
+
2181
+ void istri_72 ( void )
2182
+ {
2183
+ char * wot = "72" ;
2184
+ UInt (* h )(V128 * ,V128 * ) = h_pcmpistri_72 ;
2185
+ UInt (* s )(V128 * ,V128 * ) = s_pcmpistri_72 ;
2186
+
2187
+ try_istri (wot ,h ,s , "abcdacbdabcdabcd" , "000000000000000a" );
2188
+ try_istri (wot ,h ,s , "abcdabcdabcdabcd" , "000000000000000b" );
2189
+ try_istri (wot ,h ,s , "abcdabcdabcdabcd" , "00000000000000ab" );
2190
+ try_istri (wot ,h ,s , "abcdabc0abcdabcd" , "000000000000abcd" );
2191
+
2192
+ try_istri (wot ,h ,s , "abcdabcdabcdabcd" , "000000000000abcd" );
2193
+ try_istri (wot ,h ,s , "0bcdabcdabcdabcd" , "000000000000abcd" );
2194
+ try_istri (wot ,h ,s , "abcdabcdabcda0cd" , "000000000000abcd" );
2195
+ try_istri (wot ,h ,s , "abcdabcdabcdab0d" , "000000000000abcd" );
2196
+ try_istri (wot ,h ,s , "abcdabcdabcdabc0" , "000000000000abcd" );
2197
+
2198
+ try_istri (wot ,h ,s , "abcdabcdabcdabcd" , "000000000000abcd" );
2199
+ try_istri (wot ,h ,s , "abcdabcdabcdabcd" , "000000000000a0cd" );
2200
+ try_istri (wot ,h ,s , "abcdabcdabcdabcd" , "000000000000ab0d" );
2201
+ try_istri (wot ,h ,s , "abcdabcdabcdabcd" , "000000000000abc0" );
2202
+
2203
+ try_istri (wot ,h ,s , "0000000000000000" , "0000000000000000" );
2204
+ try_istri (wot ,h ,s , "aaaaaaaaaaaaaaaa" , "aaaaaaaaaaaaaaaa" );
2205
+
2206
+ try_istri (wot ,h ,s , "0000abcdabcdabcd" , "000000000000abcd" );
2207
+ try_istri (wot ,h ,s , "0000abcdabcdabcd" , "000000000000dcba" );
2208
+ try_istri (wot ,h ,s , "0000abcdabcdabcd" , "000000000000bbbb" );
2209
+ try_istri (wot ,h ,s , "0000abcdabcdabcd" , "000000000000baba" );
2210
+
2211
+ try_istri (wot ,h ,s , "0000abcdabcdabcd" , "00000000000baba0" );
2212
+
2213
+ try_istri (wot ,h ,s , "0ddc0ffeebadf00d" , "00000000cafebabe" );
2214
+ try_istri (wot ,h ,s , "0ddc0ffeebadfeed" , "00000000cafebabe" );
2215
+ }
2216
+
2217
+
2053
2218
//////////////////////////////////////////////////////////
2054
2219
// //
2055
2220
// main //
@@ -2077,5 +2242,7 @@ int main ( void )
2077
2242
istri_14 ();
2078
2243
istri_34 ();
2079
2244
istri_70 ();
2245
+ istri_62 ();
2246
+ istri_72 ();
2080
2247
return 0 ;
2081
2248
}
0 commit comments