1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSSE3 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512BW 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1 9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2 10 11; Make sure we don't crash with avx512bw and xop 12; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx512bw 13 14define i8 @test_bitreverse_i8(i8 %a) nounwind { 15; SSE-LABEL: test_bitreverse_i8: 16; SSE: # %bb.0: 17; SSE-NEXT: # kill: def $edi killed $edi def $rdi 18; SSE-NEXT: rolb $4, %dil 19; SSE-NEXT: movl %edi, %eax 20; SSE-NEXT: andb $51, %al 21; SSE-NEXT: shlb $2, %al 22; SSE-NEXT: andb $-52, %dil 23; SSE-NEXT: shrb $2, %dil 24; SSE-NEXT: orb %al, %dil 25; SSE-NEXT: movl %edi, %eax 26; SSE-NEXT: andb $85, %al 27; SSE-NEXT: addb %al, %al 28; SSE-NEXT: andb $-86, %dil 29; SSE-NEXT: shrb %dil 30; SSE-NEXT: leal (%rdi,%rax), %eax 31; SSE-NEXT: # kill: def $al killed $al killed $eax 32; SSE-NEXT: retq 33; 34; AVX-LABEL: test_bitreverse_i8: 35; AVX: # %bb.0: 36; AVX-NEXT: # kill: def $edi killed $edi def $rdi 37; AVX-NEXT: rolb $4, %dil 38; AVX-NEXT: movl %edi, %eax 39; AVX-NEXT: andb $51, %al 40; AVX-NEXT: shlb $2, %al 41; AVX-NEXT: andb $-52, %dil 42; AVX-NEXT: shrb $2, %dil 43; AVX-NEXT: orb %al, %dil 44; AVX-NEXT: movl %edi, %eax 45; AVX-NEXT: andb $85, %al 46; AVX-NEXT: addb %al, %al 47; AVX-NEXT: andb $-86, %dil 48; AVX-NEXT: shrb %dil 49; AVX-NEXT: leal (%rdi,%rax), %eax 50; AVX-NEXT: # kill: def $al killed $al killed $eax 51; AVX-NEXT: retq 52; 53; XOP-LABEL: test_bitreverse_i8: 54; XOP: # %bb.0: 55; XOP-NEXT: vmovd %edi, %xmm0 56; XOP-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0 57; XOP-NEXT: vpextrb $0, %xmm0, %eax 58; XOP-NEXT: # kill: def $al killed $al killed $eax 59; XOP-NEXT: retq 60 %b = call i8 @llvm.bitreverse.i8(i8 %a) 61 ret i8 %b 62} 63 64define i16 @test_bitreverse_i16(i16 %a) nounwind { 65; SSE-LABEL: test_bitreverse_i16: 66; SSE: # %bb.0: 67; SSE-NEXT: # kill: def $edi killed $edi def $rdi 68; SSE-NEXT: rolw $8, %di 69; SSE-NEXT: movl %edi, %eax 70; SSE-NEXT: andl $3855, %eax # imm = 0xF0F 71; SSE-NEXT: shll $4, %eax 72; SSE-NEXT: andl $61680, %edi # imm = 0xF0F0 73; SSE-NEXT: shrl $4, %edi 74; SSE-NEXT: orl %eax, %edi 75; SSE-NEXT: movl %edi, %eax 76; SSE-NEXT: andl $13107, %eax # imm = 0x3333 77; SSE-NEXT: andl $52428, %edi # imm = 0xCCCC 78; SSE-NEXT: shrl $2, %edi 79; SSE-NEXT: leal (%rdi,%rax,4), %eax 80; SSE-NEXT: movl %eax, %ecx 81; SSE-NEXT: andl $21845, %ecx # imm = 0x5555 82; SSE-NEXT: andl $43690, %eax # imm = 0xAAAA 83; SSE-NEXT: shrl %eax 84; SSE-NEXT: leal (%rax,%rcx,2), %eax 85; SSE-NEXT: # kill: def $ax killed $ax killed $eax 86; SSE-NEXT: retq 87; 88; AVX-LABEL: test_bitreverse_i16: 89; AVX: # %bb.0: 90; AVX-NEXT: # kill: def $edi killed $edi def $rdi 91; AVX-NEXT: rolw $8, %di 92; AVX-NEXT: movl %edi, %eax 93; AVX-NEXT: andl $3855, %eax # imm = 0xF0F 94; AVX-NEXT: shll $4, %eax 95; AVX-NEXT: andl $61680, %edi # imm = 0xF0F0 96; AVX-NEXT: shrl $4, %edi 97; AVX-NEXT: orl %eax, %edi 98; AVX-NEXT: movl %edi, %eax 99; AVX-NEXT: andl $13107, %eax # imm = 0x3333 100; AVX-NEXT: andl $52428, %edi # imm = 0xCCCC 101; AVX-NEXT: shrl $2, %edi 102; AVX-NEXT: leal (%rdi,%rax,4), %eax 103; AVX-NEXT: movl %eax, %ecx 104; AVX-NEXT: andl $21845, %ecx # imm = 0x5555 105; AVX-NEXT: andl $43690, %eax # imm = 0xAAAA 106; AVX-NEXT: shrl %eax 107; AVX-NEXT: leal (%rax,%rcx,2), %eax 108; AVX-NEXT: # kill: def $ax killed $ax killed $eax 109; AVX-NEXT: retq 110; 111; XOP-LABEL: test_bitreverse_i16: 112; XOP: # %bb.0: 113; XOP-NEXT: vmovd %edi, %xmm0 114; XOP-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0 115; XOP-NEXT: vmovd %xmm0, %eax 116; XOP-NEXT: # kill: def $ax killed $ax killed $eax 117; XOP-NEXT: retq 118 %b = call i16 @llvm.bitreverse.i16(i16 %a) 119 ret i16 %b 120} 121 122define i32 @test_bitreverse_i32(i32 %a) nounwind { 123; SSE-LABEL: test_bitreverse_i32: 124; SSE: # %bb.0: 125; SSE-NEXT: # kill: def $edi killed $edi def $rdi 126; SSE-NEXT: bswapl %edi 127; SSE-NEXT: movl %edi, %eax 128; SSE-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F 129; SSE-NEXT: shll $4, %eax 130; SSE-NEXT: andl $-252645136, %edi # imm = 0xF0F0F0F0 131; SSE-NEXT: shrl $4, %edi 132; SSE-NEXT: orl %eax, %edi 133; SSE-NEXT: movl %edi, %eax 134; SSE-NEXT: andl $858993459, %eax # imm = 0x33333333 135; SSE-NEXT: andl $-858993460, %edi # imm = 0xCCCCCCCC 136; SSE-NEXT: shrl $2, %edi 137; SSE-NEXT: leal (%rdi,%rax,4), %eax 138; SSE-NEXT: movl %eax, %ecx 139; SSE-NEXT: andl $1431655765, %ecx # imm = 0x55555555 140; SSE-NEXT: andl $-1431655766, %eax # imm = 0xAAAAAAAA 141; SSE-NEXT: shrl %eax 142; SSE-NEXT: leal (%rax,%rcx,2), %eax 143; SSE-NEXT: retq 144; 145; AVX-LABEL: test_bitreverse_i32: 146; AVX: # %bb.0: 147; AVX-NEXT: # kill: def $edi killed $edi def $rdi 148; AVX-NEXT: bswapl %edi 149; AVX-NEXT: movl %edi, %eax 150; AVX-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F 151; AVX-NEXT: shll $4, %eax 152; AVX-NEXT: andl $-252645136, %edi # imm = 0xF0F0F0F0 153; AVX-NEXT: shrl $4, %edi 154; AVX-NEXT: orl %eax, %edi 155; AVX-NEXT: movl %edi, %eax 156; AVX-NEXT: andl $858993459, %eax # imm = 0x33333333 157; AVX-NEXT: andl $-858993460, %edi # imm = 0xCCCCCCCC 158; AVX-NEXT: shrl $2, %edi 159; AVX-NEXT: leal (%rdi,%rax,4), %eax 160; AVX-NEXT: movl %eax, %ecx 161; AVX-NEXT: andl $1431655765, %ecx # imm = 0x55555555 162; AVX-NEXT: andl $-1431655766, %eax # imm = 0xAAAAAAAA 163; AVX-NEXT: shrl %eax 164; AVX-NEXT: leal (%rax,%rcx,2), %eax 165; AVX-NEXT: retq 166; 167; XOP-LABEL: test_bitreverse_i32: 168; XOP: # %bb.0: 169; XOP-NEXT: vmovd %edi, %xmm0 170; XOP-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0 171; XOP-NEXT: vmovd %xmm0, %eax 172; XOP-NEXT: retq 173 %b = call i32 @llvm.bitreverse.i32(i32 %a) 174 ret i32 %b 175} 176 177define i64 @test_bitreverse_i64(i64 %a) nounwind { 178; SSE-LABEL: test_bitreverse_i64: 179; SSE: # %bb.0: 180; SSE-NEXT: bswapq %rdi 181; SSE-NEXT: movabsq $1085102592571150095, %rax # imm = 0xF0F0F0F0F0F0F0F 182; SSE-NEXT: andq %rdi, %rax 183; SSE-NEXT: shlq $4, %rax 184; SSE-NEXT: movabsq $-1085102592571150096, %rcx # imm = 0xF0F0F0F0F0F0F0F0 185; SSE-NEXT: andq %rdi, %rcx 186; SSE-NEXT: shrq $4, %rcx 187; SSE-NEXT: orq %rax, %rcx 188; SSE-NEXT: movabsq $3689348814741910323, %rax # imm = 0x3333333333333333 189; SSE-NEXT: andq %rcx, %rax 190; SSE-NEXT: movabsq $-3689348814741910324, %rdx # imm = 0xCCCCCCCCCCCCCCCC 191; SSE-NEXT: andq %rcx, %rdx 192; SSE-NEXT: shrq $2, %rdx 193; SSE-NEXT: leaq (%rdx,%rax,4), %rax 194; SSE-NEXT: movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555 195; SSE-NEXT: andq %rax, %rcx 196; SSE-NEXT: movabsq $-6148914691236517206, %rdx # imm = 0xAAAAAAAAAAAAAAAA 197; SSE-NEXT: andq %rax, %rdx 198; SSE-NEXT: shrq %rdx 199; SSE-NEXT: leaq (%rdx,%rcx,2), %rax 200; SSE-NEXT: retq 201; 202; AVX-LABEL: test_bitreverse_i64: 203; AVX: # %bb.0: 204; AVX-NEXT: bswapq %rdi 205; AVX-NEXT: movabsq $1085102592571150095, %rax # imm = 0xF0F0F0F0F0F0F0F 206; AVX-NEXT: andq %rdi, %rax 207; AVX-NEXT: shlq $4, %rax 208; AVX-NEXT: movabsq $-1085102592571150096, %rcx # imm = 0xF0F0F0F0F0F0F0F0 209; AVX-NEXT: andq %rdi, %rcx 210; AVX-NEXT: shrq $4, %rcx 211; AVX-NEXT: orq %rax, %rcx 212; AVX-NEXT: movabsq $3689348814741910323, %rax # imm = 0x3333333333333333 213; AVX-NEXT: andq %rcx, %rax 214; AVX-NEXT: movabsq $-3689348814741910324, %rdx # imm = 0xCCCCCCCCCCCCCCCC 215; AVX-NEXT: andq %rcx, %rdx 216; AVX-NEXT: shrq $2, %rdx 217; AVX-NEXT: leaq (%rdx,%rax,4), %rax 218; AVX-NEXT: movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555 219; AVX-NEXT: andq %rax, %rcx 220; AVX-NEXT: movabsq $-6148914691236517206, %rdx # imm = 0xAAAAAAAAAAAAAAAA 221; AVX-NEXT: andq %rax, %rdx 222; AVX-NEXT: shrq %rdx 223; AVX-NEXT: leaq (%rdx,%rcx,2), %rax 224; AVX-NEXT: retq 225; 226; XOP-LABEL: test_bitreverse_i64: 227; XOP: # %bb.0: 228; XOP-NEXT: vmovq %rdi, %xmm0 229; XOP-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0 230; XOP-NEXT: vmovq %xmm0, %rax 231; XOP-NEXT: retq 232 %b = call i64 @llvm.bitreverse.i64(i64 %a) 233 ret i64 %b 234} 235 236define <16 x i8> @test_bitreverse_v16i8(<16 x i8> %a) nounwind { 237; SSE2-LABEL: test_bitreverse_v16i8: 238; SSE2: # %bb.0: 239; SSE2-NEXT: movdqa %xmm0, %xmm1 240; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 241; SSE2-NEXT: movdqa %xmm1, %xmm2 242; SSE2-NEXT: pand %xmm0, %xmm2 243; SSE2-NEXT: psllw $4, %xmm2 244; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 245; SSE2-NEXT: psrlw $4, %xmm1 246; SSE2-NEXT: pand %xmm0, %xmm1 247; SSE2-NEXT: pandn %xmm2, %xmm0 248; SSE2-NEXT: por %xmm1, %xmm0 249; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 250; SSE2-NEXT: pand %xmm0, %xmm1 251; SSE2-NEXT: psllw $2, %xmm1 252; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 253; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 254; SSE2-NEXT: psrlw $2, %xmm0 255; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 256; SSE2-NEXT: por %xmm1, %xmm0 257; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 258; SSE2-NEXT: pand %xmm0, %xmm1 259; SSE2-NEXT: paddb %xmm1, %xmm1 260; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 261; SSE2-NEXT: psrlw $1, %xmm0 262; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 263; SSE2-NEXT: por %xmm1, %xmm0 264; SSE2-NEXT: retq 265; 266; SSSE3-LABEL: test_bitreverse_v16i8: 267; SSSE3: # %bb.0: 268; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 269; SSSE3-NEXT: movdqa %xmm0, %xmm2 270; SSSE3-NEXT: pand %xmm1, %xmm2 271; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 272; SSSE3-NEXT: pshufb %xmm2, %xmm3 273; SSSE3-NEXT: psrlw $4, %xmm0 274; SSSE3-NEXT: pand %xmm1, %xmm0 275; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 276; SSSE3-NEXT: pshufb %xmm0, %xmm1 277; SSSE3-NEXT: por %xmm3, %xmm1 278; SSSE3-NEXT: movdqa %xmm1, %xmm0 279; SSSE3-NEXT: retq 280; 281; AVX-LABEL: test_bitreverse_v16i8: 282; AVX: # %bb.0: 283; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 284; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 285; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 286; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 287; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0 288; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 289; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 290; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0 291; AVX-NEXT: vpor %xmm0, %xmm2, %xmm0 292; AVX-NEXT: retq 293; 294; XOP-LABEL: test_bitreverse_v16i8: 295; XOP: # %bb.0: 296; XOP-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0 297; XOP-NEXT: retq 298 %b = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> %a) 299 ret <16 x i8> %b 300} 301 302define <8 x i16> @test_bitreverse_v8i16(<8 x i16> %a) nounwind { 303; SSE2-LABEL: test_bitreverse_v8i16: 304; SSE2: # %bb.0: 305; SSE2-NEXT: pxor %xmm1, %xmm1 306; SSE2-NEXT: movdqa %xmm0, %xmm2 307; 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] 308; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[1,0,3,2,4,5,6,7] 309; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,4,7,6] 310; 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] 311; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7] 312; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm0[0,1,2,3,5,4,7,6] 313; SSE2-NEXT: packuswb %xmm2, %xmm1 314; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 315; SSE2-NEXT: movdqa %xmm1, %xmm2 316; SSE2-NEXT: pand %xmm0, %xmm2 317; SSE2-NEXT: psllw $4, %xmm2 318; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 319; SSE2-NEXT: psrlw $4, %xmm1 320; SSE2-NEXT: pand %xmm0, %xmm1 321; SSE2-NEXT: pandn %xmm2, %xmm0 322; SSE2-NEXT: por %xmm1, %xmm0 323; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 324; SSE2-NEXT: pand %xmm0, %xmm1 325; SSE2-NEXT: psllw $2, %xmm1 326; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 327; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 328; SSE2-NEXT: psrlw $2, %xmm0 329; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 330; SSE2-NEXT: por %xmm1, %xmm0 331; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 332; SSE2-NEXT: pand %xmm0, %xmm1 333; SSE2-NEXT: paddb %xmm1, %xmm1 334; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 335; SSE2-NEXT: psrlw $1, %xmm0 336; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 337; SSE2-NEXT: por %xmm1, %xmm0 338; SSE2-NEXT: retq 339; 340; SSSE3-LABEL: test_bitreverse_v8i16: 341; SSSE3: # %bb.0: 342; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 343; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 344; SSSE3-NEXT: movdqa %xmm0, %xmm2 345; SSSE3-NEXT: pand %xmm1, %xmm2 346; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 347; SSSE3-NEXT: pshufb %xmm2, %xmm3 348; SSSE3-NEXT: psrlw $4, %xmm0 349; SSSE3-NEXT: pand %xmm1, %xmm0 350; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 351; SSSE3-NEXT: pshufb %xmm0, %xmm1 352; SSSE3-NEXT: por %xmm3, %xmm1 353; SSSE3-NEXT: movdqa %xmm1, %xmm0 354; SSSE3-NEXT: retq 355; 356; AVX-LABEL: test_bitreverse_v8i16: 357; AVX: # %bb.0: 358; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 359; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 360; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 361; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 362; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 363; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0 364; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 365; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 366; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0 367; AVX-NEXT: vpor %xmm0, %xmm2, %xmm0 368; AVX-NEXT: retq 369; 370; XOP-LABEL: test_bitreverse_v8i16: 371; XOP: # %bb.0: 372; XOP-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0 373; XOP-NEXT: retq 374 %b = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a) 375 ret <8 x i16> %b 376} 377 378define <4 x i32> @test_bitreverse_v4i32(<4 x i32> %a) nounwind { 379; SSE2-LABEL: test_bitreverse_v4i32: 380; SSE2: # %bb.0: 381; SSE2-NEXT: pxor %xmm1, %xmm1 382; SSE2-NEXT: movdqa %xmm0, %xmm2 383; 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] 384; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7] 385; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4] 386; 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] 387; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 388; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm0[0,1,2,3,7,6,5,4] 389; SSE2-NEXT: packuswb %xmm2, %xmm1 390; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 391; SSE2-NEXT: movdqa %xmm1, %xmm2 392; SSE2-NEXT: pand %xmm0, %xmm2 393; SSE2-NEXT: psllw $4, %xmm2 394; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 395; SSE2-NEXT: psrlw $4, %xmm1 396; SSE2-NEXT: pand %xmm0, %xmm1 397; SSE2-NEXT: pandn %xmm2, %xmm0 398; SSE2-NEXT: por %xmm1, %xmm0 399; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 400; SSE2-NEXT: pand %xmm0, %xmm1 401; SSE2-NEXT: psllw $2, %xmm1 402; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 403; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 404; SSE2-NEXT: psrlw $2, %xmm0 405; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 406; SSE2-NEXT: por %xmm1, %xmm0 407; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 408; SSE2-NEXT: pand %xmm0, %xmm1 409; SSE2-NEXT: paddb %xmm1, %xmm1 410; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 411; SSE2-NEXT: psrlw $1, %xmm0 412; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 413; SSE2-NEXT: por %xmm1, %xmm0 414; SSE2-NEXT: retq 415; 416; SSSE3-LABEL: test_bitreverse_v4i32: 417; SSSE3: # %bb.0: 418; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 419; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 420; SSSE3-NEXT: movdqa %xmm0, %xmm2 421; SSSE3-NEXT: pand %xmm1, %xmm2 422; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 423; SSSE3-NEXT: pshufb %xmm2, %xmm3 424; SSSE3-NEXT: psrlw $4, %xmm0 425; SSSE3-NEXT: pand %xmm1, %xmm0 426; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 427; SSSE3-NEXT: pshufb %xmm0, %xmm1 428; SSSE3-NEXT: por %xmm3, %xmm1 429; SSSE3-NEXT: movdqa %xmm1, %xmm0 430; SSSE3-NEXT: retq 431; 432; AVX-LABEL: test_bitreverse_v4i32: 433; AVX: # %bb.0: 434; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 435; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 436; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 437; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 438; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 439; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0 440; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 441; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 442; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0 443; AVX-NEXT: vpor %xmm0, %xmm2, %xmm0 444; AVX-NEXT: retq 445; 446; XOP-LABEL: test_bitreverse_v4i32: 447; XOP: # %bb.0: 448; XOP-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0 449; XOP-NEXT: retq 450 %b = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %a) 451 ret <4 x i32> %b 452} 453 454define <2 x i64> @test_bitreverse_v2i64(<2 x i64> %a) nounwind { 455; SSE2-LABEL: test_bitreverse_v2i64: 456; SSE2: # %bb.0: 457; SSE2-NEXT: pxor %xmm1, %xmm1 458; SSE2-NEXT: movdqa %xmm0, %xmm2 459; 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] 460; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1] 461; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7] 462; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4] 463; 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] 464; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 465; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 466; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm0[0,1,2,3,7,6,5,4] 467; SSE2-NEXT: packuswb %xmm2, %xmm1 468; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 469; SSE2-NEXT: movdqa %xmm1, %xmm2 470; SSE2-NEXT: pand %xmm0, %xmm2 471; SSE2-NEXT: psllw $4, %xmm2 472; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 473; SSE2-NEXT: psrlw $4, %xmm1 474; SSE2-NEXT: pand %xmm0, %xmm1 475; SSE2-NEXT: pandn %xmm2, %xmm0 476; SSE2-NEXT: por %xmm1, %xmm0 477; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 478; SSE2-NEXT: pand %xmm0, %xmm1 479; SSE2-NEXT: psllw $2, %xmm1 480; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 481; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 482; SSE2-NEXT: psrlw $2, %xmm0 483; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 484; SSE2-NEXT: por %xmm1, %xmm0 485; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 486; SSE2-NEXT: pand %xmm0, %xmm1 487; SSE2-NEXT: paddb %xmm1, %xmm1 488; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 489; SSE2-NEXT: psrlw $1, %xmm0 490; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 491; SSE2-NEXT: por %xmm1, %xmm0 492; SSE2-NEXT: retq 493; 494; SSSE3-LABEL: test_bitreverse_v2i64: 495; SSSE3: # %bb.0: 496; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 497; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 498; SSSE3-NEXT: movdqa %xmm0, %xmm2 499; SSSE3-NEXT: pand %xmm1, %xmm2 500; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 501; SSSE3-NEXT: pshufb %xmm2, %xmm3 502; SSSE3-NEXT: psrlw $4, %xmm0 503; SSSE3-NEXT: pand %xmm1, %xmm0 504; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 505; SSSE3-NEXT: pshufb %xmm0, %xmm1 506; SSSE3-NEXT: por %xmm3, %xmm1 507; SSSE3-NEXT: movdqa %xmm1, %xmm0 508; SSSE3-NEXT: retq 509; 510; AVX-LABEL: test_bitreverse_v2i64: 511; AVX: # %bb.0: 512; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 513; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 514; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 515; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 516; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 517; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0 518; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 519; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 520; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0 521; AVX-NEXT: vpor %xmm0, %xmm2, %xmm0 522; AVX-NEXT: retq 523; 524; XOP-LABEL: test_bitreverse_v2i64: 525; XOP: # %bb.0: 526; XOP-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0 527; XOP-NEXT: retq 528 %b = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %a) 529 ret <2 x i64> %b 530} 531 532define <32 x i8> @test_bitreverse_v32i8(<32 x i8> %a) nounwind { 533; SSE2-LABEL: test_bitreverse_v32i8: 534; SSE2: # %bb.0: 535; SSE2-NEXT: movdqa %xmm1, %xmm2 536; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 537; SSE2-NEXT: movdqa %xmm0, %xmm3 538; SSE2-NEXT: pand %xmm1, %xmm3 539; SSE2-NEXT: psllw $4, %xmm3 540; SSE2-NEXT: movdqa %xmm1, %xmm4 541; SSE2-NEXT: pandn %xmm3, %xmm4 542; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 543; SSE2-NEXT: pand %xmm8, %xmm0 544; SSE2-NEXT: psrlw $4, %xmm0 545; SSE2-NEXT: pand %xmm1, %xmm0 546; SSE2-NEXT: por %xmm4, %xmm0 547; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 548; SSE2-NEXT: movdqa %xmm0, %xmm4 549; SSE2-NEXT: pand %xmm3, %xmm4 550; SSE2-NEXT: psllw $2, %xmm4 551; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252] 552; SSE2-NEXT: pand %xmm9, %xmm4 553; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204] 554; SSE2-NEXT: pand %xmm10, %xmm0 555; SSE2-NEXT: psrlw $2, %xmm0 556; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63] 557; SSE2-NEXT: pand %xmm11, %xmm0 558; SSE2-NEXT: por %xmm4, %xmm0 559; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170] 560; SSE2-NEXT: movdqa %xmm0, %xmm5 561; SSE2-NEXT: pand %xmm4, %xmm5 562; SSE2-NEXT: psrlw $1, %xmm5 563; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 564; SSE2-NEXT: pand %xmm6, %xmm5 565; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 566; SSE2-NEXT: pand %xmm7, %xmm0 567; SSE2-NEXT: paddb %xmm0, %xmm0 568; SSE2-NEXT: por %xmm5, %xmm0 569; SSE2-NEXT: movdqa %xmm2, %xmm5 570; SSE2-NEXT: pand %xmm1, %xmm5 571; SSE2-NEXT: psllw $4, %xmm5 572; SSE2-NEXT: pand %xmm8, %xmm2 573; SSE2-NEXT: psrlw $4, %xmm2 574; SSE2-NEXT: pand %xmm1, %xmm2 575; SSE2-NEXT: pandn %xmm5, %xmm1 576; SSE2-NEXT: por %xmm2, %xmm1 577; SSE2-NEXT: pand %xmm1, %xmm3 578; SSE2-NEXT: psllw $2, %xmm3 579; SSE2-NEXT: pand %xmm9, %xmm3 580; SSE2-NEXT: pand %xmm10, %xmm1 581; SSE2-NEXT: psrlw $2, %xmm1 582; SSE2-NEXT: pand %xmm11, %xmm1 583; SSE2-NEXT: por %xmm3, %xmm1 584; SSE2-NEXT: pand %xmm1, %xmm4 585; SSE2-NEXT: psrlw $1, %xmm4 586; SSE2-NEXT: pand %xmm6, %xmm4 587; SSE2-NEXT: pand %xmm7, %xmm1 588; SSE2-NEXT: paddb %xmm1, %xmm1 589; SSE2-NEXT: por %xmm4, %xmm1 590; SSE2-NEXT: retq 591; 592; SSSE3-LABEL: test_bitreverse_v32i8: 593; SSSE3: # %bb.0: 594; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 595; SSSE3-NEXT: movdqa %xmm0, %xmm2 596; SSSE3-NEXT: pand %xmm4, %xmm2 597; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 598; SSSE3-NEXT: movdqa %xmm5, %xmm6 599; SSSE3-NEXT: pshufb %xmm2, %xmm6 600; SSSE3-NEXT: psrlw $4, %xmm0 601; SSSE3-NEXT: pand %xmm4, %xmm0 602; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 603; SSSE3-NEXT: movdqa %xmm2, %xmm3 604; SSSE3-NEXT: pshufb %xmm0, %xmm3 605; SSSE3-NEXT: por %xmm6, %xmm3 606; SSSE3-NEXT: movdqa %xmm1, %xmm0 607; SSSE3-NEXT: pand %xmm4, %xmm0 608; SSSE3-NEXT: pshufb %xmm0, %xmm5 609; SSSE3-NEXT: psrlw $4, %xmm1 610; SSSE3-NEXT: pand %xmm4, %xmm1 611; SSSE3-NEXT: pshufb %xmm1, %xmm2 612; SSSE3-NEXT: por %xmm5, %xmm2 613; SSSE3-NEXT: movdqa %xmm3, %xmm0 614; SSSE3-NEXT: movdqa %xmm2, %xmm1 615; SSSE3-NEXT: retq 616; 617; AVX1-LABEL: test_bitreverse_v32i8: 618; AVX1: # %bb.0: 619; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 620; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 621; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm3 622; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 623; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm3 624; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 625; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1 626; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 627; AVX1-NEXT: vpshufb %xmm1, %xmm5, %xmm1 628; AVX1-NEXT: vpor %xmm1, %xmm3, %xmm1 629; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm3 630; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm3 631; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 632; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 633; AVX1-NEXT: vpshufb %xmm0, %xmm5, %xmm0 634; AVX1-NEXT: vpor %xmm0, %xmm3, %xmm0 635; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 636; AVX1-NEXT: retq 637; 638; AVX2-LABEL: test_bitreverse_v32i8: 639; AVX2: # %bb.0: 640; AVX2-NEXT: vmovdqa {{.*#+}} 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] 641; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 642; AVX2-NEXT: vmovdqa {{.*#+}} 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] 643; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2 644; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 645; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 646; AVX2-NEXT: vmovdqa {{.*#+}} 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] 647; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 648; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0 649; AVX2-NEXT: retq 650; 651; AVX512-LABEL: test_bitreverse_v32i8: 652; AVX512: # %bb.0: 653; AVX512-NEXT: vmovdqa {{.*#+}} 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] 654; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm2 655; AVX512-NEXT: vmovdqa {{.*#+}} 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] 656; AVX512-NEXT: vpshufb %ymm2, %ymm3, %ymm2 657; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm0 658; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm0 659; AVX512-NEXT: vmovdqa {{.*#+}} 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] 660; AVX512-NEXT: vpshufb %ymm0, %ymm1, %ymm0 661; AVX512-NEXT: vpor %ymm0, %ymm2, %ymm0 662; AVX512-NEXT: retq 663; 664; XOPAVX1-LABEL: test_bitreverse_v32i8: 665; XOPAVX1: # %bb.0: 666; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 667; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95] 668; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 669; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 670; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 671; XOPAVX1-NEXT: retq 672; 673; XOPAVX2-LABEL: test_bitreverse_v32i8: 674; XOPAVX2: # %bb.0: 675; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 676; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95] 677; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 678; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 679; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 680; XOPAVX2-NEXT: retq 681 %b = call <32 x i8> @llvm.bitreverse.v32i8(<32 x i8> %a) 682 ret <32 x i8> %b 683} 684 685define <16 x i16> @test_bitreverse_v16i16(<16 x i16> %a) nounwind { 686; SSE2-LABEL: test_bitreverse_v16i16: 687; SSE2: # %bb.0: 688; SSE2-NEXT: movdqa %xmm1, %xmm2 689; SSE2-NEXT: pxor %xmm4, %xmm4 690; SSE2-NEXT: movdqa %xmm0, %xmm1 691; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm4[8],xmm1[9],xmm4[9],xmm1[10],xmm4[10],xmm1[11],xmm4[11],xmm1[12],xmm4[12],xmm1[13],xmm4[13],xmm1[14],xmm4[14],xmm1[15],xmm4[15] 692; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[1,0,3,2,4,5,6,7] 693; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,4,7,6] 694; 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] 695; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7] 696; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,7,6] 697; SSE2-NEXT: packuswb %xmm1, %xmm0 698; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 699; SSE2-NEXT: movdqa %xmm0, %xmm3 700; SSE2-NEXT: pand %xmm1, %xmm3 701; SSE2-NEXT: psllw $4, %xmm3 702; SSE2-NEXT: movdqa %xmm1, %xmm5 703; SSE2-NEXT: pandn %xmm3, %xmm5 704; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 705; SSE2-NEXT: pand %xmm8, %xmm0 706; SSE2-NEXT: psrlw $4, %xmm0 707; SSE2-NEXT: pand %xmm1, %xmm0 708; SSE2-NEXT: por %xmm5, %xmm0 709; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 710; SSE2-NEXT: movdqa %xmm0, %xmm5 711; SSE2-NEXT: pand %xmm3, %xmm5 712; SSE2-NEXT: psllw $2, %xmm5 713; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252] 714; SSE2-NEXT: pand %xmm9, %xmm5 715; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204] 716; SSE2-NEXT: pand %xmm10, %xmm0 717; SSE2-NEXT: psrlw $2, %xmm0 718; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63] 719; SSE2-NEXT: pand %xmm11, %xmm0 720; SSE2-NEXT: por %xmm5, %xmm0 721; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170] 722; SSE2-NEXT: movdqa %xmm0, %xmm6 723; SSE2-NEXT: pand %xmm5, %xmm6 724; SSE2-NEXT: psrlw $1, %xmm6 725; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 726; SSE2-NEXT: pand %xmm12, %xmm6 727; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 728; SSE2-NEXT: pand %xmm7, %xmm0 729; SSE2-NEXT: paddb %xmm0, %xmm0 730; SSE2-NEXT: por %xmm6, %xmm0 731; SSE2-NEXT: movdqa %xmm2, %xmm6 732; SSE2-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] 733; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[1,0,3,2,4,5,6,7] 734; SSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,5,4,7,6] 735; 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] 736; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[1,0,3,2,4,5,6,7] 737; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,4,7,6] 738; SSE2-NEXT: packuswb %xmm6, %xmm2 739; SSE2-NEXT: movdqa %xmm2, %xmm4 740; SSE2-NEXT: pand %xmm1, %xmm4 741; SSE2-NEXT: psllw $4, %xmm4 742; SSE2-NEXT: pand %xmm8, %xmm2 743; SSE2-NEXT: psrlw $4, %xmm2 744; SSE2-NEXT: pand %xmm1, %xmm2 745; SSE2-NEXT: pandn %xmm4, %xmm1 746; SSE2-NEXT: por %xmm2, %xmm1 747; SSE2-NEXT: pand %xmm1, %xmm3 748; SSE2-NEXT: psllw $2, %xmm3 749; SSE2-NEXT: pand %xmm9, %xmm3 750; SSE2-NEXT: pand %xmm10, %xmm1 751; SSE2-NEXT: psrlw $2, %xmm1 752; SSE2-NEXT: pand %xmm11, %xmm1 753; SSE2-NEXT: por %xmm3, %xmm1 754; SSE2-NEXT: pand %xmm1, %xmm5 755; SSE2-NEXT: psrlw $1, %xmm5 756; SSE2-NEXT: pand %xmm12, %xmm5 757; SSE2-NEXT: pand %xmm7, %xmm1 758; SSE2-NEXT: paddb %xmm1, %xmm1 759; SSE2-NEXT: por %xmm5, %xmm1 760; SSE2-NEXT: retq 761; 762; SSSE3-LABEL: test_bitreverse_v16i16: 763; SSSE3: # %bb.0: 764; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 765; SSSE3-NEXT: pshufb %xmm4, %xmm0 766; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 767; SSSE3-NEXT: movdqa %xmm0, %xmm2 768; SSSE3-NEXT: pand %xmm5, %xmm2 769; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 770; SSSE3-NEXT: movdqa %xmm6, %xmm7 771; SSSE3-NEXT: pshufb %xmm2, %xmm7 772; SSSE3-NEXT: psrlw $4, %xmm0 773; SSSE3-NEXT: pand %xmm5, %xmm0 774; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 775; SSSE3-NEXT: movdqa %xmm2, %xmm3 776; SSSE3-NEXT: pshufb %xmm0, %xmm3 777; SSSE3-NEXT: por %xmm7, %xmm3 778; SSSE3-NEXT: pshufb %xmm4, %xmm1 779; SSSE3-NEXT: movdqa %xmm1, %xmm0 780; SSSE3-NEXT: pand %xmm5, %xmm0 781; SSSE3-NEXT: pshufb %xmm0, %xmm6 782; SSSE3-NEXT: psrlw $4, %xmm1 783; SSSE3-NEXT: pand %xmm5, %xmm1 784; SSSE3-NEXT: pshufb %xmm1, %xmm2 785; SSSE3-NEXT: por %xmm6, %xmm2 786; SSSE3-NEXT: movdqa %xmm3, %xmm0 787; SSSE3-NEXT: movdqa %xmm2, %xmm1 788; SSSE3-NEXT: retq 789; 790; AVX1-LABEL: test_bitreverse_v16i16: 791; AVX1: # %bb.0: 792; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 793; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 794; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 795; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 796; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm4 797; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 798; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4 799; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 800; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1 801; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 802; AVX1-NEXT: vpshufb %xmm1, %xmm6, %xmm1 803; AVX1-NEXT: vpor %xmm1, %xmm4, %xmm1 804; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 805; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm2 806; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm2 807; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 808; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 809; AVX1-NEXT: vpshufb %xmm0, %xmm6, %xmm0 810; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0 811; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 812; AVX1-NEXT: retq 813; 814; AVX2-LABEL: test_bitreverse_v16i16: 815; AVX2: # %bb.0: 816; 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] 817; AVX2-NEXT: vmovdqa {{.*#+}} 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] 818; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 819; AVX2-NEXT: vmovdqa {{.*#+}} 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] 820; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2 821; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 822; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 823; AVX2-NEXT: vmovdqa {{.*#+}} 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] 824; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 825; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0 826; AVX2-NEXT: retq 827; 828; AVX512-LABEL: test_bitreverse_v16i16: 829; AVX512: # %bb.0: 830; 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] 831; AVX512-NEXT: vmovdqa {{.*#+}} 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] 832; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm2 833; AVX512-NEXT: vmovdqa {{.*#+}} 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] 834; AVX512-NEXT: vpshufb %ymm2, %ymm3, %ymm2 835; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm0 836; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm0 837; AVX512-NEXT: vmovdqa {{.*#+}} 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] 838; AVX512-NEXT: vpshufb %ymm0, %ymm1, %ymm0 839; AVX512-NEXT: vpor %ymm0, %ymm2, %ymm0 840; AVX512-NEXT: retq 841; 842; XOPAVX1-LABEL: test_bitreverse_v16i16: 843; XOPAVX1: # %bb.0: 844; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 845; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94] 846; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 847; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 848; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 849; XOPAVX1-NEXT: retq 850; 851; XOPAVX2-LABEL: test_bitreverse_v16i16: 852; XOPAVX2: # %bb.0: 853; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 854; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94] 855; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 856; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 857; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 858; XOPAVX2-NEXT: retq 859 %b = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> %a) 860 ret <16 x i16> %b 861} 862 863define <8 x i32> @test_bitreverse_v8i32(<8 x i32> %a) nounwind { 864; SSE2-LABEL: test_bitreverse_v8i32: 865; SSE2: # %bb.0: 866; SSE2-NEXT: movdqa %xmm1, %xmm2 867; SSE2-NEXT: pxor %xmm4, %xmm4 868; SSE2-NEXT: movdqa %xmm0, %xmm1 869; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm4[8],xmm1[9],xmm4[9],xmm1[10],xmm4[10],xmm1[11],xmm4[11],xmm1[12],xmm4[12],xmm1[13],xmm4[13],xmm1[14],xmm4[14],xmm1[15],xmm4[15] 870; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7] 871; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4] 872; 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] 873; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 874; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4] 875; SSE2-NEXT: packuswb %xmm1, %xmm0 876; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 877; SSE2-NEXT: movdqa %xmm0, %xmm3 878; SSE2-NEXT: pand %xmm1, %xmm3 879; SSE2-NEXT: psllw $4, %xmm3 880; SSE2-NEXT: movdqa %xmm1, %xmm5 881; SSE2-NEXT: pandn %xmm3, %xmm5 882; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 883; SSE2-NEXT: pand %xmm8, %xmm0 884; SSE2-NEXT: psrlw $4, %xmm0 885; SSE2-NEXT: pand %xmm1, %xmm0 886; SSE2-NEXT: por %xmm5, %xmm0 887; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 888; SSE2-NEXT: movdqa %xmm0, %xmm5 889; SSE2-NEXT: pand %xmm3, %xmm5 890; SSE2-NEXT: psllw $2, %xmm5 891; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252] 892; SSE2-NEXT: pand %xmm9, %xmm5 893; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204] 894; SSE2-NEXT: pand %xmm10, %xmm0 895; SSE2-NEXT: psrlw $2, %xmm0 896; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63] 897; SSE2-NEXT: pand %xmm11, %xmm0 898; SSE2-NEXT: por %xmm5, %xmm0 899; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170] 900; SSE2-NEXT: movdqa %xmm0, %xmm6 901; SSE2-NEXT: pand %xmm5, %xmm6 902; SSE2-NEXT: psrlw $1, %xmm6 903; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 904; SSE2-NEXT: pand %xmm12, %xmm6 905; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 906; SSE2-NEXT: pand %xmm7, %xmm0 907; SSE2-NEXT: paddb %xmm0, %xmm0 908; SSE2-NEXT: por %xmm6, %xmm0 909; SSE2-NEXT: movdqa %xmm2, %xmm6 910; SSE2-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] 911; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7] 912; SSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4] 913; 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] 914; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7] 915; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4] 916; SSE2-NEXT: packuswb %xmm6, %xmm2 917; SSE2-NEXT: movdqa %xmm2, %xmm4 918; SSE2-NEXT: pand %xmm1, %xmm4 919; SSE2-NEXT: psllw $4, %xmm4 920; SSE2-NEXT: pand %xmm8, %xmm2 921; SSE2-NEXT: psrlw $4, %xmm2 922; SSE2-NEXT: pand %xmm1, %xmm2 923; SSE2-NEXT: pandn %xmm4, %xmm1 924; SSE2-NEXT: por %xmm2, %xmm1 925; SSE2-NEXT: pand %xmm1, %xmm3 926; SSE2-NEXT: psllw $2, %xmm3 927; SSE2-NEXT: pand %xmm9, %xmm3 928; SSE2-NEXT: pand %xmm10, %xmm1 929; SSE2-NEXT: psrlw $2, %xmm1 930; SSE2-NEXT: pand %xmm11, %xmm1 931; SSE2-NEXT: por %xmm3, %xmm1 932; SSE2-NEXT: pand %xmm1, %xmm5 933; SSE2-NEXT: psrlw $1, %xmm5 934; SSE2-NEXT: pand %xmm12, %xmm5 935; SSE2-NEXT: pand %xmm7, %xmm1 936; SSE2-NEXT: paddb %xmm1, %xmm1 937; SSE2-NEXT: por %xmm5, %xmm1 938; SSE2-NEXT: retq 939; 940; SSSE3-LABEL: test_bitreverse_v8i32: 941; SSSE3: # %bb.0: 942; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 943; SSSE3-NEXT: pshufb %xmm4, %xmm0 944; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 945; SSSE3-NEXT: movdqa %xmm0, %xmm2 946; SSSE3-NEXT: pand %xmm5, %xmm2 947; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 948; SSSE3-NEXT: movdqa %xmm6, %xmm7 949; SSSE3-NEXT: pshufb %xmm2, %xmm7 950; SSSE3-NEXT: psrlw $4, %xmm0 951; SSSE3-NEXT: pand %xmm5, %xmm0 952; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 953; SSSE3-NEXT: movdqa %xmm2, %xmm3 954; SSSE3-NEXT: pshufb %xmm0, %xmm3 955; SSSE3-NEXT: por %xmm7, %xmm3 956; SSSE3-NEXT: pshufb %xmm4, %xmm1 957; SSSE3-NEXT: movdqa %xmm1, %xmm0 958; SSSE3-NEXT: pand %xmm5, %xmm0 959; SSSE3-NEXT: pshufb %xmm0, %xmm6 960; SSSE3-NEXT: psrlw $4, %xmm1 961; SSSE3-NEXT: pand %xmm5, %xmm1 962; SSSE3-NEXT: pshufb %xmm1, %xmm2 963; SSSE3-NEXT: por %xmm6, %xmm2 964; SSSE3-NEXT: movdqa %xmm3, %xmm0 965; SSSE3-NEXT: movdqa %xmm2, %xmm1 966; SSSE3-NEXT: retq 967; 968; AVX1-LABEL: test_bitreverse_v8i32: 969; AVX1: # %bb.0: 970; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 971; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 972; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 973; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 974; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm4 975; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 976; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4 977; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 978; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1 979; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 980; AVX1-NEXT: vpshufb %xmm1, %xmm6, %xmm1 981; AVX1-NEXT: vpor %xmm1, %xmm4, %xmm1 982; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 983; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm2 984; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm2 985; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 986; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 987; AVX1-NEXT: vpshufb %xmm0, %xmm6, %xmm0 988; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0 989; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 990; AVX1-NEXT: retq 991; 992; AVX2-LABEL: test_bitreverse_v8i32: 993; AVX2: # %bb.0: 994; 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] 995; AVX2-NEXT: vmovdqa {{.*#+}} 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] 996; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 997; AVX2-NEXT: vmovdqa {{.*#+}} 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] 998; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2 999; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 1000; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 1001; AVX2-NEXT: vmovdqa {{.*#+}} 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] 1002; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1003; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0 1004; AVX2-NEXT: retq 1005; 1006; AVX512-LABEL: test_bitreverse_v8i32: 1007; AVX512: # %bb.0: 1008; 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] 1009; AVX512-NEXT: vmovdqa {{.*#+}} 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] 1010; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm2 1011; AVX512-NEXT: vmovdqa {{.*#+}} 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] 1012; AVX512-NEXT: vpshufb %ymm2, %ymm3, %ymm2 1013; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm0 1014; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm0 1015; AVX512-NEXT: vmovdqa {{.*#+}} 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] 1016; AVX512-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1017; AVX512-NEXT: vpor %ymm0, %ymm2, %ymm0 1018; AVX512-NEXT: retq 1019; 1020; XOPAVX1-LABEL: test_bitreverse_v8i32: 1021; XOPAVX1: # %bb.0: 1022; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1023; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92] 1024; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1025; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1026; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1027; XOPAVX1-NEXT: retq 1028; 1029; XOPAVX2-LABEL: test_bitreverse_v8i32: 1030; XOPAVX2: # %bb.0: 1031; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1032; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92] 1033; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1034; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1035; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1036; XOPAVX2-NEXT: retq 1037 %b = call <8 x i32> @llvm.bitreverse.v8i32(<8 x i32> %a) 1038 ret <8 x i32> %b 1039} 1040 1041define <4 x i64> @test_bitreverse_v4i64(<4 x i64> %a) nounwind { 1042; SSE2-LABEL: test_bitreverse_v4i64: 1043; SSE2: # %bb.0: 1044; SSE2-NEXT: movdqa %xmm1, %xmm2 1045; SSE2-NEXT: pxor %xmm4, %xmm4 1046; SSE2-NEXT: movdqa %xmm0, %xmm1 1047; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm4[8],xmm1[9],xmm4[9],xmm1[10],xmm4[10],xmm1[11],xmm4[11],xmm1[12],xmm4[12],xmm1[13],xmm4[13],xmm1[14],xmm4[14],xmm1[15],xmm4[15] 1048; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] 1049; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7] 1050; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4] 1051; 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] 1052; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1053; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 1054; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4] 1055; SSE2-NEXT: packuswb %xmm1, %xmm0 1056; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1057; SSE2-NEXT: movdqa %xmm0, %xmm3 1058; SSE2-NEXT: pand %xmm1, %xmm3 1059; SSE2-NEXT: psllw $4, %xmm3 1060; SSE2-NEXT: movdqa %xmm1, %xmm5 1061; SSE2-NEXT: pandn %xmm3, %xmm5 1062; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 1063; SSE2-NEXT: pand %xmm8, %xmm0 1064; SSE2-NEXT: psrlw $4, %xmm0 1065; SSE2-NEXT: pand %xmm1, %xmm0 1066; SSE2-NEXT: por %xmm5, %xmm0 1067; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 1068; SSE2-NEXT: movdqa %xmm0, %xmm5 1069; SSE2-NEXT: pand %xmm3, %xmm5 1070; SSE2-NEXT: psllw $2, %xmm5 1071; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252] 1072; SSE2-NEXT: pand %xmm9, %xmm5 1073; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204] 1074; SSE2-NEXT: pand %xmm10, %xmm0 1075; SSE2-NEXT: psrlw $2, %xmm0 1076; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63] 1077; SSE2-NEXT: pand %xmm11, %xmm0 1078; SSE2-NEXT: por %xmm5, %xmm0 1079; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170] 1080; SSE2-NEXT: movdqa %xmm0, %xmm6 1081; SSE2-NEXT: pand %xmm5, %xmm6 1082; SSE2-NEXT: psrlw $1, %xmm6 1083; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 1084; SSE2-NEXT: pand %xmm12, %xmm6 1085; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 1086; SSE2-NEXT: pand %xmm7, %xmm0 1087; SSE2-NEXT: paddb %xmm0, %xmm0 1088; SSE2-NEXT: por %xmm6, %xmm0 1089; SSE2-NEXT: movdqa %xmm2, %xmm6 1090; SSE2-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] 1091; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[2,3,0,1] 1092; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7] 1093; SSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4] 1094; 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] 1095; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1] 1096; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7] 1097; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4] 1098; SSE2-NEXT: packuswb %xmm6, %xmm2 1099; SSE2-NEXT: movdqa %xmm2, %xmm4 1100; SSE2-NEXT: pand %xmm1, %xmm4 1101; SSE2-NEXT: psllw $4, %xmm4 1102; SSE2-NEXT: pand %xmm8, %xmm2 1103; SSE2-NEXT: psrlw $4, %xmm2 1104; SSE2-NEXT: pand %xmm1, %xmm2 1105; SSE2-NEXT: pandn %xmm4, %xmm1 1106; SSE2-NEXT: por %xmm2, %xmm1 1107; SSE2-NEXT: pand %xmm1, %xmm3 1108; SSE2-NEXT: psllw $2, %xmm3 1109; SSE2-NEXT: pand %xmm9, %xmm3 1110; SSE2-NEXT: pand %xmm10, %xmm1 1111; SSE2-NEXT: psrlw $2, %xmm1 1112; SSE2-NEXT: pand %xmm11, %xmm1 1113; SSE2-NEXT: por %xmm3, %xmm1 1114; SSE2-NEXT: pand %xmm1, %xmm5 1115; SSE2-NEXT: psrlw $1, %xmm5 1116; SSE2-NEXT: pand %xmm12, %xmm5 1117; SSE2-NEXT: pand %xmm7, %xmm1 1118; SSE2-NEXT: paddb %xmm1, %xmm1 1119; SSE2-NEXT: por %xmm5, %xmm1 1120; SSE2-NEXT: retq 1121; 1122; SSSE3-LABEL: test_bitreverse_v4i64: 1123; SSSE3: # %bb.0: 1124; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 1125; SSSE3-NEXT: pshufb %xmm4, %xmm0 1126; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1127; SSSE3-NEXT: movdqa %xmm0, %xmm2 1128; SSSE3-NEXT: pand %xmm5, %xmm2 1129; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1130; SSSE3-NEXT: movdqa %xmm6, %xmm7 1131; SSSE3-NEXT: pshufb %xmm2, %xmm7 1132; SSSE3-NEXT: psrlw $4, %xmm0 1133; SSSE3-NEXT: pand %xmm5, %xmm0 1134; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1135; SSSE3-NEXT: movdqa %xmm2, %xmm3 1136; SSSE3-NEXT: pshufb %xmm0, %xmm3 1137; SSSE3-NEXT: por %xmm7, %xmm3 1138; SSSE3-NEXT: pshufb %xmm4, %xmm1 1139; SSSE3-NEXT: movdqa %xmm1, %xmm0 1140; SSSE3-NEXT: pand %xmm5, %xmm0 1141; SSSE3-NEXT: pshufb %xmm0, %xmm6 1142; SSSE3-NEXT: psrlw $4, %xmm1 1143; SSSE3-NEXT: pand %xmm5, %xmm1 1144; SSSE3-NEXT: pshufb %xmm1, %xmm2 1145; SSSE3-NEXT: por %xmm6, %xmm2 1146; SSSE3-NEXT: movdqa %xmm3, %xmm0 1147; SSSE3-NEXT: movdqa %xmm2, %xmm1 1148; SSSE3-NEXT: retq 1149; 1150; AVX1-LABEL: test_bitreverse_v4i64: 1151; AVX1: # %bb.0: 1152; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1153; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 1154; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 1155; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1156; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm4 1157; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1158; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4 1159; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 1160; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1 1161; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1162; AVX1-NEXT: vpshufb %xmm1, %xmm6, %xmm1 1163; AVX1-NEXT: vpor %xmm1, %xmm4, %xmm1 1164; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 1165; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm2 1166; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm2 1167; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 1168; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 1169; AVX1-NEXT: vpshufb %xmm0, %xmm6, %xmm0 1170; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0 1171; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1172; AVX1-NEXT: retq 1173; 1174; AVX2-LABEL: test_bitreverse_v4i64: 1175; AVX2: # %bb.0: 1176; 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] 1177; AVX2-NEXT: vmovdqa {{.*#+}} 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] 1178; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 1179; AVX2-NEXT: vmovdqa {{.*#+}} 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] 1180; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2 1181; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 1182; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 1183; AVX2-NEXT: vmovdqa {{.*#+}} 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] 1184; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1185; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0 1186; AVX2-NEXT: retq 1187; 1188; AVX512-LABEL: test_bitreverse_v4i64: 1189; AVX512: # %bb.0: 1190; 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] 1191; AVX512-NEXT: vmovdqa {{.*#+}} 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] 1192; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm2 1193; AVX512-NEXT: vmovdqa {{.*#+}} 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] 1194; AVX512-NEXT: vpshufb %ymm2, %ymm3, %ymm2 1195; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm0 1196; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm0 1197; AVX512-NEXT: vmovdqa {{.*#+}} 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] 1198; AVX512-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1199; AVX512-NEXT: vpor %ymm0, %ymm2, %ymm0 1200; AVX512-NEXT: retq 1201; 1202; XOPAVX1-LABEL: test_bitreverse_v4i64: 1203; XOPAVX1: # %bb.0: 1204; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1205; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88] 1206; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1207; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1208; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1209; XOPAVX1-NEXT: retq 1210; 1211; XOPAVX2-LABEL: test_bitreverse_v4i64: 1212; XOPAVX2: # %bb.0: 1213; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1214; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88] 1215; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1216; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1217; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1218; XOPAVX2-NEXT: retq 1219 %b = call <4 x i64> @llvm.bitreverse.v4i64(<4 x i64> %a) 1220 ret <4 x i64> %b 1221} 1222 1223define <64 x i8> @test_bitreverse_v64i8(<64 x i8> %a) nounwind { 1224; SSE2-LABEL: test_bitreverse_v64i8: 1225; SSE2: # %bb.0: 1226; SSE2-NEXT: movdqa %xmm3, %xmm14 1227; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1228; SSE2-NEXT: movdqa %xmm0, %xmm5 1229; SSE2-NEXT: pand %xmm3, %xmm5 1230; SSE2-NEXT: psllw $4, %xmm5 1231; SSE2-NEXT: movdqa %xmm3, %xmm6 1232; SSE2-NEXT: pandn %xmm5, %xmm6 1233; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 1234; SSE2-NEXT: pand %xmm9, %xmm0 1235; SSE2-NEXT: psrlw $4, %xmm0 1236; SSE2-NEXT: pand %xmm3, %xmm0 1237; SSE2-NEXT: por %xmm6, %xmm0 1238; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 1239; SSE2-NEXT: movdqa %xmm0, %xmm6 1240; SSE2-NEXT: pand %xmm5, %xmm6 1241; SSE2-NEXT: psllw $2, %xmm6 1242; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252] 1243; SSE2-NEXT: pand %xmm8, %xmm6 1244; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204] 1245; SSE2-NEXT: pand %xmm10, %xmm0 1246; SSE2-NEXT: psrlw $2, %xmm0 1247; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63] 1248; SSE2-NEXT: pand %xmm11, %xmm0 1249; SSE2-NEXT: por %xmm6, %xmm0 1250; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170] 1251; SSE2-NEXT: movdqa %xmm0, %xmm7 1252; SSE2-NEXT: pand %xmm6, %xmm7 1253; SSE2-NEXT: psrlw $1, %xmm7 1254; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 1255; SSE2-NEXT: pand %xmm12, %xmm7 1256; SSE2-NEXT: movdqa {{.*#+}} xmm13 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 1257; SSE2-NEXT: pand %xmm13, %xmm0 1258; SSE2-NEXT: paddb %xmm0, %xmm0 1259; SSE2-NEXT: por %xmm7, %xmm0 1260; SSE2-NEXT: movdqa %xmm1, %xmm7 1261; SSE2-NEXT: pand %xmm3, %xmm7 1262; SSE2-NEXT: psllw $4, %xmm7 1263; SSE2-NEXT: movdqa %xmm3, %xmm4 1264; SSE2-NEXT: pandn %xmm7, %xmm4 1265; SSE2-NEXT: pand %xmm9, %xmm1 1266; SSE2-NEXT: psrlw $4, %xmm1 1267; SSE2-NEXT: pand %xmm3, %xmm1 1268; SSE2-NEXT: por %xmm4, %xmm1 1269; SSE2-NEXT: movdqa %xmm1, %xmm4 1270; SSE2-NEXT: pand %xmm5, %xmm4 1271; SSE2-NEXT: psllw $2, %xmm4 1272; SSE2-NEXT: pand %xmm8, %xmm4 1273; SSE2-NEXT: pand %xmm10, %xmm1 1274; SSE2-NEXT: psrlw $2, %xmm1 1275; SSE2-NEXT: pand %xmm11, %xmm1 1276; SSE2-NEXT: por %xmm4, %xmm1 1277; SSE2-NEXT: movdqa %xmm1, %xmm4 1278; SSE2-NEXT: pand %xmm6, %xmm4 1279; SSE2-NEXT: psrlw $1, %xmm4 1280; SSE2-NEXT: pand %xmm12, %xmm4 1281; SSE2-NEXT: pand %xmm13, %xmm1 1282; SSE2-NEXT: paddb %xmm1, %xmm1 1283; SSE2-NEXT: por %xmm4, %xmm1 1284; SSE2-NEXT: movdqa %xmm2, %xmm4 1285; SSE2-NEXT: pand %xmm3, %xmm4 1286; SSE2-NEXT: psllw $4, %xmm4 1287; SSE2-NEXT: movdqa %xmm3, %xmm7 1288; SSE2-NEXT: pandn %xmm4, %xmm7 1289; SSE2-NEXT: pand %xmm9, %xmm2 1290; SSE2-NEXT: psrlw $4, %xmm2 1291; SSE2-NEXT: pand %xmm3, %xmm2 1292; SSE2-NEXT: por %xmm7, %xmm2 1293; SSE2-NEXT: movdqa %xmm2, %xmm4 1294; SSE2-NEXT: pand %xmm5, %xmm4 1295; SSE2-NEXT: psllw $2, %xmm4 1296; SSE2-NEXT: pand %xmm8, %xmm4 1297; SSE2-NEXT: pand %xmm10, %xmm2 1298; SSE2-NEXT: psrlw $2, %xmm2 1299; SSE2-NEXT: pand %xmm11, %xmm2 1300; SSE2-NEXT: por %xmm4, %xmm2 1301; SSE2-NEXT: movdqa %xmm2, %xmm4 1302; SSE2-NEXT: pand %xmm6, %xmm4 1303; SSE2-NEXT: psrlw $1, %xmm4 1304; SSE2-NEXT: pand %xmm12, %xmm4 1305; SSE2-NEXT: pand %xmm13, %xmm2 1306; SSE2-NEXT: paddb %xmm2, %xmm2 1307; SSE2-NEXT: por %xmm4, %xmm2 1308; SSE2-NEXT: movdqa %xmm14, %xmm4 1309; SSE2-NEXT: pand %xmm3, %xmm4 1310; SSE2-NEXT: psllw $4, %xmm4 1311; SSE2-NEXT: pand %xmm9, %xmm14 1312; SSE2-NEXT: psrlw $4, %xmm14 1313; SSE2-NEXT: pand %xmm3, %xmm14 1314; SSE2-NEXT: pandn %xmm4, %xmm3 1315; SSE2-NEXT: por %xmm14, %xmm3 1316; SSE2-NEXT: pand %xmm3, %xmm5 1317; SSE2-NEXT: psllw $2, %xmm5 1318; SSE2-NEXT: pand %xmm8, %xmm5 1319; SSE2-NEXT: pand %xmm10, %xmm3 1320; SSE2-NEXT: psrlw $2, %xmm3 1321; SSE2-NEXT: pand %xmm11, %xmm3 1322; SSE2-NEXT: por %xmm5, %xmm3 1323; SSE2-NEXT: pand %xmm3, %xmm6 1324; SSE2-NEXT: psrlw $1, %xmm6 1325; SSE2-NEXT: pand %xmm12, %xmm6 1326; SSE2-NEXT: pand %xmm13, %xmm3 1327; SSE2-NEXT: paddb %xmm3, %xmm3 1328; SSE2-NEXT: por %xmm6, %xmm3 1329; SSE2-NEXT: retq 1330; 1331; SSSE3-LABEL: test_bitreverse_v64i8: 1332; SSSE3: # %bb.0: 1333; SSSE3-NEXT: movdqa %xmm0, %xmm5 1334; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1335; SSSE3-NEXT: pand %xmm8, %xmm0 1336; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1337; SSSE3-NEXT: movdqa %xmm9, %xmm6 1338; SSSE3-NEXT: pshufb %xmm0, %xmm6 1339; SSSE3-NEXT: psrlw $4, %xmm5 1340; SSSE3-NEXT: pand %xmm8, %xmm5 1341; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1342; SSSE3-NEXT: movdqa %xmm4, %xmm0 1343; SSSE3-NEXT: pshufb %xmm5, %xmm0 1344; SSSE3-NEXT: por %xmm6, %xmm0 1345; SSSE3-NEXT: movdqa %xmm1, %xmm5 1346; SSSE3-NEXT: pand %xmm8, %xmm5 1347; SSSE3-NEXT: movdqa %xmm9, %xmm6 1348; SSSE3-NEXT: pshufb %xmm5, %xmm6 1349; SSSE3-NEXT: psrlw $4, %xmm1 1350; SSSE3-NEXT: pand %xmm8, %xmm1 1351; SSSE3-NEXT: movdqa %xmm4, %xmm5 1352; SSSE3-NEXT: pshufb %xmm1, %xmm5 1353; SSSE3-NEXT: por %xmm6, %xmm5 1354; SSSE3-NEXT: movdqa %xmm2, %xmm1 1355; SSSE3-NEXT: pand %xmm8, %xmm1 1356; SSSE3-NEXT: movdqa %xmm9, %xmm7 1357; SSSE3-NEXT: pshufb %xmm1, %xmm7 1358; SSSE3-NEXT: psrlw $4, %xmm2 1359; SSSE3-NEXT: pand %xmm8, %xmm2 1360; SSSE3-NEXT: movdqa %xmm4, %xmm6 1361; SSSE3-NEXT: pshufb %xmm2, %xmm6 1362; SSSE3-NEXT: por %xmm7, %xmm6 1363; SSSE3-NEXT: movdqa %xmm3, %xmm1 1364; SSSE3-NEXT: pand %xmm8, %xmm1 1365; SSSE3-NEXT: pshufb %xmm1, %xmm9 1366; SSSE3-NEXT: psrlw $4, %xmm3 1367; SSSE3-NEXT: pand %xmm8, %xmm3 1368; SSSE3-NEXT: pshufb %xmm3, %xmm4 1369; SSSE3-NEXT: por %xmm9, %xmm4 1370; SSSE3-NEXT: movdqa %xmm5, %xmm1 1371; SSSE3-NEXT: movdqa %xmm6, %xmm2 1372; SSSE3-NEXT: movdqa %xmm4, %xmm3 1373; SSSE3-NEXT: retq 1374; 1375; AVX1-LABEL: test_bitreverse_v64i8: 1376; AVX1: # %bb.0: 1377; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1378; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1379; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm4 1380; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1381; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4 1382; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2 1383; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2 1384; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1385; AVX1-NEXT: vpshufb %xmm2, %xmm6, %xmm2 1386; AVX1-NEXT: vpor %xmm2, %xmm4, %xmm2 1387; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm4 1388; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4 1389; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 1390; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 1391; AVX1-NEXT: vpshufb %xmm0, %xmm6, %xmm0 1392; AVX1-NEXT: vpor %xmm0, %xmm4, %xmm0 1393; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1394; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1395; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm4 1396; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4 1397; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2 1398; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2 1399; AVX1-NEXT: vpshufb %xmm2, %xmm6, %xmm2 1400; AVX1-NEXT: vpor %xmm2, %xmm4, %xmm2 1401; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm4 1402; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4 1403; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 1404; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1 1405; AVX1-NEXT: vpshufb %xmm1, %xmm6, %xmm1 1406; AVX1-NEXT: vpor %xmm1, %xmm4, %xmm1 1407; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1408; AVX1-NEXT: retq 1409; 1410; AVX2-LABEL: test_bitreverse_v64i8: 1411; AVX2: # %bb.0: 1412; AVX2-NEXT: vmovdqa {{.*#+}} 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] 1413; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm3 1414; AVX2-NEXT: vmovdqa {{.*#+}} 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] 1415; AVX2-NEXT: vpshufb %ymm3, %ymm4, %ymm3 1416; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 1417; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 1418; AVX2-NEXT: vmovdqa {{.*#+}} 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] 1419; AVX2-NEXT: vpshufb %ymm0, %ymm5, %ymm0 1420; AVX2-NEXT: vpor %ymm0, %ymm3, %ymm0 1421; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm3 1422; AVX2-NEXT: vpshufb %ymm3, %ymm4, %ymm3 1423; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm1 1424; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1 1425; AVX2-NEXT: vpshufb %ymm1, %ymm5, %ymm1 1426; AVX2-NEXT: vpor %ymm1, %ymm3, %ymm1 1427; AVX2-NEXT: retq 1428; 1429; AVX512F-LABEL: test_bitreverse_v64i8: 1430; AVX512F: # %bb.0: 1431; AVX512F-NEXT: vmovdqa {{.*#+}} 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] 1432; AVX512F-NEXT: vpand %ymm2, %ymm0, %ymm3 1433; AVX512F-NEXT: vmovdqa {{.*#+}} 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] 1434; AVX512F-NEXT: vpshufb %ymm3, %ymm4, %ymm3 1435; AVX512F-NEXT: vpsrlw $4, %ymm0, %ymm0 1436; AVX512F-NEXT: vpand %ymm2, %ymm0, %ymm0 1437; AVX512F-NEXT: vmovdqa {{.*#+}} 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] 1438; AVX512F-NEXT: vpshufb %ymm0, %ymm5, %ymm0 1439; AVX512F-NEXT: vpor %ymm0, %ymm3, %ymm0 1440; AVX512F-NEXT: vpand %ymm2, %ymm1, %ymm3 1441; AVX512F-NEXT: vpshufb %ymm3, %ymm4, %ymm3 1442; AVX512F-NEXT: vpsrlw $4, %ymm1, %ymm1 1443; AVX512F-NEXT: vpand %ymm2, %ymm1, %ymm1 1444; AVX512F-NEXT: vpshufb %ymm1, %ymm5, %ymm1 1445; AVX512F-NEXT: vpor %ymm1, %ymm3, %ymm1 1446; AVX512F-NEXT: retq 1447; 1448; AVX512BW-LABEL: test_bitreverse_v64i8: 1449; AVX512BW: # %bb.0: 1450; AVX512BW-NEXT: vmovdqa64 {{.*#+}} 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] 1451; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm2 1452; AVX512BW-NEXT: vmovdqa64 {{.*#+}} 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] 1453; AVX512BW-NEXT: vpshufb %zmm2, %zmm3, %zmm2 1454; AVX512BW-NEXT: vpsrlw $4, %zmm0, %zmm0 1455; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm0 1456; AVX512BW-NEXT: vmovdqa64 {{.*#+}} 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] 1457; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0 1458; AVX512BW-NEXT: vporq %zmm0, %zmm2, %zmm0 1459; AVX512BW-NEXT: retq 1460; 1461; XOPAVX1-LABEL: test_bitreverse_v64i8: 1462; XOPAVX1: # %bb.0: 1463; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1464; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95] 1465; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 1466; XOPAVX1-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm0 1467; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1468; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1469; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 1470; XOPAVX1-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm1 1471; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1472; XOPAVX1-NEXT: retq 1473; 1474; XOPAVX2-LABEL: test_bitreverse_v64i8: 1475; XOPAVX2: # %bb.0: 1476; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 1477; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95] 1478; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 1479; XOPAVX2-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm0 1480; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 1481; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 1482; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 1483; XOPAVX2-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm1 1484; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 1485; XOPAVX2-NEXT: retq 1486 %b = call <64 x i8> @llvm.bitreverse.v64i8(<64 x i8> %a) 1487 ret <64 x i8> %b 1488} 1489 1490define <32 x i16> @test_bitreverse_v32i16(<32 x i16> %a) nounwind { 1491; SSE2-LABEL: test_bitreverse_v32i16: 1492; SSE2: # %bb.0: 1493; SSE2-NEXT: movdqa %xmm3, %xmm15 1494; SSE2-NEXT: pxor %xmm14, %xmm14 1495; SSE2-NEXT: movdqa %xmm0, %xmm3 1496; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm14[8],xmm3[9],xmm14[9],xmm3[10],xmm14[10],xmm3[11],xmm14[11],xmm3[12],xmm14[12],xmm3[13],xmm14[13],xmm3[14],xmm14[14],xmm3[15],xmm14[15] 1497; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[1,0,3,2,4,5,6,7] 1498; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,4,7,6] 1499; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm14[0],xmm0[1],xmm14[1],xmm0[2],xmm14[2],xmm0[3],xmm14[3],xmm0[4],xmm14[4],xmm0[5],xmm14[5],xmm0[6],xmm14[6],xmm0[7],xmm14[7] 1500; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7] 1501; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,7,6] 1502; SSE2-NEXT: packuswb %xmm3, %xmm0 1503; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1504; SSE2-NEXT: movdqa %xmm0, %xmm5 1505; SSE2-NEXT: pand %xmm3, %xmm5 1506; SSE2-NEXT: psllw $4, %xmm5 1507; SSE2-NEXT: movdqa %xmm3, %xmm7 1508; SSE2-NEXT: pandn %xmm5, %xmm7 1509; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 1510; SSE2-NEXT: pand %xmm8, %xmm0 1511; SSE2-NEXT: psrlw $4, %xmm0 1512; SSE2-NEXT: pand %xmm3, %xmm0 1513; SSE2-NEXT: por %xmm7, %xmm0 1514; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 1515; SSE2-NEXT: movdqa %xmm0, %xmm7 1516; SSE2-NEXT: pand %xmm5, %xmm7 1517; SSE2-NEXT: psllw $2, %xmm7 1518; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252] 1519; SSE2-NEXT: pand %xmm9, %xmm7 1520; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204] 1521; SSE2-NEXT: pand %xmm10, %xmm0 1522; SSE2-NEXT: psrlw $2, %xmm0 1523; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63] 1524; SSE2-NEXT: pand %xmm11, %xmm0 1525; SSE2-NEXT: por %xmm7, %xmm0 1526; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170] 1527; SSE2-NEXT: movdqa %xmm0, %xmm6 1528; SSE2-NEXT: pand %xmm7, %xmm6 1529; SSE2-NEXT: psrlw $1, %xmm6 1530; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 1531; SSE2-NEXT: pand %xmm12, %xmm6 1532; SSE2-NEXT: movdqa {{.*#+}} xmm13 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 1533; SSE2-NEXT: pand %xmm13, %xmm0 1534; SSE2-NEXT: paddb %xmm0, %xmm0 1535; SSE2-NEXT: por %xmm6, %xmm0 1536; SSE2-NEXT: movdqa %xmm1, %xmm6 1537; SSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm14[8],xmm6[9],xmm14[9],xmm6[10],xmm14[10],xmm6[11],xmm14[11],xmm6[12],xmm14[12],xmm6[13],xmm14[13],xmm6[14],xmm14[14],xmm6[15],xmm14[15] 1538; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[1,0,3,2,4,5,6,7] 1539; SSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,5,4,7,6] 1540; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm14[0],xmm1[1],xmm14[1],xmm1[2],xmm14[2],xmm1[3],xmm14[3],xmm1[4],xmm14[4],xmm1[5],xmm14[5],xmm1[6],xmm14[6],xmm1[7],xmm14[7] 1541; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[1,0,3,2,4,5,6,7] 1542; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,4,7,6] 1543; SSE2-NEXT: packuswb %xmm6, %xmm1 1544; SSE2-NEXT: movdqa %xmm1, %xmm6 1545; SSE2-NEXT: pand %xmm3, %xmm6 1546; SSE2-NEXT: psllw $4, %xmm6 1547; SSE2-NEXT: movdqa %xmm3, %xmm4 1548; SSE2-NEXT: pandn %xmm6, %xmm4 1549; SSE2-NEXT: pand %xmm8, %xmm1 1550; SSE2-NEXT: psrlw $4, %xmm1 1551; SSE2-NEXT: pand %xmm3, %xmm1 1552; SSE2-NEXT: por %xmm4, %xmm1 1553; SSE2-NEXT: movdqa %xmm1, %xmm4 1554; SSE2-NEXT: pand %xmm5, %xmm4 1555; SSE2-NEXT: psllw $2, %xmm4 1556; SSE2-NEXT: pand %xmm9, %xmm4 1557; SSE2-NEXT: pand %xmm10, %xmm1 1558; SSE2-NEXT: psrlw $2, %xmm1 1559; SSE2-NEXT: pand %xmm11, %xmm1 1560; SSE2-NEXT: por %xmm4, %xmm1 1561; SSE2-NEXT: movdqa %xmm1, %xmm4 1562; SSE2-NEXT: pand %xmm7, %xmm4 1563; SSE2-NEXT: psrlw $1, %xmm4 1564; SSE2-NEXT: pand %xmm12, %xmm4 1565; SSE2-NEXT: pand %xmm13, %xmm1 1566; SSE2-NEXT: paddb %xmm1, %xmm1 1567; SSE2-NEXT: por %xmm4, %xmm1 1568; SSE2-NEXT: movdqa %xmm2, %xmm4 1569; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm14[8],xmm4[9],xmm14[9],xmm4[10],xmm14[10],xmm4[11],xmm14[11],xmm4[12],xmm14[12],xmm4[13],xmm14[13],xmm4[14],xmm14[14],xmm4[15],xmm14[15] 1570; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[1,0,3,2,4,5,6,7] 1571; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,5,4,7,6] 1572; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm14[0],xmm2[1],xmm14[1],xmm2[2],xmm14[2],xmm2[3],xmm14[3],xmm2[4],xmm14[4],xmm2[5],xmm14[5],xmm2[6],xmm14[6],xmm2[7],xmm14[7] 1573; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[1,0,3,2,4,5,6,7] 1574; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,4,7,6] 1575; SSE2-NEXT: packuswb %xmm4, %xmm2 1576; SSE2-NEXT: movdqa %xmm2, %xmm4 1577; SSE2-NEXT: pand %xmm3, %xmm4 1578; SSE2-NEXT: psllw $4, %xmm4 1579; SSE2-NEXT: movdqa %xmm3, %xmm6 1580; SSE2-NEXT: pandn %xmm4, %xmm6 1581; SSE2-NEXT: pand %xmm8, %xmm2 1582; SSE2-NEXT: psrlw $4, %xmm2 1583; SSE2-NEXT: pand %xmm3, %xmm2 1584; SSE2-NEXT: por %xmm6, %xmm2 1585; SSE2-NEXT: movdqa %xmm2, %xmm4 1586; SSE2-NEXT: pand %xmm5, %xmm4 1587; SSE2-NEXT: psllw $2, %xmm4 1588; SSE2-NEXT: pand %xmm9, %xmm4 1589; SSE2-NEXT: pand %xmm10, %xmm2 1590; SSE2-NEXT: psrlw $2, %xmm2 1591; SSE2-NEXT: pand %xmm11, %xmm2 1592; SSE2-NEXT: por %xmm4, %xmm2 1593; SSE2-NEXT: movdqa %xmm2, %xmm4 1594; SSE2-NEXT: pand %xmm7, %xmm4 1595; SSE2-NEXT: psrlw $1, %xmm4 1596; SSE2-NEXT: pand %xmm12, %xmm4 1597; SSE2-NEXT: pand %xmm13, %xmm2 1598; SSE2-NEXT: paddb %xmm2, %xmm2 1599; SSE2-NEXT: por %xmm4, %xmm2 1600; SSE2-NEXT: movdqa %xmm15, %xmm4 1601; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm14[8],xmm4[9],xmm14[9],xmm4[10],xmm14[10],xmm4[11],xmm14[11],xmm4[12],xmm14[12],xmm4[13],xmm14[13],xmm4[14],xmm14[14],xmm4[15],xmm14[15] 1602; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[1,0,3,2,4,5,6,7] 1603; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,5,4,7,6] 1604; SSE2-NEXT: punpcklbw {{.*#+}} xmm15 = xmm15[0],xmm14[0],xmm15[1],xmm14[1],xmm15[2],xmm14[2],xmm15[3],xmm14[3],xmm15[4],xmm14[4],xmm15[5],xmm14[5],xmm15[6],xmm14[6],xmm15[7],xmm14[7] 1605; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm15[1,0,3,2,4,5,6,7] 1606; SSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,5,4,7,6] 1607; SSE2-NEXT: packuswb %xmm4, %xmm6 1608; SSE2-NEXT: movdqa %xmm6, %xmm4 1609; SSE2-NEXT: pand %xmm3, %xmm4 1610; SSE2-NEXT: psllw $4, %xmm4 1611; SSE2-NEXT: pand %xmm8, %xmm6 1612; SSE2-NEXT: psrlw $4, %xmm6 1613; SSE2-NEXT: pand %xmm3, %xmm6 1614; SSE2-NEXT: pandn %xmm4, %xmm3 1615; SSE2-NEXT: por %xmm6, %xmm3 1616; SSE2-NEXT: pand %xmm3, %xmm5 1617; SSE2-NEXT: psllw $2, %xmm5 1618; SSE2-NEXT: pand %xmm9, %xmm5 1619; SSE2-NEXT: pand %xmm10, %xmm3 1620; SSE2-NEXT: psrlw $2, %xmm3 1621; SSE2-NEXT: pand %xmm11, %xmm3 1622; SSE2-NEXT: por %xmm5, %xmm3 1623; SSE2-NEXT: pand %xmm3, %xmm7 1624; SSE2-NEXT: psrlw $1, %xmm7 1625; SSE2-NEXT: pand %xmm12, %xmm7 1626; SSE2-NEXT: pand %xmm13, %xmm3 1627; SSE2-NEXT: paddb %xmm3, %xmm3 1628; SSE2-NEXT: por %xmm7, %xmm3 1629; SSE2-NEXT: retq 1630; 1631; SSSE3-LABEL: test_bitreverse_v32i16: 1632; SSSE3: # %bb.0: 1633; SSSE3-NEXT: movdqa %xmm1, %xmm5 1634; SSSE3-NEXT: movdqa %xmm0, %xmm1 1635; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 1636; SSSE3-NEXT: pshufb %xmm8, %xmm1 1637; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1638; SSSE3-NEXT: movdqa %xmm1, %xmm0 1639; SSSE3-NEXT: pand %xmm9, %xmm0 1640; SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1641; SSSE3-NEXT: movdqa %xmm7, %xmm6 1642; SSSE3-NEXT: pshufb %xmm0, %xmm6 1643; SSSE3-NEXT: psrlw $4, %xmm1 1644; SSSE3-NEXT: pand %xmm9, %xmm1 1645; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1646; SSSE3-NEXT: movdqa %xmm4, %xmm0 1647; SSSE3-NEXT: pshufb %xmm1, %xmm0 1648; SSSE3-NEXT: por %xmm6, %xmm0 1649; SSSE3-NEXT: pshufb %xmm8, %xmm5 1650; SSSE3-NEXT: movdqa %xmm5, %xmm1 1651; SSSE3-NEXT: pand %xmm9, %xmm1 1652; SSSE3-NEXT: movdqa %xmm7, %xmm6 1653; SSSE3-NEXT: pshufb %xmm1, %xmm6 1654; SSSE3-NEXT: psrlw $4, %xmm5 1655; SSSE3-NEXT: pand %xmm9, %xmm5 1656; SSSE3-NEXT: movdqa %xmm4, %xmm1 1657; SSSE3-NEXT: pshufb %xmm5, %xmm1 1658; SSSE3-NEXT: por %xmm6, %xmm1 1659; SSSE3-NEXT: pshufb %xmm8, %xmm2 1660; SSSE3-NEXT: movdqa %xmm2, %xmm5 1661; SSSE3-NEXT: pand %xmm9, %xmm5 1662; SSSE3-NEXT: movdqa %xmm7, %xmm6 1663; SSSE3-NEXT: pshufb %xmm5, %xmm6 1664; SSSE3-NEXT: psrlw $4, %xmm2 1665; SSSE3-NEXT: pand %xmm9, %xmm2 1666; SSSE3-NEXT: movdqa %xmm4, %xmm5 1667; SSSE3-NEXT: pshufb %xmm2, %xmm5 1668; SSSE3-NEXT: por %xmm6, %xmm5 1669; SSSE3-NEXT: pshufb %xmm8, %xmm3 1670; SSSE3-NEXT: movdqa %xmm3, %xmm2 1671; SSSE3-NEXT: pand %xmm9, %xmm2 1672; SSSE3-NEXT: pshufb %xmm2, %xmm7 1673; SSSE3-NEXT: psrlw $4, %xmm3 1674; SSSE3-NEXT: pand %xmm9, %xmm3 1675; SSSE3-NEXT: pshufb %xmm3, %xmm4 1676; SSSE3-NEXT: por %xmm7, %xmm4 1677; SSSE3-NEXT: movdqa %xmm5, %xmm2 1678; SSSE3-NEXT: movdqa %xmm4, %xmm3 1679; SSSE3-NEXT: retq 1680; 1681; AVX1-LABEL: test_bitreverse_v32i16: 1682; AVX1: # %bb.0: 1683; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1684; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 1685; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2 1686; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1687; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm5 1688; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1689; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 1690; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2 1691; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 1692; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1693; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm2 1694; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm2 1695; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm0 1696; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm5 1697; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 1698; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 1699; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 1700; AVX1-NEXT: vpshufb %xmm0, %xmm7, %xmm0 1701; AVX1-NEXT: vpor %xmm0, %xmm5, %xmm0 1702; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1703; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1704; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2 1705; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm5 1706; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 1707; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2 1708; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 1709; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm2 1710; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm2 1711; AVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm1 1712; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm3 1713; AVX1-NEXT: vpshufb %xmm3, %xmm6, %xmm3 1714; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 1715; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1 1716; AVX1-NEXT: vpshufb %xmm1, %xmm7, %xmm1 1717; AVX1-NEXT: vpor %xmm1, %xmm3, %xmm1 1718; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1719; AVX1-NEXT: retq 1720; 1721; AVX2-LABEL: test_bitreverse_v32i16: 1722; AVX2: # %bb.0: 1723; AVX2-NEXT: vmovdqa {{.*#+}} 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] 1724; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 1725; AVX2-NEXT: vmovdqa {{.*#+}} 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] 1726; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm4 1727; AVX2-NEXT: vmovdqa {{.*#+}} 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] 1728; AVX2-NEXT: vpshufb %ymm4, %ymm5, %ymm4 1729; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 1730; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0 1731; AVX2-NEXT: vmovdqa {{.*#+}} 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] 1732; AVX2-NEXT: vpshufb %ymm0, %ymm6, %ymm0 1733; AVX2-NEXT: vpor %ymm0, %ymm4, %ymm0 1734; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 1735; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm2 1736; AVX2-NEXT: vpshufb %ymm2, %ymm5, %ymm2 1737; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm1 1738; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1 1739; AVX2-NEXT: vpshufb %ymm1, %ymm6, %ymm1 1740; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1 1741; AVX2-NEXT: retq 1742; 1743; AVX512F-LABEL: test_bitreverse_v32i16: 1744; AVX512F: # %bb.0: 1745; AVX512F-NEXT: vmovdqa {{.*#+}} 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] 1746; AVX512F-NEXT: vpshufb %ymm2, %ymm0, %ymm0 1747; AVX512F-NEXT: vmovdqa {{.*#+}} 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] 1748; AVX512F-NEXT: vpand %ymm3, %ymm0, %ymm4 1749; AVX512F-NEXT: vmovdqa {{.*#+}} 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] 1750; AVX512F-NEXT: vpshufb %ymm4, %ymm5, %ymm4 1751; AVX512F-NEXT: vpsrlw $4, %ymm0, %ymm0 1752; AVX512F-NEXT: vpand %ymm3, %ymm0, %ymm0 1753; AVX512F-NEXT: vmovdqa {{.*#+}} 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] 1754; AVX512F-NEXT: vpshufb %ymm0, %ymm6, %ymm0 1755; AVX512F-NEXT: vpor %ymm0, %ymm4, %ymm0 1756; AVX512F-NEXT: vpshufb %ymm2, %ymm1, %ymm1 1757; AVX512F-NEXT: vpand %ymm3, %ymm1, %ymm2 1758; AVX512F-NEXT: vpshufb %ymm2, %ymm5, %ymm2 1759; AVX512F-NEXT: vpsrlw $4, %ymm1, %ymm1 1760; AVX512F-NEXT: vpand %ymm3, %ymm1, %ymm1 1761; AVX512F-NEXT: vpshufb %ymm1, %ymm6, %ymm1 1762; AVX512F-NEXT: vpor %ymm1, %ymm2, %ymm1 1763; AVX512F-NEXT: retq 1764; 1765; AVX512BW-LABEL: test_bitreverse_v32i16: 1766; AVX512BW: # %bb.0: 1767; 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] 1768; AVX512BW-NEXT: vmovdqa64 {{.*#+}} 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] 1769; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm2 1770; AVX512BW-NEXT: vmovdqa64 {{.*#+}} 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] 1771; AVX512BW-NEXT: vpshufb %zmm2, %zmm3, %zmm2 1772; AVX512BW-NEXT: vpsrlw $4, %zmm0, %zmm0 1773; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm0 1774; AVX512BW-NEXT: vmovdqa64 {{.*#+}} 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] 1775; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0 1776; AVX512BW-NEXT: vporq %zmm0, %zmm2, %zmm0 1777; AVX512BW-NEXT: retq 1778; 1779; XOPAVX1-LABEL: test_bitreverse_v32i16: 1780; XOPAVX1: # %bb.0: 1781; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1782; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94] 1783; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 1784; XOPAVX1-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm0 1785; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1786; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1787; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 1788; XOPAVX1-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm1 1789; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1790; XOPAVX1-NEXT: retq 1791; 1792; XOPAVX2-LABEL: test_bitreverse_v32i16: 1793; XOPAVX2: # %bb.0: 1794; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 1795; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94] 1796; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 1797; XOPAVX2-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm0 1798; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 1799; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 1800; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 1801; XOPAVX2-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm1 1802; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 1803; XOPAVX2-NEXT: retq 1804 %b = call <32 x i16> @llvm.bitreverse.v32i16(<32 x i16> %a) 1805 ret <32 x i16> %b 1806} 1807 1808define <16 x i32> @test_bitreverse_v16i32(<16 x i32> %a) nounwind { 1809; SSE2-LABEL: test_bitreverse_v16i32: 1810; SSE2: # %bb.0: 1811; SSE2-NEXT: movdqa %xmm3, %xmm15 1812; SSE2-NEXT: pxor %xmm14, %xmm14 1813; SSE2-NEXT: movdqa %xmm0, %xmm3 1814; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm14[8],xmm3[9],xmm14[9],xmm3[10],xmm14[10],xmm3[11],xmm14[11],xmm3[12],xmm14[12],xmm3[13],xmm14[13],xmm3[14],xmm14[14],xmm3[15],xmm14[15] 1815; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7] 1816; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4] 1817; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm14[0],xmm0[1],xmm14[1],xmm0[2],xmm14[2],xmm0[3],xmm14[3],xmm0[4],xmm14[4],xmm0[5],xmm14[5],xmm0[6],xmm14[6],xmm0[7],xmm14[7] 1818; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 1819; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4] 1820; SSE2-NEXT: packuswb %xmm3, %xmm0 1821; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1822; SSE2-NEXT: movdqa %xmm0, %xmm5 1823; SSE2-NEXT: pand %xmm3, %xmm5 1824; SSE2-NEXT: psllw $4, %xmm5 1825; SSE2-NEXT: movdqa %xmm3, %xmm7 1826; SSE2-NEXT: pandn %xmm5, %xmm7 1827; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 1828; SSE2-NEXT: pand %xmm8, %xmm0 1829; SSE2-NEXT: psrlw $4, %xmm0 1830; SSE2-NEXT: pand %xmm3, %xmm0 1831; SSE2-NEXT: por %xmm7, %xmm0 1832; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 1833; SSE2-NEXT: movdqa %xmm0, %xmm7 1834; SSE2-NEXT: pand %xmm5, %xmm7 1835; SSE2-NEXT: psllw $2, %xmm7 1836; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252] 1837; SSE2-NEXT: pand %xmm9, %xmm7 1838; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204] 1839; SSE2-NEXT: pand %xmm10, %xmm0 1840; SSE2-NEXT: psrlw $2, %xmm0 1841; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63] 1842; SSE2-NEXT: pand %xmm11, %xmm0 1843; SSE2-NEXT: por %xmm7, %xmm0 1844; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170] 1845; SSE2-NEXT: movdqa %xmm0, %xmm6 1846; SSE2-NEXT: pand %xmm7, %xmm6 1847; SSE2-NEXT: psrlw $1, %xmm6 1848; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 1849; SSE2-NEXT: pand %xmm12, %xmm6 1850; SSE2-NEXT: movdqa {{.*#+}} xmm13 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 1851; SSE2-NEXT: pand %xmm13, %xmm0 1852; SSE2-NEXT: paddb %xmm0, %xmm0 1853; SSE2-NEXT: por %xmm6, %xmm0 1854; SSE2-NEXT: movdqa %xmm1, %xmm6 1855; SSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm14[8],xmm6[9],xmm14[9],xmm6[10],xmm14[10],xmm6[11],xmm14[11],xmm6[12],xmm14[12],xmm6[13],xmm14[13],xmm6[14],xmm14[14],xmm6[15],xmm14[15] 1856; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7] 1857; SSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4] 1858; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm14[0],xmm1[1],xmm14[1],xmm1[2],xmm14[2],xmm1[3],xmm14[3],xmm1[4],xmm14[4],xmm1[5],xmm14[5],xmm1[6],xmm14[6],xmm1[7],xmm14[7] 1859; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7] 1860; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4] 1861; SSE2-NEXT: packuswb %xmm6, %xmm1 1862; SSE2-NEXT: movdqa %xmm1, %xmm6 1863; SSE2-NEXT: pand %xmm3, %xmm6 1864; SSE2-NEXT: psllw $4, %xmm6 1865; SSE2-NEXT: movdqa %xmm3, %xmm4 1866; SSE2-NEXT: pandn %xmm6, %xmm4 1867; SSE2-NEXT: pand %xmm8, %xmm1 1868; SSE2-NEXT: psrlw $4, %xmm1 1869; SSE2-NEXT: pand %xmm3, %xmm1 1870; SSE2-NEXT: por %xmm4, %xmm1 1871; SSE2-NEXT: movdqa %xmm1, %xmm4 1872; SSE2-NEXT: pand %xmm5, %xmm4 1873; SSE2-NEXT: psllw $2, %xmm4 1874; SSE2-NEXT: pand %xmm9, %xmm4 1875; SSE2-NEXT: pand %xmm10, %xmm1 1876; SSE2-NEXT: psrlw $2, %xmm1 1877; SSE2-NEXT: pand %xmm11, %xmm1 1878; SSE2-NEXT: por %xmm4, %xmm1 1879; SSE2-NEXT: movdqa %xmm1, %xmm4 1880; SSE2-NEXT: pand %xmm7, %xmm4 1881; SSE2-NEXT: psrlw $1, %xmm4 1882; SSE2-NEXT: pand %xmm12, %xmm4 1883; SSE2-NEXT: pand %xmm13, %xmm1 1884; SSE2-NEXT: paddb %xmm1, %xmm1 1885; SSE2-NEXT: por %xmm4, %xmm1 1886; SSE2-NEXT: movdqa %xmm2, %xmm4 1887; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm14[8],xmm4[9],xmm14[9],xmm4[10],xmm14[10],xmm4[11],xmm14[11],xmm4[12],xmm14[12],xmm4[13],xmm14[13],xmm4[14],xmm14[14],xmm4[15],xmm14[15] 1888; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[3,2,1,0,4,5,6,7] 1889; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,7,6,5,4] 1890; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm14[0],xmm2[1],xmm14[1],xmm2[2],xmm14[2],xmm2[3],xmm14[3],xmm2[4],xmm14[4],xmm2[5],xmm14[5],xmm2[6],xmm14[6],xmm2[7],xmm14[7] 1891; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7] 1892; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4] 1893; SSE2-NEXT: packuswb %xmm4, %xmm2 1894; SSE2-NEXT: movdqa %xmm2, %xmm4 1895; SSE2-NEXT: pand %xmm3, %xmm4 1896; SSE2-NEXT: psllw $4, %xmm4 1897; SSE2-NEXT: movdqa %xmm3, %xmm6 1898; SSE2-NEXT: pandn %xmm4, %xmm6 1899; SSE2-NEXT: pand %xmm8, %xmm2 1900; SSE2-NEXT: psrlw $4, %xmm2 1901; SSE2-NEXT: pand %xmm3, %xmm2 1902; SSE2-NEXT: por %xmm6, %xmm2 1903; SSE2-NEXT: movdqa %xmm2, %xmm4 1904; SSE2-NEXT: pand %xmm5, %xmm4 1905; SSE2-NEXT: psllw $2, %xmm4 1906; SSE2-NEXT: pand %xmm9, %xmm4 1907; SSE2-NEXT: pand %xmm10, %xmm2 1908; SSE2-NEXT: psrlw $2, %xmm2 1909; SSE2-NEXT: pand %xmm11, %xmm2 1910; SSE2-NEXT: por %xmm4, %xmm2 1911; SSE2-NEXT: movdqa %xmm2, %xmm4 1912; SSE2-NEXT: pand %xmm7, %xmm4 1913; SSE2-NEXT: psrlw $1, %xmm4 1914; SSE2-NEXT: pand %xmm12, %xmm4 1915; SSE2-NEXT: pand %xmm13, %xmm2 1916; SSE2-NEXT: paddb %xmm2, %xmm2 1917; SSE2-NEXT: por %xmm4, %xmm2 1918; SSE2-NEXT: movdqa %xmm15, %xmm4 1919; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm14[8],xmm4[9],xmm14[9],xmm4[10],xmm14[10],xmm4[11],xmm14[11],xmm4[12],xmm14[12],xmm4[13],xmm14[13],xmm4[14],xmm14[14],xmm4[15],xmm14[15] 1920; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[3,2,1,0,4,5,6,7] 1921; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,7,6,5,4] 1922; SSE2-NEXT: punpcklbw {{.*#+}} xmm15 = xmm15[0],xmm14[0],xmm15[1],xmm14[1],xmm15[2],xmm14[2],xmm15[3],xmm14[3],xmm15[4],xmm14[4],xmm15[5],xmm14[5],xmm15[6],xmm14[6],xmm15[7],xmm14[7] 1923; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm15[3,2,1,0,4,5,6,7] 1924; SSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4] 1925; SSE2-NEXT: packuswb %xmm4, %xmm6 1926; SSE2-NEXT: movdqa %xmm6, %xmm4 1927; SSE2-NEXT: pand %xmm3, %xmm4 1928; SSE2-NEXT: psllw $4, %xmm4 1929; SSE2-NEXT: pand %xmm8, %xmm6 1930; SSE2-NEXT: psrlw $4, %xmm6 1931; SSE2-NEXT: pand %xmm3, %xmm6 1932; SSE2-NEXT: pandn %xmm4, %xmm3 1933; SSE2-NEXT: por %xmm6, %xmm3 1934; SSE2-NEXT: pand %xmm3, %xmm5 1935; SSE2-NEXT: psllw $2, %xmm5 1936; SSE2-NEXT: pand %xmm9, %xmm5 1937; SSE2-NEXT: pand %xmm10, %xmm3 1938; SSE2-NEXT: psrlw $2, %xmm3 1939; SSE2-NEXT: pand %xmm11, %xmm3 1940; SSE2-NEXT: por %xmm5, %xmm3 1941; SSE2-NEXT: pand %xmm3, %xmm7 1942; SSE2-NEXT: psrlw $1, %xmm7 1943; SSE2-NEXT: pand %xmm12, %xmm7 1944; SSE2-NEXT: pand %xmm13, %xmm3 1945; SSE2-NEXT: paddb %xmm3, %xmm3 1946; SSE2-NEXT: por %xmm7, %xmm3 1947; SSE2-NEXT: retq 1948; 1949; SSSE3-LABEL: test_bitreverse_v16i32: 1950; SSSE3: # %bb.0: 1951; SSSE3-NEXT: movdqa %xmm1, %xmm5 1952; SSSE3-NEXT: movdqa %xmm0, %xmm1 1953; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 1954; SSSE3-NEXT: pshufb %xmm8, %xmm1 1955; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1956; SSSE3-NEXT: movdqa %xmm1, %xmm0 1957; SSSE3-NEXT: pand %xmm9, %xmm0 1958; SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1959; SSSE3-NEXT: movdqa %xmm7, %xmm6 1960; SSSE3-NEXT: pshufb %xmm0, %xmm6 1961; SSSE3-NEXT: psrlw $4, %xmm1 1962; SSSE3-NEXT: pand %xmm9, %xmm1 1963; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1964; SSSE3-NEXT: movdqa %xmm4, %xmm0 1965; SSSE3-NEXT: pshufb %xmm1, %xmm0 1966; SSSE3-NEXT: por %xmm6, %xmm0 1967; SSSE3-NEXT: pshufb %xmm8, %xmm5 1968; SSSE3-NEXT: movdqa %xmm5, %xmm1 1969; SSSE3-NEXT: pand %xmm9, %xmm1 1970; SSSE3-NEXT: movdqa %xmm7, %xmm6 1971; SSSE3-NEXT: pshufb %xmm1, %xmm6 1972; SSSE3-NEXT: psrlw $4, %xmm5 1973; SSSE3-NEXT: pand %xmm9, %xmm5 1974; SSSE3-NEXT: movdqa %xmm4, %xmm1 1975; SSSE3-NEXT: pshufb %xmm5, %xmm1 1976; SSSE3-NEXT: por %xmm6, %xmm1 1977; SSSE3-NEXT: pshufb %xmm8, %xmm2 1978; SSSE3-NEXT: movdqa %xmm2, %xmm5 1979; SSSE3-NEXT: pand %xmm9, %xmm5 1980; SSSE3-NEXT: movdqa %xmm7, %xmm6 1981; SSSE3-NEXT: pshufb %xmm5, %xmm6 1982; SSSE3-NEXT: psrlw $4, %xmm2 1983; SSSE3-NEXT: pand %xmm9, %xmm2 1984; SSSE3-NEXT: movdqa %xmm4, %xmm5 1985; SSSE3-NEXT: pshufb %xmm2, %xmm5 1986; SSSE3-NEXT: por %xmm6, %xmm5 1987; SSSE3-NEXT: pshufb %xmm8, %xmm3 1988; SSSE3-NEXT: movdqa %xmm3, %xmm2 1989; SSSE3-NEXT: pand %xmm9, %xmm2 1990; SSSE3-NEXT: pshufb %xmm2, %xmm7 1991; SSSE3-NEXT: psrlw $4, %xmm3 1992; SSSE3-NEXT: pand %xmm9, %xmm3 1993; SSSE3-NEXT: pshufb %xmm3, %xmm4 1994; SSSE3-NEXT: por %xmm7, %xmm4 1995; SSSE3-NEXT: movdqa %xmm5, %xmm2 1996; SSSE3-NEXT: movdqa %xmm4, %xmm3 1997; SSSE3-NEXT: retq 1998; 1999; AVX1-LABEL: test_bitreverse_v16i32: 2000; AVX1: # %bb.0: 2001; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 2002; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 2003; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2 2004; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 2005; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm5 2006; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 2007; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 2008; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2 2009; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 2010; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 2011; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm2 2012; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm2 2013; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm0 2014; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm5 2015; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 2016; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 2017; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 2018; AVX1-NEXT: vpshufb %xmm0, %xmm7, %xmm0 2019; AVX1-NEXT: vpor %xmm0, %xmm5, %xmm0 2020; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 2021; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2022; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2 2023; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm5 2024; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 2025; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2 2026; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 2027; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm2 2028; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm2 2029; AVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm1 2030; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm3 2031; AVX1-NEXT: vpshufb %xmm3, %xmm6, %xmm3 2032; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 2033; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1 2034; AVX1-NEXT: vpshufb %xmm1, %xmm7, %xmm1 2035; AVX1-NEXT: vpor %xmm1, %xmm3, %xmm1 2036; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 2037; AVX1-NEXT: retq 2038; 2039; AVX2-LABEL: test_bitreverse_v16i32: 2040; AVX2: # %bb.0: 2041; AVX2-NEXT: vmovdqa {{.*#+}} 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] 2042; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 2043; AVX2-NEXT: vmovdqa {{.*#+}} 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] 2044; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm4 2045; AVX2-NEXT: vmovdqa {{.*#+}} 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] 2046; AVX2-NEXT: vpshufb %ymm4, %ymm5, %ymm4 2047; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 2048; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0 2049; AVX2-NEXT: vmovdqa {{.*#+}} 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] 2050; AVX2-NEXT: vpshufb %ymm0, %ymm6, %ymm0 2051; AVX2-NEXT: vpor %ymm0, %ymm4, %ymm0 2052; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 2053; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm2 2054; AVX2-NEXT: vpshufb %ymm2, %ymm5, %ymm2 2055; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm1 2056; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1 2057; AVX2-NEXT: vpshufb %ymm1, %ymm6, %ymm1 2058; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1 2059; AVX2-NEXT: retq 2060; 2061; AVX512F-LABEL: test_bitreverse_v16i32: 2062; AVX512F: # %bb.0: 2063; AVX512F-NEXT: vpsrld $24, %zmm0, %zmm1 2064; AVX512F-NEXT: vpsrld $8, %zmm0, %zmm2 2065; AVX512F-NEXT: vpandd {{.*}}(%rip){1to16}, %zmm2, %zmm2 2066; AVX512F-NEXT: vpord %zmm1, %zmm2, %zmm1 2067; AVX512F-NEXT: vpslld $24, %zmm0, %zmm2 2068; AVX512F-NEXT: vpslld $8, %zmm0, %zmm0 2069; AVX512F-NEXT: vpandd {{.*}}(%rip){1to16}, %zmm0, %zmm0 2070; AVX512F-NEXT: vpord %zmm1, %zmm0, %zmm0 2071; AVX512F-NEXT: vpord %zmm0, %zmm2, %zmm0 2072; AVX512F-NEXT: vpandd {{.*}}(%rip){1to16}, %zmm0, %zmm1 2073; AVX512F-NEXT: vpslld $4, %zmm1, %zmm1 2074; AVX512F-NEXT: vpandd {{.*}}(%rip){1to16}, %zmm0, %zmm0 2075; AVX512F-NEXT: vpsrld $4, %zmm0, %zmm0 2076; AVX512F-NEXT: vpord %zmm1, %zmm0, %zmm0 2077; AVX512F-NEXT: vpandd {{.*}}(%rip){1to16}, %zmm0, %zmm1 2078; AVX512F-NEXT: vpslld $2, %zmm1, %zmm1 2079; AVX512F-NEXT: vpandd {{.*}}(%rip){1to16}, %zmm0, %zmm0 2080; AVX512F-NEXT: vpsrld $2, %zmm0, %zmm0 2081; AVX512F-NEXT: vpord %zmm1, %zmm0, %zmm0 2082; AVX512F-NEXT: vpandd {{.*}}(%rip){1to16}, %zmm0, %zmm1 2083; AVX512F-NEXT: vpslld $1, %zmm1, %zmm1 2084; AVX512F-NEXT: vpandd {{.*}}(%rip){1to16}, %zmm0, %zmm0 2085; AVX512F-NEXT: vpsrld $1, %zmm0, %zmm0 2086; AVX512F-NEXT: vpord %zmm1, %zmm0, %zmm0 2087; AVX512F-NEXT: retq 2088; 2089; AVX512BW-LABEL: test_bitreverse_v16i32: 2090; AVX512BW: # %bb.0: 2091; 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] 2092; AVX512BW-NEXT: vmovdqa64 {{.*#+}} 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] 2093; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm2 2094; AVX512BW-NEXT: vmovdqa64 {{.*#+}} 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] 2095; AVX512BW-NEXT: vpshufb %zmm2, %zmm3, %zmm2 2096; AVX512BW-NEXT: vpsrlw $4, %zmm0, %zmm0 2097; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm0 2098; AVX512BW-NEXT: vmovdqa64 {{.*#+}} 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] 2099; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0 2100; AVX512BW-NEXT: vporq %zmm0, %zmm2, %zmm0 2101; AVX512BW-NEXT: retq 2102; 2103; XOPAVX1-LABEL: test_bitreverse_v16i32: 2104; XOPAVX1: # %bb.0: 2105; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 2106; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92] 2107; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2108; XOPAVX1-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm0 2109; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 2110; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2111; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2112; XOPAVX1-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm1 2113; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 2114; XOPAVX1-NEXT: retq 2115; 2116; XOPAVX2-LABEL: test_bitreverse_v16i32: 2117; XOPAVX2: # %bb.0: 2118; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 2119; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92] 2120; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2121; XOPAVX2-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm0 2122; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 2123; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 2124; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2125; XOPAVX2-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm1 2126; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 2127; XOPAVX2-NEXT: retq 2128 %b = call <16 x i32> @llvm.bitreverse.v16i32(<16 x i32> %a) 2129 ret <16 x i32> %b 2130} 2131 2132define <8 x i64> @test_bitreverse_v8i64(<8 x i64> %a) nounwind { 2133; SSE2-LABEL: test_bitreverse_v8i64: 2134; SSE2: # %bb.0: 2135; SSE2-NEXT: movdqa %xmm3, %xmm15 2136; SSE2-NEXT: pxor %xmm14, %xmm14 2137; SSE2-NEXT: movdqa %xmm0, %xmm3 2138; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm14[8],xmm3[9],xmm14[9],xmm3[10],xmm14[10],xmm3[11],xmm14[11],xmm3[12],xmm14[12],xmm3[13],xmm14[13],xmm3[14],xmm14[14],xmm3[15],xmm14[15] 2139; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,3,0,1] 2140; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7] 2141; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4] 2142; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm14[0],xmm0[1],xmm14[1],xmm0[2],xmm14[2],xmm0[3],xmm14[3],xmm0[4],xmm14[4],xmm0[5],xmm14[5],xmm0[6],xmm14[6],xmm0[7],xmm14[7] 2143; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2144; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 2145; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4] 2146; SSE2-NEXT: packuswb %xmm3, %xmm0 2147; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 2148; SSE2-NEXT: movdqa %xmm0, %xmm5 2149; SSE2-NEXT: pand %xmm3, %xmm5 2150; SSE2-NEXT: psllw $4, %xmm5 2151; SSE2-NEXT: movdqa %xmm3, %xmm7 2152; SSE2-NEXT: pandn %xmm5, %xmm7 2153; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 2154; SSE2-NEXT: pand %xmm8, %xmm0 2155; SSE2-NEXT: psrlw $4, %xmm0 2156; SSE2-NEXT: pand %xmm3, %xmm0 2157; SSE2-NEXT: por %xmm7, %xmm0 2158; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 2159; SSE2-NEXT: movdqa %xmm0, %xmm7 2160; SSE2-NEXT: pand %xmm5, %xmm7 2161; SSE2-NEXT: psllw $2, %xmm7 2162; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252] 2163; SSE2-NEXT: pand %xmm9, %xmm7 2164; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204] 2165; SSE2-NEXT: pand %xmm10, %xmm0 2166; SSE2-NEXT: psrlw $2, %xmm0 2167; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63] 2168; SSE2-NEXT: pand %xmm11, %xmm0 2169; SSE2-NEXT: por %xmm7, %xmm0 2170; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170] 2171; SSE2-NEXT: movdqa %xmm0, %xmm6 2172; SSE2-NEXT: pand %xmm7, %xmm6 2173; SSE2-NEXT: psrlw $1, %xmm6 2174; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 2175; SSE2-NEXT: pand %xmm12, %xmm6 2176; SSE2-NEXT: movdqa {{.*#+}} xmm13 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 2177; SSE2-NEXT: pand %xmm13, %xmm0 2178; SSE2-NEXT: paddb %xmm0, %xmm0 2179; SSE2-NEXT: por %xmm6, %xmm0 2180; SSE2-NEXT: movdqa %xmm1, %xmm6 2181; SSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm14[8],xmm6[9],xmm14[9],xmm6[10],xmm14[10],xmm6[11],xmm14[11],xmm6[12],xmm14[12],xmm6[13],xmm14[13],xmm6[14],xmm14[14],xmm6[15],xmm14[15] 2182; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[2,3,0,1] 2183; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7] 2184; SSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4] 2185; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm14[0],xmm1[1],xmm14[1],xmm1[2],xmm14[2],xmm1[3],xmm14[3],xmm1[4],xmm14[4],xmm1[5],xmm14[5],xmm1[6],xmm14[6],xmm1[7],xmm14[7] 2186; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] 2187; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7] 2188; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4] 2189; SSE2-NEXT: packuswb %xmm6, %xmm1 2190; SSE2-NEXT: movdqa %xmm1, %xmm6 2191; SSE2-NEXT: pand %xmm3, %xmm6 2192; SSE2-NEXT: psllw $4, %xmm6 2193; SSE2-NEXT: movdqa %xmm3, %xmm4 2194; SSE2-NEXT: pandn %xmm6, %xmm4 2195; SSE2-NEXT: pand %xmm8, %xmm1 2196; SSE2-NEXT: psrlw $4, %xmm1 2197; SSE2-NEXT: pand %xmm3, %xmm1 2198; SSE2-NEXT: por %xmm4, %xmm1 2199; SSE2-NEXT: movdqa %xmm1, %xmm4 2200; SSE2-NEXT: pand %xmm5, %xmm4 2201; SSE2-NEXT: psllw $2, %xmm4 2202; SSE2-NEXT: pand %xmm9, %xmm4 2203; SSE2-NEXT: pand %xmm10, %xmm1 2204; SSE2-NEXT: psrlw $2, %xmm1 2205; SSE2-NEXT: pand %xmm11, %xmm1 2206; SSE2-NEXT: por %xmm4, %xmm1 2207; SSE2-NEXT: movdqa %xmm1, %xmm4 2208; SSE2-NEXT: pand %xmm7, %xmm4 2209; SSE2-NEXT: psrlw $1, %xmm4 2210; SSE2-NEXT: pand %xmm12, %xmm4 2211; SSE2-NEXT: pand %xmm13, %xmm1 2212; SSE2-NEXT: paddb %xmm1, %xmm1 2213; SSE2-NEXT: por %xmm4, %xmm1 2214; SSE2-NEXT: movdqa %xmm2, %xmm4 2215; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm14[8],xmm4[9],xmm14[9],xmm4[10],xmm14[10],xmm4[11],xmm14[11],xmm4[12],xmm14[12],xmm4[13],xmm14[13],xmm4[14],xmm14[14],xmm4[15],xmm14[15] 2216; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[2,3,0,1] 2217; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[3,2,1,0,4,5,6,7] 2218; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,7,6,5,4] 2219; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm14[0],xmm2[1],xmm14[1],xmm2[2],xmm14[2],xmm2[3],xmm14[3],xmm2[4],xmm14[4],xmm2[5],xmm14[5],xmm2[6],xmm14[6],xmm2[7],xmm14[7] 2220; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1] 2221; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7] 2222; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4] 2223; SSE2-NEXT: packuswb %xmm4, %xmm2 2224; SSE2-NEXT: movdqa %xmm2, %xmm4 2225; SSE2-NEXT: pand %xmm3, %xmm4 2226; SSE2-NEXT: psllw $4, %xmm4 2227; SSE2-NEXT: movdqa %xmm3, %xmm6 2228; SSE2-NEXT: pandn %xmm4, %xmm6 2229; SSE2-NEXT: pand %xmm8, %xmm2 2230; SSE2-NEXT: psrlw $4, %xmm2 2231; SSE2-NEXT: pand %xmm3, %xmm2 2232; SSE2-NEXT: por %xmm6, %xmm2 2233; SSE2-NEXT: movdqa %xmm2, %xmm4 2234; SSE2-NEXT: pand %xmm5, %xmm4 2235; SSE2-NEXT: psllw $2, %xmm4 2236; SSE2-NEXT: pand %xmm9, %xmm4 2237; SSE2-NEXT: pand %xmm10, %xmm2 2238; SSE2-NEXT: psrlw $2, %xmm2 2239; SSE2-NEXT: pand %xmm11, %xmm2 2240; SSE2-NEXT: por %xmm4, %xmm2 2241; SSE2-NEXT: movdqa %xmm2, %xmm4 2242; SSE2-NEXT: pand %xmm7, %xmm4 2243; SSE2-NEXT: psrlw $1, %xmm4 2244; SSE2-NEXT: pand %xmm12, %xmm4 2245; SSE2-NEXT: pand %xmm13, %xmm2 2246; SSE2-NEXT: paddb %xmm2, %xmm2 2247; SSE2-NEXT: por %xmm4, %xmm2 2248; SSE2-NEXT: movdqa %xmm15, %xmm4 2249; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm14[8],xmm4[9],xmm14[9],xmm4[10],xmm14[10],xmm4[11],xmm14[11],xmm4[12],xmm14[12],xmm4[13],xmm14[13],xmm4[14],xmm14[14],xmm4[15],xmm14[15] 2250; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[2,3,0,1] 2251; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[3,2,1,0,4,5,6,7] 2252; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,7,6,5,4] 2253; SSE2-NEXT: punpcklbw {{.*#+}} xmm15 = xmm15[0],xmm14[0],xmm15[1],xmm14[1],xmm15[2],xmm14[2],xmm15[3],xmm14[3],xmm15[4],xmm14[4],xmm15[5],xmm14[5],xmm15[6],xmm14[6],xmm15[7],xmm14[7] 2254; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm15[2,3,0,1] 2255; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7] 2256; SSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4] 2257; SSE2-NEXT: packuswb %xmm4, %xmm6 2258; SSE2-NEXT: movdqa %xmm6, %xmm4 2259; SSE2-NEXT: pand %xmm3, %xmm4 2260; SSE2-NEXT: psllw $4, %xmm4 2261; SSE2-NEXT: pand %xmm8, %xmm6 2262; SSE2-NEXT: psrlw $4, %xmm6 2263; SSE2-NEXT: pand %xmm3, %xmm6 2264; SSE2-NEXT: pandn %xmm4, %xmm3 2265; SSE2-NEXT: por %xmm6, %xmm3 2266; SSE2-NEXT: pand %xmm3, %xmm5 2267; SSE2-NEXT: psllw $2, %xmm5 2268; SSE2-NEXT: pand %xmm9, %xmm5 2269; SSE2-NEXT: pand %xmm10, %xmm3 2270; SSE2-NEXT: psrlw $2, %xmm3 2271; SSE2-NEXT: pand %xmm11, %xmm3 2272; SSE2-NEXT: por %xmm5, %xmm3 2273; SSE2-NEXT: pand %xmm3, %xmm7 2274; SSE2-NEXT: psrlw $1, %xmm7 2275; SSE2-NEXT: pand %xmm12, %xmm7 2276; SSE2-NEXT: pand %xmm13, %xmm3 2277; SSE2-NEXT: paddb %xmm3, %xmm3 2278; SSE2-NEXT: por %xmm7, %xmm3 2279; SSE2-NEXT: retq 2280; 2281; SSSE3-LABEL: test_bitreverse_v8i64: 2282; SSSE3: # %bb.0: 2283; SSSE3-NEXT: movdqa %xmm1, %xmm5 2284; SSSE3-NEXT: movdqa %xmm0, %xmm1 2285; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 2286; SSSE3-NEXT: pshufb %xmm8, %xmm1 2287; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 2288; SSSE3-NEXT: movdqa %xmm1, %xmm0 2289; SSSE3-NEXT: pand %xmm9, %xmm0 2290; SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 2291; SSSE3-NEXT: movdqa %xmm7, %xmm6 2292; SSSE3-NEXT: pshufb %xmm0, %xmm6 2293; SSSE3-NEXT: psrlw $4, %xmm1 2294; SSSE3-NEXT: pand %xmm9, %xmm1 2295; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 2296; SSSE3-NEXT: movdqa %xmm4, %xmm0 2297; SSSE3-NEXT: pshufb %xmm1, %xmm0 2298; SSSE3-NEXT: por %xmm6, %xmm0 2299; SSSE3-NEXT: pshufb %xmm8, %xmm5 2300; SSSE3-NEXT: movdqa %xmm5, %xmm1 2301; SSSE3-NEXT: pand %xmm9, %xmm1 2302; SSSE3-NEXT: movdqa %xmm7, %xmm6 2303; SSSE3-NEXT: pshufb %xmm1, %xmm6 2304; SSSE3-NEXT: psrlw $4, %xmm5 2305; SSSE3-NEXT: pand %xmm9, %xmm5 2306; SSSE3-NEXT: movdqa %xmm4, %xmm1 2307; SSSE3-NEXT: pshufb %xmm5, %xmm1 2308; SSSE3-NEXT: por %xmm6, %xmm1 2309; SSSE3-NEXT: pshufb %xmm8, %xmm2 2310; SSSE3-NEXT: movdqa %xmm2, %xmm5 2311; SSSE3-NEXT: pand %xmm9, %xmm5 2312; SSSE3-NEXT: movdqa %xmm7, %xmm6 2313; SSSE3-NEXT: pshufb %xmm5, %xmm6 2314; SSSE3-NEXT: psrlw $4, %xmm2 2315; SSSE3-NEXT: pand %xmm9, %xmm2 2316; SSSE3-NEXT: movdqa %xmm4, %xmm5 2317; SSSE3-NEXT: pshufb %xmm2, %xmm5 2318; SSSE3-NEXT: por %xmm6, %xmm5 2319; SSSE3-NEXT: pshufb %xmm8, %xmm3 2320; SSSE3-NEXT: movdqa %xmm3, %xmm2 2321; SSSE3-NEXT: pand %xmm9, %xmm2 2322; SSSE3-NEXT: pshufb %xmm2, %xmm7 2323; SSSE3-NEXT: psrlw $4, %xmm3 2324; SSSE3-NEXT: pand %xmm9, %xmm3 2325; SSSE3-NEXT: pshufb %xmm3, %xmm4 2326; SSSE3-NEXT: por %xmm7, %xmm4 2327; SSSE3-NEXT: movdqa %xmm5, %xmm2 2328; SSSE3-NEXT: movdqa %xmm4, %xmm3 2329; SSSE3-NEXT: retq 2330; 2331; AVX1-LABEL: test_bitreverse_v8i64: 2332; AVX1: # %bb.0: 2333; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 2334; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 2335; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2 2336; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 2337; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm5 2338; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 2339; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 2340; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2 2341; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 2342; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 2343; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm2 2344; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm2 2345; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm0 2346; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm5 2347; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 2348; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 2349; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 2350; AVX1-NEXT: vpshufb %xmm0, %xmm7, %xmm0 2351; AVX1-NEXT: vpor %xmm0, %xmm5, %xmm0 2352; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 2353; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2354; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2 2355; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm5 2356; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 2357; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2 2358; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 2359; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm2 2360; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm2 2361; AVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm1 2362; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm3 2363; AVX1-NEXT: vpshufb %xmm3, %xmm6, %xmm3 2364; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 2365; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1 2366; AVX1-NEXT: vpshufb %xmm1, %xmm7, %xmm1 2367; AVX1-NEXT: vpor %xmm1, %xmm3, %xmm1 2368; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 2369; AVX1-NEXT: retq 2370; 2371; AVX2-LABEL: test_bitreverse_v8i64: 2372; AVX2: # %bb.0: 2373; AVX2-NEXT: vmovdqa {{.*#+}} 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] 2374; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 2375; AVX2-NEXT: vmovdqa {{.*#+}} 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] 2376; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm4 2377; AVX2-NEXT: vmovdqa {{.*#+}} 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] 2378; AVX2-NEXT: vpshufb %ymm4, %ymm5, %ymm4 2379; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 2380; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0 2381; AVX2-NEXT: vmovdqa {{.*#+}} 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] 2382; AVX2-NEXT: vpshufb %ymm0, %ymm6, %ymm0 2383; AVX2-NEXT: vpor %ymm0, %ymm4, %ymm0 2384; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 2385; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm2 2386; AVX2-NEXT: vpshufb %ymm2, %ymm5, %ymm2 2387; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm1 2388; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1 2389; AVX2-NEXT: vpshufb %ymm1, %ymm6, %ymm1 2390; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1 2391; AVX2-NEXT: retq 2392; 2393; AVX512F-LABEL: test_bitreverse_v8i64: 2394; AVX512F: # %bb.0: 2395; AVX512F-NEXT: vpsrlq $56, %zmm0, %zmm1 2396; AVX512F-NEXT: vpsrlq $40, %zmm0, %zmm2 2397; AVX512F-NEXT: vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2 2398; AVX512F-NEXT: vporq %zmm1, %zmm2, %zmm1 2399; AVX512F-NEXT: vpsrlq $24, %zmm0, %zmm2 2400; AVX512F-NEXT: vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2 2401; AVX512F-NEXT: vporq %zmm1, %zmm2, %zmm1 2402; AVX512F-NEXT: vpsrlq $8, %zmm0, %zmm2 2403; AVX512F-NEXT: vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2 2404; AVX512F-NEXT: vporq %zmm1, %zmm2, %zmm1 2405; AVX512F-NEXT: vpsllq $8, %zmm0, %zmm2 2406; AVX512F-NEXT: vpandq {{.*}}(%rip){1to8}, %zmm2, %zmm2 2407; AVX512F-NEXT: vpsllq $24, %zmm0, %zmm3 2408; AVX512F-NEXT: vpandq {{.*}}(%rip){1to8}, %zmm3, %zmm3 2409; AVX512F-NEXT: vporq %zmm2, %zmm3, %zmm2 2410; AVX512F-NEXT: vpsllq $56, %zmm0, %zmm3 2411; AVX512F-NEXT: vpsllq $40, %zmm0, %zmm0 2412; AVX512F-NEXT: vpandq {{.*}}(%rip){1to8}, %zmm0, %zmm0 2413; AVX512F-NEXT: vporq %zmm2, %zmm0, %zmm0 2414; AVX512F-NEXT: vporq %zmm1, %zmm0, %zmm0 2415; AVX512F-NEXT: vporq %zmm0, %zmm3, %zmm0 2416; AVX512F-NEXT: vpandq {{.*}}(%rip){1to8}, %zmm0, %zmm1 2417; AVX512F-NEXT: vpsllq $4, %zmm1, %zmm1 2418; AVX512F-NEXT: vpandq {{.*}}(%rip){1to8}, %zmm0, %zmm0 2419; AVX512F-NEXT: vpsrlq $4, %zmm0, %zmm0 2420; AVX512F-NEXT: vporq %zmm1, %zmm0, %zmm0 2421; AVX512F-NEXT: vpandq {{.*}}(%rip){1to8}, %zmm0, %zmm1 2422; AVX512F-NEXT: vpsllq $2, %zmm1, %zmm1 2423; AVX512F-NEXT: vpandq {{.*}}(%rip){1to8}, %zmm0, %zmm0 2424; AVX512F-NEXT: vpsrlq $2, %zmm0, %zmm0 2425; AVX512F-NEXT: vporq %zmm1, %zmm0, %zmm0 2426; AVX512F-NEXT: vpandq {{.*}}(%rip){1to8}, %zmm0, %zmm1 2427; AVX512F-NEXT: vpsllq $1, %zmm1, %zmm1 2428; AVX512F-NEXT: vpandq {{.*}}(%rip){1to8}, %zmm0, %zmm0 2429; AVX512F-NEXT: vpsrlq $1, %zmm0, %zmm0 2430; AVX512F-NEXT: vporq %zmm1, %zmm0, %zmm0 2431; AVX512F-NEXT: retq 2432; 2433; AVX512BW-LABEL: test_bitreverse_v8i64: 2434; AVX512BW: # %bb.0: 2435; 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] 2436; AVX512BW-NEXT: vmovdqa64 {{.*#+}} 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] 2437; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm2 2438; AVX512BW-NEXT: vmovdqa64 {{.*#+}} 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] 2439; AVX512BW-NEXT: vpshufb %zmm2, %zmm3, %zmm2 2440; AVX512BW-NEXT: vpsrlw $4, %zmm0, %zmm0 2441; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm0 2442; AVX512BW-NEXT: vmovdqa64 {{.*#+}} 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] 2443; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0 2444; AVX512BW-NEXT: vporq %zmm0, %zmm2, %zmm0 2445; AVX512BW-NEXT: retq 2446; 2447; XOPAVX1-LABEL: test_bitreverse_v8i64: 2448; XOPAVX1: # %bb.0: 2449; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 2450; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88] 2451; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2452; XOPAVX1-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm0 2453; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 2454; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2455; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2456; XOPAVX1-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm1 2457; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 2458; XOPAVX1-NEXT: retq 2459; 2460; XOPAVX2-LABEL: test_bitreverse_v8i64: 2461; XOPAVX2: # %bb.0: 2462; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 2463; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88] 2464; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2465; XOPAVX2-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm0 2466; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 2467; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 2468; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2469; XOPAVX2-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm1 2470; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 2471; XOPAVX2-NEXT: retq 2472 %b = call <8 x i64> @llvm.bitreverse.v8i64(<8 x i64> %a) 2473 ret <8 x i64> %b 2474} 2475 2476; 2477; Constant Folding 2478; 2479 2480define i32 @fold_bitreverse_i32() nounwind { 2481; ALL-LABEL: fold_bitreverse_i32: 2482; ALL: # %bb.0: 2483; ALL-NEXT: movl $16711935, %eax # imm = 0xFF00FF 2484; ALL-NEXT: retq 2485 %b = call i32 @llvm.bitreverse.i32(i32 4278255360) 2486 ret i32 %b 2487} 2488 2489define <16 x i8> @fold_bitreverse_v16i8() nounwind { 2490; SSE-LABEL: fold_bitreverse_v16i8: 2491; SSE: # %bb.0: 2492; SSE-NEXT: movaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143] 2493; SSE-NEXT: retq 2494; 2495; AVX-LABEL: fold_bitreverse_v16i8: 2496; AVX: # %bb.0: 2497; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143] 2498; AVX-NEXT: retq 2499; 2500; XOP-LABEL: fold_bitreverse_v16i8: 2501; XOP: # %bb.0: 2502; XOP-NEXT: vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143] 2503; XOP-NEXT: retq 2504 %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>) 2505 ret <16 x i8> %b 2506} 2507 2508define <16 x i16> @fold_bitreverse_v16i16() nounwind { 2509; SSE-LABEL: fold_bitreverse_v16i16: 2510; SSE: # %bb.0: 2511; SSE-NEXT: movaps {{.*#+}} xmm0 = [0,65535,16384,49151,8192,57343,24576,40959] 2512; SSE-NEXT: movaps {{.*#+}} xmm1 = [4096,61439,20480,45055,12288,53247,28672,36863] 2513; SSE-NEXT: retq 2514; 2515; AVX-LABEL: fold_bitreverse_v16i16: 2516; AVX: # %bb.0: 2517; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863] 2518; AVX-NEXT: retq 2519; 2520; XOP-LABEL: fold_bitreverse_v16i16: 2521; XOP: # %bb.0: 2522; XOP-NEXT: vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863] 2523; XOP-NEXT: retq 2524 %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>) 2525 ret <16 x i16> %b 2526} 2527 2528define <16 x i32> @fold_bitreverse_v16i32() nounwind { 2529; SSE-LABEL: fold_bitreverse_v16i32: 2530; SSE: # %bb.0: 2531; SSE-NEXT: movaps {{.*#+}} xmm0 = [0,4294967295,1073741824,3221225471] 2532; SSE-NEXT: movaps {{.*#+}} xmm1 = [536870912,3758096383,1610612736,2684354559] 2533; SSE-NEXT: movaps {{.*#+}} xmm2 = [268435456,4026531839,1342177280,2952790015] 2534; SSE-NEXT: movaps {{.*#+}} xmm3 = [805306368,3489660927,1879048192,2415919103] 2535; SSE-NEXT: retq 2536; 2537; AVX1-LABEL: fold_bitreverse_v16i32: 2538; AVX1: # %bb.0: 2539; AVX1-NEXT: vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559] 2540; AVX1-NEXT: vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103] 2541; AVX1-NEXT: retq 2542; 2543; AVX2-LABEL: fold_bitreverse_v16i32: 2544; AVX2: # %bb.0: 2545; AVX2-NEXT: vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559] 2546; AVX2-NEXT: vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103] 2547; AVX2-NEXT: retq 2548; 2549; AVX512-LABEL: fold_bitreverse_v16i32: 2550; AVX512: # %bb.0: 2551; AVX512-NEXT: vmovaps {{.*#+}} zmm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559,268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103] 2552; AVX512-NEXT: retq 2553; 2554; XOP-LABEL: fold_bitreverse_v16i32: 2555; XOP: # %bb.0: 2556; XOP-NEXT: vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559] 2557; XOP-NEXT: vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103] 2558; XOP-NEXT: retq 2559 %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>) 2560 ret <16 x i32> %b 2561} 2562 2563declare i8 @llvm.bitreverse.i8(i8) readnone 2564declare i16 @llvm.bitreverse.i16(i16) readnone 2565declare i32 @llvm.bitreverse.i32(i32) readnone 2566declare i64 @llvm.bitreverse.i64(i64) readnone 2567 2568declare <16 x i8> @llvm.bitreverse.v16i8(<16 x i8>) readnone 2569declare <8 x i16> @llvm.bitreverse.v8i16(<8 x i16>) readnone 2570declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>) readnone 2571declare <2 x i64> @llvm.bitreverse.v2i64(<2 x i64>) readnone 2572 2573declare <32 x i8> @llvm.bitreverse.v32i8(<32 x i8>) readnone 2574declare <16 x i16> @llvm.bitreverse.v16i16(<16 x i16>) readnone 2575declare <8 x i32> @llvm.bitreverse.v8i32(<8 x i32>) readnone 2576declare <4 x i64> @llvm.bitreverse.v4i64(<4 x i64>) readnone 2577 2578declare <64 x i8> @llvm.bitreverse.v64i8(<64 x i8>) readnone 2579declare <32 x i16> @llvm.bitreverse.v32i16(<32 x i16>) readnone 2580declare <16 x i32> @llvm.bitreverse.v16i32(<16 x i32>) readnone 2581declare <8 x i64> @llvm.bitreverse.v8i64(<8 x i64>) readnone 2582