755 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefixes=X64,SSE3; RUN: llc < %s -mtriple=x86_64-linux -mattr=avx | FileCheck %s --check-prefixes=X64,AVX,AVX14; RUN: llc < %s -mtriple=x86_64-linux -mattr=avx2 | FileCheck %s --check-prefixes=X64,AVX,AVX25; RUN: llc < %s -mtriple=i686 -mattr=cmov | FileCheck %s --check-prefix=X866 7declare i8 @llvm.smin.i8(i8, i8)8declare i16 @llvm.smin.i16(i16, i16)9declare i24 @llvm.smin.i24(i24, i24)10declare i32 @llvm.smin.i32(i32, i32)11declare i64 @llvm.smin.i64(i64, i64)12declare i128 @llvm.smin.i128(i128, i128)13 14declare <1 x i32> @llvm.smin.v1i32(<1 x i32>, <1 x i32>)15declare <2 x i32> @llvm.smin.v2i32(<2 x i32>, <2 x i32>)16declare <3 x i32> @llvm.smin.v3i32(<3 x i32>, <3 x i32>)17declare <4 x i32> @llvm.smin.v4i32(<4 x i32>, <4 x i32>)18declare <8 x i32> @llvm.smin.v8i32(<8 x i32>, <8 x i32>)19 20declare <8 x i16> @llvm.smin.v8i16(<8 x i16>, <8 x i16>)21declare <16 x i8> @llvm.smin.v16i8(<16 x i8>, <16 x i8>)22 23define i8 @test_i8(i8 %a, i8 %b) nounwind {24; X64-LABEL: test_i8:25; X64: # %bb.0:26; X64-NEXT: movl %esi, %eax27; X64-NEXT: cmpb %al, %dil28; X64-NEXT: cmovll %edi, %eax29; X64-NEXT: # kill: def $al killed $al killed $eax30; X64-NEXT: retq31;32; X86-LABEL: test_i8:33; X86: # %bb.0:34; X86-NEXT: movl {{[0-9]+}}(%esp), %eax35; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx36; X86-NEXT: cmpb %al, %cl37; X86-NEXT: cmovll %ecx, %eax38; X86-NEXT: # kill: def $al killed $al killed $eax39; X86-NEXT: retl40 %r = call i8 @llvm.smin.i8(i8 %a, i8 %b)41 ret i8 %r42}43 44define i16 @test_i16(i16 %a, i16 %b) nounwind {45; X64-LABEL: test_i16:46; X64: # %bb.0:47; X64-NEXT: movl %esi, %eax48; X64-NEXT: cmpw %ax, %di49; X64-NEXT: cmovll %edi, %eax50; X64-NEXT: # kill: def $ax killed $ax killed $eax51; X64-NEXT: retq52;53; X86-LABEL: test_i16:54; X86: # %bb.0:55; X86-NEXT: movl {{[0-9]+}}(%esp), %eax56; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx57; X86-NEXT: cmpw %ax, %cx58; X86-NEXT: cmovll %ecx, %eax59; X86-NEXT: # kill: def $ax killed $ax killed $eax60; X86-NEXT: retl61 %r = call i16 @llvm.smin.i16(i16 %a, i16 %b)62 ret i16 %r63}64 65define i24 @test_i24(i24 %a, i24 %b) nounwind {66; X64-LABEL: test_i24:67; X64: # %bb.0:68; X64-NEXT: movl %edi, %eax69; X64-NEXT: shll $8, %esi70; X64-NEXT: sarl $8, %esi71; X64-NEXT: shll $8, %eax72; X64-NEXT: sarl $8, %eax73; X64-NEXT: cmpl %esi, %eax74; X64-NEXT: cmovgel %esi, %eax75; X64-NEXT: retq76;77; X86-LABEL: test_i24:78; X86: # %bb.0:79; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx80; X86-NEXT: shll $8, %ecx81; X86-NEXT: sarl $8, %ecx82; X86-NEXT: movl {{[0-9]+}}(%esp), %eax83; X86-NEXT: shll $8, %eax84; X86-NEXT: sarl $8, %eax85; X86-NEXT: cmpl %ecx, %eax86; X86-NEXT: cmovgel %ecx, %eax87; X86-NEXT: retl88 %r = call i24 @llvm.smin.i24(i24 %a, i24 %b)89 ret i24 %r90}91 92define i32 @test_i32(i32 %a, i32 %b) nounwind {93; X64-LABEL: test_i32:94; X64: # %bb.0:95; X64-NEXT: movl %esi, %eax96; X64-NEXT: cmpl %esi, %edi97; X64-NEXT: cmovll %edi, %eax98; X64-NEXT: retq99;100; X86-LABEL: test_i32:101; X86: # %bb.0:102; X86-NEXT: movl {{[0-9]+}}(%esp), %eax103; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx104; X86-NEXT: cmpl %eax, %ecx105; X86-NEXT: cmovll %ecx, %eax106; X86-NEXT: retl107 %r = call i32 @llvm.smin.i32(i32 %a, i32 %b)108 ret i32 %r109}110 111define i64 @test_i64(i64 %a, i64 %b) nounwind {112; X64-LABEL: test_i64:113; X64: # %bb.0:114; X64-NEXT: movq %rsi, %rax115; X64-NEXT: cmpq %rsi, %rdi116; X64-NEXT: cmovlq %rdi, %rax117; X64-NEXT: retq118;119; X86-LABEL: test_i64:120; X86: # %bb.0:121; X86-NEXT: pushl %edi122; X86-NEXT: pushl %esi123; X86-NEXT: movl {{[0-9]+}}(%esp), %eax124; X86-NEXT: movl {{[0-9]+}}(%esp), %edx125; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx126; X86-NEXT: movl {{[0-9]+}}(%esp), %esi127; X86-NEXT: cmpl %eax, %ecx128; X86-NEXT: movl %esi, %edi129; X86-NEXT: sbbl %edx, %edi130; X86-NEXT: cmovll %ecx, %eax131; X86-NEXT: cmovll %esi, %edx132; X86-NEXT: popl %esi133; X86-NEXT: popl %edi134; X86-NEXT: retl135 %r = call i64 @llvm.smin.i64(i64 %a, i64 %b)136 ret i64 %r137}138 139define i128 @test_i128(i128 %a, i128 %b) nounwind {140; X64-LABEL: test_i128:141; X64: # %bb.0:142; X64-NEXT: movq %rdx, %rax143; X64-NEXT: cmpq %rdx, %rdi144; X64-NEXT: movq %rsi, %rdx145; X64-NEXT: sbbq %rcx, %rdx146; X64-NEXT: cmovlq %rdi, %rax147; X64-NEXT: cmovlq %rsi, %rcx148; X64-NEXT: movq %rcx, %rdx149; X64-NEXT: retq150;151; X86-LABEL: test_i128:152; X86: # %bb.0:153; X86-NEXT: pushl %ebp154; X86-NEXT: movl %esp, %ebp155; X86-NEXT: pushl %ebx156; X86-NEXT: pushl %edi157; X86-NEXT: pushl %esi158; X86-NEXT: andl $-16, %esp159; X86-NEXT: subl $16, %esp160; X86-NEXT: movl 40(%ebp), %ecx161; X86-NEXT: movl 44(%ebp), %edx162; X86-NEXT: movl 28(%ebp), %esi163; X86-NEXT: cmpl %ecx, 24(%ebp)164; X86-NEXT: sbbl %edx, %esi165; X86-NEXT: movl 48(%ebp), %esi166; X86-NEXT: movl 32(%ebp), %ebx167; X86-NEXT: sbbl %esi, %ebx168; X86-NEXT: movl 52(%ebp), %ebx169; X86-NEXT: movl 36(%ebp), %edi170; X86-NEXT: movl %edi, %eax171; X86-NEXT: sbbl %ebx, %eax172; X86-NEXT: cmovll 24(%ebp), %ecx173; X86-NEXT: cmovll 28(%ebp), %edx174; X86-NEXT: cmovll 32(%ebp), %esi175; X86-NEXT: cmovll %edi, %ebx176; X86-NEXT: movl 8(%ebp), %eax177; X86-NEXT: movl %ebx, 12(%eax)178; X86-NEXT: movl %esi, 8(%eax)179; X86-NEXT: movl %edx, 4(%eax)180; X86-NEXT: movl %ecx, (%eax)181; X86-NEXT: leal -12(%ebp), %esp182; X86-NEXT: popl %esi183; X86-NEXT: popl %edi184; X86-NEXT: popl %ebx185; X86-NEXT: popl %ebp186; X86-NEXT: retl $4187 %r = call i128 @llvm.smin.i128(i128 %a, i128 %b)188 ret i128 %r189}190 191define <1 x i32> @test_v1i32(<1 x i32> %a, <1 x i32> %b) nounwind {192; X64-LABEL: test_v1i32:193; X64: # %bb.0:194; X64-NEXT: movl %esi, %eax195; X64-NEXT: cmpl %esi, %edi196; X64-NEXT: cmovll %edi, %eax197; X64-NEXT: retq198;199; X86-LABEL: test_v1i32:200; X86: # %bb.0:201; X86-NEXT: movl {{[0-9]+}}(%esp), %eax202; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx203; X86-NEXT: cmpl %eax, %ecx204; X86-NEXT: cmovll %ecx, %eax205; X86-NEXT: retl206 %r = call <1 x i32> @llvm.smin.v1i32(<1 x i32> %a, <1 x i32> %b)207 ret <1 x i32> %r208}209 210define <2 x i32> @test_v2i32(<2 x i32> %a, <2 x i32> %b) nounwind {211; SSE-LABEL: test_v2i32:212; SSE: # %bb.0:213; SSE-NEXT: movdqa %xmm1, %xmm2214; SSE-NEXT: pcmpgtd %xmm0, %xmm2215; SSE-NEXT: pand %xmm2, %xmm0216; SSE-NEXT: pandn %xmm1, %xmm2217; SSE-NEXT: por %xmm2, %xmm0218; SSE-NEXT: retq219;220; AVX-LABEL: test_v2i32:221; AVX: # %bb.0:222; AVX-NEXT: vpminsd %xmm1, %xmm0, %xmm0223; AVX-NEXT: retq224;225; X86-LABEL: test_v2i32:226; X86: # %bb.0:227; X86-NEXT: pushl %esi228; X86-NEXT: movl {{[0-9]+}}(%esp), %edx229; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx230; X86-NEXT: movl {{[0-9]+}}(%esp), %eax231; X86-NEXT: movl {{[0-9]+}}(%esp), %esi232; X86-NEXT: cmpl %eax, %esi233; X86-NEXT: cmovll %esi, %eax234; X86-NEXT: cmpl %edx, %ecx235; X86-NEXT: cmovll %ecx, %edx236; X86-NEXT: popl %esi237; X86-NEXT: retl238 %r = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %a, <2 x i32> %b)239 ret <2 x i32> %r240}241 242define <3 x i32> @test_v3i32(<3 x i32> %a, <3 x i32> %b) nounwind {243; SSE-LABEL: test_v3i32:244; SSE: # %bb.0:245; SSE-NEXT: movdqa %xmm1, %xmm2246; SSE-NEXT: pcmpgtd %xmm0, %xmm2247; SSE-NEXT: pand %xmm2, %xmm0248; SSE-NEXT: pandn %xmm1, %xmm2249; SSE-NEXT: por %xmm2, %xmm0250; SSE-NEXT: retq251;252; AVX-LABEL: test_v3i32:253; AVX: # %bb.0:254; AVX-NEXT: vpminsd %xmm1, %xmm0, %xmm0255; AVX-NEXT: retq256;257; X86-LABEL: test_v3i32:258; X86: # %bb.0:259; X86-NEXT: pushl %ebx260; X86-NEXT: pushl %edi261; X86-NEXT: pushl %esi262; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx263; X86-NEXT: movl {{[0-9]+}}(%esp), %esi264; X86-NEXT: movl {{[0-9]+}}(%esp), %edx265; X86-NEXT: movl {{[0-9]+}}(%esp), %edi266; X86-NEXT: movl {{[0-9]+}}(%esp), %eax267; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx268; X86-NEXT: cmpl %eax, %ebx269; X86-NEXT: cmovll %ebx, %eax270; X86-NEXT: cmpl %edx, %edi271; X86-NEXT: cmovll %edi, %edx272; X86-NEXT: cmpl %ecx, %esi273; X86-NEXT: cmovll %esi, %ecx274; X86-NEXT: popl %esi275; X86-NEXT: popl %edi276; X86-NEXT: popl %ebx277; X86-NEXT: retl278 %r = call <3 x i32> @llvm.smin.v3i32(<3 x i32> %a, <3 x i32> %b)279 ret <3 x i32> %r280}281 282define <4 x i32> @test_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {283; SSE-LABEL: test_v4i32:284; SSE: # %bb.0:285; SSE-NEXT: movdqa %xmm1, %xmm2286; SSE-NEXT: pcmpgtd %xmm0, %xmm2287; SSE-NEXT: pand %xmm2, %xmm0288; SSE-NEXT: pandn %xmm1, %xmm2289; SSE-NEXT: por %xmm2, %xmm0290; SSE-NEXT: retq291;292; AVX-LABEL: test_v4i32:293; AVX: # %bb.0:294; AVX-NEXT: vpminsd %xmm1, %xmm0, %xmm0295; AVX-NEXT: retq296;297; X86-LABEL: test_v4i32:298; X86: # %bb.0:299; X86-NEXT: pushl %edi300; X86-NEXT: pushl %esi301; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx302; X86-NEXT: movl {{[0-9]+}}(%esp), %edx303; X86-NEXT: movl {{[0-9]+}}(%esp), %esi304; X86-NEXT: movl {{[0-9]+}}(%esp), %edi305; X86-NEXT: movl {{[0-9]+}}(%esp), %eax306; X86-NEXT: cmpl %edi, %eax307; X86-NEXT: cmovll %eax, %edi308; X86-NEXT: movl {{[0-9]+}}(%esp), %eax309; X86-NEXT: cmpl %esi, %eax310; X86-NEXT: cmovll %eax, %esi311; X86-NEXT: movl {{[0-9]+}}(%esp), %eax312; X86-NEXT: cmpl %edx, %eax313; X86-NEXT: cmovll %eax, %edx314; X86-NEXT: movl {{[0-9]+}}(%esp), %eax315; X86-NEXT: cmpl %ecx, %eax316; X86-NEXT: cmovll %eax, %ecx317; X86-NEXT: movl {{[0-9]+}}(%esp), %eax318; X86-NEXT: movl %ecx, 12(%eax)319; X86-NEXT: movl %edx, 8(%eax)320; X86-NEXT: movl %esi, 4(%eax)321; X86-NEXT: movl %edi, (%eax)322; X86-NEXT: popl %esi323; X86-NEXT: popl %edi324; X86-NEXT: retl $4325 %r = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %a, <4 x i32> %b)326 ret <4 x i32> %r327}328 329define <8 x i32> @test_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {330; SSE-LABEL: test_v8i32:331; SSE: # %bb.0:332; SSE-NEXT: movdqa %xmm2, %xmm4333; SSE-NEXT: pcmpgtd %xmm0, %xmm4334; SSE-NEXT: pand %xmm4, %xmm0335; SSE-NEXT: pandn %xmm2, %xmm4336; SSE-NEXT: por %xmm4, %xmm0337; SSE-NEXT: movdqa %xmm3, %xmm2338; SSE-NEXT: pcmpgtd %xmm1, %xmm2339; SSE-NEXT: pand %xmm2, %xmm1340; SSE-NEXT: pandn %xmm3, %xmm2341; SSE-NEXT: por %xmm2, %xmm1342; SSE-NEXT: retq343;344; AVX1-LABEL: test_v8i32:345; AVX1: # %bb.0:346; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2347; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3348; AVX1-NEXT: vpminsd %xmm2, %xmm3, %xmm2349; AVX1-NEXT: vpminsd %xmm1, %xmm0, %xmm0350; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0351; AVX1-NEXT: retq352;353; AVX2-LABEL: test_v8i32:354; AVX2: # %bb.0:355; AVX2-NEXT: vpminsd %ymm1, %ymm0, %ymm0356; AVX2-NEXT: retq357;358; X86-LABEL: test_v8i32:359; X86: # %bb.0:360; X86-NEXT: pushl %ebp361; X86-NEXT: pushl %ebx362; X86-NEXT: pushl %edi363; X86-NEXT: pushl %esi364; X86-NEXT: subl $8, %esp365; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx366; X86-NEXT: movl {{[0-9]+}}(%esp), %edx367; X86-NEXT: movl {{[0-9]+}}(%esp), %esi368; X86-NEXT: movl {{[0-9]+}}(%esp), %edi369; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx370; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp371; X86-NEXT: movl {{[0-9]+}}(%esp), %eax372; X86-NEXT: cmpl %ebp, %eax373; X86-NEXT: cmovll %eax, %ebp374; X86-NEXT: movl {{[0-9]+}}(%esp), %eax375; X86-NEXT: cmpl %ebx, %eax376; X86-NEXT: cmovll %eax, %ebx377; X86-NEXT: movl {{[0-9]+}}(%esp), %eax378; X86-NEXT: cmpl %edi, %eax379; X86-NEXT: cmovll %eax, %edi380; X86-NEXT: movl {{[0-9]+}}(%esp), %eax381; X86-NEXT: cmpl %esi, %eax382; X86-NEXT: cmovll %eax, %esi383; X86-NEXT: movl {{[0-9]+}}(%esp), %eax384; X86-NEXT: cmpl %edx, %eax385; X86-NEXT: cmovll %eax, %edx386; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill387; X86-NEXT: movl {{[0-9]+}}(%esp), %eax388; X86-NEXT: cmpl %ecx, %eax389; X86-NEXT: cmovll %eax, %ecx390; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill391; X86-NEXT: movl {{[0-9]+}}(%esp), %edx392; X86-NEXT: movl {{[0-9]+}}(%esp), %eax393; X86-NEXT: cmpl %edx, %eax394; X86-NEXT: cmovll %eax, %edx395; X86-NEXT: movl {{[0-9]+}}(%esp), %eax396; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx397; X86-NEXT: cmpl %eax, %ecx398; X86-NEXT: cmovll %ecx, %eax399; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx400; X86-NEXT: movl %eax, 28(%ecx)401; X86-NEXT: movl %edx, 24(%ecx)402; X86-NEXT: movl (%esp), %eax # 4-byte Reload403; X86-NEXT: movl %eax, 20(%ecx)404; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload405; X86-NEXT: movl %eax, 16(%ecx)406; X86-NEXT: movl %esi, 12(%ecx)407; X86-NEXT: movl %edi, 8(%ecx)408; X86-NEXT: movl %ebx, 4(%ecx)409; X86-NEXT: movl %ebp, (%ecx)410; X86-NEXT: movl %ecx, %eax411; X86-NEXT: addl $8, %esp412; X86-NEXT: popl %esi413; X86-NEXT: popl %edi414; X86-NEXT: popl %ebx415; X86-NEXT: popl %ebp416; X86-NEXT: retl $4417 %r = call <8 x i32> @llvm.smin.v8i32(<8 x i32> %a, <8 x i32> %b)418 ret <8 x i32> %r419}420 421define <8 x i16> @test_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {422; SSE-LABEL: test_v8i16:423; SSE: # %bb.0:424; SSE-NEXT: pminsw %xmm1, %xmm0425; SSE-NEXT: retq426;427; AVX-LABEL: test_v8i16:428; AVX: # %bb.0:429; AVX-NEXT: vpminsw %xmm1, %xmm0, %xmm0430; AVX-NEXT: retq431;432; X86-LABEL: test_v8i16:433; X86: # %bb.0:434; X86-NEXT: pushl %ebp435; X86-NEXT: pushl %ebx436; X86-NEXT: pushl %edi437; X86-NEXT: pushl %esi438; X86-NEXT: subl $8, %esp439; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx440; X86-NEXT: movl {{[0-9]+}}(%esp), %edx441; X86-NEXT: movl {{[0-9]+}}(%esp), %esi442; X86-NEXT: movl {{[0-9]+}}(%esp), %edi443; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx444; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp445; X86-NEXT: movl {{[0-9]+}}(%esp), %eax446; X86-NEXT: cmpw %bp, %ax447; X86-NEXT: cmovll %eax, %ebp448; X86-NEXT: movl {{[0-9]+}}(%esp), %eax449; X86-NEXT: cmpw %bx, %ax450; X86-NEXT: cmovll %eax, %ebx451; X86-NEXT: movl {{[0-9]+}}(%esp), %eax452; X86-NEXT: cmpw %di, %ax453; X86-NEXT: cmovll %eax, %edi454; X86-NEXT: movl {{[0-9]+}}(%esp), %eax455; X86-NEXT: cmpw %si, %ax456; X86-NEXT: cmovll %eax, %esi457; X86-NEXT: movl {{[0-9]+}}(%esp), %eax458; X86-NEXT: cmpw %dx, %ax459; X86-NEXT: cmovll %eax, %edx460; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill461; X86-NEXT: movl {{[0-9]+}}(%esp), %eax462; X86-NEXT: cmpw %cx, %ax463; X86-NEXT: cmovll %eax, %ecx464; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill465; X86-NEXT: movl {{[0-9]+}}(%esp), %edx466; X86-NEXT: movl {{[0-9]+}}(%esp), %eax467; X86-NEXT: cmpw %dx, %ax468; X86-NEXT: cmovll %eax, %edx469; X86-NEXT: movl {{[0-9]+}}(%esp), %eax470; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx471; X86-NEXT: cmpw %ax, %cx472; X86-NEXT: cmovll %ecx, %eax473; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx474; X86-NEXT: movw %ax, 14(%ecx)475; X86-NEXT: movw %dx, 12(%ecx)476; X86-NEXT: movl (%esp), %eax # 4-byte Reload477; X86-NEXT: movw %ax, 10(%ecx)478; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload479; X86-NEXT: movw %ax, 8(%ecx)480; X86-NEXT: movw %si, 6(%ecx)481; X86-NEXT: movw %di, 4(%ecx)482; X86-NEXT: movw %bx, 2(%ecx)483; X86-NEXT: movw %bp, (%ecx)484; X86-NEXT: movl %ecx, %eax485; X86-NEXT: addl $8, %esp486; X86-NEXT: popl %esi487; X86-NEXT: popl %edi488; X86-NEXT: popl %ebx489; X86-NEXT: popl %ebp490; X86-NEXT: retl $4491 %r = call <8 x i16> @llvm.smin.v8i16(<8 x i16> %a, <8 x i16> %b)492 ret <8 x i16> %r493}494 495define <16 x i8> @test_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {496; SSE-LABEL: test_v16i8:497; SSE: # %bb.0:498; SSE-NEXT: movdqa %xmm1, %xmm2499; SSE-NEXT: pcmpgtb %xmm0, %xmm2500; SSE-NEXT: pand %xmm2, %xmm0501; SSE-NEXT: pandn %xmm1, %xmm2502; SSE-NEXT: por %xmm2, %xmm0503; SSE-NEXT: retq504;505; AVX-LABEL: test_v16i8:506; AVX: # %bb.0:507; AVX-NEXT: vpminsb %xmm1, %xmm0, %xmm0508; AVX-NEXT: retq509;510; X86-LABEL: test_v16i8:511; X86: # %bb.0:512; X86-NEXT: pushl %ebp513; X86-NEXT: pushl %ebx514; X86-NEXT: pushl %edi515; X86-NEXT: pushl %esi516; X86-NEXT: subl $40, %esp517; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx518; X86-NEXT: movl {{[0-9]+}}(%esp), %edx519; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx520; X86-NEXT: movl {{[0-9]+}}(%esp), %eax521; X86-NEXT: cmpb %bl, %al522; X86-NEXT: cmovll %eax, %ebx523; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill524; X86-NEXT: movl {{[0-9]+}}(%esp), %eax525; X86-NEXT: cmpb %dl, %al526; X86-NEXT: cmovll %eax, %edx527; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill528; X86-NEXT: movl {{[0-9]+}}(%esp), %eax529; X86-NEXT: cmpb %cl, %al530; X86-NEXT: cmovll %eax, %ecx531; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill532; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx533; X86-NEXT: movl {{[0-9]+}}(%esp), %eax534; X86-NEXT: cmpb %cl, %al535; X86-NEXT: cmovll %eax, %ecx536; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill537; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx538; X86-NEXT: movl {{[0-9]+}}(%esp), %eax539; X86-NEXT: cmpb %cl, %al540; X86-NEXT: cmovll %eax, %ecx541; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill542; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx543; X86-NEXT: movl {{[0-9]+}}(%esp), %eax544; X86-NEXT: cmpb %cl, %al545; X86-NEXT: cmovll %eax, %ecx546; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill547; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx548; X86-NEXT: movl {{[0-9]+}}(%esp), %eax549; X86-NEXT: cmpb %cl, %al550; X86-NEXT: cmovll %eax, %ecx551; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill552; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx553; X86-NEXT: movl {{[0-9]+}}(%esp), %eax554; X86-NEXT: cmpb %cl, %al555; X86-NEXT: cmovll %eax, %ecx556; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill557; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx558; X86-NEXT: movl {{[0-9]+}}(%esp), %eax559; X86-NEXT: cmpb %cl, %al560; X86-NEXT: cmovll %eax, %ecx561; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill562; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx563; X86-NEXT: movl {{[0-9]+}}(%esp), %eax564; X86-NEXT: cmpb %cl, %al565; X86-NEXT: cmovll %eax, %ecx566; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill567; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx568; X86-NEXT: movl {{[0-9]+}}(%esp), %eax569; X86-NEXT: cmpb %cl, %al570; X86-NEXT: cmovll %eax, %ecx571; X86-NEXT: movl %ecx, %ebp572; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx573; X86-NEXT: movl {{[0-9]+}}(%esp), %eax574; X86-NEXT: cmpb %cl, %al575; X86-NEXT: cmovll %eax, %ecx576; X86-NEXT: movl %ecx, %edi577; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx578; X86-NEXT: movl {{[0-9]+}}(%esp), %eax579; X86-NEXT: cmpb %cl, %al580; X86-NEXT: cmovll %eax, %ecx581; X86-NEXT: movl %ecx, %esi582; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx583; X86-NEXT: movl {{[0-9]+}}(%esp), %eax584; X86-NEXT: cmpb %bl, %al585; X86-NEXT: cmovll %eax, %ebx586; X86-NEXT: movl {{[0-9]+}}(%esp), %edx587; X86-NEXT: movl {{[0-9]+}}(%esp), %eax588; X86-NEXT: cmpb %dl, %al589; X86-NEXT: cmovll %eax, %edx590; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx591; X86-NEXT: movl {{[0-9]+}}(%esp), %eax592; X86-NEXT: cmpb %cl, %al593; X86-NEXT: cmovll %eax, %ecx594; X86-NEXT: movl {{[0-9]+}}(%esp), %eax595; X86-NEXT: movb %cl, 15(%eax)596; X86-NEXT: movb %dl, 14(%eax)597; X86-NEXT: movb %bl, 13(%eax)598; X86-NEXT: movl %esi, %ecx599; X86-NEXT: movb %cl, 12(%eax)600; X86-NEXT: movl %edi, %ecx601; X86-NEXT: movb %cl, 11(%eax)602; X86-NEXT: movl %ebp, %ecx603; X86-NEXT: movb %cl, 10(%eax)604; X86-NEXT: movl (%esp), %ecx # 4-byte Reload605; X86-NEXT: movb %cl, 9(%eax)606; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload607; X86-NEXT: movb %cl, 8(%eax)608; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload609; X86-NEXT: movb %cl, 7(%eax)610; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload611; X86-NEXT: movb %cl, 6(%eax)612; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload613; X86-NEXT: movb %cl, 5(%eax)614; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload615; X86-NEXT: movb %cl, 4(%eax)616; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload617; X86-NEXT: movb %cl, 3(%eax)618; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload619; X86-NEXT: movb %cl, 2(%eax)620; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload621; X86-NEXT: movb %cl, 1(%eax)622; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload623; X86-NEXT: movb %cl, (%eax)624; X86-NEXT: addl $40, %esp625; X86-NEXT: popl %esi626; X86-NEXT: popl %edi627; X86-NEXT: popl %ebx628; X86-NEXT: popl %ebp629; X86-NEXT: retl $4630 %r = call <16 x i8> @llvm.smin.v16i8(<16 x i8> %a, <16 x i8> %b)631 ret <16 x i8> %r632}633 634define i16 @test_signbits_i16(i16 %a, i16 %b) nounwind {635; X64-LABEL: test_signbits_i16:636; X64: # %bb.0:637; X64-NEXT: movswl %si, %eax638; X64-NEXT: movswl %di, %ecx639; X64-NEXT: shrl $15, %ecx640; X64-NEXT: shrl $8, %eax641; X64-NEXT: cmpw %ax, %cx642; X64-NEXT: cmovll %ecx, %eax643; X64-NEXT: # kill: def $ax killed $ax killed $eax644; X64-NEXT: retq645;646; X86-LABEL: test_signbits_i16:647; X86: # %bb.0:648; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax649; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx650; X86-NEXT: shrl $15, %ecx651; X86-NEXT: cmpw %ax, %cx652; X86-NEXT: cmovll %ecx, %eax653; X86-NEXT: # kill: def $ax killed $ax killed $eax654; X86-NEXT: retl655 %ax = ashr i16 %a, 15656 %bx = ashr i16 %b, 8657 %r = call i16 @llvm.smin.i16(i16 %ax, i16 %bx)658 ret i16 %r659}660 661define i32 @test_signbits_i32(i32 %a, i32 %b) nounwind {662; X64-LABEL: test_signbits_i32:663; X64: # %bb.0:664; X64-NEXT: movl %esi, %eax665; X64-NEXT: sarl $16, %edi666; X64-NEXT: sarl $17, %eax667; X64-NEXT: cmpl %eax, %edi668; X64-NEXT: cmovll %edi, %eax669; X64-NEXT: retq670;671; X86-LABEL: test_signbits_i32:672; X86: # %bb.0:673; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx674; X86-NEXT: movl {{[0-9]+}}(%esp), %eax675; X86-NEXT: sarl $17, %eax676; X86-NEXT: cmpl %eax, %ecx677; X86-NEXT: cmovll %ecx, %eax678; X86-NEXT: retl679 %ax = ashr i32 %a, 16680 %bx = ashr i32 %b, 17681 %r = call i32 @llvm.smin.i32(i32 %ax, i32 %bx)682 ret i32 %r683}684 685define i64 @test_signbits_i64(i64 %a, i64 %b) nounwind {686; X64-LABEL: test_signbits_i64:687; X64: # %bb.0:688; X64-NEXT: movq %rsi, %rax689; X64-NEXT: sarq $32, %rdi690; X64-NEXT: sarq $32, %rax691; X64-NEXT: cmpq %rax, %rdi692; X64-NEXT: cmovlq %rdi, %rax693; X64-NEXT: retq694;695; X86-LABEL: test_signbits_i64:696; X86: # %bb.0:697; X86-NEXT: movl {{[0-9]+}}(%esp), %eax698; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx699; X86-NEXT: cmpl %eax, %ecx700; X86-NEXT: cmovll %ecx, %eax701; X86-NEXT: movl %eax, %edx702; X86-NEXT: sarl $31, %edx703; X86-NEXT: retl704 %ax = ashr i64 %a, 32705 %bx = ashr i64 %b, 32706 %r = call i64 @llvm.smin.i64(i64 %ax, i64 %bx)707 ret i64 %r708}709 710define i128 @test_signbits_i128(i128 %a, i128 %b) nounwind {711; X64-LABEL: test_signbits_i128:712; X64: # %bb.0:713; X64-NEXT: movq %rcx, %rax714; X64-NEXT: sarq $28, %rax715; X64-NEXT: cmpq %rax, %rsi716; X64-NEXT: cmovlq %rsi, %rax717; X64-NEXT: movq %rax, %rdx718; X64-NEXT: sarq $63, %rdx719; X64-NEXT: retq720;721; X86-LABEL: test_signbits_i128:722; X86: # %bb.0:723; X86-NEXT: pushl %ebp724; X86-NEXT: movl %esp, %ebp725; X86-NEXT: pushl %edi726; X86-NEXT: pushl %esi727; X86-NEXT: andl $-16, %esp728; X86-NEXT: movl 32(%ebp), %esi729; X86-NEXT: movl 36(%ebp), %eax730; X86-NEXT: movl 48(%ebp), %ecx731; X86-NEXT: movl 52(%ebp), %edx732; X86-NEXT: shrdl $28, %edx, %ecx733; X86-NEXT: sarl $28, %edx734; X86-NEXT: cmpl %ecx, %esi735; X86-NEXT: movl %eax, %edi736; X86-NEXT: sbbl %edx, %edi737; X86-NEXT: cmovll %esi, %ecx738; X86-NEXT: cmovll %eax, %edx739; X86-NEXT: movl 8(%ebp), %eax740; X86-NEXT: movl %edx, 4(%eax)741; X86-NEXT: movl %ecx, (%eax)742; X86-NEXT: sarl $31, %edx743; X86-NEXT: movl %edx, 12(%eax)744; X86-NEXT: movl %edx, 8(%eax)745; X86-NEXT: leal -8(%ebp), %esp746; X86-NEXT: popl %esi747; X86-NEXT: popl %edi748; X86-NEXT: popl %ebp749; X86-NEXT: retl $4750 %ax = ashr i128 %a, 64751 %bx = ashr i128 %b, 92752 %r = call i128 @llvm.smin.i128(i128 %ax, i128 %bx)753 ret i128 %r754}755