Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -march=x86-64 -mcpu=corei7 | FileCheck %s
      2 
      3 ; Splat patterns below
      4 
      5 
      6 define <4 x i32> @shl4(<4 x i32> %A) nounwind {
      7 entry:
      8 ; CHECK:      shl4
      9 ; CHECK:      pslld
     10 ; CHECK-NEXT: pslld
     11   %B = shl <4 x i32> %A,  < i32 2, i32 2, i32 2, i32 2>
     12   %C = shl <4 x i32> %A,  < i32 1, i32 1, i32 1, i32 1>
     13   %K = xor <4 x i32> %B, %C
     14   ret <4 x i32> %K
     15 }
     16 
     17 define <4 x i32> @shr4(<4 x i32> %A) nounwind {
     18 entry:
     19 ; CHECK:      shr4
     20 ; CHECK:      psrld
     21 ; CHECK-NEXT: psrld
     22   %B = lshr <4 x i32> %A,  < i32 2, i32 2, i32 2, i32 2>
     23   %C = lshr <4 x i32> %A,  < i32 1, i32 1, i32 1, i32 1>
     24   %K = xor <4 x i32> %B, %C
     25   ret <4 x i32> %K
     26 }
     27 
     28 define <4 x i32> @sra4(<4 x i32> %A) nounwind {
     29 entry:
     30 ; CHECK:      sra4
     31 ; CHECK:      psrad
     32 ; CHECK-NEXT: psrad
     33   %B = ashr <4 x i32> %A,  < i32 2, i32 2, i32 2, i32 2>
     34   %C = ashr <4 x i32> %A,  < i32 1, i32 1, i32 1, i32 1>
     35   %K = xor <4 x i32> %B, %C
     36   ret <4 x i32> %K
     37 }
     38 
     39 define <2 x i64> @shl2(<2 x i64> %A) nounwind {
     40 entry:
     41 ; CHECK:      shl2
     42 ; CHECK:      psllq
     43 ; CHECK-NEXT: psllq
     44   %B = shl <2 x i64> %A,  < i64 2, i64 2>
     45   %C = shl <2 x i64> %A,  < i64 9, i64 9>
     46   %K = xor <2 x i64> %B, %C
     47   ret <2 x i64> %K
     48 }
     49 
     50 define <2 x i64> @shr2(<2 x i64> %A) nounwind {
     51 entry:
     52 ; CHECK:      shr2
     53 ; CHECK:      psrlq
     54 ; CHECK-NEXT: psrlq
     55   %B = lshr <2 x i64> %A,  < i64 8, i64 8>
     56   %C = lshr <2 x i64> %A,  < i64 1, i64 1>
     57   %K = xor <2 x i64> %B, %C
     58   ret <2 x i64> %K
     59 }
     60 
     61 
     62 define <8 x i16> @shl8(<8 x i16> %A) nounwind {
     63 entry:
     64 ; CHECK:      shl8
     65 ; CHECK:      psllw
     66 ; CHECK-NEXT: psllw
     67   %B = shl <8 x i16> %A,  < i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
     68   %C = shl <8 x i16> %A,  < i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
     69   %K = xor <8 x i16> %B, %C
     70   ret <8 x i16> %K
     71 }
     72 
     73 define <8 x i16> @shr8(<8 x i16> %A) nounwind {
     74 entry:
     75 ; CHECK:      shr8
     76 ; CHECK:      psrlw
     77 ; CHECK-NEXT: psrlw
     78   %B = lshr <8 x i16> %A,  < i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
     79   %C = lshr <8 x i16> %A,  < i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
     80   %K = xor <8 x i16> %B, %C
     81   ret <8 x i16> %K
     82 }
     83 
     84 define <8 x i16> @sra8(<8 x i16> %A) nounwind {
     85 entry:
     86 ; CHECK:      sra8
     87 ; CHECK:      psraw
     88 ; CHECK-NEXT: psraw
     89   %B = ashr <8 x i16> %A,  < i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
     90   %C = ashr <8 x i16> %A,  < i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
     91   %K = xor <8 x i16> %B, %C
     92   ret <8 x i16> %K
     93 }
     94 
     95 ; non splat test
     96 
     97 
     98 define <8 x i16> @sll8_nosplat(<8 x i16> %A) nounwind {
     99 entry:
    100 ; CHECK: sll8_nosplat
    101 ; CHECK-NOT: psll
    102 ; CHECK-NOT: psll
    103   %B = shl <8 x i16> %A,  < i16 1, i16 2, i16 3, i16 6, i16 2, i16 2, i16 2, i16 2>
    104   %C = shl <8 x i16> %A,  < i16 9, i16 7, i16 5, i16 1, i16 4, i16 1, i16 1, i16 1>
    105   %K = xor <8 x i16> %B, %C
    106   ret <8 x i16> %K
    107 }
    108 
    109 
    110 define <2 x i64> @shr2_nosplat(<2 x i64> %A) nounwind {
    111 entry:
    112 ; CHECK: shr2_nosplat
    113 ; CHECK-NOT:  psrlq
    114 ; CHECK-NOT:  psrlq
    115   %B = lshr <2 x i64> %A,  < i64 8, i64 1>
    116   %C = lshr <2 x i64> %A,  < i64 1, i64 0>
    117   %K = xor <2 x i64> %B, %C
    118   ret <2 x i64> %K
    119 }
    120 
    121 
    122 ; Other shifts
    123 
    124 define <2 x i32> @shl2_other(<2 x i32> %A) nounwind {
    125 entry:
    126 ; CHECK: shl2_other
    127 ; CHECK: psllq
    128   %B = shl <2 x i32> %A,  < i32 2, i32 2>
    129   %C = shl <2 x i32> %A,  < i32 9, i32 9>
    130   %K = xor <2 x i32> %B, %C
    131   ret <2 x i32> %K
    132 }
    133 
    134 define <2 x i32> @shr2_other(<2 x i32> %A) nounwind {
    135 entry:
    136 ; CHECK: shr2_other
    137 ; CHECK: psrlq
    138   %B = lshr <2 x i32> %A,  < i32 8, i32 8>
    139   %C = lshr <2 x i32> %A,  < i32 1, i32 1>
    140   %K = xor <2 x i32> %B, %C
    141   ret <2 x i32> %K
    142 }
    143