361 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-- -mcpu=x86-64 | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=SSE,SSE424; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=AVX25; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=AVX512,AVX512-V46; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v4 -mattr=+avx512vbmi | FileCheck %s --check-prefixes=AVX512,AVX512-VBMI7 8define i4 @reverse_cmp_v4i1(<4 x i32> %a0, <4 x i32> %a1) {9; SSE2-LABEL: reverse_cmp_v4i1:10; SSE2: # %bb.0:11; SSE2-NEXT: pcmpeqd %xmm1, %xmm012; SSE2-NEXT: movmskps %xmm0, %eax13; SSE2-NEXT: leal (%rax,%rax), %ecx14; SSE2-NEXT: andb $4, %cl15; SSE2-NEXT: leal (,%rax,8), %edx16; SSE2-NEXT: andb $8, %dl17; SSE2-NEXT: orb %cl, %dl18; SSE2-NEXT: movl %eax, %ecx19; SSE2-NEXT: shrb %cl20; SSE2-NEXT: andb $2, %cl21; SSE2-NEXT: orb %dl, %cl22; SSE2-NEXT: shrb $3, %al23; SSE2-NEXT: orb %cl, %al24; SSE2-NEXT: # kill: def $al killed $al killed $rax25; SSE2-NEXT: retq26;27; SSE42-LABEL: reverse_cmp_v4i1:28; SSE42: # %bb.0:29; SSE42-NEXT: pcmpeqd %xmm1, %xmm030; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]31; SSE42-NEXT: movmskps %xmm0, %eax32; SSE42-NEXT: # kill: def $al killed $al killed $eax33; SSE42-NEXT: retq34;35; AVX2-LABEL: reverse_cmp_v4i1:36; AVX2: # %bb.0:37; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm038; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]39; AVX2-NEXT: vmovmskps %xmm0, %eax40; AVX2-NEXT: # kill: def $al killed $al killed $eax41; AVX2-NEXT: retq42;43; AVX512-LABEL: reverse_cmp_v4i1:44; AVX512: # %bb.0:45; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,2,1,0]46; AVX512-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]47; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %k048; AVX512-NEXT: kmovd %k0, %eax49; AVX512-NEXT: # kill: def $al killed $al killed $eax50; AVX512-NEXT: retq51 %cmp = icmp eq <4 x i32> %a0, %a152 %mask = bitcast <4 x i1> %cmp to i453 %rev = tail call i4 @llvm.bitreverse.i4(i4 %mask)54 ret i4 %rev55}56declare i4 @llvm.bitreverse.i4(i4)57 58define i8 @reverse_cmp_v8i1(<8 x i16> %a0, <8 x i16> %a1) {59; SSE2-LABEL: reverse_cmp_v8i1:60; SSE2: # %bb.0:61; SSE2-NEXT: pcmpeqw %xmm1, %xmm062; SSE2-NEXT: packsswb %xmm0, %xmm063; SSE2-NEXT: pmovmskb %xmm0, %eax64; SSE2-NEXT: rolb $4, %al65; SSE2-NEXT: movl %eax, %ecx66; SSE2-NEXT: andb $51, %cl67; SSE2-NEXT: shlb $2, %cl68; SSE2-NEXT: shrb $2, %al69; SSE2-NEXT: andb $51, %al70; SSE2-NEXT: orb %cl, %al71; SSE2-NEXT: movl %eax, %ecx72; SSE2-NEXT: andb $85, %cl73; SSE2-NEXT: addb %cl, %cl74; SSE2-NEXT: shrb %al75; SSE2-NEXT: andb $85, %al76; SSE2-NEXT: orb %cl, %al77; SSE2-NEXT: # kill: def $al killed $al killed $eax78; SSE2-NEXT: retq79;80; SSE42-LABEL: reverse_cmp_v8i1:81; SSE42: # %bb.0:82; SSE42-NEXT: pcmpeqw %xmm1, %xmm083; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[u,15,u,13,u,11,u,9,u,7,u,5,u,3,u,1]84; SSE42-NEXT: packsswb %xmm0, %xmm085; SSE42-NEXT: pmovmskb %xmm0, %eax86; SSE42-NEXT: # kill: def $al killed $al killed $eax87; SSE42-NEXT: retq88;89; AVX2-LABEL: reverse_cmp_v8i1:90; AVX2: # %bb.0:91; AVX2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm092; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[14,12,10,8,6,4,2,0,u,u,u,u,u,u,u,u]93; AVX2-NEXT: vpmovmskb %xmm0, %eax94; AVX2-NEXT: # kill: def $al killed $al killed $eax95; AVX2-NEXT: retq96;97; AVX512-LABEL: reverse_cmp_v8i1:98; AVX512: # %bb.0:99; AVX512-NEXT: vpcmpeqw %xmm1, %xmm0, %k0100; AVX512-NEXT: vpmovm2d %k0, %ymm0101; AVX512-NEXT: vmovdqa {{.*#+}} ymm1 = [7,6,5,4,3,2,1,0]102; AVX512-NEXT: vpermd %ymm0, %ymm1, %ymm0103; AVX512-NEXT: vpmovd2m %ymm0, %k0104; AVX512-NEXT: kmovd %k0, %eax105; AVX512-NEXT: # kill: def $al killed $al killed $eax106; AVX512-NEXT: vzeroupper107; AVX512-NEXT: retq108 %cmp = icmp eq <8 x i16> %a0, %a1109 %mask = bitcast <8 x i1> %cmp to i8110 %rev = tail call i8 @llvm.bitreverse.i8(i8 %mask)111 ret i8 %rev112}113declare i8 @llvm.bitreverse.i8(i8)114 115define i16 @reverse_cmp_v16i1(<16 x i8> %a0, <16 x i8> %a1) {116; SSE2-LABEL: reverse_cmp_v16i1:117; SSE2: # %bb.0:118; SSE2-NEXT: pcmpeqb %xmm1, %xmm0119; SSE2-NEXT: pmovmskb %xmm0, %eax120; SSE2-NEXT: rolw $8, %ax121; SSE2-NEXT: movl %eax, %ecx122; SSE2-NEXT: andl $3855, %ecx # imm = 0xF0F123; SSE2-NEXT: shll $4, %ecx124; SSE2-NEXT: shrl $4, %eax125; SSE2-NEXT: andl $3855, %eax # imm = 0xF0F126; SSE2-NEXT: orl %ecx, %eax127; SSE2-NEXT: movl %eax, %ecx128; SSE2-NEXT: andl $13107, %ecx # imm = 0x3333129; SSE2-NEXT: shrl $2, %eax130; SSE2-NEXT: andl $13107, %eax # imm = 0x3333131; SSE2-NEXT: leal (%rax,%rcx,4), %eax132; SSE2-NEXT: movl %eax, %ecx133; SSE2-NEXT: andl $21845, %ecx # imm = 0x5555134; SSE2-NEXT: shrl %eax135; SSE2-NEXT: andl $21845, %eax # imm = 0x5555136; SSE2-NEXT: leal (%rax,%rcx,2), %eax137; SSE2-NEXT: # kill: def $ax killed $ax killed $eax138; SSE2-NEXT: retq139;140; SSE42-LABEL: reverse_cmp_v16i1:141; SSE42: # %bb.0:142; SSE42-NEXT: pcmpeqb %xmm1, %xmm0143; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]144; SSE42-NEXT: pmovmskb %xmm0, %eax145; SSE42-NEXT: # kill: def $ax killed $ax killed $eax146; SSE42-NEXT: retq147;148; AVX2-LABEL: reverse_cmp_v16i1:149; AVX2: # %bb.0:150; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0151; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]152; AVX2-NEXT: vpmovmskb %xmm0, %eax153; AVX2-NEXT: # kill: def $ax killed $ax killed $eax154; AVX2-NEXT: retq155;156; AVX512-LABEL: reverse_cmp_v16i1:157; AVX512: # %bb.0:158; AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %k0159; AVX512-NEXT: vpmovm2w %k0, %ymm0160; AVX512-NEXT: vmovdqa {{.*#+}} ymm1 = [15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]161; AVX512-NEXT: vpermw %ymm0, %ymm1, %ymm0162; AVX512-NEXT: vpmovw2m %ymm0, %k0163; AVX512-NEXT: kmovd %k0, %eax164; AVX512-NEXT: # kill: def $ax killed $ax killed $eax165; AVX512-NEXT: vzeroupper166; AVX512-NEXT: retq167 %cmp = icmp eq <16 x i8> %a0, %a1168 %mask = bitcast <16 x i1> %cmp to i16169 %rev = tail call i16 @llvm.bitreverse.i16(i16 %mask)170 ret i16 %rev171}172declare i16 @llvm.bitreverse.i16(i16)173 174define i32 @reverse_cmp_v32i1(<32 x i8> %a0, <32 x i8> %a1) {175; SSE2-LABEL: reverse_cmp_v32i1:176; SSE2: # %bb.0:177; SSE2-NEXT: pcmpeqb %xmm2, %xmm0178; SSE2-NEXT: pmovmskb %xmm0, %eax179; SSE2-NEXT: pcmpeqb %xmm3, %xmm1180; SSE2-NEXT: pmovmskb %xmm1, %ecx181; SSE2-NEXT: shll $16, %ecx182; SSE2-NEXT: orl %eax, %ecx183; SSE2-NEXT: bswapl %ecx184; SSE2-NEXT: movl %ecx, %eax185; SSE2-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F186; SSE2-NEXT: shll $4, %eax187; SSE2-NEXT: shrl $4, %ecx188; SSE2-NEXT: andl $252645135, %ecx # imm = 0xF0F0F0F189; SSE2-NEXT: orl %eax, %ecx190; SSE2-NEXT: movl %ecx, %eax191; SSE2-NEXT: andl $858993459, %eax # imm = 0x33333333192; SSE2-NEXT: shrl $2, %ecx193; SSE2-NEXT: andl $858993459, %ecx # imm = 0x33333333194; SSE2-NEXT: leal (%rcx,%rax,4), %eax195; SSE2-NEXT: movl %eax, %ecx196; SSE2-NEXT: andl $1431655765, %ecx # imm = 0x55555555197; SSE2-NEXT: shrl %eax198; SSE2-NEXT: andl $1431655765, %eax # imm = 0x55555555199; SSE2-NEXT: leal (%rax,%rcx,2), %eax200; SSE2-NEXT: retq201;202; SSE42-LABEL: reverse_cmp_v32i1:203; SSE42: # %bb.0:204; SSE42-NEXT: pcmpeqb %xmm2, %xmm0205; SSE42-NEXT: pcmpeqb %xmm3, %xmm1206; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]207; SSE42-NEXT: pshufb %xmm2, %xmm1208; SSE42-NEXT: pmovmskb %xmm1, %ecx209; SSE42-NEXT: pshufb %xmm2, %xmm0210; SSE42-NEXT: pmovmskb %xmm0, %eax211; SSE42-NEXT: shll $16, %eax212; SSE42-NEXT: orl %ecx, %eax213; SSE42-NEXT: retq214;215; AVX2-LABEL: reverse_cmp_v32i1:216; AVX2: # %bb.0:217; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0218; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16]219; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,3,0,1]220; AVX2-NEXT: vpmovmskb %ymm0, %eax221; AVX2-NEXT: vzeroupper222; AVX2-NEXT: retq223;224; AVX512-V4-LABEL: reverse_cmp_v32i1:225; AVX512-V4: # %bb.0:226; AVX512-V4-NEXT: vpcmpeqb %ymm1, %ymm0, %k0227; AVX512-V4-NEXT: vpmovm2b %k0, %ymm0228; AVX512-V4-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16]229; AVX512-V4-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,3,0,1]230; AVX512-V4-NEXT: vpmovb2m %ymm0, %k0231; AVX512-V4-NEXT: kmovd %k0, %eax232; AVX512-V4-NEXT: vzeroupper233; AVX512-V4-NEXT: retq234;235; AVX512-VBMI-LABEL: reverse_cmp_v32i1:236; AVX512-VBMI: # %bb.0:237; AVX512-VBMI-NEXT: vpcmpeqb %ymm1, %ymm0, %k0238; AVX512-VBMI-NEXT: vpmovm2b %k0, %ymm0239; AVX512-VBMI-NEXT: vmovdqa {{.*#+}} ymm1 = [31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]240; AVX512-VBMI-NEXT: vpermb %ymm0, %ymm1, %ymm0241; AVX512-VBMI-NEXT: vpmovb2m %ymm0, %k0242; AVX512-VBMI-NEXT: kmovd %k0, %eax243; AVX512-VBMI-NEXT: vzeroupper244; AVX512-VBMI-NEXT: retq245 %cmp = icmp eq <32 x i8> %a0, %a1246 %mask = bitcast <32 x i1> %cmp to i32247 %rev = tail call i32 @llvm.bitreverse.i32(i32 %mask)248 ret i32 %rev249}250declare i32 @llvm.bitreverse.i32(i32)251 252define i64 @reverse_cmp_v64i1(<64 x i8> %a0, <64 x i8> %a1) {253; SSE2-LABEL: reverse_cmp_v64i1:254; SSE2: # %bb.0:255; SSE2-NEXT: pcmpeqb %xmm4, %xmm0256; SSE2-NEXT: pmovmskb %xmm0, %eax257; SSE2-NEXT: pcmpeqb %xmm5, %xmm1258; SSE2-NEXT: pmovmskb %xmm1, %ecx259; SSE2-NEXT: shll $16, %ecx260; SSE2-NEXT: orl %eax, %ecx261; SSE2-NEXT: pcmpeqb %xmm6, %xmm2262; SSE2-NEXT: pmovmskb %xmm2, %eax263; SSE2-NEXT: pcmpeqb %xmm7, %xmm3264; SSE2-NEXT: pmovmskb %xmm3, %edx265; SSE2-NEXT: shll $16, %edx266; SSE2-NEXT: orl %eax, %edx267; SSE2-NEXT: shlq $32, %rdx268; SSE2-NEXT: orq %rcx, %rdx269; SSE2-NEXT: bswapq %rdx270; SSE2-NEXT: movq %rdx, %rax271; SSE2-NEXT: shrq $4, %rax272; SSE2-NEXT: movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F273; SSE2-NEXT: andq %rcx, %rax274; SSE2-NEXT: andq %rcx, %rdx275; SSE2-NEXT: shlq $4, %rdx276; SSE2-NEXT: orq %rax, %rdx277; SSE2-NEXT: movabsq $3689348814741910323, %rax # imm = 0x3333333333333333278; SSE2-NEXT: movq %rdx, %rcx279; SSE2-NEXT: andq %rax, %rcx280; SSE2-NEXT: shrq $2, %rdx281; SSE2-NEXT: andq %rax, %rdx282; SSE2-NEXT: leaq (%rdx,%rcx,4), %rax283; SSE2-NEXT: movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555284; SSE2-NEXT: movq %rax, %rdx285; SSE2-NEXT: andq %rcx, %rdx286; SSE2-NEXT: shrq %rax287; SSE2-NEXT: andq %rcx, %rax288; SSE2-NEXT: leaq (%rax,%rdx,2), %rax289; SSE2-NEXT: retq290;291; SSE42-LABEL: reverse_cmp_v64i1:292; SSE42: # %bb.0:293; SSE42-NEXT: pcmpeqb %xmm4, %xmm0294; SSE42-NEXT: pcmpeqb %xmm5, %xmm1295; SSE42-NEXT: pcmpeqb %xmm6, %xmm2296; SSE42-NEXT: pcmpeqb %xmm7, %xmm3297; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]298; SSE42-NEXT: pshufb %xmm4, %xmm3299; SSE42-NEXT: pmovmskb %xmm3, %eax300; SSE42-NEXT: pshufb %xmm4, %xmm2301; SSE42-NEXT: pmovmskb %xmm2, %ecx302; SSE42-NEXT: shll $16, %ecx303; SSE42-NEXT: orl %eax, %ecx304; SSE42-NEXT: pshufb %xmm4, %xmm1305; SSE42-NEXT: pmovmskb %xmm1, %edx306; SSE42-NEXT: pshufb %xmm4, %xmm0307; SSE42-NEXT: pmovmskb %xmm0, %eax308; SSE42-NEXT: shll $16, %eax309; SSE42-NEXT: orl %edx, %eax310; SSE42-NEXT: shlq $32, %rax311; SSE42-NEXT: orq %rcx, %rax312; SSE42-NEXT: retq313;314; AVX2-LABEL: reverse_cmp_v64i1:315; AVX2: # %bb.0:316; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0317; AVX2-NEXT: vpcmpeqb %ymm3, %ymm1, %ymm1318; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]319; AVX2-NEXT: # ymm2 = mem[0,1,0,1]320; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1321; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[2,3,0,1]322; AVX2-NEXT: vpmovmskb %ymm1, %ecx323; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0324; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,3,0,1]325; AVX2-NEXT: vpmovmskb %ymm0, %eax326; AVX2-NEXT: shlq $32, %rax327; AVX2-NEXT: orq %rcx, %rax328; AVX2-NEXT: vzeroupper329; AVX2-NEXT: retq330;331; AVX512-V4-LABEL: reverse_cmp_v64i1:332; AVX512-V4: # %bb.0:333; AVX512-V4-NEXT: vpcmpeqb %zmm1, %zmm0, %k0334; AVX512-V4-NEXT: vpmovm2b %k0, %zmm0335; AVX512-V4-NEXT: vpshufb {{.*#+}} zmm0 = zmm0[15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48]336; AVX512-V4-NEXT: vshufi64x2 {{.*#+}} zmm0 = zmm0[6,7,4,5,2,3,0,1]337; AVX512-V4-NEXT: vpmovb2m %zmm0, %k0338; AVX512-V4-NEXT: kmovq %k0, %rax339; AVX512-V4-NEXT: vzeroupper340; AVX512-V4-NEXT: retq341;342; AVX512-VBMI-LABEL: reverse_cmp_v64i1:343; AVX512-VBMI: # %bb.0:344; AVX512-VBMI-NEXT: vpcmpeqb %zmm1, %zmm0, %k0345; AVX512-VBMI-NEXT: vpmovm2b %k0, %zmm0346; AVX512-VBMI-NEXT: vmovdqa64 {{.*#+}} zmm1 = [63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]347; AVX512-VBMI-NEXT: vpermb %zmm0, %zmm1, %zmm0348; AVX512-VBMI-NEXT: vpmovb2m %zmm0, %k0349; AVX512-VBMI-NEXT: kmovq %k0, %rax350; AVX512-VBMI-NEXT: vzeroupper351; AVX512-VBMI-NEXT: retq352 %cmp = icmp eq <64 x i8> %a0, %a1353 %mask = bitcast <64 x i1> %cmp to i64354 %rev = tail call i64 @llvm.bitreverse.i64(i64 %mask)355 ret i64 %rev356}357declare i64 @llvm.bitreverse.i64(i64)358 359;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:360; SSE: {{.*}}361