@@ -322,5 +322,49 @@ define void @g(i32 %a) nounwind {
322
322
ret void
323
323
}
324
324
325
+ define i32 @shift_zext_shl (i8 zeroext %x ) {
326
+ ; X86-LABEL: shift_zext_shl:
327
+ ; X86: # %bb.0:
328
+ ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
329
+ ; X86-NEXT: andb $64, %al
330
+ ; X86-NEXT: movzbl %al, %eax
331
+ ; X86-NEXT: shll $9, %eax
332
+ ; X86-NEXT: movzwl %ax, %eax
333
+ ; X86-NEXT: retl
334
+ ;
335
+ ; X64-LABEL: shift_zext_shl:
336
+ ; X64: # %bb.0:
337
+ ; X64-NEXT: andb $64, %dil
338
+ ; X64-NEXT: movzbl %dil, %eax
339
+ ; X64-NEXT: shll $9, %eax
340
+ ; X64-NEXT: movzwl %ax, %eax
341
+ ; X64-NEXT: retq
342
+ %a = and i8 %x , 64
343
+ %b = zext i8 %a to i16
344
+ %c = shl i16 %b , 9
345
+ %d = zext i16 %c to i32
346
+ ret i32 %d
347
+ }
348
+
349
+ define i32 @shift_zext_shl2 (i8 zeroext %x ) {
350
+ ; X86-LABEL: shift_zext_shl2:
351
+ ; X86: # %bb.0:
352
+ ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
353
+ ; X86-NEXT: andl $64, %eax
354
+ ; X86-NEXT: shll $9, %eax
355
+ ; X86-NEXT: retl
356
+ ;
357
+ ; X64-LABEL: shift_zext_shl2:
358
+ ; X64: # %bb.0:
359
+ ; X64-NEXT: movl %edi, %eax
360
+ ; X64-NEXT: andl $64, %eax
361
+ ; X64-NEXT: shll $9, %eax
362
+ ; X64-NEXT: retq
363
+ %a = and i8 %x , 64
364
+ %b = zext i8 %a to i32
365
+ %c = shl i32 %b , 9
366
+ ret i32 %c
367
+ }
368
+
325
369
declare dso_local void @f (i64 )
326
370
0 commit comments