152 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=X643 4declare i64 @llvm.fshl.i64(i64, i64, i64) nounwind readnone5declare i64 @llvm.fshr.i64(i64, i64, i64) nounwind readnone6 7define i64 @hoist_fshl_from_or(i64 %a, i64 %b, i64 %c, i64 %d, i64 %s) nounwind {8; X64-LABEL: hoist_fshl_from_or:9; X64: # %bb.0:10; X64-NEXT: movq %rdi, %rax11; X64-NEXT: orq %rcx, %rsi12; X64-NEXT: orq %rdx, %rax13; X64-NEXT: movl %r8d, %ecx14; X64-NEXT: shldq %cl, %rsi, %rax15; X64-NEXT: retq16 %fshl.0 = call i64 @llvm.fshl.i64(i64 %a, i64 %b, i64 %s)17 %fshl.1 = call i64 @llvm.fshl.i64(i64 %c, i64 %d, i64 %s)18 %res = or i64 %fshl.0, %fshl.119 ret i64 %res20}21 22define i64 @hoist_fshl_from_and(i64 %a, i64 %b, i64 %c, i64 %d, i64 %s) nounwind {23; X64-LABEL: hoist_fshl_from_and:24; X64: # %bb.0:25; X64-NEXT: movq %rdi, %rax26; X64-NEXT: andq %rcx, %rsi27; X64-NEXT: andq %rdx, %rax28; X64-NEXT: movl %r8d, %ecx29; X64-NEXT: shldq %cl, %rsi, %rax30; X64-NEXT: retq31 %fshl.0 = call i64 @llvm.fshl.i64(i64 %a, i64 %b, i64 %s)32 %fshl.1 = call i64 @llvm.fshl.i64(i64 %c, i64 %d, i64 %s)33 %res = and i64 %fshl.0, %fshl.134 ret i64 %res35}36 37define i64 @hoist_fshl_from_xor(i64 %a, i64 %b, i64 %c, i64 %d, i64 %s) nounwind {38; X64-LABEL: hoist_fshl_from_xor:39; X64: # %bb.0:40; X64-NEXT: movq %rdi, %rax41; X64-NEXT: xorq %rcx, %rsi42; X64-NEXT: xorq %rdx, %rax43; X64-NEXT: movl %r8d, %ecx44; X64-NEXT: shldq %cl, %rsi, %rax45; X64-NEXT: retq46 %fshl.0 = call i64 @llvm.fshl.i64(i64 %a, i64 %b, i64 %s)47 %fshl.1 = call i64 @llvm.fshl.i64(i64 %c, i64 %d, i64 %s)48 %res = xor i64 %fshl.0, %fshl.149 ret i64 %res50}51 52define i64 @fshl_or_with_different_shift_value(i64 %a, i64 %b, i64 %c, i64 %d) nounwind {53; X64-LABEL: fshl_or_with_different_shift_value:54; X64: # %bb.0:55; X64-NEXT: movq %rdx, %rax56; X64-NEXT: shldq $12, %rsi, %rdi57; X64-NEXT: shldq $13, %rcx, %rax58; X64-NEXT: orq %rdi, %rax59; X64-NEXT: retq60 %fshl.0 = call i64 @llvm.fshl.i64(i64 %a, i64 %b, i64 12)61 %fshl.1 = call i64 @llvm.fshl.i64(i64 %c, i64 %d, i64 13)62 %res = or i64 %fshl.0, %fshl.163 ret i64 %res64}65 66define i64 @hoist_fshl_from_or_const_shift(i64 %a, i64 %b, i64 %c, i64 %d) nounwind {67; X64-LABEL: hoist_fshl_from_or_const_shift:68; X64: # %bb.0:69; X64-NEXT: movq %rdi, %rax70; X64-NEXT: orq %rcx, %rsi71; X64-NEXT: orq %rdx, %rax72; X64-NEXT: shldq $15, %rsi, %rax73; X64-NEXT: retq74 %fshl.0 = call i64 @llvm.fshl.i64(i64 %a, i64 %b, i64 15)75 %fshl.1 = call i64 @llvm.fshl.i64(i64 %c, i64 %d, i64 15)76 %res = or i64 %fshl.0, %fshl.177 ret i64 %res78}79 80define i64 @hoist_fshr_from_or(i64 %a, i64 %b, i64 %c, i64 %d, i64 %s) nounwind {81; X64-LABEL: hoist_fshr_from_or:82; X64: # %bb.0:83; X64-NEXT: movq %rsi, %rax84; X64-NEXT: orq %rdx, %rdi85; X64-NEXT: orq %rcx, %rax86; X64-NEXT: movl %r8d, %ecx87; X64-NEXT: shrdq %cl, %rdi, %rax88; X64-NEXT: retq89 %fshr.0 = call i64 @llvm.fshr.i64(i64 %a, i64 %b, i64 %s)90 %fshr.1 = call i64 @llvm.fshr.i64(i64 %c, i64 %d, i64 %s)91 %res = or i64 %fshr.0, %fshr.192 ret i64 %res93}94 95define i64 @hoist_fshr_from_and(i64 %a, i64 %b, i64 %c, i64 %d, i64 %s) nounwind {96; X64-LABEL: hoist_fshr_from_and:97; X64: # %bb.0:98; X64-NEXT: movq %rsi, %rax99; X64-NEXT: andq %rdx, %rdi100; X64-NEXT: andq %rcx, %rax101; X64-NEXT: movl %r8d, %ecx102; X64-NEXT: shrdq %cl, %rdi, %rax103; X64-NEXT: retq104 %fshr.0 = call i64 @llvm.fshr.i64(i64 %a, i64 %b, i64 %s)105 %fshr.1 = call i64 @llvm.fshr.i64(i64 %c, i64 %d, i64 %s)106 %res = and i64 %fshr.0, %fshr.1107 ret i64 %res108}109 110define i64 @hoist_fshr_from_xor(i64 %a, i64 %b, i64 %c, i64 %d, i64 %s) nounwind {111; X64-LABEL: hoist_fshr_from_xor:112; X64: # %bb.0:113; X64-NEXT: movq %rsi, %rax114; X64-NEXT: xorq %rdx, %rdi115; X64-NEXT: xorq %rcx, %rax116; X64-NEXT: movl %r8d, %ecx117; X64-NEXT: shrdq %cl, %rdi, %rax118; X64-NEXT: retq119 %fshr.0 = call i64 @llvm.fshr.i64(i64 %a, i64 %b, i64 %s)120 %fshr.1 = call i64 @llvm.fshr.i64(i64 %c, i64 %d, i64 %s)121 %res = xor i64 %fshr.0, %fshr.1122 ret i64 %res123}124 125define i64 @fshr_or_with_different_shift_value(i64 %a, i64 %b, i64 %c, i64 %d) nounwind {126; X64-LABEL: fshr_or_with_different_shift_value:127; X64: # %bb.0:128; X64-NEXT: movq %rdx, %rax129; X64-NEXT: shldq $52, %rsi, %rdi130; X64-NEXT: shldq $51, %rcx, %rax131; X64-NEXT: orq %rdi, %rax132; X64-NEXT: retq133 %fshr.0 = call i64 @llvm.fshr.i64(i64 %a, i64 %b, i64 12)134 %fshr.1 = call i64 @llvm.fshr.i64(i64 %c, i64 %d, i64 13)135 %res = or i64 %fshr.0, %fshr.1136 ret i64 %res137}138 139define i64 @hoist_fshr_from_or_const_shift(i64 %a, i64 %b, i64 %c, i64 %d) nounwind {140; X64-LABEL: hoist_fshr_from_or_const_shift:141; X64: # %bb.0:142; X64-NEXT: movq %rdi, %rax143; X64-NEXT: orq %rcx, %rsi144; X64-NEXT: orl %edx, %eax145; X64-NEXT: shldq $49, %rsi, %rax146; X64-NEXT: retq147 %fshr.0 = call i64 @llvm.fshr.i64(i64 %a, i64 %b, i64 15)148 %fshr.1 = call i64 @llvm.fshr.i64(i64 %c, i64 %d, i64 15)149 %res = or i64 %fshr.0, %fshr.1150 ret i64 %res151}152