442 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7 | FileCheck %s3 4; Test that we correctly fold a shuffle that performs a swizzle of another5; shuffle node according to the rule6; shuffle (shuffle (x, undef, M0), undef, M1) -> shuffle(x, undef, M2)7;8; We only do this if the resulting mask is legal to avoid introducing an9; illegal shuffle that is expanded into a sub-optimal sequence of instructions10; during lowering stage.11 12define <4 x i32> @swizzle_1(<4 x i32> %v) {13; CHECK-LABEL: swizzle_1:14; CHECK: # %bb.0:15; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,0,3,2]16; CHECK-NEXT: retq17 %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 3, i32 2, i32 0, i32 1>18 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 2, i32 0, i32 1>19 ret <4 x i32> %220}21 22define <4 x i32> @swizzle_2(<4 x i32> %v) {23; CHECK-LABEL: swizzle_2:24; CHECK: # %bb.0:25; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,1,3,0]26; CHECK-NEXT: retq27 %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 3, i32 1, i32 0, i32 2>28 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 1, i32 0, i32 2>29 ret <4 x i32> %230}31 32define <4 x i32> @swizzle_3(<4 x i32> %v) {33; CHECK-LABEL: swizzle_3:34; CHECK: # %bb.0:35; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,0,3,2]36; CHECK-NEXT: retq37 %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0>38 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0>39 ret <4 x i32> %240}41 42define <4 x i32> @swizzle_4(<4 x i32> %v) {43; CHECK-LABEL: swizzle_4:44; CHECK: # %bb.0:45; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,0,2]46; CHECK-NEXT: retq47 %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 2, i32 1, i32 3, i32 0>48 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 1, i32 3, i32 0>49 ret <4 x i32> %250}51 52define <4 x i32> @swizzle_5(<4 x i32> %v) {53; CHECK-LABEL: swizzle_5:54; CHECK: # %bb.0:55; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]56; CHECK-NEXT: retq57 %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0>58 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0>59 ret <4 x i32> %260}61 62define <4 x i32> @swizzle_6(<4 x i32> %v) {63; CHECK-LABEL: swizzle_6:64; CHECK: # %bb.0:65; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,1,3]66; CHECK-NEXT: retq67 %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 0, i32 3>68 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 0, i32 3>69 ret <4 x i32> %270}71 72define <4 x i32> @swizzle_7(<4 x i32> %v) {73; CHECK-LABEL: swizzle_7:74; CHECK: # %bb.0:75; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,3,1]76; CHECK-NEXT: retq77 %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 0, i32 3, i32 1, i32 2>78 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 3, i32 1, i32 2>79 ret <4 x i32> %280}81 82define <4 x i32> @swizzle_8(<4 x i32> %v) {83; CHECK-LABEL: swizzle_8:84; CHECK: # %bb.0:85; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,0]86; CHECK-NEXT: retq87 %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 3, i32 0, i32 2, i32 1>88 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 0, i32 2, i32 1>89 ret <4 x i32> %290}91 92define <4 x i32> @swizzle_9(<4 x i32> %v) {93; CHECK-LABEL: swizzle_9:94; CHECK: # %bb.0:95; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]96; CHECK-NEXT: retq97 %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2>98 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2>99 ret <4 x i32> %2100}101 102define <4 x i32> @swizzle_10(<4 x i32> %v) {103; CHECK-LABEL: swizzle_10:104; CHECK: # %bb.0:105; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,2,0,3]106; CHECK-NEXT: retq107 %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 2, i32 0, i32 1, i32 3>108 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 0, i32 1, i32 3>109 ret <4 x i32> %2110}111 112define <4 x i32> @swizzle_11(<4 x i32> %v) {113; CHECK-LABEL: swizzle_11:114; CHECK: # %bb.0:115; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]116; CHECK-NEXT: retq117 %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 2, i32 0, i32 3, i32 1>118 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 0, i32 3, i32 1>119 ret <4 x i32> %2120}121 122define <4 x i32> @swizzle_12(<4 x i32> %v) {123; CHECK-LABEL: swizzle_12:124; CHECK: # %bb.0:125; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,3,1,2]126; CHECK-NEXT: retq127 %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 3, i32 1>128 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 3, i32 1>129 ret <4 x i32> %2130}131 132define <4 x i32> @swizzle_13(<4 x i32> %v) {133; CHECK-LABEL: swizzle_13:134; CHECK: # %bb.0:135; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]136; CHECK-NEXT: retq137 %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 0, i32 2>138 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 0, i32 2>139 ret <4 x i32> %2140}141 142define <4 x i32> @swizzle_14(<4 x i32> %v) {143; CHECK-LABEL: swizzle_14:144; CHECK: # %bb.0:145; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,0,2,1]146; CHECK-NEXT: retq147 %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 2, i32 0>148 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 2, i32 0>149 ret <4 x i32> %2150}151 152define <4 x float> @swizzle_15(<4 x float> %v) {153; CHECK-LABEL: swizzle_15:154; CHECK: # %bb.0:155; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0,3,2]156; CHECK-NEXT: retq157 %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 0, i32 1>158 %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 0, i32 1>159 ret <4 x float> %2160}161 162define <4 x float> @swizzle_16(<4 x float> %v) {163; CHECK-LABEL: swizzle_16:164; CHECK: # %bb.0:165; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,1,3,0]166; CHECK-NEXT: retq167 %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 3, i32 1, i32 0, i32 2>168 %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 3, i32 1, i32 0, i32 2>169 ret <4 x float> %2170}171 172define <4 x float> @swizzle_17(<4 x float> %v) {173; CHECK-LABEL: swizzle_17:174; CHECK: # %bb.0:175; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0,3,2]176; CHECK-NEXT: retq177 %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0>178 %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0>179 ret <4 x float> %2180}181 182define <4 x float> @swizzle_18(<4 x float> %v) {183; CHECK-LABEL: swizzle_18:184; CHECK: # %bb.0:185; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,1,0,2]186; CHECK-NEXT: retq187 %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 2, i32 1, i32 3, i32 0>188 %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 2, i32 1, i32 3, i32 0>189 ret <4 x float> %2190}191 192define <4 x float> @swizzle_19(<4 x float> %v) {193; CHECK-LABEL: swizzle_19:194; CHECK: # %bb.0:195; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,3,0,1]196; CHECK-NEXT: retq197 %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0>198 %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0>199 ret <4 x float> %2200}201 202define <4 x float> @swizzle_20(<4 x float> %v) {203; CHECK-LABEL: swizzle_20:204; CHECK: # %bb.0:205; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0,1,3]206; CHECK-NEXT: retq207 %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 0, i32 3>208 %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 0, i32 3>209 ret <4 x float> %2210}211 212define <4 x float> @swizzle_21(<4 x float> %v) {213; CHECK-LABEL: swizzle_21:214; CHECK: # %bb.0:215; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,3,1]216; CHECK-NEXT: retq217 %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 0, i32 3, i32 1, i32 2>218 %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 0, i32 3, i32 1, i32 2>219 ret <4 x float> %2220}221 222define <4 x float> @swizzle_22(<4 x float> %v) {223; CHECK-LABEL: swizzle_22:224; CHECK: # %bb.0:225; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3,2,0]226; CHECK-NEXT: retq227 %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 3, i32 0, i32 2, i32 1>228 %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 3, i32 0, i32 2, i32 1>229 ret <4 x float> %2230}231 232define <4 x float> @swizzle_23(<4 x float> %v) {233; CHECK-LABEL: swizzle_23:234; CHECK: # %bb.0:235; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,3,0,1]236; CHECK-NEXT: retq237 %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2>238 %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2>239 ret <4 x float> %2240}241 242define <4 x float> @swizzle_24(<4 x float> %v) {243; CHECK-LABEL: swizzle_24:244; CHECK: # %bb.0:245; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,2,0,3]246; CHECK-NEXT: retq247 %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 2, i32 0, i32 1, i32 3>248 %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 2, i32 0, i32 1, i32 3>249 ret <4 x float> %2250}251 252define <4 x float> @swizzle_25(<4 x float> %v) {253; CHECK-LABEL: swizzle_25:254; CHECK: # %bb.0:255; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]256; CHECK-NEXT: retq257 %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 2, i32 0, i32 3, i32 1>258 %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 2, i32 0, i32 3, i32 1>259 ret <4 x float> %2260}261 262define <4 x float> @swizzle_26(<4 x float> %v) {263; CHECK-LABEL: swizzle_26:264; CHECK: # %bb.0:265; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3,1,2]266; CHECK-NEXT: retq267 %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 0, i32 2, i32 3, i32 1>268 %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 0, i32 2, i32 3, i32 1>269 ret <4 x float> %2270}271 272define <4 x float> @swizzle_27(<4 x float> %v) {273; CHECK-LABEL: swizzle_27:274; CHECK: # %bb.0:275; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]276; CHECK-NEXT: retq277 %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 0, i32 2>278 %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 0, i32 2>279 ret <4 x float> %2280}281 282define <4 x float> @swizzle_28(<4 x float> %v) {283; CHECK-LABEL: swizzle_28:284; CHECK: # %bb.0:285; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0,2,1]286; CHECK-NEXT: retq287 %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 2, i32 0>288 %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 2, i32 0>289 ret <4 x float> %2290}291 292define <4 x float> @swizzle_29(<4 x float> %v) {293; CHECK-LABEL: swizzle_29:294; CHECK: # %bb.0:295; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3,2,0]296; CHECK-NEXT: retq297 %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 3, i32 1, i32 2, i32 0>298 %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 1, i32 0, i32 2, i32 3>299 ret <4 x float> %2300}301 302; Make sure that we combine the shuffles from each function below into a single303; legal shuffle (either pshuflw or pshufb depending on the masks).304 305define <8 x i16> @swizzle_30(<8 x i16> %v) {306; CHECK-LABEL: swizzle_30:307; CHECK: # %bb.0:308; CHECK-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,3,2,0,4,5,6,7]309; CHECK-NEXT: retq310 %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 3, i32 1, i32 2, i32 0, i32 7, i32 5, i32 6, i32 4>311 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 1, i32 0, i32 2, i32 3, i32 7, i32 5, i32 6, i32 4>312 ret <8 x i16> %2313}314 315define <8 x i16> @swizzle_31(<8 x i16> %v) {316; CHECK-LABEL: swizzle_31:317; CHECK: # %bb.0:318; CHECK-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,3,2,0,4,5,6,7]319; CHECK-NEXT: retq320 %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 3, i32 0, i32 2, i32 1, i32 7, i32 5, i32 6, i32 4>321 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 3, i32 0, i32 2, i32 1, i32 7, i32 5, i32 6, i32 4>322 ret <8 x i16> %2323}324 325define <8 x i16> @swizzle_32(<8 x i16> %v) {326; CHECK-LABEL: swizzle_32:327; CHECK: # %bb.0:328; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,0,2,3]329; CHECK-NEXT: retq330 %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 0, i32 7, i32 5, i32 6, i32 4>331 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 0, i32 7, i32 5, i32 6, i32 4>332 ret <8 x i16> %2333}334 335define <8 x i16> @swizzle_33(<8 x i16> %v) {336; CHECK-LABEL: swizzle_33:337; CHECK: # %bb.0:338; CHECK-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[2,1,3,0,4,5,6,7]339; CHECK-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,7,6,4]340; CHECK-NEXT: retq341 %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 4, i32 6, i32 5, i32 7, i32 2, i32 3, i32 1, i32 0>342 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 4, i32 6, i32 5, i32 7, i32 2, i32 3, i32 1, i32 0>343 ret <8 x i16> %2344}345 346define <8 x i16> @swizzle_34(<8 x i16> %v) {347; CHECK-LABEL: swizzle_34:348; CHECK: # %bb.0:349; CHECK-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,3,0,2,4,5,6,7]350; CHECK-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,4,5]351; CHECK-NEXT: retq352 %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 4, i32 7, i32 6, i32 5, i32 1, i32 2, i32 0, i32 3>353 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 4, i32 7, i32 6, i32 5, i32 1, i32 2, i32 0, i32 3>354 ret <8 x i16> %2355}356 357define <8 x i16> @swizzle_35(<8 x i16> %v) {358; CHECK-LABEL: swizzle_35:359; CHECK: # %bb.0:360; CHECK-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[2,1,0,3,4,5,6,7]361; CHECK-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,7,6]362; CHECK-NEXT: retq363 %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 7, i32 4, i32 6, i32 5, i32 1, i32 3, i32 0, i32 2>364 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 7, i32 4, i32 6, i32 5, i32 1, i32 3, i32 0, i32 2>365 ret <8 x i16> %2366}367 368define <8 x i16> @swizzle_36(<8 x i16> %v) {369; CHECK-LABEL: swizzle_36:370; CHECK: # %bb.0:371; CHECK-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,3,2,1,4,5,6,7]372; CHECK-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,5,7]373; CHECK-NEXT: retq374 %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 4, i32 6, i32 7, i32 5, i32 0, i32 1, i32 3, i32 2>375 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 4, i32 6, i32 7, i32 5, i32 0, i32 1, i32 3, i32 2>376 ret <8 x i16> %2377}378 379define <8 x i16> @swizzle_37(<8 x i16> %v) {380; CHECK-LABEL: swizzle_37:381; CHECK: # %bb.0:382; CHECK-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,7,6,5]383; CHECK-NEXT: retq384 %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 7, i32 5, i32 6, i32 4>385 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 7, i32 4, i32 6, i32 5>386 ret <8 x i16> %2387}388 389define <8 x i16> @swizzle_38(<8 x i16> %v) {390; CHECK-LABEL: swizzle_38:391; CHECK: # %bb.0:392; CHECK-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[2,1,0,3,4,5,6,7]393; CHECK-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,6,7]394; CHECK-NEXT: retq395 %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 5, i32 6, i32 4, i32 7, i32 0, i32 2, i32 1, i32 3>396 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 5, i32 6, i32 4, i32 7, i32 0, i32 2, i32 1, i32 3>397 ret <8 x i16> %2398}399 400define <8 x i16> @swizzle_39(<8 x i16> %v) {401; CHECK-LABEL: swizzle_39:402; CHECK: # %bb.0:403; CHECK-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[2,3,1,0,4,5,6,7]404; CHECK-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,4,5]405; CHECK-NEXT: retq406 %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 5, i32 4, i32 6, i32 7, i32 3, i32 2, i32 1, i32 0>407 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 5, i32 4, i32 6, i32 7, i32 3, i32 2, i32 1, i32 0>408 ret <8 x i16> %2409}410 411define <8 x i16> @swizzle_40(<8 x i16> %v) {412; CHECK-LABEL: swizzle_40:413; CHECK: # %bb.0:414; CHECK-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,1,2,0,4,5,6,7]415; CHECK-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,5,7]416; CHECK-NEXT: retq417 %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 6, i32 4, i32 7, i32 5, i32 1, i32 0, i32 3, i32 2>418 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 6, i32 4, i32 7, i32 5, i32 1, i32 0, i32 3, i32 2>419 ret <8 x i16> %2420}421 422define <8 x i16> @swizzle_41(<8 x i16> %v) {423; CHECK-LABEL: swizzle_41:424; CHECK: # %bb.0:425; CHECK-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]426; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,3,2]427; CHECK-NEXT: retq428 %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 6, i32 7, i32 5, i32 4, i32 0, i32 1, i32 3, i32 2>429 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 6, i32 7, i32 5, i32 4, i32 0, i32 1, i32 3, i32 2>430 ret <8 x i16> %2431}432 433define <8 x i16> @swizzle_42(<8 x i16> %v) {434; CHECK-LABEL: swizzle_42:435; CHECK: # %bb.0:436; CHECK-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,7,6]437; CHECK-NEXT: retq438 %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 3, i32 2, i32 7, i32 6, i32 4, i32 5>439 %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 3, i32 2, i32 7, i32 6, i32 4, i32 5>440 ret <8 x i16> %2441}442