542 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -mtriple=x86_64-unknown-unknown -S | FileCheck %s3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"4 5define double @test_sqrt_sd_0(double %a) {6; CHECK-LABEL: @test_sqrt_sd_0(7; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.sqrt.f64(double [[A:%.*]])8; CHECK-NEXT: ret double [[TMP1]]9;10 %1 = insertelement <2 x double> undef, double %a, i32 011 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 112 %3 = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %2)13 %4 = extractelement <2 x double> %3, i32 014 ret double %415}16 17define double @test_sqrt_sd_1(double %a) {18; CHECK-LABEL: @test_sqrt_sd_1(19; CHECK-NEXT: ret double 1.000000e+0020;21 %1 = insertelement <2 x double> undef, double %a, i32 022 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 123 %3 = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %2)24 %4 = extractelement <2 x double> %3, i32 125 ret double %426}27 28define double @test_add_sd_0(double %a, double %b) {29; CHECK-LABEL: @test_add_sd_0(30; CHECK-NEXT: [[TMP1:%.*]] = fadd double [[A:%.*]], [[B:%.*]]31; CHECK-NEXT: ret double [[TMP1]]32;33 %1 = insertelement <2 x double> undef, double %a, i32 034 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 135 %3 = insertelement <2 x double> undef, double %b, i32 036 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 137 %5 = tail call <2 x double> @llvm.x86.sse2.add.sd(<2 x double> %2, <2 x double> %4)38 %6 = extractelement <2 x double> %5, i32 039 ret double %640}41 42define double @test_add_sd_1(double %a, double %b) {43; CHECK-LABEL: @test_add_sd_1(44; CHECK-NEXT: ret double 1.000000e+0045;46 %1 = insertelement <2 x double> undef, double %a, i32 047 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 148 %3 = insertelement <2 x double> undef, double %b, i32 049 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 150 %5 = tail call <2 x double> @llvm.x86.sse2.add.sd(<2 x double> %2, <2 x double> %4)51 %6 = extractelement <2 x double> %5, i32 152 ret double %653}54 55define double @test_add_sd_2(double %a) {56; CHECK-LABEL: @test_add_sd_2(57; CHECK-NEXT: [[TMP1:%.*]] = fadd double [[A:%.*]], [[A]]58; CHECK-NEXT: ret double [[TMP1]]59;60 %1 = insertelement <2 x double> zeroinitializer, double %a, i32 061 %2 = tail call <2 x double> @llvm.x86.sse2.add.sd(<2 x double> %1, <2 x double> %1)62 %3 = extractelement <2 x double> %2, i32 063 ret double %364}65 66define double @test_sub_sd_0(double %a, double %b) {67; CHECK-LABEL: @test_sub_sd_0(68; CHECK-NEXT: [[TMP1:%.*]] = fsub double [[A:%.*]], [[B:%.*]]69; CHECK-NEXT: ret double [[TMP1]]70;71 %1 = insertelement <2 x double> undef, double %a, i32 072 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 173 %3 = insertelement <2 x double> undef, double %b, i32 074 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 175 %5 = tail call <2 x double> @llvm.x86.sse2.sub.sd(<2 x double> %2, <2 x double> %4)76 %6 = extractelement <2 x double> %5, i32 077 ret double %678}79 80define double @test_sub_sd_1(double %a, double %b) {81; CHECK-LABEL: @test_sub_sd_1(82; CHECK-NEXT: ret double 1.000000e+0083;84 %1 = insertelement <2 x double> undef, double %a, i32 085 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 186 %3 = insertelement <2 x double> undef, double %b, i32 087 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 188 %5 = tail call <2 x double> @llvm.x86.sse2.sub.sd(<2 x double> %2, <2 x double> %4)89 %6 = extractelement <2 x double> %5, i32 190 ret double %691}92 93define double @test_sub_sd_2(double %a) {94; CHECK-LABEL: @test_sub_sd_2(95; CHECK-NEXT: [[TMP1:%.*]] = fsub double [[A:%.*]], [[A]]96; CHECK-NEXT: ret double [[TMP1]]97;98 %1 = insertelement <2 x double> zeroinitializer, double %a, i32 099 %2 = tail call <2 x double> @llvm.x86.sse2.sub.sd(<2 x double> %1, <2 x double> %1)100 %3 = extractelement <2 x double> %2, i32 0101 ret double %3102}103 104define double @test_mul_sd_0(double %a, double %b) {105; CHECK-LABEL: @test_mul_sd_0(106; CHECK-NEXT: [[TMP1:%.*]] = fmul double [[A:%.*]], [[B:%.*]]107; CHECK-NEXT: ret double [[TMP1]]108;109 %1 = insertelement <2 x double> undef, double %a, i32 0110 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1111 %3 = insertelement <2 x double> undef, double %b, i32 0112 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1113 %5 = tail call <2 x double> @llvm.x86.sse2.mul.sd(<2 x double> %2, <2 x double> %4)114 %6 = extractelement <2 x double> %5, i32 0115 ret double %6116}117 118define double @test_mul_sd_1(double %a, double %b) {119; CHECK-LABEL: @test_mul_sd_1(120; CHECK-NEXT: ret double 1.000000e+00121;122 %1 = insertelement <2 x double> undef, double %a, i32 0123 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1124 %3 = insertelement <2 x double> undef, double %b, i32 0125 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1126 %5 = tail call <2 x double> @llvm.x86.sse2.mul.sd(<2 x double> %2, <2 x double> %4)127 %6 = extractelement <2 x double> %5, i32 1128 ret double %6129}130 131define double @test_mul_sd_2(double %a) {132; CHECK-LABEL: @test_mul_sd_2(133; CHECK-NEXT: [[TMP1:%.*]] = fmul double [[A:%.*]], [[A]]134; CHECK-NEXT: ret double [[TMP1]]135;136 %1 = insertelement <2 x double> zeroinitializer, double %a, i32 0137 %2 = tail call <2 x double> @llvm.x86.sse2.mul.sd(<2 x double> %1, <2 x double> %1)138 %3 = extractelement <2 x double> %2, i32 0139 ret double %3140}141 142define double @test_div_sd_0(double %a, double %b) {143; CHECK-LABEL: @test_div_sd_0(144; CHECK-NEXT: [[TMP1:%.*]] = fdiv double [[A:%.*]], [[B:%.*]]145; CHECK-NEXT: ret double [[TMP1]]146;147 %1 = insertelement <2 x double> undef, double %a, i32 0148 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1149 %3 = insertelement <2 x double> undef, double %b, i32 0150 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1151 %5 = tail call <2 x double> @llvm.x86.sse2.div.sd(<2 x double> %2, <2 x double> %4)152 %6 = extractelement <2 x double> %5, i32 0153 ret double %6154}155 156define double @test_div_sd_1(double %a, double %b) {157; CHECK-LABEL: @test_div_sd_1(158; CHECK-NEXT: ret double 1.000000e+00159;160 %1 = insertelement <2 x double> undef, double %a, i32 0161 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1162 %3 = insertelement <2 x double> undef, double %b, i32 0163 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1164 %5 = tail call <2 x double> @llvm.x86.sse2.div.sd(<2 x double> %2, <2 x double> %4)165 %6 = extractelement <2 x double> %5, i32 1166 ret double %6167}168 169define double @test_div_sd_2(double %a) {170; CHECK-LABEL: @test_div_sd_2(171; CHECK-NEXT: [[TMP1:%.*]] = fdiv double [[A:%.*]], [[A]]172; CHECK-NEXT: ret double [[TMP1]]173;174 %1 = insertelement <2 x double> zeroinitializer, double %a, i32 0175 %2 = tail call <2 x double> @llvm.x86.sse2.div.sd(<2 x double> %1, <2 x double> %1)176 %3 = extractelement <2 x double> %2, i32 0177 ret double %3178}179 180define <2 x double> @test_min_sd(<2 x double> %a, <2 x double> %b) {181; CHECK-LABEL: @test_min_sd(182; CHECK-NEXT: [[TMP1:%.*]] = tail call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> [[A:%.*]], <2 x double> [[B:%.*]])183; CHECK-NEXT: ret <2 x double> [[TMP1]]184;185 %1 = insertelement <2 x double> %b, double 2.000000e+00, i32 1186 %2 = tail call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> %a, <2 x double> %1)187 ret <2 x double> %2188}189 190define double @test_min_sd_0(double %a, double %b) {191; CHECK-LABEL: @test_min_sd_0(192; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0193; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0194; CHECK-NEXT: [[TMP3:%.*]] = tail call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])195; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x double> [[TMP3]], i64 0196; CHECK-NEXT: ret double [[TMP4]]197;198 %1 = insertelement <2 x double> undef, double %a, i32 0199 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1200 %3 = insertelement <2 x double> undef, double %b, i32 0201 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1202 %5 = tail call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> %2, <2 x double> %4)203 %6 = extractelement <2 x double> %5, i32 0204 ret double %6205}206 207define double @test_min_sd_1(double %a, double %b) {208; CHECK-LABEL: @test_min_sd_1(209; CHECK-NEXT: ret double 1.000000e+00210;211 %1 = insertelement <2 x double> undef, double %a, i32 0212 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1213 %3 = insertelement <2 x double> undef, double %b, i32 0214 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1215 %5 = tail call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> %2, <2 x double> %4)216 %6 = extractelement <2 x double> %5, i32 1217 ret double %6218}219 220define double @test_min_sd_2(double %a) {221; CHECK-LABEL: @test_min_sd_2(222; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> <double poison, double 0.000000e+00>, double [[A:%.*]], i64 0223; CHECK-NEXT: [[TMP2:%.*]] = tail call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> [[TMP1]], <2 x double> [[TMP1]])224; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x double> [[TMP2]], i64 0225; CHECK-NEXT: ret double [[TMP3]]226;227 %1 = insertelement <2 x double> zeroinitializer, double %a, i32 0228 %2 = tail call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> %1, <2 x double> %1)229 %3 = extractelement <2 x double> %2, i32 0230 ret double %3231}232 233define <2 x double> @test_max_sd(<2 x double> %a, <2 x double> %b) {234; CHECK-LABEL: @test_max_sd(235; CHECK-NEXT: [[TMP1:%.*]] = tail call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> [[A:%.*]], <2 x double> [[B:%.*]])236; CHECK-NEXT: ret <2 x double> [[TMP1]]237;238 %1 = insertelement <2 x double> %b, double 2.000000e+00, i32 1239 %2 = tail call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> %a, <2 x double> %1)240 ret <2 x double> %2241}242 243define double @test_max_sd_0(double %a, double %b) {244; CHECK-LABEL: @test_max_sd_0(245; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0246; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0247; CHECK-NEXT: [[TMP3:%.*]] = tail call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])248; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x double> [[TMP3]], i64 0249; CHECK-NEXT: ret double [[TMP4]]250;251 %1 = insertelement <2 x double> undef, double %a, i32 0252 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1253 %3 = insertelement <2 x double> undef, double %b, i32 0254 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1255 %5 = tail call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> %2, <2 x double> %4)256 %6 = extractelement <2 x double> %5, i32 0257 ret double %6258}259 260define double @test_max_sd_1(double %a, double %b) {261; CHECK-LABEL: @test_max_sd_1(262; CHECK-NEXT: ret double 1.000000e+00263;264 %1 = insertelement <2 x double> undef, double %a, i32 0265 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1266 %3 = insertelement <2 x double> undef, double %b, i32 0267 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1268 %5 = tail call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> %2, <2 x double> %4)269 %6 = extractelement <2 x double> %5, i32 1270 ret double %6271}272 273define double @test_max_sd_2(double %a) {274; CHECK-LABEL: @test_max_sd_2(275; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> <double poison, double 0.000000e+00>, double [[A:%.*]], i64 0276; CHECK-NEXT: [[TMP2:%.*]] = tail call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> [[TMP1]], <2 x double> [[TMP1]])277; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x double> [[TMP2]], i64 0278; CHECK-NEXT: ret double [[TMP3]]279;280 %1 = insertelement <2 x double> zeroinitializer, double %a, i32 0281 %2 = tail call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> %1, <2 x double> %1)282 %3 = extractelement <2 x double> %2, i32 0283 ret double %3284}285 286define <2 x double> @test_cmp_sd(<2 x double> %a, <2 x double> %b) {287; CHECK-LABEL: @test_cmp_sd(288; CHECK-NEXT: [[TMP1:%.*]] = tail call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> [[A:%.*]], <2 x double> [[B:%.*]], i8 0)289; CHECK-NEXT: ret <2 x double> [[TMP1]]290;291 %1 = insertelement <2 x double> %b, double 2.000000e+00, i32 1292 %2 = tail call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a, <2 x double> %1, i8 0)293 ret <2 x double> %2294}295 296define double @test_cmp_sd_0(double %a, double %b) {297; CHECK-LABEL: @test_cmp_sd_0(298; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0299; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0300; CHECK-NEXT: [[TMP3:%.*]] = tail call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]], i8 0)301; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x double> [[TMP3]], i64 0302; CHECK-NEXT: ret double [[TMP4]]303;304 %1 = insertelement <2 x double> undef, double %a, i32 0305 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1306 %3 = insertelement <2 x double> undef, double %b, i32 0307 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1308 %5 = tail call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %2, <2 x double> %4, i8 0)309 %6 = extractelement <2 x double> %5, i32 0310 ret double %6311}312 313define double @test_cmp_sd_1(double %a, double %b) {314; CHECK-LABEL: @test_cmp_sd_1(315; CHECK-NEXT: ret double 1.000000e+00316;317 %1 = insertelement <2 x double> undef, double %a, i32 0318 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1319 %3 = insertelement <2 x double> undef, double %b, i32 0320 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1321 %5 = tail call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %2, <2 x double> %4, i8 0)322 %6 = extractelement <2 x double> %5, i32 1323 ret double %6324}325 326define double @test_cmp_sd_2(double %a) {327; CHECK-LABEL: @test_cmp_sd_2(328; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> <double poison, double 0.000000e+00>, double [[A:%.*]], i64 0329; CHECK-NEXT: [[TMP2:%.*]] = tail call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> [[TMP1]], <2 x double> [[TMP1]], i8 3)330; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x double> [[TMP2]], i64 0331; CHECK-NEXT: ret double [[TMP3]]332;333 %1 = insertelement <2 x double> zeroinitializer, double %a, i32 0334 %2 = tail call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %1, <2 x double> %1, i8 3)335 %3 = extractelement <2 x double> %2, i32 0336 ret double %3337}338 339define i32 @test_comieq_sd_0(double %a, double %b) {340; CHECK-LABEL: @test_comieq_sd_0(341; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0342; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0343; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.comieq.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])344; CHECK-NEXT: ret i32 [[TMP3]]345;346 %1 = insertelement <2 x double> undef, double %a, i32 0347 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1348 %3 = insertelement <2 x double> undef, double %b, i32 0349 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1350 %5 = tail call i32 @llvm.x86.sse2.comieq.sd(<2 x double> %2, <2 x double> %4)351 ret i32 %5352}353 354define i32 @test_comige_sd_0(double %a, double %b) {355; CHECK-LABEL: @test_comige_sd_0(356; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0357; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0358; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.comige.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])359; CHECK-NEXT: ret i32 [[TMP3]]360;361 %1 = insertelement <2 x double> undef, double %a, i32 0362 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1363 %3 = insertelement <2 x double> undef, double %b, i32 0364 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1365 %5 = tail call i32 @llvm.x86.sse2.comige.sd(<2 x double> %2, <2 x double> %4)366 ret i32 %5367}368 369define i32 @test_comigt_sd_0(double %a, double %b) {370; CHECK-LABEL: @test_comigt_sd_0(371; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0372; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0373; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.comigt.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])374; CHECK-NEXT: ret i32 [[TMP3]]375;376 %1 = insertelement <2 x double> undef, double %a, i32 0377 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1378 %3 = insertelement <2 x double> undef, double %b, i32 0379 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1380 %5 = tail call i32 @llvm.x86.sse2.comigt.sd(<2 x double> %2, <2 x double> %4)381 ret i32 %5382}383 384define i32 @test_comile_sd_0(double %a, double %b) {385; CHECK-LABEL: @test_comile_sd_0(386; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0387; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0388; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.comile.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])389; CHECK-NEXT: ret i32 [[TMP3]]390;391 %1 = insertelement <2 x double> undef, double %a, i32 0392 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1393 %3 = insertelement <2 x double> undef, double %b, i32 0394 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1395 %5 = tail call i32 @llvm.x86.sse2.comile.sd(<2 x double> %2, <2 x double> %4)396 ret i32 %5397}398 399define i32 @test_comilt_sd_0(double %a, double %b) {400; CHECK-LABEL: @test_comilt_sd_0(401; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0402; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0403; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.comilt.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])404; CHECK-NEXT: ret i32 [[TMP3]]405;406 %1 = insertelement <2 x double> undef, double %a, i32 0407 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1408 %3 = insertelement <2 x double> undef, double %b, i32 0409 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1410 %5 = tail call i32 @llvm.x86.sse2.comilt.sd(<2 x double> %2, <2 x double> %4)411 ret i32 %5412}413 414define i32 @test_comineq_sd_0(double %a, double %b) {415; CHECK-LABEL: @test_comineq_sd_0(416; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0417; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0418; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.comineq.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])419; CHECK-NEXT: ret i32 [[TMP3]]420;421 %1 = insertelement <2 x double> undef, double %a, i32 0422 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1423 %3 = insertelement <2 x double> undef, double %b, i32 0424 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1425 %5 = tail call i32 @llvm.x86.sse2.comineq.sd(<2 x double> %2, <2 x double> %4)426 ret i32 %5427}428 429define i32 @test_ucomieq_sd_0(double %a, double %b) {430; CHECK-LABEL: @test_ucomieq_sd_0(431; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0432; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0433; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.ucomieq.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])434; CHECK-NEXT: ret i32 [[TMP3]]435;436 %1 = insertelement <2 x double> undef, double %a, i32 0437 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1438 %3 = insertelement <2 x double> undef, double %b, i32 0439 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1440 %5 = tail call i32 @llvm.x86.sse2.ucomieq.sd(<2 x double> %2, <2 x double> %4)441 ret i32 %5442}443 444define i32 @test_ucomige_sd_0(double %a, double %b) {445; CHECK-LABEL: @test_ucomige_sd_0(446; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0447; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0448; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.ucomige.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])449; CHECK-NEXT: ret i32 [[TMP3]]450;451 %1 = insertelement <2 x double> undef, double %a, i32 0452 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1453 %3 = insertelement <2 x double> undef, double %b, i32 0454 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1455 %5 = tail call i32 @llvm.x86.sse2.ucomige.sd(<2 x double> %2, <2 x double> %4)456 ret i32 %5457}458 459define i32 @test_ucomigt_sd_0(double %a, double %b) {460; CHECK-LABEL: @test_ucomigt_sd_0(461; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0462; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0463; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.ucomigt.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])464; CHECK-NEXT: ret i32 [[TMP3]]465;466 %1 = insertelement <2 x double> undef, double %a, i32 0467 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1468 %3 = insertelement <2 x double> undef, double %b, i32 0469 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1470 %5 = tail call i32 @llvm.x86.sse2.ucomigt.sd(<2 x double> %2, <2 x double> %4)471 ret i32 %5472}473 474define i32 @test_ucomile_sd_0(double %a, double %b) {475; CHECK-LABEL: @test_ucomile_sd_0(476; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0477; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0478; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.ucomile.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])479; CHECK-NEXT: ret i32 [[TMP3]]480;481 %1 = insertelement <2 x double> undef, double %a, i32 0482 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1483 %3 = insertelement <2 x double> undef, double %b, i32 0484 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1485 %5 = tail call i32 @llvm.x86.sse2.ucomile.sd(<2 x double> %2, <2 x double> %4)486 ret i32 %5487}488 489define i32 @test_ucomilt_sd_0(double %a, double %b) {490; CHECK-LABEL: @test_ucomilt_sd_0(491; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0492; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0493; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.ucomilt.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])494; CHECK-NEXT: ret i32 [[TMP3]]495;496 %1 = insertelement <2 x double> undef, double %a, i32 0497 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1498 %3 = insertelement <2 x double> undef, double %b, i32 0499 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1500 %5 = tail call i32 @llvm.x86.sse2.ucomilt.sd(<2 x double> %2, <2 x double> %4)501 ret i32 %5502}503 504define i32 @test_ucomineq_sd_0(double %a, double %b) {505; CHECK-LABEL: @test_ucomineq_sd_0(506; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0507; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0508; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.ucomineq.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])509; CHECK-NEXT: ret i32 [[TMP3]]510;511 %1 = insertelement <2 x double> undef, double %a, i32 0512 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1513 %3 = insertelement <2 x double> undef, double %b, i32 0514 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1515 %5 = tail call i32 @llvm.x86.sse2.ucomineq.sd(<2 x double> %2, <2 x double> %4)516 ret i32 %5517}518 519declare <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double>) nounwind readnone520 521declare <2 x double> @llvm.x86.sse2.add.sd(<2 x double>, <2 x double>)522declare <2 x double> @llvm.x86.sse2.sub.sd(<2 x double>, <2 x double>)523declare <2 x double> @llvm.x86.sse2.mul.sd(<2 x double>, <2 x double>)524declare <2 x double> @llvm.x86.sse2.div.sd(<2 x double>, <2 x double>)525declare <2 x double> @llvm.x86.sse2.min.sd(<2 x double>, <2 x double>)526declare <2 x double> @llvm.x86.sse2.max.sd(<2 x double>, <2 x double>)527declare <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double>, <2 x double>, i8)528 529declare i32 @llvm.x86.sse2.comieq.sd(<2 x double>, <2 x double>)530declare i32 @llvm.x86.sse2.comige.sd(<2 x double>, <2 x double>)531declare i32 @llvm.x86.sse2.comigt.sd(<2 x double>, <2 x double>)532declare i32 @llvm.x86.sse2.comile.sd(<2 x double>, <2 x double>)533declare i32 @llvm.x86.sse2.comilt.sd(<2 x double>, <2 x double>)534declare i32 @llvm.x86.sse2.comineq.sd(<2 x double>, <2 x double>)535 536declare i32 @llvm.x86.sse2.ucomieq.sd(<2 x double>, <2 x double>)537declare i32 @llvm.x86.sse2.ucomige.sd(<2 x double>, <2 x double>)538declare i32 @llvm.x86.sse2.ucomigt.sd(<2 x double>, <2 x double>)539declare i32 @llvm.x86.sse2.ucomile.sd(<2 x double>, <2 x double>)540declare i32 @llvm.x86.sse2.ucomilt.sd(<2 x double>, <2 x double>)541declare i32 @llvm.x86.sse2.ucomineq.sd(<2 x double>, <2 x double>)542