764 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.umin.i8(i8, i8)8declare i16 @llvm.umin.i16(i16, i16)9declare i24 @llvm.umin.i24(i24, i24)10declare i32 @llvm.umin.i32(i32, i32)11declare i64 @llvm.umin.i64(i64, i64)12declare i128 @llvm.umin.i128(i128, i128)13 14declare <1 x i32> @llvm.umin.v1i32(<1 x i32>, <1 x i32>)15declare <2 x i32> @llvm.umin.v2i32(<2 x i32>, <2 x i32>)16declare <3 x i32> @llvm.umin.v3i32(<3 x i32>, <3 x i32>)17declare <4 x i32> @llvm.umin.v4i32(<4 x i32>, <4 x i32>)18declare <8 x i32> @llvm.umin.v8i32(<8 x i32>, <8 x i32>)19 20declare <8 x i16> @llvm.umin.v8i16(<8 x i16>, <8 x i16>)21declare <16 x i8> @llvm.umin.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: cmovbl %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: cmovbl %ecx, %eax38; X86-NEXT: # kill: def $al killed $al killed $eax39; X86-NEXT: retl40 %r = call i8 @llvm.umin.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: cmovbl %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: cmovbl %ecx, %eax59; X86-NEXT: # kill: def $ax killed $ax killed $eax60; X86-NEXT: retl61 %r = call i16 @llvm.umin.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: andl $16777215, %esi # imm = 0xFFFFFF70; X64-NEXT: andl $16777215, %eax # imm = 0xFFFFFF71; X64-NEXT: cmpl %esi, %eax72; X64-NEXT: cmovael %esi, %eax73; X64-NEXT: retq74;75; X86-LABEL: test_i24:76; X86: # %bb.0:77; X86-NEXT: movl $16777215, %eax # imm = 0xFFFFFF78; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx79; X86-NEXT: andl %eax, %ecx80; X86-NEXT: andl {{[0-9]+}}(%esp), %eax81; X86-NEXT: cmpl %ecx, %eax82; X86-NEXT: cmovael %ecx, %eax83; X86-NEXT: retl84 %r = call i24 @llvm.umin.i24(i24 %a, i24 %b)85 ret i24 %r86}87 88define i32 @test_i32(i32 %a, i32 %b) nounwind {89; X64-LABEL: test_i32:90; X64: # %bb.0:91; X64-NEXT: movl %esi, %eax92; X64-NEXT: cmpl %esi, %edi93; X64-NEXT: cmovbl %edi, %eax94; X64-NEXT: retq95;96; X86-LABEL: test_i32:97; X86: # %bb.0:98; X86-NEXT: movl {{[0-9]+}}(%esp), %eax99; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx100; X86-NEXT: cmpl %eax, %ecx101; X86-NEXT: cmovbl %ecx, %eax102; X86-NEXT: retl103 %r = call i32 @llvm.umin.i32(i32 %a, i32 %b)104 ret i32 %r105}106 107define i64 @test_i64(i64 %a, i64 %b) nounwind {108; X64-LABEL: test_i64:109; X64: # %bb.0:110; X64-NEXT: movq %rsi, %rax111; X64-NEXT: cmpq %rsi, %rdi112; X64-NEXT: cmovbq %rdi, %rax113; X64-NEXT: retq114;115; X86-LABEL: test_i64:116; X86: # %bb.0:117; X86-NEXT: pushl %edi118; X86-NEXT: pushl %esi119; X86-NEXT: movl {{[0-9]+}}(%esp), %eax120; X86-NEXT: movl {{[0-9]+}}(%esp), %edx121; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx122; X86-NEXT: movl {{[0-9]+}}(%esp), %esi123; X86-NEXT: cmpl %eax, %ecx124; X86-NEXT: movl %esi, %edi125; X86-NEXT: sbbl %edx, %edi126; X86-NEXT: cmovbl %ecx, %eax127; X86-NEXT: cmovbl %esi, %edx128; X86-NEXT: popl %esi129; X86-NEXT: popl %edi130; X86-NEXT: retl131 %r = call i64 @llvm.umin.i64(i64 %a, i64 %b)132 ret i64 %r133}134 135define i128 @test_i128(i128 %a, i128 %b) nounwind {136; X64-LABEL: test_i128:137; X64: # %bb.0:138; X64-NEXT: movq %rdx, %rax139; X64-NEXT: cmpq %rdx, %rdi140; X64-NEXT: movq %rsi, %rdx141; X64-NEXT: sbbq %rcx, %rdx142; X64-NEXT: cmovbq %rdi, %rax143; X64-NEXT: cmovbq %rsi, %rcx144; X64-NEXT: movq %rcx, %rdx145; X64-NEXT: retq146;147; X86-LABEL: test_i128:148; X86: # %bb.0:149; X86-NEXT: pushl %ebp150; X86-NEXT: movl %esp, %ebp151; X86-NEXT: pushl %ebx152; X86-NEXT: pushl %edi153; X86-NEXT: pushl %esi154; X86-NEXT: andl $-16, %esp155; X86-NEXT: subl $16, %esp156; X86-NEXT: movl 40(%ebp), %ecx157; X86-NEXT: movl 44(%ebp), %edx158; X86-NEXT: movl 28(%ebp), %esi159; X86-NEXT: cmpl %ecx, 24(%ebp)160; X86-NEXT: sbbl %edx, %esi161; X86-NEXT: movl 48(%ebp), %esi162; X86-NEXT: movl 32(%ebp), %ebx163; X86-NEXT: sbbl %esi, %ebx164; X86-NEXT: movl 52(%ebp), %ebx165; X86-NEXT: movl 36(%ebp), %edi166; X86-NEXT: movl %edi, %eax167; X86-NEXT: sbbl %ebx, %eax168; X86-NEXT: cmovbl 24(%ebp), %ecx169; X86-NEXT: cmovbl 28(%ebp), %edx170; X86-NEXT: cmovbl 32(%ebp), %esi171; X86-NEXT: cmovbl %edi, %ebx172; X86-NEXT: movl 8(%ebp), %eax173; X86-NEXT: movl %ebx, 12(%eax)174; X86-NEXT: movl %esi, 8(%eax)175; X86-NEXT: movl %edx, 4(%eax)176; X86-NEXT: movl %ecx, (%eax)177; X86-NEXT: leal -12(%ebp), %esp178; X86-NEXT: popl %esi179; X86-NEXT: popl %edi180; X86-NEXT: popl %ebx181; X86-NEXT: popl %ebp182; X86-NEXT: retl $4183 %r = call i128 @llvm.umin.i128(i128 %a, i128 %b)184 ret i128 %r185}186 187define <1 x i32> @test_v1i32(<1 x i32> %a, <1 x i32> %b) nounwind {188; X64-LABEL: test_v1i32:189; X64: # %bb.0:190; X64-NEXT: movl %esi, %eax191; X64-NEXT: cmpl %esi, %edi192; X64-NEXT: cmovbl %edi, %eax193; X64-NEXT: retq194;195; X86-LABEL: test_v1i32:196; X86: # %bb.0:197; X86-NEXT: movl {{[0-9]+}}(%esp), %eax198; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx199; X86-NEXT: cmpl %eax, %ecx200; X86-NEXT: cmovbl %ecx, %eax201; X86-NEXT: retl202 %r = call <1 x i32> @llvm.umin.v1i32(<1 x i32> %a, <1 x i32> %b)203 ret <1 x i32> %r204}205 206define <2 x i32> @test_v2i32(<2 x i32> %a, <2 x i32> %b) nounwind {207; SSE-LABEL: test_v2i32:208; SSE: # %bb.0:209; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]210; SSE-NEXT: movdqa %xmm0, %xmm3211; SSE-NEXT: pxor %xmm2, %xmm3212; SSE-NEXT: pxor %xmm1, %xmm2213; SSE-NEXT: pcmpgtd %xmm3, %xmm2214; SSE-NEXT: pand %xmm2, %xmm0215; SSE-NEXT: pandn %xmm1, %xmm2216; SSE-NEXT: por %xmm2, %xmm0217; SSE-NEXT: retq218;219; AVX-LABEL: test_v2i32:220; AVX: # %bb.0:221; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm0222; AVX-NEXT: retq223;224; X86-LABEL: test_v2i32:225; X86: # %bb.0:226; X86-NEXT: pushl %esi227; X86-NEXT: movl {{[0-9]+}}(%esp), %edx228; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx229; X86-NEXT: movl {{[0-9]+}}(%esp), %eax230; X86-NEXT: movl {{[0-9]+}}(%esp), %esi231; X86-NEXT: cmpl %eax, %esi232; X86-NEXT: cmovbl %esi, %eax233; X86-NEXT: cmpl %edx, %ecx234; X86-NEXT: cmovbl %ecx, %edx235; X86-NEXT: popl %esi236; X86-NEXT: retl237 %r = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %a, <2 x i32> %b)238 ret <2 x i32> %r239}240 241define <3 x i32> @test_v3i32(<3 x i32> %a, <3 x i32> %b) nounwind {242; SSE-LABEL: test_v3i32:243; SSE: # %bb.0:244; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]245; SSE-NEXT: movdqa %xmm0, %xmm3246; SSE-NEXT: pxor %xmm2, %xmm3247; SSE-NEXT: pxor %xmm1, %xmm2248; SSE-NEXT: pcmpgtd %xmm3, %xmm2249; SSE-NEXT: pand %xmm2, %xmm0250; SSE-NEXT: pandn %xmm1, %xmm2251; SSE-NEXT: por %xmm2, %xmm0252; SSE-NEXT: retq253;254; AVX-LABEL: test_v3i32:255; AVX: # %bb.0:256; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm0257; AVX-NEXT: retq258;259; X86-LABEL: test_v3i32:260; X86: # %bb.0:261; X86-NEXT: pushl %ebx262; X86-NEXT: pushl %edi263; X86-NEXT: pushl %esi264; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx265; X86-NEXT: movl {{[0-9]+}}(%esp), %esi266; X86-NEXT: movl {{[0-9]+}}(%esp), %edx267; X86-NEXT: movl {{[0-9]+}}(%esp), %edi268; X86-NEXT: movl {{[0-9]+}}(%esp), %eax269; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx270; X86-NEXT: cmpl %eax, %ebx271; X86-NEXT: cmovbl %ebx, %eax272; X86-NEXT: cmpl %edx, %edi273; X86-NEXT: cmovbl %edi, %edx274; X86-NEXT: cmpl %ecx, %esi275; X86-NEXT: cmovbl %esi, %ecx276; X86-NEXT: popl %esi277; X86-NEXT: popl %edi278; X86-NEXT: popl %ebx279; X86-NEXT: retl280 %r = call <3 x i32> @llvm.umin.v3i32(<3 x i32> %a, <3 x i32> %b)281 ret <3 x i32> %r282}283 284define <4 x i32> @test_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {285; SSE-LABEL: test_v4i32:286; SSE: # %bb.0:287; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]288; SSE-NEXT: movdqa %xmm0, %xmm3289; SSE-NEXT: pxor %xmm2, %xmm3290; SSE-NEXT: pxor %xmm1, %xmm2291; SSE-NEXT: pcmpgtd %xmm3, %xmm2292; SSE-NEXT: pand %xmm2, %xmm0293; SSE-NEXT: pandn %xmm1, %xmm2294; SSE-NEXT: por %xmm2, %xmm0295; SSE-NEXT: retq296;297; AVX-LABEL: test_v4i32:298; AVX: # %bb.0:299; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm0300; AVX-NEXT: retq301;302; X86-LABEL: test_v4i32:303; X86: # %bb.0:304; X86-NEXT: pushl %edi305; X86-NEXT: pushl %esi306; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx307; X86-NEXT: movl {{[0-9]+}}(%esp), %edx308; X86-NEXT: movl {{[0-9]+}}(%esp), %esi309; X86-NEXT: movl {{[0-9]+}}(%esp), %edi310; X86-NEXT: movl {{[0-9]+}}(%esp), %eax311; X86-NEXT: cmpl %edi, %eax312; X86-NEXT: cmovbl %eax, %edi313; X86-NEXT: movl {{[0-9]+}}(%esp), %eax314; X86-NEXT: cmpl %esi, %eax315; X86-NEXT: cmovbl %eax, %esi316; X86-NEXT: movl {{[0-9]+}}(%esp), %eax317; X86-NEXT: cmpl %edx, %eax318; X86-NEXT: cmovbl %eax, %edx319; X86-NEXT: movl {{[0-9]+}}(%esp), %eax320; X86-NEXT: cmpl %ecx, %eax321; X86-NEXT: cmovbl %eax, %ecx322; X86-NEXT: movl {{[0-9]+}}(%esp), %eax323; X86-NEXT: movl %ecx, 12(%eax)324; X86-NEXT: movl %edx, 8(%eax)325; X86-NEXT: movl %esi, 4(%eax)326; X86-NEXT: movl %edi, (%eax)327; X86-NEXT: popl %esi328; X86-NEXT: popl %edi329; X86-NEXT: retl $4330 %r = call <4 x i32> @llvm.umin.v4i32(<4 x i32> %a, <4 x i32> %b)331 ret <4 x i32> %r332}333 334define <8 x i32> @test_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {335; SSE-LABEL: test_v8i32:336; SSE: # %bb.0:337; SSE-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]338; SSE-NEXT: movdqa %xmm0, %xmm5339; SSE-NEXT: pxor %xmm4, %xmm5340; SSE-NEXT: movdqa %xmm2, %xmm6341; SSE-NEXT: pxor %xmm4, %xmm6342; SSE-NEXT: pcmpgtd %xmm5, %xmm6343; SSE-NEXT: pand %xmm6, %xmm0344; SSE-NEXT: pandn %xmm2, %xmm6345; SSE-NEXT: por %xmm6, %xmm0346; SSE-NEXT: movdqa %xmm1, %xmm2347; SSE-NEXT: pxor %xmm4, %xmm2348; SSE-NEXT: pxor %xmm3, %xmm4349; SSE-NEXT: pcmpgtd %xmm2, %xmm4350; SSE-NEXT: pand %xmm4, %xmm1351; SSE-NEXT: pandn %xmm3, %xmm4352; SSE-NEXT: por %xmm4, %xmm1353; SSE-NEXT: retq354;355; AVX1-LABEL: test_v8i32:356; AVX1: # %bb.0:357; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2358; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3359; AVX1-NEXT: vpminud %xmm2, %xmm3, %xmm2360; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0361; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0362; AVX1-NEXT: retq363;364; AVX2-LABEL: test_v8i32:365; AVX2: # %bb.0:366; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0367; AVX2-NEXT: retq368;369; X86-LABEL: test_v8i32:370; X86: # %bb.0:371; X86-NEXT: pushl %ebp372; X86-NEXT: pushl %ebx373; X86-NEXT: pushl %edi374; X86-NEXT: pushl %esi375; X86-NEXT: subl $8, %esp376; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx377; X86-NEXT: movl {{[0-9]+}}(%esp), %edx378; X86-NEXT: movl {{[0-9]+}}(%esp), %esi379; X86-NEXT: movl {{[0-9]+}}(%esp), %edi380; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx381; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp382; X86-NEXT: movl {{[0-9]+}}(%esp), %eax383; X86-NEXT: cmpl %ebp, %eax384; X86-NEXT: cmovbl %eax, %ebp385; X86-NEXT: movl {{[0-9]+}}(%esp), %eax386; X86-NEXT: cmpl %ebx, %eax387; X86-NEXT: cmovbl %eax, %ebx388; X86-NEXT: movl {{[0-9]+}}(%esp), %eax389; X86-NEXT: cmpl %edi, %eax390; X86-NEXT: cmovbl %eax, %edi391; X86-NEXT: movl {{[0-9]+}}(%esp), %eax392; X86-NEXT: cmpl %esi, %eax393; X86-NEXT: cmovbl %eax, %esi394; X86-NEXT: movl {{[0-9]+}}(%esp), %eax395; X86-NEXT: cmpl %edx, %eax396; X86-NEXT: cmovbl %eax, %edx397; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill398; X86-NEXT: movl {{[0-9]+}}(%esp), %eax399; X86-NEXT: cmpl %ecx, %eax400; X86-NEXT: cmovbl %eax, %ecx401; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill402; X86-NEXT: movl {{[0-9]+}}(%esp), %edx403; X86-NEXT: movl {{[0-9]+}}(%esp), %eax404; X86-NEXT: cmpl %edx, %eax405; X86-NEXT: cmovbl %eax, %edx406; X86-NEXT: movl {{[0-9]+}}(%esp), %eax407; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx408; X86-NEXT: cmpl %eax, %ecx409; X86-NEXT: cmovbl %ecx, %eax410; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx411; X86-NEXT: movl %eax, 28(%ecx)412; X86-NEXT: movl %edx, 24(%ecx)413; X86-NEXT: movl (%esp), %eax # 4-byte Reload414; X86-NEXT: movl %eax, 20(%ecx)415; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload416; X86-NEXT: movl %eax, 16(%ecx)417; X86-NEXT: movl %esi, 12(%ecx)418; X86-NEXT: movl %edi, 8(%ecx)419; X86-NEXT: movl %ebx, 4(%ecx)420; X86-NEXT: movl %ebp, (%ecx)421; X86-NEXT: movl %ecx, %eax422; X86-NEXT: addl $8, %esp423; X86-NEXT: popl %esi424; X86-NEXT: popl %edi425; X86-NEXT: popl %ebx426; X86-NEXT: popl %ebp427; X86-NEXT: retl $4428 %r = call <8 x i32> @llvm.umin.v8i32(<8 x i32> %a, <8 x i32> %b)429 ret <8 x i32> %r430}431 432define <8 x i16> @test_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {433; SSE-LABEL: test_v8i16:434; SSE: # %bb.0:435; SSE-NEXT: movdqa %xmm0, %xmm2436; SSE-NEXT: psubusw %xmm1, %xmm2437; SSE-NEXT: psubw %xmm2, %xmm0438; SSE-NEXT: retq439;440; AVX-LABEL: test_v8i16:441; AVX: # %bb.0:442; AVX-NEXT: vpminuw %xmm1, %xmm0, %xmm0443; AVX-NEXT: retq444;445; X86-LABEL: test_v8i16:446; X86: # %bb.0:447; X86-NEXT: pushl %ebp448; X86-NEXT: pushl %ebx449; X86-NEXT: pushl %edi450; X86-NEXT: pushl %esi451; X86-NEXT: subl $8, %esp452; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx453; X86-NEXT: movl {{[0-9]+}}(%esp), %edx454; X86-NEXT: movl {{[0-9]+}}(%esp), %esi455; X86-NEXT: movl {{[0-9]+}}(%esp), %edi456; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx457; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp458; X86-NEXT: movl {{[0-9]+}}(%esp), %eax459; X86-NEXT: cmpw %bp, %ax460; X86-NEXT: cmovbl %eax, %ebp461; X86-NEXT: movl {{[0-9]+}}(%esp), %eax462; X86-NEXT: cmpw %bx, %ax463; X86-NEXT: cmovbl %eax, %ebx464; X86-NEXT: movl {{[0-9]+}}(%esp), %eax465; X86-NEXT: cmpw %di, %ax466; X86-NEXT: cmovbl %eax, %edi467; X86-NEXT: movl {{[0-9]+}}(%esp), %eax468; X86-NEXT: cmpw %si, %ax469; X86-NEXT: cmovbl %eax, %esi470; X86-NEXT: movl {{[0-9]+}}(%esp), %eax471; X86-NEXT: cmpw %dx, %ax472; X86-NEXT: cmovbl %eax, %edx473; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill474; X86-NEXT: movl {{[0-9]+}}(%esp), %eax475; X86-NEXT: cmpw %cx, %ax476; X86-NEXT: cmovbl %eax, %ecx477; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill478; X86-NEXT: movl {{[0-9]+}}(%esp), %edx479; X86-NEXT: movl {{[0-9]+}}(%esp), %eax480; X86-NEXT: cmpw %dx, %ax481; X86-NEXT: cmovbl %eax, %edx482; X86-NEXT: movl {{[0-9]+}}(%esp), %eax483; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx484; X86-NEXT: cmpw %ax, %cx485; X86-NEXT: cmovbl %ecx, %eax486; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx487; X86-NEXT: movw %ax, 14(%ecx)488; X86-NEXT: movw %dx, 12(%ecx)489; X86-NEXT: movl (%esp), %eax # 4-byte Reload490; X86-NEXT: movw %ax, 10(%ecx)491; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload492; X86-NEXT: movw %ax, 8(%ecx)493; X86-NEXT: movw %si, 6(%ecx)494; X86-NEXT: movw %di, 4(%ecx)495; X86-NEXT: movw %bx, 2(%ecx)496; X86-NEXT: movw %bp, (%ecx)497; X86-NEXT: movl %ecx, %eax498; X86-NEXT: addl $8, %esp499; X86-NEXT: popl %esi500; X86-NEXT: popl %edi501; X86-NEXT: popl %ebx502; X86-NEXT: popl %ebp503; X86-NEXT: retl $4504 %r = call <8 x i16> @llvm.umin.v8i16(<8 x i16> %a, <8 x i16> %b)505 ret <8 x i16> %r506}507 508define <16 x i8> @test_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {509; SSE-LABEL: test_v16i8:510; SSE: # %bb.0:511; SSE-NEXT: pminub %xmm1, %xmm0512; SSE-NEXT: retq513;514; AVX-LABEL: test_v16i8:515; AVX: # %bb.0:516; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0517; AVX-NEXT: retq518;519; X86-LABEL: test_v16i8:520; X86: # %bb.0:521; X86-NEXT: pushl %ebp522; X86-NEXT: pushl %ebx523; X86-NEXT: pushl %edi524; X86-NEXT: pushl %esi525; X86-NEXT: subl $40, %esp526; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx527; X86-NEXT: movl {{[0-9]+}}(%esp), %edx528; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx529; X86-NEXT: movl {{[0-9]+}}(%esp), %eax530; X86-NEXT: cmpb %bl, %al531; X86-NEXT: cmovbl %eax, %ebx532; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill533; X86-NEXT: movl {{[0-9]+}}(%esp), %eax534; X86-NEXT: cmpb %dl, %al535; X86-NEXT: cmovbl %eax, %edx536; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill537; X86-NEXT: movl {{[0-9]+}}(%esp), %eax538; X86-NEXT: cmpb %cl, %al539; X86-NEXT: cmovbl %eax, %ecx540; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill541; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx542; X86-NEXT: movl {{[0-9]+}}(%esp), %eax543; X86-NEXT: cmpb %cl, %al544; X86-NEXT: cmovbl %eax, %ecx545; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill546; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx547; X86-NEXT: movl {{[0-9]+}}(%esp), %eax548; X86-NEXT: cmpb %cl, %al549; X86-NEXT: cmovbl %eax, %ecx550; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill551; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx552; X86-NEXT: movl {{[0-9]+}}(%esp), %eax553; X86-NEXT: cmpb %cl, %al554; X86-NEXT: cmovbl %eax, %ecx555; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill556; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx557; X86-NEXT: movl {{[0-9]+}}(%esp), %eax558; X86-NEXT: cmpb %cl, %al559; X86-NEXT: cmovbl %eax, %ecx560; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill561; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx562; X86-NEXT: movl {{[0-9]+}}(%esp), %eax563; X86-NEXT: cmpb %cl, %al564; X86-NEXT: cmovbl %eax, %ecx565; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill566; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx567; X86-NEXT: movl {{[0-9]+}}(%esp), %eax568; X86-NEXT: cmpb %cl, %al569; X86-NEXT: cmovbl %eax, %ecx570; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill571; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx572; X86-NEXT: movl {{[0-9]+}}(%esp), %eax573; X86-NEXT: cmpb %cl, %al574; X86-NEXT: cmovbl %eax, %ecx575; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill576; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx577; X86-NEXT: movl {{[0-9]+}}(%esp), %eax578; X86-NEXT: cmpb %cl, %al579; X86-NEXT: cmovbl %eax, %ecx580; X86-NEXT: movl %ecx, %ebp581; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx582; X86-NEXT: movl {{[0-9]+}}(%esp), %eax583; X86-NEXT: cmpb %cl, %al584; X86-NEXT: cmovbl %eax, %ecx585; X86-NEXT: movl %ecx, %edi586; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx587; X86-NEXT: movl {{[0-9]+}}(%esp), %eax588; X86-NEXT: cmpb %cl, %al589; X86-NEXT: cmovbl %eax, %ecx590; X86-NEXT: movl %ecx, %esi591; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx592; X86-NEXT: movl {{[0-9]+}}(%esp), %eax593; X86-NEXT: cmpb %bl, %al594; X86-NEXT: cmovbl %eax, %ebx595; X86-NEXT: movl {{[0-9]+}}(%esp), %edx596; X86-NEXT: movl {{[0-9]+}}(%esp), %eax597; X86-NEXT: cmpb %dl, %al598; X86-NEXT: cmovbl %eax, %edx599; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx600; X86-NEXT: movl {{[0-9]+}}(%esp), %eax601; X86-NEXT: cmpb %cl, %al602; X86-NEXT: cmovbl %eax, %ecx603; X86-NEXT: movl {{[0-9]+}}(%esp), %eax604; X86-NEXT: movb %cl, 15(%eax)605; X86-NEXT: movb %dl, 14(%eax)606; X86-NEXT: movb %bl, 13(%eax)607; X86-NEXT: movl %esi, %ecx608; X86-NEXT: movb %cl, 12(%eax)609; X86-NEXT: movl %edi, %ecx610; X86-NEXT: movb %cl, 11(%eax)611; X86-NEXT: movl %ebp, %ecx612; X86-NEXT: movb %cl, 10(%eax)613; X86-NEXT: movl (%esp), %ecx # 4-byte Reload614; X86-NEXT: movb %cl, 9(%eax)615; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload616; X86-NEXT: movb %cl, 8(%eax)617; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload618; X86-NEXT: movb %cl, 7(%eax)619; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload620; X86-NEXT: movb %cl, 6(%eax)621; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload622; X86-NEXT: movb %cl, 5(%eax)623; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload624; X86-NEXT: movb %cl, 4(%eax)625; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload626; X86-NEXT: movb %cl, 3(%eax)627; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload628; X86-NEXT: movb %cl, 2(%eax)629; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload630; X86-NEXT: movb %cl, 1(%eax)631; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload632; X86-NEXT: movb %cl, (%eax)633; X86-NEXT: addl $40, %esp634; X86-NEXT: popl %esi635; X86-NEXT: popl %edi636; X86-NEXT: popl %ebx637; X86-NEXT: popl %ebp638; X86-NEXT: retl $4639 %r = call <16 x i8> @llvm.umin.v16i8(<16 x i8> %a, <16 x i8> %b)640 ret <16 x i8> %r641}642 643define i16 @test_signbits_i16(i16 %a, i16 %b) nounwind {644; X64-LABEL: test_signbits_i16:645; X64: # %bb.0:646; X64-NEXT: movswl %si, %eax647; X64-NEXT: movswl %di, %ecx648; X64-NEXT: shrl $15, %ecx649; X64-NEXT: shrl $8, %eax650; X64-NEXT: cmpw %ax, %cx651; X64-NEXT: cmovbl %ecx, %eax652; X64-NEXT: # kill: def $ax killed $ax killed $eax653; X64-NEXT: retq654;655; X86-LABEL: test_signbits_i16:656; X86: # %bb.0:657; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax658; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx659; X86-NEXT: shrl $15, %ecx660; X86-NEXT: cmpw %ax, %cx661; X86-NEXT: cmovbl %ecx, %eax662; X86-NEXT: # kill: def $ax killed $ax killed $eax663; X86-NEXT: retl664 %ax = ashr i16 %a, 15665 %bx = ashr i16 %b, 8666 %r = call i16 @llvm.umin.i16(i16 %ax, i16 %bx)667 ret i16 %r668}669 670define i32 @test_signbits_i32(i32 %a, i32 %b) nounwind {671; X64-LABEL: test_signbits_i32:672; X64: # %bb.0:673; X64-NEXT: movl %esi, %eax674; X64-NEXT: sarl $16, %edi675; X64-NEXT: sarl $17, %eax676; X64-NEXT: cmpl %eax, %edi677; X64-NEXT: cmovbl %edi, %eax678; X64-NEXT: retq679;680; X86-LABEL: test_signbits_i32:681; X86: # %bb.0:682; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx683; X86-NEXT: movl {{[0-9]+}}(%esp), %eax684; X86-NEXT: sarl $17, %eax685; X86-NEXT: cmpl %eax, %ecx686; X86-NEXT: cmovbl %ecx, %eax687; X86-NEXT: retl688 %ax = ashr i32 %a, 16689 %bx = ashr i32 %b, 17690 %r = call i32 @llvm.umin.i32(i32 %ax, i32 %bx)691 ret i32 %r692}693 694define i64 @test_signbits_i64(i64 %a, i64 %b) nounwind {695; X64-LABEL: test_signbits_i64:696; X64: # %bb.0:697; X64-NEXT: movq %rsi, %rax698; X64-NEXT: sarq $32, %rdi699; X64-NEXT: sarq $32, %rax700; X64-NEXT: cmpq %rax, %rdi701; X64-NEXT: cmovbq %rdi, %rax702; X64-NEXT: retq703;704; X86-LABEL: test_signbits_i64:705; X86: # %bb.0:706; X86-NEXT: movl {{[0-9]+}}(%esp), %eax707; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx708; X86-NEXT: cmpl %eax, %ecx709; X86-NEXT: cmovbl %ecx, %eax710; X86-NEXT: movl %eax, %edx711; X86-NEXT: sarl $31, %edx712; X86-NEXT: retl713 %ax = ashr i64 %a, 32714 %bx = ashr i64 %b, 32715 %r = call i64 @llvm.umin.i64(i64 %ax, i64 %bx)716 ret i64 %r717}718 719define i128 @test_signbits_i128(i128 %a, i128 %b) nounwind {720; X64-LABEL: test_signbits_i128:721; X64: # %bb.0:722; X64-NEXT: movq %rcx, %rax723; X64-NEXT: sarq $28, %rax724; X64-NEXT: cmpq %rax, %rsi725; X64-NEXT: cmovbq %rsi, %rax726; X64-NEXT: movq %rax, %rdx727; X64-NEXT: sarq $63, %rdx728; X64-NEXT: retq729;730; X86-LABEL: test_signbits_i128:731; X86: # %bb.0:732; X86-NEXT: pushl %ebp733; X86-NEXT: movl %esp, %ebp734; X86-NEXT: pushl %edi735; X86-NEXT: pushl %esi736; X86-NEXT: andl $-16, %esp737; X86-NEXT: movl 32(%ebp), %esi738; X86-NEXT: movl 36(%ebp), %eax739; X86-NEXT: movl 48(%ebp), %ecx740; X86-NEXT: movl 52(%ebp), %edx741; X86-NEXT: shrdl $28, %edx, %ecx742; X86-NEXT: sarl $28, %edx743; X86-NEXT: cmpl %ecx, %esi744; X86-NEXT: movl %eax, %edi745; X86-NEXT: sbbl %edx, %edi746; X86-NEXT: cmovbl %esi, %ecx747; X86-NEXT: cmovbl %eax, %edx748; X86-NEXT: movl 8(%ebp), %eax749; X86-NEXT: movl %edx, 4(%eax)750; X86-NEXT: movl %ecx, (%eax)751; X86-NEXT: sarl $31, %edx752; X86-NEXT: movl %edx, 12(%eax)753; X86-NEXT: movl %edx, 8(%eax)754; X86-NEXT: leal -8(%ebp), %esp755; X86-NEXT: popl %esi756; X86-NEXT: popl %edi757; X86-NEXT: popl %ebp758; X86-NEXT: retl $4759 %ax = ashr i128 %a, 64760 %bx = ashr i128 %b, 92761 %r = call i128 @llvm.umin.i128(i128 %ax, i128 %bx)762 ret i128 %r763}764