1622 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -O3 -S -mtriple=x86_64-- -mcpu=x86-64 | FileCheck %s --check-prefixes=CHECK,SSE23; RUN: opt < %s -O3 -S -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=CHECK,SSE44; RUN: opt < %s -O3 -S -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=CHECK,AVX,AVX25; RUN: opt < %s -O3 -S -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=CHECK,AVX,AVX5126; RUN: opt < %s -passes="default<O3>" -S -mtriple=x86_64-- -mcpu=x86-64 | FileCheck %s --check-prefixes=CHECK,SSE27; RUN: opt < %s -passes="default<O3>" -S -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=CHECK,SSE48; RUN: opt < %s -passes="default<O3>" -S -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=CHECK,AVX,AVX29; RUN: opt < %s -passes="default<O3>" -S -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=CHECK,AVX,AVX51210 11; PR34072 - failure to canonicalize to (add (shuffle a, b),(shuffle a, b)) for optimal horizontal add patterns (with undemanded elements)12 13;14; v8i1615;16 17define <8 x i16> @add_v8i16_01234567(<8 x i16> %a, <8 x i16> %b) {18; CHECK-LABEL: @add_v8i16_01234567(19; 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>20; 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>21; CHECK-NEXT: [[TMP3:%.*]] = add <8 x i16> [[TMP1]], [[TMP2]]22; CHECK-NEXT: ret <8 x i16> [[TMP3]]23;24 %a0 = extractelement <8 x i16> %a, i32 025 %a1 = extractelement <8 x i16> %a, i32 126 %a2 = extractelement <8 x i16> %a, i32 227 %a3 = extractelement <8 x i16> %a, i32 328 %a4 = extractelement <8 x i16> %a, i32 429 %a5 = extractelement <8 x i16> %a, i32 530 %a6 = extractelement <8 x i16> %a, i32 631 %a7 = extractelement <8 x i16> %a, i32 732 %a01 = add i16 %a0, %a133 %a23 = add i16 %a2, %a334 %a45 = add i16 %a4, %a535 %a67 = add i16 %a6, %a736 %b0 = extractelement <8 x i16> %b, i32 037 %b1 = extractelement <8 x i16> %b, i32 138 %b2 = extractelement <8 x i16> %b, i32 239 %b3 = extractelement <8 x i16> %b, i32 340 %b4 = extractelement <8 x i16> %b, i32 441 %b5 = extractelement <8 x i16> %b, i32 542 %b6 = extractelement <8 x i16> %b, i32 643 %b7 = extractelement <8 x i16> %b, i32 744 %b01 = add i16 %b0, %b145 %b23 = add i16 %b2, %b346 %b45 = add i16 %b4, %b547 %b67 = add i16 %b6, %b748 %hadd0 = insertelement <8 x i16> poison, i16 %a01, i32 049 %hadd1 = insertelement <8 x i16> %hadd0, i16 %a23, i32 150 %hadd2 = insertelement <8 x i16> %hadd1, i16 %a45, i32 251 %hadd3 = insertelement <8 x i16> %hadd2, i16 %a67, i32 352 %hadd4 = insertelement <8 x i16> %hadd3, i16 %b01, i32 453 %hadd5 = insertelement <8 x i16> %hadd4, i16 %b23, i32 554 %hadd6 = insertelement <8 x i16> %hadd5, i16 %b45, i32 655 %hadd7 = insertelement <8 x i16> %hadd6, i16 %b67, i32 756 %result = shufflevector <8 x i16> %hadd7, <8 x i16> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>57 ret <8 x i16> %result58}59 60define <8 x i16> @add_v8i16_u1234567(<8 x i16> %a, <8 x i16> %b) {61; SSE2-LABEL: @add_v8i16_u1234567(62; SSE2-NEXT: [[SHIFT3:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> poison, <8 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 7, i32 poison>63; SSE2-NEXT: [[TMP6:%.*]] = add <8 x i16> [[A]], [[SHIFT3]]64; SSE2-NEXT: [[TMP7:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> poison, <8 x i32> <i32 poison, i32 3, i32 4, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>65; SSE2-NEXT: [[TMP4:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> poison, <8 x i32> <i32 poison, i32 2, i32 5, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>66; SSE2-NEXT: [[HADD1:%.*]] = add <8 x i16> [[TMP7]], [[TMP4]]67; SSE2-NEXT: [[HADD3:%.*]] = shufflevector <8 x i16> [[HADD1]], <8 x i16> [[TMP6]], <8 x i32> <i32 poison, i32 1, i32 2, i32 14, i32 poison, i32 poison, i32 poison, i32 poison>68; SSE2-NEXT: [[TMP1:%.*]] = shufflevector <8 x i16> [[B:%.*]], <8 x i16> poison, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 poison, i32 poison, i32 poison, i32 poison>69; SSE2-NEXT: [[TMP2:%.*]] = shufflevector <8 x i16> [[B]], <8 x i16> poison, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 poison, i32 poison, i32 poison, i32 poison>70; SSE2-NEXT: [[TMP3:%.*]] = add <8 x i16> [[TMP1]], [[TMP2]]71; SSE2-NEXT: [[RESULT:%.*]] = shufflevector <8 x i16> [[HADD3]], <8 x i16> [[TMP3]], <8 x i32> <i32 poison, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>72; SSE2-NEXT: ret <8 x i16> [[RESULT]]73;74; SSE4-LABEL: @add_v8i16_u1234567(75; SSE4-NEXT: [[TMP5:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], <8 x i32> <i32 poison, i32 2, i32 5, i32 6, i32 8, i32 10, i32 12, i32 14>76; SSE4-NEXT: [[TMP6:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> [[B]], <8 x i32> <i32 poison, i32 3, i32 4, i32 7, i32 9, i32 11, i32 13, i32 15>77; SSE4-NEXT: [[TMP7:%.*]] = add <8 x i16> [[TMP5]], [[TMP6]]78; SSE4-NEXT: ret <8 x i16> [[TMP7]]79;80; AVX-LABEL: @add_v8i16_u1234567(81; AVX-NEXT: [[TMP5:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], <8 x i32> <i32 poison, i32 2, i32 5, i32 6, i32 8, i32 10, i32 12, i32 14>82; AVX-NEXT: [[TMP6:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> [[B]], <8 x i32> <i32 poison, i32 3, i32 4, i32 7, i32 9, i32 11, i32 13, i32 15>83; AVX-NEXT: [[TMP7:%.*]] = add <8 x i16> [[TMP5]], [[TMP6]]84; AVX-NEXT: ret <8 x i16> [[TMP7]]85;86 %a0 = extractelement <8 x i16> %a, i32 087 %a1 = extractelement <8 x i16> %a, i32 188 %a2 = extractelement <8 x i16> %a, i32 289 %a3 = extractelement <8 x i16> %a, i32 390 %a4 = extractelement <8 x i16> %a, i32 491 %a5 = extractelement <8 x i16> %a, i32 592 %a6 = extractelement <8 x i16> %a, i32 693 %a7 = extractelement <8 x i16> %a, i32 794 %a01 = add i16 %a0, %a195 %a23 = add i16 %a2, %a396 %a45 = add i16 %a4, %a597 %a67 = add i16 %a6, %a798 %b0 = extractelement <8 x i16> %b, i32 099 %b1 = extractelement <8 x i16> %b, i32 1100 %b2 = extractelement <8 x i16> %b, i32 2101 %b3 = extractelement <8 x i16> %b, i32 3102 %b4 = extractelement <8 x i16> %b, i32 4103 %b5 = extractelement <8 x i16> %b, i32 5104 %b6 = extractelement <8 x i16> %b, i32 6105 %b7 = extractelement <8 x i16> %b, i32 7106 %b01 = add i16 %b0, %b1107 %b23 = add i16 %b2, %b3108 %b45 = add i16 %b4, %b5109 %b67 = add i16 %b6, %b7110 %hadd0 = insertelement <8 x i16> poison, i16 %a01, i32 0111 %hadd1 = insertelement <8 x i16> %hadd0, i16 %a23, i32 1112 %hadd2 = insertelement <8 x i16> %hadd1, i16 %a45, i32 2113 %hadd3 = insertelement <8 x i16> %hadd2, i16 %a67, i32 3114 %hadd4 = insertelement <8 x i16> %hadd3, i16 %b01, i32 4115 %hadd5 = insertelement <8 x i16> %hadd4, i16 %b23, i32 5116 %hadd6 = insertelement <8 x i16> %hadd5, i16 %b45, i32 6117 %hadd7 = insertelement <8 x i16> %hadd6, i16 %b67, i32 7118 %result = shufflevector <8 x i16> %hadd7, <8 x i16> %a, <8 x i32> <i32 poison, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>119 ret <8 x i16> %result120}121 122define <8 x i16> @add_v8i16_76u43210(<8 x i16> %a, <8 x i16> %b) {123; SSE2-LABEL: @add_v8i16_76u43210(124; SSE2-NEXT: [[SHIFT:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> poison, <8 x i32> <i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>125; SSE2-NEXT: [[TMP1:%.*]] = add <8 x i16> [[A]], [[SHIFT]]126; SSE2-NEXT: [[SHIFT2:%.*]] = shufflevector <8 x i16> [[B:%.*]], <8 x i16> poison, <8 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 5, i32 poison, i32 poison, i32 poison>127; SSE2-NEXT: [[TMP2:%.*]] = add <8 x i16> [[B]], [[SHIFT2]]128; SSE2-NEXT: [[SHIFT3:%.*]] = shufflevector <8 x i16> [[B]], <8 x i16> poison, <8 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 6>129; SSE2-NEXT: [[TMP3:%.*]] = add <8 x i16> [[SHIFT3]], [[B]]130; SSE2-NEXT: [[TMP4:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> [[B]], <8 x i32> <i32 2, i32 4, i32 6, i32 8, i32 poison, i32 poison, i32 poison, i32 poison>131; SSE2-NEXT: [[TMP5:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> [[B]], <8 x i32> <i32 3, i32 5, i32 7, i32 9, i32 poison, i32 poison, i32 poison, i32 poison>132; SSE2-NEXT: [[TMP6:%.*]] = add <8 x i16> [[TMP4]], [[TMP5]]133; SSE2-NEXT: [[HADD41:%.*]] = shufflevector <8 x i16> [[TMP1]], <8 x i16> [[TMP6]], <8 x i32> <i32 0, i32 8, i32 9, i32 10, i32 11, i32 poison, i32 poison, i32 poison>134; SSE2-NEXT: [[HADD6:%.*]] = shufflevector <8 x i16> [[HADD41]], <8 x i16> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 poison, i32 12, i32 poison>135; SSE2-NEXT: [[HADD7:%.*]] = shufflevector <8 x i16> [[HADD6]], <8 x i16> [[TMP3]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 poison, i32 6, i32 15>136; SSE2-NEXT: [[RESULT:%.*]] = shufflevector <8 x i16> [[HADD7]], <8 x i16> poison, <8 x i32> <i32 7, i32 6, i32 poison, i32 4, i32 3, i32 2, i32 1, i32 0>137; SSE2-NEXT: ret <8 x i16> [[RESULT]]138;139; SSE4-LABEL: @add_v8i16_76u43210(140; SSE4-NEXT: [[TMP1:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> poison, <8 x i32> <i32 0, i32 3, i32 4, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>141; SSE4-NEXT: [[TMP2:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> poison, <8 x i32> <i32 1, i32 2, i32 5, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>142; SSE4-NEXT: [[HADD22:%.*]] = add <8 x i16> [[TMP1]], [[TMP2]]143; SSE4-NEXT: [[TMP3:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> [[B:%.*]], <8 x i32> <i32 6, i32 8, i32 poison, i32 12, i32 14, i32 poison, i32 poison, i32 poison>144; SSE4-NEXT: [[TMP4:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> [[B]], <8 x i32> <i32 7, i32 9, i32 poison, i32 13, i32 15, i32 poison, i32 poison, i32 poison>145; SSE4-NEXT: [[TMP5:%.*]] = add <8 x i16> [[TMP3]], [[TMP4]]146; SSE4-NEXT: [[RESULT:%.*]] = shufflevector <8 x i16> [[TMP5]], <8 x i16> [[HADD22]], <8 x i32> <i32 4, i32 3, i32 poison, i32 1, i32 0, i32 10, i32 9, i32 8>147; SSE4-NEXT: ret <8 x i16> [[RESULT]]148;149; AVX-LABEL: @add_v8i16_76u43210(150; AVX-NEXT: [[TMP1:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> poison, <8 x i32> <i32 0, i32 3, i32 4, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>151; AVX-NEXT: [[TMP2:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> poison, <8 x i32> <i32 1, i32 2, i32 5, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>152; AVX-NEXT: [[HADD22:%.*]] = add <8 x i16> [[TMP1]], [[TMP2]]153; AVX-NEXT: [[TMP3:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> [[B:%.*]], <8 x i32> <i32 6, i32 8, i32 poison, i32 12, i32 14, i32 poison, i32 poison, i32 poison>154; AVX-NEXT: [[TMP4:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> [[B]], <8 x i32> <i32 7, i32 9, i32 poison, i32 13, i32 15, i32 poison, i32 poison, i32 poison>155; AVX-NEXT: [[TMP5:%.*]] = add <8 x i16> [[TMP3]], [[TMP4]]156; AVX-NEXT: [[RESULT:%.*]] = shufflevector <8 x i16> [[TMP5]], <8 x i16> [[HADD22]], <8 x i32> <i32 4, i32 3, i32 poison, i32 1, i32 0, i32 10, i32 9, i32 8>157; AVX-NEXT: ret <8 x i16> [[RESULT]]158;159 %a0 = extractelement <8 x i16> %a, i32 0160 %a1 = extractelement <8 x i16> %a, i32 1161 %a2 = extractelement <8 x i16> %a, i32 2162 %a3 = extractelement <8 x i16> %a, i32 3163 %a4 = extractelement <8 x i16> %a, i32 4164 %a5 = extractelement <8 x i16> %a, i32 5165 %a6 = extractelement <8 x i16> %a, i32 6166 %a7 = extractelement <8 x i16> %a, i32 7167 %a01 = add i16 %a0, %a1168 %a23 = add i16 %a2, %a3169 %a45 = add i16 %a4, %a5170 %a67 = add i16 %a6, %a7171 %b0 = extractelement <8 x i16> %b, i32 0172 %b1 = extractelement <8 x i16> %b, i32 1173 %b2 = extractelement <8 x i16> %b, i32 2174 %b3 = extractelement <8 x i16> %b, i32 3175 %b4 = extractelement <8 x i16> %b, i32 4176 %b5 = extractelement <8 x i16> %b, i32 5177 %b6 = extractelement <8 x i16> %b, i32 6178 %b7 = extractelement <8 x i16> %b, i32 7179 %b01 = add i16 %b0, %b1180 %b23 = add i16 %b2, %b3181 %b45 = add i16 %b4, %b5182 %b67 = add i16 %b6, %b7183 %hadd0 = insertelement <8 x i16> poison, i16 %a01, i32 0184 %hadd1 = insertelement <8 x i16> %hadd0, i16 %a23, i32 1185 %hadd2 = insertelement <8 x i16> %hadd1, i16 %a45, i32 2186 %hadd3 = insertelement <8 x i16> %hadd2, i16 %a67, i32 3187 %hadd4 = insertelement <8 x i16> %hadd3, i16 %b01, i32 4188 %hadd5 = insertelement <8 x i16> %hadd4, i16 %b23, i32 5189 %hadd6 = insertelement <8 x i16> %hadd5, i16 %b45, i32 6190 %hadd7 = insertelement <8 x i16> %hadd6, i16 %b67, i32 7191 %result = shufflevector <8 x i16> %hadd7, <8 x i16> %a, <8 x i32> <i32 7, i32 6, i32 poison, i32 4, i32 3, i32 2, i32 1, i32 0>192 ret <8 x i16> %result193}194 195;196; v16i16197;198 199define <16 x i16> @add_v16i16_0123456789ABCDEF(<16 x i16> %a, <16 x i16> %b) {200; CHECK-LABEL: @add_v16i16_0123456789ABCDEF(201; CHECK-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>202; CHECK-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>203; CHECK-NEXT: [[TMP3:%.*]] = add <16 x i16> [[TMP1]], [[TMP2]]204; CHECK-NEXT: ret <16 x i16> [[TMP3]]205;206 %a0 = extractelement <16 x i16> %a, i32 0207 %a1 = extractelement <16 x i16> %a, i32 1208 %a2 = extractelement <16 x i16> %a, i32 2209 %a3 = extractelement <16 x i16> %a, i32 3210 %a4 = extractelement <16 x i16> %a, i32 4211 %a5 = extractelement <16 x i16> %a, i32 5212 %a6 = extractelement <16 x i16> %a, i32 6213 %a7 = extractelement <16 x i16> %a, i32 7214 %a8 = extractelement <16 x i16> %a, i32 8215 %a9 = extractelement <16 x i16> %a, i32 9216 %aA = extractelement <16 x i16> %a, i32 10217 %aB = extractelement <16 x i16> %a, i32 11218 %aC = extractelement <16 x i16> %a, i32 12219 %aD = extractelement <16 x i16> %a, i32 13220 %aE = extractelement <16 x i16> %a, i32 14221 %aF = extractelement <16 x i16> %a, i32 15222 %a01 = add i16 %a0, %a1223 %a23 = add i16 %a2, %a3224 %a45 = add i16 %a4, %a5225 %a67 = add i16 %a6, %a7226 %a89 = add i16 %a8, %a9227 %aAB = add i16 %aA, %aB228 %aCD = add i16 %aC, %aD229 %aEF = add i16 %aE, %aF230 %b0 = extractelement <16 x i16> %b, i32 0231 %b1 = extractelement <16 x i16> %b, i32 1232 %b2 = extractelement <16 x i16> %b, i32 2233 %b3 = extractelement <16 x i16> %b, i32 3234 %b4 = extractelement <16 x i16> %b, i32 4235 %b5 = extractelement <16 x i16> %b, i32 5236 %b6 = extractelement <16 x i16> %b, i32 6237 %b7 = extractelement <16 x i16> %b, i32 7238 %b8 = extractelement <16 x i16> %b, i32 8239 %b9 = extractelement <16 x i16> %b, i32 9240 %bA = extractelement <16 x i16> %b, i32 10241 %bB = extractelement <16 x i16> %b, i32 11242 %bC = extractelement <16 x i16> %b, i32 12243 %bD = extractelement <16 x i16> %b, i32 13244 %bE = extractelement <16 x i16> %b, i32 14245 %bF = extractelement <16 x i16> %b, i32 15246 %b01 = add i16 %b0, %b1247 %b23 = add i16 %b2, %b3248 %b45 = add i16 %b4, %b5249 %b67 = add i16 %b6, %b7250 %b89 = add i16 %b8, %b9251 %bAB = add i16 %bA, %bB252 %bCD = add i16 %bC, %bD253 %bEF = add i16 %bE, %bF254 %hadd0 = insertelement <16 x i16> poison, i16 %a01, i32 0255 %hadd1 = insertelement <16 x i16> %hadd0, i16 %a23, i32 1256 %hadd2 = insertelement <16 x i16> %hadd1, i16 %a45, i32 2257 %hadd3 = insertelement <16 x i16> %hadd2, i16 %a67, i32 3258 %hadd4 = insertelement <16 x i16> %hadd3, i16 %b01, i32 4259 %hadd5 = insertelement <16 x i16> %hadd4, i16 %b23, i32 5260 %hadd6 = insertelement <16 x i16> %hadd5, i16 %b45, i32 6261 %hadd7 = insertelement <16 x i16> %hadd6, i16 %b67, i32 7262 %hadd8 = insertelement <16 x i16> %hadd7, i16 %a89, i32 8263 %hadd9 = insertelement <16 x i16> %hadd8, i16 %aAB, i32 9264 %haddA = insertelement <16 x i16> %hadd9, i16 %aCD, i32 10265 %haddB = insertelement <16 x i16> %haddA, i16 %aEF, i32 11266 %haddC = insertelement <16 x i16> %haddB, i16 %b89, i32 12267 %haddD = insertelement <16 x i16> %haddC, i16 %bAB, i32 13268 %haddE = insertelement <16 x i16> %haddD, i16 %bCD, i32 14269 %haddF = insertelement <16 x i16> %haddE, i16 %bEF, i32 15270 %result = shufflevector <16 x i16> %haddF, <16 x i16> %a, <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>271 ret <16 x i16> %result272}273 274define <16 x i16> @add_v16i16_0123u56789uBCDEF(<16 x i16> %a, <16 x i16> %b) {275; SSE2-LABEL: @add_v16i16_0123u56789uBCDEF(276; SSE2-NEXT: [[BE:%.*]] = extractelement <16 x i16> [[B:%.*]], i64 14277; SSE2-NEXT: [[BF:%.*]] = extractelement <16 x i16> [[B]], i64 15278; SSE2-NEXT: [[BEF:%.*]] = add i16 [[BE]], [[BF]]279; SSE2-NEXT: [[TMP3:%.*]] = shufflevector <16 x i16> [[B]], <16 x i16> [[B1:%.*]], <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 poison, i32 18, i32 20, i32 22, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>280; SSE2-NEXT: [[TMP7:%.*]] = shufflevector <16 x i16> [[B]], <16 x i16> [[B1]], <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 poison, i32 19, i32 21, i32 23, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>281; SSE2-NEXT: [[HADD8:%.*]] = add <16 x i16> [[TMP3]], [[TMP7]]282; SSE2-NEXT: [[TMP4:%.*]] = shufflevector <16 x i16> [[B]], <16 x i16> poison, <16 x i32> <i32 9, i32 10, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>283; SSE2-NEXT: [[TMP5:%.*]] = shufflevector <16 x i16> [[B]], <16 x i16> poison, <16 x i32> <i32 8, i32 11, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>284; SSE2-NEXT: [[TMP6:%.*]] = add <16 x i16> [[TMP4]], [[TMP5]]285; SSE2-NEXT: [[HADD92:%.*]] = shufflevector <16 x i16> [[HADD8]], <16 x i16> [[TMP6]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 5, i32 6, i32 7, i32 16, i32 17, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>286; SSE2-NEXT: [[HADDB:%.*]] = insertelement <16 x i16> [[HADD92]], i16 [[BEF]], i64 11287; SSE2-NEXT: [[TMP10:%.*]] = shufflevector <16 x i16> [[B1]], <16 x i16> poison, <16 x i32> <i32 8, i32 10, i32 12, i32 14, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>288; SSE2-NEXT: [[TMP8:%.*]] = shufflevector <16 x i16> [[B1]], <16 x i16> poison, <16 x i32> <i32 9, i32 11, i32 13, i32 15, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>289; SSE2-NEXT: [[TMP9:%.*]] = add <16 x i16> [[TMP10]], [[TMP8]]290; SSE2-NEXT: [[RESULT:%.*]] = shufflevector <16 x i16> [[HADDB]], <16 x i16> [[TMP9]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 5, i32 6, i32 7, i32 8, i32 9, i32 poison, i32 11, i32 16, i32 17, i32 18, i32 19>291; SSE2-NEXT: ret <16 x i16> [[RESULT]]292;293; SSE4-LABEL: @add_v16i16_0123u56789uBCDEF(294; SSE4-NEXT: [[TMP2:%.*]] = shufflevector <16 x i16> [[A:%.*]], <16 x i16> [[B:%.*]], <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 poison, i32 19, i32 21, i32 23, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>295; SSE4-NEXT: [[TMP4:%.*]] = shufflevector <16 x i16> [[TMP2]], <16 x i16> [[A]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 5, i32 6, i32 7, i32 25, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>296; SSE4-NEXT: [[TMP6:%.*]] = shufflevector <16 x i16> [[TMP4]], <16 x i16> [[A]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 5, i32 6, i32 7, i32 8, i32 27, i32 poison, i32 31, i32 poison, i32 poison, i32 poison, i32 poison>297; SSE4-NEXT: [[TMP7:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 poison, i32 18, i32 20, i32 22, i32 8, i32 10, i32 poison, i32 14, i32 24, i32 26, i32 28, i32 30>298; SSE4-NEXT: [[TMP8:%.*]] = shufflevector <16 x i16> [[TMP6]], <16 x i16> [[B]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 5, i32 6, i32 7, i32 8, i32 9, i32 poison, i32 11, i32 25, i32 27, i32 29, i32 31>299; SSE4-NEXT: [[TMP9:%.*]] = add <16 x i16> [[TMP7]], [[TMP8]]300; SSE4-NEXT: ret <16 x i16> [[TMP9]]301;302; AVX2-LABEL: @add_v16i16_0123u56789uBCDEF(303; AVX2-NEXT: [[TMP1:%.*]] = shufflevector <16 x i16> [[A:%.*]], <16 x i16> [[B:%.*]], <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 poison, i32 18, i32 20, i32 22, i32 9, i32 10, i32 poison, i32 14, i32 24, i32 26, i32 28, i32 30>304; AVX2-NEXT: [[TMP2:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 poison, i32 19, i32 21, i32 23, i32 8, i32 11, i32 poison, i32 15, i32 25, i32 27, i32 29, i32 31>305; AVX2-NEXT: [[RESULT:%.*]] = add <16 x i16> [[TMP1]], [[TMP2]]306; AVX2-NEXT: ret <16 x i16> [[RESULT]]307;308; AVX512-LABEL: @add_v16i16_0123u56789uBCDEF(309; AVX512-NEXT: [[TMP1:%.*]] = shufflevector <16 x i16> [[A:%.*]], <16 x i16> [[B:%.*]], <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 poison, i32 18, i32 20, i32 22, i32 8, i32 10, i32 poison, i32 14, i32 24, i32 26, i32 28, i32 30>310; AVX512-NEXT: [[TMP2:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 poison, i32 19, i32 21, i32 23, i32 9, i32 11, i32 poison, i32 15, i32 25, i32 27, i32 29, i32 31>311; AVX512-NEXT: [[RESULT:%.*]] = add <16 x i16> [[TMP1]], [[TMP2]]312; AVX512-NEXT: ret <16 x i16> [[RESULT]]313;314 %a0 = extractelement <16 x i16> %a, i32 0315 %a1 = extractelement <16 x i16> %a, i32 1316 %a2 = extractelement <16 x i16> %a, i32 2317 %a3 = extractelement <16 x i16> %a, i32 3318 %a4 = extractelement <16 x i16> %a, i32 4319 %a5 = extractelement <16 x i16> %a, i32 5320 %a6 = extractelement <16 x i16> %a, i32 6321 %a7 = extractelement <16 x i16> %a, i32 7322 %a8 = extractelement <16 x i16> %a, i32 8323 %a9 = extractelement <16 x i16> %a, i32 9324 %aA = extractelement <16 x i16> %a, i32 10325 %aB = extractelement <16 x i16> %a, i32 11326 %aC = extractelement <16 x i16> %a, i32 12327 %aD = extractelement <16 x i16> %a, i32 13328 %aE = extractelement <16 x i16> %a, i32 14329 %aF = extractelement <16 x i16> %a, i32 15330 %a01 = add i16 %a0, %a1331 %a23 = add i16 %a2, %a3332 %a45 = add i16 %a4, %a5333 %a67 = add i16 %a6, %a7334 %a89 = add i16 %a8, %a9335 %aAB = add i16 %aA, %aB336 %aCD = add i16 %aC, %aD337 %aEF = add i16 %aE, %aF338 %b0 = extractelement <16 x i16> %b, i32 0339 %b1 = extractelement <16 x i16> %b, i32 1340 %b2 = extractelement <16 x i16> %b, i32 2341 %b3 = extractelement <16 x i16> %b, i32 3342 %b4 = extractelement <16 x i16> %b, i32 4343 %b5 = extractelement <16 x i16> %b, i32 5344 %b6 = extractelement <16 x i16> %b, i32 6345 %b7 = extractelement <16 x i16> %b, i32 7346 %b8 = extractelement <16 x i16> %b, i32 8347 %b9 = extractelement <16 x i16> %b, i32 9348 %bA = extractelement <16 x i16> %b, i32 10349 %bB = extractelement <16 x i16> %b, i32 11350 %bC = extractelement <16 x i16> %b, i32 12351 %bD = extractelement <16 x i16> %b, i32 13352 %bE = extractelement <16 x i16> %b, i32 14353 %bF = extractelement <16 x i16> %b, i32 15354 %b01 = add i16 %b0, %b1355 %b23 = add i16 %b2, %b3356 %b45 = add i16 %b4, %b5357 %b67 = add i16 %b6, %b7358 %b89 = add i16 %b8, %b9359 %bAB = add i16 %bA, %bB360 %bCD = add i16 %bC, %bD361 %bEF = add i16 %bE, %bF362 %hadd0 = insertelement <16 x i16> poison, i16 %a01, i32 0363 %hadd1 = insertelement <16 x i16> %hadd0, i16 %a23, i32 1364 %hadd2 = insertelement <16 x i16> %hadd1, i16 %a45, i32 2365 %hadd3 = insertelement <16 x i16> %hadd2, i16 %a67, i32 3366 %hadd4 = insertelement <16 x i16> %hadd3, i16 %b01, i32 4367 %hadd5 = insertelement <16 x i16> %hadd4, i16 %b23, i32 5368 %hadd6 = insertelement <16 x i16> %hadd5, i16 %b45, i32 6369 %hadd7 = insertelement <16 x i16> %hadd6, i16 %b67, i32 7370 %hadd8 = insertelement <16 x i16> %hadd7, i16 %a89, i32 8371 %hadd9 = insertelement <16 x i16> %hadd8, i16 %aAB, i32 9372 %haddA = insertelement <16 x i16> %hadd9, i16 %aCD, i32 10373 %haddB = insertelement <16 x i16> %haddA, i16 %aEF, i32 11374 %haddC = insertelement <16 x i16> %haddB, i16 %b89, i32 12375 %haddD = insertelement <16 x i16> %haddC, i16 %bAB, i32 13376 %haddE = insertelement <16 x i16> %haddD, i16 %bCD, i32 14377 %haddF = insertelement <16 x i16> %haddE, i16 %bEF, i32 15378 %result = shufflevector <16 x i16> %haddF, <16 x i16> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 5, i32 6, i32 7, i32 8, i32 9, i32 poison, i32 11, i32 12, i32 13, i32 14, i32 15>379 ret <16 x i16> %result380}381 382define <16 x i16> @add_v16i16_FEuCBA98765432u0(<16 x i16> %a, <16 x i16> %b) {383; SSE2-LABEL: @add_v16i16_FEuCBA98765432u0(384; SSE2-NEXT: [[BC:%.*]] = extractelement <16 x i16> [[B:%.*]], i64 12385; SSE2-NEXT: [[BD:%.*]] = extractelement <16 x i16> [[B]], i64 13386; SSE2-NEXT: [[BE:%.*]] = extractelement <16 x i16> [[B]], i64 14387; SSE2-NEXT: [[BF:%.*]] = extractelement <16 x i16> [[B]], i64 15388; SSE2-NEXT: [[BCD:%.*]] = add i16 [[BC]], [[BD]]389; SSE2-NEXT: [[BEF:%.*]] = add i16 [[BE]], [[BF]]390; SSE2-NEXT: [[TMP1:%.*]] = shufflevector <16 x i16> [[A:%.*]], <16 x i16> [[B]], <16 x i32> <i32 0, i32 poison, i32 4, i32 6, i32 16, i32 18, i32 20, i32 22, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>391; SSE2-NEXT: [[TMP2:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <16 x i32> <i32 1, i32 poison, i32 5, i32 7, i32 17, i32 19, i32 21, i32 23, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>392; SSE2-NEXT: [[TMP3:%.*]] = shufflevector <16 x i16> [[TMP1]], <16 x i16> [[A]], <16 x i32> <i32 0, i32 poison, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 24, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>393; SSE2-NEXT: [[TMP7:%.*]] = shufflevector <16 x i16> [[TMP2]], <16 x i16> [[A]], <16 x i32> <i32 0, i32 poison, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 25, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>394; SSE2-NEXT: [[HADD8:%.*]] = add <16 x i16> [[TMP3]], [[TMP7]]395; SSE2-NEXT: [[TMP4:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <16 x i32> <i32 10, i32 12, i32 14, i32 24, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>396; SSE2-NEXT: [[TMP5:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <16 x i32> <i32 11, i32 13, i32 15, i32 25, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>397; SSE2-NEXT: [[TMP6:%.*]] = add <16 x i16> [[TMP4]], [[TMP5]]398; SSE2-NEXT: [[HADDC1:%.*]] = shufflevector <16 x i16> [[HADD8]], <16 x i16> [[TMP6]], <16 x i32> <i32 0, i32 poison, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison>399; SSE2-NEXT: [[HADDE:%.*]] = insertelement <16 x i16> [[HADDC1]], i16 [[BCD]], i64 14400; SSE2-NEXT: [[HADDF:%.*]] = insertelement <16 x i16> [[HADDE]], i16 [[BEF]], i64 15401; SSE2-NEXT: [[RESULT:%.*]] = shufflevector <16 x i16> [[HADDF]], <16 x i16> poison, <16 x i32> <i32 15, i32 14, i32 poison, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 poison, i32 0>402; SSE2-NEXT: ret <16 x i16> [[RESULT]]403;404; SSE4-LABEL: @add_v16i16_FEuCBA98765432u0(405; SSE4-NEXT: [[TMP2:%.*]] = shufflevector <16 x i16> [[A:%.*]], <16 x i16> [[B:%.*]], <16 x i32> <i32 1, i32 poison, i32 5, i32 7, i32 17, i32 19, i32 21, i32 23, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>406; SSE4-NEXT: [[TMP10:%.*]] = shufflevector <16 x i16> [[TMP2]], <16 x i16> [[A]], <16 x i32> <i32 0, i32 poison, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 25, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>407; SSE4-NEXT: [[TMP4:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <16 x i32> <i32 0, i32 poison, i32 4, i32 6, i32 16, i32 18, i32 20, i32 22, i32 8, i32 11, i32 12, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>408; SSE4-NEXT: [[TMP5:%.*]] = shufflevector <16 x i16> [[TMP10]], <16 x i16> [[A]], <16 x i32> <i32 0, i32 poison, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 26, i32 29, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>409; SSE4-NEXT: [[TMP6:%.*]] = add <16 x i16> [[TMP4]], [[TMP5]]410; SSE4-NEXT: [[TMP7:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <16 x i32> <i32 14, i32 24, i32 poison, i32 28, i32 30, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>411; SSE4-NEXT: [[TMP8:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <16 x i32> <i32 15, i32 25, i32 poison, i32 29, i32 31, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>412; SSE4-NEXT: [[TMP9:%.*]] = add <16 x i16> [[TMP7]], [[TMP8]]413; SSE4-NEXT: [[RESULT:%.*]] = shufflevector <16 x i16> [[TMP9]], <16 x i16> [[TMP6]], <16 x i32> <i32 4, i32 3, i32 poison, i32 1, i32 0, i32 26, i32 25, i32 24, i32 23, i32 22, i32 21, i32 20, i32 19, i32 18, i32 poison, i32 16>414; SSE4-NEXT: ret <16 x i16> [[RESULT]]415;416; AVX2-LABEL: @add_v16i16_FEuCBA98765432u0(417; AVX2-NEXT: [[TMP1:%.*]] = shufflevector <16 x i16> [[A:%.*]], <16 x i16> [[B:%.*]], <16 x i32> <i32 0, i32 poison, i32 4, i32 6, i32 16, i32 18, i32 20, i32 22, i32 9, i32 10, i32 12, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>418; AVX2-NEXT: [[TMP2:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <16 x i32> <i32 1, i32 poison, i32 5, i32 7, i32 17, i32 19, i32 21, i32 23, i32 8, i32 11, i32 13, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>419; AVX2-NEXT: [[HADDA:%.*]] = add <16 x i16> [[TMP1]], [[TMP2]]420; AVX2-NEXT: [[TMP3:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <16 x i32> <i32 14, i32 24, i32 poison, i32 28, i32 30, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>421; AVX2-NEXT: [[TMP4:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <16 x i32> <i32 15, i32 25, i32 poison, i32 29, i32 31, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>422; AVX2-NEXT: [[TMP5:%.*]] = add <16 x i16> [[TMP3]], [[TMP4]]423; AVX2-NEXT: [[RESULT:%.*]] = shufflevector <16 x i16> [[TMP5]], <16 x i16> [[HADDA]], <16 x i32> <i32 4, i32 3, i32 poison, i32 1, i32 0, i32 26, i32 25, i32 24, i32 23, i32 22, i32 21, i32 20, i32 19, i32 18, i32 poison, i32 16>424; AVX2-NEXT: ret <16 x i16> [[RESULT]]425;426; AVX512-LABEL: @add_v16i16_FEuCBA98765432u0(427; AVX512-NEXT: [[TMP1:%.*]] = shufflevector <16 x i16> [[A:%.*]], <16 x i16> [[B:%.*]], <16 x i32> <i32 0, i32 poison, i32 4, i32 6, i32 16, i32 18, i32 20, i32 22, i32 8, i32 11, i32 12, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>428; AVX512-NEXT: [[TMP2:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <16 x i32> <i32 1, i32 poison, i32 5, i32 7, i32 17, i32 19, i32 21, i32 23, i32 9, i32 10, i32 13, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>429; AVX512-NEXT: [[HADDA2:%.*]] = add <16 x i16> [[TMP1]], [[TMP2]]430; AVX512-NEXT: [[TMP3:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <16 x i32> <i32 14, i32 24, i32 poison, i32 28, i32 30, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>431; AVX512-NEXT: [[TMP4:%.*]] = shufflevector <16 x i16> [[A]], <16 x i16> [[B]], <16 x i32> <i32 15, i32 25, i32 poison, i32 29, i32 31, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>432; AVX512-NEXT: [[TMP5:%.*]] = add <16 x i16> [[TMP3]], [[TMP4]]433; AVX512-NEXT: [[RESULT:%.*]] = shufflevector <16 x i16> [[TMP5]], <16 x i16> [[HADDA2]], <16 x i32> <i32 4, i32 3, i32 poison, i32 1, i32 0, i32 26, i32 25, i32 24, i32 23, i32 22, i32 21, i32 20, i32 19, i32 18, i32 poison, i32 16>434; AVX512-NEXT: ret <16 x i16> [[RESULT]]435;436 %a0 = extractelement <16 x i16> %a, i32 0437 %a1 = extractelement <16 x i16> %a, i32 1438 %a2 = extractelement <16 x i16> %a, i32 2439 %a3 = extractelement <16 x i16> %a, i32 3440 %a4 = extractelement <16 x i16> %a, i32 4441 %a5 = extractelement <16 x i16> %a, i32 5442 %a6 = extractelement <16 x i16> %a, i32 6443 %a7 = extractelement <16 x i16> %a, i32 7444 %a8 = extractelement <16 x i16> %a, i32 8445 %a9 = extractelement <16 x i16> %a, i32 9446 %aA = extractelement <16 x i16> %a, i32 10447 %aB = extractelement <16 x i16> %a, i32 11448 %aC = extractelement <16 x i16> %a, i32 12449 %aD = extractelement <16 x i16> %a, i32 13450 %aE = extractelement <16 x i16> %a, i32 14451 %aF = extractelement <16 x i16> %a, i32 15452 %a01 = add i16 %a0, %a1453 %a23 = add i16 %a2, %a3454 %a45 = add i16 %a4, %a5455 %a67 = add i16 %a6, %a7456 %a89 = add i16 %a8, %a9457 %aAB = add i16 %aA, %aB458 %aCD = add i16 %aC, %aD459 %aEF = add i16 %aE, %aF460 %b0 = extractelement <16 x i16> %b, i32 0461 %b1 = extractelement <16 x i16> %b, i32 1462 %b2 = extractelement <16 x i16> %b, i32 2463 %b3 = extractelement <16 x i16> %b, i32 3464 %b4 = extractelement <16 x i16> %b, i32 4465 %b5 = extractelement <16 x i16> %b, i32 5466 %b6 = extractelement <16 x i16> %b, i32 6467 %b7 = extractelement <16 x i16> %b, i32 7468 %b8 = extractelement <16 x i16> %b, i32 8469 %b9 = extractelement <16 x i16> %b, i32 9470 %bA = extractelement <16 x i16> %b, i32 10471 %bB = extractelement <16 x i16> %b, i32 11472 %bC = extractelement <16 x i16> %b, i32 12473 %bD = extractelement <16 x i16> %b, i32 13474 %bE = extractelement <16 x i16> %b, i32 14475 %bF = extractelement <16 x i16> %b, i32 15476 %b01 = add i16 %b0, %b1477 %b23 = add i16 %b2, %b3478 %b45 = add i16 %b4, %b5479 %b67 = add i16 %b6, %b7480 %b89 = add i16 %b8, %b9481 %bAB = add i16 %bA, %bB482 %bCD = add i16 %bC, %bD483 %bEF = add i16 %bE, %bF484 %hadd0 = insertelement <16 x i16> poison, i16 %a01, i32 0485 %hadd1 = insertelement <16 x i16> %hadd0, i16 %a23, i32 1486 %hadd2 = insertelement <16 x i16> %hadd1, i16 %a45, i32 2487 %hadd3 = insertelement <16 x i16> %hadd2, i16 %a67, i32 3488 %hadd4 = insertelement <16 x i16> %hadd3, i16 %b01, i32 4489 %hadd5 = insertelement <16 x i16> %hadd4, i16 %b23, i32 5490 %hadd6 = insertelement <16 x i16> %hadd5, i16 %b45, i32 6491 %hadd7 = insertelement <16 x i16> %hadd6, i16 %b67, i32 7492 %hadd8 = insertelement <16 x i16> %hadd7, i16 %a89, i32 8493 %hadd9 = insertelement <16 x i16> %hadd8, i16 %aAB, i32 9494 %haddA = insertelement <16 x i16> %hadd9, i16 %aCD, i32 10495 %haddB = insertelement <16 x i16> %haddA, i16 %aEF, i32 11496 %haddC = insertelement <16 x i16> %haddB, i16 %b89, i32 12497 %haddD = insertelement <16 x i16> %haddC, i16 %bAB, i32 13498 %haddE = insertelement <16 x i16> %haddD, i16 %bCD, i32 14499 %haddF = insertelement <16 x i16> %haddE, i16 %bEF, i32 15500 %result = shufflevector <16 x i16> %haddF, <16 x i16> %a, <16 x i32> <i32 15, i32 14, i32 poison, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 poison, i32 0>501 ret <16 x i16> %result502}503 504;505; v4i32506;507 508define <4 x i32> @add_v4i32_0123(<4 x i32> %a, <4 x i32> %b) {509; CHECK-LABEL: @add_v4i32_0123(510; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 4, i32 6>511; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 1, i32 3, i32 5, i32 7>512; CHECK-NEXT: [[TMP3:%.*]] = add <4 x i32> [[TMP1]], [[TMP2]]513; CHECK-NEXT: ret <4 x i32> [[TMP3]]514;515 %a0 = extractelement <4 x i32> %a, i32 0516 %a1 = extractelement <4 x i32> %a, i32 1517 %a2 = extractelement <4 x i32> %a, i32 2518 %a3 = extractelement <4 x i32> %a, i32 3519 %a01 = add i32 %a0, %a1520 %a23 = add i32 %a2, %a3521 %b0 = extractelement <4 x i32> %b, i32 0522 %b1 = extractelement <4 x i32> %b, i32 1523 %b2 = extractelement <4 x i32> %b, i32 2524 %b3 = extractelement <4 x i32> %b, i32 3525 %b01 = add i32 %b0, %b1526 %b23 = add i32 %b2, %b3527 %hadd0 = insertelement <4 x i32> poison, i32 %a01, i32 0528 %hadd1 = insertelement <4 x i32> %hadd0, i32 %a23, i32 1529 %hadd2 = insertelement <4 x i32> %hadd1, i32 %b01, i32 2530 %hadd3 = insertelement <4 x i32> %hadd2, i32 %b23, i32 3531 %result = shufflevector <4 x i32> %hadd3, <4 x i32> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 3>532 ret <4 x i32> %result533}534 535define <4 x i32> @add_v4i32_u123(<4 x i32> %a, <4 x i32> %b) {536; CHECK-LABEL: @add_v4i32_u123(537; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 poison, i32 2, i32 5, i32 6>538; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 poison, i32 3, i32 4, i32 7>539; CHECK-NEXT: [[TMP4:%.*]] = add <4 x i32> [[TMP2]], [[TMP3]]540; CHECK-NEXT: ret <4 x i32> [[TMP4]]541;542 %a0 = extractelement <4 x i32> %a, i32 0543 %a1 = extractelement <4 x i32> %a, i32 1544 %a2 = extractelement <4 x i32> %a, i32 2545 %a3 = extractelement <4 x i32> %a, i32 3546 %a01 = add i32 %a0, %a1547 %a23 = add i32 %a2, %a3548 %b0 = extractelement <4 x i32> %b, i32 0549 %b1 = extractelement <4 x i32> %b, i32 1550 %b2 = extractelement <4 x i32> %b, i32 2551 %b3 = extractelement <4 x i32> %b, i32 3552 %b01 = add i32 %b0, %b1553 %b23 = add i32 %b2, %b3554 %hadd0 = insertelement <4 x i32> poison, i32 %a01, i32 0555 %hadd1 = insertelement <4 x i32> %hadd0, i32 %a23, i32 1556 %hadd2 = insertelement <4 x i32> %hadd1, i32 %b01, i32 2557 %hadd3 = insertelement <4 x i32> %hadd2, i32 %b23, i32 3558 %result = shufflevector <4 x i32> %hadd3, <4 x i32> %a, <4 x i32> <i32 poison, i32 1, i32 2, i32 3>559 ret <4 x i32> %result560}561 562define <4 x i32> @add_v4i32_0u23(<4 x i32> %a, <4 x i32> %b) {563; CHECK-LABEL: @add_v4i32_0u23(564; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 poison, i32 5, i32 6>565; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 1, i32 poison, i32 4, i32 7>566; CHECK-NEXT: [[TMP4:%.*]] = add <4 x i32> [[TMP2]], [[TMP3]]567; CHECK-NEXT: ret <4 x i32> [[TMP4]]568;569 %a0 = extractelement <4 x i32> %a, i32 0570 %a1 = extractelement <4 x i32> %a, i32 1571 %a2 = extractelement <4 x i32> %a, i32 2572 %a3 = extractelement <4 x i32> %a, i32 3573 %a01 = add i32 %a0, %a1574 %a23 = add i32 %a2, %a3575 %b0 = extractelement <4 x i32> %b, i32 0576 %b1 = extractelement <4 x i32> %b, i32 1577 %b2 = extractelement <4 x i32> %b, i32 2578 %b3 = extractelement <4 x i32> %b, i32 3579 %b01 = add i32 %b0, %b1580 %b23 = add i32 %b2, %b3581 %hadd0 = insertelement <4 x i32> poison, i32 %a01, i32 0582 %hadd1 = insertelement <4 x i32> %hadd0, i32 %a23, i32 1583 %hadd2 = insertelement <4 x i32> %hadd1, i32 %b01, i32 2584 %hadd3 = insertelement <4 x i32> %hadd2, i32 %b23, i32 3585 %result = shufflevector <4 x i32> %hadd3, <4 x i32> %a, <4 x i32> <i32 0, i32 poison, i32 2, i32 3>586 ret <4 x i32> %result587}588 589define <4 x i32> @add_v4i32_01u3(<4 x i32> %a, <4 x i32> %b) {590; SSE2-LABEL: @add_v4i32_01u3(591; SSE2-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 poison, i32 6>592; SSE2-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 1, i32 3, i32 poison, i32 7>593; SSE2-NEXT: [[TMP4:%.*]] = add <4 x i32> [[TMP2]], [[TMP3]]594; SSE2-NEXT: ret <4 x i32> [[TMP4]]595;596; SSE4-LABEL: @add_v4i32_01u3(597; SSE4-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 1, i32 2, i32 poison, i32 6>598; SSE4-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 0, i32 3, i32 poison, i32 7>599; SSE4-NEXT: [[TMP4:%.*]] = add <4 x i32> [[TMP2]], [[TMP3]]600; SSE4-NEXT: ret <4 x i32> [[TMP4]]601;602; AVX2-LABEL: @add_v4i32_01u3(603; AVX2-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 1, i32 2, i32 poison, i32 6>604; AVX2-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 0, i32 3, i32 poison, i32 7>605; AVX2-NEXT: [[TMP4:%.*]] = add <4 x i32> [[TMP2]], [[TMP3]]606; AVX2-NEXT: ret <4 x i32> [[TMP4]]607;608; AVX512-LABEL: @add_v4i32_01u3(609; AVX512-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 poison, i32 6>610; AVX512-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 1, i32 3, i32 poison, i32 7>611; AVX512-NEXT: [[TMP4:%.*]] = add <4 x i32> [[TMP2]], [[TMP3]]612; AVX512-NEXT: ret <4 x i32> [[TMP4]]613;614 %a0 = extractelement <4 x i32> %a, i32 0615 %a1 = extractelement <4 x i32> %a, i32 1616 %a2 = extractelement <4 x i32> %a, i32 2617 %a3 = extractelement <4 x i32> %a, i32 3618 %a01 = add i32 %a0, %a1619 %a23 = add i32 %a2, %a3620 %b0 = extractelement <4 x i32> %b, i32 0621 %b1 = extractelement <4 x i32> %b, i32 1622 %b2 = extractelement <4 x i32> %b, i32 2623 %b3 = extractelement <4 x i32> %b, i32 3624 %b01 = add i32 %b0, %b1625 %b23 = add i32 %b2, %b3626 %hadd0 = insertelement <4 x i32> poison, i32 %a01, i32 0627 %hadd1 = insertelement <4 x i32> %hadd0, i32 %a23, i32 1628 %hadd2 = insertelement <4 x i32> %hadd1, i32 %b01, i32 2629 %hadd3 = insertelement <4 x i32> %hadd2, i32 %b23, i32 3630 %result = shufflevector <4 x i32> %hadd3, <4 x i32> %a, <4 x i32> <i32 0, i32 1, i32 poison, i32 3>631 ret <4 x i32> %result632}633 634define <4 x i32> @add_v4i32_012u(<4 x i32> %a, <4 x i32> %b) {635; CHECK-LABEL: @add_v4i32_012u(636; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 4, i32 poison>637; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 1, i32 3, i32 5, i32 poison>638; CHECK-NEXT: [[TMP4:%.*]] = add <4 x i32> [[TMP2]], [[TMP3]]639; CHECK-NEXT: ret <4 x i32> [[TMP4]]640;641 %a0 = extractelement <4 x i32> %a, i32 0642 %a1 = extractelement <4 x i32> %a, i32 1643 %a2 = extractelement <4 x i32> %a, i32 2644 %a3 = extractelement <4 x i32> %a, i32 3645 %a01 = add i32 %a0, %a1646 %a23 = add i32 %a2, %a3647 %b0 = extractelement <4 x i32> %b, i32 0648 %b1 = extractelement <4 x i32> %b, i32 1649 %b2 = extractelement <4 x i32> %b, i32 2650 %b3 = extractelement <4 x i32> %b, i32 3651 %b01 = add i32 %b0, %b1652 %b23 = add i32 %b2, %b3653 %hadd0 = insertelement <4 x i32> poison, i32 %a01, i32 0654 %hadd1 = insertelement <4 x i32> %hadd0, i32 %a23, i32 1655 %hadd2 = insertelement <4 x i32> %hadd1, i32 %b01, i32 2656 %hadd3 = insertelement <4 x i32> %hadd2, i32 %b23, i32 3657 %result = shufflevector <4 x i32> %hadd3, <4 x i32> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>658 ret <4 x i32> %result659}660 661define <4 x i32> @add_v4i32_uu23(<4 x i32> %a, <4 x i32> %b) {662; CHECK-LABEL: @add_v4i32_uu23(663; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[B:%.*]], <4 x i32> poison, <4 x i32> <i32 poison, i32 poison, i32 1, i32 2>664; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> poison, <4 x i32> <i32 poison, i32 poison, i32 0, i32 3>665; CHECK-NEXT: [[RESULT1:%.*]] = add <4 x i32> [[TMP1]], [[TMP2]]666; CHECK-NEXT: ret <4 x i32> [[RESULT1]]667;668 %a0 = extractelement <4 x i32> %a, i32 0669 %a1 = extractelement <4 x i32> %a, i32 1670 %a2 = extractelement <4 x i32> %a, i32 2671 %a3 = extractelement <4 x i32> %a, i32 3672 %a01 = add i32 %a0, %a1673 %a23 = add i32 %a2, %a3674 %b0 = extractelement <4 x i32> %b, i32 0675 %b1 = extractelement <4 x i32> %b, i32 1676 %b2 = extractelement <4 x i32> %b, i32 2677 %b3 = extractelement <4 x i32> %b, i32 3678 %b01 = add i32 %b0, %b1679 %b23 = add i32 %b2, %b3680 %hadd0 = insertelement <4 x i32> poison, i32 %a01, i32 0681 %hadd1 = insertelement <4 x i32> %hadd0, i32 %a23, i32 1682 %hadd2 = insertelement <4 x i32> %hadd1, i32 %b01, i32 2683 %hadd3 = insertelement <4 x i32> %hadd2, i32 %b23, i32 3684 %result = shufflevector <4 x i32> %hadd3, <4 x i32> %a, <4 x i32> <i32 poison, i32 poison, i32 2, i32 3>685 ret <4 x i32> %result686}687 688define <4 x i32> @add_v4i32_01uu(<4 x i32> %a, <4 x i32> %b) {689; CHECK-LABEL: @add_v4i32_01uu(690; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> poison, <4 x i32> <i32 1, i32 2, i32 poison, i32 poison>691; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> poison, <4 x i32> <i32 0, i32 3, i32 poison, i32 poison>692; CHECK-NEXT: [[TMP3:%.*]] = add <4 x i32> [[TMP1]], [[TMP2]]693; CHECK-NEXT: ret <4 x i32> [[TMP3]]694;695 %a0 = extractelement <4 x i32> %a, i32 0696 %a1 = extractelement <4 x i32> %a, i32 1697 %a2 = extractelement <4 x i32> %a, i32 2698 %a3 = extractelement <4 x i32> %a, i32 3699 %a01 = add i32 %a0, %a1700 %a23 = add i32 %a2, %a3701 %b0 = extractelement <4 x i32> %b, i32 0702 %b1 = extractelement <4 x i32> %b, i32 1703 %b2 = extractelement <4 x i32> %b, i32 2704 %b3 = extractelement <4 x i32> %b, i32 3705 %b01 = add i32 %b0, %b1706 %b23 = add i32 %b2, %b3707 %hadd0 = insertelement <4 x i32> poison, i32 %a01, i32 0708 %hadd1 = insertelement <4 x i32> %hadd0, i32 %a23, i32 1709 %hadd2 = insertelement <4 x i32> %hadd1, i32 %b01, i32 2710 %hadd3 = insertelement <4 x i32> %hadd2, i32 %b23, i32 3711 %result = shufflevector <4 x i32> %hadd3, <4 x i32> %a, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>712 ret <4 x i32> %result713}714 715define <4 x i32> @add_v4i32_32u0(<4 x i32> %a, <4 x i32> %b) {716; SSE2-LABEL: @add_v4i32_32u0(717; SSE2-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[B:%.*]], <4 x i32> [[A:%.*]], <4 x i32> <i32 2, i32 0, i32 poison, i32 4>718; SSE2-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> [[A]], <4 x i32> <i32 3, i32 1, i32 poison, i32 5>719; SSE2-NEXT: [[RESULT1:%.*]] = add <4 x i32> [[TMP1]], [[TMP2]]720; SSE2-NEXT: ret <4 x i32> [[RESULT1]]721;722; SSE4-LABEL: @add_v4i32_32u0(723; SSE4-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[B:%.*]], <4 x i32> [[A:%.*]], <4 x i32> <i32 2, i32 0, i32 poison, i32 4>724; SSE4-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> [[A]], <4 x i32> <i32 3, i32 1, i32 poison, i32 5>725; SSE4-NEXT: [[RESULT:%.*]] = add <4 x i32> [[TMP1]], [[TMP2]]726; SSE4-NEXT: ret <4 x i32> [[RESULT]]727;728; AVX2-LABEL: @add_v4i32_32u0(729; AVX2-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[B:%.*]], <4 x i32> [[A:%.*]], <4 x i32> <i32 2, i32 0, i32 poison, i32 4>730; AVX2-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> [[A]], <4 x i32> <i32 3, i32 1, i32 poison, i32 5>731; AVX2-NEXT: [[RESULT:%.*]] = add <4 x i32> [[TMP1]], [[TMP2]]732; AVX2-NEXT: ret <4 x i32> [[RESULT]]733;734; AVX512-LABEL: @add_v4i32_32u0(735; AVX512-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[B:%.*]], <4 x i32> [[A:%.*]], <4 x i32> <i32 2, i32 0, i32 poison, i32 4>736; AVX512-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> [[A]], <4 x i32> <i32 3, i32 1, i32 poison, i32 5>737; AVX512-NEXT: [[RESULT1:%.*]] = add <4 x i32> [[TMP1]], [[TMP2]]738; AVX512-NEXT: ret <4 x i32> [[RESULT1]]739;740 %a0 = extractelement <4 x i32> %a, i32 0741 %a1 = extractelement <4 x i32> %a, i32 1742 %a2 = extractelement <4 x i32> %a, i32 2743 %a3 = extractelement <4 x i32> %a, i32 3744 %a01 = add i32 %a0, %a1745 %a23 = add i32 %a2, %a3746 %b0 = extractelement <4 x i32> %b, i32 0747 %b1 = extractelement <4 x i32> %b, i32 1748 %b2 = extractelement <4 x i32> %b, i32 2749 %b3 = extractelement <4 x i32> %b, i32 3750 %b01 = add i32 %b0, %b1751 %b23 = add i32 %b2, %b3752 %hadd0 = insertelement <4 x i32> poison, i32 %a01, i32 0753 %hadd1 = insertelement <4 x i32> %hadd0, i32 %a23, i32 1754 %hadd2 = insertelement <4 x i32> %hadd1, i32 %b01, i32 2755 %hadd3 = insertelement <4 x i32> %hadd2, i32 %b23, i32 3756 %result = shufflevector <4 x i32> %hadd3, <4 x i32> %a, <4 x i32> <i32 3, i32 2, i32 poison, i32 0>757 ret <4 x i32> %result758}759 760;761; v8i32762;763 764define <8 x i32> @add_v8i32_01234567(<8 x i32> %a, <8 x i32> %b) {765; CHECK-LABEL: @add_v8i32_01234567(766; CHECK-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>767; CHECK-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>768; CHECK-NEXT: [[TMP3:%.*]] = add <8 x i32> [[TMP1]], [[TMP2]]769; CHECK-NEXT: ret <8 x i32> [[TMP3]]770;771 %a0 = extractelement <8 x i32> %a, i32 0772 %a1 = extractelement <8 x i32> %a, i32 1773 %a2 = extractelement <8 x i32> %a, i32 2774 %a3 = extractelement <8 x i32> %a, i32 3775 %a4 = extractelement <8 x i32> %a, i32 4776 %a5 = extractelement <8 x i32> %a, i32 5777 %a6 = extractelement <8 x i32> %a, i32 6778 %a7 = extractelement <8 x i32> %a, i32 7779 %a01 = add i32 %a0, %a1780 %a23 = add i32 %a2, %a3781 %a45 = add i32 %a4, %a5782 %a67 = add i32 %a6, %a7783 %b0 = extractelement <8 x i32> %b, i32 0784 %b1 = extractelement <8 x i32> %b, i32 1785 %b2 = extractelement <8 x i32> %b, i32 2786 %b3 = extractelement <8 x i32> %b, i32 3787 %b4 = extractelement <8 x i32> %b, i32 4788 %b5 = extractelement <8 x i32> %b, i32 5789 %b6 = extractelement <8 x i32> %b, i32 6790 %b7 = extractelement <8 x i32> %b, i32 7791 %b01 = add i32 %b0, %b1792 %b23 = add i32 %b2, %b3793 %b45 = add i32 %b4, %b5794 %b67 = add i32 %b6, %b7795 %hadd0 = insertelement <8 x i32> poison, i32 %a01, i32 0796 %hadd1 = insertelement <8 x i32> %hadd0, i32 %a23, i32 1797 %hadd2 = insertelement <8 x i32> %hadd1, i32 %b01, i32 2798 %hadd3 = insertelement <8 x i32> %hadd2, i32 %b23, i32 3799 %hadd4 = insertelement <8 x i32> %hadd3, i32 %a45, i32 4800 %hadd5 = insertelement <8 x i32> %hadd4, i32 %a67, i32 5801 %hadd6 = insertelement <8 x i32> %hadd5, i32 %b45, i32 6802 %hadd7 = insertelement <8 x i32> %hadd6, i32 %b67, i32 7803 %result = shufflevector <8 x i32> %hadd7, <8 x i32> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>804 ret <8 x i32> %result805}806 807define <8 x i32> @add_v8i32_01234u67(<8 x i32> %a, <8 x i32> %b) {808; CHECK-LABEL: @add_v8i32_01234u67(809; CHECK-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 poison, i32 13, i32 14>810; CHECK-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 poison, i32 12, i32 15>811; CHECK-NEXT: [[RESULT:%.*]] = add <8 x i32> [[TMP1]], [[TMP2]]812; CHECK-NEXT: ret <8 x i32> [[RESULT]]813;814 %a0 = extractelement <8 x i32> %a, i32 0815 %a1 = extractelement <8 x i32> %a, i32 1816 %a2 = extractelement <8 x i32> %a, i32 2817 %a3 = extractelement <8 x i32> %a, i32 3818 %a4 = extractelement <8 x i32> %a, i32 4819 %a5 = extractelement <8 x i32> %a, i32 5820 %a6 = extractelement <8 x i32> %a, i32 6821 %a7 = extractelement <8 x i32> %a, i32 7822 %a01 = add i32 %a0, %a1823 %a23 = add i32 %a2, %a3824 %a45 = add i32 %a4, %a5825 %a67 = add i32 %a6, %a7826 %b0 = extractelement <8 x i32> %b, i32 0827 %b1 = extractelement <8 x i32> %b, i32 1828 %b2 = extractelement <8 x i32> %b, i32 2829 %b3 = extractelement <8 x i32> %b, i32 3830 %b4 = extractelement <8 x i32> %b, i32 4831 %b5 = extractelement <8 x i32> %b, i32 5832 %b6 = extractelement <8 x i32> %b, i32 6833 %b7 = extractelement <8 x i32> %b, i32 7834 %b01 = add i32 %b0, %b1835 %b23 = add i32 %b2, %b3836 %b45 = add i32 %b4, %b5837 %b67 = add i32 %b6, %b7838 %hadd0 = insertelement <8 x i32> poison, i32 %a01, i32 0839 %hadd1 = insertelement <8 x i32> %hadd0, i32 %a23, i32 1840 %hadd2 = insertelement <8 x i32> %hadd1, i32 %b01, i32 2841 %hadd3 = insertelement <8 x i32> %hadd2, i32 %b23, i32 3842 %hadd4 = insertelement <8 x i32> %hadd3, i32 %a45, i32 4843 %hadd5 = insertelement <8 x i32> %hadd4, i32 %a67, i32 5844 %hadd6 = insertelement <8 x i32> %hadd5, i32 %b45, i32 6845 %hadd7 = insertelement <8 x i32> %hadd6, i32 %b67, i32 7846 %result = shufflevector <8 x i32> %hadd7, <8 x i32> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 poison, i32 6, i32 7>847 ret <8 x i32> %result848}849 850;851; v4f32852;853 854define <4 x float> @add_v4f32_0123(<4 x float> %a, <4 x float> %b) {855; CHECK-LABEL: @add_v4f32_0123(856; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 4, i32 6>857; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[B]], <4 x i32> <i32 1, i32 3, i32 5, i32 7>858; CHECK-NEXT: [[TMP3:%.*]] = fadd <4 x float> [[TMP1]], [[TMP2]]859; CHECK-NEXT: ret <4 x float> [[TMP3]]860;861 %a0 = extractelement <4 x float> %a, i32 0862 %a1 = extractelement <4 x float> %a, i32 1863 %a2 = extractelement <4 x float> %a, i32 2864 %a3 = extractelement <4 x float> %a, i32 3865 %a01 = fadd float %a0, %a1866 %a23 = fadd float %a2, %a3867 %b0 = extractelement <4 x float> %b, i32 0868 %b1 = extractelement <4 x float> %b, i32 1869 %b2 = extractelement <4 x float> %b, i32 2870 %b3 = extractelement <4 x float> %b, i32 3871 %b01 = fadd float %b0, %b1872 %b23 = fadd float %b2, %b3873 %hadd0 = insertelement <4 x float> poison, float %a01, i32 0874 %hadd1 = insertelement <4 x float> %hadd0, float %a23, i32 1875 %hadd2 = insertelement <4 x float> %hadd1, float %b01, i32 2876 %hadd3 = insertelement <4 x float> %hadd2, float %b23, i32 3877 %result = shufflevector <4 x float> %hadd3, <4 x float> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 3>878 ret <4 x float> %result879}880 881define <4 x float> @add_v4f32_u123(<4 x float> %a, <4 x float> %b) {882; CHECK-LABEL: @add_v4f32_u123(883; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x i32> <i32 poison, i32 2, i32 5, i32 6>884; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[B]], <4 x i32> <i32 poison, i32 3, i32 4, i32 7>885; CHECK-NEXT: [[TMP4:%.*]] = fadd <4 x float> [[TMP2]], [[TMP3]]886; CHECK-NEXT: ret <4 x float> [[TMP4]]887;888 %a0 = extractelement <4 x float> %a, i32 0889 %a1 = extractelement <4 x float> %a, i32 1890 %a2 = extractelement <4 x float> %a, i32 2891 %a3 = extractelement <4 x float> %a, i32 3892 %a01 = fadd float %a0, %a1893 %a23 = fadd float %a2, %a3894 %b0 = extractelement <4 x float> %b, i32 0895 %b1 = extractelement <4 x float> %b, i32 1896 %b2 = extractelement <4 x float> %b, i32 2897 %b3 = extractelement <4 x float> %b, i32 3898 %b01 = fadd float %b0, %b1899 %b23 = fadd float %b2, %b3900 %hadd0 = insertelement <4 x float> poison, float %a01, i32 0901 %hadd1 = insertelement <4 x float> %hadd0, float %a23, i32 1902 %hadd2 = insertelement <4 x float> %hadd1, float %b01, i32 2903 %hadd3 = insertelement <4 x float> %hadd2, float %b23, i32 3904 %result = shufflevector <4 x float> %hadd3, <4 x float> %a, <4 x i32> <i32 poison, i32 1, i32 2, i32 3>905 ret <4 x float> %result906}907 908define <4 x float> @add_v4f32_0u23(<4 x float> %a, <4 x float> %b) {909; CHECK-LABEL: @add_v4f32_0u23(910; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x i32> <i32 0, i32 poison, i32 5, i32 6>911; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[B]], <4 x i32> <i32 1, i32 poison, i32 4, i32 7>912; CHECK-NEXT: [[TMP4:%.*]] = fadd <4 x float> [[TMP2]], [[TMP3]]913; CHECK-NEXT: ret <4 x float> [[TMP4]]914;915 %a0 = extractelement <4 x float> %a, i32 0916 %a1 = extractelement <4 x float> %a, i32 1917 %a2 = extractelement <4 x float> %a, i32 2918 %a3 = extractelement <4 x float> %a, i32 3919 %a01 = fadd float %a0, %a1920 %a23 = fadd float %a2, %a3921 %b0 = extractelement <4 x float> %b, i32 0922 %b1 = extractelement <4 x float> %b, i32 1923 %b2 = extractelement <4 x float> %b, i32 2924 %b3 = extractelement <4 x float> %b, i32 3925 %b01 = fadd float %b0, %b1926 %b23 = fadd float %b2, %b3927 %hadd0 = insertelement <4 x float> poison, float %a01, i32 0928 %hadd1 = insertelement <4 x float> %hadd0, float %a23, i32 1929 %hadd2 = insertelement <4 x float> %hadd1, float %b01, i32 2930 %hadd3 = insertelement <4 x float> %hadd2, float %b23, i32 3931 %result = shufflevector <4 x float> %hadd3, <4 x float> %a, <4 x i32> <i32 0, i32 poison, i32 2, i32 3>932 ret <4 x float> %result933}934 935define <4 x float> @add_v4f32_01u3(<4 x float> %a, <4 x float> %b) {936; CHECK-LABEL: @add_v4f32_01u3(937; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 poison, i32 6>938; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[B]], <4 x i32> <i32 1, i32 3, i32 poison, i32 7>939; CHECK-NEXT: [[RESULT1:%.*]] = fadd <4 x float> [[TMP1]], [[TMP2]]940; CHECK-NEXT: ret <4 x float> [[RESULT1]]941;942 %a0 = extractelement <4 x float> %a, i32 0943 %a1 = extractelement <4 x float> %a, i32 1944 %a2 = extractelement <4 x float> %a, i32 2945 %a3 = extractelement <4 x float> %a, i32 3946 %a01 = fadd float %a0, %a1947 %a23 = fadd float %a2, %a3948 %b0 = extractelement <4 x float> %b, i32 0949 %b1 = extractelement <4 x float> %b, i32 1950 %b2 = extractelement <4 x float> %b, i32 2951 %b3 = extractelement <4 x float> %b, i32 3952 %b01 = fadd float %b0, %b1953 %b23 = fadd float %b2, %b3954 %hadd0 = insertelement <4 x float> poison, float %a01, i32 0955 %hadd1 = insertelement <4 x float> %hadd0, float %a23, i32 1956 %hadd2 = insertelement <4 x float> %hadd1, float %b01, i32 2957 %hadd3 = insertelement <4 x float> %hadd2, float %b23, i32 3958 %result = shufflevector <4 x float> %hadd3, <4 x float> %a, <4 x i32> <i32 0, i32 1, i32 poison, i32 3>959 ret <4 x float> %result960}961 962define <4 x float> @add_v4f32_012u(<4 x float> %a, <4 x float> %b) {963; SSE2-LABEL: @add_v4f32_012u(964; SSE2-NEXT: [[TMP1:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 4, i32 poison>965; SSE2-NEXT: [[TMP2:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[B]], <4 x i32> <i32 1, i32 3, i32 5, i32 poison>966; SSE2-NEXT: [[RESULT1:%.*]] = fadd <4 x float> [[TMP1]], [[TMP2]]967; SSE2-NEXT: ret <4 x float> [[RESULT1]]968;969; SSE4-LABEL: @add_v4f32_012u(970; SSE4-NEXT: [[TMP2:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x i32> <i32 1, i32 2, i32 4, i32 poison>971; SSE4-NEXT: [[TMP3:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[B]], <4 x i32> <i32 0, i32 3, i32 5, i32 poison>972; SSE4-NEXT: [[TMP4:%.*]] = fadd <4 x float> [[TMP2]], [[TMP3]]973; SSE4-NEXT: ret <4 x float> [[TMP4]]974;975; AVX2-LABEL: @add_v4f32_012u(976; AVX2-NEXT: [[TMP2:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x i32> <i32 1, i32 2, i32 4, i32 poison>977; AVX2-NEXT: [[TMP3:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[B]], <4 x i32> <i32 0, i32 3, i32 5, i32 poison>978; AVX2-NEXT: [[TMP4:%.*]] = fadd <4 x float> [[TMP2]], [[TMP3]]979; AVX2-NEXT: ret <4 x float> [[TMP4]]980;981; AVX512-LABEL: @add_v4f32_012u(982; AVX512-NEXT: [[TMP1:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 4, i32 poison>983; AVX512-NEXT: [[TMP2:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[B]], <4 x i32> <i32 1, i32 3, i32 5, i32 poison>984; AVX512-NEXT: [[RESULT1:%.*]] = fadd <4 x float> [[TMP1]], [[TMP2]]985; AVX512-NEXT: ret <4 x float> [[RESULT1]]986;987 %a0 = extractelement <4 x float> %a, i32 0988 %a1 = extractelement <4 x float> %a, i32 1989 %a2 = extractelement <4 x float> %a, i32 2990 %a3 = extractelement <4 x float> %a, i32 3991 %a01 = fadd float %a0, %a1992 %a23 = fadd float %a2, %a3993 %b0 = extractelement <4 x float> %b, i32 0994 %b1 = extractelement <4 x float> %b, i32 1995 %b2 = extractelement <4 x float> %b, i32 2996 %b3 = extractelement <4 x float> %b, i32 3997 %b01 = fadd float %b0, %b1998 %b23 = fadd float %b2, %b3999 %hadd0 = insertelement <4 x float> poison, float %a01, i32 01000 %hadd1 = insertelement <4 x float> %hadd0, float %a23, i32 11001 %hadd2 = insertelement <4 x float> %hadd1, float %b01, i32 21002 %hadd3 = insertelement <4 x float> %hadd2, float %b23, i32 31003 %result = shufflevector <4 x float> %hadd3, <4 x float> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>1004 ret <4 x float> %result1005}1006 1007define <4 x float> @add_v4f32_uu23(<4 x float> %a, <4 x float> %b) {1008; CHECK-LABEL: @add_v4f32_uu23(1009; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x float> [[B:%.*]], <4 x float> poison, <4 x i32> <i32 poison, i32 poison, i32 1, i32 2>1010; CHECK-NEXT: [[RESULT1:%.*]] = shufflevector <4 x float> [[B]], <4 x float> poison, <4 x i32> <i32 poison, i32 poison, i32 0, i32 3>1011; CHECK-NEXT: [[RESULT2:%.*]] = fadd <4 x float> [[TMP2]], [[RESULT1]]1012; CHECK-NEXT: ret <4 x float> [[RESULT2]]1013;1014 %a0 = extractelement <4 x float> %a, i32 01015 %a1 = extractelement <4 x float> %a, i32 11016 %a2 = extractelement <4 x float> %a, i32 21017 %a3 = extractelement <4 x float> %a, i32 31018 %a01 = fadd float %a0, %a11019 %a23 = fadd float %a2, %a31020 %b0 = extractelement <4 x float> %b, i32 01021 %b1 = extractelement <4 x float> %b, i32 11022 %b2 = extractelement <4 x float> %b, i32 21023 %b3 = extractelement <4 x float> %b, i32 31024 %b01 = fadd float %b0, %b11025 %b23 = fadd float %b2, %b31026 %hadd0 = insertelement <4 x float> poison, float %a01, i32 01027 %hadd1 = insertelement <4 x float> %hadd0, float %a23, i32 11028 %hadd2 = insertelement <4 x float> %hadd1, float %b01, i32 21029 %hadd3 = insertelement <4 x float> %hadd2, float %b23, i32 31030 %result = shufflevector <4 x float> %hadd3, <4 x float> %a, <4 x i32> <i32 poison, i32 poison, i32 2, i32 3>1031 ret <4 x float> %result1032}1033 1034define <4 x float> @add_v4f32_01uu(<4 x float> %a, <4 x float> %b) {1035; CHECK-LABEL: @add_v4f32_01uu(1036; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> poison, <4 x i32> <i32 1, i32 2, i32 poison, i32 poison>1037; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x float> [[A]], <4 x float> poison, <4 x i32> <i32 0, i32 3, i32 poison, i32 poison>1038; CHECK-NEXT: [[TMP4:%.*]] = fadd <4 x float> [[TMP2]], [[TMP3]]1039; CHECK-NEXT: ret <4 x float> [[TMP4]]1040;1041 %a0 = extractelement <4 x float> %a, i32 01042 %a1 = extractelement <4 x float> %a, i32 11043 %a2 = extractelement <4 x float> %a, i32 21044 %a3 = extractelement <4 x float> %a, i32 31045 %a01 = fadd float %a0, %a11046 %a23 = fadd float %a2, %a31047 %b0 = extractelement <4 x float> %b, i32 01048 %b1 = extractelement <4 x float> %b, i32 11049 %b2 = extractelement <4 x float> %b, i32 21050 %b3 = extractelement <4 x float> %b, i32 31051 %b01 = fadd float %b0, %b11052 %b23 = fadd float %b2, %b31053 %hadd0 = insertelement <4 x float> poison, float %a01, i32 01054 %hadd1 = insertelement <4 x float> %hadd0, float %a23, i32 11055 %hadd2 = insertelement <4 x float> %hadd1, float %b01, i32 21056 %hadd3 = insertelement <4 x float> %hadd2, float %b23, i32 31057 %result = shufflevector <4 x float> %hadd3, <4 x float> %a, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>1058 ret <4 x float> %result1059}1060 1061;1062; v8f321063;1064 1065define <8 x float> @add_v8f32_01234567(<8 x float> %a, <8 x float> %b) {1066; CHECK-LABEL: @add_v8f32_01234567(1067; CHECK-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>1068; CHECK-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>1069; CHECK-NEXT: [[TMP3:%.*]] = fadd <8 x float> [[TMP1]], [[TMP2]]1070; CHECK-NEXT: ret <8 x float> [[TMP3]]1071;1072 %a0 = extractelement <8 x float> %a, i32 01073 %a1 = extractelement <8 x float> %a, i32 11074 %a2 = extractelement <8 x float> %a, i32 21075 %a3 = extractelement <8 x float> %a, i32 31076 %a4 = extractelement <8 x float> %a, i32 41077 %a5 = extractelement <8 x float> %a, i32 51078 %a6 = extractelement <8 x float> %a, i32 61079 %a7 = extractelement <8 x float> %a, i32 71080 %a01 = fadd float %a0, %a11081 %a23 = fadd float %a2, %a31082 %a45 = fadd float %a4, %a51083 %a67 = fadd float %a6, %a71084 %b0 = extractelement <8 x float> %b, i32 01085 %b1 = extractelement <8 x float> %b, i32 11086 %b2 = extractelement <8 x float> %b, i32 21087 %b3 = extractelement <8 x float> %b, i32 31088 %b4 = extractelement <8 x float> %b, i32 41089 %b5 = extractelement <8 x float> %b, i32 51090 %b6 = extractelement <8 x float> %b, i32 61091 %b7 = extractelement <8 x float> %b, i32 71092 %b01 = fadd float %b0, %b11093 %b23 = fadd float %b2, %b31094 %b45 = fadd float %b4, %b51095 %b67 = fadd float %b6, %b71096 %hadd0 = insertelement <8 x float> poison, float %a01, i32 01097 %hadd1 = insertelement <8 x float> %hadd0, float %a23, i32 11098 %hadd2 = insertelement <8 x float> %hadd1, float %b01, i32 21099 %hadd3 = insertelement <8 x float> %hadd2, float %b23, i32 31100 %hadd4 = insertelement <8 x float> %hadd3, float %a45, i32 41101 %hadd5 = insertelement <8 x float> %hadd4, float %a67, i32 51102 %hadd6 = insertelement <8 x float> %hadd5, float %b45, i32 61103 %hadd7 = insertelement <8 x float> %hadd6, float %b67, i32 71104 %result = shufflevector <8 x float> %hadd7, <8 x float> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1105 ret <8 x float> %result1106}1107 1108define <8 x float> @add_v8f32_012u4567(<8 x float> %a, <8 x float> %b) {1109; SSE2-LABEL: @add_v8f32_012u4567(1110; SSE2-NEXT: [[TMP1:%.*]] = shufflevector <8 x float> [[B:%.*]], <8 x float> poison, <2 x i32> <i32 5, i32 6>1111; SSE2-NEXT: [[TMP2:%.*]] = shufflevector <8 x float> [[B]], <8 x float> poison, <2 x i32> <i32 4, i32 7>1112; SSE2-NEXT: [[TMP3:%.*]] = fadd <2 x float> [[TMP1]], [[TMP2]]1113; SSE2-NEXT: [[TMP5:%.*]] = shufflevector <8 x float> [[A:%.*]], <8 x float> [[B]], <8 x i32> <i32 0, i32 2, i32 8, i32 poison, i32 4, i32 6, i32 poison, i32 poison>1114; SSE2-NEXT: [[TMP8:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[B]], <8 x i32> <i32 1, i32 3, i32 9, i32 poison, i32 5, i32 7, i32 poison, i32 poison>1115; SSE2-NEXT: [[TMP6:%.*]] = fadd <8 x float> [[TMP5]], [[TMP8]]1116; SSE2-NEXT: [[TMP7:%.*]] = shufflevector <2 x float> [[TMP3]], <2 x float> poison, <8 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>1117; SSE2-NEXT: [[RESULT:%.*]] = shufflevector <8 x float> [[TMP6]], <8 x float> [[TMP7]], <8 x i32> <i32 0, i32 1, i32 2, i32 poison, i32 4, i32 5, i32 8, i32 9>1118; SSE2-NEXT: ret <8 x float> [[RESULT]]1119;1120; SSE4-LABEL: @add_v8f32_012u4567(1121; SSE4-NEXT: [[TMP8:%.*]] = shufflevector <8 x float> [[A:%.*]], <8 x float> [[B:%.*]], <8 x i32> <i32 0, i32 2, i32 8, i32 poison, i32 4, i32 6, i32 13, i32 14>1122; SSE4-NEXT: [[TMP5:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[B]], <8 x i32> <i32 1, i32 3, i32 9, i32 poison, i32 5, i32 7, i32 12, i32 15>1123; SSE4-NEXT: [[TMP9:%.*]] = fadd <8 x float> [[TMP8]], [[TMP5]]1124; SSE4-NEXT: ret <8 x float> [[TMP9]]1125;1126; AVX-LABEL: @add_v8f32_012u4567(1127; AVX-NEXT: [[TMP5:%.*]] = shufflevector <8 x float> [[A:%.*]], <8 x float> [[B:%.*]], <8 x i32> <i32 0, i32 2, i32 8, i32 poison, i32 4, i32 6, i32 13, i32 14>1128; AVX-NEXT: [[TMP6:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[B]], <8 x i32> <i32 1, i32 3, i32 9, i32 poison, i32 5, i32 7, i32 12, i32 15>1129; AVX-NEXT: [[TMP7:%.*]] = fadd <8 x float> [[TMP5]], [[TMP6]]1130; AVX-NEXT: ret <8 x float> [[TMP7]]1131;1132 %a0 = extractelement <8 x float> %a, i32 01133 %a1 = extractelement <8 x float> %a, i32 11134 %a2 = extractelement <8 x float> %a, i32 21135 %a3 = extractelement <8 x float> %a, i32 31136 %a4 = extractelement <8 x float> %a, i32 41137 %a5 = extractelement <8 x float> %a, i32 51138 %a6 = extractelement <8 x float> %a, i32 61139 %a7 = extractelement <8 x float> %a, i32 71140 %a01 = fadd float %a0, %a11141 %a23 = fadd float %a2, %a31142 %a45 = fadd float %a4, %a51143 %a67 = fadd float %a6, %a71144 %b0 = extractelement <8 x float> %b, i32 01145 %b1 = extractelement <8 x float> %b, i32 11146 %b2 = extractelement <8 x float> %b, i32 21147 %b3 = extractelement <8 x float> %b, i32 31148 %b4 = extractelement <8 x float> %b, i32 41149 %b5 = extractelement <8 x float> %b, i32 51150 %b6 = extractelement <8 x float> %b, i32 61151 %b7 = extractelement <8 x float> %b, i32 71152 %b01 = fadd float %b0, %b11153 %b23 = fadd float %b2, %b31154 %b45 = fadd float %b4, %b51155 %b67 = fadd float %b6, %b71156 %hadd0 = insertelement <8 x float> poison, float %a01, i32 01157 %hadd1 = insertelement <8 x float> %hadd0, float %a23, i32 11158 %hadd2 = insertelement <8 x float> %hadd1, float %b01, i32 21159 %hadd3 = insertelement <8 x float> %hadd2, float %b23, i32 31160 %hadd4 = insertelement <8 x float> %hadd3, float %a45, i32 41161 %hadd5 = insertelement <8 x float> %hadd4, float %a67, i32 51162 %hadd6 = insertelement <8 x float> %hadd5, float %b45, i32 61163 %hadd7 = insertelement <8 x float> %hadd6, float %b67, i32 71164 %result = shufflevector <8 x float> %hadd7, <8 x float> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 poison, i32 4, i32 5, i32 6, i32 7>1165 ret <8 x float> %result1166}1167 1168define <8 x float> @add_v8f32_76u43210(<8 x float> %a, <8 x float> %b) {1169; SSE2-LABEL: @add_v8f32_76u43210(1170; SSE2-NEXT: [[TMP1:%.*]] = shufflevector <8 x float> [[A:%.*]], <8 x float> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>1171; SSE2-NEXT: [[TMP2:%.*]] = shufflevector <8 x float> [[A]], <8 x float> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>1172; SSE2-NEXT: [[TMP3:%.*]] = fadd <4 x float> [[TMP1]], [[TMP2]]1173; SSE2-NEXT: [[B0:%.*]] = extractelement <8 x float> [[B:%.*]], i64 01174; SSE2-NEXT: [[B1:%.*]] = extractelement <8 x float> [[B]], i64 11175; SSE2-NEXT: [[B01:%.*]] = fadd float [[B0]], [[B1]]1176; SSE2-NEXT: [[TMP4:%.*]] = shufflevector <8 x float> [[B]], <8 x float> poison, <2 x i32> <i32 5, i32 6>1177; SSE2-NEXT: [[TMP5:%.*]] = shufflevector <8 x float> [[B]], <8 x float> poison, <2 x i32> <i32 4, i32 7>1178; SSE2-NEXT: [[TMP6:%.*]] = fadd <2 x float> [[TMP4]], [[TMP5]]1179; SSE2-NEXT: [[TMP7:%.*]] = shufflevector <4 x float> [[TMP3]], <4 x float> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>1180; SSE2-NEXT: [[HADD4:%.*]] = insertelement <8 x float> [[TMP7]], float [[B01]], i64 41181; SSE2-NEXT: [[TMP8:%.*]] = shufflevector <2 x float> [[TMP6]], <2 x float> poison, <8 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>1182; SSE2-NEXT: [[RESULT:%.*]] = shufflevector <8 x float> [[TMP8]], <8 x float> [[HADD4]], <8 x i32> <i32 1, i32 0, i32 poison, i32 12, i32 11, i32 10, i32 9, i32 8>1183; SSE2-NEXT: ret <8 x float> [[RESULT]]1184;1185; SSE4-LABEL: @add_v8f32_76u43210(1186; SSE4-NEXT: [[TMP4:%.*]] = shufflevector <8 x float> [[B:%.*]], <8 x float> [[A:%.*]], <8 x i32> <i32 6, i32 5, i32 poison, i32 0, i32 14, i32 12, i32 10, i32 8>1187; SSE4-NEXT: [[TMP5:%.*]] = shufflevector <8 x float> [[B]], <8 x float> [[A]], <8 x i32> <i32 7, i32 4, i32 poison, i32 1, i32 15, i32 13, i32 11, i32 9>1188; SSE4-NEXT: [[TMP6:%.*]] = fadd <8 x float> [[TMP4]], [[TMP5]]1189; SSE4-NEXT: ret <8 x float> [[TMP6]]1190;1191; AVX-LABEL: @add_v8f32_76u43210(1192; AVX-NEXT: [[TMP1:%.*]] = shufflevector <8 x float> [[B:%.*]], <8 x float> [[A:%.*]], <8 x i32> <i32 6, i32 5, i32 poison, i32 0, i32 14, i32 12, i32 10, i32 8>1193; AVX-NEXT: [[TMP2:%.*]] = shufflevector <8 x float> [[B]], <8 x float> [[A]], <8 x i32> <i32 7, i32 4, i32 poison, i32 1, i32 15, i32 13, i32 11, i32 9>1194; AVX-NEXT: [[RESULT:%.*]] = fadd <8 x float> [[TMP1]], [[TMP2]]1195; AVX-NEXT: ret <8 x float> [[RESULT]]1196;1197 %a0 = extractelement <8 x float> %a, i32 01198 %a1 = extractelement <8 x float> %a, i32 11199 %a2 = extractelement <8 x float> %a, i32 21200 %a3 = extractelement <8 x float> %a, i32 31201 %a4 = extractelement <8 x float> %a, i32 41202 %a5 = extractelement <8 x float> %a, i32 51203 %a6 = extractelement <8 x float> %a, i32 61204 %a7 = extractelement <8 x float> %a, i32 71205 %a01 = fadd float %a0, %a11206 %a23 = fadd float %a2, %a31207 %a45 = fadd float %a4, %a51208 %a67 = fadd float %a6, %a71209 %b0 = extractelement <8 x float> %b, i32 01210 %b1 = extractelement <8 x float> %b, i32 11211 %b2 = extractelement <8 x float> %b, i32 21212 %b3 = extractelement <8 x float> %b, i32 31213 %b4 = extractelement <8 x float> %b, i32 41214 %b5 = extractelement <8 x float> %b, i32 51215 %b6 = extractelement <8 x float> %b, i32 61216 %b7 = extractelement <8 x float> %b, i32 71217 %b01 = fadd float %b0, %b11218 %b23 = fadd float %b2, %b31219 %b45 = fadd float %b4, %b51220 %b67 = fadd float %b6, %b71221 %hadd0 = insertelement <8 x float> poison, float %a01, i32 01222 %hadd1 = insertelement <8 x float> %hadd0, float %a23, i32 11223 %hadd2 = insertelement <8 x float> %hadd1, float %a45, i32 21224 %hadd3 = insertelement <8 x float> %hadd2, float %a67, i32 31225 %hadd4 = insertelement <8 x float> %hadd3, float %b01, i32 41226 %hadd5 = insertelement <8 x float> %hadd4, float %b23, i32 51227 %hadd6 = insertelement <8 x float> %hadd5, float %b45, i32 61228 %hadd7 = insertelement <8 x float> %hadd6, float %b67, i32 71229 %result = shufflevector <8 x float> %hadd7, <8 x float> %a, <8 x i32> <i32 7, i32 6, i32 poison, i32 4, i32 3, i32 2, i32 1, i32 0>1230 ret <8 x float> %result1231}1232 1233;1234; v2f641235;1236 1237define <2 x double> @add_v2f64_01(<2 x double> %a, <2 x double> %b) {1238; CHECK-LABEL: @add_v2f64_01(1239; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <2 x double> [[A:%.*]], <2 x double> [[B:%.*]], <2 x i32> <i32 0, i32 2>1240; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <2 x double> [[A]], <2 x double> [[B]], <2 x i32> <i32 1, i32 3>1241; CHECK-NEXT: [[TMP3:%.*]] = fadd <2 x double> [[TMP1]], [[TMP2]]1242; CHECK-NEXT: ret <2 x double> [[TMP3]]1243;1244 %a0 = extractelement <2 x double> %a, i32 01245 %a1 = extractelement <2 x double> %a, i32 11246 %a01 = fadd double %a0, %a11247 %b0 = extractelement <2 x double> %b, i32 01248 %b1 = extractelement <2 x double> %b, i32 11249 %b01 = fadd double %b0, %b11250 %hadd0 = insertelement <2 x double> poison, double %a01, i32 01251 %hadd1 = insertelement <2 x double> %hadd0, double %b01, i32 11252 %result = shufflevector <2 x double> %hadd1, <2 x double> %a, <2 x i32> <i32 0, i32 1>1253 ret <2 x double> %result1254}1255 1256define <2 x double> @add_v2f64_u1(<2 x double> %a, <2 x double> %b) {1257; CHECK-LABEL: @add_v2f64_u1(1258; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <2 x double> [[B:%.*]], <2 x double> poison, <2 x i32> <i32 poison, i32 0>1259; CHECK-NEXT: [[RESULT1:%.*]] = fadd <2 x double> [[TMP1]], [[B]]1260; CHECK-NEXT: ret <2 x double> [[RESULT1]]1261;1262 %a0 = extractelement <2 x double> %a, i32 01263 %a1 = extractelement <2 x double> %a, i32 11264 %a01 = fadd double %a0, %a11265 %b0 = extractelement <2 x double> %b, i32 01266 %b1 = extractelement <2 x double> %b, i32 11267 %b01 = fadd double %b0, %b11268 %hadd0 = insertelement <2 x double> poison, double %a01, i32 01269 %hadd1 = insertelement <2 x double> %hadd0, double %b01, i32 11270 %result = shufflevector <2 x double> %hadd1, <2 x double> %a, <2 x i32> <i32 poison, i32 1>1271 ret <2 x double> %result1272}1273 1274define <2 x double> @add_v2f64_0u(<2 x double> %a, <2 x double> %b) {1275; CHECK-LABEL: @add_v2f64_0u(1276; CHECK-NEXT: [[RESULT:%.*]] = shufflevector <2 x double> [[TMP1:%.*]], <2 x double> poison, <2 x i32> <i32 1, i32 poison>1277; CHECK-NEXT: [[RESULT1:%.*]] = fadd <2 x double> [[TMP1]], [[RESULT]]1278; CHECK-NEXT: ret <2 x double> [[RESULT1]]1279;1280 %a0 = extractelement <2 x double> %a, i32 01281 %a1 = extractelement <2 x double> %a, i32 11282 %a01 = fadd double %a0, %a11283 %b0 = extractelement <2 x double> %b, i32 01284 %b1 = extractelement <2 x double> %b, i32 11285 %b01 = fadd double %b0, %b11286 %hadd0 = insertelement <2 x double> poison, double %a01, i32 01287 %hadd1 = insertelement <2 x double> %hadd0, double %b01, i32 11288 %result = shufflevector <2 x double> %hadd1, <2 x double> %a, <2 x i32> <i32 0, i32 poison>1289 ret <2 x double> %result1290}1291 1292;1293; v4f641294;1295 1296define <4 x double> @add_v4f64_0123(<4 x double> %a, <4 x double> %b) {1297; CHECK-LABEL: @add_v4f64_0123(1298; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 2, i32 6>1299; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 5, i32 3, i32 7>1300; CHECK-NEXT: [[TMP3:%.*]] = fadd <4 x double> [[TMP1]], [[TMP2]]1301; CHECK-NEXT: ret <4 x double> [[TMP3]]1302;1303 %a0 = extractelement <4 x double> %a, i32 01304 %a1 = extractelement <4 x double> %a, i32 11305 %a2 = extractelement <4 x double> %a, i32 21306 %a3 = extractelement <4 x double> %a, i32 31307 %a01 = fadd double %a0, %a11308 %a23 = fadd double %a2, %a31309 %b0 = extractelement <4 x double> %b, i32 01310 %b1 = extractelement <4 x double> %b, i32 11311 %b2 = extractelement <4 x double> %b, i32 21312 %b3 = extractelement <4 x double> %b, i32 31313 %b01 = fadd double %b0, %b11314 %b23 = fadd double %b2, %b31315 %hadd0 = insertelement <4 x double> poison, double %a01, i32 01316 %hadd1 = insertelement <4 x double> %hadd0, double %b01, i32 11317 %hadd2 = insertelement <4 x double> %hadd1, double %a23, i32 21318 %hadd3 = insertelement <4 x double> %hadd2, double %b23, i32 31319 %result = shufflevector <4 x double> %hadd3, <4 x double> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1320 ret <4 x double> %result1321}1322 1323define <4 x double> @add_v4f64_u123(<4 x double> %a, <4 x double> %b) {1324; SSE2-LABEL: @add_v4f64_u123(1325; SSE2-NEXT: [[B2:%.*]] = extractelement <4 x double> [[B:%.*]], i64 21326; SSE2-NEXT: [[B3:%.*]] = extractelement <4 x double> [[B]], i64 31327; SSE2-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[B]], <4 x double> [[A:%.*]], <2 x i32> <i32 0, i32 6>1328; SSE2-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[B]], <4 x double> [[A]], <2 x i32> <i32 1, i32 7>1329; SSE2-NEXT: [[TMP3:%.*]] = fadd <2 x double> [[TMP1]], [[TMP2]]1330; SSE2-NEXT: [[B23:%.*]] = fadd double [[B2]], [[B3]]1331; SSE2-NEXT: [[TMP4:%.*]] = shufflevector <2 x double> [[TMP3]], <2 x double> poison, <4 x i32> <i32 poison, i32 0, i32 1, i32 poison>1332; SSE2-NEXT: [[RESULT:%.*]] = insertelement <4 x double> [[TMP4]], double [[B23]], i64 31333; SSE2-NEXT: ret <4 x double> [[RESULT]]1334;1335; SSE4-LABEL: @add_v4f64_u123(1336; SSE4-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[B:%.*]], <4 x double> [[A:%.*]], <4 x i32> <i32 poison, i32 0, i32 6, i32 2>1337; SSE4-NEXT: [[TMP4:%.*]] = shufflevector <4 x double> [[B]], <4 x double> [[A]], <4 x i32> <i32 poison, i32 1, i32 7, i32 3>1338; SSE4-NEXT: [[TMP3:%.*]] = fadd <4 x double> [[TMP2]], [[TMP4]]1339; SSE4-NEXT: ret <4 x double> [[TMP3]]1340;1341; AVX-LABEL: @add_v4f64_u123(1342; AVX-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[B:%.*]], <4 x double> [[A:%.*]], <4 x i32> <i32 poison, i32 0, i32 6, i32 2>1343; AVX-NEXT: [[TMP3:%.*]] = shufflevector <4 x double> [[B]], <4 x double> [[A]], <4 x i32> <i32 poison, i32 1, i32 7, i32 3>1344; AVX-NEXT: [[TMP4:%.*]] = fadd <4 x double> [[TMP2]], [[TMP3]]1345; AVX-NEXT: ret <4 x double> [[TMP4]]1346;1347 %a0 = extractelement <4 x double> %a, i32 01348 %a1 = extractelement <4 x double> %a, i32 11349 %a2 = extractelement <4 x double> %a, i32 21350 %a3 = extractelement <4 x double> %a, i32 31351 %a01 = fadd double %a0, %a11352 %a23 = fadd double %a2, %a31353 %b0 = extractelement <4 x double> %b, i32 01354 %b1 = extractelement <4 x double> %b, i32 11355 %b2 = extractelement <4 x double> %b, i32 21356 %b3 = extractelement <4 x double> %b, i32 31357 %b01 = fadd double %b0, %b11358 %b23 = fadd double %b2, %b31359 %hadd0 = insertelement <4 x double> poison, double %a01, i32 01360 %hadd1 = insertelement <4 x double> %hadd0, double %b01, i32 11361 %hadd2 = insertelement <4 x double> %hadd1, double %a23, i32 21362 %hadd3 = insertelement <4 x double> %hadd2, double %b23, i32 31363 %result = shufflevector <4 x double> %hadd3, <4 x double> %a, <4 x i32> <i32 poison, i32 1, i32 2, i32 3>1364 ret <4 x double> %result1365}1366 1367define <4 x double> @add_v4f64_0u23(<4 x double> %a, <4 x double> %b) {1368; SSE2-LABEL: @add_v4f64_0u23(1369; SSE2-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> poison, <2 x i32> <i32 1, i32 2>1370; SSE2-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> poison, <2 x i32> <i32 0, i32 3>1371; SSE2-NEXT: [[TMP3:%.*]] = fadd <2 x double> [[TMP1]], [[TMP2]]1372; SSE2-NEXT: [[B2:%.*]] = extractelement <4 x double> [[B:%.*]], i64 21373; SSE2-NEXT: [[B3:%.*]] = extractelement <4 x double> [[B]], i64 31374; SSE2-NEXT: [[B23:%.*]] = fadd double [[B2]], [[B3]]1375; SSE2-NEXT: [[TMP4:%.*]] = shufflevector <2 x double> [[TMP3]], <2 x double> poison, <4 x i32> <i32 0, i32 poison, i32 1, i32 poison>1376; SSE2-NEXT: [[RESULT:%.*]] = insertelement <4 x double> [[TMP4]], double [[B23]], i64 31377; SSE2-NEXT: ret <4 x double> [[RESULT]]1378;1379; SSE4-LABEL: @add_v4f64_0u23(1380; SSE4-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 1, i32 poison, i32 2, i32 6>1381; SSE4-NEXT: [[TMP3:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 0, i32 poison, i32 3, i32 7>1382; SSE4-NEXT: [[TMP4:%.*]] = fadd <4 x double> [[TMP2]], [[TMP3]]1383; SSE4-NEXT: ret <4 x double> [[TMP4]]1384;1385; AVX-LABEL: @add_v4f64_0u23(1386; AVX-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 1, i32 poison, i32 2, i32 6>1387; AVX-NEXT: [[TMP3:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 0, i32 poison, i32 3, i32 7>1388; AVX-NEXT: [[TMP4:%.*]] = fadd <4 x double> [[TMP2]], [[TMP3]]1389; AVX-NEXT: ret <4 x double> [[TMP4]]1390;1391 %a0 = extractelement <4 x double> %a, i32 01392 %a1 = extractelement <4 x double> %a, i32 11393 %a2 = extractelement <4 x double> %a, i32 21394 %a3 = extractelement <4 x double> %a, i32 31395 %a01 = fadd double %a0, %a11396 %a23 = fadd double %a2, %a31397 %b0 = extractelement <4 x double> %b, i32 01398 %b1 = extractelement <4 x double> %b, i32 11399 %b2 = extractelement <4 x double> %b, i32 21400 %b3 = extractelement <4 x double> %b, i32 31401 %b01 = fadd double %b0, %b11402 %b23 = fadd double %b2, %b31403 %hadd0 = insertelement <4 x double> poison, double %a01, i32 01404 %hadd1 = insertelement <4 x double> %hadd0, double %b01, i32 11405 %hadd2 = insertelement <4 x double> %hadd1, double %a23, i32 21406 %hadd3 = insertelement <4 x double> %hadd2, double %b23, i32 31407 %result = shufflevector <4 x double> %hadd3, <4 x double> %a, <4 x i32> <i32 0, i32 poison, i32 2, i32 3>1408 ret <4 x double> %result1409}1410 1411define <4 x double> @add_v4f64_01u3(<4 x double> %a, <4 x double> %b) {1412; SSE2-LABEL: @add_v4f64_01u3(1413; SSE2-NEXT: [[B2:%.*]] = extractelement <4 x double> [[B:%.*]], i64 21414; SSE2-NEXT: [[B3:%.*]] = extractelement <4 x double> [[B]], i64 31415; SSE2-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B]], <2 x i32> <i32 0, i32 4>1416; SSE2-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <2 x i32> <i32 1, i32 5>1417; SSE2-NEXT: [[TMP3:%.*]] = fadd <2 x double> [[TMP1]], [[TMP2]]1418; SSE2-NEXT: [[B23:%.*]] = fadd double [[B2]], [[B3]]1419; SSE2-NEXT: [[TMP4:%.*]] = shufflevector <2 x double> [[TMP3]], <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>1420; SSE2-NEXT: [[RESULT:%.*]] = insertelement <4 x double> [[TMP4]], double [[B23]], i64 31421; SSE2-NEXT: ret <4 x double> [[RESULT]]1422;1423; SSE4-LABEL: @add_v4f64_01u3(1424; SSE4-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 poison, i32 6>1425; SSE4-NEXT: [[TMP4:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 5, i32 poison, i32 7>1426; SSE4-NEXT: [[TMP3:%.*]] = fadd <4 x double> [[TMP2]], [[TMP4]]1427; SSE4-NEXT: ret <4 x double> [[TMP3]]1428;1429; AVX-LABEL: @add_v4f64_01u3(1430; AVX-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 poison, i32 6>1431; AVX-NEXT: [[TMP3:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 5, i32 poison, i32 7>1432; AVX-NEXT: [[TMP4:%.*]] = fadd <4 x double> [[TMP2]], [[TMP3]]1433; AVX-NEXT: ret <4 x double> [[TMP4]]1434;1435 %a0 = extractelement <4 x double> %a, i32 01436 %a1 = extractelement <4 x double> %a, i32 11437 %a2 = extractelement <4 x double> %a, i32 21438 %a3 = extractelement <4 x double> %a, i32 31439 %a01 = fadd double %a0, %a11440 %a23 = fadd double %a2, %a31441 %b0 = extractelement <4 x double> %b, i32 01442 %b1 = extractelement <4 x double> %b, i32 11443 %b2 = extractelement <4 x double> %b, i32 21444 %b3 = extractelement <4 x double> %b, i32 31445 %b01 = fadd double %b0, %b11446 %b23 = fadd double %b2, %b31447 %hadd0 = insertelement <4 x double> poison, double %a01, i32 01448 %hadd1 = insertelement <4 x double> %hadd0, double %b01, i32 11449 %hadd2 = insertelement <4 x double> %hadd1, double %a23, i32 21450 %hadd3 = insertelement <4 x double> %hadd2, double %b23, i32 31451 %result = shufflevector <4 x double> %hadd3, <4 x double> %a, <4 x i32> <i32 0, i32 1, i32 poison, i32 3>1452 ret <4 x double> %result1453}1454 1455define <4 x double> @add_v4f64_012u(<4 x double> %a, <4 x double> %b) {1456; SSE2-LABEL: @add_v4f64_012u(1457; SSE2-NEXT: [[A2:%.*]] = extractelement <4 x double> [[A:%.*]], i64 21458; SSE2-NEXT: [[A3:%.*]] = extractelement <4 x double> [[A]], i64 31459; SSE2-NEXT: [[A23:%.*]] = fadd double [[A2]], [[A3]]1460; SSE2-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B:%.*]], <2 x i32> <i32 0, i32 4>1461; SSE2-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <2 x i32> <i32 1, i32 5>1462; SSE2-NEXT: [[TMP3:%.*]] = fadd <2 x double> [[TMP1]], [[TMP2]]1463; SSE2-NEXT: [[TMP4:%.*]] = shufflevector <2 x double> [[TMP3]], <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>1464; SSE2-NEXT: [[RESULT:%.*]] = insertelement <4 x double> [[TMP4]], double [[A23]], i64 21465; SSE2-NEXT: ret <4 x double> [[RESULT]]1466;1467; SSE4-LABEL: @add_v4f64_012u(1468; SSE4-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 2, i32 poison>1469; SSE4-NEXT: [[TMP4:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 5, i32 3, i32 poison>1470; SSE4-NEXT: [[TMP3:%.*]] = fadd <4 x double> [[TMP2]], [[TMP4]]1471; SSE4-NEXT: ret <4 x double> [[TMP3]]1472;1473; AVX-LABEL: @add_v4f64_012u(1474; AVX-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 2, i32 poison>1475; AVX-NEXT: [[TMP3:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 5, i32 3, i32 poison>1476; AVX-NEXT: [[TMP4:%.*]] = fadd <4 x double> [[TMP2]], [[TMP3]]1477; AVX-NEXT: ret <4 x double> [[TMP4]]1478;1479 %a0 = extractelement <4 x double> %a, i32 01480 %a1 = extractelement <4 x double> %a, i32 11481 %a2 = extractelement <4 x double> %a, i32 21482 %a3 = extractelement <4 x double> %a, i32 31483 %a01 = fadd double %a0, %a11484 %a23 = fadd double %a2, %a31485 %b0 = extractelement <4 x double> %b, i32 01486 %b1 = extractelement <4 x double> %b, i32 11487 %b2 = extractelement <4 x double> %b, i32 21488 %b3 = extractelement <4 x double> %b, i32 31489 %b01 = fadd double %b0, %b11490 %b23 = fadd double %b2, %b31491 %hadd0 = insertelement <4 x double> poison, double %a01, i32 01492 %hadd1 = insertelement <4 x double> %hadd0, double %b01, i32 11493 %hadd2 = insertelement <4 x double> %hadd1, double %a23, i32 21494 %hadd3 = insertelement <4 x double> %hadd2, double %b23, i32 31495 %result = shufflevector <4 x double> %hadd3, <4 x double> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>1496 ret <4 x double> %result1497}1498 1499define <4 x double> @add_v4f64_uu23(<4 x double> %a, <4 x double> %b) {1500; SSE2-LABEL: @add_v4f64_uu23(1501; SSE2-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <2 x i32> <i32 2, i32 6>1502; SSE2-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <2 x i32> <i32 3, i32 7>1503; SSE2-NEXT: [[TMP3:%.*]] = fadd <2 x double> [[TMP1]], [[TMP2]]1504; SSE2-NEXT: [[RESULT1:%.*]] = shufflevector <2 x double> [[TMP3]], <2 x double> poison, <4 x i32> <i32 poison, i32 poison, i32 0, i32 1>1505; SSE2-NEXT: ret <4 x double> [[RESULT1]]1506;1507; SSE4-LABEL: @add_v4f64_uu23(1508; SSE4-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 poison, i32 poison, i32 2, i32 6>1509; SSE4-NEXT: [[TMP3:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 poison, i32 poison, i32 3, i32 7>1510; SSE4-NEXT: [[RESULT1:%.*]] = fadd <4 x double> [[TMP2]], [[TMP3]]1511; SSE4-NEXT: ret <4 x double> [[RESULT1]]1512;1513; AVX-LABEL: @add_v4f64_uu23(1514; AVX-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 poison, i32 poison, i32 2, i32 6>1515; AVX-NEXT: [[TMP3:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 poison, i32 poison, i32 3, i32 7>1516; AVX-NEXT: [[RESULT1:%.*]] = fadd <4 x double> [[TMP2]], [[TMP3]]1517; AVX-NEXT: ret <4 x double> [[RESULT1]]1518;1519 %a0 = extractelement <4 x double> %a, i32 01520 %a1 = extractelement <4 x double> %a, i32 11521 %a2 = extractelement <4 x double> %a, i32 21522 %a3 = extractelement <4 x double> %a, i32 31523 %a01 = fadd double %a0, %a11524 %a23 = fadd double %a2, %a31525 %b0 = extractelement <4 x double> %b, i32 01526 %b1 = extractelement <4 x double> %b, i32 11527 %b2 = extractelement <4 x double> %b, i32 21528 %b3 = extractelement <4 x double> %b, i32 31529 %b01 = fadd double %b0, %b11530 %b23 = fadd double %b2, %b31531 %hadd0 = insertelement <4 x double> poison, double %a01, i32 01532 %hadd1 = insertelement <4 x double> %hadd0, double %b01, i32 11533 %hadd2 = insertelement <4 x double> %hadd1, double %a23, i32 21534 %hadd3 = insertelement <4 x double> %hadd2, double %b23, i32 31535 %result = shufflevector <4 x double> %hadd3, <4 x double> %a, <4 x i32> <i32 poison, i32 poison, i32 2, i32 3>1536 ret <4 x double> %result1537}1538 1539define <4 x double> @add_v4f64_01uu(<4 x double> %a, <4 x double> %b) {1540; SSE2-LABEL: @add_v4f64_01uu(1541; SSE2-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <2 x i32> <i32 0, i32 4>1542; SSE2-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <2 x i32> <i32 1, i32 5>1543; SSE2-NEXT: [[TMP3:%.*]] = fadd <2 x double> [[TMP1]], [[TMP2]]1544; SSE2-NEXT: [[TMP4:%.*]] = shufflevector <2 x double> [[TMP3]], <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>1545; SSE2-NEXT: ret <4 x double> [[TMP4]]1546;1547; SSE4-LABEL: @add_v4f64_01uu(1548; SSE4-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 poison, i32 poison>1549; SSE4-NEXT: [[TMP4:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 5, i32 poison, i32 poison>1550; SSE4-NEXT: [[TMP3:%.*]] = fadd <4 x double> [[TMP2]], [[TMP4]]1551; SSE4-NEXT: ret <4 x double> [[TMP3]]1552;1553; AVX-LABEL: @add_v4f64_01uu(1554; AVX-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 poison, i32 poison>1555; AVX-NEXT: [[TMP4:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 5, i32 poison, i32 poison>1556; AVX-NEXT: [[TMP3:%.*]] = fadd <4 x double> [[TMP2]], [[TMP4]]1557; AVX-NEXT: ret <4 x double> [[TMP3]]1558;1559 %a0 = extractelement <4 x double> %a, i32 01560 %a1 = extractelement <4 x double> %a, i32 11561 %a2 = extractelement <4 x double> %a, i32 21562 %a3 = extractelement <4 x double> %a, i32 31563 %a01 = fadd double %a0, %a11564 %a23 = fadd double %a2, %a31565 %b0 = extractelement <4 x double> %b, i32 01566 %b1 = extractelement <4 x double> %b, i32 11567 %b2 = extractelement <4 x double> %b, i32 21568 %b3 = extractelement <4 x double> %b, i32 31569 %b01 = fadd double %b0, %b11570 %b23 = fadd double %b2, %b31571 %hadd0 = insertelement <4 x double> poison, double %a01, i32 01572 %hadd1 = insertelement <4 x double> %hadd0, double %b01, i32 11573 %hadd2 = insertelement <4 x double> %hadd1, double %a23, i32 21574 %hadd3 = insertelement <4 x double> %hadd2, double %b23, i32 31575 %result = shufflevector <4 x double> %hadd3, <4 x double> %a, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>1576 ret <4 x double> %result1577}1578 1579define <4 x double> @add_v4f64_32u0(<4 x double> %a, <4 x double> %b) {1580; SSE2-LABEL: @add_v4f64_32u0(1581; SSE2-NEXT: [[A0:%.*]] = extractelement <4 x double> [[A:%.*]], i64 01582; SSE2-NEXT: [[A1:%.*]] = extractelement <4 x double> [[A]], i64 11583; SSE2-NEXT: [[A01:%.*]] = fadd double [[A0]], [[A1]]1584; SSE2-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[B:%.*]], <4 x double> poison, <2 x i32> <i32 2, i32 0>1585; SSE2-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[B]], <4 x double> poison, <2 x i32> <i32 3, i32 1>1586; SSE2-NEXT: [[TMP3:%.*]] = fadd <2 x double> [[TMP1]], [[TMP2]]1587; SSE2-NEXT: [[TMP4:%.*]] = shufflevector <2 x double> [[TMP3]], <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>1588; SSE2-NEXT: [[RESULT:%.*]] = insertelement <4 x double> [[TMP4]], double [[A01]], i64 31589; SSE2-NEXT: ret <4 x double> [[RESULT]]1590;1591; SSE4-LABEL: @add_v4f64_32u0(1592; SSE4-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[B:%.*]], <4 x double> [[A:%.*]], <4 x i32> <i32 2, i32 0, i32 poison, i32 4>1593; SSE4-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[B]], <4 x double> [[A]], <4 x i32> <i32 3, i32 1, i32 poison, i32 5>1594; SSE4-NEXT: [[RESULT:%.*]] = fadd <4 x double> [[TMP1]], [[TMP2]]1595; SSE4-NEXT: ret <4 x double> [[RESULT]]1596;1597; AVX-LABEL: @add_v4f64_32u0(1598; AVX-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[B:%.*]], <4 x double> [[A:%.*]], <4 x i32> <i32 2, i32 0, i32 poison, i32 4>1599; AVX-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[B]], <4 x double> [[A]], <4 x i32> <i32 3, i32 1, i32 poison, i32 5>1600; AVX-NEXT: [[RESULT:%.*]] = fadd <4 x double> [[TMP1]], [[TMP2]]1601; AVX-NEXT: ret <4 x double> [[RESULT]]1602;1603 %a0 = extractelement <4 x double> %a, i32 01604 %a1 = extractelement <4 x double> %a, i32 11605 %a2 = extractelement <4 x double> %a, i32 21606 %a3 = extractelement <4 x double> %a, i32 31607 %a01 = fadd double %a0, %a11608 %a23 = fadd double %a2, %a31609 %b0 = extractelement <4 x double> %b, i32 01610 %b1 = extractelement <4 x double> %b, i32 11611 %b2 = extractelement <4 x double> %b, i32 21612 %b3 = extractelement <4 x double> %b, i32 31613 %b01 = fadd double %b0, %b11614 %b23 = fadd double %b2, %b31615 %hadd0 = insertelement <4 x double> poison, double %a01, i32 01616 %hadd1 = insertelement <4 x double> %hadd0, double %a23, i32 11617 %hadd2 = insertelement <4 x double> %hadd1, double %b01, i32 21618 %hadd3 = insertelement <4 x double> %hadd2, double %b23, i32 31619 %result = shufflevector <4 x double> %hadd3, <4 x double> %a, <4 x i32> <i32 3, i32 2, i32 poison, i32 0>1620 ret <4 x double> %result1621}1622