Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -march=x86-64 -mcpu=penryn | FileCheck -check-prefix=SSE41 %s
      2 ; RUN: llc < %s -march=x86-64 -mcpu=corei7-avx | FileCheck -check-prefix=AVX1 %s
      3 ; RUN: llc < %s -march=x86-64 -mcpu=core-avx2 | FileCheck -check-prefix=AVX2 %s
      4 
      5 ; PR14887
      6 ; These tests inject a store into the chain to test the inreg versions of pmovsx
      7 
      8 define void @test1(<2 x i8>* %in, <2 x i64>* %out) nounwind {
      9   %wide.load35 = load <2 x i8>, <2 x i8>* %in, align 1
     10   %sext = sext <2 x i8> %wide.load35 to <2 x i64>
     11   store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8
     12   store <2 x i64> %sext, <2 x i64>* %out, align 8
     13   ret void
     14 
     15 ; SSE41-LABEL: test1:
     16 ; SSE41: pmovsxbq
     17 
     18 ; AVX1-LABEL: test1:
     19 ; AVX1: vpmovsxbq
     20 
     21 ; AVX2-LABEL: test1:
     22 ; AVX2: vpmovsxbq
     23 }
     24 
     25 define void @test2(<4 x i8>* %in, <4 x i64>* %out) nounwind {
     26   %wide.load35 = load <4 x i8>, <4 x i8>* %in, align 1
     27   %sext = sext <4 x i8> %wide.load35 to <4 x i64>
     28   store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8
     29   store <4 x i64> %sext, <4 x i64>* %out, align 8
     30   ret void
     31 
     32 ; AVX2-LABEL: test2:
     33 ; AVX2: vpmovsxbq
     34 }
     35 
     36 define void @test3(<4 x i8>* %in, <4 x i32>* %out) nounwind {
     37   %wide.load35 = load <4 x i8>, <4 x i8>* %in, align 1
     38   %sext = sext <4 x i8> %wide.load35 to <4 x i32>
     39   store <4 x i32> zeroinitializer, <4 x i32>* undef, align 8
     40   store <4 x i32> %sext, <4 x i32>* %out, align 8
     41   ret void
     42 
     43 ; SSE41-LABEL: test3:
     44 ; SSE41: pmovsxbd
     45 
     46 ; AVX1-LABEL: test3:
     47 ; AVX1: vpmovsxbd
     48 
     49 ; AVX2-LABEL: test3:
     50 ; AVX2: vpmovsxbd
     51 }
     52 
     53 define void @test4(<8 x i8>* %in, <8 x i32>* %out) nounwind {
     54   %wide.load35 = load <8 x i8>, <8 x i8>* %in, align 1
     55   %sext = sext <8 x i8> %wide.load35 to <8 x i32>
     56   store <8 x i32> zeroinitializer, <8 x i32>* undef, align 8
     57   store <8 x i32> %sext, <8 x i32>* %out, align 8
     58   ret void
     59 
     60 ; AVX2-LABEL: test4:
     61 ; AVX2: vpmovsxbd
     62 }
     63 
     64 define void @test5(<8 x i8>* %in, <8 x i16>* %out) nounwind {
     65   %wide.load35 = load <8 x i8>, <8 x i8>* %in, align 1
     66   %sext = sext <8 x i8> %wide.load35 to <8 x i16>
     67   store <8 x i16> zeroinitializer, <8 x i16>* undef, align 8
     68   store <8 x i16> %sext, <8 x i16>* %out, align 8
     69   ret void
     70 
     71 ; SSE41-LABEL: test5:
     72 ; SSE41: pmovsxbw
     73 
     74 ; AVX1-LABEL: test5:
     75 ; AVX1: vpmovsxbw
     76 
     77 ; AVX2-LABEL: test5:
     78 ; AVX2: vpmovsxbw
     79 }
     80 
     81 define void @test6(<16 x i8>* %in, <16 x i16>* %out) nounwind {
     82   %wide.load35 = load <16 x i8>, <16 x i8>* %in, align 1
     83   %sext = sext <16 x i8> %wide.load35 to <16 x i16>
     84   store <16 x i16> zeroinitializer, <16 x i16>* undef, align 8
     85   store <16 x i16> %sext, <16 x i16>* %out, align 8
     86   ret void
     87 
     88 ; AVX2-LABEL: test6:
     89 ; AVX2: vpmovsxbw
     90 }
     91 
     92 define void @test7(<2 x i16>* %in, <2 x i64>* %out) nounwind {
     93   %wide.load35 = load <2 x i16>, <2 x i16>* %in, align 1
     94   %sext = sext <2 x i16> %wide.load35 to <2 x i64>
     95   store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8
     96   store <2 x i64> %sext, <2 x i64>* %out, align 8
     97   ret void
     98 
     99 
    100 ; SSE41-LABEL: test7:
    101 ; SSE41: pmovsxwq
    102 
    103 ; AVX1-LABEL: test7:
    104 ; AVX1: vpmovsxwq
    105 
    106 ; AVX2-LABEL: test7:
    107 ; AVX2: vpmovsxwq
    108 }
    109 
    110 define void @test8(<4 x i16>* %in, <4 x i64>* %out) nounwind {
    111   %wide.load35 = load <4 x i16>, <4 x i16>* %in, align 1
    112   %sext = sext <4 x i16> %wide.load35 to <4 x i64>
    113   store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8
    114   store <4 x i64> %sext, <4 x i64>* %out, align 8
    115   ret void
    116 
    117 ; AVX2-LABEL: test8:
    118 ; AVX2: vpmovsxwq
    119 }
    120 
    121 define void @test9(<4 x i16>* %in, <4 x i32>* %out) nounwind {
    122   %wide.load35 = load <4 x i16>, <4 x i16>* %in, align 1
    123   %sext = sext <4 x i16> %wide.load35 to <4 x i32>
    124   store <4 x i32> zeroinitializer, <4 x i32>* undef, align 8
    125   store <4 x i32> %sext, <4 x i32>* %out, align 8
    126   ret void
    127 
    128 ; SSE41-LABEL: test9:
    129 ; SSE41: pmovsxwd
    130 
    131 ; AVX1-LABEL: test9:
    132 ; AVX1: vpmovsxwd
    133 
    134 ; AVX2-LABEL: test9:
    135 ; AVX2: vpmovsxwd
    136 }
    137 
    138 define void @test10(<8 x i16>* %in, <8 x i32>* %out) nounwind {
    139   %wide.load35 = load <8 x i16>, <8 x i16>* %in, align 1
    140   %sext = sext <8 x i16> %wide.load35 to <8 x i32>
    141   store <8 x i32> zeroinitializer, <8 x i32>* undef, align 8
    142   store <8 x i32> %sext, <8 x i32>* %out, align 8
    143   ret void
    144 
    145 ; AVX2-LABEL: test10:
    146 ; AVX2: vpmovsxwd
    147 }
    148 
    149 define void @test11(<2 x i32>* %in, <2 x i64>* %out) nounwind {
    150   %wide.load35 = load <2 x i32>, <2 x i32>* %in, align 1
    151   %sext = sext <2 x i32> %wide.load35 to <2 x i64>
    152   store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8
    153   store <2 x i64> %sext, <2 x i64>* %out, align 8
    154   ret void
    155 
    156 ; SSE41-LABEL: test11:
    157 ; SSE41: pmovsxdq
    158 
    159 ; AVX1-LABEL: test11:
    160 ; AVX1: vpmovsxdq
    161 
    162 ; AVX2-LABEL: test11:
    163 ; AVX2: vpmovsxdq
    164 }
    165 
    166 define void @test12(<4 x i32>* %in, <4 x i64>* %out) nounwind {
    167   %wide.load35 = load <4 x i32>, <4 x i32>* %in, align 1
    168   %sext = sext <4 x i32> %wide.load35 to <4 x i64>
    169   store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8
    170   store <4 x i64> %sext, <4 x i64>* %out, align 8
    171   ret void
    172 
    173 ; AVX2-LABEL: test12:
    174 ; AVX2: vpmovsxdq
    175 }
    176