Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=bdver1 | FileCheck %s
      3 
      4 ; Verify that for the architectures that are known to have poor latency
      5 ; double precision shift instructions we generate alternative sequence
      6 ; of instructions with lower latencies instead of shrd instruction.
      7 
      8 ;uint64_t rshift1(uint64_t a, uint64_t b)
      9 ;{
     10 ;    return (a >> 1) | (b << 63);
     11 ;}
     12 
     13 define i64 @rshift1(i64 %a, i64 %b) nounwind readnone uwtable {
     14 ; CHECK-LABEL: rshift1:
     15 ; CHECK:       # %bb.0:
     16 ; CHECK-NEXT:    shrq %rdi
     17 ; CHECK-NEXT:    shlq $63, %rsi
     18 ; CHECK-NEXT:    leaq (%rsi,%rdi), %rax
     19 ; CHECK-NEXT:    retq
     20   %1 = lshr i64 %a, 1
     21   %2 = shl i64 %b, 63
     22   %3 = or i64 %2, %1
     23   ret i64 %3
     24 }
     25 
     26 ;uint64_t rshift2(uint64_t a, uint64_t b)
     27 ;{
     28 ;    return (a >> 2) | (b << 62);
     29 ;}
     30 
     31 define i64 @rshift2(i64 %a, i64 %b) nounwind readnone uwtable {
     32 ; CHECK-LABEL: rshift2:
     33 ; CHECK:       # %bb.0:
     34 ; CHECK-NEXT:    shrq $2, %rdi
     35 ; CHECK-NEXT:    shlq $62, %rsi
     36 ; CHECK-NEXT:    leaq (%rsi,%rdi), %rax
     37 ; CHECK-NEXT:    retq
     38   %1 = lshr i64 %a, 2
     39   %2 = shl i64 %b, 62
     40   %3 = or i64 %2, %1
     41   ret i64 %3
     42 }
     43 
     44 ;uint64_t rshift7(uint64_t a, uint64_t b)
     45 ;{
     46 ;    return (a >> 7) | (b << 57);
     47 ;}
     48 
     49 define i64 @rshift7(i64 %a, i64 %b) nounwind readnone uwtable {
     50 ; CHECK-LABEL: rshift7:
     51 ; CHECK:       # %bb.0:
     52 ; CHECK-NEXT:    shrq $7, %rdi
     53 ; CHECK-NEXT:    shlq $57, %rsi
     54 ; CHECK-NEXT:    leaq (%rsi,%rdi), %rax
     55 ; CHECK-NEXT:    retq
     56   %1 = lshr i64 %a, 7
     57   %2 = shl i64 %b, 57
     58   %3 = or i64 %2, %1
     59   ret i64 %3
     60 }
     61 
     62 ;uint64_t rshift63(uint64_t a, uint64_t b)
     63 ;{
     64 ;    return (a >> 63) | (b << 1);
     65 ;}
     66 
     67 define i64 @rshift63(i64 %a, i64 %b) nounwind readnone uwtable {
     68 ; CHECK-LABEL: rshift63:
     69 ; CHECK:       # %bb.0:
     70 ; CHECK-NEXT:    shrq $63, %rdi
     71 ; CHECK-NEXT:    leaq (%rdi,%rsi,2), %rax
     72 ; CHECK-NEXT:    retq
     73   %1 = lshr i64 %a, 63
     74   %2 = shl i64 %b, 1
     75   %3 = or i64 %2, %1
     76   ret i64 %3
     77 }
     78