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