3199 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=ALL,SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=ALL,SSE,SSSE34; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=ALL,AVX,AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=ALL,AVX,AVX26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=ALL,AVX,AVX512,AVX512F7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=ALL,AVX,AVX512,AVX512BW8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+avx512bw | FileCheck %s --check-prefixes=ALL,AVX,AVX512,AVX512BW9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=ALL,XOP,XOPAVX110; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=ALL,XOP,XOPAVX211; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+gfni | FileCheck %s --check-prefixes=ALL,GFNISSE,GFNISSE212; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3,+gfni | FileCheck %s --check-prefixes=ALL,GFNISSE,GFNISSSE313; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+gfni | FileCheck %s --check-prefixes=ALL,GFNIAVX,GFNIAVX114; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+gfni | FileCheck %s --check-prefixes=ALL,GFNIAVX,GFNIAVX215; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+gfni | FileCheck %s --check-prefixes=ALL,GFNIAVX,GFNIAVX512,GFNIAVX512F16; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+gfni | FileCheck %s --check-prefixes=ALL,GFNIAVX,GFNIAVX512,GFNIAVX512BW17 18; Make sure we don't crash with avx512bw and xop19; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx512bw20 21define i8 @test_bitreverse_i8(i8 %a) nounwind {22; SSE-LABEL: test_bitreverse_i8:23; SSE: # %bb.0:24; SSE-NEXT: rolb $4, %dil25; SSE-NEXT: movl %edi, %eax26; SSE-NEXT: andb $51, %al27; SSE-NEXT: shlb $2, %al28; SSE-NEXT: shrb $2, %dil29; SSE-NEXT: andb $51, %dil30; SSE-NEXT: orb %dil, %al31; SSE-NEXT: movl %eax, %ecx32; SSE-NEXT: andb $85, %cl33; SSE-NEXT: addb %cl, %cl34; SSE-NEXT: shrb %al35; SSE-NEXT: andb $85, %al36; SSE-NEXT: orb %cl, %al37; SSE-NEXT: retq38;39; AVX-LABEL: test_bitreverse_i8:40; AVX: # %bb.0:41; AVX-NEXT: rolb $4, %dil42; AVX-NEXT: movl %edi, %eax43; AVX-NEXT: andb $51, %al44; AVX-NEXT: shlb $2, %al45; AVX-NEXT: shrb $2, %dil46; AVX-NEXT: andb $51, %dil47; AVX-NEXT: orb %dil, %al48; AVX-NEXT: movl %eax, %ecx49; AVX-NEXT: andb $85, %cl50; AVX-NEXT: addb %cl, %cl51; AVX-NEXT: shrb %al52; AVX-NEXT: andb $85, %al53; AVX-NEXT: orb %cl, %al54; AVX-NEXT: retq55;56; XOP-LABEL: test_bitreverse_i8:57; XOP: # %bb.0:58; XOP-NEXT: vmovd %edi, %xmm059; XOP-NEXT: vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm060; XOP-NEXT: vmovd %xmm0, %eax61; XOP-NEXT: # kill: def $al killed $al killed $eax62; XOP-NEXT: retq63;64; GFNISSE-LABEL: test_bitreverse_i8:65; GFNISSE: # %bb.0:66; GFNISSE-NEXT: movd %edi, %xmm067; GFNISSE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm068; GFNISSE-NEXT: movd %xmm0, %eax69; GFNISSE-NEXT: # kill: def $al killed $al killed $eax70; GFNISSE-NEXT: retq71;72; GFNIAVX-LABEL: test_bitreverse_i8:73; GFNIAVX: # %bb.0:74; GFNIAVX-NEXT: vmovd %edi, %xmm075; GFNIAVX-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm076; GFNIAVX-NEXT: vmovd %xmm0, %eax77; GFNIAVX-NEXT: # kill: def $al killed $al killed $eax78; GFNIAVX-NEXT: retq79 %b = call i8 @llvm.bitreverse.i8(i8 %a)80 ret i8 %b81}82 83define i16 @test_bitreverse_i16(i16 %a) nounwind {84; SSE-LABEL: test_bitreverse_i16:85; SSE: # %bb.0:86; SSE-NEXT: # kill: def $edi killed $edi def $rdi87; SSE-NEXT: rolw $8, %di88; SSE-NEXT: movl %edi, %eax89; SSE-NEXT: andl $3855, %eax # imm = 0xF0F90; SSE-NEXT: shll $4, %eax91; SSE-NEXT: shrl $4, %edi92; SSE-NEXT: andl $3855, %edi # imm = 0xF0F93; SSE-NEXT: orl %eax, %edi94; SSE-NEXT: movl %edi, %eax95; SSE-NEXT: andl $13107, %eax # imm = 0x333396; SSE-NEXT: shrl $2, %edi97; SSE-NEXT: andl $13107, %edi # imm = 0x333398; SSE-NEXT: leal (%rdi,%rax,4), %eax99; SSE-NEXT: movl %eax, %ecx100; SSE-NEXT: andl $21845, %ecx # imm = 0x5555101; SSE-NEXT: shrl %eax102; SSE-NEXT: andl $21845, %eax # imm = 0x5555103; SSE-NEXT: leal (%rax,%rcx,2), %eax104; SSE-NEXT: # kill: def $ax killed $ax killed $eax105; SSE-NEXT: retq106;107; AVX-LABEL: test_bitreverse_i16:108; AVX: # %bb.0:109; AVX-NEXT: # kill: def $edi killed $edi def $rdi110; AVX-NEXT: rolw $8, %di111; AVX-NEXT: movl %edi, %eax112; AVX-NEXT: andl $3855, %eax # imm = 0xF0F113; AVX-NEXT: shll $4, %eax114; AVX-NEXT: shrl $4, %edi115; AVX-NEXT: andl $3855, %edi # imm = 0xF0F116; AVX-NEXT: orl %eax, %edi117; AVX-NEXT: movl %edi, %eax118; AVX-NEXT: andl $13107, %eax # imm = 0x3333119; AVX-NEXT: shrl $2, %edi120; AVX-NEXT: andl $13107, %edi # imm = 0x3333121; AVX-NEXT: leal (%rdi,%rax,4), %eax122; AVX-NEXT: movl %eax, %ecx123; AVX-NEXT: andl $21845, %ecx # imm = 0x5555124; AVX-NEXT: shrl %eax125; AVX-NEXT: andl $21845, %eax # imm = 0x5555126; AVX-NEXT: leal (%rax,%rcx,2), %eax127; AVX-NEXT: # kill: def $ax killed $ax killed $eax128; AVX-NEXT: retq129;130; XOP-LABEL: test_bitreverse_i16:131; XOP: # %bb.0:132; XOP-NEXT: vmovd %edi, %xmm0133; XOP-NEXT: vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0134; XOP-NEXT: vmovd %xmm0, %eax135; XOP-NEXT: # kill: def $ax killed $ax killed $eax136; XOP-NEXT: retq137;138; GFNISSE-LABEL: test_bitreverse_i16:139; GFNISSE: # %bb.0:140; GFNISSE-NEXT: movd %edi, %xmm0141; GFNISSE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0142; GFNISSE-NEXT: movd %xmm0, %eax143; GFNISSE-NEXT: rolw $8, %ax144; GFNISSE-NEXT: # kill: def $ax killed $ax killed $eax145; GFNISSE-NEXT: retq146;147; GFNIAVX-LABEL: test_bitreverse_i16:148; GFNIAVX: # %bb.0:149; GFNIAVX-NEXT: vmovd %edi, %xmm0150; GFNIAVX-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0151; GFNIAVX-NEXT: vmovd %xmm0, %eax152; GFNIAVX-NEXT: rolw $8, %ax153; GFNIAVX-NEXT: # kill: def $ax killed $ax killed $eax154; GFNIAVX-NEXT: retq155 %b = call i16 @llvm.bitreverse.i16(i16 %a)156 ret i16 %b157}158 159define i32 @test_bitreverse_i32(i32 %a) nounwind {160; SSE-LABEL: test_bitreverse_i32:161; SSE: # %bb.0:162; SSE-NEXT: # kill: def $edi killed $edi def $rdi163; SSE-NEXT: bswapl %edi164; SSE-NEXT: movl %edi, %eax165; SSE-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F166; SSE-NEXT: shll $4, %eax167; SSE-NEXT: shrl $4, %edi168; SSE-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F169; SSE-NEXT: orl %eax, %edi170; SSE-NEXT: movl %edi, %eax171; SSE-NEXT: andl $858993459, %eax # imm = 0x33333333172; SSE-NEXT: shrl $2, %edi173; SSE-NEXT: andl $858993459, %edi # imm = 0x33333333174; SSE-NEXT: leal (%rdi,%rax,4), %eax175; SSE-NEXT: movl %eax, %ecx176; SSE-NEXT: andl $1431655765, %ecx # imm = 0x55555555177; SSE-NEXT: shrl %eax178; SSE-NEXT: andl $1431655765, %eax # imm = 0x55555555179; SSE-NEXT: leal (%rax,%rcx,2), %eax180; SSE-NEXT: retq181;182; AVX-LABEL: test_bitreverse_i32:183; AVX: # %bb.0:184; AVX-NEXT: # kill: def $edi killed $edi def $rdi185; AVX-NEXT: bswapl %edi186; AVX-NEXT: movl %edi, %eax187; AVX-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F188; AVX-NEXT: shll $4, %eax189; AVX-NEXT: shrl $4, %edi190; AVX-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F191; AVX-NEXT: orl %eax, %edi192; AVX-NEXT: movl %edi, %eax193; AVX-NEXT: andl $858993459, %eax # imm = 0x33333333194; AVX-NEXT: shrl $2, %edi195; AVX-NEXT: andl $858993459, %edi # imm = 0x33333333196; AVX-NEXT: leal (%rdi,%rax,4), %eax197; AVX-NEXT: movl %eax, %ecx198; AVX-NEXT: andl $1431655765, %ecx # imm = 0x55555555199; AVX-NEXT: shrl %eax200; AVX-NEXT: andl $1431655765, %eax # imm = 0x55555555201; AVX-NEXT: leal (%rax,%rcx,2), %eax202; AVX-NEXT: retq203;204; XOP-LABEL: test_bitreverse_i32:205; XOP: # %bb.0:206; XOP-NEXT: vmovd %edi, %xmm0207; XOP-NEXT: vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0208; XOP-NEXT: vmovd %xmm0, %eax209; XOP-NEXT: retq210;211; GFNISSE-LABEL: test_bitreverse_i32:212; GFNISSE: # %bb.0:213; GFNISSE-NEXT: movd %edi, %xmm0214; GFNISSE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0215; GFNISSE-NEXT: movd %xmm0, %eax216; GFNISSE-NEXT: bswapl %eax217; GFNISSE-NEXT: retq218;219; GFNIAVX-LABEL: test_bitreverse_i32:220; GFNIAVX: # %bb.0:221; GFNIAVX-NEXT: vmovd %edi, %xmm0222; GFNIAVX-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0223; GFNIAVX-NEXT: vmovd %xmm0, %eax224; GFNIAVX-NEXT: bswapl %eax225; GFNIAVX-NEXT: retq226 %b = call i32 @llvm.bitreverse.i32(i32 %a)227 ret i32 %b228}229 230define i64 @test_bitreverse_i64(i64 %a) nounwind {231; SSE-LABEL: test_bitreverse_i64:232; SSE: # %bb.0:233; SSE-NEXT: bswapq %rdi234; SSE-NEXT: movq %rdi, %rax235; SSE-NEXT: shrq $4, %rax236; SSE-NEXT: movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F237; SSE-NEXT: andq %rcx, %rax238; SSE-NEXT: andq %rcx, %rdi239; SSE-NEXT: shlq $4, %rdi240; SSE-NEXT: orq %rax, %rdi241; SSE-NEXT: movabsq $3689348814741910323, %rax # imm = 0x3333333333333333242; SSE-NEXT: movq %rdi, %rcx243; SSE-NEXT: andq %rax, %rcx244; SSE-NEXT: shrq $2, %rdi245; SSE-NEXT: andq %rax, %rdi246; SSE-NEXT: leaq (%rdi,%rcx,4), %rax247; SSE-NEXT: movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555248; SSE-NEXT: movq %rax, %rdx249; SSE-NEXT: andq %rcx, %rdx250; SSE-NEXT: shrq %rax251; SSE-NEXT: andq %rcx, %rax252; SSE-NEXT: leaq (%rax,%rdx,2), %rax253; SSE-NEXT: retq254;255; AVX-LABEL: test_bitreverse_i64:256; AVX: # %bb.0:257; AVX-NEXT: bswapq %rdi258; AVX-NEXT: movq %rdi, %rax259; AVX-NEXT: shrq $4, %rax260; AVX-NEXT: movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F261; AVX-NEXT: andq %rcx, %rax262; AVX-NEXT: andq %rcx, %rdi263; AVX-NEXT: shlq $4, %rdi264; AVX-NEXT: orq %rax, %rdi265; AVX-NEXT: movabsq $3689348814741910323, %rax # imm = 0x3333333333333333266; AVX-NEXT: movq %rdi, %rcx267; AVX-NEXT: andq %rax, %rcx268; AVX-NEXT: shrq $2, %rdi269; AVX-NEXT: andq %rax, %rdi270; AVX-NEXT: leaq (%rdi,%rcx,4), %rax271; AVX-NEXT: movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555272; AVX-NEXT: movq %rax, %rdx273; AVX-NEXT: andq %rcx, %rdx274; AVX-NEXT: shrq %rax275; AVX-NEXT: andq %rcx, %rax276; AVX-NEXT: leaq (%rax,%rdx,2), %rax277; AVX-NEXT: retq278;279; XOP-LABEL: test_bitreverse_i64:280; XOP: # %bb.0:281; XOP-NEXT: vmovq %rdi, %xmm0282; XOP-NEXT: vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0283; XOP-NEXT: vmovq %xmm0, %rax284; XOP-NEXT: retq285;286; GFNISSE-LABEL: test_bitreverse_i64:287; GFNISSE: # %bb.0:288; GFNISSE-NEXT: movq %rdi, %xmm0289; GFNISSE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0290; GFNISSE-NEXT: movq %xmm0, %rax291; GFNISSE-NEXT: bswapq %rax292; GFNISSE-NEXT: retq293;294; GFNIAVX-LABEL: test_bitreverse_i64:295; GFNIAVX: # %bb.0:296; GFNIAVX-NEXT: vmovq %rdi, %xmm0297; GFNIAVX-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0298; GFNIAVX-NEXT: vmovq %xmm0, %rax299; GFNIAVX-NEXT: bswapq %rax300; GFNIAVX-NEXT: retq301 %b = call i64 @llvm.bitreverse.i64(i64 %a)302 ret i64 %b303}304 305define <16 x i8> @test_bitreverse_v16i8(<16 x i8> %a) nounwind {306; SSE2-LABEL: test_bitreverse_v16i8:307; SSE2: # %bb.0:308; SSE2-NEXT: movdqa %xmm0, %xmm1309; SSE2-NEXT: psrlw $4, %xmm1310; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]311; SSE2-NEXT: pand %xmm2, %xmm1312; SSE2-NEXT: pand %xmm2, %xmm0313; SSE2-NEXT: psllw $4, %xmm0314; SSE2-NEXT: por %xmm1, %xmm0315; SSE2-NEXT: movdqa %xmm0, %xmm1316; SSE2-NEXT: psrlw $2, %xmm1317; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]318; SSE2-NEXT: pand %xmm2, %xmm1319; SSE2-NEXT: pand %xmm2, %xmm0320; SSE2-NEXT: psllw $2, %xmm0321; SSE2-NEXT: por %xmm1, %xmm0322; SSE2-NEXT: movdqa %xmm0, %xmm1323; SSE2-NEXT: psrlw $1, %xmm1324; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]325; SSE2-NEXT: pand %xmm2, %xmm1326; SSE2-NEXT: pand %xmm2, %xmm0327; SSE2-NEXT: paddb %xmm0, %xmm0328; SSE2-NEXT: por %xmm1, %xmm0329; SSE2-NEXT: retq330;331; SSSE3-LABEL: test_bitreverse_v16i8:332; SSSE3: # %bb.0:333; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]334; SSSE3-NEXT: movdqa %xmm0, %xmm2335; SSSE3-NEXT: pand %xmm1, %xmm2336; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]337; SSSE3-NEXT: pshufb %xmm2, %xmm3338; SSSE3-NEXT: psrlw $4, %xmm0339; SSSE3-NEXT: pand %xmm1, %xmm0340; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]341; SSSE3-NEXT: pshufb %xmm0, %xmm1342; SSSE3-NEXT: por %xmm3, %xmm1343; SSSE3-NEXT: movdqa %xmm1, %xmm0344; SSSE3-NEXT: retq345;346; AVX1-LABEL: test_bitreverse_v16i8:347; AVX1: # %bb.0:348; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]349; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm2350; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]351; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2352; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0353; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0354; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]355; AVX1-NEXT: vpshufb %xmm0, %xmm1, %xmm0356; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0357; AVX1-NEXT: retq358;359; AVX2-LABEL: test_bitreverse_v16i8:360; AVX2: # %bb.0:361; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]362; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm2363; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]364; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm2365; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0366; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0367; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]368; AVX2-NEXT: vpshufb %xmm0, %xmm1, %xmm0369; AVX2-NEXT: vpor %xmm0, %xmm2, %xmm0370; AVX2-NEXT: retq371;372; AVX512-LABEL: test_bitreverse_v16i8:373; AVX512: # %bb.0:374; AVX512-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]375; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm2376; AVX512-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]377; AVX512-NEXT: vpshufb %xmm2, %xmm3, %xmm2378; AVX512-NEXT: vpsrlw $4, %xmm0, %xmm0379; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm0380; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]381; AVX512-NEXT: vpshufb %xmm0, %xmm1, %xmm0382; AVX512-NEXT: vpor %xmm0, %xmm2, %xmm0383; AVX512-NEXT: retq384;385; XOP-LABEL: test_bitreverse_v16i8:386; XOP: # %bb.0:387; XOP-NEXT: vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0388; XOP-NEXT: retq389;390; GFNISSE-LABEL: test_bitreverse_v16i8:391; GFNISSE: # %bb.0:392; GFNISSE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0393; GFNISSE-NEXT: retq394;395; GFNIAVX-LABEL: test_bitreverse_v16i8:396; GFNIAVX: # %bb.0:397; GFNIAVX-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0398; GFNIAVX-NEXT: retq399 %b = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> %a)400 ret <16 x i8> %b401}402 403define <8 x i16> @test_bitreverse_v8i16(<8 x i16> %a) nounwind {404; SSE2-LABEL: test_bitreverse_v8i16:405; SSE2: # %bb.0:406; SSE2-NEXT: movdqa %xmm0, %xmm1407; SSE2-NEXT: psrlw $8, %xmm1408; SSE2-NEXT: psllw $8, %xmm0409; SSE2-NEXT: por %xmm1, %xmm0410; SSE2-NEXT: movdqa %xmm0, %xmm1411; SSE2-NEXT: psrlw $4, %xmm1412; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]413; SSE2-NEXT: pand %xmm2, %xmm1414; SSE2-NEXT: pand %xmm2, %xmm0415; SSE2-NEXT: psllw $4, %xmm0416; SSE2-NEXT: por %xmm1, %xmm0417; SSE2-NEXT: movdqa %xmm0, %xmm1418; SSE2-NEXT: psrlw $2, %xmm1419; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]420; SSE2-NEXT: pand %xmm2, %xmm1421; SSE2-NEXT: pand %xmm2, %xmm0422; SSE2-NEXT: psllw $2, %xmm0423; SSE2-NEXT: por %xmm1, %xmm0424; SSE2-NEXT: movdqa %xmm0, %xmm1425; SSE2-NEXT: psrlw $1, %xmm1426; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]427; SSE2-NEXT: pand %xmm2, %xmm1428; SSE2-NEXT: pand %xmm2, %xmm0429; SSE2-NEXT: paddb %xmm0, %xmm0430; SSE2-NEXT: por %xmm1, %xmm0431; SSE2-NEXT: retq432;433; SSSE3-LABEL: test_bitreverse_v8i16:434; SSSE3: # %bb.0:435; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]436; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]437; SSSE3-NEXT: movdqa %xmm0, %xmm2438; SSSE3-NEXT: pand %xmm1, %xmm2439; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]440; SSSE3-NEXT: pshufb %xmm2, %xmm3441; SSSE3-NEXT: psrlw $4, %xmm0442; SSSE3-NEXT: pand %xmm1, %xmm0443; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]444; SSSE3-NEXT: pshufb %xmm0, %xmm1445; SSSE3-NEXT: por %xmm3, %xmm1446; SSSE3-NEXT: movdqa %xmm1, %xmm0447; SSSE3-NEXT: retq448;449; AVX1-LABEL: test_bitreverse_v8i16:450; AVX1: # %bb.0:451; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]452; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]453; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm2454; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]455; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2456; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0457; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0458; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]459; AVX1-NEXT: vpshufb %xmm0, %xmm1, %xmm0460; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0461; AVX1-NEXT: retq462;463; AVX2-LABEL: test_bitreverse_v8i16:464; AVX2: # %bb.0:465; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]466; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]467; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm2468; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]469; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm2470; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0471; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0472; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]473; AVX2-NEXT: vpshufb %xmm0, %xmm1, %xmm0474; AVX2-NEXT: vpor %xmm0, %xmm2, %xmm0475; AVX2-NEXT: retq476;477; AVX512-LABEL: test_bitreverse_v8i16:478; AVX512: # %bb.0:479; AVX512-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]480; AVX512-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]481; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm2482; AVX512-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]483; AVX512-NEXT: vpshufb %xmm2, %xmm3, %xmm2484; AVX512-NEXT: vpsrlw $4, %xmm0, %xmm0485; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm0486; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]487; AVX512-NEXT: vpshufb %xmm0, %xmm1, %xmm0488; AVX512-NEXT: vpor %xmm0, %xmm2, %xmm0489; AVX512-NEXT: retq490;491; XOP-LABEL: test_bitreverse_v8i16:492; XOP: # %bb.0:493; XOP-NEXT: vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0494; XOP-NEXT: retq495;496; GFNISSE2-LABEL: test_bitreverse_v8i16:497; GFNISSE2: # %bb.0:498; GFNISSE2-NEXT: movdqa %xmm0, %xmm1499; GFNISSE2-NEXT: psrlw $8, %xmm1500; GFNISSE2-NEXT: psllw $8, %xmm0501; GFNISSE2-NEXT: por %xmm1, %xmm0502; GFNISSE2-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0503; GFNISSE2-NEXT: retq504;505; GFNISSSE3-LABEL: test_bitreverse_v8i16:506; GFNISSSE3: # %bb.0:507; GFNISSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]508; GFNISSSE3-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0509; GFNISSSE3-NEXT: retq510;511; GFNIAVX-LABEL: test_bitreverse_v8i16:512; GFNIAVX: # %bb.0:513; GFNIAVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]514; GFNIAVX-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0515; GFNIAVX-NEXT: retq516 %b = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a)517 ret <8 x i16> %b518}519 520define <4 x i32> @test_bitreverse_v4i32(<4 x i32> %a) nounwind {521; SSE2-LABEL: test_bitreverse_v4i32:522; SSE2: # %bb.0:523; SSE2-NEXT: pxor %xmm1, %xmm1524; SSE2-NEXT: movdqa %xmm0, %xmm2525; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]526; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]527; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]528; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]529; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]530; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]531; SSE2-NEXT: packuswb %xmm2, %xmm0532; SSE2-NEXT: movdqa %xmm0, %xmm1533; SSE2-NEXT: psrlw $4, %xmm1534; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]535; SSE2-NEXT: pand %xmm2, %xmm1536; SSE2-NEXT: pand %xmm2, %xmm0537; SSE2-NEXT: psllw $4, %xmm0538; SSE2-NEXT: por %xmm1, %xmm0539; SSE2-NEXT: movdqa %xmm0, %xmm1540; SSE2-NEXT: psrlw $2, %xmm1541; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]542; SSE2-NEXT: pand %xmm2, %xmm1543; SSE2-NEXT: pand %xmm2, %xmm0544; SSE2-NEXT: psllw $2, %xmm0545; SSE2-NEXT: por %xmm1, %xmm0546; SSE2-NEXT: movdqa %xmm0, %xmm1547; SSE2-NEXT: psrlw $1, %xmm1548; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]549; SSE2-NEXT: pand %xmm2, %xmm1550; SSE2-NEXT: pand %xmm2, %xmm0551; SSE2-NEXT: paddb %xmm0, %xmm0552; SSE2-NEXT: por %xmm1, %xmm0553; SSE2-NEXT: retq554;555; SSSE3-LABEL: test_bitreverse_v4i32:556; SSSE3: # %bb.0:557; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]558; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]559; SSSE3-NEXT: movdqa %xmm0, %xmm2560; SSSE3-NEXT: pand %xmm1, %xmm2561; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]562; SSSE3-NEXT: pshufb %xmm2, %xmm3563; SSSE3-NEXT: psrlw $4, %xmm0564; SSSE3-NEXT: pand %xmm1, %xmm0565; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]566; SSSE3-NEXT: pshufb %xmm0, %xmm1567; SSSE3-NEXT: por %xmm3, %xmm1568; SSSE3-NEXT: movdqa %xmm1, %xmm0569; SSSE3-NEXT: retq570;571; AVX1-LABEL: test_bitreverse_v4i32:572; AVX1: # %bb.0:573; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]574; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]575; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm2576; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]577; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2578; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0579; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0580; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]581; AVX1-NEXT: vpshufb %xmm0, %xmm1, %xmm0582; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0583; AVX1-NEXT: retq584;585; AVX2-LABEL: test_bitreverse_v4i32:586; AVX2: # %bb.0:587; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]588; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]589; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm2590; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]591; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm2592; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0593; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0594; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]595; AVX2-NEXT: vpshufb %xmm0, %xmm1, %xmm0596; AVX2-NEXT: vpor %xmm0, %xmm2, %xmm0597; AVX2-NEXT: retq598;599; AVX512-LABEL: test_bitreverse_v4i32:600; AVX512: # %bb.0:601; AVX512-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]602; AVX512-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]603; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm2604; AVX512-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]605; AVX512-NEXT: vpshufb %xmm2, %xmm3, %xmm2606; AVX512-NEXT: vpsrlw $4, %xmm0, %xmm0607; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm0608; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]609; AVX512-NEXT: vpshufb %xmm0, %xmm1, %xmm0610; AVX512-NEXT: vpor %xmm0, %xmm2, %xmm0611; AVX512-NEXT: retq612;613; XOP-LABEL: test_bitreverse_v4i32:614; XOP: # %bb.0:615; XOP-NEXT: vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0616; XOP-NEXT: retq617;618; GFNISSE2-LABEL: test_bitreverse_v4i32:619; GFNISSE2: # %bb.0:620; GFNISSE2-NEXT: pxor %xmm1, %xmm1621; GFNISSE2-NEXT: movdqa %xmm0, %xmm2622; GFNISSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]623; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]624; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]625; GFNISSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]626; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]627; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]628; GFNISSE2-NEXT: packuswb %xmm2, %xmm0629; GFNISSE2-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0630; GFNISSE2-NEXT: retq631;632; GFNISSSE3-LABEL: test_bitreverse_v4i32:633; GFNISSSE3: # %bb.0:634; GFNISSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]635; GFNISSSE3-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0636; GFNISSSE3-NEXT: retq637;638; GFNIAVX-LABEL: test_bitreverse_v4i32:639; GFNIAVX: # %bb.0:640; GFNIAVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]641; GFNIAVX-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0642; GFNIAVX-NEXT: retq643 %b = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %a)644 ret <4 x i32> %b645}646 647define <2 x i64> @test_bitreverse_v2i64(<2 x i64> %a) nounwind {648; SSE2-LABEL: test_bitreverse_v2i64:649; SSE2: # %bb.0:650; SSE2-NEXT: pxor %xmm1, %xmm1651; SSE2-NEXT: movdqa %xmm0, %xmm2652; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]653; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]654; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]655; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]656; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]657; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]658; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]659; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]660; SSE2-NEXT: packuswb %xmm2, %xmm0661; SSE2-NEXT: movdqa %xmm0, %xmm1662; SSE2-NEXT: psrlw $4, %xmm1663; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]664; SSE2-NEXT: pand %xmm2, %xmm1665; SSE2-NEXT: pand %xmm2, %xmm0666; SSE2-NEXT: psllw $4, %xmm0667; SSE2-NEXT: por %xmm1, %xmm0668; SSE2-NEXT: movdqa %xmm0, %xmm1669; SSE2-NEXT: psrlw $2, %xmm1670; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]671; SSE2-NEXT: pand %xmm2, %xmm1672; SSE2-NEXT: pand %xmm2, %xmm0673; SSE2-NEXT: psllw $2, %xmm0674; SSE2-NEXT: por %xmm1, %xmm0675; SSE2-NEXT: movdqa %xmm0, %xmm1676; SSE2-NEXT: psrlw $1, %xmm1677; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]678; SSE2-NEXT: pand %xmm2, %xmm1679; SSE2-NEXT: pand %xmm2, %xmm0680; SSE2-NEXT: paddb %xmm0, %xmm0681; SSE2-NEXT: por %xmm1, %xmm0682; SSE2-NEXT: retq683;684; SSSE3-LABEL: test_bitreverse_v2i64:685; SSSE3: # %bb.0:686; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]687; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]688; SSSE3-NEXT: movdqa %xmm0, %xmm2689; SSSE3-NEXT: pand %xmm1, %xmm2690; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]691; SSSE3-NEXT: pshufb %xmm2, %xmm3692; SSSE3-NEXT: psrlw $4, %xmm0693; SSSE3-NEXT: pand %xmm1, %xmm0694; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]695; SSSE3-NEXT: pshufb %xmm0, %xmm1696; SSSE3-NEXT: por %xmm3, %xmm1697; SSSE3-NEXT: movdqa %xmm1, %xmm0698; SSSE3-NEXT: retq699;700; AVX1-LABEL: test_bitreverse_v2i64:701; AVX1: # %bb.0:702; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]703; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]704; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm2705; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]706; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2707; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0708; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0709; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]710; AVX1-NEXT: vpshufb %xmm0, %xmm1, %xmm0711; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0712; AVX1-NEXT: retq713;714; AVX2-LABEL: test_bitreverse_v2i64:715; AVX2: # %bb.0:716; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]717; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]718; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm2719; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]720; AVX2-NEXT: vpshufb %xmm2, %xmm3, %xmm2721; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0722; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0723; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]724; AVX2-NEXT: vpshufb %xmm0, %xmm1, %xmm0725; AVX2-NEXT: vpor %xmm0, %xmm2, %xmm0726; AVX2-NEXT: retq727;728; AVX512-LABEL: test_bitreverse_v2i64:729; AVX512: # %bb.0:730; AVX512-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]731; AVX512-NEXT: vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]732; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm2733; AVX512-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]734; AVX512-NEXT: vpshufb %xmm2, %xmm3, %xmm2735; AVX512-NEXT: vpsrlw $4, %xmm0, %xmm0736; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm0737; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]738; AVX512-NEXT: vpshufb %xmm0, %xmm1, %xmm0739; AVX512-NEXT: vpor %xmm0, %xmm2, %xmm0740; AVX512-NEXT: retq741;742; XOP-LABEL: test_bitreverse_v2i64:743; XOP: # %bb.0:744; XOP-NEXT: vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0745; XOP-NEXT: retq746;747; GFNISSE2-LABEL: test_bitreverse_v2i64:748; GFNISSE2: # %bb.0:749; GFNISSE2-NEXT: pxor %xmm1, %xmm1750; GFNISSE2-NEXT: movdqa %xmm0, %xmm2751; GFNISSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]752; GFNISSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]753; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]754; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]755; GFNISSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]756; GFNISSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]757; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]758; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]759; GFNISSE2-NEXT: packuswb %xmm2, %xmm0760; GFNISSE2-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0761; GFNISSE2-NEXT: retq762;763; GFNISSSE3-LABEL: test_bitreverse_v2i64:764; GFNISSSE3: # %bb.0:765; GFNISSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]766; GFNISSSE3-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0767; GFNISSSE3-NEXT: retq768;769; GFNIAVX-LABEL: test_bitreverse_v2i64:770; GFNIAVX: # %bb.0:771; GFNIAVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]772; GFNIAVX-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0773; GFNIAVX-NEXT: retq774 %b = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %a)775 ret <2 x i64> %b776}777 778define <32 x i8> @test_bitreverse_v32i8(<32 x i8> %a) nounwind {779; SSE2-LABEL: test_bitreverse_v32i8:780; SSE2: # %bb.0:781; SSE2-NEXT: movdqa %xmm0, %xmm3782; SSE2-NEXT: psrlw $4, %xmm3783; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]784; SSE2-NEXT: pand %xmm2, %xmm3785; SSE2-NEXT: pand %xmm2, %xmm0786; SSE2-NEXT: psllw $4, %xmm0787; SSE2-NEXT: por %xmm3, %xmm0788; SSE2-NEXT: movdqa %xmm0, %xmm4789; SSE2-NEXT: psrlw $2, %xmm4790; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]791; SSE2-NEXT: pand %xmm3, %xmm4792; SSE2-NEXT: pand %xmm3, %xmm0793; SSE2-NEXT: psllw $2, %xmm0794; SSE2-NEXT: por %xmm4, %xmm0795; SSE2-NEXT: movdqa %xmm0, %xmm5796; SSE2-NEXT: psrlw $1, %xmm5797; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]798; SSE2-NEXT: pand %xmm4, %xmm5799; SSE2-NEXT: pand %xmm4, %xmm0800; SSE2-NEXT: paddb %xmm0, %xmm0801; SSE2-NEXT: por %xmm5, %xmm0802; SSE2-NEXT: movdqa %xmm1, %xmm5803; SSE2-NEXT: psrlw $4, %xmm5804; SSE2-NEXT: pand %xmm2, %xmm5805; SSE2-NEXT: pand %xmm2, %xmm1806; SSE2-NEXT: psllw $4, %xmm1807; SSE2-NEXT: por %xmm5, %xmm1808; SSE2-NEXT: movdqa %xmm1, %xmm2809; SSE2-NEXT: psrlw $2, %xmm2810; SSE2-NEXT: pand %xmm3, %xmm2811; SSE2-NEXT: pand %xmm3, %xmm1812; SSE2-NEXT: psllw $2, %xmm1813; SSE2-NEXT: por %xmm2, %xmm1814; SSE2-NEXT: movdqa %xmm1, %xmm2815; SSE2-NEXT: psrlw $1, %xmm2816; SSE2-NEXT: pand %xmm4, %xmm2817; SSE2-NEXT: pand %xmm4, %xmm1818; SSE2-NEXT: paddb %xmm1, %xmm1819; SSE2-NEXT: por %xmm2, %xmm1820; SSE2-NEXT: retq821;822; SSSE3-LABEL: test_bitreverse_v32i8:823; SSSE3: # %bb.0:824; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]825; SSSE3-NEXT: movdqa %xmm0, %xmm2826; SSSE3-NEXT: pand %xmm4, %xmm2827; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]828; SSSE3-NEXT: movdqa %xmm5, %xmm6829; SSSE3-NEXT: pshufb %xmm2, %xmm6830; SSSE3-NEXT: psrlw $4, %xmm0831; SSSE3-NEXT: pand %xmm4, %xmm0832; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]833; SSSE3-NEXT: movdqa %xmm2, %xmm3834; SSSE3-NEXT: pshufb %xmm0, %xmm3835; SSSE3-NEXT: por %xmm6, %xmm3836; SSSE3-NEXT: movdqa %xmm1, %xmm0837; SSSE3-NEXT: pand %xmm4, %xmm0838; SSSE3-NEXT: pshufb %xmm0, %xmm5839; SSSE3-NEXT: psrlw $4, %xmm1840; SSSE3-NEXT: pand %xmm4, %xmm1841; SSSE3-NEXT: pshufb %xmm1, %xmm2842; SSSE3-NEXT: por %xmm5, %xmm2843; SSSE3-NEXT: movdqa %xmm3, %xmm0844; SSSE3-NEXT: movdqa %xmm2, %xmm1845; SSSE3-NEXT: retq846;847; AVX1-LABEL: test_bitreverse_v32i8:848; AVX1: # %bb.0:849; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1850; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]851; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm3852; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]853; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm3854; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1855; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1856; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]857; AVX1-NEXT: vpshufb %xmm1, %xmm5, %xmm1858; AVX1-NEXT: vpor %xmm1, %xmm3, %xmm1859; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm3860; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm3861; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0862; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0863; AVX1-NEXT: vpshufb %xmm0, %xmm5, %xmm0864; AVX1-NEXT: vpor %xmm0, %xmm3, %xmm0865; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0866; AVX1-NEXT: retq867;868; AVX2-LABEL: test_bitreverse_v32i8:869; AVX2: # %bb.0:870; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]871; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2872; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]873; AVX2-NEXT: # ymm3 = mem[0,1,0,1]874; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2875; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0876; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0877; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]878; AVX2-NEXT: # ymm1 = mem[0,1,0,1]879; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0880; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0881; AVX2-NEXT: retq882;883; AVX512-LABEL: test_bitreverse_v32i8:884; AVX512: # %bb.0:885; AVX512-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]886; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm2887; AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]888; AVX512-NEXT: # ymm3 = mem[0,1,0,1]889; AVX512-NEXT: vpshufb %ymm2, %ymm3, %ymm2890; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm0891; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm0892; AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]893; AVX512-NEXT: # ymm1 = mem[0,1,0,1]894; AVX512-NEXT: vpshufb %ymm0, %ymm1, %ymm0895; AVX512-NEXT: vpor %ymm0, %ymm2, %ymm0896; AVX512-NEXT: retq897;898; XOPAVX1-LABEL: test_bitreverse_v32i8:899; XOPAVX1: # %bb.0:900; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1901; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]902; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1903; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0904; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0905; XOPAVX1-NEXT: retq906;907; XOPAVX2-LABEL: test_bitreverse_v32i8:908; XOPAVX2: # %bb.0:909; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1910; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]911; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1912; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0913; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0914; XOPAVX2-NEXT: retq915;916; GFNISSE-LABEL: test_bitreverse_v32i8:917; GFNISSE: # %bb.0:918; GFNISSE-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]919; GFNISSE-NEXT: gf2p8affineqb $0, %xmm2, %xmm0920; GFNISSE-NEXT: gf2p8affineqb $0, %xmm2, %xmm1921; GFNISSE-NEXT: retq922;923; GFNIAVX-LABEL: test_bitreverse_v32i8:924; GFNIAVX: # %bb.0:925; GFNIAVX-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0926; GFNIAVX-NEXT: retq927 %b = call <32 x i8> @llvm.bitreverse.v32i8(<32 x i8> %a)928 ret <32 x i8> %b929}930 931define <16 x i16> @test_bitreverse_v16i16(<16 x i16> %a) nounwind {932; SSE2-LABEL: test_bitreverse_v16i16:933; SSE2: # %bb.0:934; SSE2-NEXT: movdqa %xmm0, %xmm2935; SSE2-NEXT: psrlw $8, %xmm2936; SSE2-NEXT: psllw $8, %xmm0937; SSE2-NEXT: por %xmm2, %xmm0938; SSE2-NEXT: movdqa %xmm0, %xmm3939; SSE2-NEXT: psrlw $4, %xmm3940; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]941; SSE2-NEXT: pand %xmm2, %xmm3942; SSE2-NEXT: pand %xmm2, %xmm0943; SSE2-NEXT: psllw $4, %xmm0944; SSE2-NEXT: por %xmm3, %xmm0945; SSE2-NEXT: movdqa %xmm0, %xmm4946; SSE2-NEXT: psrlw $2, %xmm4947; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]948; SSE2-NEXT: pand %xmm3, %xmm4949; SSE2-NEXT: pand %xmm3, %xmm0950; SSE2-NEXT: psllw $2, %xmm0951; SSE2-NEXT: por %xmm4, %xmm0952; SSE2-NEXT: movdqa %xmm0, %xmm5953; SSE2-NEXT: psrlw $1, %xmm5954; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]955; SSE2-NEXT: pand %xmm4, %xmm5956; SSE2-NEXT: pand %xmm4, %xmm0957; SSE2-NEXT: paddb %xmm0, %xmm0958; SSE2-NEXT: por %xmm5, %xmm0959; SSE2-NEXT: movdqa %xmm1, %xmm5960; SSE2-NEXT: psrlw $8, %xmm5961; SSE2-NEXT: psllw $8, %xmm1962; SSE2-NEXT: por %xmm5, %xmm1963; SSE2-NEXT: movdqa %xmm1, %xmm5964; SSE2-NEXT: psrlw $4, %xmm5965; SSE2-NEXT: pand %xmm2, %xmm5966; SSE2-NEXT: pand %xmm2, %xmm1967; SSE2-NEXT: psllw $4, %xmm1968; SSE2-NEXT: por %xmm5, %xmm1969; SSE2-NEXT: movdqa %xmm1, %xmm2970; SSE2-NEXT: psrlw $2, %xmm2971; SSE2-NEXT: pand %xmm3, %xmm2972; SSE2-NEXT: pand %xmm3, %xmm1973; SSE2-NEXT: psllw $2, %xmm1974; SSE2-NEXT: por %xmm2, %xmm1975; SSE2-NEXT: movdqa %xmm1, %xmm2976; SSE2-NEXT: psrlw $1, %xmm2977; SSE2-NEXT: pand %xmm4, %xmm2978; SSE2-NEXT: pand %xmm4, %xmm1979; SSE2-NEXT: paddb %xmm1, %xmm1980; SSE2-NEXT: por %xmm2, %xmm1981; SSE2-NEXT: retq982;983; SSSE3-LABEL: test_bitreverse_v16i16:984; SSSE3: # %bb.0:985; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]986; SSSE3-NEXT: pshufb %xmm4, %xmm0987; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]988; SSSE3-NEXT: movdqa %xmm0, %xmm2989; SSSE3-NEXT: pand %xmm5, %xmm2990; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]991; SSSE3-NEXT: movdqa %xmm6, %xmm7992; SSSE3-NEXT: pshufb %xmm2, %xmm7993; SSSE3-NEXT: psrlw $4, %xmm0994; SSSE3-NEXT: pand %xmm5, %xmm0995; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]996; SSSE3-NEXT: movdqa %xmm2, %xmm3997; SSSE3-NEXT: pshufb %xmm0, %xmm3998; SSSE3-NEXT: por %xmm7, %xmm3999; SSSE3-NEXT: pshufb %xmm4, %xmm11000; SSSE3-NEXT: movdqa %xmm1, %xmm01001; SSSE3-NEXT: pand %xmm5, %xmm01002; SSSE3-NEXT: pshufb %xmm0, %xmm61003; SSSE3-NEXT: psrlw $4, %xmm11004; SSSE3-NEXT: pand %xmm5, %xmm11005; SSSE3-NEXT: pshufb %xmm1, %xmm21006; SSSE3-NEXT: por %xmm6, %xmm21007; SSSE3-NEXT: movdqa %xmm3, %xmm01008; SSSE3-NEXT: movdqa %xmm2, %xmm11009; SSSE3-NEXT: retq1010;1011; AVX1-LABEL: test_bitreverse_v16i16:1012; AVX1: # %bb.0:1013; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11014; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]1015; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm11016; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1017; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm41018; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1019; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm41020; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm11021; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm11022; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1023; AVX1-NEXT: vpshufb %xmm1, %xmm6, %xmm11024; AVX1-NEXT: vpor %xmm1, %xmm4, %xmm11025; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm01026; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm21027; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm21028; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm01029; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm01030; AVX1-NEXT: vpshufb %xmm0, %xmm6, %xmm01031; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm01032; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01033; AVX1-NEXT: retq1034;1035; AVX2-LABEL: test_bitreverse_v16i16:1036; AVX2: # %bb.0:1037; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30]1038; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1039; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm21040; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1041; AVX2-NEXT: # ymm3 = mem[0,1,0,1]1042; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm21043; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm01044; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm01045; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1046; AVX2-NEXT: # ymm1 = mem[0,1,0,1]1047; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm01048; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm01049; AVX2-NEXT: retq1050;1051; AVX512-LABEL: test_bitreverse_v16i16:1052; AVX512: # %bb.0:1053; AVX512-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30]1054; AVX512-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1055; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm21056; AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1057; AVX512-NEXT: # ymm3 = mem[0,1,0,1]1058; AVX512-NEXT: vpshufb %ymm2, %ymm3, %ymm21059; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm01060; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm01061; AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1062; AVX512-NEXT: # ymm1 = mem[0,1,0,1]1063; AVX512-NEXT: vpshufb %ymm0, %ymm1, %ymm01064; AVX512-NEXT: vpor %ymm0, %ymm2, %ymm01065; AVX512-NEXT: retq1066;1067; XOPAVX1-LABEL: test_bitreverse_v16i16:1068; XOPAVX1: # %bb.0:1069; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm11070; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94]1071; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm11072; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm01073; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01074; XOPAVX1-NEXT: retq1075;1076; XOPAVX2-LABEL: test_bitreverse_v16i16:1077; XOPAVX2: # %bb.0:1078; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm11079; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94]1080; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm11081; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm01082; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01083; XOPAVX2-NEXT: retq1084;1085; GFNISSE2-LABEL: test_bitreverse_v16i16:1086; GFNISSE2: # %bb.0:1087; GFNISSE2-NEXT: movdqa %xmm0, %xmm21088; GFNISSE2-NEXT: psrlw $8, %xmm21089; GFNISSE2-NEXT: psllw $8, %xmm01090; GFNISSE2-NEXT: por %xmm2, %xmm01091; GFNISSE2-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1092; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm2, %xmm01093; GFNISSE2-NEXT: movdqa %xmm1, %xmm31094; GFNISSE2-NEXT: psrlw $8, %xmm31095; GFNISSE2-NEXT: psllw $8, %xmm11096; GFNISSE2-NEXT: por %xmm3, %xmm11097; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm2, %xmm11098; GFNISSE2-NEXT: retq1099;1100; GFNISSSE3-LABEL: test_bitreverse_v16i16:1101; GFNISSSE3: # %bb.0:1102; GFNISSSE3-NEXT: movdqa {{.*#+}} xmm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]1103; GFNISSSE3-NEXT: pshufb %xmm2, %xmm01104; GFNISSSE3-NEXT: movdqa {{.*#+}} xmm3 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1105; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm3, %xmm01106; GFNISSSE3-NEXT: pshufb %xmm2, %xmm11107; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm3, %xmm11108; GFNISSSE3-NEXT: retq1109;1110; GFNIAVX1-LABEL: test_bitreverse_v16i16:1111; GFNIAVX1: # %bb.0:1112; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm11113; GFNIAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]1114; GFNIAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm11115; GFNIAVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm01116; GFNIAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01117; GFNIAVX1-NEXT: vbroadcastsd {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1118; GFNIAVX1-NEXT: vgf2p8affineqb $0, %ymm1, %ymm0, %ymm01119; GFNIAVX1-NEXT: retq1120;1121; GFNIAVX2-LABEL: test_bitreverse_v16i16:1122; GFNIAVX2: # %bb.0:1123; GFNIAVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30]1124; GFNIAVX2-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01125; GFNIAVX2-NEXT: retq1126;1127; GFNIAVX512-LABEL: test_bitreverse_v16i16:1128; GFNIAVX512: # %bb.0:1129; GFNIAVX512-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30]1130; GFNIAVX512-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01131; GFNIAVX512-NEXT: retq1132 %b = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> %a)1133 ret <16 x i16> %b1134}1135 1136define <8 x i32> @test_bitreverse_v8i32(<8 x i32> %a) nounwind {1137; SSE2-LABEL: test_bitreverse_v8i32:1138; SSE2: # %bb.0:1139; SSE2-NEXT: pxor %xmm2, %xmm21140; SSE2-NEXT: movdqa %xmm0, %xmm31141; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]1142; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7]1143; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4]1144; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]1145; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]1146; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]1147; SSE2-NEXT: packuswb %xmm3, %xmm01148; SSE2-NEXT: movdqa %xmm0, %xmm41149; SSE2-NEXT: psrlw $4, %xmm41150; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1151; SSE2-NEXT: pand %xmm3, %xmm41152; SSE2-NEXT: pand %xmm3, %xmm01153; SSE2-NEXT: psllw $4, %xmm01154; SSE2-NEXT: por %xmm4, %xmm01155; SSE2-NEXT: movdqa %xmm0, %xmm51156; SSE2-NEXT: psrlw $2, %xmm51157; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]1158; SSE2-NEXT: pand %xmm4, %xmm51159; SSE2-NEXT: pand %xmm4, %xmm01160; SSE2-NEXT: psllw $2, %xmm01161; SSE2-NEXT: por %xmm5, %xmm01162; SSE2-NEXT: movdqa %xmm0, %xmm61163; SSE2-NEXT: psrlw $1, %xmm61164; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]1165; SSE2-NEXT: pand %xmm5, %xmm61166; SSE2-NEXT: pand %xmm5, %xmm01167; SSE2-NEXT: paddb %xmm0, %xmm01168; SSE2-NEXT: por %xmm6, %xmm01169; SSE2-NEXT: movdqa %xmm1, %xmm61170; SSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm2[8],xmm6[9],xmm2[9],xmm6[10],xmm2[10],xmm6[11],xmm2[11],xmm6[12],xmm2[12],xmm6[13],xmm2[13],xmm6[14],xmm2[14],xmm6[15],xmm2[15]1171; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7]1172; SSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4]1173; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]1174; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]1175; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]1176; SSE2-NEXT: packuswb %xmm6, %xmm11177; SSE2-NEXT: movdqa %xmm1, %xmm21178; SSE2-NEXT: psrlw $4, %xmm21179; SSE2-NEXT: pand %xmm3, %xmm21180; SSE2-NEXT: pand %xmm3, %xmm11181; SSE2-NEXT: psllw $4, %xmm11182; SSE2-NEXT: por %xmm2, %xmm11183; SSE2-NEXT: movdqa %xmm1, %xmm21184; SSE2-NEXT: psrlw $2, %xmm21185; SSE2-NEXT: pand %xmm4, %xmm21186; SSE2-NEXT: pand %xmm4, %xmm11187; SSE2-NEXT: psllw $2, %xmm11188; SSE2-NEXT: por %xmm2, %xmm11189; SSE2-NEXT: movdqa %xmm1, %xmm21190; SSE2-NEXT: psrlw $1, %xmm21191; SSE2-NEXT: pand %xmm5, %xmm21192; SSE2-NEXT: pand %xmm5, %xmm11193; SSE2-NEXT: paddb %xmm1, %xmm11194; SSE2-NEXT: por %xmm2, %xmm11195; SSE2-NEXT: retq1196;1197; SSSE3-LABEL: test_bitreverse_v8i32:1198; SSSE3: # %bb.0:1199; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]1200; SSSE3-NEXT: pshufb %xmm4, %xmm01201; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1202; SSSE3-NEXT: movdqa %xmm0, %xmm21203; SSSE3-NEXT: pand %xmm5, %xmm21204; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1205; SSSE3-NEXT: movdqa %xmm6, %xmm71206; SSSE3-NEXT: pshufb %xmm2, %xmm71207; SSSE3-NEXT: psrlw $4, %xmm01208; SSSE3-NEXT: pand %xmm5, %xmm01209; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1210; SSSE3-NEXT: movdqa %xmm2, %xmm31211; SSSE3-NEXT: pshufb %xmm0, %xmm31212; SSSE3-NEXT: por %xmm7, %xmm31213; SSSE3-NEXT: pshufb %xmm4, %xmm11214; SSSE3-NEXT: movdqa %xmm1, %xmm01215; SSSE3-NEXT: pand %xmm5, %xmm01216; SSSE3-NEXT: pshufb %xmm0, %xmm61217; SSSE3-NEXT: psrlw $4, %xmm11218; SSSE3-NEXT: pand %xmm5, %xmm11219; SSSE3-NEXT: pshufb %xmm1, %xmm21220; SSSE3-NEXT: por %xmm6, %xmm21221; SSSE3-NEXT: movdqa %xmm3, %xmm01222; SSSE3-NEXT: movdqa %xmm2, %xmm11223; SSSE3-NEXT: retq1224;1225; AVX1-LABEL: test_bitreverse_v8i32:1226; AVX1: # %bb.0:1227; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11228; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]1229; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm11230; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1231; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm41232; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1233; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm41234; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm11235; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm11236; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1237; AVX1-NEXT: vpshufb %xmm1, %xmm6, %xmm11238; AVX1-NEXT: vpor %xmm1, %xmm4, %xmm11239; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm01240; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm21241; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm21242; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm01243; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm01244; AVX1-NEXT: vpshufb %xmm0, %xmm6, %xmm01245; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm01246; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01247; AVX1-NEXT: retq1248;1249; AVX2-LABEL: test_bitreverse_v8i32:1250; AVX2: # %bb.0:1251; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,19,18,17,16,23,22,21,20,27,26,25,24,31,30,29,28]1252; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1253; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm21254; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1255; AVX2-NEXT: # ymm3 = mem[0,1,0,1]1256; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm21257; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm01258; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm01259; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1260; AVX2-NEXT: # ymm1 = mem[0,1,0,1]1261; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm01262; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm01263; AVX2-NEXT: retq1264;1265; AVX512-LABEL: test_bitreverse_v8i32:1266; AVX512: # %bb.0:1267; AVX512-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,19,18,17,16,23,22,21,20,27,26,25,24,31,30,29,28]1268; AVX512-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1269; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm21270; AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1271; AVX512-NEXT: # ymm3 = mem[0,1,0,1]1272; AVX512-NEXT: vpshufb %ymm2, %ymm3, %ymm21273; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm01274; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm01275; AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1276; AVX512-NEXT: # ymm1 = mem[0,1,0,1]1277; AVX512-NEXT: vpshufb %ymm0, %ymm1, %ymm01278; AVX512-NEXT: vpor %ymm0, %ymm2, %ymm01279; AVX512-NEXT: retq1280;1281; XOPAVX1-LABEL: test_bitreverse_v8i32:1282; XOPAVX1: # %bb.0:1283; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm11284; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92]1285; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm11286; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm01287; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01288; XOPAVX1-NEXT: retq1289;1290; XOPAVX2-LABEL: test_bitreverse_v8i32:1291; XOPAVX2: # %bb.0:1292; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm11293; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92]1294; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm11295; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm01296; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01297; XOPAVX2-NEXT: retq1298;1299; GFNISSE2-LABEL: test_bitreverse_v8i32:1300; GFNISSE2: # %bb.0:1301; GFNISSE2-NEXT: pxor %xmm2, %xmm21302; GFNISSE2-NEXT: movdqa %xmm0, %xmm31303; GFNISSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]1304; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7]1305; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4]1306; GFNISSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]1307; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]1308; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]1309; GFNISSE2-NEXT: packuswb %xmm3, %xmm01310; GFNISSE2-NEXT: movdqa {{.*#+}} xmm3 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1311; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm3, %xmm01312; GFNISSE2-NEXT: movdqa %xmm1, %xmm41313; GFNISSE2-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]1314; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[3,2,1,0,4,5,6,7]1315; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,7,6,5,4]1316; GFNISSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]1317; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]1318; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]1319; GFNISSE2-NEXT: packuswb %xmm4, %xmm11320; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm3, %xmm11321; GFNISSE2-NEXT: retq1322;1323; GFNISSSE3-LABEL: test_bitreverse_v8i32:1324; GFNISSSE3: # %bb.0:1325; GFNISSSE3-NEXT: movdqa {{.*#+}} xmm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]1326; GFNISSSE3-NEXT: pshufb %xmm2, %xmm01327; GFNISSSE3-NEXT: movdqa {{.*#+}} xmm3 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1328; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm3, %xmm01329; GFNISSSE3-NEXT: pshufb %xmm2, %xmm11330; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm3, %xmm11331; GFNISSSE3-NEXT: retq1332;1333; GFNIAVX1-LABEL: test_bitreverse_v8i32:1334; GFNIAVX1: # %bb.0:1335; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm11336; GFNIAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]1337; GFNIAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm11338; GFNIAVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm01339; GFNIAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01340; GFNIAVX1-NEXT: vbroadcastsd {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1341; GFNIAVX1-NEXT: vgf2p8affineqb $0, %ymm1, %ymm0, %ymm01342; GFNIAVX1-NEXT: retq1343;1344; GFNIAVX2-LABEL: test_bitreverse_v8i32:1345; GFNIAVX2: # %bb.0:1346; GFNIAVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,19,18,17,16,23,22,21,20,27,26,25,24,31,30,29,28]1347; GFNIAVX2-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01348; GFNIAVX2-NEXT: retq1349;1350; GFNIAVX512-LABEL: test_bitreverse_v8i32:1351; GFNIAVX512: # %bb.0:1352; GFNIAVX512-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,19,18,17,16,23,22,21,20,27,26,25,24,31,30,29,28]1353; GFNIAVX512-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01354; GFNIAVX512-NEXT: retq1355 %b = call <8 x i32> @llvm.bitreverse.v8i32(<8 x i32> %a)1356 ret <8 x i32> %b1357}1358 1359define <4 x i64> @test_bitreverse_v4i64(<4 x i64> %a) nounwind {1360; SSE2-LABEL: test_bitreverse_v4i64:1361; SSE2: # %bb.0:1362; SSE2-NEXT: pxor %xmm2, %xmm21363; SSE2-NEXT: movdqa %xmm0, %xmm31364; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]1365; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]1366; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7]1367; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4]1368; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]1369; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]1370; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]1371; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]1372; SSE2-NEXT: packuswb %xmm3, %xmm01373; SSE2-NEXT: movdqa %xmm0, %xmm41374; SSE2-NEXT: psrlw $4, %xmm41375; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1376; SSE2-NEXT: pand %xmm3, %xmm41377; SSE2-NEXT: pand %xmm3, %xmm01378; SSE2-NEXT: psllw $4, %xmm01379; SSE2-NEXT: por %xmm4, %xmm01380; SSE2-NEXT: movdqa %xmm0, %xmm51381; SSE2-NEXT: psrlw $2, %xmm51382; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]1383; SSE2-NEXT: pand %xmm4, %xmm51384; SSE2-NEXT: pand %xmm4, %xmm01385; SSE2-NEXT: psllw $2, %xmm01386; SSE2-NEXT: por %xmm5, %xmm01387; SSE2-NEXT: movdqa %xmm0, %xmm61388; SSE2-NEXT: psrlw $1, %xmm61389; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]1390; SSE2-NEXT: pand %xmm5, %xmm61391; SSE2-NEXT: pand %xmm5, %xmm01392; SSE2-NEXT: paddb %xmm0, %xmm01393; SSE2-NEXT: por %xmm6, %xmm01394; SSE2-NEXT: movdqa %xmm1, %xmm61395; SSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm2[8],xmm6[9],xmm2[9],xmm6[10],xmm2[10],xmm6[11],xmm2[11],xmm6[12],xmm2[12],xmm6[13],xmm2[13],xmm6[14],xmm2[14],xmm6[15],xmm2[15]1396; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[2,3,0,1]1397; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7]1398; SSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4]1399; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]1400; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]1401; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]1402; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]1403; SSE2-NEXT: packuswb %xmm6, %xmm11404; SSE2-NEXT: movdqa %xmm1, %xmm21405; SSE2-NEXT: psrlw $4, %xmm21406; SSE2-NEXT: pand %xmm3, %xmm21407; SSE2-NEXT: pand %xmm3, %xmm11408; SSE2-NEXT: psllw $4, %xmm11409; SSE2-NEXT: por %xmm2, %xmm11410; SSE2-NEXT: movdqa %xmm1, %xmm21411; SSE2-NEXT: psrlw $2, %xmm21412; SSE2-NEXT: pand %xmm4, %xmm21413; SSE2-NEXT: pand %xmm4, %xmm11414; SSE2-NEXT: psllw $2, %xmm11415; SSE2-NEXT: por %xmm2, %xmm11416; SSE2-NEXT: movdqa %xmm1, %xmm21417; SSE2-NEXT: psrlw $1, %xmm21418; SSE2-NEXT: pand %xmm5, %xmm21419; SSE2-NEXT: pand %xmm5, %xmm11420; SSE2-NEXT: paddb %xmm1, %xmm11421; SSE2-NEXT: por %xmm2, %xmm11422; SSE2-NEXT: retq1423;1424; SSSE3-LABEL: test_bitreverse_v4i64:1425; SSSE3: # %bb.0:1426; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]1427; SSSE3-NEXT: pshufb %xmm4, %xmm01428; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1429; SSSE3-NEXT: movdqa %xmm0, %xmm21430; SSSE3-NEXT: pand %xmm5, %xmm21431; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1432; SSSE3-NEXT: movdqa %xmm6, %xmm71433; SSSE3-NEXT: pshufb %xmm2, %xmm71434; SSSE3-NEXT: psrlw $4, %xmm01435; SSSE3-NEXT: pand %xmm5, %xmm01436; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1437; SSSE3-NEXT: movdqa %xmm2, %xmm31438; SSSE3-NEXT: pshufb %xmm0, %xmm31439; SSSE3-NEXT: por %xmm7, %xmm31440; SSSE3-NEXT: pshufb %xmm4, %xmm11441; SSSE3-NEXT: movdqa %xmm1, %xmm01442; SSSE3-NEXT: pand %xmm5, %xmm01443; SSSE3-NEXT: pshufb %xmm0, %xmm61444; SSSE3-NEXT: psrlw $4, %xmm11445; SSSE3-NEXT: pand %xmm5, %xmm11446; SSSE3-NEXT: pshufb %xmm1, %xmm21447; SSSE3-NEXT: por %xmm6, %xmm21448; SSSE3-NEXT: movdqa %xmm3, %xmm01449; SSSE3-NEXT: movdqa %xmm2, %xmm11450; SSSE3-NEXT: retq1451;1452; AVX1-LABEL: test_bitreverse_v4i64:1453; AVX1: # %bb.0:1454; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11455; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]1456; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm11457; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1458; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm41459; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1460; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm41461; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm11462; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm11463; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1464; AVX1-NEXT: vpshufb %xmm1, %xmm6, %xmm11465; AVX1-NEXT: vpor %xmm1, %xmm4, %xmm11466; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm01467; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm21468; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm21469; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm01470; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm01471; AVX1-NEXT: vpshufb %xmm0, %xmm6, %xmm01472; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm01473; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01474; AVX1-NEXT: retq1475;1476; AVX2-LABEL: test_bitreverse_v4i64:1477; AVX2: # %bb.0:1478; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24]1479; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1480; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm21481; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1482; AVX2-NEXT: # ymm3 = mem[0,1,0,1]1483; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm21484; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm01485; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm01486; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1487; AVX2-NEXT: # ymm1 = mem[0,1,0,1]1488; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm01489; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm01490; AVX2-NEXT: retq1491;1492; AVX512-LABEL: test_bitreverse_v4i64:1493; AVX512: # %bb.0:1494; AVX512-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24]1495; AVX512-NEXT: vpbroadcastb {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1496; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm21497; AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1498; AVX512-NEXT: # ymm3 = mem[0,1,0,1]1499; AVX512-NEXT: vpshufb %ymm2, %ymm3, %ymm21500; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm01501; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm01502; AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1503; AVX512-NEXT: # ymm1 = mem[0,1,0,1]1504; AVX512-NEXT: vpshufb %ymm0, %ymm1, %ymm01505; AVX512-NEXT: vpor %ymm0, %ymm2, %ymm01506; AVX512-NEXT: retq1507;1508; XOPAVX1-LABEL: test_bitreverse_v4i64:1509; XOPAVX1: # %bb.0:1510; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm11511; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88]1512; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm11513; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm01514; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01515; XOPAVX1-NEXT: retq1516;1517; XOPAVX2-LABEL: test_bitreverse_v4i64:1518; XOPAVX2: # %bb.0:1519; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm11520; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88]1521; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm11522; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm01523; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01524; XOPAVX2-NEXT: retq1525;1526; GFNISSE2-LABEL: test_bitreverse_v4i64:1527; GFNISSE2: # %bb.0:1528; GFNISSE2-NEXT: pxor %xmm2, %xmm21529; GFNISSE2-NEXT: movdqa %xmm0, %xmm31530; GFNISSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]1531; GFNISSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]1532; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7]1533; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4]1534; GFNISSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]1535; GFNISSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]1536; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]1537; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]1538; GFNISSE2-NEXT: packuswb %xmm3, %xmm01539; GFNISSE2-NEXT: movdqa {{.*#+}} xmm3 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1540; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm3, %xmm01541; GFNISSE2-NEXT: movdqa %xmm1, %xmm41542; GFNISSE2-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]1543; GFNISSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[2,3,0,1]1544; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[3,2,1,0,4,5,6,7]1545; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,7,6,5,4]1546; GFNISSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]1547; GFNISSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]1548; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]1549; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]1550; GFNISSE2-NEXT: packuswb %xmm4, %xmm11551; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm3, %xmm11552; GFNISSE2-NEXT: retq1553;1554; GFNISSSE3-LABEL: test_bitreverse_v4i64:1555; GFNISSSE3: # %bb.0:1556; GFNISSSE3-NEXT: movdqa {{.*#+}} xmm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]1557; GFNISSSE3-NEXT: pshufb %xmm2, %xmm01558; GFNISSSE3-NEXT: movdqa {{.*#+}} xmm3 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1559; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm3, %xmm01560; GFNISSSE3-NEXT: pshufb %xmm2, %xmm11561; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm3, %xmm11562; GFNISSSE3-NEXT: retq1563;1564; GFNIAVX1-LABEL: test_bitreverse_v4i64:1565; GFNIAVX1: # %bb.0:1566; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm11567; GFNIAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]1568; GFNIAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm11569; GFNIAVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm01570; GFNIAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01571; GFNIAVX1-NEXT: vbroadcastsd {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1572; GFNIAVX1-NEXT: vgf2p8affineqb $0, %ymm1, %ymm0, %ymm01573; GFNIAVX1-NEXT: retq1574;1575; GFNIAVX2-LABEL: test_bitreverse_v4i64:1576; GFNIAVX2: # %bb.0:1577; GFNIAVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24]1578; GFNIAVX2-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01579; GFNIAVX2-NEXT: retq1580;1581; GFNIAVX512-LABEL: test_bitreverse_v4i64:1582; GFNIAVX512: # %bb.0:1583; GFNIAVX512-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24]1584; GFNIAVX512-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01585; GFNIAVX512-NEXT: retq1586 %b = call <4 x i64> @llvm.bitreverse.v4i64(<4 x i64> %a)1587 ret <4 x i64> %b1588}1589 1590define <64 x i8> @test_bitreverse_v64i8(<64 x i8> %a) nounwind {1591; SSE2-LABEL: test_bitreverse_v64i8:1592; SSE2: # %bb.0:1593; SSE2-NEXT: movdqa %xmm0, %xmm51594; SSE2-NEXT: psrlw $4, %xmm51595; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1596; SSE2-NEXT: pand %xmm4, %xmm51597; SSE2-NEXT: pand %xmm4, %xmm01598; SSE2-NEXT: psllw $4, %xmm01599; SSE2-NEXT: por %xmm5, %xmm01600; SSE2-NEXT: movdqa %xmm0, %xmm61601; SSE2-NEXT: psrlw $2, %xmm61602; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]1603; SSE2-NEXT: pand %xmm5, %xmm61604; SSE2-NEXT: pand %xmm5, %xmm01605; SSE2-NEXT: psllw $2, %xmm01606; SSE2-NEXT: por %xmm6, %xmm01607; SSE2-NEXT: movdqa %xmm0, %xmm71608; SSE2-NEXT: psrlw $1, %xmm71609; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]1610; SSE2-NEXT: pand %xmm6, %xmm71611; SSE2-NEXT: pand %xmm6, %xmm01612; SSE2-NEXT: paddb %xmm0, %xmm01613; SSE2-NEXT: por %xmm7, %xmm01614; SSE2-NEXT: movdqa %xmm1, %xmm71615; SSE2-NEXT: psrlw $4, %xmm71616; SSE2-NEXT: pand %xmm4, %xmm71617; SSE2-NEXT: pand %xmm4, %xmm11618; SSE2-NEXT: psllw $4, %xmm11619; SSE2-NEXT: por %xmm7, %xmm11620; SSE2-NEXT: movdqa %xmm1, %xmm71621; SSE2-NEXT: psrlw $2, %xmm71622; SSE2-NEXT: pand %xmm5, %xmm71623; SSE2-NEXT: pand %xmm5, %xmm11624; SSE2-NEXT: psllw $2, %xmm11625; SSE2-NEXT: por %xmm7, %xmm11626; SSE2-NEXT: movdqa %xmm1, %xmm71627; SSE2-NEXT: psrlw $1, %xmm71628; SSE2-NEXT: pand %xmm6, %xmm71629; SSE2-NEXT: pand %xmm6, %xmm11630; SSE2-NEXT: paddb %xmm1, %xmm11631; SSE2-NEXT: por %xmm7, %xmm11632; SSE2-NEXT: movdqa %xmm2, %xmm71633; SSE2-NEXT: psrlw $4, %xmm71634; SSE2-NEXT: pand %xmm4, %xmm71635; SSE2-NEXT: pand %xmm4, %xmm21636; SSE2-NEXT: psllw $4, %xmm21637; SSE2-NEXT: por %xmm7, %xmm21638; SSE2-NEXT: movdqa %xmm2, %xmm71639; SSE2-NEXT: psrlw $2, %xmm71640; SSE2-NEXT: pand %xmm5, %xmm71641; SSE2-NEXT: pand %xmm5, %xmm21642; SSE2-NEXT: psllw $2, %xmm21643; SSE2-NEXT: por %xmm7, %xmm21644; SSE2-NEXT: movdqa %xmm2, %xmm71645; SSE2-NEXT: psrlw $1, %xmm71646; SSE2-NEXT: pand %xmm6, %xmm71647; SSE2-NEXT: pand %xmm6, %xmm21648; SSE2-NEXT: paddb %xmm2, %xmm21649; SSE2-NEXT: por %xmm7, %xmm21650; SSE2-NEXT: movdqa %xmm3, %xmm71651; SSE2-NEXT: psrlw $4, %xmm71652; SSE2-NEXT: pand %xmm4, %xmm71653; SSE2-NEXT: pand %xmm4, %xmm31654; SSE2-NEXT: psllw $4, %xmm31655; SSE2-NEXT: por %xmm7, %xmm31656; SSE2-NEXT: movdqa %xmm3, %xmm41657; SSE2-NEXT: psrlw $2, %xmm41658; SSE2-NEXT: pand %xmm5, %xmm41659; SSE2-NEXT: pand %xmm5, %xmm31660; SSE2-NEXT: psllw $2, %xmm31661; SSE2-NEXT: por %xmm4, %xmm31662; SSE2-NEXT: movdqa %xmm3, %xmm41663; SSE2-NEXT: psrlw $1, %xmm41664; SSE2-NEXT: pand %xmm6, %xmm41665; SSE2-NEXT: pand %xmm6, %xmm31666; SSE2-NEXT: paddb %xmm3, %xmm31667; SSE2-NEXT: por %xmm4, %xmm31668; SSE2-NEXT: retq1669;1670; SSSE3-LABEL: test_bitreverse_v64i8:1671; SSSE3: # %bb.0:1672; SSSE3-NEXT: movdqa %xmm0, %xmm51673; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1674; SSSE3-NEXT: pand %xmm8, %xmm01675; SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1676; SSSE3-NEXT: movdqa %xmm7, %xmm61677; SSSE3-NEXT: pshufb %xmm0, %xmm61678; SSSE3-NEXT: psrlw $4, %xmm51679; SSSE3-NEXT: pand %xmm8, %xmm51680; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1681; SSSE3-NEXT: movdqa %xmm4, %xmm01682; SSSE3-NEXT: pshufb %xmm5, %xmm01683; SSSE3-NEXT: por %xmm6, %xmm01684; SSSE3-NEXT: movdqa %xmm1, %xmm51685; SSSE3-NEXT: pand %xmm8, %xmm51686; SSSE3-NEXT: movdqa %xmm7, %xmm61687; SSSE3-NEXT: pshufb %xmm5, %xmm61688; SSSE3-NEXT: psrlw $4, %xmm11689; SSSE3-NEXT: pand %xmm8, %xmm11690; SSSE3-NEXT: movdqa %xmm4, %xmm51691; SSSE3-NEXT: pshufb %xmm1, %xmm51692; SSSE3-NEXT: por %xmm6, %xmm51693; SSSE3-NEXT: movdqa %xmm2, %xmm11694; SSSE3-NEXT: pand %xmm8, %xmm11695; SSSE3-NEXT: movdqa %xmm7, %xmm91696; SSSE3-NEXT: pshufb %xmm1, %xmm91697; SSSE3-NEXT: psrlw $4, %xmm21698; SSSE3-NEXT: pand %xmm8, %xmm21699; SSSE3-NEXT: movdqa %xmm4, %xmm61700; SSSE3-NEXT: pshufb %xmm2, %xmm61701; SSSE3-NEXT: por %xmm9, %xmm61702; SSSE3-NEXT: movdqa %xmm3, %xmm11703; SSSE3-NEXT: pand %xmm8, %xmm11704; SSSE3-NEXT: pshufb %xmm1, %xmm71705; SSSE3-NEXT: psrlw $4, %xmm31706; SSSE3-NEXT: pand %xmm8, %xmm31707; SSSE3-NEXT: pshufb %xmm3, %xmm41708; SSSE3-NEXT: por %xmm7, %xmm41709; SSSE3-NEXT: movdqa %xmm5, %xmm11710; SSSE3-NEXT: movdqa %xmm6, %xmm21711; SSSE3-NEXT: movdqa %xmm4, %xmm31712; SSSE3-NEXT: retq1713;1714; AVX1-LABEL: test_bitreverse_v64i8:1715; AVX1: # %bb.0:1716; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21717; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1718; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm41719; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1720; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm41721; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm21722; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm21723; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1724; AVX1-NEXT: vpshufb %xmm2, %xmm6, %xmm21725; AVX1-NEXT: vpor %xmm2, %xmm4, %xmm21726; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm41727; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm41728; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm01729; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm01730; AVX1-NEXT: vpshufb %xmm0, %xmm6, %xmm01731; AVX1-NEXT: vpor %xmm0, %xmm4, %xmm01732; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01733; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21734; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm41735; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm41736; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm21737; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm21738; AVX1-NEXT: vpshufb %xmm2, %xmm6, %xmm21739; AVX1-NEXT: vpor %xmm2, %xmm4, %xmm21740; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm41741; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm41742; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm11743; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm11744; AVX1-NEXT: vpshufb %xmm1, %xmm6, %xmm11745; AVX1-NEXT: vpor %xmm1, %xmm4, %xmm11746; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm11747; AVX1-NEXT: retq1748;1749; AVX2-LABEL: test_bitreverse_v64i8:1750; AVX2: # %bb.0:1751; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1752; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm31753; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm4 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1754; AVX2-NEXT: # ymm4 = mem[0,1,0,1]1755; AVX2-NEXT: vpshufb %ymm3, %ymm4, %ymm31756; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm01757; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm01758; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm5 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1759; AVX2-NEXT: # ymm5 = mem[0,1,0,1]1760; AVX2-NEXT: vpshufb %ymm0, %ymm5, %ymm01761; AVX2-NEXT: vpor %ymm0, %ymm3, %ymm01762; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm31763; AVX2-NEXT: vpshufb %ymm3, %ymm4, %ymm31764; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm11765; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm11766; AVX2-NEXT: vpshufb %ymm1, %ymm5, %ymm11767; AVX2-NEXT: vpor %ymm1, %ymm3, %ymm11768; AVX2-NEXT: retq1769;1770; AVX512F-LABEL: test_bitreverse_v64i8:1771; AVX512F: # %bb.0:1772; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm11773; AVX512F-NEXT: vpbroadcastb {{.*#+}} ymm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1774; AVX512F-NEXT: vpand %ymm2, %ymm1, %ymm31775; AVX512F-NEXT: vbroadcasti128 {{.*#+}} ymm4 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1776; AVX512F-NEXT: # ymm4 = mem[0,1,0,1]1777; AVX512F-NEXT: vpshufb %ymm3, %ymm4, %ymm31778; AVX512F-NEXT: vpand %ymm2, %ymm0, %ymm51779; AVX512F-NEXT: vpshufb %ymm5, %ymm4, %ymm41780; AVX512F-NEXT: vinserti64x4 $1, %ymm3, %zmm4, %zmm31781; AVX512F-NEXT: vpsrlw $4, %ymm1, %ymm11782; AVX512F-NEXT: vpand %ymm2, %ymm1, %ymm11783; AVX512F-NEXT: vbroadcasti128 {{.*#+}} ymm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1784; AVX512F-NEXT: # ymm4 = mem[0,1,0,1]1785; AVX512F-NEXT: vpshufb %ymm1, %ymm4, %ymm11786; AVX512F-NEXT: vpsrlw $4, %ymm0, %ymm01787; AVX512F-NEXT: vpand %ymm2, %ymm0, %ymm01788; AVX512F-NEXT: vpshufb %ymm0, %ymm4, %ymm01789; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm01790; AVX512F-NEXT: vporq %zmm0, %zmm3, %zmm01791; AVX512F-NEXT: retq1792;1793; AVX512BW-LABEL: test_bitreverse_v64i8:1794; AVX512BW: # %bb.0:1795; AVX512BW-NEXT: vpbroadcastb {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1796; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm21797; AVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} zmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1798; AVX512BW-NEXT: # zmm3 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]1799; AVX512BW-NEXT: vpshufb %zmm2, %zmm3, %zmm21800; AVX512BW-NEXT: vpsrlw $4, %zmm0, %zmm01801; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm01802; AVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} zmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1803; AVX512BW-NEXT: # zmm1 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]1804; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm01805; AVX512BW-NEXT: vporq %zmm0, %zmm2, %zmm01806; AVX512BW-NEXT: retq1807;1808; XOPAVX1-LABEL: test_bitreverse_v64i8:1809; XOPAVX1: # %bb.0:1810; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm21811; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]1812; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm21813; XOPAVX1-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm01814; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01815; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm21816; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm21817; XOPAVX1-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm11818; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm11819; XOPAVX1-NEXT: retq1820;1821; XOPAVX2-LABEL: test_bitreverse_v64i8:1822; XOPAVX2: # %bb.0:1823; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm21824; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]1825; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm21826; XOPAVX2-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm01827; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm01828; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm21829; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm21830; XOPAVX2-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm11831; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm11832; XOPAVX2-NEXT: retq1833;1834; GFNISSE-LABEL: test_bitreverse_v64i8:1835; GFNISSE: # %bb.0:1836; GFNISSE-NEXT: movdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1837; GFNISSE-NEXT: gf2p8affineqb $0, %xmm4, %xmm01838; GFNISSE-NEXT: gf2p8affineqb $0, %xmm4, %xmm11839; GFNISSE-NEXT: gf2p8affineqb $0, %xmm4, %xmm21840; GFNISSE-NEXT: gf2p8affineqb $0, %xmm4, %xmm31841; GFNISSE-NEXT: retq1842;1843; GFNIAVX1-LABEL: test_bitreverse_v64i8:1844; GFNIAVX1: # %bb.0:1845; GFNIAVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1846; GFNIAVX1-NEXT: vgf2p8affineqb $0, %ymm2, %ymm0, %ymm01847; GFNIAVX1-NEXT: vgf2p8affineqb $0, %ymm2, %ymm1, %ymm11848; GFNIAVX1-NEXT: retq1849;1850; GFNIAVX2-LABEL: test_bitreverse_v64i8:1851; GFNIAVX2: # %bb.0:1852; GFNIAVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]1853; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm2, %ymm0, %ymm01854; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm2, %ymm1, %ymm11855; GFNIAVX2-NEXT: retq1856;1857; GFNIAVX512-LABEL: test_bitreverse_v64i8:1858; GFNIAVX512: # %bb.0:1859; GFNIAVX512-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm01860; GFNIAVX512-NEXT: retq1861 %b = call <64 x i8> @llvm.bitreverse.v64i8(<64 x i8> %a)1862 ret <64 x i8> %b1863}1864 1865define <32 x i16> @test_bitreverse_v32i16(<32 x i16> %a) nounwind {1866; SSE2-LABEL: test_bitreverse_v32i16:1867; SSE2: # %bb.0:1868; SSE2-NEXT: movdqa %xmm0, %xmm41869; SSE2-NEXT: psrlw $8, %xmm41870; SSE2-NEXT: psllw $8, %xmm01871; SSE2-NEXT: por %xmm4, %xmm01872; SSE2-NEXT: movdqa %xmm0, %xmm51873; SSE2-NEXT: psrlw $4, %xmm51874; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1875; SSE2-NEXT: pand %xmm4, %xmm51876; SSE2-NEXT: pand %xmm4, %xmm01877; SSE2-NEXT: psllw $4, %xmm01878; SSE2-NEXT: por %xmm5, %xmm01879; SSE2-NEXT: movdqa %xmm0, %xmm61880; SSE2-NEXT: psrlw $2, %xmm61881; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]1882; SSE2-NEXT: pand %xmm5, %xmm61883; SSE2-NEXT: pand %xmm5, %xmm01884; SSE2-NEXT: psllw $2, %xmm01885; SSE2-NEXT: por %xmm6, %xmm01886; SSE2-NEXT: movdqa %xmm0, %xmm71887; SSE2-NEXT: psrlw $1, %xmm71888; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]1889; SSE2-NEXT: pand %xmm6, %xmm71890; SSE2-NEXT: pand %xmm6, %xmm01891; SSE2-NEXT: paddb %xmm0, %xmm01892; SSE2-NEXT: por %xmm7, %xmm01893; SSE2-NEXT: movdqa %xmm1, %xmm71894; SSE2-NEXT: psrlw $8, %xmm71895; SSE2-NEXT: psllw $8, %xmm11896; SSE2-NEXT: por %xmm7, %xmm11897; SSE2-NEXT: movdqa %xmm1, %xmm71898; SSE2-NEXT: psrlw $4, %xmm71899; SSE2-NEXT: pand %xmm4, %xmm71900; SSE2-NEXT: pand %xmm4, %xmm11901; SSE2-NEXT: psllw $4, %xmm11902; SSE2-NEXT: por %xmm7, %xmm11903; SSE2-NEXT: movdqa %xmm1, %xmm71904; SSE2-NEXT: psrlw $2, %xmm71905; SSE2-NEXT: pand %xmm5, %xmm71906; SSE2-NEXT: pand %xmm5, %xmm11907; SSE2-NEXT: psllw $2, %xmm11908; SSE2-NEXT: por %xmm7, %xmm11909; SSE2-NEXT: movdqa %xmm1, %xmm71910; SSE2-NEXT: psrlw $1, %xmm71911; SSE2-NEXT: pand %xmm6, %xmm71912; SSE2-NEXT: pand %xmm6, %xmm11913; SSE2-NEXT: paddb %xmm1, %xmm11914; SSE2-NEXT: por %xmm7, %xmm11915; SSE2-NEXT: movdqa %xmm2, %xmm71916; SSE2-NEXT: psrlw $8, %xmm71917; SSE2-NEXT: psllw $8, %xmm21918; SSE2-NEXT: por %xmm7, %xmm21919; SSE2-NEXT: movdqa %xmm2, %xmm71920; SSE2-NEXT: psrlw $4, %xmm71921; SSE2-NEXT: pand %xmm4, %xmm71922; SSE2-NEXT: pand %xmm4, %xmm21923; SSE2-NEXT: psllw $4, %xmm21924; SSE2-NEXT: por %xmm7, %xmm21925; SSE2-NEXT: movdqa %xmm2, %xmm71926; SSE2-NEXT: psrlw $2, %xmm71927; SSE2-NEXT: pand %xmm5, %xmm71928; SSE2-NEXT: pand %xmm5, %xmm21929; SSE2-NEXT: psllw $2, %xmm21930; SSE2-NEXT: por %xmm7, %xmm21931; SSE2-NEXT: movdqa %xmm2, %xmm71932; SSE2-NEXT: psrlw $1, %xmm71933; SSE2-NEXT: pand %xmm6, %xmm71934; SSE2-NEXT: pand %xmm6, %xmm21935; SSE2-NEXT: paddb %xmm2, %xmm21936; SSE2-NEXT: por %xmm7, %xmm21937; SSE2-NEXT: movdqa %xmm3, %xmm71938; SSE2-NEXT: psrlw $8, %xmm71939; SSE2-NEXT: psllw $8, %xmm31940; SSE2-NEXT: por %xmm7, %xmm31941; SSE2-NEXT: movdqa %xmm3, %xmm71942; SSE2-NEXT: psrlw $4, %xmm71943; SSE2-NEXT: pand %xmm4, %xmm71944; SSE2-NEXT: pand %xmm4, %xmm31945; SSE2-NEXT: psllw $4, %xmm31946; SSE2-NEXT: por %xmm7, %xmm31947; SSE2-NEXT: movdqa %xmm3, %xmm41948; SSE2-NEXT: psrlw $2, %xmm41949; SSE2-NEXT: pand %xmm5, %xmm41950; SSE2-NEXT: pand %xmm5, %xmm31951; SSE2-NEXT: psllw $2, %xmm31952; SSE2-NEXT: por %xmm4, %xmm31953; SSE2-NEXT: movdqa %xmm3, %xmm41954; SSE2-NEXT: psrlw $1, %xmm41955; SSE2-NEXT: pand %xmm6, %xmm41956; SSE2-NEXT: pand %xmm6, %xmm31957; SSE2-NEXT: paddb %xmm3, %xmm31958; SSE2-NEXT: por %xmm4, %xmm31959; SSE2-NEXT: retq1960;1961; SSSE3-LABEL: test_bitreverse_v32i16:1962; SSSE3: # %bb.0:1963; SSSE3-NEXT: movdqa %xmm1, %xmm51964; SSSE3-NEXT: movdqa %xmm0, %xmm11965; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]1966; SSSE3-NEXT: pshufb %xmm8, %xmm11967; SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1968; SSSE3-NEXT: movdqa %xmm1, %xmm01969; SSSE3-NEXT: pand %xmm7, %xmm01970; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]1971; SSSE3-NEXT: movdqa %xmm6, %xmm91972; SSSE3-NEXT: pshufb %xmm0, %xmm91973; SSSE3-NEXT: psrlw $4, %xmm11974; SSSE3-NEXT: pand %xmm7, %xmm11975; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]1976; SSSE3-NEXT: movdqa %xmm4, %xmm01977; SSSE3-NEXT: pshufb %xmm1, %xmm01978; SSSE3-NEXT: por %xmm9, %xmm01979; SSSE3-NEXT: pshufb %xmm8, %xmm51980; SSSE3-NEXT: movdqa %xmm5, %xmm11981; SSSE3-NEXT: pand %xmm7, %xmm11982; SSSE3-NEXT: movdqa %xmm6, %xmm91983; SSSE3-NEXT: pshufb %xmm1, %xmm91984; SSSE3-NEXT: psrlw $4, %xmm51985; SSSE3-NEXT: pand %xmm7, %xmm51986; SSSE3-NEXT: movdqa %xmm4, %xmm11987; SSSE3-NEXT: pshufb %xmm5, %xmm11988; SSSE3-NEXT: por %xmm9, %xmm11989; SSSE3-NEXT: pshufb %xmm8, %xmm21990; SSSE3-NEXT: movdqa %xmm2, %xmm51991; SSSE3-NEXT: pand %xmm7, %xmm51992; SSSE3-NEXT: movdqa %xmm6, %xmm91993; SSSE3-NEXT: pshufb %xmm5, %xmm91994; SSSE3-NEXT: psrlw $4, %xmm21995; SSSE3-NEXT: pand %xmm7, %xmm21996; SSSE3-NEXT: movdqa %xmm4, %xmm51997; SSSE3-NEXT: pshufb %xmm2, %xmm51998; SSSE3-NEXT: por %xmm9, %xmm51999; SSSE3-NEXT: pshufb %xmm8, %xmm32000; SSSE3-NEXT: movdqa %xmm3, %xmm22001; SSSE3-NEXT: pand %xmm7, %xmm22002; SSSE3-NEXT: pshufb %xmm2, %xmm62003; SSSE3-NEXT: psrlw $4, %xmm32004; SSSE3-NEXT: pand %xmm7, %xmm32005; SSSE3-NEXT: pshufb %xmm3, %xmm42006; SSSE3-NEXT: por %xmm6, %xmm42007; SSSE3-NEXT: movdqa %xmm5, %xmm22008; SSSE3-NEXT: movdqa %xmm4, %xmm32009; SSSE3-NEXT: retq2010;2011; AVX1-LABEL: test_bitreverse_v32i16:2012; AVX1: # %bb.0:2013; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm22014; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]2015; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm22016; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]2017; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm52018; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]2019; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm52020; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm22021; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm22022; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]2023; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm22024; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm22025; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm02026; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm52027; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm52028; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm02029; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm02030; AVX1-NEXT: vpshufb %xmm0, %xmm7, %xmm02031; AVX1-NEXT: vpor %xmm0, %xmm5, %xmm02032; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm02033; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm22034; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm22035; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm52036; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm52037; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm22038; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm22039; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm22040; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm22041; AVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm12042; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm32043; AVX1-NEXT: vpshufb %xmm3, %xmm6, %xmm32044; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm12045; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm12046; AVX1-NEXT: vpshufb %xmm1, %xmm7, %xmm12047; AVX1-NEXT: vpor %xmm1, %xmm3, %xmm12048; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm12049; AVX1-NEXT: retq2050;2051; AVX2-LABEL: test_bitreverse_v32i16:2052; AVX2: # %bb.0:2053; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]2054; AVX2-NEXT: # ymm2 = mem[0,1,0,1]2055; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm02056; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]2057; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm42058; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]2059; AVX2-NEXT: # ymm5 = mem[0,1,0,1]2060; AVX2-NEXT: vpshufb %ymm4, %ymm5, %ymm42061; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm02062; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm02063; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]2064; AVX2-NEXT: # ymm6 = mem[0,1,0,1]2065; AVX2-NEXT: vpshufb %ymm0, %ymm6, %ymm02066; AVX2-NEXT: vpor %ymm0, %ymm4, %ymm02067; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm12068; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm22069; AVX2-NEXT: vpshufb %ymm2, %ymm5, %ymm22070; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm12071; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm12072; AVX2-NEXT: vpshufb %ymm1, %ymm6, %ymm12073; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm12074; AVX2-NEXT: retq2075;2076; AVX512F-LABEL: test_bitreverse_v32i16:2077; AVX512F: # %bb.0:2078; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm12079; AVX512F-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]2080; AVX512F-NEXT: # ymm2 = mem[0,1,0,1]2081; AVX512F-NEXT: vpshufb %ymm2, %ymm1, %ymm12082; AVX512F-NEXT: vpbroadcastb {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]2083; AVX512F-NEXT: vpand %ymm3, %ymm1, %ymm42084; AVX512F-NEXT: vbroadcasti128 {{.*#+}} ymm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]2085; AVX512F-NEXT: # ymm5 = mem[0,1,0,1]2086; AVX512F-NEXT: vpshufb %ymm4, %ymm5, %ymm42087; AVX512F-NEXT: vpshufb %ymm2, %ymm0, %ymm02088; AVX512F-NEXT: vpand %ymm3, %ymm0, %ymm22089; AVX512F-NEXT: vpshufb %ymm2, %ymm5, %ymm22090; AVX512F-NEXT: vinserti64x4 $1, %ymm4, %zmm2, %zmm22091; AVX512F-NEXT: vpsrlw $4, %ymm1, %ymm12092; AVX512F-NEXT: vpand %ymm3, %ymm1, %ymm12093; AVX512F-NEXT: vbroadcasti128 {{.*#+}} ymm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]2094; AVX512F-NEXT: # ymm4 = mem[0,1,0,1]2095; AVX512F-NEXT: vpshufb %ymm1, %ymm4, %ymm12096; AVX512F-NEXT: vpsrlw $4, %ymm0, %ymm02097; AVX512F-NEXT: vpand %ymm3, %ymm0, %ymm02098; AVX512F-NEXT: vpshufb %ymm0, %ymm4, %ymm02099; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm02100; AVX512F-NEXT: vporq %zmm0, %zmm2, %zmm02101; AVX512F-NEXT: retq2102;2103; AVX512BW-LABEL: test_bitreverse_v32i16:2104; AVX512BW: # %bb.0:2105; AVX512BW-NEXT: vpshufb {{.*#+}} zmm0 = zmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30,33,32,35,34,37,36,39,38,41,40,43,42,45,44,47,46,49,48,51,50,53,52,55,54,57,56,59,58,61,60,63,62]2106; AVX512BW-NEXT: vpbroadcastb {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]2107; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm22108; AVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} zmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]2109; AVX512BW-NEXT: # zmm3 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]2110; AVX512BW-NEXT: vpshufb %zmm2, %zmm3, %zmm22111; AVX512BW-NEXT: vpsrlw $4, %zmm0, %zmm02112; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm02113; AVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} zmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]2114; AVX512BW-NEXT: # zmm1 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]2115; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm02116; AVX512BW-NEXT: vporq %zmm0, %zmm2, %zmm02117; AVX512BW-NEXT: retq2118;2119; XOPAVX1-LABEL: test_bitreverse_v32i16:2120; XOPAVX1: # %bb.0:2121; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm22122; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94]2123; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm22124; XOPAVX1-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm02125; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm02126; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm22127; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm22128; XOPAVX1-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm12129; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm12130; XOPAVX1-NEXT: retq2131;2132; XOPAVX2-LABEL: test_bitreverse_v32i16:2133; XOPAVX2: # %bb.0:2134; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm22135; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94]2136; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm22137; XOPAVX2-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm02138; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm02139; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm22140; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm22141; XOPAVX2-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm12142; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm12143; XOPAVX2-NEXT: retq2144;2145; GFNISSE2-LABEL: test_bitreverse_v32i16:2146; GFNISSE2: # %bb.0:2147; GFNISSE2-NEXT: movdqa %xmm0, %xmm42148; GFNISSE2-NEXT: psrlw $8, %xmm42149; GFNISSE2-NEXT: psllw $8, %xmm02150; GFNISSE2-NEXT: por %xmm4, %xmm02151; GFNISSE2-NEXT: movdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2152; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm4, %xmm02153; GFNISSE2-NEXT: movdqa %xmm1, %xmm52154; GFNISSE2-NEXT: psrlw $8, %xmm52155; GFNISSE2-NEXT: psllw $8, %xmm12156; GFNISSE2-NEXT: por %xmm5, %xmm12157; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm4, %xmm12158; GFNISSE2-NEXT: movdqa %xmm2, %xmm52159; GFNISSE2-NEXT: psrlw $8, %xmm52160; GFNISSE2-NEXT: psllw $8, %xmm22161; GFNISSE2-NEXT: por %xmm5, %xmm22162; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm4, %xmm22163; GFNISSE2-NEXT: movdqa %xmm3, %xmm52164; GFNISSE2-NEXT: psrlw $8, %xmm52165; GFNISSE2-NEXT: psllw $8, %xmm32166; GFNISSE2-NEXT: por %xmm5, %xmm32167; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm4, %xmm32168; GFNISSE2-NEXT: retq2169;2170; GFNISSSE3-LABEL: test_bitreverse_v32i16:2171; GFNISSSE3: # %bb.0:2172; GFNISSSE3-NEXT: movdqa {{.*#+}} xmm4 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]2173; GFNISSSE3-NEXT: pshufb %xmm4, %xmm02174; GFNISSSE3-NEXT: movdqa {{.*#+}} xmm5 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2175; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm5, %xmm02176; GFNISSSE3-NEXT: pshufb %xmm4, %xmm12177; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm5, %xmm12178; GFNISSSE3-NEXT: pshufb %xmm4, %xmm22179; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm5, %xmm22180; GFNISSSE3-NEXT: pshufb %xmm4, %xmm32181; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm5, %xmm32182; GFNISSSE3-NEXT: retq2183;2184; GFNIAVX1-LABEL: test_bitreverse_v32i16:2185; GFNIAVX1: # %bb.0:2186; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm22187; GFNIAVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]2188; GFNIAVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm22189; GFNIAVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm02190; GFNIAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm02191; GFNIAVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2192; GFNIAVX1-NEXT: vgf2p8affineqb $0, %ymm2, %ymm0, %ymm02193; GFNIAVX1-NEXT: vextractf128 $1, %ymm1, %xmm42194; GFNIAVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm42195; GFNIAVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm12196; GFNIAVX1-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm12197; GFNIAVX1-NEXT: vgf2p8affineqb $0, %ymm2, %ymm1, %ymm12198; GFNIAVX1-NEXT: retq2199;2200; GFNIAVX2-LABEL: test_bitreverse_v32i16:2201; GFNIAVX2: # %bb.0:2202; GFNIAVX2-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]2203; GFNIAVX2-NEXT: # ymm2 = mem[0,1,0,1]2204; GFNIAVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm02205; GFNIAVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2206; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm3, %ymm0, %ymm02207; GFNIAVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm12208; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm3, %ymm1, %ymm12209; GFNIAVX2-NEXT: retq2210;2211; GFNIAVX512F-LABEL: test_bitreverse_v32i16:2212; GFNIAVX512F: # %bb.0:2213; GFNIAVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm12214; GFNIAVX512F-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]2215; GFNIAVX512F-NEXT: # ymm2 = mem[0,1,0,1]2216; GFNIAVX512F-NEXT: vpshufb %ymm2, %ymm1, %ymm12217; GFNIAVX512F-NEXT: vpshufb %ymm2, %ymm0, %ymm02218; GFNIAVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm02219; GFNIAVX512F-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm02220; GFNIAVX512F-NEXT: retq2221;2222; GFNIAVX512BW-LABEL: test_bitreverse_v32i16:2223; GFNIAVX512BW: # %bb.0:2224; GFNIAVX512BW-NEXT: vpshufb {{.*#+}} zmm0 = zmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30,33,32,35,34,37,36,39,38,41,40,43,42,45,44,47,46,49,48,51,50,53,52,55,54,57,56,59,58,61,60,63,62]2225; GFNIAVX512BW-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm02226; GFNIAVX512BW-NEXT: retq2227 %b = call <32 x i16> @llvm.bitreverse.v32i16(<32 x i16> %a)2228 ret <32 x i16> %b2229}2230 2231define <16 x i32> @test_bitreverse_v16i32(<16 x i32> %a) nounwind {2232; SSE2-LABEL: test_bitreverse_v16i32:2233; SSE2: # %bb.0:2234; SSE2-NEXT: pxor %xmm4, %xmm42235; SSE2-NEXT: movdqa %xmm0, %xmm52236; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm4[8],xmm5[9],xmm4[9],xmm5[10],xmm4[10],xmm5[11],xmm4[11],xmm5[12],xmm4[12],xmm5[13],xmm4[13],xmm5[14],xmm4[14],xmm5[15],xmm4[15]2237; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[3,2,1,0,4,5,6,7]2238; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,7,6,5,4]2239; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]2240; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]2241; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]2242; SSE2-NEXT: packuswb %xmm5, %xmm02243; SSE2-NEXT: movdqa %xmm0, %xmm62244; SSE2-NEXT: psrlw $4, %xmm62245; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]2246; SSE2-NEXT: pand %xmm5, %xmm62247; SSE2-NEXT: pand %xmm5, %xmm02248; SSE2-NEXT: psllw $4, %xmm02249; SSE2-NEXT: por %xmm6, %xmm02250; SSE2-NEXT: movdqa %xmm0, %xmm72251; SSE2-NEXT: psrlw $2, %xmm72252; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]2253; SSE2-NEXT: pand %xmm6, %xmm72254; SSE2-NEXT: pand %xmm6, %xmm02255; SSE2-NEXT: psllw $2, %xmm02256; SSE2-NEXT: por %xmm7, %xmm02257; SSE2-NEXT: movdqa %xmm0, %xmm82258; SSE2-NEXT: psrlw $1, %xmm82259; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]2260; SSE2-NEXT: pand %xmm7, %xmm82261; SSE2-NEXT: pand %xmm7, %xmm02262; SSE2-NEXT: paddb %xmm0, %xmm02263; SSE2-NEXT: por %xmm8, %xmm02264; SSE2-NEXT: movdqa %xmm1, %xmm82265; SSE2-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm4[8],xmm8[9],xmm4[9],xmm8[10],xmm4[10],xmm8[11],xmm4[11],xmm8[12],xmm4[12],xmm8[13],xmm4[13],xmm8[14],xmm4[14],xmm8[15],xmm4[15]2266; SSE2-NEXT: pshuflw {{.*#+}} xmm8 = xmm8[3,2,1,0,4,5,6,7]2267; SSE2-NEXT: pshufhw {{.*#+}} xmm8 = xmm8[0,1,2,3,7,6,5,4]2268; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]2269; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]2270; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]2271; SSE2-NEXT: packuswb %xmm8, %xmm12272; SSE2-NEXT: movdqa %xmm1, %xmm82273; SSE2-NEXT: psrlw $4, %xmm82274; SSE2-NEXT: pand %xmm5, %xmm82275; SSE2-NEXT: pand %xmm5, %xmm12276; SSE2-NEXT: psllw $4, %xmm12277; SSE2-NEXT: por %xmm8, %xmm12278; SSE2-NEXT: movdqa %xmm1, %xmm82279; SSE2-NEXT: psrlw $2, %xmm82280; SSE2-NEXT: pand %xmm6, %xmm82281; SSE2-NEXT: pand %xmm6, %xmm12282; SSE2-NEXT: psllw $2, %xmm12283; SSE2-NEXT: por %xmm8, %xmm12284; SSE2-NEXT: movdqa %xmm1, %xmm82285; SSE2-NEXT: psrlw $1, %xmm82286; SSE2-NEXT: pand %xmm7, %xmm82287; SSE2-NEXT: pand %xmm7, %xmm12288; SSE2-NEXT: paddb %xmm1, %xmm12289; SSE2-NEXT: por %xmm8, %xmm12290; SSE2-NEXT: movdqa %xmm2, %xmm82291; SSE2-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm4[8],xmm8[9],xmm4[9],xmm8[10],xmm4[10],xmm8[11],xmm4[11],xmm8[12],xmm4[12],xmm8[13],xmm4[13],xmm8[14],xmm4[14],xmm8[15],xmm4[15]2292; SSE2-NEXT: pshuflw {{.*#+}} xmm8 = xmm8[3,2,1,0,4,5,6,7]2293; SSE2-NEXT: pshufhw {{.*#+}} xmm8 = xmm8[0,1,2,3,7,6,5,4]2294; 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]2295; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]2296; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]2297; SSE2-NEXT: packuswb %xmm8, %xmm22298; SSE2-NEXT: movdqa %xmm2, %xmm82299; SSE2-NEXT: psrlw $4, %xmm82300; SSE2-NEXT: pand %xmm5, %xmm82301; SSE2-NEXT: pand %xmm5, %xmm22302; SSE2-NEXT: psllw $4, %xmm22303; SSE2-NEXT: por %xmm8, %xmm22304; SSE2-NEXT: movdqa %xmm2, %xmm82305; SSE2-NEXT: psrlw $2, %xmm82306; SSE2-NEXT: pand %xmm6, %xmm82307; SSE2-NEXT: pand %xmm6, %xmm22308; SSE2-NEXT: psllw $2, %xmm22309; SSE2-NEXT: por %xmm8, %xmm22310; SSE2-NEXT: movdqa %xmm2, %xmm82311; SSE2-NEXT: psrlw $1, %xmm82312; SSE2-NEXT: pand %xmm7, %xmm82313; SSE2-NEXT: pand %xmm7, %xmm22314; SSE2-NEXT: paddb %xmm2, %xmm22315; SSE2-NEXT: por %xmm8, %xmm22316; SSE2-NEXT: movdqa %xmm3, %xmm82317; SSE2-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm4[8],xmm8[9],xmm4[9],xmm8[10],xmm4[10],xmm8[11],xmm4[11],xmm8[12],xmm4[12],xmm8[13],xmm4[13],xmm8[14],xmm4[14],xmm8[15],xmm4[15]2318; SSE2-NEXT: pshuflw {{.*#+}} xmm8 = xmm8[3,2,1,0,4,5,6,7]2319; SSE2-NEXT: pshufhw {{.*#+}} xmm8 = xmm8[0,1,2,3,7,6,5,4]2320; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]2321; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7]2322; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4]2323; SSE2-NEXT: packuswb %xmm8, %xmm32324; SSE2-NEXT: movdqa %xmm3, %xmm42325; SSE2-NEXT: psrlw $4, %xmm42326; SSE2-NEXT: pand %xmm5, %xmm42327; SSE2-NEXT: pand %xmm5, %xmm32328; SSE2-NEXT: psllw $4, %xmm32329; SSE2-NEXT: por %xmm4, %xmm32330; SSE2-NEXT: movdqa %xmm3, %xmm42331; SSE2-NEXT: psrlw $2, %xmm42332; SSE2-NEXT: pand %xmm6, %xmm42333; SSE2-NEXT: pand %xmm6, %xmm32334; SSE2-NEXT: psllw $2, %xmm32335; SSE2-NEXT: por %xmm4, %xmm32336; SSE2-NEXT: movdqa %xmm3, %xmm42337; SSE2-NEXT: psrlw $1, %xmm42338; SSE2-NEXT: pand %xmm7, %xmm42339; SSE2-NEXT: pand %xmm7, %xmm32340; SSE2-NEXT: paddb %xmm3, %xmm32341; SSE2-NEXT: por %xmm4, %xmm32342; SSE2-NEXT: retq2343;2344; SSSE3-LABEL: test_bitreverse_v16i32:2345; SSSE3: # %bb.0:2346; SSSE3-NEXT: movdqa %xmm1, %xmm52347; SSSE3-NEXT: movdqa %xmm0, %xmm12348; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]2349; SSSE3-NEXT: pshufb %xmm8, %xmm12350; SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]2351; SSSE3-NEXT: movdqa %xmm1, %xmm02352; SSSE3-NEXT: pand %xmm7, %xmm02353; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]2354; SSSE3-NEXT: movdqa %xmm6, %xmm92355; SSSE3-NEXT: pshufb %xmm0, %xmm92356; SSSE3-NEXT: psrlw $4, %xmm12357; SSSE3-NEXT: pand %xmm7, %xmm12358; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]2359; SSSE3-NEXT: movdqa %xmm4, %xmm02360; SSSE3-NEXT: pshufb %xmm1, %xmm02361; SSSE3-NEXT: por %xmm9, %xmm02362; SSSE3-NEXT: pshufb %xmm8, %xmm52363; SSSE3-NEXT: movdqa %xmm5, %xmm12364; SSSE3-NEXT: pand %xmm7, %xmm12365; SSSE3-NEXT: movdqa %xmm6, %xmm92366; SSSE3-NEXT: pshufb %xmm1, %xmm92367; SSSE3-NEXT: psrlw $4, %xmm52368; SSSE3-NEXT: pand %xmm7, %xmm52369; SSSE3-NEXT: movdqa %xmm4, %xmm12370; SSSE3-NEXT: pshufb %xmm5, %xmm12371; SSSE3-NEXT: por %xmm9, %xmm12372; SSSE3-NEXT: pshufb %xmm8, %xmm22373; SSSE3-NEXT: movdqa %xmm2, %xmm52374; SSSE3-NEXT: pand %xmm7, %xmm52375; SSSE3-NEXT: movdqa %xmm6, %xmm92376; SSSE3-NEXT: pshufb %xmm5, %xmm92377; SSSE3-NEXT: psrlw $4, %xmm22378; SSSE3-NEXT: pand %xmm7, %xmm22379; SSSE3-NEXT: movdqa %xmm4, %xmm52380; SSSE3-NEXT: pshufb %xmm2, %xmm52381; SSSE3-NEXT: por %xmm9, %xmm52382; SSSE3-NEXT: pshufb %xmm8, %xmm32383; SSSE3-NEXT: movdqa %xmm3, %xmm22384; SSSE3-NEXT: pand %xmm7, %xmm22385; SSSE3-NEXT: pshufb %xmm2, %xmm62386; SSSE3-NEXT: psrlw $4, %xmm32387; SSSE3-NEXT: pand %xmm7, %xmm32388; SSSE3-NEXT: pshufb %xmm3, %xmm42389; SSSE3-NEXT: por %xmm6, %xmm42390; SSSE3-NEXT: movdqa %xmm5, %xmm22391; SSSE3-NEXT: movdqa %xmm4, %xmm32392; SSSE3-NEXT: retq2393;2394; AVX1-LABEL: test_bitreverse_v16i32:2395; AVX1: # %bb.0:2396; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm22397; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]2398; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm22399; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]2400; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm52401; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]2402; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm52403; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm22404; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm22405; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]2406; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm22407; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm22408; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm02409; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm52410; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm52411; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm02412; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm02413; AVX1-NEXT: vpshufb %xmm0, %xmm7, %xmm02414; AVX1-NEXT: vpor %xmm0, %xmm5, %xmm02415; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm02416; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm22417; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm22418; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm52419; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm52420; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm22421; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm22422; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm22423; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm22424; AVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm12425; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm32426; AVX1-NEXT: vpshufb %xmm3, %xmm6, %xmm32427; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm12428; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm12429; AVX1-NEXT: vpshufb %xmm1, %xmm7, %xmm12430; AVX1-NEXT: vpor %xmm1, %xmm3, %xmm12431; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm12432; AVX1-NEXT: retq2433;2434; AVX2-LABEL: test_bitreverse_v16i32:2435; AVX2: # %bb.0:2436; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]2437; AVX2-NEXT: # ymm2 = mem[0,1,0,1]2438; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm02439; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]2440; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm42441; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]2442; AVX2-NEXT: # ymm5 = mem[0,1,0,1]2443; AVX2-NEXT: vpshufb %ymm4, %ymm5, %ymm42444; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm02445; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm02446; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]2447; AVX2-NEXT: # ymm6 = mem[0,1,0,1]2448; AVX2-NEXT: vpshufb %ymm0, %ymm6, %ymm02449; AVX2-NEXT: vpor %ymm0, %ymm4, %ymm02450; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm12451; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm22452; AVX2-NEXT: vpshufb %ymm2, %ymm5, %ymm22453; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm12454; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm12455; AVX2-NEXT: vpshufb %ymm1, %ymm6, %ymm12456; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm12457; AVX2-NEXT: retq2458;2459; AVX512F-LABEL: test_bitreverse_v16i32:2460; AVX512F: # %bb.0:2461; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm12462; AVX512F-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]2463; AVX512F-NEXT: # ymm2 = mem[0,1,0,1]2464; AVX512F-NEXT: vpshufb %ymm2, %ymm1, %ymm12465; AVX512F-NEXT: vpbroadcastb {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]2466; AVX512F-NEXT: vpand %ymm3, %ymm1, %ymm42467; AVX512F-NEXT: vbroadcasti128 {{.*#+}} ymm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]2468; AVX512F-NEXT: # ymm5 = mem[0,1,0,1]2469; AVX512F-NEXT: vpshufb %ymm4, %ymm5, %ymm42470; AVX512F-NEXT: vpshufb %ymm2, %ymm0, %ymm02471; AVX512F-NEXT: vpand %ymm3, %ymm0, %ymm22472; AVX512F-NEXT: vpshufb %ymm2, %ymm5, %ymm22473; AVX512F-NEXT: vinserti64x4 $1, %ymm4, %zmm2, %zmm22474; AVX512F-NEXT: vpsrlw $4, %ymm1, %ymm12475; AVX512F-NEXT: vpand %ymm3, %ymm1, %ymm12476; AVX512F-NEXT: vbroadcasti128 {{.*#+}} ymm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]2477; AVX512F-NEXT: # ymm4 = mem[0,1,0,1]2478; AVX512F-NEXT: vpshufb %ymm1, %ymm4, %ymm12479; AVX512F-NEXT: vpsrlw $4, %ymm0, %ymm02480; AVX512F-NEXT: vpand %ymm3, %ymm0, %ymm02481; AVX512F-NEXT: vpshufb %ymm0, %ymm4, %ymm02482; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm02483; AVX512F-NEXT: vporq %zmm0, %zmm2, %zmm02484; AVX512F-NEXT: retq2485;2486; AVX512BW-LABEL: test_bitreverse_v16i32:2487; AVX512BW: # %bb.0:2488; AVX512BW-NEXT: vpshufb {{.*#+}} zmm0 = zmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,19,18,17,16,23,22,21,20,27,26,25,24,31,30,29,28,35,34,33,32,39,38,37,36,43,42,41,40,47,46,45,44,51,50,49,48,55,54,53,52,59,58,57,56,63,62,61,60]2489; AVX512BW-NEXT: vpbroadcastb {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]2490; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm22491; AVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} zmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]2492; AVX512BW-NEXT: # zmm3 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]2493; AVX512BW-NEXT: vpshufb %zmm2, %zmm3, %zmm22494; AVX512BW-NEXT: vpsrlw $4, %zmm0, %zmm02495; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm02496; AVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} zmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]2497; AVX512BW-NEXT: # zmm1 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]2498; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm02499; AVX512BW-NEXT: vporq %zmm0, %zmm2, %zmm02500; AVX512BW-NEXT: retq2501;2502; XOPAVX1-LABEL: test_bitreverse_v16i32:2503; XOPAVX1: # %bb.0:2504; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm22505; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92]2506; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm22507; XOPAVX1-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm02508; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm02509; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm22510; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm22511; XOPAVX1-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm12512; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm12513; XOPAVX1-NEXT: retq2514;2515; XOPAVX2-LABEL: test_bitreverse_v16i32:2516; XOPAVX2: # %bb.0:2517; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm22518; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92]2519; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm22520; XOPAVX2-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm02521; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm02522; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm22523; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm22524; XOPAVX2-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm12525; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm12526; XOPAVX2-NEXT: retq2527;2528; GFNISSE2-LABEL: test_bitreverse_v16i32:2529; GFNISSE2: # %bb.0:2530; GFNISSE2-NEXT: pxor %xmm4, %xmm42531; GFNISSE2-NEXT: movdqa %xmm0, %xmm52532; GFNISSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm4[8],xmm5[9],xmm4[9],xmm5[10],xmm4[10],xmm5[11],xmm4[11],xmm5[12],xmm4[12],xmm5[13],xmm4[13],xmm5[14],xmm4[14],xmm5[15],xmm4[15]2533; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[3,2,1,0,4,5,6,7]2534; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,7,6,5,4]2535; GFNISSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]2536; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]2537; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]2538; GFNISSE2-NEXT: packuswb %xmm5, %xmm02539; GFNISSE2-NEXT: movdqa {{.*#+}} xmm5 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2540; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm5, %xmm02541; GFNISSE2-NEXT: movdqa %xmm1, %xmm62542; GFNISSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm4[8],xmm6[9],xmm4[9],xmm6[10],xmm4[10],xmm6[11],xmm4[11],xmm6[12],xmm4[12],xmm6[13],xmm4[13],xmm6[14],xmm4[14],xmm6[15],xmm4[15]2543; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7]2544; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4]2545; GFNISSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]2546; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]2547; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]2548; GFNISSE2-NEXT: packuswb %xmm6, %xmm12549; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm5, %xmm12550; GFNISSE2-NEXT: movdqa %xmm2, %xmm62551; GFNISSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm4[8],xmm6[9],xmm4[9],xmm6[10],xmm4[10],xmm6[11],xmm4[11],xmm6[12],xmm4[12],xmm6[13],xmm4[13],xmm6[14],xmm4[14],xmm6[15],xmm4[15]2552; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7]2553; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4]2554; GFNISSE2-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]2555; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]2556; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]2557; GFNISSE2-NEXT: packuswb %xmm6, %xmm22558; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm5, %xmm22559; GFNISSE2-NEXT: movdqa %xmm3, %xmm62560; GFNISSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm4[8],xmm6[9],xmm4[9],xmm6[10],xmm4[10],xmm6[11],xmm4[11],xmm6[12],xmm4[12],xmm6[13],xmm4[13],xmm6[14],xmm4[14],xmm6[15],xmm4[15]2561; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7]2562; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4]2563; GFNISSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]2564; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7]2565; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4]2566; GFNISSE2-NEXT: packuswb %xmm6, %xmm32567; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm5, %xmm32568; GFNISSE2-NEXT: retq2569;2570; GFNISSSE3-LABEL: test_bitreverse_v16i32:2571; GFNISSSE3: # %bb.0:2572; GFNISSSE3-NEXT: movdqa {{.*#+}} xmm4 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]2573; GFNISSSE3-NEXT: pshufb %xmm4, %xmm02574; GFNISSSE3-NEXT: movdqa {{.*#+}} xmm5 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2575; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm5, %xmm02576; GFNISSSE3-NEXT: pshufb %xmm4, %xmm12577; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm5, %xmm12578; GFNISSSE3-NEXT: pshufb %xmm4, %xmm22579; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm5, %xmm22580; GFNISSSE3-NEXT: pshufb %xmm4, %xmm32581; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm5, %xmm32582; GFNISSSE3-NEXT: retq2583;2584; GFNIAVX1-LABEL: test_bitreverse_v16i32:2585; GFNIAVX1: # %bb.0:2586; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm22587; GFNIAVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]2588; GFNIAVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm22589; GFNIAVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm02590; GFNIAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm02591; GFNIAVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2592; GFNIAVX1-NEXT: vgf2p8affineqb $0, %ymm2, %ymm0, %ymm02593; GFNIAVX1-NEXT: vextractf128 $1, %ymm1, %xmm42594; GFNIAVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm42595; GFNIAVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm12596; GFNIAVX1-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm12597; GFNIAVX1-NEXT: vgf2p8affineqb $0, %ymm2, %ymm1, %ymm12598; GFNIAVX1-NEXT: retq2599;2600; GFNIAVX2-LABEL: test_bitreverse_v16i32:2601; GFNIAVX2: # %bb.0:2602; GFNIAVX2-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]2603; GFNIAVX2-NEXT: # ymm2 = mem[0,1,0,1]2604; GFNIAVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm02605; GFNIAVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2606; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm3, %ymm0, %ymm02607; GFNIAVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm12608; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm3, %ymm1, %ymm12609; GFNIAVX2-NEXT: retq2610;2611; GFNIAVX512F-LABEL: test_bitreverse_v16i32:2612; GFNIAVX512F: # %bb.0:2613; GFNIAVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm12614; GFNIAVX512F-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]2615; GFNIAVX512F-NEXT: # ymm2 = mem[0,1,0,1]2616; GFNIAVX512F-NEXT: vpshufb %ymm2, %ymm1, %ymm12617; GFNIAVX512F-NEXT: vpshufb %ymm2, %ymm0, %ymm02618; GFNIAVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm02619; GFNIAVX512F-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm02620; GFNIAVX512F-NEXT: retq2621;2622; GFNIAVX512BW-LABEL: test_bitreverse_v16i32:2623; GFNIAVX512BW: # %bb.0:2624; GFNIAVX512BW-NEXT: vpshufb {{.*#+}} zmm0 = zmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,19,18,17,16,23,22,21,20,27,26,25,24,31,30,29,28,35,34,33,32,39,38,37,36,43,42,41,40,47,46,45,44,51,50,49,48,55,54,53,52,59,58,57,56,63,62,61,60]2625; GFNIAVX512BW-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm02626; GFNIAVX512BW-NEXT: retq2627 %b = call <16 x i32> @llvm.bitreverse.v16i32(<16 x i32> %a)2628 ret <16 x i32> %b2629}2630 2631define <8 x i64> @test_bitreverse_v8i64(<8 x i64> %a) nounwind {2632; SSE2-LABEL: test_bitreverse_v8i64:2633; SSE2: # %bb.0:2634; SSE2-NEXT: pxor %xmm4, %xmm42635; SSE2-NEXT: movdqa %xmm0, %xmm52636; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm4[8],xmm5[9],xmm4[9],xmm5[10],xmm4[10],xmm5[11],xmm4[11],xmm5[12],xmm4[12],xmm5[13],xmm4[13],xmm5[14],xmm4[14],xmm5[15],xmm4[15]2637; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,0,1]2638; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[3,2,1,0,4,5,6,7]2639; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,7,6,5,4]2640; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]2641; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]2642; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]2643; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]2644; SSE2-NEXT: packuswb %xmm5, %xmm02645; SSE2-NEXT: movdqa %xmm0, %xmm62646; SSE2-NEXT: psrlw $4, %xmm62647; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]2648; SSE2-NEXT: pand %xmm5, %xmm62649; SSE2-NEXT: pand %xmm5, %xmm02650; SSE2-NEXT: psllw $4, %xmm02651; SSE2-NEXT: por %xmm6, %xmm02652; SSE2-NEXT: movdqa %xmm0, %xmm72653; SSE2-NEXT: psrlw $2, %xmm72654; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]2655; SSE2-NEXT: pand %xmm6, %xmm72656; SSE2-NEXT: pand %xmm6, %xmm02657; SSE2-NEXT: psllw $2, %xmm02658; SSE2-NEXT: por %xmm7, %xmm02659; SSE2-NEXT: movdqa %xmm0, %xmm82660; SSE2-NEXT: psrlw $1, %xmm82661; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85]2662; SSE2-NEXT: pand %xmm7, %xmm82663; SSE2-NEXT: pand %xmm7, %xmm02664; SSE2-NEXT: paddb %xmm0, %xmm02665; SSE2-NEXT: por %xmm8, %xmm02666; SSE2-NEXT: movdqa %xmm1, %xmm82667; SSE2-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm4[8],xmm8[9],xmm4[9],xmm8[10],xmm4[10],xmm8[11],xmm4[11],xmm8[12],xmm4[12],xmm8[13],xmm4[13],xmm8[14],xmm4[14],xmm8[15],xmm4[15]2668; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm8[2,3,0,1]2669; SSE2-NEXT: pshuflw {{.*#+}} xmm8 = xmm8[3,2,1,0,4,5,6,7]2670; SSE2-NEXT: pshufhw {{.*#+}} xmm8 = xmm8[0,1,2,3,7,6,5,4]2671; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]2672; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]2673; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]2674; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]2675; SSE2-NEXT: packuswb %xmm8, %xmm12676; SSE2-NEXT: movdqa %xmm1, %xmm82677; SSE2-NEXT: psrlw $4, %xmm82678; SSE2-NEXT: pand %xmm5, %xmm82679; SSE2-NEXT: pand %xmm5, %xmm12680; SSE2-NEXT: psllw $4, %xmm12681; SSE2-NEXT: por %xmm8, %xmm12682; SSE2-NEXT: movdqa %xmm1, %xmm82683; SSE2-NEXT: psrlw $2, %xmm82684; SSE2-NEXT: pand %xmm6, %xmm82685; SSE2-NEXT: pand %xmm6, %xmm12686; SSE2-NEXT: psllw $2, %xmm12687; SSE2-NEXT: por %xmm8, %xmm12688; SSE2-NEXT: movdqa %xmm1, %xmm82689; SSE2-NEXT: psrlw $1, %xmm82690; SSE2-NEXT: pand %xmm7, %xmm82691; SSE2-NEXT: pand %xmm7, %xmm12692; SSE2-NEXT: paddb %xmm1, %xmm12693; SSE2-NEXT: por %xmm8, %xmm12694; SSE2-NEXT: movdqa %xmm2, %xmm82695; SSE2-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm4[8],xmm8[9],xmm4[9],xmm8[10],xmm4[10],xmm8[11],xmm4[11],xmm8[12],xmm4[12],xmm8[13],xmm4[13],xmm8[14],xmm4[14],xmm8[15],xmm4[15]2696; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm8[2,3,0,1]2697; SSE2-NEXT: pshuflw {{.*#+}} xmm8 = xmm8[3,2,1,0,4,5,6,7]2698; SSE2-NEXT: pshufhw {{.*#+}} xmm8 = xmm8[0,1,2,3,7,6,5,4]2699; 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]2700; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]2701; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]2702; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]2703; SSE2-NEXT: packuswb %xmm8, %xmm22704; SSE2-NEXT: movdqa %xmm2, %xmm82705; SSE2-NEXT: psrlw $4, %xmm82706; SSE2-NEXT: pand %xmm5, %xmm82707; SSE2-NEXT: pand %xmm5, %xmm22708; SSE2-NEXT: psllw $4, %xmm22709; SSE2-NEXT: por %xmm8, %xmm22710; SSE2-NEXT: movdqa %xmm2, %xmm82711; SSE2-NEXT: psrlw $2, %xmm82712; SSE2-NEXT: pand %xmm6, %xmm82713; SSE2-NEXT: pand %xmm6, %xmm22714; SSE2-NEXT: psllw $2, %xmm22715; SSE2-NEXT: por %xmm8, %xmm22716; SSE2-NEXT: movdqa %xmm2, %xmm82717; SSE2-NEXT: psrlw $1, %xmm82718; SSE2-NEXT: pand %xmm7, %xmm82719; SSE2-NEXT: pand %xmm7, %xmm22720; SSE2-NEXT: paddb %xmm2, %xmm22721; SSE2-NEXT: por %xmm8, %xmm22722; SSE2-NEXT: movdqa %xmm3, %xmm82723; SSE2-NEXT: punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm4[8],xmm8[9],xmm4[9],xmm8[10],xmm4[10],xmm8[11],xmm4[11],xmm8[12],xmm4[12],xmm8[13],xmm4[13],xmm8[14],xmm4[14],xmm8[15],xmm4[15]2724; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm8[2,3,0,1]2725; SSE2-NEXT: pshuflw {{.*#+}} xmm8 = xmm8[3,2,1,0,4,5,6,7]2726; SSE2-NEXT: pshufhw {{.*#+}} xmm8 = xmm8[0,1,2,3,7,6,5,4]2727; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]2728; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]2729; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7]2730; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4]2731; SSE2-NEXT: packuswb %xmm8, %xmm32732; SSE2-NEXT: movdqa %xmm3, %xmm42733; SSE2-NEXT: psrlw $4, %xmm42734; SSE2-NEXT: pand %xmm5, %xmm42735; SSE2-NEXT: pand %xmm5, %xmm32736; SSE2-NEXT: psllw $4, %xmm32737; SSE2-NEXT: por %xmm4, %xmm32738; SSE2-NEXT: movdqa %xmm3, %xmm42739; SSE2-NEXT: psrlw $2, %xmm42740; SSE2-NEXT: pand %xmm6, %xmm42741; SSE2-NEXT: pand %xmm6, %xmm32742; SSE2-NEXT: psllw $2, %xmm32743; SSE2-NEXT: por %xmm4, %xmm32744; SSE2-NEXT: movdqa %xmm3, %xmm42745; SSE2-NEXT: psrlw $1, %xmm42746; SSE2-NEXT: pand %xmm7, %xmm42747; SSE2-NEXT: pand %xmm7, %xmm32748; SSE2-NEXT: paddb %xmm3, %xmm32749; SSE2-NEXT: por %xmm4, %xmm32750; SSE2-NEXT: retq2751;2752; SSSE3-LABEL: test_bitreverse_v8i64:2753; SSSE3: # %bb.0:2754; SSSE3-NEXT: movdqa %xmm1, %xmm52755; SSSE3-NEXT: movdqa %xmm0, %xmm12756; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]2757; SSSE3-NEXT: pshufb %xmm8, %xmm12758; SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]2759; SSSE3-NEXT: movdqa %xmm1, %xmm02760; SSSE3-NEXT: pand %xmm7, %xmm02761; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]2762; SSSE3-NEXT: movdqa %xmm6, %xmm92763; SSSE3-NEXT: pshufb %xmm0, %xmm92764; SSSE3-NEXT: psrlw $4, %xmm12765; SSSE3-NEXT: pand %xmm7, %xmm12766; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]2767; SSSE3-NEXT: movdqa %xmm4, %xmm02768; SSSE3-NEXT: pshufb %xmm1, %xmm02769; SSSE3-NEXT: por %xmm9, %xmm02770; SSSE3-NEXT: pshufb %xmm8, %xmm52771; SSSE3-NEXT: movdqa %xmm5, %xmm12772; SSSE3-NEXT: pand %xmm7, %xmm12773; SSSE3-NEXT: movdqa %xmm6, %xmm92774; SSSE3-NEXT: pshufb %xmm1, %xmm92775; SSSE3-NEXT: psrlw $4, %xmm52776; SSSE3-NEXT: pand %xmm7, %xmm52777; SSSE3-NEXT: movdqa %xmm4, %xmm12778; SSSE3-NEXT: pshufb %xmm5, %xmm12779; SSSE3-NEXT: por %xmm9, %xmm12780; SSSE3-NEXT: pshufb %xmm8, %xmm22781; SSSE3-NEXT: movdqa %xmm2, %xmm52782; SSSE3-NEXT: pand %xmm7, %xmm52783; SSSE3-NEXT: movdqa %xmm6, %xmm92784; SSSE3-NEXT: pshufb %xmm5, %xmm92785; SSSE3-NEXT: psrlw $4, %xmm22786; SSSE3-NEXT: pand %xmm7, %xmm22787; SSSE3-NEXT: movdqa %xmm4, %xmm52788; SSSE3-NEXT: pshufb %xmm2, %xmm52789; SSSE3-NEXT: por %xmm9, %xmm52790; SSSE3-NEXT: pshufb %xmm8, %xmm32791; SSSE3-NEXT: movdqa %xmm3, %xmm22792; SSSE3-NEXT: pand %xmm7, %xmm22793; SSSE3-NEXT: pshufb %xmm2, %xmm62794; SSSE3-NEXT: psrlw $4, %xmm32795; SSSE3-NEXT: pand %xmm7, %xmm32796; SSSE3-NEXT: pshufb %xmm3, %xmm42797; SSSE3-NEXT: por %xmm6, %xmm42798; SSSE3-NEXT: movdqa %xmm5, %xmm22799; SSSE3-NEXT: movdqa %xmm4, %xmm32800; SSSE3-NEXT: retq2801;2802; AVX1-LABEL: test_bitreverse_v8i64:2803; AVX1: # %bb.0:2804; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm22805; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]2806; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm22807; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]2808; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm52809; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]2810; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm52811; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm22812; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm22813; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]2814; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm22815; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm22816; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm02817; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm52818; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm52819; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm02820; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm02821; AVX1-NEXT: vpshufb %xmm0, %xmm7, %xmm02822; AVX1-NEXT: vpor %xmm0, %xmm5, %xmm02823; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm02824; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm22825; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm22826; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm52827; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm52828; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm22829; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm22830; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm22831; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm22832; AVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm12833; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm32834; AVX1-NEXT: vpshufb %xmm3, %xmm6, %xmm32835; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm12836; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm12837; AVX1-NEXT: vpshufb %xmm1, %xmm7, %xmm12838; AVX1-NEXT: vpor %xmm1, %xmm3, %xmm12839; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm12840; AVX1-NEXT: retq2841;2842; AVX2-LABEL: test_bitreverse_v8i64:2843; AVX2: # %bb.0:2844; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]2845; AVX2-NEXT: # ymm2 = mem[0,1,0,1]2846; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm02847; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]2848; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm42849; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]2850; AVX2-NEXT: # ymm5 = mem[0,1,0,1]2851; AVX2-NEXT: vpshufb %ymm4, %ymm5, %ymm42852; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm02853; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm02854; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]2855; AVX2-NEXT: # ymm6 = mem[0,1,0,1]2856; AVX2-NEXT: vpshufb %ymm0, %ymm6, %ymm02857; AVX2-NEXT: vpor %ymm0, %ymm4, %ymm02858; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm12859; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm22860; AVX2-NEXT: vpshufb %ymm2, %ymm5, %ymm22861; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm12862; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm12863; AVX2-NEXT: vpshufb %ymm1, %ymm6, %ymm12864; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm12865; AVX2-NEXT: retq2866;2867; AVX512F-LABEL: test_bitreverse_v8i64:2868; AVX512F: # %bb.0:2869; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm12870; AVX512F-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]2871; AVX512F-NEXT: # ymm2 = mem[0,1,0,1]2872; AVX512F-NEXT: vpshufb %ymm2, %ymm1, %ymm12873; AVX512F-NEXT: vpbroadcastb {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]2874; AVX512F-NEXT: vpand %ymm3, %ymm1, %ymm42875; AVX512F-NEXT: vbroadcasti128 {{.*#+}} ymm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]2876; AVX512F-NEXT: # ymm5 = mem[0,1,0,1]2877; AVX512F-NEXT: vpshufb %ymm4, %ymm5, %ymm42878; AVX512F-NEXT: vpshufb %ymm2, %ymm0, %ymm02879; AVX512F-NEXT: vpand %ymm3, %ymm0, %ymm22880; AVX512F-NEXT: vpshufb %ymm2, %ymm5, %ymm22881; AVX512F-NEXT: vinserti64x4 $1, %ymm4, %zmm2, %zmm22882; AVX512F-NEXT: vpsrlw $4, %ymm1, %ymm12883; AVX512F-NEXT: vpand %ymm3, %ymm1, %ymm12884; AVX512F-NEXT: vbroadcasti128 {{.*#+}} ymm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]2885; AVX512F-NEXT: # ymm4 = mem[0,1,0,1]2886; AVX512F-NEXT: vpshufb %ymm1, %ymm4, %ymm12887; AVX512F-NEXT: vpsrlw $4, %ymm0, %ymm02888; AVX512F-NEXT: vpand %ymm3, %ymm0, %ymm02889; AVX512F-NEXT: vpshufb %ymm0, %ymm4, %ymm02890; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm02891; AVX512F-NEXT: vporq %zmm0, %zmm2, %zmm02892; AVX512F-NEXT: retq2893;2894; AVX512BW-LABEL: test_bitreverse_v8i64:2895; AVX512BW: # %bb.0:2896; AVX512BW-NEXT: vpshufb {{.*#+}} zmm0 = zmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24,39,38,37,36,35,34,33,32,47,46,45,44,43,42,41,40,55,54,53,52,51,50,49,48,63,62,61,60,59,58,57,56]2897; AVX512BW-NEXT: vpbroadcastb {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]2898; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm22899; AVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} zmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]2900; AVX512BW-NEXT: # zmm3 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]2901; AVX512BW-NEXT: vpshufb %zmm2, %zmm3, %zmm22902; AVX512BW-NEXT: vpsrlw $4, %zmm0, %zmm02903; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm02904; AVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} zmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]2905; AVX512BW-NEXT: # zmm1 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]2906; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm02907; AVX512BW-NEXT: vporq %zmm0, %zmm2, %zmm02908; AVX512BW-NEXT: retq2909;2910; XOPAVX1-LABEL: test_bitreverse_v8i64:2911; XOPAVX1: # %bb.0:2912; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm22913; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88]2914; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm22915; XOPAVX1-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm02916; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm02917; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm22918; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm22919; XOPAVX1-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm12920; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm12921; XOPAVX1-NEXT: retq2922;2923; XOPAVX2-LABEL: test_bitreverse_v8i64:2924; XOPAVX2: # %bb.0:2925; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm22926; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88]2927; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm22928; XOPAVX2-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm02929; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm02930; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm22931; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm22932; XOPAVX2-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm12933; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm12934; XOPAVX2-NEXT: retq2935;2936; GFNISSE2-LABEL: test_bitreverse_v8i64:2937; GFNISSE2: # %bb.0:2938; GFNISSE2-NEXT: pxor %xmm4, %xmm42939; GFNISSE2-NEXT: movdqa %xmm0, %xmm52940; GFNISSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm4[8],xmm5[9],xmm4[9],xmm5[10],xmm4[10],xmm5[11],xmm4[11],xmm5[12],xmm4[12],xmm5[13],xmm4[13],xmm5[14],xmm4[14],xmm5[15],xmm4[15]2941; GFNISSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,0,1]2942; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[3,2,1,0,4,5,6,7]2943; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,7,6,5,4]2944; GFNISSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]2945; GFNISSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]2946; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]2947; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]2948; GFNISSE2-NEXT: packuswb %xmm5, %xmm02949; GFNISSE2-NEXT: movdqa {{.*#+}} xmm5 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2950; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm5, %xmm02951; GFNISSE2-NEXT: movdqa %xmm1, %xmm62952; GFNISSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm4[8],xmm6[9],xmm4[9],xmm6[10],xmm4[10],xmm6[11],xmm4[11],xmm6[12],xmm4[12],xmm6[13],xmm4[13],xmm6[14],xmm4[14],xmm6[15],xmm4[15]2953; GFNISSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[2,3,0,1]2954; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7]2955; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4]2956; GFNISSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]2957; GFNISSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]2958; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7]2959; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4]2960; GFNISSE2-NEXT: packuswb %xmm6, %xmm12961; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm5, %xmm12962; GFNISSE2-NEXT: movdqa %xmm2, %xmm62963; GFNISSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm4[8],xmm6[9],xmm4[9],xmm6[10],xmm4[10],xmm6[11],xmm4[11],xmm6[12],xmm4[12],xmm6[13],xmm4[13],xmm6[14],xmm4[14],xmm6[15],xmm4[15]2964; GFNISSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[2,3,0,1]2965; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7]2966; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4]2967; GFNISSE2-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]2968; GFNISSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]2969; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]2970; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]2971; GFNISSE2-NEXT: packuswb %xmm6, %xmm22972; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm5, %xmm22973; GFNISSE2-NEXT: movdqa %xmm3, %xmm62974; GFNISSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm4[8],xmm6[9],xmm4[9],xmm6[10],xmm4[10],xmm6[11],xmm4[11],xmm6[12],xmm4[12],xmm6[13],xmm4[13],xmm6[14],xmm4[14],xmm6[15],xmm4[15]2975; GFNISSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[2,3,0,1]2976; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7]2977; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4]2978; GFNISSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]2979; GFNISSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]2980; GFNISSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7]2981; GFNISSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4]2982; GFNISSE2-NEXT: packuswb %xmm6, %xmm32983; GFNISSE2-NEXT: gf2p8affineqb $0, %xmm5, %xmm32984; GFNISSE2-NEXT: retq2985;2986; GFNISSSE3-LABEL: test_bitreverse_v8i64:2987; GFNISSSE3: # %bb.0:2988; GFNISSSE3-NEXT: movdqa {{.*#+}} xmm4 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]2989; GFNISSSE3-NEXT: pshufb %xmm4, %xmm02990; GFNISSSE3-NEXT: movdqa {{.*#+}} xmm5 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2991; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm5, %xmm02992; GFNISSSE3-NEXT: pshufb %xmm4, %xmm12993; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm5, %xmm12994; GFNISSSE3-NEXT: pshufb %xmm4, %xmm22995; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm5, %xmm22996; GFNISSSE3-NEXT: pshufb %xmm4, %xmm32997; GFNISSSE3-NEXT: gf2p8affineqb $0, %xmm5, %xmm32998; GFNISSSE3-NEXT: retq2999;3000; GFNIAVX1-LABEL: test_bitreverse_v8i64:3001; GFNIAVX1: # %bb.0:3002; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm23003; GFNIAVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]3004; GFNIAVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm23005; GFNIAVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm03006; GFNIAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm03007; GFNIAVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]3008; GFNIAVX1-NEXT: vgf2p8affineqb $0, %ymm2, %ymm0, %ymm03009; GFNIAVX1-NEXT: vextractf128 $1, %ymm1, %xmm43010; GFNIAVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm43011; GFNIAVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm13012; GFNIAVX1-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm13013; GFNIAVX1-NEXT: vgf2p8affineqb $0, %ymm2, %ymm1, %ymm13014; GFNIAVX1-NEXT: retq3015;3016; GFNIAVX2-LABEL: test_bitreverse_v8i64:3017; GFNIAVX2: # %bb.0:3018; GFNIAVX2-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]3019; GFNIAVX2-NEXT: # ymm2 = mem[0,1,0,1]3020; GFNIAVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm03021; GFNIAVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]3022; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm3, %ymm0, %ymm03023; GFNIAVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm13024; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm3, %ymm1, %ymm13025; GFNIAVX2-NEXT: retq3026;3027; GFNIAVX512F-LABEL: test_bitreverse_v8i64:3028; GFNIAVX512F: # %bb.0:3029; GFNIAVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm13030; GFNIAVX512F-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]3031; GFNIAVX512F-NEXT: # ymm2 = mem[0,1,0,1]3032; GFNIAVX512F-NEXT: vpshufb %ymm2, %ymm1, %ymm13033; GFNIAVX512F-NEXT: vpshufb %ymm2, %ymm0, %ymm03034; GFNIAVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm03035; GFNIAVX512F-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm03036; GFNIAVX512F-NEXT: retq3037;3038; GFNIAVX512BW-LABEL: test_bitreverse_v8i64:3039; GFNIAVX512BW: # %bb.0:3040; GFNIAVX512BW-NEXT: vpshufb {{.*#+}} zmm0 = zmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24,39,38,37,36,35,34,33,32,47,46,45,44,43,42,41,40,55,54,53,52,51,50,49,48,63,62,61,60,59,58,57,56]3041; GFNIAVX512BW-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm03042; GFNIAVX512BW-NEXT: retq3043 %b = call <8 x i64> @llvm.bitreverse.v8i64(<8 x i64> %a)3044 ret <8 x i64> %b3045}3046 3047;3048; Constant Folding3049;3050 3051define i32 @fold_bitreverse_i32() nounwind {3052; ALL-LABEL: fold_bitreverse_i32:3053; ALL: # %bb.0:3054; ALL-NEXT: movl $16711935, %eax # imm = 0xFF00FF3055; ALL-NEXT: retq3056 %b = call i32 @llvm.bitreverse.i32(i32 4278255360)3057 ret i32 %b3058}3059 3060define <16 x i8> @fold_bitreverse_v16i8() nounwind {3061; SSE-LABEL: fold_bitreverse_v16i8:3062; SSE: # %bb.0:3063; SSE-NEXT: movaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]3064; SSE-NEXT: retq3065;3066; AVX-LABEL: fold_bitreverse_v16i8:3067; AVX: # %bb.0:3068; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]3069; AVX-NEXT: retq3070;3071; XOP-LABEL: fold_bitreverse_v16i8:3072; XOP: # %bb.0:3073; XOP-NEXT: vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]3074; XOP-NEXT: retq3075;3076; GFNISSE-LABEL: fold_bitreverse_v16i8:3077; GFNISSE: # %bb.0:3078; GFNISSE-NEXT: movaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]3079; GFNISSE-NEXT: retq3080;3081; GFNIAVX-LABEL: fold_bitreverse_v16i8:3082; GFNIAVX: # %bb.0:3083; GFNIAVX-NEXT: vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143]3084; GFNIAVX-NEXT: retq3085 %b = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> <i8 0, i8 -1, i8 2, i8 -3, i8 4, i8 -5, i8 6, i8 -7, i8 8, i8 -9, i8 10, i8 -11, i8 12, i8 -13, i8 14, i8 -15>)3086 ret <16 x i8> %b3087}3088 3089define <16 x i16> @fold_bitreverse_v16i16() nounwind {3090; SSE-LABEL: fold_bitreverse_v16i16:3091; SSE: # %bb.0:3092; SSE-NEXT: movaps {{.*#+}} xmm0 = [0,65535,16384,49151,8192,57343,24576,40959]3093; SSE-NEXT: movaps {{.*#+}} xmm1 = [4096,61439,20480,45055,12288,53247,28672,36863]3094; SSE-NEXT: retq3095;3096; AVX-LABEL: fold_bitreverse_v16i16:3097; AVX: # %bb.0:3098; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863]3099; AVX-NEXT: retq3100;3101; XOP-LABEL: fold_bitreverse_v16i16:3102; XOP: # %bb.0:3103; XOP-NEXT: vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863]3104; XOP-NEXT: retq3105;3106; GFNISSE-LABEL: fold_bitreverse_v16i16:3107; GFNISSE: # %bb.0:3108; GFNISSE-NEXT: movaps {{.*#+}} xmm0 = [0,65535,16384,49151,8192,57343,24576,40959]3109; GFNISSE-NEXT: movaps {{.*#+}} xmm1 = [4096,61439,20480,45055,12288,53247,28672,36863]3110; GFNISSE-NEXT: retq3111;3112; GFNIAVX-LABEL: fold_bitreverse_v16i16:3113; GFNIAVX: # %bb.0:3114; GFNIAVX-NEXT: vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863]3115; GFNIAVX-NEXT: retq3116 %b = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> <i16 0, i16 -1, i16 2, i16 -3, i16 4, i16 -5, i16 6, i16 -7, i16 8, i16 -9, i16 10, i16 -11, i16 12, i16 -13, i16 14, i16 -15>)3117 ret <16 x i16> %b3118}3119 3120define <16 x i32> @fold_bitreverse_v16i32() nounwind {3121; SSE-LABEL: fold_bitreverse_v16i32:3122; SSE: # %bb.0:3123; SSE-NEXT: movaps {{.*#+}} xmm0 = [0,4294967295,1073741824,3221225471]3124; SSE-NEXT: movaps {{.*#+}} xmm1 = [536870912,3758096383,1610612736,2684354559]3125; SSE-NEXT: movaps {{.*#+}} xmm2 = [268435456,4026531839,1342177280,2952790015]3126; SSE-NEXT: movaps {{.*#+}} xmm3 = [805306368,3489660927,1879048192,2415919103]3127; SSE-NEXT: retq3128;3129; AVX1-LABEL: fold_bitreverse_v16i32:3130; AVX1: # %bb.0:3131; AVX1-NEXT: vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559]3132; AVX1-NEXT: vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]3133; AVX1-NEXT: retq3134;3135; AVX2-LABEL: fold_bitreverse_v16i32:3136; AVX2: # %bb.0:3137; AVX2-NEXT: vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559]3138; AVX2-NEXT: vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]3139; AVX2-NEXT: retq3140;3141; AVX512-LABEL: fold_bitreverse_v16i32:3142; AVX512: # %bb.0:3143; AVX512-NEXT: vmovaps {{.*#+}} zmm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559,268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]3144; AVX512-NEXT: retq3145;3146; XOP-LABEL: fold_bitreverse_v16i32:3147; XOP: # %bb.0:3148; XOP-NEXT: vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559]3149; XOP-NEXT: vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]3150; XOP-NEXT: retq3151;3152; GFNISSE-LABEL: fold_bitreverse_v16i32:3153; GFNISSE: # %bb.0:3154; GFNISSE-NEXT: movaps {{.*#+}} xmm0 = [0,4294967295,1073741824,3221225471]3155; GFNISSE-NEXT: movaps {{.*#+}} xmm1 = [536870912,3758096383,1610612736,2684354559]3156; GFNISSE-NEXT: movaps {{.*#+}} xmm2 = [268435456,4026531839,1342177280,2952790015]3157; GFNISSE-NEXT: movaps {{.*#+}} xmm3 = [805306368,3489660927,1879048192,2415919103]3158; GFNISSE-NEXT: retq3159;3160; GFNIAVX1-LABEL: fold_bitreverse_v16i32:3161; GFNIAVX1: # %bb.0:3162; GFNIAVX1-NEXT: vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559]3163; GFNIAVX1-NEXT: vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]3164; GFNIAVX1-NEXT: retq3165;3166; GFNIAVX2-LABEL: fold_bitreverse_v16i32:3167; GFNIAVX2: # %bb.0:3168; GFNIAVX2-NEXT: vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559]3169; GFNIAVX2-NEXT: vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]3170; GFNIAVX2-NEXT: retq3171;3172; GFNIAVX512-LABEL: fold_bitreverse_v16i32:3173; GFNIAVX512: # %bb.0:3174; GFNIAVX512-NEXT: vmovaps {{.*#+}} zmm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559,268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103]3175; GFNIAVX512-NEXT: retq3176 %b = call <16 x i32> @llvm.bitreverse.v16i32(<16 x i32> <i32 0, i32 -1, i32 2, i32 -3, i32 4, i32 -5, i32 6, i32 -7, i32 8, i32 -9, i32 10, i32 -11, i32 12, i32 -13, i32 14, i32 -15>)3177 ret <16 x i32> %b3178}3179 3180declare i8 @llvm.bitreverse.i8(i8) readnone3181declare i16 @llvm.bitreverse.i16(i16) readnone3182declare i32 @llvm.bitreverse.i32(i32) readnone3183declare i64 @llvm.bitreverse.i64(i64) readnone3184 3185declare <16 x i8> @llvm.bitreverse.v16i8(<16 x i8>) readnone3186declare <8 x i16> @llvm.bitreverse.v8i16(<8 x i16>) readnone3187declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>) readnone3188declare <2 x i64> @llvm.bitreverse.v2i64(<2 x i64>) readnone3189 3190declare <32 x i8> @llvm.bitreverse.v32i8(<32 x i8>) readnone3191declare <16 x i16> @llvm.bitreverse.v16i16(<16 x i16>) readnone3192declare <8 x i32> @llvm.bitreverse.v8i32(<8 x i32>) readnone3193declare <4 x i64> @llvm.bitreverse.v4i64(<4 x i64>) readnone3194 3195declare <64 x i8> @llvm.bitreverse.v64i8(<64 x i8>) readnone3196declare <32 x i16> @llvm.bitreverse.v32i16(<32 x i16>) readnone3197declare <16 x i32> @llvm.bitreverse.v16i32(<16 x i32>) readnone3198declare <8 x i64> @llvm.bitreverse.v8i64(<8 x i64>) readnone3199