Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -mattr=+avx | FileCheck %s
      2 
      3 ; PR11102
      4 define <4 x float> @test1(<4 x float> %a) nounwind {
      5   %b = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 2, i32 5, i32 undef, i32 undef>
      6   ret <4 x float> %b
      7 ; CHECK: test1:
      8 ; CHECK: vshufps
      9 ; CHECK: vpermilps
     10 }
     11 
     12 ; rdar://10538417
     13 define <3 x i64> @test2(<2 x i64> %v) nounwind readnone {
     14 ; CHECK: test2:
     15 ; CHECK: vinsertf128
     16   %1 = shufflevector <2 x i64> %v, <2 x i64> %v, <3 x i32> <i32 0, i32 1, i32 undef>
     17   %2 = shufflevector <3 x i64> zeroinitializer, <3 x i64> %1, <3 x i32> <i32 3, i32 4, i32 2>
     18   ret <3 x i64> %2
     19 ; CHECK: ret
     20 }
     21 
     22 define <4 x i64> @test3(<4 x i64> %a, <4 x i64> %b) nounwind {
     23   %c = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 5, i32 2, i32 undef>
     24   ret <4 x i64> %c
     25 ; CHECK: test3:
     26 ; CHECK: vperm2f128
     27 ; CHECK: ret
     28 }
     29 
     30 define <8 x float> @test4(float %a) nounwind {
     31   %b = insertelement <8 x float> zeroinitializer, float %a, i32 0
     32   ret <8 x float> %b
     33 ; CHECK: test4:
     34 ; CHECK: vinsertf128
     35 }
     36 
     37 ; rdar://10594409
     38 define <8 x float> @test5(float* nocapture %f) nounwind uwtable readonly ssp {
     39 entry:
     40   %0 = bitcast float* %f to <4 x float>*
     41   %1 = load <4 x float>* %0, align 16
     42 ; CHECK: test5
     43 ; CHECK: vmovaps
     44 ; CHECK-NOT: vxorps
     45 ; CHECK-NOT: vinsertf128
     46   %shuffle.i = shufflevector <4 x float> %1, <4 x float> <float 0.000000e+00, float undef, float undef, float undef>, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 4, i32 4, i32 4>
     47   ret <8 x float> %shuffle.i
     48 }
     49 
     50 define <4 x double> @test6(double* nocapture %d) nounwind uwtable readonly ssp {
     51 entry:
     52   %0 = bitcast double* %d to <2 x double>*
     53   %1 = load <2 x double>* %0, align 16
     54 ; CHECK: test6
     55 ; CHECK: vmovaps
     56 ; CHECK-NOT: vxorps
     57 ; CHECK-NOT: vinsertf128
     58   %shuffle.i = shufflevector <2 x double> %1, <2 x double> <double 0.000000e+00, double undef>, <4 x i32> <i32 0, i32 1, i32 2, i32 2>
     59   ret <4 x double> %shuffle.i
     60 }
     61 
     62 define <16 x i16> @test7(<4 x i16> %a) nounwind {
     63 ; CHECK: test7
     64   %b = shufflevector <4 x i16> %a, <4 x i16> undef, <16 x i32> <i32 1, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
     65 ; CHECK: ret
     66   ret <16 x i16> %b
     67 }
     68 
     69 ; CHECK: test8
     70 define void @test8() {
     71 entry:
     72   %0 = load <16 x i64> addrspace(1)* null, align 128
     73   %1 = shufflevector <16 x i64> <i64 undef, i64 undef, i64 0, i64 undef, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 undef, i64 0, i64 undef, i64 undef, i64 undef, i64 undef>, <16 x i64> %0, <16 x i32> <i32 17, i32 18, i32 2, i32 undef, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 undef, i32 11, i32 undef, i32 undef, i32 undef, i32 26>
     74   %2 = shufflevector <16 x i64> %1, <16 x i64> %0, <16 x i32> <i32 0, i32 1, i32 2, i32 30, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 undef, i32 11, i32 undef, i32 22, i32 20, i32 15>
     75   store <16 x i64> %2, <16 x i64> addrspace(1)* undef, align 128
     76 ; CHECK: ret
     77   ret void
     78 }
     79 
     80 ; Extract a value from a shufflevector..
     81 define i32 @test9(<4 x i32> %a) nounwind {
     82 ; CHECK: test9
     83 ; CHECK: vpextrd
     84   %b = shufflevector <4 x i32> %a, <4 x i32> undef, <8 x i32> <i32 1, i32 1, i32 2, i32 2, i32 3, i32 3, i32 undef, i32 4> 
     85   %r = extractelement <8 x i32> %b, i32 2
     86 ; CHECK: ret
     87   ret i32 %r
     88 }
     89 
     90 ; Extract a value which is the result of an undef mask.
     91 define i32 @test10(<4 x i32> %a) nounwind {
     92 ; CHECK: @test10
     93 ; CHECK-NEXT: #
     94 ; CHECK-NEXT: ret
     95   %b = shufflevector <4 x i32> %a, <4 x i32> undef, <8 x i32> <i32 1, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
     96   %r = extractelement <8 x i32> %b, i32 2
     97   ret i32 %r
     98 }
     99 
    100 define <4 x float> @test11(<4 x float> %a) nounwind  {
    101 ; check: test11
    102 ; check: vpermilps $27
    103   %tmp1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
    104   ret <4 x float> %tmp1
    105 }
    106 
    107 define <4 x float> @test12(<4 x float>* %a) nounwind  {
    108 ; CHECK: test12
    109 ; CHECK: vpermilps $27, (
    110   %tmp0 = load <4 x float>* %a
    111   %tmp1 = shufflevector <4 x float> %tmp0, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
    112   ret <4 x float> %tmp1
    113 }
    114 
    115 define <4 x i32> @test13(<4 x i32> %a) nounwind  {
    116 ; check: test13
    117 ; check: vpshufd $27
    118   %tmp1 = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
    119   ret <4 x i32> %tmp1
    120 }
    121 
    122 define <4 x i32> @test14(<4 x i32>* %a) nounwind  {
    123 ; CHECK: test14
    124 ; CHECK: vpshufd $27, (
    125   %tmp0 = load <4 x i32>* %a
    126   %tmp1 = shufflevector <4 x i32> %tmp0, <4 x i32> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
    127   ret <4 x i32> %tmp1
    128 }
    129 
    130 ; CHECK: test15
    131 ; CHECK: vpshufd $8
    132 ; CHECK: ret
    133 define <4 x i32> @test15(<2 x i32>%x) nounwind readnone {
    134   %x1 = shufflevector <2 x i32> %x, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
    135   ret <4 x i32>%x1
    136 }
    137 
    138 ; rdar://10974078
    139 define <8 x float> @test16(float* nocapture %f) nounwind uwtable readonly ssp {
    140 entry:
    141   %0 = bitcast float* %f to <4 x float>*
    142   %1 = load <4 x float>* %0, align 8
    143 ; CHECK: test16
    144 ; CHECK: vmovups
    145 ; CHECK-NOT: vxorps
    146 ; CHECK-NOT: vinsertf128
    147   %shuffle.i = shufflevector <4 x float> %1, <4 x float> <float 0.000000e+00, float undef, float undef, float undef>, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 4, i32 4, i32 4>
    148   ret <8 x float> %shuffle.i
    149 }
    150 
    151 ; PR12413
    152 ; CHECK: vpshufb
    153 ; CHECK: vpshufb
    154 ; CHECK: vpshufb
    155 ; CHECK: vpshufb
    156 define <32 x i8> @shuf(<32 x i8> %inval1, <32 x i8> %inval2) {
    157 entry:
    158  %0 = shufflevector <32 x i8> %inval1, <32 x i8> %inval2, <32 x i32> <i32 0,
    159 i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32
    160 22, i32 24, i32 26, i32 28, i32 30, i32 32, i32 34, i32 36, i32 38, i32 40, i32
    161 42, i32 44, i32 46, i32 48, i32 50, i32 52, i32 54, i32 56, i32 58, i32 60, i32
    162 62>
    163  ret <32 x i8> %0
    164 }
    165 
    166 ; CHECK: blend1
    167 ; CHECK: vblendps
    168 ; CHECK: ret
    169 define <4 x i32> @blend1(<4 x i32> %a, <4 x i32> %b) nounwind alwaysinline {
    170   %t = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
    171   ret <4 x i32> %t
    172 }
    173 
    174 ; CHECK: blend2
    175 ; CHECK: vblendps
    176 ; CHECK: ret
    177 define <4 x i32> @blend2(<4 x i32> %a, <4 x i32> %b) nounwind alwaysinline {
    178   %t = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
    179   ret <4 x i32> %t
    180 }
    181 
    182 ; CHECK: blend2a
    183 ; CHECK: vblendps
    184 ; CHECK: ret
    185 define <4 x float> @blend2a(<4 x float> %a, <4 x float> %b) nounwind alwaysinline {
    186   %t = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
    187   ret <4 x float> %t
    188 }
    189 
    190 ; CHECK: blend3
    191 ; CHECK-NOT: vblendps
    192 ; CHECK: ret
    193 define <4 x i32> @blend3(<4 x i32> %a, <4 x i32> %b) nounwind alwaysinline {
    194   %t = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 5, i32 2, i32 7>
    195   ret <4 x i32> %t
    196 }
    197 
    198 ; CHECK: blend4
    199 ; CHECK: vblendpd
    200 ; CHECK: ret
    201 define <4 x i64> @blend4(<4 x i64> %a, <4 x i64> %b) nounwind alwaysinline {
    202   %t = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
    203   ret <4 x i64> %t
    204 }
    205