460 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -mtriple=x86_64-unknown -passes=slp-vectorizer -S | FileCheck %s --check-prefixes=CHECK,SSE3; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=slm -passes=slp-vectorizer -S | FileCheck %s --check-prefixes=CHECK,SLM4; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=corei7-avx -passes=slp-vectorizer -S | FileCheck %s --check-prefixes=CHECK,AVX,AVX15; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=core-avx2 -passes=slp-vectorizer -S | FileCheck %s --check-prefixes=CHECK,AVX,AVX26; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=knl -passes=slp-vectorizer -S | FileCheck %s --check-prefixes=CHECK,AVX,AVX5127; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=skx -passes=slp-vectorizer -S | FileCheck %s --check-prefixes=CHECK,AVX,AVX5128 9;10; 128-bit vectors11;12 13define <2 x double> @test_v2f64(<2 x double> %a, <2 x double> %b) {14; CHECK-LABEL: @test_v2f64(15; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <2 x double> [[A:%.*]], <2 x double> [[B:%.*]], <2 x i32> <i32 0, i32 2>16; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <2 x double> [[A]], <2 x double> [[B]], <2 x i32> <i32 1, i32 3>17; CHECK-NEXT: [[TMP3:%.*]] = fsub <2 x double> [[TMP1]], [[TMP2]]18; CHECK-NEXT: ret <2 x double> [[TMP3]]19;20 %a0 = extractelement <2 x double> %a, i32 021 %a1 = extractelement <2 x double> %a, i32 122 %b0 = extractelement <2 x double> %b, i32 023 %b1 = extractelement <2 x double> %b, i32 124 %r0 = fsub double %a0, %a125 %r1 = fsub double %b0, %b126 %r00 = insertelement <2 x double> undef, double %r0, i32 027 %r01 = insertelement <2 x double> %r00, double %r1, i32 128 ret <2 x double> %r0129}30 31define <4 x float> @test_v4f32(<4 x float> %a, <4 x float> %b) {32; CHECK-LABEL: @test_v4f32(33; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 4, i32 6>34; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[B]], <4 x i32> <i32 1, i32 3, i32 5, i32 7>35; CHECK-NEXT: [[TMP3:%.*]] = fsub <4 x float> [[TMP1]], [[TMP2]]36; CHECK-NEXT: ret <4 x float> [[TMP3]]37;38 %a0 = extractelement <4 x float> %a, i32 039 %a1 = extractelement <4 x float> %a, i32 140 %a2 = extractelement <4 x float> %a, i32 241 %a3 = extractelement <4 x float> %a, i32 342 %b0 = extractelement <4 x float> %b, i32 043 %b1 = extractelement <4 x float> %b, i32 144 %b2 = extractelement <4 x float> %b, i32 245 %b3 = extractelement <4 x float> %b, i32 346 %r0 = fsub float %a0, %a147 %r1 = fsub float %a2, %a348 %r2 = fsub float %b0, %b149 %r3 = fsub float %b2, %b350 %r00 = insertelement <4 x float> undef, float %r0, i32 051 %r01 = insertelement <4 x float> %r00, float %r1, i32 152 %r02 = insertelement <4 x float> %r01, float %r2, i32 253 %r03 = insertelement <4 x float> %r02, float %r3, i32 354 ret <4 x float> %r0355}56 57define <2 x i64> @test_v2i64(<2 x i64> %a, <2 x i64> %b) {58; CHECK-LABEL: @test_v2i64(59; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <2 x i64> [[A:%.*]], <2 x i64> [[B:%.*]], <2 x i32> <i32 0, i32 2>60; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <2 x i64> [[A]], <2 x i64> [[B]], <2 x i32> <i32 1, i32 3>61; CHECK-NEXT: [[TMP3:%.*]] = sub <2 x i64> [[TMP1]], [[TMP2]]62; CHECK-NEXT: ret <2 x i64> [[TMP3]]63;64 %a0 = extractelement <2 x i64> %a, i32 065 %a1 = extractelement <2 x i64> %a, i32 166 %b0 = extractelement <2 x i64> %b, i32 067 %b1 = extractelement <2 x i64> %b, i32 168 %r0 = sub i64 %a0, %a169 %r1 = sub i64 %b0, %b170 %r00 = insertelement <2 x i64> undef, i64 %r0, i32 071 %r01 = insertelement <2 x i64> %r00, i64 %r1, i32 172 ret <2 x i64> %r0173}74 75define <4 x i32> @test_v4i32(<4 x i32> %a, <4 x i32> %b) {76; CHECK-LABEL: @test_v4i32(77; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 4, i32 6>78; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 1, i32 3, i32 5, i32 7>79; CHECK-NEXT: [[TMP3:%.*]] = sub <4 x i32> [[TMP1]], [[TMP2]]80; CHECK-NEXT: ret <4 x i32> [[TMP3]]81;82 %a0 = extractelement <4 x i32> %a, i32 083 %a1 = extractelement <4 x i32> %a, i32 184 %a2 = extractelement <4 x i32> %a, i32 285 %a3 = extractelement <4 x i32> %a, i32 386 %b0 = extractelement <4 x i32> %b, i32 087 %b1 = extractelement <4 x i32> %b, i32 188 %b2 = extractelement <4 x i32> %b, i32 289 %b3 = extractelement <4 x i32> %b, i32 390 %r0 = sub i32 %a0, %a191 %r1 = sub i32 %a2, %a392 %r2 = sub i32 %b0, %b193 %r3 = sub i32 %b2, %b394 %r00 = insertelement <4 x i32> undef, i32 %r0, i32 095 %r01 = insertelement <4 x i32> %r00, i32 %r1, i32 196 %r02 = insertelement <4 x i32> %r01, i32 %r2, i32 297 %r03 = insertelement <4 x i32> %r02, i32 %r3, i32 398 ret <4 x i32> %r0399}100 101define <8 x i16> @test_v8i16(<8 x i16> %a, <8 x i16> %b) {102; CHECK-LABEL: @test_v8i16(103; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>104; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> [[B]], <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>105; CHECK-NEXT: [[TMP3:%.*]] = sub <8 x i16> [[TMP1]], [[TMP2]]106; CHECK-NEXT: ret <8 x i16> [[TMP3]]107;108 %a0 = extractelement <8 x i16> %a, i32 0109 %a1 = extractelement <8 x i16> %a, i32 1110 %a2 = extractelement <8 x i16> %a, i32 2111 %a3 = extractelement <8 x i16> %a, i32 3112 %a4 = extractelement <8 x i16> %a, i32 4113 %a5 = extractelement <8 x i16> %a, i32 5114 %a6 = extractelement <8 x i16> %a, i32 6115 %a7 = extractelement <8 x i16> %a, i32 7116 %b0 = extractelement <8 x i16> %b, i32 0117 %b1 = extractelement <8 x i16> %b, i32 1118 %b2 = extractelement <8 x i16> %b, i32 2119 %b3 = extractelement <8 x i16> %b, i32 3120 %b4 = extractelement <8 x i16> %b, i32 4121 %b5 = extractelement <8 x i16> %b, i32 5122 %b6 = extractelement <8 x i16> %b, i32 6123 %b7 = extractelement <8 x i16> %b, i32 7124 %r0 = sub i16 %a0, %a1125 %r1 = sub i16 %a2, %a3126 %r2 = sub i16 %a4, %a5127 %r3 = sub i16 %a6, %a7128 %r4 = sub i16 %b0, %b1129 %r5 = sub i16 %b2, %b3130 %r6 = sub i16 %b4, %b5131 %r7 = sub i16 %b6, %b7132 %r00 = insertelement <8 x i16> undef, i16 %r0, i32 0133 %r01 = insertelement <8 x i16> %r00, i16 %r1, i32 1134 %r02 = insertelement <8 x i16> %r01, i16 %r2, i32 2135 %r03 = insertelement <8 x i16> %r02, i16 %r3, i32 3136 %r04 = insertelement <8 x i16> %r03, i16 %r4, i32 4137 %r05 = insertelement <8 x i16> %r04, i16 %r5, i32 5138 %r06 = insertelement <8 x i16> %r05, i16 %r6, i32 6139 %r07 = insertelement <8 x i16> %r06, i16 %r7, i32 7140 ret <8 x i16> %r07141}142 143;144; 256-bit vectors145;146 147define <4 x double> @test_v4f64(<4 x double> %a, <4 x double> %b) {148; SSE-LABEL: @test_v4f64(149; SSE-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <2 x i32> <i32 0, i32 4>150; SSE-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <2 x i32> <i32 2, i32 6>151; SSE-NEXT: [[TMP5:%.*]] = shufflevector <2 x double> [[TMP1]], <2 x double> [[TMP2]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>152; SSE-NEXT: [[TMP3:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <2 x i32> <i32 1, i32 5>153; SSE-NEXT: [[TMP4:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <2 x i32> <i32 3, i32 7>154; SSE-NEXT: [[TMP6:%.*]] = shufflevector <2 x double> [[TMP3]], <2 x double> [[TMP4]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>155; SSE-NEXT: [[TMP7:%.*]] = fsub <4 x double> [[TMP5]], [[TMP6]]156; SSE-NEXT: ret <4 x double> [[TMP7]]157;158; SLM-LABEL: @test_v4f64(159; SLM-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <2 x i32> <i32 0, i32 4>160; SLM-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <2 x i32> <i32 2, i32 6>161; SLM-NEXT: [[TMP5:%.*]] = shufflevector <2 x double> [[TMP1]], <2 x double> [[TMP2]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>162; SLM-NEXT: [[TMP3:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <2 x i32> <i32 1, i32 5>163; SLM-NEXT: [[TMP4:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <2 x i32> <i32 3, i32 7>164; SLM-NEXT: [[TMP6:%.*]] = shufflevector <2 x double> [[TMP3]], <2 x double> [[TMP4]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>165; SLM-NEXT: [[TMP7:%.*]] = fsub <4 x double> [[TMP5]], [[TMP6]]166; SLM-NEXT: ret <4 x double> [[TMP7]]167;168; AVX-LABEL: @test_v4f64(169; AVX-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 2, i32 6>170; AVX-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 5, i32 3, i32 7>171; AVX-NEXT: [[TMP3:%.*]] = fsub <4 x double> [[TMP1]], [[TMP2]]172; AVX-NEXT: ret <4 x double> [[TMP3]]173;174 %a0 = extractelement <4 x double> %a, i32 0175 %a1 = extractelement <4 x double> %a, i32 1176 %a2 = extractelement <4 x double> %a, i32 2177 %a3 = extractelement <4 x double> %a, i32 3178 %b0 = extractelement <4 x double> %b, i32 0179 %b1 = extractelement <4 x double> %b, i32 1180 %b2 = extractelement <4 x double> %b, i32 2181 %b3 = extractelement <4 x double> %b, i32 3182 %r0 = fsub double %a0, %a1183 %r1 = fsub double %b0, %b1184 %r2 = fsub double %a2, %a3185 %r3 = fsub double %b2, %b3186 %r00 = insertelement <4 x double> undef, double %r0, i32 0187 %r01 = insertelement <4 x double> %r00, double %r1, i32 1188 %r02 = insertelement <4 x double> %r01, double %r2, i32 2189 %r03 = insertelement <4 x double> %r02, double %r3, i32 3190 ret <4 x double> %r03191}192 193define <8 x float> @test_v8f32(<8 x float> %a, <8 x float> %b) {194; SSE-LABEL: @test_v8f32(195; SSE-NEXT: [[TMP1:%.*]] = shufflevector <8 x float> [[A:%.*]], <8 x float> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 8, i32 10>196; SSE-NEXT: [[TMP2:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[B]], <4 x i32> <i32 4, i32 6, i32 12, i32 14>197; SSE-NEXT: [[TMP5:%.*]] = shufflevector <4 x float> [[TMP1]], <4 x float> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>198; SSE-NEXT: [[TMP3:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[B]], <4 x i32> <i32 1, i32 3, i32 9, i32 11>199; SSE-NEXT: [[TMP4:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[B]], <4 x i32> <i32 5, i32 7, i32 13, i32 15>200; SSE-NEXT: [[TMP6:%.*]] = shufflevector <4 x float> [[TMP3]], <4 x float> [[TMP4]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>201; SSE-NEXT: [[TMP7:%.*]] = fsub <8 x float> [[TMP5]], [[TMP6]]202; SSE-NEXT: ret <8 x float> [[TMP7]]203;204; SLM-LABEL: @test_v8f32(205; SLM-NEXT: [[TMP1:%.*]] = shufflevector <8 x float> [[A:%.*]], <8 x float> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 8, i32 10>206; SLM-NEXT: [[TMP2:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[B]], <4 x i32> <i32 4, i32 6, i32 12, i32 14>207; SLM-NEXT: [[TMP5:%.*]] = shufflevector <4 x float> [[TMP1]], <4 x float> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>208; SLM-NEXT: [[TMP3:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[B]], <4 x i32> <i32 1, i32 3, i32 9, i32 11>209; SLM-NEXT: [[TMP4:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[B]], <4 x i32> <i32 5, i32 7, i32 13, i32 15>210; SLM-NEXT: [[TMP6:%.*]] = shufflevector <4 x float> [[TMP3]], <4 x float> [[TMP4]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>211; SLM-NEXT: [[TMP7:%.*]] = fsub <8 x float> [[TMP5]], [[TMP6]]212; SLM-NEXT: ret <8 x float> [[TMP7]]213;214; AVX-LABEL: @test_v8f32(215; AVX-NEXT: [[TMP1:%.*]] = shufflevector <8 x float> [[A:%.*]], <8 x float> [[B:%.*]], <8 x i32> <i32 0, i32 2, i32 8, i32 10, i32 4, i32 6, i32 12, i32 14>216; AVX-NEXT: [[TMP2:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[B]], <8 x i32> <i32 1, i32 3, i32 9, i32 11, i32 5, i32 7, i32 13, i32 15>217; AVX-NEXT: [[TMP3:%.*]] = fsub <8 x float> [[TMP1]], [[TMP2]]218; AVX-NEXT: ret <8 x float> [[TMP3]]219;220 %a0 = extractelement <8 x float> %a, i32 0221 %a1 = extractelement <8 x float> %a, i32 1222 %a2 = extractelement <8 x float> %a, i32 2223 %a3 = extractelement <8 x float> %a, i32 3224 %a4 = extractelement <8 x float> %a, i32 4225 %a5 = extractelement <8 x float> %a, i32 5226 %a6 = extractelement <8 x float> %a, i32 6227 %a7 = extractelement <8 x float> %a, i32 7228 %b0 = extractelement <8 x float> %b, i32 0229 %b1 = extractelement <8 x float> %b, i32 1230 %b2 = extractelement <8 x float> %b, i32 2231 %b3 = extractelement <8 x float> %b, i32 3232 %b4 = extractelement <8 x float> %b, i32 4233 %b5 = extractelement <8 x float> %b, i32 5234 %b6 = extractelement <8 x float> %b, i32 6235 %b7 = extractelement <8 x float> %b, i32 7236 %r0 = fsub float %a0, %a1237 %r1 = fsub float %a2, %a3238 %r2 = fsub float %b0, %b1239 %r3 = fsub float %b2, %b3240 %r4 = fsub float %a4, %a5241 %r5 = fsub float %a6, %a7242 %r6 = fsub float %b4, %b5243 %r7 = fsub float %b6, %b7244 %r00 = insertelement <8 x float> undef, float %r0, i32 0245 %r01 = insertelement <8 x float> %r00, float %r1, i32 1246 %r02 = insertelement <8 x float> %r01, float %r2, i32 2247 %r03 = insertelement <8 x float> %r02, float %r3, i32 3248 %r04 = insertelement <8 x float> %r03, float %r4, i32 4249 %r05 = insertelement <8 x float> %r04, float %r5, i32 5250 %r06 = insertelement <8 x float> %r05, float %r6, i32 6251 %r07 = insertelement <8 x float> %r06, float %r7, i32 7252 ret <8 x float> %r07253}254 255define <4 x i64> @test_v4i64(<4 x i64> %a, <4 x i64> %b) {256; SSE-LABEL: @test_v4i64(257; SSE-NEXT: [[TMP1:%.*]] = shufflevector <4 x i64> [[A:%.*]], <4 x i64> [[B:%.*]], <2 x i32> <i32 0, i32 4>258; SSE-NEXT: [[TMP2:%.*]] = shufflevector <4 x i64> [[A]], <4 x i64> [[B]], <2 x i32> <i32 2, i32 6>259; SSE-NEXT: [[TMP5:%.*]] = shufflevector <2 x i64> [[TMP1]], <2 x i64> [[TMP2]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>260; SSE-NEXT: [[TMP3:%.*]] = shufflevector <4 x i64> [[A]], <4 x i64> [[B]], <2 x i32> <i32 1, i32 5>261; SSE-NEXT: [[TMP4:%.*]] = shufflevector <4 x i64> [[A]], <4 x i64> [[B]], <2 x i32> <i32 3, i32 7>262; SSE-NEXT: [[TMP6:%.*]] = shufflevector <2 x i64> [[TMP3]], <2 x i64> [[TMP4]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>263; SSE-NEXT: [[TMP7:%.*]] = sub <4 x i64> [[TMP5]], [[TMP6]]264; SSE-NEXT: ret <4 x i64> [[TMP7]]265;266; SLM-LABEL: @test_v4i64(267; SLM-NEXT: [[TMP1:%.*]] = shufflevector <4 x i64> [[A:%.*]], <4 x i64> [[B:%.*]], <2 x i32> <i32 0, i32 4>268; SLM-NEXT: [[TMP2:%.*]] = shufflevector <4 x i64> [[A]], <4 x i64> [[B]], <2 x i32> <i32 2, i32 6>269; SLM-NEXT: [[TMP5:%.*]] = shufflevector <2 x i64> [[TMP1]], <2 x i64> [[TMP2]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>270; SLM-NEXT: [[TMP3:%.*]] = shufflevector <4 x i64> [[A]], <4 x i64> [[B]], <2 x i32> <i32 1, i32 5>271; SLM-NEXT: [[TMP4:%.*]] = shufflevector <4 x i64> [[A]], <4 x i64> [[B]], <2 x i32> <i32 3, i32 7>272; SLM-NEXT: [[TMP6:%.*]] = shufflevector <2 x i64> [[TMP3]], <2 x i64> [[TMP4]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>273; SLM-NEXT: [[TMP7:%.*]] = sub <4 x i64> [[TMP5]], [[TMP6]]274; SLM-NEXT: ret <4 x i64> [[TMP7]]275;276; AVX-LABEL: @test_v4i64(277; AVX-NEXT: [[TMP1:%.*]] = shufflevector <4 x i64> [[A:%.*]], <4 x i64> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 2, i32 6>278; AVX-NEXT: [[TMP2:%.*]] = shufflevector <4 x i64> [[A]], <4 x i64> [[B]], <4 x i32> <i32 1, i32 5, i32 3, i32 7>279; AVX-NEXT: [[TMP3:%.*]] = sub <4 x i64> [[TMP1]], [[TMP2]]280; AVX-NEXT: ret <4 x i64> [[TMP3]]281;282 %a0 = extractelement <4 x i64> %a, i32 0283 %a1 = extractelement <4 x i64> %a, i32 1284 %a2 = extractelement <4 x i64> %a, i32 2285 %a3 = extractelement <4 x i64> %a, i32 3286 %b0 = extractelement <4 x i64> %b, i32 0287 %b1 = extractelement <4 x i64> %b, i32 1288 %b2 = extractelement <4 x i64> %b, i32 2289 %b3 = extractelement <4 x i64> %b, i32 3290 %r0 = sub i64 %a0, %a1291 %r1 = sub i64 %b0, %b1292 %r2 = sub i64 %a2, %a3293 %r3 = sub i64 %b2, %b3294 %r00 = insertelement <4 x i64> undef, i64 %r0, i32 0295 %r01 = insertelement <4 x i64> %r00, i64 %r1, i32 1296 %r02 = insertelement <4 x i64> %r01, i64 %r2, i32 2297 %r03 = insertelement <4 x i64> %r02, i64 %r3, i32 3298 ret <4 x i64> %r03299}300 301define <8 x i32> @test_v8i32(<8 x i32> %a, <8 x i32> %b) {302; SSE-LABEL: @test_v8i32(303; SSE-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A:%.*]], <8 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 8, i32 10>304; SSE-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> [[B]], <4 x i32> <i32 4, i32 6, i32 12, i32 14>305; SSE-NEXT: [[TMP5:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>306; SSE-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> [[B]], <4 x i32> <i32 1, i32 3, i32 9, i32 11>307; SSE-NEXT: [[TMP4:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> [[B]], <4 x i32> <i32 5, i32 7, i32 13, i32 15>308; SSE-NEXT: [[TMP6:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> [[TMP4]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>309; SSE-NEXT: [[TMP7:%.*]] = sub <8 x i32> [[TMP5]], [[TMP6]]310; SSE-NEXT: ret <8 x i32> [[TMP7]]311;312; SLM-LABEL: @test_v8i32(313; SLM-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A:%.*]], <8 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 8, i32 10>314; SLM-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> [[B]], <4 x i32> <i32 4, i32 6, i32 12, i32 14>315; SLM-NEXT: [[TMP5:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>316; SLM-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> [[B]], <4 x i32> <i32 1, i32 3, i32 9, i32 11>317; SLM-NEXT: [[TMP4:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> [[B]], <4 x i32> <i32 5, i32 7, i32 13, i32 15>318; SLM-NEXT: [[TMP6:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> [[TMP4]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>319; SLM-NEXT: [[TMP7:%.*]] = sub <8 x i32> [[TMP5]], [[TMP6]]320; SLM-NEXT: ret <8 x i32> [[TMP7]]321;322; AVX-LABEL: @test_v8i32(323; AVX-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A:%.*]], <8 x i32> [[B:%.*]], <8 x i32> <i32 0, i32 2, i32 8, i32 10, i32 4, i32 6, i32 12, i32 14>324; AVX-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> [[B]], <8 x i32> <i32 1, i32 3, i32 9, i32 11, i32 5, i32 7, i32 13, i32 15>325; AVX-NEXT: [[TMP3:%.*]] = sub <8 x i32> [[TMP1]], [[TMP2]]326; AVX-NEXT: ret <8 x i32> [[TMP3]]327;328 %a0 = extractelement <8 x i32> %a, i32 0329 %a1 = extractelement <8 x i32> %a, i32 1330 %a2 = extractelement <8 x i32> %a, i32 2331 %a3 = extractelement <8 x i32> %a, i32 3332 %a4 = extractelement <8 x i32> %a, i32 4333 %a5 = extractelement <8 x i32> %a, i32 5334 %a6 = extractelement <8 x i32> %a, i32 6335 %a7 = extractelement <8 x i32> %a, i32 7336 %b0 = extractelement <8 x i32> %b, i32 0337 %b1 = extractelement <8 x i32> %b, i32 1338 %b2 = extractelement <8 x i32> %b, i32 2339 %b3 = extractelement <8 x i32> %b, i32 3340 %b4 = extractelement <8 x i32> %b, i32 4341 %b5 = extractelement <8 x i32> %b, i32 5342 %b6 = extractelement <8 x i32> %b, i32 6343 %b7 = extractelement <8 x i32> %b, i32 7344 %r0 = sub i32 %a0, %a1345 %r1 = sub i32 %a2, %a3346 %r2 = sub i32 %b0, %b1347 %r3 = sub i32 %b2, %b3348 %r4 = sub i32 %a4, %a5349 %r5 = sub i32 %a6, %a7350 %r6 = sub i32 %b4, %b5351 %r7 = sub i32 %b6, %b7352 %r00 = insertelement <8 x i32> undef, i32 %r0, i32 0353 %r01 = insertelement <8 x i32> %r00, i32 %r1, i32 1354 %r02 = insertelement <8 x i32> %r01, i32 %r2, i32 2355 %r03 = insertelement <8 x i32> %r02, i32 %r3, i32 3356 %r04 = insertelement <8 x i32> %r03, i32 %r4, i32 4357 %r05 = insertelement <8 x i32> %r04, i32 %r5, i32 5358 %r06 = insertelement <8 x i32> %r05, i32 %r6, i32 6359 %r07 = insertelement <8 x i32> %r06, i32 %r7, i32 7360 ret <8 x i32> %r07361}362 363define <16 x i16> @test_v16i16(<16 x i16> %a, <16 x i16> %b) {364; SSE-LABEL: @test_v16i16(365; SSE-NEXT: [[TMP1:%.*]] = shufflevector <16 x i16> [[A:%.*]], <16 x i16> [[B:%.*]], <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 16, i32 18, i32 20, i32 22>366; SSE-NEXT: [[TMP2:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <8 x i32> <i32 8, i32 10, i32 12, i32 14, i32 24, i32 26, i32 28, i32 30>367; SSE-NEXT: [[TMP5:%.*]] = shufflevector <8 x i16> [[TMP1]], <8 x i16> [[TMP2]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>368; SSE-NEXT: [[TMP3:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 17, i32 19, i32 21, i32 23>369; SSE-NEXT: [[TMP4:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <8 x i32> <i32 9, i32 11, i32 13, i32 15, i32 25, i32 27, i32 29, i32 31>370; SSE-NEXT: [[TMP6:%.*]] = shufflevector <8 x i16> [[TMP3]], <8 x i16> [[TMP4]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>371; SSE-NEXT: [[TMP7:%.*]] = sub <16 x i16> [[TMP5]], [[TMP6]]372; SSE-NEXT: ret <16 x i16> [[TMP7]]373;374; SLM-LABEL: @test_v16i16(375; SLM-NEXT: [[TMP1:%.*]] = shufflevector <16 x i16> [[A:%.*]], <16 x i16> [[B:%.*]], <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 16, i32 18, i32 20, i32 22>376; SLM-NEXT: [[TMP2:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <8 x i32> <i32 8, i32 10, i32 12, i32 14, i32 24, i32 26, i32 28, i32 30>377; SLM-NEXT: [[TMP5:%.*]] = shufflevector <8 x i16> [[TMP1]], <8 x i16> [[TMP2]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>378; SLM-NEXT: [[TMP3:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 17, i32 19, i32 21, i32 23>379; SLM-NEXT: [[TMP4:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <8 x i32> <i32 9, i32 11, i32 13, i32 15, i32 25, i32 27, i32 29, i32 31>380; SLM-NEXT: [[TMP6:%.*]] = shufflevector <8 x i16> [[TMP3]], <8 x i16> [[TMP4]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>381; SLM-NEXT: [[TMP7:%.*]] = sub <16 x i16> [[TMP5]], [[TMP6]]382; SLM-NEXT: ret <16 x i16> [[TMP7]]383;384; AVX-LABEL: @test_v16i16(385; AVX-NEXT: [[TMP1:%.*]] = shufflevector <16 x i16> [[A:%.*]], <16 x i16> [[B:%.*]], <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 16, i32 18, i32 20, i32 22, i32 8, i32 10, i32 12, i32 14, i32 24, i32 26, i32 28, i32 30>386; AVX-NEXT: [[TMP2:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 17, i32 19, i32 21, i32 23, i32 9, i32 11, i32 13, i32 15, i32 25, i32 27, i32 29, i32 31>387; AVX-NEXT: [[TMP3:%.*]] = sub <16 x i16> [[TMP1]], [[TMP2]]388; AVX-NEXT: ret <16 x i16> [[TMP3]]389;390 %a0 = extractelement <16 x i16> %a, i32 0391 %a1 = extractelement <16 x i16> %a, i32 1392 %a2 = extractelement <16 x i16> %a, i32 2393 %a3 = extractelement <16 x i16> %a, i32 3394 %a4 = extractelement <16 x i16> %a, i32 4395 %a5 = extractelement <16 x i16> %a, i32 5396 %a6 = extractelement <16 x i16> %a, i32 6397 %a7 = extractelement <16 x i16> %a, i32 7398 %a8 = extractelement <16 x i16> %a, i32 8399 %a9 = extractelement <16 x i16> %a, i32 9400 %a10 = extractelement <16 x i16> %a, i32 10401 %a11 = extractelement <16 x i16> %a, i32 11402 %a12 = extractelement <16 x i16> %a, i32 12403 %a13 = extractelement <16 x i16> %a, i32 13404 %a14 = extractelement <16 x i16> %a, i32 14405 %a15 = extractelement <16 x i16> %a, i32 15406 %b0 = extractelement <16 x i16> %b, i32 0407 %b1 = extractelement <16 x i16> %b, i32 1408 %b2 = extractelement <16 x i16> %b, i32 2409 %b3 = extractelement <16 x i16> %b, i32 3410 %b4 = extractelement <16 x i16> %b, i32 4411 %b5 = extractelement <16 x i16> %b, i32 5412 %b6 = extractelement <16 x i16> %b, i32 6413 %b7 = extractelement <16 x i16> %b, i32 7414 %b8 = extractelement <16 x i16> %b, i32 8415 %b9 = extractelement <16 x i16> %b, i32 9416 %b10 = extractelement <16 x i16> %b, i32 10417 %b11 = extractelement <16 x i16> %b, i32 11418 %b12 = extractelement <16 x i16> %b, i32 12419 %b13 = extractelement <16 x i16> %b, i32 13420 %b14 = extractelement <16 x i16> %b, i32 14421 %b15 = extractelement <16 x i16> %b, i32 15422 %r0 = sub i16 %a0 , %a1423 %r1 = sub i16 %a2 , %a3424 %r2 = sub i16 %a4 , %a5425 %r3 = sub i16 %a6 , %a7426 %r4 = sub i16 %b0 , %b1427 %r5 = sub i16 %b2 , %b3428 %r6 = sub i16 %b4 , %b5429 %r7 = sub i16 %b6 , %b7430 %r8 = sub i16 %a8 , %a9431 %r9 = sub i16 %a10, %a11432 %r10 = sub i16 %a12, %a13433 %r11 = sub i16 %a14, %a15434 %r12 = sub i16 %b8 , %b9435 %r13 = sub i16 %b10, %b11436 %r14 = sub i16 %b12, %b13437 %r15 = sub i16 %b14, %b15438 %rv0 = insertelement <16 x i16> undef, i16 %r0 , i32 0439 %rv1 = insertelement <16 x i16> %rv0 , i16 %r1 , i32 1440 %rv2 = insertelement <16 x i16> %rv1 , i16 %r2 , i32 2441 %rv3 = insertelement <16 x i16> %rv2 , i16 %r3 , i32 3442 %rv4 = insertelement <16 x i16> %rv3 , i16 %r4 , i32 4443 %rv5 = insertelement <16 x i16> %rv4 , i16 %r5 , i32 5444 %rv6 = insertelement <16 x i16> %rv5 , i16 %r6 , i32 6445 %rv7 = insertelement <16 x i16> %rv6 , i16 %r7 , i32 7446 %rv8 = insertelement <16 x i16> %rv7 , i16 %r8 , i32 8447 %rv9 = insertelement <16 x i16> %rv8 , i16 %r9 , i32 9448 %rv10 = insertelement <16 x i16> %rv9 , i16 %r10, i32 10449 %rv11 = insertelement <16 x i16> %rv10, i16 %r11, i32 11450 %rv12 = insertelement <16 x i16> %rv11, i16 %r12, i32 12451 %rv13 = insertelement <16 x i16> %rv12, i16 %r13, i32 13452 %rv14 = insertelement <16 x i16> %rv13, i16 %r14, i32 14453 %rv15 = insertelement <16 x i16> %rv14, i16 %r15, i32 15454 ret <16 x i16> %rv15455}456;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:457; AVX1: {{.*}}458; AVX2: {{.*}}459; AVX512: {{.*}}460