1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefixes=CHECK,X86,X86-FAST 3; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+slow-shld | FileCheck %s --check-prefixes=CHECK,X86,X86-SLOW 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=CHECK,X64,X64-FAST 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+slow-shld | FileCheck %s --check-prefixes=CHECK,X64,X64-SLOW 6 7declare i8 @llvm.fshr.i8(i8, i8, i8) nounwind readnone 8declare i16 @llvm.fshr.i16(i16, i16, i16) nounwind readnone 9declare i32 @llvm.fshr.i32(i32, i32, i32) nounwind readnone 10declare i64 @llvm.fshr.i64(i64, i64, i64) nounwind readnone 11 12; 13; Variable Funnel Shift 14; 15 16define i8 @var_shift_i8(i8 %x, i8 %y, i8 %z) nounwind { 17; X86-LABEL: var_shift_i8: 18; X86: # %bb.0: 19; X86-NEXT: movb {{[0-9]+}}(%esp), %ah 20; X86-NEXT: movb {{[0-9]+}}(%esp), %al 21; X86-NEXT: movb {{[0-9]+}}(%esp), %dl 22; X86-NEXT: andb $7, %dl 23; X86-NEXT: movb %al, %ch 24; X86-NEXT: movb %dl, %cl 25; X86-NEXT: shrb %cl, %ch 26; X86-NEXT: movb $8, %cl 27; X86-NEXT: subb %dl, %cl 28; X86-NEXT: shlb %cl, %ah 29; X86-NEXT: testb %dl, %dl 30; X86-NEXT: je .LBB0_2 31; X86-NEXT: # %bb.1: 32; X86-NEXT: orb %ch, %ah 33; X86-NEXT: movb %ah, %al 34; X86-NEXT: .LBB0_2: 35; X86-NEXT: retl 36; 37; X64-LABEL: var_shift_i8: 38; X64: # %bb.0: 39; X64-NEXT: movl %esi, %eax 40; X64-NEXT: andb $7, %dl 41; X64-NEXT: movl %edx, %ecx 42; X64-NEXT: shrb %cl, %sil 43; X64-NEXT: movb $8, %cl 44; X64-NEXT: subb %dl, %cl 45; X64-NEXT: shlb %cl, %dil 46; X64-NEXT: testb %dl, %dl 47; X64-NEXT: je .LBB0_2 48; X64-NEXT: # %bb.1: 49; X64-NEXT: orb %sil, %dil 50; X64-NEXT: movl %edi, %eax 51; X64-NEXT: .LBB0_2: 52; X64-NEXT: # kill: def $al killed $al killed $eax 53; X64-NEXT: retq 54 %tmp = tail call i8 @llvm.fshr.i8(i8 %x, i8 %y, i8 %z) 55 ret i8 %tmp 56} 57 58define i16 @var_shift_i16(i16 %x, i16 %y, i16 %z) nounwind { 59; X86-FAST-LABEL: var_shift_i16: 60; X86-FAST: # %bb.0: 61; X86-FAST-NEXT: movzwl {{[0-9]+}}(%esp), %edx 62; X86-FAST-NEXT: movzwl {{[0-9]+}}(%esp), %eax 63; X86-FAST-NEXT: movb {{[0-9]+}}(%esp), %cl 64; X86-FAST-NEXT: andb $15, %cl 65; X86-FAST-NEXT: shrdw %cl, %dx, %ax 66; X86-FAST-NEXT: retl 67; 68; X86-SLOW-LABEL: var_shift_i16: 69; X86-SLOW: # %bb.0: 70; X86-SLOW-NEXT: pushl %edi 71; X86-SLOW-NEXT: pushl %esi 72; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %esi 73; X86-SLOW-NEXT: movb {{[0-9]+}}(%esp), %dl 74; X86-SLOW-NEXT: andb $15, %dl 75; X86-SLOW-NEXT: movzwl {{[0-9]+}}(%esp), %eax 76; X86-SLOW-NEXT: movl %eax, %edi 77; X86-SLOW-NEXT: movl %edx, %ecx 78; X86-SLOW-NEXT: shrl %cl, %edi 79; X86-SLOW-NEXT: movb $16, %cl 80; X86-SLOW-NEXT: subb %dl, %cl 81; X86-SLOW-NEXT: shll %cl, %esi 82; X86-SLOW-NEXT: testb %dl, %dl 83; X86-SLOW-NEXT: je .LBB1_2 84; X86-SLOW-NEXT: # %bb.1: 85; X86-SLOW-NEXT: orl %edi, %esi 86; X86-SLOW-NEXT: movl %esi, %eax 87; X86-SLOW-NEXT: .LBB1_2: 88; X86-SLOW-NEXT: # kill: def $ax killed $ax killed $eax 89; X86-SLOW-NEXT: popl %esi 90; X86-SLOW-NEXT: popl %edi 91; X86-SLOW-NEXT: retl 92; 93; X64-FAST-LABEL: var_shift_i16: 94; X64-FAST: # %bb.0: 95; X64-FAST-NEXT: movl %edx, %ecx 96; X64-FAST-NEXT: movl %esi, %eax 97; X64-FAST-NEXT: andb $15, %cl 98; X64-FAST-NEXT: # kill: def $cl killed $cl killed $ecx 99; X64-FAST-NEXT: shrdw %cl, %di, %ax 100; X64-FAST-NEXT: # kill: def $ax killed $ax killed $eax 101; X64-FAST-NEXT: retq 102; 103; X64-SLOW-LABEL: var_shift_i16: 104; X64-SLOW: # %bb.0: 105; X64-SLOW-NEXT: movzwl %si, %eax 106; X64-SLOW-NEXT: andb $15, %dl 107; X64-SLOW-NEXT: movl %edx, %ecx 108; X64-SLOW-NEXT: shrl %cl, %eax 109; X64-SLOW-NEXT: movb $16, %cl 110; X64-SLOW-NEXT: subb %dl, %cl 111; X64-SLOW-NEXT: shll %cl, %edi 112; X64-SLOW-NEXT: orl %edi, %eax 113; X64-SLOW-NEXT: testb %dl, %dl 114; X64-SLOW-NEXT: cmovel %esi, %eax 115; X64-SLOW-NEXT: # kill: def $ax killed $ax killed $eax 116; X64-SLOW-NEXT: retq 117 %tmp = tail call i16 @llvm.fshr.i16(i16 %x, i16 %y, i16 %z) 118 ret i16 %tmp 119} 120 121define i32 @var_shift_i32(i32 %x, i32 %y, i32 %z) nounwind { 122; X86-FAST-LABEL: var_shift_i32: 123; X86-FAST: # %bb.0: 124; X86-FAST-NEXT: movb {{[0-9]+}}(%esp), %cl 125; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %edx 126; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %eax 127; X86-FAST-NEXT: shrdl %cl, %edx, %eax 128; X86-FAST-NEXT: retl 129; 130; X86-SLOW-LABEL: var_shift_i32: 131; X86-SLOW: # %bb.0: 132; X86-SLOW-NEXT: pushl %edi 133; X86-SLOW-NEXT: pushl %esi 134; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %esi 135; X86-SLOW-NEXT: movb {{[0-9]+}}(%esp), %dl 136; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %eax 137; X86-SLOW-NEXT: movl %eax, %edi 138; X86-SLOW-NEXT: movl %edx, %ecx 139; X86-SLOW-NEXT: shrl %cl, %edi 140; X86-SLOW-NEXT: andb $31, %dl 141; X86-SLOW-NEXT: movl %edx, %ecx 142; X86-SLOW-NEXT: negb %cl 143; X86-SLOW-NEXT: shll %cl, %esi 144; X86-SLOW-NEXT: testb %dl, %dl 145; X86-SLOW-NEXT: je .LBB2_2 146; X86-SLOW-NEXT: # %bb.1: 147; X86-SLOW-NEXT: orl %edi, %esi 148; X86-SLOW-NEXT: movl %esi, %eax 149; X86-SLOW-NEXT: .LBB2_2: 150; X86-SLOW-NEXT: popl %esi 151; X86-SLOW-NEXT: popl %edi 152; X86-SLOW-NEXT: retl 153; 154; X64-FAST-LABEL: var_shift_i32: 155; X64-FAST: # %bb.0: 156; X64-FAST-NEXT: movl %edx, %ecx 157; X64-FAST-NEXT: movl %esi, %eax 158; X64-FAST-NEXT: # kill: def $cl killed $cl killed $ecx 159; X64-FAST-NEXT: shrdl %cl, %edi, %eax 160; X64-FAST-NEXT: retq 161; 162; X64-SLOW-LABEL: var_shift_i32: 163; X64-SLOW: # %bb.0: 164; X64-SLOW-NEXT: movl %edi, %eax 165; X64-SLOW-NEXT: movl %esi, %edi 166; X64-SLOW-NEXT: movl %edx, %ecx 167; X64-SLOW-NEXT: shrl %cl, %edi 168; X64-SLOW-NEXT: andb $31, %dl 169; X64-SLOW-NEXT: movl %edx, %ecx 170; X64-SLOW-NEXT: negb %cl 171; X64-SLOW-NEXT: shll %cl, %eax 172; X64-SLOW-NEXT: orl %edi, %eax 173; X64-SLOW-NEXT: testb %dl, %dl 174; X64-SLOW-NEXT: cmovel %esi, %eax 175; X64-SLOW-NEXT: retq 176 %tmp = tail call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 %z) 177 ret i32 %tmp 178} 179 180define i32 @var_shift_i32_optsize(i32 %x, i32 %y, i32 %z) nounwind optsize { 181; X86-LABEL: var_shift_i32_optsize: 182; X86: # %bb.0: 183; X86-NEXT: movb {{[0-9]+}}(%esp), %cl 184; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 185; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 186; X86-NEXT: shrdl %cl, %edx, %eax 187; X86-NEXT: retl 188; 189; X64-LABEL: var_shift_i32_optsize: 190; X64: # %bb.0: 191; X64-NEXT: movl %edx, %ecx 192; X64-NEXT: movl %esi, %eax 193; X64-NEXT: # kill: def $cl killed $cl killed $ecx 194; X64-NEXT: shrdl %cl, %edi, %eax 195; X64-NEXT: retq 196 %tmp = tail call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 %z) 197 ret i32 %tmp 198} 199 200define i64 @var_shift_i64(i64 %x, i64 %y, i64 %z) nounwind { 201; X86-FAST-LABEL: var_shift_i64: 202; X86-FAST: # %bb.0: 203; X86-FAST-NEXT: pushl %ebp 204; X86-FAST-NEXT: pushl %ebx 205; X86-FAST-NEXT: pushl %edi 206; X86-FAST-NEXT: pushl %esi 207; X86-FAST-NEXT: pushl %eax 208; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %eax 209; X86-FAST-NEXT: movl %eax, (%esp) # 4-byte Spill 210; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %edx 211; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %eax 212; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %esi 213; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %ebx 214; X86-FAST-NEXT: andl $63, %ebx 215; X86-FAST-NEXT: movb $64, %cl 216; X86-FAST-NEXT: subb %bl, %cl 217; X86-FAST-NEXT: movl %eax, %edi 218; X86-FAST-NEXT: shll %cl, %edi 219; X86-FAST-NEXT: shldl %cl, %eax, %esi 220; X86-FAST-NEXT: testb $32, %cl 221; X86-FAST-NEXT: je .LBB4_2 222; X86-FAST-NEXT: # %bb.1: 223; X86-FAST-NEXT: movl %edi, %esi 224; X86-FAST-NEXT: xorl %edi, %edi 225; X86-FAST-NEXT: .LBB4_2: 226; X86-FAST-NEXT: movl %edx, %ebp 227; X86-FAST-NEXT: movl %ebx, %ecx 228; X86-FAST-NEXT: shrl %cl, %ebp 229; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %eax 230; X86-FAST-NEXT: shrdl %cl, %edx, %eax 231; X86-FAST-NEXT: testb $32, %bl 232; X86-FAST-NEXT: je .LBB4_4 233; X86-FAST-NEXT: # %bb.3: 234; X86-FAST-NEXT: movl %ebp, %eax 235; X86-FAST-NEXT: xorl %ebp, %ebp 236; X86-FAST-NEXT: .LBB4_4: 237; X86-FAST-NEXT: testl %ebx, %ebx 238; X86-FAST-NEXT: je .LBB4_6 239; X86-FAST-NEXT: # %bb.5: 240; X86-FAST-NEXT: orl %ebp, %esi 241; X86-FAST-NEXT: orl %eax, %edi 242; X86-FAST-NEXT: movl %edi, (%esp) # 4-byte Spill 243; X86-FAST-NEXT: movl %esi, %edx 244; X86-FAST-NEXT: .LBB4_6: 245; X86-FAST-NEXT: movl (%esp), %eax # 4-byte Reload 246; X86-FAST-NEXT: addl $4, %esp 247; X86-FAST-NEXT: popl %esi 248; X86-FAST-NEXT: popl %edi 249; X86-FAST-NEXT: popl %ebx 250; X86-FAST-NEXT: popl %ebp 251; X86-FAST-NEXT: retl 252; 253; X86-SLOW-LABEL: var_shift_i64: 254; X86-SLOW: # %bb.0: 255; X86-SLOW-NEXT: pushl %ebp 256; X86-SLOW-NEXT: pushl %ebx 257; X86-SLOW-NEXT: pushl %edi 258; X86-SLOW-NEXT: pushl %esi 259; X86-SLOW-NEXT: subl $8, %esp 260; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %eax 261; X86-SLOW-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 262; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %esi 263; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %edx 264; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %ebx 265; X86-SLOW-NEXT: andl $63, %ebx 266; X86-SLOW-NEXT: movb $64, %al 267; X86-SLOW-NEXT: subb %bl, %al 268; X86-SLOW-NEXT: movl %edx, (%esp) # 4-byte Spill 269; X86-SLOW-NEXT: movl %eax, %ecx 270; X86-SLOW-NEXT: shll %cl, %edx 271; X86-SLOW-NEXT: movb %al, %ch 272; X86-SLOW-NEXT: andb $31, %ch 273; X86-SLOW-NEXT: movb %ch, %cl 274; X86-SLOW-NEXT: negb %cl 275; X86-SLOW-NEXT: movl %esi, %edi 276; X86-SLOW-NEXT: shrl %cl, %edi 277; X86-SLOW-NEXT: testb %ch, %ch 278; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %ebp 279; X86-SLOW-NEXT: je .LBB4_2 280; X86-SLOW-NEXT: # %bb.1: 281; X86-SLOW-NEXT: orl %edi, %edx 282; X86-SLOW-NEXT: movl %edx, (%esp) # 4-byte Spill 283; X86-SLOW-NEXT: .LBB4_2: 284; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %ecx 285; X86-SLOW-NEXT: movl %ecx, %edx 286; X86-SLOW-NEXT: movl %ebx, %ecx 287; X86-SLOW-NEXT: shrl %cl, %edx 288; X86-SLOW-NEXT: movb %bl, %ah 289; X86-SLOW-NEXT: andb $31, %ah 290; X86-SLOW-NEXT: movb %ah, %cl 291; X86-SLOW-NEXT: negb %cl 292; X86-SLOW-NEXT: movl %ebp, %edi 293; X86-SLOW-NEXT: shll %cl, %edi 294; X86-SLOW-NEXT: testb %ah, %ah 295; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %ebp 296; X86-SLOW-NEXT: je .LBB4_4 297; X86-SLOW-NEXT: # %bb.3: 298; X86-SLOW-NEXT: orl %edx, %edi 299; X86-SLOW-NEXT: movl %edi, %ebp 300; X86-SLOW-NEXT: .LBB4_4: 301; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %edi 302; X86-SLOW-NEXT: movl %ebx, %ecx 303; X86-SLOW-NEXT: shrl %cl, %edi 304; X86-SLOW-NEXT: testb $32, %bl 305; X86-SLOW-NEXT: je .LBB4_6 306; X86-SLOW-NEXT: # %bb.5: 307; X86-SLOW-NEXT: movl %edi, %ebp 308; X86-SLOW-NEXT: xorl %edi, %edi 309; X86-SLOW-NEXT: .LBB4_6: 310; X86-SLOW-NEXT: movl %eax, %ecx 311; X86-SLOW-NEXT: shll %cl, %esi 312; X86-SLOW-NEXT: testb $32, %al 313; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %edx 314; X86-SLOW-NEXT: jne .LBB4_7 315; X86-SLOW-NEXT: # %bb.8: 316; X86-SLOW-NEXT: movl (%esp), %eax # 4-byte Reload 317; X86-SLOW-NEXT: testl %ebx, %ebx 318; X86-SLOW-NEXT: jne .LBB4_10 319; X86-SLOW-NEXT: jmp .LBB4_11 320; X86-SLOW-NEXT: .LBB4_7: 321; X86-SLOW-NEXT: movl %esi, %eax 322; X86-SLOW-NEXT: xorl %esi, %esi 323; X86-SLOW-NEXT: testl %ebx, %ebx 324; X86-SLOW-NEXT: je .LBB4_11 325; X86-SLOW-NEXT: .LBB4_10: 326; X86-SLOW-NEXT: orl %ebp, %esi 327; X86-SLOW-NEXT: orl %edi, %eax 328; X86-SLOW-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 329; X86-SLOW-NEXT: movl %eax, %edx 330; X86-SLOW-NEXT: .LBB4_11: 331; X86-SLOW-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 332; X86-SLOW-NEXT: addl $8, %esp 333; X86-SLOW-NEXT: popl %esi 334; X86-SLOW-NEXT: popl %edi 335; X86-SLOW-NEXT: popl %ebx 336; X86-SLOW-NEXT: popl %ebp 337; X86-SLOW-NEXT: retl 338; 339; X64-FAST-LABEL: var_shift_i64: 340; X64-FAST: # %bb.0: 341; X64-FAST-NEXT: movq %rdx, %rcx 342; X64-FAST-NEXT: movq %rsi, %rax 343; X64-FAST-NEXT: # kill: def $cl killed $cl killed $rcx 344; X64-FAST-NEXT: shrdq %cl, %rdi, %rax 345; X64-FAST-NEXT: retq 346; 347; X64-SLOW-LABEL: var_shift_i64: 348; X64-SLOW: # %bb.0: 349; X64-SLOW-NEXT: movq %rdi, %rax 350; X64-SLOW-NEXT: movq %rsi, %rdi 351; X64-SLOW-NEXT: movl %edx, %ecx 352; X64-SLOW-NEXT: shrq %cl, %rdi 353; X64-SLOW-NEXT: andb $63, %dl 354; X64-SLOW-NEXT: movl %edx, %ecx 355; X64-SLOW-NEXT: negb %cl 356; X64-SLOW-NEXT: shlq %cl, %rax 357; X64-SLOW-NEXT: orq %rdi, %rax 358; X64-SLOW-NEXT: testb %dl, %dl 359; X64-SLOW-NEXT: cmoveq %rsi, %rax 360; X64-SLOW-NEXT: retq 361 %tmp = tail call i64 @llvm.fshr.i64(i64 %x, i64 %y, i64 %z) 362 ret i64 %tmp 363} 364 365; 366; Const Funnel Shift 367; 368 369define i8 @const_shift_i8(i8 %x, i8 %y) nounwind { 370; X86-LABEL: const_shift_i8: 371; X86: # %bb.0: 372; X86-NEXT: movb {{[0-9]+}}(%esp), %al 373; X86-NEXT: movb {{[0-9]+}}(%esp), %cl 374; X86-NEXT: shrb $7, %cl 375; X86-NEXT: addb %al, %al 376; X86-NEXT: orb %cl, %al 377; X86-NEXT: retl 378; 379; X64-LABEL: const_shift_i8: 380; X64: # %bb.0: 381; X64-NEXT: # kill: def $edi killed $edi def $rdi 382; X64-NEXT: shrb $7, %sil 383; X64-NEXT: leal (%rdi,%rdi), %eax 384; X64-NEXT: orb %sil, %al 385; X64-NEXT: # kill: def $al killed $al killed $eax 386; X64-NEXT: retq 387 %tmp = tail call i8 @llvm.fshr.i8(i8 %x, i8 %y, i8 7) 388 ret i8 %tmp 389} 390 391define i16 @const_shift_i16(i16 %x, i16 %y) nounwind { 392; X86-FAST-LABEL: const_shift_i16: 393; X86-FAST: # %bb.0: 394; X86-FAST-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 395; X86-FAST-NEXT: movzwl {{[0-9]+}}(%esp), %eax 396; X86-FAST-NEXT: shrdw $7, %cx, %ax 397; X86-FAST-NEXT: retl 398; 399; X86-SLOW-LABEL: const_shift_i16: 400; X86-SLOW: # %bb.0: 401; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %eax 402; X86-SLOW-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 403; X86-SLOW-NEXT: shrl $7, %ecx 404; X86-SLOW-NEXT: shll $9, %eax 405; X86-SLOW-NEXT: orl %ecx, %eax 406; X86-SLOW-NEXT: # kill: def $ax killed $ax killed $eax 407; X86-SLOW-NEXT: retl 408; 409; X64-FAST-LABEL: const_shift_i16: 410; X64-FAST: # %bb.0: 411; X64-FAST-NEXT: movl %esi, %eax 412; X64-FAST-NEXT: shrdw $7, %di, %ax 413; X64-FAST-NEXT: # kill: def $ax killed $ax killed $eax 414; X64-FAST-NEXT: retq 415; 416; X64-SLOW-LABEL: const_shift_i16: 417; X64-SLOW: # %bb.0: 418; X64-SLOW-NEXT: movzwl %si, %eax 419; X64-SLOW-NEXT: shll $9, %edi 420; X64-SLOW-NEXT: shrl $7, %eax 421; X64-SLOW-NEXT: orl %edi, %eax 422; X64-SLOW-NEXT: # kill: def $ax killed $ax killed $eax 423; X64-SLOW-NEXT: retq 424 %tmp = tail call i16 @llvm.fshr.i16(i16 %x, i16 %y, i16 7) 425 ret i16 %tmp 426} 427 428define i32 @const_shift_i32(i32 %x, i32 %y) nounwind { 429; X86-FAST-LABEL: const_shift_i32: 430; X86-FAST: # %bb.0: 431; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %ecx 432; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %eax 433; X86-FAST-NEXT: shrdl $7, %ecx, %eax 434; X86-FAST-NEXT: retl 435; 436; X86-SLOW-LABEL: const_shift_i32: 437; X86-SLOW: # %bb.0: 438; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %eax 439; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %ecx 440; X86-SLOW-NEXT: shrl $7, %ecx 441; X86-SLOW-NEXT: shll $25, %eax 442; X86-SLOW-NEXT: orl %ecx, %eax 443; X86-SLOW-NEXT: retl 444; 445; X64-FAST-LABEL: const_shift_i32: 446; X64-FAST: # %bb.0: 447; X64-FAST-NEXT: movl %edi, %eax 448; X64-FAST-NEXT: shldl $25, %esi, %eax 449; X64-FAST-NEXT: retq 450; 451; X64-SLOW-LABEL: const_shift_i32: 452; X64-SLOW: # %bb.0: 453; X64-SLOW-NEXT: # kill: def $esi killed $esi def $rsi 454; X64-SLOW-NEXT: # kill: def $edi killed $edi def $rdi 455; X64-SLOW-NEXT: shrl $7, %esi 456; X64-SLOW-NEXT: shll $25, %edi 457; X64-SLOW-NEXT: leal (%rdi,%rsi), %eax 458; X64-SLOW-NEXT: retq 459 %tmp = tail call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 7) 460 ret i32 %tmp 461} 462 463define i64 @const_shift_i64(i64 %x, i64 %y) nounwind { 464; X86-FAST-LABEL: const_shift_i64: 465; X86-FAST: # %bb.0: 466; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %eax 467; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %ecx 468; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %edx 469; X86-FAST-NEXT: shldl $25, %ecx, %edx 470; X86-FAST-NEXT: shrdl $7, %ecx, %eax 471; X86-FAST-NEXT: retl 472; 473; X86-SLOW-LABEL: const_shift_i64: 474; X86-SLOW: # %bb.0: 475; X86-SLOW-NEXT: pushl %esi 476; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %edx 477; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %eax 478; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %ecx 479; X86-SLOW-NEXT: movl %ecx, %esi 480; X86-SLOW-NEXT: shll $25, %esi 481; X86-SLOW-NEXT: shrl $7, %eax 482; X86-SLOW-NEXT: orl %esi, %eax 483; X86-SLOW-NEXT: shrl $7, %ecx 484; X86-SLOW-NEXT: shll $25, %edx 485; X86-SLOW-NEXT: orl %ecx, %edx 486; X86-SLOW-NEXT: popl %esi 487; X86-SLOW-NEXT: retl 488; 489; X64-FAST-LABEL: const_shift_i64: 490; X64-FAST: # %bb.0: 491; X64-FAST-NEXT: movq %rdi, %rax 492; X64-FAST-NEXT: shldq $57, %rsi, %rax 493; X64-FAST-NEXT: retq 494; 495; X64-SLOW-LABEL: const_shift_i64: 496; X64-SLOW: # %bb.0: 497; X64-SLOW-NEXT: shrq $7, %rsi 498; X64-SLOW-NEXT: shlq $57, %rdi 499; X64-SLOW-NEXT: leaq (%rdi,%rsi), %rax 500; X64-SLOW-NEXT: retq 501 %tmp = tail call i64 @llvm.fshr.i64(i64 %x, i64 %y, i64 7) 502 ret i64 %tmp 503} 504