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