Home | History | Annotate | Download | only in PowerPC
      1 ; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-linux-gnu \
      2 ; RUN:   -verify-machineinstrs < %s | FileCheck %s
      3 ; RUN: llc -mcpu=pwr8 -mtriple=powerpc64-unknown-linux-gnu \
      4 ; RUN:   -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK-BE
      5 define double @test1(<2 x i64> %a) {
      6 entry:
      7 ; CHECK-LABEL: test1
      8 ; CHECK: xxswapd [[SW:[0-9]+]], 34
      9 ; CHECK: xscvsxddp 1, [[SW]]
     10 ; CHECK-BE-LABEL: test1
     11 ; CHECK-BE: xxlor [[CP:[0-9]+]], 34, 34
     12 ; CHECK-BE: xscvsxddp 1, [[CP]]
     13   %0 = extractelement <2 x i64> %a, i32 0
     14   %1 = sitofp i64 %0 to double
     15   ret double %1
     16 }
     17 
     18 define double @test2(<2 x i64> %a) {
     19 entry:
     20 ; CHECK-LABEL: test2
     21 ; CHECK: xxlor [[CP:[0-9]+]], 34, 34
     22 ; CHECK: xscvsxddp 1, [[CP]]
     23 ; CHECK-BE-LABEL: test2
     24 ; CHECK-BE: xxswapd [[SW:[0-9]+]], 34
     25 ; CHECK-BE: xscvsxddp 1, [[SW]]
     26   %0 = extractelement <2 x i64> %a, i32 1
     27   %1 = sitofp i64 %0 to double
     28   ret double %1
     29 }
     30 
     31 define float @test1f(<2 x i64> %a) {
     32 entry:
     33 ; CHECK-LABEL: test1f
     34 ; CHECK: xxswapd [[SW:[0-9]+]], 34
     35 ; CHECK: xscvsxdsp 1, [[SW]]
     36 ; CHECK-BE-LABEL: test1f
     37 ; CHECK-BE: xxlor [[CP:[0-9]+]], 34, 34
     38 ; CHECK-BE: xscvsxdsp 1, [[CP]]
     39   %0 = extractelement <2 x i64> %a, i32 0
     40   %1 = sitofp i64 %0 to float
     41   ret float %1
     42 }
     43 
     44 define float @test2f(<2 x i64> %a) {
     45 entry:
     46 ; CHECK-LABEL: test2f
     47 ; CHECK: xxlor [[CP:[0-9]+]], 34, 34
     48 ; CHECK: xscvsxdsp 1, [[CP]]
     49 ; CHECK-BE-LABEL: test2f
     50 ; CHECK-BE: xxswapd [[SW:[0-9]+]], 34
     51 ; CHECK-BE: xscvsxdsp 1, [[SW]]
     52   %0 = extractelement <2 x i64> %a, i32 1
     53   %1 = sitofp i64 %0 to float
     54   ret float %1
     55 }
     56 
     57 define double @test1u(<2 x i64> %a) {
     58 entry:
     59 ; CHECK-LABEL: test1u
     60 ; CHECK: xxswapd [[SW:[0-9]+]], 34
     61 ; CHECK: xscvuxddp 1, [[SW]]
     62 ; CHECK-BE-LABEL: test1u
     63 ; CHECK-BE: xxlor [[CP:[0-9]+]], 34, 34
     64 ; CHECK-BE: xscvuxddp 1, [[CP]]
     65   %0 = extractelement <2 x i64> %a, i32 0
     66   %1 = uitofp i64 %0 to double
     67   ret double %1
     68 }
     69 
     70 define double @test2u(<2 x i64> %a) {
     71 entry:
     72 ; CHECK-LABEL: test2u
     73 ; CHECK: xxlor [[CP:[0-9]+]], 34, 34
     74 ; CHECK: xscvuxddp 1, [[CP]]
     75 ; CHECK-BE-LABEL: test2u
     76 ; CHECK-BE: xxswapd [[SW:[0-9]+]], 34
     77 ; CHECK-BE: xscvuxddp 1, [[SW]]
     78   %0 = extractelement <2 x i64> %a, i32 1
     79   %1 = uitofp i64 %0 to double
     80   ret double %1
     81 }
     82 
     83 define float @test1fu(<2 x i64> %a) {
     84 entry:
     85 ; CHECK-LABEL: test1fu
     86 ; CHECK: xxswapd [[SW:[0-9]+]], 34
     87 ; CHECK: xscvuxdsp 1, [[SW]]
     88 ; CHECK-BE-LABEL: test1fu
     89 ; CHECK-BE: xxlor [[CP:[0-9]+]], 34, 34
     90 ; CHECK-BE: xscvuxdsp 1, [[CP]]
     91   %0 = extractelement <2 x i64> %a, i32 0
     92   %1 = uitofp i64 %0 to float
     93   ret float %1
     94 }
     95 
     96 define float @test2fu(<2 x i64> %a) {
     97 entry:
     98 ; CHECK-LABEL: test2fu
     99 ; CHECK: xxlor [[CP:[0-9]+]], 34, 34
    100 ; CHECK: xscvuxdsp 1, [[CP]]
    101 ; CHECK-BE-LABEL: test2fu
    102 ; CHECK-BE: xxswapd [[SW:[0-9]+]], 34
    103 ; CHECK-BE: xscvuxdsp 1, [[SW]]
    104   %0 = extractelement <2 x i64> %a, i32 1
    105   %1 = uitofp i64 %0 to float
    106   ret float %1
    107 }
    108 
    109 define float @conv2fltTesti0(<4 x i32> %a) {
    110 entry:
    111 ; CHECK-LABEL: conv2fltTesti0
    112 ; CHECK: xxspltw [[SW:[0-9]+]], 34, 3
    113 ; CHECK: xvcvsxwsp [[SW]], [[SW]]
    114 ; CHECK: xscvspdpn 1, [[SW]]
    115 ; CHECK-BE-LABEL: conv2fltTesti0
    116 ; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 0
    117 ; CHECK-BE: xvcvsxwsp [[CP]], [[CP]]
    118 ; CHECK-BE: xscvspdpn 1, [[CP]]
    119   %vecext = extractelement <4 x i32> %a, i32 0
    120   %conv = sitofp i32 %vecext to float
    121   ret float %conv
    122 }
    123 
    124 define float @conv2fltTesti1(<4 x i32> %a) {
    125 entry:
    126 ; CHECK-LABEL: conv2fltTesti1
    127 ; CHECK: xxspltw [[SW:[0-9]+]], 34, 2
    128 ; CHECK: xvcvsxwsp [[SW]], [[SW]]
    129 ; CHECK: xscvspdpn 1, [[SW]]
    130 ; CHECK-BE-LABEL: conv2fltTesti1
    131 ; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 1
    132 ; CHECK-BE: xvcvsxwsp [[CP]], [[CP]]
    133 ; CHECK-BE: xscvspdpn 1, [[CP]]
    134   %vecext = extractelement <4 x i32> %a, i32 1
    135   %conv = sitofp i32 %vecext to float
    136   ret float %conv
    137 }
    138 
    139 define float @conv2fltTesti2(<4 x i32> %a) {
    140 entry:
    141 ; CHECK-LABEL: conv2fltTesti2
    142 ; CHECK: xxspltw [[SW:[0-9]+]], 34, 1
    143 ; CHECK: xvcvsxwsp [[SW]], [[SW]]
    144 ; CHECK: xscvspdpn 1, [[SW]]
    145 ; CHECK-BE-LABEL: conv2fltTesti2
    146 ; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 2
    147 ; CHECK-BE: xvcvsxwsp [[CP]], [[CP]]
    148 ; CHECK-BE: xscvspdpn 1, [[CP]]
    149   %vecext = extractelement <4 x i32> %a, i32 2
    150   %conv = sitofp i32 %vecext to float
    151   ret float %conv
    152 }
    153 
    154 define float @conv2fltTesti3(<4 x i32> %a) {
    155 entry:
    156 ; CHECK-LABEL: conv2fltTesti3
    157 ; CHECK: xxspltw [[SW:[0-9]+]], 34, 0
    158 ; CHECK: xvcvsxwsp [[SW]], [[SW]]
    159 ; CHECK: xscvspdpn 1, [[SW]]
    160 ; CHECK-BE-LABEL: conv2fltTesti3
    161 ; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 3
    162 ; CHECK-BE: xvcvsxwsp [[CP]], [[CP]]
    163 ; CHECK-BE: xscvspdpn 1, [[CP]]
    164   %vecext = extractelement <4 x i32> %a, i32 3
    165   %conv = sitofp i32 %vecext to float
    166   ret float %conv
    167 }
    168 
    169 ; verify we don't crash for variable elem extract
    170 define float @conv2fltTestiVar(<4 x i32> %a, i32 zeroext %elem) {
    171 entry:
    172   %vecext = extractelement <4 x i32> %a, i32 %elem
    173   %conv = sitofp i32 %vecext to float
    174   ret float %conv
    175 }
    176 
    177 define double @conv2dblTesti0(<4 x i32> %a) {
    178 entry:
    179 ; CHECK-LABEL: conv2dblTesti0
    180 ; CHECK: xxspltw [[SW:[0-9]+]], 34, 3
    181 ; CHECK: xvcvsxwdp 1, [[SW]]
    182 ; CHECK-BE-LABEL: conv2dblTesti0
    183 ; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 0
    184 ; CHECK-BE: xvcvsxwdp 1, [[CP]]
    185   %vecext = extractelement <4 x i32> %a, i32 0
    186   %conv = sitofp i32 %vecext to double
    187   ret double %conv
    188 }
    189 
    190 define double @conv2dblTesti1(<4 x i32> %a) {
    191 entry:
    192 ; CHECK-LABEL: conv2dblTesti1
    193 ; CHECK: xxspltw [[SW:[0-9]+]], 34, 2
    194 ; CHECK: xvcvsxwdp 1, [[SW]]
    195 ; CHECK-BE-LABEL: conv2dblTesti1
    196 ; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 1
    197 ; CHECK-BE: xvcvsxwdp 1, [[CP]]
    198   %vecext = extractelement <4 x i32> %a, i32 1
    199   %conv = sitofp i32 %vecext to double
    200   ret double %conv
    201 }
    202 
    203 define double @conv2dblTesti2(<4 x i32> %a) {
    204 entry:
    205 ; CHECK-LABEL: conv2dblTesti2
    206 ; CHECK: xxspltw [[SW:[0-9]+]], 34, 1
    207 ; CHECK: xvcvsxwdp 1, [[SW]]
    208 ; CHECK-BE-LABEL: conv2dblTesti2
    209 ; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 2
    210 ; CHECK-BE: xvcvsxwdp 1, [[CP]]
    211   %vecext = extractelement <4 x i32> %a, i32 2
    212   %conv = sitofp i32 %vecext to double
    213   ret double %conv
    214 }
    215 
    216 define double @conv2dblTesti3(<4 x i32> %a) {
    217 entry:
    218 ; CHECK-LABEL: conv2dblTesti3
    219 ; CHECK: xxspltw [[SW:[0-9]+]], 34, 0
    220 ; CHECK: xvcvsxwdp 1, [[SW]]
    221 ; CHECK-BE-LABEL: conv2dblTesti3
    222 ; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 3
    223 ; CHECK-BE: xvcvsxwdp 1, [[CP]]
    224   %vecext = extractelement <4 x i32> %a, i32 3
    225   %conv = sitofp i32 %vecext to double
    226   ret double %conv
    227 }
    228 
    229 ; verify we don't crash for variable elem extract
    230 define double @conv2dblTestiVar(<4 x i32> %a, i32 zeroext %elem) {
    231 entry:
    232   %vecext = extractelement <4 x i32> %a, i32 %elem
    233   %conv = sitofp i32 %vecext to double
    234   ret double %conv
    235 }
    236