brintos

brintos / llvm-project-archived public Read only

0
0
Text · 32.2 KiB · ca2a0f7 Raw
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