1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl | FileCheck %s 3 4 ; Function Attrs: norecurse nounwind readnone 5 define zeroext i16 @TEST_mm_test_epi8_mask(<2 x i64> %__A, <2 x i64> %__B) local_unnamed_addr #0 { 6 ; CHECK-LABEL: TEST_mm_test_epi8_mask: 7 ; CHECK: # %bb.0: # %entry 8 ; CHECK-NEXT: vptestmb %xmm0, %xmm1, %k0 9 ; CHECK-NEXT: kmovd %k0, %eax 10 ; CHECK-NEXT: # kill: def $ax killed $ax killed $eax 11 ; CHECK-NEXT: retq 12 entry: 13 %and.i.i = and <2 x i64> %__B, %__A 14 %0 = bitcast <2 x i64> %and.i.i to <16 x i8> 15 %1 = icmp ne <16 x i8> %0, zeroinitializer 16 %2 = bitcast <16 x i1> %1 to i16 17 ret i16 %2 18 } 19 20 ; Function Attrs: norecurse nounwind readnone 21 define zeroext i16 @TEST_mm_mask_test_epi8_mask(i16 zeroext %__U, <2 x i64> %__A, <2 x i64> %__B) local_unnamed_addr #0 { 22 ; CHECK-LABEL: TEST_mm_mask_test_epi8_mask: 23 ; CHECK: # %bb.0: # %entry 24 ; CHECK-NEXT: vptestmb %xmm0, %xmm1, %k0 25 ; CHECK-NEXT: kmovd %k0, %eax 26 ; CHECK-NEXT: andl %edi, %eax 27 ; CHECK-NEXT: # kill: def $ax killed $ax killed $eax 28 ; CHECK-NEXT: retq 29 entry: 30 %and.i.i = and <2 x i64> %__B, %__A 31 %0 = bitcast <2 x i64> %and.i.i to <16 x i8> 32 %1 = icmp ne <16 x i8> %0, zeroinitializer 33 %2 = bitcast i16 %__U to <16 x i1> 34 %3 = and <16 x i1> %1, %2 35 %4 = bitcast <16 x i1> %3 to i16 36 ret i16 %4 37 } 38 39 ; Function Attrs: norecurse nounwind readnone 40 define zeroext i8 @TEST_mm_test_epi16_mask(<2 x i64> %__A, <2 x i64> %__B) local_unnamed_addr #0 { 41 ; CHECK-LABEL: TEST_mm_test_epi16_mask: 42 ; CHECK: # %bb.0: # %entry 43 ; CHECK-NEXT: vptestmw %xmm0, %xmm1, %k0 44 ; CHECK-NEXT: kmovd %k0, %eax 45 ; CHECK-NEXT: # kill: def $al killed $al killed $eax 46 ; CHECK-NEXT: retq 47 entry: 48 %and.i.i = and <2 x i64> %__B, %__A 49 %0 = bitcast <2 x i64> %and.i.i to <8 x i16> 50 %1 = icmp ne <8 x i16> %0, zeroinitializer 51 %2 = bitcast <8 x i1> %1 to i8 52 ret i8 %2 53 } 54 55 ; Function Attrs: norecurse nounwind readnone 56 define zeroext i8 @TEST_mm_mask_test_epi16_mask(i8 zeroext %__U, <2 x i64> %__A, <2 x i64> %__B) local_unnamed_addr #0 { 57 ; CHECK-LABEL: TEST_mm_mask_test_epi16_mask: 58 ; CHECK: # %bb.0: # %entry 59 ; CHECK-NEXT: vptestmw %xmm0, %xmm1, %k0 60 ; CHECK-NEXT: kmovd %k0, %eax 61 ; CHECK-NEXT: andb %dil, %al 62 ; CHECK-NEXT: # kill: def $al killed $al killed $eax 63 ; CHECK-NEXT: retq 64 entry: 65 %and.i.i = and <2 x i64> %__B, %__A 66 %0 = bitcast <2 x i64> %and.i.i to <8 x i16> 67 %1 = icmp ne <8 x i16> %0, zeroinitializer 68 %2 = bitcast i8 %__U to <8 x i1> 69 %3 = and <8 x i1> %1, %2 70 %4 = bitcast <8 x i1> %3 to i8 71 ret i8 %4 72 } 73 74 ; Function Attrs: norecurse nounwind readnone 75 define zeroext i16 @TEST_mm_testn_epi8_mask(<2 x i64> %__A, <2 x i64> %__B) local_unnamed_addr #0 { 76 ; CHECK-LABEL: TEST_mm_testn_epi8_mask: 77 ; CHECK: # %bb.0: # %entry 78 ; CHECK-NEXT: vptestnmb %xmm0, %xmm1, %k0 79 ; CHECK-NEXT: kmovd %k0, %eax 80 ; CHECK-NEXT: # kill: def $ax killed $ax killed $eax 81 ; CHECK-NEXT: retq 82 entry: 83 %and.i.i = and <2 x i64> %__B, %__A 84 %0 = bitcast <2 x i64> %and.i.i to <16 x i8> 85 %1 = icmp eq <16 x i8> %0, zeroinitializer 86 %2 = bitcast <16 x i1> %1 to i16 87 ret i16 %2 88 } 89 90 ; Function Attrs: norecurse nounwind readnone 91 define zeroext i16 @TEST_mm_mask_testn_epi8_mask(i16 zeroext %__U, <2 x i64> %__A, <2 x i64> %__B) local_unnamed_addr #0 { 92 ; CHECK-LABEL: TEST_mm_mask_testn_epi8_mask: 93 ; CHECK: # %bb.0: # %entry 94 ; CHECK-NEXT: vptestnmb %xmm0, %xmm1, %k0 95 ; CHECK-NEXT: kmovd %k0, %eax 96 ; CHECK-NEXT: andl %edi, %eax 97 ; CHECK-NEXT: # kill: def $ax killed $ax killed $eax 98 ; CHECK-NEXT: retq 99 entry: 100 %and.i.i = and <2 x i64> %__B, %__A 101 %0 = bitcast <2 x i64> %and.i.i to <16 x i8> 102 %1 = icmp eq <16 x i8> %0, zeroinitializer 103 %2 = bitcast i16 %__U to <16 x i1> 104 %3 = and <16 x i1> %1, %2 105 %4 = bitcast <16 x i1> %3 to i16 106 ret i16 %4 107 } 108 109 ; Function Attrs: norecurse nounwind readnone 110 define zeroext i8 @TEST_mm_testn_epi16_mask(<2 x i64> %__A, <2 x i64> %__B) local_unnamed_addr #0 { 111 ; CHECK-LABEL: TEST_mm_testn_epi16_mask: 112 ; CHECK: # %bb.0: # %entry 113 ; CHECK-NEXT: vptestnmw %xmm0, %xmm1, %k0 114 ; CHECK-NEXT: kmovd %k0, %eax 115 ; CHECK-NEXT: # kill: def $al killed $al killed $eax 116 ; CHECK-NEXT: retq 117 entry: 118 %and.i.i = and <2 x i64> %__B, %__A 119 %0 = bitcast <2 x i64> %and.i.i to <8 x i16> 120 %1 = icmp eq <8 x i16> %0, zeroinitializer 121 %2 = bitcast <8 x i1> %1 to i8 122 ret i8 %2 123 } 124 125 ; Function Attrs: norecurse nounwind readnone 126 define zeroext i8 @TEST_mm_mask_testn_epi16_mask(i8 zeroext %__U, <2 x i64> %__A, <2 x i64> %__B) local_unnamed_addr #0 { 127 ; CHECK-LABEL: TEST_mm_mask_testn_epi16_mask: 128 ; CHECK: # %bb.0: # %entry 129 ; CHECK-NEXT: vptestnmw %xmm0, %xmm1, %k0 130 ; CHECK-NEXT: kmovd %k0, %eax 131 ; CHECK-NEXT: andb %dil, %al 132 ; CHECK-NEXT: # kill: def $al killed $al killed $eax 133 ; CHECK-NEXT: retq 134 entry: 135 %and.i.i = and <2 x i64> %__B, %__A 136 %0 = bitcast <2 x i64> %and.i.i to <8 x i16> 137 %1 = icmp eq <8 x i16> %0, zeroinitializer 138 %2 = bitcast i8 %__U to <8 x i1> 139 %3 = and <8 x i1> %1, %2 140 %4 = bitcast <8 x i1> %3 to i8 141 ret i8 %4 142 } 143 144 ; Function Attrs: norecurse nounwind readnone 145 define i32 @TEST_mm256_test_epi8_mask(<4 x i64> %__A, <4 x i64> %__B) local_unnamed_addr #0 { 146 ; CHECK-LABEL: TEST_mm256_test_epi8_mask: 147 ; CHECK: # %bb.0: # %entry 148 ; CHECK-NEXT: vptestmb %ymm0, %ymm1, %k0 149 ; CHECK-NEXT: kmovd %k0, %eax 150 ; CHECK-NEXT: vzeroupper 151 ; CHECK-NEXT: retq 152 entry: 153 %and.i.i = and <4 x i64> %__B, %__A 154 %0 = bitcast <4 x i64> %and.i.i to <32 x i8> 155 %1 = icmp ne <32 x i8> %0, zeroinitializer 156 %2 = bitcast <32 x i1> %1 to i32 157 ret i32 %2 158 } 159 160 ; Function Attrs: norecurse nounwind readnone 161 define i32 @TEST_mm256_mask_test_epi8_mask(i32 %__U, <4 x i64> %__A, <4 x i64> %__B) local_unnamed_addr #0 { 162 ; CHECK-LABEL: TEST_mm256_mask_test_epi8_mask: 163 ; CHECK: # %bb.0: # %entry 164 ; CHECK-NEXT: vptestmb %ymm0, %ymm1, %k0 165 ; CHECK-NEXT: kmovd %k0, %eax 166 ; CHECK-NEXT: andl %edi, %eax 167 ; CHECK-NEXT: vzeroupper 168 ; CHECK-NEXT: retq 169 entry: 170 %and.i.i = and <4 x i64> %__B, %__A 171 %0 = bitcast <4 x i64> %and.i.i to <32 x i8> 172 %1 = icmp ne <32 x i8> %0, zeroinitializer 173 %2 = bitcast i32 %__U to <32 x i1> 174 %3 = and <32 x i1> %1, %2 175 %4 = bitcast <32 x i1> %3 to i32 176 ret i32 %4 177 } 178 179 ; Function Attrs: norecurse nounwind readnone 180 define zeroext i16 @TEST_mm256_test_epi16_mask(<4 x i64> %__A, <4 x i64> %__B) local_unnamed_addr #0 { 181 ; CHECK-LABEL: TEST_mm256_test_epi16_mask: 182 ; CHECK: # %bb.0: # %entry 183 ; CHECK-NEXT: vptestmw %ymm0, %ymm1, %k0 184 ; CHECK-NEXT: kmovd %k0, %eax 185 ; CHECK-NEXT: # kill: def $ax killed $ax killed $eax 186 ; CHECK-NEXT: vzeroupper 187 ; CHECK-NEXT: retq 188 entry: 189 %and.i.i = and <4 x i64> %__B, %__A 190 %0 = bitcast <4 x i64> %and.i.i to <16 x i16> 191 %1 = icmp ne <16 x i16> %0, zeroinitializer 192 %2 = bitcast <16 x i1> %1 to i16 193 ret i16 %2 194 } 195 196 ; Function Attrs: norecurse nounwind readnone 197 define zeroext i16 @TEST_mm256_mask_test_epi16_mask(i16 zeroext %__U, <4 x i64> %__A, <4 x i64> %__B) local_unnamed_addr #0 { 198 ; CHECK-LABEL: TEST_mm256_mask_test_epi16_mask: 199 ; CHECK: # %bb.0: # %entry 200 ; CHECK-NEXT: vptestmw %ymm0, %ymm1, %k0 201 ; CHECK-NEXT: kmovd %k0, %eax 202 ; CHECK-NEXT: andl %edi, %eax 203 ; CHECK-NEXT: # kill: def $ax killed $ax killed $eax 204 ; CHECK-NEXT: vzeroupper 205 ; CHECK-NEXT: retq 206 entry: 207 %and.i.i = and <4 x i64> %__B, %__A 208 %0 = bitcast <4 x i64> %and.i.i to <16 x i16> 209 %1 = icmp ne <16 x i16> %0, zeroinitializer 210 %2 = bitcast i16 %__U to <16 x i1> 211 %3 = and <16 x i1> %1, %2 212 %4 = bitcast <16 x i1> %3 to i16 213 ret i16 %4 214 } 215 216 ; Function Attrs: norecurse nounwind readnone 217 define i32 @TEST_mm256_testn_epi8_mask(<4 x i64> %__A, <4 x i64> %__B) local_unnamed_addr #0 { 218 ; CHECK-LABEL: TEST_mm256_testn_epi8_mask: 219 ; CHECK: # %bb.0: # %entry 220 ; CHECK-NEXT: vptestnmb %ymm0, %ymm1, %k0 221 ; CHECK-NEXT: kmovd %k0, %eax 222 ; CHECK-NEXT: vzeroupper 223 ; CHECK-NEXT: retq 224 entry: 225 %and.i.i = and <4 x i64> %__B, %__A 226 %0 = bitcast <4 x i64> %and.i.i to <32 x i8> 227 %1 = icmp eq <32 x i8> %0, zeroinitializer 228 %2 = bitcast <32 x i1> %1 to i32 229 ret i32 %2 230 } 231 232 ; Function Attrs: norecurse nounwind readnone 233 define i32 @TEST_mm256_mask_testn_epi8_mask(i32 %__U, <4 x i64> %__A, <4 x i64> %__B) local_unnamed_addr #0 { 234 ; CHECK-LABEL: TEST_mm256_mask_testn_epi8_mask: 235 ; CHECK: # %bb.0: # %entry 236 ; CHECK-NEXT: vptestnmb %ymm0, %ymm1, %k0 237 ; CHECK-NEXT: kmovd %k0, %eax 238 ; CHECK-NEXT: andl %edi, %eax 239 ; CHECK-NEXT: vzeroupper 240 ; CHECK-NEXT: retq 241 entry: 242 %and.i.i = and <4 x i64> %__B, %__A 243 %0 = bitcast <4 x i64> %and.i.i to <32 x i8> 244 %1 = icmp eq <32 x i8> %0, zeroinitializer 245 %2 = bitcast i32 %__U to <32 x i1> 246 %3 = and <32 x i1> %1, %2 247 %4 = bitcast <32 x i1> %3 to i32 248 ret i32 %4 249 } 250 251 ; Function Attrs: norecurse nounwind readnone 252 define zeroext i16 @TEST_mm256_testn_epi16_mask(<4 x i64> %__A, <4 x i64> %__B) local_unnamed_addr #0 { 253 ; CHECK-LABEL: TEST_mm256_testn_epi16_mask: 254 ; CHECK: # %bb.0: # %entry 255 ; CHECK-NEXT: vptestnmw %ymm0, %ymm1, %k0 256 ; CHECK-NEXT: kmovd %k0, %eax 257 ; CHECK-NEXT: # kill: def $ax killed $ax killed $eax 258 ; CHECK-NEXT: vzeroupper 259 ; CHECK-NEXT: retq 260 entry: 261 %and.i.i = and <4 x i64> %__B, %__A 262 %0 = bitcast <4 x i64> %and.i.i to <16 x i16> 263 %1 = icmp eq <16 x i16> %0, zeroinitializer 264 %2 = bitcast <16 x i1> %1 to i16 265 ret i16 %2 266 } 267 268 ; Function Attrs: norecurse nounwind readnone 269 define zeroext i16 @TEST_mm256_mask_testn_epi16_mask(i16 zeroext %__U, <4 x i64> %__A, <4 x i64> %__B) local_unnamed_addr #0 { 270 ; CHECK-LABEL: TEST_mm256_mask_testn_epi16_mask: 271 ; CHECK: # %bb.0: # %entry 272 ; CHECK-NEXT: vptestnmw %ymm0, %ymm1, %k0 273 ; CHECK-NEXT: kmovd %k0, %eax 274 ; CHECK-NEXT: andl %edi, %eax 275 ; CHECK-NEXT: # kill: def $ax killed $ax killed $eax 276 ; CHECK-NEXT: vzeroupper 277 ; CHECK-NEXT: retq 278 entry: 279 %and.i.i = and <4 x i64> %__B, %__A 280 %0 = bitcast <4 x i64> %and.i.i to <16 x i16> 281 %1 = icmp eq <16 x i16> %0, zeroinitializer 282 %2 = bitcast i16 %__U to <16 x i1> 283 %3 = and <16 x i1> %1, %2 284 %4 = bitcast <16 x i1> %3 to i16 285 ret i16 %4 286 } 287 288 289