695 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 float @test_rcp_ss_0(float %a) {6; CHECK-LABEL: @test_rcp_ss_0(7; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[A:%.*]], i64 08; CHECK-NEXT: [[TMP2:%.*]] = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> [[TMP1]])9; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x float> [[TMP2]], i64 010; CHECK-NEXT: ret float [[TMP3]]11;12 %1 = insertelement <4 x float> undef, float %a, i32 013 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 114 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 215 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 316 %5 = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %4)17 %6 = extractelement <4 x float> %5, i32 018 ret float %619}20 21define float @test_rcp_ss_1(float %a) {22; CHECK-LABEL: @test_rcp_ss_1(23; CHECK-NEXT: ret float 1.000000e+0024;25 %1 = insertelement <4 x float> undef, float %a, i32 026 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 127 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 228 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 329 %5 = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %4)30 %6 = extractelement <4 x float> %5, i32 131 ret float %632}33 34define float @test_sqrt_ss_0(float %a) {35; CHECK-LABEL: @test_sqrt_ss_0(36; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.sqrt.f32(float [[A:%.*]])37; CHECK-NEXT: ret float [[TMP1]]38;39 %1 = insertelement <4 x float> undef, float %a, i32 040 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 141 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 242 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 343 %5 = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %4)44 %6 = extractelement <4 x float> %5, i32 045 ret float %646}47 48define float @test_sqrt_ss_2(float %a) {49; CHECK-LABEL: @test_sqrt_ss_2(50; CHECK-NEXT: ret float 2.000000e+0051;52 %1 = insertelement <4 x float> undef, float %a, i32 053 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 154 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 255 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 356 %5 = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %4)57 %6 = extractelement <4 x float> %5, i32 258 ret float %659}60 61define float @test_rsqrt_ss_0(float %a) {62; CHECK-LABEL: @test_rsqrt_ss_0(63; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[A:%.*]], i64 064; CHECK-NEXT: [[TMP2:%.*]] = tail call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> [[TMP1]])65; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x float> [[TMP2]], i64 066; CHECK-NEXT: ret float [[TMP3]]67;68 %1 = insertelement <4 x float> undef, float %a, i32 069 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 170 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 271 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 372 %5 = tail call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %4)73 %6 = extractelement <4 x float> %5, i32 074 ret float %675}76 77define float @test_rsqrt_ss_3(float %a) {78; CHECK-LABEL: @test_rsqrt_ss_3(79; CHECK-NEXT: ret float 3.000000e+0080;81 %1 = insertelement <4 x float> undef, float %a, i32 082 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 183 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 284 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 385 %5 = tail call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %4)86 %6 = extractelement <4 x float> %5, i32 387 ret float %688}89 90define float @test_add_ss_0(float %a, float %b) {91; CHECK-LABEL: @test_add_ss_0(92; CHECK-NEXT: [[TMP1:%.*]] = fadd float [[A:%.*]], [[B:%.*]]93; CHECK-NEXT: ret float [[TMP1]]94;95 %1 = insertelement <4 x float> undef, float %a, i32 096 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 197 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 298 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 399 %5 = insertelement <4 x float> undef, float %b, i32 0100 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1101 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2102 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3103 %9 = tail call <4 x float> @llvm.x86.sse.add.ss(<4 x float> %4, <4 x float> %8)104 %r = extractelement <4 x float> %9, i32 0105 ret float %r106}107 108define float @test_add_ss_1(float %a, float %b) {109; CHECK-LABEL: @test_add_ss_1(110; CHECK-NEXT: ret float 1.000000e+00111;112 %1 = insertelement <4 x float> undef, float %a, i32 0113 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1114 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2115 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3116 %5 = insertelement <4 x float> undef, float %b, i32 0117 %6 = tail call <4 x float> @llvm.x86.sse.add.ss(<4 x float> %4, <4 x float> %5)118 %7 = extractelement <4 x float> %6, i32 1119 ret float %7120}121 122define float @test_add_ss_2(float %a) {123; CHECK-LABEL: @test_add_ss_2(124; CHECK-NEXT: [[TMP1:%.*]] = fadd float [[A:%.*]], [[A]]125; CHECK-NEXT: ret float [[TMP1]]126;127 %1 = insertelement <4 x float> zeroinitializer, float %a, i32 0128 %2 = tail call <4 x float> @llvm.x86.sse.add.ss(<4 x float> %1, <4 x float> %1)129 %3 = extractelement <4 x float> %2, i32 0130 ret float %3131}132 133define float @test_sub_ss_0(float %a, float %b) {134; CHECK-LABEL: @test_sub_ss_0(135; CHECK-NEXT: [[TMP1:%.*]] = fsub float [[A:%.*]], [[B:%.*]]136; CHECK-NEXT: ret float [[TMP1]]137;138 %1 = insertelement <4 x float> undef, float %a, i32 0139 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1140 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2141 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3142 %5 = insertelement <4 x float> undef, float %b, i32 0143 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1144 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2145 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3146 %9 = tail call <4 x float> @llvm.x86.sse.sub.ss(<4 x float> %4, <4 x float> %8)147 %r = extractelement <4 x float> %9, i32 0148 ret float %r149}150 151define float @test_sub_ss_2(float %a, float %b) {152; CHECK-LABEL: @test_sub_ss_2(153; CHECK-NEXT: ret float 2.000000e+00154;155 %1 = insertelement <4 x float> undef, float %a, i32 0156 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1157 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2158 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3159 %5 = insertelement <4 x float> undef, float %b, i32 0160 %6 = tail call <4 x float> @llvm.x86.sse.sub.ss(<4 x float> %4, <4 x float> %5)161 %7 = extractelement <4 x float> %6, i32 2162 ret float %7163}164 165define float @test_sub_ss_3(float %a) {166; CHECK-LABEL: @test_sub_ss_3(167; CHECK-NEXT: [[TMP1:%.*]] = fsub float [[A:%.*]], [[A]]168; CHECK-NEXT: ret float [[TMP1]]169;170 %1 = insertelement <4 x float> zeroinitializer, float %a, i32 0171 %2 = tail call <4 x float> @llvm.x86.sse.sub.ss(<4 x float> %1, <4 x float> %1)172 %3 = extractelement <4 x float> %2, i32 0173 ret float %3174}175 176define float @test_mul_ss_0(float %a, float %b) {177; CHECK-LABEL: @test_mul_ss_0(178; CHECK-NEXT: [[TMP1:%.*]] = fmul float [[A:%.*]], [[B:%.*]]179; CHECK-NEXT: ret float [[TMP1]]180;181 %1 = insertelement <4 x float> undef, float %a, i32 0182 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1183 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2184 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3185 %5 = insertelement <4 x float> undef, float %b, i32 0186 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1187 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2188 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3189 %9 = tail call <4 x float> @llvm.x86.sse.mul.ss(<4 x float> %4, <4 x float> %8)190 %r = extractelement <4 x float> %9, i32 0191 ret float %r192}193 194define float @test_mul_ss_3(float %a, float %b) {195; CHECK-LABEL: @test_mul_ss_3(196; CHECK-NEXT: ret float 3.000000e+00197;198 %1 = insertelement <4 x float> undef, float %a, i32 0199 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1200 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2201 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3202 %5 = insertelement <4 x float> undef, float %b, i32 0203 %6 = tail call <4 x float> @llvm.x86.sse.mul.ss(<4 x float> %4, <4 x float> %5)204 %7 = extractelement <4 x float> %6, i32 3205 ret float %7206}207 208define float @test_mul_ss_4(float %a) {209; CHECK-LABEL: @test_mul_ss_4(210; CHECK-NEXT: [[TMP1:%.*]] = fmul float [[A:%.*]], [[A]]211; CHECK-NEXT: ret float [[TMP1]]212;213 %1 = insertelement <4 x float> zeroinitializer, float %a, i32 0214 %2 = tail call <4 x float> @llvm.x86.sse.mul.ss(<4 x float> %1, <4 x float> %1)215 %3 = extractelement <4 x float> %2, i32 0216 ret float %3217}218 219define float @test_div_ss_0(float %a, float %b) {220; CHECK-LABEL: @test_div_ss_0(221; CHECK-NEXT: [[TMP1:%.*]] = fdiv float [[A:%.*]], [[B:%.*]]222; CHECK-NEXT: ret float [[TMP1]]223;224 %1 = insertelement <4 x float> undef, float %a, i32 0225 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1226 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2227 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3228 %5 = insertelement <4 x float> undef, float %b, i32 0229 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1230 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2231 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3232 %9 = tail call <4 x float> @llvm.x86.sse.div.ss(<4 x float> %4, <4 x float> %8)233 %r = extractelement <4 x float> %9, i32 0234 ret float %r235}236 237define float @test_div_ss_1(float %a, float %b) {238; CHECK-LABEL: @test_div_ss_1(239; CHECK-NEXT: ret float 1.000000e+00240;241 %1 = insertelement <4 x float> undef, float %a, i32 0242 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1243 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2244 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3245 %5 = insertelement <4 x float> undef, float %b, i32 0246 %6 = tail call <4 x float> @llvm.x86.sse.div.ss(<4 x float> %4, <4 x float> %5)247 %7 = extractelement <4 x float> %6, i32 1248 ret float %7249}250 251define float @test_div_ss_2(float %a) {252; CHECK-LABEL: @test_div_ss_2(253; CHECK-NEXT: [[TMP1:%.*]] = fdiv float [[A:%.*]], [[A]]254; CHECK-NEXT: ret float [[TMP1]]255;256 %1 = insertelement <4 x float> zeroinitializer, float %a, i32 0257 %2 = tail call <4 x float> @llvm.x86.sse.div.ss(<4 x float> %1, <4 x float> %1)258 %3 = extractelement <4 x float> %2, i32 0259 ret float %3260}261 262define <4 x float> @test_min_ss(<4 x float> %a, <4 x float> %b) {263; CHECK-LABEL: @test_min_ss(264; CHECK-NEXT: [[TMP1:%.*]] = tail call <4 x float> @llvm.x86.sse.min.ss(<4 x float> [[A:%.*]], <4 x float> [[B:%.*]])265; CHECK-NEXT: ret <4 x float> [[TMP1]]266;267 %1 = insertelement <4 x float> %b, float 1.000000e+00, i32 1268 %2 = insertelement <4 x float> %1, float 2.000000e+00, i32 2269 %3 = insertelement <4 x float> %2, float 3.000000e+00, i32 3270 %4 = tail call <4 x float> @llvm.x86.sse.min.ss(<4 x float> %a, <4 x float> %3)271 ret <4 x float> %4272}273 274define float @test_min_ss_0(float %a, float %b) {275; CHECK-LABEL: @test_min_ss_0(276; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[A:%.*]], i64 0277; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x float> poison, float [[B:%.*]], i64 0278; CHECK-NEXT: [[TMP3:%.*]] = tail call <4 x float> @llvm.x86.sse.min.ss(<4 x float> [[TMP1]], <4 x float> [[TMP2]])279; CHECK-NEXT: [[TMP4:%.*]] = extractelement <4 x float> [[TMP3]], i64 0280; CHECK-NEXT: ret float [[TMP4]]281;282 %1 = insertelement <4 x float> undef, float %a, i32 0283 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1284 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2285 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3286 %5 = insertelement <4 x float> undef, float %b, i32 0287 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1288 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2289 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3290 %9 = tail call <4 x float> @llvm.x86.sse.min.ss(<4 x float> %4, <4 x float> %8)291 %10 = extractelement <4 x float> %9, i32 0292 ret float %10293}294 295define float @test_min_ss_2(float %a, float %b) {296; CHECK-LABEL: @test_min_ss_2(297; CHECK-NEXT: ret float 2.000000e+00298;299 %1 = insertelement <4 x float> undef, float %a, i32 0300 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1301 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2302 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3303 %5 = insertelement <4 x float> undef, float %b, i32 0304 %6 = tail call <4 x float> @llvm.x86.sse.min.ss(<4 x float> %4, <4 x float> %5)305 %7 = extractelement <4 x float> %6, i32 2306 ret float %7307}308 309define float @test_min_ss_3(float %a) {310; CHECK-LABEL: @test_min_ss_3(311; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> <float poison, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, float [[A:%.*]], i64 0312; CHECK-NEXT: [[TMP2:%.*]] = tail call <4 x float> @llvm.x86.sse.min.ss(<4 x float> [[TMP1]], <4 x float> [[TMP1]])313; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x float> [[TMP2]], i64 0314; CHECK-NEXT: ret float [[TMP3]]315;316 %1 = insertelement <4 x float> zeroinitializer, float %a, i32 0317 %2 = tail call <4 x float> @llvm.x86.sse.min.ss(<4 x float> %1, <4 x float> %1)318 %3 = extractelement <4 x float> %2, i32 0319 ret float %3320}321 322define <4 x float> @test_max_ss(<4 x float> %a, <4 x float> %b) {323; CHECK-LABEL: @test_max_ss(324; CHECK-NEXT: [[TMP1:%.*]] = tail call <4 x float> @llvm.x86.sse.max.ss(<4 x float> [[A:%.*]], <4 x float> [[B:%.*]])325; CHECK-NEXT: ret <4 x float> [[TMP1]]326;327 %1 = insertelement <4 x float> %b, float 1.000000e+00, i32 1328 %2 = insertelement <4 x float> %1, float 2.000000e+00, i32 2329 %3 = insertelement <4 x float> %2, float 3.000000e+00, i32 3330 %4 = tail call <4 x float> @llvm.x86.sse.max.ss(<4 x float> %a, <4 x float> %3)331 ret <4 x float> %4332}333 334define float @test_max_ss_0(float %a, float %b) {335; CHECK-LABEL: @test_max_ss_0(336; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[A:%.*]], i64 0337; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x float> poison, float [[B:%.*]], i64 0338; CHECK-NEXT: [[TMP3:%.*]] = tail call <4 x float> @llvm.x86.sse.max.ss(<4 x float> [[TMP1]], <4 x float> [[TMP2]])339; CHECK-NEXT: [[TMP4:%.*]] = extractelement <4 x float> [[TMP3]], i64 0340; CHECK-NEXT: ret float [[TMP4]]341;342 %1 = insertelement <4 x float> undef, float %a, i32 0343 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1344 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2345 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3346 %5 = insertelement <4 x float> undef, float %b, i32 0347 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1348 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2349 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3350 %9 = tail call <4 x float> @llvm.x86.sse.max.ss(<4 x float> %4, <4 x float> %8)351 %10 = extractelement <4 x float> %9, i32 0352 ret float %10353}354 355define float @test_max_ss_3(float %a, float %b) {356; CHECK-LABEL: @test_max_ss_3(357; CHECK-NEXT: ret float 3.000000e+00358;359 %1 = insertelement <4 x float> undef, float %a, i32 0360 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1361 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2362 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3363 %5 = insertelement <4 x float> undef, float %b, i32 0364 %6 = tail call <4 x float> @llvm.x86.sse.max.ss(<4 x float> %4, <4 x float> %5)365 %7 = extractelement <4 x float> %6, i32 3366 ret float %7367}368 369define float @test_max_ss_4(float %a) {370; CHECK-LABEL: @test_max_ss_4(371; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> <float poison, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, float [[A:%.*]], i64 0372; CHECK-NEXT: [[TMP2:%.*]] = tail call <4 x float> @llvm.x86.sse.max.ss(<4 x float> [[TMP1]], <4 x float> [[TMP1]])373; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x float> [[TMP2]], i64 0374; CHECK-NEXT: ret float [[TMP3]]375;376 %1 = insertelement <4 x float> zeroinitializer, float %a, i32 0377 %2 = tail call <4 x float> @llvm.x86.sse.max.ss(<4 x float> %1, <4 x float> %1)378 %3 = extractelement <4 x float> %2, i32 0379 ret float %3380}381 382define <4 x float> @test_cmp_ss(<4 x float> %a, <4 x float> %b) {383; CHECK-LABEL: @test_cmp_ss(384; CHECK-NEXT: [[TMP1:%.*]] = tail call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> [[A:%.*]], <4 x float> [[B:%.*]], i8 0)385; CHECK-NEXT: ret <4 x float> [[TMP1]]386;387 %1 = insertelement <4 x float> %b, float 1.000000e+00, i32 1388 %2 = insertelement <4 x float> %1, float 2.000000e+00, i32 2389 %3 = insertelement <4 x float> %2, float 3.000000e+00, i32 3390 %4 = tail call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> %a, <4 x float> %3, i8 0)391 ret <4 x float> %4392}393 394define float @test_cmp_ss_0(float %a, float %b) {395; CHECK-LABEL: @test_cmp_ss_0(396; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[A:%.*]], i64 0397; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x float> poison, float [[B:%.*]], i64 0398; CHECK-NEXT: [[TMP3:%.*]] = tail call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> [[TMP1]], <4 x float> [[TMP2]], i8 0)399; CHECK-NEXT: [[R:%.*]] = extractelement <4 x float> [[TMP3]], i64 0400; CHECK-NEXT: ret float [[R]]401;402 %1 = insertelement <4 x float> undef, float %a, i32 0403 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1404 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2405 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3406 %5 = insertelement <4 x float> undef, float %b, i32 0407 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1408 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2409 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3410 %9 = tail call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> %4, <4 x float> %8, i8 0)411 %r = extractelement <4 x float> %9, i32 0412 ret float %r413}414 415define float @test_cmp_ss_1(float %a, float %b) {416; CHECK-LABEL: @test_cmp_ss_1(417; CHECK-NEXT: ret float 1.000000e+00418;419 %1 = insertelement <4 x float> undef, float %a, i32 0420 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1421 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2422 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3423 %5 = insertelement <4 x float> undef, float %b, i32 0424 %6 = tail call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> %4, <4 x float> %5, i8 0)425 %7 = extractelement <4 x float> %6, i32 1426 ret float %7427}428 429define float @test_cmp_ss_2(float %a) {430; CHECK-LABEL: @test_cmp_ss_2(431; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> <float poison, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, float [[A:%.*]], i64 0432; CHECK-NEXT: [[TMP2:%.*]] = tail call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> [[TMP1]], <4 x float> [[TMP1]], i8 3)433; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x float> [[TMP2]], i64 0434; CHECK-NEXT: ret float [[TMP3]]435;436 %1 = insertelement <4 x float> zeroinitializer, float %a, i32 0437 %2 = tail call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> %1, <4 x float> %1, i8 3)438 %3 = extractelement <4 x float> %2, i32 0439 ret float %3440}441 442define i32 @test_comieq_ss_0(float %a, float %b) {443; CHECK-LABEL: @test_comieq_ss_0(444; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[A:%.*]], i64 0445; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x float> poison, float [[B:%.*]], i64 0446; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse.comieq.ss(<4 x float> [[TMP1]], <4 x float> [[TMP2]])447; CHECK-NEXT: ret i32 [[TMP3]]448;449 %1 = insertelement <4 x float> undef, float %a, i32 0450 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1451 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2452 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3453 %5 = insertelement <4 x float> undef, float %b, i32 0454 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1455 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2456 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3457 %9 = tail call i32 @llvm.x86.sse.comieq.ss(<4 x float> %4, <4 x float> %8)458 ret i32 %9459}460 461define i32 @test_comige_ss_0(float %a, float %b) {462; CHECK-LABEL: @test_comige_ss_0(463; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[A:%.*]], i64 0464; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x float> poison, float [[B:%.*]], i64 0465; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse.comige.ss(<4 x float> [[TMP1]], <4 x float> [[TMP2]])466; CHECK-NEXT: ret i32 [[TMP3]]467;468 %1 = insertelement <4 x float> undef, float %a, i32 0469 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1470 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2471 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3472 %5 = insertelement <4 x float> undef, float %b, i32 0473 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1474 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2475 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3476 %9 = tail call i32 @llvm.x86.sse.comige.ss(<4 x float> %4, <4 x float> %8)477 ret i32 %9478}479 480define i32 @test_comigt_ss_0(float %a, float %b) {481; CHECK-LABEL: @test_comigt_ss_0(482; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[A:%.*]], i64 0483; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x float> poison, float [[B:%.*]], i64 0484; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse.comigt.ss(<4 x float> [[TMP1]], <4 x float> [[TMP2]])485; CHECK-NEXT: ret i32 [[TMP3]]486;487 %1 = insertelement <4 x float> undef, float %a, i32 0488 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1489 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2490 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3491 %5 = insertelement <4 x float> undef, float %b, i32 0492 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1493 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2494 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3495 %9 = tail call i32 @llvm.x86.sse.comigt.ss(<4 x float> %4, <4 x float> %8)496 ret i32 %9497}498 499define i32 @test_comile_ss_0(float %a, float %b) {500; CHECK-LABEL: @test_comile_ss_0(501; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[A:%.*]], i64 0502; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x float> poison, float [[B:%.*]], i64 0503; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse.comile.ss(<4 x float> [[TMP1]], <4 x float> [[TMP2]])504; CHECK-NEXT: ret i32 [[TMP3]]505;506 %1 = insertelement <4 x float> undef, float %a, i32 0507 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1508 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2509 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3510 %5 = insertelement <4 x float> undef, float %b, i32 0511 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1512 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2513 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3514 %9 = tail call i32 @llvm.x86.sse.comile.ss(<4 x float> %4, <4 x float> %8)515 ret i32 %9516}517 518define i32 @test_comilt_ss_0(float %a, float %b) {519; CHECK-LABEL: @test_comilt_ss_0(520; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[A:%.*]], i64 0521; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x float> poison, float [[B:%.*]], i64 0522; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse.comilt.ss(<4 x float> [[TMP1]], <4 x float> [[TMP2]])523; CHECK-NEXT: ret i32 [[TMP3]]524;525 %1 = insertelement <4 x float> undef, float %a, i32 0526 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1527 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2528 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3529 %5 = insertelement <4 x float> undef, float %b, i32 0530 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1531 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2532 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3533 %9 = tail call i32 @llvm.x86.sse.comilt.ss(<4 x float> %4, <4 x float> %8)534 ret i32 %9535}536 537define i32 @test_comineq_ss_0(float %a, float %b) {538; CHECK-LABEL: @test_comineq_ss_0(539; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[A:%.*]], i64 0540; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x float> poison, float [[B:%.*]], i64 0541; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse.comineq.ss(<4 x float> [[TMP1]], <4 x float> [[TMP2]])542; CHECK-NEXT: ret i32 [[TMP3]]543;544 %1 = insertelement <4 x float> undef, float %a, i32 0545 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1546 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2547 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3548 %5 = insertelement <4 x float> undef, float %b, i32 0549 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1550 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2551 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3552 %9 = tail call i32 @llvm.x86.sse.comineq.ss(<4 x float> %4, <4 x float> %8)553 ret i32 %9554}555 556define i32 @test_ucomieq_ss_0(float %a, float %b) {557; CHECK-LABEL: @test_ucomieq_ss_0(558; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[A:%.*]], i64 0559; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x float> poison, float [[B:%.*]], i64 0560; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse.ucomieq.ss(<4 x float> [[TMP1]], <4 x float> [[TMP2]])561; CHECK-NEXT: ret i32 [[TMP3]]562;563 %1 = insertelement <4 x float> undef, float %a, i32 0564 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1565 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2566 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3567 %5 = insertelement <4 x float> undef, float %b, i32 0568 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1569 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2570 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3571 %9 = tail call i32 @llvm.x86.sse.ucomieq.ss(<4 x float> %4, <4 x float> %8)572 ret i32 %9573}574 575define i32 @test_ucomige_ss_0(float %a, float %b) {576; CHECK-LABEL: @test_ucomige_ss_0(577; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[A:%.*]], i64 0578; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x float> poison, float [[B:%.*]], i64 0579; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse.ucomige.ss(<4 x float> [[TMP1]], <4 x float> [[TMP2]])580; CHECK-NEXT: ret i32 [[TMP3]]581;582 %1 = insertelement <4 x float> undef, float %a, i32 0583 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1584 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2585 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3586 %5 = insertelement <4 x float> undef, float %b, i32 0587 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1588 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2589 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3590 %9 = tail call i32 @llvm.x86.sse.ucomige.ss(<4 x float> %4, <4 x float> %8)591 ret i32 %9592}593 594define i32 @test_ucomigt_ss_0(float %a, float %b) {595; CHECK-LABEL: @test_ucomigt_ss_0(596; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[A:%.*]], i64 0597; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x float> poison, float [[B:%.*]], i64 0598; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse.ucomigt.ss(<4 x float> [[TMP1]], <4 x float> [[TMP2]])599; CHECK-NEXT: ret i32 [[TMP3]]600;601 %1 = insertelement <4 x float> undef, float %a, i32 0602 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1603 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2604 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3605 %5 = insertelement <4 x float> undef, float %b, i32 0606 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1607 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2608 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3609 %9 = tail call i32 @llvm.x86.sse.ucomigt.ss(<4 x float> %4, <4 x float> %8)610 ret i32 %9611}612 613define i32 @test_ucomile_ss_0(float %a, float %b) {614; CHECK-LABEL: @test_ucomile_ss_0(615; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[A:%.*]], i64 0616; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x float> poison, float [[B:%.*]], i64 0617; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse.ucomile.ss(<4 x float> [[TMP1]], <4 x float> [[TMP2]])618; CHECK-NEXT: ret i32 [[TMP3]]619;620 %1 = insertelement <4 x float> undef, float %a, i32 0621 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1622 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2623 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3624 %5 = insertelement <4 x float> undef, float %b, i32 0625 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1626 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2627 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3628 %9 = tail call i32 @llvm.x86.sse.ucomile.ss(<4 x float> %4, <4 x float> %8)629 ret i32 %9630}631 632define i32 @test_ucomilt_ss_0(float %a, float %b) {633; CHECK-LABEL: @test_ucomilt_ss_0(634; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[A:%.*]], i64 0635; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x float> poison, float [[B:%.*]], i64 0636; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse.ucomilt.ss(<4 x float> [[TMP1]], <4 x float> [[TMP2]])637; CHECK-NEXT: ret i32 [[TMP3]]638;639 %1 = insertelement <4 x float> undef, float %a, i32 0640 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1641 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2642 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3643 %5 = insertelement <4 x float> undef, float %b, i32 0644 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1645 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2646 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3647 %9 = tail call i32 @llvm.x86.sse.ucomilt.ss(<4 x float> %4, <4 x float> %8)648 ret i32 %9649}650 651define i32 @test_ucomineq_ss_0(float %a, float %b) {652; CHECK-LABEL: @test_ucomineq_ss_0(653; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[A:%.*]], i64 0654; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x float> poison, float [[B:%.*]], i64 0655; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @llvm.x86.sse.ucomineq.ss(<4 x float> [[TMP1]], <4 x float> [[TMP2]])656; CHECK-NEXT: ret i32 [[TMP3]]657;658 %1 = insertelement <4 x float> undef, float %a, i32 0659 %2 = insertelement <4 x float> %1, float 1.000000e+00, i32 1660 %3 = insertelement <4 x float> %2, float 2.000000e+00, i32 2661 %4 = insertelement <4 x float> %3, float 3.000000e+00, i32 3662 %5 = insertelement <4 x float> undef, float %b, i32 0663 %6 = insertelement <4 x float> %5, float 4.000000e+00, i32 1664 %7 = insertelement <4 x float> %6, float 5.000000e+00, i32 2665 %8 = insertelement <4 x float> %7, float 6.000000e+00, i32 3666 %9 = tail call i32 @llvm.x86.sse.ucomineq.ss(<4 x float> %4, <4 x float> %8)667 ret i32 %9668}669 670declare <4 x float> @llvm.x86.sse.rcp.ss(<4 x float>)671declare <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float>)672declare <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float>)673 674declare <4 x float> @llvm.x86.sse.add.ss(<4 x float>, <4 x float>)675declare <4 x float> @llvm.x86.sse.sub.ss(<4 x float>, <4 x float>)676declare <4 x float> @llvm.x86.sse.mul.ss(<4 x float>, <4 x float>)677declare <4 x float> @llvm.x86.sse.div.ss(<4 x float>, <4 x float>)678declare <4 x float> @llvm.x86.sse.min.ss(<4 x float>, <4 x float>)679declare <4 x float> @llvm.x86.sse.max.ss(<4 x float>, <4 x float>)680declare <4 x float> @llvm.x86.sse.cmp.ss(<4 x float>, <4 x float>, i8)681 682declare i32 @llvm.x86.sse.comieq.ss(<4 x float>, <4 x float>)683declare i32 @llvm.x86.sse.comige.ss(<4 x float>, <4 x float>)684declare i32 @llvm.x86.sse.comigt.ss(<4 x float>, <4 x float>)685declare i32 @llvm.x86.sse.comile.ss(<4 x float>, <4 x float>)686declare i32 @llvm.x86.sse.comilt.ss(<4 x float>, <4 x float>)687declare i32 @llvm.x86.sse.comineq.ss(<4 x float>, <4 x float>)688 689declare i32 @llvm.x86.sse.ucomieq.ss(<4 x float>, <4 x float>)690declare i32 @llvm.x86.sse.ucomige.ss(<4 x float>, <4 x float>)691declare i32 @llvm.x86.sse.ucomigt.ss(<4 x float>, <4 x float>)692declare i32 @llvm.x86.sse.ucomile.ss(<4 x float>, <4 x float>)693declare i32 @llvm.x86.sse.ucomilt.ss(<4 x float>, <4 x float>)694declare i32 @llvm.x86.sse.ucomineq.ss(<4 x float>, <4 x float>)695