1468 lines · plain
1; RUN: llc -mtriple=mips -mattr=+msa,+fp64,+mips32r2 < %s | FileCheck %s2; RUN: llc -mtriple=mipsel -mattr=+msa,+fp64,+mips32r2 < %s | FileCheck %s3 4define void @vshf_v16i8_0(ptr %c, ptr %a, ptr %b) nounwind {5 ; CHECK-LABEL: vshf_v16i8_0:6 7 %1 = load <16 x i8>, ptr %a8 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)9 %2 = shufflevector <16 x i8> %1, <16 x i8> undef, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>10 ; CHECK-DAG: addiu [[PTR_A:\$[0-9]+]], {{.*}}, %lo($11 ; CHECK-DAG: ld.b [[R3:\$w[0-9]+]], 0([[PTR_A]])12 ; CHECK-DAG: vshf.b [[R3]], [[R1]], [[R1]]13 store <16 x i8> %2, ptr %c14 ; CHECK-DAG: st.b [[R3]], 0($4)15 16 ret void17}18 19define void @vshf_v16i8_1(ptr %c, ptr %a, ptr %b) nounwind {20 ; CHECK-LABEL: vshf_v16i8_1:21 22 %1 = load <16 x i8>, ptr %a23 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)24 %2 = shufflevector <16 x i8> %1, <16 x i8> undef, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>25 ; CHECK-DAG: splati.b [[R3:\$w[0-9]+]], [[R1]][1]26 store <16 x i8> %2, ptr %c27 ; CHECK-DAG: st.b [[R3]], 0($4)28 29 ret void30}31 32define void @vshf_v16i8_2(ptr %c, ptr %a, ptr %b) nounwind {33 ; CHECK-LABEL: vshf_v16i8_2:34 35 %1 = load <16 x i8>, ptr %a36 %2 = load <16 x i8>, ptr %b37 ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)38 %3 = shufflevector <16 x i8> %1, <16 x i8> %2, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 16>39 ; CHECK-DAG: addiu [[PTR_A:\$[0-9]+]], {{.*}}, %lo($40 ; CHECK-DAG: ld.b [[R3:\$w[0-9]+]], 0([[PTR_A]])41 ; CHECK-DAG: vshf.b [[R3]], [[R2]], [[R2]]42 store <16 x i8> %3, ptr %c43 ; CHECK-DAG: st.b [[R3]], 0($4)44 45 ret void46}47 48define void @vshf_v16i8_3(ptr %c, ptr %a, ptr %b) nounwind {49 ; CHECK-LABEL: vshf_v16i8_3:50 51 %1 = load <16 x i8>, ptr %a52 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)53 %2 = load <16 x i8>, ptr %b54 ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)55 %3 = shufflevector <16 x i8> %1, <16 x i8> %2, <16 x i32> <i32 17, i32 24, i32 25, i32 18, i32 19, i32 20, i32 28, i32 19, i32 1, i32 8, i32 9, i32 2, i32 3, i32 4, i32 12, i32 3>56 ; CHECK-DAG: addiu [[PTR_A:\$[0-9]+]], {{.*}}, %lo($57 ; CHECK-DAG: ld.b [[R3:\$w[0-9]+]], 0([[PTR_A]])58 ; The concatenation step of vshf is bitwise not vectorwise so we must reverse59 ; the operands to get the right answer.60 ; CHECK-DAG: vshf.b [[R3]], [[R2]], [[R1]]61 store <16 x i8> %3, ptr %c62 ; CHECK-DAG: st.b [[R3]], 0($4)63 64 ret void65}66 67define void @vshf_v16i8_4(ptr %c, ptr %a, ptr %b) nounwind {68 ; CHECK-LABEL: vshf_v16i8_4:69 70 %1 = load <16 x i8>, ptr %a71 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)72 %2 = shufflevector <16 x i8> %1, <16 x i8> %1, <16 x i32> <i32 1, i32 17, i32 1, i32 17, i32 1, i32 17, i32 1, i32 17, i32 1, i32 17, i32 1, i32 17, i32 1, i32 17, i32 1, i32 17>73 ; CHECK-DAG: splati.b [[R3:\$w[0-9]+]], [[R1]][1]74 store <16 x i8> %2, ptr %c75 ; CHECK-DAG: st.b [[R3]], 0($4)76 77 ret void78}79 80define void @vshf_v8i16_0(ptr %c, ptr %a, ptr %b) nounwind {81 ; CHECK-LABEL: vshf_v8i16_0:82 83 %1 = load <8 x i16>, ptr %a84 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)85 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>86 ; CHECK-DAG: addiu [[PTR_A:\$[0-9]+]], {{.*}}, %lo($87 ; CHECK-DAG: ld.h [[R3:\$w[0-9]+]], 0([[PTR_A]])88 ; CHECK-DAG: vshf.h [[R3]], [[R1]], [[R1]]89 store <8 x i16> %2, ptr %c90 ; CHECK-DAG: st.h [[R3]], 0($4)91 92 ret void93}94 95define void @vshf_v8i16_1(ptr %c, ptr %a, ptr %b) nounwind {96 ; CHECK-LABEL: vshf_v8i16_1:97 98 %1 = load <8 x i16>, ptr %a99 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)100 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>101 ; CHECK-DAG: splati.h [[R3:\$w[0-9]+]], [[R1]][1]102 store <8 x i16> %2, ptr %c103 ; CHECK-DAG: st.h [[R3]], 0($4)104 105 ret void106}107 108define void @vshf_v8i16_2(ptr %c, ptr %a, ptr %b) nounwind {109 ; CHECK-LABEL: vshf_v8i16_2:110 111 %1 = load <8 x i16>, ptr %a112 %2 = load <8 x i16>, ptr %b113 ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)114 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 8>115 ; CHECK-DAG: addiu [[PTR_A:\$[0-9]+]], {{.*}}, %lo($116 ; CHECK-DAG: ld.h [[R3:\$w[0-9]+]], 0([[PTR_A]])117 ; CHECK-DAG: vshf.h [[R3]], [[R2]], [[R2]]118 store <8 x i16> %3, ptr %c119 ; CHECK-DAG: st.h [[R3]], 0($4)120 121 ret void122}123 124define void @vshf_v8i16_3(ptr %c, ptr %a, ptr %b) nounwind {125 ; CHECK-LABEL: vshf_v8i16_3:126 127 %1 = load <8 x i16>, ptr %a128 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)129 %2 = load <8 x i16>, ptr %b130 ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)131 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 1, i32 8, i32 9, i32 2, i32 3, i32 4, i32 12, i32 3>132 ; CHECK-DAG: addiu [[PTR_A:\$[0-9]+]], {{.*}}, %lo($133 ; CHECK-DAG: ld.h [[R3:\$w[0-9]+]], 0([[PTR_A]])134 ; The concatenation step of vshf is bitwise not vectorwise so we must reverse135 ; the operands to get the right answer.136 ; CHECK-DAG: vshf.h [[R3]], [[R2]], [[R1]]137 store <8 x i16> %3, ptr %c138 ; CHECK-DAG: st.h [[R3]], 0($4)139 140 ret void141}142 143define void @vshf_v8i16_4(ptr %c, ptr %a, ptr %b) nounwind {144 ; CHECK-LABEL: vshf_v8i16_4:145 146 %1 = load <8 x i16>, ptr %a147 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)148 %2 = shufflevector <8 x i16> %1, <8 x i16> %1, <8 x i32> <i32 1, i32 9, i32 1, i32 9, i32 1, i32 9, i32 1, i32 9>149 ; CHECK-DAG: splati.h [[R3:\$w[0-9]+]], [[R1]][1]150 store <8 x i16> %2, ptr %c151 ; CHECK-DAG: st.h [[R3]], 0($4)152 153 ret void154}155 156; Note: v4i32 only has one 4-element set so it's impossible to get a vshf.w157; instruction when using a single vector.158 159define void @vshf_v4i32_0(ptr %c, ptr %a, ptr %b) nounwind {160 ; CHECK-LABEL: vshf_v4i32_0:161 162 %1 = load <4 x i32>, ptr %a163 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)164 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>165 ; CHECK-DAG: shf.w [[R3:\$w[0-9]+]], [[R1]], 27166 store <4 x i32> %2, ptr %c167 ; CHECK-DAG: st.w [[R3]], 0($4)168 169 ret void170}171 172define void @vshf_v4i32_1(ptr %c, ptr %a, ptr %b) nounwind {173 ; CHECK-LABEL: vshf_v4i32_1:174 175 %1 = load <4 x i32>, ptr %a176 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)177 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>178 ; CHECK-DAG: splati.w [[R3:\$w[0-9]+]], [[R1]][1]179 store <4 x i32> %2, ptr %c180 ; CHECK-DAG: st.w [[R3]], 0($4)181 182 ret void183}184 185define void @vshf_v4i32_2(ptr %c, ptr %a, ptr %b) nounwind {186 ; CHECK-LABEL: vshf_v4i32_2:187 188 %1 = load <4 x i32>, ptr %a189 %2 = load <4 x i32>, ptr %b190 ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)191 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 4, i32 5, i32 6, i32 4>192 ; CHECK-DAG: shf.w [[R3:\$w[0-9]+]], [[R2]], 36193 store <4 x i32> %3, ptr %c194 ; CHECK-DAG: st.w [[R3]], 0($4)195 196 ret void197}198 199define void @vshf_v4i32_3(ptr %c, ptr %a, ptr %b) nounwind {200 ; CHECK-LABEL: vshf_v4i32_3:201 202 %1 = load <4 x i32>, ptr %a203 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)204 %2 = load <4 x i32>, ptr %b205 ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)206 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 1, i32 5, i32 6, i32 4>207 ; CHECK-DAG: addiu [[PTR_A:\$[0-9]+]], {{.*}}, %lo($208 ; CHECK-DAG: ld.w [[R3:\$w[0-9]+]], 0([[PTR_A]])209 ; The concatenation step of vshf is bitwise not vectorwise so we must reverse210 ; the operands to get the right answer.211 ; CHECK-DAG: vshf.w [[R3]], [[R2]], [[R1]]212 store <4 x i32> %3, ptr %c213 ; CHECK-DAG: st.w [[R3]], 0($4)214 215 ret void216}217 218define void @vshf_v4i32_4(ptr %c, ptr %a, ptr %b) nounwind {219 ; CHECK-LABEL: vshf_v4i32_4:220 221 %1 = load <4 x i32>, ptr %a222 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)223 %2 = shufflevector <4 x i32> %1, <4 x i32> %1, <4 x i32> <i32 1, i32 5, i32 5, i32 1>224 ; The two operand vectors are the same so element 1 and 5 are equivalent.225 ; CHECK-DAG: splati.w [[R3:\$w[0-9]+]], [[R1]][1]226 store <4 x i32> %2, ptr %c227 ; CHECK-DAG: st.w [[R3]], 0($4)228 229 ret void230}231 232define void @vshf_v2i64_0(ptr %c, ptr %a, ptr %b) nounwind {233 ; CHECK-LABEL: vshf_v2i64_0:234 235 %1 = load <2 x i64>, ptr %a236 ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)237 %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <2 x i32> <i32 1, i32 0>238 ; CHECK-DAG: addiu [[PTR_A:\$[0-9]+]], {{.*}}, %lo($239 ; CHECK-DAG: ld.d [[R3:\$w[0-9]+]], 0([[PTR_A]])240 ; CHECK-DAG: vshf.d [[R3]], [[R1]], [[R1]]241 store <2 x i64> %2, ptr %c242 ; CHECK-DAG: st.d [[R3]], 0($4)243 244 ret void245}246 247define void @vshf_v2i64_1(ptr %c, ptr %a, ptr %b) nounwind {248 ; CHECK-LABEL: vshf_v2i64_1:249 250 %1 = load <2 x i64>, ptr %a251 ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)252 %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <2 x i32> <i32 1, i32 1>253 ; CHECK-DAG: splati.d [[R3:\$w[0-9]+]], [[R1]][1]254 store <2 x i64> %2, ptr %c255 ; CHECK-DAG: st.d [[R3]], 0($4)256 257 ret void258}259 260define void @vshf_v2i64_2(ptr %c, ptr %a, ptr %b) nounwind {261 ; CHECK-LABEL: vshf_v2i64_2:262 263 %1 = load <2 x i64>, ptr %a264 %2 = load <2 x i64>, ptr %b265 ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)266 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 3, i32 2>267 ; CHECK-DAG: addiu [[PTR_A:\$[0-9]+]], {{.*}}, %lo($268 ; CHECK-DAG: ld.d [[R3:\$w[0-9]+]], 0([[PTR_A]])269 ; CHECK-DAG: vshf.d [[R3]], [[R2]], [[R2]]270 store <2 x i64> %3, ptr %c271 ; CHECK-DAG: st.d [[R3]], 0($4)272 273 ret void274}275 276define void @vshf_v2i64_3(ptr %c, ptr %a, ptr %b) nounwind {277 ; CHECK-LABEL: vshf_v2i64_3:278 279 %1 = load <2 x i64>, ptr %a280 ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)281 %2 = load <2 x i64>, ptr %b282 ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)283 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 1, i32 2>284 ; CHECK-DAG: addiu [[PTR_A:\$[0-9]+]], {{.*}}, %lo($285 ; CHECK-DAG: ld.d [[R3:\$w[0-9]+]], 0([[PTR_A]])286 ; The concatenation step of vshf is bitwise not vectorwise so we must reverse287 ; the operands to get the right answer.288 ; CHECK-DAG: vshf.d [[R3]], [[R2]], [[R1]]289 store <2 x i64> %3, ptr %c290 ; CHECK-DAG: st.d [[R3]], 0($4)291 292 ret void293}294 295define void @vshf_v2i64_4(ptr %c, ptr %a, ptr %b) nounwind {296 ; CHECK-LABEL: vshf_v2i64_4:297 298 %1 = load <2 x i64>, ptr %a299 ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)300 %2 = shufflevector <2 x i64> %1, <2 x i64> %1, <2 x i32> <i32 1, i32 3>301 ; CHECK-DAG: splati.d [[R3:\$w[0-9]+]], [[R1]][1]302 store <2 x i64> %2, ptr %c303 ; CHECK-DAG: st.d [[R3]], 0($4)304 305 ret void306}307 308define void @shf_v16i8_0(ptr %c, ptr %a, ptr %b) nounwind {309 ; CHECK-LABEL: shf_v16i8_0:310 311 %1 = load <16 x i8>, ptr %a312 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)313 %2 = shufflevector <16 x i8> %1, <16 x i8> undef, <16 x i32> <i32 1, i32 3, i32 2, i32 0, i32 5, i32 7, i32 6, i32 4, i32 9, i32 11, i32 10, i32 8, i32 13, i32 15, i32 14, i32 12>314 ; CHECK-DAG: shf.b [[R3:\$w[0-9]+]], [[R1]], 45315 store <16 x i8> %2, ptr %c316 ; CHECK-DAG: st.b [[R3]], 0($4)317 318 ret void319}320 321define void @shf_v8i16_0(ptr %c, ptr %a, ptr %b) nounwind {322 ; CHECK-LABEL: shf_v8i16_0:323 324 %1 = load <8 x i16>, ptr %a325 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)326 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>327 ; CHECK-DAG: shf.h [[R3:\$w[0-9]+]], [[R1]], 27328 store <8 x i16> %2, ptr %c329 ; CHECK-DAG: st.h [[R3]], 0($4)330 331 ret void332}333 334define void @shf_v4i32_0(ptr %c, ptr %a, ptr %b) nounwind {335 ; CHECK-LABEL: shf_v4i32_0:336 337 %1 = load <4 x i32>, ptr %a338 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)339 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>340 ; CHECK-DAG: shf.w [[R3:\$w[0-9]+]], [[R1]], 27341 store <4 x i32> %2, ptr %c342 ; CHECK-DAG: st.w [[R3]], 0($4)343 344 ret void345}346 347; shf.d does not exist348 349define void @ilvev_v16i8_0(ptr %c, ptr %a, ptr %b) nounwind {350 ; CHECK-LABEL: ilvev_v16i8_0:351 352 %1 = load <16 x i8>, ptr %a353 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)354 %2 = load <16 x i8>, ptr %b355 ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)356 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,357 <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30>358 ; CHECK-DAG: ilvev.b [[R3:\$w[0-9]+]], [[R2]], [[R1]]359 store <16 x i8> %3, ptr %c360 ; CHECK-DAG: st.b [[R3]], 0($4)361 362 ret void363}364 365define void @ilvev_v8i16_0(ptr %c, ptr %a, ptr %b) nounwind {366 ; CHECK-LABEL: ilvev_v8i16_0:367 368 %1 = load <8 x i16>, ptr %a369 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)370 %2 = load <8 x i16>, ptr %b371 ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)372 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>373 ; CHECK-DAG: ilvev.h [[R3:\$w[0-9]+]], [[R2]], [[R1]]374 store <8 x i16> %3, ptr %c375 ; CHECK-DAG: st.h [[R3]], 0($4)376 377 ret void378}379 380define void @ilvev_v4i32_0(ptr %c, ptr %a, ptr %b) nounwind {381 ; CHECK-LABEL: ilvev_v4i32_0:382 383 %1 = load <4 x i32>, ptr %a384 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)385 %2 = load <4 x i32>, ptr %b386 ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)387 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 0, i32 4, i32 2, i32 6>388 ; CHECK-DAG: ilvev.w [[R3:\$w[0-9]+]], [[R2]], [[R1]]389 store <4 x i32> %3, ptr %c390 ; CHECK-DAG: st.w [[R3]], 0($4)391 392 ret void393}394 395define void @ilvev_v2i64_0(ptr %c, ptr %a, ptr %b) nounwind {396 ; CHECK-LABEL: ilvev_v2i64_0:397 398 %1 = load <2 x i64>, ptr %a399 ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)400 %2 = load <2 x i64>, ptr %b401 ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)402 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 0, i32 2>403 ; CHECK-DAG: ilvev.d [[R3:\$w[0-9]+]], [[R2]], [[R1]]404 store <2 x i64> %3, ptr %c405 ; CHECK-DAG: st.d [[R3]], 0($4)406 407 ret void408}409 410; Interleaving one operand with itself.411define void @ilvev_v16i8_1(ptr %c, ptr %a, ptr %b) nounwind {412 ; CHECK-LABEL: ilvev_v16i8_1:413 414 %1 = load <16 x i8>, ptr %a415 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)416 %2 = load <16 x i8>, ptr %b417 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,418 <16 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>419 ; CHECK-DAG: ilvev.b [[R3:\$w[0-9]+]], [[R1]], [[R1]]420 store <16 x i8> %3, ptr %c421 ; CHECK-DAG: st.b [[R3]], 0($4)422 423 ret void424}425 426define void @ilvev_v8i16_1(ptr %c, ptr %a, ptr %b) nounwind {427 ; CHECK-LABEL: ilvev_v8i16_1:428 429 %1 = load <8 x i16>, ptr %a430 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)431 %2 = load <8 x i16>, ptr %b432 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 6, i32 6>433 ; CHECK-DAG: ilvev.h [[R3:\$w[0-9]+]], [[R1]], [[R1]]434 store <8 x i16> %3, ptr %c435 ; CHECK-DAG: st.h [[R3]], 0($4)436 437 ret void438}439 440define void @ilvev_v4i32_1(ptr %c, ptr %a, ptr %b) nounwind {441 ; CHECK-LABEL: ilvev_v4i32_1:442 443 %1 = load <4 x i32>, ptr %a444 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)445 %2 = load <4 x i32>, ptr %b446 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 0, i32 0, i32 2, i32 2>447 ; CHECK-DAG: ilvev.w [[R3:\$w[0-9]+]], [[R1]], [[R1]]448 store <4 x i32> %3, ptr %c449 ; CHECK-DAG: st.w [[R3]], 0($4)450 451 ret void452}453 454define void @ilvev_v2i64_1(ptr %c, ptr %a, ptr %b) nounwind {455 ; CHECK-LABEL: ilvev_v2i64_1:456 457 %1 = load <2 x i64>, ptr %a458 ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)459 %2 = load <2 x i64>, ptr %b460 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 0, i32 0>461 ; ilvev.d with two identical operands is equivalent to splati.d462 ; CHECK-DAG: splati.d [[R3:\$w[0-9]+]], [[R1]][0]463 store <2 x i64> %3, ptr %c464 ; CHECK-DAG: st.d [[R3]], 0($4)465 466 ret void467}468 469define void @ilvev_v16i8_2(ptr %c, ptr %a, ptr %b) nounwind {470 ; CHECK-LABEL: ilvev_v16i8_2:471 472 %1 = load <16 x i8>, ptr %a473 %2 = load <16 x i8>, ptr %b474 ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)475 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,476 <16 x i32> <i32 16, i32 16, i32 18, i32 18, i32 20, i32 20, i32 22, i32 22, i32 24, i32 24, i32 26, i32 26, i32 28, i32 28, i32 30, i32 30>477 ; CHECK-DAG: ilvev.b [[R3:\$w[0-9]+]], [[R2]], [[R2]]478 store <16 x i8> %3, ptr %c479 ; CHECK-DAG: st.b [[R3]], 0($4)480 481 ret void482}483 484define void @ilvev_v8i16_2(ptr %c, ptr %a, ptr %b) nounwind {485 ; CHECK-LABEL: ilvev_v8i16_2:486 487 %1 = load <8 x i16>, ptr %a488 %2 = load <8 x i16>, ptr %b489 ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)490 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14, i32 14>491 ; CHECK-DAG: ilvev.h [[R3:\$w[0-9]+]], [[R2]], [[R2]]492 store <8 x i16> %3, ptr %c493 ; CHECK-DAG: st.h [[R3]], 0($4)494 495 ret void496}497 498define void @ilvev_v4i32_2(ptr %c, ptr %a, ptr %b) nounwind {499 ; CHECK-LABEL: ilvev_v4i32_2:500 501 %1 = load <4 x i32>, ptr %a502 %2 = load <4 x i32>, ptr %b503 ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)504 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 4, i32 4, i32 6, i32 6>505 ; CHECK-DAG: ilvev.w [[R3:\$w[0-9]+]], [[R2]], [[R2]]506 store <4 x i32> %3, ptr %c507 ; CHECK-DAG: st.w [[R3]], 0($4)508 509 ret void510}511 512define void @ilvev_v2i64_2(ptr %c, ptr %a, ptr %b) nounwind {513 ; CHECK-LABEL: ilvev_v2i64_2:514 515 %1 = load <2 x i64>, ptr %a516 %2 = load <2 x i64>, ptr %b517 ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)518 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 2, i32 2>519 ; ilvev.d with two identical operands is equivalent to splati.d520 ; CHECK-DAG: splati.d [[R3:\$w[0-9]+]], [[R2]][0]521 store <2 x i64> %3, ptr %c522 ; CHECK-DAG: st.d [[R3]], 0($4)523 524 ret void525}526 527define void @ilvod_v16i8_0(ptr %c, ptr %a, ptr %b) nounwind {528 ; CHECK-LABEL: ilvod_v16i8_0:529 530 %1 = load <16 x i8>, ptr %a531 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)532 %2 = load <16 x i8>, ptr %b533 ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)534 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,535 <16 x i32> <i32 1, i32 17, i32 3, i32 19, i32 5, i32 21, i32 7, i32 23, i32 9, i32 25, i32 11, i32 27, i32 13, i32 29, i32 15, i32 31>536 ; CHECK-DAG: ilvod.b [[R3:\$w[0-9]+]], [[R2]], [[R1]]537 store <16 x i8> %3, ptr %c538 ; CHECK-DAG: st.b [[R3]], 0($4)539 540 ret void541}542 543define void @ilvod_v8i16_0(ptr %c, ptr %a, ptr %b) nounwind {544 ; CHECK-LABEL: ilvod_v8i16_0:545 546 %1 = load <8 x i16>, ptr %a547 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)548 %2 = load <8 x i16>, ptr %b549 ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)550 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>551 ; CHECK-DAG: ilvod.h [[R3:\$w[0-9]+]], [[R2]], [[R1]]552 store <8 x i16> %3, ptr %c553 ; CHECK-DAG: st.h [[R3]], 0($4)554 555 ret void556}557 558define void @ilvod_v4i32_0(ptr %c, ptr %a, ptr %b) nounwind {559 ; CHECK-LABEL: ilvod_v4i32_0:560 561 %1 = load <4 x i32>, ptr %a562 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)563 %2 = load <4 x i32>, ptr %b564 ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)565 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 1, i32 5, i32 3, i32 7>566 ; CHECK-DAG: ilvod.w [[R3:\$w[0-9]+]], [[R2]], [[R1]]567 store <4 x i32> %3, ptr %c568 ; CHECK-DAG: st.w [[R3]], 0($4)569 570 ret void571}572 573define void @ilvod_v2i64_0(ptr %c, ptr %a, ptr %b) nounwind {574 ; CHECK-LABEL: ilvod_v2i64_0:575 576 %1 = load <2 x i64>, ptr %a577 ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)578 %2 = load <2 x i64>, ptr %b579 ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)580 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 1, i32 3>581 ; CHECK-DAG: ilvod.d [[R3:\$w[0-9]+]], [[R2]], [[R1]]582 store <2 x i64> %3, ptr %c583 ; CHECK-DAG: st.d [[R3]], 0($4)584 585 ret void586}587 588define void @ilvod_v16i8_1(ptr %c, ptr %a, ptr %b) nounwind {589 ; CHECK-LABEL: ilvod_v16i8_1:590 591 %1 = load <16 x i8>, ptr %a592 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)593 %2 = load <16 x i8>, ptr %b594 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,595 <16 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7, i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>596 ; CHECK-DAG: ilvod.b [[R3:\$w[0-9]+]], [[R1]], [[R1]]597 store <16 x i8> %3, ptr %c598 ; CHECK-DAG: st.b [[R3]], 0($4)599 600 ret void601}602 603define void @ilvod_v8i16_1(ptr %c, ptr %a, ptr %b) nounwind {604 ; CHECK-LABEL: ilvod_v8i16_1:605 606 %1 = load <8 x i16>, ptr %a607 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)608 %2 = load <8 x i16>, ptr %b609 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 1, i32 1, i32 3, i32 3, i32 5, i32 5, i32 7, i32 7>610 ; CHECK-DAG: ilvod.h [[R3:\$w[0-9]+]], [[R1]], [[R1]]611 store <8 x i16> %3, ptr %c612 ; CHECK-DAG: st.h [[R3]], 0($4)613 614 ret void615}616 617define void @ilvod_v4i32_1(ptr %c, ptr %a, ptr %b) nounwind {618 ; CHECK-LABEL: ilvod_v4i32_1:619 620 %1 = load <4 x i32>, ptr %a621 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)622 %2 = load <4 x i32>, ptr %b623 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 1, i32 1, i32 3, i32 3>624 ; CHECK-DAG: ilvod.w [[R3:\$w[0-9]+]], [[R1]], [[R1]]625 store <4 x i32> %3, ptr %c626 ; CHECK-DAG: st.w [[R3]], 0($4)627 628 ret void629}630 631define void @ilvod_v2i64_1(ptr %c, ptr %a, ptr %b) nounwind {632 ; CHECK-LABEL: ilvod_v2i64_1:633 634 %1 = load <2 x i64>, ptr %a635 ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)636 %2 = load <2 x i64>, ptr %b637 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 1, i32 1>638 ; ilvod.d with two identical operands is equivalent to splati.d639 ; CHECK-DAG: splati.d [[R3:\$w[0-9]+]], [[R1]][1]640 store <2 x i64> %3, ptr %c641 ; CHECK-DAG: st.d [[R3]], 0($4)642 643 ret void644}645 646define void @ilvod_v16i8_2(ptr %c, ptr %a, ptr %b) nounwind {647 ; CHECK-LABEL: ilvod_v16i8_2:648 649 %1 = load <16 x i8>, ptr %a650 %2 = load <16 x i8>, ptr %b651 ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)652 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,653 <16 x i32> <i32 17, i32 17, i32 19, i32 19, i32 21, i32 21, i32 23, i32 23, i32 25, i32 25, i32 27, i32 27, i32 29, i32 29, i32 31, i32 31>654 ; CHECK-DAG: ilvod.b [[R3:\$w[0-9]+]], [[R2]], [[R2]]655 store <16 x i8> %3, ptr %c656 ; CHECK-DAG: st.b [[R3]], 0($4)657 658 ret void659}660 661define void @ilvod_v8i16_2(ptr %c, ptr %a, ptr %b) nounwind {662 ; CHECK-LABEL: ilvod_v8i16_2:663 664 %1 = load <8 x i16>, ptr %a665 %2 = load <8 x i16>, ptr %b666 ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)667 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 9, i32 9, i32 11, i32 11, i32 13, i32 13, i32 15, i32 15>668 ; CHECK-DAG: ilvod.h [[R3:\$w[0-9]+]], [[R2]], [[R2]]669 store <8 x i16> %3, ptr %c670 ; CHECK-DAG: st.h [[R3]], 0($4)671 672 ret void673}674 675define void @ilvod_v4i32_2(ptr %c, ptr %a, ptr %b) nounwind {676 ; CHECK-LABEL: ilvod_v4i32_2:677 678 %1 = load <4 x i32>, ptr %a679 %2 = load <4 x i32>, ptr %b680 ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)681 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 5, i32 5, i32 7, i32 7>682 ; CHECK-DAG: ilvod.w [[R3:\$w[0-9]+]], [[R2]], [[R2]]683 store <4 x i32> %3, ptr %c684 ; CHECK-DAG: st.w [[R3]], 0($4)685 686 ret void687}688 689define void @ilvod_v2i64_2(ptr %c, ptr %a, ptr %b) nounwind {690 ; CHECK-LABEL: ilvod_v2i64_2:691 692 %1 = load <2 x i64>, ptr %a693 %2 = load <2 x i64>, ptr %b694 ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)695 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 3, i32 3>696 ; ilvod.d with two identical operands is equivalent to splati.d697 ; CHECK-DAG: splati.d [[R3:\$w[0-9]+]], [[R2]][1]698 store <2 x i64> %3, ptr %c699 ; CHECK-DAG: st.d [[R3]], 0($4)700 701 ret void702}703 704define void @ilvr_v16i8_0(ptr %c, ptr %a, ptr %b) nounwind {705 ; CHECK-LABEL: ilvr_v16i8_0:706 707 %1 = load <16 x i8>, ptr %a708 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)709 %2 = load <16 x i8>, ptr %b710 ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)711 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,712 <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23>713 ; CHECK-DAG: ilvr.b [[R3:\$w[0-9]+]], [[R2]], [[R1]]714 store <16 x i8> %3, ptr %c715 ; CHECK-DAG: st.b [[R3]], 0($4)716 717 ret void718}719 720define void @ilvr_v8i16_0(ptr %c, ptr %a, ptr %b) nounwind {721 ; CHECK-LABEL: ilvr_v8i16_0:722 723 %1 = load <8 x i16>, ptr %a724 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)725 %2 = load <8 x i16>, ptr %b726 ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)727 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>728 ; CHECK-DAG: ilvr.h [[R3:\$w[0-9]+]], [[R2]], [[R1]]729 store <8 x i16> %3, ptr %c730 ; CHECK-DAG: st.h [[R3]], 0($4)731 732 ret void733}734 735define void @ilvr_v4i32_0(ptr %c, ptr %a, ptr %b) nounwind {736 ; CHECK-LABEL: ilvr_v4i32_0:737 738 %1 = load <4 x i32>, ptr %a739 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)740 %2 = load <4 x i32>, ptr %b741 ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)742 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 0, i32 4, i32 1, i32 5>743 ; CHECK-DAG: ilvr.w [[R3:\$w[0-9]+]], [[R2]], [[R1]]744 store <4 x i32> %3, ptr %c745 ; CHECK-DAG: st.w [[R3]], 0($4)746 747 ret void748}749 750define void @ilvr_v2i64_0(ptr %c, ptr %a, ptr %b) nounwind {751 ; CHECK-LABEL: ilvr_v2i64_0:752 753 %1 = load <2 x i64>, ptr %a754 ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)755 %2 = load <2 x i64>, ptr %b756 ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)757 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 0, i32 2>758 ; ilvr.d and ilvev.d are equivalent for v2i64759 ; CHECK-DAG: ilvev.d [[R3:\$w[0-9]+]], [[R2]], [[R1]]760 store <2 x i64> %3, ptr %c761 ; CHECK-DAG: st.d [[R3]], 0($4)762 763 ret void764}765 766define void @ilvr_v16i8_1(ptr %c, ptr %a, ptr %b) nounwind {767 ; CHECK-LABEL: ilvr_v16i8_1:768 769 %1 = load <16 x i8>, ptr %a770 %2 = load <16 x i8>, ptr %b771 ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)772 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,773 <16 x i32> <i32 16, i32 16, i32 17, i32 17, i32 18, i32 18, i32 19, i32 19, i32 20, i32 20, i32 21, i32 21, i32 22, i32 22, i32 23, i32 23>774 ; CHECK-DAG: ilvr.b [[R3:\$w[0-9]+]], [[R2]], [[R2]]775 store <16 x i8> %3, ptr %c776 ; CHECK-DAG: st.b [[R3]], 0($4)777 778 ret void779}780 781define void @ilvr_v8i16_1(ptr %c, ptr %a, ptr %b) nounwind {782 ; CHECK-LABEL: ilvr_v8i16_1:783 784 %1 = load <8 x i16>, ptr %a785 %2 = load <8 x i16>, ptr %b786 ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)787 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 8, i32 8, i32 9, i32 9, i32 10, i32 10, i32 11, i32 11>788 ; CHECK-DAG: ilvr.h [[R3:\$w[0-9]+]], [[R2]], [[R2]]789 store <8 x i16> %3, ptr %c790 ; CHECK-DAG: st.h [[R3]], 0($4)791 792 ret void793}794 795define void @ilvr_v4i32_1(ptr %c, ptr %a, ptr %b) nounwind {796 ; CHECK-LABEL: ilvr_v4i32_1:797 798 %1 = load <4 x i32>, ptr %a799 %2 = load <4 x i32>, ptr %b800 ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)801 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 4, i32 4, i32 5, i32 5>802 ; CHECK-DAG: ilvr.w [[R3:\$w[0-9]+]], [[R2]], [[R2]]803 store <4 x i32> %3, ptr %c804 ; CHECK-DAG: st.w [[R3]], 0($4)805 806 ret void807}808 809define void @ilvr_v2i64_1(ptr %c, ptr %a, ptr %b) nounwind {810 ; CHECK-LABEL: ilvr_v2i64_1:811 812 %1 = load <2 x i64>, ptr %a813 %2 = load <2 x i64>, ptr %b814 ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)815 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 2, i32 2>816 ; ilvr.d and splati.d are equivalent for v2i64817 ; CHECK-DAG: splati.d [[R3:\$w[0-9]+]], [[R2]][0]818 store <2 x i64> %3, ptr %c819 ; CHECK-DAG: st.d [[R3]], 0($4)820 821 ret void822}823 824define void @ilvr_v16i8_2(ptr %c, ptr %a, ptr %b) nounwind {825 ; CHECK-LABEL: ilvr_v16i8_2:826 827 %1 = load <16 x i8>, ptr %a828 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)829 %2 = load <16 x i8>, ptr %b830 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,831 <16 x i32> <i32 0, i32 0, i32 1, i32 1, i32 2, i32 2, i32 3, i32 3, i32 4, i32 4, i32 5, i32 5, i32 6, i32 6, i32 7, i32 7>832 ; CHECK-DAG: ilvr.b [[R3:\$w[0-9]+]], [[R1]], [[R1]]833 store <16 x i8> %3, ptr %c834 ; CHECK-DAG: st.b [[R3]], 0($4)835 836 ret void837}838 839define void @ilvr_v8i16_2(ptr %c, ptr %a, ptr %b) nounwind {840 ; CHECK-LABEL: ilvr_v8i16_2:841 842 %1 = load <8 x i16>, ptr %a843 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)844 %2 = load <8 x i16>, ptr %b845 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 0, i32 0, i32 1, i32 1, i32 2, i32 2, i32 3, i32 3>846 ; CHECK-DAG: ilvr.h [[R3:\$w[0-9]+]], [[R1]], [[R1]]847 store <8 x i16> %3, ptr %c848 ; CHECK-DAG: st.h [[R3]], 0($4)849 850 ret void851}852 853define void @ilvr_v4i32_2(ptr %c, ptr %a, ptr %b) nounwind {854 ; CHECK-LABEL: ilvr_v4i32_2:855 856 %1 = load <4 x i32>, ptr %a857 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)858 %2 = load <4 x i32>, ptr %b859 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 0, i32 0, i32 1, i32 1>860 ; CHECK-DAG: ilvr.w [[R3:\$w[0-9]+]], [[R1]], [[R1]]861 store <4 x i32> %3, ptr %c862 ; CHECK-DAG: st.w [[R3]], 0($4)863 864 ret void865}866 867define void @ilvr_v2i64_2(ptr %c, ptr %a, ptr %b) nounwind {868 ; CHECK-LABEL: ilvr_v2i64_2:869 870 %1 = load <2 x i64>, ptr %a871 ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)872 %2 = load <2 x i64>, ptr %b873 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 0, i32 0>874 ; ilvr.d and splati.d are equivalent for v2i64875 ; CHECK-DAG: splati.d [[R3:\$w[0-9]+]], [[R1]][0]876 store <2 x i64> %3, ptr %c877 ; CHECK-DAG: st.d [[R3]], 0($4)878 879 ret void880}881 882define void @ilvl_v16i8_0(ptr %c, ptr %a, ptr %b) nounwind {883 ; CHECK-LABEL: ilvl_v16i8_0:884 885 %1 = load <16 x i8>, ptr %a886 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)887 %2 = load <16 x i8>, ptr %b888 ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)889 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,890 <16 x i32> <i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>891 ; CHECK-DAG: ilvl.b [[R3:\$w[0-9]+]], [[R2]], [[R1]]892 store <16 x i8> %3, ptr %c893 ; CHECK-DAG: st.b [[R3]], 0($4)894 895 ret void896}897 898define void @ilvl_v8i16_0(ptr %c, ptr %a, ptr %b) nounwind {899 ; CHECK-LABEL: ilvl_v8i16_0:900 901 %1 = load <8 x i16>, ptr %a902 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)903 %2 = load <8 x i16>, ptr %b904 ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)905 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>906 ; CHECK-DAG: ilvl.h [[R3:\$w[0-9]+]], [[R2]], [[R1]]907 store <8 x i16> %3, ptr %c908 ; CHECK-DAG: st.h [[R3]], 0($4)909 910 ret void911}912 913define void @ilvl_v4i32_0(ptr %c, ptr %a, ptr %b) nounwind {914 ; CHECK-LABEL: ilvl_v4i32_0:915 916 %1 = load <4 x i32>, ptr %a917 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)918 %2 = load <4 x i32>, ptr %b919 ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)920 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 2, i32 6, i32 3, i32 7>921 ; CHECK-DAG: ilvl.w [[R3:\$w[0-9]+]], [[R2]], [[R1]]922 store <4 x i32> %3, ptr %c923 ; CHECK-DAG: st.w [[R3]], 0($4)924 925 ret void926}927 928define void @ilvl_v2i64_0(ptr %c, ptr %a, ptr %b) nounwind {929 ; CHECK-LABEL: ilvl_v2i64_0:930 931 %1 = load <2 x i64>, ptr %a932 ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)933 %2 = load <2 x i64>, ptr %b934 ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)935 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 1, i32 3>936 ; ilvl.d and ilvod.d are equivalent for v2i64937 ; CHECK-DAG: ilvod.d [[R3:\$w[0-9]+]], [[R2]], [[R1]]938 store <2 x i64> %3, ptr %c939 ; CHECK-DAG: st.d [[R3]], 0($4)940 941 ret void942}943 944define void @ilvl_v16i8_1(ptr %c, ptr %a, ptr %b) nounwind {945 ; CHECK-LABEL: ilvl_v16i8_1:946 947 %1 = load <16 x i8>, ptr %a948 %2 = load <16 x i8>, ptr %b949 ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)950 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,951 <16 x i32> <i32 24, i32 24, i32 25, i32 25, i32 26, i32 26, i32 27, i32 27, i32 28, i32 28, i32 29, i32 29, i32 30, i32 30, i32 31, i32 31>952 ; CHECK-DAG: ilvl.b [[R3:\$w[0-9]+]], [[R2]], [[R2]]953 store <16 x i8> %3, ptr %c954 ; CHECK-DAG: st.b [[R3]], 0($4)955 956 ret void957}958 959define void @ilvl_v8i16_1(ptr %c, ptr %a, ptr %b) nounwind {960 ; CHECK-LABEL: ilvl_v8i16_1:961 962 %1 = load <8 x i16>, ptr %a963 %2 = load <8 x i16>, ptr %b964 ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)965 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 12, i32 12, i32 13, i32 13, i32 14, i32 14, i32 15, i32 15>966 ; CHECK-DAG: ilvl.h [[R3:\$w[0-9]+]], [[R2]], [[R2]]967 store <8 x i16> %3, ptr %c968 ; CHECK-DAG: st.h [[R3]], 0($4)969 970 ret void971}972 973define void @ilvl_v4i32_1(ptr %c, ptr %a, ptr %b) nounwind {974 ; CHECK-LABEL: ilvl_v4i32_1:975 976 %1 = load <4 x i32>, ptr %a977 %2 = load <4 x i32>, ptr %b978 ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)979 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 6, i32 6, i32 7, i32 7>980 ; CHECK-DAG: ilvl.w [[R3:\$w[0-9]+]], [[R2]], [[R2]]981 store <4 x i32> %3, ptr %c982 ; CHECK-DAG: st.w [[R3]], 0($4)983 984 ret void985}986 987define void @ilvl_v2i64_1(ptr %c, ptr %a, ptr %b) nounwind {988 ; CHECK-LABEL: ilvl_v2i64_1:989 990 %1 = load <2 x i64>, ptr %a991 %2 = load <2 x i64>, ptr %b992 ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)993 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 3, i32 3>994 ; ilvl.d and splati.d are equivalent for v2i64995 ; CHECK-DAG: splati.d [[R3:\$w[0-9]+]], [[R2]][1]996 store <2 x i64> %3, ptr %c997 ; CHECK-DAG: st.d [[R3]], 0($4)998 999 ret void1000}1001 1002define void @ilvl_v16i8_2(ptr %c, ptr %a, ptr %b) nounwind {1003 ; CHECK-LABEL: ilvl_v16i8_2:1004 1005 %1 = load <16 x i8>, ptr %a1006 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)1007 %2 = load <16 x i8>, ptr %b1008 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,1009 <16 x i32> <i32 8, i32 8, i32 9, i32 9, i32 10, i32 10, i32 11, i32 11, i32 12, i32 12, i32 13, i32 13, i32 14, i32 14, i32 15, i32 15>1010 ; CHECK-DAG: ilvl.b [[R3:\$w[0-9]+]], [[R1]], [[R1]]1011 store <16 x i8> %3, ptr %c1012 ; CHECK-DAG: st.b [[R3]], 0($4)1013 1014 ret void1015}1016 1017define void @ilvl_v8i16_2(ptr %c, ptr %a, ptr %b) nounwind {1018 ; CHECK-LABEL: ilvl_v8i16_2:1019 1020 %1 = load <8 x i16>, ptr %a1021 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)1022 %2 = load <8 x i16>, ptr %b1023 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 4, i32 4, i32 5, i32 5, i32 6, i32 6, i32 7, i32 7>1024 ; CHECK-DAG: ilvl.h [[R3:\$w[0-9]+]], [[R1]], [[R1]]1025 store <8 x i16> %3, ptr %c1026 ; CHECK-DAG: st.h [[R3]], 0($4)1027 1028 ret void1029}1030 1031define void @ilvl_v4i32_2(ptr %c, ptr %a, ptr %b) nounwind {1032 ; CHECK-LABEL: ilvl_v4i32_2:1033 1034 %1 = load <4 x i32>, ptr %a1035 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)1036 %2 = load <4 x i32>, ptr %b1037 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 2, i32 2, i32 3, i32 3>1038 ; CHECK-DAG: ilvl.w [[R3:\$w[0-9]+]], [[R1]], [[R1]]1039 store <4 x i32> %3, ptr %c1040 ; CHECK-DAG: st.w [[R3]], 0($4)1041 1042 ret void1043}1044 1045define void @ilvl_v2i64_2(ptr %c, ptr %a, ptr %b) nounwind {1046 ; CHECK-LABEL: ilvl_v2i64_2:1047 1048 %1 = load <2 x i64>, ptr %a1049 ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)1050 %2 = load <2 x i64>, ptr %b1051 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 1, i32 1>1052 ; ilvl.d and splati.d are equivalent for v2i641053 ; CHECK-DAG: splati.d [[R3:\$w[0-9]+]], [[R1]][1]1054 store <2 x i64> %3, ptr %c1055 ; CHECK-DAG: st.d [[R3]], 0($4)1056 1057 ret void1058}1059 1060define void @pckev_v16i8_0(ptr %c, ptr %a, ptr %b) nounwind {1061 ; CHECK-LABEL: pckev_v16i8_0:1062 1063 %1 = load <16 x i8>, ptr %a1064 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)1065 %2 = load <16 x i8>, ptr %b1066 ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)1067 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,1068 <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>1069 ; CHECK-DAG: pckev.b [[R3:\$w[0-9]+]], [[R2]], [[R1]]1070 store <16 x i8> %3, ptr %c1071 ; CHECK-DAG: st.b [[R3]], 0($4)1072 1073 ret void1074}1075 1076define void @pckev_v8i16_0(ptr %c, ptr %a, ptr %b) nounwind {1077 ; CHECK-LABEL: pckev_v8i16_0:1078 1079 %1 = load <8 x i16>, ptr %a1080 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)1081 %2 = load <8 x i16>, ptr %b1082 ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)1083 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>1084 ; CHECK-DAG: pckev.h [[R3:\$w[0-9]+]], [[R2]], [[R1]]1085 store <8 x i16> %3, ptr %c1086 ; CHECK-DAG: st.h [[R3]], 0($4)1087 1088 ret void1089}1090 1091define void @pckev_v4i32_0(ptr %c, ptr %a, ptr %b) nounwind {1092 ; CHECK-LABEL: pckev_v4i32_0:1093 1094 %1 = load <4 x i32>, ptr %a1095 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)1096 %2 = load <4 x i32>, ptr %b1097 ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)1098 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 0, i32 2, i32 4, i32 6>1099 ; CHECK-DAG: pckev.w [[R3:\$w[0-9]+]], [[R2]], [[R1]]1100 store <4 x i32> %3, ptr %c1101 ; CHECK-DAG: st.w [[R3]], 0($4)1102 1103 ret void1104}1105 1106define void @pckev_v2i64_0(ptr %c, ptr %a, ptr %b) nounwind {1107 ; CHECK-LABEL: pckev_v2i64_0:1108 1109 %1 = load <2 x i64>, ptr %a1110 ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)1111 %2 = load <2 x i64>, ptr %b1112 ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)1113 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 0, i32 2>1114 ; pckev.d and ilvev.d are equivalent for v2i641115 ; CHECK-DAG: ilvev.d [[R3:\$w[0-9]+]], [[R2]], [[R1]]1116 store <2 x i64> %3, ptr %c1117 ; CHECK-DAG: st.d [[R3]], 0($4)1118 1119 ret void1120}1121 1122define void @pckev_v16i8_1(ptr %c, ptr %a, ptr %b) nounwind {1123 ; CHECK-LABEL: pckev_v16i8_1:1124 1125 %1 = load <16 x i8>, ptr %a1126 %2 = load <16 x i8>, ptr %b1127 ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)1128 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,1129 <16 x i32> <i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>1130 ; CHECK-DAG: pckev.b [[R3:\$w[0-9]+]], [[R2]], [[R2]]1131 store <16 x i8> %3, ptr %c1132 ; CHECK-DAG: st.b [[R3]], 0($4)1133 1134 ret void1135}1136 1137define void @pckev_v8i16_1(ptr %c, ptr %a, ptr %b) nounwind {1138 ; CHECK-LABEL: pckev_v8i16_1:1139 1140 %1 = load <8 x i16>, ptr %a1141 %2 = load <8 x i16>, ptr %b1142 ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)1143 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 8, i32 10, i32 12, i32 14, i32 8, i32 10, i32 12, i32 14>1144 ; CHECK-DAG: pckev.h [[R3:\$w[0-9]+]], [[R2]], [[R2]]1145 store <8 x i16> %3, ptr %c1146 ; CHECK-DAG: st.h [[R3]], 0($4)1147 1148 ret void1149}1150 1151define void @pckev_v4i32_1(ptr %c, ptr %a, ptr %b) nounwind {1152 ; CHECK-LABEL: pckev_v4i32_1:1153 1154 %1 = load <4 x i32>, ptr %a1155 %2 = load <4 x i32>, ptr %b1156 ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)1157 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 4, i32 6, i32 4, i32 6>1158 ; CHECK-DAG: pckev.w [[R3:\$w[0-9]+]], [[R2]], [[R2]]1159 store <4 x i32> %3, ptr %c1160 ; CHECK-DAG: st.w [[R3]], 0($4)1161 1162 ret void1163}1164 1165define void @pckev_v2i64_1(ptr %c, ptr %a, ptr %b) nounwind {1166 ; CHECK-LABEL: pckev_v2i64_1:1167 1168 %1 = load <2 x i64>, ptr %a1169 %2 = load <2 x i64>, ptr %b1170 ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)1171 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 2, i32 2>1172 ; pckev.d and splati.d are equivalent for v2i641173 ; CHECK-DAG: splati.d [[R3:\$w[0-9]+]], [[R2]][0]1174 store <2 x i64> %3, ptr %c1175 ; CHECK-DAG: st.d [[R3]], 0($4)1176 1177 ret void1178}1179 1180define void @pckev_v16i8_2(ptr %c, ptr %a, ptr %b) nounwind {1181 ; CHECK-LABEL: pckev_v16i8_2:1182 1183 %1 = load <16 x i8>, ptr %a1184 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)1185 %2 = load <16 x i8>, ptr %b1186 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,1187 <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>1188 ; CHECK-DAG: pckev.b [[R3:\$w[0-9]+]], [[R1]], [[R1]]1189 store <16 x i8> %3, ptr %c1190 ; CHECK-DAG: st.b [[R3]], 0($4)1191 1192 ret void1193}1194 1195define void @pckev_v8i16_2(ptr %c, ptr %a, ptr %b) nounwind {1196 ; CHECK-LABEL: pckev_v8i16_2:1197 1198 %1 = load <8 x i16>, ptr %a1199 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)1200 %2 = load <8 x i16>, ptr %b1201 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 0, i32 2, i32 4, i32 6>1202 ; CHECK-DAG: pckev.h [[R3:\$w[0-9]+]], [[R1]], [[R1]]1203 store <8 x i16> %3, ptr %c1204 ; CHECK-DAG: st.h [[R3]], 0($4)1205 1206 ret void1207}1208 1209define void @pckev_v4i32_2(ptr %c, ptr %a, ptr %b) nounwind {1210 ; CHECK-LABEL: pckev_v4i32_2:1211 1212 %1 = load <4 x i32>, ptr %a1213 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)1214 %2 = load <4 x i32>, ptr %b1215 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 0, i32 2, i32 0, i32 2>1216 ; CHECK-DAG: pckev.w [[R3:\$w[0-9]+]], [[R1]], [[R1]]1217 store <4 x i32> %3, ptr %c1218 ; CHECK-DAG: st.w [[R3]], 0($4)1219 1220 ret void1221}1222 1223define void @pckev_v2i64_2(ptr %c, ptr %a, ptr %b) nounwind {1224 ; CHECK-LABEL: pckev_v2i64_2:1225 1226 %1 = load <2 x i64>, ptr %a1227 ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)1228 %2 = load <2 x i64>, ptr %b1229 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 0, i32 0>1230 ; pckev.d and splati.d are equivalent for v2i641231 ; CHECK-DAG: splati.d [[R3:\$w[0-9]+]], [[R1]][0]1232 store <2 x i64> %3, ptr %c1233 ; CHECK-DAG: st.d [[R3]], 0($4)1234 1235 ret void1236}1237 1238define void @pckod_v16i8_0(ptr %c, ptr %a, ptr %b) nounwind {1239 ; CHECK-LABEL: pckod_v16i8_0:1240 1241 %1 = load <16 x i8>, ptr %a1242 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)1243 %2 = load <16 x i8>, ptr %b1244 ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)1245 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,1246 <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>1247 ; CHECK-DAG: pckod.b [[R3:\$w[0-9]+]], [[R2]], [[R1]]1248 store <16 x i8> %3, ptr %c1249 ; CHECK-DAG: st.b [[R3]], 0($4)1250 1251 ret void1252}1253 1254define void @pckod_v8i16_0(ptr %c, ptr %a, ptr %b) nounwind {1255 ; CHECK-LABEL: pckod_v8i16_0:1256 1257 %1 = load <8 x i16>, ptr %a1258 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)1259 %2 = load <8 x i16>, ptr %b1260 ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)1261 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>1262 ; CHECK-DAG: pckod.h [[R3:\$w[0-9]+]], [[R2]], [[R1]]1263 store <8 x i16> %3, ptr %c1264 ; CHECK-DAG: st.h [[R3]], 0($4)1265 1266 ret void1267}1268 1269define void @pckod_v4i32_0(ptr %c, ptr %a, ptr %b) nounwind {1270 ; CHECK-LABEL: pckod_v4i32_0:1271 1272 %1 = load <4 x i32>, ptr %a1273 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)1274 %2 = load <4 x i32>, ptr %b1275 ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)1276 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 1, i32 3, i32 5, i32 7>1277 ; CHECK-DAG: pckod.w [[R3:\$w[0-9]+]], [[R2]], [[R1]]1278 store <4 x i32> %3, ptr %c1279 ; CHECK-DAG: st.w [[R3]], 0($4)1280 1281 ret void1282}1283 1284define void @pckod_v2i64_0(ptr %c, ptr %a, ptr %b) nounwind {1285 ; CHECK-LABEL: pckod_v2i64_0:1286 1287 %1 = load <2 x i64>, ptr %a1288 ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)1289 %2 = load <2 x i64>, ptr %b1290 ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)1291 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 1, i32 3>1292 ; pckod.d and ilvod.d are equivalent for v2i641293 ; CHECK-DAG: ilvod.d [[R3:\$w[0-9]+]], [[R2]], [[R1]]1294 store <2 x i64> %3, ptr %c1295 ; CHECK-DAG: st.d [[R3]], 0($4)1296 1297 ret void1298}1299 1300define void @pckod_v16i8_1(ptr %c, ptr %a, ptr %b) nounwind {1301 ; CHECK-LABEL: pckod_v16i8_1:1302 1303 %1 = load <16 x i8>, ptr %a1304 %2 = load <16 x i8>, ptr %b1305 ; CHECK-DAG: ld.b [[R2:\$w[0-9]+]], 0($6)1306 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,1307 <16 x i32> <i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>1308 ; CHECK-DAG: pckod.b [[R3:\$w[0-9]+]], [[R2]], [[R2]]1309 store <16 x i8> %3, ptr %c1310 ; CHECK-DAG: st.b [[R3]], 0($4)1311 1312 ret void1313}1314 1315define void @pckod_v8i16_1(ptr %c, ptr %a, ptr %b) nounwind {1316 ; CHECK-LABEL: pckod_v8i16_1:1317 1318 %1 = load <8 x i16>, ptr %a1319 %2 = load <8 x i16>, ptr %b1320 ; CHECK-DAG: ld.h [[R2:\$w[0-9]+]], 0($6)1321 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 9, i32 11, i32 13, i32 15, i32 9, i32 11, i32 13, i32 15>1322 ; CHECK-DAG: pckod.h [[R3:\$w[0-9]+]], [[R2]], [[R2]]1323 store <8 x i16> %3, ptr %c1324 ; CHECK-DAG: st.h [[R3]], 0($4)1325 1326 ret void1327}1328 1329define void @pckod_v4i32_1(ptr %c, ptr %a, ptr %b) nounwind {1330 ; CHECK-LABEL: pckod_v4i32_1:1331 1332 %1 = load <4 x i32>, ptr %a1333 %2 = load <4 x i32>, ptr %b1334 ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6)1335 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 5, i32 7, i32 5, i32 7>1336 ; CHECK-DAG: pckod.w [[R3:\$w[0-9]+]], [[R2]], [[R2]]1337 store <4 x i32> %3, ptr %c1338 ; CHECK-DAG: st.w [[R3]], 0($4)1339 1340 ret void1341}1342 1343define void @pckod_v2i64_1(ptr %c, ptr %a, ptr %b) nounwind {1344 ; CHECK-LABEL: pckod_v2i64_1:1345 1346 %1 = load <2 x i64>, ptr %a1347 %2 = load <2 x i64>, ptr %b1348 ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6)1349 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 3, i32 3>1350 ; pckod.d and splati.d are equivalent for v2i641351 ; CHECK-DAG: splati.d [[R3:\$w[0-9]+]], [[R2]][1]1352 store <2 x i64> %3, ptr %c1353 ; CHECK-DAG: st.d [[R3]], 0($4)1354 1355 ret void1356}1357 1358define void @pckod_v16i8_2(ptr %c, ptr %a, ptr %b) nounwind {1359 ; CHECK-LABEL: pckod_v16i8_2:1360 1361 %1 = load <16 x i8>, ptr %a1362 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)1363 %2 = load <16 x i8>, ptr %b1364 %3 = shufflevector <16 x i8> %1, <16 x i8> %2,1365 <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>1366 ; CHECK-DAG: pckod.b [[R3:\$w[0-9]+]], [[R1]], [[R1]]1367 store <16 x i8> %3, ptr %c1368 ; CHECK-DAG: st.b [[R3]], 0($4)1369 1370 ret void1371}1372 1373define void @pckod_v8i16_2(ptr %c, ptr %a, ptr %b) nounwind {1374 ; CHECK-LABEL: pckod_v8i16_2:1375 1376 %1 = load <8 x i16>, ptr %a1377 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)1378 %2 = load <8 x i16>, ptr %b1379 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 1, i32 3, i32 5, i32 7>1380 ; CHECK-DAG: pckod.h [[R3:\$w[0-9]+]], [[R1]], [[R1]]1381 store <8 x i16> %3, ptr %c1382 ; CHECK-DAG: st.h [[R3]], 0($4)1383 1384 ret void1385}1386 1387define void @pckod_v4i32_2(ptr %c, ptr %a, ptr %b) nounwind {1388 ; CHECK-LABEL: pckod_v4i32_2:1389 1390 %1 = load <4 x i32>, ptr %a1391 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)1392 %2 = load <4 x i32>, ptr %b1393 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <4 x i32> <i32 1, i32 3, i32 1, i32 3>1394 ; CHECK-DAG: pckod.w [[R3:\$w[0-9]+]], [[R1]], [[R1]]1395 store <4 x i32> %3, ptr %c1396 ; CHECK-DAG: st.w [[R3]], 0($4)1397 1398 ret void1399}1400 1401define void @pckod_v2i64_2(ptr %c, ptr %a, ptr %b) nounwind {1402 ; CHECK-LABEL: pckod_v2i64_2:1403 1404 %1 = load <2 x i64>, ptr %a1405 ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)1406 %2 = load <2 x i64>, ptr %b1407 %3 = shufflevector <2 x i64> %1, <2 x i64> %2, <2 x i32> <i32 1, i32 1>1408 ; pckod.d and splati.d are equivalent for v2i641409 ; CHECK-DAG: splati.d [[R3:\$w[0-9]+]], [[R1]][1]1410 store <2 x i64> %3, ptr %c1411 ; CHECK-DAG: st.d [[R3]], 0($4)1412 1413 ret void1414}1415 1416define void @splati_v16i8_0(ptr %c, ptr %a) nounwind {1417 ; CHECK-LABEL: splati_v16i8_0:1418 1419 %1 = load <16 x i8>, ptr %a1420 ; CHECK-DAG: ld.b [[R1:\$w[0-9]+]], 0($5)1421 %2 = shufflevector <16 x i8> %1, <16 x i8> undef,1422 <16 x i32> <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>1423 ; CHECK-DAG: splati.b [[R3:\$w[0-9]+]], [[R1]][4]1424 store <16 x i8> %2, ptr %c1425 ; CHECK-DAG: st.b [[R3]], 0($4)1426 1427 ret void1428}1429 1430define void @splati_v8i16_0(ptr %c, ptr %a) nounwind {1431 ; CHECK-LABEL: splati_v8i16_0:1432 1433 %1 = load <8 x i16>, ptr %a1434 ; CHECK-DAG: ld.h [[R1:\$w[0-9]+]], 0($5)1435 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>1436 ; CHECK-DAG: splati.h [[R3:\$w[0-9]+]], [[R1]][4]1437 store <8 x i16> %2, ptr %c1438 ; CHECK-DAG: st.h [[R3]], 0($4)1439 1440 ret void1441}1442 1443define void @splati_v4i32_0(ptr %c, ptr %a) nounwind {1444 ; CHECK-LABEL: splati_v4i32_0:1445 1446 %1 = load <4 x i32>, ptr %a1447 ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5)1448 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 3, i32 3, i32 3>1449 ; CHECK-DAG: splati.w [[R3:\$w[0-9]+]], [[R1]][3]1450 store <4 x i32> %2, ptr %c1451 ; CHECK-DAG: st.w [[R3]], 0($4)1452 1453 ret void1454}1455 1456define void @splati_v2i64_0(ptr %c, ptr %a) nounwind {1457 ; CHECK-LABEL: splati_v2i64_0:1458 1459 %1 = load <2 x i64>, ptr %a1460 ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5)1461 %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <2 x i32> <i32 1, i32 1>1462 ; CHECK-DAG: splati.d [[R3:\$w[0-9]+]], [[R1]][1]1463 store <2 x i64> %2, ptr %c1464 ; CHECK-DAG: st.d [[R3]], 0($4)1465 1466 ret void1467}1468