brintos

brintos / llvm-project-archived public Read only

0
0
Text · 91.7 KiB · bbfe844 Raw
1616 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 (sub (shuffle a, b),(shuffle a, b)) for optimal horizontal sub patterns (with undemanded elements)12 13;14; v8i1615;16 17define <8 x i16> @sub_v8i16_01234567(<8 x i16> %a, <8 x i16> %b) {18; CHECK-LABEL: @sub_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:%.*]] = sub <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 = sub i16 %a0, %a133  %a23 = sub i16 %a2, %a334  %a45 = sub i16 %a4, %a535  %a67 = sub 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 = sub i16 %b0, %b145  %b23 = sub i16 %b2, %b346  %b45 = sub i16 %b4, %b547  %b67 = sub i16 %b6, %b748  %hsub0 = insertelement <8 x i16> poison, i16 %a01, i32 049  %hsub1 = insertelement <8 x i16> %hsub0, i16 %a23, i32 150  %hsub2 = insertelement <8 x i16> %hsub1, i16 %a45, i32 251  %hsub3 = insertelement <8 x i16> %hsub2, i16 %a67, i32 352  %hsub4 = insertelement <8 x i16> %hsub3, i16 %b01, i32 453  %hsub5 = insertelement <8 x i16> %hsub4, i16 %b23, i32 554  %hsub6 = insertelement <8 x i16> %hsub5, i16 %b45, i32 655  %hsub7 = insertelement <8 x i16> %hsub6, i16 %b67, i32 756  %result = shufflevector <8 x i16> %hsub7, <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> @sub_v8i16_u1234567(<8 x i16> %a, <8 x i16> %b) {61; SSE2-LABEL: @sub_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:%.*]] = sub <8 x i16> [[A]], [[SHIFT3]]64; SSE2-NEXT:    [[TMP4:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> poison, <8 x i32> <i32 poison, i32 2, i32 4, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>65; SSE2-NEXT:    [[TMP5:%.*]] = shufflevector <8 x i16> [[A]], <8 x i16> poison, <8 x i32> <i32 poison, i32 3, i32 5, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>66; SSE2-NEXT:    [[HSUB22:%.*]] = sub <8 x i16> [[TMP4]], [[TMP5]]67; SSE2-NEXT:    [[HSUB3:%.*]] = shufflevector <8 x i16> [[HSUB22]], <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:%.*]] = sub <8 x i16> [[TMP1]], [[TMP2]]71; SSE2-NEXT:    [[RESULT:%.*]] = shufflevector <8 x i16> [[HSUB3]], <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: @sub_v8i16_u1234567(75; SSE4-NEXT:    [[TMP5:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], <8 x i32> <i32 poison, i32 2, i32 4, 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 5, i32 7, i32 9, i32 11, i32 13, i32 15>77; SSE4-NEXT:    [[TMP7:%.*]] = sub <8 x i16> [[TMP5]], [[TMP6]]78; SSE4-NEXT:    ret <8 x i16> [[TMP7]]79;80; AVX-LABEL: @sub_v8i16_u1234567(81; AVX-NEXT:    [[TMP5:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], <8 x i32> <i32 poison, i32 2, i32 4, 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 5, i32 7, i32 9, i32 11, i32 13, i32 15>83; AVX-NEXT:    [[TMP7:%.*]] = sub <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 = sub i16 %a0, %a195  %a23 = sub i16 %a2, %a396  %a45 = sub i16 %a4, %a597  %a67 = sub 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 = sub i16 %b0, %b1107  %b23 = sub i16 %b2, %b3108  %b45 = sub i16 %b4, %b5109  %b67 = sub i16 %b6, %b7110  %hsub0 = insertelement <8 x i16> poison, i16 %a01, i32 0111  %hsub1 = insertelement <8 x i16> %hsub0, i16 %a23, i32 1112  %hsub2 = insertelement <8 x i16> %hsub1, i16 %a45, i32 2113  %hsub3 = insertelement <8 x i16> %hsub2, i16 %a67, i32 3114  %hsub4 = insertelement <8 x i16> %hsub3, i16 %b01, i32 4115  %hsub5 = insertelement <8 x i16> %hsub4, i16 %b23, i32 5116  %hsub6 = insertelement <8 x i16> %hsub5, i16 %b45, i32 6117  %hsub7 = insertelement <8 x i16> %hsub6, i16 %b67, i32 7118  %result = shufflevector <8 x i16> %hsub7, <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> @sub_v8i16_76u43210(<8 x i16> %a, <8 x i16> %b) {123; SSE2-LABEL: @sub_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:%.*]] = sub <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:%.*]] = sub <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:%.*]] = sub <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:%.*]] = sub <8 x i16> [[TMP4]], [[TMP5]]133; SSE2-NEXT:    [[HSUB41:%.*]] = 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:    [[HSUB6:%.*]] = shufflevector <8 x i16> [[HSUB41]], <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:    [[HSUB7:%.*]] = shufflevector <8 x i16> [[HSUB6]], <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> [[HSUB7]], <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: @sub_v8i16_76u43210(140; SSE4-NEXT:    [[TMP1:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> poison, <8 x i32> <i32 0, i32 2, 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 3, i32 5, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>142; SSE4-NEXT:    [[HSUB22:%.*]] = sub <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:%.*]] = sub <8 x i16> [[TMP3]], [[TMP4]]146; SSE4-NEXT:    [[RESULT:%.*]] = shufflevector <8 x i16> [[TMP5]], <8 x i16> [[HSUB22]], <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: @sub_v8i16_76u43210(150; AVX-NEXT:    [[TMP1:%.*]] = shufflevector <8 x i16> [[A:%.*]], <8 x i16> poison, <8 x i32> <i32 0, i32 2, 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 3, i32 5, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>152; AVX-NEXT:    [[HSUB22:%.*]] = sub <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:%.*]] = sub <8 x i16> [[TMP3]], [[TMP4]]156; AVX-NEXT:    [[RESULT:%.*]] = shufflevector <8 x i16> [[TMP5]], <8 x i16> [[HSUB22]], <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 = sub i16 %a0, %a1168  %a23 = sub i16 %a2, %a3169  %a45 = sub i16 %a4, %a5170  %a67 = sub 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 = sub i16 %b0, %b1180  %b23 = sub i16 %b2, %b3181  %b45 = sub i16 %b4, %b5182  %b67 = sub i16 %b6, %b7183  %hsub0 = insertelement <8 x i16> poison, i16 %a01, i32 0184  %hsub1 = insertelement <8 x i16> %hsub0, i16 %a23, i32 1185  %hsub2 = insertelement <8 x i16> %hsub1, i16 %a45, i32 2186  %hsub3 = insertelement <8 x i16> %hsub2, i16 %a67, i32 3187  %hsub4 = insertelement <8 x i16> %hsub3, i16 %b01, i32 4188  %hsub5 = insertelement <8 x i16> %hsub4, i16 %b23, i32 5189  %hsub6 = insertelement <8 x i16> %hsub5, i16 %b45, i32 6190  %hsub7 = insertelement <8 x i16> %hsub6, i16 %b67, i32 7191  %result = shufflevector <8 x i16> %hsub7, <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> @sub_v16i16_0123456789ABCDEF(<16 x i16> %a, <16 x i16> %b) {200; CHECK-LABEL: @sub_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:%.*]] = sub <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 = sub i16 %a0, %a1223  %a23 = sub i16 %a2, %a3224  %a45 = sub i16 %a4, %a5225  %a67 = sub i16 %a6, %a7226  %a89 = sub i16 %a8, %a9227  %aAB = sub i16 %aA, %aB228  %aCD = sub i16 %aC, %aD229  %aEF = sub 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 = sub i16 %b0, %b1247  %b23 = sub i16 %b2, %b3248  %b45 = sub i16 %b4, %b5249  %b67 = sub i16 %b6, %b7250  %b89 = sub i16 %b8, %b9251  %bAB = sub i16 %bA, %bB252  %bCD = sub i16 %bC, %bD253  %bEF = sub i16 %bE, %bF254  %hsub0 = insertelement <16 x i16> poison, i16 %a01, i32 0255  %hsub1 = insertelement <16 x i16> %hsub0, i16 %a23, i32 1256  %hsub2 = insertelement <16 x i16> %hsub1, i16 %a45, i32 2257  %hsub3 = insertelement <16 x i16> %hsub2, i16 %a67, i32 3258  %hsub4 = insertelement <16 x i16> %hsub3, i16 %b01, i32 4259  %hsub5 = insertelement <16 x i16> %hsub4, i16 %b23, i32 5260  %hsub6 = insertelement <16 x i16> %hsub5, i16 %b45, i32 6261  %hsub7 = insertelement <16 x i16> %hsub6, i16 %b67, i32 7262  %hsub8 = insertelement <16 x i16> %hsub7, i16 %a89, i32 8263  %hsub9 = insertelement <16 x i16> %hsub8, i16 %aAB, i32 9264  %hsubA = insertelement <16 x i16> %hsub9, i16 %aCD, i32 10265  %hsubB = insertelement <16 x i16> %hsubA, i16 %aEF, i32 11266  %hsubC = insertelement <16 x i16> %hsubB, i16 %b89, i32 12267  %hsubD = insertelement <16 x i16> %hsubC, i16 %bAB, i32 13268  %hsubE = insertelement <16 x i16> %hsubD, i16 %bCD, i32 14269  %hsubF = insertelement <16 x i16> %hsubE, i16 %bEF, i32 15270  %result = shufflevector <16 x i16> %hsubF, <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> @sub_v16i16_0123u56789uBCDEF(<16 x i16> %a, <16 x i16> %b) {275; SSE2-LABEL: @sub_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:%.*]] = sub 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:    [[HSUB8:%.*]] = sub <16 x i16> [[TMP3]], [[TMP7]]282; SSE2-NEXT:    [[TMP4:%.*]] = shufflevector <16 x i16> [[B]], <16 x i16> poison, <16 x i32> <i32 8, 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 9, 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:%.*]] = sub <16 x i16> [[TMP4]], [[TMP5]]285; SSE2-NEXT:    [[HSUB92:%.*]] = shufflevector <16 x i16> [[HSUB8]], <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:    [[HSUBB:%.*]] = insertelement <16 x i16> [[HSUB92]], 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:%.*]] = sub <16 x i16> [[TMP10]], [[TMP8]]290; SSE2-NEXT:    [[RESULT:%.*]] = shufflevector <16 x i16> [[HSUBB]], <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: @sub_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:%.*]] = sub <16 x i16> [[TMP7]], [[TMP8]]300; SSE4-NEXT:    ret <16 x i16> [[TMP9]]301;302; AVX-LABEL: @sub_v16i16_0123u56789uBCDEF(303; AVX-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>304; AVX-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>305; AVX-NEXT:    [[RESULT:%.*]] = sub <16 x i16> [[TMP1]], [[TMP2]]306; AVX-NEXT:    ret <16 x i16> [[RESULT]]307;308  %a0 = extractelement <16 x i16> %a, i32 0309  %a1 = extractelement <16 x i16> %a, i32 1310  %a2 = extractelement <16 x i16> %a, i32 2311  %a3 = extractelement <16 x i16> %a, i32 3312  %a4 = extractelement <16 x i16> %a, i32 4313  %a5 = extractelement <16 x i16> %a, i32 5314  %a6 = extractelement <16 x i16> %a, i32 6315  %a7 = extractelement <16 x i16> %a, i32 7316  %a8 = extractelement <16 x i16> %a, i32 8317  %a9 = extractelement <16 x i16> %a, i32 9318  %aA = extractelement <16 x i16> %a, i32 10319  %aB = extractelement <16 x i16> %a, i32 11320  %aC = extractelement <16 x i16> %a, i32 12321  %aD = extractelement <16 x i16> %a, i32 13322  %aE = extractelement <16 x i16> %a, i32 14323  %aF = extractelement <16 x i16> %a, i32 15324  %a01 = sub i16 %a0, %a1325  %a23 = sub i16 %a2, %a3326  %a45 = sub i16 %a4, %a5327  %a67 = sub i16 %a6, %a7328  %a89 = sub i16 %a8, %a9329  %aAB = sub i16 %aA, %aB330  %aCD = sub i16 %aC, %aD331  %aEF = sub i16 %aE, %aF332  %b0 = extractelement <16 x i16> %b, i32 0333  %b1 = extractelement <16 x i16> %b, i32 1334  %b2 = extractelement <16 x i16> %b, i32 2335  %b3 = extractelement <16 x i16> %b, i32 3336  %b4 = extractelement <16 x i16> %b, i32 4337  %b5 = extractelement <16 x i16> %b, i32 5338  %b6 = extractelement <16 x i16> %b, i32 6339  %b7 = extractelement <16 x i16> %b, i32 7340  %b8 = extractelement <16 x i16> %b, i32 8341  %b9 = extractelement <16 x i16> %b, i32 9342  %bA = extractelement <16 x i16> %b, i32 10343  %bB = extractelement <16 x i16> %b, i32 11344  %bC = extractelement <16 x i16> %b, i32 12345  %bD = extractelement <16 x i16> %b, i32 13346  %bE = extractelement <16 x i16> %b, i32 14347  %bF = extractelement <16 x i16> %b, i32 15348  %b01 = sub i16 %b0, %b1349  %b23 = sub i16 %b2, %b3350  %b45 = sub i16 %b4, %b5351  %b67 = sub i16 %b6, %b7352  %b89 = sub i16 %b8, %b9353  %bAB = sub i16 %bA, %bB354  %bCD = sub i16 %bC, %bD355  %bEF = sub i16 %bE, %bF356  %hsub0 = insertelement <16 x i16> poison, i16 %a01, i32 0357  %hsub1 = insertelement <16 x i16> %hsub0, i16 %a23, i32 1358  %hsub2 = insertelement <16 x i16> %hsub1, i16 %a45, i32 2359  %hsub3 = insertelement <16 x i16> %hsub2, i16 %a67, i32 3360  %hsub4 = insertelement <16 x i16> %hsub3, i16 %b01, i32 4361  %hsub5 = insertelement <16 x i16> %hsub4, i16 %b23, i32 5362  %hsub6 = insertelement <16 x i16> %hsub5, i16 %b45, i32 6363  %hsub7 = insertelement <16 x i16> %hsub6, i16 %b67, i32 7364  %hsub8 = insertelement <16 x i16> %hsub7, i16 %a89, i32 8365  %hsub9 = insertelement <16 x i16> %hsub8, i16 %aAB, i32 9366  %hsubA = insertelement <16 x i16> %hsub9, i16 %aCD, i32 10367  %hsubB = insertelement <16 x i16> %hsubA, i16 %aEF, i32 11368  %hsubC = insertelement <16 x i16> %hsubB, i16 %b89, i32 12369  %hsubD = insertelement <16 x i16> %hsubC, i16 %bAB, i32 13370  %hsubE = insertelement <16 x i16> %hsubD, i16 %bCD, i32 14371  %hsubF = insertelement <16 x i16> %hsubE, i16 %bEF, i32 15372  %result = shufflevector <16 x i16> %hsubF, <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>373  ret <16 x i16> %result374}375 376define <16 x i16> @sub_v16i16_FEuCBA98765432u0(<16 x i16> %a, <16 x i16> %b) {377; SSE2-LABEL: @sub_v16i16_FEuCBA98765432u0(378; SSE2-NEXT:    [[BC:%.*]] = extractelement <16 x i16> [[B:%.*]], i64 12379; SSE2-NEXT:    [[BD:%.*]] = extractelement <16 x i16> [[B]], i64 13380; SSE2-NEXT:    [[BE:%.*]] = extractelement <16 x i16> [[B]], i64 14381; SSE2-NEXT:    [[BF:%.*]] = extractelement <16 x i16> [[B]], i64 15382; SSE2-NEXT:    [[BCD:%.*]] = sub i16 [[BC]], [[BD]]383; SSE2-NEXT:    [[BEF:%.*]] = sub i16 [[BE]], [[BF]]384; 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>385; 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>386; 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>387; 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>388; SSE2-NEXT:    [[HSUB8:%.*]] = sub <16 x i16> [[TMP3]], [[TMP7]]389; 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>390; 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>391; SSE2-NEXT:    [[TMP6:%.*]] = sub <16 x i16> [[TMP4]], [[TMP5]]392; SSE2-NEXT:    [[HSUBC1:%.*]] = shufflevector <16 x i16> [[HSUB8]], <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>393; SSE2-NEXT:    [[HSUBE:%.*]] = insertelement <16 x i16> [[HSUBC1]], i16 [[BCD]], i64 14394; SSE2-NEXT:    [[HSUBF:%.*]] = insertelement <16 x i16> [[HSUBE]], i16 [[BEF]], i64 15395; SSE2-NEXT:    [[RESULT:%.*]] = shufflevector <16 x i16> [[HSUBF]], <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>396; SSE2-NEXT:    ret <16 x i16> [[RESULT]]397;398; SSE4-LABEL: @sub_v16i16_FEuCBA98765432u0(399; 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>400; 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>401; 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 10, i32 12, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>402; 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 27, i32 29, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>403; SSE4-NEXT:    [[TMP6:%.*]] = sub <16 x i16> [[TMP4]], [[TMP5]]404; 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>405; 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>406; SSE4-NEXT:    [[TMP9:%.*]] = sub <16 x i16> [[TMP7]], [[TMP8]]407; 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>408; SSE4-NEXT:    ret <16 x i16> [[RESULT]]409;410; AVX2-LABEL: @sub_v16i16_FEuCBA98765432u0(411; 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 8, i32 10, i32 12, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>412; 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 9, i32 11, i32 13, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>413; AVX2-NEXT:    [[HSUBA:%.*]] = sub <16 x i16> [[TMP1]], [[TMP2]]414; 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>415; 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>416; AVX2-NEXT:    [[TMP5:%.*]] = sub <16 x i16> [[TMP3]], [[TMP4]]417; AVX2-NEXT:    [[RESULT:%.*]] = shufflevector <16 x i16> [[TMP5]], <16 x i16> [[HSUBA]], <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>418; AVX2-NEXT:    ret <16 x i16> [[RESULT]]419;420; AVX512-LABEL: @sub_v16i16_FEuCBA98765432u0(421; 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 10, i32 12, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>422; 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 11, i32 13, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>423; AVX512-NEXT:    [[HSUBA2:%.*]] = sub <16 x i16> [[TMP1]], [[TMP2]]424; 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>425; 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>426; AVX512-NEXT:    [[TMP5:%.*]] = sub <16 x i16> [[TMP3]], [[TMP4]]427; AVX512-NEXT:    [[RESULT:%.*]] = shufflevector <16 x i16> [[TMP5]], <16 x i16> [[HSUBA2]], <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>428; AVX512-NEXT:    ret <16 x i16> [[RESULT]]429;430  %a0 = extractelement <16 x i16> %a, i32 0431  %a1 = extractelement <16 x i16> %a, i32 1432  %a2 = extractelement <16 x i16> %a, i32 2433  %a3 = extractelement <16 x i16> %a, i32 3434  %a4 = extractelement <16 x i16> %a, i32 4435  %a5 = extractelement <16 x i16> %a, i32 5436  %a6 = extractelement <16 x i16> %a, i32 6437  %a7 = extractelement <16 x i16> %a, i32 7438  %a8 = extractelement <16 x i16> %a, i32 8439  %a9 = extractelement <16 x i16> %a, i32 9440  %aA = extractelement <16 x i16> %a, i32 10441  %aB = extractelement <16 x i16> %a, i32 11442  %aC = extractelement <16 x i16> %a, i32 12443  %aD = extractelement <16 x i16> %a, i32 13444  %aE = extractelement <16 x i16> %a, i32 14445  %aF = extractelement <16 x i16> %a, i32 15446  %a01 = sub i16 %a0, %a1447  %a23 = sub i16 %a2, %a3448  %a45 = sub i16 %a4, %a5449  %a67 = sub i16 %a6, %a7450  %a89 = sub i16 %a8, %a9451  %aAB = sub i16 %aA, %aB452  %aCD = sub i16 %aC, %aD453  %aEF = sub i16 %aE, %aF454  %b0 = extractelement <16 x i16> %b, i32 0455  %b1 = extractelement <16 x i16> %b, i32 1456  %b2 = extractelement <16 x i16> %b, i32 2457  %b3 = extractelement <16 x i16> %b, i32 3458  %b4 = extractelement <16 x i16> %b, i32 4459  %b5 = extractelement <16 x i16> %b, i32 5460  %b6 = extractelement <16 x i16> %b, i32 6461  %b7 = extractelement <16 x i16> %b, i32 7462  %b8 = extractelement <16 x i16> %b, i32 8463  %b9 = extractelement <16 x i16> %b, i32 9464  %bA = extractelement <16 x i16> %b, i32 10465  %bB = extractelement <16 x i16> %b, i32 11466  %bC = extractelement <16 x i16> %b, i32 12467  %bD = extractelement <16 x i16> %b, i32 13468  %bE = extractelement <16 x i16> %b, i32 14469  %bF = extractelement <16 x i16> %b, i32 15470  %b01 = sub i16 %b0, %b1471  %b23 = sub i16 %b2, %b3472  %b45 = sub i16 %b4, %b5473  %b67 = sub i16 %b6, %b7474  %b89 = sub i16 %b8, %b9475  %bAB = sub i16 %bA, %bB476  %bCD = sub i16 %bC, %bD477  %bEF = sub i16 %bE, %bF478  %hsub0 = insertelement <16 x i16> poison, i16 %a01, i32 0479  %hsub1 = insertelement <16 x i16> %hsub0, i16 %a23, i32 1480  %hsub2 = insertelement <16 x i16> %hsub1, i16 %a45, i32 2481  %hsub3 = insertelement <16 x i16> %hsub2, i16 %a67, i32 3482  %hsub4 = insertelement <16 x i16> %hsub3, i16 %b01, i32 4483  %hsub5 = insertelement <16 x i16> %hsub4, i16 %b23, i32 5484  %hsub6 = insertelement <16 x i16> %hsub5, i16 %b45, i32 6485  %hsub7 = insertelement <16 x i16> %hsub6, i16 %b67, i32 7486  %hsub8 = insertelement <16 x i16> %hsub7, i16 %a89, i32 8487  %hsub9 = insertelement <16 x i16> %hsub8, i16 %aAB, i32 9488  %hsubA = insertelement <16 x i16> %hsub9, i16 %aCD, i32 10489  %hsubB = insertelement <16 x i16> %hsubA, i16 %aEF, i32 11490  %hsubC = insertelement <16 x i16> %hsubB, i16 %b89, i32 12491  %hsubD = insertelement <16 x i16> %hsubC, i16 %bAB, i32 13492  %hsubE = insertelement <16 x i16> %hsubD, i16 %bCD, i32 14493  %hsubF = insertelement <16 x i16> %hsubE, i16 %bEF, i32 15494  %result = shufflevector <16 x i16> %hsubF, <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>495  ret <16 x i16> %result496}497 498;499; v4i32500;501 502define <4 x i32> @sub_v4i32_0123(<4 x i32> %a, <4 x i32> %b) {503; CHECK-LABEL: @sub_v4i32_0123(504; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 4, i32 6>505; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 1, i32 3, i32 5, i32 7>506; CHECK-NEXT:    [[TMP3:%.*]] = sub <4 x i32> [[TMP1]], [[TMP2]]507; CHECK-NEXT:    ret <4 x i32> [[TMP3]]508;509  %a0 = extractelement <4 x i32> %a, i32 0510  %a1 = extractelement <4 x i32> %a, i32 1511  %a2 = extractelement <4 x i32> %a, i32 2512  %a3 = extractelement <4 x i32> %a, i32 3513  %a01 = sub i32 %a0, %a1514  %a23 = sub i32 %a2, %a3515  %b0 = extractelement <4 x i32> %b, i32 0516  %b1 = extractelement <4 x i32> %b, i32 1517  %b2 = extractelement <4 x i32> %b, i32 2518  %b3 = extractelement <4 x i32> %b, i32 3519  %b01 = sub i32 %b0, %b1520  %b23 = sub i32 %b2, %b3521  %hsub0 = insertelement <4 x i32> poison, i32 %a01, i32 0522  %hsub1 = insertelement <4 x i32> %hsub0, i32 %a23, i32 1523  %hsub2 = insertelement <4 x i32> %hsub1, i32 %b01, i32 2524  %hsub3 = insertelement <4 x i32> %hsub2, i32 %b23, i32 3525  %result = shufflevector <4 x i32> %hsub3, <4 x i32> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 3>526  ret <4 x i32> %result527}528 529define <4 x i32> @sub_v4i32_u123(<4 x i32> %a, <4 x i32> %b) {530; CHECK-LABEL: @sub_v4i32_u123(531; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 poison, i32 2, i32 4, i32 6>532; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 poison, i32 3, i32 5, i32 7>533; CHECK-NEXT:    [[TMP4:%.*]] = sub <4 x i32> [[TMP2]], [[TMP3]]534; CHECK-NEXT:    ret <4 x i32> [[TMP4]]535;536  %a0 = extractelement <4 x i32> %a, i32 0537  %a1 = extractelement <4 x i32> %a, i32 1538  %a2 = extractelement <4 x i32> %a, i32 2539  %a3 = extractelement <4 x i32> %a, i32 3540  %a01 = sub i32 %a0, %a1541  %a23 = sub i32 %a2, %a3542  %b0 = extractelement <4 x i32> %b, i32 0543  %b1 = extractelement <4 x i32> %b, i32 1544  %b2 = extractelement <4 x i32> %b, i32 2545  %b3 = extractelement <4 x i32> %b, i32 3546  %b01 = sub i32 %b0, %b1547  %b23 = sub i32 %b2, %b3548  %hsub0 = insertelement <4 x i32> poison, i32 %a01, i32 0549  %hsub1 = insertelement <4 x i32> %hsub0, i32 %a23, i32 1550  %hsub2 = insertelement <4 x i32> %hsub1, i32 %b01, i32 2551  %hsub3 = insertelement <4 x i32> %hsub2, i32 %b23, i32 3552  %result = shufflevector <4 x i32> %hsub3, <4 x i32> %a, <4 x i32> <i32 poison, i32 1, i32 2, i32 3>553  ret <4 x i32> %result554}555 556define <4 x i32> @sub_v4i32_0u23(<4 x i32> %a, <4 x i32> %b) {557; CHECK-LABEL: @sub_v4i32_0u23(558; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 poison, i32 4, i32 6>559; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 1, i32 poison, i32 5, i32 7>560; CHECK-NEXT:    [[TMP4:%.*]] = sub <4 x i32> [[TMP2]], [[TMP3]]561; CHECK-NEXT:    ret <4 x i32> [[TMP4]]562;563  %a0 = extractelement <4 x i32> %a, i32 0564  %a1 = extractelement <4 x i32> %a, i32 1565  %a2 = extractelement <4 x i32> %a, i32 2566  %a3 = extractelement <4 x i32> %a, i32 3567  %a01 = sub i32 %a0, %a1568  %a23 = sub i32 %a2, %a3569  %b0 = extractelement <4 x i32> %b, i32 0570  %b1 = extractelement <4 x i32> %b, i32 1571  %b2 = extractelement <4 x i32> %b, i32 2572  %b3 = extractelement <4 x i32> %b, i32 3573  %b01 = sub i32 %b0, %b1574  %b23 = sub i32 %b2, %b3575  %hsub0 = insertelement <4 x i32> poison, i32 %a01, i32 0576  %hsub1 = insertelement <4 x i32> %hsub0, i32 %a23, i32 1577  %hsub2 = insertelement <4 x i32> %hsub1, i32 %b01, i32 2578  %hsub3 = insertelement <4 x i32> %hsub2, i32 %b23, i32 3579  %result = shufflevector <4 x i32> %hsub3, <4 x i32> %a, <4 x i32> <i32 0, i32 poison, i32 2, i32 3>580  ret <4 x i32> %result581}582 583define <4 x i32> @sub_v4i32_01u3(<4 x i32> %a, <4 x i32> %b) {584; SSE2-LABEL: @sub_v4i32_01u3(585; SSE2-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 poison, i32 6>586; SSE2-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 1, i32 3, i32 poison, i32 7>587; SSE2-NEXT:    [[TMP4:%.*]] = sub <4 x i32> [[TMP2]], [[TMP3]]588; SSE2-NEXT:    ret <4 x i32> [[TMP4]]589;590; SSE4-LABEL: @sub_v4i32_01u3(591; SSE4-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 poison, i32 6>592; SSE4-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 1, i32 3, i32 poison, i32 7>593; SSE4-NEXT:    [[TMP4:%.*]] = sub <4 x i32> [[TMP2]], [[TMP3]]594; SSE4-NEXT:    ret <4 x i32> [[TMP4]]595;596; AVX2-LABEL: @sub_v4i32_01u3(597; AVX2-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 poison, i32 6>598; AVX2-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 1, i32 3, i32 poison, i32 7>599; AVX2-NEXT:    [[TMP4:%.*]] = sub <4 x i32> [[TMP2]], [[TMP3]]600; AVX2-NEXT:    ret <4 x i32> [[TMP4]]601;602; AVX512-LABEL: @sub_v4i32_01u3(603; AVX512-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 poison, i32 6>604; AVX512-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 1, i32 3, i32 poison, i32 7>605; AVX512-NEXT:    [[TMP4:%.*]] = sub <4 x i32> [[TMP2]], [[TMP3]]606; AVX512-NEXT:    ret <4 x i32> [[TMP4]]607;608  %a0 = extractelement <4 x i32> %a, i32 0609  %a1 = extractelement <4 x i32> %a, i32 1610  %a2 = extractelement <4 x i32> %a, i32 2611  %a3 = extractelement <4 x i32> %a, i32 3612  %a01 = sub i32 %a0, %a1613  %a23 = sub i32 %a2, %a3614  %b0 = extractelement <4 x i32> %b, i32 0615  %b1 = extractelement <4 x i32> %b, i32 1616  %b2 = extractelement <4 x i32> %b, i32 2617  %b3 = extractelement <4 x i32> %b, i32 3618  %b01 = sub i32 %b0, %b1619  %b23 = sub i32 %b2, %b3620  %hsub0 = insertelement <4 x i32> poison, i32 %a01, i32 0621  %hsub1 = insertelement <4 x i32> %hsub0, i32 %a23, i32 1622  %hsub2 = insertelement <4 x i32> %hsub1, i32 %b01, i32 2623  %hsub3 = insertelement <4 x i32> %hsub2, i32 %b23, i32 3624  %result = shufflevector <4 x i32> %hsub3, <4 x i32> %a, <4 x i32> <i32 0, i32 1, i32 poison, i32 3>625  ret <4 x i32> %result626}627 628define <4 x i32> @sub_v4i32_012u(<4 x i32> %a, <4 x i32> %b) {629; CHECK-LABEL: @sub_v4i32_012u(630; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 4, i32 poison>631; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> <i32 1, i32 3, i32 5, i32 poison>632; CHECK-NEXT:    [[TMP4:%.*]] = sub <4 x i32> [[TMP2]], [[TMP3]]633; CHECK-NEXT:    ret <4 x i32> [[TMP4]]634;635  %a0 = extractelement <4 x i32> %a, i32 0636  %a1 = extractelement <4 x i32> %a, i32 1637  %a2 = extractelement <4 x i32> %a, i32 2638  %a3 = extractelement <4 x i32> %a, i32 3639  %a01 = sub i32 %a0, %a1640  %a23 = sub i32 %a2, %a3641  %b0 = extractelement <4 x i32> %b, i32 0642  %b1 = extractelement <4 x i32> %b, i32 1643  %b2 = extractelement <4 x i32> %b, i32 2644  %b3 = extractelement <4 x i32> %b, i32 3645  %b01 = sub i32 %b0, %b1646  %b23 = sub i32 %b2, %b3647  %hsub0 = insertelement <4 x i32> poison, i32 %a01, i32 0648  %hsub1 = insertelement <4 x i32> %hsub0, i32 %a23, i32 1649  %hsub2 = insertelement <4 x i32> %hsub1, i32 %b01, i32 2650  %hsub3 = insertelement <4 x i32> %hsub2, i32 %b23, i32 3651  %result = shufflevector <4 x i32> %hsub3, <4 x i32> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>652  ret <4 x i32> %result653}654 655define <4 x i32> @sub_v4i32_uu23(<4 x i32> %a, <4 x i32> %b) {656; CHECK-LABEL: @sub_v4i32_uu23(657; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <4 x i32> [[B:%.*]], <4 x i32> poison, <4 x i32> <i32 poison, i32 poison, i32 0, i32 2>658; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> poison, <4 x i32> <i32 poison, i32 poison, i32 1, i32 3>659; CHECK-NEXT:    [[RESULT1:%.*]] = sub <4 x i32> [[TMP1]], [[TMP2]]660; CHECK-NEXT:    ret <4 x i32> [[RESULT1]]661;662  %a0 = extractelement <4 x i32> %a, i32 0663  %a1 = extractelement <4 x i32> %a, i32 1664  %a2 = extractelement <4 x i32> %a, i32 2665  %a3 = extractelement <4 x i32> %a, i32 3666  %a01 = sub i32 %a0, %a1667  %a23 = sub i32 %a2, %a3668  %b0 = extractelement <4 x i32> %b, i32 0669  %b1 = extractelement <4 x i32> %b, i32 1670  %b2 = extractelement <4 x i32> %b, i32 2671  %b3 = extractelement <4 x i32> %b, i32 3672  %b01 = sub i32 %b0, %b1673  %b23 = sub i32 %b2, %b3674  %hsub0 = insertelement <4 x i32> poison, i32 %a01, i32 0675  %hsub1 = insertelement <4 x i32> %hsub0, i32 %a23, i32 1676  %hsub2 = insertelement <4 x i32> %hsub1, i32 %b01, i32 2677  %hsub3 = insertelement <4 x i32> %hsub2, i32 %b23, i32 3678  %result = shufflevector <4 x i32> %hsub3, <4 x i32> %a, <4 x i32> <i32 poison, i32 poison, i32 2, i32 3>679  ret <4 x i32> %result680}681 682define <4 x i32> @sub_v4i32_01uu(<4 x i32> %a, <4 x i32> %b) {683; CHECK-LABEL: @sub_v4i32_01uu(684; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <4 x i32> [[A:%.*]], <4 x i32> poison, <4 x i32> <i32 0, i32 2, i32 poison, i32 poison>685; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> poison, <4 x i32> <i32 1, i32 3, i32 poison, i32 poison>686; CHECK-NEXT:    [[TMP3:%.*]] = sub <4 x i32> [[TMP1]], [[TMP2]]687; CHECK-NEXT:    ret <4 x i32> [[TMP3]]688;689  %a0 = extractelement <4 x i32> %a, i32 0690  %a1 = extractelement <4 x i32> %a, i32 1691  %a2 = extractelement <4 x i32> %a, i32 2692  %a3 = extractelement <4 x i32> %a, i32 3693  %a01 = sub i32 %a0, %a1694  %a23 = sub i32 %a2, %a3695  %b0 = extractelement <4 x i32> %b, i32 0696  %b1 = extractelement <4 x i32> %b, i32 1697  %b2 = extractelement <4 x i32> %b, i32 2698  %b3 = extractelement <4 x i32> %b, i32 3699  %b01 = sub i32 %b0, %b1700  %b23 = sub i32 %b2, %b3701  %hsub0 = insertelement <4 x i32> poison, i32 %a01, i32 0702  %hsub1 = insertelement <4 x i32> %hsub0, i32 %a23, i32 1703  %hsub2 = insertelement <4 x i32> %hsub1, i32 %b01, i32 2704  %hsub3 = insertelement <4 x i32> %hsub2, i32 %b23, i32 3705  %result = shufflevector <4 x i32> %hsub3, <4 x i32> %a, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>706  ret <4 x i32> %result707}708 709define <4 x i32> @sub_v4i32_32u0(<4 x i32> %a, <4 x i32> %b) {710; SSE2-LABEL: @sub_v4i32_32u0(711; SSE2-NEXT:    [[TMP1:%.*]] = shufflevector <4 x i32> [[B:%.*]], <4 x i32> [[A:%.*]], <4 x i32> <i32 2, i32 0, i32 poison, i32 4>712; SSE2-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> [[A]], <4 x i32> <i32 3, i32 1, i32 poison, i32 5>713; SSE2-NEXT:    [[RESULT1:%.*]] = sub <4 x i32> [[TMP1]], [[TMP2]]714; SSE2-NEXT:    ret <4 x i32> [[RESULT1]]715;716; SSE4-LABEL: @sub_v4i32_32u0(717; SSE4-NEXT:    [[TMP1:%.*]] = shufflevector <4 x i32> [[B:%.*]], <4 x i32> [[A:%.*]], <4 x i32> <i32 2, i32 0, i32 poison, i32 4>718; SSE4-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> [[A]], <4 x i32> <i32 3, i32 1, i32 poison, i32 5>719; SSE4-NEXT:    [[RESULT:%.*]] = sub <4 x i32> [[TMP1]], [[TMP2]]720; SSE4-NEXT:    ret <4 x i32> [[RESULT]]721;722; AVX2-LABEL: @sub_v4i32_32u0(723; AVX2-NEXT:    [[TMP1:%.*]] = shufflevector <4 x i32> [[B:%.*]], <4 x i32> [[A:%.*]], <4 x i32> <i32 2, i32 0, i32 poison, i32 4>724; AVX2-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> [[A]], <4 x i32> <i32 3, i32 1, i32 poison, i32 5>725; AVX2-NEXT:    [[RESULT:%.*]] = sub <4 x i32> [[TMP1]], [[TMP2]]726; AVX2-NEXT:    ret <4 x i32> [[RESULT]]727;728; AVX512-LABEL: @sub_v4i32_32u0(729; AVX512-NEXT:    [[TMP1:%.*]] = shufflevector <4 x i32> [[B:%.*]], <4 x i32> [[A:%.*]], <4 x i32> <i32 2, i32 0, i32 poison, i32 4>730; AVX512-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> [[A]], <4 x i32> <i32 3, i32 1, i32 poison, i32 5>731; AVX512-NEXT:    [[RESULT1:%.*]] = sub <4 x i32> [[TMP1]], [[TMP2]]732; AVX512-NEXT:    ret <4 x i32> [[RESULT1]]733;734  %a0 = extractelement <4 x i32> %a, i32 0735  %a1 = extractelement <4 x i32> %a, i32 1736  %a2 = extractelement <4 x i32> %a, i32 2737  %a3 = extractelement <4 x i32> %a, i32 3738  %a01 = sub i32 %a0, %a1739  %a23 = sub i32 %a2, %a3740  %b0 = extractelement <4 x i32> %b, i32 0741  %b1 = extractelement <4 x i32> %b, i32 1742  %b2 = extractelement <4 x i32> %b, i32 2743  %b3 = extractelement <4 x i32> %b, i32 3744  %b01 = sub i32 %b0, %b1745  %b23 = sub i32 %b2, %b3746  %hsub0 = insertelement <4 x i32> poison, i32 %a01, i32 0747  %hsub1 = insertelement <4 x i32> %hsub0, i32 %a23, i32 1748  %hsub2 = insertelement <4 x i32> %hsub1, i32 %b01, i32 2749  %hsub3 = insertelement <4 x i32> %hsub2, i32 %b23, i32 3750  %result = shufflevector <4 x i32> %hsub3, <4 x i32> %a, <4 x i32> <i32 3, i32 2, i32 poison, i32 0>751  ret <4 x i32> %result752}753 754;755; v8i32756;757 758define <8 x i32> @sub_v8i32_01234567(<8 x i32> %a, <8 x i32> %b) {759; CHECK-LABEL: @sub_v8i32_01234567(760; 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>761; 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>762; CHECK-NEXT:    [[TMP3:%.*]] = sub <8 x i32> [[TMP1]], [[TMP2]]763; CHECK-NEXT:    ret <8 x i32> [[TMP3]]764;765  %a0 = extractelement <8 x i32> %a, i32 0766  %a1 = extractelement <8 x i32> %a, i32 1767  %a2 = extractelement <8 x i32> %a, i32 2768  %a3 = extractelement <8 x i32> %a, i32 3769  %a4 = extractelement <8 x i32> %a, i32 4770  %a5 = extractelement <8 x i32> %a, i32 5771  %a6 = extractelement <8 x i32> %a, i32 6772  %a7 = extractelement <8 x i32> %a, i32 7773  %a01 = sub i32 %a0, %a1774  %a23 = sub i32 %a2, %a3775  %a45 = sub i32 %a4, %a5776  %a67 = sub i32 %a6, %a7777  %b0 = extractelement <8 x i32> %b, i32 0778  %b1 = extractelement <8 x i32> %b, i32 1779  %b2 = extractelement <8 x i32> %b, i32 2780  %b3 = extractelement <8 x i32> %b, i32 3781  %b4 = extractelement <8 x i32> %b, i32 4782  %b5 = extractelement <8 x i32> %b, i32 5783  %b6 = extractelement <8 x i32> %b, i32 6784  %b7 = extractelement <8 x i32> %b, i32 7785  %b01 = sub i32 %b0, %b1786  %b23 = sub i32 %b2, %b3787  %b45 = sub i32 %b4, %b5788  %b67 = sub i32 %b6, %b7789  %hsub0 = insertelement <8 x i32> poison, i32 %a01, i32 0790  %hsub1 = insertelement <8 x i32> %hsub0, i32 %a23, i32 1791  %hsub2 = insertelement <8 x i32> %hsub1, i32 %b01, i32 2792  %hsub3 = insertelement <8 x i32> %hsub2, i32 %b23, i32 3793  %hsub4 = insertelement <8 x i32> %hsub3, i32 %a45, i32 4794  %hsub5 = insertelement <8 x i32> %hsub4, i32 %a67, i32 5795  %hsub6 = insertelement <8 x i32> %hsub5, i32 %b45, i32 6796  %hsub7 = insertelement <8 x i32> %hsub6, i32 %b67, i32 7797  %result = shufflevector <8 x i32> %hsub7, <8 x i32> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>798  ret <8 x i32> %result799}800 801define <8 x i32> @sub_v8i32_01234u67(<8 x i32> %a, <8 x i32> %b) {802; CHECK-LABEL: @sub_v8i32_01234u67(803; 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 12, i32 14>804; 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 13, i32 15>805; CHECK-NEXT:    [[RESULT:%.*]] = sub <8 x i32> [[TMP1]], [[TMP2]]806; CHECK-NEXT:    ret <8 x i32> [[RESULT]]807;808  %a0 = extractelement <8 x i32> %a, i32 0809  %a1 = extractelement <8 x i32> %a, i32 1810  %a2 = extractelement <8 x i32> %a, i32 2811  %a3 = extractelement <8 x i32> %a, i32 3812  %a4 = extractelement <8 x i32> %a, i32 4813  %a5 = extractelement <8 x i32> %a, i32 5814  %a6 = extractelement <8 x i32> %a, i32 6815  %a7 = extractelement <8 x i32> %a, i32 7816  %a01 = sub i32 %a0, %a1817  %a23 = sub i32 %a2, %a3818  %a45 = sub i32 %a4, %a5819  %a67 = sub i32 %a6, %a7820  %b0 = extractelement <8 x i32> %b, i32 0821  %b1 = extractelement <8 x i32> %b, i32 1822  %b2 = extractelement <8 x i32> %b, i32 2823  %b3 = extractelement <8 x i32> %b, i32 3824  %b4 = extractelement <8 x i32> %b, i32 4825  %b5 = extractelement <8 x i32> %b, i32 5826  %b6 = extractelement <8 x i32> %b, i32 6827  %b7 = extractelement <8 x i32> %b, i32 7828  %b01 = sub i32 %b0, %b1829  %b23 = sub i32 %b2, %b3830  %b45 = sub i32 %b4, %b5831  %b67 = sub i32 %b6, %b7832  %hsub0 = insertelement <8 x i32> poison, i32 %a01, i32 0833  %hsub1 = insertelement <8 x i32> %hsub0, i32 %a23, i32 1834  %hsub2 = insertelement <8 x i32> %hsub1, i32 %b01, i32 2835  %hsub3 = insertelement <8 x i32> %hsub2, i32 %b23, i32 3836  %hsub4 = insertelement <8 x i32> %hsub3, i32 %a45, i32 4837  %hsub5 = insertelement <8 x i32> %hsub4, i32 %a67, i32 5838  %hsub6 = insertelement <8 x i32> %hsub5, i32 %b45, i32 6839  %hsub7 = insertelement <8 x i32> %hsub6, i32 %b67, i32 7840  %result = shufflevector <8 x i32> %hsub7, <8 x i32> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 poison, i32 6, i32 7>841  ret <8 x i32> %result842}843 844;845; v4f32846;847 848define <4 x float> @sub_v4f32_0123(<4 x float> %a, <4 x float> %b) {849; CHECK-LABEL: @sub_v4f32_0123(850; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 4, i32 6>851; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[B]], <4 x i32> <i32 1, i32 3, i32 5, i32 7>852; CHECK-NEXT:    [[TMP3:%.*]] = fsub <4 x float> [[TMP1]], [[TMP2]]853; CHECK-NEXT:    ret <4 x float> [[TMP3]]854;855  %a0 = extractelement <4 x float> %a, i32 0856  %a1 = extractelement <4 x float> %a, i32 1857  %a2 = extractelement <4 x float> %a, i32 2858  %a3 = extractelement <4 x float> %a, i32 3859  %a01 = fsub float %a0, %a1860  %a23 = fsub float %a2, %a3861  %b0 = extractelement <4 x float> %b, i32 0862  %b1 = extractelement <4 x float> %b, i32 1863  %b2 = extractelement <4 x float> %b, i32 2864  %b3 = extractelement <4 x float> %b, i32 3865  %b01 = fsub float %b0, %b1866  %b23 = fsub float %b2, %b3867  %hsub0 = insertelement <4 x float> poison, float %a01, i32 0868  %hsub1 = insertelement <4 x float> %hsub0, float %a23, i32 1869  %hsub2 = insertelement <4 x float> %hsub1, float %b01, i32 2870  %hsub3 = insertelement <4 x float> %hsub2, float %b23, i32 3871  %result = shufflevector <4 x float> %hsub3, <4 x float> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 3>872  ret <4 x float> %result873}874 875define <4 x float> @sub_v4f32_u123(<4 x float> %a, <4 x float> %b) {876; CHECK-LABEL: @sub_v4f32_u123(877; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x i32> <i32 poison, i32 2, i32 4, i32 6>878; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[B]], <4 x i32> <i32 poison, i32 3, i32 5, i32 7>879; CHECK-NEXT:    [[TMP4:%.*]] = fsub <4 x float> [[TMP2]], [[TMP3]]880; CHECK-NEXT:    ret <4 x float> [[TMP4]]881;882  %a0 = extractelement <4 x float> %a, i32 0883  %a1 = extractelement <4 x float> %a, i32 1884  %a2 = extractelement <4 x float> %a, i32 2885  %a3 = extractelement <4 x float> %a, i32 3886  %a01 = fsub float %a0, %a1887  %a23 = fsub float %a2, %a3888  %b0 = extractelement <4 x float> %b, i32 0889  %b1 = extractelement <4 x float> %b, i32 1890  %b2 = extractelement <4 x float> %b, i32 2891  %b3 = extractelement <4 x float> %b, i32 3892  %b01 = fsub float %b0, %b1893  %b23 = fsub float %b2, %b3894  %hsub0 = insertelement <4 x float> poison, float %a01, i32 0895  %hsub1 = insertelement <4 x float> %hsub0, float %a23, i32 1896  %hsub2 = insertelement <4 x float> %hsub1, float %b01, i32 2897  %hsub3 = insertelement <4 x float> %hsub2, float %b23, i32 3898  %result = shufflevector <4 x float> %hsub3, <4 x float> %a, <4 x i32> <i32 poison, i32 1, i32 2, i32 3>899  ret <4 x float> %result900}901 902define <4 x float> @sub_v4f32_0u23(<4 x float> %a, <4 x float> %b) {903; CHECK-LABEL: @sub_v4f32_0u23(904; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x i32> <i32 0, i32 poison, i32 4, i32 6>905; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[B]], <4 x i32> <i32 1, i32 poison, i32 5, i32 7>906; CHECK-NEXT:    [[TMP4:%.*]] = fsub <4 x float> [[TMP2]], [[TMP3]]907; CHECK-NEXT:    ret <4 x float> [[TMP4]]908;909  %a0 = extractelement <4 x float> %a, i32 0910  %a1 = extractelement <4 x float> %a, i32 1911  %a2 = extractelement <4 x float> %a, i32 2912  %a3 = extractelement <4 x float> %a, i32 3913  %a01 = fsub float %a0, %a1914  %a23 = fsub float %a2, %a3915  %b0 = extractelement <4 x float> %b, i32 0916  %b1 = extractelement <4 x float> %b, i32 1917  %b2 = extractelement <4 x float> %b, i32 2918  %b3 = extractelement <4 x float> %b, i32 3919  %b01 = fsub float %b0, %b1920  %b23 = fsub float %b2, %b3921  %hsub0 = insertelement <4 x float> poison, float %a01, i32 0922  %hsub1 = insertelement <4 x float> %hsub0, float %a23, i32 1923  %hsub2 = insertelement <4 x float> %hsub1, float %b01, i32 2924  %hsub3 = insertelement <4 x float> %hsub2, float %b23, i32 3925  %result = shufflevector <4 x float> %hsub3, <4 x float> %a, <4 x i32> <i32 0, i32 poison, i32 2, i32 3>926  ret <4 x float> %result927}928 929define <4 x float> @sub_v4f32_01u3(<4 x float> %a, <4 x float> %b) {930; CHECK-LABEL: @sub_v4f32_01u3(931; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 poison, i32 6>932; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[B]], <4 x i32> <i32 1, i32 3, i32 poison, i32 7>933; CHECK-NEXT:    [[RESULT1:%.*]] = fsub <4 x float> [[TMP1]], [[TMP2]]934; CHECK-NEXT:    ret <4 x float> [[RESULT1]]935;936  %a0 = extractelement <4 x float> %a, i32 0937  %a1 = extractelement <4 x float> %a, i32 1938  %a2 = extractelement <4 x float> %a, i32 2939  %a3 = extractelement <4 x float> %a, i32 3940  %a01 = fsub float %a0, %a1941  %a23 = fsub float %a2, %a3942  %b0 = extractelement <4 x float> %b, i32 0943  %b1 = extractelement <4 x float> %b, i32 1944  %b2 = extractelement <4 x float> %b, i32 2945  %b3 = extractelement <4 x float> %b, i32 3946  %b01 = fsub float %b0, %b1947  %b23 = fsub float %b2, %b3948  %hsub0 = insertelement <4 x float> poison, float %a01, i32 0949  %hsub1 = insertelement <4 x float> %hsub0, float %a23, i32 1950  %hsub2 = insertelement <4 x float> %hsub1, float %b01, i32 2951  %hsub3 = insertelement <4 x float> %hsub2, float %b23, i32 3952  %result = shufflevector <4 x float> %hsub3, <4 x float> %a, <4 x i32> <i32 0, i32 1, i32 poison, i32 3>953  ret <4 x float> %result954}955 956define <4 x float> @sub_v4f32_012u(<4 x float> %a, <4 x float> %b) {957; SSE2-LABEL: @sub_v4f32_012u(958; SSE2-NEXT:    [[TMP1:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 4, i32 poison>959; SSE2-NEXT:    [[TMP2:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[B]], <4 x i32> <i32 1, i32 3, i32 5, i32 poison>960; SSE2-NEXT:    [[RESULT1:%.*]] = fsub <4 x float> [[TMP1]], [[TMP2]]961; SSE2-NEXT:    ret <4 x float> [[RESULT1]]962;963; SSE4-LABEL: @sub_v4f32_012u(964; SSE4-NEXT:    [[TMP2:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 4, i32 poison>965; SSE4-NEXT:    [[TMP3:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[B]], <4 x i32> <i32 1, i32 3, i32 5, i32 poison>966; SSE4-NEXT:    [[TMP4:%.*]] = fsub <4 x float> [[TMP2]], [[TMP3]]967; SSE4-NEXT:    ret <4 x float> [[TMP4]]968;969; AVX2-LABEL: @sub_v4f32_012u(970; AVX2-NEXT:    [[TMP2:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 4, i32 poison>971; AVX2-NEXT:    [[TMP3:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[B]], <4 x i32> <i32 1, i32 3, i32 5, i32 poison>972; AVX2-NEXT:    [[TMP4:%.*]] = fsub <4 x float> [[TMP2]], [[TMP3]]973; AVX2-NEXT:    ret <4 x float> [[TMP4]]974;975; AVX512-LABEL: @sub_v4f32_012u(976; AVX512-NEXT:    [[TMP1:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 4, i32 poison>977; AVX512-NEXT:    [[TMP2:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[B]], <4 x i32> <i32 1, i32 3, i32 5, i32 poison>978; AVX512-NEXT:    [[RESULT1:%.*]] = fsub <4 x float> [[TMP1]], [[TMP2]]979; AVX512-NEXT:    ret <4 x float> [[RESULT1]]980;981  %a0 = extractelement <4 x float> %a, i32 0982  %a1 = extractelement <4 x float> %a, i32 1983  %a2 = extractelement <4 x float> %a, i32 2984  %a3 = extractelement <4 x float> %a, i32 3985  %a01 = fsub float %a0, %a1986  %a23 = fsub float %a2, %a3987  %b0 = extractelement <4 x float> %b, i32 0988  %b1 = extractelement <4 x float> %b, i32 1989  %b2 = extractelement <4 x float> %b, i32 2990  %b3 = extractelement <4 x float> %b, i32 3991  %b01 = fsub float %b0, %b1992  %b23 = fsub float %b2, %b3993  %hsub0 = insertelement <4 x float> poison, float %a01, i32 0994  %hsub1 = insertelement <4 x float> %hsub0, float %a23, i32 1995  %hsub2 = insertelement <4 x float> %hsub1, float %b01, i32 2996  %hsub3 = insertelement <4 x float> %hsub2, float %b23, i32 3997  %result = shufflevector <4 x float> %hsub3, <4 x float> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>998  ret <4 x float> %result999}1000 1001define <4 x float> @sub_v4f32_uu23(<4 x float> %a, <4 x float> %b) {1002; CHECK-LABEL: @sub_v4f32_uu23(1003; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x float> [[B:%.*]], <4 x float> poison, <4 x i32> <i32 poison, i32 poison, i32 0, i32 2>1004; CHECK-NEXT:    [[RESULT1:%.*]] = shufflevector <4 x float> [[B]], <4 x float> poison, <4 x i32> <i32 poison, i32 poison, i32 1, i32 3>1005; CHECK-NEXT:    [[RESULT2:%.*]] = fsub <4 x float> [[TMP2]], [[RESULT1]]1006; CHECK-NEXT:    ret <4 x float> [[RESULT2]]1007;1008  %a0 = extractelement <4 x float> %a, i32 01009  %a1 = extractelement <4 x float> %a, i32 11010  %a2 = extractelement <4 x float> %a, i32 21011  %a3 = extractelement <4 x float> %a, i32 31012  %a01 = fsub float %a0, %a11013  %a23 = fsub float %a2, %a31014  %b0 = extractelement <4 x float> %b, i32 01015  %b1 = extractelement <4 x float> %b, i32 11016  %b2 = extractelement <4 x float> %b, i32 21017  %b3 = extractelement <4 x float> %b, i32 31018  %b01 = fsub float %b0, %b11019  %b23 = fsub float %b2, %b31020  %hsub0 = insertelement <4 x float> poison, float %a01, i32 01021  %hsub1 = insertelement <4 x float> %hsub0, float %a23, i32 11022  %hsub2 = insertelement <4 x float> %hsub1, float %b01, i32 21023  %hsub3 = insertelement <4 x float> %hsub2, float %b23, i32 31024  %result = shufflevector <4 x float> %hsub3, <4 x float> %a, <4 x i32> <i32 poison, i32 poison, i32 2, i32 3>1025  ret <4 x float> %result1026}1027 1028define <4 x float> @sub_v4f32_01uu(<4 x float> %a, <4 x float> %b) {1029; CHECK-LABEL: @sub_v4f32_01uu(1030; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> poison, <4 x i32> <i32 0, i32 2, i32 poison, i32 poison>1031; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <4 x float> [[A]], <4 x float> poison, <4 x i32> <i32 1, i32 3, i32 poison, i32 poison>1032; CHECK-NEXT:    [[TMP4:%.*]] = fsub <4 x float> [[TMP2]], [[TMP3]]1033; CHECK-NEXT:    ret <4 x float> [[TMP4]]1034;1035  %a0 = extractelement <4 x float> %a, i32 01036  %a1 = extractelement <4 x float> %a, i32 11037  %a2 = extractelement <4 x float> %a, i32 21038  %a3 = extractelement <4 x float> %a, i32 31039  %a01 = fsub float %a0, %a11040  %a23 = fsub float %a2, %a31041  %b0 = extractelement <4 x float> %b, i32 01042  %b1 = extractelement <4 x float> %b, i32 11043  %b2 = extractelement <4 x float> %b, i32 21044  %b3 = extractelement <4 x float> %b, i32 31045  %b01 = fsub float %b0, %b11046  %b23 = fsub float %b2, %b31047  %hsub0 = insertelement <4 x float> poison, float %a01, i32 01048  %hsub1 = insertelement <4 x float> %hsub0, float %a23, i32 11049  %hsub2 = insertelement <4 x float> %hsub1, float %b01, i32 21050  %hsub3 = insertelement <4 x float> %hsub2, float %b23, i32 31051  %result = shufflevector <4 x float> %hsub3, <4 x float> %a, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>1052  ret <4 x float> %result1053}1054 1055;1056; v8f321057;1058 1059define <8 x float> @sub_v8f32_01234567(<8 x float> %a, <8 x float> %b) {1060; CHECK-LABEL: @sub_v8f32_01234567(1061; 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>1062; 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>1063; CHECK-NEXT:    [[TMP3:%.*]] = fsub <8 x float> [[TMP1]], [[TMP2]]1064; CHECK-NEXT:    ret <8 x float> [[TMP3]]1065;1066  %a0 = extractelement <8 x float> %a, i32 01067  %a1 = extractelement <8 x float> %a, i32 11068  %a2 = extractelement <8 x float> %a, i32 21069  %a3 = extractelement <8 x float> %a, i32 31070  %a4 = extractelement <8 x float> %a, i32 41071  %a5 = extractelement <8 x float> %a, i32 51072  %a6 = extractelement <8 x float> %a, i32 61073  %a7 = extractelement <8 x float> %a, i32 71074  %a01 = fsub float %a0, %a11075  %a23 = fsub float %a2, %a31076  %a45 = fsub float %a4, %a51077  %a67 = fsub float %a6, %a71078  %b0 = extractelement <8 x float> %b, i32 01079  %b1 = extractelement <8 x float> %b, i32 11080  %b2 = extractelement <8 x float> %b, i32 21081  %b3 = extractelement <8 x float> %b, i32 31082  %b4 = extractelement <8 x float> %b, i32 41083  %b5 = extractelement <8 x float> %b, i32 51084  %b6 = extractelement <8 x float> %b, i32 61085  %b7 = extractelement <8 x float> %b, i32 71086  %b01 = fsub float %b0, %b11087  %b23 = fsub float %b2, %b31088  %b45 = fsub float %b4, %b51089  %b67 = fsub float %b6, %b71090  %hsub0 = insertelement <8 x float> poison, float %a01, i32 01091  %hsub1 = insertelement <8 x float> %hsub0, float %a23, i32 11092  %hsub2 = insertelement <8 x float> %hsub1, float %b01, i32 21093  %hsub3 = insertelement <8 x float> %hsub2, float %b23, i32 31094  %hsub4 = insertelement <8 x float> %hsub3, float %a45, i32 41095  %hsub5 = insertelement <8 x float> %hsub4, float %a67, i32 51096  %hsub6 = insertelement <8 x float> %hsub5, float %b45, i32 61097  %hsub7 = insertelement <8 x float> %hsub6, float %b67, i32 71098  %result = shufflevector <8 x float> %hsub7, <8 x float> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1099  ret <8 x float> %result1100}1101 1102define <8 x float> @sub_v8f32_012u4567(<8 x float> %a, <8 x float> %b) {1103; SSE2-LABEL: @sub_v8f32_012u4567(1104; SSE2-NEXT:    [[TMP1:%.*]] = shufflevector <8 x float> [[B:%.*]], <8 x float> poison, <2 x i32> <i32 4, i32 6>1105; SSE2-NEXT:    [[TMP2:%.*]] = shufflevector <8 x float> [[B]], <8 x float> poison, <2 x i32> <i32 5, i32 7>1106; SSE2-NEXT:    [[TMP3:%.*]] = fsub <2 x float> [[TMP1]], [[TMP2]]1107; 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>1108; 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>1109; SSE2-NEXT:    [[TMP6:%.*]] = fsub <8 x float> [[TMP5]], [[TMP8]]1110; 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>1111; 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>1112; SSE2-NEXT:    ret <8 x float> [[RESULT]]1113;1114; SSE4-LABEL: @sub_v8f32_012u4567(1115; 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 12, i32 14>1116; 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 13, i32 15>1117; SSE4-NEXT:    [[TMP9:%.*]] = fsub <8 x float> [[TMP8]], [[TMP5]]1118; SSE4-NEXT:    ret <8 x float> [[TMP9]]1119;1120; AVX-LABEL: @sub_v8f32_012u4567(1121; 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 12, i32 14>1122; 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 13, i32 15>1123; AVX-NEXT:    [[TMP7:%.*]] = fsub <8 x float> [[TMP5]], [[TMP6]]1124; AVX-NEXT:    ret <8 x float> [[TMP7]]1125;1126  %a0 = extractelement <8 x float> %a, i32 01127  %a1 = extractelement <8 x float> %a, i32 11128  %a2 = extractelement <8 x float> %a, i32 21129  %a3 = extractelement <8 x float> %a, i32 31130  %a4 = extractelement <8 x float> %a, i32 41131  %a5 = extractelement <8 x float> %a, i32 51132  %a6 = extractelement <8 x float> %a, i32 61133  %a7 = extractelement <8 x float> %a, i32 71134  %a01 = fsub float %a0, %a11135  %a23 = fsub float %a2, %a31136  %a45 = fsub float %a4, %a51137  %a67 = fsub float %a6, %a71138  %b0 = extractelement <8 x float> %b, i32 01139  %b1 = extractelement <8 x float> %b, i32 11140  %b2 = extractelement <8 x float> %b, i32 21141  %b3 = extractelement <8 x float> %b, i32 31142  %b4 = extractelement <8 x float> %b, i32 41143  %b5 = extractelement <8 x float> %b, i32 51144  %b6 = extractelement <8 x float> %b, i32 61145  %b7 = extractelement <8 x float> %b, i32 71146  %b01 = fsub float %b0, %b11147  %b23 = fsub float %b2, %b31148  %b45 = fsub float %b4, %b51149  %b67 = fsub float %b6, %b71150  %hsub0 = insertelement <8 x float> poison, float %a01, i32 01151  %hsub1 = insertelement <8 x float> %hsub0, float %a23, i32 11152  %hsub2 = insertelement <8 x float> %hsub1, float %b01, i32 21153  %hsub3 = insertelement <8 x float> %hsub2, float %b23, i32 31154  %hsub4 = insertelement <8 x float> %hsub3, float %a45, i32 41155  %hsub5 = insertelement <8 x float> %hsub4, float %a67, i32 51156  %hsub6 = insertelement <8 x float> %hsub5, float %b45, i32 61157  %hsub7 = insertelement <8 x float> %hsub6, float %b67, i32 71158  %result = shufflevector <8 x float> %hsub7, <8 x float> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 poison, i32 4, i32 5, i32 6, i32 7>1159  ret <8 x float> %result1160}1161 1162define <8 x float> @sub_v8f32_76u43210(<8 x float> %a, <8 x float> %b) {1163; SSE2-LABEL: @sub_v8f32_76u43210(1164; SSE2-NEXT:    [[TMP1:%.*]] = shufflevector <8 x float> [[A:%.*]], <8 x float> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>1165; SSE2-NEXT:    [[TMP2:%.*]] = shufflevector <8 x float> [[A]], <8 x float> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>1166; SSE2-NEXT:    [[TMP3:%.*]] = fsub <4 x float> [[TMP1]], [[TMP2]]1167; SSE2-NEXT:    [[B0:%.*]] = extractelement <8 x float> [[B:%.*]], i64 01168; SSE2-NEXT:    [[B1:%.*]] = extractelement <8 x float> [[B]], i64 11169; SSE2-NEXT:    [[B01:%.*]] = fsub float [[B0]], [[B1]]1170; SSE2-NEXT:    [[TMP4:%.*]] = shufflevector <8 x float> [[B]], <8 x float> poison, <2 x i32> <i32 4, i32 6>1171; SSE2-NEXT:    [[TMP5:%.*]] = shufflevector <8 x float> [[B]], <8 x float> poison, <2 x i32> <i32 5, i32 7>1172; SSE2-NEXT:    [[TMP6:%.*]] = fsub <2 x float> [[TMP4]], [[TMP5]]1173; 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>1174; SSE2-NEXT:    [[HSUB4:%.*]] = insertelement <8 x float> [[TMP7]], float [[B01]], i64 41175; 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>1176; SSE2-NEXT:    [[RESULT:%.*]] = shufflevector <8 x float> [[TMP8]], <8 x float> [[HSUB4]], <8 x i32> <i32 1, i32 0, i32 poison, i32 12, i32 11, i32 10, i32 9, i32 8>1177; SSE2-NEXT:    ret <8 x float> [[RESULT]]1178;1179; SSE4-LABEL: @sub_v8f32_76u43210(1180; SSE4-NEXT:    [[TMP4:%.*]] = shufflevector <8 x float> [[B:%.*]], <8 x float> [[A:%.*]], <8 x i32> <i32 6, i32 4, i32 poison, i32 0, i32 14, i32 12, i32 10, i32 8>1181; SSE4-NEXT:    [[TMP5:%.*]] = shufflevector <8 x float> [[B]], <8 x float> [[A]], <8 x i32> <i32 7, i32 5, i32 poison, i32 1, i32 15, i32 13, i32 11, i32 9>1182; SSE4-NEXT:    [[TMP6:%.*]] = fsub <8 x float> [[TMP4]], [[TMP5]]1183; SSE4-NEXT:    ret <8 x float> [[TMP6]]1184;1185; AVX-LABEL: @sub_v8f32_76u43210(1186; AVX-NEXT:    [[TMP1:%.*]] = shufflevector <8 x float> [[B:%.*]], <8 x float> [[A:%.*]], <8 x i32> <i32 6, i32 4, i32 poison, i32 0, i32 14, i32 12, i32 10, i32 8>1187; AVX-NEXT:    [[TMP2:%.*]] = shufflevector <8 x float> [[B]], <8 x float> [[A]], <8 x i32> <i32 7, i32 5, i32 poison, i32 1, i32 15, i32 13, i32 11, i32 9>1188; AVX-NEXT:    [[RESULT:%.*]] = fsub <8 x float> [[TMP1]], [[TMP2]]1189; AVX-NEXT:    ret <8 x float> [[RESULT]]1190;1191  %a0 = extractelement <8 x float> %a, i32 01192  %a1 = extractelement <8 x float> %a, i32 11193  %a2 = extractelement <8 x float> %a, i32 21194  %a3 = extractelement <8 x float> %a, i32 31195  %a4 = extractelement <8 x float> %a, i32 41196  %a5 = extractelement <8 x float> %a, i32 51197  %a6 = extractelement <8 x float> %a, i32 61198  %a7 = extractelement <8 x float> %a, i32 71199  %a01 = fsub float %a0, %a11200  %a23 = fsub float %a2, %a31201  %a45 = fsub float %a4, %a51202  %a67 = fsub float %a6, %a71203  %b0 = extractelement <8 x float> %b, i32 01204  %b1 = extractelement <8 x float> %b, i32 11205  %b2 = extractelement <8 x float> %b, i32 21206  %b3 = extractelement <8 x float> %b, i32 31207  %b4 = extractelement <8 x float> %b, i32 41208  %b5 = extractelement <8 x float> %b, i32 51209  %b6 = extractelement <8 x float> %b, i32 61210  %b7 = extractelement <8 x float> %b, i32 71211  %b01 = fsub float %b0, %b11212  %b23 = fsub float %b2, %b31213  %b45 = fsub float %b4, %b51214  %b67 = fsub float %b6, %b71215  %hsub0 = insertelement <8 x float> poison, float %a01, i32 01216  %hsub1 = insertelement <8 x float> %hsub0, float %a23, i32 11217  %hsub2 = insertelement <8 x float> %hsub1, float %a45, i32 21218  %hsub3 = insertelement <8 x float> %hsub2, float %a67, i32 31219  %hsub4 = insertelement <8 x float> %hsub3, float %b01, i32 41220  %hsub5 = insertelement <8 x float> %hsub4, float %b23, i32 51221  %hsub6 = insertelement <8 x float> %hsub5, float %b45, i32 61222  %hsub7 = insertelement <8 x float> %hsub6, float %b67, i32 71223  %result = shufflevector <8 x float> %hsub7, <8 x float> %a, <8 x i32> <i32 7, i32 6, i32 poison, i32 4, i32 3, i32 2, i32 1, i32 0>1224  ret <8 x float> %result1225}1226 1227;1228; v2f641229;1230 1231define <2 x double> @sub_v2f64_01(<2 x double> %a, <2 x double> %b) {1232; CHECK-LABEL: @sub_v2f64_01(1233; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <2 x double> [[A:%.*]], <2 x double> [[B:%.*]], <2 x i32> <i32 0, i32 2>1234; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <2 x double> [[A]], <2 x double> [[B]], <2 x i32> <i32 1, i32 3>1235; CHECK-NEXT:    [[TMP3:%.*]] = fsub <2 x double> [[TMP1]], [[TMP2]]1236; CHECK-NEXT:    ret <2 x double> [[TMP3]]1237;1238  %a0 = extractelement <2 x double> %a, i32 01239  %a1 = extractelement <2 x double> %a, i32 11240  %a01 = fsub double %a0, %a11241  %b0 = extractelement <2 x double> %b, i32 01242  %b1 = extractelement <2 x double> %b, i32 11243  %b01 = fsub double %b0, %b11244  %hsub0 = insertelement <2 x double> poison, double %a01, i32 01245  %hsub1 = insertelement <2 x double> %hsub0, double %b01, i32 11246  %result = shufflevector <2 x double> %hsub1, <2 x double> %a, <2 x i32> <i32 0, i32 1>1247  ret <2 x double> %result1248}1249 1250define <2 x double> @sub_v2f64_u1(<2 x double> %a, <2 x double> %b) {1251; CHECK-LABEL: @sub_v2f64_u1(1252; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <2 x double> [[B:%.*]], <2 x double> poison, <2 x i32> <i32 poison, i32 0>1253; CHECK-NEXT:    [[RESULT1:%.*]] = fsub <2 x double> [[TMP1]], [[B]]1254; CHECK-NEXT:    ret <2 x double> [[RESULT1]]1255;1256  %a0 = extractelement <2 x double> %a, i32 01257  %a1 = extractelement <2 x double> %a, i32 11258  %a01 = fsub double %a0, %a11259  %b0 = extractelement <2 x double> %b, i32 01260  %b1 = extractelement <2 x double> %b, i32 11261  %b01 = fsub double %b0, %b11262  %hsub0 = insertelement <2 x double> poison, double %a01, i32 01263  %hsub1 = insertelement <2 x double> %hsub0, double %b01, i32 11264  %result = shufflevector <2 x double> %hsub1, <2 x double> %a, <2 x i32> <i32 poison, i32 1>1265  ret <2 x double> %result1266}1267 1268define <2 x double> @sub_v2f64_0u(<2 x double> %a, <2 x double> %b) {1269; CHECK-LABEL: @sub_v2f64_0u(1270; CHECK-NEXT:    [[RESULT:%.*]] = shufflevector <2 x double> [[TMP1:%.*]], <2 x double> poison, <2 x i32> <i32 1, i32 poison>1271; CHECK-NEXT:    [[RESULT1:%.*]] = fsub <2 x double> [[TMP1]], [[RESULT]]1272; CHECK-NEXT:    ret <2 x double> [[RESULT1]]1273;1274  %a0 = extractelement <2 x double> %a, i32 01275  %a1 = extractelement <2 x double> %a, i32 11276  %a01 = fsub double %a0, %a11277  %b0 = extractelement <2 x double> %b, i32 01278  %b1 = extractelement <2 x double> %b, i32 11279  %b01 = fsub double %b0, %b11280  %hsub0 = insertelement <2 x double> poison, double %a01, i32 01281  %hsub1 = insertelement <2 x double> %hsub0, double %b01, i32 11282  %result = shufflevector <2 x double> %hsub1, <2 x double> %a, <2 x i32> <i32 0, i32 poison>1283  ret <2 x double> %result1284}1285 1286;1287; v4f641288;1289 1290define <4 x double> @sub_v4f64_0123(<4 x double> %a, <4 x double> %b) {1291; CHECK-LABEL: @sub_v4f64_0123(1292; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 2, i32 6>1293; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 5, i32 3, i32 7>1294; CHECK-NEXT:    [[TMP3:%.*]] = fsub <4 x double> [[TMP1]], [[TMP2]]1295; CHECK-NEXT:    ret <4 x double> [[TMP3]]1296;1297  %a0 = extractelement <4 x double> %a, i32 01298  %a1 = extractelement <4 x double> %a, i32 11299  %a2 = extractelement <4 x double> %a, i32 21300  %a3 = extractelement <4 x double> %a, i32 31301  %a01 = fsub double %a0, %a11302  %a23 = fsub double %a2, %a31303  %b0 = extractelement <4 x double> %b, i32 01304  %b1 = extractelement <4 x double> %b, i32 11305  %b2 = extractelement <4 x double> %b, i32 21306  %b3 = extractelement <4 x double> %b, i32 31307  %b01 = fsub double %b0, %b11308  %b23 = fsub double %b2, %b31309  %hsub0 = insertelement <4 x double> poison, double %a01, i32 01310  %hsub1 = insertelement <4 x double> %hsub0, double %b01, i32 11311  %hsub2 = insertelement <4 x double> %hsub1, double %a23, i32 21312  %hsub3 = insertelement <4 x double> %hsub2, double %b23, i32 31313  %result = shufflevector <4 x double> %hsub3, <4 x double> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1314  ret <4 x double> %result1315}1316 1317define <4 x double> @sub_v4f64_u123(<4 x double> %a, <4 x double> %b) {1318; SSE2-LABEL: @sub_v4f64_u123(1319; SSE2-NEXT:    [[B2:%.*]] = extractelement <4 x double> [[B:%.*]], i64 21320; SSE2-NEXT:    [[B3:%.*]] = extractelement <4 x double> [[B]], i64 31321; SSE2-NEXT:    [[TMP1:%.*]] = shufflevector <4 x double> [[B]], <4 x double> [[A:%.*]], <2 x i32> <i32 0, i32 6>1322; SSE2-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[B]], <4 x double> [[A]], <2 x i32> <i32 1, i32 7>1323; SSE2-NEXT:    [[TMP3:%.*]] = fsub <2 x double> [[TMP1]], [[TMP2]]1324; SSE2-NEXT:    [[B23:%.*]] = fsub double [[B2]], [[B3]]1325; SSE2-NEXT:    [[TMP4:%.*]] = shufflevector <2 x double> [[TMP3]], <2 x double> poison, <4 x i32> <i32 poison, i32 0, i32 1, i32 poison>1326; SSE2-NEXT:    [[RESULT:%.*]] = insertelement <4 x double> [[TMP4]], double [[B23]], i64 31327; SSE2-NEXT:    ret <4 x double> [[RESULT]]1328;1329; SSE4-LABEL: @sub_v4f64_u123(1330; SSE4-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[B:%.*]], <4 x double> [[A:%.*]], <4 x i32> <i32 poison, i32 0, i32 6, i32 2>1331; SSE4-NEXT:    [[TMP4:%.*]] = shufflevector <4 x double> [[B]], <4 x double> [[A]], <4 x i32> <i32 poison, i32 1, i32 7, i32 3>1332; SSE4-NEXT:    [[TMP3:%.*]] = fsub <4 x double> [[TMP2]], [[TMP4]]1333; SSE4-NEXT:    ret <4 x double> [[TMP3]]1334;1335; AVX-LABEL: @sub_v4f64_u123(1336; AVX-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[B:%.*]], <4 x double> [[A:%.*]], <4 x i32> <i32 poison, i32 0, i32 6, i32 2>1337; AVX-NEXT:    [[TMP3:%.*]] = shufflevector <4 x double> [[B]], <4 x double> [[A]], <4 x i32> <i32 poison, i32 1, i32 7, i32 3>1338; AVX-NEXT:    [[TMP4:%.*]] = fsub <4 x double> [[TMP2]], [[TMP3]]1339; AVX-NEXT:    ret <4 x double> [[TMP4]]1340;1341  %a0 = extractelement <4 x double> %a, i32 01342  %a1 = extractelement <4 x double> %a, i32 11343  %a2 = extractelement <4 x double> %a, i32 21344  %a3 = extractelement <4 x double> %a, i32 31345  %a01 = fsub double %a0, %a11346  %a23 = fsub double %a2, %a31347  %b0 = extractelement <4 x double> %b, i32 01348  %b1 = extractelement <4 x double> %b, i32 11349  %b2 = extractelement <4 x double> %b, i32 21350  %b3 = extractelement <4 x double> %b, i32 31351  %b01 = fsub double %b0, %b11352  %b23 = fsub double %b2, %b31353  %hsub0 = insertelement <4 x double> poison, double %a01, i32 01354  %hsub1 = insertelement <4 x double> %hsub0, double %b01, i32 11355  %hsub2 = insertelement <4 x double> %hsub1, double %a23, i32 21356  %hsub3 = insertelement <4 x double> %hsub2, double %b23, i32 31357  %result = shufflevector <4 x double> %hsub3, <4 x double> %a, <4 x i32> <i32 poison, i32 1, i32 2, i32 3>1358  ret <4 x double> %result1359}1360 1361define <4 x double> @sub_v4f64_0u23(<4 x double> %a, <4 x double> %b) {1362; SSE2-LABEL: @sub_v4f64_0u23(1363; SSE2-NEXT:    [[TMP1:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> poison, <2 x i32> <i32 0, i32 2>1364; SSE2-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> poison, <2 x i32> <i32 1, i32 3>1365; SSE2-NEXT:    [[TMP3:%.*]] = fsub <2 x double> [[TMP1]], [[TMP2]]1366; SSE2-NEXT:    [[B2:%.*]] = extractelement <4 x double> [[B:%.*]], i64 21367; SSE2-NEXT:    [[B3:%.*]] = extractelement <4 x double> [[B]], i64 31368; SSE2-NEXT:    [[B23:%.*]] = fsub double [[B2]], [[B3]]1369; SSE2-NEXT:    [[TMP4:%.*]] = shufflevector <2 x double> [[TMP3]], <2 x double> poison, <4 x i32> <i32 0, i32 poison, i32 1, i32 poison>1370; SSE2-NEXT:    [[RESULT:%.*]] = insertelement <4 x double> [[TMP4]], double [[B23]], i64 31371; SSE2-NEXT:    ret <4 x double> [[RESULT]]1372;1373; SSE4-LABEL: @sub_v4f64_0u23(1374; SSE4-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 1, i32 2, i32 6>1375; SSE4-NEXT:    [[TMP3:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 poison, i32 3, i32 7>1376; SSE4-NEXT:    [[TMP4:%.*]] = fsub <4 x double> [[TMP2]], [[TMP3]]1377; SSE4-NEXT:    ret <4 x double> [[TMP4]]1378;1379; AVX-LABEL: @sub_v4f64_0u23(1380; AVX-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 1, i32 2, i32 6>1381; AVX-NEXT:    [[TMP3:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 poison, i32 3, i32 7>1382; AVX-NEXT:    [[TMP4:%.*]] = fsub <4 x double> [[TMP2]], [[TMP3]]1383; AVX-NEXT:    ret <4 x double> [[TMP4]]1384;1385  %a0 = extractelement <4 x double> %a, i32 01386  %a1 = extractelement <4 x double> %a, i32 11387  %a2 = extractelement <4 x double> %a, i32 21388  %a3 = extractelement <4 x double> %a, i32 31389  %a01 = fsub double %a0, %a11390  %a23 = fsub double %a2, %a31391  %b0 = extractelement <4 x double> %b, i32 01392  %b1 = extractelement <4 x double> %b, i32 11393  %b2 = extractelement <4 x double> %b, i32 21394  %b3 = extractelement <4 x double> %b, i32 31395  %b01 = fsub double %b0, %b11396  %b23 = fsub double %b2, %b31397  %hsub0 = insertelement <4 x double> poison, double %a01, i32 01398  %hsub1 = insertelement <4 x double> %hsub0, double %b01, i32 11399  %hsub2 = insertelement <4 x double> %hsub1, double %a23, i32 21400  %hsub3 = insertelement <4 x double> %hsub2, double %b23, i32 31401  %result = shufflevector <4 x double> %hsub3, <4 x double> %a, <4 x i32> <i32 0, i32 poison, i32 2, i32 3>1402  ret <4 x double> %result1403}1404 1405define <4 x double> @sub_v4f64_01u3(<4 x double> %a, <4 x double> %b) {1406; SSE2-LABEL: @sub_v4f64_01u3(1407; SSE2-NEXT:    [[B2:%.*]] = extractelement <4 x double> [[B:%.*]], i64 21408; SSE2-NEXT:    [[B3:%.*]] = extractelement <4 x double> [[B]], i64 31409; SSE2-NEXT:    [[TMP1:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B]], <2 x i32> <i32 0, i32 4>1410; SSE2-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <2 x i32> <i32 1, i32 5>1411; SSE2-NEXT:    [[TMP3:%.*]] = fsub <2 x double> [[TMP1]], [[TMP2]]1412; SSE2-NEXT:    [[B23:%.*]] = fsub double [[B2]], [[B3]]1413; SSE2-NEXT:    [[TMP4:%.*]] = shufflevector <2 x double> [[TMP3]], <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>1414; SSE2-NEXT:    [[RESULT:%.*]] = insertelement <4 x double> [[TMP4]], double [[B23]], i64 31415; SSE2-NEXT:    ret <4 x double> [[RESULT]]1416;1417; SSE4-LABEL: @sub_v4f64_01u3(1418; SSE4-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 poison, i32 6>1419; SSE4-NEXT:    [[TMP4:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 5, i32 poison, i32 7>1420; SSE4-NEXT:    [[TMP3:%.*]] = fsub <4 x double> [[TMP2]], [[TMP4]]1421; SSE4-NEXT:    ret <4 x double> [[TMP3]]1422;1423; AVX-LABEL: @sub_v4f64_01u3(1424; AVX-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 poison, i32 6>1425; AVX-NEXT:    [[TMP3:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 5, i32 poison, i32 7>1426; AVX-NEXT:    [[TMP4:%.*]] = fsub <4 x double> [[TMP2]], [[TMP3]]1427; AVX-NEXT:    ret <4 x double> [[TMP4]]1428;1429  %a0 = extractelement <4 x double> %a, i32 01430  %a1 = extractelement <4 x double> %a, i32 11431  %a2 = extractelement <4 x double> %a, i32 21432  %a3 = extractelement <4 x double> %a, i32 31433  %a01 = fsub double %a0, %a11434  %a23 = fsub double %a2, %a31435  %b0 = extractelement <4 x double> %b, i32 01436  %b1 = extractelement <4 x double> %b, i32 11437  %b2 = extractelement <4 x double> %b, i32 21438  %b3 = extractelement <4 x double> %b, i32 31439  %b01 = fsub double %b0, %b11440  %b23 = fsub double %b2, %b31441  %hsub0 = insertelement <4 x double> poison, double %a01, i32 01442  %hsub1 = insertelement <4 x double> %hsub0, double %b01, i32 11443  %hsub2 = insertelement <4 x double> %hsub1, double %a23, i32 21444  %hsub3 = insertelement <4 x double> %hsub2, double %b23, i32 31445  %result = shufflevector <4 x double> %hsub3, <4 x double> %a, <4 x i32> <i32 0, i32 1, i32 poison, i32 3>1446  ret <4 x double> %result1447}1448 1449define <4 x double> @sub_v4f64_012u(<4 x double> %a, <4 x double> %b) {1450; SSE2-LABEL: @sub_v4f64_012u(1451; SSE2-NEXT:    [[A2:%.*]] = extractelement <4 x double> [[A:%.*]], i64 21452; SSE2-NEXT:    [[A3:%.*]] = extractelement <4 x double> [[A]], i64 31453; SSE2-NEXT:    [[A23:%.*]] = fsub double [[A2]], [[A3]]1454; SSE2-NEXT:    [[TMP1:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B:%.*]], <2 x i32> <i32 0, i32 4>1455; SSE2-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <2 x i32> <i32 1, i32 5>1456; SSE2-NEXT:    [[TMP3:%.*]] = fsub <2 x double> [[TMP1]], [[TMP2]]1457; SSE2-NEXT:    [[TMP4:%.*]] = shufflevector <2 x double> [[TMP3]], <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>1458; SSE2-NEXT:    [[RESULT:%.*]] = insertelement <4 x double> [[TMP4]], double [[A23]], i64 21459; SSE2-NEXT:    ret <4 x double> [[RESULT]]1460;1461; SSE4-LABEL: @sub_v4f64_012u(1462; SSE4-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 2, i32 poison>1463; SSE4-NEXT:    [[TMP4:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 5, i32 3, i32 poison>1464; SSE4-NEXT:    [[TMP3:%.*]] = fsub <4 x double> [[TMP2]], [[TMP4]]1465; SSE4-NEXT:    ret <4 x double> [[TMP3]]1466;1467; AVX-LABEL: @sub_v4f64_012u(1468; AVX-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 2, i32 poison>1469; AVX-NEXT:    [[TMP3:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 5, i32 3, i32 poison>1470; AVX-NEXT:    [[TMP4:%.*]] = fsub <4 x double> [[TMP2]], [[TMP3]]1471; AVX-NEXT:    ret <4 x double> [[TMP4]]1472;1473  %a0 = extractelement <4 x double> %a, i32 01474  %a1 = extractelement <4 x double> %a, i32 11475  %a2 = extractelement <4 x double> %a, i32 21476  %a3 = extractelement <4 x double> %a, i32 31477  %a01 = fsub double %a0, %a11478  %a23 = fsub double %a2, %a31479  %b0 = extractelement <4 x double> %b, i32 01480  %b1 = extractelement <4 x double> %b, i32 11481  %b2 = extractelement <4 x double> %b, i32 21482  %b3 = extractelement <4 x double> %b, i32 31483  %b01 = fsub double %b0, %b11484  %b23 = fsub double %b2, %b31485  %hsub0 = insertelement <4 x double> poison, double %a01, i32 01486  %hsub1 = insertelement <4 x double> %hsub0, double %b01, i32 11487  %hsub2 = insertelement <4 x double> %hsub1, double %a23, i32 21488  %hsub3 = insertelement <4 x double> %hsub2, double %b23, i32 31489  %result = shufflevector <4 x double> %hsub3, <4 x double> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>1490  ret <4 x double> %result1491}1492 1493define <4 x double> @sub_v4f64_uu23(<4 x double> %a, <4 x double> %b) {1494; SSE2-LABEL: @sub_v4f64_uu23(1495; SSE2-NEXT:    [[TMP1:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <2 x i32> <i32 2, i32 6>1496; SSE2-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <2 x i32> <i32 3, i32 7>1497; SSE2-NEXT:    [[TMP3:%.*]] = fsub <2 x double> [[TMP1]], [[TMP2]]1498; SSE2-NEXT:    [[RESULT1:%.*]] = shufflevector <2 x double> [[TMP3]], <2 x double> poison, <4 x i32> <i32 poison, i32 poison, i32 0, i32 1>1499; SSE2-NEXT:    ret <4 x double> [[RESULT1]]1500;1501; SSE4-LABEL: @sub_v4f64_uu23(1502; SSE4-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 poison, i32 poison, i32 2, i32 6>1503; SSE4-NEXT:    [[TMP3:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 poison, i32 poison, i32 3, i32 7>1504; SSE4-NEXT:    [[RESULT1:%.*]] = fsub <4 x double> [[TMP2]], [[TMP3]]1505; SSE4-NEXT:    ret <4 x double> [[RESULT1]]1506;1507; AVX-LABEL: @sub_v4f64_uu23(1508; AVX-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 poison, i32 poison, i32 2, i32 6>1509; AVX-NEXT:    [[TMP3:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 poison, i32 poison, i32 3, i32 7>1510; AVX-NEXT:    [[RESULT1:%.*]] = fsub <4 x double> [[TMP2]], [[TMP3]]1511; AVX-NEXT:    ret <4 x double> [[RESULT1]]1512;1513  %a0 = extractelement <4 x double> %a, i32 01514  %a1 = extractelement <4 x double> %a, i32 11515  %a2 = extractelement <4 x double> %a, i32 21516  %a3 = extractelement <4 x double> %a, i32 31517  %a01 = fsub double %a0, %a11518  %a23 = fsub double %a2, %a31519  %b0 = extractelement <4 x double> %b, i32 01520  %b1 = extractelement <4 x double> %b, i32 11521  %b2 = extractelement <4 x double> %b, i32 21522  %b3 = extractelement <4 x double> %b, i32 31523  %b01 = fsub double %b0, %b11524  %b23 = fsub double %b2, %b31525  %hsub0 = insertelement <4 x double> poison, double %a01, i32 01526  %hsub1 = insertelement <4 x double> %hsub0, double %b01, i32 11527  %hsub2 = insertelement <4 x double> %hsub1, double %a23, i32 21528  %hsub3 = insertelement <4 x double> %hsub2, double %b23, i32 31529  %result = shufflevector <4 x double> %hsub3, <4 x double> %a, <4 x i32> <i32 poison, i32 poison, i32 2, i32 3>1530  ret <4 x double> %result1531}1532 1533define <4 x double> @sub_v4f64_01uu(<4 x double> %a, <4 x double> %b) {1534; SSE2-LABEL: @sub_v4f64_01uu(1535; SSE2-NEXT:    [[TMP1:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <2 x i32> <i32 0, i32 4>1536; SSE2-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <2 x i32> <i32 1, i32 5>1537; SSE2-NEXT:    [[TMP3:%.*]] = fsub <2 x double> [[TMP1]], [[TMP2]]1538; SSE2-NEXT:    [[TMP4:%.*]] = shufflevector <2 x double> [[TMP3]], <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>1539; SSE2-NEXT:    ret <4 x double> [[TMP4]]1540;1541; SSE4-LABEL: @sub_v4f64_01uu(1542; SSE4-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 poison, i32 poison>1543; SSE4-NEXT:    [[TMP4:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 5, i32 poison, i32 poison>1544; SSE4-NEXT:    [[TMP3:%.*]] = fsub <4 x double> [[TMP2]], [[TMP4]]1545; SSE4-NEXT:    ret <4 x double> [[TMP3]]1546;1547; AVX-LABEL: @sub_v4f64_01uu(1548; AVX-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 poison, i32 poison>1549; AVX-NEXT:    [[TMP4:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 5, i32 poison, i32 poison>1550; AVX-NEXT:    [[TMP3:%.*]] = fsub <4 x double> [[TMP2]], [[TMP4]]1551; AVX-NEXT:    ret <4 x double> [[TMP3]]1552;1553  %a0 = extractelement <4 x double> %a, i32 01554  %a1 = extractelement <4 x double> %a, i32 11555  %a2 = extractelement <4 x double> %a, i32 21556  %a3 = extractelement <4 x double> %a, i32 31557  %a01 = fsub double %a0, %a11558  %a23 = fsub double %a2, %a31559  %b0 = extractelement <4 x double> %b, i32 01560  %b1 = extractelement <4 x double> %b, i32 11561  %b2 = extractelement <4 x double> %b, i32 21562  %b3 = extractelement <4 x double> %b, i32 31563  %b01 = fsub double %b0, %b11564  %b23 = fsub double %b2, %b31565  %hsub0 = insertelement <4 x double> poison, double %a01, i32 01566  %hsub1 = insertelement <4 x double> %hsub0, double %b01, i32 11567  %hsub2 = insertelement <4 x double> %hsub1, double %a23, i32 21568  %hsub3 = insertelement <4 x double> %hsub2, double %b23, i32 31569  %result = shufflevector <4 x double> %hsub3, <4 x double> %a, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>1570  ret <4 x double> %result1571}1572 1573define <4 x double> @sub_v4f64_32u0(<4 x double> %a, <4 x double> %b) {1574; SSE2-LABEL: @sub_v4f64_32u0(1575; SSE2-NEXT:    [[A0:%.*]] = extractelement <4 x double> [[A:%.*]], i64 01576; SSE2-NEXT:    [[A1:%.*]] = extractelement <4 x double> [[A]], i64 11577; SSE2-NEXT:    [[A01:%.*]] = fsub double [[A0]], [[A1]]1578; SSE2-NEXT:    [[TMP1:%.*]] = shufflevector <4 x double> [[B:%.*]], <4 x double> poison, <2 x i32> <i32 2, i32 0>1579; SSE2-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[B]], <4 x double> poison, <2 x i32> <i32 3, i32 1>1580; SSE2-NEXT:    [[TMP3:%.*]] = fsub <2 x double> [[TMP1]], [[TMP2]]1581; SSE2-NEXT:    [[TMP4:%.*]] = shufflevector <2 x double> [[TMP3]], <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>1582; SSE2-NEXT:    [[RESULT:%.*]] = insertelement <4 x double> [[TMP4]], double [[A01]], i64 31583; SSE2-NEXT:    ret <4 x double> [[RESULT]]1584;1585; SSE4-LABEL: @sub_v4f64_32u0(1586; SSE4-NEXT:    [[TMP1:%.*]] = shufflevector <4 x double> [[B:%.*]], <4 x double> [[A:%.*]], <4 x i32> <i32 2, i32 0, i32 poison, i32 4>1587; SSE4-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[B]], <4 x double> [[A]], <4 x i32> <i32 3, i32 1, i32 poison, i32 5>1588; SSE4-NEXT:    [[RESULT:%.*]] = fsub <4 x double> [[TMP1]], [[TMP2]]1589; SSE4-NEXT:    ret <4 x double> [[RESULT]]1590;1591; AVX-LABEL: @sub_v4f64_32u0(1592; AVX-NEXT:    [[TMP1:%.*]] = shufflevector <4 x double> [[B:%.*]], <4 x double> [[A:%.*]], <4 x i32> <i32 2, i32 0, i32 poison, i32 4>1593; AVX-NEXT:    [[TMP2:%.*]] = shufflevector <4 x double> [[B]], <4 x double> [[A]], <4 x i32> <i32 3, i32 1, i32 poison, i32 5>1594; AVX-NEXT:    [[RESULT:%.*]] = fsub <4 x double> [[TMP1]], [[TMP2]]1595; AVX-NEXT:    ret <4 x double> [[RESULT]]1596;1597  %a0 = extractelement <4 x double> %a, i32 01598  %a1 = extractelement <4 x double> %a, i32 11599  %a2 = extractelement <4 x double> %a, i32 21600  %a3 = extractelement <4 x double> %a, i32 31601  %a01 = fsub double %a0, %a11602  %a23 = fsub double %a2, %a31603  %b0 = extractelement <4 x double> %b, i32 01604  %b1 = extractelement <4 x double> %b, i32 11605  %b2 = extractelement <4 x double> %b, i32 21606  %b3 = extractelement <4 x double> %b, i32 31607  %b01 = fsub double %b0, %b11608  %b23 = fsub double %b2, %b31609  %hsub0 = insertelement <4 x double> poison, double %a01, i32 01610  %hsub1 = insertelement <4 x double> %hsub0, double %a23, i32 11611  %hsub2 = insertelement <4 x double> %hsub1, double %b01, i32 21612  %hsub3 = insertelement <4 x double> %hsub2, double %b23, i32 31613  %result = shufflevector <4 x double> %hsub3, <4 x double> %a, <4 x i32> <i32 3, i32 2, i32 poison, i32 0>1614  ret <4 x double> %result1615}1616