1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -mtriple=x86_64-unknown-unknown -S | FileCheck %s 3target 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> poison, double %a, i32 0 11 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 12 %3 = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %2) 13 %4 = extractelement <2 x double> %3, i32 0 14 ret double %4 15} 16 17define double @test_sqrt_sd_1(double %a) { 18; CHECK-LABEL: @test_sqrt_sd_1( 19; CHECK-NEXT: ret double 1.000000e+00 20; 21 %1 = insertelement <2 x double> poison, double %a, i32 0 22 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 23 %3 = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %2) 24 %4 = extractelement <2 x double> %3, i32 1 25 ret double %4 26} 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> poison, double %a, i32 0 34 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 35 %3 = insertelement <2 x double> poison, double %b, i32 0 36 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 37 %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 0 39 ret double %6 40} 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+00 45; 46 %1 = insertelement <2 x double> poison, double %a, i32 0 47 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 48 %3 = insertelement <2 x double> poison, double %b, i32 0 49 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 50 %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 1 52 ret double %6 53} 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 0 61 %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 0 63 ret double %3 64} 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> poison, double %a, i32 0 72 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 73 %3 = insertelement <2 x double> poison, double %b, i32 0 74 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 75 %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 0 77 ret double %6 78} 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+00 83; 84 %1 = insertelement <2 x double> poison, double %a, i32 0 85 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 86 %3 = insertelement <2 x double> poison, double %b, i32 0 87 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 88 %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 1 90 ret double %6 91} 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 0 99 %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 0 101 ret double %3 102} 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> poison, double %a, i32 0 110 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 111 %3 = insertelement <2 x double> poison, double %b, i32 0 112 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 113 %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 0 115 ret double %6 116} 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+00 121; 122 %1 = insertelement <2 x double> poison, double %a, i32 0 123 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 124 %3 = insertelement <2 x double> poison, double %b, i32 0 125 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 126 %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 1 128 ret double %6 129} 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 0 137 %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 0 139 ret double %3 140} 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> poison, double %a, i32 0 148 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 149 %3 = insertelement <2 x double> poison, double %b, i32 0 150 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 151 %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 0 153 ret double %6 154} 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+00 159; 160 %1 = insertelement <2 x double> poison, double %a, i32 0 161 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 162 %3 = insertelement <2 x double> poison, double %b, i32 0 163 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 164 %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 1 166 ret double %6 167} 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 0 175 %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 0 177 ret double %3 178} 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 1 186 %2 = tail call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> %a, <2 x double> %1) 187 ret <2 x double> %2 188} 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 0 193; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0 194; 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 0 196; CHECK-NEXT: ret double [[TMP4]] 197; 198 %1 = insertelement <2 x double> poison, double %a, i32 0 199 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 200 %3 = insertelement <2 x double> poison, double %b, i32 0 201 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 202 %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 0 204 ret double %6 205} 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+00 210; 211 %1 = insertelement <2 x double> poison, double %a, i32 0 212 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 213 %3 = insertelement <2 x double> poison, double %b, i32 0 214 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 215 %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 1 217 ret double %6 218} 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 0 223; 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 0 225; CHECK-NEXT: ret double [[TMP3]] 226; 227 %1 = insertelement <2 x double> zeroinitializer, double %a, i32 0 228 %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 0 230 ret double %3 231} 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 1 239 %2 = tail call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> %a, <2 x double> %1) 240 ret <2 x double> %2 241} 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 0 246; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0 247; 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 0 249; CHECK-NEXT: ret double [[TMP4]] 250; 251 %1 = insertelement <2 x double> poison, double %a, i32 0 252 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 253 %3 = insertelement <2 x double> poison, double %b, i32 0 254 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 255 %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 0 257 ret double %6 258} 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+00 263; 264 %1 = insertelement <2 x double> poison, double %a, i32 0 265 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 266 %3 = insertelement <2 x double> poison, double %b, i32 0 267 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 268 %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 1 270 ret double %6 271} 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 0 276; 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 0 278; CHECK-NEXT: ret double [[TMP3]] 279; 280 %1 = insertelement <2 x double> zeroinitializer, double %a, i32 0 281 %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 0 283 ret double %3 284} 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 1 292 %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> %2 294} 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 0 299; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0 300; 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 0 302; CHECK-NEXT: ret double [[TMP4]] 303; 304 %1 = insertelement <2 x double> poison, double %a, i32 0 305 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 306 %3 = insertelement <2 x double> poison, double %b, i32 0 307 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 308 %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 0 310 ret double %6 311} 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+00 316; 317 %1 = insertelement <2 x double> poison, double %a, i32 0 318 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 319 %3 = insertelement <2 x double> poison, double %b, i32 0 320 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 321 %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 1 323 ret double %6 324} 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 0 329; 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 0 331; CHECK-NEXT: ret double [[TMP3]] 332; 333 %1 = insertelement <2 x double> zeroinitializer, double %a, i32 0 334 %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 0 336 ret double %3 337} 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 0 342; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0 343; 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> poison, double %a, i32 0 347 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 348 %3 = insertelement <2 x double> poison, double %b, i32 0 349 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 350 %5 = tail call i32 @llvm.x86.sse2.comieq.sd(<2 x double> %2, <2 x double> %4) 351 ret i32 %5 352} 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 0 357; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0 358; 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> poison, double %a, i32 0 362 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 363 %3 = insertelement <2 x double> poison, double %b, i32 0 364 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 365 %5 = tail call i32 @llvm.x86.sse2.comige.sd(<2 x double> %2, <2 x double> %4) 366 ret i32 %5 367} 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 0 372; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0 373; 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> poison, double %a, i32 0 377 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 378 %3 = insertelement <2 x double> poison, double %b, i32 0 379 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 380 %5 = tail call i32 @llvm.x86.sse2.comigt.sd(<2 x double> %2, <2 x double> %4) 381 ret i32 %5 382} 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 0 387; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0 388; 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> poison, double %a, i32 0 392 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 393 %3 = insertelement <2 x double> poison, double %b, i32 0 394 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 395 %5 = tail call i32 @llvm.x86.sse2.comile.sd(<2 x double> %2, <2 x double> %4) 396 ret i32 %5 397} 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 0 402; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0 403; 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> poison, double %a, i32 0 407 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 408 %3 = insertelement <2 x double> poison, double %b, i32 0 409 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 410 %5 = tail call i32 @llvm.x86.sse2.comilt.sd(<2 x double> %2, <2 x double> %4) 411 ret i32 %5 412} 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 0 417; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0 418; 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> poison, double %a, i32 0 422 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 423 %3 = insertelement <2 x double> poison, double %b, i32 0 424 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 425 %5 = tail call i32 @llvm.x86.sse2.comineq.sd(<2 x double> %2, <2 x double> %4) 426 ret i32 %5 427} 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 0 432; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0 433; 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> poison, double %a, i32 0 437 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 438 %3 = insertelement <2 x double> poison, double %b, i32 0 439 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 440 %5 = tail call i32 @llvm.x86.sse2.ucomieq.sd(<2 x double> %2, <2 x double> %4) 441 ret i32 %5 442} 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 0 447; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0 448; 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> poison, double %a, i32 0 452 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 453 %3 = insertelement <2 x double> poison, double %b, i32 0 454 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 455 %5 = tail call i32 @llvm.x86.sse2.ucomige.sd(<2 x double> %2, <2 x double> %4) 456 ret i32 %5 457} 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 0 462; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0 463; 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> poison, double %a, i32 0 467 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 468 %3 = insertelement <2 x double> poison, double %b, i32 0 469 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 470 %5 = tail call i32 @llvm.x86.sse2.ucomigt.sd(<2 x double> %2, <2 x double> %4) 471 ret i32 %5 472} 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 0 477; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0 478; 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> poison, double %a, i32 0 482 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 483 %3 = insertelement <2 x double> poison, double %b, i32 0 484 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 485 %5 = tail call i32 @llvm.x86.sse2.ucomile.sd(<2 x double> %2, <2 x double> %4) 486 ret i32 %5 487} 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 0 492; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0 493; 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> poison, double %a, i32 0 497 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 498 %3 = insertelement <2 x double> poison, double %b, i32 0 499 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 500 %5 = tail call i32 @llvm.x86.sse2.ucomilt.sd(<2 x double> %2, <2 x double> %4) 501 ret i32 %5 502} 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 0 507; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0 508; 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> poison, double %a, i32 0 512 %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1 513 %3 = insertelement <2 x double> poison, double %b, i32 0 514 %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1 515 %5 = tail call i32 @llvm.x86.sse2.ucomineq.sd(<2 x double> %2, <2 x double> %4) 516 ret i32 %5 517} 518 519declare <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double>) nounwind readnone 520 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