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; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3,+gfni | FileCheck %s --check-prefix=ALL --check-prefix=GFNISSE 11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+gfni | FileCheck %s --check-prefix=ALL --check-prefix=GFNIAVX 12; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+gfni | FileCheck %s --check-prefix=ALL --check-prefix=GFNIAVX2 13; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+gfni | FileCheck %s --check-prefix=ALL --check-prefix=GFNIAVX512F 14; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+gfni | FileCheck %s --check-prefix=ALL --check-prefix=GFNIAVX512BW 15 16; Make sure we don't crash with avx512bw and xop 17; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx512bw 18 19define i8 @test_bitreverse_i8(i8 %a) nounwind { 20; SSE-LABEL: test_bitreverse_i8: 21; SSE: # %bb.0: 22; SSE-NEXT: rolb $4, %dil 23; SSE-NEXT: movl %edi, %eax 24; SSE-NEXT: andb $51, %al 25; SSE-NEXT: shlb $2, %al 26; SSE-NEXT: shrb $2, %dil 27; SSE-NEXT: andb $51, %dil 28; SSE-NEXT: orb %al, %dil 29; SSE-NEXT: movl %edi, %eax 30; SSE-NEXT: andb $85, %al 31; SSE-NEXT: addb %al, %al 32; SSE-NEXT: shrb %dil 33; SSE-NEXT: andb $85, %dil 34; SSE-NEXT: orb %dil, %al 35; SSE-NEXT: retq 36; 37; AVX-LABEL: test_bitreverse_i8: 38; AVX: # %bb.0: 39; AVX-NEXT: rolb $4, %dil 40; AVX-NEXT: movl %edi, %eax 41; AVX-NEXT: andb $51, %al 42; AVX-NEXT: shlb $2, %al 43; AVX-NEXT: shrb $2, %dil 44; AVX-NEXT: andb $51, %dil 45; AVX-NEXT: orb %al, %dil 46; AVX-NEXT: movl %edi, %eax 47; AVX-NEXT: andb $85, %al 48; AVX-NEXT: addb %al, %al 49; AVX-NEXT: shrb %dil 50; AVX-NEXT: andb $85, %dil 51; AVX-NEXT: orb %dil, %al 52; AVX-NEXT: retq 53; 54; XOP-LABEL: test_bitreverse_i8: 55; XOP: # %bb.0: 56; XOP-NEXT: vmovd %edi, %xmm0 57; XOP-NEXT: vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0 58; XOP-NEXT: vmovd %xmm0, %eax 59; XOP-NEXT: # kill: def $al killed $al killed $eax 60; XOP-NEXT: retq 61; 62; GFNISSE-LABEL: test_bitreverse_i8: 63; GFNISSE: # %bb.0: 64; GFNISSE-NEXT: rolb $4, %dil 65; GFNISSE-NEXT: movl %edi, %eax 66; GFNISSE-NEXT: andb $51, %al 67; GFNISSE-NEXT: shlb $2, %al 68; GFNISSE-NEXT: shrb $2, %dil 69; GFNISSE-NEXT: andb $51, %dil 70; GFNISSE-NEXT: orb %al, %dil 71; GFNISSE-NEXT: movl %edi, %eax 72; GFNISSE-NEXT: andb $85, %al 73; GFNISSE-NEXT: addb %al, %al 74; GFNISSE-NEXT: shrb %dil 75; GFNISSE-NEXT: andb $85, %dil 76; GFNISSE-NEXT: orb %dil, %al 77; GFNISSE-NEXT: retq 78; 79; GFNIAVX-LABEL: test_bitreverse_i8: 80; GFNIAVX: # %bb.0: 81; GFNIAVX-NEXT: rolb $4, %dil 82; GFNIAVX-NEXT: movl %edi, %eax 83; GFNIAVX-NEXT: andb $51, %al 84; GFNIAVX-NEXT: shlb $2, %al 85; GFNIAVX-NEXT: shrb $2, %dil 86; GFNIAVX-NEXT: andb $51, %dil 87; GFNIAVX-NEXT: orb %al, %dil 88; GFNIAVX-NEXT: movl %edi, %eax 89; GFNIAVX-NEXT: andb $85, %al 90; GFNIAVX-NEXT: addb %al, %al 91; GFNIAVX-NEXT: shrb %dil 92; GFNIAVX-NEXT: andb $85, %dil 93; GFNIAVX-NEXT: orb %dil, %al 94; GFNIAVX-NEXT: retq 95; 96; GFNIAVX2-LABEL: test_bitreverse_i8: 97; GFNIAVX2: # %bb.0: 98; GFNIAVX2-NEXT: rolb $4, %dil 99; GFNIAVX2-NEXT: movl %edi, %eax 100; GFNIAVX2-NEXT: andb $51, %al 101; GFNIAVX2-NEXT: shlb $2, %al 102; GFNIAVX2-NEXT: shrb $2, %dil 103; GFNIAVX2-NEXT: andb $51, %dil 104; GFNIAVX2-NEXT: orb %al, %dil 105; GFNIAVX2-NEXT: movl %edi, %eax 106; GFNIAVX2-NEXT: andb $85, %al 107; GFNIAVX2-NEXT: addb %al, %al 108; GFNIAVX2-NEXT: shrb %dil 109; GFNIAVX2-NEXT: andb $85, %dil 110; GFNIAVX2-NEXT: orb %dil, %al 111; GFNIAVX2-NEXT: retq 112; 113; GFNIAVX512F-LABEL: test_bitreverse_i8: 114; GFNIAVX512F: # %bb.0: 115; GFNIAVX512F-NEXT: rolb $4, %dil 116; GFNIAVX512F-NEXT: movl %edi, %eax 117; GFNIAVX512F-NEXT: andb $51, %al 118; GFNIAVX512F-NEXT: shlb $2, %al 119; GFNIAVX512F-NEXT: shrb $2, %dil 120; GFNIAVX512F-NEXT: andb $51, %dil 121; GFNIAVX512F-NEXT: orb %al, %dil 122; GFNIAVX512F-NEXT: movl %edi, %eax 123; GFNIAVX512F-NEXT: andb $85, %al 124; GFNIAVX512F-NEXT: addb %al, %al 125; GFNIAVX512F-NEXT: shrb %dil 126; GFNIAVX512F-NEXT: andb $85, %dil 127; GFNIAVX512F-NEXT: orb %dil, %al 128; GFNIAVX512F-NEXT: retq 129; 130; GFNIAVX512BW-LABEL: test_bitreverse_i8: 131; GFNIAVX512BW: # %bb.0: 132; GFNIAVX512BW-NEXT: rolb $4, %dil 133; GFNIAVX512BW-NEXT: movl %edi, %eax 134; GFNIAVX512BW-NEXT: andb $51, %al 135; GFNIAVX512BW-NEXT: shlb $2, %al 136; GFNIAVX512BW-NEXT: shrb $2, %dil 137; GFNIAVX512BW-NEXT: andb $51, %dil 138; GFNIAVX512BW-NEXT: orb %al, %dil 139; GFNIAVX512BW-NEXT: movl %edi, %eax 140; GFNIAVX512BW-NEXT: andb $85, %al 141; GFNIAVX512BW-NEXT: addb %al, %al 142; GFNIAVX512BW-NEXT: shrb %dil 143; GFNIAVX512BW-NEXT: andb $85, %dil 144; GFNIAVX512BW-NEXT: orb %dil, %al 145; GFNIAVX512BW-NEXT: retq 146 %b = call i8 @llvm.bitreverse.i8(i8 %a) 147 ret i8 %b 148} 149 150define i16 @test_bitreverse_i16(i16 %a) nounwind { 151; SSE-LABEL: test_bitreverse_i16: 152; SSE: # %bb.0: 153; SSE-NEXT: # kill: def $edi killed $edi def $rdi 154; SSE-NEXT: rolw $8, %di 155; SSE-NEXT: movl %edi, %eax 156; SSE-NEXT: andl $3855, %eax # imm = 0xF0F 157; SSE-NEXT: shll $4, %eax 158; SSE-NEXT: shrl $4, %edi 159; SSE-NEXT: andl $3855, %edi # imm = 0xF0F 160; SSE-NEXT: orl %eax, %edi 161; SSE-NEXT: movl %edi, %eax 162; SSE-NEXT: andl $13107, %eax # imm = 0x3333 163; SSE-NEXT: shrl $2, %edi 164; SSE-NEXT: andl $13107, %edi # imm = 0x3333 165; SSE-NEXT: leal (%rdi,%rax,4), %eax 166; SSE-NEXT: movl %eax, %ecx 167; SSE-NEXT: andl $21845, %ecx # imm = 0x5555 168; SSE-NEXT: shrl %eax 169; SSE-NEXT: andl $21845, %eax # imm = 0x5555 170; SSE-NEXT: leal (%rax,%rcx,2), %eax 171; SSE-NEXT: # kill: def $ax killed $ax killed $eax 172; SSE-NEXT: retq 173; 174; AVX-LABEL: test_bitreverse_i16: 175; AVX: # %bb.0: 176; AVX-NEXT: # kill: def $edi killed $edi def $rdi 177; AVX-NEXT: rolw $8, %di 178; AVX-NEXT: movl %edi, %eax 179; AVX-NEXT: andl $3855, %eax # imm = 0xF0F 180; AVX-NEXT: shll $4, %eax 181; AVX-NEXT: shrl $4, %edi 182; AVX-NEXT: andl $3855, %edi # imm = 0xF0F 183; AVX-NEXT: orl %eax, %edi 184; AVX-NEXT: movl %edi, %eax 185; AVX-NEXT: andl $13107, %eax # imm = 0x3333 186; AVX-NEXT: shrl $2, %edi 187; AVX-NEXT: andl $13107, %edi # imm = 0x3333 188; AVX-NEXT: leal (%rdi,%rax,4), %eax 189; AVX-NEXT: movl %eax, %ecx 190; AVX-NEXT: andl $21845, %ecx # imm = 0x5555 191; AVX-NEXT: shrl %eax 192; AVX-NEXT: andl $21845, %eax # imm = 0x5555 193; AVX-NEXT: leal (%rax,%rcx,2), %eax 194; AVX-NEXT: # kill: def $ax killed $ax killed $eax 195; AVX-NEXT: retq 196; 197; XOP-LABEL: test_bitreverse_i16: 198; XOP: # %bb.0: 199; XOP-NEXT: vmovd %edi, %xmm0 200; XOP-NEXT: vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0 201; XOP-NEXT: vmovd %xmm0, %eax 202; XOP-NEXT: # kill: def $ax killed $ax killed $eax 203; XOP-NEXT: retq 204; 205; GFNISSE-LABEL: test_bitreverse_i16: 206; GFNISSE: # %bb.0: 207; GFNISSE-NEXT: # kill: def $edi killed $edi def $rdi 208; GFNISSE-NEXT: rolw $8, %di 209; GFNISSE-NEXT: movl %edi, %eax 210; GFNISSE-NEXT: andl $3855, %eax # imm = 0xF0F 211; GFNISSE-NEXT: shll $4, %eax 212; GFNISSE-NEXT: shrl $4, %edi 213; GFNISSE-NEXT: andl $3855, %edi # imm = 0xF0F 214; GFNISSE-NEXT: orl %eax, %edi 215; GFNISSE-NEXT: movl %edi, %eax 216; GFNISSE-NEXT: andl $13107, %eax # imm = 0x3333 217; GFNISSE-NEXT: shrl $2, %edi 218; GFNISSE-NEXT: andl $13107, %edi # imm = 0x3333 219; GFNISSE-NEXT: leal (%rdi,%rax,4), %eax 220; GFNISSE-NEXT: movl %eax, %ecx 221; GFNISSE-NEXT: andl $21845, %ecx # imm = 0x5555 222; GFNISSE-NEXT: shrl %eax 223; GFNISSE-NEXT: andl $21845, %eax # imm = 0x5555 224; GFNISSE-NEXT: leal (%rax,%rcx,2), %eax 225; GFNISSE-NEXT: # kill: def $ax killed $ax killed $eax 226; GFNISSE-NEXT: retq 227; 228; GFNIAVX-LABEL: test_bitreverse_i16: 229; GFNIAVX: # %bb.0: 230; GFNIAVX-NEXT: # kill: def $edi killed $edi def $rdi 231; GFNIAVX-NEXT: rolw $8, %di 232; GFNIAVX-NEXT: movl %edi, %eax 233; GFNIAVX-NEXT: andl $3855, %eax # imm = 0xF0F 234; GFNIAVX-NEXT: shll $4, %eax 235; GFNIAVX-NEXT: shrl $4, %edi 236; GFNIAVX-NEXT: andl $3855, %edi # imm = 0xF0F 237; GFNIAVX-NEXT: orl %eax, %edi 238; GFNIAVX-NEXT: movl %edi, %eax 239; GFNIAVX-NEXT: andl $13107, %eax # imm = 0x3333 240; GFNIAVX-NEXT: shrl $2, %edi 241; GFNIAVX-NEXT: andl $13107, %edi # imm = 0x3333 242; GFNIAVX-NEXT: leal (%rdi,%rax,4), %eax 243; GFNIAVX-NEXT: movl %eax, %ecx 244; GFNIAVX-NEXT: andl $21845, %ecx # imm = 0x5555 245; GFNIAVX-NEXT: shrl %eax 246; GFNIAVX-NEXT: andl $21845, %eax # imm = 0x5555 247; GFNIAVX-NEXT: leal (%rax,%rcx,2), %eax 248; GFNIAVX-NEXT: # kill: def $ax killed $ax killed $eax 249; GFNIAVX-NEXT: retq 250; 251; GFNIAVX2-LABEL: test_bitreverse_i16: 252; GFNIAVX2: # %bb.0: 253; GFNIAVX2-NEXT: # kill: def $edi killed $edi def $rdi 254; GFNIAVX2-NEXT: rolw $8, %di 255; GFNIAVX2-NEXT: movl %edi, %eax 256; GFNIAVX2-NEXT: andl $3855, %eax # imm = 0xF0F 257; GFNIAVX2-NEXT: shll $4, %eax 258; GFNIAVX2-NEXT: shrl $4, %edi 259; GFNIAVX2-NEXT: andl $3855, %edi # imm = 0xF0F 260; GFNIAVX2-NEXT: orl %eax, %edi 261; GFNIAVX2-NEXT: movl %edi, %eax 262; GFNIAVX2-NEXT: andl $13107, %eax # imm = 0x3333 263; GFNIAVX2-NEXT: shrl $2, %edi 264; GFNIAVX2-NEXT: andl $13107, %edi # imm = 0x3333 265; GFNIAVX2-NEXT: leal (%rdi,%rax,4), %eax 266; GFNIAVX2-NEXT: movl %eax, %ecx 267; GFNIAVX2-NEXT: andl $21845, %ecx # imm = 0x5555 268; GFNIAVX2-NEXT: shrl %eax 269; GFNIAVX2-NEXT: andl $21845, %eax # imm = 0x5555 270; GFNIAVX2-NEXT: leal (%rax,%rcx,2), %eax 271; GFNIAVX2-NEXT: # kill: def $ax killed $ax killed $eax 272; GFNIAVX2-NEXT: retq 273; 274; GFNIAVX512F-LABEL: test_bitreverse_i16: 275; GFNIAVX512F: # %bb.0: 276; GFNIAVX512F-NEXT: # kill: def $edi killed $edi def $rdi 277; GFNIAVX512F-NEXT: rolw $8, %di 278; GFNIAVX512F-NEXT: movl %edi, %eax 279; GFNIAVX512F-NEXT: andl $3855, %eax # imm = 0xF0F 280; GFNIAVX512F-NEXT: shll $4, %eax 281; GFNIAVX512F-NEXT: shrl $4, %edi 282; GFNIAVX512F-NEXT: andl $3855, %edi # imm = 0xF0F 283; GFNIAVX512F-NEXT: orl %eax, %edi 284; GFNIAVX512F-NEXT: movl %edi, %eax 285; GFNIAVX512F-NEXT: andl $13107, %eax # imm = 0x3333 286; GFNIAVX512F-NEXT: shrl $2, %edi 287; GFNIAVX512F-NEXT: andl $13107, %edi # imm = 0x3333 288; GFNIAVX512F-NEXT: leal (%rdi,%rax,4), %eax 289; GFNIAVX512F-NEXT: movl %eax, %ecx 290; GFNIAVX512F-NEXT: andl $21845, %ecx # imm = 0x5555 291; GFNIAVX512F-NEXT: shrl %eax 292; GFNIAVX512F-NEXT: andl $21845, %eax # imm = 0x5555 293; GFNIAVX512F-NEXT: leal (%rax,%rcx,2), %eax 294; GFNIAVX512F-NEXT: # kill: def $ax killed $ax killed $eax 295; GFNIAVX512F-NEXT: retq 296; 297; GFNIAVX512BW-LABEL: test_bitreverse_i16: 298; GFNIAVX512BW: # %bb.0: 299; GFNIAVX512BW-NEXT: # kill: def $edi killed $edi def $rdi 300; GFNIAVX512BW-NEXT: rolw $8, %di 301; GFNIAVX512BW-NEXT: movl %edi, %eax 302; GFNIAVX512BW-NEXT: andl $3855, %eax # imm = 0xF0F 303; GFNIAVX512BW-NEXT: shll $4, %eax 304; GFNIAVX512BW-NEXT: shrl $4, %edi 305; GFNIAVX512BW-NEXT: andl $3855, %edi # imm = 0xF0F 306; GFNIAVX512BW-NEXT: orl %eax, %edi 307; GFNIAVX512BW-NEXT: movl %edi, %eax 308; GFNIAVX512BW-NEXT: andl $13107, %eax # imm = 0x3333 309; GFNIAVX512BW-NEXT: shrl $2, %edi 310; GFNIAVX512BW-NEXT: andl $13107, %edi # imm = 0x3333 311; GFNIAVX512BW-NEXT: leal (%rdi,%rax,4), %eax 312; GFNIAVX512BW-NEXT: movl %eax, %ecx 313; GFNIAVX512BW-NEXT: andl $21845, %ecx # imm = 0x5555 314; GFNIAVX512BW-NEXT: shrl %eax 315; GFNIAVX512BW-NEXT: andl $21845, %eax # imm = 0x5555 316; GFNIAVX512BW-NEXT: leal (%rax,%rcx,2), %eax 317; GFNIAVX512BW-NEXT: # kill: def $ax killed $ax killed $eax 318; GFNIAVX512BW-NEXT: retq 319 %b = call i16 @llvm.bitreverse.i16(i16 %a) 320 ret i16 %b 321} 322 323define i32 @test_bitreverse_i32(i32 %a) nounwind { 324; SSE-LABEL: test_bitreverse_i32: 325; SSE: # %bb.0: 326; SSE-NEXT: # kill: def $edi killed $edi def $rdi 327; SSE-NEXT: bswapl %edi 328; SSE-NEXT: movl %edi, %eax 329; SSE-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F 330; SSE-NEXT: shll $4, %eax 331; SSE-NEXT: shrl $4, %edi 332; SSE-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 333; SSE-NEXT: orl %eax, %edi 334; SSE-NEXT: movl %edi, %eax 335; SSE-NEXT: andl $858993459, %eax # imm = 0x33333333 336; SSE-NEXT: shrl $2, %edi 337; SSE-NEXT: andl $858993459, %edi # imm = 0x33333333 338; SSE-NEXT: leal (%rdi,%rax,4), %eax 339; SSE-NEXT: movl %eax, %ecx 340; SSE-NEXT: andl $1431655765, %ecx # imm = 0x55555555 341; SSE-NEXT: shrl %eax 342; SSE-NEXT: andl $1431655765, %eax # imm = 0x55555555 343; SSE-NEXT: leal (%rax,%rcx,2), %eax 344; SSE-NEXT: retq 345; 346; AVX-LABEL: test_bitreverse_i32: 347; AVX: # %bb.0: 348; AVX-NEXT: # kill: def $edi killed $edi def $rdi 349; AVX-NEXT: bswapl %edi 350; AVX-NEXT: movl %edi, %eax 351; AVX-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F 352; AVX-NEXT: shll $4, %eax 353; AVX-NEXT: shrl $4, %edi 354; AVX-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 355; AVX-NEXT: orl %eax, %edi 356; AVX-NEXT: movl %edi, %eax 357; AVX-NEXT: andl $858993459, %eax # imm = 0x33333333 358; AVX-NEXT: shrl $2, %edi 359; AVX-NEXT: andl $858993459, %edi # imm = 0x33333333 360; AVX-NEXT: leal (%rdi,%rax,4), %eax 361; AVX-NEXT: movl %eax, %ecx 362; AVX-NEXT: andl $1431655765, %ecx # imm = 0x55555555 363; AVX-NEXT: shrl %eax 364; AVX-NEXT: andl $1431655765, %eax # imm = 0x55555555 365; AVX-NEXT: leal (%rax,%rcx,2), %eax 366; AVX-NEXT: retq 367; 368; XOP-LABEL: test_bitreverse_i32: 369; XOP: # %bb.0: 370; XOP-NEXT: vmovd %edi, %xmm0 371; XOP-NEXT: vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0 372; XOP-NEXT: vmovd %xmm0, %eax 373; XOP-NEXT: retq 374; 375; GFNISSE-LABEL: test_bitreverse_i32: 376; GFNISSE: # %bb.0: 377; GFNISSE-NEXT: # kill: def $edi killed $edi def $rdi 378; GFNISSE-NEXT: bswapl %edi 379; GFNISSE-NEXT: movl %edi, %eax 380; GFNISSE-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F 381; GFNISSE-NEXT: shll $4, %eax 382; GFNISSE-NEXT: shrl $4, %edi 383; GFNISSE-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 384; GFNISSE-NEXT: orl %eax, %edi 385; GFNISSE-NEXT: movl %edi, %eax 386; GFNISSE-NEXT: andl $858993459, %eax # imm = 0x33333333 387; GFNISSE-NEXT: shrl $2, %edi 388; GFNISSE-NEXT: andl $858993459, %edi # imm = 0x33333333 389; GFNISSE-NEXT: leal (%rdi,%rax,4), %eax 390; GFNISSE-NEXT: movl %eax, %ecx 391; GFNISSE-NEXT: andl $1431655765, %ecx # imm = 0x55555555 392; GFNISSE-NEXT: shrl %eax 393; GFNISSE-NEXT: andl $1431655765, %eax # imm = 0x55555555 394; GFNISSE-NEXT: leal (%rax,%rcx,2), %eax 395; GFNISSE-NEXT: retq 396; 397; GFNIAVX-LABEL: test_bitreverse_i32: 398; GFNIAVX: # %bb.0: 399; GFNIAVX-NEXT: # kill: def $edi killed $edi def $rdi 400; GFNIAVX-NEXT: bswapl %edi 401; GFNIAVX-NEXT: movl %edi, %eax 402; GFNIAVX-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F 403; GFNIAVX-NEXT: shll $4, %eax 404; GFNIAVX-NEXT: shrl $4, %edi 405; GFNIAVX-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 406; GFNIAVX-NEXT: orl %eax, %edi 407; GFNIAVX-NEXT: movl %edi, %eax 408; GFNIAVX-NEXT: andl $858993459, %eax # imm = 0x33333333 409; GFNIAVX-NEXT: shrl $2, %edi 410; GFNIAVX-NEXT: andl $858993459, %edi # imm = 0x33333333 411; GFNIAVX-NEXT: leal (%rdi,%rax,4), %eax 412; GFNIAVX-NEXT: movl %eax, %ecx 413; GFNIAVX-NEXT: andl $1431655765, %ecx # imm = 0x55555555 414; GFNIAVX-NEXT: shrl %eax 415; GFNIAVX-NEXT: andl $1431655765, %eax # imm = 0x55555555 416; GFNIAVX-NEXT: leal (%rax,%rcx,2), %eax 417; GFNIAVX-NEXT: retq 418; 419; GFNIAVX2-LABEL: test_bitreverse_i32: 420; GFNIAVX2: # %bb.0: 421; GFNIAVX2-NEXT: # kill: def $edi killed $edi def $rdi 422; GFNIAVX2-NEXT: bswapl %edi 423; GFNIAVX2-NEXT: movl %edi, %eax 424; GFNIAVX2-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F 425; GFNIAVX2-NEXT: shll $4, %eax 426; GFNIAVX2-NEXT: shrl $4, %edi 427; GFNIAVX2-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 428; GFNIAVX2-NEXT: orl %eax, %edi 429; GFNIAVX2-NEXT: movl %edi, %eax 430; GFNIAVX2-NEXT: andl $858993459, %eax # imm = 0x33333333 431; GFNIAVX2-NEXT: shrl $2, %edi 432; GFNIAVX2-NEXT: andl $858993459, %edi # imm = 0x33333333 433; GFNIAVX2-NEXT: leal (%rdi,%rax,4), %eax 434; GFNIAVX2-NEXT: movl %eax, %ecx 435; GFNIAVX2-NEXT: andl $1431655765, %ecx # imm = 0x55555555 436; GFNIAVX2-NEXT: shrl %eax 437; GFNIAVX2-NEXT: andl $1431655765, %eax # imm = 0x55555555 438; GFNIAVX2-NEXT: leal (%rax,%rcx,2), %eax 439; GFNIAVX2-NEXT: retq 440; 441; GFNIAVX512F-LABEL: test_bitreverse_i32: 442; GFNIAVX512F: # %bb.0: 443; GFNIAVX512F-NEXT: # kill: def $edi killed $edi def $rdi 444; GFNIAVX512F-NEXT: bswapl %edi 445; GFNIAVX512F-NEXT: movl %edi, %eax 446; GFNIAVX512F-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F 447; GFNIAVX512F-NEXT: shll $4, %eax 448; GFNIAVX512F-NEXT: shrl $4, %edi 449; GFNIAVX512F-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 450; GFNIAVX512F-NEXT: orl %eax, %edi 451; GFNIAVX512F-NEXT: movl %edi, %eax 452; GFNIAVX512F-NEXT: andl $858993459, %eax # imm = 0x33333333 453; GFNIAVX512F-NEXT: shrl $2, %edi 454; GFNIAVX512F-NEXT: andl $858993459, %edi # imm = 0x33333333 455; GFNIAVX512F-NEXT: leal (%rdi,%rax,4), %eax 456; GFNIAVX512F-NEXT: movl %eax, %ecx 457; GFNIAVX512F-NEXT: andl $1431655765, %ecx # imm = 0x55555555 458; GFNIAVX512F-NEXT: shrl %eax 459; GFNIAVX512F-NEXT: andl $1431655765, %eax # imm = 0x55555555 460; GFNIAVX512F-NEXT: leal (%rax,%rcx,2), %eax 461; GFNIAVX512F-NEXT: retq 462; 463; GFNIAVX512BW-LABEL: test_bitreverse_i32: 464; GFNIAVX512BW: # %bb.0: 465; GFNIAVX512BW-NEXT: # kill: def $edi killed $edi def $rdi 466; GFNIAVX512BW-NEXT: bswapl %edi 467; GFNIAVX512BW-NEXT: movl %edi, %eax 468; GFNIAVX512BW-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F 469; GFNIAVX512BW-NEXT: shll $4, %eax 470; GFNIAVX512BW-NEXT: shrl $4, %edi 471; GFNIAVX512BW-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 472; GFNIAVX512BW-NEXT: orl %eax, %edi 473; GFNIAVX512BW-NEXT: movl %edi, %eax 474; GFNIAVX512BW-NEXT: andl $858993459, %eax # imm = 0x33333333 475; GFNIAVX512BW-NEXT: shrl $2, %edi 476; GFNIAVX512BW-NEXT: andl $858993459, %edi # imm = 0x33333333 477; GFNIAVX512BW-NEXT: leal (%rdi,%rax,4), %eax 478; GFNIAVX512BW-NEXT: movl %eax, %ecx 479; GFNIAVX512BW-NEXT: andl $1431655765, %ecx # imm = 0x55555555 480; GFNIAVX512BW-NEXT: shrl %eax 481; GFNIAVX512BW-NEXT: andl $1431655765, %eax # imm = 0x55555555 482; GFNIAVX512BW-NEXT: leal (%rax,%rcx,2), %eax 483; GFNIAVX512BW-NEXT: retq 484 %b = call i32 @llvm.bitreverse.i32(i32 %a) 485 ret i32 %b 486} 487 488define i64 @test_bitreverse_i64(i64 %a) nounwind { 489; SSE-LABEL: test_bitreverse_i64: 490; SSE: # %bb.0: 491; SSE-NEXT: bswapq %rdi 492; SSE-NEXT: movq %rdi, %rax 493; SSE-NEXT: shrq $4, %rax 494; SSE-NEXT: movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F 495; SSE-NEXT: andq %rcx, %rax 496; SSE-NEXT: andq %rcx, %rdi 497; SSE-NEXT: shlq $4, %rdi 498; SSE-NEXT: orq %rax, %rdi 499; SSE-NEXT: movabsq $3689348814741910323, %rax # imm = 0x3333333333333333 500; SSE-NEXT: movq %rdi, %rcx 501; SSE-NEXT: andq %rax, %rcx 502; SSE-NEXT: shrq $2, %rdi 503; SSE-NEXT: andq %rax, %rdi 504; SSE-NEXT: leaq (%rdi,%rcx,4), %rax 505; SSE-NEXT: movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555 506; SSE-NEXT: movq %rax, %rdx 507; SSE-NEXT: andq %rcx, %rdx 508; SSE-NEXT: shrq %rax 509; SSE-NEXT: andq %rcx, %rax 510; SSE-NEXT: leaq (%rax,%rdx,2), %rax 511; SSE-NEXT: retq 512; 513; AVX-LABEL: test_bitreverse_i64: 514; AVX: # %bb.0: 515; AVX-NEXT: bswapq %rdi 516; AVX-NEXT: movq %rdi, %rax 517; AVX-NEXT: shrq $4, %rax 518; AVX-NEXT: movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F 519; AVX-NEXT: andq %rcx, %rax 520; AVX-NEXT: andq %rcx, %rdi 521; AVX-NEXT: shlq $4, %rdi 522; AVX-NEXT: orq %rax, %rdi 523; AVX-NEXT: movabsq $3689348814741910323, %rax # imm = 0x3333333333333333 524; AVX-NEXT: movq %rdi, %rcx 525; AVX-NEXT: andq %rax, %rcx 526; AVX-NEXT: shrq $2, %rdi 527; AVX-NEXT: andq %rax, %rdi 528; AVX-NEXT: leaq (%rdi,%rcx,4), %rax 529; AVX-NEXT: movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555 530; AVX-NEXT: movq %rax, %rdx 531; AVX-NEXT: andq %rcx, %rdx 532; AVX-NEXT: shrq %rax 533; AVX-NEXT: andq %rcx, %rax 534; AVX-NEXT: leaq (%rax,%rdx,2), %rax 535; AVX-NEXT: retq 536; 537; XOP-LABEL: test_bitreverse_i64: 538; XOP: # %bb.0: 539; XOP-NEXT: vmovq %rdi, %xmm0 540; XOP-NEXT: vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0 541; XOP-NEXT: vmovq %xmm0, %rax 542; XOP-NEXT: retq 543; 544; GFNISSE-LABEL: test_bitreverse_i64: 545; GFNISSE: # %bb.0: 546; GFNISSE-NEXT: bswapq %rdi 547; GFNISSE-NEXT: movq %rdi, %rax 548; GFNISSE-NEXT: shrq $4, %rax 549; GFNISSE-NEXT: movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F 550; GFNISSE-NEXT: andq %rcx, %rax 551; GFNISSE-NEXT: andq %rcx, %rdi 552; GFNISSE-NEXT: shlq $4, %rdi 553; GFNISSE-NEXT: orq %rax, %rdi 554; GFNISSE-NEXT: movabsq $3689348814741910323, %rax # imm = 0x3333333333333333 555; GFNISSE-NEXT: movq %rdi, %rcx 556; GFNISSE-NEXT: andq %rax, %rcx 557; GFNISSE-NEXT: shrq $2, %rdi 558; GFNISSE-NEXT: andq %rax, %rdi 559; GFNISSE-NEXT: leaq (%rdi,%rcx,4), %rax 560; GFNISSE-NEXT: movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555 561; GFNISSE-NEXT: movq %rax, %rdx 562; GFNISSE-NEXT: andq %rcx, %rdx 563; GFNISSE-NEXT: shrq %rax 564; GFNISSE-NEXT: andq %rcx, %rax 565; GFNISSE-NEXT: leaq (%rax,%rdx,2), %rax 566; GFNISSE-NEXT: retq 567; 568; GFNIAVX-LABEL: test_bitreverse_i64: 569; GFNIAVX: # %bb.0: 570; GFNIAVX-NEXT: bswapq %rdi 571; GFNIAVX-NEXT: movq %rdi, %rax 572; GFNIAVX-NEXT: shrq $4, %rax 573; GFNIAVX-NEXT: movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F 574; GFNIAVX-NEXT: andq %rcx, %rax 575; GFNIAVX-NEXT: andq %rcx, %rdi 576; GFNIAVX-NEXT: shlq $4, %rdi 577; GFNIAVX-NEXT: orq %rax, %rdi 578; GFNIAVX-NEXT: movabsq $3689348814741910323, %rax # imm = 0x3333333333333333 579; GFNIAVX-NEXT: movq %rdi, %rcx 580; GFNIAVX-NEXT: andq %rax, %rcx 581; GFNIAVX-NEXT: shrq $2, %rdi 582; GFNIAVX-NEXT: andq %rax, %rdi 583; GFNIAVX-NEXT: leaq (%rdi,%rcx,4), %rax 584; GFNIAVX-NEXT: movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555 585; GFNIAVX-NEXT: movq %rax, %rdx 586; GFNIAVX-NEXT: andq %rcx, %rdx 587; GFNIAVX-NEXT: shrq %rax 588; GFNIAVX-NEXT: andq %rcx, %rax 589; GFNIAVX-NEXT: leaq (%rax,%rdx,2), %rax 590; GFNIAVX-NEXT: retq 591; 592; GFNIAVX2-LABEL: test_bitreverse_i64: 593; GFNIAVX2: # %bb.0: 594; GFNIAVX2-NEXT: bswapq %rdi 595; GFNIAVX2-NEXT: movq %rdi, %rax 596; GFNIAVX2-NEXT: shrq $4, %rax 597; GFNIAVX2-NEXT: movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F 598; GFNIAVX2-NEXT: andq %rcx, %rax 599; GFNIAVX2-NEXT: andq %rcx, %rdi 600; GFNIAVX2-NEXT: shlq $4, %rdi 601; GFNIAVX2-NEXT: orq %rax, %rdi 602; GFNIAVX2-NEXT: movabsq $3689348814741910323, %rax # imm = 0x3333333333333333 603; GFNIAVX2-NEXT: movq %rdi, %rcx 604; GFNIAVX2-NEXT: andq %rax, %rcx 605; GFNIAVX2-NEXT: shrq $2, %rdi 606; GFNIAVX2-NEXT: andq %rax, %rdi 607; GFNIAVX2-NEXT: leaq (%rdi,%rcx,4), %rax 608; GFNIAVX2-NEXT: movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555 609; GFNIAVX2-NEXT: movq %rax, %rdx 610; GFNIAVX2-NEXT: andq %rcx, %rdx 611; GFNIAVX2-NEXT: shrq %rax 612; GFNIAVX2-NEXT: andq %rcx, %rax 613; GFNIAVX2-NEXT: leaq (%rax,%rdx,2), %rax 614; GFNIAVX2-NEXT: retq 615; 616; GFNIAVX512F-LABEL: test_bitreverse_i64: 617; GFNIAVX512F: # %bb.0: 618; GFNIAVX512F-NEXT: bswapq %rdi 619; GFNIAVX512F-NEXT: movq %rdi, %rax 620; GFNIAVX512F-NEXT: shrq $4, %rax 621; GFNIAVX512F-NEXT: movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F 622; GFNIAVX512F-NEXT: andq %rcx, %rax 623; GFNIAVX512F-NEXT: andq %rcx, %rdi 624; GFNIAVX512F-NEXT: shlq $4, %rdi 625; GFNIAVX512F-NEXT: orq %rax, %rdi 626; GFNIAVX512F-NEXT: movabsq $3689348814741910323, %rax # imm = 0x3333333333333333 627; GFNIAVX512F-NEXT: movq %rdi, %rcx 628; GFNIAVX512F-NEXT: andq %rax, %rcx 629; GFNIAVX512F-NEXT: shrq $2, %rdi 630; GFNIAVX512F-NEXT: andq %rax, %rdi 631; GFNIAVX512F-NEXT: leaq (%rdi,%rcx,4), %rax 632; GFNIAVX512F-NEXT: movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555 633; GFNIAVX512F-NEXT: movq %rax, %rdx 634; GFNIAVX512F-NEXT: andq %rcx, %rdx 635; GFNIAVX512F-NEXT: shrq %rax 636; GFNIAVX512F-NEXT: andq %rcx, %rax 637; GFNIAVX512F-NEXT: leaq (%rax,%rdx,2), %rax 638; GFNIAVX512F-NEXT: retq 639; 640; GFNIAVX512BW-LABEL: test_bitreverse_i64: 641; GFNIAVX512BW: # %bb.0: 642; GFNIAVX512BW-NEXT: bswapq %rdi 643; GFNIAVX512BW-NEXT: movq %rdi, %rax 644; GFNIAVX512BW-NEXT: shrq $4, %rax 645; GFNIAVX512BW-NEXT: movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F 646; GFNIAVX512BW-NEXT: andq %rcx, %rax 647; GFNIAVX512BW-NEXT: andq %rcx, %rdi 648; GFNIAVX512BW-NEXT: shlq $4, %rdi 649; GFNIAVX512BW-NEXT: orq %rax, %rdi 650; GFNIAVX512BW-NEXT: movabsq $3689348814741910323, %rax # imm = 0x3333333333333333 651; GFNIAVX512BW-NEXT: movq %rdi, %rcx 652; GFNIAVX512BW-NEXT: andq %rax, %rcx 653; GFNIAVX512BW-NEXT: shrq $2, %rdi 654; GFNIAVX512BW-NEXT: andq %rax, %rdi 655; GFNIAVX512BW-NEXT: leaq (%rdi,%rcx,4), %rax 656; GFNIAVX512BW-NEXT: movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555 657; GFNIAVX512BW-NEXT: movq %rax, %rdx 658; GFNIAVX512BW-NEXT: andq %rcx, %rdx 659; GFNIAVX512BW-NEXT: shrq %rax 660; GFNIAVX512BW-NEXT: andq %rcx, %rax 661; GFNIAVX512BW-NEXT: leaq (%rax,%rdx,2), %rax 662; GFNIAVX512BW-NEXT: retq 663 %b = call i64 @llvm.bitreverse.i64(i64 %a) 664 ret i64 %b 665} 666 667define <16 x i8> @test_bitreverse_v16i8(<16 x i8> %a) nounwind { 668; SSE2-LABEL: test_bitreverse_v16i8: 669; SSE2: # %bb.0: 670; SSE2-NEXT: movdqa %xmm0, %xmm1 671; SSE2-NEXT: psllw $4, %xmm1 672; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 673; SSE2-NEXT: psrlw $4, %xmm0 674; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 675; SSE2-NEXT: por %xmm1, %xmm0 676; SSE2-NEXT: movdqa %xmm0, %xmm1 677; SSE2-NEXT: psrlw $2, %xmm1 678; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 679; SSE2-NEXT: pand %xmm2, %xmm1 680; SSE2-NEXT: pand %xmm2, %xmm0 681; SSE2-NEXT: psllw $2, %xmm0 682; SSE2-NEXT: por %xmm1, %xmm0 683; SSE2-NEXT: movdqa %xmm0, %xmm1 684; SSE2-NEXT: psrlw $1, %xmm1 685; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 686; SSE2-NEXT: pand %xmm2, %xmm1 687; SSE2-NEXT: pand %xmm2, %xmm0 688; SSE2-NEXT: paddb %xmm0, %xmm0 689; SSE2-NEXT: por %xmm1, %xmm0 690; SSE2-NEXT: retq 691; 692; SSSE3-LABEL: test_bitreverse_v16i8: 693; SSSE3: # %bb.0: 694; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 695; SSSE3-NEXT: movdqa %xmm0, %xmm2 696; SSSE3-NEXT: pand %xmm1, %xmm2 697; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 698; SSSE3-NEXT: pshufb %xmm2, %xmm3 699; SSSE3-NEXT: psrlw $4, %xmm0 700; SSSE3-NEXT: pand %xmm1, %xmm0 701; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 702; SSSE3-NEXT: pshufb %xmm0, %xmm1 703; SSSE3-NEXT: por %xmm3, %xmm1 704; SSSE3-NEXT: movdqa %xmm1, %xmm0 705; SSSE3-NEXT: retq 706; 707; AVX-LABEL: test_bitreverse_v16i8: 708; AVX: # %bb.0: 709; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 710; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 711; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 712; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 713; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0 714; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 715; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 716; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0 717; AVX-NEXT: vpor %xmm0, %xmm2, %xmm0 718; AVX-NEXT: retq 719; 720; XOP-LABEL: test_bitreverse_v16i8: 721; XOP: # %bb.0: 722; XOP-NEXT: vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0 723; XOP-NEXT: retq 724; 725; GFNISSE-LABEL: test_bitreverse_v16i8: 726; GFNISSE: # %bb.0: 727; GFNISSE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 728; GFNISSE-NEXT: retq 729; 730; GFNIAVX-LABEL: test_bitreverse_v16i8: 731; GFNIAVX: # %bb.0: 732; GFNIAVX-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 733; GFNIAVX-NEXT: retq 734; 735; GFNIAVX2-LABEL: test_bitreverse_v16i8: 736; GFNIAVX2: # %bb.0: 737; GFNIAVX2-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 738; GFNIAVX2-NEXT: retq 739; 740; GFNIAVX512F-LABEL: test_bitreverse_v16i8: 741; GFNIAVX512F: # %bb.0: 742; GFNIAVX512F-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 743; GFNIAVX512F-NEXT: retq 744; 745; GFNIAVX512BW-LABEL: test_bitreverse_v16i8: 746; GFNIAVX512BW: # %bb.0: 747; GFNIAVX512BW-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 748; GFNIAVX512BW-NEXT: retq 749 %b = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> %a) 750 ret <16 x i8> %b 751} 752 753define <8 x i16> @test_bitreverse_v8i16(<8 x i16> %a) nounwind { 754; SSE2-LABEL: test_bitreverse_v8i16: 755; SSE2: # %bb.0: 756; SSE2-NEXT: movdqa %xmm0, %xmm1 757; SSE2-NEXT: psrlw $8, %xmm1 758; SSE2-NEXT: psllw $8, %xmm0 759; SSE2-NEXT: por %xmm1, %xmm0 760; SSE2-NEXT: movdqa %xmm0, %xmm1 761; SSE2-NEXT: psllw $4, %xmm1 762; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 763; SSE2-NEXT: psrlw $4, %xmm0 764; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 765; SSE2-NEXT: por %xmm1, %xmm0 766; SSE2-NEXT: movdqa %xmm0, %xmm1 767; SSE2-NEXT: psrlw $2, %xmm1 768; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 769; SSE2-NEXT: pand %xmm2, %xmm1 770; SSE2-NEXT: pand %xmm2, %xmm0 771; SSE2-NEXT: psllw $2, %xmm0 772; SSE2-NEXT: por %xmm1, %xmm0 773; SSE2-NEXT: movdqa %xmm0, %xmm1 774; SSE2-NEXT: psrlw $1, %xmm1 775; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 776; SSE2-NEXT: pand %xmm2, %xmm1 777; SSE2-NEXT: pand %xmm2, %xmm0 778; SSE2-NEXT: paddb %xmm0, %xmm0 779; SSE2-NEXT: por %xmm1, %xmm0 780; SSE2-NEXT: retq 781; 782; SSSE3-LABEL: test_bitreverse_v8i16: 783; SSSE3: # %bb.0: 784; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 785; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 786; SSSE3-NEXT: movdqa %xmm0, %xmm2 787; SSSE3-NEXT: pand %xmm1, %xmm2 788; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 789; SSSE3-NEXT: pshufb %xmm2, %xmm3 790; SSSE3-NEXT: psrlw $4, %xmm0 791; SSSE3-NEXT: pand %xmm1, %xmm0 792; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 793; SSSE3-NEXT: pshufb %xmm0, %xmm1 794; SSSE3-NEXT: por %xmm3, %xmm1 795; SSSE3-NEXT: movdqa %xmm1, %xmm0 796; SSSE3-NEXT: retq 797; 798; AVX-LABEL: test_bitreverse_v8i16: 799; AVX: # %bb.0: 800; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 801; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 802; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 803; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 804; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 805; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0 806; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 807; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 808; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0 809; AVX-NEXT: vpor %xmm0, %xmm2, %xmm0 810; AVX-NEXT: retq 811; 812; XOP-LABEL: test_bitreverse_v8i16: 813; XOP: # %bb.0: 814; XOP-NEXT: vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0 815; XOP-NEXT: retq 816; 817; GFNISSE-LABEL: test_bitreverse_v8i16: 818; GFNISSE: # %bb.0: 819; GFNISSE-NEXT: pshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 820; GFNISSE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 821; GFNISSE-NEXT: retq 822; 823; GFNIAVX-LABEL: test_bitreverse_v8i16: 824; GFNIAVX: # %bb.0: 825; GFNIAVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 826; GFNIAVX-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 827; GFNIAVX-NEXT: retq 828; 829; GFNIAVX2-LABEL: test_bitreverse_v8i16: 830; GFNIAVX2: # %bb.0: 831; GFNIAVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 832; GFNIAVX2-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 833; GFNIAVX2-NEXT: retq 834; 835; GFNIAVX512F-LABEL: test_bitreverse_v8i16: 836; GFNIAVX512F: # %bb.0: 837; GFNIAVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 838; GFNIAVX512F-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 839; GFNIAVX512F-NEXT: retq 840; 841; GFNIAVX512BW-LABEL: test_bitreverse_v8i16: 842; GFNIAVX512BW: # %bb.0: 843; GFNIAVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 844; GFNIAVX512BW-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 845; GFNIAVX512BW-NEXT: retq 846 %b = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a) 847 ret <8 x i16> %b 848} 849 850define <4 x i32> @test_bitreverse_v4i32(<4 x i32> %a) nounwind { 851; SSE2-LABEL: test_bitreverse_v4i32: 852; SSE2: # %bb.0: 853; SSE2-NEXT: pxor %xmm1, %xmm1 854; SSE2-NEXT: movdqa %xmm0, %xmm2 855; 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] 856; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7] 857; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4] 858; 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] 859; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 860; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4] 861; SSE2-NEXT: packuswb %xmm2, %xmm0 862; SSE2-NEXT: movdqa %xmm0, %xmm1 863; SSE2-NEXT: psllw $4, %xmm1 864; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 865; SSE2-NEXT: psrlw $4, %xmm0 866; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 867; SSE2-NEXT: por %xmm1, %xmm0 868; SSE2-NEXT: movdqa %xmm0, %xmm1 869; SSE2-NEXT: psrlw $2, %xmm1 870; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 871; SSE2-NEXT: pand %xmm2, %xmm1 872; SSE2-NEXT: pand %xmm2, %xmm0 873; SSE2-NEXT: psllw $2, %xmm0 874; SSE2-NEXT: por %xmm1, %xmm0 875; SSE2-NEXT: movdqa %xmm0, %xmm1 876; SSE2-NEXT: psrlw $1, %xmm1 877; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 878; SSE2-NEXT: pand %xmm2, %xmm1 879; SSE2-NEXT: pand %xmm2, %xmm0 880; SSE2-NEXT: paddb %xmm0, %xmm0 881; SSE2-NEXT: por %xmm1, %xmm0 882; SSE2-NEXT: retq 883; 884; SSSE3-LABEL: test_bitreverse_v4i32: 885; SSSE3: # %bb.0: 886; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 887; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 888; SSSE3-NEXT: movdqa %xmm0, %xmm2 889; SSSE3-NEXT: pand %xmm1, %xmm2 890; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 891; SSSE3-NEXT: pshufb %xmm2, %xmm3 892; SSSE3-NEXT: psrlw $4, %xmm0 893; SSSE3-NEXT: pand %xmm1, %xmm0 894; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 895; SSSE3-NEXT: pshufb %xmm0, %xmm1 896; SSSE3-NEXT: por %xmm3, %xmm1 897; SSSE3-NEXT: movdqa %xmm1, %xmm0 898; SSSE3-NEXT: retq 899; 900; AVX-LABEL: test_bitreverse_v4i32: 901; AVX: # %bb.0: 902; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 903; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 904; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 905; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 906; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 907; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0 908; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 909; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 910; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0 911; AVX-NEXT: vpor %xmm0, %xmm2, %xmm0 912; AVX-NEXT: retq 913; 914; XOP-LABEL: test_bitreverse_v4i32: 915; XOP: # %bb.0: 916; XOP-NEXT: vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0 917; XOP-NEXT: retq 918; 919; GFNISSE-LABEL: test_bitreverse_v4i32: 920; GFNISSE: # %bb.0: 921; GFNISSE-NEXT: pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 922; GFNISSE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 923; GFNISSE-NEXT: retq 924; 925; GFNIAVX-LABEL: test_bitreverse_v4i32: 926; GFNIAVX: # %bb.0: 927; GFNIAVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 928; GFNIAVX-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 929; GFNIAVX-NEXT: retq 930; 931; GFNIAVX2-LABEL: test_bitreverse_v4i32: 932; GFNIAVX2: # %bb.0: 933; GFNIAVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 934; GFNIAVX2-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 935; GFNIAVX2-NEXT: retq 936; 937; GFNIAVX512F-LABEL: test_bitreverse_v4i32: 938; GFNIAVX512F: # %bb.0: 939; GFNIAVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 940; GFNIAVX512F-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 941; GFNIAVX512F-NEXT: retq 942; 943; GFNIAVX512BW-LABEL: test_bitreverse_v4i32: 944; GFNIAVX512BW: # %bb.0: 945; GFNIAVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 946; GFNIAVX512BW-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 947; GFNIAVX512BW-NEXT: retq 948 %b = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %a) 949 ret <4 x i32> %b 950} 951 952define <2 x i64> @test_bitreverse_v2i64(<2 x i64> %a) nounwind { 953; SSE2-LABEL: test_bitreverse_v2i64: 954; SSE2: # %bb.0: 955; SSE2-NEXT: pxor %xmm1, %xmm1 956; SSE2-NEXT: movdqa %xmm0, %xmm2 957; 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] 958; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1] 959; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7] 960; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4] 961; 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] 962; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 963; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 964; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4] 965; SSE2-NEXT: packuswb %xmm2, %xmm0 966; SSE2-NEXT: movdqa %xmm0, %xmm1 967; SSE2-NEXT: psllw $4, %xmm1 968; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 969; SSE2-NEXT: psrlw $4, %xmm0 970; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 971; SSE2-NEXT: por %xmm1, %xmm0 972; SSE2-NEXT: movdqa %xmm0, %xmm1 973; SSE2-NEXT: psrlw $2, %xmm1 974; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 975; SSE2-NEXT: pand %xmm2, %xmm1 976; SSE2-NEXT: pand %xmm2, %xmm0 977; SSE2-NEXT: psllw $2, %xmm0 978; SSE2-NEXT: por %xmm1, %xmm0 979; SSE2-NEXT: movdqa %xmm0, %xmm1 980; SSE2-NEXT: psrlw $1, %xmm1 981; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 982; SSE2-NEXT: pand %xmm2, %xmm1 983; SSE2-NEXT: pand %xmm2, %xmm0 984; SSE2-NEXT: paddb %xmm0, %xmm0 985; SSE2-NEXT: por %xmm1, %xmm0 986; SSE2-NEXT: retq 987; 988; SSSE3-LABEL: test_bitreverse_v2i64: 989; SSSE3: # %bb.0: 990; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 991; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 992; SSSE3-NEXT: movdqa %xmm0, %xmm2 993; SSSE3-NEXT: pand %xmm1, %xmm2 994; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 995; SSSE3-NEXT: pshufb %xmm2, %xmm3 996; SSSE3-NEXT: psrlw $4, %xmm0 997; SSSE3-NEXT: pand %xmm1, %xmm0 998; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 999; SSSE3-NEXT: pshufb %xmm0, %xmm1 1000; SSSE3-NEXT: por %xmm3, %xmm1 1001; SSSE3-NEXT: movdqa %xmm1, %xmm0 1002; SSSE3-NEXT: retq 1003; 1004; AVX-LABEL: test_bitreverse_v2i64: 1005; AVX: # %bb.0: 1006; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 1007; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1008; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 1009; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1010; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 1011; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0 1012; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 1013; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1014; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0 1015; AVX-NEXT: vpor %xmm0, %xmm2, %xmm0 1016; AVX-NEXT: retq 1017; 1018; XOP-LABEL: test_bitreverse_v2i64: 1019; XOP: # %bb.0: 1020; XOP-NEXT: vpperm {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0, %xmm0 1021; XOP-NEXT: retq 1022; 1023; GFNISSE-LABEL: test_bitreverse_v2i64: 1024; GFNISSE: # %bb.0: 1025; GFNISSE-NEXT: pshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 1026; GFNISSE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1027; GFNISSE-NEXT: retq 1028; 1029; GFNIAVX-LABEL: test_bitreverse_v2i64: 1030; GFNIAVX: # %bb.0: 1031; GFNIAVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 1032; GFNIAVX-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 1033; GFNIAVX-NEXT: retq 1034; 1035; GFNIAVX2-LABEL: test_bitreverse_v2i64: 1036; GFNIAVX2: # %bb.0: 1037; GFNIAVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 1038; GFNIAVX2-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 1039; GFNIAVX2-NEXT: retq 1040; 1041; GFNIAVX512F-LABEL: test_bitreverse_v2i64: 1042; GFNIAVX512F: # %bb.0: 1043; GFNIAVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 1044; GFNIAVX512F-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 1045; GFNIAVX512F-NEXT: retq 1046; 1047; GFNIAVX512BW-LABEL: test_bitreverse_v2i64: 1048; GFNIAVX512BW: # %bb.0: 1049; GFNIAVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 1050; GFNIAVX512BW-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 1051; GFNIAVX512BW-NEXT: retq 1052 %b = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %a) 1053 ret <2 x i64> %b 1054} 1055 1056define <32 x i8> @test_bitreverse_v32i8(<32 x i8> %a) nounwind { 1057; SSE2-LABEL: test_bitreverse_v32i8: 1058; SSE2: # %bb.0: 1059; SSE2-NEXT: movdqa %xmm1, %xmm2 1060; SSE2-NEXT: movdqa %xmm0, %xmm3 1061; SSE2-NEXT: psllw $4, %xmm3 1062; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1063; SSE2-NEXT: movdqa %xmm1, %xmm4 1064; SSE2-NEXT: pandn %xmm3, %xmm4 1065; SSE2-NEXT: psrlw $4, %xmm0 1066; SSE2-NEXT: pand %xmm1, %xmm0 1067; SSE2-NEXT: por %xmm4, %xmm0 1068; SSE2-NEXT: movdqa %xmm0, %xmm4 1069; SSE2-NEXT: psrlw $2, %xmm4 1070; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 1071; SSE2-NEXT: pand %xmm3, %xmm4 1072; SSE2-NEXT: pand %xmm3, %xmm0 1073; SSE2-NEXT: psllw $2, %xmm0 1074; SSE2-NEXT: por %xmm4, %xmm0 1075; SSE2-NEXT: movdqa %xmm0, %xmm5 1076; SSE2-NEXT: psrlw $1, %xmm5 1077; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 1078; SSE2-NEXT: pand %xmm4, %xmm5 1079; SSE2-NEXT: pand %xmm4, %xmm0 1080; SSE2-NEXT: paddb %xmm0, %xmm0 1081; SSE2-NEXT: por %xmm5, %xmm0 1082; SSE2-NEXT: movdqa %xmm2, %xmm5 1083; SSE2-NEXT: psllw $4, %xmm5 1084; SSE2-NEXT: psrlw $4, %xmm2 1085; SSE2-NEXT: pand %xmm1, %xmm2 1086; SSE2-NEXT: pandn %xmm5, %xmm1 1087; SSE2-NEXT: por %xmm2, %xmm1 1088; SSE2-NEXT: movdqa %xmm1, %xmm2 1089; SSE2-NEXT: psrlw $2, %xmm2 1090; SSE2-NEXT: pand %xmm3, %xmm2 1091; SSE2-NEXT: pand %xmm3, %xmm1 1092; SSE2-NEXT: psllw $2, %xmm1 1093; SSE2-NEXT: por %xmm2, %xmm1 1094; SSE2-NEXT: movdqa %xmm1, %xmm2 1095; SSE2-NEXT: psrlw $1, %xmm2 1096; SSE2-NEXT: pand %xmm4, %xmm2 1097; SSE2-NEXT: pand %xmm4, %xmm1 1098; SSE2-NEXT: paddb %xmm1, %xmm1 1099; SSE2-NEXT: por %xmm2, %xmm1 1100; SSE2-NEXT: retq 1101; 1102; SSSE3-LABEL: test_bitreverse_v32i8: 1103; SSSE3: # %bb.0: 1104; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1105; SSSE3-NEXT: movdqa %xmm0, %xmm2 1106; SSSE3-NEXT: pand %xmm4, %xmm2 1107; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1108; SSSE3-NEXT: movdqa %xmm5, %xmm6 1109; SSSE3-NEXT: pshufb %xmm2, %xmm6 1110; SSSE3-NEXT: psrlw $4, %xmm0 1111; SSSE3-NEXT: pand %xmm4, %xmm0 1112; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1113; SSSE3-NEXT: movdqa %xmm2, %xmm3 1114; SSSE3-NEXT: pshufb %xmm0, %xmm3 1115; SSSE3-NEXT: por %xmm6, %xmm3 1116; SSSE3-NEXT: movdqa %xmm1, %xmm0 1117; SSSE3-NEXT: pand %xmm4, %xmm0 1118; SSSE3-NEXT: pshufb %xmm0, %xmm5 1119; SSSE3-NEXT: psrlw $4, %xmm1 1120; SSSE3-NEXT: pand %xmm4, %xmm1 1121; SSSE3-NEXT: pshufb %xmm1, %xmm2 1122; SSSE3-NEXT: por %xmm5, %xmm2 1123; SSSE3-NEXT: movdqa %xmm3, %xmm0 1124; SSSE3-NEXT: movdqa %xmm2, %xmm1 1125; SSSE3-NEXT: retq 1126; 1127; AVX1-LABEL: test_bitreverse_v32i8: 1128; AVX1: # %bb.0: 1129; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1130; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1131; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm3 1132; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1133; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm3 1134; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 1135; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1 1136; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1137; AVX1-NEXT: vpshufb %xmm1, %xmm5, %xmm1 1138; AVX1-NEXT: vpor %xmm1, %xmm3, %xmm1 1139; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm3 1140; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm3 1141; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 1142; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 1143; AVX1-NEXT: vpshufb %xmm0, %xmm5, %xmm0 1144; AVX1-NEXT: vpor %xmm0, %xmm3, %xmm0 1145; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1146; AVX1-NEXT: retq 1147; 1148; AVX2-LABEL: test_bitreverse_v32i8: 1149; AVX2: # %bb.0: 1150; 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] 1151; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 1152; 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] 1153; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2 1154; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 1155; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 1156; 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] 1157; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1158; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0 1159; AVX2-NEXT: retq 1160; 1161; AVX512-LABEL: test_bitreverse_v32i8: 1162; AVX512: # %bb.0: 1163; 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] 1164; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm2 1165; 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] 1166; AVX512-NEXT: vpshufb %ymm2, %ymm3, %ymm2 1167; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm0 1168; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm0 1169; 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] 1170; AVX512-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1171; AVX512-NEXT: vpor %ymm0, %ymm2, %ymm0 1172; AVX512-NEXT: retq 1173; 1174; XOPAVX1-LABEL: test_bitreverse_v32i8: 1175; XOPAVX1: # %bb.0: 1176; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1177; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95] 1178; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1179; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1180; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1181; XOPAVX1-NEXT: retq 1182; 1183; XOPAVX2-LABEL: test_bitreverse_v32i8: 1184; XOPAVX2: # %bb.0: 1185; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1186; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95] 1187; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1188; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1189; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1190; XOPAVX2-NEXT: retq 1191; 1192; GFNISSE-LABEL: test_bitreverse_v32i8: 1193; GFNISSE: # %bb.0: 1194; GFNISSE-NEXT: movdqa {{.*#+}} xmm2 = [9241421688590303745,9241421688590303745] 1195; GFNISSE-NEXT: gf2p8affineqb $0, %xmm2, %xmm0 1196; GFNISSE-NEXT: gf2p8affineqb $0, %xmm2, %xmm1 1197; GFNISSE-NEXT: retq 1198; 1199; GFNIAVX-LABEL: test_bitreverse_v32i8: 1200; GFNIAVX: # %bb.0: 1201; GFNIAVX-NEXT: vextractf128 $1, %ymm0, %xmm1 1202; GFNIAVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9241421688590303745,9241421688590303745] 1203; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm2, %xmm1, %xmm1 1204; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm2, %xmm0, %xmm0 1205; GFNIAVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1206; GFNIAVX-NEXT: retq 1207; 1208; GFNIAVX2-LABEL: test_bitreverse_v32i8: 1209; GFNIAVX2: # %bb.0: 1210; GFNIAVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 1211; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0 1212; GFNIAVX2-NEXT: retq 1213; 1214; GFNIAVX512F-LABEL: test_bitreverse_v32i8: 1215; GFNIAVX512F: # %bb.0: 1216; GFNIAVX512F-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 1217; GFNIAVX512F-NEXT: vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0 1218; GFNIAVX512F-NEXT: retq 1219; 1220; GFNIAVX512BW-LABEL: test_bitreverse_v32i8: 1221; GFNIAVX512BW: # %bb.0: 1222; GFNIAVX512BW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 1223; GFNIAVX512BW-NEXT: vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0 1224; GFNIAVX512BW-NEXT: retq 1225 %b = call <32 x i8> @llvm.bitreverse.v32i8(<32 x i8> %a) 1226 ret <32 x i8> %b 1227} 1228 1229define <16 x i16> @test_bitreverse_v16i16(<16 x i16> %a) nounwind { 1230; SSE2-LABEL: test_bitreverse_v16i16: 1231; SSE2: # %bb.0: 1232; SSE2-NEXT: movdqa %xmm1, %xmm2 1233; SSE2-NEXT: movdqa %xmm0, %xmm1 1234; SSE2-NEXT: psrlw $8, %xmm1 1235; SSE2-NEXT: psllw $8, %xmm0 1236; SSE2-NEXT: por %xmm1, %xmm0 1237; SSE2-NEXT: movdqa %xmm0, %xmm3 1238; SSE2-NEXT: psllw $4, %xmm3 1239; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1240; SSE2-NEXT: movdqa %xmm1, %xmm4 1241; SSE2-NEXT: pandn %xmm3, %xmm4 1242; SSE2-NEXT: psrlw $4, %xmm0 1243; SSE2-NEXT: pand %xmm1, %xmm0 1244; SSE2-NEXT: por %xmm4, %xmm0 1245; SSE2-NEXT: movdqa %xmm0, %xmm4 1246; SSE2-NEXT: psrlw $2, %xmm4 1247; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 1248; SSE2-NEXT: pand %xmm3, %xmm4 1249; SSE2-NEXT: pand %xmm3, %xmm0 1250; SSE2-NEXT: psllw $2, %xmm0 1251; SSE2-NEXT: por %xmm4, %xmm0 1252; SSE2-NEXT: movdqa %xmm0, %xmm5 1253; SSE2-NEXT: psrlw $1, %xmm5 1254; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 1255; SSE2-NEXT: pand %xmm4, %xmm5 1256; SSE2-NEXT: pand %xmm4, %xmm0 1257; SSE2-NEXT: paddb %xmm0, %xmm0 1258; SSE2-NEXT: por %xmm5, %xmm0 1259; SSE2-NEXT: movdqa %xmm2, %xmm5 1260; SSE2-NEXT: psrlw $8, %xmm5 1261; SSE2-NEXT: psllw $8, %xmm2 1262; SSE2-NEXT: por %xmm5, %xmm2 1263; SSE2-NEXT: movdqa %xmm2, %xmm5 1264; SSE2-NEXT: psllw $4, %xmm5 1265; SSE2-NEXT: psrlw $4, %xmm2 1266; SSE2-NEXT: pand %xmm1, %xmm2 1267; SSE2-NEXT: pandn %xmm5, %xmm1 1268; SSE2-NEXT: por %xmm2, %xmm1 1269; SSE2-NEXT: movdqa %xmm1, %xmm2 1270; SSE2-NEXT: psrlw $2, %xmm2 1271; SSE2-NEXT: pand %xmm3, %xmm2 1272; SSE2-NEXT: pand %xmm3, %xmm1 1273; SSE2-NEXT: psllw $2, %xmm1 1274; SSE2-NEXT: por %xmm2, %xmm1 1275; SSE2-NEXT: movdqa %xmm1, %xmm2 1276; SSE2-NEXT: psrlw $1, %xmm2 1277; SSE2-NEXT: pand %xmm4, %xmm2 1278; SSE2-NEXT: pand %xmm4, %xmm1 1279; SSE2-NEXT: paddb %xmm1, %xmm1 1280; SSE2-NEXT: por %xmm2, %xmm1 1281; SSE2-NEXT: retq 1282; 1283; SSSE3-LABEL: test_bitreverse_v16i16: 1284; SSSE3: # %bb.0: 1285; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 1286; SSSE3-NEXT: pshufb %xmm4, %xmm0 1287; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1288; SSSE3-NEXT: movdqa %xmm0, %xmm2 1289; SSSE3-NEXT: pand %xmm5, %xmm2 1290; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1291; SSSE3-NEXT: movdqa %xmm6, %xmm7 1292; SSSE3-NEXT: pshufb %xmm2, %xmm7 1293; SSSE3-NEXT: psrlw $4, %xmm0 1294; SSSE3-NEXT: pand %xmm5, %xmm0 1295; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1296; SSSE3-NEXT: movdqa %xmm2, %xmm3 1297; SSSE3-NEXT: pshufb %xmm0, %xmm3 1298; SSSE3-NEXT: por %xmm7, %xmm3 1299; SSSE3-NEXT: pshufb %xmm4, %xmm1 1300; SSSE3-NEXT: movdqa %xmm1, %xmm0 1301; SSSE3-NEXT: pand %xmm5, %xmm0 1302; SSSE3-NEXT: pshufb %xmm0, %xmm6 1303; SSSE3-NEXT: psrlw $4, %xmm1 1304; SSSE3-NEXT: pand %xmm5, %xmm1 1305; SSSE3-NEXT: pshufb %xmm1, %xmm2 1306; SSSE3-NEXT: por %xmm6, %xmm2 1307; SSSE3-NEXT: movdqa %xmm3, %xmm0 1308; SSSE3-NEXT: movdqa %xmm2, %xmm1 1309; SSSE3-NEXT: retq 1310; 1311; AVX1-LABEL: test_bitreverse_v16i16: 1312; AVX1: # %bb.0: 1313; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1314; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 1315; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 1316; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1317; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm4 1318; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1319; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4 1320; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 1321; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1 1322; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1323; AVX1-NEXT: vpshufb %xmm1, %xmm6, %xmm1 1324; AVX1-NEXT: vpor %xmm1, %xmm4, %xmm1 1325; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 1326; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm2 1327; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm2 1328; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 1329; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 1330; AVX1-NEXT: vpshufb %xmm0, %xmm6, %xmm0 1331; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0 1332; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1333; AVX1-NEXT: retq 1334; 1335; AVX2-LABEL: test_bitreverse_v16i16: 1336; AVX2: # %bb.0: 1337; 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] 1338; 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] 1339; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 1340; 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] 1341; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2 1342; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 1343; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 1344; 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] 1345; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1346; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0 1347; AVX2-NEXT: retq 1348; 1349; AVX512-LABEL: test_bitreverse_v16i16: 1350; AVX512: # %bb.0: 1351; 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] 1352; 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] 1353; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm2 1354; 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] 1355; AVX512-NEXT: vpshufb %ymm2, %ymm3, %ymm2 1356; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm0 1357; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm0 1358; 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] 1359; AVX512-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1360; AVX512-NEXT: vpor %ymm0, %ymm2, %ymm0 1361; AVX512-NEXT: retq 1362; 1363; XOPAVX1-LABEL: test_bitreverse_v16i16: 1364; XOPAVX1: # %bb.0: 1365; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1366; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94] 1367; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1368; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1369; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1370; XOPAVX1-NEXT: retq 1371; 1372; XOPAVX2-LABEL: test_bitreverse_v16i16: 1373; XOPAVX2: # %bb.0: 1374; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1375; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94] 1376; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1377; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1378; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1379; XOPAVX2-NEXT: retq 1380; 1381; GFNISSE-LABEL: test_bitreverse_v16i16: 1382; GFNISSE: # %bb.0: 1383; GFNISSE-NEXT: movdqa {{.*#+}} xmm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 1384; GFNISSE-NEXT: pshufb %xmm2, %xmm0 1385; GFNISSE-NEXT: movdqa {{.*#+}} xmm3 = [9241421688590303745,9241421688590303745] 1386; GFNISSE-NEXT: gf2p8affineqb $0, %xmm3, %xmm0 1387; GFNISSE-NEXT: pshufb %xmm2, %xmm1 1388; GFNISSE-NEXT: gf2p8affineqb $0, %xmm3, %xmm1 1389; GFNISSE-NEXT: retq 1390; 1391; GFNIAVX-LABEL: test_bitreverse_v16i16: 1392; GFNIAVX: # %bb.0: 1393; GFNIAVX-NEXT: vextractf128 $1, %ymm0, %xmm1 1394; GFNIAVX-NEXT: vmovdqa {{.*#+}} xmm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 1395; GFNIAVX-NEXT: vpshufb %xmm2, %xmm1, %xmm1 1396; GFNIAVX-NEXT: vmovdqa {{.*#+}} xmm3 = [9241421688590303745,9241421688590303745] 1397; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm3, %xmm1, %xmm1 1398; GFNIAVX-NEXT: vpshufb %xmm2, %xmm0, %xmm0 1399; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm3, %xmm0, %xmm0 1400; GFNIAVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1401; GFNIAVX-NEXT: retq 1402; 1403; GFNIAVX2-LABEL: test_bitreverse_v16i16: 1404; GFNIAVX2: # %bb.0: 1405; GFNIAVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30] 1406; GFNIAVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 1407; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0 1408; GFNIAVX2-NEXT: retq 1409; 1410; GFNIAVX512F-LABEL: test_bitreverse_v16i16: 1411; GFNIAVX512F: # %bb.0: 1412; GFNIAVX512F-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] 1413; GFNIAVX512F-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 1414; GFNIAVX512F-NEXT: vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0 1415; GFNIAVX512F-NEXT: retq 1416; 1417; GFNIAVX512BW-LABEL: test_bitreverse_v16i16: 1418; GFNIAVX512BW: # %bb.0: 1419; GFNIAVX512BW-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] 1420; GFNIAVX512BW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 1421; GFNIAVX512BW-NEXT: vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0 1422; GFNIAVX512BW-NEXT: retq 1423 %b = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> %a) 1424 ret <16 x i16> %b 1425} 1426 1427define <8 x i32> @test_bitreverse_v8i32(<8 x i32> %a) nounwind { 1428; SSE2-LABEL: test_bitreverse_v8i32: 1429; SSE2: # %bb.0: 1430; SSE2-NEXT: movdqa %xmm1, %xmm2 1431; SSE2-NEXT: pxor %xmm3, %xmm3 1432; SSE2-NEXT: movdqa %xmm0, %xmm1 1433; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm3[8],xmm1[9],xmm3[9],xmm1[10],xmm3[10],xmm1[11],xmm3[11],xmm1[12],xmm3[12],xmm1[13],xmm3[13],xmm1[14],xmm3[14],xmm1[15],xmm3[15] 1434; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7] 1435; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4] 1436; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7] 1437; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 1438; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4] 1439; SSE2-NEXT: packuswb %xmm1, %xmm0 1440; SSE2-NEXT: movdqa %xmm0, %xmm4 1441; SSE2-NEXT: psllw $4, %xmm4 1442; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1443; SSE2-NEXT: movdqa %xmm1, %xmm5 1444; SSE2-NEXT: pandn %xmm4, %xmm5 1445; SSE2-NEXT: psrlw $4, %xmm0 1446; SSE2-NEXT: pand %xmm1, %xmm0 1447; SSE2-NEXT: por %xmm5, %xmm0 1448; SSE2-NEXT: movdqa %xmm0, %xmm5 1449; SSE2-NEXT: psrlw $2, %xmm5 1450; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 1451; SSE2-NEXT: pand %xmm4, %xmm5 1452; SSE2-NEXT: pand %xmm4, %xmm0 1453; SSE2-NEXT: psllw $2, %xmm0 1454; SSE2-NEXT: por %xmm5, %xmm0 1455; SSE2-NEXT: movdqa %xmm0, %xmm6 1456; SSE2-NEXT: psrlw $1, %xmm6 1457; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 1458; SSE2-NEXT: pand %xmm5, %xmm6 1459; SSE2-NEXT: pand %xmm5, %xmm0 1460; SSE2-NEXT: paddb %xmm0, %xmm0 1461; SSE2-NEXT: por %xmm6, %xmm0 1462; SSE2-NEXT: movdqa %xmm2, %xmm6 1463; SSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm3[8],xmm6[9],xmm3[9],xmm6[10],xmm3[10],xmm6[11],xmm3[11],xmm6[12],xmm3[12],xmm6[13],xmm3[13],xmm6[14],xmm3[14],xmm6[15],xmm3[15] 1464; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7] 1465; SSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4] 1466; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7] 1467; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7] 1468; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4] 1469; SSE2-NEXT: packuswb %xmm6, %xmm2 1470; SSE2-NEXT: movdqa %xmm2, %xmm3 1471; SSE2-NEXT: psllw $4, %xmm3 1472; SSE2-NEXT: psrlw $4, %xmm2 1473; SSE2-NEXT: pand %xmm1, %xmm2 1474; SSE2-NEXT: pandn %xmm3, %xmm1 1475; SSE2-NEXT: por %xmm2, %xmm1 1476; SSE2-NEXT: movdqa %xmm1, %xmm2 1477; SSE2-NEXT: psrlw $2, %xmm2 1478; SSE2-NEXT: pand %xmm4, %xmm2 1479; SSE2-NEXT: pand %xmm4, %xmm1 1480; SSE2-NEXT: psllw $2, %xmm1 1481; SSE2-NEXT: por %xmm2, %xmm1 1482; SSE2-NEXT: movdqa %xmm1, %xmm2 1483; SSE2-NEXT: psrlw $1, %xmm2 1484; SSE2-NEXT: pand %xmm5, %xmm2 1485; SSE2-NEXT: pand %xmm5, %xmm1 1486; SSE2-NEXT: paddb %xmm1, %xmm1 1487; SSE2-NEXT: por %xmm2, %xmm1 1488; SSE2-NEXT: retq 1489; 1490; SSSE3-LABEL: test_bitreverse_v8i32: 1491; SSSE3: # %bb.0: 1492; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 1493; SSSE3-NEXT: pshufb %xmm4, %xmm0 1494; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1495; SSSE3-NEXT: movdqa %xmm0, %xmm2 1496; SSSE3-NEXT: pand %xmm5, %xmm2 1497; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1498; SSSE3-NEXT: movdqa %xmm6, %xmm7 1499; SSSE3-NEXT: pshufb %xmm2, %xmm7 1500; SSSE3-NEXT: psrlw $4, %xmm0 1501; SSSE3-NEXT: pand %xmm5, %xmm0 1502; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1503; SSSE3-NEXT: movdqa %xmm2, %xmm3 1504; SSSE3-NEXT: pshufb %xmm0, %xmm3 1505; SSSE3-NEXT: por %xmm7, %xmm3 1506; SSSE3-NEXT: pshufb %xmm4, %xmm1 1507; SSSE3-NEXT: movdqa %xmm1, %xmm0 1508; SSSE3-NEXT: pand %xmm5, %xmm0 1509; SSSE3-NEXT: pshufb %xmm0, %xmm6 1510; SSSE3-NEXT: psrlw $4, %xmm1 1511; SSSE3-NEXT: pand %xmm5, %xmm1 1512; SSSE3-NEXT: pshufb %xmm1, %xmm2 1513; SSSE3-NEXT: por %xmm6, %xmm2 1514; SSSE3-NEXT: movdqa %xmm3, %xmm0 1515; SSSE3-NEXT: movdqa %xmm2, %xmm1 1516; SSSE3-NEXT: retq 1517; 1518; AVX1-LABEL: test_bitreverse_v8i32: 1519; AVX1: # %bb.0: 1520; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1521; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 1522; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 1523; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1524; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm4 1525; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1526; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4 1527; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 1528; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1 1529; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1530; AVX1-NEXT: vpshufb %xmm1, %xmm6, %xmm1 1531; AVX1-NEXT: vpor %xmm1, %xmm4, %xmm1 1532; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 1533; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm2 1534; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm2 1535; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 1536; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 1537; AVX1-NEXT: vpshufb %xmm0, %xmm6, %xmm0 1538; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0 1539; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1540; AVX1-NEXT: retq 1541; 1542; AVX2-LABEL: test_bitreverse_v8i32: 1543; AVX2: # %bb.0: 1544; 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] 1545; 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] 1546; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 1547; 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] 1548; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2 1549; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 1550; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 1551; 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] 1552; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1553; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0 1554; AVX2-NEXT: retq 1555; 1556; AVX512-LABEL: test_bitreverse_v8i32: 1557; AVX512: # %bb.0: 1558; 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] 1559; 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] 1560; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm2 1561; 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] 1562; AVX512-NEXT: vpshufb %ymm2, %ymm3, %ymm2 1563; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm0 1564; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm0 1565; 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] 1566; AVX512-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1567; AVX512-NEXT: vpor %ymm0, %ymm2, %ymm0 1568; AVX512-NEXT: retq 1569; 1570; XOPAVX1-LABEL: test_bitreverse_v8i32: 1571; XOPAVX1: # %bb.0: 1572; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1573; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92] 1574; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1575; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1576; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1577; XOPAVX1-NEXT: retq 1578; 1579; XOPAVX2-LABEL: test_bitreverse_v8i32: 1580; XOPAVX2: # %bb.0: 1581; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1582; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92] 1583; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1584; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1585; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1586; XOPAVX2-NEXT: retq 1587; 1588; GFNISSE-LABEL: test_bitreverse_v8i32: 1589; GFNISSE: # %bb.0: 1590; GFNISSE-NEXT: movdqa {{.*#+}} xmm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 1591; GFNISSE-NEXT: pshufb %xmm2, %xmm0 1592; GFNISSE-NEXT: movdqa {{.*#+}} xmm3 = [9241421688590303745,9241421688590303745] 1593; GFNISSE-NEXT: gf2p8affineqb $0, %xmm3, %xmm0 1594; GFNISSE-NEXT: pshufb %xmm2, %xmm1 1595; GFNISSE-NEXT: gf2p8affineqb $0, %xmm3, %xmm1 1596; GFNISSE-NEXT: retq 1597; 1598; GFNIAVX-LABEL: test_bitreverse_v8i32: 1599; GFNIAVX: # %bb.0: 1600; GFNIAVX-NEXT: vextractf128 $1, %ymm0, %xmm1 1601; GFNIAVX-NEXT: vmovdqa {{.*#+}} xmm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 1602; GFNIAVX-NEXT: vpshufb %xmm2, %xmm1, %xmm1 1603; GFNIAVX-NEXT: vmovdqa {{.*#+}} xmm3 = [9241421688590303745,9241421688590303745] 1604; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm3, %xmm1, %xmm1 1605; GFNIAVX-NEXT: vpshufb %xmm2, %xmm0, %xmm0 1606; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm3, %xmm0, %xmm0 1607; GFNIAVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1608; GFNIAVX-NEXT: retq 1609; 1610; GFNIAVX2-LABEL: test_bitreverse_v8i32: 1611; GFNIAVX2: # %bb.0: 1612; GFNIAVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,19,18,17,16,23,22,21,20,27,26,25,24,31,30,29,28] 1613; GFNIAVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 1614; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0 1615; GFNIAVX2-NEXT: retq 1616; 1617; GFNIAVX512F-LABEL: test_bitreverse_v8i32: 1618; GFNIAVX512F: # %bb.0: 1619; GFNIAVX512F-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] 1620; GFNIAVX512F-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 1621; GFNIAVX512F-NEXT: vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0 1622; GFNIAVX512F-NEXT: retq 1623; 1624; GFNIAVX512BW-LABEL: test_bitreverse_v8i32: 1625; GFNIAVX512BW: # %bb.0: 1626; GFNIAVX512BW-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] 1627; GFNIAVX512BW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 1628; GFNIAVX512BW-NEXT: vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0 1629; GFNIAVX512BW-NEXT: retq 1630 %b = call <8 x i32> @llvm.bitreverse.v8i32(<8 x i32> %a) 1631 ret <8 x i32> %b 1632} 1633 1634define <4 x i64> @test_bitreverse_v4i64(<4 x i64> %a) nounwind { 1635; SSE2-LABEL: test_bitreverse_v4i64: 1636; SSE2: # %bb.0: 1637; SSE2-NEXT: movdqa %xmm1, %xmm2 1638; SSE2-NEXT: pxor %xmm3, %xmm3 1639; SSE2-NEXT: movdqa %xmm0, %xmm1 1640; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm3[8],xmm1[9],xmm3[9],xmm1[10],xmm3[10],xmm1[11],xmm3[11],xmm1[12],xmm3[12],xmm1[13],xmm3[13],xmm1[14],xmm3[14],xmm1[15],xmm3[15] 1641; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] 1642; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7] 1643; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4] 1644; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7] 1645; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1646; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 1647; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4] 1648; SSE2-NEXT: packuswb %xmm1, %xmm0 1649; SSE2-NEXT: movdqa %xmm0, %xmm4 1650; SSE2-NEXT: psllw $4, %xmm4 1651; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1652; SSE2-NEXT: movdqa %xmm1, %xmm5 1653; SSE2-NEXT: pandn %xmm4, %xmm5 1654; SSE2-NEXT: psrlw $4, %xmm0 1655; SSE2-NEXT: pand %xmm1, %xmm0 1656; SSE2-NEXT: por %xmm5, %xmm0 1657; SSE2-NEXT: movdqa %xmm0, %xmm5 1658; SSE2-NEXT: psrlw $2, %xmm5 1659; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 1660; SSE2-NEXT: pand %xmm4, %xmm5 1661; SSE2-NEXT: pand %xmm4, %xmm0 1662; SSE2-NEXT: psllw $2, %xmm0 1663; SSE2-NEXT: por %xmm5, %xmm0 1664; SSE2-NEXT: movdqa %xmm0, %xmm6 1665; SSE2-NEXT: psrlw $1, %xmm6 1666; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 1667; SSE2-NEXT: pand %xmm5, %xmm6 1668; SSE2-NEXT: pand %xmm5, %xmm0 1669; SSE2-NEXT: paddb %xmm0, %xmm0 1670; SSE2-NEXT: por %xmm6, %xmm0 1671; SSE2-NEXT: movdqa %xmm2, %xmm6 1672; SSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm3[8],xmm6[9],xmm3[9],xmm6[10],xmm3[10],xmm6[11],xmm3[11],xmm6[12],xmm3[12],xmm6[13],xmm3[13],xmm6[14],xmm3[14],xmm6[15],xmm3[15] 1673; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[2,3,0,1] 1674; SSE2-NEXT: pshuflw {{.*#+}} xmm6 = xmm6[3,2,1,0,4,5,6,7] 1675; SSE2-NEXT: pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,7,6,5,4] 1676; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7] 1677; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1] 1678; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7] 1679; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4] 1680; SSE2-NEXT: packuswb %xmm6, %xmm2 1681; SSE2-NEXT: movdqa %xmm2, %xmm3 1682; SSE2-NEXT: psllw $4, %xmm3 1683; SSE2-NEXT: psrlw $4, %xmm2 1684; SSE2-NEXT: pand %xmm1, %xmm2 1685; SSE2-NEXT: pandn %xmm3, %xmm1 1686; SSE2-NEXT: por %xmm2, %xmm1 1687; SSE2-NEXT: movdqa %xmm1, %xmm2 1688; SSE2-NEXT: psrlw $2, %xmm2 1689; SSE2-NEXT: pand %xmm4, %xmm2 1690; SSE2-NEXT: pand %xmm4, %xmm1 1691; SSE2-NEXT: psllw $2, %xmm1 1692; SSE2-NEXT: por %xmm2, %xmm1 1693; SSE2-NEXT: movdqa %xmm1, %xmm2 1694; SSE2-NEXT: psrlw $1, %xmm2 1695; SSE2-NEXT: pand %xmm5, %xmm2 1696; SSE2-NEXT: pand %xmm5, %xmm1 1697; SSE2-NEXT: paddb %xmm1, %xmm1 1698; SSE2-NEXT: por %xmm2, %xmm1 1699; SSE2-NEXT: retq 1700; 1701; SSSE3-LABEL: test_bitreverse_v4i64: 1702; SSSE3: # %bb.0: 1703; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 1704; SSSE3-NEXT: pshufb %xmm4, %xmm0 1705; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1706; SSSE3-NEXT: movdqa %xmm0, %xmm2 1707; SSSE3-NEXT: pand %xmm5, %xmm2 1708; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1709; SSSE3-NEXT: movdqa %xmm6, %xmm7 1710; SSSE3-NEXT: pshufb %xmm2, %xmm7 1711; SSSE3-NEXT: psrlw $4, %xmm0 1712; SSSE3-NEXT: pand %xmm5, %xmm0 1713; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1714; SSSE3-NEXT: movdqa %xmm2, %xmm3 1715; SSSE3-NEXT: pshufb %xmm0, %xmm3 1716; SSSE3-NEXT: por %xmm7, %xmm3 1717; SSSE3-NEXT: pshufb %xmm4, %xmm1 1718; SSSE3-NEXT: movdqa %xmm1, %xmm0 1719; SSSE3-NEXT: pand %xmm5, %xmm0 1720; SSSE3-NEXT: pshufb %xmm0, %xmm6 1721; SSSE3-NEXT: psrlw $4, %xmm1 1722; SSSE3-NEXT: pand %xmm5, %xmm1 1723; SSSE3-NEXT: pshufb %xmm1, %xmm2 1724; SSSE3-NEXT: por %xmm6, %xmm2 1725; SSSE3-NEXT: movdqa %xmm3, %xmm0 1726; SSSE3-NEXT: movdqa %xmm2, %xmm1 1727; SSSE3-NEXT: retq 1728; 1729; AVX1-LABEL: test_bitreverse_v4i64: 1730; AVX1: # %bb.0: 1731; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1732; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 1733; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 1734; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1735; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm4 1736; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1737; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4 1738; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 1739; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1 1740; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1741; AVX1-NEXT: vpshufb %xmm1, %xmm6, %xmm1 1742; AVX1-NEXT: vpor %xmm1, %xmm4, %xmm1 1743; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 1744; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm2 1745; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm2 1746; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 1747; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 1748; AVX1-NEXT: vpshufb %xmm0, %xmm6, %xmm0 1749; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0 1750; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1751; AVX1-NEXT: retq 1752; 1753; AVX2-LABEL: test_bitreverse_v4i64: 1754; AVX2: # %bb.0: 1755; 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] 1756; 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] 1757; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 1758; 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] 1759; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2 1760; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 1761; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 1762; 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] 1763; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1764; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0 1765; AVX2-NEXT: retq 1766; 1767; AVX512-LABEL: test_bitreverse_v4i64: 1768; AVX512: # %bb.0: 1769; 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] 1770; 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] 1771; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm2 1772; 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] 1773; AVX512-NEXT: vpshufb %ymm2, %ymm3, %ymm2 1774; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm0 1775; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm0 1776; 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] 1777; AVX512-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1778; AVX512-NEXT: vpor %ymm0, %ymm2, %ymm0 1779; AVX512-NEXT: retq 1780; 1781; XOPAVX1-LABEL: test_bitreverse_v4i64: 1782; XOPAVX1: # %bb.0: 1783; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1784; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88] 1785; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1786; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1787; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1788; XOPAVX1-NEXT: retq 1789; 1790; XOPAVX2-LABEL: test_bitreverse_v4i64: 1791; XOPAVX2: # %bb.0: 1792; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1793; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88] 1794; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1795; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1796; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1797; XOPAVX2-NEXT: retq 1798; 1799; GFNISSE-LABEL: test_bitreverse_v4i64: 1800; GFNISSE: # %bb.0: 1801; GFNISSE-NEXT: movdqa {{.*#+}} xmm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 1802; GFNISSE-NEXT: pshufb %xmm2, %xmm0 1803; GFNISSE-NEXT: movdqa {{.*#+}} xmm3 = [9241421688590303745,9241421688590303745] 1804; GFNISSE-NEXT: gf2p8affineqb $0, %xmm3, %xmm0 1805; GFNISSE-NEXT: pshufb %xmm2, %xmm1 1806; GFNISSE-NEXT: gf2p8affineqb $0, %xmm3, %xmm1 1807; GFNISSE-NEXT: retq 1808; 1809; GFNIAVX-LABEL: test_bitreverse_v4i64: 1810; GFNIAVX: # %bb.0: 1811; GFNIAVX-NEXT: vextractf128 $1, %ymm0, %xmm1 1812; GFNIAVX-NEXT: vmovdqa {{.*#+}} xmm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 1813; GFNIAVX-NEXT: vpshufb %xmm2, %xmm1, %xmm1 1814; GFNIAVX-NEXT: vmovdqa {{.*#+}} xmm3 = [9241421688590303745,9241421688590303745] 1815; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm3, %xmm1, %xmm1 1816; GFNIAVX-NEXT: vpshufb %xmm2, %xmm0, %xmm0 1817; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm3, %xmm0, %xmm0 1818; GFNIAVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1819; GFNIAVX-NEXT: retq 1820; 1821; GFNIAVX2-LABEL: test_bitreverse_v4i64: 1822; GFNIAVX2: # %bb.0: 1823; GFNIAVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24] 1824; GFNIAVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 1825; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0 1826; GFNIAVX2-NEXT: retq 1827; 1828; GFNIAVX512F-LABEL: test_bitreverse_v4i64: 1829; GFNIAVX512F: # %bb.0: 1830; GFNIAVX512F-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] 1831; GFNIAVX512F-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 1832; GFNIAVX512F-NEXT: vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0 1833; GFNIAVX512F-NEXT: retq 1834; 1835; GFNIAVX512BW-LABEL: test_bitreverse_v4i64: 1836; GFNIAVX512BW: # %bb.0: 1837; GFNIAVX512BW-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] 1838; GFNIAVX512BW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 1839; GFNIAVX512BW-NEXT: vgf2p8affineqb $0, %ymm1, %ymm0, %ymm0 1840; GFNIAVX512BW-NEXT: retq 1841 %b = call <4 x i64> @llvm.bitreverse.v4i64(<4 x i64> %a) 1842 ret <4 x i64> %b 1843} 1844 1845define <64 x i8> @test_bitreverse_v64i8(<64 x i8> %a) nounwind { 1846; SSE2-LABEL: test_bitreverse_v64i8: 1847; SSE2: # %bb.0: 1848; SSE2-NEXT: movdqa %xmm3, %xmm4 1849; SSE2-NEXT: movdqa %xmm0, %xmm5 1850; SSE2-NEXT: psllw $4, %xmm5 1851; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1852; SSE2-NEXT: movdqa %xmm3, %xmm6 1853; SSE2-NEXT: pandn %xmm5, %xmm6 1854; SSE2-NEXT: psrlw $4, %xmm0 1855; SSE2-NEXT: pand %xmm3, %xmm0 1856; SSE2-NEXT: por %xmm6, %xmm0 1857; SSE2-NEXT: movdqa %xmm0, %xmm6 1858; SSE2-NEXT: psrlw $2, %xmm6 1859; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 1860; SSE2-NEXT: pand %xmm8, %xmm6 1861; SSE2-NEXT: pand %xmm8, %xmm0 1862; SSE2-NEXT: psllw $2, %xmm0 1863; SSE2-NEXT: por %xmm6, %xmm0 1864; SSE2-NEXT: movdqa %xmm0, %xmm7 1865; SSE2-NEXT: psrlw $1, %xmm7 1866; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 1867; SSE2-NEXT: pand %xmm6, %xmm7 1868; SSE2-NEXT: pand %xmm6, %xmm0 1869; SSE2-NEXT: paddb %xmm0, %xmm0 1870; SSE2-NEXT: por %xmm7, %xmm0 1871; SSE2-NEXT: movdqa %xmm1, %xmm7 1872; SSE2-NEXT: psllw $4, %xmm7 1873; SSE2-NEXT: movdqa %xmm3, %xmm5 1874; SSE2-NEXT: pandn %xmm7, %xmm5 1875; SSE2-NEXT: psrlw $4, %xmm1 1876; SSE2-NEXT: pand %xmm3, %xmm1 1877; SSE2-NEXT: por %xmm5, %xmm1 1878; SSE2-NEXT: movdqa %xmm1, %xmm5 1879; SSE2-NEXT: psrlw $2, %xmm5 1880; SSE2-NEXT: pand %xmm8, %xmm5 1881; SSE2-NEXT: pand %xmm8, %xmm1 1882; SSE2-NEXT: psllw $2, %xmm1 1883; SSE2-NEXT: por %xmm5, %xmm1 1884; SSE2-NEXT: movdqa %xmm1, %xmm5 1885; SSE2-NEXT: psrlw $1, %xmm5 1886; SSE2-NEXT: pand %xmm6, %xmm5 1887; SSE2-NEXT: pand %xmm6, %xmm1 1888; SSE2-NEXT: paddb %xmm1, %xmm1 1889; SSE2-NEXT: por %xmm5, %xmm1 1890; SSE2-NEXT: movdqa %xmm2, %xmm5 1891; SSE2-NEXT: psllw $4, %xmm5 1892; SSE2-NEXT: movdqa %xmm3, %xmm7 1893; SSE2-NEXT: pandn %xmm5, %xmm7 1894; SSE2-NEXT: psrlw $4, %xmm2 1895; SSE2-NEXT: pand %xmm3, %xmm2 1896; SSE2-NEXT: por %xmm7, %xmm2 1897; SSE2-NEXT: movdqa %xmm2, %xmm5 1898; SSE2-NEXT: psrlw $2, %xmm5 1899; SSE2-NEXT: pand %xmm8, %xmm5 1900; SSE2-NEXT: pand %xmm8, %xmm2 1901; SSE2-NEXT: psllw $2, %xmm2 1902; SSE2-NEXT: por %xmm5, %xmm2 1903; SSE2-NEXT: movdqa %xmm2, %xmm5 1904; SSE2-NEXT: psrlw $1, %xmm5 1905; SSE2-NEXT: pand %xmm6, %xmm5 1906; SSE2-NEXT: pand %xmm6, %xmm2 1907; SSE2-NEXT: paddb %xmm2, %xmm2 1908; SSE2-NEXT: por %xmm5, %xmm2 1909; SSE2-NEXT: movdqa %xmm4, %xmm5 1910; SSE2-NEXT: psllw $4, %xmm5 1911; SSE2-NEXT: psrlw $4, %xmm4 1912; SSE2-NEXT: pand %xmm3, %xmm4 1913; SSE2-NEXT: pandn %xmm5, %xmm3 1914; SSE2-NEXT: por %xmm4, %xmm3 1915; SSE2-NEXT: movdqa %xmm3, %xmm4 1916; SSE2-NEXT: psrlw $2, %xmm4 1917; SSE2-NEXT: pand %xmm8, %xmm4 1918; SSE2-NEXT: pand %xmm8, %xmm3 1919; SSE2-NEXT: psllw $2, %xmm3 1920; SSE2-NEXT: por %xmm4, %xmm3 1921; SSE2-NEXT: movdqa %xmm3, %xmm4 1922; SSE2-NEXT: psrlw $1, %xmm4 1923; SSE2-NEXT: pand %xmm6, %xmm4 1924; SSE2-NEXT: pand %xmm6, %xmm3 1925; SSE2-NEXT: paddb %xmm3, %xmm3 1926; SSE2-NEXT: por %xmm4, %xmm3 1927; SSE2-NEXT: retq 1928; 1929; SSSE3-LABEL: test_bitreverse_v64i8: 1930; SSSE3: # %bb.0: 1931; SSSE3-NEXT: movdqa %xmm0, %xmm5 1932; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1933; SSSE3-NEXT: pand %xmm8, %xmm0 1934; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1935; SSSE3-NEXT: movdqa %xmm9, %xmm6 1936; SSSE3-NEXT: pshufb %xmm0, %xmm6 1937; SSSE3-NEXT: psrlw $4, %xmm5 1938; SSSE3-NEXT: pand %xmm8, %xmm5 1939; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1940; SSSE3-NEXT: movdqa %xmm4, %xmm0 1941; SSSE3-NEXT: pshufb %xmm5, %xmm0 1942; SSSE3-NEXT: por %xmm6, %xmm0 1943; SSSE3-NEXT: movdqa %xmm1, %xmm5 1944; SSSE3-NEXT: pand %xmm8, %xmm5 1945; SSSE3-NEXT: movdqa %xmm9, %xmm6 1946; SSSE3-NEXT: pshufb %xmm5, %xmm6 1947; SSSE3-NEXT: psrlw $4, %xmm1 1948; SSSE3-NEXT: pand %xmm8, %xmm1 1949; SSSE3-NEXT: movdqa %xmm4, %xmm5 1950; SSSE3-NEXT: pshufb %xmm1, %xmm5 1951; SSSE3-NEXT: por %xmm6, %xmm5 1952; SSSE3-NEXT: movdqa %xmm2, %xmm1 1953; SSSE3-NEXT: pand %xmm8, %xmm1 1954; SSSE3-NEXT: movdqa %xmm9, %xmm7 1955; SSSE3-NEXT: pshufb %xmm1, %xmm7 1956; SSSE3-NEXT: psrlw $4, %xmm2 1957; SSSE3-NEXT: pand %xmm8, %xmm2 1958; SSSE3-NEXT: movdqa %xmm4, %xmm6 1959; SSSE3-NEXT: pshufb %xmm2, %xmm6 1960; SSSE3-NEXT: por %xmm7, %xmm6 1961; SSSE3-NEXT: movdqa %xmm3, %xmm1 1962; SSSE3-NEXT: pand %xmm8, %xmm1 1963; SSSE3-NEXT: pshufb %xmm1, %xmm9 1964; SSSE3-NEXT: psrlw $4, %xmm3 1965; SSSE3-NEXT: pand %xmm8, %xmm3 1966; SSSE3-NEXT: pshufb %xmm3, %xmm4 1967; SSSE3-NEXT: por %xmm9, %xmm4 1968; SSSE3-NEXT: movdqa %xmm5, %xmm1 1969; SSSE3-NEXT: movdqa %xmm6, %xmm2 1970; SSSE3-NEXT: movdqa %xmm4, %xmm3 1971; SSSE3-NEXT: retq 1972; 1973; AVX1-LABEL: test_bitreverse_v64i8: 1974; AVX1: # %bb.0: 1975; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1976; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1977; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm4 1978; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1979; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4 1980; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2 1981; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2 1982; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1983; AVX1-NEXT: vpshufb %xmm2, %xmm6, %xmm2 1984; AVX1-NEXT: vpor %xmm2, %xmm4, %xmm2 1985; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm4 1986; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4 1987; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 1988; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 1989; AVX1-NEXT: vpshufb %xmm0, %xmm6, %xmm0 1990; AVX1-NEXT: vpor %xmm0, %xmm4, %xmm0 1991; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1992; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1993; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm4 1994; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4 1995; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2 1996; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2 1997; AVX1-NEXT: vpshufb %xmm2, %xmm6, %xmm2 1998; AVX1-NEXT: vpor %xmm2, %xmm4, %xmm2 1999; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm4 2000; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4 2001; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 2002; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1 2003; AVX1-NEXT: vpshufb %xmm1, %xmm6, %xmm1 2004; AVX1-NEXT: vpor %xmm1, %xmm4, %xmm1 2005; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 2006; AVX1-NEXT: retq 2007; 2008; AVX2-LABEL: test_bitreverse_v64i8: 2009; AVX2: # %bb.0: 2010; 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] 2011; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm3 2012; 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] 2013; AVX2-NEXT: vpshufb %ymm3, %ymm4, %ymm3 2014; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 2015; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 2016; 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] 2017; AVX2-NEXT: vpshufb %ymm0, %ymm5, %ymm0 2018; AVX2-NEXT: vpor %ymm0, %ymm3, %ymm0 2019; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm3 2020; AVX2-NEXT: vpshufb %ymm3, %ymm4, %ymm3 2021; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm1 2022; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1 2023; AVX2-NEXT: vpshufb %ymm1, %ymm5, %ymm1 2024; AVX2-NEXT: vpor %ymm1, %ymm3, %ymm1 2025; AVX2-NEXT: retq 2026; 2027; AVX512F-LABEL: test_bitreverse_v64i8: 2028; AVX512F: # %bb.0: 2029; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm1 2030; 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] 2031; AVX512F-NEXT: vpand %ymm2, %ymm1, %ymm3 2032; 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] 2033; AVX512F-NEXT: vpshufb %ymm3, %ymm4, %ymm3 2034; AVX512F-NEXT: vpand %ymm2, %ymm0, %ymm5 2035; AVX512F-NEXT: vpshufb %ymm5, %ymm4, %ymm4 2036; AVX512F-NEXT: vinserti64x4 $1, %ymm3, %zmm4, %zmm3 2037; AVX512F-NEXT: vpsrlw $4, %ymm1, %ymm1 2038; AVX512F-NEXT: vpand %ymm2, %ymm1, %ymm1 2039; AVX512F-NEXT: vmovdqa {{.*#+}} ymm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 2040; AVX512F-NEXT: vpshufb %ymm1, %ymm4, %ymm1 2041; AVX512F-NEXT: vpsrlw $4, %ymm0, %ymm0 2042; AVX512F-NEXT: vpand %ymm2, %ymm0, %ymm0 2043; AVX512F-NEXT: vpshufb %ymm0, %ymm4, %ymm0 2044; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 2045; AVX512F-NEXT: vporq %zmm0, %zmm3, %zmm0 2046; AVX512F-NEXT: retq 2047; 2048; AVX512BW-LABEL: test_bitreverse_v64i8: 2049; AVX512BW: # %bb.0: 2050; 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] 2051; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm2 2052; 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] 2053; AVX512BW-NEXT: vpshufb %zmm2, %zmm3, %zmm2 2054; AVX512BW-NEXT: vpsrlw $4, %zmm0, %zmm0 2055; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm0 2056; 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] 2057; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0 2058; AVX512BW-NEXT: vporq %zmm0, %zmm2, %zmm0 2059; AVX512BW-NEXT: retq 2060; 2061; XOPAVX1-LABEL: test_bitreverse_v64i8: 2062; XOPAVX1: # %bb.0: 2063; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 2064; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95] 2065; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2066; XOPAVX1-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm0 2067; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 2068; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2069; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2070; XOPAVX1-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm1 2071; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 2072; XOPAVX1-NEXT: retq 2073; 2074; XOPAVX2-LABEL: test_bitreverse_v64i8: 2075; XOPAVX2: # %bb.0: 2076; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 2077; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95] 2078; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2079; XOPAVX2-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm0 2080; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 2081; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 2082; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2083; XOPAVX2-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm1 2084; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 2085; XOPAVX2-NEXT: retq 2086; 2087; GFNISSE-LABEL: test_bitreverse_v64i8: 2088; GFNISSE: # %bb.0: 2089; GFNISSE-NEXT: movdqa {{.*#+}} xmm4 = [9241421688590303745,9241421688590303745] 2090; GFNISSE-NEXT: gf2p8affineqb $0, %xmm4, %xmm0 2091; GFNISSE-NEXT: gf2p8affineqb $0, %xmm4, %xmm1 2092; GFNISSE-NEXT: gf2p8affineqb $0, %xmm4, %xmm2 2093; GFNISSE-NEXT: gf2p8affineqb $0, %xmm4, %xmm3 2094; GFNISSE-NEXT: retq 2095; 2096; GFNIAVX-LABEL: test_bitreverse_v64i8: 2097; GFNIAVX: # %bb.0: 2098; GFNIAVX-NEXT: vextractf128 $1, %ymm0, %xmm2 2099; GFNIAVX-NEXT: vmovdqa {{.*#+}} xmm3 = [9241421688590303745,9241421688590303745] 2100; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm3, %xmm2, %xmm2 2101; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm3, %xmm0, %xmm0 2102; GFNIAVX-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 2103; GFNIAVX-NEXT: vextractf128 $1, %ymm1, %xmm2 2104; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm3, %xmm2, %xmm2 2105; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm3, %xmm1, %xmm1 2106; GFNIAVX-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 2107; GFNIAVX-NEXT: retq 2108; 2109; GFNIAVX2-LABEL: test_bitreverse_v64i8: 2110; GFNIAVX2: # %bb.0: 2111; GFNIAVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 2112; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm2, %ymm0, %ymm0 2113; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm2, %ymm1, %ymm1 2114; GFNIAVX2-NEXT: retq 2115; 2116; GFNIAVX512F-LABEL: test_bitreverse_v64i8: 2117; GFNIAVX512F: # %bb.0: 2118; GFNIAVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm1 2119; GFNIAVX512F-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 2120; GFNIAVX512F-NEXT: vgf2p8affineqb $0, %ymm2, %ymm1, %ymm1 2121; GFNIAVX512F-NEXT: vgf2p8affineqb $0, %ymm2, %ymm0, %ymm0 2122; GFNIAVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 2123; GFNIAVX512F-NEXT: retq 2124; 2125; GFNIAVX512BW-LABEL: test_bitreverse_v64i8: 2126; GFNIAVX512BW: # %bb.0: 2127; GFNIAVX512BW-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 2128; GFNIAVX512BW-NEXT: retq 2129 %b = call <64 x i8> @llvm.bitreverse.v64i8(<64 x i8> %a) 2130 ret <64 x i8> %b 2131} 2132 2133define <32 x i16> @test_bitreverse_v32i16(<32 x i16> %a) nounwind { 2134; SSE2-LABEL: test_bitreverse_v32i16: 2135; SSE2: # %bb.0: 2136; SSE2-NEXT: movdqa %xmm3, %xmm4 2137; SSE2-NEXT: movdqa %xmm0, %xmm3 2138; SSE2-NEXT: psrlw $8, %xmm3 2139; SSE2-NEXT: psllw $8, %xmm0 2140; SSE2-NEXT: por %xmm3, %xmm0 2141; SSE2-NEXT: movdqa %xmm0, %xmm5 2142; SSE2-NEXT: psllw $4, %xmm5 2143; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 2144; SSE2-NEXT: movdqa %xmm3, %xmm6 2145; SSE2-NEXT: pandn %xmm5, %xmm6 2146; SSE2-NEXT: psrlw $4, %xmm0 2147; SSE2-NEXT: pand %xmm3, %xmm0 2148; SSE2-NEXT: por %xmm6, %xmm0 2149; SSE2-NEXT: movdqa %xmm0, %xmm6 2150; SSE2-NEXT: psrlw $2, %xmm6 2151; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 2152; SSE2-NEXT: pand %xmm8, %xmm6 2153; SSE2-NEXT: pand %xmm8, %xmm0 2154; SSE2-NEXT: psllw $2, %xmm0 2155; SSE2-NEXT: por %xmm6, %xmm0 2156; SSE2-NEXT: movdqa %xmm0, %xmm7 2157; SSE2-NEXT: psrlw $1, %xmm7 2158; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 2159; SSE2-NEXT: pand %xmm6, %xmm7 2160; SSE2-NEXT: pand %xmm6, %xmm0 2161; SSE2-NEXT: paddb %xmm0, %xmm0 2162; SSE2-NEXT: por %xmm7, %xmm0 2163; SSE2-NEXT: movdqa %xmm1, %xmm7 2164; SSE2-NEXT: psrlw $8, %xmm7 2165; SSE2-NEXT: psllw $8, %xmm1 2166; SSE2-NEXT: por %xmm7, %xmm1 2167; SSE2-NEXT: movdqa %xmm1, %xmm7 2168; SSE2-NEXT: psllw $4, %xmm7 2169; SSE2-NEXT: movdqa %xmm3, %xmm5 2170; SSE2-NEXT: pandn %xmm7, %xmm5 2171; SSE2-NEXT: psrlw $4, %xmm1 2172; SSE2-NEXT: pand %xmm3, %xmm1 2173; SSE2-NEXT: por %xmm5, %xmm1 2174; SSE2-NEXT: movdqa %xmm1, %xmm5 2175; SSE2-NEXT: psrlw $2, %xmm5 2176; SSE2-NEXT: pand %xmm8, %xmm5 2177; SSE2-NEXT: pand %xmm8, %xmm1 2178; SSE2-NEXT: psllw $2, %xmm1 2179; SSE2-NEXT: por %xmm5, %xmm1 2180; SSE2-NEXT: movdqa %xmm1, %xmm5 2181; SSE2-NEXT: psrlw $1, %xmm5 2182; SSE2-NEXT: pand %xmm6, %xmm5 2183; SSE2-NEXT: pand %xmm6, %xmm1 2184; SSE2-NEXT: paddb %xmm1, %xmm1 2185; SSE2-NEXT: por %xmm5, %xmm1 2186; SSE2-NEXT: movdqa %xmm2, %xmm5 2187; SSE2-NEXT: psrlw $8, %xmm5 2188; SSE2-NEXT: psllw $8, %xmm2 2189; SSE2-NEXT: por %xmm5, %xmm2 2190; SSE2-NEXT: movdqa %xmm2, %xmm5 2191; SSE2-NEXT: psllw $4, %xmm5 2192; SSE2-NEXT: movdqa %xmm3, %xmm7 2193; SSE2-NEXT: pandn %xmm5, %xmm7 2194; SSE2-NEXT: psrlw $4, %xmm2 2195; SSE2-NEXT: pand %xmm3, %xmm2 2196; SSE2-NEXT: por %xmm7, %xmm2 2197; SSE2-NEXT: movdqa %xmm2, %xmm5 2198; SSE2-NEXT: psrlw $2, %xmm5 2199; SSE2-NEXT: pand %xmm8, %xmm5 2200; SSE2-NEXT: pand %xmm8, %xmm2 2201; SSE2-NEXT: psllw $2, %xmm2 2202; SSE2-NEXT: por %xmm5, %xmm2 2203; SSE2-NEXT: movdqa %xmm2, %xmm5 2204; SSE2-NEXT: psrlw $1, %xmm5 2205; SSE2-NEXT: pand %xmm6, %xmm5 2206; SSE2-NEXT: pand %xmm6, %xmm2 2207; SSE2-NEXT: paddb %xmm2, %xmm2 2208; SSE2-NEXT: por %xmm5, %xmm2 2209; SSE2-NEXT: movdqa %xmm4, %xmm5 2210; SSE2-NEXT: psrlw $8, %xmm5 2211; SSE2-NEXT: psllw $8, %xmm4 2212; SSE2-NEXT: por %xmm5, %xmm4 2213; SSE2-NEXT: movdqa %xmm4, %xmm5 2214; SSE2-NEXT: psllw $4, %xmm5 2215; SSE2-NEXT: psrlw $4, %xmm4 2216; SSE2-NEXT: pand %xmm3, %xmm4 2217; SSE2-NEXT: pandn %xmm5, %xmm3 2218; SSE2-NEXT: por %xmm4, %xmm3 2219; SSE2-NEXT: movdqa %xmm3, %xmm4 2220; SSE2-NEXT: psrlw $2, %xmm4 2221; SSE2-NEXT: pand %xmm8, %xmm4 2222; SSE2-NEXT: pand %xmm8, %xmm3 2223; SSE2-NEXT: psllw $2, %xmm3 2224; SSE2-NEXT: por %xmm4, %xmm3 2225; SSE2-NEXT: movdqa %xmm3, %xmm4 2226; SSE2-NEXT: psrlw $1, %xmm4 2227; SSE2-NEXT: pand %xmm6, %xmm4 2228; SSE2-NEXT: pand %xmm6, %xmm3 2229; SSE2-NEXT: paddb %xmm3, %xmm3 2230; SSE2-NEXT: por %xmm4, %xmm3 2231; SSE2-NEXT: retq 2232; 2233; SSSE3-LABEL: test_bitreverse_v32i16: 2234; SSSE3: # %bb.0: 2235; SSSE3-NEXT: movdqa %xmm1, %xmm5 2236; SSSE3-NEXT: movdqa %xmm0, %xmm1 2237; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 2238; SSSE3-NEXT: pshufb %xmm8, %xmm1 2239; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 2240; SSSE3-NEXT: movdqa %xmm1, %xmm0 2241; SSSE3-NEXT: pand %xmm9, %xmm0 2242; SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 2243; SSSE3-NEXT: movdqa %xmm7, %xmm6 2244; SSSE3-NEXT: pshufb %xmm0, %xmm6 2245; SSSE3-NEXT: psrlw $4, %xmm1 2246; SSSE3-NEXT: pand %xmm9, %xmm1 2247; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 2248; SSSE3-NEXT: movdqa %xmm4, %xmm0 2249; SSSE3-NEXT: pshufb %xmm1, %xmm0 2250; SSSE3-NEXT: por %xmm6, %xmm0 2251; SSSE3-NEXT: pshufb %xmm8, %xmm5 2252; SSSE3-NEXT: movdqa %xmm5, %xmm1 2253; SSSE3-NEXT: pand %xmm9, %xmm1 2254; SSSE3-NEXT: movdqa %xmm7, %xmm6 2255; SSSE3-NEXT: pshufb %xmm1, %xmm6 2256; SSSE3-NEXT: psrlw $4, %xmm5 2257; SSSE3-NEXT: pand %xmm9, %xmm5 2258; SSSE3-NEXT: movdqa %xmm4, %xmm1 2259; SSSE3-NEXT: pshufb %xmm5, %xmm1 2260; SSSE3-NEXT: por %xmm6, %xmm1 2261; SSSE3-NEXT: pshufb %xmm8, %xmm2 2262; SSSE3-NEXT: movdqa %xmm2, %xmm5 2263; SSSE3-NEXT: pand %xmm9, %xmm5 2264; SSSE3-NEXT: movdqa %xmm7, %xmm6 2265; SSSE3-NEXT: pshufb %xmm5, %xmm6 2266; SSSE3-NEXT: psrlw $4, %xmm2 2267; SSSE3-NEXT: pand %xmm9, %xmm2 2268; SSSE3-NEXT: movdqa %xmm4, %xmm5 2269; SSSE3-NEXT: pshufb %xmm2, %xmm5 2270; SSSE3-NEXT: por %xmm6, %xmm5 2271; SSSE3-NEXT: pshufb %xmm8, %xmm3 2272; SSSE3-NEXT: movdqa %xmm3, %xmm2 2273; SSSE3-NEXT: pand %xmm9, %xmm2 2274; SSSE3-NEXT: pshufb %xmm2, %xmm7 2275; SSSE3-NEXT: psrlw $4, %xmm3 2276; SSSE3-NEXT: pand %xmm9, %xmm3 2277; SSSE3-NEXT: pshufb %xmm3, %xmm4 2278; SSSE3-NEXT: por %xmm7, %xmm4 2279; SSSE3-NEXT: movdqa %xmm5, %xmm2 2280; SSSE3-NEXT: movdqa %xmm4, %xmm3 2281; SSSE3-NEXT: retq 2282; 2283; AVX1-LABEL: test_bitreverse_v32i16: 2284; AVX1: # %bb.0: 2285; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 2286; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 2287; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2 2288; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 2289; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm5 2290; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 2291; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 2292; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2 2293; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 2294; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 2295; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm2 2296; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm2 2297; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm0 2298; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm5 2299; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 2300; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 2301; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 2302; AVX1-NEXT: vpshufb %xmm0, %xmm7, %xmm0 2303; AVX1-NEXT: vpor %xmm0, %xmm5, %xmm0 2304; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 2305; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2306; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2 2307; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm5 2308; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 2309; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2 2310; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 2311; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm2 2312; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm2 2313; AVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm1 2314; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm3 2315; AVX1-NEXT: vpshufb %xmm3, %xmm6, %xmm3 2316; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 2317; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1 2318; AVX1-NEXT: vpshufb %xmm1, %xmm7, %xmm1 2319; AVX1-NEXT: vpor %xmm1, %xmm3, %xmm1 2320; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 2321; AVX1-NEXT: retq 2322; 2323; AVX2-LABEL: test_bitreverse_v32i16: 2324; AVX2: # %bb.0: 2325; 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] 2326; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 2327; 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] 2328; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm4 2329; 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] 2330; AVX2-NEXT: vpshufb %ymm4, %ymm5, %ymm4 2331; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 2332; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0 2333; 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] 2334; AVX2-NEXT: vpshufb %ymm0, %ymm6, %ymm0 2335; AVX2-NEXT: vpor %ymm0, %ymm4, %ymm0 2336; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 2337; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm2 2338; AVX2-NEXT: vpshufb %ymm2, %ymm5, %ymm2 2339; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm1 2340; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1 2341; AVX2-NEXT: vpshufb %ymm1, %ymm6, %ymm1 2342; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1 2343; AVX2-NEXT: retq 2344; 2345; AVX512F-LABEL: test_bitreverse_v32i16: 2346; AVX512F: # %bb.0: 2347; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm1 2348; 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] 2349; AVX512F-NEXT: vpshufb %ymm2, %ymm1, %ymm1 2350; 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] 2351; AVX512F-NEXT: vpand %ymm3, %ymm1, %ymm4 2352; 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] 2353; AVX512F-NEXT: vpshufb %ymm4, %ymm5, %ymm4 2354; AVX512F-NEXT: vpshufb %ymm2, %ymm0, %ymm0 2355; AVX512F-NEXT: vpand %ymm3, %ymm0, %ymm2 2356; AVX512F-NEXT: vpshufb %ymm2, %ymm5, %ymm2 2357; AVX512F-NEXT: vinserti64x4 $1, %ymm4, %zmm2, %zmm2 2358; AVX512F-NEXT: vpsrlw $4, %ymm1, %ymm1 2359; AVX512F-NEXT: vpand %ymm3, %ymm1, %ymm1 2360; AVX512F-NEXT: vmovdqa {{.*#+}} ymm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 2361; AVX512F-NEXT: vpshufb %ymm1, %ymm4, %ymm1 2362; AVX512F-NEXT: vpsrlw $4, %ymm0, %ymm0 2363; AVX512F-NEXT: vpand %ymm3, %ymm0, %ymm0 2364; AVX512F-NEXT: vpshufb %ymm0, %ymm4, %ymm0 2365; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 2366; AVX512F-NEXT: vporq %zmm0, %zmm2, %zmm0 2367; AVX512F-NEXT: retq 2368; 2369; AVX512BW-LABEL: test_bitreverse_v32i16: 2370; AVX512BW: # %bb.0: 2371; 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] 2372; 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] 2373; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm2 2374; 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] 2375; AVX512BW-NEXT: vpshufb %zmm2, %zmm3, %zmm2 2376; AVX512BW-NEXT: vpsrlw $4, %zmm0, %zmm0 2377; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm0 2378; 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] 2379; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0 2380; AVX512BW-NEXT: vporq %zmm0, %zmm2, %zmm0 2381; AVX512BW-NEXT: retq 2382; 2383; XOPAVX1-LABEL: test_bitreverse_v32i16: 2384; XOPAVX1: # %bb.0: 2385; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 2386; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94] 2387; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2388; XOPAVX1-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm0 2389; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 2390; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2391; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2392; XOPAVX1-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm1 2393; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 2394; XOPAVX1-NEXT: retq 2395; 2396; XOPAVX2-LABEL: test_bitreverse_v32i16: 2397; XOPAVX2: # %bb.0: 2398; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 2399; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94] 2400; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2401; XOPAVX2-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm0 2402; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 2403; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 2404; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2405; XOPAVX2-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm1 2406; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 2407; XOPAVX2-NEXT: retq 2408; 2409; GFNISSE-LABEL: test_bitreverse_v32i16: 2410; GFNISSE: # %bb.0: 2411; GFNISSE-NEXT: movdqa {{.*#+}} xmm4 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 2412; GFNISSE-NEXT: pshufb %xmm4, %xmm0 2413; GFNISSE-NEXT: movdqa {{.*#+}} xmm5 = [9241421688590303745,9241421688590303745] 2414; GFNISSE-NEXT: gf2p8affineqb $0, %xmm5, %xmm0 2415; GFNISSE-NEXT: pshufb %xmm4, %xmm1 2416; GFNISSE-NEXT: gf2p8affineqb $0, %xmm5, %xmm1 2417; GFNISSE-NEXT: pshufb %xmm4, %xmm2 2418; GFNISSE-NEXT: gf2p8affineqb $0, %xmm5, %xmm2 2419; GFNISSE-NEXT: pshufb %xmm4, %xmm3 2420; GFNISSE-NEXT: gf2p8affineqb $0, %xmm5, %xmm3 2421; GFNISSE-NEXT: retq 2422; 2423; GFNIAVX-LABEL: test_bitreverse_v32i16: 2424; GFNIAVX: # %bb.0: 2425; GFNIAVX-NEXT: vextractf128 $1, %ymm0, %xmm2 2426; GFNIAVX-NEXT: vmovdqa {{.*#+}} xmm3 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 2427; GFNIAVX-NEXT: vpshufb %xmm3, %xmm2, %xmm2 2428; GFNIAVX-NEXT: vmovdqa {{.*#+}} xmm4 = [9241421688590303745,9241421688590303745] 2429; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm4, %xmm2, %xmm2 2430; GFNIAVX-NEXT: vpshufb %xmm3, %xmm0, %xmm0 2431; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm4, %xmm0, %xmm0 2432; GFNIAVX-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 2433; GFNIAVX-NEXT: vextractf128 $1, %ymm1, %xmm2 2434; GFNIAVX-NEXT: vpshufb %xmm3, %xmm2, %xmm2 2435; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm4, %xmm2, %xmm2 2436; GFNIAVX-NEXT: vpshufb %xmm3, %xmm1, %xmm1 2437; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm4, %xmm1, %xmm1 2438; GFNIAVX-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 2439; GFNIAVX-NEXT: retq 2440; 2441; GFNIAVX2-LABEL: test_bitreverse_v32i16: 2442; GFNIAVX2: # %bb.0: 2443; GFNIAVX2-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] 2444; GFNIAVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 2445; GFNIAVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 2446; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm3, %ymm0, %ymm0 2447; GFNIAVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 2448; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm3, %ymm1, %ymm1 2449; GFNIAVX2-NEXT: retq 2450; 2451; GFNIAVX512F-LABEL: test_bitreverse_v32i16: 2452; GFNIAVX512F: # %bb.0: 2453; GFNIAVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm1 2454; GFNIAVX512F-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] 2455; GFNIAVX512F-NEXT: vpshufb %ymm2, %ymm1, %ymm1 2456; GFNIAVX512F-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 2457; GFNIAVX512F-NEXT: vgf2p8affineqb $0, %ymm3, %ymm1, %ymm1 2458; GFNIAVX512F-NEXT: vpshufb %ymm2, %ymm0, %ymm0 2459; GFNIAVX512F-NEXT: vgf2p8affineqb $0, %ymm3, %ymm0, %ymm0 2460; GFNIAVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 2461; GFNIAVX512F-NEXT: retq 2462; 2463; GFNIAVX512BW-LABEL: test_bitreverse_v32i16: 2464; GFNIAVX512BW: # %bb.0: 2465; GFNIAVX512BW-NEXT: vpshufb {{.*#+}} zmm0 = zmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30,33,32,35,34,37,36,39,38,41,40,43,42,45,44,47,46,49,48,51,50,53,52,55,54,57,56,59,58,61,60,63,62] 2466; GFNIAVX512BW-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 2467; GFNIAVX512BW-NEXT: retq 2468 %b = call <32 x i16> @llvm.bitreverse.v32i16(<32 x i16> %a) 2469 ret <32 x i16> %b 2470} 2471 2472define <16 x i32> @test_bitreverse_v16i32(<16 x i32> %a) nounwind { 2473; SSE2-LABEL: test_bitreverse_v16i32: 2474; SSE2: # %bb.0: 2475; SSE2-NEXT: movdqa %xmm3, %xmm4 2476; SSE2-NEXT: pxor %xmm8, %xmm8 2477; SSE2-NEXT: movdqa %xmm0, %xmm3 2478; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm8[8],xmm3[9],xmm8[9],xmm3[10],xmm8[10],xmm3[11],xmm8[11],xmm3[12],xmm8[12],xmm3[13],xmm8[13],xmm3[14],xmm8[14],xmm3[15],xmm8[15] 2479; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7] 2480; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4] 2481; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm8[0],xmm0[1],xmm8[1],xmm0[2],xmm8[2],xmm0[3],xmm8[3],xmm0[4],xmm8[4],xmm0[5],xmm8[5],xmm0[6],xmm8[6],xmm0[7],xmm8[7] 2482; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 2483; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4] 2484; SSE2-NEXT: packuswb %xmm3, %xmm0 2485; SSE2-NEXT: movdqa %xmm0, %xmm6 2486; SSE2-NEXT: psllw $4, %xmm6 2487; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 2488; SSE2-NEXT: movdqa %xmm3, %xmm7 2489; SSE2-NEXT: pandn %xmm6, %xmm7 2490; SSE2-NEXT: psrlw $4, %xmm0 2491; SSE2-NEXT: pand %xmm3, %xmm0 2492; SSE2-NEXT: por %xmm7, %xmm0 2493; SSE2-NEXT: movdqa %xmm0, %xmm7 2494; SSE2-NEXT: psrlw $2, %xmm7 2495; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 2496; SSE2-NEXT: pand %xmm9, %xmm7 2497; SSE2-NEXT: pand %xmm9, %xmm0 2498; SSE2-NEXT: psllw $2, %xmm0 2499; SSE2-NEXT: por %xmm7, %xmm0 2500; SSE2-NEXT: movdqa %xmm0, %xmm5 2501; SSE2-NEXT: psrlw $1, %xmm5 2502; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 2503; SSE2-NEXT: pand %xmm7, %xmm5 2504; SSE2-NEXT: pand %xmm7, %xmm0 2505; SSE2-NEXT: paddb %xmm0, %xmm0 2506; SSE2-NEXT: por %xmm5, %xmm0 2507; SSE2-NEXT: movdqa %xmm1, %xmm5 2508; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm8[8],xmm5[9],xmm8[9],xmm5[10],xmm8[10],xmm5[11],xmm8[11],xmm5[12],xmm8[12],xmm5[13],xmm8[13],xmm5[14],xmm8[14],xmm5[15],xmm8[15] 2509; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[3,2,1,0,4,5,6,7] 2510; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,7,6,5,4] 2511; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm8[0],xmm1[1],xmm8[1],xmm1[2],xmm8[2],xmm1[3],xmm8[3],xmm1[4],xmm8[4],xmm1[5],xmm8[5],xmm1[6],xmm8[6],xmm1[7],xmm8[7] 2512; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7] 2513; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4] 2514; SSE2-NEXT: packuswb %xmm5, %xmm1 2515; SSE2-NEXT: movdqa %xmm1, %xmm5 2516; SSE2-NEXT: psllw $4, %xmm5 2517; SSE2-NEXT: movdqa %xmm3, %xmm6 2518; SSE2-NEXT: pandn %xmm5, %xmm6 2519; SSE2-NEXT: psrlw $4, %xmm1 2520; SSE2-NEXT: pand %xmm3, %xmm1 2521; SSE2-NEXT: por %xmm6, %xmm1 2522; SSE2-NEXT: movdqa %xmm1, %xmm5 2523; SSE2-NEXT: psrlw $2, %xmm5 2524; SSE2-NEXT: pand %xmm9, %xmm5 2525; SSE2-NEXT: pand %xmm9, %xmm1 2526; SSE2-NEXT: psllw $2, %xmm1 2527; SSE2-NEXT: por %xmm5, %xmm1 2528; SSE2-NEXT: movdqa %xmm1, %xmm5 2529; SSE2-NEXT: psrlw $1, %xmm5 2530; SSE2-NEXT: pand %xmm7, %xmm5 2531; SSE2-NEXT: pand %xmm7, %xmm1 2532; SSE2-NEXT: paddb %xmm1, %xmm1 2533; SSE2-NEXT: por %xmm5, %xmm1 2534; SSE2-NEXT: movdqa %xmm2, %xmm5 2535; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm8[8],xmm5[9],xmm8[9],xmm5[10],xmm8[10],xmm5[11],xmm8[11],xmm5[12],xmm8[12],xmm5[13],xmm8[13],xmm5[14],xmm8[14],xmm5[15],xmm8[15] 2536; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[3,2,1,0,4,5,6,7] 2537; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,7,6,5,4] 2538; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm8[0],xmm2[1],xmm8[1],xmm2[2],xmm8[2],xmm2[3],xmm8[3],xmm2[4],xmm8[4],xmm2[5],xmm8[5],xmm2[6],xmm8[6],xmm2[7],xmm8[7] 2539; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7] 2540; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4] 2541; SSE2-NEXT: packuswb %xmm5, %xmm2 2542; SSE2-NEXT: movdqa %xmm2, %xmm5 2543; SSE2-NEXT: psllw $4, %xmm5 2544; SSE2-NEXT: movdqa %xmm3, %xmm6 2545; SSE2-NEXT: pandn %xmm5, %xmm6 2546; SSE2-NEXT: psrlw $4, %xmm2 2547; SSE2-NEXT: pand %xmm3, %xmm2 2548; SSE2-NEXT: por %xmm6, %xmm2 2549; SSE2-NEXT: movdqa %xmm2, %xmm5 2550; SSE2-NEXT: psrlw $2, %xmm5 2551; SSE2-NEXT: pand %xmm9, %xmm5 2552; SSE2-NEXT: pand %xmm9, %xmm2 2553; SSE2-NEXT: psllw $2, %xmm2 2554; SSE2-NEXT: por %xmm5, %xmm2 2555; SSE2-NEXT: movdqa %xmm2, %xmm5 2556; SSE2-NEXT: psrlw $1, %xmm5 2557; SSE2-NEXT: pand %xmm7, %xmm5 2558; SSE2-NEXT: pand %xmm7, %xmm2 2559; SSE2-NEXT: paddb %xmm2, %xmm2 2560; SSE2-NEXT: por %xmm5, %xmm2 2561; SSE2-NEXT: movdqa %xmm4, %xmm5 2562; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm8[8],xmm5[9],xmm8[9],xmm5[10],xmm8[10],xmm5[11],xmm8[11],xmm5[12],xmm8[12],xmm5[13],xmm8[13],xmm5[14],xmm8[14],xmm5[15],xmm8[15] 2563; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[3,2,1,0,4,5,6,7] 2564; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,7,6,5,4] 2565; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm8[0],xmm4[1],xmm8[1],xmm4[2],xmm8[2],xmm4[3],xmm8[3],xmm4[4],xmm8[4],xmm4[5],xmm8[5],xmm4[6],xmm8[6],xmm4[7],xmm8[7] 2566; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[3,2,1,0,4,5,6,7] 2567; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,7,6,5,4] 2568; SSE2-NEXT: packuswb %xmm5, %xmm4 2569; SSE2-NEXT: movdqa %xmm4, %xmm5 2570; SSE2-NEXT: psllw $4, %xmm5 2571; SSE2-NEXT: psrlw $4, %xmm4 2572; SSE2-NEXT: pand %xmm3, %xmm4 2573; SSE2-NEXT: pandn %xmm5, %xmm3 2574; SSE2-NEXT: por %xmm4, %xmm3 2575; SSE2-NEXT: movdqa %xmm3, %xmm4 2576; SSE2-NEXT: psrlw $2, %xmm4 2577; SSE2-NEXT: pand %xmm9, %xmm4 2578; SSE2-NEXT: pand %xmm9, %xmm3 2579; SSE2-NEXT: psllw $2, %xmm3 2580; SSE2-NEXT: por %xmm4, %xmm3 2581; SSE2-NEXT: movdqa %xmm3, %xmm4 2582; SSE2-NEXT: psrlw $1, %xmm4 2583; SSE2-NEXT: pand %xmm7, %xmm4 2584; SSE2-NEXT: pand %xmm7, %xmm3 2585; SSE2-NEXT: paddb %xmm3, %xmm3 2586; SSE2-NEXT: por %xmm4, %xmm3 2587; SSE2-NEXT: retq 2588; 2589; SSSE3-LABEL: test_bitreverse_v16i32: 2590; SSSE3: # %bb.0: 2591; SSSE3-NEXT: movdqa %xmm1, %xmm5 2592; SSSE3-NEXT: movdqa %xmm0, %xmm1 2593; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 2594; SSSE3-NEXT: pshufb %xmm8, %xmm1 2595; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 2596; SSSE3-NEXT: movdqa %xmm1, %xmm0 2597; SSSE3-NEXT: pand %xmm9, %xmm0 2598; SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 2599; SSSE3-NEXT: movdqa %xmm7, %xmm6 2600; SSSE3-NEXT: pshufb %xmm0, %xmm6 2601; SSSE3-NEXT: psrlw $4, %xmm1 2602; SSSE3-NEXT: pand %xmm9, %xmm1 2603; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 2604; SSSE3-NEXT: movdqa %xmm4, %xmm0 2605; SSSE3-NEXT: pshufb %xmm1, %xmm0 2606; SSSE3-NEXT: por %xmm6, %xmm0 2607; SSSE3-NEXT: pshufb %xmm8, %xmm5 2608; SSSE3-NEXT: movdqa %xmm5, %xmm1 2609; SSSE3-NEXT: pand %xmm9, %xmm1 2610; SSSE3-NEXT: movdqa %xmm7, %xmm6 2611; SSSE3-NEXT: pshufb %xmm1, %xmm6 2612; SSSE3-NEXT: psrlw $4, %xmm5 2613; SSSE3-NEXT: pand %xmm9, %xmm5 2614; SSSE3-NEXT: movdqa %xmm4, %xmm1 2615; SSSE3-NEXT: pshufb %xmm5, %xmm1 2616; SSSE3-NEXT: por %xmm6, %xmm1 2617; SSSE3-NEXT: pshufb %xmm8, %xmm2 2618; SSSE3-NEXT: movdqa %xmm2, %xmm5 2619; SSSE3-NEXT: pand %xmm9, %xmm5 2620; SSSE3-NEXT: movdqa %xmm7, %xmm6 2621; SSSE3-NEXT: pshufb %xmm5, %xmm6 2622; SSSE3-NEXT: psrlw $4, %xmm2 2623; SSSE3-NEXT: pand %xmm9, %xmm2 2624; SSSE3-NEXT: movdqa %xmm4, %xmm5 2625; SSSE3-NEXT: pshufb %xmm2, %xmm5 2626; SSSE3-NEXT: por %xmm6, %xmm5 2627; SSSE3-NEXT: pshufb %xmm8, %xmm3 2628; SSSE3-NEXT: movdqa %xmm3, %xmm2 2629; SSSE3-NEXT: pand %xmm9, %xmm2 2630; SSSE3-NEXT: pshufb %xmm2, %xmm7 2631; SSSE3-NEXT: psrlw $4, %xmm3 2632; SSSE3-NEXT: pand %xmm9, %xmm3 2633; SSSE3-NEXT: pshufb %xmm3, %xmm4 2634; SSSE3-NEXT: por %xmm7, %xmm4 2635; SSSE3-NEXT: movdqa %xmm5, %xmm2 2636; SSSE3-NEXT: movdqa %xmm4, %xmm3 2637; SSSE3-NEXT: retq 2638; 2639; AVX1-LABEL: test_bitreverse_v16i32: 2640; AVX1: # %bb.0: 2641; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 2642; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 2643; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2 2644; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 2645; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm5 2646; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 2647; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 2648; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2 2649; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 2650; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 2651; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm2 2652; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm2 2653; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm0 2654; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm5 2655; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 2656; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 2657; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 2658; AVX1-NEXT: vpshufb %xmm0, %xmm7, %xmm0 2659; AVX1-NEXT: vpor %xmm0, %xmm5, %xmm0 2660; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 2661; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2662; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2 2663; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm5 2664; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 2665; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2 2666; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 2667; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm2 2668; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm2 2669; AVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm1 2670; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm3 2671; AVX1-NEXT: vpshufb %xmm3, %xmm6, %xmm3 2672; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 2673; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1 2674; AVX1-NEXT: vpshufb %xmm1, %xmm7, %xmm1 2675; AVX1-NEXT: vpor %xmm1, %xmm3, %xmm1 2676; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 2677; AVX1-NEXT: retq 2678; 2679; AVX2-LABEL: test_bitreverse_v16i32: 2680; AVX2: # %bb.0: 2681; 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] 2682; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 2683; 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] 2684; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm4 2685; 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] 2686; AVX2-NEXT: vpshufb %ymm4, %ymm5, %ymm4 2687; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 2688; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0 2689; 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] 2690; AVX2-NEXT: vpshufb %ymm0, %ymm6, %ymm0 2691; AVX2-NEXT: vpor %ymm0, %ymm4, %ymm0 2692; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 2693; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm2 2694; AVX2-NEXT: vpshufb %ymm2, %ymm5, %ymm2 2695; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm1 2696; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1 2697; AVX2-NEXT: vpshufb %ymm1, %ymm6, %ymm1 2698; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1 2699; AVX2-NEXT: retq 2700; 2701; AVX512F-LABEL: test_bitreverse_v16i32: 2702; AVX512F: # %bb.0: 2703; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm1 2704; 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] 2705; AVX512F-NEXT: vpshufb %ymm2, %ymm1, %ymm1 2706; 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] 2707; AVX512F-NEXT: vpand %ymm3, %ymm1, %ymm4 2708; 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] 2709; AVX512F-NEXT: vpshufb %ymm4, %ymm5, %ymm4 2710; AVX512F-NEXT: vpshufb %ymm2, %ymm0, %ymm0 2711; AVX512F-NEXT: vpand %ymm3, %ymm0, %ymm2 2712; AVX512F-NEXT: vpshufb %ymm2, %ymm5, %ymm2 2713; AVX512F-NEXT: vinserti64x4 $1, %ymm4, %zmm2, %zmm2 2714; AVX512F-NEXT: vpsrlw $4, %ymm1, %ymm1 2715; AVX512F-NEXT: vpand %ymm3, %ymm1, %ymm1 2716; AVX512F-NEXT: vmovdqa {{.*#+}} ymm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 2717; AVX512F-NEXT: vpshufb %ymm1, %ymm4, %ymm1 2718; AVX512F-NEXT: vpsrlw $4, %ymm0, %ymm0 2719; AVX512F-NEXT: vpand %ymm3, %ymm0, %ymm0 2720; AVX512F-NEXT: vpshufb %ymm0, %ymm4, %ymm0 2721; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 2722; AVX512F-NEXT: vporq %zmm0, %zmm2, %zmm0 2723; AVX512F-NEXT: retq 2724; 2725; AVX512BW-LABEL: test_bitreverse_v16i32: 2726; AVX512BW: # %bb.0: 2727; 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] 2728; 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] 2729; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm2 2730; 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] 2731; AVX512BW-NEXT: vpshufb %zmm2, %zmm3, %zmm2 2732; AVX512BW-NEXT: vpsrlw $4, %zmm0, %zmm0 2733; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm0 2734; 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] 2735; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0 2736; AVX512BW-NEXT: vporq %zmm0, %zmm2, %zmm0 2737; AVX512BW-NEXT: retq 2738; 2739; XOPAVX1-LABEL: test_bitreverse_v16i32: 2740; XOPAVX1: # %bb.0: 2741; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 2742; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92] 2743; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2744; XOPAVX1-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm0 2745; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 2746; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2747; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2748; XOPAVX1-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm1 2749; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 2750; XOPAVX1-NEXT: retq 2751; 2752; XOPAVX2-LABEL: test_bitreverse_v16i32: 2753; XOPAVX2: # %bb.0: 2754; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 2755; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92] 2756; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2757; XOPAVX2-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm0 2758; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 2759; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 2760; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 2761; XOPAVX2-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm1 2762; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 2763; XOPAVX2-NEXT: retq 2764; 2765; GFNISSE-LABEL: test_bitreverse_v16i32: 2766; GFNISSE: # %bb.0: 2767; GFNISSE-NEXT: movdqa {{.*#+}} xmm4 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 2768; GFNISSE-NEXT: pshufb %xmm4, %xmm0 2769; GFNISSE-NEXT: movdqa {{.*#+}} xmm5 = [9241421688590303745,9241421688590303745] 2770; GFNISSE-NEXT: gf2p8affineqb $0, %xmm5, %xmm0 2771; GFNISSE-NEXT: pshufb %xmm4, %xmm1 2772; GFNISSE-NEXT: gf2p8affineqb $0, %xmm5, %xmm1 2773; GFNISSE-NEXT: pshufb %xmm4, %xmm2 2774; GFNISSE-NEXT: gf2p8affineqb $0, %xmm5, %xmm2 2775; GFNISSE-NEXT: pshufb %xmm4, %xmm3 2776; GFNISSE-NEXT: gf2p8affineqb $0, %xmm5, %xmm3 2777; GFNISSE-NEXT: retq 2778; 2779; GFNIAVX-LABEL: test_bitreverse_v16i32: 2780; GFNIAVX: # %bb.0: 2781; GFNIAVX-NEXT: vextractf128 $1, %ymm0, %xmm2 2782; GFNIAVX-NEXT: vmovdqa {{.*#+}} xmm3 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 2783; GFNIAVX-NEXT: vpshufb %xmm3, %xmm2, %xmm2 2784; GFNIAVX-NEXT: vmovdqa {{.*#+}} xmm4 = [9241421688590303745,9241421688590303745] 2785; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm4, %xmm2, %xmm2 2786; GFNIAVX-NEXT: vpshufb %xmm3, %xmm0, %xmm0 2787; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm4, %xmm0, %xmm0 2788; GFNIAVX-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 2789; GFNIAVX-NEXT: vextractf128 $1, %ymm1, %xmm2 2790; GFNIAVX-NEXT: vpshufb %xmm3, %xmm2, %xmm2 2791; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm4, %xmm2, %xmm2 2792; GFNIAVX-NEXT: vpshufb %xmm3, %xmm1, %xmm1 2793; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm4, %xmm1, %xmm1 2794; GFNIAVX-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 2795; GFNIAVX-NEXT: retq 2796; 2797; GFNIAVX2-LABEL: test_bitreverse_v16i32: 2798; GFNIAVX2: # %bb.0: 2799; GFNIAVX2-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] 2800; GFNIAVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 2801; GFNIAVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 2802; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm3, %ymm0, %ymm0 2803; GFNIAVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 2804; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm3, %ymm1, %ymm1 2805; GFNIAVX2-NEXT: retq 2806; 2807; GFNIAVX512F-LABEL: test_bitreverse_v16i32: 2808; GFNIAVX512F: # %bb.0: 2809; GFNIAVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm1 2810; GFNIAVX512F-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] 2811; GFNIAVX512F-NEXT: vpshufb %ymm2, %ymm1, %ymm1 2812; GFNIAVX512F-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 2813; GFNIAVX512F-NEXT: vgf2p8affineqb $0, %ymm3, %ymm1, %ymm1 2814; GFNIAVX512F-NEXT: vpshufb %ymm2, %ymm0, %ymm0 2815; GFNIAVX512F-NEXT: vgf2p8affineqb $0, %ymm3, %ymm0, %ymm0 2816; GFNIAVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 2817; GFNIAVX512F-NEXT: retq 2818; 2819; GFNIAVX512BW-LABEL: test_bitreverse_v16i32: 2820; GFNIAVX512BW: # %bb.0: 2821; GFNIAVX512BW-NEXT: vpshufb {{.*#+}} zmm0 = zmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,19,18,17,16,23,22,21,20,27,26,25,24,31,30,29,28,35,34,33,32,39,38,37,36,43,42,41,40,47,46,45,44,51,50,49,48,55,54,53,52,59,58,57,56,63,62,61,60] 2822; GFNIAVX512BW-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 2823; GFNIAVX512BW-NEXT: retq 2824 %b = call <16 x i32> @llvm.bitreverse.v16i32(<16 x i32> %a) 2825 ret <16 x i32> %b 2826} 2827 2828define <8 x i64> @test_bitreverse_v8i64(<8 x i64> %a) nounwind { 2829; SSE2-LABEL: test_bitreverse_v8i64: 2830; SSE2: # %bb.0: 2831; SSE2-NEXT: movdqa %xmm3, %xmm4 2832; SSE2-NEXT: pxor %xmm8, %xmm8 2833; SSE2-NEXT: movdqa %xmm0, %xmm3 2834; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm8[8],xmm3[9],xmm8[9],xmm3[10],xmm8[10],xmm3[11],xmm8[11],xmm3[12],xmm8[12],xmm3[13],xmm8[13],xmm3[14],xmm8[14],xmm3[15],xmm8[15] 2835; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,3,0,1] 2836; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7] 2837; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4] 2838; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm8[0],xmm0[1],xmm8[1],xmm0[2],xmm8[2],xmm0[3],xmm8[3],xmm0[4],xmm8[4],xmm0[5],xmm8[5],xmm0[6],xmm8[6],xmm0[7],xmm8[7] 2839; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 2840; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 2841; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4] 2842; SSE2-NEXT: packuswb %xmm3, %xmm0 2843; SSE2-NEXT: movdqa %xmm0, %xmm6 2844; SSE2-NEXT: psllw $4, %xmm6 2845; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 2846; SSE2-NEXT: movdqa %xmm3, %xmm7 2847; SSE2-NEXT: pandn %xmm6, %xmm7 2848; SSE2-NEXT: psrlw $4, %xmm0 2849; SSE2-NEXT: pand %xmm3, %xmm0 2850; SSE2-NEXT: por %xmm7, %xmm0 2851; SSE2-NEXT: movdqa %xmm0, %xmm7 2852; SSE2-NEXT: psrlw $2, %xmm7 2853; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 2854; SSE2-NEXT: pand %xmm9, %xmm7 2855; SSE2-NEXT: pand %xmm9, %xmm0 2856; SSE2-NEXT: psllw $2, %xmm0 2857; SSE2-NEXT: por %xmm7, %xmm0 2858; SSE2-NEXT: movdqa %xmm0, %xmm5 2859; SSE2-NEXT: psrlw $1, %xmm5 2860; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85] 2861; SSE2-NEXT: pand %xmm7, %xmm5 2862; SSE2-NEXT: pand %xmm7, %xmm0 2863; SSE2-NEXT: paddb %xmm0, %xmm0 2864; SSE2-NEXT: por %xmm5, %xmm0 2865; SSE2-NEXT: movdqa %xmm1, %xmm5 2866; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm8[8],xmm5[9],xmm8[9],xmm5[10],xmm8[10],xmm5[11],xmm8[11],xmm5[12],xmm8[12],xmm5[13],xmm8[13],xmm5[14],xmm8[14],xmm5[15],xmm8[15] 2867; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,0,1] 2868; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[3,2,1,0,4,5,6,7] 2869; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,7,6,5,4] 2870; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm8[0],xmm1[1],xmm8[1],xmm1[2],xmm8[2],xmm1[3],xmm8[3],xmm1[4],xmm8[4],xmm1[5],xmm8[5],xmm1[6],xmm8[6],xmm1[7],xmm8[7] 2871; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] 2872; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7] 2873; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4] 2874; SSE2-NEXT: packuswb %xmm5, %xmm1 2875; SSE2-NEXT: movdqa %xmm1, %xmm5 2876; SSE2-NEXT: psllw $4, %xmm5 2877; SSE2-NEXT: movdqa %xmm3, %xmm6 2878; SSE2-NEXT: pandn %xmm5, %xmm6 2879; SSE2-NEXT: psrlw $4, %xmm1 2880; SSE2-NEXT: pand %xmm3, %xmm1 2881; SSE2-NEXT: por %xmm6, %xmm1 2882; SSE2-NEXT: movdqa %xmm1, %xmm5 2883; SSE2-NEXT: psrlw $2, %xmm5 2884; SSE2-NEXT: pand %xmm9, %xmm5 2885; SSE2-NEXT: pand %xmm9, %xmm1 2886; SSE2-NEXT: psllw $2, %xmm1 2887; SSE2-NEXT: por %xmm5, %xmm1 2888; SSE2-NEXT: movdqa %xmm1, %xmm5 2889; SSE2-NEXT: psrlw $1, %xmm5 2890; SSE2-NEXT: pand %xmm7, %xmm5 2891; SSE2-NEXT: pand %xmm7, %xmm1 2892; SSE2-NEXT: paddb %xmm1, %xmm1 2893; SSE2-NEXT: por %xmm5, %xmm1 2894; SSE2-NEXT: movdqa %xmm2, %xmm5 2895; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm8[8],xmm5[9],xmm8[9],xmm5[10],xmm8[10],xmm5[11],xmm8[11],xmm5[12],xmm8[12],xmm5[13],xmm8[13],xmm5[14],xmm8[14],xmm5[15],xmm8[15] 2896; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,0,1] 2897; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[3,2,1,0,4,5,6,7] 2898; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,7,6,5,4] 2899; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm8[0],xmm2[1],xmm8[1],xmm2[2],xmm8[2],xmm2[3],xmm8[3],xmm2[4],xmm8[4],xmm2[5],xmm8[5],xmm2[6],xmm8[6],xmm2[7],xmm8[7] 2900; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1] 2901; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7] 2902; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4] 2903; SSE2-NEXT: packuswb %xmm5, %xmm2 2904; SSE2-NEXT: movdqa %xmm2, %xmm5 2905; SSE2-NEXT: psllw $4, %xmm5 2906; SSE2-NEXT: movdqa %xmm3, %xmm6 2907; SSE2-NEXT: pandn %xmm5, %xmm6 2908; SSE2-NEXT: psrlw $4, %xmm2 2909; SSE2-NEXT: pand %xmm3, %xmm2 2910; SSE2-NEXT: por %xmm6, %xmm2 2911; SSE2-NEXT: movdqa %xmm2, %xmm5 2912; SSE2-NEXT: psrlw $2, %xmm5 2913; SSE2-NEXT: pand %xmm9, %xmm5 2914; SSE2-NEXT: pand %xmm9, %xmm2 2915; SSE2-NEXT: psllw $2, %xmm2 2916; SSE2-NEXT: por %xmm5, %xmm2 2917; SSE2-NEXT: movdqa %xmm2, %xmm5 2918; SSE2-NEXT: psrlw $1, %xmm5 2919; SSE2-NEXT: pand %xmm7, %xmm5 2920; SSE2-NEXT: pand %xmm7, %xmm2 2921; SSE2-NEXT: paddb %xmm2, %xmm2 2922; SSE2-NEXT: por %xmm5, %xmm2 2923; SSE2-NEXT: movdqa %xmm4, %xmm5 2924; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm8[8],xmm5[9],xmm8[9],xmm5[10],xmm8[10],xmm5[11],xmm8[11],xmm5[12],xmm8[12],xmm5[13],xmm8[13],xmm5[14],xmm8[14],xmm5[15],xmm8[15] 2925; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[2,3,0,1] 2926; SSE2-NEXT: pshuflw {{.*#+}} xmm5 = xmm5[3,2,1,0,4,5,6,7] 2927; SSE2-NEXT: pshufhw {{.*#+}} xmm5 = xmm5[0,1,2,3,7,6,5,4] 2928; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm8[0],xmm4[1],xmm8[1],xmm4[2],xmm8[2],xmm4[3],xmm8[3],xmm4[4],xmm8[4],xmm4[5],xmm8[5],xmm4[6],xmm8[6],xmm4[7],xmm8[7] 2929; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[2,3,0,1] 2930; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[3,2,1,0,4,5,6,7] 2931; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,7,6,5,4] 2932; SSE2-NEXT: packuswb %xmm5, %xmm4 2933; SSE2-NEXT: movdqa %xmm4, %xmm5 2934; SSE2-NEXT: psllw $4, %xmm5 2935; SSE2-NEXT: psrlw $4, %xmm4 2936; SSE2-NEXT: pand %xmm3, %xmm4 2937; SSE2-NEXT: pandn %xmm5, %xmm3 2938; SSE2-NEXT: por %xmm4, %xmm3 2939; SSE2-NEXT: movdqa %xmm3, %xmm4 2940; SSE2-NEXT: psrlw $2, %xmm4 2941; SSE2-NEXT: pand %xmm9, %xmm4 2942; SSE2-NEXT: pand %xmm9, %xmm3 2943; SSE2-NEXT: psllw $2, %xmm3 2944; SSE2-NEXT: por %xmm4, %xmm3 2945; SSE2-NEXT: movdqa %xmm3, %xmm4 2946; SSE2-NEXT: psrlw $1, %xmm4 2947; SSE2-NEXT: pand %xmm7, %xmm4 2948; SSE2-NEXT: pand %xmm7, %xmm3 2949; SSE2-NEXT: paddb %xmm3, %xmm3 2950; SSE2-NEXT: por %xmm4, %xmm3 2951; SSE2-NEXT: retq 2952; 2953; SSSE3-LABEL: test_bitreverse_v8i64: 2954; SSSE3: # %bb.0: 2955; SSSE3-NEXT: movdqa %xmm1, %xmm5 2956; SSSE3-NEXT: movdqa %xmm0, %xmm1 2957; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 2958; SSSE3-NEXT: pshufb %xmm8, %xmm1 2959; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 2960; SSSE3-NEXT: movdqa %xmm1, %xmm0 2961; SSSE3-NEXT: pand %xmm9, %xmm0 2962; SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 2963; SSSE3-NEXT: movdqa %xmm7, %xmm6 2964; SSSE3-NEXT: pshufb %xmm0, %xmm6 2965; SSSE3-NEXT: psrlw $4, %xmm1 2966; SSSE3-NEXT: pand %xmm9, %xmm1 2967; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 2968; SSSE3-NEXT: movdqa %xmm4, %xmm0 2969; SSSE3-NEXT: pshufb %xmm1, %xmm0 2970; SSSE3-NEXT: por %xmm6, %xmm0 2971; SSSE3-NEXT: pshufb %xmm8, %xmm5 2972; SSSE3-NEXT: movdqa %xmm5, %xmm1 2973; SSSE3-NEXT: pand %xmm9, %xmm1 2974; SSSE3-NEXT: movdqa %xmm7, %xmm6 2975; SSSE3-NEXT: pshufb %xmm1, %xmm6 2976; SSSE3-NEXT: psrlw $4, %xmm5 2977; SSSE3-NEXT: pand %xmm9, %xmm5 2978; SSSE3-NEXT: movdqa %xmm4, %xmm1 2979; SSSE3-NEXT: pshufb %xmm5, %xmm1 2980; SSSE3-NEXT: por %xmm6, %xmm1 2981; SSSE3-NEXT: pshufb %xmm8, %xmm2 2982; SSSE3-NEXT: movdqa %xmm2, %xmm5 2983; SSSE3-NEXT: pand %xmm9, %xmm5 2984; SSSE3-NEXT: movdqa %xmm7, %xmm6 2985; SSSE3-NEXT: pshufb %xmm5, %xmm6 2986; SSSE3-NEXT: psrlw $4, %xmm2 2987; SSSE3-NEXT: pand %xmm9, %xmm2 2988; SSSE3-NEXT: movdqa %xmm4, %xmm5 2989; SSSE3-NEXT: pshufb %xmm2, %xmm5 2990; SSSE3-NEXT: por %xmm6, %xmm5 2991; SSSE3-NEXT: pshufb %xmm8, %xmm3 2992; SSSE3-NEXT: movdqa %xmm3, %xmm2 2993; SSSE3-NEXT: pand %xmm9, %xmm2 2994; SSSE3-NEXT: pshufb %xmm2, %xmm7 2995; SSSE3-NEXT: psrlw $4, %xmm3 2996; SSSE3-NEXT: pand %xmm9, %xmm3 2997; SSSE3-NEXT: pshufb %xmm3, %xmm4 2998; SSSE3-NEXT: por %xmm7, %xmm4 2999; SSSE3-NEXT: movdqa %xmm5, %xmm2 3000; SSSE3-NEXT: movdqa %xmm4, %xmm3 3001; SSSE3-NEXT: retq 3002; 3003; AVX1-LABEL: test_bitreverse_v8i64: 3004; AVX1: # %bb.0: 3005; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 3006; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 3007; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2 3008; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 3009; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm5 3010; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 3011; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 3012; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2 3013; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 3014; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 3015; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm2 3016; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm2 3017; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm0 3018; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm5 3019; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 3020; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 3021; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 3022; AVX1-NEXT: vpshufb %xmm0, %xmm7, %xmm0 3023; AVX1-NEXT: vpor %xmm0, %xmm5, %xmm0 3024; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 3025; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 3026; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2 3027; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm5 3028; AVX1-NEXT: vpshufb %xmm5, %xmm6, %xmm5 3029; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2 3030; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 3031; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm2 3032; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm2 3033; AVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm1 3034; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm3 3035; AVX1-NEXT: vpshufb %xmm3, %xmm6, %xmm3 3036; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 3037; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1 3038; AVX1-NEXT: vpshufb %xmm1, %xmm7, %xmm1 3039; AVX1-NEXT: vpor %xmm1, %xmm3, %xmm1 3040; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 3041; AVX1-NEXT: retq 3042; 3043; AVX2-LABEL: test_bitreverse_v8i64: 3044; AVX2: # %bb.0: 3045; 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] 3046; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 3047; 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] 3048; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm4 3049; 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] 3050; AVX2-NEXT: vpshufb %ymm4, %ymm5, %ymm4 3051; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 3052; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0 3053; 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] 3054; AVX2-NEXT: vpshufb %ymm0, %ymm6, %ymm0 3055; AVX2-NEXT: vpor %ymm0, %ymm4, %ymm0 3056; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 3057; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm2 3058; AVX2-NEXT: vpshufb %ymm2, %ymm5, %ymm2 3059; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm1 3060; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1 3061; AVX2-NEXT: vpshufb %ymm1, %ymm6, %ymm1 3062; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1 3063; AVX2-NEXT: retq 3064; 3065; AVX512F-LABEL: test_bitreverse_v8i64: 3066; AVX512F: # %bb.0: 3067; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm1 3068; 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] 3069; AVX512F-NEXT: vpshufb %ymm2, %ymm1, %ymm1 3070; 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] 3071; AVX512F-NEXT: vpand %ymm3, %ymm1, %ymm4 3072; 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] 3073; AVX512F-NEXT: vpshufb %ymm4, %ymm5, %ymm4 3074; AVX512F-NEXT: vpshufb %ymm2, %ymm0, %ymm0 3075; AVX512F-NEXT: vpand %ymm3, %ymm0, %ymm2 3076; AVX512F-NEXT: vpshufb %ymm2, %ymm5, %ymm2 3077; AVX512F-NEXT: vinserti64x4 $1, %ymm4, %zmm2, %zmm2 3078; AVX512F-NEXT: vpsrlw $4, %ymm1, %ymm1 3079; AVX512F-NEXT: vpand %ymm3, %ymm1, %ymm1 3080; AVX512F-NEXT: vmovdqa {{.*#+}} ymm4 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 3081; AVX512F-NEXT: vpshufb %ymm1, %ymm4, %ymm1 3082; AVX512F-NEXT: vpsrlw $4, %ymm0, %ymm0 3083; AVX512F-NEXT: vpand %ymm3, %ymm0, %ymm0 3084; AVX512F-NEXT: vpshufb %ymm0, %ymm4, %ymm0 3085; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 3086; AVX512F-NEXT: vporq %zmm0, %zmm2, %zmm0 3087; AVX512F-NEXT: retq 3088; 3089; AVX512BW-LABEL: test_bitreverse_v8i64: 3090; AVX512BW: # %bb.0: 3091; 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] 3092; 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] 3093; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm2 3094; 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] 3095; AVX512BW-NEXT: vpshufb %zmm2, %zmm3, %zmm2 3096; AVX512BW-NEXT: vpsrlw $4, %zmm0, %zmm0 3097; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm0 3098; 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] 3099; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0 3100; AVX512BW-NEXT: vporq %zmm0, %zmm2, %zmm0 3101; AVX512BW-NEXT: retq 3102; 3103; XOPAVX1-LABEL: test_bitreverse_v8i64: 3104; XOPAVX1: # %bb.0: 3105; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 3106; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88] 3107; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 3108; XOPAVX1-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm0 3109; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 3110; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 3111; XOPAVX1-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 3112; XOPAVX1-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm1 3113; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 3114; XOPAVX1-NEXT: retq 3115; 3116; XOPAVX2-LABEL: test_bitreverse_v8i64: 3117; XOPAVX2: # %bb.0: 3118; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 3119; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88] 3120; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 3121; XOPAVX2-NEXT: vpperm %xmm3, %xmm0, %xmm0, %xmm0 3122; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 3123; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 3124; XOPAVX2-NEXT: vpperm %xmm3, %xmm2, %xmm0, %xmm2 3125; XOPAVX2-NEXT: vpperm %xmm3, %xmm1, %xmm0, %xmm1 3126; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 3127; XOPAVX2-NEXT: retq 3128; 3129; GFNISSE-LABEL: test_bitreverse_v8i64: 3130; GFNISSE: # %bb.0: 3131; GFNISSE-NEXT: movdqa {{.*#+}} xmm4 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 3132; GFNISSE-NEXT: pshufb %xmm4, %xmm0 3133; GFNISSE-NEXT: movdqa {{.*#+}} xmm5 = [9241421688590303745,9241421688590303745] 3134; GFNISSE-NEXT: gf2p8affineqb $0, %xmm5, %xmm0 3135; GFNISSE-NEXT: pshufb %xmm4, %xmm1 3136; GFNISSE-NEXT: gf2p8affineqb $0, %xmm5, %xmm1 3137; GFNISSE-NEXT: pshufb %xmm4, %xmm2 3138; GFNISSE-NEXT: gf2p8affineqb $0, %xmm5, %xmm2 3139; GFNISSE-NEXT: pshufb %xmm4, %xmm3 3140; GFNISSE-NEXT: gf2p8affineqb $0, %xmm5, %xmm3 3141; GFNISSE-NEXT: retq 3142; 3143; GFNIAVX-LABEL: test_bitreverse_v8i64: 3144; GFNIAVX: # %bb.0: 3145; GFNIAVX-NEXT: vextractf128 $1, %ymm0, %xmm2 3146; GFNIAVX-NEXT: vmovdqa {{.*#+}} xmm3 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 3147; GFNIAVX-NEXT: vpshufb %xmm3, %xmm2, %xmm2 3148; GFNIAVX-NEXT: vmovdqa {{.*#+}} xmm4 = [9241421688590303745,9241421688590303745] 3149; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm4, %xmm2, %xmm2 3150; GFNIAVX-NEXT: vpshufb %xmm3, %xmm0, %xmm0 3151; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm4, %xmm0, %xmm0 3152; GFNIAVX-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 3153; GFNIAVX-NEXT: vextractf128 $1, %ymm1, %xmm2 3154; GFNIAVX-NEXT: vpshufb %xmm3, %xmm2, %xmm2 3155; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm4, %xmm2, %xmm2 3156; GFNIAVX-NEXT: vpshufb %xmm3, %xmm1, %xmm1 3157; GFNIAVX-NEXT: vgf2p8affineqb $0, %xmm4, %xmm1, %xmm1 3158; GFNIAVX-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 3159; GFNIAVX-NEXT: retq 3160; 3161; GFNIAVX2-LABEL: test_bitreverse_v8i64: 3162; GFNIAVX2: # %bb.0: 3163; GFNIAVX2-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] 3164; GFNIAVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 3165; GFNIAVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 3166; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm3, %ymm0, %ymm0 3167; GFNIAVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 3168; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm3, %ymm1, %ymm1 3169; GFNIAVX2-NEXT: retq 3170; 3171; GFNIAVX512F-LABEL: test_bitreverse_v8i64: 3172; GFNIAVX512F: # %bb.0: 3173; GFNIAVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm1 3174; GFNIAVX512F-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] 3175; GFNIAVX512F-NEXT: vpshufb %ymm2, %ymm1, %ymm1 3176; GFNIAVX512F-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745] 3177; GFNIAVX512F-NEXT: vgf2p8affineqb $0, %ymm3, %ymm1, %ymm1 3178; GFNIAVX512F-NEXT: vpshufb %ymm2, %ymm0, %ymm0 3179; GFNIAVX512F-NEXT: vgf2p8affineqb $0, %ymm3, %ymm0, %ymm0 3180; GFNIAVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 3181; GFNIAVX512F-NEXT: retq 3182; 3183; GFNIAVX512BW-LABEL: test_bitreverse_v8i64: 3184; GFNIAVX512BW: # %bb.0: 3185; GFNIAVX512BW-NEXT: vpshufb {{.*#+}} zmm0 = zmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24,39,38,37,36,35,34,33,32,47,46,45,44,43,42,41,40,55,54,53,52,51,50,49,48,63,62,61,60,59,58,57,56] 3186; GFNIAVX512BW-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 3187; GFNIAVX512BW-NEXT: retq 3188 %b = call <8 x i64> @llvm.bitreverse.v8i64(<8 x i64> %a) 3189 ret <8 x i64> %b 3190} 3191 3192; 3193; Constant Folding 3194; 3195 3196define i32 @fold_bitreverse_i32() nounwind { 3197; ALL-LABEL: fold_bitreverse_i32: 3198; ALL: # %bb.0: 3199; ALL-NEXT: movl $16711935, %eax # imm = 0xFF00FF 3200; ALL-NEXT: retq 3201 %b = call i32 @llvm.bitreverse.i32(i32 4278255360) 3202 ret i32 %b 3203} 3204 3205define <16 x i8> @fold_bitreverse_v16i8() nounwind { 3206; SSE-LABEL: fold_bitreverse_v16i8: 3207; SSE: # %bb.0: 3208; SSE-NEXT: movaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143] 3209; SSE-NEXT: retq 3210; 3211; AVX-LABEL: fold_bitreverse_v16i8: 3212; AVX: # %bb.0: 3213; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143] 3214; AVX-NEXT: retq 3215; 3216; XOP-LABEL: fold_bitreverse_v16i8: 3217; XOP: # %bb.0: 3218; XOP-NEXT: vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143] 3219; XOP-NEXT: retq 3220; 3221; GFNISSE-LABEL: fold_bitreverse_v16i8: 3222; GFNISSE: # %bb.0: 3223; GFNISSE-NEXT: movaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143] 3224; GFNISSE-NEXT: retq 3225; 3226; GFNIAVX-LABEL: fold_bitreverse_v16i8: 3227; GFNIAVX: # %bb.0: 3228; GFNIAVX-NEXT: vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143] 3229; GFNIAVX-NEXT: retq 3230; 3231; GFNIAVX2-LABEL: fold_bitreverse_v16i8: 3232; GFNIAVX2: # %bb.0: 3233; GFNIAVX2-NEXT: vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143] 3234; GFNIAVX2-NEXT: retq 3235; 3236; GFNIAVX512F-LABEL: fold_bitreverse_v16i8: 3237; GFNIAVX512F: # %bb.0: 3238; GFNIAVX512F-NEXT: vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143] 3239; GFNIAVX512F-NEXT: retq 3240; 3241; GFNIAVX512BW-LABEL: fold_bitreverse_v16i8: 3242; GFNIAVX512BW: # %bb.0: 3243; GFNIAVX512BW-NEXT: vmovaps {{.*#+}} xmm0 = [0,255,64,191,32,223,96,159,16,239,80,175,48,207,112,143] 3244; GFNIAVX512BW-NEXT: retq 3245 %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>) 3246 ret <16 x i8> %b 3247} 3248 3249define <16 x i16> @fold_bitreverse_v16i16() nounwind { 3250; SSE-LABEL: fold_bitreverse_v16i16: 3251; SSE: # %bb.0: 3252; SSE-NEXT: movaps {{.*#+}} xmm0 = [0,65535,16384,49151,8192,57343,24576,40959] 3253; SSE-NEXT: movaps {{.*#+}} xmm1 = [4096,61439,20480,45055,12288,53247,28672,36863] 3254; SSE-NEXT: retq 3255; 3256; AVX-LABEL: fold_bitreverse_v16i16: 3257; AVX: # %bb.0: 3258; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863] 3259; AVX-NEXT: retq 3260; 3261; XOP-LABEL: fold_bitreverse_v16i16: 3262; XOP: # %bb.0: 3263; XOP-NEXT: vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863] 3264; XOP-NEXT: retq 3265; 3266; GFNISSE-LABEL: fold_bitreverse_v16i16: 3267; GFNISSE: # %bb.0: 3268; GFNISSE-NEXT: movaps {{.*#+}} xmm0 = [0,65535,16384,49151,8192,57343,24576,40959] 3269; GFNISSE-NEXT: movaps {{.*#+}} xmm1 = [4096,61439,20480,45055,12288,53247,28672,36863] 3270; GFNISSE-NEXT: retq 3271; 3272; GFNIAVX-LABEL: fold_bitreverse_v16i16: 3273; GFNIAVX: # %bb.0: 3274; GFNIAVX-NEXT: vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863] 3275; GFNIAVX-NEXT: retq 3276; 3277; GFNIAVX2-LABEL: fold_bitreverse_v16i16: 3278; GFNIAVX2: # %bb.0: 3279; GFNIAVX2-NEXT: vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863] 3280; GFNIAVX2-NEXT: retq 3281; 3282; GFNIAVX512F-LABEL: fold_bitreverse_v16i16: 3283; GFNIAVX512F: # %bb.0: 3284; GFNIAVX512F-NEXT: vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863] 3285; GFNIAVX512F-NEXT: retq 3286; 3287; GFNIAVX512BW-LABEL: fold_bitreverse_v16i16: 3288; GFNIAVX512BW: # %bb.0: 3289; GFNIAVX512BW-NEXT: vmovaps {{.*#+}} ymm0 = [0,65535,16384,49151,8192,57343,24576,40959,4096,61439,20480,45055,12288,53247,28672,36863] 3290; GFNIAVX512BW-NEXT: retq 3291 %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>) 3292 ret <16 x i16> %b 3293} 3294 3295define <16 x i32> @fold_bitreverse_v16i32() nounwind { 3296; SSE-LABEL: fold_bitreverse_v16i32: 3297; SSE: # %bb.0: 3298; SSE-NEXT: movaps {{.*#+}} xmm0 = [0,4294967295,1073741824,3221225471] 3299; SSE-NEXT: movaps {{.*#+}} xmm1 = [536870912,3758096383,1610612736,2684354559] 3300; SSE-NEXT: movaps {{.*#+}} xmm2 = [268435456,4026531839,1342177280,2952790015] 3301; SSE-NEXT: movaps {{.*#+}} xmm3 = [805306368,3489660927,1879048192,2415919103] 3302; SSE-NEXT: retq 3303; 3304; AVX1-LABEL: fold_bitreverse_v16i32: 3305; AVX1: # %bb.0: 3306; AVX1-NEXT: vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559] 3307; AVX1-NEXT: vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103] 3308; AVX1-NEXT: retq 3309; 3310; AVX2-LABEL: fold_bitreverse_v16i32: 3311; AVX2: # %bb.0: 3312; AVX2-NEXT: vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559] 3313; AVX2-NEXT: vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103] 3314; AVX2-NEXT: retq 3315; 3316; AVX512-LABEL: fold_bitreverse_v16i32: 3317; AVX512: # %bb.0: 3318; AVX512-NEXT: vmovaps {{.*#+}} zmm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559,268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103] 3319; AVX512-NEXT: retq 3320; 3321; XOP-LABEL: fold_bitreverse_v16i32: 3322; XOP: # %bb.0: 3323; XOP-NEXT: vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559] 3324; XOP-NEXT: vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103] 3325; XOP-NEXT: retq 3326; 3327; GFNISSE-LABEL: fold_bitreverse_v16i32: 3328; GFNISSE: # %bb.0: 3329; GFNISSE-NEXT: movaps {{.*#+}} xmm0 = [0,4294967295,1073741824,3221225471] 3330; GFNISSE-NEXT: movaps {{.*#+}} xmm1 = [536870912,3758096383,1610612736,2684354559] 3331; GFNISSE-NEXT: movaps {{.*#+}} xmm2 = [268435456,4026531839,1342177280,2952790015] 3332; GFNISSE-NEXT: movaps {{.*#+}} xmm3 = [805306368,3489660927,1879048192,2415919103] 3333; GFNISSE-NEXT: retq 3334; 3335; GFNIAVX-LABEL: fold_bitreverse_v16i32: 3336; GFNIAVX: # %bb.0: 3337; GFNIAVX-NEXT: vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559] 3338; GFNIAVX-NEXT: vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103] 3339; GFNIAVX-NEXT: retq 3340; 3341; GFNIAVX2-LABEL: fold_bitreverse_v16i32: 3342; GFNIAVX2: # %bb.0: 3343; GFNIAVX2-NEXT: vmovaps {{.*#+}} ymm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559] 3344; GFNIAVX2-NEXT: vmovaps {{.*#+}} ymm1 = [268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103] 3345; GFNIAVX2-NEXT: retq 3346; 3347; GFNIAVX512F-LABEL: fold_bitreverse_v16i32: 3348; GFNIAVX512F: # %bb.0: 3349; GFNIAVX512F-NEXT: vmovaps {{.*#+}} zmm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559,268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103] 3350; GFNIAVX512F-NEXT: retq 3351; 3352; GFNIAVX512BW-LABEL: fold_bitreverse_v16i32: 3353; GFNIAVX512BW: # %bb.0: 3354; GFNIAVX512BW-NEXT: vmovaps {{.*#+}} zmm0 = [0,4294967295,1073741824,3221225471,536870912,3758096383,1610612736,2684354559,268435456,4026531839,1342177280,2952790015,805306368,3489660927,1879048192,2415919103] 3355; GFNIAVX512BW-NEXT: retq 3356 %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>) 3357 ret <16 x i32> %b 3358} 3359 3360declare i8 @llvm.bitreverse.i8(i8) readnone 3361declare i16 @llvm.bitreverse.i16(i16) readnone 3362declare i32 @llvm.bitreverse.i32(i32) readnone 3363declare i64 @llvm.bitreverse.i64(i64) readnone 3364 3365declare <16 x i8> @llvm.bitreverse.v16i8(<16 x i8>) readnone 3366declare <8 x i16> @llvm.bitreverse.v8i16(<8 x i16>) readnone 3367declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>) readnone 3368declare <2 x i64> @llvm.bitreverse.v2i64(<2 x i64>) readnone 3369 3370declare <32 x i8> @llvm.bitreverse.v32i8(<32 x i8>) readnone 3371declare <16 x i16> @llvm.bitreverse.v16i16(<16 x i16>) readnone 3372declare <8 x i32> @llvm.bitreverse.v8i32(<8 x i32>) readnone 3373declare <4 x i64> @llvm.bitreverse.v4i64(<4 x i64>) readnone 3374 3375declare <64 x i8> @llvm.bitreverse.v64i8(<64 x i8>) readnone 3376declare <32 x i16> @llvm.bitreverse.v32i16(<32 x i16>) readnone 3377declare <16 x i32> @llvm.bitreverse.v16i32(<16 x i32>) readnone 3378declare <8 x i64> @llvm.bitreverse.v8i64(<8 x i64>) readnone 3379