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