Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -fast-isel -mtriple=i386-unknown-unknown -mattr=ssse3 | FileCheck %s --check-prefix=ALL  --check-prefix=X32
      2 ; RUN: llc < %s -fast-isel -mtriple=x86_64-unknown-unknown -mattr=ssse3 | FileCheck %s --check-prefix=ALL  --check-prefix=X64
      3 
      4 ; NOTE: This should use IR equivalent to what is generated by clang/test/CodeGen/ssse3-builtins.c
      5 
      6 define <2 x i64> @test_mm_abs_epi8(<2 x i64> %a0) {
      7 ; X32-LABEL: test_mm_abs_epi8:
      8 ; X32:       # BB#0:
      9 ; X32-NEXT:    pabsb %xmm0, %xmm0
     10 ; X32-NEXT:    retl
     11 ;
     12 ; X64-LABEL: test_mm_abs_epi8:
     13 ; X64:       # BB#0:
     14 ; X64-NEXT:    pabsb %xmm0, %xmm0
     15 ; X64-NEXT:    retq
     16   %arg = bitcast <2 x i64> %a0 to <16 x i8>
     17   %call = call <16 x i8> @llvm.x86.ssse3.pabs.b.128(<16 x i8> %arg)
     18   %res = bitcast <16 x i8> %call to <2 x i64>
     19   ret <2 x i64> %res
     20 }
     21 declare <16 x i8> @llvm.x86.ssse3.pabs.b.128(<16 x i8>) nounwind readnone
     22 
     23 define <2 x i64> @test_mm_abs_epi16(<2 x i64> %a0) {
     24 ; X32-LABEL: test_mm_abs_epi16:
     25 ; X32:       # BB#0:
     26 ; X32-NEXT:    pabsw %xmm0, %xmm0
     27 ; X32-NEXT:    retl
     28 ;
     29 ; X64-LABEL: test_mm_abs_epi16:
     30 ; X64:       # BB#0:
     31 ; X64-NEXT:    pabsw %xmm0, %xmm0
     32 ; X64-NEXT:    retq
     33   %arg = bitcast <2 x i64> %a0 to <8 x i16>
     34   %call = call <8 x i16> @llvm.x86.ssse3.pabs.w.128(<8 x i16> %arg)
     35   %res = bitcast <8 x i16> %call to <2 x i64>
     36   ret <2 x i64> %res
     37 }
     38 declare <8 x i16> @llvm.x86.ssse3.pabs.w.128(<8 x i16>) nounwind readnone
     39 
     40 define <2 x i64> @test_mm_abs_epi32(<2 x i64> %a0) {
     41 ; X32-LABEL: test_mm_abs_epi32:
     42 ; X32:       # BB#0:
     43 ; X32-NEXT:    pabsd %xmm0, %xmm0
     44 ; X32-NEXT:    retl
     45 ;
     46 ; X64-LABEL: test_mm_abs_epi32:
     47 ; X64:       # BB#0:
     48 ; X64-NEXT:    pabsd %xmm0, %xmm0
     49 ; X64-NEXT:    retq
     50   %arg = bitcast <2 x i64> %a0 to <4 x i32>
     51   %call = call <4 x i32> @llvm.x86.ssse3.pabs.d.128(<4 x i32> %arg)
     52   %res = bitcast <4 x i32> %call to <2 x i64>
     53   ret <2 x i64> %res
     54 }
     55 declare <4 x i32> @llvm.x86.ssse3.pabs.d.128(<4 x i32>) nounwind readnone
     56 
     57 define <2 x i64> @test_mm_alignr_epi8(<2 x i64> %a0, <2 x i64> %a1) {
     58 ; X32-LABEL: test_mm_alignr_epi8:
     59 ; X32:       # BB#0:
     60 ; X32-NEXT:    palignr {{.*#}} xmm1 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1]
     61 ; X32-NEXT:    movdqa %xmm1, %xmm0
     62 ; X32-NEXT:    retl
     63 ;
     64 ; X64-LABEL: test_mm_alignr_epi8:
     65 ; X64:       # BB#0:
     66 ; X64-NEXT:    palignr {{.*#}} xmm1 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1]
     67 ; X64-NEXT:    movdqa %xmm1, %xmm0
     68 ; X64-NEXT:    retq
     69   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
     70   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
     71   %shuf = shufflevector <16 x i8> %arg0, <16 x i8> %arg1, <16 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17>
     72   %res = bitcast <16 x i8> %shuf to <2 x i64>
     73   ret <2 x i64> %res
     74 }
     75 
     76 define <2 x i64> @test_mm_hadd_epi16(<2 x i64> %a0, <2 x i64> %a1) {
     77 ; X32-LABEL: test_mm_hadd_epi16:
     78 ; X32:       # BB#0:
     79 ; X32-NEXT:    phaddw %xmm1, %xmm0
     80 ; X32-NEXT:    retl
     81 ;
     82 ; X64-LABEL: test_mm_hadd_epi16:
     83 ; X64:       # BB#0:
     84 ; X64-NEXT:    phaddw %xmm1, %xmm0
     85 ; X64-NEXT:    retq
     86   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
     87   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
     88   %call = call <8 x i16> @llvm.x86.ssse3.phadd.w.128(<8 x i16> %arg0, <8 x i16> %arg1)
     89   %res = bitcast <8 x i16> %call to <2 x i64>
     90   ret <2 x i64> %res
     91 }
     92 declare <8 x i16> @llvm.x86.ssse3.phadd.w.128(<8 x i16>, <8 x i16>) nounwind readnone
     93 
     94 define <2 x i64> @test_mm_hadd_epi32(<2 x i64> %a0, <2 x i64> %a1) {
     95 ; X32-LABEL: test_mm_hadd_epi32:
     96 ; X32:       # BB#0:
     97 ; X32-NEXT:    phaddd %xmm1, %xmm0
     98 ; X32-NEXT:    retl
     99 ;
    100 ; X64-LABEL: test_mm_hadd_epi32:
    101 ; X64:       # BB#0:
    102 ; X64-NEXT:    phaddd %xmm1, %xmm0
    103 ; X64-NEXT:    retq
    104   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
    105   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
    106   %call = call <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32> %arg0, <4 x i32> %arg1)
    107   %res = bitcast <4 x i32> %call to <2 x i64>
    108   ret <2 x i64> %res
    109 }
    110 declare <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32>, <4 x i32>) nounwind readnone
    111 
    112 define <2 x i64> @test_mm_hadds_epi16(<2 x i64> %a0, <2 x i64> %a1) {
    113 ; X32-LABEL: test_mm_hadds_epi16:
    114 ; X32:       # BB#0:
    115 ; X32-NEXT:    phaddsw %xmm1, %xmm0
    116 ; X32-NEXT:    retl
    117 ;
    118 ; X64-LABEL: test_mm_hadds_epi16:
    119 ; X64:       # BB#0:
    120 ; X64-NEXT:    phaddsw %xmm1, %xmm0
    121 ; X64-NEXT:    retq
    122   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
    123   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
    124   %call = call <8 x i16> @llvm.x86.ssse3.phadd.sw.128(<8 x i16> %arg0, <8 x i16> %arg1)
    125   %res = bitcast <8 x i16> %call to <2 x i64>
    126   ret <2 x i64> %res
    127 }
    128 declare <8 x i16> @llvm.x86.ssse3.phadd.sw.128(<8 x i16>, <8 x i16>) nounwind readnone
    129 
    130 define <2 x i64> @test_mm_hsub_epi16(<2 x i64> %a0, <2 x i64> %a1) {
    131 ; X32-LABEL: test_mm_hsub_epi16:
    132 ; X32:       # BB#0:
    133 ; X32-NEXT:    phsubw %xmm1, %xmm0
    134 ; X32-NEXT:    retl
    135 ;
    136 ; X64-LABEL: test_mm_hsub_epi16:
    137 ; X64:       # BB#0:
    138 ; X64-NEXT:    phsubw %xmm1, %xmm0
    139 ; X64-NEXT:    retq
    140   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
    141   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
    142   %call = call <8 x i16> @llvm.x86.ssse3.phsub.w.128(<8 x i16> %arg0, <8 x i16> %arg1)
    143   %res = bitcast <8 x i16> %call to <2 x i64>
    144   ret <2 x i64> %res
    145 }
    146 declare <8 x i16> @llvm.x86.ssse3.phsub.w.128(<8 x i16>, <8 x i16>) nounwind readnone
    147 
    148 define <2 x i64> @test_mm_hsub_epi32(<2 x i64> %a0, <2 x i64> %a1) {
    149 ; X32-LABEL: test_mm_hsub_epi32:
    150 ; X32:       # BB#0:
    151 ; X32-NEXT:    phsubd %xmm1, %xmm0
    152 ; X32-NEXT:    retl
    153 ;
    154 ; X64-LABEL: test_mm_hsub_epi32:
    155 ; X64:       # BB#0:
    156 ; X64-NEXT:    phsubd %xmm1, %xmm0
    157 ; X64-NEXT:    retq
    158   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
    159   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
    160   %call = call <4 x i32> @llvm.x86.ssse3.phsub.d.128(<4 x i32> %arg0, <4 x i32> %arg1)
    161   %res = bitcast <4 x i32> %call to <2 x i64>
    162   ret <2 x i64> %res
    163 }
    164 declare <4 x i32> @llvm.x86.ssse3.phsub.d.128(<4 x i32>, <4 x i32>) nounwind readnone
    165 
    166 define <2 x i64> @test_mm_hsubs_epi16(<2 x i64> %a0, <2 x i64> %a1) {
    167 ; X32-LABEL: test_mm_hsubs_epi16:
    168 ; X32:       # BB#0:
    169 ; X32-NEXT:    phsubsw %xmm1, %xmm0
    170 ; X32-NEXT:    retl
    171 ;
    172 ; X64-LABEL: test_mm_hsubs_epi16:
    173 ; X64:       # BB#0:
    174 ; X64-NEXT:    phsubsw %xmm1, %xmm0
    175 ; X64-NEXT:    retq
    176   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
    177   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
    178   %call = call <8 x i16> @llvm.x86.ssse3.phsub.sw.128(<8 x i16> %arg0, <8 x i16> %arg1)
    179   %res = bitcast <8 x i16> %call to <2 x i64>
    180   ret <2 x i64> %res
    181 }
    182 declare <8 x i16> @llvm.x86.ssse3.phsub.sw.128(<8 x i16>, <8 x i16>) nounwind readnone
    183 
    184 define <2 x i64> @test_mm_maddubs_epi16(<2 x i64> %a0, <2 x i64> %a1) {
    185 ; X32-LABEL: test_mm_maddubs_epi16:
    186 ; X32:       # BB#0:
    187 ; X32-NEXT:    pmaddubsw %xmm1, %xmm0
    188 ; X32-NEXT:    retl
    189 ;
    190 ; X64-LABEL: test_mm_maddubs_epi16:
    191 ; X64:       # BB#0:
    192 ; X64-NEXT:    pmaddubsw %xmm1, %xmm0
    193 ; X64-NEXT:    retq
    194   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
    195   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
    196   %call = call <8 x i16> @llvm.x86.ssse3.pmadd.ub.sw.128(<16 x i8> %arg0, <16 x i8> %arg1)
    197   %res = bitcast <8 x i16> %call to <2 x i64>
    198   ret <2 x i64> %res
    199 }
    200 declare <8 x i16> @llvm.x86.ssse3.pmadd.ub.sw.128(<16 x i8>, <16 x i8>) nounwind readnone
    201 
    202 define <2 x i64> @test_mm_mulhrs_epi16(<2 x i64> %a0, <2 x i64> %a1) {
    203 ; X32-LABEL: test_mm_mulhrs_epi16:
    204 ; X32:       # BB#0:
    205 ; X32-NEXT:    pmulhrsw %xmm1, %xmm0
    206 ; X32-NEXT:    retl
    207 ;
    208 ; X64-LABEL: test_mm_mulhrs_epi16:
    209 ; X64:       # BB#0:
    210 ; X64-NEXT:    pmulhrsw %xmm1, %xmm0
    211 ; X64-NEXT:    retq
    212   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
    213   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
    214   %call = call <8 x i16> @llvm.x86.ssse3.pmul.hr.sw.128(<8 x i16> %arg0, <8 x i16> %arg1)
    215   %res = bitcast <8 x i16> %call to <2 x i64>
    216   ret <2 x i64> %res
    217 }
    218 declare <8 x i16> @llvm.x86.ssse3.pmul.hr.sw.128(<8 x i16>, <8 x i16>) nounwind readnone
    219 
    220 define <2 x i64> @test_mm_shuffle_epi8(<2 x i64> %a0, <2 x i64> %a1) {
    221 ; X32-LABEL: test_mm_shuffle_epi8:
    222 ; X32:       # BB#0:
    223 ; X32-NEXT:    pshufb %xmm1, %xmm0
    224 ; X32-NEXT:    retl
    225 ;
    226 ; X64-LABEL: test_mm_shuffle_epi8:
    227 ; X64:       # BB#0:
    228 ; X64-NEXT:    pshufb %xmm1, %xmm0
    229 ; X64-NEXT:    retq
    230   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
    231   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
    232   %call = call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %arg0, <16 x i8> %arg1)
    233   %res = bitcast <16 x i8> %call to <2 x i64>
    234   ret <2 x i64> %res
    235 }
    236 declare <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8>, <16 x i8>) nounwind readnone
    237 
    238 define <2 x i64> @test_mm_sign_epi8(<2 x i64> %a0, <2 x i64> %a1) {
    239 ; X32-LABEL: test_mm_sign_epi8:
    240 ; X32:       # BB#0:
    241 ; X32-NEXT:    psignb %xmm1, %xmm0
    242 ; X32-NEXT:    retl
    243 ;
    244 ; X64-LABEL: test_mm_sign_epi8:
    245 ; X64:       # BB#0:
    246 ; X64-NEXT:    psignb %xmm1, %xmm0
    247 ; X64-NEXT:    retq
    248   %arg0 = bitcast <2 x i64> %a0 to <16 x i8>
    249   %arg1 = bitcast <2 x i64> %a1 to <16 x i8>
    250   %call = call <16 x i8> @llvm.x86.ssse3.psign.b.128(<16 x i8> %arg0, <16 x i8> %arg1)
    251   %res = bitcast <16 x i8> %call to <2 x i64>
    252   ret <2 x i64> %res
    253 }
    254 declare <16 x i8> @llvm.x86.ssse3.psign.b.128(<16 x i8>, <16 x i8>) nounwind readnone
    255 
    256 define <2 x i64> @test_mm_sign_epi16(<2 x i64> %a0, <2 x i64> %a1) {
    257 ; X32-LABEL: test_mm_sign_epi16:
    258 ; X32:       # BB#0:
    259 ; X32-NEXT:    psignw %xmm1, %xmm0
    260 ; X32-NEXT:    retl
    261 ;
    262 ; X64-LABEL: test_mm_sign_epi16:
    263 ; X64:       # BB#0:
    264 ; X64-NEXT:    psignw %xmm1, %xmm0
    265 ; X64-NEXT:    retq
    266   %arg0 = bitcast <2 x i64> %a0 to <8 x i16>
    267   %arg1 = bitcast <2 x i64> %a1 to <8 x i16>
    268   %call = call <8 x i16> @llvm.x86.ssse3.psign.w.128(<8 x i16> %arg0, <8 x i16> %arg1)
    269   %res = bitcast <8 x i16> %call to <2 x i64>
    270   ret <2 x i64> %res
    271 }
    272 declare <8 x i16> @llvm.x86.ssse3.psign.w.128(<8 x i16>, <8 x i16>) nounwind readnone
    273 
    274 define <2 x i64> @test_mm_sign_epi32(<2 x i64> %a0, <2 x i64> %a1) {
    275 ; X32-LABEL: test_mm_sign_epi32:
    276 ; X32:       # BB#0:
    277 ; X32-NEXT:    psignd %xmm1, %xmm0
    278 ; X32-NEXT:    retl
    279 ;
    280 ; X64-LABEL: test_mm_sign_epi32:
    281 ; X64:       # BB#0:
    282 ; X64-NEXT:    psignd %xmm1, %xmm0
    283 ; X64-NEXT:    retq
    284   %arg0 = bitcast <2 x i64> %a0 to <4 x i32>
    285   %arg1 = bitcast <2 x i64> %a1 to <4 x i32>
    286   %call = call <4 x i32> @llvm.x86.ssse3.psign.d.128(<4 x i32> %arg0, <4 x i32> %arg1)
    287   %res = bitcast <4 x i32> %call to <2 x i64>
    288   ret <2 x i64> %res
    289 }
    290 declare <4 x i32> @llvm.x86.ssse3.psign.d.128(<4 x i32>, <4 x i32>) nounwind readnone
    291