2691 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 | FileCheck %s --check-prefixes=X64,SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=X64,SSE,SSE44; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=X64,AVX,AVX25; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=X64,AVX,AVX5126; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefix=X867 8define i8 @scmp.8.8(i8 %x, i8 %y) nounwind {9; X64-LABEL: scmp.8.8:10; X64: # %bb.0:11; X64-NEXT: cmpb %sil, %dil12; X64-NEXT: setl %cl13; X64-NEXT: setg %al14; X64-NEXT: subb %cl, %al15; X64-NEXT: retq16;17; X86-LABEL: scmp.8.8:18; X86: # %bb.0:19; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax20; X86-NEXT: cmpb {{[0-9]+}}(%esp), %al21; X86-NEXT: setl %cl22; X86-NEXT: setg %al23; X86-NEXT: subb %cl, %al24; X86-NEXT: retl25 %1 = call i8 @llvm.scmp(i8 %x, i8 %y)26 ret i8 %127}28 29define i8 @scmp.8.16(i16 %x, i16 %y) nounwind {30; X64-LABEL: scmp.8.16:31; X64: # %bb.0:32; X64-NEXT: cmpw %si, %di33; X64-NEXT: setl %cl34; X64-NEXT: setg %al35; X64-NEXT: subb %cl, %al36; X64-NEXT: retq37;38; X86-LABEL: scmp.8.16:39; X86: # %bb.0:40; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax41; X86-NEXT: cmpw {{[0-9]+}}(%esp), %ax42; X86-NEXT: setl %cl43; X86-NEXT: setg %al44; X86-NEXT: subb %cl, %al45; X86-NEXT: retl46 %1 = call i8 @llvm.scmp(i16 %x, i16 %y)47 ret i8 %148}49 50define i8 @scmp.8.32(i32 %x, i32 %y) nounwind {51; X64-LABEL: scmp.8.32:52; X64: # %bb.0:53; X64-NEXT: cmpl %esi, %edi54; X64-NEXT: setl %cl55; X64-NEXT: setg %al56; X64-NEXT: subb %cl, %al57; X64-NEXT: retq58;59; X86-LABEL: scmp.8.32:60; X86: # %bb.0:61; X86-NEXT: movl {{[0-9]+}}(%esp), %eax62; X86-NEXT: cmpl {{[0-9]+}}(%esp), %eax63; X86-NEXT: setl %cl64; X86-NEXT: setg %al65; X86-NEXT: subb %cl, %al66; X86-NEXT: retl67 %1 = call i8 @llvm.scmp(i32 %x, i32 %y)68 ret i8 %169}70 71define i8 @scmp.8.64(i64 %x, i64 %y) nounwind {72; X64-LABEL: scmp.8.64:73; X64: # %bb.0:74; X64-NEXT: cmpq %rsi, %rdi75; X64-NEXT: setl %cl76; X64-NEXT: setg %al77; X64-NEXT: subb %cl, %al78; X64-NEXT: retq79;80; X86-LABEL: scmp.8.64:81; X86: # %bb.0:82; X86-NEXT: pushl %ebx83; X86-NEXT: pushl %edi84; X86-NEXT: pushl %esi85; X86-NEXT: movl {{[0-9]+}}(%esp), %eax86; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx87; X86-NEXT: movl {{[0-9]+}}(%esp), %edx88; X86-NEXT: movl {{[0-9]+}}(%esp), %esi89; X86-NEXT: cmpl %eax, %edx90; X86-NEXT: movl %esi, %edi91; X86-NEXT: sbbl %ecx, %edi92; X86-NEXT: setl %bl93; X86-NEXT: cmpl %edx, %eax94; X86-NEXT: sbbl %esi, %ecx95; X86-NEXT: setl %al96; X86-NEXT: subb %bl, %al97; X86-NEXT: popl %esi98; X86-NEXT: popl %edi99; X86-NEXT: popl %ebx100; X86-NEXT: retl101 %1 = call i8 @llvm.scmp(i64 %x, i64 %y)102 ret i8 %1103}104 105define i8 @scmp.8.128(i128 %x, i128 %y) nounwind {106; X64-LABEL: scmp.8.128:107; X64: # %bb.0:108; X64-NEXT: cmpq %rdx, %rdi109; X64-NEXT: movq %rsi, %rax110; X64-NEXT: sbbq %rcx, %rax111; X64-NEXT: setl %r8b112; X64-NEXT: cmpq %rdi, %rdx113; X64-NEXT: sbbq %rsi, %rcx114; X64-NEXT: setl %al115; X64-NEXT: subb %r8b, %al116; X64-NEXT: retq117;118; X86-LABEL: scmp.8.128:119; X86: # %bb.0:120; X86-NEXT: pushl %ebp121; X86-NEXT: movl %esp, %ebp122; X86-NEXT: pushl %ebx123; X86-NEXT: pushl %edi124; X86-NEXT: pushl %esi125; X86-NEXT: andl $-16, %esp126; X86-NEXT: subl $16, %esp127; X86-NEXT: movl 24(%ebp), %ecx128; X86-NEXT: movl 28(%ebp), %eax129; X86-NEXT: movl 12(%ebp), %edi130; X86-NEXT: cmpl %ecx, 8(%ebp)131; X86-NEXT: sbbl %eax, %edi132; X86-NEXT: movl 32(%ebp), %edi133; X86-NEXT: movl 16(%ebp), %ebx134; X86-NEXT: sbbl %edi, %ebx135; X86-NEXT: movl 36(%ebp), %ebx136; X86-NEXT: movl 20(%ebp), %edx137; X86-NEXT: movl %edx, %ecx138; X86-NEXT: sbbl %ebx, %ecx139; X86-NEXT: setl %cl140; X86-NEXT: movl 24(%ebp), %esi141; X86-NEXT: cmpl 8(%ebp), %esi142; X86-NEXT: sbbl 12(%ebp), %eax143; X86-NEXT: sbbl 16(%ebp), %edi144; X86-NEXT: sbbl %edx, %ebx145; X86-NEXT: setl %al146; X86-NEXT: subb %cl, %al147; X86-NEXT: leal -12(%ebp), %esp148; X86-NEXT: popl %esi149; X86-NEXT: popl %edi150; X86-NEXT: popl %ebx151; X86-NEXT: popl %ebp152; X86-NEXT: retl153 %1 = call i8 @llvm.scmp(i128 %x, i128 %y)154 ret i8 %1155}156 157define i32 @scmp.32.32(i32 %x, i32 %y) nounwind {158; X64-LABEL: scmp.32.32:159; X64: # %bb.0:160; X64-NEXT: cmpl %esi, %edi161; X64-NEXT: setl %al162; X64-NEXT: setg %cl163; X64-NEXT: subb %al, %cl164; X64-NEXT: movsbl %cl, %eax165; X64-NEXT: retq166;167; X86-LABEL: scmp.32.32:168; X86: # %bb.0:169; X86-NEXT: movl {{[0-9]+}}(%esp), %eax170; X86-NEXT: cmpl {{[0-9]+}}(%esp), %eax171; X86-NEXT: setl %al172; X86-NEXT: setg %cl173; X86-NEXT: subb %al, %cl174; X86-NEXT: movsbl %cl, %eax175; X86-NEXT: retl176 %1 = call i32 @llvm.scmp(i32 %x, i32 %y)177 ret i32 %1178}179 180define i32 @scmp.32.64(i64 %x, i64 %y) nounwind {181; X64-LABEL: scmp.32.64:182; X64: # %bb.0:183; X64-NEXT: cmpq %rsi, %rdi184; X64-NEXT: setl %al185; X64-NEXT: setg %cl186; X64-NEXT: subb %al, %cl187; X64-NEXT: movsbl %cl, %eax188; X64-NEXT: retq189;190; X86-LABEL: scmp.32.64:191; X86: # %bb.0:192; X86-NEXT: pushl %ebx193; X86-NEXT: pushl %edi194; X86-NEXT: pushl %esi195; X86-NEXT: movl {{[0-9]+}}(%esp), %eax196; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx197; X86-NEXT: movl {{[0-9]+}}(%esp), %edx198; X86-NEXT: movl {{[0-9]+}}(%esp), %esi199; X86-NEXT: cmpl %eax, %edx200; X86-NEXT: movl %esi, %edi201; X86-NEXT: sbbl %ecx, %edi202; X86-NEXT: setl %bl203; X86-NEXT: cmpl %edx, %eax204; X86-NEXT: sbbl %esi, %ecx205; X86-NEXT: setl %al206; X86-NEXT: subb %bl, %al207; X86-NEXT: movsbl %al, %eax208; X86-NEXT: popl %esi209; X86-NEXT: popl %edi210; X86-NEXT: popl %ebx211; X86-NEXT: retl212 %1 = call i32 @llvm.scmp(i64 %x, i64 %y)213 ret i32 %1214}215 216define i64 @scmp.64.64(i64 %x, i64 %y) nounwind {217; X64-LABEL: scmp.64.64:218; X64: # %bb.0:219; X64-NEXT: cmpq %rsi, %rdi220; X64-NEXT: setl %al221; X64-NEXT: setg %cl222; X64-NEXT: subb %al, %cl223; X64-NEXT: movsbq %cl, %rax224; X64-NEXT: retq225;226; X86-LABEL: scmp.64.64:227; X86: # %bb.0:228; X86-NEXT: pushl %ebx229; X86-NEXT: pushl %edi230; X86-NEXT: pushl %esi231; X86-NEXT: movl {{[0-9]+}}(%esp), %eax232; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx233; X86-NEXT: movl {{[0-9]+}}(%esp), %edx234; X86-NEXT: movl {{[0-9]+}}(%esp), %esi235; X86-NEXT: cmpl %eax, %edx236; X86-NEXT: movl %esi, %edi237; X86-NEXT: sbbl %ecx, %edi238; X86-NEXT: setl %bl239; X86-NEXT: cmpl %edx, %eax240; X86-NEXT: sbbl %esi, %ecx241; X86-NEXT: setl %al242; X86-NEXT: subb %bl, %al243; X86-NEXT: movsbl %al, %eax244; X86-NEXT: movl %eax, %edx245; X86-NEXT: sarl $31, %edx246; X86-NEXT: popl %esi247; X86-NEXT: popl %edi248; X86-NEXT: popl %ebx249; X86-NEXT: retl250 %1 = call i64 @llvm.scmp(i64 %x, i64 %y)251 ret i64 %1252}253 254define i4 @scmp_narrow_result(i32 %x, i32 %y) nounwind {255; X64-LABEL: scmp_narrow_result:256; X64: # %bb.0:257; X64-NEXT: cmpl %esi, %edi258; X64-NEXT: setl %cl259; X64-NEXT: setg %al260; X64-NEXT: subb %cl, %al261; X64-NEXT: retq262;263; X86-LABEL: scmp_narrow_result:264; X86: # %bb.0:265; X86-NEXT: movl {{[0-9]+}}(%esp), %eax266; X86-NEXT: cmpl {{[0-9]+}}(%esp), %eax267; X86-NEXT: setl %cl268; X86-NEXT: setg %al269; X86-NEXT: subb %cl, %al270; X86-NEXT: retl271 %1 = call i4 @llvm.scmp(i32 %x, i32 %y)272 ret i4 %1273}274 275define i8 @scmp_narrow_op(i62 %x, i62 %y) nounwind {276; X64-LABEL: scmp_narrow_op:277; X64: # %bb.0:278; X64-NEXT: shlq $2, %rsi279; X64-NEXT: sarq $2, %rsi280; X64-NEXT: shlq $2, %rdi281; X64-NEXT: sarq $2, %rdi282; X64-NEXT: cmpq %rsi, %rdi283; X64-NEXT: setl %cl284; X64-NEXT: setg %al285; X64-NEXT: subb %cl, %al286; X64-NEXT: retq287;288; X86-LABEL: scmp_narrow_op:289; X86: # %bb.0:290; X86-NEXT: pushl %ebx291; X86-NEXT: pushl %edi292; X86-NEXT: pushl %esi293; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx294; X86-NEXT: movl {{[0-9]+}}(%esp), %eax295; X86-NEXT: shll $2, %eax296; X86-NEXT: sarl $2, %eax297; X86-NEXT: movl {{[0-9]+}}(%esp), %edx298; X86-NEXT: movl {{[0-9]+}}(%esp), %esi299; X86-NEXT: shll $2, %esi300; X86-NEXT: sarl $2, %esi301; X86-NEXT: cmpl %ecx, %edx302; X86-NEXT: movl %esi, %edi303; X86-NEXT: sbbl %eax, %edi304; X86-NEXT: setl %bl305; X86-NEXT: cmpl %edx, %ecx306; X86-NEXT: sbbl %esi, %eax307; X86-NEXT: setl %al308; X86-NEXT: subb %bl, %al309; X86-NEXT: popl %esi310; X86-NEXT: popl %edi311; X86-NEXT: popl %ebx312; X86-NEXT: retl313 %1 = call i8 @llvm.scmp(i62 %x, i62 %y)314 ret i8 %1315}316 317define i141 @scmp_wide_result(i32 %x, i32 %y) nounwind {318; X64-LABEL: scmp_wide_result:319; X64: # %bb.0:320; X64-NEXT: cmpl %esi, %edi321; X64-NEXT: setl %al322; X64-NEXT: setg %cl323; X64-NEXT: subb %al, %cl324; X64-NEXT: movsbq %cl, %rax325; X64-NEXT: movq %rax, %rdx326; X64-NEXT: sarq $63, %rdx327; X64-NEXT: movl %edx, %ecx328; X64-NEXT: andl $8191, %ecx # imm = 0x1FFF329; X64-NEXT: retq330;331; X86-LABEL: scmp_wide_result:332; X86: # %bb.0:333; X86-NEXT: movl {{[0-9]+}}(%esp), %eax334; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx335; X86-NEXT: cmpl {{[0-9]+}}(%esp), %ecx336; X86-NEXT: setl %cl337; X86-NEXT: setg %dl338; X86-NEXT: subb %cl, %dl339; X86-NEXT: movsbl %dl, %ecx340; X86-NEXT: movl %ecx, (%eax)341; X86-NEXT: sarl $31, %ecx342; X86-NEXT: movl %ecx, 12(%eax)343; X86-NEXT: movl %ecx, 8(%eax)344; X86-NEXT: movl %ecx, 4(%eax)345; X86-NEXT: andl $8191, %ecx # imm = 0x1FFF346; X86-NEXT: movw %cx, 16(%eax)347; X86-NEXT: retl $4348 %1 = call i141 @llvm.scmp(i32 %x, i32 %y)349 ret i141 %1350}351 352define i8 @scmp_wide_op(i109 %x, i109 %y) nounwind {353; X64-LABEL: scmp_wide_op:354; X64: # %bb.0:355; X64-NEXT: shlq $19, %rcx356; X64-NEXT: sarq $19, %rcx357; X64-NEXT: shlq $19, %rsi358; X64-NEXT: sarq $19, %rsi359; X64-NEXT: cmpq %rdx, %rdi360; X64-NEXT: movq %rsi, %rax361; X64-NEXT: sbbq %rcx, %rax362; X64-NEXT: setl %r8b363; X64-NEXT: cmpq %rdi, %rdx364; X64-NEXT: sbbq %rsi, %rcx365; X64-NEXT: setl %al366; X64-NEXT: subb %r8b, %al367; X64-NEXT: retq368;369; X86-LABEL: scmp_wide_op:370; X86: # %bb.0:371; X86-NEXT: pushl %ebp372; X86-NEXT: pushl %ebx373; X86-NEXT: pushl %edi374; X86-NEXT: pushl %esi375; X86-NEXT: movl {{[0-9]+}}(%esp), %eax376; X86-NEXT: shll $19, %eax377; X86-NEXT: sarl $19, %eax378; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx379; X86-NEXT: shll $19, %ecx380; X86-NEXT: sarl $19, %ecx381; X86-NEXT: movl {{[0-9]+}}(%esp), %esi382; X86-NEXT: movl {{[0-9]+}}(%esp), %edx383; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp384; X86-NEXT: cmpl %esi, {{[0-9]+}}(%esp)385; X86-NEXT: sbbl %edx, %ebp386; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp387; X86-NEXT: movl {{[0-9]+}}(%esp), %edi388; X86-NEXT: movl %edi, %esi389; X86-NEXT: sbbl %ebp, %esi390; X86-NEXT: movl %ecx, %esi391; X86-NEXT: sbbl %eax, %esi392; X86-NEXT: setl %bl393; X86-NEXT: movl {{[0-9]+}}(%esp), %esi394; X86-NEXT: cmpl {{[0-9]+}}(%esp), %esi395; X86-NEXT: sbbl {{[0-9]+}}(%esp), %edx396; X86-NEXT: sbbl %edi, %ebp397; X86-NEXT: sbbl %ecx, %eax398; X86-NEXT: setl %al399; X86-NEXT: subb %bl, %al400; X86-NEXT: popl %esi401; X86-NEXT: popl %edi402; X86-NEXT: popl %ebx403; X86-NEXT: popl %ebp404; X86-NEXT: retl405 %1 = call i8 @llvm.scmp(i109 %x, i109 %y)406 ret i8 %1407}408 409define i41 @scmp_uncommon_types(i7 %x, i7 %y) nounwind {410; X64-LABEL: scmp_uncommon_types:411; X64: # %bb.0:412; X64-NEXT: addb %sil, %sil413; X64-NEXT: sarb %sil414; X64-NEXT: addb %dil, %dil415; X64-NEXT: sarb %dil416; X64-NEXT: cmpb %sil, %dil417; X64-NEXT: setl %al418; X64-NEXT: setg %cl419; X64-NEXT: subb %al, %cl420; X64-NEXT: movsbq %cl, %rax421; X64-NEXT: retq422;423; X86-LABEL: scmp_uncommon_types:424; X86: # %bb.0:425; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax426; X86-NEXT: addb %al, %al427; X86-NEXT: sarb %al428; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx429; X86-NEXT: addb %cl, %cl430; X86-NEXT: sarb %cl431; X86-NEXT: cmpb %al, %cl432; X86-NEXT: setl %al433; X86-NEXT: setg %cl434; X86-NEXT: subb %al, %cl435; X86-NEXT: movsbl %cl, %eax436; X86-NEXT: movl %eax, %edx437; X86-NEXT: sarl $31, %edx438; X86-NEXT: retl439 %1 = call i41 @llvm.scmp(i7 %x, i7 %y)440 ret i41 %1441}442 443define <4 x i32> @scmp_normal_vectors(<4 x i32> %x, <4 x i32> %y) nounwind {444; SSE-LABEL: scmp_normal_vectors:445; SSE: # %bb.0:446; SSE-NEXT: movdqa %xmm0, %xmm2447; SSE-NEXT: pcmpgtd %xmm1, %xmm2448; SSE-NEXT: pcmpgtd %xmm0, %xmm1449; SSE-NEXT: psubd %xmm2, %xmm1450; SSE-NEXT: movdqa %xmm1, %xmm0451; SSE-NEXT: retq452;453; AVX2-LABEL: scmp_normal_vectors:454; AVX2: # %bb.0:455; AVX2-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm2456; AVX2-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0457; AVX2-NEXT: vpsubd %xmm2, %xmm0, %xmm0458; AVX2-NEXT: retq459;460; AVX512-LABEL: scmp_normal_vectors:461; AVX512: # %bb.0:462; AVX512-NEXT: vpcmpgtd %xmm0, %xmm1, %k1463; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %k2464; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm0 {%k2} {z} = [1,1,1,1]465; AVX512-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1466; AVX512-NEXT: vmovdqa32 %xmm1, %xmm0 {%k1}467; AVX512-NEXT: retq468;469; X86-LABEL: scmp_normal_vectors:470; X86: # %bb.0:471; X86-NEXT: pushl %ebx472; X86-NEXT: pushl %edi473; X86-NEXT: pushl %esi474; X86-NEXT: movl {{[0-9]+}}(%esp), %eax475; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx476; X86-NEXT: movl {{[0-9]+}}(%esp), %esi477; X86-NEXT: movl {{[0-9]+}}(%esp), %edi478; X86-NEXT: movl {{[0-9]+}}(%esp), %edx479; X86-NEXT: cmpl {{[0-9]+}}(%esp), %edx480; X86-NEXT: setl %dl481; X86-NEXT: setg %dh482; X86-NEXT: subb %dl, %dh483; X86-NEXT: movsbl %dh, %edx484; X86-NEXT: cmpl {{[0-9]+}}(%esp), %edi485; X86-NEXT: setl %bl486; X86-NEXT: setg %bh487; X86-NEXT: subb %bl, %bh488; X86-NEXT: movsbl %bh, %edi489; X86-NEXT: cmpl {{[0-9]+}}(%esp), %esi490; X86-NEXT: setl %bl491; X86-NEXT: setg %bh492; X86-NEXT: subb %bl, %bh493; X86-NEXT: movsbl %bh, %esi494; X86-NEXT: cmpl {{[0-9]+}}(%esp), %ecx495; X86-NEXT: setl %cl496; X86-NEXT: setg %ch497; X86-NEXT: subb %cl, %ch498; X86-NEXT: movsbl %ch, %ecx499; X86-NEXT: movl %ecx, 12(%eax)500; X86-NEXT: movl %esi, 8(%eax)501; X86-NEXT: movl %edi, 4(%eax)502; X86-NEXT: movl %edx, (%eax)503; X86-NEXT: popl %esi504; X86-NEXT: popl %edi505; X86-NEXT: popl %ebx506; X86-NEXT: retl $4507 %1 = call <4 x i32> @llvm.scmp(<4 x i32> %x, <4 x i32> %y)508 ret <4 x i32> %1509}510 511define <4 x i8> @scmp_narrow_vec_result(<4 x i32> %x, <4 x i32> %y) nounwind {512; SSE2-LABEL: scmp_narrow_vec_result:513; SSE2: # %bb.0:514; SSE2-NEXT: movd %xmm1, %eax515; SSE2-NEXT: movd %xmm0, %ecx516; SSE2-NEXT: cmpl %eax, %ecx517; SSE2-NEXT: setl %al518; SSE2-NEXT: setg %cl519; SSE2-NEXT: subb %al, %cl520; SSE2-NEXT: movzbl %cl, %eax521; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]522; SSE2-NEXT: movd %xmm2, %ecx523; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]524; SSE2-NEXT: movd %xmm2, %edx525; SSE2-NEXT: cmpl %ecx, %edx526; SSE2-NEXT: setl %cl527; SSE2-NEXT: setg %dl528; SSE2-NEXT: subb %cl, %dl529; SSE2-NEXT: movzbl %dl, %ecx530; SSE2-NEXT: shll $8, %ecx531; SSE2-NEXT: orl %eax, %ecx532; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]533; SSE2-NEXT: movd %xmm2, %eax534; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]535; SSE2-NEXT: movd %xmm2, %edx536; SSE2-NEXT: cmpl %eax, %edx537; SSE2-NEXT: setl %al538; SSE2-NEXT: setg %dl539; SSE2-NEXT: subb %al, %dl540; SSE2-NEXT: movzbl %dl, %eax541; SSE2-NEXT: shll $16, %eax542; SSE2-NEXT: orl %ecx, %eax543; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[3,3,3,3]544; SSE2-NEXT: movd %xmm1, %ecx545; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]546; SSE2-NEXT: movd %xmm0, %edx547; SSE2-NEXT: cmpl %ecx, %edx548; SSE2-NEXT: setl %cl549; SSE2-NEXT: setg %dl550; SSE2-NEXT: subb %cl, %dl551; SSE2-NEXT: movzbl %dl, %ecx552; SSE2-NEXT: shll $24, %ecx553; SSE2-NEXT: orl %eax, %ecx554; SSE2-NEXT: movd %ecx, %xmm0555; SSE2-NEXT: retq556;557; SSE4-LABEL: scmp_narrow_vec_result:558; SSE4: # %bb.0:559; SSE4-NEXT: pextrd $1, %xmm1, %eax560; SSE4-NEXT: pextrd $1, %xmm0, %ecx561; SSE4-NEXT: cmpl %eax, %ecx562; SSE4-NEXT: setl %al563; SSE4-NEXT: setg %cl564; SSE4-NEXT: subb %al, %cl565; SSE4-NEXT: movzbl %cl, %eax566; SSE4-NEXT: movd %xmm1, %ecx567; SSE4-NEXT: movd %xmm0, %edx568; SSE4-NEXT: cmpl %ecx, %edx569; SSE4-NEXT: setl %cl570; SSE4-NEXT: setg %dl571; SSE4-NEXT: subb %cl, %dl572; SSE4-NEXT: movzbl %dl, %ecx573; SSE4-NEXT: movd %ecx, %xmm2574; SSE4-NEXT: pinsrb $1, %eax, %xmm2575; SSE4-NEXT: pextrd $2, %xmm1, %eax576; SSE4-NEXT: pextrd $2, %xmm0, %ecx577; SSE4-NEXT: cmpl %eax, %ecx578; SSE4-NEXT: setl %al579; SSE4-NEXT: setg %cl580; SSE4-NEXT: subb %al, %cl581; SSE4-NEXT: movzbl %cl, %eax582; SSE4-NEXT: pinsrb $2, %eax, %xmm2583; SSE4-NEXT: pextrd $3, %xmm1, %eax584; SSE4-NEXT: pextrd $3, %xmm0, %ecx585; SSE4-NEXT: cmpl %eax, %ecx586; SSE4-NEXT: setl %al587; SSE4-NEXT: setg %cl588; SSE4-NEXT: subb %al, %cl589; SSE4-NEXT: movzbl %cl, %eax590; SSE4-NEXT: pinsrb $3, %eax, %xmm2591; SSE4-NEXT: movdqa %xmm2, %xmm0592; SSE4-NEXT: retq593;594; AVX-LABEL: scmp_narrow_vec_result:595; AVX: # %bb.0:596; AVX-NEXT: vpextrd $1, %xmm1, %eax597; AVX-NEXT: vpextrd $1, %xmm0, %ecx598; AVX-NEXT: cmpl %eax, %ecx599; AVX-NEXT: setl %al600; AVX-NEXT: setg %cl601; AVX-NEXT: subb %al, %cl602; AVX-NEXT: vmovd %xmm1, %eax603; AVX-NEXT: vmovd %xmm0, %edx604; AVX-NEXT: cmpl %eax, %edx605; AVX-NEXT: setl %al606; AVX-NEXT: setg %dl607; AVX-NEXT: subb %al, %dl608; AVX-NEXT: vmovd %edx, %xmm2609; AVX-NEXT: vpinsrb $1, %ecx, %xmm2, %xmm2610; AVX-NEXT: vpextrd $2, %xmm1, %eax611; AVX-NEXT: vpextrd $2, %xmm0, %ecx612; AVX-NEXT: cmpl %eax, %ecx613; AVX-NEXT: setl %al614; AVX-NEXT: setg %cl615; AVX-NEXT: subb %al, %cl616; AVX-NEXT: vpinsrb $2, %ecx, %xmm2, %xmm2617; AVX-NEXT: vpextrd $3, %xmm1, %eax618; AVX-NEXT: vpextrd $3, %xmm0, %ecx619; AVX-NEXT: cmpl %eax, %ecx620; AVX-NEXT: setl %al621; AVX-NEXT: setg %cl622; AVX-NEXT: subb %al, %cl623; AVX-NEXT: vpinsrb $3, %ecx, %xmm2, %xmm0624; AVX-NEXT: retq625;626; X86-LABEL: scmp_narrow_vec_result:627; X86: # %bb.0:628; X86-NEXT: pushl %ebx629; X86-NEXT: pushl %edi630; X86-NEXT: pushl %esi631; X86-NEXT: movl {{[0-9]+}}(%esp), %eax632; X86-NEXT: movl {{[0-9]+}}(%esp), %edx633; X86-NEXT: movl {{[0-9]+}}(%esp), %esi634; X86-NEXT: movl {{[0-9]+}}(%esp), %edi635; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx636; X86-NEXT: cmpl {{[0-9]+}}(%esp), %ecx637; X86-NEXT: setl %ch638; X86-NEXT: setg %cl639; X86-NEXT: subb %ch, %cl640; X86-NEXT: cmpl {{[0-9]+}}(%esp), %edi641; X86-NEXT: setl %ch642; X86-NEXT: setg %bl643; X86-NEXT: subb %ch, %bl644; X86-NEXT: cmpl {{[0-9]+}}(%esp), %esi645; X86-NEXT: setl %ch646; X86-NEXT: setg %bh647; X86-NEXT: subb %ch, %bh648; X86-NEXT: cmpl {{[0-9]+}}(%esp), %edx649; X86-NEXT: setl %dl650; X86-NEXT: setg %ch651; X86-NEXT: subb %dl, %ch652; X86-NEXT: movb %ch, 3(%eax)653; X86-NEXT: movb %bh, 2(%eax)654; X86-NEXT: movb %bl, 1(%eax)655; X86-NEXT: movb %cl, (%eax)656; X86-NEXT: popl %esi657; X86-NEXT: popl %edi658; X86-NEXT: popl %ebx659; X86-NEXT: retl $4660 %1 = call <4 x i8> @llvm.scmp(<4 x i32> %x, <4 x i32> %y)661 ret <4 x i8> %1662}663 664define <4 x i32> @scmp_narrow_vec_op(<4 x i8> %x, <4 x i8> %y) nounwind {665; SSE2-LABEL: scmp_narrow_vec_op:666; SSE2: # %bb.0:667; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]668; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]669; SSE2-NEXT: psrad $24, %xmm1670; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]671; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]672; SSE2-NEXT: psrad $24, %xmm0673; SSE2-NEXT: movdqa %xmm0, %xmm2674; SSE2-NEXT: pcmpgtd %xmm1, %xmm2675; SSE2-NEXT: pcmpgtd %xmm0, %xmm1676; SSE2-NEXT: psubd %xmm2, %xmm1677; SSE2-NEXT: movdqa %xmm1, %xmm0678; SSE2-NEXT: retq679;680; SSE4-LABEL: scmp_narrow_vec_op:681; SSE4: # %bb.0:682; SSE4-NEXT: pmovsxbd %xmm1, %xmm1683; SSE4-NEXT: pmovsxbd %xmm0, %xmm0684; SSE4-NEXT: movdqa %xmm0, %xmm2685; SSE4-NEXT: pcmpgtd %xmm1, %xmm2686; SSE4-NEXT: pcmpgtd %xmm0, %xmm1687; SSE4-NEXT: psubd %xmm2, %xmm1688; SSE4-NEXT: movdqa %xmm1, %xmm0689; SSE4-NEXT: retq690;691; AVX2-LABEL: scmp_narrow_vec_op:692; AVX2: # %bb.0:693; AVX2-NEXT: vpmovsxbd %xmm1, %xmm1694; AVX2-NEXT: vpmovsxbd %xmm0, %xmm0695; AVX2-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm2696; AVX2-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0697; AVX2-NEXT: vpsubd %xmm2, %xmm0, %xmm0698; AVX2-NEXT: retq699;700; AVX512-LABEL: scmp_narrow_vec_op:701; AVX512: # %bb.0:702; AVX512-NEXT: vpmovsxbd %xmm0, %xmm0703; AVX512-NEXT: vpmovsxbd %xmm1, %xmm1704; AVX512-NEXT: vpcmpgtd %xmm0, %xmm1, %k1705; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %k2706; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm0 {%k2} {z} = [1,1,1,1]707; AVX512-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1708; AVX512-NEXT: vmovdqa32 %xmm1, %xmm0 {%k1}709; AVX512-NEXT: retq710;711; X86-LABEL: scmp_narrow_vec_op:712; X86: # %bb.0:713; X86-NEXT: pushl %ebx714; X86-NEXT: pushl %edi715; X86-NEXT: pushl %esi716; X86-NEXT: movl {{[0-9]+}}(%esp), %eax717; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx718; X86-NEXT: movb {{[0-9]+}}(%esp), %ch719; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ebx720; X86-NEXT: movzbl {{[0-9]+}}(%esp), %edx721; X86-NEXT: cmpb {{[0-9]+}}(%esp), %dl722; X86-NEXT: setl %dl723; X86-NEXT: setg %dh724; X86-NEXT: subb %dl, %dh725; X86-NEXT: movsbl %dh, %edx726; X86-NEXT: cmpb {{[0-9]+}}(%esp), %bl727; X86-NEXT: setl %bl728; X86-NEXT: setg %bh729; X86-NEXT: subb %bl, %bh730; X86-NEXT: movsbl %bh, %esi731; X86-NEXT: cmpb {{[0-9]+}}(%esp), %ch732; X86-NEXT: setl %ch733; X86-NEXT: setg %bl734; X86-NEXT: subb %ch, %bl735; X86-NEXT: movsbl %bl, %edi736; X86-NEXT: cmpb {{[0-9]+}}(%esp), %cl737; X86-NEXT: setl %cl738; X86-NEXT: setg %ch739; X86-NEXT: subb %cl, %ch740; X86-NEXT: movsbl %ch, %ecx741; X86-NEXT: movl %ecx, 12(%eax)742; X86-NEXT: movl %edi, 8(%eax)743; X86-NEXT: movl %esi, 4(%eax)744; X86-NEXT: movl %edx, (%eax)745; X86-NEXT: popl %esi746; X86-NEXT: popl %edi747; X86-NEXT: popl %ebx748; X86-NEXT: retl $4749 %1 = call <4 x i32> @llvm.scmp(<4 x i8> %x, <4 x i8> %y)750 ret <4 x i32> %1751}752 753define <16 x i32> @scmp_wide_vec_result(<16 x i8> %x, <16 x i8> %y) nounwind {754; SSE2-LABEL: scmp_wide_vec_result:755; SSE2: # %bb.0:756; SSE2-NEXT: movdqa %xmm1, %xmm2757; SSE2-NEXT: movdqa %xmm0, %xmm3758; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]759; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]760; SSE2-NEXT: psrad $24, %xmm0761; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]762; SSE2-NEXT: punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3]763; SSE2-NEXT: psrad $24, %xmm5764; SSE2-NEXT: movdqa %xmm5, %xmm6765; SSE2-NEXT: pcmpgtd %xmm0, %xmm6766; SSE2-NEXT: pcmpgtd %xmm5, %xmm0767; SSE2-NEXT: psubd %xmm6, %xmm0768; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]769; SSE2-NEXT: psrad $24, %xmm1770; SSE2-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]771; SSE2-NEXT: psrad $24, %xmm4772; SSE2-NEXT: movdqa %xmm4, %xmm5773; SSE2-NEXT: pcmpgtd %xmm1, %xmm5774; SSE2-NEXT: pcmpgtd %xmm4, %xmm1775; SSE2-NEXT: psubd %xmm5, %xmm1776; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm2[8],xmm4[9],xmm2[9],xmm4[10],xmm2[10],xmm4[11],xmm2[11],xmm4[12],xmm2[12],xmm4[13],xmm2[13],xmm4[14],xmm2[14],xmm4[15],xmm2[15]777; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]778; SSE2-NEXT: psrad $24, %xmm2779; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm3[8],xmm5[9],xmm3[9],xmm5[10],xmm3[10],xmm5[11],xmm3[11],xmm5[12],xmm3[12],xmm5[13],xmm3[13],xmm5[14],xmm3[14],xmm5[15],xmm3[15]780; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1],xmm3[2],xmm5[2],xmm3[3],xmm5[3]781; SSE2-NEXT: psrad $24, %xmm3782; SSE2-NEXT: movdqa %xmm3, %xmm6783; SSE2-NEXT: pcmpgtd %xmm2, %xmm6784; SSE2-NEXT: pcmpgtd %xmm3, %xmm2785; SSE2-NEXT: psubd %xmm6, %xmm2786; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]787; SSE2-NEXT: psrad $24, %xmm3788; SSE2-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4],xmm5[4],xmm4[5],xmm5[5],xmm4[6],xmm5[6],xmm4[7],xmm5[7]789; SSE2-NEXT: psrad $24, %xmm4790; SSE2-NEXT: movdqa %xmm4, %xmm5791; SSE2-NEXT: pcmpgtd %xmm3, %xmm5792; SSE2-NEXT: pcmpgtd %xmm4, %xmm3793; SSE2-NEXT: psubd %xmm5, %xmm3794; SSE2-NEXT: retq795;796; SSE4-LABEL: scmp_wide_vec_result:797; SSE4: # %bb.0:798; SSE4-NEXT: movdqa %xmm0, %xmm4799; SSE4-NEXT: pmovsxbd %xmm1, %xmm0800; SSE4-NEXT: pmovsxbd %xmm4, %xmm2801; SSE4-NEXT: movdqa %xmm2, %xmm3802; SSE4-NEXT: pcmpgtd %xmm0, %xmm3803; SSE4-NEXT: pcmpgtd %xmm2, %xmm0804; SSE4-NEXT: psubd %xmm3, %xmm0805; SSE4-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]806; SSE4-NEXT: pmovsxbd %xmm2, %xmm5807; SSE4-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,1,1]808; SSE4-NEXT: pmovsxbd %xmm2, %xmm2809; SSE4-NEXT: movdqa %xmm2, %xmm3810; SSE4-NEXT: pcmpgtd %xmm5, %xmm3811; SSE4-NEXT: pcmpgtd %xmm2, %xmm5812; SSE4-NEXT: psubd %xmm3, %xmm5813; SSE4-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]814; SSE4-NEXT: pmovsxbd %xmm2, %xmm2815; SSE4-NEXT: pshufd {{.*#+}} xmm3 = xmm4[2,3,2,3]816; SSE4-NEXT: pmovsxbd %xmm3, %xmm3817; SSE4-NEXT: movdqa %xmm3, %xmm6818; SSE4-NEXT: pcmpgtd %xmm2, %xmm6819; SSE4-NEXT: pcmpgtd %xmm3, %xmm2820; SSE4-NEXT: psubd %xmm6, %xmm2821; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm1[3,3,3,3]822; SSE4-NEXT: pmovsxbd %xmm1, %xmm3823; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm4[3,3,3,3]824; SSE4-NEXT: pmovsxbd %xmm1, %xmm1825; SSE4-NEXT: movdqa %xmm1, %xmm4826; SSE4-NEXT: pcmpgtd %xmm3, %xmm4827; SSE4-NEXT: pcmpgtd %xmm1, %xmm3828; SSE4-NEXT: psubd %xmm4, %xmm3829; SSE4-NEXT: movdqa %xmm5, %xmm1830; SSE4-NEXT: retq831;832; AVX2-LABEL: scmp_wide_vec_result:833; AVX2: # %bb.0:834; AVX2-NEXT: vpmovsxbd %xmm1, %ymm2835; AVX2-NEXT: vpmovsxbd %xmm0, %ymm3836; AVX2-NEXT: vpcmpgtd %ymm2, %ymm3, %ymm4837; AVX2-NEXT: vpcmpgtd %ymm3, %ymm2, %ymm2838; AVX2-NEXT: vpsubd %ymm4, %ymm2, %ymm2839; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]840; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1841; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]842; AVX2-NEXT: vpmovsxbd %xmm0, %ymm0843; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm3844; AVX2-NEXT: vpcmpgtd %ymm0, %ymm1, %ymm0845; AVX2-NEXT: vpsubd %ymm3, %ymm0, %ymm1846; AVX2-NEXT: vmovdqa %ymm2, %ymm0847; AVX2-NEXT: retq848;849; AVX512-LABEL: scmp_wide_vec_result:850; AVX512: # %bb.0:851; AVX512-NEXT: vpcmpgtb %xmm0, %xmm1, %k1852; AVX512-NEXT: vpcmpgtb %xmm1, %xmm0, %k2853; AVX512-NEXT: vpbroadcastd {{.*#+}} zmm0 {%k2} {z} = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]854; AVX512-NEXT: vpternlogd {{.*#+}} zmm1 = -1855; AVX512-NEXT: vmovdqa32 %zmm1, %zmm0 {%k1}856; AVX512-NEXT: retq857;858; X86-LABEL: scmp_wide_vec_result:859; X86: # %bb.0:860; X86-NEXT: pushl %ebp861; X86-NEXT: pushl %ebx862; X86-NEXT: pushl %edi863; X86-NEXT: pushl %esi864; X86-NEXT: subl $16, %esp865; X86-NEXT: movzbl {{[0-9]+}}(%esp), %edx866; X86-NEXT: movb {{[0-9]+}}(%esp), %ah867; X86-NEXT: movb {{[0-9]+}}(%esp), %ch868; X86-NEXT: movb {{[0-9]+}}(%esp), %dh869; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ebx870; X86-NEXT: movb {{[0-9]+}}(%esp), %bh871; X86-NEXT: movb {{[0-9]+}}(%esp), %al872; X86-NEXT: cmpb {{[0-9]+}}(%esp), %al873; X86-NEXT: setl %al874; X86-NEXT: setg %cl875; X86-NEXT: subb %al, %cl876; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill877; X86-NEXT: cmpb {{[0-9]+}}(%esp), %bh878; X86-NEXT: setl %al879; X86-NEXT: setg %cl880; X86-NEXT: subb %al, %cl881; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill882; X86-NEXT: cmpb {{[0-9]+}}(%esp), %bl883; X86-NEXT: setl %al884; X86-NEXT: setg %cl885; X86-NEXT: subb %al, %cl886; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill887; X86-NEXT: cmpb {{[0-9]+}}(%esp), %dh888; X86-NEXT: setl %al889; X86-NEXT: setg %cl890; X86-NEXT: subb %al, %cl891; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill892; X86-NEXT: cmpb {{[0-9]+}}(%esp), %ch893; X86-NEXT: setl %al894; X86-NEXT: setg %cl895; X86-NEXT: subb %al, %cl896; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill897; X86-NEXT: cmpb {{[0-9]+}}(%esp), %ah898; X86-NEXT: setl %al899; X86-NEXT: setg %cl900; X86-NEXT: subb %al, %cl901; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill902; X86-NEXT: cmpb {{[0-9]+}}(%esp), %dl903; X86-NEXT: setl %al904; X86-NEXT: setg %cl905; X86-NEXT: subb %al, %cl906; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill907; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax908; X86-NEXT: cmpb {{[0-9]+}}(%esp), %al909; X86-NEXT: setl %al910; X86-NEXT: setg %bh911; X86-NEXT: subb %al, %bh912; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax913; X86-NEXT: cmpb {{[0-9]+}}(%esp), %al914; X86-NEXT: setl %al915; X86-NEXT: setg %bl916; X86-NEXT: subb %al, %bl917; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax918; X86-NEXT: cmpb {{[0-9]+}}(%esp), %al919; X86-NEXT: setl %al920; X86-NEXT: setg %dh921; X86-NEXT: subb %al, %dh922; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax923; X86-NEXT: cmpb {{[0-9]+}}(%esp), %al924; X86-NEXT: setl %al925; X86-NEXT: setg %dl926; X86-NEXT: subb %al, %dl927; X86-NEXT: movsbl %dl, %eax928; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill929; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax930; X86-NEXT: cmpb {{[0-9]+}}(%esp), %al931; X86-NEXT: setl %al932; X86-NEXT: setg %dl933; X86-NEXT: subb %al, %dl934; X86-NEXT: movsbl %dl, %eax935; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill936; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax937; X86-NEXT: cmpb {{[0-9]+}}(%esp), %al938; X86-NEXT: setl %al939; X86-NEXT: setg %dl940; X86-NEXT: subb %al, %dl941; X86-NEXT: movsbl %dl, %ebp942; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax943; X86-NEXT: cmpb {{[0-9]+}}(%esp), %al944; X86-NEXT: setl %al945; X86-NEXT: setg %dl946; X86-NEXT: subb %al, %dl947; X86-NEXT: movsbl %dl, %edi948; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax949; X86-NEXT: cmpb {{[0-9]+}}(%esp), %al950; X86-NEXT: setl %al951; X86-NEXT: setg %ah952; X86-NEXT: subb %al, %ah953; X86-NEXT: movsbl %ah, %esi954; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax955; X86-NEXT: cmpb {{[0-9]+}}(%esp), %al956; X86-NEXT: setl %al957; X86-NEXT: setg %dl958; X86-NEXT: subb %al, %dl959; X86-NEXT: movsbl %dl, %ecx960; X86-NEXT: movl {{[0-9]+}}(%esp), %eax961; X86-NEXT: movl %ecx, 60(%eax)962; X86-NEXT: movl %esi, 56(%eax)963; X86-NEXT: movl %edi, 52(%eax)964; X86-NEXT: movl %ebp, 48(%eax)965; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload966; X86-NEXT: movl %ecx, 44(%eax)967; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload968; X86-NEXT: movl %ecx, 40(%eax)969; X86-NEXT: movsbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload970; X86-NEXT: movsbl %dh, %edx971; X86-NEXT: movl %edx, 36(%eax)972; X86-NEXT: movsbl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 1-byte Folded Reload973; X86-NEXT: movsbl %bl, %esi974; X86-NEXT: movl %esi, 32(%eax)975; X86-NEXT: movsbl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 1-byte Folded Reload976; X86-NEXT: movsbl %bh, %edi977; X86-NEXT: movl %edi, 28(%eax)978; X86-NEXT: movsbl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 1-byte Folded Reload979; X86-NEXT: movsbl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 1-byte Folded Reload980; X86-NEXT: movl %ebx, 24(%eax)981; X86-NEXT: movl %edi, 20(%eax)982; X86-NEXT: movl %esi, 16(%eax)983; X86-NEXT: movl %edx, 12(%eax)984; X86-NEXT: movl %ecx, 8(%eax)985; X86-NEXT: movsbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload986; X86-NEXT: movl %ecx, 4(%eax)987; X86-NEXT: movsbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload988; X86-NEXT: movl %ecx, (%eax)989; X86-NEXT: addl $16, %esp990; X86-NEXT: popl %esi991; X86-NEXT: popl %edi992; X86-NEXT: popl %ebx993; X86-NEXT: popl %ebp994; X86-NEXT: retl $4995 %1 = call <16 x i32> @llvm.scmp(<16 x i8> %x, <16 x i8> %y)996 ret <16 x i32> %1997}998 999define <16 x i8> @scmp_wide_vec_op(<16 x i64> %x, <16 x i64> %y) nounwind {1000; SSE2-LABEL: scmp_wide_vec_op:1001; SSE2: # %bb.0:1002; SSE2-NEXT: movq %xmm7, %rax1003; SSE2-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1004; SSE2-NEXT: setl %al1005; SSE2-NEXT: setg %cl1006; SSE2-NEXT: subb %al, %cl1007; SSE2-NEXT: movzbl %cl, %eax1008; SSE2-NEXT: movd %eax, %xmm81009; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[2,3,2,3]1010; SSE2-NEXT: movq %xmm7, %rax1011; SSE2-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1012; SSE2-NEXT: setl %al1013; SSE2-NEXT: setg %cl1014; SSE2-NEXT: subb %al, %cl1015; SSE2-NEXT: movzbl %cl, %eax1016; SSE2-NEXT: movd %eax, %xmm71017; SSE2-NEXT: movq %xmm6, %rax1018; SSE2-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1019; SSE2-NEXT: punpcklbw {{.*#+}} xmm8 = xmm8[0],xmm7[0],xmm8[1],xmm7[1],xmm8[2],xmm7[2],xmm8[3],xmm7[3],xmm8[4],xmm7[4],xmm8[5],xmm7[5],xmm8[6],xmm7[6],xmm8[7],xmm7[7]1020; SSE2-NEXT: setl %al1021; SSE2-NEXT: setg %cl1022; SSE2-NEXT: subb %al, %cl1023; SSE2-NEXT: movzbl %cl, %eax1024; SSE2-NEXT: movd %eax, %xmm71025; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[2,3,2,3]1026; SSE2-NEXT: movq %xmm6, %rax1027; SSE2-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1028; SSE2-NEXT: setl %al1029; SSE2-NEXT: setg %cl1030; SSE2-NEXT: subb %al, %cl1031; SSE2-NEXT: movzbl %cl, %eax1032; SSE2-NEXT: movd %eax, %xmm61033; SSE2-NEXT: punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm6[0],xmm7[1],xmm6[1],xmm7[2],xmm6[2],xmm7[3],xmm6[3],xmm7[4],xmm6[4],xmm7[5],xmm6[5],xmm7[6],xmm6[6],xmm7[7],xmm6[7]1034; SSE2-NEXT: punpcklwd {{.*#+}} xmm7 = xmm7[0],xmm8[0],xmm7[1],xmm8[1],xmm7[2],xmm8[2],xmm7[3],xmm8[3]1035; SSE2-NEXT: movq %xmm5, %rax1036; SSE2-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1037; SSE2-NEXT: setl %al1038; SSE2-NEXT: setg %cl1039; SSE2-NEXT: subb %al, %cl1040; SSE2-NEXT: movzbl %cl, %eax1041; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]1042; SSE2-NEXT: movq %xmm5, %rcx1043; SSE2-NEXT: cmpq {{[0-9]+}}(%rsp), %rcx1044; SSE2-NEXT: movd %eax, %xmm61045; SSE2-NEXT: setl %al1046; SSE2-NEXT: setg %cl1047; SSE2-NEXT: subb %al, %cl1048; SSE2-NEXT: movzbl %cl, %eax1049; SSE2-NEXT: movq %xmm4, %rcx1050; SSE2-NEXT: cmpq {{[0-9]+}}(%rsp), %rcx1051; SSE2-NEXT: movd %eax, %xmm81052; SSE2-NEXT: setl %al1053; SSE2-NEXT: setg %cl1054; SSE2-NEXT: subb %al, %cl1055; SSE2-NEXT: movzbl %cl, %eax1056; SSE2-NEXT: movd %eax, %xmm51057; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]1058; SSE2-NEXT: movq %xmm4, %rax1059; SSE2-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1060; SSE2-NEXT: setl %al1061; SSE2-NEXT: setg %cl1062; SSE2-NEXT: subb %al, %cl1063; SSE2-NEXT: movzbl %cl, %eax1064; SSE2-NEXT: movd %eax, %xmm41065; SSE2-NEXT: movq %xmm3, %rax1066; SSE2-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1067; SSE2-NEXT: setl %al1068; SSE2-NEXT: setg %cl1069; SSE2-NEXT: subb %al, %cl1070; SSE2-NEXT: movzbl %cl, %eax1071; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]1072; SSE2-NEXT: movq %xmm3, %rcx1073; SSE2-NEXT: movd %eax, %xmm31074; SSE2-NEXT: cmpq {{[0-9]+}}(%rsp), %rcx1075; SSE2-NEXT: setl %al1076; SSE2-NEXT: setg %cl1077; SSE2-NEXT: subb %al, %cl1078; SSE2-NEXT: movzbl %cl, %eax1079; SSE2-NEXT: movq %xmm2, %rcx1080; SSE2-NEXT: cmpq {{[0-9]+}}(%rsp), %rcx1081; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]1082; SSE2-NEXT: movq %xmm2, %rcx1083; SSE2-NEXT: movd %eax, %xmm21084; SSE2-NEXT: setl %al1085; SSE2-NEXT: setg %dl1086; SSE2-NEXT: subb %al, %dl1087; SSE2-NEXT: cmpq {{[0-9]+}}(%rsp), %rcx1088; SSE2-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm8[0],xmm6[1],xmm8[1],xmm6[2],xmm8[2],xmm6[3],xmm8[3],xmm6[4],xmm8[4],xmm6[5],xmm8[5],xmm6[6],xmm8[6],xmm6[7],xmm8[7]1089; SSE2-NEXT: punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3],xmm5[4],xmm4[4],xmm5[5],xmm4[5],xmm5[6],xmm4[6],xmm5[7],xmm4[7]1090; SSE2-NEXT: punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm6[0],xmm5[1],xmm6[1],xmm5[2],xmm6[2],xmm5[3],xmm6[3]1091; SSE2-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]1092; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]1093; SSE2-NEXT: movzbl %dl, %eax1094; SSE2-NEXT: movd %eax, %xmm21095; SSE2-NEXT: setl %al1096; SSE2-NEXT: setg %cl1097; SSE2-NEXT: subb %al, %cl1098; SSE2-NEXT: movzbl %cl, %eax1099; SSE2-NEXT: movd %eax, %xmm41100; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3],xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]1101; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]1102; SSE2-NEXT: movq %xmm1, %rax1103; SSE2-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1104; SSE2-NEXT: setl %al1105; SSE2-NEXT: setg %cl1106; SSE2-NEXT: subb %al, %cl1107; SSE2-NEXT: movzbl %cl, %eax1108; SSE2-NEXT: movd %eax, %xmm31109; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]1110; SSE2-NEXT: movq %xmm1, %rax1111; SSE2-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1112; SSE2-NEXT: setl %al1113; SSE2-NEXT: setg %cl1114; SSE2-NEXT: subb %al, %cl1115; SSE2-NEXT: movzbl %cl, %eax1116; SSE2-NEXT: movd %eax, %xmm11117; SSE2-NEXT: movq %xmm0, %rax1118; SSE2-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1119; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]1120; SSE2-NEXT: setl %al1121; SSE2-NEXT: setg %cl1122; SSE2-NEXT: subb %al, %cl1123; SSE2-NEXT: movzbl %cl, %eax1124; SSE2-NEXT: movd %eax, %xmm11125; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1126; SSE2-NEXT: movq %xmm0, %rax1127; SSE2-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1128; SSE2-NEXT: setl %al1129; SSE2-NEXT: setg %cl1130; SSE2-NEXT: subb %al, %cl1131; SSE2-NEXT: movzbl %cl, %eax1132; SSE2-NEXT: movd %eax, %xmm01133; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1134; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]1135; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]1136; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm5[0]1137; SSE2-NEXT: movdqa %xmm1, %xmm01138; SSE2-NEXT: retq1139;1140; SSE4-LABEL: scmp_wide_vec_op:1141; SSE4: # %bb.0:1142; SSE4-NEXT: pextrq $1, %xmm0, %rax1143; SSE4-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1144; SSE4-NEXT: setl %al1145; SSE4-NEXT: setg %cl1146; SSE4-NEXT: subb %al, %cl1147; SSE4-NEXT: movzbl %cl, %eax1148; SSE4-NEXT: movq %xmm0, %rcx1149; SSE4-NEXT: cmpq {{[0-9]+}}(%rsp), %rcx1150; SSE4-NEXT: setl %cl1151; SSE4-NEXT: setg %dl1152; SSE4-NEXT: subb %cl, %dl1153; SSE4-NEXT: movzbl %dl, %ecx1154; SSE4-NEXT: movd %ecx, %xmm01155; SSE4-NEXT: pinsrb $1, %eax, %xmm01156; SSE4-NEXT: movq %xmm1, %rax1157; SSE4-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1158; SSE4-NEXT: setl %al1159; SSE4-NEXT: setg %cl1160; SSE4-NEXT: subb %al, %cl1161; SSE4-NEXT: movzbl %cl, %eax1162; SSE4-NEXT: pinsrb $2, %eax, %xmm01163; SSE4-NEXT: pextrq $1, %xmm1, %rax1164; SSE4-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1165; SSE4-NEXT: setl %al1166; SSE4-NEXT: setg %cl1167; SSE4-NEXT: subb %al, %cl1168; SSE4-NEXT: movzbl %cl, %eax1169; SSE4-NEXT: pinsrb $3, %eax, %xmm01170; SSE4-NEXT: movq %xmm2, %rax1171; SSE4-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1172; SSE4-NEXT: setl %al1173; SSE4-NEXT: setg %cl1174; SSE4-NEXT: subb %al, %cl1175; SSE4-NEXT: movzbl %cl, %eax1176; SSE4-NEXT: pinsrb $4, %eax, %xmm01177; SSE4-NEXT: pextrq $1, %xmm2, %rax1178; SSE4-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1179; SSE4-NEXT: setl %al1180; SSE4-NEXT: setg %cl1181; SSE4-NEXT: subb %al, %cl1182; SSE4-NEXT: movzbl %cl, %eax1183; SSE4-NEXT: pinsrb $5, %eax, %xmm01184; SSE4-NEXT: movq %xmm3, %rax1185; SSE4-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1186; SSE4-NEXT: setl %al1187; SSE4-NEXT: setg %cl1188; SSE4-NEXT: subb %al, %cl1189; SSE4-NEXT: movzbl %cl, %eax1190; SSE4-NEXT: pinsrb $6, %eax, %xmm01191; SSE4-NEXT: pextrq $1, %xmm3, %rax1192; SSE4-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1193; SSE4-NEXT: setl %al1194; SSE4-NEXT: setg %cl1195; SSE4-NEXT: subb %al, %cl1196; SSE4-NEXT: movzbl %cl, %eax1197; SSE4-NEXT: pinsrb $7, %eax, %xmm01198; SSE4-NEXT: movq %xmm4, %rax1199; SSE4-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1200; SSE4-NEXT: setl %al1201; SSE4-NEXT: setg %cl1202; SSE4-NEXT: subb %al, %cl1203; SSE4-NEXT: movzbl %cl, %eax1204; SSE4-NEXT: pinsrb $8, %eax, %xmm01205; SSE4-NEXT: pextrq $1, %xmm4, %rax1206; SSE4-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1207; SSE4-NEXT: setl %al1208; SSE4-NEXT: setg %cl1209; SSE4-NEXT: subb %al, %cl1210; SSE4-NEXT: movzbl %cl, %eax1211; SSE4-NEXT: pinsrb $9, %eax, %xmm01212; SSE4-NEXT: movq %xmm5, %rax1213; SSE4-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1214; SSE4-NEXT: setl %al1215; SSE4-NEXT: setg %cl1216; SSE4-NEXT: subb %al, %cl1217; SSE4-NEXT: movzbl %cl, %eax1218; SSE4-NEXT: pinsrb $10, %eax, %xmm01219; SSE4-NEXT: pextrq $1, %xmm5, %rax1220; SSE4-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1221; SSE4-NEXT: setl %al1222; SSE4-NEXT: setg %cl1223; SSE4-NEXT: subb %al, %cl1224; SSE4-NEXT: movzbl %cl, %eax1225; SSE4-NEXT: pinsrb $11, %eax, %xmm01226; SSE4-NEXT: movq %xmm6, %rax1227; SSE4-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1228; SSE4-NEXT: setl %al1229; SSE4-NEXT: setg %cl1230; SSE4-NEXT: subb %al, %cl1231; SSE4-NEXT: movzbl %cl, %eax1232; SSE4-NEXT: pinsrb $12, %eax, %xmm01233; SSE4-NEXT: pextrq $1, %xmm6, %rax1234; SSE4-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1235; SSE4-NEXT: setl %al1236; SSE4-NEXT: setg %cl1237; SSE4-NEXT: subb %al, %cl1238; SSE4-NEXT: movzbl %cl, %eax1239; SSE4-NEXT: pinsrb $13, %eax, %xmm01240; SSE4-NEXT: movq %xmm7, %rax1241; SSE4-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1242; SSE4-NEXT: setl %al1243; SSE4-NEXT: setg %cl1244; SSE4-NEXT: subb %al, %cl1245; SSE4-NEXT: movzbl %cl, %eax1246; SSE4-NEXT: pinsrb $14, %eax, %xmm01247; SSE4-NEXT: pextrq $1, %xmm7, %rax1248; SSE4-NEXT: cmpq {{[0-9]+}}(%rsp), %rax1249; SSE4-NEXT: setl %al1250; SSE4-NEXT: setg %cl1251; SSE4-NEXT: subb %al, %cl1252; SSE4-NEXT: movzbl %cl, %eax1253; SSE4-NEXT: pinsrb $15, %eax, %xmm01254; SSE4-NEXT: retq1255;1256; AVX2-LABEL: scmp_wide_vec_op:1257; AVX2: # %bb.0:1258; AVX2-NEXT: vpextrq $1, %xmm4, %rax1259; AVX2-NEXT: vpextrq $1, %xmm0, %rcx1260; AVX2-NEXT: cmpq %rax, %rcx1261; AVX2-NEXT: setl %al1262; AVX2-NEXT: setg %cl1263; AVX2-NEXT: subb %al, %cl1264; AVX2-NEXT: vmovq %xmm4, %rax1265; AVX2-NEXT: vmovq %xmm0, %rdx1266; AVX2-NEXT: cmpq %rax, %rdx1267; AVX2-NEXT: setl %al1268; AVX2-NEXT: setg %dl1269; AVX2-NEXT: subb %al, %dl1270; AVX2-NEXT: vmovd %edx, %xmm81271; AVX2-NEXT: vpinsrb $1, %ecx, %xmm8, %xmm81272; AVX2-NEXT: vextracti128 $1, %ymm4, %xmm41273; AVX2-NEXT: vmovq %xmm4, %rax1274; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm01275; AVX2-NEXT: vmovq %xmm0, %rcx1276; AVX2-NEXT: cmpq %rax, %rcx1277; AVX2-NEXT: setl %al1278; AVX2-NEXT: setg %cl1279; AVX2-NEXT: subb %al, %cl1280; AVX2-NEXT: vpinsrb $2, %ecx, %xmm8, %xmm81281; AVX2-NEXT: vpextrq $1, %xmm4, %rax1282; AVX2-NEXT: vpextrq $1, %xmm0, %rcx1283; AVX2-NEXT: cmpq %rax, %rcx1284; AVX2-NEXT: setl %al1285; AVX2-NEXT: setg %cl1286; AVX2-NEXT: subb %al, %cl1287; AVX2-NEXT: vpinsrb $3, %ecx, %xmm8, %xmm01288; AVX2-NEXT: vmovq %xmm5, %rax1289; AVX2-NEXT: vmovq %xmm1, %rcx1290; AVX2-NEXT: cmpq %rax, %rcx1291; AVX2-NEXT: setl %al1292; AVX2-NEXT: setg %cl1293; AVX2-NEXT: subb %al, %cl1294; AVX2-NEXT: vpinsrb $4, %ecx, %xmm0, %xmm01295; AVX2-NEXT: vpextrq $1, %xmm5, %rax1296; AVX2-NEXT: vpextrq $1, %xmm1, %rcx1297; AVX2-NEXT: cmpq %rax, %rcx1298; AVX2-NEXT: setl %al1299; AVX2-NEXT: setg %cl1300; AVX2-NEXT: subb %al, %cl1301; AVX2-NEXT: vpinsrb $5, %ecx, %xmm0, %xmm01302; AVX2-NEXT: vextracti128 $1, %ymm5, %xmm41303; AVX2-NEXT: vmovq %xmm4, %rax1304; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm11305; AVX2-NEXT: vmovq %xmm1, %rcx1306; AVX2-NEXT: cmpq %rax, %rcx1307; AVX2-NEXT: setl %al1308; AVX2-NEXT: setg %cl1309; AVX2-NEXT: subb %al, %cl1310; AVX2-NEXT: vpinsrb $6, %ecx, %xmm0, %xmm01311; AVX2-NEXT: vpextrq $1, %xmm4, %rax1312; AVX2-NEXT: vpextrq $1, %xmm1, %rcx1313; AVX2-NEXT: cmpq %rax, %rcx1314; AVX2-NEXT: setl %al1315; AVX2-NEXT: setg %cl1316; AVX2-NEXT: subb %al, %cl1317; AVX2-NEXT: vpinsrb $7, %ecx, %xmm0, %xmm01318; AVX2-NEXT: vmovq %xmm6, %rax1319; AVX2-NEXT: vmovq %xmm2, %rcx1320; AVX2-NEXT: cmpq %rax, %rcx1321; AVX2-NEXT: setl %al1322; AVX2-NEXT: setg %cl1323; AVX2-NEXT: subb %al, %cl1324; AVX2-NEXT: vpinsrb $8, %ecx, %xmm0, %xmm01325; AVX2-NEXT: vpextrq $1, %xmm6, %rax1326; AVX2-NEXT: vpextrq $1, %xmm2, %rcx1327; AVX2-NEXT: cmpq %rax, %rcx1328; AVX2-NEXT: setl %al1329; AVX2-NEXT: setg %cl1330; AVX2-NEXT: subb %al, %cl1331; AVX2-NEXT: vpinsrb $9, %ecx, %xmm0, %xmm01332; AVX2-NEXT: vextracti128 $1, %ymm6, %xmm11333; AVX2-NEXT: vmovq %xmm1, %rax1334; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm21335; AVX2-NEXT: vmovq %xmm2, %rcx1336; AVX2-NEXT: cmpq %rax, %rcx1337; AVX2-NEXT: setl %al1338; AVX2-NEXT: setg %cl1339; AVX2-NEXT: subb %al, %cl1340; AVX2-NEXT: vpinsrb $10, %ecx, %xmm0, %xmm01341; AVX2-NEXT: vpextrq $1, %xmm1, %rax1342; AVX2-NEXT: vpextrq $1, %xmm2, %rcx1343; AVX2-NEXT: cmpq %rax, %rcx1344; AVX2-NEXT: setl %al1345; AVX2-NEXT: setg %cl1346; AVX2-NEXT: subb %al, %cl1347; AVX2-NEXT: vpinsrb $11, %ecx, %xmm0, %xmm01348; AVX2-NEXT: vmovq %xmm7, %rax1349; AVX2-NEXT: vmovq %xmm3, %rcx1350; AVX2-NEXT: cmpq %rax, %rcx1351; AVX2-NEXT: setl %al1352; AVX2-NEXT: setg %cl1353; AVX2-NEXT: subb %al, %cl1354; AVX2-NEXT: vpinsrb $12, %ecx, %xmm0, %xmm01355; AVX2-NEXT: vpextrq $1, %xmm7, %rax1356; AVX2-NEXT: vpextrq $1, %xmm3, %rcx1357; AVX2-NEXT: cmpq %rax, %rcx1358; AVX2-NEXT: setl %al1359; AVX2-NEXT: setg %cl1360; AVX2-NEXT: subb %al, %cl1361; AVX2-NEXT: vpinsrb $13, %ecx, %xmm0, %xmm01362; AVX2-NEXT: vextracti128 $1, %ymm7, %xmm11363; AVX2-NEXT: vmovq %xmm1, %rax1364; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm21365; AVX2-NEXT: vmovq %xmm2, %rcx1366; AVX2-NEXT: cmpq %rax, %rcx1367; AVX2-NEXT: setl %al1368; AVX2-NEXT: setg %cl1369; AVX2-NEXT: subb %al, %cl1370; AVX2-NEXT: vpinsrb $14, %ecx, %xmm0, %xmm01371; AVX2-NEXT: vpextrq $1, %xmm1, %rax1372; AVX2-NEXT: vpextrq $1, %xmm2, %rcx1373; AVX2-NEXT: cmpq %rax, %rcx1374; AVX2-NEXT: setl %al1375; AVX2-NEXT: setg %cl1376; AVX2-NEXT: subb %al, %cl1377; AVX2-NEXT: vpinsrb $15, %ecx, %xmm0, %xmm01378; AVX2-NEXT: vzeroupper1379; AVX2-NEXT: retq1380;1381; AVX512-LABEL: scmp_wide_vec_op:1382; AVX512: # %bb.0:1383; AVX512-NEXT: vpextrq $1, %xmm2, %rax1384; AVX512-NEXT: vpextrq $1, %xmm0, %rcx1385; AVX512-NEXT: cmpq %rax, %rcx1386; AVX512-NEXT: setl %al1387; AVX512-NEXT: setg %cl1388; AVX512-NEXT: subb %al, %cl1389; AVX512-NEXT: vmovq %xmm2, %rax1390; AVX512-NEXT: vmovq %xmm0, %rdx1391; AVX512-NEXT: cmpq %rax, %rdx1392; AVX512-NEXT: setl %al1393; AVX512-NEXT: setg %dl1394; AVX512-NEXT: subb %al, %dl1395; AVX512-NEXT: vmovd %edx, %xmm41396; AVX512-NEXT: vpinsrb $1, %ecx, %xmm4, %xmm41397; AVX512-NEXT: vextracti128 $1, %ymm2, %xmm51398; AVX512-NEXT: vmovq %xmm5, %rax1399; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm61400; AVX512-NEXT: vmovq %xmm6, %rcx1401; AVX512-NEXT: cmpq %rax, %rcx1402; AVX512-NEXT: setl %al1403; AVX512-NEXT: setg %cl1404; AVX512-NEXT: subb %al, %cl1405; AVX512-NEXT: vpinsrb $2, %ecx, %xmm4, %xmm41406; AVX512-NEXT: vpextrq $1, %xmm5, %rax1407; AVX512-NEXT: vpextrq $1, %xmm6, %rcx1408; AVX512-NEXT: cmpq %rax, %rcx1409; AVX512-NEXT: setl %al1410; AVX512-NEXT: setg %cl1411; AVX512-NEXT: subb %al, %cl1412; AVX512-NEXT: vpinsrb $3, %ecx, %xmm4, %xmm41413; AVX512-NEXT: vextracti32x4 $2, %zmm2, %xmm51414; AVX512-NEXT: vmovq %xmm5, %rax1415; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm61416; AVX512-NEXT: vmovq %xmm6, %rcx1417; AVX512-NEXT: cmpq %rax, %rcx1418; AVX512-NEXT: setl %al1419; AVX512-NEXT: setg %cl1420; AVX512-NEXT: subb %al, %cl1421; AVX512-NEXT: vpinsrb $4, %ecx, %xmm4, %xmm41422; AVX512-NEXT: vpextrq $1, %xmm5, %rax1423; AVX512-NEXT: vpextrq $1, %xmm6, %rcx1424; AVX512-NEXT: cmpq %rax, %rcx1425; AVX512-NEXT: setl %al1426; AVX512-NEXT: setg %cl1427; AVX512-NEXT: subb %al, %cl1428; AVX512-NEXT: vpinsrb $5, %ecx, %xmm4, %xmm41429; AVX512-NEXT: vextracti32x4 $3, %zmm2, %xmm21430; AVX512-NEXT: vmovq %xmm2, %rax1431; AVX512-NEXT: vextracti32x4 $3, %zmm0, %xmm01432; AVX512-NEXT: vmovq %xmm0, %rcx1433; AVX512-NEXT: cmpq %rax, %rcx1434; AVX512-NEXT: setl %al1435; AVX512-NEXT: setg %cl1436; AVX512-NEXT: subb %al, %cl1437; AVX512-NEXT: vpinsrb $6, %ecx, %xmm4, %xmm41438; AVX512-NEXT: vpextrq $1, %xmm2, %rax1439; AVX512-NEXT: vpextrq $1, %xmm0, %rcx1440; AVX512-NEXT: cmpq %rax, %rcx1441; AVX512-NEXT: setl %al1442; AVX512-NEXT: setg %cl1443; AVX512-NEXT: subb %al, %cl1444; AVX512-NEXT: vpinsrb $7, %ecx, %xmm4, %xmm01445; AVX512-NEXT: vmovq %xmm3, %rax1446; AVX512-NEXT: vmovq %xmm1, %rcx1447; AVX512-NEXT: cmpq %rax, %rcx1448; AVX512-NEXT: setl %al1449; AVX512-NEXT: setg %cl1450; AVX512-NEXT: subb %al, %cl1451; AVX512-NEXT: vpinsrb $8, %ecx, %xmm0, %xmm01452; AVX512-NEXT: vpextrq $1, %xmm3, %rax1453; AVX512-NEXT: vpextrq $1, %xmm1, %rcx1454; AVX512-NEXT: cmpq %rax, %rcx1455; AVX512-NEXT: setl %al1456; AVX512-NEXT: setg %cl1457; AVX512-NEXT: subb %al, %cl1458; AVX512-NEXT: vpinsrb $9, %ecx, %xmm0, %xmm01459; AVX512-NEXT: vextracti128 $1, %ymm3, %xmm21460; AVX512-NEXT: vmovq %xmm2, %rax1461; AVX512-NEXT: vextracti128 $1, %ymm1, %xmm41462; AVX512-NEXT: vmovq %xmm4, %rcx1463; AVX512-NEXT: cmpq %rax, %rcx1464; AVX512-NEXT: setl %al1465; AVX512-NEXT: setg %cl1466; AVX512-NEXT: subb %al, %cl1467; AVX512-NEXT: vpinsrb $10, %ecx, %xmm0, %xmm01468; AVX512-NEXT: vpextrq $1, %xmm2, %rax1469; AVX512-NEXT: vpextrq $1, %xmm4, %rcx1470; AVX512-NEXT: cmpq %rax, %rcx1471; AVX512-NEXT: setl %al1472; AVX512-NEXT: setg %cl1473; AVX512-NEXT: subb %al, %cl1474; AVX512-NEXT: vpinsrb $11, %ecx, %xmm0, %xmm01475; AVX512-NEXT: vextracti32x4 $2, %zmm3, %xmm21476; AVX512-NEXT: vmovq %xmm2, %rax1477; AVX512-NEXT: vextracti32x4 $2, %zmm1, %xmm41478; AVX512-NEXT: vmovq %xmm4, %rcx1479; AVX512-NEXT: cmpq %rax, %rcx1480; AVX512-NEXT: setl %al1481; AVX512-NEXT: setg %cl1482; AVX512-NEXT: subb %al, %cl1483; AVX512-NEXT: vpinsrb $12, %ecx, %xmm0, %xmm01484; AVX512-NEXT: vpextrq $1, %xmm2, %rax1485; AVX512-NEXT: vpextrq $1, %xmm4, %rcx1486; AVX512-NEXT: cmpq %rax, %rcx1487; AVX512-NEXT: setl %al1488; AVX512-NEXT: setg %cl1489; AVX512-NEXT: subb %al, %cl1490; AVX512-NEXT: vpinsrb $13, %ecx, %xmm0, %xmm01491; AVX512-NEXT: vextracti32x4 $3, %zmm3, %xmm21492; AVX512-NEXT: vmovq %xmm2, %rax1493; AVX512-NEXT: vextracti32x4 $3, %zmm1, %xmm11494; AVX512-NEXT: vmovq %xmm1, %rcx1495; AVX512-NEXT: cmpq %rax, %rcx1496; AVX512-NEXT: setl %al1497; AVX512-NEXT: setg %cl1498; AVX512-NEXT: subb %al, %cl1499; AVX512-NEXT: vpinsrb $14, %ecx, %xmm0, %xmm01500; AVX512-NEXT: vpextrq $1, %xmm2, %rax1501; AVX512-NEXT: vpextrq $1, %xmm1, %rcx1502; AVX512-NEXT: cmpq %rax, %rcx1503; AVX512-NEXT: setl %al1504; AVX512-NEXT: setg %cl1505; AVX512-NEXT: subb %al, %cl1506; AVX512-NEXT: vpinsrb $15, %ecx, %xmm0, %xmm01507; AVX512-NEXT: vzeroupper1508; AVX512-NEXT: retq1509;1510; X86-LABEL: scmp_wide_vec_op:1511; X86: # %bb.0:1512; X86-NEXT: pushl %ebp1513; X86-NEXT: pushl %ebx1514; X86-NEXT: pushl %edi1515; X86-NEXT: pushl %esi1516; X86-NEXT: subl $12, %esp1517; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1518; X86-NEXT: movl {{[0-9]+}}(%esp), %edx1519; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1520; X86-NEXT: movl {{[0-9]+}}(%esp), %edi1521; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx1522; X86-NEXT: cmpl %edx, %edi1523; X86-NEXT: movl %ebx, %ebp1524; X86-NEXT: sbbl %esi, %ebp1525; X86-NEXT: setl %al1526; X86-NEXT: cmpl %edi, %edx1527; X86-NEXT: movl {{[0-9]+}}(%esp), %edx1528; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp1529; X86-NEXT: sbbl %ebx, %esi1530; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx1531; X86-NEXT: setl %ah1532; X86-NEXT: subb %al, %ah1533; X86-NEXT: movb %ah, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1534; X86-NEXT: cmpl %ecx, %ebp1535; X86-NEXT: movl %ebx, %eax1536; X86-NEXT: sbbl %edx, %eax1537; X86-NEXT: movl {{[0-9]+}}(%esp), %edi1538; X86-NEXT: setl %al1539; X86-NEXT: cmpl %ebp, %ecx1540; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1541; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1542; X86-NEXT: sbbl %ebx, %edx1543; X86-NEXT: movl {{[0-9]+}}(%esp), %edx1544; X86-NEXT: setl %ah1545; X86-NEXT: subb %al, %ah1546; X86-NEXT: movb %ah, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1547; X86-NEXT: cmpl %edi, %ecx1548; X86-NEXT: movl %edx, %eax1549; X86-NEXT: sbbl %esi, %eax1550; X86-NEXT: setl %al1551; X86-NEXT: cmpl %ecx, %edi1552; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1553; X86-NEXT: movl {{[0-9]+}}(%esp), %edi1554; X86-NEXT: sbbl %edx, %esi1555; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1556; X86-NEXT: setl %dl1557; X86-NEXT: subb %al, %dl1558; X86-NEXT: movb %dl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1559; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp1560; X86-NEXT: cmpl %ebp, %edi1561; X86-NEXT: movl %esi, %eax1562; X86-NEXT: sbbl %ecx, %eax1563; X86-NEXT: movl {{[0-9]+}}(%esp), %edx1564; X86-NEXT: setl %bl1565; X86-NEXT: cmpl %edi, %ebp1566; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1567; X86-NEXT: movl {{[0-9]+}}(%esp), %edi1568; X86-NEXT: sbbl %esi, %ecx1569; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1570; X86-NEXT: setl %cl1571; X86-NEXT: subb %bl, %cl1572; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1573; X86-NEXT: cmpl %edx, %edi1574; X86-NEXT: movl %esi, %ecx1575; X86-NEXT: sbbl %eax, %ecx1576; X86-NEXT: setl %bl1577; X86-NEXT: cmpl %edi, %edx1578; X86-NEXT: movl {{[0-9]+}}(%esp), %edx1579; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1580; X86-NEXT: sbbl %esi, %eax1581; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1582; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1583; X86-NEXT: setl %bh1584; X86-NEXT: subb %bl, %bh1585; X86-NEXT: movb %bh, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1586; X86-NEXT: cmpl %edx, %eax1587; X86-NEXT: movl %esi, %edi1588; X86-NEXT: sbbl %ecx, %edi1589; X86-NEXT: setl %bl1590; X86-NEXT: cmpl %eax, %edx1591; X86-NEXT: movl {{[0-9]+}}(%esp), %edx1592; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1593; X86-NEXT: sbbl %esi, %ecx1594; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1595; X86-NEXT: setl %bh1596; X86-NEXT: subb %bl, %bh1597; X86-NEXT: movb %bh, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1598; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1599; X86-NEXT: cmpl %edx, %ecx1600; X86-NEXT: movl %esi, %edi1601; X86-NEXT: sbbl %eax, %edi1602; X86-NEXT: setl %bl1603; X86-NEXT: cmpl %ecx, %edx1604; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1605; X86-NEXT: sbbl %esi, %eax1606; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1607; X86-NEXT: movl {{[0-9]+}}(%esp), %edx1608; X86-NEXT: setl %bh1609; X86-NEXT: subb %bl, %bh1610; X86-NEXT: movb %bh, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1611; X86-NEXT: cmpl %ecx, %edx1612; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1613; X86-NEXT: movl %esi, %edi1614; X86-NEXT: sbbl %eax, %edi1615; X86-NEXT: setl %bl1616; X86-NEXT: cmpl %edx, %ecx1617; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1618; X86-NEXT: sbbl %esi, %eax1619; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1620; X86-NEXT: setl %dl1621; X86-NEXT: subb %bl, %dl1622; X86-NEXT: movb %dl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1623; X86-NEXT: movl {{[0-9]+}}(%esp), %edx1624; X86-NEXT: cmpl %ecx, %edx1625; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1626; X86-NEXT: movl %esi, %edi1627; X86-NEXT: sbbl %eax, %edi1628; X86-NEXT: setl %bl1629; X86-NEXT: cmpl %edx, %ecx1630; X86-NEXT: sbbl %esi, %eax1631; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1632; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1633; X86-NEXT: setl %dl1634; X86-NEXT: subb %bl, %dl1635; X86-NEXT: movb %dl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1636; X86-NEXT: cmpl %eax, %ecx1637; X86-NEXT: movl {{[0-9]+}}(%esp), %edx1638; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1639; X86-NEXT: movl %esi, %edi1640; X86-NEXT: sbbl %edx, %edi1641; X86-NEXT: setl %bl1642; X86-NEXT: cmpl %ecx, %eax1643; X86-NEXT: sbbl %esi, %edx1644; X86-NEXT: setl %al1645; X86-NEXT: subb %bl, %al1646; X86-NEXT: movb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1647; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp1648; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1649; X86-NEXT: cmpl %ebp, %ecx1650; X86-NEXT: movl {{[0-9]+}}(%esp), %edx1651; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1652; X86-NEXT: movl %esi, %edi1653; X86-NEXT: sbbl %edx, %edi1654; X86-NEXT: setl %al1655; X86-NEXT: cmpl %ecx, %ebp1656; X86-NEXT: sbbl %esi, %edx1657; X86-NEXT: setl %cl1658; X86-NEXT: subb %al, %cl1659; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1660; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp1661; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1662; X86-NEXT: cmpl %ebp, %ecx1663; X86-NEXT: movl {{[0-9]+}}(%esp), %edx1664; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1665; X86-NEXT: movl %esi, %edi1666; X86-NEXT: sbbl %edx, %edi1667; X86-NEXT: setl %al1668; X86-NEXT: cmpl %ecx, %ebp1669; X86-NEXT: sbbl %esi, %edx1670; X86-NEXT: setl %cl1671; X86-NEXT: subb %al, %cl1672; X86-NEXT: movb %cl, (%esp) # 1-byte Spill1673; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1674; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1675; X86-NEXT: cmpl %eax, %ecx1676; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1677; X86-NEXT: movl {{[0-9]+}}(%esp), %edi1678; X86-NEXT: movl %edi, %ebp1679; X86-NEXT: sbbl %esi, %ebp1680; X86-NEXT: setl %dl1681; X86-NEXT: cmpl %ecx, %eax1682; X86-NEXT: sbbl %edi, %esi1683; X86-NEXT: setl %ch1684; X86-NEXT: subb %dl, %ch1685; X86-NEXT: movl {{[0-9]+}}(%esp), %edx1686; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1687; X86-NEXT: cmpl %edx, %esi1688; X86-NEXT: movl {{[0-9]+}}(%esp), %edi1689; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1690; X86-NEXT: movl %eax, %ebp1691; X86-NEXT: sbbl %edi, %ebp1692; X86-NEXT: setl %cl1693; X86-NEXT: cmpl %esi, %edx1694; X86-NEXT: sbbl %eax, %edi1695; X86-NEXT: setl %dl1696; X86-NEXT: subb %cl, %dl1697; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx1698; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1699; X86-NEXT: cmpl %ebx, %esi1700; X86-NEXT: movl {{[0-9]+}}(%esp), %edi1701; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1702; X86-NEXT: movl %eax, %ebp1703; X86-NEXT: sbbl %edi, %ebp1704; X86-NEXT: setl %dh1705; X86-NEXT: cmpl %esi, %ebx1706; X86-NEXT: sbbl %eax, %edi1707; X86-NEXT: setl %cl1708; X86-NEXT: subb %dh, %cl1709; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1710; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1711; X86-NEXT: cmpl %eax, %esi1712; X86-NEXT: movl {{[0-9]+}}(%esp), %edi1713; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx1714; X86-NEXT: movl %ebx, %ebp1715; X86-NEXT: sbbl %edi, %ebp1716; X86-NEXT: setl %dh1717; X86-NEXT: cmpl %esi, %eax1718; X86-NEXT: sbbl %ebx, %edi1719; X86-NEXT: setl %bl1720; X86-NEXT: subb %dh, %bl1721; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1722; X86-NEXT: movb %bl, 15(%eax)1723; X86-NEXT: movb %cl, 14(%eax)1724; X86-NEXT: movb %dl, 13(%eax)1725; X86-NEXT: movb %ch, 12(%eax)1726; X86-NEXT: movzbl (%esp), %ecx # 1-byte Folded Reload1727; X86-NEXT: movb %cl, 11(%eax)1728; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1729; X86-NEXT: movb %cl, 10(%eax)1730; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1731; X86-NEXT: movb %cl, 9(%eax)1732; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1733; X86-NEXT: movb %cl, 8(%eax)1734; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1735; X86-NEXT: movb %cl, 7(%eax)1736; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1737; X86-NEXT: movb %cl, 6(%eax)1738; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1739; X86-NEXT: movb %cl, 5(%eax)1740; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1741; X86-NEXT: movb %cl, 4(%eax)1742; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1743; X86-NEXT: movb %cl, 3(%eax)1744; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1745; X86-NEXT: movb %cl, 2(%eax)1746; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1747; X86-NEXT: movb %cl, 1(%eax)1748; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1749; X86-NEXT: movb %cl, (%eax)1750; X86-NEXT: addl $12, %esp1751; X86-NEXT: popl %esi1752; X86-NEXT: popl %edi1753; X86-NEXT: popl %ebx1754; X86-NEXT: popl %ebp1755; X86-NEXT: retl $41756 %1 = call <16 x i8> @llvm.scmp(<16 x i64> %x, <16 x i64> %y)1757 ret <16 x i8> %11758}1759 1760define <7 x i117> @scmp_uncommon_vectors(<7 x i7> %x, <7 x i7> %y) nounwind {1761; SSE2-LABEL: scmp_uncommon_vectors:1762; SSE2: # %bb.0:1763; SSE2-NEXT: pushq %rbp1764; SSE2-NEXT: pushq %r151765; SSE2-NEXT: pushq %r141766; SSE2-NEXT: pushq %r131767; SSE2-NEXT: pushq %r121768; SSE2-NEXT: pushq %rbx1769; SSE2-NEXT: movq %rdi, %rax1770; SSE2-NEXT: movzbl {{[0-9]+}}(%rsp), %edi1771; SSE2-NEXT: movzbl {{[0-9]+}}(%rsp), %r10d1772; SSE2-NEXT: movzbl {{[0-9]+}}(%rsp), %r11d1773; SSE2-NEXT: movzbl {{[0-9]+}}(%rsp), %ebx1774; SSE2-NEXT: movzbl {{[0-9]+}}(%rsp), %ebp1775; SSE2-NEXT: movzbl {{[0-9]+}}(%rsp), %r14d1776; SSE2-NEXT: movzbl {{[0-9]+}}(%rsp), %r15d1777; SSE2-NEXT: addb %r15b, %r15b1778; SSE2-NEXT: sarb %r15b1779; SSE2-NEXT: addb %sil, %sil1780; SSE2-NEXT: sarb %sil1781; SSE2-NEXT: cmpb %r15b, %sil1782; SSE2-NEXT: setl %sil1783; SSE2-NEXT: setg %r15b1784; SSE2-NEXT: subb %sil, %r15b1785; SSE2-NEXT: movsbq %r15b, %rsi1786; SSE2-NEXT: movq %rsi, (%rax)1787; SSE2-NEXT: movq %rsi, %xmm01788; SSE2-NEXT: sarq $63, %rsi1789; SSE2-NEXT: addb %r14b, %r14b1790; SSE2-NEXT: sarb %r14b1791; SSE2-NEXT: movzbl {{[0-9]+}}(%rsp), %r15d1792; SSE2-NEXT: addb %r15b, %r15b1793; SSE2-NEXT: sarb %r15b1794; SSE2-NEXT: cmpb %r14b, %r15b1795; SSE2-NEXT: setl %r14b1796; SSE2-NEXT: setg %r15b1797; SSE2-NEXT: subb %r14b, %r15b1798; SSE2-NEXT: movsbq %r15b, %r141799; SSE2-NEXT: movq %r14, %r151800; SSE2-NEXT: sarq $63, %r151801; SSE2-NEXT: addb %bpl, %bpl1802; SSE2-NEXT: sarb %bpl1803; SSE2-NEXT: addb %dl, %dl1804; SSE2-NEXT: sarb %dl1805; SSE2-NEXT: cmpb %bpl, %dl1806; SSE2-NEXT: setl %dl1807; SSE2-NEXT: setg %bpl1808; SSE2-NEXT: subb %dl, %bpl1809; SSE2-NEXT: movsbq %bpl, %rdx1810; SSE2-NEXT: movq %rdx, %r121811; SSE2-NEXT: sarq $63, %r121812; SSE2-NEXT: addb %bl, %bl1813; SSE2-NEXT: sarb %bl1814; SSE2-NEXT: addb %cl, %cl1815; SSE2-NEXT: sarb %cl1816; SSE2-NEXT: cmpb %bl, %cl1817; SSE2-NEXT: setl %cl1818; SSE2-NEXT: setg %bl1819; SSE2-NEXT: subb %cl, %bl1820; SSE2-NEXT: movsbq %bl, %rbx1821; SSE2-NEXT: movq %rbx, %rcx1822; SSE2-NEXT: sarq $63, %rcx1823; SSE2-NEXT: addb %r11b, %r11b1824; SSE2-NEXT: sarb %r11b1825; SSE2-NEXT: addb %r8b, %r8b1826; SSE2-NEXT: sarb %r8b1827; SSE2-NEXT: cmpb %r11b, %r8b1828; SSE2-NEXT: setl %r8b1829; SSE2-NEXT: setg %r11b1830; SSE2-NEXT: subb %r8b, %r11b1831; SSE2-NEXT: movsbq %r11b, %r81832; SSE2-NEXT: movq %r8, %r111833; SSE2-NEXT: sarq $63, %r111834; SSE2-NEXT: addb %r10b, %r10b1835; SSE2-NEXT: sarb %r10b1836; SSE2-NEXT: addb %r9b, %r9b1837; SSE2-NEXT: sarb %r9b1838; SSE2-NEXT: cmpb %r10b, %r9b1839; SSE2-NEXT: setl %r9b1840; SSE2-NEXT: setg %r10b1841; SSE2-NEXT: subb %r9b, %r10b1842; SSE2-NEXT: movsbq %r10b, %r91843; SSE2-NEXT: movq %r9, %r101844; SSE2-NEXT: sarq $63, %r101845; SSE2-NEXT: addb %dil, %dil1846; SSE2-NEXT: sarb %dil1847; SSE2-NEXT: movzbl {{[0-9]+}}(%rsp), %ebp1848; SSE2-NEXT: addb %bpl, %bpl1849; SSE2-NEXT: sarb %bpl1850; SSE2-NEXT: cmpb %dil, %bpl1851; SSE2-NEXT: setl %dil1852; SSE2-NEXT: setg %bpl1853; SSE2-NEXT: subb %dil, %bpl1854; SSE2-NEXT: movsbq %bpl, %rdi1855; SSE2-NEXT: movq %rdi, %r131856; SSE2-NEXT: sarq $63, %r131857; SSE2-NEXT: movl %r13d, 96(%rax)1858; SSE2-NEXT: movabsq $2251799813685247, %rbp # imm = 0x7FFFFFFFFFFFF1859; SSE2-NEXT: andq %r13, %rbp1860; SSE2-NEXT: shldq $62, %rdi, %r131861; SSE2-NEXT: movq %r13, 88(%rax)1862; SSE2-NEXT: movq %r10, %r131863; SSE2-NEXT: shldq $20, %r9, %r131864; SSE2-NEXT: movq %r13, 64(%rax)1865; SSE2-NEXT: movq %r11, %r131866; SSE2-NEXT: shldq $31, %r8, %r131867; SSE2-NEXT: movq %r13, 48(%rax)1868; SSE2-NEXT: movq %rcx, %r131869; SSE2-NEXT: shldq $42, %rbx, %r131870; SSE2-NEXT: movq %r13, 32(%rax)1871; SSE2-NEXT: movabsq $9007199254738944, %r13 # imm = 0x1FFFFFFFFFF8001872; SSE2-NEXT: andq %r12, %r131873; SSE2-NEXT: shldq $53, %rdx, %r121874; SSE2-NEXT: movq %r12, 16(%rax)1875; SSE2-NEXT: movq %rbp, %r121876; SSE2-NEXT: shrq $48, %r121877; SSE2-NEXT: movb %r12b, 102(%rax)1878; SSE2-NEXT: shrq $32, %rbp1879; SSE2-NEXT: movw %bp, 100(%rax)1880; SSE2-NEXT: movabsq $9007199254740991, %r12 # imm = 0x1FFFFFFFFFFFFF1881; SSE2-NEXT: andq %r12, %r151882; SSE2-NEXT: shldq $9, %r14, %r151883; SSE2-NEXT: shlq $62, %rdi1884; SSE2-NEXT: orq %r15, %rdi1885; SSE2-NEXT: movq %rdi, 80(%rax)1886; SSE2-NEXT: shlq $42, %rbx1887; SSE2-NEXT: shrq $11, %r131888; SSE2-NEXT: orq %rbx, %r131889; SSE2-NEXT: movq %r13, 24(%rax)1890; SSE2-NEXT: shlq $9, %r141891; SSE2-NEXT: andl $511, %r10d # imm = 0x1FF1892; SSE2-NEXT: orq %r14, %r101893; SSE2-NEXT: movq %r10, 72(%rax)1894; SSE2-NEXT: shlq $20, %r91895; SSE2-NEXT: andl $1048575, %r11d # imm = 0xFFFFF1896; SSE2-NEXT: orq %r9, %r111897; SSE2-NEXT: movq %r11, 56(%rax)1898; SSE2-NEXT: shlq $31, %r81899; SSE2-NEXT: andl $2147483647, %ecx # imm = 0x7FFFFFFF1900; SSE2-NEXT: orq %r8, %rcx1901; SSE2-NEXT: movq %rcx, 40(%rax)1902; SSE2-NEXT: movq %rsi, %xmm11903; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1904; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1905; SSE2-NEXT: movq %xmm0, %rcx1906; SSE2-NEXT: andq %r12, %rcx1907; SSE2-NEXT: shlq $53, %rdx1908; SSE2-NEXT: orq %rcx, %rdx1909; SSE2-NEXT: movq %rdx, 8(%rax)1910; SSE2-NEXT: popq %rbx1911; SSE2-NEXT: popq %r121912; SSE2-NEXT: popq %r131913; SSE2-NEXT: popq %r141914; SSE2-NEXT: popq %r151915; SSE2-NEXT: popq %rbp1916; SSE2-NEXT: retq1917;1918; SSE4-LABEL: scmp_uncommon_vectors:1919; SSE4: # %bb.0:1920; SSE4-NEXT: pushq %rbp1921; SSE4-NEXT: pushq %r151922; SSE4-NEXT: pushq %r141923; SSE4-NEXT: pushq %r131924; SSE4-NEXT: pushq %r121925; SSE4-NEXT: pushq %rbx1926; SSE4-NEXT: movq %rdi, %rax1927; SSE4-NEXT: movzbl {{[0-9]+}}(%rsp), %edi1928; SSE4-NEXT: movzbl {{[0-9]+}}(%rsp), %r10d1929; SSE4-NEXT: movzbl {{[0-9]+}}(%rsp), %r11d1930; SSE4-NEXT: movzbl {{[0-9]+}}(%rsp), %ebx1931; SSE4-NEXT: movzbl {{[0-9]+}}(%rsp), %ebp1932; SSE4-NEXT: movzbl {{[0-9]+}}(%rsp), %r15d1933; SSE4-NEXT: movzbl {{[0-9]+}}(%rsp), %r14d1934; SSE4-NEXT: addb %r14b, %r14b1935; SSE4-NEXT: sarb %r14b1936; SSE4-NEXT: addb %sil, %sil1937; SSE4-NEXT: sarb %sil1938; SSE4-NEXT: cmpb %r14b, %sil1939; SSE4-NEXT: setl %sil1940; SSE4-NEXT: setg %r14b1941; SSE4-NEXT: subb %sil, %r14b1942; SSE4-NEXT: movsbq %r14b, %r141943; SSE4-NEXT: movq %r14, (%rax)1944; SSE4-NEXT: sarq $63, %r141945; SSE4-NEXT: addb %r15b, %r15b1946; SSE4-NEXT: sarb %r15b1947; SSE4-NEXT: movzbl {{[0-9]+}}(%rsp), %esi1948; SSE4-NEXT: addb %sil, %sil1949; SSE4-NEXT: sarb %sil1950; SSE4-NEXT: cmpb %r15b, %sil1951; SSE4-NEXT: setl %sil1952; SSE4-NEXT: setg %r15b1953; SSE4-NEXT: subb %sil, %r15b1954; SSE4-NEXT: movsbq %r15b, %rsi1955; SSE4-NEXT: movq %rsi, %r151956; SSE4-NEXT: sarq $63, %r151957; SSE4-NEXT: addb %bpl, %bpl1958; SSE4-NEXT: sarb %bpl1959; SSE4-NEXT: addb %dl, %dl1960; SSE4-NEXT: sarb %dl1961; SSE4-NEXT: cmpb %bpl, %dl1962; SSE4-NEXT: setl %dl1963; SSE4-NEXT: setg %bpl1964; SSE4-NEXT: subb %dl, %bpl1965; SSE4-NEXT: movsbq %bpl, %r121966; SSE4-NEXT: movq %r12, %r131967; SSE4-NEXT: sarq $63, %r131968; SSE4-NEXT: addb %bl, %bl1969; SSE4-NEXT: sarb %bl1970; SSE4-NEXT: addb %cl, %cl1971; SSE4-NEXT: sarb %cl1972; SSE4-NEXT: cmpb %bl, %cl1973; SSE4-NEXT: setl %cl1974; SSE4-NEXT: setg %dl1975; SSE4-NEXT: subb %cl, %dl1976; SSE4-NEXT: movsbq %dl, %rbx1977; SSE4-NEXT: movq %rbx, %rcx1978; SSE4-NEXT: sarq $63, %rcx1979; SSE4-NEXT: addb %r11b, %r11b1980; SSE4-NEXT: sarb %r11b1981; SSE4-NEXT: addb %r8b, %r8b1982; SSE4-NEXT: sarb %r8b1983; SSE4-NEXT: cmpb %r11b, %r8b1984; SSE4-NEXT: setl %dl1985; SSE4-NEXT: setg %r8b1986; SSE4-NEXT: subb %dl, %r8b1987; SSE4-NEXT: movsbq %r8b, %rdx1988; SSE4-NEXT: movq %rdx, %r81989; SSE4-NEXT: sarq $63, %r81990; SSE4-NEXT: addb %r10b, %r10b1991; SSE4-NEXT: sarb %r10b1992; SSE4-NEXT: addb %r9b, %r9b1993; SSE4-NEXT: sarb %r9b1994; SSE4-NEXT: cmpb %r10b, %r9b1995; SSE4-NEXT: setl %r9b1996; SSE4-NEXT: setg %r10b1997; SSE4-NEXT: subb %r9b, %r10b1998; SSE4-NEXT: movsbq %r10b, %r91999; SSE4-NEXT: movq %r9, %r102000; SSE4-NEXT: sarq $63, %r102001; SSE4-NEXT: addb %dil, %dil2002; SSE4-NEXT: sarb %dil2003; SSE4-NEXT: movzbl {{[0-9]+}}(%rsp), %r11d2004; SSE4-NEXT: addb %r11b, %r11b2005; SSE4-NEXT: sarb %r11b2006; SSE4-NEXT: cmpb %dil, %r11b2007; SSE4-NEXT: setl %dil2008; SSE4-NEXT: setg %r11b2009; SSE4-NEXT: subb %dil, %r11b2010; SSE4-NEXT: movsbq %r11b, %rdi2011; SSE4-NEXT: movq %rdi, %rbp2012; SSE4-NEXT: sarq $63, %rbp2013; SSE4-NEXT: movl %ebp, 96(%rax)2014; SSE4-NEXT: movabsq $2251799813685247, %r11 # imm = 0x7FFFFFFFFFFFF2015; SSE4-NEXT: andq %rbp, %r112016; SSE4-NEXT: shldq $62, %rdi, %rbp2017; SSE4-NEXT: movq %rbp, 88(%rax)2018; SSE4-NEXT: movq %r10, %rbp2019; SSE4-NEXT: shldq $20, %r9, %rbp2020; SSE4-NEXT: movq %rbp, 64(%rax)2021; SSE4-NEXT: movq %r8, %rbp2022; SSE4-NEXT: shldq $31, %rdx, %rbp2023; SSE4-NEXT: movq %rbp, 48(%rax)2024; SSE4-NEXT: movq %rcx, %rbp2025; SSE4-NEXT: shldq $42, %rbx, %rbp2026; SSE4-NEXT: movq %rbp, 32(%rax)2027; SSE4-NEXT: movabsq $9007199254738944, %rbp # imm = 0x1FFFFFFFFFF8002028; SSE4-NEXT: andq %r13, %rbp2029; SSE4-NEXT: shldq $53, %r12, %r132030; SSE4-NEXT: movq %r13, 16(%rax)2031; SSE4-NEXT: movq %r11, %r132032; SSE4-NEXT: shrq $48, %r132033; SSE4-NEXT: movb %r13b, 102(%rax)2034; SSE4-NEXT: shrq $32, %r112035; SSE4-NEXT: movw %r11w, 100(%rax)2036; SSE4-NEXT: movabsq $9007199254740991, %r11 # imm = 0x1FFFFFFFFFFFFF2037; SSE4-NEXT: andq %r11, %r152038; SSE4-NEXT: shldq $9, %rsi, %r152039; SSE4-NEXT: shlq $62, %rdi2040; SSE4-NEXT: orq %r15, %rdi2041; SSE4-NEXT: movq %rdi, 80(%rax)2042; SSE4-NEXT: andq %r11, %r142043; SSE4-NEXT: shlq $53, %r122044; SSE4-NEXT: orq %r14, %r122045; SSE4-NEXT: movq %r12, 8(%rax)2046; SSE4-NEXT: shlq $42, %rbx2047; SSE4-NEXT: shrq $11, %rbp2048; SSE4-NEXT: orq %rbx, %rbp2049; SSE4-NEXT: movq %rbp, 24(%rax)2050; SSE4-NEXT: shlq $9, %rsi2051; SSE4-NEXT: andl $511, %r10d # imm = 0x1FF2052; SSE4-NEXT: orq %rsi, %r102053; SSE4-NEXT: movq %r10, 72(%rax)2054; SSE4-NEXT: shlq $20, %r92055; SSE4-NEXT: andl $1048575, %r8d # imm = 0xFFFFF2056; SSE4-NEXT: orq %r9, %r82057; SSE4-NEXT: movq %r8, 56(%rax)2058; SSE4-NEXT: shlq $31, %rdx2059; SSE4-NEXT: andl $2147483647, %ecx # imm = 0x7FFFFFFF2060; SSE4-NEXT: orq %rdx, %rcx2061; SSE4-NEXT: movq %rcx, 40(%rax)2062; SSE4-NEXT: popq %rbx2063; SSE4-NEXT: popq %r122064; SSE4-NEXT: popq %r132065; SSE4-NEXT: popq %r142066; SSE4-NEXT: popq %r152067; SSE4-NEXT: popq %rbp2068; SSE4-NEXT: retq2069;2070; AVX-LABEL: scmp_uncommon_vectors:2071; AVX: # %bb.0:2072; AVX-NEXT: pushq %rbp2073; AVX-NEXT: pushq %r152074; AVX-NEXT: pushq %r142075; AVX-NEXT: pushq %r132076; AVX-NEXT: pushq %r122077; AVX-NEXT: pushq %rbx2078; AVX-NEXT: movq %rdi, %rax2079; AVX-NEXT: movzbl {{[0-9]+}}(%rsp), %edi2080; AVX-NEXT: movzbl {{[0-9]+}}(%rsp), %r10d2081; AVX-NEXT: movzbl {{[0-9]+}}(%rsp), %r11d2082; AVX-NEXT: movzbl {{[0-9]+}}(%rsp), %ebx2083; AVX-NEXT: movzbl {{[0-9]+}}(%rsp), %ebp2084; AVX-NEXT: movzbl {{[0-9]+}}(%rsp), %r15d2085; AVX-NEXT: movzbl {{[0-9]+}}(%rsp), %r14d2086; AVX-NEXT: addb %r14b, %r14b2087; AVX-NEXT: sarb %r14b2088; AVX-NEXT: addb %sil, %sil2089; AVX-NEXT: sarb %sil2090; AVX-NEXT: cmpb %r14b, %sil2091; AVX-NEXT: setl %sil2092; AVX-NEXT: setg %r14b2093; AVX-NEXT: subb %sil, %r14b2094; AVX-NEXT: movsbq %r14b, %r142095; AVX-NEXT: movq %r14, (%rax)2096; AVX-NEXT: sarq $63, %r142097; AVX-NEXT: addb %r15b, %r15b2098; AVX-NEXT: sarb %r15b2099; AVX-NEXT: movzbl {{[0-9]+}}(%rsp), %esi2100; AVX-NEXT: addb %sil, %sil2101; AVX-NEXT: sarb %sil2102; AVX-NEXT: cmpb %r15b, %sil2103; AVX-NEXT: setl %sil2104; AVX-NEXT: setg %r15b2105; AVX-NEXT: subb %sil, %r15b2106; AVX-NEXT: movsbq %r15b, %rsi2107; AVX-NEXT: movq %rsi, %r122108; AVX-NEXT: sarq $63, %r122109; AVX-NEXT: addb %bpl, %bpl2110; AVX-NEXT: sarb %bpl2111; AVX-NEXT: addb %dl, %dl2112; AVX-NEXT: sarb %dl2113; AVX-NEXT: cmpb %bpl, %dl2114; AVX-NEXT: setl %dl2115; AVX-NEXT: setg %bpl2116; AVX-NEXT: subb %dl, %bpl2117; AVX-NEXT: movsbq %bpl, %r152118; AVX-NEXT: movq %r15, %r132119; AVX-NEXT: sarq $63, %r132120; AVX-NEXT: addb %bl, %bl2121; AVX-NEXT: sarb %bl2122; AVX-NEXT: addb %cl, %cl2123; AVX-NEXT: sarb %cl2124; AVX-NEXT: cmpb %bl, %cl2125; AVX-NEXT: setl %cl2126; AVX-NEXT: setg %dl2127; AVX-NEXT: subb %cl, %dl2128; AVX-NEXT: movsbq %dl, %rbx2129; AVX-NEXT: movq %rbx, %rcx2130; AVX-NEXT: sarq $63, %rcx2131; AVX-NEXT: addb %r11b, %r11b2132; AVX-NEXT: sarb %r11b2133; AVX-NEXT: addb %r8b, %r8b2134; AVX-NEXT: sarb %r8b2135; AVX-NEXT: cmpb %r11b, %r8b2136; AVX-NEXT: setl %dl2137; AVX-NEXT: setg %r8b2138; AVX-NEXT: subb %dl, %r8b2139; AVX-NEXT: movsbq %r8b, %rdx2140; AVX-NEXT: movq %rdx, %r82141; AVX-NEXT: sarq $63, %r82142; AVX-NEXT: addb %r10b, %r10b2143; AVX-NEXT: sarb %r10b2144; AVX-NEXT: addb %r9b, %r9b2145; AVX-NEXT: sarb %r9b2146; AVX-NEXT: cmpb %r10b, %r9b2147; AVX-NEXT: setl %r9b2148; AVX-NEXT: setg %r10b2149; AVX-NEXT: subb %r9b, %r10b2150; AVX-NEXT: movsbq %r10b, %r92151; AVX-NEXT: movq %r9, %r102152; AVX-NEXT: sarq $63, %r102153; AVX-NEXT: addb %dil, %dil2154; AVX-NEXT: sarb %dil2155; AVX-NEXT: movzbl {{[0-9]+}}(%rsp), %r11d2156; AVX-NEXT: addb %r11b, %r11b2157; AVX-NEXT: sarb %r11b2158; AVX-NEXT: cmpb %dil, %r11b2159; AVX-NEXT: setl %dil2160; AVX-NEXT: setg %r11b2161; AVX-NEXT: subb %dil, %r11b2162; AVX-NEXT: movsbq %r11b, %rdi2163; AVX-NEXT: movq %rdi, %rbp2164; AVX-NEXT: sarq $63, %rbp2165; AVX-NEXT: movl %ebp, 96(%rax)2166; AVX-NEXT: movb $51, %r11b2167; AVX-NEXT: bzhiq %r11, %rbp, %r112168; AVX-NEXT: shldq $62, %rdi, %rbp2169; AVX-NEXT: movq %rbp, 88(%rax)2170; AVX-NEXT: movq %r10, %rbp2171; AVX-NEXT: shldq $20, %r9, %rbp2172; AVX-NEXT: movq %rbp, 64(%rax)2173; AVX-NEXT: movq %r8, %rbp2174; AVX-NEXT: shldq $31, %rdx, %rbp2175; AVX-NEXT: movq %rbp, 48(%rax)2176; AVX-NEXT: movq %rcx, %rbp2177; AVX-NEXT: shldq $42, %rbx, %rbp2178; AVX-NEXT: movq %rbp, 32(%rax)2179; AVX-NEXT: movb $42, %bpl2180; AVX-NEXT: bzhiq %rbp, %r13, %rbp2181; AVX-NEXT: shldq $53, %r15, %r132182; AVX-NEXT: movq %r13, 16(%rax)2183; AVX-NEXT: movq %r11, %r132184; AVX-NEXT: shrq $48, %r132185; AVX-NEXT: movb %r13b, 102(%rax)2186; AVX-NEXT: shrq $32, %r112187; AVX-NEXT: movw %r11w, 100(%rax)2188; AVX-NEXT: movb $53, %r11b2189; AVX-NEXT: bzhiq %r11, %r12, %r122190; AVX-NEXT: shldq $9, %rsi, %r122191; AVX-NEXT: shlq $62, %rdi2192; AVX-NEXT: orq %r12, %rdi2193; AVX-NEXT: movq %rdi, 80(%rax)2194; AVX-NEXT: shlq $42, %rbx2195; AVX-NEXT: orq %rbp, %rbx2196; AVX-NEXT: movq %rbx, 24(%rax)2197; AVX-NEXT: bzhiq %r11, %r14, %rdi2198; AVX-NEXT: shlq $53, %r152199; AVX-NEXT: orq %rdi, %r152200; AVX-NEXT: movq %r15, 8(%rax)2201; AVX-NEXT: shlq $9, %rsi2202; AVX-NEXT: andl $511, %r10d # imm = 0x1FF2203; AVX-NEXT: orq %rsi, %r102204; AVX-NEXT: movq %r10, 72(%rax)2205; AVX-NEXT: shlq $20, %r92206; AVX-NEXT: andl $1048575, %r8d # imm = 0xFFFFF2207; AVX-NEXT: orq %r9, %r82208; AVX-NEXT: movq %r8, 56(%rax)2209; AVX-NEXT: shlq $31, %rdx2210; AVX-NEXT: andl $2147483647, %ecx # imm = 0x7FFFFFFF2211; AVX-NEXT: orq %rdx, %rcx2212; AVX-NEXT: movq %rcx, 40(%rax)2213; AVX-NEXT: popq %rbx2214; AVX-NEXT: popq %r122215; AVX-NEXT: popq %r132216; AVX-NEXT: popq %r142217; AVX-NEXT: popq %r152218; AVX-NEXT: popq %rbp2219; AVX-NEXT: retq2220;2221; X86-LABEL: scmp_uncommon_vectors:2222; X86: # %bb.0:2223; X86-NEXT: pushl %ebp2224; X86-NEXT: pushl %ebx2225; X86-NEXT: pushl %edi2226; X86-NEXT: pushl %esi2227; X86-NEXT: subl $52, %esp2228; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax2229; X86-NEXT: addb %al, %al2230; X86-NEXT: sarb %al2231; X86-NEXT: movb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill2232; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax2233; X86-NEXT: addb %al, %al2234; X86-NEXT: sarb %al2235; X86-NEXT: movb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill2236; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax2237; X86-NEXT: addb %al, %al2238; X86-NEXT: sarb %al2239; X86-NEXT: movb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill2240; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax2241; X86-NEXT: addb %al, %al2242; X86-NEXT: sarb %al2243; X86-NEXT: movb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill2244; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax2245; X86-NEXT: addb %al, %al2246; X86-NEXT: sarb %al2247; X86-NEXT: movb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill2248; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax2249; X86-NEXT: addb %al, %al2250; X86-NEXT: sarb %al2251; X86-NEXT: movb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill2252; X86-NEXT: movb {{[0-9]+}}(%esp), %dh2253; X86-NEXT: addb %dh, %dh2254; X86-NEXT: sarb %dh2255; X86-NEXT: movb {{[0-9]+}}(%esp), %dl2256; X86-NEXT: addb %dl, %dl2257; X86-NEXT: sarb %dl2258; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax2259; X86-NEXT: addb %al, %al2260; X86-NEXT: sarb %al2261; X86-NEXT: movb {{[0-9]+}}(%esp), %ah2262; X86-NEXT: addb %ah, %ah2263; X86-NEXT: sarb %ah2264; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx2265; X86-NEXT: addb %cl, %cl2266; X86-NEXT: sarb %cl2267; X86-NEXT: movb {{[0-9]+}}(%esp), %ch2268; X86-NEXT: addb %ch, %ch2269; X86-NEXT: sarb %ch2270; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ebx2271; X86-NEXT: addb %bl, %bl2272; X86-NEXT: sarb %bl2273; X86-NEXT: movb {{[0-9]+}}(%esp), %bh2274; X86-NEXT: addb %bh, %bh2275; X86-NEXT: sarb %bh2276; X86-NEXT: cmpb %bl, %bh2277; X86-NEXT: setl %bl2278; X86-NEXT: setg %bh2279; X86-NEXT: subb %bl, %bh2280; X86-NEXT: movsbl %bh, %esi2281; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill2282; X86-NEXT: sarl $31, %esi2283; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill2284; X86-NEXT: andl $2097151, %esi # imm = 0x1FFFFF2285; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill2286; X86-NEXT: cmpb %cl, %ch2287; X86-NEXT: setl %cl2288; X86-NEXT: setg %ch2289; X86-NEXT: subb %cl, %ch2290; X86-NEXT: movsbl %ch, %ecx2291; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill2292; X86-NEXT: sarl $31, %ecx2293; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill2294; X86-NEXT: andl $2097151, %ecx # imm = 0x1FFFFF2295; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill2296; X86-NEXT: cmpb %al, %ah2297; X86-NEXT: setl %al2298; X86-NEXT: setg %cl2299; X86-NEXT: subb %al, %cl2300; X86-NEXT: movsbl %cl, %ecx2301; X86-NEXT: movl {{[0-9]+}}(%esp), %edi2302; X86-NEXT: movl %ecx, (%edi)2303; X86-NEXT: sarl $31, %ecx2304; X86-NEXT: movl %ecx, %eax2305; X86-NEXT: andl $2097151, %eax # imm = 0x1FFFFF2306; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill2307; X86-NEXT: cmpb %dh, %dl2308; X86-NEXT: setl %al2309; X86-NEXT: setg %dl2310; X86-NEXT: subb %al, %dl2311; X86-NEXT: movsbl %dl, %ebp2312; X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill2313; X86-NEXT: sarl $31, %ebp2314; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 1-byte Folded Reload2315; X86-NEXT: cmpb {{[-0-9]+}}(%e{{[sb]}}p), %al # 1-byte Folded Reload2316; X86-NEXT: setl %al2317; X86-NEXT: setg %dl2318; X86-NEXT: subb %al, %dl2319; X86-NEXT: movsbl %dl, %esi2320; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill2321; X86-NEXT: sarl $31, %esi2322; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 1-byte Folded Reload2323; X86-NEXT: cmpb {{[-0-9]+}}(%e{{[sb]}}p), %al # 1-byte Folded Reload2324; X86-NEXT: setl %al2325; X86-NEXT: setg %dl2326; X86-NEXT: subb %al, %dl2327; X86-NEXT: movsbl %dl, %eax2328; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill2329; X86-NEXT: sarl $31, %eax2330; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 1-byte Folded Reload2331; X86-NEXT: cmpb {{[-0-9]+}}(%e{{[sb]}}p), %dl # 1-byte Folded Reload2332; X86-NEXT: setl %dl2333; X86-NEXT: setg %dh2334; X86-NEXT: subb %dl, %dh2335; X86-NEXT: movsbl %dh, %ebx2336; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill2337; X86-NEXT: sarl $31, %ebx2338; X86-NEXT: movl %ebx, 96(%edi)2339; X86-NEXT: movl %ebx, 92(%edi)2340; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload2341; X86-NEXT: movl %edx, 80(%edi)2342; X86-NEXT: movl %eax, 68(%edi)2343; X86-NEXT: movl %eax, 64(%edi)2344; X86-NEXT: movl %esi, 52(%edi)2345; X86-NEXT: movl %esi, 48(%edi)2346; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload2347; X86-NEXT: movl %edx, 36(%edi)2348; X86-NEXT: movl %ebp, 24(%edi)2349; X86-NEXT: movl %ebp, 20(%edi)2350; X86-NEXT: movl %ecx, 8(%edi)2351; X86-NEXT: movl %ecx, 4(%edi)2352; X86-NEXT: movl %ebx, %ecx2353; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill2354; X86-NEXT: movw %cx, 100(%edi)2355; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload2356; X86-NEXT: shldl $30, %edx, %ecx2357; X86-NEXT: movl %ecx, 88(%edi)2358; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload2359; X86-NEXT: shldl $9, %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill2360; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload2361; X86-NEXT: shldl $9, %edx, %ecx2362; X86-NEXT: movl %ecx, 76(%edi)2363; X86-NEXT: movl %eax, %ecx2364; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload2365; X86-NEXT: shldl $20, %edx, %ecx2366; X86-NEXT: movl %ecx, 60(%edi)2367; X86-NEXT: movl %esi, %ecx2368; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload2369; X86-NEXT: shldl $31, %edx, %ecx2370; X86-NEXT: movl %ecx, 44(%edi)2371; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload2372; X86-NEXT: shldl $10, %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill2373; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload2374; X86-NEXT: shldl $10, %edx, %ecx2375; X86-NEXT: movl %ecx, 32(%edi)2376; X86-NEXT: movl %ebp, %ecx2377; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload2378; X86-NEXT: shldl $21, %ebx, %ecx2379; X86-NEXT: movl %ecx, 16(%edi)2380; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload2381; X86-NEXT: shll $9, %ecx2382; X86-NEXT: andl $511, %eax # imm = 0x1FF2383; X86-NEXT: orl %ecx, %eax2384; X86-NEXT: movl %eax, 72(%edi)2385; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload2386; X86-NEXT: shll $20, %eax2387; X86-NEXT: andl $1048575, %esi # imm = 0xFFFFF2388; X86-NEXT: orl %eax, %esi2389; X86-NEXT: movl %esi, 56(%edi)2390; X86-NEXT: shll $10, %edx2391; X86-NEXT: andl $1023, %ebp # imm = 0x3FF2392; X86-NEXT: orl %edx, %ebp2393; X86-NEXT: movl %ebp, 28(%edi)2394; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload2395; X86-NEXT: shll $21, %eax2396; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload2397; X86-NEXT: movl %eax, 12(%edi)2398; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload2399; X86-NEXT: andl $7, %eax2400; X86-NEXT: movb %al, 102(%edi)2401; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload2402; X86-NEXT: shll $30, %eax2403; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload2404; X86-NEXT: movl %eax, 84(%edi)2405; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload2406; X86-NEXT: shll $31, %eax2407; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload2408; X86-NEXT: movl %eax, 40(%edi)2409; X86-NEXT: movl %edi, %eax2410; X86-NEXT: addl $52, %esp2411; X86-NEXT: popl %esi2412; X86-NEXT: popl %edi2413; X86-NEXT: popl %ebx2414; X86-NEXT: popl %ebp2415; X86-NEXT: retl $42416 %1 = call <7 x i117> @llvm.scmp(<7 x i7> %x, <7 x i7> %y)2417 ret <7 x i117> %12418}2419 2420define <1 x i3> @scmp_scalarize(<1 x i33> %x, <1 x i33> %y) nounwind {2421; X64-LABEL: scmp_scalarize:2422; X64: # %bb.0:2423; X64-NEXT: shlq $31, %rsi2424; X64-NEXT: sarq $31, %rsi2425; X64-NEXT: shlq $31, %rdi2426; X64-NEXT: sarq $31, %rdi2427; X64-NEXT: cmpq %rsi, %rdi2428; X64-NEXT: setl %cl2429; X64-NEXT: setg %al2430; X64-NEXT: subb %cl, %al2431; X64-NEXT: retq2432;2433; X86-LABEL: scmp_scalarize:2434; X86: # %bb.0:2435; X86-NEXT: pushl %ebx2436; X86-NEXT: pushl %edi2437; X86-NEXT: pushl %esi2438; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx2439; X86-NEXT: movl {{[0-9]+}}(%esp), %eax2440; X86-NEXT: andl $1, %eax2441; X86-NEXT: negl %eax2442; X86-NEXT: movl {{[0-9]+}}(%esp), %edx2443; X86-NEXT: movl {{[0-9]+}}(%esp), %esi2444; X86-NEXT: andl $1, %esi2445; X86-NEXT: negl %esi2446; X86-NEXT: cmpl %ecx, %edx2447; X86-NEXT: movl %esi, %edi2448; X86-NEXT: sbbl %eax, %edi2449; X86-NEXT: setl %bl2450; X86-NEXT: cmpl %edx, %ecx2451; X86-NEXT: sbbl %esi, %eax2452; X86-NEXT: setl %al2453; X86-NEXT: subb %bl, %al2454; X86-NEXT: popl %esi2455; X86-NEXT: popl %edi2456; X86-NEXT: popl %ebx2457; X86-NEXT: retl2458 %1 = call <1 x i3> @llvm.scmp(<1 x i33> %x, <1 x i33> %y)2459 ret <1 x i3> %12460}2461 2462define <2 x i8> @scmp_bool_operands(<2 x i1> %x, <2 x i1> %y) nounwind {2463; SSE2-LABEL: scmp_bool_operands:2464; SSE2: # %bb.0:2465; SSE2-NEXT: movaps %xmm1, -{{[0-9]+}}(%rsp)2466; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)2467; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax2468; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx2469; SSE2-NEXT: andb $1, %al2470; SSE2-NEXT: negb %al2471; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %edx2472; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %esi2473; SSE2-NEXT: andb $1, %dl2474; SSE2-NEXT: negb %dl2475; SSE2-NEXT: cmpb %al, %dl2476; SSE2-NEXT: setl %al2477; SSE2-NEXT: setg %dl2478; SSE2-NEXT: subb %al, %dl2479; SSE2-NEXT: movzbl %dl, %eax2480; SSE2-NEXT: andb $1, %cl2481; SSE2-NEXT: negb %cl2482; SSE2-NEXT: andb $1, %sil2483; SSE2-NEXT: negb %sil2484; SSE2-NEXT: cmpb %cl, %sil2485; SSE2-NEXT: setl %cl2486; SSE2-NEXT: setg %dl2487; SSE2-NEXT: subb %cl, %dl2488; SSE2-NEXT: movzbl %dl, %ecx2489; SSE2-NEXT: shll $8, %ecx2490; SSE2-NEXT: orl %eax, %ecx2491; SSE2-NEXT: movd %ecx, %xmm02492; SSE2-NEXT: retq2493;2494; SSE4-LABEL: scmp_bool_operands:2495; SSE4: # %bb.0:2496; SSE4-NEXT: pextrb $8, %xmm1, %eax2497; SSE4-NEXT: andb $1, %al2498; SSE4-NEXT: negb %al2499; SSE4-NEXT: pextrb $8, %xmm0, %ecx2500; SSE4-NEXT: andb $1, %cl2501; SSE4-NEXT: negb %cl2502; SSE4-NEXT: cmpb %al, %cl2503; SSE4-NEXT: setl %al2504; SSE4-NEXT: setg %cl2505; SSE4-NEXT: subb %al, %cl2506; SSE4-NEXT: movzbl %cl, %eax2507; SSE4-NEXT: movd %xmm1, %ecx2508; SSE4-NEXT: andb $1, %cl2509; SSE4-NEXT: negb %cl2510; SSE4-NEXT: movd %xmm0, %edx2511; SSE4-NEXT: andb $1, %dl2512; SSE4-NEXT: negb %dl2513; SSE4-NEXT: cmpb %cl, %dl2514; SSE4-NEXT: setl %cl2515; SSE4-NEXT: setg %dl2516; SSE4-NEXT: subb %cl, %dl2517; SSE4-NEXT: movzbl %dl, %ecx2518; SSE4-NEXT: movd %ecx, %xmm02519; SSE4-NEXT: pinsrb $1, %eax, %xmm02520; SSE4-NEXT: retq2521;2522; AVX2-LABEL: scmp_bool_operands:2523; AVX2: # %bb.0:2524; AVX2-NEXT: vpextrb $8, %xmm1, %eax2525; AVX2-NEXT: andb $1, %al2526; AVX2-NEXT: vpextrb $8, %xmm0, %ecx2527; AVX2-NEXT: negb %al2528; AVX2-NEXT: andb $1, %cl2529; AVX2-NEXT: negb %cl2530; AVX2-NEXT: cmpb %al, %cl2531; AVX2-NEXT: setl %al2532; AVX2-NEXT: setg %cl2533; AVX2-NEXT: subb %al, %cl2534; AVX2-NEXT: vmovd %xmm1, %eax2535; AVX2-NEXT: andb $1, %al2536; AVX2-NEXT: negb %al2537; AVX2-NEXT: vmovd %xmm0, %edx2538; AVX2-NEXT: andb $1, %dl2539; AVX2-NEXT: negb %dl2540; AVX2-NEXT: cmpb %al, %dl2541; AVX2-NEXT: setl %al2542; AVX2-NEXT: setg %dl2543; AVX2-NEXT: subb %al, %dl2544; AVX2-NEXT: vmovd %edx, %xmm02545; AVX2-NEXT: vpinsrb $1, %ecx, %xmm0, %xmm02546; AVX2-NEXT: retq2547;2548; AVX512-LABEL: scmp_bool_operands:2549; AVX512: # %bb.0:2550; AVX512-NEXT: vpsllq $63, %xmm0, %xmm02551; AVX512-NEXT: vpmovq2m %xmm0, %k02552; AVX512-NEXT: kshiftrb $1, %k0, %k12553; AVX512-NEXT: kmovd %k1, %eax2554; AVX512-NEXT: vpsllq $63, %xmm1, %xmm02555; AVX512-NEXT: vpmovq2m %xmm0, %k12556; AVX512-NEXT: kshiftrb $1, %k1, %k22557; AVX512-NEXT: kmovd %k2, %ecx2558; AVX512-NEXT: andb $1, %cl2559; AVX512-NEXT: negb %cl2560; AVX512-NEXT: andb $1, %al2561; AVX512-NEXT: negb %al2562; AVX512-NEXT: cmpb %cl, %al2563; AVX512-NEXT: setl %al2564; AVX512-NEXT: setg %cl2565; AVX512-NEXT: subb %al, %cl2566; AVX512-NEXT: kmovd %k1, %eax2567; AVX512-NEXT: andb $1, %al2568; AVX512-NEXT: negb %al2569; AVX512-NEXT: kmovd %k0, %edx2570; AVX512-NEXT: andb $1, %dl2571; AVX512-NEXT: negb %dl2572; AVX512-NEXT: cmpb %al, %dl2573; AVX512-NEXT: setl %al2574; AVX512-NEXT: setg %dl2575; AVX512-NEXT: subb %al, %dl2576; AVX512-NEXT: vmovd %edx, %xmm02577; AVX512-NEXT: vpinsrb $1, %ecx, %xmm0, %xmm02578; AVX512-NEXT: retq2579;2580; X86-LABEL: scmp_bool_operands:2581; X86: # %bb.0:2582; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx2583; X86-NEXT: andb $1, %cl2584; X86-NEXT: negb %cl2585; X86-NEXT: movzbl {{[0-9]+}}(%esp), %edx2586; X86-NEXT: andb $1, %dl2587; X86-NEXT: negb %dl2588; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax2589; X86-NEXT: andb $1, %al2590; X86-NEXT: negb %al2591; X86-NEXT: movb {{[0-9]+}}(%esp), %ah2592; X86-NEXT: andb $1, %ah2593; X86-NEXT: negb %ah2594; X86-NEXT: cmpb %al, %ah2595; X86-NEXT: setl %ah2596; X86-NEXT: setg %al2597; X86-NEXT: subb %ah, %al2598; X86-NEXT: cmpb %cl, %dl2599; X86-NEXT: setl %cl2600; X86-NEXT: setg %dl2601; X86-NEXT: subb %cl, %dl2602; X86-NEXT: retl2603 %1 = call <2 x i8> @llvm.scmp(<2 x i1> %x, <2 x i1> %y)2604 ret <2 x i8> %12605}2606 2607define <2 x i16> @scmp_ret_wider_than_operands(<2 x i8> %x, <2 x i8> %y) nounwind {2608; SSE2-LABEL: scmp_ret_wider_than_operands:2609; SSE2: # %bb.0:2610; SSE2-NEXT: movd %xmm1, %eax2611; SSE2-NEXT: movl %eax, %ecx2612; SSE2-NEXT: shrl $8, %ecx2613; SSE2-NEXT: movd %xmm0, %edx2614; SSE2-NEXT: movl %edx, %esi2615; SSE2-NEXT: shrl $8, %esi2616; SSE2-NEXT: cmpb %cl, %sil2617; SSE2-NEXT: setl %cl2618; SSE2-NEXT: setg %sil2619; SSE2-NEXT: subb %cl, %sil2620; SSE2-NEXT: movsbl %sil, %ecx2621; SSE2-NEXT: cmpb %al, %dl2622; SSE2-NEXT: setl %al2623; SSE2-NEXT: setg %dl2624; SSE2-NEXT: subb %al, %dl2625; SSE2-NEXT: movsbl %dl, %eax2626; SSE2-NEXT: movd %eax, %xmm02627; SSE2-NEXT: pinsrw $1, %ecx, %xmm02628; SSE2-NEXT: retq2629;2630; SSE4-LABEL: scmp_ret_wider_than_operands:2631; SSE4: # %bb.0:2632; SSE4-NEXT: pextrb $1, %xmm1, %eax2633; SSE4-NEXT: pextrb $1, %xmm0, %ecx2634; SSE4-NEXT: cmpb %al, %cl2635; SSE4-NEXT: setl %al2636; SSE4-NEXT: setg %cl2637; SSE4-NEXT: subb %al, %cl2638; SSE4-NEXT: movsbl %cl, %eax2639; SSE4-NEXT: movd %xmm1, %ecx2640; SSE4-NEXT: movd %xmm0, %edx2641; SSE4-NEXT: cmpb %cl, %dl2642; SSE4-NEXT: setl %cl2643; SSE4-NEXT: setg %dl2644; SSE4-NEXT: subb %cl, %dl2645; SSE4-NEXT: movsbl %dl, %ecx2646; SSE4-NEXT: movd %ecx, %xmm02647; SSE4-NEXT: pinsrw $1, %eax, %xmm02648; SSE4-NEXT: retq2649;2650; AVX-LABEL: scmp_ret_wider_than_operands:2651; AVX: # %bb.0:2652; AVX-NEXT: vpextrb $1, %xmm1, %eax2653; AVX-NEXT: vpextrb $1, %xmm0, %ecx2654; AVX-NEXT: cmpb %al, %cl2655; AVX-NEXT: setl %al2656; AVX-NEXT: setg %cl2657; AVX-NEXT: subb %al, %cl2658; AVX-NEXT: movsbl %cl, %eax2659; AVX-NEXT: vmovd %xmm1, %ecx2660; AVX-NEXT: vmovd %xmm0, %edx2661; AVX-NEXT: cmpb %cl, %dl2662; AVX-NEXT: setl %cl2663; AVX-NEXT: setg %dl2664; AVX-NEXT: subb %cl, %dl2665; AVX-NEXT: movsbl %dl, %ecx2666; AVX-NEXT: vmovd %ecx, %xmm02667; AVX-NEXT: vpinsrw $1, %eax, %xmm0, %xmm02668; AVX-NEXT: retq2669;2670; X86-LABEL: scmp_ret_wider_than_operands:2671; X86: # %bb.0:2672; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx2673; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax2674; X86-NEXT: cmpb {{[0-9]+}}(%esp), %al2675; X86-NEXT: setl %al2676; X86-NEXT: setg %dl2677; X86-NEXT: subb %al, %dl2678; X86-NEXT: movsbl %dl, %eax2679; X86-NEXT: cmpb {{[0-9]+}}(%esp), %cl2680; X86-NEXT: setl %cl2681; X86-NEXT: setg %dl2682; X86-NEXT: subb %cl, %dl2683; X86-NEXT: movsbl %dl, %edx2684; X86-NEXT: # kill: def $ax killed $ax killed $eax2685; X86-NEXT: # kill: def $dx killed $dx killed $edx2686; X86-NEXT: retl2687 %1 = call <2 x i16> @llvm.scmp(<2 x i8> %x, <2 x i8> %y)2688 ret <2 x i16> %12689}2690 2691