| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc < %s -mtriple=x86_64-unknown -mcpu=bdver1 | FileCheck %s |
| |
| ; clang -Oz -c test1.cpp -emit-llvm -S -o |
| ; Verify that we generate shld insruction when we are optimizing for size, |
| ; even for X86_64 processors that are known to have poor latency double |
| ; precision shift instructions. |
| ; uint64_t lshift10(uint64_t a, uint64_t b) |
| ; { |
| ; return (a << 10) | (b >> 54); |
| ; } |
| |
| ; Function Attrs: minsize nounwind readnone uwtable |
| define i64 @_Z8lshift10mm(i64 %a, i64 %b) #0 { |
| ; CHECK-LABEL: _Z8lshift10mm: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: shldq $10, %rsi, %rdi |
| ; CHECK-NEXT: movq %rdi, %rax |
| ; CHECK-NEXT: retq |
| entry: |
| %shl = shl i64 %a, 10 |
| %shr = lshr i64 %b, 54 |
| %or = or i64 %shr, %shl |
| ret i64 %or |
| } |
| |
| attributes #0 = { minsize nounwind readnone uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } |
| |
| |
| ; clang -Os -c test2.cpp -emit-llvm -S |
| ; Verify that we generate shld insruction when we are optimizing for size, |
| ; even for X86_64 processors that are known to have poor latency double |
| ; precision shift instructions. |
| ; uint64_t lshift11(uint64_t a, uint64_t b) |
| ; { |
| ; return (a << 11) | (b >> 53); |
| ; } |
| |
| ; Function Attrs: nounwind optsize readnone uwtable |
| define i64 @_Z8lshift11mm(i64 %a, i64 %b) #1 { |
| ; CHECK-LABEL: _Z8lshift11mm: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: shldq $11, %rsi, %rdi |
| ; CHECK-NEXT: movq %rdi, %rax |
| ; CHECK-NEXT: retq |
| entry: |
| %shl = shl i64 %a, 11 |
| %shr = lshr i64 %b, 53 |
| %or = or i64 %shr, %shl |
| ret i64 %or |
| } |
| |
| attributes #1 = { nounwind optsize readnone uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } |
| |
| ; clang -O2 -c test2.cpp -emit-llvm -S |
| ; Verify that we do not generate shld insruction when we are not optimizing |
| ; for size for X86_64 processors that are known to have poor latency double |
| ; precision shift instructions. |
| ; uint64_t lshift12(uint64_t a, uint64_t b) |
| ; { |
| ; return (a << 12) | (b >> 52); |
| ; } |
| |
| ; Function Attrs: nounwind optsize readnone uwtable |
| define i64 @_Z8lshift12mm(i64 %a, i64 %b) #2 { |
| ; CHECK-LABEL: _Z8lshift12mm: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: shlq $12, %rdi |
| ; CHECK-NEXT: shrq $52, %rsi |
| ; CHECK-NEXT: leaq (%rsi,%rdi), %rax |
| ; CHECK-NEXT: retq |
| entry: |
| %shl = shl i64 %a, 12 |
| %shr = lshr i64 %b, 52 |
| %or = or i64 %shr, %shl |
| ret i64 %or |
| } |
| |
| attributes #2= { nounwind readnone uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } |
| |