brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.4 KiB · 9c072e6 Raw
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