@@ -166,8 +166,8 @@ define i1 @rotr_sgt_n1(i16 %x, i16 %y) nounwind {
166
166
167
167
; negative test - must be a rotate, not general funnel shift
168
168
169
- define i1 @fshl_sgt_n1 (i8 %x , i8 %y , i8 %z ) nounwind {
170
- ; CHECK-LABEL: fshl_sgt_n1 :
169
+ define i1 @fshl_eq_n1 (i8 %x , i8 %y , i8 %z ) nounwind {
170
+ ; CHECK-LABEL: fshl_eq_n1 :
171
171
; CHECK: # %bb.0:
172
172
; CHECK-NEXT: movl %edx, %ecx
173
173
; CHECK-NEXT: shll $8, %edi
@@ -184,3 +184,98 @@ define i1 @fshl_sgt_n1(i8 %x, i8 %y, i8 %z) nounwind {
184
184
%r = icmp eq i8 %fsh , -1
185
185
ret i1 %r
186
186
}
187
+
188
+ define i1 @or_rotl_eq_0 (i8 %x , i8 %y , i8 %z ) nounwind {
189
+ ; CHECK-LABEL: or_rotl_eq_0:
190
+ ; CHECK: # %bb.0:
191
+ ; CHECK-NEXT: movl %edx, %ecx
192
+ ; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
193
+ ; CHECK-NEXT: rolb %cl, %dil
194
+ ; CHECK-NEXT: orb %sil, %dil
195
+ ; CHECK-NEXT: sete %al
196
+ ; CHECK-NEXT: retq
197
+ %rot = tail call i8 @llvm.fshl.i8 (i8 %x , i8 %x , i8 %z )
198
+ %or = or i8 %rot , %y
199
+ %r = icmp eq i8 %or , 0
200
+ ret i1 %r
201
+ }
202
+
203
+ define i1 @or_rotr_ne_0 (i64 %x , i64 %y , i64 %z ) nounwind {
204
+ ; CHECK-LABEL: or_rotr_ne_0:
205
+ ; CHECK: # %bb.0:
206
+ ; CHECK-NEXT: movq %rdx, %rcx
207
+ ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx
208
+ ; CHECK-NEXT: rorq %cl, %rdi
209
+ ; CHECK-NEXT: orq %rsi, %rdi
210
+ ; CHECK-NEXT: setne %al
211
+ ; CHECK-NEXT: retq
212
+ %rot = tail call i64 @llvm.fshr.i64 (i64 %x , i64 %x , i64 %z )
213
+ %or = or i64 %y , %rot
214
+ %r = icmp ne i64 %or , 0
215
+ ret i1 %r
216
+ }
217
+
218
+ define i1 @or_rotl_ne_n1 (i32 %x , i32 %y , i32 %z ) nounwind {
219
+ ; CHECK-LABEL: or_rotl_ne_n1:
220
+ ; CHECK: # %bb.0:
221
+ ; CHECK-NEXT: movl %edx, %ecx
222
+ ; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
223
+ ; CHECK-NEXT: roll %cl, %edi
224
+ ; CHECK-NEXT: orl %esi, %edi
225
+ ; CHECK-NEXT: cmpl $-1, %edi
226
+ ; CHECK-NEXT: setne %al
227
+ ; CHECK-NEXT: retq
228
+ %rot = tail call i32 @llvm.fshl.i32 (i32 %x , i32 %x , i32 %z )
229
+ %or = or i32 %y , %rot
230
+ %r = icmp ne i32 %or , -1
231
+ ret i1 %r
232
+ }
233
+
234
+ define i1 @or_rotl_ne_0_use (i32 %x , i32 %y , i32 %z ) nounwind {
235
+ ; CHECK-LABEL: or_rotl_ne_0_use:
236
+ ; CHECK: # %bb.0:
237
+ ; CHECK-NEXT: pushq %rbx
238
+ ; CHECK-NEXT: movl %edx, %ecx
239
+ ; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
240
+ ; CHECK-NEXT: roll %cl, %edi
241
+ ; CHECK-NEXT: orl %esi, %edi
242
+ ; CHECK-NEXT: setne %bl
243
+ ; CHECK-NEXT: callq use32@PLT
244
+ ; CHECK-NEXT: movl %ebx, %eax
245
+ ; CHECK-NEXT: popq %rbx
246
+ ; CHECK-NEXT: retq
247
+ %rot = tail call i32 @llvm.fshl.i32 (i32 %x , i32 %x , i32 %z )
248
+ %or = or i32 %y , %rot
249
+ call void @use32 (i32 %or )
250
+ %r = icmp ne i32 %or , 0
251
+ ret i1 %r
252
+ }
253
+
254
+ define <4 x i1 > @or_rotl_ne_eq0 (<4 x i32 > %x , <4 x i32 > %y ) nounwind {
255
+ ; CHECK-LABEL: or_rotl_ne_eq0:
256
+ ; CHECK: # %bb.0:
257
+ ; CHECK-NEXT: movdqa {{.*#+}} xmm2 = [31,31,31,31]
258
+ ; CHECK-NEXT: pand %xmm1, %xmm2
259
+ ; CHECK-NEXT: pslld $23, %xmm2
260
+ ; CHECK-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
261
+ ; CHECK-NEXT: cvttps2dq %xmm2, %xmm2
262
+ ; CHECK-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
263
+ ; CHECK-NEXT: pmuludq %xmm2, %xmm0
264
+ ; CHECK-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3]
265
+ ; CHECK-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
266
+ ; CHECK-NEXT: pmuludq %xmm3, %xmm2
267
+ ; CHECK-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,3,2,3]
268
+ ; CHECK-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
269
+ ; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
270
+ ; CHECK-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
271
+ ; CHECK-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
272
+ ; CHECK-NEXT: por %xmm1, %xmm4
273
+ ; CHECK-NEXT: por %xmm0, %xmm4
274
+ ; CHECK-NEXT: pxor %xmm0, %xmm0
275
+ ; CHECK-NEXT: pcmpeqd %xmm4, %xmm0
276
+ ; CHECK-NEXT: retq
277
+ %rot = tail call <4 x i32 > @llvm.fshl.v4i32 (<4 x i32 >%x , <4 x i32 > %x , <4 x i32 > %y )
278
+ %or = or <4 x i32 > %y , %rot
279
+ %r = icmp eq <4 x i32 > %or , <i32 0 , i32 0 , i32 0 , i32 poison>
280
+ ret <4 x i1 > %r
281
+ }
0 commit comments