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>* %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>* %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>* %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>* %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>* %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>* %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 ; FIXME: v16i8 -> v16i16 is scalarized.
     90 ; AVX2-NOT: pmovsx
     91 }
     92 
     93 define void @test7(<2 x i16>* %in, <2 x i64>* %out) nounwind {
     94   %wide.load35 = load <2 x i16>* %in, align 1
     95   %sext = sext <2 x i16> %wide.load35 to <2 x i64>
     96   store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8
     97   store <2 x i64> %sext, <2 x i64>* %out, align 8
     98   ret void
     99 
    100 
    101 ; SSE41-LABEL: test7:
    102 ; SSE41: pmovsxwq
    103 
    104 ; AVX1-LABEL: test7:
    105 ; AVX1: vpmovsxwq
    106 
    107 ; AVX2-LABEL: test7:
    108 ; AVX2: vpmovsxwq
    109 }
    110 
    111 define void @test8(<4 x i16>* %in, <4 x i64>* %out) nounwind {
    112   %wide.load35 = load <4 x i16>* %in, align 1
    113   %sext = sext <4 x i16> %wide.load35 to <4 x i64>
    114   store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8
    115   store <4 x i64> %sext, <4 x i64>* %out, align 8
    116   ret void
    117 
    118 ; AVX2-LABEL: test8:
    119 ; AVX2: vpmovsxwq
    120 }
    121 
    122 define void @test9(<4 x i16>* %in, <4 x i32>* %out) nounwind {
    123   %wide.load35 = load <4 x i16>* %in, align 1
    124   %sext = sext <4 x i16> %wide.load35 to <4 x i32>
    125   store <4 x i32> zeroinitializer, <4 x i32>* undef, align 8
    126   store <4 x i32> %sext, <4 x i32>* %out, align 8
    127   ret void
    128 
    129 ; SSE41-LABEL: test9:
    130 ; SSE41: pmovsxwd
    131 
    132 ; AVX1-LABEL: test9:
    133 ; AVX1: vpmovsxwd
    134 
    135 ; AVX2-LABEL: test9:
    136 ; AVX2: vpmovsxwd
    137 }
    138 
    139 define void @test10(<8 x i16>* %in, <8 x i32>* %out) nounwind {
    140   %wide.load35 = load <8 x i16>* %in, align 1
    141   %sext = sext <8 x i16> %wide.load35 to <8 x i32>
    142   store <8 x i32> zeroinitializer, <8 x i32>* undef, align 8
    143   store <8 x i32> %sext, <8 x i32>* %out, align 8
    144   ret void
    145 
    146 ; AVX2-LABEL: test10:
    147 ; AVX2: vpmovsxwd
    148 }
    149 
    150 define void @test11(<2 x i32>* %in, <2 x i64>* %out) nounwind {
    151   %wide.load35 = load <2 x i32>* %in, align 1
    152   %sext = sext <2 x i32> %wide.load35 to <2 x i64>
    153   store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8
    154   store <2 x i64> %sext, <2 x i64>* %out, align 8
    155   ret void
    156 
    157 ; SSE41-LABEL: test11:
    158 ; SSE41: pmovsxdq
    159 
    160 ; AVX1-LABEL: test11:
    161 ; AVX1: vpmovsxdq
    162 
    163 ; AVX2-LABEL: test11:
    164 ; AVX2: vpmovsxdq
    165 }
    166 
    167 define void @test12(<4 x i32>* %in, <4 x i64>* %out) nounwind {
    168   %wide.load35 = load <4 x i32>* %in, align 1
    169   %sext = sext <4 x i32> %wide.load35 to <4 x i64>
    170   store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8
    171   store <4 x i64> %sext, <4 x i64>* %out, align 8
    172   ret void
    173 
    174 ; AVX2-LABEL: test12:
    175 ; AVX2: vpmovsxdq
    176 }
    177