433 lines · plain
1; Test various representations of pack-like operations.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s4 5; One way of writing a <4 x i32> -> <8 x i16> pack.6define <8 x i16> @f1(<4 x i32> %val0, <4 x i32> %val1) {7; CHECK-LABEL: f1:8; CHECK: vpkf %v24, %v24, %v269; CHECK: br %r1410 %elem0 = extractelement <4 x i32> %val0, i32 011 %elem1 = extractelement <4 x i32> %val0, i32 112 %elem2 = extractelement <4 x i32> %val0, i32 213 %elem3 = extractelement <4 x i32> %val0, i32 314 %elem4 = extractelement <4 x i32> %val1, i32 015 %elem5 = extractelement <4 x i32> %val1, i32 116 %elem6 = extractelement <4 x i32> %val1, i32 217 %elem7 = extractelement <4 x i32> %val1, i32 318 %hboth0 = bitcast i32 %elem0 to <2 x i16>19 %hboth1 = bitcast i32 %elem1 to <2 x i16>20 %hboth2 = bitcast i32 %elem2 to <2 x i16>21 %hboth3 = bitcast i32 %elem3 to <2 x i16>22 %hboth4 = bitcast i32 %elem4 to <2 x i16>23 %hboth5 = bitcast i32 %elem5 to <2 x i16>24 %hboth6 = bitcast i32 %elem6 to <2 x i16>25 %hboth7 = bitcast i32 %elem7 to <2 x i16>26 %hlow0 = shufflevector <2 x i16> %hboth0, <2 x i16> %hboth1,27 <2 x i32> <i32 1, i32 3>28 %hlow1 = shufflevector <2 x i16> %hboth2, <2 x i16> %hboth3,29 <2 x i32> <i32 1, i32 3>30 %hlow2 = shufflevector <2 x i16> %hboth4, <2 x i16> %hboth5,31 <2 x i32> <i32 1, i32 3>32 %hlow3 = shufflevector <2 x i16> %hboth6, <2 x i16> %hboth7,33 <2 x i32> <i32 1, i32 3>34 %join0 = shufflevector <2 x i16> %hlow0, <2 x i16> %hlow1,35 <4 x i32> <i32 0, i32 1, i32 2, i32 3>36 %join1 = shufflevector <2 x i16> %hlow2, <2 x i16> %hlow3,37 <4 x i32> <i32 0, i32 1, i32 2, i32 3>38 %ret = shufflevector <4 x i16> %join0, <4 x i16> %join1,39 <8 x i32> <i32 0, i32 1, i32 2, i32 3,40 i32 4, i32 5, i32 6, i32 7>41 ret <8 x i16> %ret42}43 44; A different way of writing a <4 x i32> -> <8 x i16> pack.45define <8 x i16> @f2(<4 x i32> %val0, <4 x i32> %val1) {46; CHECK-LABEL: f2:47; CHECK: vpkf %v24, %v24, %v2648; CHECK: br %r1449 %elem0 = extractelement <4 x i32> %val0, i32 050 %elem1 = extractelement <4 x i32> %val0, i32 151 %elem2 = extractelement <4 x i32> %val0, i32 252 %elem3 = extractelement <4 x i32> %val0, i32 353 %elem4 = extractelement <4 x i32> %val1, i32 054 %elem5 = extractelement <4 x i32> %val1, i32 155 %elem6 = extractelement <4 x i32> %val1, i32 256 %elem7 = extractelement <4 x i32> %val1, i32 357 %wvec0 = insertelement <4 x i32> undef, i32 %elem0, i32 058 %wvec1 = insertelement <4 x i32> undef, i32 %elem1, i32 059 %wvec2 = insertelement <4 x i32> undef, i32 %elem2, i32 060 %wvec3 = insertelement <4 x i32> undef, i32 %elem3, i32 061 %wvec4 = insertelement <4 x i32> undef, i32 %elem4, i32 062 %wvec5 = insertelement <4 x i32> undef, i32 %elem5, i32 063 %wvec6 = insertelement <4 x i32> undef, i32 %elem6, i32 064 %wvec7 = insertelement <4 x i32> undef, i32 %elem7, i32 065 %hvec0 = bitcast <4 x i32> %wvec0 to <8 x i16>66 %hvec1 = bitcast <4 x i32> %wvec1 to <8 x i16>67 %hvec2 = bitcast <4 x i32> %wvec2 to <8 x i16>68 %hvec3 = bitcast <4 x i32> %wvec3 to <8 x i16>69 %hvec4 = bitcast <4 x i32> %wvec4 to <8 x i16>70 %hvec5 = bitcast <4 x i32> %wvec5 to <8 x i16>71 %hvec6 = bitcast <4 x i32> %wvec6 to <8 x i16>72 %hvec7 = bitcast <4 x i32> %wvec7 to <8 x i16>73 %hlow0 = shufflevector <8 x i16> %hvec0, <8 x i16> %hvec1,74 <8 x i32> <i32 1, i32 9, i32 undef, i32 undef,75 i32 undef, i32 undef, i32 undef, i32 undef>76 %hlow1 = shufflevector <8 x i16> %hvec2, <8 x i16> %hvec3,77 <8 x i32> <i32 1, i32 9, i32 undef, i32 undef,78 i32 undef, i32 undef, i32 undef, i32 undef>79 %hlow2 = shufflevector <8 x i16> %hvec4, <8 x i16> %hvec5,80 <8 x i32> <i32 1, i32 9, i32 undef, i32 undef,81 i32 undef, i32 undef, i32 undef, i32 undef>82 %hlow3 = shufflevector <8 x i16> %hvec6, <8 x i16> %hvec7,83 <8 x i32> <i32 1, i32 9, i32 undef, i32 undef,84 i32 undef, i32 undef, i32 undef, i32 undef>85 %join0 = shufflevector <8 x i16> %hlow0, <8 x i16> %hlow1,86 <8 x i32> <i32 0, i32 1, i32 8, i32 9,87 i32 undef, i32 undef, i32 undef, i32 undef>88 %join1 = shufflevector <8 x i16> %hlow2, <8 x i16> %hlow3,89 <8 x i32> <i32 0, i32 1, i32 8, i32 9,90 i32 undef, i32 undef, i32 undef, i32 undef>91 %ret = shufflevector <8 x i16> %join0, <8 x i16> %join1,92 <8 x i32> <i32 0, i32 1, i32 2, i32 3,93 i32 8, i32 9, i32 10, i32 11>94 ret <8 x i16> %ret95}96 97; A direct pack operation.98define <8 x i16> @f3(<4 x i32> %val0, <4 x i32> %val1) {99; CHECK-LABEL: f3:100; CHECK: vpkf %v24, %v24, %v26101; CHECK: br %r14102 %bitcast0 = bitcast <4 x i32> %val0 to <8 x i16>103 %bitcast1 = bitcast <4 x i32> %val1 to <8 x i16>104 %ret = shufflevector <8 x i16> %bitcast0, <8 x i16> %bitcast1,105 <8 x i32> <i32 1, i32 3, i32 5, i32 7,106 i32 9, i32 11, i32 13, i32 15>107 ret <8 x i16> %ret108}109 110; One way of writing a <4 x i32> -> <16 x i8> pack. It doesn't matter111; whether the first pack is VPKF or VPKH since the even bytes of the112; result are discarded.113define <16 x i8> @f4(<4 x i32> %val0, <4 x i32> %val1,114 <4 x i32> %val2, <4 x i32> %val3) {115; CHECK-LABEL: f4:116; CHECK-DAG: vpk{{[hf]}} [[REG1:%v[0-9]+]], %v24, %v26117; CHECK-DAG: vpk{{[hf]}} [[REG2:%v[0-9]+]], %v28, %v30118; CHECK: vpkh %v24, [[REG1]], [[REG2]]119; CHECK: br %r14120 %bitcast0 = bitcast <4 x i32> %val0 to <8 x i16>121 %bitcast1 = bitcast <4 x i32> %val1 to <8 x i16>122 %bitcast2 = bitcast <4 x i32> %val2 to <8 x i16>123 %bitcast3 = bitcast <4 x i32> %val3 to <8 x i16>124 %join0 = shufflevector <8 x i16> %bitcast0, <8 x i16> %bitcast1,125 <8 x i32> <i32 1, i32 3, i32 5, i32 7,126 i32 9, i32 11, i32 13, i32 15>127 %join1 = shufflevector <8 x i16> %bitcast2, <8 x i16> %bitcast3,128 <8 x i32> <i32 1, i32 3, i32 5, i32 7,129 i32 9, i32 11, i32 13, i32 15>130 %bitcast4 = bitcast <8 x i16> %join0 to <16 x i8>131 %bitcast5 = bitcast <8 x i16> %join1 to <16 x i8>132 %ret = shufflevector <16 x i8> %bitcast4, <16 x i8> %bitcast5,133 <16 x i32> <i32 1, i32 3, i32 5, i32 7,134 i32 9, i32 11, i32 13, i32 15,135 i32 17, i32 19, i32 21, i32 23,136 i32 25, i32 27, i32 29, i32 31>137 ret <16 x i8> %ret138}139 140; Check the same operation, but with elements being extracted from the result.141define void @f5(<4 x i32> %val0, <4 x i32> %val1,142 <4 x i32> %val2, <4 x i32> %val3,143 ptr %base) {144; CHECK-LABEL: f5:145; CHECK-DAG: vsteb %v24, 0(%r2), 11146; CHECK-DAG: vsteb %v26, 1(%r2), 15147; CHECK-DAG: vsteb %v28, 2(%r2), 3148; CHECK-DAG: vsteb %v30, 3(%r2), 7149; CHECK: br %r14150 %bitcast0 = bitcast <4 x i32> %val0 to <8 x i16>151 %bitcast1 = bitcast <4 x i32> %val1 to <8 x i16>152 %bitcast2 = bitcast <4 x i32> %val2 to <8 x i16>153 %bitcast3 = bitcast <4 x i32> %val3 to <8 x i16>154 %join0 = shufflevector <8 x i16> %bitcast0, <8 x i16> %bitcast1,155 <8 x i32> <i32 1, i32 3, i32 5, i32 7,156 i32 9, i32 11, i32 13, i32 15>157 %join1 = shufflevector <8 x i16> %bitcast2, <8 x i16> %bitcast3,158 <8 x i32> <i32 1, i32 3, i32 5, i32 7,159 i32 9, i32 11, i32 13, i32 15>160 %bitcast4 = bitcast <8 x i16> %join0 to <16 x i8>161 %bitcast5 = bitcast <8 x i16> %join1 to <16 x i8>162 %vec = shufflevector <16 x i8> %bitcast4, <16 x i8> %bitcast5,163 <16 x i32> <i32 1, i32 3, i32 5, i32 7,164 i32 9, i32 11, i32 13, i32 15,165 i32 17, i32 19, i32 21, i32 23,166 i32 25, i32 27, i32 29, i32 31>167 168 %ptr1 = getelementptr i8, ptr %base, i64 1169 %ptr2 = getelementptr i8, ptr %base, i64 2170 %ptr3 = getelementptr i8, ptr %base, i64 3171 172 %byte0 = extractelement <16 x i8> %vec, i32 2173 %byte1 = extractelement <16 x i8> %vec, i32 7174 %byte2 = extractelement <16 x i8> %vec, i32 8175 %byte3 = extractelement <16 x i8> %vec, i32 13176 177 store i8 %byte0, ptr %base178 store i8 %byte1, ptr %ptr1179 store i8 %byte2, ptr %ptr2180 store i8 %byte3, ptr %ptr3181 182 ret void183}184 185; A different way of writing a <4 x i32> -> <16 x i8> pack.186define <16 x i8> @f6(<4 x i32> %val0, <4 x i32> %val1,187 <4 x i32> %val2, <4 x i32> %val3) {188; CHECK-LABEL: f6:189; CHECK-DAG: vpk{{[hf]}} [[REG1:%v[0-9]+]], %v24, %v26190; CHECK-DAG: vpk{{[hf]}} [[REG2:%v[0-9]+]], %v28, %v30191; CHECK: vpkh %v24, [[REG1]], [[REG2]]192; CHECK: br %r14193 %elem0 = extractelement <4 x i32> %val0, i32 0194 %elem1 = extractelement <4 x i32> %val0, i32 1195 %elem2 = extractelement <4 x i32> %val0, i32 2196 %elem3 = extractelement <4 x i32> %val0, i32 3197 %elem4 = extractelement <4 x i32> %val1, i32 0198 %elem5 = extractelement <4 x i32> %val1, i32 1199 %elem6 = extractelement <4 x i32> %val1, i32 2200 %elem7 = extractelement <4 x i32> %val1, i32 3201 %elem8 = extractelement <4 x i32> %val2, i32 0202 %elem9 = extractelement <4 x i32> %val2, i32 1203 %elem10 = extractelement <4 x i32> %val2, i32 2204 %elem11 = extractelement <4 x i32> %val2, i32 3205 %elem12 = extractelement <4 x i32> %val3, i32 0206 %elem13 = extractelement <4 x i32> %val3, i32 1207 %elem14 = extractelement <4 x i32> %val3, i32 2208 %elem15 = extractelement <4 x i32> %val3, i32 3209 %bitcast0 = bitcast i32 %elem0 to <2 x i16>210 %bitcast1 = bitcast i32 %elem1 to <2 x i16>211 %bitcast2 = bitcast i32 %elem2 to <2 x i16>212 %bitcast3 = bitcast i32 %elem3 to <2 x i16>213 %bitcast4 = bitcast i32 %elem4 to <2 x i16>214 %bitcast5 = bitcast i32 %elem5 to <2 x i16>215 %bitcast6 = bitcast i32 %elem6 to <2 x i16>216 %bitcast7 = bitcast i32 %elem7 to <2 x i16>217 %bitcast8 = bitcast i32 %elem8 to <2 x i16>218 %bitcast9 = bitcast i32 %elem9 to <2 x i16>219 %bitcast10 = bitcast i32 %elem10 to <2 x i16>220 %bitcast11 = bitcast i32 %elem11 to <2 x i16>221 %bitcast12 = bitcast i32 %elem12 to <2 x i16>222 %bitcast13 = bitcast i32 %elem13 to <2 x i16>223 %bitcast14 = bitcast i32 %elem14 to <2 x i16>224 %bitcast15 = bitcast i32 %elem15 to <2 x i16>225 %low0 = shufflevector <2 x i16> %bitcast0, <2 x i16> %bitcast1,226 <2 x i32> <i32 1, i32 3>227 %low1 = shufflevector <2 x i16> %bitcast2, <2 x i16> %bitcast3,228 <2 x i32> <i32 1, i32 3>229 %low2 = shufflevector <2 x i16> %bitcast4, <2 x i16> %bitcast5,230 <2 x i32> <i32 1, i32 3>231 %low3 = shufflevector <2 x i16> %bitcast6, <2 x i16> %bitcast7,232 <2 x i32> <i32 1, i32 3>233 %low4 = shufflevector <2 x i16> %bitcast8, <2 x i16> %bitcast9,234 <2 x i32> <i32 1, i32 3>235 %low5 = shufflevector <2 x i16> %bitcast10, <2 x i16> %bitcast11,236 <2 x i32> <i32 1, i32 3>237 %low6 = shufflevector <2 x i16> %bitcast12, <2 x i16> %bitcast13,238 <2 x i32> <i32 1, i32 3>239 %low7 = shufflevector <2 x i16> %bitcast14, <2 x i16> %bitcast15,240 <2 x i32> <i32 1, i32 3>241 %bytes0 = bitcast <2 x i16> %low0 to <4 x i8>242 %bytes1 = bitcast <2 x i16> %low1 to <4 x i8>243 %bytes2 = bitcast <2 x i16> %low2 to <4 x i8>244 %bytes3 = bitcast <2 x i16> %low3 to <4 x i8>245 %bytes4 = bitcast <2 x i16> %low4 to <4 x i8>246 %bytes5 = bitcast <2 x i16> %low5 to <4 x i8>247 %bytes6 = bitcast <2 x i16> %low6 to <4 x i8>248 %bytes7 = bitcast <2 x i16> %low7 to <4 x i8>249 %blow0 = shufflevector <4 x i8> %bytes0, <4 x i8> %bytes1,250 <4 x i32> <i32 1, i32 3, i32 5, i32 7>251 %blow1 = shufflevector <4 x i8> %bytes2, <4 x i8> %bytes3,252 <4 x i32> <i32 1, i32 3, i32 5, i32 7>253 %blow2 = shufflevector <4 x i8> %bytes4, <4 x i8> %bytes5,254 <4 x i32> <i32 1, i32 3, i32 5, i32 7>255 %blow3 = shufflevector <4 x i8> %bytes6, <4 x i8> %bytes7,256 <4 x i32> <i32 1, i32 3, i32 5, i32 7>257 %join0 = shufflevector <4 x i8> %blow0, <4 x i8> %blow1,258 <8 x i32> <i32 0, i32 1, i32 2, i32 3,259 i32 4, i32 5, i32 6, i32 7>260 %join1 = shufflevector <4 x i8> %blow2, <4 x i8> %blow3,261 <8 x i32> <i32 0, i32 1, i32 2, i32 3,262 i32 4, i32 5, i32 6, i32 7>263 %ret = shufflevector <8 x i8> %join0, <8 x i8> %join1,264 <16 x i32> <i32 0, i32 1, i32 2, i32 3,265 i32 4, i32 5, i32 6, i32 7,266 i32 8, i32 9, i32 10, i32 11,267 i32 12, i32 13, i32 14, i32 15>268 ret <16 x i8> %ret269}270 271; One way of writing a <2 x i64> -> <16 x i8> pack.272define <16 x i8> @f7(<2 x i64> %val0, <2 x i64> %val1,273 <2 x i64> %val2, <2 x i64> %val3,274 <2 x i64> %val4, <2 x i64> %val5,275 <2 x i64> %val6, <2 x i64> %val7) {276; CHECK-LABEL: f7:277; CHECK-DAG: vpk{{[hfg]}} [[REG1:%v[0-9]+]], %v24, %v26278; CHECK-DAG: vpk{{[hfg]}} [[REG2:%v[0-9]+]], %v28, %v30279; CHECK-DAG: vpk{{[hfg]}} [[REG3:%v[0-9]+]], %v25, %v27280; CHECK-DAG: vpk{{[hfg]}} [[REG4:%v[0-9]+]], %v29, %v31281; CHECK-DAG: vpk{{[hf]}} [[REG5:%v[0-9]+]], [[REG1]], [[REG2]]282; CHECK-DAG: vpk{{[hf]}} [[REG6:%v[0-9]+]], [[REG3]], [[REG4]]283; CHECK: vpkh %v24, [[REG5]], [[REG6]]284; CHECK: br %r14285 %elem0 = extractelement <2 x i64> %val0, i32 0286 %elem1 = extractelement <2 x i64> %val0, i32 1287 %elem2 = extractelement <2 x i64> %val1, i32 0288 %elem3 = extractelement <2 x i64> %val1, i32 1289 %elem4 = extractelement <2 x i64> %val2, i32 0290 %elem5 = extractelement <2 x i64> %val2, i32 1291 %elem6 = extractelement <2 x i64> %val3, i32 0292 %elem7 = extractelement <2 x i64> %val3, i32 1293 %elem8 = extractelement <2 x i64> %val4, i32 0294 %elem9 = extractelement <2 x i64> %val4, i32 1295 %elem10 = extractelement <2 x i64> %val5, i32 0296 %elem11 = extractelement <2 x i64> %val5, i32 1297 %elem12 = extractelement <2 x i64> %val6, i32 0298 %elem13 = extractelement <2 x i64> %val6, i32 1299 %elem14 = extractelement <2 x i64> %val7, i32 0300 %elem15 = extractelement <2 x i64> %val7, i32 1301 %bitcast0 = bitcast i64 %elem0 to <2 x i32>302 %bitcast1 = bitcast i64 %elem1 to <2 x i32>303 %bitcast2 = bitcast i64 %elem2 to <2 x i32>304 %bitcast3 = bitcast i64 %elem3 to <2 x i32>305 %bitcast4 = bitcast i64 %elem4 to <2 x i32>306 %bitcast5 = bitcast i64 %elem5 to <2 x i32>307 %bitcast6 = bitcast i64 %elem6 to <2 x i32>308 %bitcast7 = bitcast i64 %elem7 to <2 x i32>309 %bitcast8 = bitcast i64 %elem8 to <2 x i32>310 %bitcast9 = bitcast i64 %elem9 to <2 x i32>311 %bitcast10 = bitcast i64 %elem10 to <2 x i32>312 %bitcast11 = bitcast i64 %elem11 to <2 x i32>313 %bitcast12 = bitcast i64 %elem12 to <2 x i32>314 %bitcast13 = bitcast i64 %elem13 to <2 x i32>315 %bitcast14 = bitcast i64 %elem14 to <2 x i32>316 %bitcast15 = bitcast i64 %elem15 to <2 x i32>317 %low0 = shufflevector <2 x i32> %bitcast0, <2 x i32> %bitcast1,318 <2 x i32> <i32 1, i32 3>319 %low1 = shufflevector <2 x i32> %bitcast2, <2 x i32> %bitcast3,320 <2 x i32> <i32 1, i32 3>321 %low2 = shufflevector <2 x i32> %bitcast4, <2 x i32> %bitcast5,322 <2 x i32> <i32 1, i32 3>323 %low3 = shufflevector <2 x i32> %bitcast6, <2 x i32> %bitcast7,324 <2 x i32> <i32 1, i32 3>325 %low4 = shufflevector <2 x i32> %bitcast8, <2 x i32> %bitcast9,326 <2 x i32> <i32 1, i32 3>327 %low5 = shufflevector <2 x i32> %bitcast10, <2 x i32> %bitcast11,328 <2 x i32> <i32 1, i32 3>329 %low6 = shufflevector <2 x i32> %bitcast12, <2 x i32> %bitcast13,330 <2 x i32> <i32 1, i32 3>331 %low7 = shufflevector <2 x i32> %bitcast14, <2 x i32> %bitcast15,332 <2 x i32> <i32 1, i32 3>333 %half0 = bitcast <2 x i32> %low0 to <4 x i16>334 %half1 = bitcast <2 x i32> %low1 to <4 x i16>335 %half2 = bitcast <2 x i32> %low2 to <4 x i16>336 %half3 = bitcast <2 x i32> %low3 to <4 x i16>337 %half4 = bitcast <2 x i32> %low4 to <4 x i16>338 %half5 = bitcast <2 x i32> %low5 to <4 x i16>339 %half6 = bitcast <2 x i32> %low6 to <4 x i16>340 %half7 = bitcast <2 x i32> %low7 to <4 x i16>341 %hlow0 = shufflevector <4 x i16> %half0, <4 x i16> %half1,342 <4 x i32> <i32 1, i32 3, i32 5, i32 7>343 %hlow1 = shufflevector <4 x i16> %half2, <4 x i16> %half3,344 <4 x i32> <i32 1, i32 3, i32 5, i32 7>345 %hlow2 = shufflevector <4 x i16> %half4, <4 x i16> %half5,346 <4 x i32> <i32 1, i32 3, i32 5, i32 7>347 %hlow3 = shufflevector <4 x i16> %half6, <4 x i16> %half7,348 <4 x i32> <i32 1, i32 3, i32 5, i32 7>349 %bytes0 = bitcast <4 x i16> %hlow0 to <8 x i8>350 %bytes1 = bitcast <4 x i16> %hlow1 to <8 x i8>351 %bytes2 = bitcast <4 x i16> %hlow2 to <8 x i8>352 %bytes3 = bitcast <4 x i16> %hlow3 to <8 x i8>353 %join0 = shufflevector <8 x i8> %bytes0, <8 x i8> %bytes1,354 <8 x i32> <i32 1, i32 3, i32 5, i32 7,355 i32 9, i32 11, i32 13, i32 15>356 %join1 = shufflevector <8 x i8> %bytes2, <8 x i8> %bytes3,357 <8 x i32> <i32 1, i32 3, i32 5, i32 7,358 i32 9, i32 11, i32 13, i32 15>359 %ret = shufflevector <8 x i8> %join0, <8 x i8> %join1,360 <16 x i32> <i32 0, i32 1, i32 2, i32 3,361 i32 4, i32 5, i32 6, i32 7,362 i32 8, i32 9, i32 10, i32 11,363 i32 12, i32 13, i32 14, i32 15>364 ret <16 x i8> %ret365}366 367; Test a <2 x i64> -> <4 x f32> pack in which only individual elements are368; needed.369define float @f8(i64 %scalar0, i64 %scalar1, i64 %scalar2, i64 %scalar3) {370; CHECK-LABEL: f8:371; CHECK-NOT: vperm372; CHECK-NOT: vpk373; CHECK-NOT: vmrh374; CHECK: aebr {{%f[0-7]}},375; CHECK: aebr {{%f[0-7]}},376; CHECK: meebr %f0,377; CHECK: br %r14378 %vec0 = insertelement <2 x i64> undef, i64 %scalar0, i32 0379 %vec1 = insertelement <2 x i64> undef, i64 %scalar1, i32 0380 %vec2 = insertelement <2 x i64> undef, i64 %scalar2, i32 0381 %vec3 = insertelement <2 x i64> undef, i64 %scalar3, i32 0382 %join0 = shufflevector <2 x i64> %vec0, <2 x i64> %vec1,383 <2 x i32> <i32 0, i32 2>384 %join1 = shufflevector <2 x i64> %vec2, <2 x i64> %vec3,385 <2 x i32> <i32 0, i32 2>386 %bitcast0 = bitcast <2 x i64> %join0 to <4 x float>387 %bitcast1 = bitcast <2 x i64> %join1 to <4 x float>388 %pack = shufflevector <4 x float> %bitcast0, <4 x float> %bitcast1,389 <4 x i32> <i32 1, i32 3, i32 5, i32 7>390 %elt0 = extractelement <4 x float> %pack, i32 0391 %elt1 = extractelement <4 x float> %pack, i32 1392 %elt2 = extractelement <4 x float> %pack, i32 2393 %elt3 = extractelement <4 x float> %pack, i32 3394 %add0 = fadd float %elt0, %elt2395 %add1 = fadd float %elt1, %elt3396 %ret = fmul float %add0, %add1397 ret float %ret398}399 400; Test a <2 x f64> -> <4 x i32> pack in which only individual elements are401; needed.402define i32 @f9(double %scalar0, double %scalar1, double %scalar2,403 double %scalar3) {404; CHECK-LABEL: f9:405; CHECK-NOT: vperm406; CHECK-NOT: vpk407; CHECK-NOT: vmrh408; CHECK: ar {{%r[0-5]}},409; CHECK: ar {{%r[0-5]}},410; CHECK: ork %r2,411; CHECK: br %r14412 %vec0 = insertelement <2 x double> undef, double %scalar0, i32 0413 %vec1 = insertelement <2 x double> undef, double %scalar1, i32 0414 %vec2 = insertelement <2 x double> undef, double %scalar2, i32 0415 %vec3 = insertelement <2 x double> undef, double %scalar3, i32 0416 %join0 = shufflevector <2 x double> %vec0, <2 x double> %vec1,417 <2 x i32> <i32 0, i32 2>418 %join1 = shufflevector <2 x double> %vec2, <2 x double> %vec3,419 <2 x i32> <i32 0, i32 2>420 %bitcast0 = bitcast <2 x double> %join0 to <4 x i32>421 %bitcast1 = bitcast <2 x double> %join1 to <4 x i32>422 %pack = shufflevector <4 x i32> %bitcast0, <4 x i32> %bitcast1,423 <4 x i32> <i32 1, i32 3, i32 5, i32 7>424 %elt0 = extractelement <4 x i32> %pack, i32 0425 %elt1 = extractelement <4 x i32> %pack, i32 1426 %elt2 = extractelement <4 x i32> %pack, i32 2427 %elt3 = extractelement <4 x i32> %pack, i32 3428 %add0 = add i32 %elt0, %elt2429 %add1 = add i32 %elt1, %elt3430 %ret = or i32 %add0, %add1431 ret i32 %ret432}433