1353 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.umax.i8(i8, i8)8declare i16 @llvm.umax.i16(i16, i16)9declare i24 @llvm.umax.i24(i24, i24)10declare i32 @llvm.umax.i32(i32, i32)11declare i64 @llvm.umax.i64(i64, i64)12declare i128 @llvm.umax.i128(i128, i128)13 14declare <1 x i32> @llvm.umax.v1i32(<1 x i32>, <1 x i32>)15declare <2 x i32> @llvm.umax.v2i32(<2 x i32>, <2 x i32>)16declare <3 x i32> @llvm.umax.v3i32(<3 x i32>, <3 x i32>)17declare <4 x i32> @llvm.umax.v4i32(<4 x i32>, <4 x i32>)18declare <8 x i32> @llvm.umax.v8i32(<8 x i32>, <8 x i32>)19 20declare <2 x i64> @llvm.umax.v2i64(<2 x i64>, <2 x i64>)21declare <8 x i16> @llvm.umax.v8i16(<8 x i16>, <8 x i16>)22declare <16 x i8> @llvm.umax.v16i8(<16 x i8>, <16 x i8>)23 24define i8 @test_i8(i8 %a, i8 %b) nounwind {25; X64-LABEL: test_i8:26; X64: # %bb.0:27; X64-NEXT: movl %esi, %eax28; X64-NEXT: cmpb %al, %dil29; X64-NEXT: cmoval %edi, %eax30; X64-NEXT: # kill: def $al killed $al killed $eax31; X64-NEXT: retq32;33; X86-LABEL: test_i8:34; X86: # %bb.0:35; X86-NEXT: movl {{[0-9]+}}(%esp), %eax36; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx37; X86-NEXT: cmpb %al, %cl38; X86-NEXT: cmoval %ecx, %eax39; X86-NEXT: # kill: def $al killed $al killed $eax40; X86-NEXT: retl41 %r = call i8 @llvm.umax.i8(i8 %a, i8 %b)42 ret i8 %r43}44 45define i8 @test_i8_1(i8 %a) nounwind {46; X64-LABEL: test_i8_1:47; X64: # %bb.0:48; X64-NEXT: movl %edi, %eax49; X64-NEXT: cmpb $1, %al50; X64-NEXT: adcl $0, %eax51; X64-NEXT: # kill: def $al killed $al killed $eax52; X64-NEXT: retq53;54; X86-LABEL: test_i8_1:55; X86: # %bb.0:56; X86-NEXT: movl {{[0-9]+}}(%esp), %eax57; X86-NEXT: cmpb $1, %al58; X86-NEXT: adcl $0, %eax59; X86-NEXT: # kill: def $al killed $al killed $eax60; X86-NEXT: retl61 %r = call i8 @llvm.umax.i8(i8 %a, i8 1)62 ret i8 %r63}64 65define i16 @test_i16(i16 %a, i16 %b) nounwind {66; X64-LABEL: test_i16:67; X64: # %bb.0:68; X64-NEXT: movl %esi, %eax69; X64-NEXT: cmpw %ax, %di70; X64-NEXT: cmoval %edi, %eax71; X64-NEXT: # kill: def $ax killed $ax killed $eax72; X64-NEXT: retq73;74; X86-LABEL: test_i16:75; X86: # %bb.0:76; X86-NEXT: movl {{[0-9]+}}(%esp), %eax77; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx78; X86-NEXT: cmpw %ax, %cx79; X86-NEXT: cmoval %ecx, %eax80; X86-NEXT: # kill: def $ax killed $ax killed $eax81; X86-NEXT: retl82 %r = call i16 @llvm.umax.i16(i16 %a, i16 %b)83 ret i16 %r84}85 86define i16 @test_i16_1(i16 %a) nounwind {87; X64-LABEL: test_i16_1:88; X64: # %bb.0:89; X64-NEXT: movl %edi, %eax90; X64-NEXT: cmpw $1, %ax91; X64-NEXT: adcl $0, %eax92; X64-NEXT: # kill: def $ax killed $ax killed $eax93; X64-NEXT: retq94;95; X86-LABEL: test_i16_1:96; X86: # %bb.0:97; X86-NEXT: movl {{[0-9]+}}(%esp), %eax98; X86-NEXT: cmpw $1, %ax99; X86-NEXT: adcl $0, %eax100; X86-NEXT: # kill: def $ax killed $ax killed $eax101; X86-NEXT: retl102 %r = call i16 @llvm.umax.i16(i16 %a, i16 1)103 ret i16 %r104}105 106define i24 @test_i24(i24 %a, i24 %b) nounwind {107; X64-LABEL: test_i24:108; X64: # %bb.0:109; X64-NEXT: movl %edi, %eax110; X64-NEXT: andl $16777215, %esi # imm = 0xFFFFFF111; X64-NEXT: andl $16777215, %eax # imm = 0xFFFFFF112; X64-NEXT: cmpl %esi, %eax113; X64-NEXT: cmovbel %esi, %eax114; X64-NEXT: retq115;116; X86-LABEL: test_i24:117; X86: # %bb.0:118; X86-NEXT: movl $16777215, %eax # imm = 0xFFFFFF119; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx120; X86-NEXT: andl %eax, %ecx121; X86-NEXT: andl {{[0-9]+}}(%esp), %eax122; X86-NEXT: cmpl %ecx, %eax123; X86-NEXT: cmovbel %ecx, %eax124; X86-NEXT: retl125 %r = call i24 @llvm.umax.i24(i24 %a, i24 %b)126 ret i24 %r127}128 129define i32 @test_i32(i32 %a, i32 %b) nounwind {130; X64-LABEL: test_i32:131; X64: # %bb.0:132; X64-NEXT: movl %esi, %eax133; X64-NEXT: cmpl %esi, %edi134; X64-NEXT: cmoval %edi, %eax135; X64-NEXT: retq136;137; X86-LABEL: test_i32:138; X86: # %bb.0:139; X86-NEXT: movl {{[0-9]+}}(%esp), %eax140; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx141; X86-NEXT: cmpl %eax, %ecx142; X86-NEXT: cmoval %ecx, %eax143; X86-NEXT: retl144 %r = call i32 @llvm.umax.i32(i32 %a, i32 %b)145 ret i32 %r146}147 148define i32 @test_i32_1(i32 %a) nounwind {149; X64-LABEL: test_i32_1:150; X64: # %bb.0:151; X64-NEXT: movl %edi, %eax152; X64-NEXT: cmpl $1, %edi153; X64-NEXT: adcl $0, %eax154; X64-NEXT: retq155;156; X86-LABEL: test_i32_1:157; X86: # %bb.0:158; X86-NEXT: movl {{[0-9]+}}(%esp), %eax159; X86-NEXT: cmpl $1, %eax160; X86-NEXT: adcl $0, %eax161; X86-NEXT: retl162 %r = call i32 @llvm.umax.i32(i32 %a, i32 1)163 ret i32 %r164}165 166define i64 @test_i64(i64 %a, i64 %b) nounwind {167; X64-LABEL: test_i64:168; X64: # %bb.0:169; X64-NEXT: movq %rsi, %rax170; X64-NEXT: cmpq %rsi, %rdi171; X64-NEXT: cmovaq %rdi, %rax172; X64-NEXT: retq173;174; X86-LABEL: test_i64:175; X86: # %bb.0:176; X86-NEXT: pushl %edi177; X86-NEXT: pushl %esi178; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx179; X86-NEXT: movl {{[0-9]+}}(%esp), %esi180; X86-NEXT: movl {{[0-9]+}}(%esp), %eax181; X86-NEXT: movl {{[0-9]+}}(%esp), %edx182; X86-NEXT: cmpl %ecx, %eax183; X86-NEXT: movl %edx, %edi184; X86-NEXT: sbbl %esi, %edi185; X86-NEXT: cmovbl %ecx, %eax186; X86-NEXT: cmovbl %esi, %edx187; X86-NEXT: popl %esi188; X86-NEXT: popl %edi189; X86-NEXT: retl190 %r = call i64 @llvm.umax.i64(i64 %a, i64 %b)191 ret i64 %r192}193 194define i64 @test_i64_1(i64 %a) nounwind {195; X64-LABEL: test_i64_1:196; X64: # %bb.0:197; X64-NEXT: movq %rdi, %rax198; X64-NEXT: cmpq $1, %rdi199; X64-NEXT: adcq $0, %rax200; X64-NEXT: retq201;202; X86-LABEL: test_i64_1:203; X86: # %bb.0:204; X86-NEXT: pushl %esi205; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx206; X86-NEXT: movl {{[0-9]+}}(%esp), %edx207; X86-NEXT: cmpl $1, %ecx208; X86-NEXT: movl %ecx, %esi209; X86-NEXT: adcl $0, %esi210; X86-NEXT: testl %edx, %edx211; X86-NEXT: movl $1, %eax212; X86-NEXT: cmovnel %ecx, %eax213; X86-NEXT: cmovel %esi, %eax214; X86-NEXT: popl %esi215; X86-NEXT: retl216 %r = call i64 @llvm.umax.i64(i64 %a, i64 1)217 ret i64 %r218}219 220define i128 @test_i128(i128 %a, i128 %b) nounwind {221; X64-LABEL: test_i128:222; X64: # %bb.0:223; X64-NEXT: movq %rdx, %rax224; X64-NEXT: cmpq %rdi, %rdx225; X64-NEXT: movq %rcx, %rdx226; X64-NEXT: sbbq %rsi, %rdx227; X64-NEXT: cmovbq %rdi, %rax228; X64-NEXT: cmovbq %rsi, %rcx229; X64-NEXT: movq %rcx, %rdx230; X64-NEXT: retq231;232; X86-LABEL: test_i128:233; X86: # %bb.0:234; X86-NEXT: pushl %ebp235; X86-NEXT: movl %esp, %ebp236; X86-NEXT: pushl %ebx237; X86-NEXT: pushl %edi238; X86-NEXT: pushl %esi239; X86-NEXT: andl $-16, %esp240; X86-NEXT: subl $16, %esp241; X86-NEXT: movl 40(%ebp), %ebx242; X86-NEXT: movl 44(%ebp), %edi243; X86-NEXT: cmpl 24(%ebp), %ebx244; X86-NEXT: movl %edi, %esi245; X86-NEXT: sbbl 28(%ebp), %esi246; X86-NEXT: movl 48(%ebp), %edx247; X86-NEXT: movl %edx, %esi248; X86-NEXT: sbbl 32(%ebp), %esi249; X86-NEXT: movl 36(%ebp), %esi250; X86-NEXT: movl 52(%ebp), %ecx251; X86-NEXT: movl %ecx, %eax252; X86-NEXT: sbbl %esi, %eax253; X86-NEXT: cmovbl 24(%ebp), %ebx254; X86-NEXT: cmovbl 28(%ebp), %edi255; X86-NEXT: cmovbl 32(%ebp), %edx256; X86-NEXT: cmovbl %esi, %ecx257; X86-NEXT: movl 8(%ebp), %eax258; X86-NEXT: movl %ecx, 12(%eax)259; X86-NEXT: movl %edx, 8(%eax)260; X86-NEXT: movl %edi, 4(%eax)261; X86-NEXT: movl %ebx, (%eax)262; X86-NEXT: leal -12(%ebp), %esp263; X86-NEXT: popl %esi264; X86-NEXT: popl %edi265; X86-NEXT: popl %ebx266; X86-NEXT: popl %ebp267; X86-NEXT: retl $4268 %r = call i128 @llvm.umax.i128(i128 %a, i128 %b)269 ret i128 %r270}271 272define i128 @test_i128_1(i128 %a) nounwind {273; X64-LABEL: test_i128_1:274; X64: # %bb.0:275; X64-NEXT: movq %rsi, %rdx276; X64-NEXT: cmpq $1, %rdi277; X64-NEXT: movq %rdi, %rcx278; X64-NEXT: adcq $0, %rcx279; X64-NEXT: testq %rsi, %rsi280; X64-NEXT: movl $1, %eax281; X64-NEXT: cmovneq %rdi, %rax282; X64-NEXT: cmoveq %rcx, %rax283; X64-NEXT: retq284;285; X86-LABEL: test_i128_1:286; X86: # %bb.0:287; X86-NEXT: pushl %ebp288; X86-NEXT: movl %esp, %ebp289; X86-NEXT: pushl %ebx290; X86-NEXT: pushl %edi291; X86-NEXT: pushl %esi292; X86-NEXT: andl $-16, %esp293; X86-NEXT: subl $16, %esp294; X86-NEXT: movl 32(%ebp), %edx295; X86-NEXT: movl 24(%ebp), %eax296; X86-NEXT: cmpl $1, %eax297; X86-NEXT: movl %eax, %ecx298; X86-NEXT: adcl $0, %ecx299; X86-NEXT: cmpl $0, 28(%ebp)300; X86-NEXT: movl $1, %esi301; X86-NEXT: cmovnel %eax, %esi302; X86-NEXT: cmovel %ecx, %esi303; X86-NEXT: xorl %edi, %edi304; X86-NEXT: movl %edx, %ecx305; X86-NEXT: negl %ecx306; X86-NEXT: movl 36(%ebp), %ecx307; X86-NEXT: movl $0, %ebx308; X86-NEXT: sbbl %ecx, %ebx309; X86-NEXT: movl $1, %ebx310; X86-NEXT: cmovbl %eax, %ebx311; X86-NEXT: cmovbl 28(%ebp), %edi312; X86-NEXT: movl %edx, %eax313; X86-NEXT: orl %ecx, %eax314; X86-NEXT: movl 8(%ebp), %eax315; X86-NEXT: movl %ecx, 12(%eax)316; X86-NEXT: movl %edx, 8(%eax)317; X86-NEXT: cmovel %esi, %ebx318; X86-NEXT: cmovel 28(%ebp), %edi319; X86-NEXT: movl %edi, 4(%eax)320; X86-NEXT: movl %ebx, (%eax)321; X86-NEXT: leal -12(%ebp), %esp322; X86-NEXT: popl %esi323; X86-NEXT: popl %edi324; X86-NEXT: popl %ebx325; X86-NEXT: popl %ebp326; X86-NEXT: retl $4327 %r = call i128 @llvm.umax.i128(i128 %a, i128 1)328 ret i128 %r329}330 331define <2 x i64> @test_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {332; SSE-LABEL: test_v2i64:333; SSE: # %bb.0:334; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]335; SSE-NEXT: movdqa %xmm1, %xmm3336; SSE-NEXT: pxor %xmm2, %xmm3337; SSE-NEXT: pxor %xmm0, %xmm2338; SSE-NEXT: movdqa %xmm2, %xmm4339; SSE-NEXT: pcmpgtd %xmm3, %xmm4340; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]341; SSE-NEXT: pcmpeqd %xmm3, %xmm2342; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]343; SSE-NEXT: pand %xmm5, %xmm2344; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]345; SSE-NEXT: por %xmm2, %xmm3346; SSE-NEXT: pand %xmm3, %xmm0347; SSE-NEXT: pandn %xmm1, %xmm3348; SSE-NEXT: por %xmm3, %xmm0349; SSE-NEXT: retq350;351; AVX1-LABEL: test_v2i64:352; AVX1: # %bb.0:353; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]354; AVX1-NEXT: # xmm2 = mem[0,0]355; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm3356; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm2357; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2358; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0359; AVX1-NEXT: retq360;361; AVX2-LABEL: test_v2i64:362; AVX2: # %bb.0:363; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]364; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm3365; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm2366; AVX2-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2367; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0368; AVX2-NEXT: retq369;370; X86-LABEL: test_v2i64:371; X86: # %bb.0:372; X86-NEXT: pushl %ebp373; X86-NEXT: pushl %ebx374; X86-NEXT: pushl %edi375; X86-NEXT: pushl %esi376; X86-NEXT: movl {{[0-9]+}}(%esp), %edx377; X86-NEXT: movl {{[0-9]+}}(%esp), %eax378; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx379; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp380; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx381; X86-NEXT: movl {{[0-9]+}}(%esp), %esi382; X86-NEXT: cmpl %ebx, %ecx383; X86-NEXT: movl %esi, %edi384; X86-NEXT: sbbl %ebp, %edi385; X86-NEXT: movl {{[0-9]+}}(%esp), %edi386; X86-NEXT: cmovbl %ebx, %ecx387; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx388; X86-NEXT: cmovbl %ebp, %esi389; X86-NEXT: cmpl %edx, %edi390; X86-NEXT: movl %ebx, %ebp391; X86-NEXT: sbbl %eax, %ebp392; X86-NEXT: cmovbl %edx, %edi393; X86-NEXT: cmovbl %eax, %ebx394; X86-NEXT: movl {{[0-9]+}}(%esp), %eax395; X86-NEXT: movl %ebx, 12(%eax)396; X86-NEXT: movl %edi, 8(%eax)397; X86-NEXT: movl %esi, 4(%eax)398; X86-NEXT: movl %ecx, (%eax)399; X86-NEXT: popl %esi400; X86-NEXT: popl %edi401; X86-NEXT: popl %ebx402; X86-NEXT: popl %ebp403; X86-NEXT: retl $4404 %r = call <2 x i64> @llvm.umax.v2i64(<2 x i64> %a, <2 x i64> %b)405 ret <2 x i64> %r406}407 408define <2 x i64> @test_v2i64_1(<2 x i64> %a) nounwind {409; SSE-LABEL: test_v2i64_1:410; SSE: # %bb.0:411; SSE-NEXT: pxor %xmm1, %xmm1412; SSE-NEXT: pcmpeqd %xmm0, %xmm1413; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]414; SSE-NEXT: pand %xmm1, %xmm2415; SSE-NEXT: psubq %xmm2, %xmm0416; SSE-NEXT: retq417;418; AVX-LABEL: test_v2i64_1:419; AVX: # %bb.0:420; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1421; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm1422; AVX-NEXT: vpsubq %xmm1, %xmm0, %xmm0423; AVX-NEXT: retq424;425; X86-LABEL: test_v2i64_1:426; X86: # %bb.0:427; X86-NEXT: pushl %ebp428; X86-NEXT: pushl %ebx429; X86-NEXT: pushl %edi430; X86-NEXT: pushl %esi431; X86-NEXT: movl {{[0-9]+}}(%esp), %eax432; X86-NEXT: movl {{[0-9]+}}(%esp), %edi433; X86-NEXT: movl {{[0-9]+}}(%esp), %edx434; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx435; X86-NEXT: movl {{[0-9]+}}(%esp), %esi436; X86-NEXT: cmpl $1, %ecx437; X86-NEXT: movl %ecx, %ebx438; X86-NEXT: adcl $0, %ebx439; X86-NEXT: testl %esi, %esi440; X86-NEXT: movl $1, %ebp441; X86-NEXT: cmovel %ebp, %ecx442; X86-NEXT: cmovel %ebx, %ecx443; X86-NEXT: cmpl $1, %edi444; X86-NEXT: movl %edi, %ebx445; X86-NEXT: adcl $0, %ebx446; X86-NEXT: testl %edx, %edx447; X86-NEXT: cmovnel %edi, %ebp448; X86-NEXT: cmovel %ebx, %ebp449; X86-NEXT: movl %edx, 12(%eax)450; X86-NEXT: movl %ebp, 8(%eax)451; X86-NEXT: movl %esi, 4(%eax)452; X86-NEXT: movl %ecx, (%eax)453; X86-NEXT: popl %esi454; X86-NEXT: popl %edi455; X86-NEXT: popl %ebx456; X86-NEXT: popl %ebp457; X86-NEXT: retl $4458 %r = call <2 x i64> @llvm.umax.v2i64(<2 x i64> %a, <2 x i64> <i64 1, i64 1>)459 ret <2 x i64> %r460}461 462define <1 x i32> @test_v1i32(<1 x i32> %a, <1 x i32> %b) nounwind {463; X64-LABEL: test_v1i32:464; X64: # %bb.0:465; X64-NEXT: movl %esi, %eax466; X64-NEXT: cmpl %esi, %edi467; X64-NEXT: cmoval %edi, %eax468; X64-NEXT: retq469;470; X86-LABEL: test_v1i32:471; X86: # %bb.0:472; X86-NEXT: movl {{[0-9]+}}(%esp), %eax473; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx474; X86-NEXT: cmpl %eax, %ecx475; X86-NEXT: cmoval %ecx, %eax476; X86-NEXT: retl477 %r = call <1 x i32> @llvm.umax.v1i32(<1 x i32> %a, <1 x i32> %b)478 ret <1 x i32> %r479}480 481define <2 x i32> @test_v2i32(<2 x i32> %a, <2 x i32> %b) nounwind {482; SSE-LABEL: test_v2i32:483; SSE: # %bb.0:484; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]485; SSE-NEXT: movdqa %xmm1, %xmm3486; SSE-NEXT: pxor %xmm2, %xmm3487; SSE-NEXT: pxor %xmm0, %xmm2488; SSE-NEXT: pcmpgtd %xmm3, %xmm2489; SSE-NEXT: pand %xmm2, %xmm0490; SSE-NEXT: pandn %xmm1, %xmm2491; SSE-NEXT: por %xmm2, %xmm0492; SSE-NEXT: retq493;494; AVX-LABEL: test_v2i32:495; AVX: # %bb.0:496; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm0497; AVX-NEXT: retq498;499; X86-LABEL: test_v2i32:500; X86: # %bb.0:501; X86-NEXT: pushl %esi502; X86-NEXT: movl {{[0-9]+}}(%esp), %edx503; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx504; X86-NEXT: movl {{[0-9]+}}(%esp), %eax505; X86-NEXT: movl {{[0-9]+}}(%esp), %esi506; X86-NEXT: cmpl %eax, %esi507; X86-NEXT: cmoval %esi, %eax508; X86-NEXT: cmpl %edx, %ecx509; X86-NEXT: cmoval %ecx, %edx510; X86-NEXT: popl %esi511; X86-NEXT: retl512 %r = call <2 x i32> @llvm.umax.v2i32(<2 x i32> %a, <2 x i32> %b)513 ret <2 x i32> %r514}515 516define <3 x i32> @test_v3i32(<3 x i32> %a, <3 x i32> %b) nounwind {517; SSE-LABEL: test_v3i32:518; SSE: # %bb.0:519; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]520; SSE-NEXT: movdqa %xmm1, %xmm3521; SSE-NEXT: pxor %xmm2, %xmm3522; SSE-NEXT: pxor %xmm0, %xmm2523; SSE-NEXT: pcmpgtd %xmm3, %xmm2524; SSE-NEXT: pand %xmm2, %xmm0525; SSE-NEXT: pandn %xmm1, %xmm2526; SSE-NEXT: por %xmm2, %xmm0527; SSE-NEXT: retq528;529; AVX-LABEL: test_v3i32:530; AVX: # %bb.0:531; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm0532; AVX-NEXT: retq533;534; X86-LABEL: test_v3i32:535; X86: # %bb.0:536; X86-NEXT: pushl %ebx537; X86-NEXT: pushl %edi538; X86-NEXT: pushl %esi539; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx540; X86-NEXT: movl {{[0-9]+}}(%esp), %esi541; X86-NEXT: movl {{[0-9]+}}(%esp), %edx542; X86-NEXT: movl {{[0-9]+}}(%esp), %edi543; X86-NEXT: movl {{[0-9]+}}(%esp), %eax544; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx545; X86-NEXT: cmpl %eax, %ebx546; X86-NEXT: cmoval %ebx, %eax547; X86-NEXT: cmpl %edx, %edi548; X86-NEXT: cmoval %edi, %edx549; X86-NEXT: cmpl %ecx, %esi550; X86-NEXT: cmoval %esi, %ecx551; X86-NEXT: popl %esi552; X86-NEXT: popl %edi553; X86-NEXT: popl %ebx554; X86-NEXT: retl555 %r = call <3 x i32> @llvm.umax.v3i32(<3 x i32> %a, <3 x i32> %b)556 ret <3 x i32> %r557}558 559define <4 x i32> @test_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {560; SSE-LABEL: test_v4i32:561; SSE: # %bb.0:562; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]563; SSE-NEXT: movdqa %xmm1, %xmm3564; SSE-NEXT: pxor %xmm2, %xmm3565; SSE-NEXT: pxor %xmm0, %xmm2566; SSE-NEXT: pcmpgtd %xmm3, %xmm2567; SSE-NEXT: pand %xmm2, %xmm0568; SSE-NEXT: pandn %xmm1, %xmm2569; SSE-NEXT: por %xmm2, %xmm0570; SSE-NEXT: retq571;572; AVX-LABEL: test_v4i32:573; AVX: # %bb.0:574; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm0575; AVX-NEXT: retq576;577; X86-LABEL: test_v4i32:578; X86: # %bb.0:579; X86-NEXT: pushl %edi580; X86-NEXT: pushl %esi581; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx582; X86-NEXT: movl {{[0-9]+}}(%esp), %edx583; X86-NEXT: movl {{[0-9]+}}(%esp), %esi584; X86-NEXT: movl {{[0-9]+}}(%esp), %edi585; X86-NEXT: movl {{[0-9]+}}(%esp), %eax586; X86-NEXT: cmpl %edi, %eax587; X86-NEXT: cmoval %eax, %edi588; X86-NEXT: movl {{[0-9]+}}(%esp), %eax589; X86-NEXT: cmpl %esi, %eax590; X86-NEXT: cmoval %eax, %esi591; X86-NEXT: movl {{[0-9]+}}(%esp), %eax592; X86-NEXT: cmpl %edx, %eax593; X86-NEXT: cmoval %eax, %edx594; X86-NEXT: movl {{[0-9]+}}(%esp), %eax595; X86-NEXT: cmpl %ecx, %eax596; X86-NEXT: cmoval %eax, %ecx597; X86-NEXT: movl {{[0-9]+}}(%esp), %eax598; X86-NEXT: movl %ecx, 12(%eax)599; X86-NEXT: movl %edx, 8(%eax)600; X86-NEXT: movl %esi, 4(%eax)601; X86-NEXT: movl %edi, (%eax)602; X86-NEXT: popl %esi603; X86-NEXT: popl %edi604; X86-NEXT: retl $4605 %r = call <4 x i32> @llvm.umax.v4i32(<4 x i32> %a, <4 x i32> %b)606 ret <4 x i32> %r607}608 609define <4 x i32> @test_v4i32_1(<4 x i32> %a) nounwind {610; SSE-LABEL: test_v4i32_1:611; SSE: # %bb.0:612; SSE-NEXT: pxor %xmm1, %xmm1613; SSE-NEXT: pcmpeqd %xmm0, %xmm1614; SSE-NEXT: psubd %xmm1, %xmm0615; SSE-NEXT: retq616;617; AVX1-LABEL: test_v4i32_1:618; AVX1: # %bb.0:619; AVX1-NEXT: vpmaxud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0620; AVX1-NEXT: retq621;622; AVX2-LABEL: test_v4i32_1:623; AVX2: # %bb.0:624; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]625; AVX2-NEXT: vpmaxud %xmm1, %xmm0, %xmm0626; AVX2-NEXT: retq627;628; X86-LABEL: test_v4i32_1:629; X86: # %bb.0:630; X86-NEXT: pushl %edi631; X86-NEXT: pushl %esi632; X86-NEXT: movl {{[0-9]+}}(%esp), %eax633; X86-NEXT: movl {{[0-9]+}}(%esp), %edi634; X86-NEXT: movl {{[0-9]+}}(%esp), %esi635; X86-NEXT: movl {{[0-9]+}}(%esp), %edx636; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx637; X86-NEXT: cmpl $1, %ecx638; X86-NEXT: adcl $0, %ecx639; X86-NEXT: cmpl $1, %edx640; X86-NEXT: adcl $0, %edx641; X86-NEXT: cmpl $1, %esi642; X86-NEXT: adcl $0, %esi643; X86-NEXT: cmpl $1, %edi644; X86-NEXT: adcl $0, %edi645; X86-NEXT: movl %edi, 12(%eax)646; X86-NEXT: movl %esi, 8(%eax)647; X86-NEXT: movl %edx, 4(%eax)648; X86-NEXT: movl %ecx, (%eax)649; X86-NEXT: popl %esi650; X86-NEXT: popl %edi651; X86-NEXT: retl $4652 %r = call <4 x i32> @llvm.umax.v4i32(<4 x i32> %a, <4 x i32> <i32 1, i32 1, i32 1, i32 1>)653 ret <4 x i32> %r654}655 656define <8 x i32> @test_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {657; SSE-LABEL: test_v8i32:658; SSE: # %bb.0:659; SSE-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]660; SSE-NEXT: movdqa %xmm2, %xmm5661; SSE-NEXT: pxor %xmm4, %xmm5662; SSE-NEXT: movdqa %xmm0, %xmm6663; SSE-NEXT: pxor %xmm4, %xmm6664; SSE-NEXT: pcmpgtd %xmm5, %xmm6665; SSE-NEXT: pand %xmm6, %xmm0666; SSE-NEXT: pandn %xmm2, %xmm6667; SSE-NEXT: por %xmm6, %xmm0668; SSE-NEXT: movdqa %xmm3, %xmm2669; SSE-NEXT: pxor %xmm4, %xmm2670; SSE-NEXT: pxor %xmm1, %xmm4671; SSE-NEXT: pcmpgtd %xmm2, %xmm4672; SSE-NEXT: pand %xmm4, %xmm1673; SSE-NEXT: pandn %xmm3, %xmm4674; SSE-NEXT: por %xmm4, %xmm1675; SSE-NEXT: retq676;677; AVX1-LABEL: test_v8i32:678; AVX1: # %bb.0:679; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2680; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3681; AVX1-NEXT: vpmaxud %xmm2, %xmm3, %xmm2682; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm0683; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0684; AVX1-NEXT: retq685;686; AVX2-LABEL: test_v8i32:687; AVX2: # %bb.0:688; AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm0689; AVX2-NEXT: retq690;691; X86-LABEL: test_v8i32:692; X86: # %bb.0:693; X86-NEXT: pushl %ebp694; X86-NEXT: pushl %ebx695; X86-NEXT: pushl %edi696; X86-NEXT: pushl %esi697; X86-NEXT: subl $8, %esp698; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx699; X86-NEXT: movl {{[0-9]+}}(%esp), %edx700; X86-NEXT: movl {{[0-9]+}}(%esp), %esi701; X86-NEXT: movl {{[0-9]+}}(%esp), %edi702; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx703; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp704; X86-NEXT: movl {{[0-9]+}}(%esp), %eax705; X86-NEXT: cmpl %ebp, %eax706; X86-NEXT: cmoval %eax, %ebp707; X86-NEXT: movl {{[0-9]+}}(%esp), %eax708; X86-NEXT: cmpl %ebx, %eax709; X86-NEXT: cmoval %eax, %ebx710; X86-NEXT: movl {{[0-9]+}}(%esp), %eax711; X86-NEXT: cmpl %edi, %eax712; X86-NEXT: cmoval %eax, %edi713; X86-NEXT: movl {{[0-9]+}}(%esp), %eax714; X86-NEXT: cmpl %esi, %eax715; X86-NEXT: cmoval %eax, %esi716; X86-NEXT: movl {{[0-9]+}}(%esp), %eax717; X86-NEXT: cmpl %edx, %eax718; X86-NEXT: cmoval %eax, %edx719; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill720; X86-NEXT: movl {{[0-9]+}}(%esp), %eax721; X86-NEXT: cmpl %ecx, %eax722; X86-NEXT: cmoval %eax, %ecx723; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill724; X86-NEXT: movl {{[0-9]+}}(%esp), %edx725; X86-NEXT: movl {{[0-9]+}}(%esp), %eax726; X86-NEXT: cmpl %edx, %eax727; X86-NEXT: cmoval %eax, %edx728; X86-NEXT: movl {{[0-9]+}}(%esp), %eax729; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx730; X86-NEXT: cmpl %eax, %ecx731; X86-NEXT: cmoval %ecx, %eax732; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx733; X86-NEXT: movl %eax, 28(%ecx)734; X86-NEXT: movl %edx, 24(%ecx)735; X86-NEXT: movl (%esp), %eax # 4-byte Reload736; X86-NEXT: movl %eax, 20(%ecx)737; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload738; X86-NEXT: movl %eax, 16(%ecx)739; X86-NEXT: movl %esi, 12(%ecx)740; X86-NEXT: movl %edi, 8(%ecx)741; X86-NEXT: movl %ebx, 4(%ecx)742; X86-NEXT: movl %ebp, (%ecx)743; X86-NEXT: movl %ecx, %eax744; X86-NEXT: addl $8, %esp745; X86-NEXT: popl %esi746; X86-NEXT: popl %edi747; X86-NEXT: popl %ebx748; X86-NEXT: popl %ebp749; X86-NEXT: retl $4750 %r = call <8 x i32> @llvm.umax.v8i32(<8 x i32> %a, <8 x i32> %b)751 ret <8 x i32> %r752}753 754define <8 x i32> @test_v8i32_1(<8 x i32> %a) nounwind {755; SSE-LABEL: test_v8i32_1:756; SSE: # %bb.0:757; SSE-NEXT: pxor %xmm2, %xmm2758; SSE-NEXT: movdqa %xmm0, %xmm3759; SSE-NEXT: pcmpeqd %xmm2, %xmm3760; SSE-NEXT: psubd %xmm3, %xmm0761; SSE-NEXT: pcmpeqd %xmm1, %xmm2762; SSE-NEXT: psubd %xmm2, %xmm1763; SSE-NEXT: retq764;765; AVX1-LABEL: test_v8i32_1:766; AVX1: # %bb.0:767; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1768; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [1,1,1,1]769; AVX1-NEXT: vpmaxud %xmm2, %xmm1, %xmm1770; AVX1-NEXT: vpmaxud %xmm2, %xmm0, %xmm0771; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0772; AVX1-NEXT: retq773;774; AVX2-LABEL: test_v8i32_1:775; AVX2: # %bb.0:776; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]777; AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm0778; AVX2-NEXT: retq779;780; X86-LABEL: test_v8i32_1:781; X86: # %bb.0:782; X86-NEXT: pushl %ebp783; X86-NEXT: pushl %ebx784; X86-NEXT: pushl %edi785; X86-NEXT: pushl %esi786; X86-NEXT: subl $8, %esp787; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx788; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp789; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx790; X86-NEXT: movl {{[0-9]+}}(%esp), %edi791; X86-NEXT: movl {{[0-9]+}}(%esp), %esi792; X86-NEXT: movl {{[0-9]+}}(%esp), %edx793; X86-NEXT: movl {{[0-9]+}}(%esp), %eax794; X86-NEXT: cmpl $1, %eax795; X86-NEXT: adcl $0, %eax796; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill797; X86-NEXT: cmpl $1, %edx798; X86-NEXT: adcl $0, %edx799; X86-NEXT: cmpl $1, %esi800; X86-NEXT: adcl $0, %esi801; X86-NEXT: cmpl $1, %edi802; X86-NEXT: adcl $0, %edi803; X86-NEXT: cmpl $1, %ebx804; X86-NEXT: adcl $0, %ebx805; X86-NEXT: cmpl $1, %ebp806; X86-NEXT: adcl $0, %ebp807; X86-NEXT: cmpl $1, %ecx808; X86-NEXT: adcl $0, %ecx809; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill810; X86-NEXT: movl {{[0-9]+}}(%esp), %eax811; X86-NEXT: cmpl $1, %eax812; X86-NEXT: adcl $0, %eax813; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx814; X86-NEXT: movl %eax, 28(%ecx)815; X86-NEXT: movl (%esp), %eax # 4-byte Reload816; X86-NEXT: movl %eax, 24(%ecx)817; X86-NEXT: movl %ebp, 20(%ecx)818; X86-NEXT: movl %ebx, 16(%ecx)819; X86-NEXT: movl %edi, 12(%ecx)820; X86-NEXT: movl %esi, 8(%ecx)821; X86-NEXT: movl %edx, 4(%ecx)822; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload823; X86-NEXT: movl %eax, (%ecx)824; X86-NEXT: movl %ecx, %eax825; X86-NEXT: addl $8, %esp826; X86-NEXT: popl %esi827; X86-NEXT: popl %edi828; X86-NEXT: popl %ebx829; X86-NEXT: popl %ebp830; X86-NEXT: retl $4831 %r = call <8 x i32> @llvm.umax.v8i32(<8 x i32> %a, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>)832 ret <8 x i32> %r833}834 835define <8 x i16> @test_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {836; SSE-LABEL: test_v8i16:837; SSE: # %bb.0:838; SSE-NEXT: psubusw %xmm0, %xmm1839; SSE-NEXT: paddw %xmm1, %xmm0840; SSE-NEXT: retq841;842; AVX-LABEL: test_v8i16:843; AVX: # %bb.0:844; AVX-NEXT: vpmaxuw %xmm1, %xmm0, %xmm0845; AVX-NEXT: retq846;847; X86-LABEL: test_v8i16:848; X86: # %bb.0:849; X86-NEXT: pushl %ebp850; X86-NEXT: pushl %ebx851; X86-NEXT: pushl %edi852; X86-NEXT: pushl %esi853; X86-NEXT: subl $8, %esp854; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx855; X86-NEXT: movl {{[0-9]+}}(%esp), %edx856; X86-NEXT: movl {{[0-9]+}}(%esp), %esi857; X86-NEXT: movl {{[0-9]+}}(%esp), %edi858; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx859; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp860; X86-NEXT: movl {{[0-9]+}}(%esp), %eax861; X86-NEXT: cmpw %bp, %ax862; X86-NEXT: cmoval %eax, %ebp863; X86-NEXT: movl {{[0-9]+}}(%esp), %eax864; X86-NEXT: cmpw %bx, %ax865; X86-NEXT: cmoval %eax, %ebx866; X86-NEXT: movl {{[0-9]+}}(%esp), %eax867; X86-NEXT: cmpw %di, %ax868; X86-NEXT: cmoval %eax, %edi869; X86-NEXT: movl {{[0-9]+}}(%esp), %eax870; X86-NEXT: cmpw %si, %ax871; X86-NEXT: cmoval %eax, %esi872; X86-NEXT: movl {{[0-9]+}}(%esp), %eax873; X86-NEXT: cmpw %dx, %ax874; X86-NEXT: cmoval %eax, %edx875; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill876; X86-NEXT: movl {{[0-9]+}}(%esp), %eax877; X86-NEXT: cmpw %cx, %ax878; X86-NEXT: cmoval %eax, %ecx879; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill880; X86-NEXT: movl {{[0-9]+}}(%esp), %edx881; X86-NEXT: movl {{[0-9]+}}(%esp), %eax882; X86-NEXT: cmpw %dx, %ax883; X86-NEXT: cmoval %eax, %edx884; X86-NEXT: movl {{[0-9]+}}(%esp), %eax885; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx886; X86-NEXT: cmpw %ax, %cx887; X86-NEXT: cmoval %ecx, %eax888; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx889; X86-NEXT: movw %ax, 14(%ecx)890; X86-NEXT: movw %dx, 12(%ecx)891; X86-NEXT: movl (%esp), %eax # 4-byte Reload892; X86-NEXT: movw %ax, 10(%ecx)893; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload894; X86-NEXT: movw %ax, 8(%ecx)895; X86-NEXT: movw %si, 6(%ecx)896; X86-NEXT: movw %di, 4(%ecx)897; X86-NEXT: movw %bx, 2(%ecx)898; X86-NEXT: movw %bp, (%ecx)899; X86-NEXT: movl %ecx, %eax900; X86-NEXT: addl $8, %esp901; X86-NEXT: popl %esi902; X86-NEXT: popl %edi903; X86-NEXT: popl %ebx904; X86-NEXT: popl %ebp905; X86-NEXT: retl $4906 %r = call <8 x i16> @llvm.umax.v8i16(<8 x i16> %a, <8 x i16> %b)907 ret <8 x i16> %r908}909 910define <8 x i16> @test_v8i16_1(<8 x i16> %a) nounwind {911; SSE-LABEL: test_v8i16_1:912; SSE: # %bb.0:913; SSE-NEXT: pxor %xmm1, %xmm1914; SSE-NEXT: pcmpeqw %xmm0, %xmm1915; SSE-NEXT: psubw %xmm1, %xmm0916; SSE-NEXT: retq917;918; AVX-LABEL: test_v8i16_1:919; AVX: # %bb.0:920; AVX-NEXT: vpmaxuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0921; AVX-NEXT: retq922;923; X86-LABEL: test_v8i16_1:924; X86: # %bb.0:925; X86-NEXT: pushl %ebp926; X86-NEXT: pushl %ebx927; X86-NEXT: pushl %edi928; X86-NEXT: pushl %esi929; X86-NEXT: subl $8, %esp930; X86-NEXT: movl {{[0-9]+}}(%esp), %eax931; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx932; X86-NEXT: movl {{[0-9]+}}(%esp), %esi933; X86-NEXT: movl {{[0-9]+}}(%esp), %edi934; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx935; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp936; X86-NEXT: movl {{[0-9]+}}(%esp), %edx937; X86-NEXT: cmpw $1, %dx938; X86-NEXT: adcl $0, %edx939; X86-NEXT: cmpw $1, %bp940; X86-NEXT: adcl $0, %ebp941; X86-NEXT: cmpw $1, %bx942; X86-NEXT: adcl $0, %ebx943; X86-NEXT: cmpw $1, %di944; X86-NEXT: adcl $0, %edi945; X86-NEXT: cmpw $1, %si946; X86-NEXT: adcl $0, %esi947; X86-NEXT: cmpw $1, %cx948; X86-NEXT: adcl $0, %ecx949; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill950; X86-NEXT: cmpw $1, %ax951; X86-NEXT: adcl $0, %eax952; X86-NEXT: movl %eax, (%esp) # 4-byte Spill953; X86-NEXT: movl {{[0-9]+}}(%esp), %eax954; X86-NEXT: cmpw $1, %ax955; X86-NEXT: adcl $0, %eax956; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx957; X86-NEXT: movw %ax, 14(%ecx)958; X86-NEXT: movl (%esp), %eax # 4-byte Reload959; X86-NEXT: movw %ax, 12(%ecx)960; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload961; X86-NEXT: movw %ax, 10(%ecx)962; X86-NEXT: movw %si, 8(%ecx)963; X86-NEXT: movw %di, 6(%ecx)964; X86-NEXT: movw %bx, 4(%ecx)965; X86-NEXT: movw %bp, 2(%ecx)966; X86-NEXT: movw %dx, (%ecx)967; X86-NEXT: movl %ecx, %eax968; X86-NEXT: addl $8, %esp969; X86-NEXT: popl %esi970; X86-NEXT: popl %edi971; X86-NEXT: popl %ebx972; X86-NEXT: popl %ebp973; X86-NEXT: retl $4974 %r = call <8 x i16> @llvm.umax.v8i16(<8 x i16> %a, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)975 ret <8 x i16> %r976}977 978define <16 x i8> @test_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {979; SSE-LABEL: test_v16i8:980; SSE: # %bb.0:981; SSE-NEXT: pmaxub %xmm1, %xmm0982; SSE-NEXT: retq983;984; AVX-LABEL: test_v16i8:985; AVX: # %bb.0:986; AVX-NEXT: vpmaxub %xmm1, %xmm0, %xmm0987; AVX-NEXT: retq988;989; X86-LABEL: test_v16i8:990; X86: # %bb.0:991; X86-NEXT: pushl %ebp992; X86-NEXT: pushl %ebx993; X86-NEXT: pushl %edi994; X86-NEXT: pushl %esi995; X86-NEXT: subl $40, %esp996; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx997; X86-NEXT: movl {{[0-9]+}}(%esp), %edx998; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx999; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1000; X86-NEXT: cmpb %bl, %al1001; X86-NEXT: cmoval %eax, %ebx1002; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1003; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1004; X86-NEXT: cmpb %dl, %al1005; X86-NEXT: cmoval %eax, %edx1006; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1007; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1008; X86-NEXT: cmpb %cl, %al1009; X86-NEXT: cmoval %eax, %ecx1010; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1011; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1012; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1013; X86-NEXT: cmpb %cl, %al1014; X86-NEXT: cmoval %eax, %ecx1015; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1016; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1017; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1018; X86-NEXT: cmpb %cl, %al1019; X86-NEXT: cmoval %eax, %ecx1020; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1021; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1022; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1023; X86-NEXT: cmpb %cl, %al1024; X86-NEXT: cmoval %eax, %ecx1025; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1026; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1027; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1028; X86-NEXT: cmpb %cl, %al1029; X86-NEXT: cmoval %eax, %ecx1030; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1031; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1032; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1033; X86-NEXT: cmpb %cl, %al1034; X86-NEXT: cmoval %eax, %ecx1035; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1036; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1037; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1038; X86-NEXT: cmpb %cl, %al1039; X86-NEXT: cmoval %eax, %ecx1040; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1041; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1042; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1043; X86-NEXT: cmpb %cl, %al1044; X86-NEXT: cmoval %eax, %ecx1045; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill1046; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1047; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1048; X86-NEXT: cmpb %cl, %al1049; X86-NEXT: cmoval %eax, %ecx1050; X86-NEXT: movl %ecx, %ebp1051; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1052; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1053; X86-NEXT: cmpb %cl, %al1054; X86-NEXT: cmoval %eax, %ecx1055; X86-NEXT: movl %ecx, %edi1056; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1057; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1058; X86-NEXT: cmpb %cl, %al1059; X86-NEXT: cmoval %eax, %ecx1060; X86-NEXT: movl %ecx, %esi1061; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx1062; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1063; X86-NEXT: cmpb %bl, %al1064; X86-NEXT: cmoval %eax, %ebx1065; X86-NEXT: movl {{[0-9]+}}(%esp), %edx1066; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1067; X86-NEXT: cmpb %dl, %al1068; X86-NEXT: cmoval %eax, %edx1069; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1070; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1071; X86-NEXT: cmpb %cl, %al1072; X86-NEXT: cmoval %eax, %ecx1073; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1074; X86-NEXT: movb %cl, 15(%eax)1075; X86-NEXT: movb %dl, 14(%eax)1076; X86-NEXT: movb %bl, 13(%eax)1077; X86-NEXT: movl %esi, %ecx1078; X86-NEXT: movb %cl, 12(%eax)1079; X86-NEXT: movl %edi, %ecx1080; X86-NEXT: movb %cl, 11(%eax)1081; X86-NEXT: movl %ebp, %ecx1082; X86-NEXT: movb %cl, 10(%eax)1083; X86-NEXT: movl (%esp), %ecx # 4-byte Reload1084; X86-NEXT: movb %cl, 9(%eax)1085; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1086; X86-NEXT: movb %cl, 8(%eax)1087; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1088; X86-NEXT: movb %cl, 7(%eax)1089; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1090; X86-NEXT: movb %cl, 6(%eax)1091; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1092; X86-NEXT: movb %cl, 5(%eax)1093; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1094; X86-NEXT: movb %cl, 4(%eax)1095; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1096; X86-NEXT: movb %cl, 3(%eax)1097; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1098; X86-NEXT: movb %cl, 2(%eax)1099; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1100; X86-NEXT: movb %cl, 1(%eax)1101; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1102; X86-NEXT: movb %cl, (%eax)1103; X86-NEXT: addl $40, %esp1104; X86-NEXT: popl %esi1105; X86-NEXT: popl %edi1106; X86-NEXT: popl %ebx1107; X86-NEXT: popl %ebp1108; X86-NEXT: retl $41109 %r = call <16 x i8> @llvm.umax.v16i8(<16 x i8> %a, <16 x i8> %b)1110 ret <16 x i8> %r1111}1112 1113define <16 x i8> @test_v16i8_1(<16 x i8> %a) nounwind {1114; SSE-LABEL: test_v16i8_1:1115; SSE: # %bb.0:1116; SSE-NEXT: pmaxub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01117; SSE-NEXT: retq1118;1119; AVX-LABEL: test_v16i8_1:1120; AVX: # %bb.0:1121; AVX-NEXT: vpmaxub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01122; AVX-NEXT: retq1123;1124; X86-LABEL: test_v16i8_1:1125; X86: # %bb.0:1126; X86-NEXT: pushl %ebp1127; X86-NEXT: pushl %ebx1128; X86-NEXT: pushl %edi1129; X86-NEXT: pushl %esi1130; X86-NEXT: subl $40, %esp1131; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1132; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1133; X86-NEXT: movl {{[0-9]+}}(%esp), %edx1134; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx1135; X86-NEXT: cmpb $1, %bl1136; X86-NEXT: adcl $0, %ebx1137; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1138; X86-NEXT: cmpb $1, %dl1139; X86-NEXT: adcl $0, %edx1140; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1141; X86-NEXT: cmpb $1, %cl1142; X86-NEXT: adcl $0, %ecx1143; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1144; X86-NEXT: cmpb $1, %al1145; X86-NEXT: adcl $0, %eax1146; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1147; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1148; X86-NEXT: cmpb $1, %al1149; X86-NEXT: adcl $0, %eax1150; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1151; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1152; X86-NEXT: cmpb $1, %al1153; X86-NEXT: adcl $0, %eax1154; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1155; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1156; X86-NEXT: cmpb $1, %al1157; X86-NEXT: adcl $0, %eax1158; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1159; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1160; X86-NEXT: cmpb $1, %al1161; X86-NEXT: adcl $0, %eax1162; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1163; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1164; X86-NEXT: cmpb $1, %al1165; X86-NEXT: adcl $0, %eax1166; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill1167; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1168; X86-NEXT: cmpb $1, %al1169; X86-NEXT: adcl $0, %eax1170; X86-NEXT: movl %eax, (%esp) # 4-byte Spill1171; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1172; X86-NEXT: cmpb $1, %al1173; X86-NEXT: adcl $0, %eax1174; X86-NEXT: movl %eax, %ebp1175; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1176; X86-NEXT: cmpb $1, %al1177; X86-NEXT: adcl $0, %eax1178; X86-NEXT: movl %eax, %edi1179; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1180; X86-NEXT: cmpb $1, %al1181; X86-NEXT: adcl $0, %eax1182; X86-NEXT: movl %eax, %esi1183; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx1184; X86-NEXT: cmpb $1, %bl1185; X86-NEXT: adcl $0, %ebx1186; X86-NEXT: movl {{[0-9]+}}(%esp), %edx1187; X86-NEXT: cmpb $1, %dl1188; X86-NEXT: adcl $0, %edx1189; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1190; X86-NEXT: cmpb $1, %cl1191; X86-NEXT: adcl $0, %ecx1192; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1193; X86-NEXT: movb %cl, 15(%eax)1194; X86-NEXT: movb %dl, 14(%eax)1195; X86-NEXT: movb %bl, 13(%eax)1196; X86-NEXT: movl %esi, %ecx1197; X86-NEXT: movb %cl, 12(%eax)1198; X86-NEXT: movl %edi, %ecx1199; X86-NEXT: movb %cl, 11(%eax)1200; X86-NEXT: movl %ebp, %ecx1201; X86-NEXT: movb %cl, 10(%eax)1202; X86-NEXT: movl (%esp), %ecx # 4-byte Reload1203; X86-NEXT: movb %cl, 9(%eax)1204; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1205; X86-NEXT: movb %cl, 8(%eax)1206; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1207; X86-NEXT: movb %cl, 7(%eax)1208; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1209; X86-NEXT: movb %cl, 6(%eax)1210; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1211; X86-NEXT: movb %cl, 5(%eax)1212; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1213; X86-NEXT: movb %cl, 4(%eax)1214; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1215; X86-NEXT: movb %cl, 3(%eax)1216; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1217; X86-NEXT: movb %cl, 2(%eax)1218; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1219; X86-NEXT: movb %cl, 1(%eax)1220; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload1221; X86-NEXT: movb %cl, (%eax)1222; X86-NEXT: addl $40, %esp1223; X86-NEXT: popl %esi1224; X86-NEXT: popl %edi1225; X86-NEXT: popl %ebx1226; X86-NEXT: popl %ebp1227; X86-NEXT: retl $41228 %r = call <16 x i8> @llvm.umax.v16i8(<16 x i8> %a, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)1229 ret <16 x i8> %r1230}1231 1232define i16 @test_signbits_i16(i16 %a, i16 %b) nounwind {1233; X64-LABEL: test_signbits_i16:1234; X64: # %bb.0:1235; X64-NEXT: movswl %si, %eax1236; X64-NEXT: movswl %di, %ecx1237; X64-NEXT: shrl $15, %ecx1238; X64-NEXT: shrl $8, %eax1239; X64-NEXT: cmpw %ax, %cx1240; X64-NEXT: cmoval %ecx, %eax1241; X64-NEXT: # kill: def $ax killed $ax killed $eax1242; X64-NEXT: retq1243;1244; X86-LABEL: test_signbits_i16:1245; X86: # %bb.0:1246; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax1247; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx1248; X86-NEXT: shrl $15, %ecx1249; X86-NEXT: cmpw %ax, %cx1250; X86-NEXT: cmoval %ecx, %eax1251; X86-NEXT: # kill: def $ax killed $ax killed $eax1252; X86-NEXT: retl1253 %ax = ashr i16 %a, 151254 %bx = ashr i16 %b, 81255 %r = call i16 @llvm.umax.i16(i16 %ax, i16 %bx)1256 ret i16 %r1257}1258 1259define i32 @test_signbits_i32(i32 %a, i32 %b) nounwind {1260; X64-LABEL: test_signbits_i32:1261; X64: # %bb.0:1262; X64-NEXT: movl %esi, %eax1263; X64-NEXT: sarl $16, %edi1264; X64-NEXT: sarl $17, %eax1265; X64-NEXT: cmpl %eax, %edi1266; X64-NEXT: cmoval %edi, %eax1267; X64-NEXT: retq1268;1269; X86-LABEL: test_signbits_i32:1270; X86: # %bb.0:1271; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx1272; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1273; X86-NEXT: sarl $17, %eax1274; X86-NEXT: cmpl %eax, %ecx1275; X86-NEXT: cmoval %ecx, %eax1276; X86-NEXT: retl1277 %ax = ashr i32 %a, 161278 %bx = ashr i32 %b, 171279 %r = call i32 @llvm.umax.i32(i32 %ax, i32 %bx)1280 ret i32 %r1281}1282 1283define i64 @test_signbits_i64(i64 %a, i64 %b) nounwind {1284; X64-LABEL: test_signbits_i64:1285; X64: # %bb.0:1286; X64-NEXT: movq %rsi, %rax1287; X64-NEXT: sarq $32, %rdi1288; X64-NEXT: sarq $32, %rax1289; X64-NEXT: cmpq %rax, %rdi1290; X64-NEXT: cmovaq %rdi, %rax1291; X64-NEXT: retq1292;1293; X86-LABEL: test_signbits_i64:1294; X86: # %bb.0:1295; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1296; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1297; X86-NEXT: cmpl %eax, %ecx1298; X86-NEXT: cmoval %ecx, %eax1299; X86-NEXT: movl %eax, %edx1300; X86-NEXT: sarl $31, %edx1301; X86-NEXT: retl1302 %ax = ashr i64 %a, 321303 %bx = ashr i64 %b, 321304 %r = call i64 @llvm.umax.i64(i64 %ax, i64 %bx)1305 ret i64 %r1306}1307 1308define i128 @test_signbits_i128(i128 %a, i128 %b) nounwind {1309; X64-LABEL: test_signbits_i128:1310; X64: # %bb.0:1311; X64-NEXT: movq %rcx, %rax1312; X64-NEXT: sarq $28, %rax1313; X64-NEXT: cmpq %rax, %rsi1314; X64-NEXT: cmovaq %rsi, %rax1315; X64-NEXT: movq %rax, %rdx1316; X64-NEXT: sarq $63, %rdx1317; X64-NEXT: retq1318;1319; X86-LABEL: test_signbits_i128:1320; X86: # %bb.0:1321; X86-NEXT: pushl %ebp1322; X86-NEXT: movl %esp, %ebp1323; X86-NEXT: pushl %edi1324; X86-NEXT: pushl %esi1325; X86-NEXT: andl $-16, %esp1326; X86-NEXT: movl 32(%ebp), %esi1327; X86-NEXT: movl 36(%ebp), %eax1328; X86-NEXT: movl 48(%ebp), %ecx1329; X86-NEXT: movl 52(%ebp), %edx1330; X86-NEXT: shrdl $28, %edx, %ecx1331; X86-NEXT: sarl $28, %edx1332; X86-NEXT: cmpl %esi, %ecx1333; X86-NEXT: movl %edx, %edi1334; X86-NEXT: sbbl %eax, %edi1335; X86-NEXT: cmovbl %esi, %ecx1336; X86-NEXT: cmovbl %eax, %edx1337; X86-NEXT: movl 8(%ebp), %eax1338; X86-NEXT: movl %edx, 4(%eax)1339; X86-NEXT: movl %ecx, (%eax)1340; X86-NEXT: sarl $31, %edx1341; X86-NEXT: movl %edx, 12(%eax)1342; X86-NEXT: movl %edx, 8(%eax)1343; X86-NEXT: leal -8(%ebp), %esp1344; X86-NEXT: popl %esi1345; X86-NEXT: popl %edi1346; X86-NEXT: popl %ebp1347; X86-NEXT: retl $41348 %ax = ashr i128 %a, 641349 %bx = ashr i128 %b, 921350 %r = call i128 @llvm.umax.i128(i128 %ax, i128 %bx)1351 ret i128 %r1352}1353