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 i64 @var_shift_i64(i64 %x, i64 %y, i64 %z) nounwind { 181; X86-FAST-LABEL: var_shift_i64: 182; X86-FAST: # %bb.0: 183; X86-FAST-NEXT: pushl %ebp 184; X86-FAST-NEXT: pushl %ebx 185; X86-FAST-NEXT: pushl %edi 186; X86-FAST-NEXT: pushl %esi 187; X86-FAST-NEXT: pushl %eax 188; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %eax 189; X86-FAST-NEXT: movl %eax, (%esp) # 4-byte Spill 190; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %edx 191; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %eax 192; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %esi 193; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %ebx 194; X86-FAST-NEXT: andl $63, %ebx 195; X86-FAST-NEXT: movb $64, %cl 196; X86-FAST-NEXT: subb %bl, %cl 197; X86-FAST-NEXT: movl %eax, %edi 198; X86-FAST-NEXT: shll %cl, %edi 199; X86-FAST-NEXT: shldl %cl, %eax, %esi 200; X86-FAST-NEXT: testb $32, %cl 201; X86-FAST-NEXT: je .LBB3_2 202; X86-FAST-NEXT: # %bb.1: 203; X86-FAST-NEXT: movl %edi, %esi 204; X86-FAST-NEXT: xorl %edi, %edi 205; X86-FAST-NEXT: .LBB3_2: 206; X86-FAST-NEXT: movl %edx, %ebp 207; X86-FAST-NEXT: movl %ebx, %ecx 208; X86-FAST-NEXT: shrl %cl, %ebp 209; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %eax 210; X86-FAST-NEXT: shrdl %cl, %edx, %eax 211; X86-FAST-NEXT: testb $32, %bl 212; X86-FAST-NEXT: je .LBB3_4 213; X86-FAST-NEXT: # %bb.3: 214; X86-FAST-NEXT: movl %ebp, %eax 215; X86-FAST-NEXT: xorl %ebp, %ebp 216; X86-FAST-NEXT: .LBB3_4: 217; X86-FAST-NEXT: testl %ebx, %ebx 218; X86-FAST-NEXT: je .LBB3_6 219; X86-FAST-NEXT: # %bb.5: 220; X86-FAST-NEXT: orl %ebp, %esi 221; X86-FAST-NEXT: orl %eax, %edi 222; X86-FAST-NEXT: movl %edi, (%esp) # 4-byte Spill 223; X86-FAST-NEXT: movl %esi, %edx 224; X86-FAST-NEXT: .LBB3_6: 225; X86-FAST-NEXT: movl (%esp), %eax # 4-byte Reload 226; X86-FAST-NEXT: addl $4, %esp 227; X86-FAST-NEXT: popl %esi 228; X86-FAST-NEXT: popl %edi 229; X86-FAST-NEXT: popl %ebx 230; X86-FAST-NEXT: popl %ebp 231; X86-FAST-NEXT: retl 232; 233; X86-SLOW-LABEL: var_shift_i64: 234; X86-SLOW: # %bb.0: 235; X86-SLOW-NEXT: pushl %ebp 236; X86-SLOW-NEXT: pushl %ebx 237; X86-SLOW-NEXT: pushl %edi 238; X86-SLOW-NEXT: pushl %esi 239; X86-SLOW-NEXT: subl $8, %esp 240; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %eax 241; X86-SLOW-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 242; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %esi 243; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %edx 244; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %ebx 245; X86-SLOW-NEXT: andl $63, %ebx 246; X86-SLOW-NEXT: movb $64, %al 247; X86-SLOW-NEXT: subb %bl, %al 248; X86-SLOW-NEXT: movl %edx, (%esp) # 4-byte Spill 249; X86-SLOW-NEXT: movl %eax, %ecx 250; X86-SLOW-NEXT: shll %cl, %edx 251; X86-SLOW-NEXT: movb %al, %ch 252; X86-SLOW-NEXT: andb $31, %ch 253; X86-SLOW-NEXT: movb %ch, %cl 254; X86-SLOW-NEXT: negb %cl 255; X86-SLOW-NEXT: movl %esi, %edi 256; X86-SLOW-NEXT: shrl %cl, %edi 257; X86-SLOW-NEXT: testb %ch, %ch 258; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %ebp 259; X86-SLOW-NEXT: je .LBB3_2 260; X86-SLOW-NEXT: # %bb.1: 261; X86-SLOW-NEXT: orl %edi, %edx 262; X86-SLOW-NEXT: movl %edx, (%esp) # 4-byte Spill 263; X86-SLOW-NEXT: .LBB3_2: 264; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %ecx 265; X86-SLOW-NEXT: movl %ecx, %edx 266; X86-SLOW-NEXT: movl %ebx, %ecx 267; X86-SLOW-NEXT: shrl %cl, %edx 268; X86-SLOW-NEXT: movb %bl, %ah 269; X86-SLOW-NEXT: andb $31, %ah 270; X86-SLOW-NEXT: movb %ah, %cl 271; X86-SLOW-NEXT: negb %cl 272; X86-SLOW-NEXT: movl %ebp, %edi 273; X86-SLOW-NEXT: shll %cl, %edi 274; X86-SLOW-NEXT: testb %ah, %ah 275; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %ebp 276; X86-SLOW-NEXT: je .LBB3_4 277; X86-SLOW-NEXT: # %bb.3: 278; X86-SLOW-NEXT: orl %edx, %edi 279; X86-SLOW-NEXT: movl %edi, %ebp 280; X86-SLOW-NEXT: .LBB3_4: 281; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %edi 282; X86-SLOW-NEXT: movl %ebx, %ecx 283; X86-SLOW-NEXT: shrl %cl, %edi 284; X86-SLOW-NEXT: testb $32, %bl 285; X86-SLOW-NEXT: je .LBB3_6 286; X86-SLOW-NEXT: # %bb.5: 287; X86-SLOW-NEXT: movl %edi, %ebp 288; X86-SLOW-NEXT: xorl %edi, %edi 289; X86-SLOW-NEXT: .LBB3_6: 290; X86-SLOW-NEXT: movl %eax, %ecx 291; X86-SLOW-NEXT: shll %cl, %esi 292; X86-SLOW-NEXT: testb $32, %al 293; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %edx 294; X86-SLOW-NEXT: jne .LBB3_7 295; X86-SLOW-NEXT: # %bb.8: 296; X86-SLOW-NEXT: movl (%esp), %eax # 4-byte Reload 297; X86-SLOW-NEXT: testl %ebx, %ebx 298; X86-SLOW-NEXT: jne .LBB3_10 299; X86-SLOW-NEXT: jmp .LBB3_11 300; X86-SLOW-NEXT: .LBB3_7: 301; X86-SLOW-NEXT: movl %esi, %eax 302; X86-SLOW-NEXT: xorl %esi, %esi 303; X86-SLOW-NEXT: testl %ebx, %ebx 304; X86-SLOW-NEXT: je .LBB3_11 305; X86-SLOW-NEXT: .LBB3_10: 306; X86-SLOW-NEXT: orl %ebp, %esi 307; X86-SLOW-NEXT: orl %edi, %eax 308; X86-SLOW-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 309; X86-SLOW-NEXT: movl %eax, %edx 310; X86-SLOW-NEXT: .LBB3_11: 311; X86-SLOW-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 312; X86-SLOW-NEXT: addl $8, %esp 313; X86-SLOW-NEXT: popl %esi 314; X86-SLOW-NEXT: popl %edi 315; X86-SLOW-NEXT: popl %ebx 316; X86-SLOW-NEXT: popl %ebp 317; X86-SLOW-NEXT: retl 318; 319; X64-FAST-LABEL: var_shift_i64: 320; X64-FAST: # %bb.0: 321; X64-FAST-NEXT: movq %rdx, %rcx 322; X64-FAST-NEXT: movq %rsi, %rax 323; X64-FAST-NEXT: # kill: def $cl killed $cl killed $rcx 324; X64-FAST-NEXT: shrdq %cl, %rdi, %rax 325; X64-FAST-NEXT: retq 326; 327; X64-SLOW-LABEL: var_shift_i64: 328; X64-SLOW: # %bb.0: 329; X64-SLOW-NEXT: movq %rdi, %rax 330; X64-SLOW-NEXT: movq %rsi, %rdi 331; X64-SLOW-NEXT: movl %edx, %ecx 332; X64-SLOW-NEXT: shrq %cl, %rdi 333; X64-SLOW-NEXT: andb $63, %dl 334; X64-SLOW-NEXT: movl %edx, %ecx 335; X64-SLOW-NEXT: negb %cl 336; X64-SLOW-NEXT: shlq %cl, %rax 337; X64-SLOW-NEXT: orq %rdi, %rax 338; X64-SLOW-NEXT: testb %dl, %dl 339; X64-SLOW-NEXT: cmoveq %rsi, %rax 340; X64-SLOW-NEXT: retq 341 %tmp = tail call i64 @llvm.fshr.i64(i64 %x, i64 %y, i64 %z) 342 ret i64 %tmp 343} 344 345; 346; Const Funnel Shift 347; 348 349define i8 @const_shift_i8(i8 %x, i8 %y) nounwind { 350; X86-LABEL: const_shift_i8: 351; X86: # %bb.0: 352; X86-NEXT: movb {{[0-9]+}}(%esp), %al 353; X86-NEXT: movb {{[0-9]+}}(%esp), %cl 354; X86-NEXT: shrb $7, %cl 355; X86-NEXT: addb %al, %al 356; X86-NEXT: orb %cl, %al 357; X86-NEXT: retl 358; 359; X64-LABEL: const_shift_i8: 360; X64: # %bb.0: 361; X64-NEXT: movl %edi, %eax 362; X64-NEXT: shrb $7, %sil 363; X64-NEXT: addb %al, %al 364; X64-NEXT: orb %sil, %al 365; X64-NEXT: # kill: def $al killed $al killed $eax 366; X64-NEXT: retq 367 %tmp = tail call i8 @llvm.fshr.i8(i8 %x, i8 %y, i8 7) 368 ret i8 %tmp 369} 370 371define i16 @const_shift_i16(i16 %x, i16 %y) nounwind { 372; X86-FAST-LABEL: const_shift_i16: 373; X86-FAST: # %bb.0: 374; X86-FAST-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 375; X86-FAST-NEXT: movzwl {{[0-9]+}}(%esp), %eax 376; X86-FAST-NEXT: shrdw $7, %cx, %ax 377; X86-FAST-NEXT: retl 378; 379; X86-SLOW-LABEL: const_shift_i16: 380; X86-SLOW: # %bb.0: 381; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %eax 382; X86-SLOW-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 383; X86-SLOW-NEXT: shrl $7, %ecx 384; X86-SLOW-NEXT: shll $9, %eax 385; X86-SLOW-NEXT: orl %ecx, %eax 386; X86-SLOW-NEXT: # kill: def $ax killed $ax killed $eax 387; X86-SLOW-NEXT: retl 388; 389; X64-FAST-LABEL: const_shift_i16: 390; X64-FAST: # %bb.0: 391; X64-FAST-NEXT: movl %esi, %eax 392; X64-FAST-NEXT: shrdw $7, %di, %ax 393; X64-FAST-NEXT: # kill: def $ax killed $ax killed $eax 394; X64-FAST-NEXT: retq 395; 396; X64-SLOW-LABEL: const_shift_i16: 397; X64-SLOW: # %bb.0: 398; X64-SLOW-NEXT: movzwl %si, %eax 399; X64-SLOW-NEXT: shll $9, %edi 400; X64-SLOW-NEXT: shrl $7, %eax 401; X64-SLOW-NEXT: orl %edi, %eax 402; X64-SLOW-NEXT: # kill: def $ax killed $ax killed $eax 403; X64-SLOW-NEXT: retq 404 %tmp = tail call i16 @llvm.fshr.i16(i16 %x, i16 %y, i16 7) 405 ret i16 %tmp 406} 407 408define i32 @const_shift_i32(i32 %x, i32 %y) nounwind { 409; X86-FAST-LABEL: const_shift_i32: 410; X86-FAST: # %bb.0: 411; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %ecx 412; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %eax 413; X86-FAST-NEXT: shrdl $7, %ecx, %eax 414; X86-FAST-NEXT: retl 415; 416; X86-SLOW-LABEL: const_shift_i32: 417; X86-SLOW: # %bb.0: 418; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %eax 419; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %ecx 420; X86-SLOW-NEXT: shrl $7, %ecx 421; X86-SLOW-NEXT: shll $25, %eax 422; X86-SLOW-NEXT: orl %ecx, %eax 423; X86-SLOW-NEXT: retl 424; 425; X64-FAST-LABEL: const_shift_i32: 426; X64-FAST: # %bb.0: 427; X64-FAST-NEXT: movl %edi, %eax 428; X64-FAST-NEXT: shldl $25, %esi, %eax 429; X64-FAST-NEXT: retq 430; 431; X64-SLOW-LABEL: const_shift_i32: 432; X64-SLOW: # %bb.0: 433; X64-SLOW-NEXT: # kill: def $esi killed $esi def $rsi 434; X64-SLOW-NEXT: # kill: def $edi killed $edi def $rdi 435; X64-SLOW-NEXT: shrl $7, %esi 436; X64-SLOW-NEXT: shll $25, %edi 437; X64-SLOW-NEXT: leal (%rdi,%rsi), %eax 438; X64-SLOW-NEXT: retq 439 %tmp = tail call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 7) 440 ret i32 %tmp 441} 442 443define i64 @const_shift_i64(i64 %x, i64 %y) nounwind { 444; X86-FAST-LABEL: const_shift_i64: 445; X86-FAST: # %bb.0: 446; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %eax 447; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %ecx 448; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %edx 449; X86-FAST-NEXT: shldl $25, %ecx, %edx 450; X86-FAST-NEXT: shrdl $7, %ecx, %eax 451; X86-FAST-NEXT: retl 452; 453; X86-SLOW-LABEL: const_shift_i64: 454; X86-SLOW: # %bb.0: 455; X86-SLOW-NEXT: pushl %esi 456; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %edx 457; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %eax 458; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %ecx 459; X86-SLOW-NEXT: movl %ecx, %esi 460; X86-SLOW-NEXT: shll $25, %esi 461; X86-SLOW-NEXT: shrl $7, %eax 462; X86-SLOW-NEXT: orl %esi, %eax 463; X86-SLOW-NEXT: shrl $7, %ecx 464; X86-SLOW-NEXT: shll $25, %edx 465; X86-SLOW-NEXT: orl %ecx, %edx 466; X86-SLOW-NEXT: popl %esi 467; X86-SLOW-NEXT: retl 468; 469; X64-FAST-LABEL: const_shift_i64: 470; X64-FAST: # %bb.0: 471; X64-FAST-NEXT: movq %rdi, %rax 472; X64-FAST-NEXT: shldq $57, %rsi, %rax 473; X64-FAST-NEXT: retq 474; 475; X64-SLOW-LABEL: const_shift_i64: 476; X64-SLOW: # %bb.0: 477; X64-SLOW-NEXT: shrq $7, %rsi 478; X64-SLOW-NEXT: shlq $57, %rdi 479; X64-SLOW-NEXT: leaq (%rdi,%rsi), %rax 480; X64-SLOW-NEXT: retq 481 %tmp = tail call i64 @llvm.fshr.i64(i64 %x, i64 %y, i64 7) 482 ret i64 %tmp 483} 484