619 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: opt -mtriple=powerpc-unknown-linux-gnu < %s -passes=instcombine | \3; RUN: llc -mtriple=ppc32-- -mcpu=g5 | not grep vperm4; RUN: llc -verify-machineinstrs < %s -mtriple=ppc32-- -mcpu=g5 | FileCheck %s5 6define void @VSLDOI_xy(ptr %A, ptr %B) {7; CHECK-LABEL: VSLDOI_xy:8; CHECK: # %bb.0: # %entry9; CHECK-NEXT: lvx 2, 0, 310; CHECK-NEXT: lvx 3, 0, 411; CHECK-NEXT: vsldoi 2, 2, 3, 512; CHECK-NEXT: stvx 2, 0, 313; CHECK-NEXT: blr14entry:15 %tmp = load <8 x i16>, ptr %A ; <<8 x i16>> [#uses=1]16 %tmp2 = load <8 x i16>, ptr %B ; <<8 x i16>> [#uses=1]17 %tmp.upgrd.1 = bitcast <8 x i16> %tmp to <16 x i8> ; <<16 x i8>> [#uses=11]18 %tmp2.upgrd.2 = bitcast <8 x i16> %tmp2 to <16 x i8> ; <<16 x i8>> [#uses=5]19 %tmp.upgrd.3 = extractelement <16 x i8> %tmp.upgrd.1, i32 5 ; <i8> [#uses=1]20 %tmp3 = extractelement <16 x i8> %tmp.upgrd.1, i32 6 ; <i8> [#uses=1]21 %tmp4 = extractelement <16 x i8> %tmp.upgrd.1, i32 7 ; <i8> [#uses=1]22 %tmp5 = extractelement <16 x i8> %tmp.upgrd.1, i32 8 ; <i8> [#uses=1]23 %tmp6 = extractelement <16 x i8> %tmp.upgrd.1, i32 9 ; <i8> [#uses=1]24 %tmp7 = extractelement <16 x i8> %tmp.upgrd.1, i32 10 ; <i8> [#uses=1]25 %tmp8 = extractelement <16 x i8> %tmp.upgrd.1, i32 11 ; <i8> [#uses=1]26 %tmp9 = extractelement <16 x i8> %tmp.upgrd.1, i32 12 ; <i8> [#uses=1]27 %tmp10 = extractelement <16 x i8> %tmp.upgrd.1, i32 13 ; <i8> [#uses=1]28 %tmp11 = extractelement <16 x i8> %tmp.upgrd.1, i32 14 ; <i8> [#uses=1]29 %tmp12 = extractelement <16 x i8> %tmp.upgrd.1, i32 15 ; <i8> [#uses=1]30 %tmp13 = extractelement <16 x i8> %tmp2.upgrd.2, i32 0 ; <i8> [#uses=1]31 %tmp14 = extractelement <16 x i8> %tmp2.upgrd.2, i32 1 ; <i8> [#uses=1]32 %tmp15 = extractelement <16 x i8> %tmp2.upgrd.2, i32 2 ; <i8> [#uses=1]33 %tmp16 = extractelement <16 x i8> %tmp2.upgrd.2, i32 3 ; <i8> [#uses=1]34 %tmp17 = extractelement <16 x i8> %tmp2.upgrd.2, i32 4 ; <i8> [#uses=1]35 %tmp18 = insertelement <16 x i8> poison, i8 %tmp.upgrd.3, i32 0 ; <<16 x i8>> [#uses=1]36 %tmp19 = insertelement <16 x i8> %tmp18, i8 %tmp3, i32 1 ; <<16 x i8>> [#uses=1]37 %tmp20 = insertelement <16 x i8> %tmp19, i8 %tmp4, i32 2 ; <<16 x i8>> [#uses=1]38 %tmp21 = insertelement <16 x i8> %tmp20, i8 %tmp5, i32 3 ; <<16 x i8>> [#uses=1]39 %tmp22 = insertelement <16 x i8> %tmp21, i8 %tmp6, i32 4 ; <<16 x i8>> [#uses=1]40 %tmp23 = insertelement <16 x i8> %tmp22, i8 %tmp7, i32 5 ; <<16 x i8>> [#uses=1]41 %tmp24 = insertelement <16 x i8> %tmp23, i8 %tmp8, i32 6 ; <<16 x i8>> [#uses=1]42 %tmp25 = insertelement <16 x i8> %tmp24, i8 %tmp9, i32 7 ; <<16 x i8>> [#uses=1]43 %tmp26 = insertelement <16 x i8> %tmp25, i8 %tmp10, i32 8 ; <<16 x i8>> [#uses=1]44 %tmp27 = insertelement <16 x i8> %tmp26, i8 %tmp11, i32 9 ; <<16 x i8>> [#uses=1]45 %tmp28 = insertelement <16 x i8> %tmp27, i8 %tmp12, i32 10 ; <<16 x i8>> [#uses=1]46 %tmp29 = insertelement <16 x i8> %tmp28, i8 %tmp13, i32 11 ; <<16 x i8>> [#uses=1]47 %tmp30 = insertelement <16 x i8> %tmp29, i8 %tmp14, i32 12 ; <<16 x i8>> [#uses=1]48 %tmp31 = insertelement <16 x i8> %tmp30, i8 %tmp15, i32 13 ; <<16 x i8>> [#uses=1]49 %tmp32 = insertelement <16 x i8> %tmp31, i8 %tmp16, i32 14 ; <<16 x i8>> [#uses=1]50 %tmp33 = insertelement <16 x i8> %tmp32, i8 %tmp17, i32 15 ; <<16 x i8>> [#uses=1]51 %tmp33.upgrd.4 = bitcast <16 x i8> %tmp33 to <8 x i16> ; <<8 x i16>> [#uses=1]52 store <8 x i16> %tmp33.upgrd.4, ptr %A53 ret void54}55 56define void @VSLDOI_xx(ptr %A, ptr %B) {57; CHECK-LABEL: VSLDOI_xx:58; CHECK: # %bb.0:59; CHECK-NEXT: lvx 2, 0, 360; CHECK-NEXT: vsldoi 2, 2, 2, 561; CHECK-NEXT: stvx 2, 0, 362; CHECK-NEXT: blr63 %tmp = load <8 x i16>, ptr %A ; <<8 x i16>> [#uses=1]64 %tmp2 = load <8 x i16>, ptr %A ; <<8 x i16>> [#uses=1]65 %tmp.upgrd.5 = bitcast <8 x i16> %tmp to <16 x i8> ; <<16 x i8>> [#uses=11]66 %tmp2.upgrd.6 = bitcast <8 x i16> %tmp2 to <16 x i8> ; <<16 x i8>> [#uses=5]67 %tmp.upgrd.7 = extractelement <16 x i8> %tmp.upgrd.5, i32 5 ; <i8> [#uses=1]68 %tmp3 = extractelement <16 x i8> %tmp.upgrd.5, i32 6 ; <i8> [#uses=1]69 %tmp4 = extractelement <16 x i8> %tmp.upgrd.5, i32 7 ; <i8> [#uses=1]70 %tmp5 = extractelement <16 x i8> %tmp.upgrd.5, i32 8 ; <i8> [#uses=1]71 %tmp6 = extractelement <16 x i8> %tmp.upgrd.5, i32 9 ; <i8> [#uses=1]72 %tmp7 = extractelement <16 x i8> %tmp.upgrd.5, i32 10 ; <i8> [#uses=1]73 %tmp8 = extractelement <16 x i8> %tmp.upgrd.5, i32 11 ; <i8> [#uses=1]74 %tmp9 = extractelement <16 x i8> %tmp.upgrd.5, i32 12 ; <i8> [#uses=1]75 %tmp10 = extractelement <16 x i8> %tmp.upgrd.5, i32 13 ; <i8> [#uses=1]76 %tmp11 = extractelement <16 x i8> %tmp.upgrd.5, i32 14 ; <i8> [#uses=1]77 %tmp12 = extractelement <16 x i8> %tmp.upgrd.5, i32 15 ; <i8> [#uses=1]78 %tmp13 = extractelement <16 x i8> %tmp2.upgrd.6, i32 0 ; <i8> [#uses=1]79 %tmp14 = extractelement <16 x i8> %tmp2.upgrd.6, i32 1 ; <i8> [#uses=1]80 %tmp15 = extractelement <16 x i8> %tmp2.upgrd.6, i32 2 ; <i8> [#uses=1]81 %tmp16 = extractelement <16 x i8> %tmp2.upgrd.6, i32 3 ; <i8> [#uses=1]82 %tmp17 = extractelement <16 x i8> %tmp2.upgrd.6, i32 4 ; <i8> [#uses=1]83 %tmp18 = insertelement <16 x i8> poison, i8 %tmp.upgrd.7, i32 0 ; <<16 x i8>> [#uses=1]84 %tmp19 = insertelement <16 x i8> %tmp18, i8 %tmp3, i32 1 ; <<16 x i8>> [#uses=1]85 %tmp20 = insertelement <16 x i8> %tmp19, i8 %tmp4, i32 2 ; <<16 x i8>> [#uses=1]86 %tmp21 = insertelement <16 x i8> %tmp20, i8 %tmp5, i32 3 ; <<16 x i8>> [#uses=1]87 %tmp22 = insertelement <16 x i8> %tmp21, i8 %tmp6, i32 4 ; <<16 x i8>> [#uses=1]88 %tmp23 = insertelement <16 x i8> %tmp22, i8 %tmp7, i32 5 ; <<16 x i8>> [#uses=1]89 %tmp24 = insertelement <16 x i8> %tmp23, i8 %tmp8, i32 6 ; <<16 x i8>> [#uses=1]90 %tmp25 = insertelement <16 x i8> %tmp24, i8 %tmp9, i32 7 ; <<16 x i8>> [#uses=1]91 %tmp26 = insertelement <16 x i8> %tmp25, i8 %tmp10, i32 8 ; <<16 x i8>> [#uses=1]92 %tmp27 = insertelement <16 x i8> %tmp26, i8 %tmp11, i32 9 ; <<16 x i8>> [#uses=1]93 %tmp28 = insertelement <16 x i8> %tmp27, i8 %tmp12, i32 10 ; <<16 x i8>> [#uses=1]94 %tmp29 = insertelement <16 x i8> %tmp28, i8 %tmp13, i32 11 ; <<16 x i8>> [#uses=1]95 %tmp30 = insertelement <16 x i8> %tmp29, i8 %tmp14, i32 12 ; <<16 x i8>> [#uses=1]96 %tmp31 = insertelement <16 x i8> %tmp30, i8 %tmp15, i32 13 ; <<16 x i8>> [#uses=1]97 %tmp32 = insertelement <16 x i8> %tmp31, i8 %tmp16, i32 14 ; <<16 x i8>> [#uses=1]98 %tmp33 = insertelement <16 x i8> %tmp32, i8 %tmp17, i32 15 ; <<16 x i8>> [#uses=1]99 %tmp33.upgrd.8 = bitcast <16 x i8> %tmp33 to <8 x i16> ; <<8 x i16>> [#uses=1]100 store <8 x i16> %tmp33.upgrd.8, ptr %A101 ret void102}103 104define void @VPERM_promote(ptr %A, ptr %B) {105; CHECK-LABEL: VPERM_promote:106; CHECK: # %bb.0: # %entry107; CHECK-NEXT: lvx 2, 0, 3108; CHECK-NEXT: vspltisb 4, 14109; CHECK-NEXT: lvx 3, 0, 4110; CHECK-NEXT: vperm 2, 2, 3, 4111; CHECK-NEXT: stvx 2, 0, 3112; CHECK-NEXT: blr113entry:114 %tmp = load <8 x i16>, ptr %A ; <<8 x i16>> [#uses=1]115 %tmp.upgrd.9 = bitcast <8 x i16> %tmp to <4 x i32> ; <<4 x i32>> [#uses=1]116 %tmp2 = load <8 x i16>, ptr %B ; <<8 x i16>> [#uses=1]117 %tmp2.upgrd.10 = bitcast <8 x i16> %tmp2 to <4 x i32> ; <<4 x i32>> [#uses=1]118 %tmp3 = call <4 x i32> @llvm.ppc.altivec.vperm( <4 x i32> %tmp.upgrd.9, <4 x i32> %tmp2.upgrd.10, <16 x i8> < i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14, i8 14 > ) ; <<4 x i32>> [#uses=1]119 %tmp3.upgrd.11 = bitcast <4 x i32> %tmp3 to <8 x i16> ; <<8 x i16>> [#uses=1]120 store <8 x i16> %tmp3.upgrd.11, ptr %A121 ret void122}123 124declare <4 x i32> @llvm.ppc.altivec.vperm(<4 x i32>, <4 x i32>, <16 x i8>)125 126define void @tb_l(ptr %A, ptr %B) {127; CHECK-LABEL: tb_l:128; CHECK: # %bb.0: # %entry129; CHECK-NEXT: lvx 2, 0, 3130; CHECK-NEXT: lvx 3, 0, 4131; CHECK-NEXT: vmrglb 2, 2, 3132; CHECK-NEXT: stvx 2, 0, 3133; CHECK-NEXT: blr134entry:135 %tmp = load <16 x i8>, ptr %A ; <<16 x i8>> [#uses=8]136 %tmp2 = load <16 x i8>, ptr %B ; <<16 x i8>> [#uses=8]137 %tmp.upgrd.12 = extractelement <16 x i8> %tmp, i32 8 ; <i8> [#uses=1]138 %tmp3 = extractelement <16 x i8> %tmp2, i32 8 ; <i8> [#uses=1]139 %tmp4 = extractelement <16 x i8> %tmp, i32 9 ; <i8> [#uses=1]140 %tmp5 = extractelement <16 x i8> %tmp2, i32 9 ; <i8> [#uses=1]141 %tmp6 = extractelement <16 x i8> %tmp, i32 10 ; <i8> [#uses=1]142 %tmp7 = extractelement <16 x i8> %tmp2, i32 10 ; <i8> [#uses=1]143 %tmp8 = extractelement <16 x i8> %tmp, i32 11 ; <i8> [#uses=1]144 %tmp9 = extractelement <16 x i8> %tmp2, i32 11 ; <i8> [#uses=1]145 %tmp10 = extractelement <16 x i8> %tmp, i32 12 ; <i8> [#uses=1]146 %tmp11 = extractelement <16 x i8> %tmp2, i32 12 ; <i8> [#uses=1]147 %tmp12 = extractelement <16 x i8> %tmp, i32 13 ; <i8> [#uses=1]148 %tmp13 = extractelement <16 x i8> %tmp2, i32 13 ; <i8> [#uses=1]149 %tmp14 = extractelement <16 x i8> %tmp, i32 14 ; <i8> [#uses=1]150 %tmp15 = extractelement <16 x i8> %tmp2, i32 14 ; <i8> [#uses=1]151 %tmp16 = extractelement <16 x i8> %tmp, i32 15 ; <i8> [#uses=1]152 %tmp17 = extractelement <16 x i8> %tmp2, i32 15 ; <i8> [#uses=1]153 %tmp18 = insertelement <16 x i8> poison, i8 %tmp.upgrd.12, i32 0 ; <<16 x i8>> [#uses=1]154 %tmp19 = insertelement <16 x i8> %tmp18, i8 %tmp3, i32 1 ; <<16 x i8>> [#uses=1]155 %tmp20 = insertelement <16 x i8> %tmp19, i8 %tmp4, i32 2 ; <<16 x i8>> [#uses=1]156 %tmp21 = insertelement <16 x i8> %tmp20, i8 %tmp5, i32 3 ; <<16 x i8>> [#uses=1]157 %tmp22 = insertelement <16 x i8> %tmp21, i8 %tmp6, i32 4 ; <<16 x i8>> [#uses=1]158 %tmp23 = insertelement <16 x i8> %tmp22, i8 %tmp7, i32 5 ; <<16 x i8>> [#uses=1]159 %tmp24 = insertelement <16 x i8> %tmp23, i8 %tmp8, i32 6 ; <<16 x i8>> [#uses=1]160 %tmp25 = insertelement <16 x i8> %tmp24, i8 %tmp9, i32 7 ; <<16 x i8>> [#uses=1]161 %tmp26 = insertelement <16 x i8> %tmp25, i8 %tmp10, i32 8 ; <<16 x i8>> [#uses=1]162 %tmp27 = insertelement <16 x i8> %tmp26, i8 %tmp11, i32 9 ; <<16 x i8>> [#uses=1]163 %tmp28 = insertelement <16 x i8> %tmp27, i8 %tmp12, i32 10 ; <<16 x i8>> [#uses=1]164 %tmp29 = insertelement <16 x i8> %tmp28, i8 %tmp13, i32 11 ; <<16 x i8>> [#uses=1]165 %tmp30 = insertelement <16 x i8> %tmp29, i8 %tmp14, i32 12 ; <<16 x i8>> [#uses=1]166 %tmp31 = insertelement <16 x i8> %tmp30, i8 %tmp15, i32 13 ; <<16 x i8>> [#uses=1]167 %tmp32 = insertelement <16 x i8> %tmp31, i8 %tmp16, i32 14 ; <<16 x i8>> [#uses=1]168 %tmp33 = insertelement <16 x i8> %tmp32, i8 %tmp17, i32 15 ; <<16 x i8>> [#uses=1]169 store <16 x i8> %tmp33, ptr %A170 ret void171}172 173define void @th_l(ptr %A, ptr %B) {174; CHECK-LABEL: th_l:175; CHECK: # %bb.0: # %entry176; CHECK-NEXT: lvx 2, 0, 3177; CHECK-NEXT: lvx 3, 0, 4178; CHECK-NEXT: vmrglh 2, 2, 3179; CHECK-NEXT: stvx 2, 0, 3180; CHECK-NEXT: blr181entry:182 %tmp = load <8 x i16>, ptr %A ; <<8 x i16>> [#uses=4]183 %tmp2 = load <8 x i16>, ptr %B ; <<8 x i16>> [#uses=4]184 %tmp.upgrd.13 = extractelement <8 x i16> %tmp, i32 4 ; <i16> [#uses=1]185 %tmp3 = extractelement <8 x i16> %tmp2, i32 4 ; <i16> [#uses=1]186 %tmp4 = extractelement <8 x i16> %tmp, i32 5 ; <i16> [#uses=1]187 %tmp5 = extractelement <8 x i16> %tmp2, i32 5 ; <i16> [#uses=1]188 %tmp6 = extractelement <8 x i16> %tmp, i32 6 ; <i16> [#uses=1]189 %tmp7 = extractelement <8 x i16> %tmp2, i32 6 ; <i16> [#uses=1]190 %tmp8 = extractelement <8 x i16> %tmp, i32 7 ; <i16> [#uses=1]191 %tmp9 = extractelement <8 x i16> %tmp2, i32 7 ; <i16> [#uses=1]192 %tmp10 = insertelement <8 x i16> poison, i16 %tmp.upgrd.13, i32 0 ; <<8 x i16>> [#uses=1]193 %tmp11 = insertelement <8 x i16> %tmp10, i16 %tmp3, i32 1 ; <<8 x i16>> [#uses=1]194 %tmp12 = insertelement <8 x i16> %tmp11, i16 %tmp4, i32 2 ; <<8 x i16>> [#uses=1]195 %tmp13 = insertelement <8 x i16> %tmp12, i16 %tmp5, i32 3 ; <<8 x i16>> [#uses=1]196 %tmp14 = insertelement <8 x i16> %tmp13, i16 %tmp6, i32 4 ; <<8 x i16>> [#uses=1]197 %tmp15 = insertelement <8 x i16> %tmp14, i16 %tmp7, i32 5 ; <<8 x i16>> [#uses=1]198 %tmp16 = insertelement <8 x i16> %tmp15, i16 %tmp8, i32 6 ; <<8 x i16>> [#uses=1]199 %tmp17 = insertelement <8 x i16> %tmp16, i16 %tmp9, i32 7 ; <<8 x i16>> [#uses=1]200 store <8 x i16> %tmp17, ptr %A201 ret void202}203 204define void @tw_l(ptr %A, ptr %B) {205; CHECK-LABEL: tw_l:206; CHECK: # %bb.0: # %entry207; CHECK-NEXT: lvx 2, 0, 3208; CHECK-NEXT: lvx 3, 0, 4209; CHECK-NEXT: vmrglw 2, 2, 3210; CHECK-NEXT: stvx 2, 0, 3211; CHECK-NEXT: blr212entry:213 %tmp = load <4 x i32>, ptr %A ; <<4 x i32>> [#uses=2]214 %tmp2 = load <4 x i32>, ptr %B ; <<4 x i32>> [#uses=2]215 %tmp.upgrd.14 = extractelement <4 x i32> %tmp, i32 2 ; <i32> [#uses=1]216 %tmp3 = extractelement <4 x i32> %tmp2, i32 2 ; <i32> [#uses=1]217 %tmp4 = extractelement <4 x i32> %tmp, i32 3 ; <i32> [#uses=1]218 %tmp5 = extractelement <4 x i32> %tmp2, i32 3 ; <i32> [#uses=1]219 %tmp6 = insertelement <4 x i32> poison, i32 %tmp.upgrd.14, i32 0 ; <<4 x i32>> [#uses=1]220 %tmp7 = insertelement <4 x i32> %tmp6, i32 %tmp3, i32 1 ; <<4 x i32>> [#uses=1]221 %tmp8 = insertelement <4 x i32> %tmp7, i32 %tmp4, i32 2 ; <<4 x i32>> [#uses=1]222 %tmp9 = insertelement <4 x i32> %tmp8, i32 %tmp5, i32 3 ; <<4 x i32>> [#uses=1]223 store <4 x i32> %tmp9, ptr %A224 ret void225}226 227define void @tb_h(ptr %A, ptr %B) {228; CHECK-LABEL: tb_h:229; CHECK: # %bb.0: # %entry230; CHECK-NEXT: lvx 2, 0, 3231; CHECK-NEXT: lvx 3, 0, 4232; CHECK-NEXT: vmrghb 2, 2, 3233; CHECK-NEXT: stvx 2, 0, 3234; CHECK-NEXT: blr235entry:236 %tmp = load <16 x i8>, ptr %A ; <<16 x i8>> [#uses=8]237 %tmp2 = load <16 x i8>, ptr %B ; <<16 x i8>> [#uses=8]238 %tmp.upgrd.15 = extractelement <16 x i8> %tmp, i32 0 ; <i8> [#uses=1]239 %tmp3 = extractelement <16 x i8> %tmp2, i32 0 ; <i8> [#uses=1]240 %tmp4 = extractelement <16 x i8> %tmp, i32 1 ; <i8> [#uses=1]241 %tmp5 = extractelement <16 x i8> %tmp2, i32 1 ; <i8> [#uses=1]242 %tmp6 = extractelement <16 x i8> %tmp, i32 2 ; <i8> [#uses=1]243 %tmp7 = extractelement <16 x i8> %tmp2, i32 2 ; <i8> [#uses=1]244 %tmp8 = extractelement <16 x i8> %tmp, i32 3 ; <i8> [#uses=1]245 %tmp9 = extractelement <16 x i8> %tmp2, i32 3 ; <i8> [#uses=1]246 %tmp10 = extractelement <16 x i8> %tmp, i32 4 ; <i8> [#uses=1]247 %tmp11 = extractelement <16 x i8> %tmp2, i32 4 ; <i8> [#uses=1]248 %tmp12 = extractelement <16 x i8> %tmp, i32 5 ; <i8> [#uses=1]249 %tmp13 = extractelement <16 x i8> %tmp2, i32 5 ; <i8> [#uses=1]250 %tmp14 = extractelement <16 x i8> %tmp, i32 6 ; <i8> [#uses=1]251 %tmp15 = extractelement <16 x i8> %tmp2, i32 6 ; <i8> [#uses=1]252 %tmp16 = extractelement <16 x i8> %tmp, i32 7 ; <i8> [#uses=1]253 %tmp17 = extractelement <16 x i8> %tmp2, i32 7 ; <i8> [#uses=1]254 %tmp18 = insertelement <16 x i8> undef, i8 %tmp.upgrd.15, i32 0 ; <<16 x i8>> [#uses=1]255 %tmp19 = insertelement <16 x i8> %tmp18, i8 %tmp3, i32 1 ; <<16 x i8>> [#uses=1]256 %tmp20 = insertelement <16 x i8> %tmp19, i8 %tmp4, i32 2 ; <<16 x i8>> [#uses=1]257 %tmp21 = insertelement <16 x i8> %tmp20, i8 %tmp5, i32 3 ; <<16 x i8>> [#uses=1]258 %tmp22 = insertelement <16 x i8> %tmp21, i8 %tmp6, i32 4 ; <<16 x i8>> [#uses=1]259 %tmp23 = insertelement <16 x i8> %tmp22, i8 %tmp7, i32 5 ; <<16 x i8>> [#uses=1]260 %tmp24 = insertelement <16 x i8> %tmp23, i8 %tmp8, i32 6 ; <<16 x i8>> [#uses=1]261 %tmp25 = insertelement <16 x i8> %tmp24, i8 %tmp9, i32 7 ; <<16 x i8>> [#uses=1]262 %tmp26 = insertelement <16 x i8> %tmp25, i8 %tmp10, i32 8 ; <<16 x i8>> [#uses=1]263 %tmp27 = insertelement <16 x i8> %tmp26, i8 %tmp11, i32 9 ; <<16 x i8>> [#uses=1]264 %tmp28 = insertelement <16 x i8> %tmp27, i8 %tmp12, i32 10 ; <<16 x i8>> [#uses=1]265 %tmp29 = insertelement <16 x i8> %tmp28, i8 %tmp13, i32 11 ; <<16 x i8>> [#uses=1]266 %tmp30 = insertelement <16 x i8> %tmp29, i8 %tmp14, i32 12 ; <<16 x i8>> [#uses=1]267 %tmp31 = insertelement <16 x i8> %tmp30, i8 %tmp15, i32 13 ; <<16 x i8>> [#uses=1]268 %tmp32 = insertelement <16 x i8> %tmp31, i8 %tmp16, i32 14 ; <<16 x i8>> [#uses=1]269 %tmp33 = insertelement <16 x i8> %tmp32, i8 %tmp17, i32 15 ; <<16 x i8>> [#uses=1]270 store <16 x i8> %tmp33, ptr %A271 ret void272}273 274define void @th_h(ptr %A, ptr %B) {275; CHECK-LABEL: th_h:276; CHECK: # %bb.0: # %entry277; CHECK-NEXT: lvx 2, 0, 3278; CHECK-NEXT: lvx 3, 0, 4279; CHECK-NEXT: vmrghh 2, 2, 3280; CHECK-NEXT: stvx 2, 0, 3281; CHECK-NEXT: blr282entry:283 %tmp = load <8 x i16>, ptr %A ; <<8 x i16>> [#uses=4]284 %tmp2 = load <8 x i16>, ptr %B ; <<8 x i16>> [#uses=4]285 %tmp.upgrd.16 = extractelement <8 x i16> %tmp, i32 0 ; <i16> [#uses=1]286 %tmp3 = extractelement <8 x i16> %tmp2, i32 0 ; <i16> [#uses=1]287 %tmp4 = extractelement <8 x i16> %tmp, i32 1 ; <i16> [#uses=1]288 %tmp5 = extractelement <8 x i16> %tmp2, i32 1 ; <i16> [#uses=1]289 %tmp6 = extractelement <8 x i16> %tmp, i32 2 ; <i16> [#uses=1]290 %tmp7 = extractelement <8 x i16> %tmp2, i32 2 ; <i16> [#uses=1]291 %tmp8 = extractelement <8 x i16> %tmp, i32 3 ; <i16> [#uses=1]292 %tmp9 = extractelement <8 x i16> %tmp2, i32 3 ; <i16> [#uses=1]293 %tmp10 = insertelement <8 x i16> undef, i16 %tmp.upgrd.16, i32 0 ; <<8 x i16>> [#uses=1]294 %tmp11 = insertelement <8 x i16> %tmp10, i16 %tmp3, i32 1 ; <<8 x i16>> [#uses=1]295 %tmp12 = insertelement <8 x i16> %tmp11, i16 %tmp4, i32 2 ; <<8 x i16>> [#uses=1]296 %tmp13 = insertelement <8 x i16> %tmp12, i16 %tmp5, i32 3 ; <<8 x i16>> [#uses=1]297 %tmp14 = insertelement <8 x i16> %tmp13, i16 %tmp6, i32 4 ; <<8 x i16>> [#uses=1]298 %tmp15 = insertelement <8 x i16> %tmp14, i16 %tmp7, i32 5 ; <<8 x i16>> [#uses=1]299 %tmp16 = insertelement <8 x i16> %tmp15, i16 %tmp8, i32 6 ; <<8 x i16>> [#uses=1]300 %tmp17 = insertelement <8 x i16> %tmp16, i16 %tmp9, i32 7 ; <<8 x i16>> [#uses=1]301 store <8 x i16> %tmp17, ptr %A302 ret void303}304 305define void @tw_h(ptr %A, ptr %B) {306; CHECK-LABEL: tw_h:307; CHECK: # %bb.0: # %entry308; CHECK-NEXT: lvx 2, 0, 3309; CHECK-NEXT: lvx 3, 0, 4310; CHECK-NEXT: vmrghw 2, 3, 2311; CHECK-NEXT: stvx 2, 0, 3312; CHECK-NEXT: blr313entry:314 %tmp = load <4 x i32>, ptr %A ; <<4 x i32>> [#uses=2]315 %tmp2 = load <4 x i32>, ptr %B ; <<4 x i32>> [#uses=2]316 %tmp.upgrd.17 = extractelement <4 x i32> %tmp2, i32 0 ; <i32> [#uses=1]317 %tmp3 = extractelement <4 x i32> %tmp, i32 0 ; <i32> [#uses=1]318 %tmp4 = extractelement <4 x i32> %tmp2, i32 1 ; <i32> [#uses=1]319 %tmp5 = extractelement <4 x i32> %tmp, i32 1 ; <i32> [#uses=1]320 %tmp6 = insertelement <4 x i32> undef, i32 %tmp.upgrd.17, i32 0 ; <<4 x i32>> [#uses=1]321 %tmp7 = insertelement <4 x i32> %tmp6, i32 %tmp3, i32 1 ; <<4 x i32>> [#uses=1]322 %tmp8 = insertelement <4 x i32> %tmp7, i32 %tmp4, i32 2 ; <<4 x i32>> [#uses=1]323 %tmp9 = insertelement <4 x i32> %tmp8, i32 %tmp5, i32 3 ; <<4 x i32>> [#uses=1]324 store <4 x i32> %tmp9, ptr %A325 ret void326}327 328define void @tw_h_flop(ptr %A, ptr %B) {329; CHECK-LABEL: tw_h_flop:330; CHECK: # %bb.0:331; CHECK-NEXT: lvx 2, 0, 3332; CHECK-NEXT: lvx 3, 0, 4333; CHECK-NEXT: vmrghw 2, 2, 3334; CHECK-NEXT: stvx 2, 0, 3335; CHECK-NEXT: blr336 %tmp = load <4 x i32>, ptr %A ; <<4 x i32>> [#uses=2]337 %tmp2 = load <4 x i32>, ptr %B ; <<4 x i32>> [#uses=2]338 %tmp.upgrd.18 = extractelement <4 x i32> %tmp, i32 0 ; <i32> [#uses=1]339 %tmp3 = extractelement <4 x i32> %tmp2, i32 0 ; <i32> [#uses=1]340 %tmp4 = extractelement <4 x i32> %tmp, i32 1 ; <i32> [#uses=1]341 %tmp5 = extractelement <4 x i32> %tmp2, i32 1 ; <i32> [#uses=1]342 %tmp6 = insertelement <4 x i32> undef, i32 %tmp.upgrd.18, i32 0 ; <<4 x i32>> [#uses=1]343 %tmp7 = insertelement <4 x i32> %tmp6, i32 %tmp3, i32 1 ; <<4 x i32>> [#uses=1]344 %tmp8 = insertelement <4 x i32> %tmp7, i32 %tmp4, i32 2 ; <<4 x i32>> [#uses=1]345 %tmp9 = insertelement <4 x i32> %tmp8, i32 %tmp5, i32 3 ; <<4 x i32>> [#uses=1]346 store <4 x i32> %tmp9, ptr %A347 ret void348}349 350define void @VMRG_UNARY_tb_l(ptr %A, ptr %B) {351; CHECK-LABEL: VMRG_UNARY_tb_l:352; CHECK: # %bb.0: # %entry353; CHECK-NEXT: lvx 2, 0, 3354; CHECK-NEXT: vmrglb 2, 2, 2355; CHECK-NEXT: stvx 2, 0, 3356; CHECK-NEXT: blr357entry:358 %tmp = load <16 x i8>, ptr %A ; <<16 x i8>> [#uses=16]359 %tmp.upgrd.19 = extractelement <16 x i8> %tmp, i32 8 ; <i8> [#uses=1]360 %tmp3 = extractelement <16 x i8> %tmp, i32 8 ; <i8> [#uses=1]361 %tmp4 = extractelement <16 x i8> %tmp, i32 9 ; <i8> [#uses=1]362 %tmp5 = extractelement <16 x i8> %tmp, i32 9 ; <i8> [#uses=1]363 %tmp6 = extractelement <16 x i8> %tmp, i32 10 ; <i8> [#uses=1]364 %tmp7 = extractelement <16 x i8> %tmp, i32 10 ; <i8> [#uses=1]365 %tmp8 = extractelement <16 x i8> %tmp, i32 11 ; <i8> [#uses=1]366 %tmp9 = extractelement <16 x i8> %tmp, i32 11 ; <i8> [#uses=1]367 %tmp10 = extractelement <16 x i8> %tmp, i32 12 ; <i8> [#uses=1]368 %tmp11 = extractelement <16 x i8> %tmp, i32 12 ; <i8> [#uses=1]369 %tmp12 = extractelement <16 x i8> %tmp, i32 13 ; <i8> [#uses=1]370 %tmp13 = extractelement <16 x i8> %tmp, i32 13 ; <i8> [#uses=1]371 %tmp14 = extractelement <16 x i8> %tmp, i32 14 ; <i8> [#uses=1]372 %tmp15 = extractelement <16 x i8> %tmp, i32 14 ; <i8> [#uses=1]373 %tmp16 = extractelement <16 x i8> %tmp, i32 15 ; <i8> [#uses=1]374 %tmp17 = extractelement <16 x i8> %tmp, i32 15 ; <i8> [#uses=1]375 %tmp18 = insertelement <16 x i8> undef, i8 %tmp.upgrd.19, i32 0 ; <<16 x i8>> [#uses=1]376 %tmp19 = insertelement <16 x i8> %tmp18, i8 %tmp3, i32 1 ; <<16 x i8>> [#uses=1]377 %tmp20 = insertelement <16 x i8> %tmp19, i8 %tmp4, i32 2 ; <<16 x i8>> [#uses=1]378 %tmp21 = insertelement <16 x i8> %tmp20, i8 %tmp5, i32 3 ; <<16 x i8>> [#uses=1]379 %tmp22 = insertelement <16 x i8> %tmp21, i8 %tmp6, i32 4 ; <<16 x i8>> [#uses=1]380 %tmp23 = insertelement <16 x i8> %tmp22, i8 %tmp7, i32 5 ; <<16 x i8>> [#uses=1]381 %tmp24 = insertelement <16 x i8> %tmp23, i8 %tmp8, i32 6 ; <<16 x i8>> [#uses=1]382 %tmp25 = insertelement <16 x i8> %tmp24, i8 %tmp9, i32 7 ; <<16 x i8>> [#uses=1]383 %tmp26 = insertelement <16 x i8> %tmp25, i8 %tmp10, i32 8 ; <<16 x i8>> [#uses=1]384 %tmp27 = insertelement <16 x i8> %tmp26, i8 %tmp11, i32 9 ; <<16 x i8>> [#uses=1]385 %tmp28 = insertelement <16 x i8> %tmp27, i8 %tmp12, i32 10 ; <<16 x i8>> [#uses=1]386 %tmp29 = insertelement <16 x i8> %tmp28, i8 %tmp13, i32 11 ; <<16 x i8>> [#uses=1]387 %tmp30 = insertelement <16 x i8> %tmp29, i8 %tmp14, i32 12 ; <<16 x i8>> [#uses=1]388 %tmp31 = insertelement <16 x i8> %tmp30, i8 %tmp15, i32 13 ; <<16 x i8>> [#uses=1]389 %tmp32 = insertelement <16 x i8> %tmp31, i8 %tmp16, i32 14 ; <<16 x i8>> [#uses=1]390 %tmp33 = insertelement <16 x i8> %tmp32, i8 %tmp17, i32 15 ; <<16 x i8>> [#uses=1]391 store <16 x i8> %tmp33, ptr %A392 ret void393}394 395define void @VMRG_UNARY_th_l(ptr %A, ptr %B) {396; CHECK-LABEL: VMRG_UNARY_th_l:397; CHECK: # %bb.0: # %entry398; CHECK-NEXT: lvx 2, 0, 3399; CHECK-NEXT: vmrglh 2, 2, 2400; CHECK-NEXT: stvx 2, 0, 3401; CHECK-NEXT: blr402entry:403 %tmp = load <8 x i16>, ptr %A ; <<8 x i16>> [#uses=8]404 %tmp.upgrd.20 = extractelement <8 x i16> %tmp, i32 4 ; <i16> [#uses=1]405 %tmp3 = extractelement <8 x i16> %tmp, i32 4 ; <i16> [#uses=1]406 %tmp4 = extractelement <8 x i16> %tmp, i32 5 ; <i16> [#uses=1]407 %tmp5 = extractelement <8 x i16> %tmp, i32 5 ; <i16> [#uses=1]408 %tmp6 = extractelement <8 x i16> %tmp, i32 6 ; <i16> [#uses=1]409 %tmp7 = extractelement <8 x i16> %tmp, i32 6 ; <i16> [#uses=1]410 %tmp8 = extractelement <8 x i16> %tmp, i32 7 ; <i16> [#uses=1]411 %tmp9 = extractelement <8 x i16> %tmp, i32 7 ; <i16> [#uses=1]412 %tmp10 = insertelement <8 x i16> undef, i16 %tmp.upgrd.20, i32 0 ; <<8 x i16>> [#uses=1]413 %tmp11 = insertelement <8 x i16> %tmp10, i16 %tmp3, i32 1 ; <<8 x i16>> [#uses=1]414 %tmp12 = insertelement <8 x i16> %tmp11, i16 %tmp4, i32 2 ; <<8 x i16>> [#uses=1]415 %tmp13 = insertelement <8 x i16> %tmp12, i16 %tmp5, i32 3 ; <<8 x i16>> [#uses=1]416 %tmp14 = insertelement <8 x i16> %tmp13, i16 %tmp6, i32 4 ; <<8 x i16>> [#uses=1]417 %tmp15 = insertelement <8 x i16> %tmp14, i16 %tmp7, i32 5 ; <<8 x i16>> [#uses=1]418 %tmp16 = insertelement <8 x i16> %tmp15, i16 %tmp8, i32 6 ; <<8 x i16>> [#uses=1]419 %tmp17 = insertelement <8 x i16> %tmp16, i16 %tmp9, i32 7 ; <<8 x i16>> [#uses=1]420 store <8 x i16> %tmp17, ptr %A421 ret void422}423 424define void @VMRG_UNARY_tw_l(ptr %A, ptr %B) {425; CHECK-LABEL: VMRG_UNARY_tw_l:426; CHECK: # %bb.0: # %entry427; CHECK-NEXT: lvx 2, 0, 3428; CHECK-NEXT: vmrglw 2, 2, 2429; CHECK-NEXT: stvx 2, 0, 3430; CHECK-NEXT: blr431entry:432 %tmp = load <4 x i32>, ptr %A ; <<4 x i32>> [#uses=4]433 %tmp.upgrd.21 = extractelement <4 x i32> %tmp, i32 2 ; <i32> [#uses=1]434 %tmp3 = extractelement <4 x i32> %tmp, i32 2 ; <i32> [#uses=1]435 %tmp4 = extractelement <4 x i32> %tmp, i32 3 ; <i32> [#uses=1]436 %tmp5 = extractelement <4 x i32> %tmp, i32 3 ; <i32> [#uses=1]437 %tmp6 = insertelement <4 x i32> undef, i32 %tmp.upgrd.21, i32 0 ; <<4 x i32>> [#uses=1]438 %tmp7 = insertelement <4 x i32> %tmp6, i32 %tmp3, i32 1 ; <<4 x i32>> [#uses=1]439 %tmp8 = insertelement <4 x i32> %tmp7, i32 %tmp4, i32 2 ; <<4 x i32>> [#uses=1]440 %tmp9 = insertelement <4 x i32> %tmp8, i32 %tmp5, i32 3 ; <<4 x i32>> [#uses=1]441 store <4 x i32> %tmp9, ptr %A442 ret void443}444 445define void @VMRG_UNARY_tb_h(ptr %A, ptr %B) {446; CHECK-LABEL: VMRG_UNARY_tb_h:447; CHECK: # %bb.0: # %entry448; CHECK-NEXT: lvx 2, 0, 3449; CHECK-NEXT: vmrghb 2, 2, 2450; CHECK-NEXT: stvx 2, 0, 3451; CHECK-NEXT: blr452entry:453 %tmp = load <16 x i8>, ptr %A ; <<16 x i8>> [#uses=16]454 %tmp.upgrd.22 = extractelement <16 x i8> %tmp, i32 0 ; <i8> [#uses=1]455 %tmp3 = extractelement <16 x i8> %tmp, i32 0 ; <i8> [#uses=1]456 %tmp4 = extractelement <16 x i8> %tmp, i32 1 ; <i8> [#uses=1]457 %tmp5 = extractelement <16 x i8> %tmp, i32 1 ; <i8> [#uses=1]458 %tmp6 = extractelement <16 x i8> %tmp, i32 2 ; <i8> [#uses=1]459 %tmp7 = extractelement <16 x i8> %tmp, i32 2 ; <i8> [#uses=1]460 %tmp8 = extractelement <16 x i8> %tmp, i32 3 ; <i8> [#uses=1]461 %tmp9 = extractelement <16 x i8> %tmp, i32 3 ; <i8> [#uses=1]462 %tmp10 = extractelement <16 x i8> %tmp, i32 4 ; <i8> [#uses=1]463 %tmp11 = extractelement <16 x i8> %tmp, i32 4 ; <i8> [#uses=1]464 %tmp12 = extractelement <16 x i8> %tmp, i32 5 ; <i8> [#uses=1]465 %tmp13 = extractelement <16 x i8> %tmp, i32 5 ; <i8> [#uses=1]466 %tmp14 = extractelement <16 x i8> %tmp, i32 6 ; <i8> [#uses=1]467 %tmp15 = extractelement <16 x i8> %tmp, i32 6 ; <i8> [#uses=1]468 %tmp16 = extractelement <16 x i8> %tmp, i32 7 ; <i8> [#uses=1]469 %tmp17 = extractelement <16 x i8> %tmp, i32 7 ; <i8> [#uses=1]470 %tmp18 = insertelement <16 x i8> undef, i8 %tmp.upgrd.22, i32 0 ; <<16 x i8>> [#uses=1]471 %tmp19 = insertelement <16 x i8> %tmp18, i8 %tmp3, i32 1 ; <<16 x i8>> [#uses=1]472 %tmp20 = insertelement <16 x i8> %tmp19, i8 %tmp4, i32 2 ; <<16 x i8>> [#uses=1]473 %tmp21 = insertelement <16 x i8> %tmp20, i8 %tmp5, i32 3 ; <<16 x i8>> [#uses=1]474 %tmp22 = insertelement <16 x i8> %tmp21, i8 %tmp6, i32 4 ; <<16 x i8>> [#uses=1]475 %tmp23 = insertelement <16 x i8> %tmp22, i8 %tmp7, i32 5 ; <<16 x i8>> [#uses=1]476 %tmp24 = insertelement <16 x i8> %tmp23, i8 %tmp8, i32 6 ; <<16 x i8>> [#uses=1]477 %tmp25 = insertelement <16 x i8> %tmp24, i8 %tmp9, i32 7 ; <<16 x i8>> [#uses=1]478 %tmp26 = insertelement <16 x i8> %tmp25, i8 %tmp10, i32 8 ; <<16 x i8>> [#uses=1]479 %tmp27 = insertelement <16 x i8> %tmp26, i8 %tmp11, i32 9 ; <<16 x i8>> [#uses=1]480 %tmp28 = insertelement <16 x i8> %tmp27, i8 %tmp12, i32 10 ; <<16 x i8>> [#uses=1]481 %tmp29 = insertelement <16 x i8> %tmp28, i8 %tmp13, i32 11 ; <<16 x i8>> [#uses=1]482 %tmp30 = insertelement <16 x i8> %tmp29, i8 %tmp14, i32 12 ; <<16 x i8>> [#uses=1]483 %tmp31 = insertelement <16 x i8> %tmp30, i8 %tmp15, i32 13 ; <<16 x i8>> [#uses=1]484 %tmp32 = insertelement <16 x i8> %tmp31, i8 %tmp16, i32 14 ; <<16 x i8>> [#uses=1]485 %tmp33 = insertelement <16 x i8> %tmp32, i8 %tmp17, i32 15 ; <<16 x i8>> [#uses=1]486 store <16 x i8> %tmp33, ptr %A487 ret void488}489 490define void @VMRG_UNARY_th_h(ptr %A, ptr %B) {491; CHECK-LABEL: VMRG_UNARY_th_h:492; CHECK: # %bb.0: # %entry493; CHECK-NEXT: lvx 2, 0, 3494; CHECK-NEXT: vmrghh 2, 2, 2495; CHECK-NEXT: stvx 2, 0, 3496; CHECK-NEXT: blr497entry:498 %tmp = load <8 x i16>, ptr %A ; <<8 x i16>> [#uses=8]499 %tmp.upgrd.23 = extractelement <8 x i16> %tmp, i32 0 ; <i16> [#uses=1]500 %tmp3 = extractelement <8 x i16> %tmp, i32 0 ; <i16> [#uses=1]501 %tmp4 = extractelement <8 x i16> %tmp, i32 1 ; <i16> [#uses=1]502 %tmp5 = extractelement <8 x i16> %tmp, i32 1 ; <i16> [#uses=1]503 %tmp6 = extractelement <8 x i16> %tmp, i32 2 ; <i16> [#uses=1]504 %tmp7 = extractelement <8 x i16> %tmp, i32 2 ; <i16> [#uses=1]505 %tmp8 = extractelement <8 x i16> %tmp, i32 3 ; <i16> [#uses=1]506 %tmp9 = extractelement <8 x i16> %tmp, i32 3 ; <i16> [#uses=1]507 %tmp10 = insertelement <8 x i16> undef, i16 %tmp.upgrd.23, i32 0 ; <<8 x i16>> [#uses=1]508 %tmp11 = insertelement <8 x i16> %tmp10, i16 %tmp3, i32 1 ; <<8 x i16>> [#uses=1]509 %tmp12 = insertelement <8 x i16> %tmp11, i16 %tmp4, i32 2 ; <<8 x i16>> [#uses=1]510 %tmp13 = insertelement <8 x i16> %tmp12, i16 %tmp5, i32 3 ; <<8 x i16>> [#uses=1]511 %tmp14 = insertelement <8 x i16> %tmp13, i16 %tmp6, i32 4 ; <<8 x i16>> [#uses=1]512 %tmp15 = insertelement <8 x i16> %tmp14, i16 %tmp7, i32 5 ; <<8 x i16>> [#uses=1]513 %tmp16 = insertelement <8 x i16> %tmp15, i16 %tmp8, i32 6 ; <<8 x i16>> [#uses=1]514 %tmp17 = insertelement <8 x i16> %tmp16, i16 %tmp9, i32 7 ; <<8 x i16>> [#uses=1]515 store <8 x i16> %tmp17, ptr %A516 ret void517}518 519define void @VMRG_UNARY_tw_h(ptr %A, ptr %B) {520; CHECK-LABEL: VMRG_UNARY_tw_h:521; CHECK: # %bb.0: # %entry522; CHECK-NEXT: lvx 2, 0, 3523; CHECK-NEXT: vmrghw 2, 2, 2524; CHECK-NEXT: stvx 2, 0, 3525; CHECK-NEXT: blr526entry:527 %tmp = load <4 x i32>, ptr %A ; <<4 x i32>> [#uses=4]528 %tmp.upgrd.24 = extractelement <4 x i32> %tmp, i32 0 ; <i32> [#uses=1]529 %tmp3 = extractelement <4 x i32> %tmp, i32 0 ; <i32> [#uses=1]530 %tmp4 = extractelement <4 x i32> %tmp, i32 1 ; <i32> [#uses=1]531 %tmp5 = extractelement <4 x i32> %tmp, i32 1 ; <i32> [#uses=1]532 %tmp6 = insertelement <4 x i32> undef, i32 %tmp.upgrd.24, i32 0 ; <<4 x i32>> [#uses=1]533 %tmp7 = insertelement <4 x i32> %tmp6, i32 %tmp3, i32 1 ; <<4 x i32>> [#uses=1]534 %tmp8 = insertelement <4 x i32> %tmp7, i32 %tmp4, i32 2 ; <<4 x i32>> [#uses=1]535 %tmp9 = insertelement <4 x i32> %tmp8, i32 %tmp5, i32 3 ; <<4 x i32>> [#uses=1]536 store <4 x i32> %tmp9, ptr %A537 ret void538}539 540define void @VPCKUHUM_unary(ptr %A, ptr %B) {541; CHECK-LABEL: VPCKUHUM_unary:542; CHECK: # %bb.0: # %entry543; CHECK-NEXT: lvx 2, 0, 3544; CHECK-NEXT: vpkuhum 2, 2, 2545; CHECK-NEXT: stvx 2, 0, 3546; CHECK-NEXT: blr547entry:548 %tmp = load <8 x i16>, ptr %A ; <<8 x i16>> [#uses=2]549 %tmp.upgrd.25 = bitcast <8 x i16> %tmp to <16 x i8> ; <<16 x i8>> [#uses=8]550 %tmp3 = bitcast <8 x i16> %tmp to <16 x i8> ; <<16 x i8>> [#uses=8]551 %tmp.upgrd.26 = extractelement <16 x i8> %tmp.upgrd.25, i32 1 ; <i8> [#uses=1]552 %tmp4 = extractelement <16 x i8> %tmp.upgrd.25, i32 3 ; <i8> [#uses=1]553 %tmp5 = extractelement <16 x i8> %tmp.upgrd.25, i32 5 ; <i8> [#uses=1]554 %tmp6 = extractelement <16 x i8> %tmp.upgrd.25, i32 7 ; <i8> [#uses=1]555 %tmp7 = extractelement <16 x i8> %tmp.upgrd.25, i32 9 ; <i8> [#uses=1]556 %tmp8 = extractelement <16 x i8> %tmp.upgrd.25, i32 11 ; <i8> [#uses=1]557 %tmp9 = extractelement <16 x i8> %tmp.upgrd.25, i32 13 ; <i8> [#uses=1]558 %tmp10 = extractelement <16 x i8> %tmp.upgrd.25, i32 15 ; <i8> [#uses=1]559 %tmp11 = extractelement <16 x i8> %tmp3, i32 1 ; <i8> [#uses=1]560 %tmp12 = extractelement <16 x i8> %tmp3, i32 3 ; <i8> [#uses=1]561 %tmp13 = extractelement <16 x i8> %tmp3, i32 5 ; <i8> [#uses=1]562 %tmp14 = extractelement <16 x i8> %tmp3, i32 7 ; <i8> [#uses=1]563 %tmp15 = extractelement <16 x i8> %tmp3, i32 9 ; <i8> [#uses=1]564 %tmp16 = extractelement <16 x i8> %tmp3, i32 11 ; <i8> [#uses=1]565 %tmp17 = extractelement <16 x i8> %tmp3, i32 13 ; <i8> [#uses=1]566 %tmp18 = extractelement <16 x i8> %tmp3, i32 15 ; <i8> [#uses=1]567 %tmp19 = insertelement <16 x i8> undef, i8 %tmp.upgrd.26, i32 0 ; <<16 x i8>> [#uses=1]568 %tmp20 = insertelement <16 x i8> %tmp19, i8 %tmp4, i32 1 ; <<16 x i8>> [#uses=1]569 %tmp21 = insertelement <16 x i8> %tmp20, i8 %tmp5, i32 2 ; <<16 x i8>> [#uses=1]570 %tmp22 = insertelement <16 x i8> %tmp21, i8 %tmp6, i32 3 ; <<16 x i8>> [#uses=1]571 %tmp23 = insertelement <16 x i8> %tmp22, i8 %tmp7, i32 4 ; <<16 x i8>> [#uses=1]572 %tmp24 = insertelement <16 x i8> %tmp23, i8 %tmp8, i32 5 ; <<16 x i8>> [#uses=1]573 %tmp25 = insertelement <16 x i8> %tmp24, i8 %tmp9, i32 6 ; <<16 x i8>> [#uses=1]574 %tmp26 = insertelement <16 x i8> %tmp25, i8 %tmp10, i32 7 ; <<16 x i8>> [#uses=1]575 %tmp27 = insertelement <16 x i8> %tmp26, i8 %tmp11, i32 8 ; <<16 x i8>> [#uses=1]576 %tmp28 = insertelement <16 x i8> %tmp27, i8 %tmp12, i32 9 ; <<16 x i8>> [#uses=1]577 %tmp29 = insertelement <16 x i8> %tmp28, i8 %tmp13, i32 10 ; <<16 x i8>> [#uses=1]578 %tmp30 = insertelement <16 x i8> %tmp29, i8 %tmp14, i32 11 ; <<16 x i8>> [#uses=1]579 %tmp31 = insertelement <16 x i8> %tmp30, i8 %tmp15, i32 12 ; <<16 x i8>> [#uses=1]580 %tmp32 = insertelement <16 x i8> %tmp31, i8 %tmp16, i32 13 ; <<16 x i8>> [#uses=1]581 %tmp33 = insertelement <16 x i8> %tmp32, i8 %tmp17, i32 14 ; <<16 x i8>> [#uses=1]582 %tmp34 = insertelement <16 x i8> %tmp33, i8 %tmp18, i32 15 ; <<16 x i8>> [#uses=1]583 %tmp34.upgrd.27 = bitcast <16 x i8> %tmp34 to <8 x i16> ; <<8 x i16>> [#uses=1]584 store <8 x i16> %tmp34.upgrd.27, ptr %A585 ret void586}587 588define void @VPCKUWUM_unary(ptr %A, ptr %B) {589; CHECK-LABEL: VPCKUWUM_unary:590; CHECK: # %bb.0: # %entry591; CHECK-NEXT: lvx 2, 0, 3592; CHECK-NEXT: vpkuwum 2, 2, 2593; CHECK-NEXT: stvx 2, 0, 3594; CHECK-NEXT: blr595entry:596 %tmp = load <4 x i32>, ptr %A ; <<4 x i32>> [#uses=2]597 %tmp.upgrd.28 = bitcast <4 x i32> %tmp to <8 x i16> ; <<8 x i16>> [#uses=4]598 %tmp3 = bitcast <4 x i32> %tmp to <8 x i16> ; <<8 x i16>> [#uses=4]599 %tmp.upgrd.29 = extractelement <8 x i16> %tmp.upgrd.28, i32 1 ; <i16> [#uses=1]600 %tmp4 = extractelement <8 x i16> %tmp.upgrd.28, i32 3 ; <i16> [#uses=1]601 %tmp5 = extractelement <8 x i16> %tmp.upgrd.28, i32 5 ; <i16> [#uses=1]602 %tmp6 = extractelement <8 x i16> %tmp.upgrd.28, i32 7 ; <i16> [#uses=1]603 %tmp7 = extractelement <8 x i16> %tmp3, i32 1 ; <i16> [#uses=1]604 %tmp8 = extractelement <8 x i16> %tmp3, i32 3 ; <i16> [#uses=1]605 %tmp9 = extractelement <8 x i16> %tmp3, i32 5 ; <i16> [#uses=1]606 %tmp10 = extractelement <8 x i16> %tmp3, i32 7 ; <i16> [#uses=1]607 %tmp11 = insertelement <8 x i16> undef, i16 %tmp.upgrd.29, i32 0 ; <<8 x i16>> [#uses=1]608 %tmp12 = insertelement <8 x i16> %tmp11, i16 %tmp4, i32 1 ; <<8 x i16>> [#uses=1]609 %tmp13 = insertelement <8 x i16> %tmp12, i16 %tmp5, i32 2 ; <<8 x i16>> [#uses=1]610 %tmp14 = insertelement <8 x i16> %tmp13, i16 %tmp6, i32 3 ; <<8 x i16>> [#uses=1]611 %tmp15 = insertelement <8 x i16> %tmp14, i16 %tmp7, i32 4 ; <<8 x i16>> [#uses=1]612 %tmp16 = insertelement <8 x i16> %tmp15, i16 %tmp8, i32 5 ; <<8 x i16>> [#uses=1]613 %tmp17 = insertelement <8 x i16> %tmp16, i16 %tmp9, i32 6 ; <<8 x i16>> [#uses=1]614 %tmp18 = insertelement <8 x i16> %tmp17, i16 %tmp10, i32 7 ; <<8 x i16>> [#uses=1]615 %tmp18.upgrd.30 = bitcast <8 x i16> %tmp18 to <4 x i32> ; <<4 x i32>> [#uses=1]616 store <4 x i32> %tmp18.upgrd.30, ptr %A617 ret void618}619