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; SSE2-LABEL: test_bitreverse_v16i8: 1013; SSE2: # BB#0: 1014; SSE2-NEXT: movdqa %xmm0, %xmm2 1015; SSE2-NEXT: psrlw $7, %xmm2 1016; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] 1017; SSE2-NEXT: pand %xmm1, %xmm1 1018; SSE2-NEXT: pand %xmm2, %xmm1 1019; SSE2-NEXT: movdqa %xmm0, %xmm2 1020; SSE2-NEXT: psllw $7, %xmm2 1021; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 1022; SSE2-NEXT: pand %xmm3, %xmm3 1023; SSE2-NEXT: pand %xmm3, %xmm2 1024; SSE2-NEXT: movdqa %xmm0, %xmm3 1025; SSE2-NEXT: psllw $5, %xmm3 1026; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1027; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1028; SSE2-NEXT: movdqa %xmm0, %xmm4 1029; SSE2-NEXT: psllw $3, %xmm4 1030; SSE2-NEXT: pand {{.*}}(%rip), %xmm4 1031; SSE2-NEXT: pand {{.*}}(%rip), %xmm4 1032; SSE2-NEXT: por %xmm3, %xmm4 1033; SSE2-NEXT: movdqa %xmm0, %xmm3 1034; SSE2-NEXT: paddb %xmm3, %xmm3 1035; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1036; SSE2-NEXT: por %xmm4, %xmm3 1037; SSE2-NEXT: movdqa %xmm0, %xmm4 1038; SSE2-NEXT: psrlw $1, %xmm4 1039; SSE2-NEXT: pand {{.*}}(%rip), %xmm4 1040; SSE2-NEXT: pand {{.*}}(%rip), %xmm4 1041; SSE2-NEXT: por %xmm3, %xmm4 1042; SSE2-NEXT: movdqa %xmm0, %xmm3 1043; SSE2-NEXT: psrlw $3, %xmm3 1044; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1045; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1046; SSE2-NEXT: por %xmm4, %xmm3 1047; SSE2-NEXT: psrlw $5, %xmm0 1048; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1049; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1050; SSE2-NEXT: por %xmm3, %xmm0 1051; SSE2-NEXT: por %xmm1, %xmm0 1052; SSE2-NEXT: por %xmm2, %xmm0 1053; SSE2-NEXT: retq 1054; 1055; SSSE3-LABEL: test_bitreverse_v16i8: 1056; SSSE3: # BB#0: 1057; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1058; SSSE3-NEXT: movdqa %xmm0, %xmm2 1059; SSSE3-NEXT: pand %xmm1, %xmm2 1060; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1061; SSSE3-NEXT: pshufb %xmm2, %xmm3 1062; SSSE3-NEXT: psrlw $4, %xmm0 1063; SSSE3-NEXT: pand %xmm1, %xmm0 1064; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1065; SSSE3-NEXT: pshufb %xmm0, %xmm1 1066; SSSE3-NEXT: por %xmm3, %xmm1 1067; SSSE3-NEXT: movdqa %xmm1, %xmm0 1068; SSSE3-NEXT: retq 1069; 1070; AVX-LABEL: test_bitreverse_v16i8: 1071; AVX: # BB#0: 1072; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1073; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 1074; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1075; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 1076; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0 1077; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 1078; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1079; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0 1080; AVX-NEXT: vpor %xmm0, %xmm2, %xmm0 1081; AVX-NEXT: retq 1082; 1083; XOP-LABEL: test_bitreverse_v16i8: 1084; XOP: # BB#0: 1085; XOP-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0 1086; XOP-NEXT: retq 1087 %b = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> %a) 1088 ret <16 x i8> %b 1089} 1090 1091define <8 x i16> @test_bitreverse_v8i16(<8 x i16> %a) nounwind { 1092; SSE2-LABEL: test_bitreverse_v8i16: 1093; SSE2: # BB#0: 1094; SSE2-NEXT: pxor %xmm1, %xmm1 1095; SSE2-NEXT: movdqa %xmm0, %xmm2 1096; 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] 1097; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[1,0,3,2,4,5,6,7] 1098; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,4,7,6] 1099; 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] 1100; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7] 1101; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm0[0,1,2,3,5,4,7,6] 1102; SSE2-NEXT: packuswb %xmm2, %xmm1 1103; SSE2-NEXT: movdqa %xmm1, %xmm0 1104; SSE2-NEXT: psllw $7, %xmm0 1105; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 1106; SSE2-NEXT: pand %xmm2, %xmm2 1107; SSE2-NEXT: pand %xmm0, %xmm2 1108; SSE2-NEXT: movdqa %xmm1, %xmm0 1109; SSE2-NEXT: psllw $5, %xmm0 1110; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1111; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1112; SSE2-NEXT: movdqa %xmm1, %xmm3 1113; SSE2-NEXT: psllw $3, %xmm3 1114; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1115; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1116; SSE2-NEXT: por %xmm0, %xmm3 1117; SSE2-NEXT: movdqa %xmm1, %xmm0 1118; SSE2-NEXT: paddb %xmm0, %xmm0 1119; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1120; SSE2-NEXT: por %xmm3, %xmm0 1121; SSE2-NEXT: movdqa %xmm1, %xmm3 1122; SSE2-NEXT: psrlw $1, %xmm3 1123; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1124; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1125; SSE2-NEXT: por %xmm0, %xmm3 1126; SSE2-NEXT: movdqa %xmm1, %xmm0 1127; SSE2-NEXT: psrlw $3, %xmm0 1128; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1129; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1130; SSE2-NEXT: por %xmm3, %xmm0 1131; SSE2-NEXT: movdqa %xmm1, %xmm3 1132; SSE2-NEXT: psrlw $5, %xmm3 1133; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1134; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1135; SSE2-NEXT: por %xmm0, %xmm3 1136; SSE2-NEXT: psrlw $7, %xmm1 1137; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] 1138; SSE2-NEXT: pand %xmm0, %xmm0 1139; SSE2-NEXT: pand %xmm1, %xmm0 1140; SSE2-NEXT: por %xmm3, %xmm0 1141; SSE2-NEXT: por %xmm2, %xmm0 1142; SSE2-NEXT: retq 1143; 1144; SSSE3-LABEL: test_bitreverse_v8i16: 1145; SSSE3: # BB#0: 1146; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 1147; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1148; SSSE3-NEXT: movdqa %xmm0, %xmm2 1149; SSSE3-NEXT: pand %xmm1, %xmm2 1150; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1151; SSSE3-NEXT: pshufb %xmm2, %xmm3 1152; SSSE3-NEXT: psrlw $4, %xmm0 1153; SSSE3-NEXT: pand %xmm1, %xmm0 1154; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1155; SSSE3-NEXT: pshufb %xmm0, %xmm1 1156; SSSE3-NEXT: por %xmm3, %xmm1 1157; SSSE3-NEXT: movdqa %xmm1, %xmm0 1158; SSSE3-NEXT: retq 1159; 1160; AVX-LABEL: test_bitreverse_v8i16: 1161; AVX: # BB#0: 1162; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 1163; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1164; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 1165; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1166; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 1167; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0 1168; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 1169; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1170; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0 1171; AVX-NEXT: vpor %xmm0, %xmm2, %xmm0 1172; AVX-NEXT: retq 1173; 1174; XOP-LABEL: test_bitreverse_v8i16: 1175; XOP: # BB#0: 1176; XOP-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0 1177; XOP-NEXT: retq 1178 %b = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a) 1179 ret <8 x i16> %b 1180} 1181 1182define <4 x i32> @test_bitreverse_v4i32(<4 x i32> %a) nounwind { 1183; SSE2-LABEL: test_bitreverse_v4i32: 1184; SSE2: # BB#0: 1185; SSE2-NEXT: pxor %xmm1, %xmm1 1186; SSE2-NEXT: movdqa %xmm0, %xmm2 1187; 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] 1188; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7] 1189; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4] 1190; 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] 1191; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 1192; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm0[0,1,2,3,7,6,5,4] 1193; SSE2-NEXT: packuswb %xmm2, %xmm1 1194; SSE2-NEXT: movdqa %xmm1, %xmm0 1195; SSE2-NEXT: psllw $7, %xmm0 1196; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 1197; SSE2-NEXT: pand %xmm2, %xmm2 1198; SSE2-NEXT: pand %xmm0, %xmm2 1199; SSE2-NEXT: movdqa %xmm1, %xmm0 1200; SSE2-NEXT: psllw $5, %xmm0 1201; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1202; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1203; SSE2-NEXT: movdqa %xmm1, %xmm3 1204; SSE2-NEXT: psllw $3, %xmm3 1205; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1206; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1207; SSE2-NEXT: por %xmm0, %xmm3 1208; SSE2-NEXT: movdqa %xmm1, %xmm0 1209; SSE2-NEXT: paddb %xmm0, %xmm0 1210; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1211; SSE2-NEXT: por %xmm3, %xmm0 1212; SSE2-NEXT: movdqa %xmm1, %xmm3 1213; SSE2-NEXT: psrlw $1, %xmm3 1214; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1215; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1216; SSE2-NEXT: por %xmm0, %xmm3 1217; SSE2-NEXT: movdqa %xmm1, %xmm0 1218; SSE2-NEXT: psrlw $3, %xmm0 1219; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1220; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1221; SSE2-NEXT: por %xmm3, %xmm0 1222; SSE2-NEXT: movdqa %xmm1, %xmm3 1223; SSE2-NEXT: psrlw $5, %xmm3 1224; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1225; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1226; SSE2-NEXT: por %xmm0, %xmm3 1227; SSE2-NEXT: psrlw $7, %xmm1 1228; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] 1229; SSE2-NEXT: pand %xmm0, %xmm0 1230; SSE2-NEXT: pand %xmm1, %xmm0 1231; SSE2-NEXT: por %xmm3, %xmm0 1232; SSE2-NEXT: por %xmm2, %xmm0 1233; SSE2-NEXT: retq 1234; 1235; SSSE3-LABEL: test_bitreverse_v4i32: 1236; SSSE3: # BB#0: 1237; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 1238; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1239; SSSE3-NEXT: movdqa %xmm0, %xmm2 1240; SSSE3-NEXT: pand %xmm1, %xmm2 1241; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1242; SSSE3-NEXT: pshufb %xmm2, %xmm3 1243; SSSE3-NEXT: psrlw $4, %xmm0 1244; SSSE3-NEXT: pand %xmm1, %xmm0 1245; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1246; SSSE3-NEXT: pshufb %xmm0, %xmm1 1247; SSSE3-NEXT: por %xmm3, %xmm1 1248; SSSE3-NEXT: movdqa %xmm1, %xmm0 1249; SSSE3-NEXT: retq 1250; 1251; AVX-LABEL: test_bitreverse_v4i32: 1252; AVX: # BB#0: 1253; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 1254; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1255; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 1256; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1257; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 1258; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0 1259; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 1260; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1261; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0 1262; AVX-NEXT: vpor %xmm0, %xmm2, %xmm0 1263; AVX-NEXT: retq 1264; 1265; XOP-LABEL: test_bitreverse_v4i32: 1266; XOP: # BB#0: 1267; XOP-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0 1268; XOP-NEXT: retq 1269 %b = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %a) 1270 ret <4 x i32> %b 1271} 1272 1273define <2 x i64> @test_bitreverse_v2i64(<2 x i64> %a) nounwind { 1274; SSE2-LABEL: test_bitreverse_v2i64: 1275; SSE2: # BB#0: 1276; SSE2-NEXT: pxor %xmm1, %xmm1 1277; SSE2-NEXT: movdqa %xmm0, %xmm2 1278; 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] 1279; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1] 1280; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7] 1281; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4] 1282; 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] 1283; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1284; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 1285; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm0[0,1,2,3,7,6,5,4] 1286; SSE2-NEXT: packuswb %xmm2, %xmm1 1287; SSE2-NEXT: movdqa %xmm1, %xmm0 1288; SSE2-NEXT: psllw $7, %xmm0 1289; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 1290; SSE2-NEXT: pand %xmm2, %xmm2 1291; SSE2-NEXT: pand %xmm0, %xmm2 1292; SSE2-NEXT: movdqa %xmm1, %xmm0 1293; SSE2-NEXT: psllw $5, %xmm0 1294; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1295; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1296; SSE2-NEXT: movdqa %xmm1, %xmm3 1297; SSE2-NEXT: psllw $3, %xmm3 1298; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1299; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1300; SSE2-NEXT: por %xmm0, %xmm3 1301; SSE2-NEXT: movdqa %xmm1, %xmm0 1302; SSE2-NEXT: paddb %xmm0, %xmm0 1303; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1304; SSE2-NEXT: por %xmm3, %xmm0 1305; SSE2-NEXT: movdqa %xmm1, %xmm3 1306; SSE2-NEXT: psrlw $1, %xmm3 1307; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1308; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1309; SSE2-NEXT: por %xmm0, %xmm3 1310; SSE2-NEXT: movdqa %xmm1, %xmm0 1311; SSE2-NEXT: psrlw $3, %xmm0 1312; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1313; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1314; SSE2-NEXT: por %xmm3, %xmm0 1315; SSE2-NEXT: movdqa %xmm1, %xmm3 1316; SSE2-NEXT: psrlw $5, %xmm3 1317; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1318; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 1319; SSE2-NEXT: por %xmm0, %xmm3 1320; SSE2-NEXT: psrlw $7, %xmm1 1321; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] 1322; SSE2-NEXT: pand %xmm0, %xmm0 1323; SSE2-NEXT: pand %xmm1, %xmm0 1324; SSE2-NEXT: por %xmm3, %xmm0 1325; SSE2-NEXT: por %xmm2, %xmm0 1326; SSE2-NEXT: retq 1327; 1328; SSSE3-LABEL: test_bitreverse_v2i64: 1329; SSSE3: # BB#0: 1330; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 1331; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1332; SSSE3-NEXT: movdqa %xmm0, %xmm2 1333; SSSE3-NEXT: pand %xmm1, %xmm2 1334; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1335; SSSE3-NEXT: pshufb %xmm2, %xmm3 1336; SSSE3-NEXT: psrlw $4, %xmm0 1337; SSSE3-NEXT: pand %xmm1, %xmm0 1338; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1339; SSSE3-NEXT: pshufb %xmm0, %xmm1 1340; SSSE3-NEXT: por %xmm3, %xmm1 1341; SSSE3-NEXT: movdqa %xmm1, %xmm0 1342; SSSE3-NEXT: retq 1343; 1344; AVX-LABEL: test_bitreverse_v2i64: 1345; AVX: # BB#0: 1346; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 1347; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1348; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 1349; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1350; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 1351; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0 1352; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 1353; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1354; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0 1355; AVX-NEXT: vpor %xmm0, %xmm2, %xmm0 1356; AVX-NEXT: retq 1357; 1358; XOP-LABEL: test_bitreverse_v2i64: 1359; XOP: # BB#0: 1360; XOP-NEXT: vpperm {{.*}}(%rip), %xmm0, %xmm0, %xmm0 1361; XOP-NEXT: retq 1362 %b = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %a) 1363 ret <2 x i64> %b 1364} 1365 1366define <32 x i8> @test_bitreverse_v32i8(<32 x i8> %a) nounwind { 1367; SSE2-LABEL: test_bitreverse_v32i8: 1368; SSE2: # BB#0: 1369; SSE2-NEXT: movdqa %xmm0, %xmm2 1370; SSE2-NEXT: psllw $5, %xmm2 1371; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64] 1372; SSE2-NEXT: pand {{.*}}(%rip), %xmm9 1373; SSE2-NEXT: pand %xmm9, %xmm2 1374; SSE2-NEXT: movdqa %xmm0, %xmm5 1375; SSE2-NEXT: psllw $7, %xmm5 1376; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 1377; SSE2-NEXT: pand %xmm10, %xmm10 1378; SSE2-NEXT: pand %xmm10, %xmm5 1379; SSE2-NEXT: movdqa %xmm0, %xmm3 1380; SSE2-NEXT: psllw $3, %xmm3 1381; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] 1382; SSE2-NEXT: pand {{.*}}(%rip), %xmm11 1383; SSE2-NEXT: pand %xmm11, %xmm3 1384; SSE2-NEXT: por %xmm2, %xmm3 1385; SSE2-NEXT: movdqa %xmm0, %xmm2 1386; SSE2-NEXT: paddb %xmm2, %xmm2 1387; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 1388; SSE2-NEXT: pand %xmm8, %xmm2 1389; SSE2-NEXT: por %xmm3, %xmm2 1390; SSE2-NEXT: movdqa %xmm0, %xmm3 1391; SSE2-NEXT: psrlw $1, %xmm3 1392; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8] 1393; SSE2-NEXT: pand {{.*}}(%rip), %xmm12 1394; SSE2-NEXT: pand %xmm12, %xmm3 1395; SSE2-NEXT: por %xmm2, %xmm3 1396; SSE2-NEXT: movdqa %xmm0, %xmm4 1397; SSE2-NEXT: psrlw $3, %xmm4 1398; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4] 1399; SSE2-NEXT: pand {{.*}}(%rip), %xmm6 1400; SSE2-NEXT: pand %xmm6, %xmm4 1401; SSE2-NEXT: por %xmm3, %xmm4 1402; SSE2-NEXT: movdqa %xmm0, %xmm7 1403; SSE2-NEXT: psrlw $5, %xmm7 1404; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] 1405; SSE2-NEXT: pand {{.*}}(%rip), %xmm2 1406; SSE2-NEXT: pand %xmm2, %xmm7 1407; SSE2-NEXT: por %xmm4, %xmm7 1408; SSE2-NEXT: psrlw $7, %xmm0 1409; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] 1410; SSE2-NEXT: pand %xmm3, %xmm3 1411; SSE2-NEXT: pand %xmm3, %xmm0 1412; SSE2-NEXT: por %xmm7, %xmm0 1413; SSE2-NEXT: por %xmm5, %xmm0 1414; SSE2-NEXT: movdqa %xmm1, %xmm4 1415; SSE2-NEXT: psllw $5, %xmm4 1416; SSE2-NEXT: pand %xmm9, %xmm4 1417; SSE2-NEXT: movdqa %xmm1, %xmm5 1418; SSE2-NEXT: psllw $7, %xmm5 1419; SSE2-NEXT: pand %xmm10, %xmm5 1420; SSE2-NEXT: movdqa %xmm1, %xmm7 1421; SSE2-NEXT: psllw $3, %xmm7 1422; SSE2-NEXT: pand %xmm11, %xmm7 1423; SSE2-NEXT: por %xmm4, %xmm7 1424; SSE2-NEXT: movdqa %xmm1, %xmm4 1425; SSE2-NEXT: paddb %xmm4, %xmm4 1426; SSE2-NEXT: pand %xmm8, %xmm4 1427; SSE2-NEXT: por %xmm7, %xmm4 1428; SSE2-NEXT: movdqa %xmm1, %xmm7 1429; SSE2-NEXT: psrlw $1, %xmm7 1430; SSE2-NEXT: pand %xmm12, %xmm7 1431; SSE2-NEXT: por %xmm4, %xmm7 1432; SSE2-NEXT: movdqa %xmm1, %xmm4 1433; SSE2-NEXT: psrlw $3, %xmm4 1434; SSE2-NEXT: pand %xmm6, %xmm4 1435; SSE2-NEXT: por %xmm7, %xmm4 1436; SSE2-NEXT: movdqa %xmm1, %xmm6 1437; SSE2-NEXT: psrlw $5, %xmm6 1438; SSE2-NEXT: pand %xmm2, %xmm6 1439; SSE2-NEXT: por %xmm4, %xmm6 1440; SSE2-NEXT: psrlw $7, %xmm1 1441; SSE2-NEXT: pand %xmm3, %xmm1 1442; SSE2-NEXT: por %xmm6, %xmm1 1443; SSE2-NEXT: por %xmm5, %xmm1 1444; SSE2-NEXT: retq 1445; 1446; SSSE3-LABEL: test_bitreverse_v32i8: 1447; SSSE3: # BB#0: 1448; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1449; SSSE3-NEXT: movdqa %xmm0, %xmm2 1450; SSSE3-NEXT: pand %xmm4, %xmm2 1451; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1452; SSSE3-NEXT: movdqa %xmm5, %xmm6 1453; SSSE3-NEXT: pshufb %xmm2, %xmm6 1454; SSSE3-NEXT: psrlw $4, %xmm0 1455; SSSE3-NEXT: pand %xmm4, %xmm0 1456; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1457; SSSE3-NEXT: movdqa %xmm2, %xmm3 1458; SSSE3-NEXT: pshufb %xmm0, %xmm3 1459; SSSE3-NEXT: por %xmm6, %xmm3 1460; SSSE3-NEXT: movdqa %xmm1, %xmm0 1461; SSSE3-NEXT: pand %xmm4, %xmm0 1462; SSSE3-NEXT: pshufb %xmm0, %xmm5 1463; SSSE3-NEXT: psrlw $4, %xmm1 1464; SSSE3-NEXT: pand %xmm4, %xmm1 1465; SSSE3-NEXT: pshufb %xmm1, %xmm2 1466; SSSE3-NEXT: por %xmm5, %xmm2 1467; SSSE3-NEXT: movdqa %xmm3, %xmm0 1468; SSSE3-NEXT: movdqa %xmm2, %xmm1 1469; SSSE3-NEXT: retq 1470; 1471; AVX1-LABEL: test_bitreverse_v32i8: 1472; AVX1: # BB#0: 1473; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1474; AVX1-NEXT: vmovaps {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1475; AVX1-NEXT: vandps %xmm2, %xmm1, %xmm3 1476; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1477; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm3 1478; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 1479; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1 1480; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1481; AVX1-NEXT: vpshufb %xmm1, %xmm5, %xmm1 1482; AVX1-NEXT: vpor %xmm1, %xmm3, %xmm1 1483; AVX1-NEXT: vandps %xmm2, %xmm0, %xmm3 1484; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm3 1485; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 1486; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 1487; AVX1-NEXT: vpshufb %xmm0, %xmm5, %xmm0 1488; AVX1-NEXT: vpor %xmm0, %xmm3, %xmm0 1489; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1490; AVX1-NEXT: retq 1491; 1492; AVX2-LABEL: test_bitreverse_v32i8: 1493; AVX2: # BB#0: 1494; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1495; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 1496; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1497; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2 1498; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 1499; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 1500; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1501; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1502; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0 1503; AVX2-NEXT: retq 1504; 1505; XOPAVX1-LABEL: test_bitreverse_v32i8: 1506; XOPAVX1: # BB#0: 1507; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1508; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95] 1509; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1510; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1511; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1512; XOPAVX1-NEXT: retq 1513; 1514; XOPAVX2-LABEL: test_bitreverse_v32i8: 1515; XOPAVX2: # BB#0: 1516; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1517; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95] 1518; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1519; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1520; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1521; XOPAVX2-NEXT: retq 1522 %b = call <32 x i8> @llvm.bitreverse.v32i8(<32 x i8> %a) 1523 ret <32 x i8> %b 1524} 1525 1526define <16 x i16> @test_bitreverse_v16i16(<16 x i16> %a) nounwind { 1527; SSE2-LABEL: test_bitreverse_v16i16: 1528; SSE2: # BB#0: 1529; SSE2-NEXT: pxor %xmm9, %xmm9 1530; SSE2-NEXT: movdqa %xmm0, %xmm2 1531; 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] 1532; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[1,0,3,2,4,5,6,7] 1533; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,4,7,6] 1534; 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] 1535; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7] 1536; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,7,6] 1537; SSE2-NEXT: packuswb %xmm2, %xmm0 1538; SSE2-NEXT: movdqa %xmm0, %xmm2 1539; SSE2-NEXT: psllw $5, %xmm2 1540; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64] 1541; SSE2-NEXT: pand {{.*}}(%rip), %xmm10 1542; SSE2-NEXT: pand %xmm10, %xmm2 1543; SSE2-NEXT: movdqa %xmm0, %xmm3 1544; SSE2-NEXT: psllw $7, %xmm3 1545; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 1546; SSE2-NEXT: pand %xmm11, %xmm11 1547; SSE2-NEXT: pand %xmm11, %xmm3 1548; SSE2-NEXT: movdqa %xmm0, %xmm4 1549; SSE2-NEXT: psllw $3, %xmm4 1550; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] 1551; SSE2-NEXT: pand {{.*}}(%rip), %xmm12 1552; SSE2-NEXT: pand %xmm12, %xmm4 1553; SSE2-NEXT: por %xmm2, %xmm4 1554; SSE2-NEXT: movdqa %xmm0, %xmm2 1555; SSE2-NEXT: paddb %xmm2, %xmm2 1556; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 1557; SSE2-NEXT: pand %xmm8, %xmm2 1558; SSE2-NEXT: por %xmm4, %xmm2 1559; SSE2-NEXT: movdqa %xmm0, %xmm4 1560; SSE2-NEXT: psrlw $1, %xmm4 1561; SSE2-NEXT: movdqa {{.*#+}} xmm13 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8] 1562; SSE2-NEXT: pand {{.*}}(%rip), %xmm13 1563; SSE2-NEXT: pand %xmm13, %xmm4 1564; SSE2-NEXT: por %xmm2, %xmm4 1565; SSE2-NEXT: movdqa %xmm0, %xmm5 1566; SSE2-NEXT: psrlw $3, %xmm5 1567; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4] 1568; SSE2-NEXT: pand {{.*}}(%rip), %xmm6 1569; SSE2-NEXT: pand %xmm6, %xmm5 1570; SSE2-NEXT: por %xmm4, %xmm5 1571; SSE2-NEXT: movdqa %xmm0, %xmm7 1572; SSE2-NEXT: psrlw $5, %xmm7 1573; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] 1574; SSE2-NEXT: pand {{.*}}(%rip), %xmm2 1575; SSE2-NEXT: pand %xmm2, %xmm7 1576; SSE2-NEXT: por %xmm5, %xmm7 1577; SSE2-NEXT: psrlw $7, %xmm0 1578; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] 1579; SSE2-NEXT: pand %xmm4, %xmm4 1580; SSE2-NEXT: pand %xmm4, %xmm0 1581; SSE2-NEXT: por %xmm7, %xmm0 1582; SSE2-NEXT: por %xmm3, %xmm0 1583; SSE2-NEXT: movdqa %xmm1, %xmm3 1584; 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] 1585; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[1,0,3,2,4,5,6,7] 1586; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,4,7,6] 1587; 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] 1588; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[1,0,3,2,4,5,6,7] 1589; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,4,7,6] 1590; SSE2-NEXT: packuswb %xmm3, %xmm1 1591; SSE2-NEXT: movdqa %xmm1, %xmm5 1592; SSE2-NEXT: psllw $5, %xmm5 1593; SSE2-NEXT: pand %xmm10, %xmm5 1594; SSE2-NEXT: movdqa %xmm1, %xmm3 1595; SSE2-NEXT: psllw $7, %xmm3 1596; SSE2-NEXT: pand %xmm11, %xmm3 1597; SSE2-NEXT: movdqa %xmm1, %xmm7 1598; SSE2-NEXT: psllw $3, %xmm7 1599; SSE2-NEXT: pand %xmm12, %xmm7 1600; SSE2-NEXT: por %xmm5, %xmm7 1601; SSE2-NEXT: movdqa %xmm1, %xmm5 1602; SSE2-NEXT: paddb %xmm5, %xmm5 1603; SSE2-NEXT: pand %xmm8, %xmm5 1604; SSE2-NEXT: por %xmm7, %xmm5 1605; SSE2-NEXT: movdqa %xmm1, %xmm7 1606; SSE2-NEXT: psrlw $1, %xmm7 1607; SSE2-NEXT: pand %xmm13, %xmm7 1608; SSE2-NEXT: por %xmm5, %xmm7 1609; SSE2-NEXT: movdqa %xmm1, %xmm5 1610; SSE2-NEXT: psrlw $3, %xmm5 1611; SSE2-NEXT: pand %xmm6, %xmm5 1612; SSE2-NEXT: por %xmm7, %xmm5 1613; SSE2-NEXT: movdqa %xmm1, %xmm6 1614; SSE2-NEXT: psrlw $5, %xmm6 1615; SSE2-NEXT: pand %xmm2, %xmm6 1616; SSE2-NEXT: por %xmm5, %xmm6 1617; SSE2-NEXT: psrlw $7, %xmm1 1618; SSE2-NEXT: pand %xmm4, %xmm1 1619; SSE2-NEXT: por %xmm6, %xmm1 1620; SSE2-NEXT: por %xmm3, %xmm1 1621; SSE2-NEXT: retq 1622; 1623; SSSE3-LABEL: test_bitreverse_v16i16: 1624; SSSE3: # BB#0: 1625; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 1626; SSSE3-NEXT: pshufb %xmm4, %xmm0 1627; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1628; SSSE3-NEXT: movdqa %xmm0, %xmm2 1629; SSSE3-NEXT: pand %xmm5, %xmm2 1630; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1631; SSSE3-NEXT: movdqa %xmm6, %xmm7 1632; SSSE3-NEXT: pshufb %xmm2, %xmm7 1633; SSSE3-NEXT: psrlw $4, %xmm0 1634; SSSE3-NEXT: pand %xmm5, %xmm0 1635; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1636; SSSE3-NEXT: movdqa %xmm2, %xmm3 1637; SSSE3-NEXT: pshufb %xmm0, %xmm3 1638; SSSE3-NEXT: por %xmm7, %xmm3 1639; SSSE3-NEXT: pshufb %xmm4, %xmm1 1640; SSSE3-NEXT: movdqa %xmm1, %xmm0 1641; SSSE3-NEXT: pand %xmm5, %xmm0 1642; SSSE3-NEXT: pshufb %xmm0, %xmm6 1643; SSSE3-NEXT: psrlw $4, %xmm1 1644; SSSE3-NEXT: pand %xmm5, %xmm1 1645; SSSE3-NEXT: pshufb %xmm1, %xmm2 1646; SSSE3-NEXT: por %xmm6, %xmm2 1647; SSSE3-NEXT: movdqa %xmm3, %xmm0 1648; SSSE3-NEXT: movdqa %xmm2, %xmm1 1649; SSSE3-NEXT: retq 1650; 1651; AVX1-LABEL: test_bitreverse_v16i16: 1652; AVX1: # BB#0: 1653; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1654; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14] 1655; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 1656; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1657; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm4 1658; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1659; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4 1660; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 1661; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1 1662; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1663; AVX1-NEXT: vpshufb %xmm1, %xmm6, %xmm1 1664; AVX1-NEXT: vpor %xmm1, %xmm4, %xmm1 1665; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 1666; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm2 1667; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm2 1668; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 1669; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 1670; AVX1-NEXT: vpshufb %xmm0, %xmm6, %xmm0 1671; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0 1672; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1673; AVX1-NEXT: retq 1674; 1675; AVX2-LABEL: test_bitreverse_v16i16: 1676; AVX2: # BB#0: 1677; 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] 1678; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1679; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 1680; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1681; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2 1682; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 1683; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 1684; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1685; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1686; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0 1687; AVX2-NEXT: retq 1688; 1689; XOPAVX1-LABEL: test_bitreverse_v16i16: 1690; XOPAVX1: # BB#0: 1691; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1692; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94] 1693; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1694; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1695; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1696; XOPAVX1-NEXT: retq 1697; 1698; XOPAVX2-LABEL: test_bitreverse_v16i16: 1699; XOPAVX2: # BB#0: 1700; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1701; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [81,80,83,82,85,84,87,86,89,88,91,90,93,92,95,94] 1702; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1703; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1704; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1705; XOPAVX2-NEXT: retq 1706 %b = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> %a) 1707 ret <16 x i16> %b 1708} 1709 1710define <8 x i32> @test_bitreverse_v8i32(<8 x i32> %a) nounwind { 1711; SSE2-LABEL: test_bitreverse_v8i32: 1712; SSE2: # BB#0: 1713; SSE2-NEXT: pxor %xmm9, %xmm9 1714; SSE2-NEXT: movdqa %xmm0, %xmm2 1715; 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] 1716; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7] 1717; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4] 1718; 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] 1719; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 1720; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4] 1721; SSE2-NEXT: packuswb %xmm2, %xmm0 1722; SSE2-NEXT: movdqa %xmm0, %xmm2 1723; SSE2-NEXT: psllw $5, %xmm2 1724; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64] 1725; SSE2-NEXT: pand {{.*}}(%rip), %xmm10 1726; SSE2-NEXT: pand %xmm10, %xmm2 1727; SSE2-NEXT: movdqa %xmm0, %xmm3 1728; SSE2-NEXT: psllw $7, %xmm3 1729; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 1730; SSE2-NEXT: pand %xmm11, %xmm11 1731; SSE2-NEXT: pand %xmm11, %xmm3 1732; SSE2-NEXT: movdqa %xmm0, %xmm4 1733; SSE2-NEXT: psllw $3, %xmm4 1734; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] 1735; SSE2-NEXT: pand {{.*}}(%rip), %xmm12 1736; SSE2-NEXT: pand %xmm12, %xmm4 1737; SSE2-NEXT: por %xmm2, %xmm4 1738; SSE2-NEXT: movdqa %xmm0, %xmm2 1739; SSE2-NEXT: paddb %xmm2, %xmm2 1740; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 1741; SSE2-NEXT: pand %xmm8, %xmm2 1742; SSE2-NEXT: por %xmm4, %xmm2 1743; SSE2-NEXT: movdqa %xmm0, %xmm4 1744; SSE2-NEXT: psrlw $1, %xmm4 1745; SSE2-NEXT: movdqa {{.*#+}} xmm13 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8] 1746; SSE2-NEXT: pand {{.*}}(%rip), %xmm13 1747; SSE2-NEXT: pand %xmm13, %xmm4 1748; SSE2-NEXT: por %xmm2, %xmm4 1749; SSE2-NEXT: movdqa %xmm0, %xmm5 1750; SSE2-NEXT: psrlw $3, %xmm5 1751; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4] 1752; SSE2-NEXT: pand {{.*}}(%rip), %xmm6 1753; SSE2-NEXT: pand %xmm6, %xmm5 1754; SSE2-NEXT: por %xmm4, %xmm5 1755; SSE2-NEXT: movdqa %xmm0, %xmm7 1756; SSE2-NEXT: psrlw $5, %xmm7 1757; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] 1758; SSE2-NEXT: pand {{.*}}(%rip), %xmm2 1759; SSE2-NEXT: pand %xmm2, %xmm7 1760; SSE2-NEXT: por %xmm5, %xmm7 1761; SSE2-NEXT: psrlw $7, %xmm0 1762; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] 1763; SSE2-NEXT: pand %xmm4, %xmm4 1764; SSE2-NEXT: pand %xmm4, %xmm0 1765; SSE2-NEXT: por %xmm7, %xmm0 1766; SSE2-NEXT: por %xmm3, %xmm0 1767; SSE2-NEXT: movdqa %xmm1, %xmm3 1768; 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] 1769; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[3,2,1,0,4,5,6,7] 1770; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,7,6,5,4] 1771; 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] 1772; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7] 1773; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4] 1774; SSE2-NEXT: packuswb %xmm3, %xmm1 1775; SSE2-NEXT: movdqa %xmm1, %xmm5 1776; SSE2-NEXT: psllw $5, %xmm5 1777; SSE2-NEXT: pand %xmm10, %xmm5 1778; SSE2-NEXT: movdqa %xmm1, %xmm3 1779; SSE2-NEXT: psllw $7, %xmm3 1780; SSE2-NEXT: pand %xmm11, %xmm3 1781; SSE2-NEXT: movdqa %xmm1, %xmm7 1782; SSE2-NEXT: psllw $3, %xmm7 1783; SSE2-NEXT: pand %xmm12, %xmm7 1784; SSE2-NEXT: por %xmm5, %xmm7 1785; SSE2-NEXT: movdqa %xmm1, %xmm5 1786; SSE2-NEXT: paddb %xmm5, %xmm5 1787; SSE2-NEXT: pand %xmm8, %xmm5 1788; SSE2-NEXT: por %xmm7, %xmm5 1789; SSE2-NEXT: movdqa %xmm1, %xmm7 1790; SSE2-NEXT: psrlw $1, %xmm7 1791; SSE2-NEXT: pand %xmm13, %xmm7 1792; SSE2-NEXT: por %xmm5, %xmm7 1793; SSE2-NEXT: movdqa %xmm1, %xmm5 1794; SSE2-NEXT: psrlw $3, %xmm5 1795; SSE2-NEXT: pand %xmm6, %xmm5 1796; SSE2-NEXT: por %xmm7, %xmm5 1797; SSE2-NEXT: movdqa %xmm1, %xmm6 1798; SSE2-NEXT: psrlw $5, %xmm6 1799; SSE2-NEXT: pand %xmm2, %xmm6 1800; SSE2-NEXT: por %xmm5, %xmm6 1801; SSE2-NEXT: psrlw $7, %xmm1 1802; SSE2-NEXT: pand %xmm4, %xmm1 1803; SSE2-NEXT: por %xmm6, %xmm1 1804; SSE2-NEXT: por %xmm3, %xmm1 1805; SSE2-NEXT: retq 1806; 1807; SSSE3-LABEL: test_bitreverse_v8i32: 1808; SSSE3: # BB#0: 1809; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 1810; SSSE3-NEXT: pshufb %xmm4, %xmm0 1811; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1812; SSSE3-NEXT: movdqa %xmm0, %xmm2 1813; SSSE3-NEXT: pand %xmm5, %xmm2 1814; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1815; SSSE3-NEXT: movdqa %xmm6, %xmm7 1816; SSSE3-NEXT: pshufb %xmm2, %xmm7 1817; SSSE3-NEXT: psrlw $4, %xmm0 1818; SSSE3-NEXT: pand %xmm5, %xmm0 1819; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1820; SSSE3-NEXT: movdqa %xmm2, %xmm3 1821; SSSE3-NEXT: pshufb %xmm0, %xmm3 1822; SSSE3-NEXT: por %xmm7, %xmm3 1823; SSSE3-NEXT: pshufb %xmm4, %xmm1 1824; SSSE3-NEXT: movdqa %xmm1, %xmm0 1825; SSSE3-NEXT: pand %xmm5, %xmm0 1826; SSSE3-NEXT: pshufb %xmm0, %xmm6 1827; SSSE3-NEXT: psrlw $4, %xmm1 1828; SSSE3-NEXT: pand %xmm5, %xmm1 1829; SSSE3-NEXT: pshufb %xmm1, %xmm2 1830; SSSE3-NEXT: por %xmm6, %xmm2 1831; SSSE3-NEXT: movdqa %xmm3, %xmm0 1832; SSSE3-NEXT: movdqa %xmm2, %xmm1 1833; SSSE3-NEXT: retq 1834; 1835; AVX1-LABEL: test_bitreverse_v8i32: 1836; AVX1: # BB#0: 1837; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1838; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12] 1839; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 1840; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1841; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm4 1842; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1843; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4 1844; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 1845; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1 1846; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1847; AVX1-NEXT: vpshufb %xmm1, %xmm6, %xmm1 1848; AVX1-NEXT: vpor %xmm1, %xmm4, %xmm1 1849; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 1850; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm2 1851; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm2 1852; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 1853; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 1854; AVX1-NEXT: vpshufb %xmm0, %xmm6, %xmm0 1855; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0 1856; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1857; AVX1-NEXT: retq 1858; 1859; AVX2-LABEL: test_bitreverse_v8i32: 1860; AVX2: # BB#0: 1861; 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] 1862; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1863; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 1864; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 1865; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2 1866; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 1867; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 1868; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 1869; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 1870; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0 1871; AVX2-NEXT: retq 1872; 1873; XOPAVX1-LABEL: test_bitreverse_v8i32: 1874; XOPAVX1: # BB#0: 1875; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1876; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92] 1877; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1878; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1879; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1880; XOPAVX1-NEXT: retq 1881; 1882; XOPAVX2-LABEL: test_bitreverse_v8i32: 1883; XOPAVX2: # BB#0: 1884; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1885; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [83,82,81,80,87,86,85,84,91,90,89,88,95,94,93,92] 1886; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 1887; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 1888; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1889; XOPAVX2-NEXT: retq 1890 %b = call <8 x i32> @llvm.bitreverse.v8i32(<8 x i32> %a) 1891 ret <8 x i32> %b 1892} 1893 1894define <4 x i64> @test_bitreverse_v4i64(<4 x i64> %a) nounwind { 1895; SSE2-LABEL: test_bitreverse_v4i64: 1896; SSE2: # BB#0: 1897; SSE2-NEXT: pxor %xmm9, %xmm9 1898; SSE2-NEXT: movdqa %xmm0, %xmm2 1899; 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] 1900; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1] 1901; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7] 1902; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4] 1903; 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] 1904; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1905; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 1906; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4] 1907; SSE2-NEXT: packuswb %xmm2, %xmm0 1908; SSE2-NEXT: movdqa %xmm0, %xmm2 1909; SSE2-NEXT: psllw $5, %xmm2 1910; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64] 1911; SSE2-NEXT: pand {{.*}}(%rip), %xmm10 1912; SSE2-NEXT: pand %xmm10, %xmm2 1913; SSE2-NEXT: movdqa %xmm0, %xmm4 1914; SSE2-NEXT: psllw $7, %xmm4 1915; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 1916; SSE2-NEXT: pand %xmm11, %xmm11 1917; SSE2-NEXT: pand %xmm11, %xmm4 1918; SSE2-NEXT: movdqa %xmm0, %xmm3 1919; SSE2-NEXT: psllw $3, %xmm3 1920; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] 1921; SSE2-NEXT: pand {{.*}}(%rip), %xmm12 1922; SSE2-NEXT: pand %xmm12, %xmm3 1923; SSE2-NEXT: por %xmm2, %xmm3 1924; SSE2-NEXT: movdqa %xmm0, %xmm2 1925; SSE2-NEXT: paddb %xmm2, %xmm2 1926; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 1927; SSE2-NEXT: pand %xmm8, %xmm2 1928; SSE2-NEXT: por %xmm3, %xmm2 1929; SSE2-NEXT: movdqa %xmm0, %xmm3 1930; SSE2-NEXT: psrlw $1, %xmm3 1931; SSE2-NEXT: movdqa {{.*#+}} xmm13 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8] 1932; SSE2-NEXT: pand {{.*}}(%rip), %xmm13 1933; SSE2-NEXT: pand %xmm13, %xmm3 1934; SSE2-NEXT: por %xmm2, %xmm3 1935; SSE2-NEXT: movdqa %xmm0, %xmm5 1936; SSE2-NEXT: psrlw $3, %xmm5 1937; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4] 1938; SSE2-NEXT: pand {{.*}}(%rip), %xmm6 1939; SSE2-NEXT: pand %xmm6, %xmm5 1940; SSE2-NEXT: por %xmm3, %xmm5 1941; SSE2-NEXT: movdqa %xmm0, %xmm7 1942; SSE2-NEXT: psrlw $5, %xmm7 1943; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] 1944; SSE2-NEXT: pand {{.*}}(%rip), %xmm2 1945; SSE2-NEXT: pand %xmm2, %xmm7 1946; SSE2-NEXT: por %xmm5, %xmm7 1947; SSE2-NEXT: psrlw $7, %xmm0 1948; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] 1949; SSE2-NEXT: pand %xmm3, %xmm3 1950; SSE2-NEXT: pand %xmm3, %xmm0 1951; SSE2-NEXT: por %xmm7, %xmm0 1952; SSE2-NEXT: por %xmm4, %xmm0 1953; SSE2-NEXT: movdqa %xmm1, %xmm4 1954; 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] 1955; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[2,3,0,1] 1956; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[3,2,1,0,4,5,6,7] 1957; SSE2-NEXT: pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,7,6,5,4] 1958; 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] 1959; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] 1960; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[3,2,1,0,4,5,6,7] 1961; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,5,4] 1962; SSE2-NEXT: packuswb %xmm4, %xmm1 1963; SSE2-NEXT: movdqa %xmm1, %xmm5 1964; SSE2-NEXT: psllw $5, %xmm5 1965; SSE2-NEXT: pand %xmm10, %xmm5 1966; SSE2-NEXT: movdqa %xmm1, %xmm4 1967; SSE2-NEXT: psllw $7, %xmm4 1968; SSE2-NEXT: pand %xmm11, %xmm4 1969; SSE2-NEXT: movdqa %xmm1, %xmm7 1970; SSE2-NEXT: psllw $3, %xmm7 1971; SSE2-NEXT: pand %xmm12, %xmm7 1972; SSE2-NEXT: por %xmm5, %xmm7 1973; SSE2-NEXT: movdqa %xmm1, %xmm5 1974; SSE2-NEXT: paddb %xmm5, %xmm5 1975; SSE2-NEXT: pand %xmm8, %xmm5 1976; SSE2-NEXT: por %xmm7, %xmm5 1977; SSE2-NEXT: movdqa %xmm1, %xmm7 1978; SSE2-NEXT: psrlw $1, %xmm7 1979; SSE2-NEXT: pand %xmm13, %xmm7 1980; SSE2-NEXT: por %xmm5, %xmm7 1981; SSE2-NEXT: movdqa %xmm1, %xmm5 1982; SSE2-NEXT: psrlw $3, %xmm5 1983; SSE2-NEXT: pand %xmm6, %xmm5 1984; SSE2-NEXT: por %xmm7, %xmm5 1985; SSE2-NEXT: movdqa %xmm1, %xmm6 1986; SSE2-NEXT: psrlw $5, %xmm6 1987; SSE2-NEXT: pand %xmm2, %xmm6 1988; SSE2-NEXT: por %xmm5, %xmm6 1989; SSE2-NEXT: psrlw $7, %xmm1 1990; SSE2-NEXT: pand %xmm3, %xmm1 1991; SSE2-NEXT: por %xmm6, %xmm1 1992; SSE2-NEXT: por %xmm4, %xmm1 1993; SSE2-NEXT: retq 1994; 1995; SSSE3-LABEL: test_bitreverse_v4i64: 1996; SSSE3: # BB#0: 1997; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 1998; SSSE3-NEXT: pshufb %xmm4, %xmm0 1999; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 2000; SSSE3-NEXT: movdqa %xmm0, %xmm2 2001; SSSE3-NEXT: pand %xmm5, %xmm2 2002; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 2003; SSSE3-NEXT: movdqa %xmm6, %xmm7 2004; SSSE3-NEXT: pshufb %xmm2, %xmm7 2005; SSSE3-NEXT: psrlw $4, %xmm0 2006; SSSE3-NEXT: pand %xmm5, %xmm0 2007; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 2008; SSSE3-NEXT: movdqa %xmm2, %xmm3 2009; SSSE3-NEXT: pshufb %xmm0, %xmm3 2010; SSSE3-NEXT: por %xmm7, %xmm3 2011; SSSE3-NEXT: pshufb %xmm4, %xmm1 2012; SSSE3-NEXT: movdqa %xmm1, %xmm0 2013; SSSE3-NEXT: pand %xmm5, %xmm0 2014; SSSE3-NEXT: pshufb %xmm0, %xmm6 2015; SSSE3-NEXT: psrlw $4, %xmm1 2016; SSSE3-NEXT: pand %xmm5, %xmm1 2017; SSSE3-NEXT: pshufb %xmm1, %xmm2 2018; SSSE3-NEXT: por %xmm6, %xmm2 2019; SSSE3-NEXT: movdqa %xmm3, %xmm0 2020; SSSE3-NEXT: movdqa %xmm2, %xmm1 2021; SSSE3-NEXT: retq 2022; 2023; AVX1-LABEL: test_bitreverse_v4i64: 2024; AVX1: # BB#0: 2025; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 2026; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8] 2027; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 2028; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 2029; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm4 2030; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 2031; AVX1-NEXT: vpshufb %xmm4, %xmm5, %xmm4 2032; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1 2033; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1 2034; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 2035; AVX1-NEXT: vpshufb %xmm1, %xmm6, %xmm1 2036; AVX1-NEXT: vpor %xmm1, %xmm4, %xmm1 2037; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 2038; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm2 2039; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm2 2040; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 2041; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0 2042; AVX1-NEXT: vpshufb %xmm0, %xmm6, %xmm0 2043; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0 2044; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 2045; AVX1-NEXT: retq 2046; 2047; AVX2-LABEL: test_bitreverse_v4i64: 2048; AVX2: # BB#0: 2049; 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] 2050; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 2051; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 2052; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240] 2053; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2 2054; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0 2055; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 2056; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15] 2057; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0 2058; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0 2059; AVX2-NEXT: retq 2060; 2061; XOPAVX1-LABEL: test_bitreverse_v4i64: 2062; XOPAVX1: # BB#0: 2063; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 2064; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88] 2065; XOPAVX1-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 2066; XOPAVX1-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 2067; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 2068; XOPAVX1-NEXT: retq 2069; 2070; XOPAVX2-LABEL: test_bitreverse_v4i64: 2071; XOPAVX2: # BB#0: 2072; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2073; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [87,86,85,84,83,82,81,80,95,94,93,92,91,90,89,88] 2074; XOPAVX2-NEXT: vpperm %xmm2, %xmm1, %xmm0, %xmm1 2075; XOPAVX2-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm0 2076; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 2077; XOPAVX2-NEXT: retq 2078 %b = call <4 x i64> @llvm.bitreverse.v4i64(<4 x i64> %a) 2079 ret <4 x i64> %b 2080} 2081 2082declare i8 @llvm.bitreverse.i8(i8) readnone 2083declare i16 @llvm.bitreverse.i16(i16) readnone 2084declare i32 @llvm.bitreverse.i32(i32) readnone 2085declare i64 @llvm.bitreverse.i64(i64) readnone 2086 2087declare <16 x i8> @llvm.bitreverse.v16i8(<16 x i8>) readnone 2088declare <8 x i16> @llvm.bitreverse.v8i16(<8 x i16>) readnone 2089declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>) readnone 2090declare <2 x i64> @llvm.bitreverse.v2i64(<2 x i64>) readnone 2091 2092declare <32 x i8> @llvm.bitreverse.v32i8(<32 x i8>) readnone 2093declare <16 x i16> @llvm.bitreverse.v16i16(<16 x i16>) readnone 2094declare <8 x i32> @llvm.bitreverse.v8i32(<8 x i32>) readnone 2095declare <4 x i64> @llvm.bitreverse.v4i64(<4 x i64>) readnone 2096