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