107 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=X863; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=X644 5define i32 @sext_known_nonzero(i16 %xx) {6; X86-LABEL: sext_known_nonzero:7; X86: # %bb.0:8; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx9; X86-NEXT: movl $256, %eax # imm = 0x10010; X86-NEXT: shll %cl, %eax11; X86-NEXT: cwtl12; X86-NEXT: bsfl %eax, %ecx13; X86-NEXT: movl $32, %eax14; X86-NEXT: cmovnel %ecx, %eax15; X86-NEXT: retl16;17; X64-LABEL: sext_known_nonzero:18; X64: # %bb.0:19; X64-NEXT: movl %edi, %ecx20; X64-NEXT: movl $256, %eax # imm = 0x10021; X64-NEXT: # kill: def $cl killed $cl killed $ecx22; X64-NEXT: shll %cl, %eax23; X64-NEXT: movswl %ax, %ecx24; X64-NEXT: movl $32, %eax25; X64-NEXT: rep bsfl %ecx, %eax26; X64-NEXT: retq27 %x = shl i16 256, %xx28 %z = sext i16 %x to i3229 %r = call i32 @llvm.cttz.i32(i32 %z, i1 false)30 ret i32 %r31}32 33define i32 @sext_known_nonzero_nuw(i16 %xx) {34; X86-LABEL: sext_known_nonzero_nuw:35; X86: # %bb.0:36; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx37; X86-NEXT: movl $256, %eax # imm = 0x10038; X86-NEXT: shll %cl, %eax39; X86-NEXT: cwtl40; X86-NEXT: rep bsfl %eax, %eax41; X86-NEXT: retl42;43; X64-LABEL: sext_known_nonzero_nuw:44; X64: # %bb.0:45; X64-NEXT: movl %edi, %ecx46; X64-NEXT: movl $256, %eax # imm = 0x10047; X64-NEXT: # kill: def $cl killed $cl killed $ecx48; X64-NEXT: shll %cl, %eax49; X64-NEXT: cwtl50; X64-NEXT: rep bsfl %eax, %eax51; X64-NEXT: retq52 %x = shl nuw i16 256, %xx53 %z = sext i16 %x to i3254 %r = call i32 @llvm.cttz.i32(i32 %z, i1 false)55 ret i32 %r56}57 58define i32 @sext_known_nonzero_nsw(i16 %xx) {59; X86-LABEL: sext_known_nonzero_nsw:60; X86: # %bb.0:61; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx62; X86-NEXT: movl $256, %eax # imm = 0x10063; X86-NEXT: shll %cl, %eax64; X86-NEXT: movzwl %ax, %eax65; X86-NEXT: rep bsfl %eax, %eax66; X86-NEXT: retl67;68; X64-LABEL: sext_known_nonzero_nsw:69; X64: # %bb.0:70; X64-NEXT: movl %edi, %ecx71; X64-NEXT: movl $256, %eax # imm = 0x10072; X64-NEXT: # kill: def $cl killed $cl killed $ecx73; X64-NEXT: shll %cl, %eax74; X64-NEXT: movzwl %ax, %eax75; X64-NEXT: rep bsfl %eax, %eax76; X64-NEXT: retq77 %x = shl nsw i16 256, %xx78 %z = sext i16 %x to i3279 %r = call i32 @llvm.cttz.i32(i32 %z, i1 false)80 ret i32 %r81}82 83define i32 @sext_known_nonzero_nuw_nsw(i16 %xx) {84; X86-LABEL: sext_known_nonzero_nuw_nsw:85; X86: # %bb.0:86; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx87; X86-NEXT: movl $256, %eax # imm = 0x10088; X86-NEXT: shll %cl, %eax89; X86-NEXT: movzwl %ax, %eax90; X86-NEXT: rep bsfl %eax, %eax91; X86-NEXT: retl92;93; X64-LABEL: sext_known_nonzero_nuw_nsw:94; X64: # %bb.0:95; X64-NEXT: movl %edi, %ecx96; X64-NEXT: movl $256, %eax # imm = 0x10097; X64-NEXT: # kill: def $cl killed $cl killed $ecx98; X64-NEXT: shll %cl, %eax99; X64-NEXT: movzwl %ax, %eax100; X64-NEXT: rep bsfl %eax, %eax101; X64-NEXT: retq102 %x = shl nuw nsw i16 256, %xx103 %z = sext i16 %x to i32104 %r = call i32 @llvm.cttz.i32(i32 %z, i1 false)105 ret i32 %r106}107