812 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -verify-machineinstrs | FileCheck %s --check-prefix=SDAG-X643; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -verify-machineinstrs -mattr=+avx512f | FileCheck %s --check-prefix=SDAG-X644; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=x86_64-apple-darwin10 -verify-machineinstrs | FileCheck %s --check-prefix=FAST-X645; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=x86_64-apple-darwin10 -verify-machineinstrs -mattr=+avx512f | FileCheck %s --check-prefix=FAST-X646; RUN: llc < %s -global-isel -global-isel-abort=1 -mtriple=x86_64-apple-darwin10 -verify-machineinstrs | FileCheck %s --check-prefix=GISEL-X647; RUN: llc < %s -global-isel -global-isel-abort=1 -mtriple=x86_64-apple-darwin10 -verify-machineinstrs -mattr=+avx512f | FileCheck %s --check-prefix=GISEL-X648 9; RUN: llc < %s -mtriple=i686-apple-darwin10 -verify-machineinstrs | FileCheck %s --check-prefix=SDAG-X8610; RUN: llc < %s -mtriple=i686-apple-darwin10 -verify-machineinstrs -mattr=+cmov | FileCheck %s --check-prefix=SDAG-X86-CMOV11; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=i686-apple-darwin10 -verify-machineinstrs | FileCheck %s --check-prefix=FAST-X8612; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=i686-apple-darwin10 -verify-machineinstrs -mattr=+cmov | FileCheck %s --check-prefix=FAST-X86-CMOV13; RUN: llc < %s -global-isel -global-isel-abort=1 -mtriple=i686-apple-darwin10 -verify-machineinstrs | FileCheck %s --check-prefix=GISEL-X8614; RUN: llc < %s -global-isel -global-isel-abort=1 -mtriple=i686-apple-darwin10 -verify-machineinstrs -mattr=+cmov | FileCheck %s --check-prefix=GISEL-X86-CMOV15 16; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=x86_64-apple-darwin10 -verify-machineinstrs -mattr=+ndd | FileCheck %s --check-prefix=NDD17 18; Test conditional move for the supported types (i16, i32, and i32) and19; conditon input (argument or cmp).20; When cmov is not available (i8 type or X86), the branch is expected.21 22define zeroext i8 @select_cmov_i8(i1 zeroext %cond, i8 zeroext %a, i8 zeroext %b) {23; SDAG-X64-LABEL: select_cmov_i8:24; SDAG-X64: ## %bb.0:25; SDAG-X64-NEXT: movl %esi, %eax26; SDAG-X64-NEXT: testl %edi, %edi27; SDAG-X64-NEXT: cmovel %edx, %eax28; SDAG-X64-NEXT: retq29;30; FAST-X64-LABEL: select_cmov_i8:31; FAST-X64: ## %bb.0:32; FAST-X64-NEXT: testb $1, %dil33; FAST-X64-NEXT: jne LBB0_234; FAST-X64-NEXT: ## %bb.1:35; FAST-X64-NEXT: movl %edx, %esi36; FAST-X64-NEXT: LBB0_2:37; FAST-X64-NEXT: movzbl %sil, %eax38; FAST-X64-NEXT: retq39;40; GISEL-X64-LABEL: select_cmov_i8:41; GISEL-X64: ## %bb.0:42; GISEL-X64-NEXT: movl %edx, %eax43; GISEL-X64-NEXT: testl %edi, %edi44; GISEL-X64-NEXT: cmovnew %si, %ax45; GISEL-X64-NEXT: ## kill: def $al killed $al killed $eax46; GISEL-X64-NEXT: retq47;48; SDAG-X86-LABEL: select_cmov_i8:49; SDAG-X86: ## %bb.0:50; SDAG-X86-NEXT: cmpb $0, {{[0-9]+}}(%esp)51; SDAG-X86-NEXT: jne LBB0_152; SDAG-X86-NEXT: ## %bb.2:53; SDAG-X86-NEXT: leal {{[0-9]+}}(%esp), %eax54; SDAG-X86-NEXT: movzbl (%eax), %eax55; SDAG-X86-NEXT: retl56; SDAG-X86-NEXT: LBB0_1:57; SDAG-X86-NEXT: leal {{[0-9]+}}(%esp), %eax58; SDAG-X86-NEXT: movzbl (%eax), %eax59; SDAG-X86-NEXT: retl60;61; SDAG-X86-CMOV-LABEL: select_cmov_i8:62; SDAG-X86-CMOV: ## %bb.0:63; SDAG-X86-CMOV-NEXT: cmpb $0, {{[0-9]+}}(%esp)64; SDAG-X86-CMOV-NEXT: leal {{[0-9]+}}(%esp), %eax65; SDAG-X86-CMOV-NEXT: leal {{[0-9]+}}(%esp), %ecx66; SDAG-X86-CMOV-NEXT: cmovnel %eax, %ecx67; SDAG-X86-CMOV-NEXT: movzbl (%ecx), %eax68; SDAG-X86-CMOV-NEXT: retl69;70; FAST-X86-LABEL: select_cmov_i8:71; FAST-X86: ## %bb.0:72; FAST-X86-NEXT: testb $1, {{[0-9]+}}(%esp)73; FAST-X86-NEXT: jne LBB0_174; FAST-X86-NEXT: ## %bb.2:75; FAST-X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax76; FAST-X86-NEXT: movzbl %al, %eax77; FAST-X86-NEXT: retl78; FAST-X86-NEXT: LBB0_1:79; FAST-X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax80; FAST-X86-NEXT: movzbl %al, %eax81; FAST-X86-NEXT: retl82;83; FAST-X86-CMOV-LABEL: select_cmov_i8:84; FAST-X86-CMOV: ## %bb.0:85; FAST-X86-CMOV-NEXT: testb $1, {{[0-9]+}}(%esp)86; FAST-X86-CMOV-NEXT: jne LBB0_187; FAST-X86-CMOV-NEXT: ## %bb.2:88; FAST-X86-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %eax89; FAST-X86-CMOV-NEXT: movzbl %al, %eax90; FAST-X86-CMOV-NEXT: retl91; FAST-X86-CMOV-NEXT: LBB0_1:92; FAST-X86-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %eax93; FAST-X86-CMOV-NEXT: movzbl %al, %eax94; FAST-X86-CMOV-NEXT: retl95;96; GISEL-X86-LABEL: select_cmov_i8:97; GISEL-X86: ## %bb.0:98; GISEL-X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax99; GISEL-X86-NEXT: testl %eax, %eax100; GISEL-X86-NEXT: je LBB0_1101; GISEL-X86-NEXT: ## %bb.2:102; GISEL-X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax103; GISEL-X86-NEXT: ## kill: def $al killed $al killed $eax104; GISEL-X86-NEXT: retl105; GISEL-X86-NEXT: LBB0_1:106; GISEL-X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax107; GISEL-X86-NEXT: ## kill: def $al killed $al killed $eax108; GISEL-X86-NEXT: retl109;110; GISEL-X86-CMOV-LABEL: select_cmov_i8:111; GISEL-X86-CMOV: ## %bb.0:112; GISEL-X86-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %ecx113; GISEL-X86-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %edx114; GISEL-X86-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %eax115; GISEL-X86-CMOV-NEXT: testl %ecx, %ecx116; GISEL-X86-CMOV-NEXT: cmovnew %dx, %ax117; GISEL-X86-CMOV-NEXT: ## kill: def $al killed $al killed $eax118; GISEL-X86-CMOV-NEXT: retl119;120; NDD-LABEL: select_cmov_i8:121; NDD: ## %bb.0:122; NDD-NEXT: testb $1, %dil123; NDD-NEXT: jne LBB0_2124; NDD-NEXT: ## %bb.1:125; NDD-NEXT: movl %edx, %esi126; NDD-NEXT: LBB0_2:127; NDD-NEXT: movzbl %sil, %eax128; NDD-NEXT: retq129 %1 = select i1 %cond, i8 %a, i8 %b130 ret i8 %1131}132 133define zeroext i16 @select_cmov_i16(i1 zeroext %cond, i16 zeroext %a, i16 zeroext %b) {134; SDAG-X64-LABEL: select_cmov_i16:135; SDAG-X64: ## %bb.0:136; SDAG-X64-NEXT: movl %esi, %eax137; SDAG-X64-NEXT: testl %edi, %edi138; SDAG-X64-NEXT: cmovel %edx, %eax139; SDAG-X64-NEXT: retq140;141; FAST-X64-LABEL: select_cmov_i16:142; FAST-X64: ## %bb.0:143; FAST-X64-NEXT: testb $1, %dil144; FAST-X64-NEXT: cmovew %dx, %si145; FAST-X64-NEXT: movzwl %si, %eax146; FAST-X64-NEXT: retq147;148; GISEL-X64-LABEL: select_cmov_i16:149; GISEL-X64: ## %bb.0:150; GISEL-X64-NEXT: movl %edx, %eax151; GISEL-X64-NEXT: testl %edi, %edi152; GISEL-X64-NEXT: cmovnew %si, %ax153; GISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax154; GISEL-X64-NEXT: retq155;156; SDAG-X86-LABEL: select_cmov_i16:157; SDAG-X86: ## %bb.0:158; SDAG-X86-NEXT: cmpb $0, {{[0-9]+}}(%esp)159; SDAG-X86-NEXT: jne LBB1_1160; SDAG-X86-NEXT: ## %bb.2:161; SDAG-X86-NEXT: leal {{[0-9]+}}(%esp), %eax162; SDAG-X86-NEXT: movzwl (%eax), %eax163; SDAG-X86-NEXT: retl164; SDAG-X86-NEXT: LBB1_1:165; SDAG-X86-NEXT: leal {{[0-9]+}}(%esp), %eax166; SDAG-X86-NEXT: movzwl (%eax), %eax167; SDAG-X86-NEXT: retl168;169; SDAG-X86-CMOV-LABEL: select_cmov_i16:170; SDAG-X86-CMOV: ## %bb.0:171; SDAG-X86-CMOV-NEXT: cmpb $0, {{[0-9]+}}(%esp)172; SDAG-X86-CMOV-NEXT: leal {{[0-9]+}}(%esp), %eax173; SDAG-X86-CMOV-NEXT: leal {{[0-9]+}}(%esp), %ecx174; SDAG-X86-CMOV-NEXT: cmovnel %eax, %ecx175; SDAG-X86-CMOV-NEXT: movzwl (%ecx), %eax176; SDAG-X86-CMOV-NEXT: retl177;178; FAST-X86-LABEL: select_cmov_i16:179; FAST-X86: ## %bb.0:180; FAST-X86-NEXT: testb $1, {{[0-9]+}}(%esp)181; FAST-X86-NEXT: jne LBB1_1182; FAST-X86-NEXT: ## %bb.2:183; FAST-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax184; FAST-X86-NEXT: movzwl %ax, %eax185; FAST-X86-NEXT: retl186; FAST-X86-NEXT: LBB1_1:187; FAST-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax188; FAST-X86-NEXT: movzwl %ax, %eax189; FAST-X86-NEXT: retl190;191; FAST-X86-CMOV-LABEL: select_cmov_i16:192; FAST-X86-CMOV: ## %bb.0:193; FAST-X86-CMOV-NEXT: movzwl {{[0-9]+}}(%esp), %eax194; FAST-X86-CMOV-NEXT: testb $1, {{[0-9]+}}(%esp)195; FAST-X86-CMOV-NEXT: cmovew {{[0-9]+}}(%esp), %ax196; FAST-X86-CMOV-NEXT: movzwl %ax, %eax197; FAST-X86-CMOV-NEXT: retl198;199; GISEL-X86-LABEL: select_cmov_i16:200; GISEL-X86: ## %bb.0:201; GISEL-X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax202; GISEL-X86-NEXT: testl %eax, %eax203; GISEL-X86-NEXT: je LBB1_1204; GISEL-X86-NEXT: ## %bb.2:205; GISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax206; GISEL-X86-NEXT: ## kill: def $ax killed $ax killed $eax207; GISEL-X86-NEXT: retl208; GISEL-X86-NEXT: LBB1_1:209; GISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax210; GISEL-X86-NEXT: ## kill: def $ax killed $ax killed $eax211; GISEL-X86-NEXT: retl212;213; GISEL-X86-CMOV-LABEL: select_cmov_i16:214; GISEL-X86-CMOV: ## %bb.0:215; GISEL-X86-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %ecx216; GISEL-X86-CMOV-NEXT: movzwl {{[0-9]+}}(%esp), %edx217; GISEL-X86-CMOV-NEXT: movzwl {{[0-9]+}}(%esp), %eax218; GISEL-X86-CMOV-NEXT: testl %ecx, %ecx219; GISEL-X86-CMOV-NEXT: cmovnew %dx, %ax220; GISEL-X86-CMOV-NEXT: ## kill: def $ax killed $ax killed $eax221; GISEL-X86-CMOV-NEXT: retl222;223; NDD-LABEL: select_cmov_i16:224; NDD: ## %bb.0:225; NDD-NEXT: testb $1, %dil226; NDD-NEXT: cmovnew %si, %dx, %ax227; NDD-NEXT: movzwl %ax, %eax228; NDD-NEXT: retq229 %1 = select i1 %cond, i16 %a, i16 %b230 ret i16 %1231}232 233define zeroext i16 @select_cmp_cmov_i16(i16 zeroext %a, i16 zeroext %b) {234; SDAG-X64-LABEL: select_cmp_cmov_i16:235; SDAG-X64: ## %bb.0:236; SDAG-X64-NEXT: movl %esi, %eax237; SDAG-X64-NEXT: cmpw %ax, %di238; SDAG-X64-NEXT: cmovbl %edi, %eax239; SDAG-X64-NEXT: retq240;241; FAST-X64-LABEL: select_cmp_cmov_i16:242; FAST-X64: ## %bb.0:243; FAST-X64-NEXT: cmpw %si, %di244; FAST-X64-NEXT: cmovbw %di, %si245; FAST-X64-NEXT: movzwl %si, %eax246; FAST-X64-NEXT: retq247;248; GISEL-X64-LABEL: select_cmp_cmov_i16:249; GISEL-X64: ## %bb.0:250; GISEL-X64-NEXT: movl %edi, %eax251; GISEL-X64-NEXT: xorl %ecx, %ecx252; GISEL-X64-NEXT: cmpw %si, %ax253; GISEL-X64-NEXT: setb %cl254; GISEL-X64-NEXT: andl $1, %ecx255; GISEL-X64-NEXT: cmovew %si, %ax256; GISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax257; GISEL-X64-NEXT: retq258;259; SDAG-X86-LABEL: select_cmp_cmov_i16:260; SDAG-X86: ## %bb.0:261; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx262; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax263; SDAG-X86-NEXT: cmpw %cx, %ax264; SDAG-X86-NEXT: jb LBB2_2265; SDAG-X86-NEXT: ## %bb.1:266; SDAG-X86-NEXT: movl %ecx, %eax267; SDAG-X86-NEXT: LBB2_2:268; SDAG-X86-NEXT: movzwl %ax, %eax269; SDAG-X86-NEXT: retl270;271; SDAG-X86-CMOV-LABEL: select_cmp_cmov_i16:272; SDAG-X86-CMOV: ## %bb.0:273; SDAG-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax274; SDAG-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx275; SDAG-X86-CMOV-NEXT: cmpw %ax, %cx276; SDAG-X86-CMOV-NEXT: cmovbl %ecx, %eax277; SDAG-X86-CMOV-NEXT: movzwl %ax, %eax278; SDAG-X86-CMOV-NEXT: retl279;280; FAST-X86-LABEL: select_cmp_cmov_i16:281; FAST-X86: ## %bb.0:282; FAST-X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx283; FAST-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax284; FAST-X86-NEXT: cmpw %cx, %ax285; FAST-X86-NEXT: jb LBB2_2286; FAST-X86-NEXT: ## %bb.1:287; FAST-X86-NEXT: movl %ecx, %eax288; FAST-X86-NEXT: LBB2_2:289; FAST-X86-NEXT: movzwl %ax, %eax290; FAST-X86-NEXT: retl291;292; FAST-X86-CMOV-LABEL: select_cmp_cmov_i16:293; FAST-X86-CMOV: ## %bb.0:294; FAST-X86-CMOV-NEXT: movzwl {{[0-9]+}}(%esp), %eax295; FAST-X86-CMOV-NEXT: movzwl {{[0-9]+}}(%esp), %ecx296; FAST-X86-CMOV-NEXT: cmpw %ax, %cx297; FAST-X86-CMOV-NEXT: cmovbw %cx, %ax298; FAST-X86-CMOV-NEXT: movzwl %ax, %eax299; FAST-X86-CMOV-NEXT: retl300;301; GISEL-X86-LABEL: select_cmp_cmov_i16:302; GISEL-X86: ## %bb.0:303; GISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx304; GISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax305; GISEL-X86-NEXT: xorl %edx, %edx306; GISEL-X86-NEXT: cmpw %ax, %cx307; GISEL-X86-NEXT: setb %dl308; GISEL-X86-NEXT: andl $1, %edx309; GISEL-X86-NEXT: je LBB2_2310; GISEL-X86-NEXT: ## %bb.1:311; GISEL-X86-NEXT: movl %ecx, %eax312; GISEL-X86-NEXT: LBB2_2:313; GISEL-X86-NEXT: ## kill: def $ax killed $ax killed $eax314; GISEL-X86-NEXT: retl315;316; GISEL-X86-CMOV-LABEL: select_cmp_cmov_i16:317; GISEL-X86-CMOV: ## %bb.0:318; GISEL-X86-CMOV-NEXT: movzwl {{[0-9]+}}(%esp), %eax319; GISEL-X86-CMOV-NEXT: movzwl {{[0-9]+}}(%esp), %ecx320; GISEL-X86-CMOV-NEXT: xorl %edx, %edx321; GISEL-X86-CMOV-NEXT: cmpw %cx, %ax322; GISEL-X86-CMOV-NEXT: setb %dl323; GISEL-X86-CMOV-NEXT: andl $1, %edx324; GISEL-X86-CMOV-NEXT: cmovew %cx, %ax325; GISEL-X86-CMOV-NEXT: ## kill: def $ax killed $ax killed $eax326; GISEL-X86-CMOV-NEXT: retl327;328; NDD-LABEL: select_cmp_cmov_i16:329; NDD: ## %bb.0:330; NDD-NEXT: cmpw %si, %di331; NDD-NEXT: cmovbw %di, %si, %ax332; NDD-NEXT: movzwl %ax, %eax333; NDD-NEXT: retq334 %1 = icmp ult i16 %a, %b335 %2 = select i1 %1, i16 %a, i16 %b336 ret i16 %2337}338 339define i32 @select_cmov_i32(i1 zeroext %cond, i32 %a, i32 %b) {340; SDAG-X64-LABEL: select_cmov_i32:341; SDAG-X64: ## %bb.0:342; SDAG-X64-NEXT: movl %esi, %eax343; SDAG-X64-NEXT: testl %edi, %edi344; SDAG-X64-NEXT: cmovel %edx, %eax345; SDAG-X64-NEXT: retq346;347; FAST-X64-LABEL: select_cmov_i32:348; FAST-X64: ## %bb.0:349; FAST-X64-NEXT: movl %esi, %eax350; FAST-X64-NEXT: testb $1, %dil351; FAST-X64-NEXT: cmovel %edx, %eax352; FAST-X64-NEXT: retq353;354; GISEL-X64-LABEL: select_cmov_i32:355; GISEL-X64: ## %bb.0:356; GISEL-X64-NEXT: movl %edx, %eax357; GISEL-X64-NEXT: testl %edi, %edi358; GISEL-X64-NEXT: cmovnel %esi, %eax359; GISEL-X64-NEXT: retq360;361; SDAG-X86-LABEL: select_cmov_i32:362; SDAG-X86: ## %bb.0:363; SDAG-X86-NEXT: cmpb $0, {{[0-9]+}}(%esp)364; SDAG-X86-NEXT: jne LBB3_1365; SDAG-X86-NEXT: ## %bb.2:366; SDAG-X86-NEXT: leal {{[0-9]+}}(%esp), %eax367; SDAG-X86-NEXT: movl (%eax), %eax368; SDAG-X86-NEXT: retl369; SDAG-X86-NEXT: LBB3_1:370; SDAG-X86-NEXT: leal {{[0-9]+}}(%esp), %eax371; SDAG-X86-NEXT: movl (%eax), %eax372; SDAG-X86-NEXT: retl373;374; SDAG-X86-CMOV-LABEL: select_cmov_i32:375; SDAG-X86-CMOV: ## %bb.0:376; SDAG-X86-CMOV-NEXT: cmpb $0, {{[0-9]+}}(%esp)377; SDAG-X86-CMOV-NEXT: leal {{[0-9]+}}(%esp), %eax378; SDAG-X86-CMOV-NEXT: leal {{[0-9]+}}(%esp), %ecx379; SDAG-X86-CMOV-NEXT: cmovnel %eax, %ecx380; SDAG-X86-CMOV-NEXT: movl (%ecx), %eax381; SDAG-X86-CMOV-NEXT: retl382;383; FAST-X86-LABEL: select_cmov_i32:384; FAST-X86: ## %bb.0:385; FAST-X86-NEXT: testb $1, {{[0-9]+}}(%esp)386; FAST-X86-NEXT: jne LBB3_1387; FAST-X86-NEXT: ## %bb.2:388; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %eax389; FAST-X86-NEXT: retl390; FAST-X86-NEXT: LBB3_1:391; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %eax392; FAST-X86-NEXT: retl393;394; FAST-X86-CMOV-LABEL: select_cmov_i32:395; FAST-X86-CMOV: ## %bb.0:396; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax397; FAST-X86-CMOV-NEXT: testb $1, {{[0-9]+}}(%esp)398; FAST-X86-CMOV-NEXT: cmovel {{[0-9]+}}(%esp), %eax399; FAST-X86-CMOV-NEXT: retl400;401; GISEL-X86-LABEL: select_cmov_i32:402; GISEL-X86: ## %bb.0:403; GISEL-X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax404; GISEL-X86-NEXT: testl %eax, %eax405; GISEL-X86-NEXT: je LBB3_1406; GISEL-X86-NEXT: ## %bb.2:407; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax408; GISEL-X86-NEXT: retl409; GISEL-X86-NEXT: LBB3_1:410; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax411; GISEL-X86-NEXT: retl412;413; GISEL-X86-CMOV-LABEL: select_cmov_i32:414; GISEL-X86-CMOV: ## %bb.0:415; GISEL-X86-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %ecx416; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax417; GISEL-X86-CMOV-NEXT: testl %ecx, %ecx418; GISEL-X86-CMOV-NEXT: cmovnel {{[0-9]+}}(%esp), %eax419; GISEL-X86-CMOV-NEXT: retl420;421; NDD-LABEL: select_cmov_i32:422; NDD: ## %bb.0:423; NDD-NEXT: testb $1, %dil424; NDD-NEXT: cmovnel %esi, %edx, %eax425; NDD-NEXT: retq426 %1 = select i1 %cond, i32 %a, i32 %b427 ret i32 %1428}429 430define i32 @select_cmp_cmov_i32(i32 %a, i32 %b) {431; SDAG-X64-LABEL: select_cmp_cmov_i32:432; SDAG-X64: ## %bb.0:433; SDAG-X64-NEXT: movl %esi, %eax434; SDAG-X64-NEXT: cmpl %esi, %edi435; SDAG-X64-NEXT: cmovbl %edi, %eax436; SDAG-X64-NEXT: retq437;438; FAST-X64-LABEL: select_cmp_cmov_i32:439; FAST-X64: ## %bb.0:440; FAST-X64-NEXT: movl %esi, %eax441; FAST-X64-NEXT: cmpl %esi, %edi442; FAST-X64-NEXT: cmovbl %edi, %eax443; FAST-X64-NEXT: retq444;445; GISEL-X64-LABEL: select_cmp_cmov_i32:446; GISEL-X64: ## %bb.0:447; GISEL-X64-NEXT: movl %edi, %eax448; GISEL-X64-NEXT: xorl %ecx, %ecx449; GISEL-X64-NEXT: cmpl %esi, %edi450; GISEL-X64-NEXT: setb %cl451; GISEL-X64-NEXT: andl $1, %ecx452; GISEL-X64-NEXT: cmovel %esi, %eax453; GISEL-X64-NEXT: retq454;455; SDAG-X86-LABEL: select_cmp_cmov_i32:456; SDAG-X86: ## %bb.0:457; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx458; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax459; SDAG-X86-NEXT: cmpl %ecx, %eax460; SDAG-X86-NEXT: jb LBB4_2461; SDAG-X86-NEXT: ## %bb.1:462; SDAG-X86-NEXT: movl %ecx, %eax463; SDAG-X86-NEXT: LBB4_2:464; SDAG-X86-NEXT: retl465;466; SDAG-X86-CMOV-LABEL: select_cmp_cmov_i32:467; SDAG-X86-CMOV: ## %bb.0:468; SDAG-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax469; SDAG-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx470; SDAG-X86-CMOV-NEXT: cmpl %eax, %ecx471; SDAG-X86-CMOV-NEXT: cmovbl %ecx, %eax472; SDAG-X86-CMOV-NEXT: retl473;474; FAST-X86-LABEL: select_cmp_cmov_i32:475; FAST-X86: ## %bb.0:476; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx477; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %eax478; FAST-X86-NEXT: cmpl %ecx, %eax479; FAST-X86-NEXT: jb LBB4_2480; FAST-X86-NEXT: ## %bb.1:481; FAST-X86-NEXT: movl %ecx, %eax482; FAST-X86-NEXT: LBB4_2:483; FAST-X86-NEXT: retl484;485; FAST-X86-CMOV-LABEL: select_cmp_cmov_i32:486; FAST-X86-CMOV: ## %bb.0:487; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax488; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx489; FAST-X86-CMOV-NEXT: cmpl %eax, %ecx490; FAST-X86-CMOV-NEXT: cmovbl %ecx, %eax491; FAST-X86-CMOV-NEXT: retl492;493; GISEL-X86-LABEL: select_cmp_cmov_i32:494; GISEL-X86: ## %bb.0:495; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx496; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax497; GISEL-X86-NEXT: xorl %edx, %edx498; GISEL-X86-NEXT: cmpl %eax, %ecx499; GISEL-X86-NEXT: setb %dl500; GISEL-X86-NEXT: andl $1, %edx501; GISEL-X86-NEXT: je LBB4_2502; GISEL-X86-NEXT: ## %bb.1:503; GISEL-X86-NEXT: movl %ecx, %eax504; GISEL-X86-NEXT: LBB4_2:505; GISEL-X86-NEXT: retl506;507; GISEL-X86-CMOV-LABEL: select_cmp_cmov_i32:508; GISEL-X86-CMOV: ## %bb.0:509; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax510; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx511; GISEL-X86-CMOV-NEXT: xorl %edx, %edx512; GISEL-X86-CMOV-NEXT: cmpl %ecx, %eax513; GISEL-X86-CMOV-NEXT: setb %dl514; GISEL-X86-CMOV-NEXT: andl $1, %edx515; GISEL-X86-CMOV-NEXT: cmovel %ecx, %eax516; GISEL-X86-CMOV-NEXT: retl517;518; NDD-LABEL: select_cmp_cmov_i32:519; NDD: ## %bb.0:520; NDD-NEXT: cmpl %esi, %edi521; NDD-NEXT: cmovbl %edi, %esi, %eax522; NDD-NEXT: retq523 %1 = icmp ult i32 %a, %b524 %2 = select i1 %1, i32 %a, i32 %b525 ret i32 %2526}527 528define i64 @select_cmov_i64(i1 zeroext %cond, i64 %a, i64 %b) {529; SDAG-X64-LABEL: select_cmov_i64:530; SDAG-X64: ## %bb.0:531; SDAG-X64-NEXT: movq %rsi, %rax532; SDAG-X64-NEXT: testl %edi, %edi533; SDAG-X64-NEXT: cmoveq %rdx, %rax534; SDAG-X64-NEXT: retq535;536; FAST-X64-LABEL: select_cmov_i64:537; FAST-X64: ## %bb.0:538; FAST-X64-NEXT: movq %rsi, %rax539; FAST-X64-NEXT: testb $1, %dil540; FAST-X64-NEXT: cmoveq %rdx, %rax541; FAST-X64-NEXT: retq542;543; GISEL-X64-LABEL: select_cmov_i64:544; GISEL-X64: ## %bb.0:545; GISEL-X64-NEXT: movq %rdx, %rax546; GISEL-X64-NEXT: testl %edi, %edi547; GISEL-X64-NEXT: cmovneq %rsi, %rax548; GISEL-X64-NEXT: retq549;550; SDAG-X86-LABEL: select_cmov_i64:551; SDAG-X86: ## %bb.0:552; SDAG-X86-NEXT: cmpb $0, {{[0-9]+}}(%esp)553; SDAG-X86-NEXT: jne LBB5_1554; SDAG-X86-NEXT: ## %bb.2:555; SDAG-X86-NEXT: leal {{[0-9]+}}(%esp), %ecx556; SDAG-X86-NEXT: jmp LBB5_3557; SDAG-X86-NEXT: LBB5_1:558; SDAG-X86-NEXT: leal {{[0-9]+}}(%esp), %ecx559; SDAG-X86-NEXT: LBB5_3:560; SDAG-X86-NEXT: movl (%ecx), %eax561; SDAG-X86-NEXT: movl 4(%ecx), %edx562; SDAG-X86-NEXT: retl563;564; SDAG-X86-CMOV-LABEL: select_cmov_i64:565; SDAG-X86-CMOV: ## %bb.0:566; SDAG-X86-CMOV-NEXT: cmpb $0, {{[0-9]+}}(%esp)567; SDAG-X86-CMOV-NEXT: leal {{[0-9]+}}(%esp), %eax568; SDAG-X86-CMOV-NEXT: leal {{[0-9]+}}(%esp), %ecx569; SDAG-X86-CMOV-NEXT: cmovnel %eax, %ecx570; SDAG-X86-CMOV-NEXT: movl (%ecx), %eax571; SDAG-X86-CMOV-NEXT: movl 4(%ecx), %edx572; SDAG-X86-CMOV-NEXT: retl573;574; FAST-X86-LABEL: select_cmov_i64:575; FAST-X86: ## %bb.0:576; FAST-X86-NEXT: cmpb $0, {{[0-9]+}}(%esp)577; FAST-X86-NEXT: jne LBB5_1578; FAST-X86-NEXT: ## %bb.2:579; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %edx580; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %eax581; FAST-X86-NEXT: retl582; FAST-X86-NEXT: LBB5_1:583; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %edx584; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %eax585; FAST-X86-NEXT: retl586;587; FAST-X86-CMOV-LABEL: select_cmov_i64:588; FAST-X86-CMOV: ## %bb.0:589; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx590; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax591; FAST-X86-CMOV-NEXT: cmpb $0, {{[0-9]+}}(%esp)592; FAST-X86-CMOV-NEXT: cmovel {{[0-9]+}}(%esp), %eax593; FAST-X86-CMOV-NEXT: cmovel {{[0-9]+}}(%esp), %edx594; FAST-X86-CMOV-NEXT: retl595;596; GISEL-X86-LABEL: select_cmov_i64:597; GISEL-X86: ## %bb.0:598; GISEL-X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx599; GISEL-X86-NEXT: testl %ecx, %ecx600; GISEL-X86-NEXT: je LBB5_1601; GISEL-X86-NEXT: ## %bb.2:602; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax603; GISEL-X86-NEXT: testl %ecx, %ecx604; GISEL-X86-NEXT: jne LBB5_5605; GISEL-X86-NEXT: LBB5_4:606; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edx607; GISEL-X86-NEXT: retl608; GISEL-X86-NEXT: LBB5_1:609; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax610; GISEL-X86-NEXT: testl %ecx, %ecx611; GISEL-X86-NEXT: je LBB5_4612; GISEL-X86-NEXT: LBB5_5:613; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edx614; GISEL-X86-NEXT: retl615;616; GISEL-X86-CMOV-LABEL: select_cmov_i64:617; GISEL-X86-CMOV: ## %bb.0:618; GISEL-X86-CMOV-NEXT: movzbl {{[0-9]+}}(%esp), %ecx619; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax620; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx621; GISEL-X86-CMOV-NEXT: testl %ecx, %ecx622; GISEL-X86-CMOV-NEXT: cmovnel {{[0-9]+}}(%esp), %eax623; GISEL-X86-CMOV-NEXT: cmovnel {{[0-9]+}}(%esp), %edx624; GISEL-X86-CMOV-NEXT: retl625;626; NDD-LABEL: select_cmov_i64:627; NDD: ## %bb.0:628; NDD-NEXT: testb $1, %dil629; NDD-NEXT: cmovneq %rsi, %rdx, %rax630; NDD-NEXT: retq631 %1 = select i1 %cond, i64 %a, i64 %b632 ret i64 %1633}634 635define i64 @select_cmp_cmov_i64(i64 %a, i64 %b) nounwind {636; SDAG-X64-LABEL: select_cmp_cmov_i64:637; SDAG-X64: ## %bb.0:638; SDAG-X64-NEXT: movq %rsi, %rax639; SDAG-X64-NEXT: cmpq %rsi, %rdi640; SDAG-X64-NEXT: cmovbq %rdi, %rax641; SDAG-X64-NEXT: retq642;643; FAST-X64-LABEL: select_cmp_cmov_i64:644; FAST-X64: ## %bb.0:645; FAST-X64-NEXT: movq %rsi, %rax646; FAST-X64-NEXT: cmpq %rsi, %rdi647; FAST-X64-NEXT: cmovbq %rdi, %rax648; FAST-X64-NEXT: retq649;650; GISEL-X64-LABEL: select_cmp_cmov_i64:651; GISEL-X64: ## %bb.0:652; GISEL-X64-NEXT: movq %rdi, %rax653; GISEL-X64-NEXT: xorl %ecx, %ecx654; GISEL-X64-NEXT: cmpq %rsi, %rdi655; GISEL-X64-NEXT: setb %cl656; GISEL-X64-NEXT: andl $1, %ecx657; GISEL-X64-NEXT: cmoveq %rsi, %rax658; GISEL-X64-NEXT: retq659;660; SDAG-X86-LABEL: select_cmp_cmov_i64:661; SDAG-X86: ## %bb.0:662; SDAG-X86-NEXT: pushl %edi663; SDAG-X86-NEXT: pushl %esi664; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx665; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %esi666; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax667; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %edx668; SDAG-X86-NEXT: cmpl %ecx, %eax669; SDAG-X86-NEXT: movl %edx, %edi670; SDAG-X86-NEXT: sbbl %esi, %edi671; SDAG-X86-NEXT: jb LBB6_2672; SDAG-X86-NEXT: ## %bb.1:673; SDAG-X86-NEXT: movl %ecx, %eax674; SDAG-X86-NEXT: movl %esi, %edx675; SDAG-X86-NEXT: LBB6_2:676; SDAG-X86-NEXT: popl %esi677; SDAG-X86-NEXT: popl %edi678; SDAG-X86-NEXT: retl679;680; SDAG-X86-CMOV-LABEL: select_cmp_cmov_i64:681; SDAG-X86-CMOV: ## %bb.0:682; SDAG-X86-CMOV-NEXT: pushl %edi683; SDAG-X86-CMOV-NEXT: pushl %esi684; SDAG-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax685; SDAG-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx686; SDAG-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx687; SDAG-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %esi688; SDAG-X86-CMOV-NEXT: cmpl %eax, %ecx689; SDAG-X86-CMOV-NEXT: movl %esi, %edi690; SDAG-X86-CMOV-NEXT: sbbl %edx, %edi691; SDAG-X86-CMOV-NEXT: cmovbl %ecx, %eax692; SDAG-X86-CMOV-NEXT: cmovbl %esi, %edx693; SDAG-X86-CMOV-NEXT: popl %esi694; SDAG-X86-CMOV-NEXT: popl %edi695; SDAG-X86-CMOV-NEXT: retl696;697; FAST-X86-LABEL: select_cmp_cmov_i64:698; FAST-X86: ## %bb.0:699; FAST-X86-NEXT: pushl %edi700; FAST-X86-NEXT: pushl %esi701; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx702; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %esi703; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %edx704; FAST-X86-NEXT: movl {{[0-9]+}}(%esp), %eax705; FAST-X86-NEXT: cmpl %esi, %eax706; FAST-X86-NEXT: movl %edx, %edi707; FAST-X86-NEXT: sbbl %ecx, %edi708; FAST-X86-NEXT: jb LBB6_2709; FAST-X86-NEXT: ## %bb.1:710; FAST-X86-NEXT: movl %esi, %eax711; FAST-X86-NEXT: movl %ecx, %edx712; FAST-X86-NEXT: LBB6_2:713; FAST-X86-NEXT: popl %esi714; FAST-X86-NEXT: popl %edi715; FAST-X86-NEXT: retl716;717; FAST-X86-CMOV-LABEL: select_cmp_cmov_i64:718; FAST-X86-CMOV: ## %bb.0:719; FAST-X86-CMOV-NEXT: pushl %edi720; FAST-X86-CMOV-NEXT: pushl %esi721; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx722; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax723; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx724; FAST-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %esi725; FAST-X86-CMOV-NEXT: cmpl %eax, %esi726; FAST-X86-CMOV-NEXT: movl %ecx, %edi727; FAST-X86-CMOV-NEXT: sbbl %edx, %edi728; FAST-X86-CMOV-NEXT: cmovbl %esi, %eax729; FAST-X86-CMOV-NEXT: cmovbl %ecx, %edx730; FAST-X86-CMOV-NEXT: popl %esi731; FAST-X86-CMOV-NEXT: popl %edi732; FAST-X86-CMOV-NEXT: retl733;734; GISEL-X86-LABEL: select_cmp_cmov_i64:735; GISEL-X86: ## %bb.0:736; GISEL-X86-NEXT: pushl %ebp737; GISEL-X86-NEXT: pushl %ebx738; GISEL-X86-NEXT: pushl %edi739; GISEL-X86-NEXT: pushl %esi740; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %esi741; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %ebp742; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax743; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edx744; GISEL-X86-NEXT: cmpl %eax, %esi745; GISEL-X86-NEXT: setb %bl746; GISEL-X86-NEXT: xorl %ecx, %ecx747; GISEL-X86-NEXT: cmpl %edx, %ebp748; GISEL-X86-NEXT: setb %bh749; GISEL-X86-NEXT: sete %cl750; GISEL-X86-NEXT: testl %ecx, %ecx751; GISEL-X86-NEXT: je LBB6_2752; GISEL-X86-NEXT: ## %bb.1:753; GISEL-X86-NEXT: movb %bl, %bh754; GISEL-X86-NEXT: LBB6_2:755; GISEL-X86-NEXT: movzbl %bh, %edi756; GISEL-X86-NEXT: andl $1, %edi757; GISEL-X86-NEXT: je LBB6_4758; GISEL-X86-NEXT: ## %bb.3:759; GISEL-X86-NEXT: movl %esi, %eax760; GISEL-X86-NEXT: LBB6_4:761; GISEL-X86-NEXT: testl %edi, %edi762; GISEL-X86-NEXT: je LBB6_6763; GISEL-X86-NEXT: ## %bb.5:764; GISEL-X86-NEXT: movl %ebp, %edx765; GISEL-X86-NEXT: LBB6_6:766; GISEL-X86-NEXT: popl %esi767; GISEL-X86-NEXT: popl %edi768; GISEL-X86-NEXT: popl %ebx769; GISEL-X86-NEXT: popl %ebp770; GISEL-X86-NEXT: retl771;772; GISEL-X86-CMOV-LABEL: select_cmp_cmov_i64:773; GISEL-X86-CMOV: ## %bb.0:774; GISEL-X86-CMOV-NEXT: pushl %ebp775; GISEL-X86-CMOV-NEXT: pushl %ebx776; GISEL-X86-CMOV-NEXT: pushl %edi777; GISEL-X86-CMOV-NEXT: pushl %esi778; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ebp779; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edx780; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %esi781; GISEL-X86-CMOV-NEXT: movl {{[0-9]+}}(%esp), %edi782; GISEL-X86-CMOV-NEXT: xorl %ecx, %ecx783; GISEL-X86-CMOV-NEXT: cmpl %esi, %ebp784; GISEL-X86-CMOV-NEXT: setb %cl785; GISEL-X86-CMOV-NEXT: xorl %ebx, %ebx786; GISEL-X86-CMOV-NEXT: xorl %eax, %eax787; GISEL-X86-CMOV-NEXT: cmpl %edi, %edx788; GISEL-X86-CMOV-NEXT: setb %bl789; GISEL-X86-CMOV-NEXT: sete %al790; GISEL-X86-CMOV-NEXT: testl %eax, %eax791; GISEL-X86-CMOV-NEXT: cmovnew %cx, %bx792; GISEL-X86-CMOV-NEXT: andl $1, %ebx793; GISEL-X86-CMOV-NEXT: cmovel %esi, %ebp794; GISEL-X86-CMOV-NEXT: cmovel %edi, %edx795; GISEL-X86-CMOV-NEXT: movl %ebp, %eax796; GISEL-X86-CMOV-NEXT: popl %esi797; GISEL-X86-CMOV-NEXT: popl %edi798; GISEL-X86-CMOV-NEXT: popl %ebx799; GISEL-X86-CMOV-NEXT: popl %ebp800; GISEL-X86-CMOV-NEXT: retl801;802; NDD-LABEL: select_cmp_cmov_i64:803; NDD: ## %bb.0:804; NDD-NEXT: cmpq %rsi, %rdi805; NDD-NEXT: cmovbq %rdi, %rsi, %rax806; NDD-NEXT: retq807 %1 = icmp ult i64 %a, %b808 %2 = select i1 %1, i64 %a, i64 %b809 ret i64 %2810}811 812