@@ -182,7 +182,108 @@ define i32 @or_and_multiuse_and_multiuse_i32(i32 %x, i32 %y) nounwind {
182
182
ret i32 %r
183
183
}
184
184
185
+ define i64 @or_build_pair_not (i32 %a0 , i32 %a1 ) {
186
+ ; CHECK-LABEL: or_build_pair_not:
187
+ ; CHECK: # %bb.0:
188
+ ; CHECK-NEXT: # kill: def $esi killed $esi def $rsi
189
+ ; CHECK-NEXT: # kill: def $edi killed $edi def $rdi
190
+ ; CHECK-NEXT: notl %edi
191
+ ; CHECK-NEXT: notl %esi
192
+ ; CHECK-NEXT: shlq $32, %rsi
193
+ ; CHECK-NEXT: leaq (%rsi,%rdi), %rax
194
+ ; CHECK-NEXT: retq
195
+ %n0 = xor i32 %a0 , -1
196
+ %n1 = xor i32 %a1 , -1
197
+ %x0 = zext i32 %n0 to i64
198
+ %x1 = zext i32 %n1 to i64
199
+ %hi = shl i64 %x1 , 32
200
+ %r = or i64 %hi , %x0
201
+ ret i64 %r
202
+ }
203
+
204
+ define i64 @PR89533 (<64 x i8 > %a0 ) {
205
+ ; SSE-LABEL: PR89533:
206
+ ; SSE: # %bb.0:
207
+ ; SSE-NEXT: movdqa {{.*#+}} xmm4 = [95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95]
208
+ ; SSE-NEXT: pcmpeqb %xmm4, %xmm0
209
+ ; SSE-NEXT: pmovmskb %xmm0, %eax
210
+ ; SSE-NEXT: xorl $65535, %eax # imm = 0xFFFF
211
+ ; SSE-NEXT: pcmpeqb %xmm4, %xmm1
212
+ ; SSE-NEXT: pmovmskb %xmm1, %ecx
213
+ ; SSE-NEXT: notl %ecx
214
+ ; SSE-NEXT: shll $16, %ecx
215
+ ; SSE-NEXT: orl %eax, %ecx
216
+ ; SSE-NEXT: pcmpeqb %xmm4, %xmm2
217
+ ; SSE-NEXT: pmovmskb %xmm2, %edx
218
+ ; SSE-NEXT: xorl $65535, %edx # imm = 0xFFFF
219
+ ; SSE-NEXT: pcmpeqb %xmm4, %xmm3
220
+ ; SSE-NEXT: pmovmskb %xmm3, %eax
221
+ ; SSE-NEXT: notl %eax
222
+ ; SSE-NEXT: shll $16, %eax
223
+ ; SSE-NEXT: orl %edx, %eax
224
+ ; SSE-NEXT: shlq $32, %rax
225
+ ; SSE-NEXT: orq %rcx, %rax
226
+ ; SSE-NEXT: je .LBB11_2
227
+ ; SSE-NEXT: # %bb.1: # %cond.false
228
+ ; SSE-NEXT: rep bsfq %rax, %rax
229
+ ; SSE-NEXT: retq
230
+ ; SSE-NEXT: .LBB11_2: # %cond.end
231
+ ; SSE-NEXT: movl $64, %eax
232
+ ; SSE-NEXT: retq
233
+ ;
234
+ ; AVX1-LABEL: PR89533:
235
+ ; AVX1: # %bb.0:
236
+ ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95]
237
+ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm3
238
+ ; AVX1-NEXT: vpmovmskb %xmm3, %eax
239
+ ; AVX1-NEXT: xorl $65535, %eax # imm = 0xFFFF
240
+ ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
241
+ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0
242
+ ; AVX1-NEXT: vpmovmskb %xmm0, %ecx
243
+ ; AVX1-NEXT: notl %ecx
244
+ ; AVX1-NEXT: shll $16, %ecx
245
+ ; AVX1-NEXT: orl %eax, %ecx
246
+ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm0
247
+ ; AVX1-NEXT: vpmovmskb %xmm0, %edx
248
+ ; AVX1-NEXT: xorl $65535, %edx # imm = 0xFFFF
249
+ ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0
250
+ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0
251
+ ; AVX1-NEXT: vpmovmskb %xmm0, %eax
252
+ ; AVX1-NEXT: notl %eax
253
+ ; AVX1-NEXT: shll $16, %eax
254
+ ; AVX1-NEXT: orl %edx, %eax
255
+ ; AVX1-NEXT: shlq $32, %rax
256
+ ; AVX1-NEXT: orq %rcx, %rax
257
+ ; AVX1-NEXT: je .LBB11_2
258
+ ; AVX1-NEXT: # %bb.1: # %cond.false
259
+ ; AVX1-NEXT: rep bsfq %rax, %rax
260
+ ; AVX1-NEXT: vzeroupper
261
+ ; AVX1-NEXT: retq
262
+ ; AVX1-NEXT: .LBB11_2: # %cond.end
263
+ ; AVX1-NEXT: movl $64, %eax
264
+ ; AVX1-NEXT: vzeroupper
265
+ ; AVX1-NEXT: retq
266
+ ;
267
+ ; AVX2-LABEL: PR89533:
268
+ ; AVX2: # %bb.0:
269
+ ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm2 = [95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95]
270
+ ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0
271
+ ; AVX2-NEXT: vpmovmskb %ymm0, %eax
272
+ ; AVX2-NEXT: notl %eax
273
+ ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm0
274
+ ; AVX2-NEXT: vpmovmskb %ymm0, %ecx
275
+ ; AVX2-NEXT: notl %ecx
276
+ ; AVX2-NEXT: shlq $32, %rcx
277
+ ; AVX2-NEXT: orq %rax, %rcx
278
+ ; AVX2-NEXT: xorl %eax, %eax
279
+ ; AVX2-NEXT: tzcntq %rcx, %rax
280
+ ; AVX2-NEXT: vzeroupper
281
+ ; AVX2-NEXT: retq
282
+ %cmp = icmp ne <64 x i8 > %a0 , <i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 >
283
+ %mask = bitcast <64 x i1 > %cmp to i64
284
+ %tz = tail call i64 @llvm.cttz.i64 (i64 %mask , i1 false )
285
+ ret i64 %tz
286
+ }
287
+
185
288
declare void @use_i32 (i32 )
186
- ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
187
- ; AVX1: {{.*}}
188
- ; AVX2: {{.*}}
289
+
0 commit comments