465 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefixes=X863; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=X644 5define i8 @cmov_bsf8(i8 %x, i8 %y) nounwind {6; X86-LABEL: cmov_bsf8:7; X86: # %bb.0:8; X86-NEXT: movl {{[0-9]+}}(%esp), %eax9; X86-NEXT: testb %al, %al10; X86-NEXT: je .LBB0_111; X86-NEXT: # %bb.2:12; X86-NEXT: orl $256, %eax # imm = 0x10013; X86-NEXT: rep bsfl %eax, %eax14; X86-NEXT: # kill: def $al killed $al killed $eax15; X86-NEXT: retl16; X86-NEXT: .LBB0_1:17; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax18; X86-NEXT: # kill: def $al killed $al killed $eax19; X86-NEXT: retl20;21; X64-LABEL: cmov_bsf8:22; X64: # %bb.0:23; X64-NEXT: movl %edi, %eax24; X64-NEXT: orl $256, %eax # imm = 0x10025; X64-NEXT: rep bsfl %eax, %eax26; X64-NEXT: testb %dil, %dil27; X64-NEXT: cmovel %esi, %eax28; X64-NEXT: # kill: def $al killed $al killed $eax29; X64-NEXT: retq30 %1 = tail call i8 @llvm.cttz.i8(i8 %x, i1 false)31 %2 = icmp eq i8 %x, 032 %3 = select i1 %2, i8 %y, i8 %133 ret i8 %334}35 36define i8 @cmov_bsf8_undef(i8 %x, i8 %y) nounwind {37; X86-LABEL: cmov_bsf8_undef:38; X86: # %bb.0:39; X86-NEXT: movl {{[0-9]+}}(%esp), %eax40; X86-NEXT: testb %al, %al41; X86-NEXT: jne .LBB1_142; X86-NEXT: # %bb.2:43; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax44; X86-NEXT: # kill: def $al killed $al killed $eax45; X86-NEXT: retl46; X86-NEXT: .LBB1_1:47; X86-NEXT: rep bsfl %eax, %eax48; X86-NEXT: # kill: def $al killed $al killed $eax49; X86-NEXT: retl50;51; X64-LABEL: cmov_bsf8_undef:52; X64: # %bb.0:53; X64-NEXT: rep bsfl %edi, %eax54; X64-NEXT: testb %dil, %dil55; X64-NEXT: cmovel %esi, %eax56; X64-NEXT: # kill: def $al killed $al killed $eax57; X64-NEXT: retq58 %1 = tail call i8 @llvm.cttz.i8(i8 %x, i1 true)59 %2 = icmp ne i8 %x, 060 %3 = select i1 %2, i8 %1, i8 %y61 ret i8 %362}63 64define i16 @cmov_bsf16(i16 %x, i16 %y) nounwind {65; X86-LABEL: cmov_bsf16:66; X86: # %bb.0:67; X86-NEXT: movl {{[0-9]+}}(%esp), %eax68; X86-NEXT: testw %ax, %ax69; X86-NEXT: jne .LBB2_170; X86-NEXT: # %bb.2:71; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax72; X86-NEXT: # kill: def $ax killed $ax killed $eax73; X86-NEXT: retl74; X86-NEXT: .LBB2_1:75; X86-NEXT: orl $65536, %eax # imm = 0x1000076; X86-NEXT: rep bsfl %eax, %eax77; X86-NEXT: # kill: def $ax killed $ax killed $eax78; X86-NEXT: retl79;80; X64-LABEL: cmov_bsf16:81; X64: # %bb.0:82; X64-NEXT: movl %edi, %eax83; X64-NEXT: orl $65536, %eax # imm = 0x1000084; X64-NEXT: rep bsfl %eax, %eax85; X64-NEXT: testw %di, %di86; X64-NEXT: cmovel %esi, %eax87; X64-NEXT: # kill: def $ax killed $ax killed $eax88; X64-NEXT: retq89 %1 = tail call i16 @llvm.cttz.i16(i16 %x, i1 false)90 %2 = icmp ne i16 %x, 091 %3 = select i1 %2, i16 %1, i16 %y92 ret i16 %393}94 95define i16 @cmov_bsf16_undef(i16 %x, i16 %y) nounwind {96; X86-LABEL: cmov_bsf16_undef:97; X86: # %bb.0:98; X86-NEXT: movl {{[0-9]+}}(%esp), %eax99; X86-NEXT: testw %ax, %ax100; X86-NEXT: je .LBB3_1101; X86-NEXT: # %bb.2:102; X86-NEXT: rep bsfl %eax, %eax103; X86-NEXT: # kill: def $ax killed $ax killed $eax104; X86-NEXT: retl105; X86-NEXT: .LBB3_1:106; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax107; X86-NEXT: # kill: def $ax killed $ax killed $eax108; X86-NEXT: retl109;110; X64-LABEL: cmov_bsf16_undef:111; X64: # %bb.0:112; X64-NEXT: rep bsfl %edi, %eax113; X64-NEXT: testw %di, %di114; X64-NEXT: cmovel %esi, %eax115; X64-NEXT: # kill: def $ax killed $ax killed $eax116; X64-NEXT: retq117 %1 = tail call i16 @llvm.cttz.i16(i16 %x, i1 true)118 %2 = icmp eq i16 %x, 0119 %3 = select i1 %2, i16 %y, i16 %1120 ret i16 %3121}122 123define i32 @cmov_bsf32(i32 %x, i32 %y) nounwind {124; X86-LABEL: cmov_bsf32:125; X86: # %bb.0:126; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx127; X86-NEXT: testl %ecx, %ecx128; X86-NEXT: je .LBB4_1129; X86-NEXT: # %bb.2: # %cond.false130; X86-NEXT: rep bsfl %ecx, %eax131; X86-NEXT: testl %ecx, %ecx132; X86-NEXT: jne .LBB4_5133; X86-NEXT: .LBB4_4:134; X86-NEXT: movl {{[0-9]+}}(%esp), %eax135; X86-NEXT: .LBB4_5: # %cond.end136; X86-NEXT: retl137; X86-NEXT: .LBB4_1:138; X86-NEXT: movl $32, %eax139; X86-NEXT: testl %ecx, %ecx140; X86-NEXT: je .LBB4_4141; X86-NEXT: jmp .LBB4_5142;143; X64-LABEL: cmov_bsf32:144; X64: # %bb.0:145; X64-NEXT: movl $32, %eax146; X64-NEXT: bsfl %edi, %eax147; X64-NEXT: cmovel %esi, %eax148; X64-NEXT: retq149 %1 = tail call i32 @llvm.cttz.i32(i32 %x, i1 false)150 %2 = icmp eq i32 %x, 0151 %3 = select i1 %2, i32 %y, i32 %1152 ret i32 %3153}154 155define i32 @cmov_bsf32_undef(i32 %x, i32 %y) nounwind {156; X86-LABEL: cmov_bsf32_undef:157; X86: # %bb.0:158; X86-NEXT: movl {{[0-9]+}}(%esp), %eax159; X86-NEXT: testl %eax, %eax160; X86-NEXT: jne .LBB5_1161; X86-NEXT: # %bb.2:162; X86-NEXT: movl {{[0-9]+}}(%esp), %eax163; X86-NEXT: retl164; X86-NEXT: .LBB5_1:165; X86-NEXT: rep bsfl %eax, %eax166; X86-NEXT: retl167;168; X64-LABEL: cmov_bsf32_undef:169; X64: # %bb.0:170; X64-NEXT: bsfl %edi, %eax171; X64-NEXT: cmovel %esi, %eax172; X64-NEXT: retq173 %1 = tail call i32 @llvm.cttz.i32(i32 %x, i1 true)174 %2 = icmp ne i32 %x, 0175 %3 = select i1 %2, i32 %1, i32 %y176 ret i32 %3177}178 179define i64 @cmov_bsf64(i64 %x, i64 %y) nounwind {180; X86-LABEL: cmov_bsf64:181; X86: # %bb.0:182; X86-NEXT: pushl %esi183; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx184; X86-NEXT: movl {{[0-9]+}}(%esp), %esi185; X86-NEXT: xorl %edx, %edx186; X86-NEXT: movl %esi, %eax187; X86-NEXT: orl %ecx, %eax188; X86-NEXT: je .LBB6_1189; X86-NEXT: # %bb.2: # %cond.false190; X86-NEXT: testl %esi, %esi191; X86-NEXT: jne .LBB6_3192; X86-NEXT: # %bb.4: # %cond.false193; X86-NEXT: rep bsfl %ecx, %eax194; X86-NEXT: addl $32, %eax195; X86-NEXT: orl %ecx, %esi196; X86-NEXT: je .LBB6_6197; X86-NEXT: jmp .LBB6_7198; X86-NEXT: .LBB6_1:199; X86-NEXT: movl $64, %eax200; X86-NEXT: orl %ecx, %esi201; X86-NEXT: jne .LBB6_7202; X86-NEXT: .LBB6_6: # %cond.end203; X86-NEXT: movl {{[0-9]+}}(%esp), %edx204; X86-NEXT: movl {{[0-9]+}}(%esp), %eax205; X86-NEXT: .LBB6_7: # %cond.end206; X86-NEXT: popl %esi207; X86-NEXT: retl208; X86-NEXT: .LBB6_3:209; X86-NEXT: rep bsfl %esi, %eax210; X86-NEXT: orl %ecx, %esi211; X86-NEXT: je .LBB6_6212; X86-NEXT: jmp .LBB6_7213;214; X64-LABEL: cmov_bsf64:215; X64: # %bb.0:216; X64-NEXT: movl $64, %eax217; X64-NEXT: bsfq %rdi, %rax218; X64-NEXT: cmoveq %rsi, %rax219; X64-NEXT: retq220 %1 = tail call i64 @llvm.cttz.i64(i64 %x, i1 false)221 %2 = icmp ne i64 %x, 0222 %3 = select i1 %2, i64 %1, i64 %y223 ret i64 %3224}225 226define i64 @cmov_bsf64_undef(i64 %x, i64 %y) nounwind {227; X86-LABEL: cmov_bsf64_undef:228; X86: # %bb.0:229; X86-NEXT: movl {{[0-9]+}}(%esp), %eax230; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx231; X86-NEXT: movl %ecx, %edx232; X86-NEXT: orl %eax, %edx233; X86-NEXT: je .LBB7_5234; X86-NEXT: # %bb.1: # %select.false.sink235; X86-NEXT: testl %ecx, %ecx236; X86-NEXT: jne .LBB7_2237; X86-NEXT: # %bb.3: # %select.false.sink238; X86-NEXT: rep bsfl %eax, %eax239; X86-NEXT: addl $32, %eax240; X86-NEXT: xorl %edx, %edx241; X86-NEXT: retl242; X86-NEXT: .LBB7_5: # %select.end243; X86-NEXT: movl {{[0-9]+}}(%esp), %edx244; X86-NEXT: movl {{[0-9]+}}(%esp), %eax245; X86-NEXT: retl246; X86-NEXT: .LBB7_2:247; X86-NEXT: rep bsfl %ecx, %eax248; X86-NEXT: xorl %edx, %edx249; X86-NEXT: retl250;251; X64-LABEL: cmov_bsf64_undef:252; X64: # %bb.0:253; X64-NEXT: bsfq %rdi, %rax254; X64-NEXT: cmoveq %rsi, %rax255; X64-NEXT: retq256 %1 = tail call i64 @llvm.cttz.i64(i64 %x, i1 true)257 %2 = icmp eq i64 %x, 0258 %3 = select i1 %2, i64 %y, i64 %1259 ret i64 %3260}261 262define i128 @cmov_bsf128(i128 %x, i128 %y) nounwind {263; X86-LABEL: cmov_bsf128:264; X86: # %bb.0:265; X86-NEXT: pushl %ebp266; X86-NEXT: movl %esp, %ebp267; X86-NEXT: pushl %ebx268; X86-NEXT: pushl %edi269; X86-NEXT: pushl %esi270; X86-NEXT: andl $-16, %esp271; X86-NEXT: subl $16, %esp272; X86-NEXT: movl 32(%ebp), %edi273; X86-NEXT: movl 24(%ebp), %ecx274; X86-NEXT: movl 36(%ebp), %ebx275; X86-NEXT: movl 28(%ebp), %esi276; X86-NEXT: movl %esi, %eax277; X86-NEXT: orl %ebx, %eax278; X86-NEXT: movl %ecx, %edx279; X86-NEXT: orl %edi, %edx280; X86-NEXT: orl %eax, %edx281; X86-NEXT: je .LBB8_1282; X86-NEXT: # %bb.2: # %cond.false283; X86-NEXT: testl %ecx, %ecx284; X86-NEXT: jne .LBB8_3285; X86-NEXT: # %bb.4: # %cond.false286; X86-NEXT: rep bsfl %esi, %eax287; X86-NEXT: addl $32, %eax288; X86-NEXT: jmp .LBB8_5289; X86-NEXT: .LBB8_1:290; X86-NEXT: movl %ebx, %eax291; X86-NEXT: xorl %edi, %edi292; X86-NEXT: movl $128, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill293; X86-NEXT: jmp .LBB8_11294; X86-NEXT: .LBB8_3:295; X86-NEXT: rep bsfl %ecx, %eax296; X86-NEXT: .LBB8_5: # %cond.false297; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill298; X86-NEXT: testl %edi, %edi299; X86-NEXT: jne .LBB8_6300; X86-NEXT: # %bb.7: # %cond.false301; X86-NEXT: rep bsfl %ebx, %edx302; X86-NEXT: addl $32, %edx303; X86-NEXT: jmp .LBB8_8304; X86-NEXT: .LBB8_6:305; X86-NEXT: rep bsfl %edi, %edx306; X86-NEXT: .LBB8_8: # %cond.false307; X86-NEXT: movl %ebx, %eax308; X86-NEXT: movl %ecx, %edi309; X86-NEXT: orl %esi, %edi310; X86-NEXT: jne .LBB8_10311; X86-NEXT: # %bb.9: # %cond.false312; X86-NEXT: addl $64, %edx313; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill314; X86-NEXT: .LBB8_10: # %cond.false315; X86-NEXT: xorl %edi, %edi316; X86-NEXT: .LBB8_11: # %cond.end317; X86-NEXT: xorl %edx, %edx318; X86-NEXT: xorl %ebx, %ebx319; X86-NEXT: orl 32(%ebp), %ecx320; X86-NEXT: orl %eax, %esi321; X86-NEXT: orl %ecx, %esi322; X86-NEXT: je .LBB8_12323; X86-NEXT: # %bb.13: # %cond.end324; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload325; X86-NEXT: jmp .LBB8_14326; X86-NEXT: .LBB8_12:327; X86-NEXT: movl 52(%ebp), %ebx328; X86-NEXT: movl 48(%ebp), %edx329; X86-NEXT: movl 44(%ebp), %edi330; X86-NEXT: movl 40(%ebp), %ecx331; X86-NEXT: .LBB8_14: # %cond.end332; X86-NEXT: movl 8(%ebp), %eax333; X86-NEXT: movl %ebx, 12(%eax)334; X86-NEXT: movl %edx, 8(%eax)335; X86-NEXT: movl %edi, 4(%eax)336; X86-NEXT: movl %ecx, (%eax)337; X86-NEXT: leal -12(%ebp), %esp338; X86-NEXT: popl %esi339; X86-NEXT: popl %edi340; X86-NEXT: popl %ebx341; X86-NEXT: popl %ebp342; X86-NEXT: retl $4343;344; X64-LABEL: cmov_bsf128:345; X64: # %bb.0:346; X64-NEXT: movq %rdi, %rax347; X64-NEXT: orq %rsi, %rax348; X64-NEXT: je .LBB8_2349; X64-NEXT: # %bb.1: # %select.false.sink350; X64-NEXT: rep bsfq %rdi, %rcx351; X64-NEXT: movl $64, %eax352; X64-NEXT: rep bsfq %rsi, %rax353; X64-NEXT: addq $64, %rax354; X64-NEXT: testq %rdi, %rdi355; X64-NEXT: cmovneq %rcx, %rax356; X64-NEXT: xorl %edx, %edx357; X64-NEXT: retq358; X64-NEXT: .LBB8_2: # %select.end359; X64-NEXT: movq %rdx, %rax360; X64-NEXT: movq %rcx, %rdx361; X64-NEXT: retq362 %1 = tail call i128 @llvm.cttz.i128(i128 %x, i1 false)363 %2 = icmp eq i128 %x, 0364 %3 = select i1 %2, i128 %y, i128 %1365 ret i128 %3366}367 368define i128 @cmov_bsf128_undef(i128 %x, i128 %y) nounwind {369; X86-LABEL: cmov_bsf128_undef:370; X86: # %bb.0:371; X86-NEXT: pushl %ebp372; X86-NEXT: movl %esp, %ebp373; X86-NEXT: pushl %ebx374; X86-NEXT: pushl %edi375; X86-NEXT: pushl %esi376; X86-NEXT: andl $-16, %esp377; X86-NEXT: subl $16, %esp378; X86-NEXT: movl 36(%ebp), %esi379; X86-NEXT: movl 32(%ebp), %edi380; X86-NEXT: movl 28(%ebp), %ecx381; X86-NEXT: movl 24(%ebp), %edx382; X86-NEXT: movl %ecx, %eax383; X86-NEXT: orl %esi, %eax384; X86-NEXT: movl %edx, %ebx385; X86-NEXT: orl %edi, %ebx386; X86-NEXT: orl %eax, %ebx387; X86-NEXT: movl 8(%ebp), %eax388; X86-NEXT: je .LBB9_11389; X86-NEXT: # %bb.1: # %select.true.sink390; X86-NEXT: testl %edx, %edx391; X86-NEXT: jne .LBB9_2392; X86-NEXT: # %bb.3: # %select.true.sink393; X86-NEXT: rep bsfl %ecx, %ebx394; X86-NEXT: addl $32, %ebx395; X86-NEXT: testl %edi, %edi396; X86-NEXT: je .LBB9_6397; X86-NEXT: .LBB9_5:398; X86-NEXT: rep bsfl %edi, %esi399; X86-NEXT: orl %ecx, %edx400; X86-NEXT: je .LBB9_8401; X86-NEXT: jmp .LBB9_9402; X86-NEXT: .LBB9_11: # %select.end403; X86-NEXT: movl 52(%ebp), %ecx404; X86-NEXT: movl 48(%ebp), %edx405; X86-NEXT: movl 44(%ebp), %esi406; X86-NEXT: movl 40(%ebp), %edi407; X86-NEXT: movl %edi, (%eax)408; X86-NEXT: movl %esi, 4(%eax)409; X86-NEXT: movl %edx, 8(%eax)410; X86-NEXT: movl %ecx, 12(%eax)411; X86-NEXT: jmp .LBB9_10412; X86-NEXT: .LBB9_2:413; X86-NEXT: rep bsfl %edx, %ebx414; X86-NEXT: testl %edi, %edi415; X86-NEXT: jne .LBB9_5416; X86-NEXT: .LBB9_6: # %select.true.sink417; X86-NEXT: rep bsfl %esi, %esi418; X86-NEXT: addl $32, %esi419; X86-NEXT: orl %ecx, %edx420; X86-NEXT: jne .LBB9_9421; X86-NEXT: .LBB9_8: # %select.true.sink422; X86-NEXT: addl $64, %esi423; X86-NEXT: movl %esi, %ebx424; X86-NEXT: .LBB9_9: # %select.true.sink425; X86-NEXT: movl %ebx, (%eax)426; X86-NEXT: movl $0, 12(%eax)427; X86-NEXT: movl $0, 8(%eax)428; X86-NEXT: movl $0, 4(%eax)429; X86-NEXT: .LBB9_10: # %select.true.sink430; X86-NEXT: leal -12(%ebp), %esp431; X86-NEXT: popl %esi432; X86-NEXT: popl %edi433; X86-NEXT: popl %ebx434; X86-NEXT: popl %ebp435; X86-NEXT: retl $4436;437; X64-LABEL: cmov_bsf128_undef:438; X64: # %bb.0:439; X64-NEXT: movq %rdi, %rax440; X64-NEXT: orq %rsi, %rax441; X64-NEXT: je .LBB9_2442; X64-NEXT: # %bb.1: # %select.true.sink443; X64-NEXT: rep bsfq %rdi, %rcx444; X64-NEXT: rep bsfq %rsi, %rax445; X64-NEXT: addq $64, %rax446; X64-NEXT: testq %rdi, %rdi447; X64-NEXT: cmovneq %rcx, %rax448; X64-NEXT: xorl %edx, %edx449; X64-NEXT: retq450; X64-NEXT: .LBB9_2: # %select.end451; X64-NEXT: movq %rdx, %rax452; X64-NEXT: movq %rcx, %rdx453; X64-NEXT: retq454 %1 = tail call i128 @llvm.cttz.i128(i128 %x, i1 true)455 %2 = icmp ne i128 %x, 0456 %3 = select i1 %2, i128 %1, i128 %y457 ret i128 %3458}459 460declare i8 @llvm.cttz.i8(i8, i1)461declare i16 @llvm.cttz.i16(i16, i1)462declare i32 @llvm.cttz.i32(i32, i1)463declare i64 @llvm.cttz.i64(i64, i1)464declare i128 @llvm.cttz.i128(i128, i1)465