1283 lines · plain
1; RUN: llc -mtriple=armv8a-none-eabi %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SP,CHECK-DP,CHECK-SP-V8,CHECK-DP-V82; RUN: llc -mtriple=thumbv8m.main-none-eabi %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-NOSP,CHECK-NODP3; RUN: llc -mtriple=thumbv8m.main-none-eabi %s -o - -mattr=fp-armv8 | FileCheck %s --check-prefixes=CHECK,CHECK-SP,CHECK-DP,CHECK-SP-V8,CHECK-DP-V84; RUN: llc -mtriple=thumbv8m.main-none-eabi %s -o - -mattr=fp-armv8sp | FileCheck %s --check-prefixes=CHECK,CHECK-SP,CHECK-NODP,CHECK-SP-V85; RUN: llc -mtriple=armv7a-none-eabi %s -o - -mattr=vfp4 | FileCheck %s --check-prefixes=CHECK,CHECK-SP,CHECK-DP,CHECK-SP-NOV8,CHECK-DP-NOV86; RUN: llc -mtriple=thumbv7m-none-eabi %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-NOSP,CHECK-NODP7; RUN: llc -mtriple=thumbv7m-none-eabi %s -o - -mattr=vfp4 | FileCheck %s --check-prefixes=CHECK,CHECK-SP,CHECK-DP,CHECK-SP-NOV8,CHECK-DP-NOV88; RUN: llc -mtriple=thumbv7m-none-eabi %s -o - -mattr=vfp4sp | FileCheck %s --check-prefixes=CHECK,CHECK-SP,CHECK-NODP,CHECK-SP-NOV89 10; Check that constrained fp intrinsics are correctly lowered. In particular11; check that the valid combinations of single-precision and double-precision12; hardware being present or absent work as expected (i.e. we get an instruction13; when one is available, otherwise a libcall).14 15; FIXME: We're not generating the right instructions for some of these16; operations (see further FIXMEs down below).17 18; Single-precision intrinsics19 20; CHECK-LABEL: add_f32:21; CHECK-NOSP: bl __aeabi_fadd22; CHECK-SP: vadd.f3223define float @add_f32(float %x, float %y) #0 {24 %val = call float @llvm.experimental.constrained.fadd.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #025 ret float %val26}27 28; CHECK-LABEL: sub_f32:29; CHECK-NOSP: bl __aeabi_fsub30; CHECK-SP: vsub.f3231define float @sub_f32(float %x, float %y) #0 {32 %val = call float @llvm.experimental.constrained.fsub.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #033 ret float %val34}35 36; CHECK-LABEL: mul_f32:37; CHECK-NOSP: bl __aeabi_fmul38; CHECK-SP: vmul.f3239define float @mul_f32(float %x, float %y) #0 {40 %val = call float @llvm.experimental.constrained.fmul.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #041 ret float %val42}43 44; CHECK-LABEL: div_f32:45; CHECK-NOSP: bl __aeabi_fdiv46; CHECK-SP: vdiv.f3247define float @div_f32(float %x, float %y) #0 {48 %val = call float @llvm.experimental.constrained.fdiv.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #049 ret float %val50}51 52; CHECK-LABEL: frem_f32:53; CHECK: bl fmodf54define float @frem_f32(float %x, float %y) #0 {55 %val = call float @llvm.experimental.constrained.frem.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #056 ret float %val57}58 59; CHECK-LABEL: fma_f32:60; CHECK-NOSP: bl fmaf61; CHECK-SP: vfma.f3262define float @fma_f32(float %x, float %y, float %z) #0 {63 %val = call float @llvm.experimental.constrained.fma.f32(float %x, float %y, float %z, metadata !"round.tonearest", metadata !"fpexcept.strict") #064 ret float %val65}66 67; CHECK-LABEL: fptosi_f32:68; CHECK-NOSP: bl __aeabi_f2iz69; CHECK-SP: vcvt.s32.f3270define i32 @fptosi_f32(float %x) #0 {71 %val = call i32 @llvm.experimental.constrained.fptosi.i32.f32(float %x, metadata !"fpexcept.strict") #072 ret i32 %val73}74 75; CHECK-LABEL: fptosi_f32_twice:76; CHECK-NOSP: bl __aeabi_f2iz77; CHECK-NOSP: bl __aeabi_f2iz78; CHECK-SP: vcvt.s32.f3279define void @fptosi_f32_twice(float %arg, ptr %ptr) #0 {80entry:81 %conv = call i32 @llvm.experimental.constrained.fptosi.i32.f32(float %arg, metadata !"fpexcept.strict") #082 store i32 %conv, ptr %ptr, align 483 %conv1 = call i32 @llvm.experimental.constrained.fptosi.i32.f32(float %arg, metadata !"fpexcept.strict") #084 %idx = getelementptr inbounds i32, ptr %ptr, i32 185 store i32 %conv1, ptr %idx, align 486 ret void87}88 89; CHECK-LABEL: fptoui_f32:90; CHECK-NOSP: bl __aeabi_f2uiz91; FIXME-CHECK-SP: vcvt.u32.f3292define i32 @fptoui_f32(float %x) #0 {93 %val = call i32 @llvm.experimental.constrained.fptoui.i32.f32(float %x, metadata !"fpexcept.strict") #094 ret i32 %val95}96 97; CHECK-LABEL: fptoui_f32_twice:98; CHECK-NOSP: bl __aeabi_f2uiz99; CHECK-NOSP: bl __aeabi_f2uiz100; FIXME-CHECK-SP: vcvt.u32.f32101; FIXME-CHECK-SP: vcvt.u32.f32102define void @fptoui_f32_twice(float %arg, ptr %ptr) #0 {103entry:104 %conv = call i32 @llvm.experimental.constrained.fptoui.i32.f32(float %arg, metadata !"fpexcept.strict") #0105 store i32 %conv, ptr %ptr, align 4106 %conv1 = call i32 @llvm.experimental.constrained.fptoui.i32.f32(float %arg, metadata !"fpexcept.strict") #0107 %idx = getelementptr inbounds i32, ptr %ptr, i32 1108 store i32 %conv1, ptr %idx, align 4109 ret void110}111 112; CHECK-LABEL: sqrt_f32:113; CHECK-NOSP: bl sqrtf114; CHECK-SP: vsqrt.f32115define float @sqrt_f32(float %x) #0 {116 %val = call float @llvm.experimental.constrained.sqrt.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0117 ret float %val118}119 120; CHECK-LABEL: powi_f32:121; CHECK: bl __powisf2122define float @powi_f32(float %x, i32 %y) #0 {123 %val = call float @llvm.experimental.constrained.powi.f32(float %x, i32 %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0124 ret float %val125}126 127; CHECK-LABEL: sin_f32:128; CHECK: bl sinf129define float @sin_f32(float %x) #0 {130 %val = call float @llvm.experimental.constrained.sin.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0131 ret float %val132}133 134; CHECK-LABEL: cos_f32:135; CHECK: bl cosf136define float @cos_f32(float %x) #0 {137 %val = call float @llvm.experimental.constrained.cos.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0138 ret float %val139}140 141; CHECK-LABEL: tan_f32:142; CHECK: bl tanf143define float @tan_f32(float %x) #0 {144 %val = call float @llvm.experimental.constrained.tan.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0145 ret float %val146}147 148; CHECK-LABEL: acos_f32:149; CHECK: bl acosf150define float @acos_f32(float %x, float %y) #0 {151 %val = call float @llvm.experimental.constrained.acos.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0152 ret float %val153}154 155; CHECK-LABEL: asin_f32:156; CHECK: bl asinf157define float @asin_f32(float %x, float %y) #0 {158 %val = call float @llvm.experimental.constrained.asin.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0159 ret float %val160}161 162; CHECK-LABEL: atan_f32:163; CHECK: bl atanf164define float @atan_f32(float %x, float %y) #0 {165 %val = call float @llvm.experimental.constrained.atan.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0166 ret float %val167}168 169; CHECK-LABEL: cosh_f32:170; CHECK: bl coshf171define float @cosh_f32(float %x, float %y) #0 {172 %val = call float @llvm.experimental.constrained.cosh.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0173 ret float %val174}175 176; CHECK-LABEL: sinh_f32:177; CHECK: bl sinhf178define float @sinh_f32(float %x, float %y) #0 {179 %val = call float @llvm.experimental.constrained.sinh.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0180 ret float %val181}182 183; CHECK-LABEL: tanh_f32:184; CHECK: bl tanhf185define float @tanh_f32(float %x, float %y) #0 {186 %val = call float @llvm.experimental.constrained.tanh.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0187 ret float %val188}189 190; CHECK-LABEL: fmuladd_f32:191; CHECK-SP: vfma.f32192; CHECK-NOSP: bl __aeabi_fmul193; CHECK-NOSP: bl __aeabi_fadd194define float @fmuladd_f32(float %x, float %y, float %z) #0 {195 %val = call float @llvm.experimental.constrained.fmuladd.f32(float %x, float %y, float %z, metadata !"round.tonearest", metadata !"fpexcept.strict") #0196 ret float %val197}198 199; CHECK-LABEL: ldexp_f32:200; CHECK: bl ldexpf201define float @ldexp_f32(float %x, i32 %y) #0 {202 %val = call float @llvm.experimental.constrained.ldexp.f32.i32(float %x, i32 %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0203 ret float %val204}205 206; CHECK-LABEL: roundeven_f32:207; CHECK-SP-V8: vrintn.f32208; CHECK-NOSP: bl roundevenf209define float @roundeven_f32(float %x) #0 {210 %val = call float @llvm.experimental.constrained.roundeven.f32(float %x, metadata !"fpexcept.strict") #0211 ret float %val212}213 214; CHECK-LABEL: uitofp_f32_i32:215; CHECK-NOSP: bl __aeabi_ui2f216; FIXME-CHECK-SP: vcvt.f32.f64217define float @uitofp_f32_i32(i32 %x) #0 {218 %val = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0219 ret float %val220}221 222; CHECK-LABEL: atan2_f32:223; CHECK: bl atan2f224define float @atan2_f32(float %x, float %y) #0 {225 %val = call float @llvm.experimental.constrained.atan2.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0226 ret float %val227}228 229; CHECK-LABEL: pow_f32:230; CHECK: bl powf231define float @pow_f32(float %x, float %y) #0 {232 %val = call float @llvm.experimental.constrained.pow.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0233 ret float %val234}235 236; CHECK-LABEL: log_f32:237; CHECK: bl logf238define float @log_f32(float %x) #0 {239 %val = call float @llvm.experimental.constrained.log.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0240 ret float %val241}242 243; CHECK-LABEL: log10_f32:244; CHECK: bl log10f245define float @log10_f32(float %x) #0 {246 %val = call float @llvm.experimental.constrained.log10.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0247 ret float %val248}249 250; CHECK-LABEL: log2_f32:251; CHECK: bl log2f252define float @log2_f32(float %x) #0 {253 %val = call float @llvm.experimental.constrained.log2.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0254 ret float %val255}256 257; CHECK-LABEL: exp_f32:258; CHECK: bl expf259define float @exp_f32(float %x) #0 {260 %val = call float @llvm.experimental.constrained.exp.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0261 ret float %val262}263 264; CHECK-LABEL: exp2_f32:265; CHECK: bl exp2f266define float @exp2_f32(float %x) #0 {267 %val = call float @llvm.experimental.constrained.exp2.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0268 ret float %val269}270 271; CHECK-LABEL: rint_f32:272; CHECK-NOSP: bl rintf273; CHECK-SP-NOV8: bl rintf274; CHECK-SP-V8: vrintx.f32275define float @rint_f32(float %x) #0 {276 %val = call float @llvm.experimental.constrained.rint.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0277 ret float %val278}279 280; CHECK-LABEL: nearbyint_f32:281; CHECK-NOSP: bl nearbyintf282; CHECK-SP-NOV8: bl nearbyintf283; CHECK-SP-V8: vrintr.f32284define float @nearbyint_f32(float %x) #0 {285 %val = call float @llvm.experimental.constrained.nearbyint.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0286 ret float %val287}288 289; CHECK-LABEL: lrint_f32:290; CHECK: bl lrintf291define i32 @lrint_f32(float %x) #0 {292 %val = call i32 @llvm.experimental.constrained.lrint.i32.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0293 ret i32 %val294}295 296; CHECK-LABEL: llrint_f32:297; CHECK: bl llrintf298define i32 @llrint_f32(float %x) #0 {299 %val = call i32 @llvm.experimental.constrained.llrint.i32.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0300 ret i32 %val301}302 303; CHECK-LABEL: maxnum_f32:304; CHECK-NOSP: bl fmaxf305; CHECK-SP-NOV8: bl fmaxf306; CHECK-SP-V8: vmaxnm.f32307define float @maxnum_f32(float %x, float %y) #0 {308 %val = call float @llvm.experimental.constrained.maxnum.f32(float %x, float %y, metadata !"fpexcept.strict") #0309 ret float %val310}311 312; CHECK-LABEL: minnum_f32:313; CHECK-NOSP: bl fminf314; CHECK-SP-NOV8: bl fminf315; CHECK-SP-V8: vminnm.f32316define float @minnum_f32(float %x, float %y) #0 {317 %val = call float @llvm.experimental.constrained.minnum.f32(float %x, float %y, metadata !"fpexcept.strict") #0318 ret float %val319}320 321; CHECK-LABEL: ceil_f32:322; CHECK-NOSP: bl ceilf323; CHECK-SP-NOV8: bl ceilf324; CHECK-SP-V8: vrintp.f32325define float @ceil_f32(float %x) #0 {326 %val = call float @llvm.experimental.constrained.ceil.f32(float %x, metadata !"fpexcept.strict") #0327 ret float %val328}329 330; CHECK-LABEL: floor_f32:331; CHECK-NOSP: bl floorf332; CHECK-SP-NOV8: bl floorf333; CHECK-SP-V8: vrintm.f32334define float @floor_f32(float %x) #0 {335 %val = call float @llvm.experimental.constrained.floor.f32(float %x, metadata !"fpexcept.strict") #0336 ret float %val337}338 339; CHECK-LABEL: lround_f32:340; CHECK: bl lroundf341define i32 @lround_f32(float %x) #0 {342 %val = call i32 @llvm.experimental.constrained.lround.i32.f32(float %x, metadata !"fpexcept.strict") #0343 ret i32 %val344}345 346; CHECK-LABEL: llround_f32:347; CHECK: bl llroundf348define i32 @llround_f32(float %x) #0 {349 %val = call i32 @llvm.experimental.constrained.llround.i32.f32(float %x, metadata !"fpexcept.strict") #0350 ret i32 %val351}352 353; CHECK-LABEL: round_f32:354; CHECK-NOSP: bl roundf355; CHECK-SP-NOV8: bl roundf356; CHECK-SP-V8: vrinta.f32357define float @round_f32(float %x) #0 {358 %val = call float @llvm.experimental.constrained.round.f32(float %x, metadata !"fpexcept.strict") #0359 ret float %val360}361 362; CHECK-LABEL: trunc_f32:363; CHECK-NOSP: bl truncf364; CHECK-SP-NOV8: bl truncf365; CHECK-SP-V8: vrintz.f32366define float @trunc_f32(float %x) #0 {367 %val = call float @llvm.experimental.constrained.trunc.f32(float %x, metadata !"fpexcept.strict") #0368 ret float %val369}370 371; CHECK-LABEL: fcmp_olt_f32:372; CHECK-NOSP: bl __aeabi_fcmplt373; CHECK-SP: vcmp.f32374define i32 @fcmp_olt_f32(float %a, float %b) #0 {375 %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"olt", metadata !"fpexcept.strict") #0376 %conv = zext i1 %cmp to i32377 ret i32 %conv378}379 380; CHECK-LABEL: fcmp_ole_f32:381; CHECK-NOSP: bl __aeabi_fcmple382; CHECK-SP: vcmp.f32383define i32 @fcmp_ole_f32(float %a, float %b) #0 {384 %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ole", metadata !"fpexcept.strict") #0385 %conv = zext i1 %cmp to i32386 ret i32 %conv387}388 389; CHECK-LABEL: fcmp_ogt_f32:390; CHECK-NOSP: bl __aeabi_fcmpgt391; CHECK-SP: vcmp.f32392define i32 @fcmp_ogt_f32(float %a, float %b) #0 {393 %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ogt", metadata !"fpexcept.strict") #0394 %conv = zext i1 %cmp to i32395 ret i32 %conv396}397 398; CHECK-LABEL: fcmp_oge_f32:399; CHECK-NOSP: bl __aeabi_fcmpge400; CHECK-SP: vcmp.f32401define i32 @fcmp_oge_f32(float %a, float %b) #0 {402 %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"oge", metadata !"fpexcept.strict") #0403 %conv = zext i1 %cmp to i32404 ret i32 %conv405}406 407; CHECK-LABEL: fcmp_oeq_f32:408; CHECK-NOSP: bl __aeabi_fcmpeq409; CHECK-SP: vcmp.f32410define i32 @fcmp_oeq_f32(float %a, float %b) #0 {411 %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"oeq", metadata !"fpexcept.strict") #0412 %conv = zext i1 %cmp to i32413 ret i32 %conv414}415 416; CHECK-LABEL: fcmp_one_f32:417; CHECK-NOSP: bl __aeabi_fcmpeq418; CHECK-NOSP: bl __aeabi_fcmpun419; CHECK-SP: vcmp.f32420define i32 @fcmp_one_f32(float %a, float %b) #0 {421 %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"one", metadata !"fpexcept.strict") #0422 %conv = zext i1 %cmp to i32423 ret i32 %conv424}425 426; CHECK-LABEL: fcmp_ult_f32:427; CHECK-NOSP: bl __aeabi_fcmpge428; CHECK-SP: vcmp.f32429define i32 @fcmp_ult_f32(float %a, float %b) #0 {430 %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ult", metadata !"fpexcept.strict") #0431 %conv = zext i1 %cmp to i32432 ret i32 %conv433}434 435; CHECK-LABEL: fcmp_ule_f32:436; CHECK-NOSP: bl __aeabi_fcmpgt437; CHECK-SP: vcmp.f32438define i32 @fcmp_ule_f32(float %a, float %b) #0 {439 %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ule", metadata !"fpexcept.strict") #0440 %conv = zext i1 %cmp to i32441 ret i32 %conv442}443 444; CHECK-LABEL: fcmp_ugt_f32:445; CHECK-NOSP: bl __aeabi_fcmple446; CHECK-SP: vcmp.f32447define i32 @fcmp_ugt_f32(float %a, float %b) #0 {448 %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ugt", metadata !"fpexcept.strict") #0449 %conv = zext i1 %cmp to i32450 ret i32 %conv451}452 453; CHECK-LABEL: fcmp_uge_f32:454; CHECK-NOSP: bl __aeabi_fcmplt455; CHECK-SP: vcmp.f32456define i32 @fcmp_uge_f32(float %a, float %b) #0 {457 %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"uge", metadata !"fpexcept.strict") #0458 %conv = zext i1 %cmp to i32459 ret i32 %conv460}461 462; CHECK-LABEL: fcmp_ueq_f32:463; CHECK-NOSP: bl __aeabi_fcmpeq464; CHECK-NOSP: bl __aeabi_fcmpun465; CHECK-SP: vcmp.f32466define i32 @fcmp_ueq_f32(float %a, float %b) #0 {467 %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ueq", metadata !"fpexcept.strict") #0468 %conv = zext i1 %cmp to i32469 ret i32 %conv470}471 472; CHECK-LABEL: fcmp_une_f32:473; CHECK-NOSP: bl __aeabi_fcmpeq474; CHECK-SP: vcmp.f32475define i32 @fcmp_une_f32(float %a, float %b) #0 {476 %cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"une", metadata !"fpexcept.strict") #0477 %conv = zext i1 %cmp to i32478 ret i32 %conv479}480 481; CHECK-LABEL: fcmps_olt_f32:482; CHECK-NOSP: bl __aeabi_fcmplt483; CHECK-SP: vcmpe.f32484define i32 @fcmps_olt_f32(float %a, float %b) #0 {485 %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"olt", metadata !"fpexcept.strict") #0486 %conv = zext i1 %cmp to i32487 ret i32 %conv488}489 490; CHECK-LABEL: fcmps_ole_f32:491; CHECK-NOSP: bl __aeabi_fcmple492; CHECK-SP: vcmpe.f32493define i32 @fcmps_ole_f32(float %a, float %b) #0 {494 %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ole", metadata !"fpexcept.strict") #0495 %conv = zext i1 %cmp to i32496 ret i32 %conv497}498 499; CHECK-LABEL: fcmps_ogt_f32:500; CHECK-NOSP: bl __aeabi_fcmpgt501; CHECK-SP: vcmpe.f32502define i32 @fcmps_ogt_f32(float %a, float %b) #0 {503 %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ogt", metadata !"fpexcept.strict") #0504 %conv = zext i1 %cmp to i32505 ret i32 %conv506}507 508; CHECK-LABEL: fcmps_oge_f32:509; CHECK-NOSP: bl __aeabi_fcmpge510; CHECK-SP: vcmpe.f32511define i32 @fcmps_oge_f32(float %a, float %b) #0 {512 %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"oge", metadata !"fpexcept.strict") #0513 %conv = zext i1 %cmp to i32514 ret i32 %conv515}516 517; CHECK-LABEL: fcmps_oeq_f32:518; CHECK-NOSP: bl __aeabi_fcmpeq519; CHECK-SP: vcmpe.f32520define i32 @fcmps_oeq_f32(float %a, float %b) #0 {521 %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"oeq", metadata !"fpexcept.strict") #0522 %conv = zext i1 %cmp to i32523 ret i32 %conv524}525 526; CHECK-LABEL: fcmps_one_f32:527; CHECK-NOSP: bl __aeabi_fcmpeq528; CHECK-NOSP: bl __aeabi_fcmpun529; CHECK-SP: vcmpe.f32530define i32 @fcmps_one_f32(float %a, float %b) #0 {531 %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"one", metadata !"fpexcept.strict") #0532 %conv = zext i1 %cmp to i32533 ret i32 %conv534}535 536; CHECK-LABEL: fcmps_ult_f32:537; CHECK-NOSP: bl __aeabi_fcmpge538; CHECK-SP: vcmpe.f32539define i32 @fcmps_ult_f32(float %a, float %b) #0 {540 %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ult", metadata !"fpexcept.strict") #0541 %conv = zext i1 %cmp to i32542 ret i32 %conv543}544 545; CHECK-LABEL: fcmps_ule_f32:546; CHECK-NOSP: bl __aeabi_fcmpgt547; CHECK-SP: vcmpe.f32548define i32 @fcmps_ule_f32(float %a, float %b) #0 {549 %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ule", metadata !"fpexcept.strict") #0550 %conv = zext i1 %cmp to i32551 ret i32 %conv552}553 554; CHECK-LABEL: fcmps_ugt_f32:555; CHECK-NOSP: bl __aeabi_fcmple556; CHECK-SP: vcmpe.f32557define i32 @fcmps_ugt_f32(float %a, float %b) #0 {558 %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ugt", metadata !"fpexcept.strict") #0559 %conv = zext i1 %cmp to i32560 ret i32 %conv561}562 563; CHECK-LABEL: fcmps_uge_f32:564; CHECK-NOSP: bl __aeabi_fcmplt565; CHECK-SP: vcmpe.f32566define i32 @fcmps_uge_f32(float %a, float %b) #0 {567 %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"uge", metadata !"fpexcept.strict") #0568 %conv = zext i1 %cmp to i32569 ret i32 %conv570}571 572; CHECK-LABEL: fcmps_ueq_f32:573; CHECK-NOSP: bl __aeabi_fcmpeq574; CHECK-NOSP: bl __aeabi_fcmpun575; CHECK-SP: vcmpe.f32576define i32 @fcmps_ueq_f32(float %a, float %b) #0 {577 %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ueq", metadata !"fpexcept.strict") #0578 %conv = zext i1 %cmp to i32579 ret i32 %conv580}581 582; CHECK-LABEL: fcmps_une_f32:583; CHECK-NOSP: bl __aeabi_fcmpeq584; CHECK-SP: vcmpe.f32585define i32 @fcmps_une_f32(float %a, float %b) #0 {586 %cmp = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"une", metadata !"fpexcept.strict") #0587 %conv = zext i1 %cmp to i32588 ret i32 %conv589}590 591 592; Double-precision intrinsics593 594; CHECK-LABEL: add_f64:595; CHECK-NODP: bl __aeabi_dadd596; CHECK-DP: vadd.f64597define double @add_f64(double %x, double %y) #0 {598 %val = call double @llvm.experimental.constrained.fadd.f64(double %x, double %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0599 ret double %val600}601 602; CHECK-LABEL: sub_f64:603; CHECK-NODP: bl __aeabi_dsub604; CHECK-DP: vsub.f64605define double @sub_f64(double %x, double %y) #0 {606 %val = call double @llvm.experimental.constrained.fsub.f64(double %x, double %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0607 ret double %val608}609 610; CHECK-LABEL: mul_f64:611; CHECK-NODP: bl __aeabi_dmul612; CHECK-DP: vmul.f64613define double @mul_f64(double %x, double %y) #0 {614 %val = call double @llvm.experimental.constrained.fmul.f64(double %x, double %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0615 ret double %val616}617 618; CHECK-LABEL: div_f64:619; CHECK-NODP: bl __aeabi_ddiv620; CHECK-DP: vdiv.f64621define double @div_f64(double %x, double %y) #0 {622 %val = call double @llvm.experimental.constrained.fdiv.f64(double %x, double %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0623 ret double %val624}625 626; CHECK-LABEL: frem_f64:627; CHECK: bl fmod628define double @frem_f64(double %x, double %y) #0 {629 %val = call double @llvm.experimental.constrained.frem.f64(double %x, double %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0630 ret double %val631}632 633; CHECK-LABEL: fma_f64:634; CHECK-NODP: bl fma635; CHECK-DP: vfma.f64636define double @fma_f64(double %x, double %y, double %z) #0 {637 %val = call double @llvm.experimental.constrained.fma.f64(double %x, double %y, double %z, metadata !"round.tonearest", metadata !"fpexcept.strict") #0638 ret double %val639}640 641; CHECK-LABEL: fptosi_f64:642; CHECK-NODP: bl __aeabi_d2iz643; CHECK-DP: vcvt.s32.f64644define i32 @fptosi_f64(double %x) #0 {645 %val = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %x, metadata !"fpexcept.strict") #0646 ret i32 %val647}648 649; CHECK-LABEL: fptoui_f64:650; CHECK-NODP: bl __aeabi_d2uiz651; FIXME-CHECK-DP: vcvt.u32.f64652define i32 @fptoui_f64(double %x) #0 {653 %val = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %x, metadata !"fpexcept.strict") #0654 ret i32 %val655}656 657; CHECK-LABEL: sqrt_f64:658; CHECK-NODP: bl sqrt659; CHECK-DP: vsqrt.f64660define double @sqrt_f64(double %x) #0 {661 %val = call double @llvm.experimental.constrained.sqrt.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0662 ret double %val663}664 665; CHECK-LABEL: powi_f64:666; CHECK: bl __powidf2667define double @powi_f64(double %x, i32 %y) #0 {668 %val = call double @llvm.experimental.constrained.powi.f64(double %x, i32 %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0669 ret double %val670}671 672; CHECK-LABEL: sin_f64:673; CHECK: bl sin674define double @sin_f64(double %x) #0 {675 %val = call double @llvm.experimental.constrained.sin.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0676 ret double %val677}678 679; CHECK-LABEL: cos_f64:680; CHECK: bl cos681define double @cos_f64(double %x) #0 {682 %val = call double @llvm.experimental.constrained.cos.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0683 ret double %val684}685 686; CHECK-LABEL: tan_f64:687; CHECK: bl tan688define double @tan_f64(double %x) #0 {689 %val = call double @llvm.experimental.constrained.tan.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0690 ret double %val691}692 693; CHECK-LABEL: acos_f64:694; CHECK: bl acos695define double @acos_f64(double %x, double %y) #0 {696 %val = call double @llvm.experimental.constrained.acos.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0697 ret double %val698}699 700; CHECK-LABEL: asin_f64:701; CHECK: bl asin702define double @asin_f64(double %x, double %y) #0 {703 %val = call double @llvm.experimental.constrained.asin.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0704 ret double %val705}706 707; CHECK-LABEL: atan_f64:708; CHECK: bl atan709define double @atan_f64(double %x, double %y) #0 {710 %val = call double @llvm.experimental.constrained.atan.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0711 ret double %val712}713 714; CHECK-LABEL: cosh_f64:715; CHECK: bl cosh716define double @cosh_f64(double %x, double %y) #0 {717 %val = call double @llvm.experimental.constrained.cosh.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0718 ret double %val719}720 721; CHECK-LABEL: sinh_f64:722; CHECK: bl sinh723define double @sinh_f64(double %x, double %y) #0 {724 %val = call double @llvm.experimental.constrained.sinh.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0725 ret double %val726}727 728; CHECK-LABEL: tanh_f64:729; CHECK: bl tanh730define double @tanh_f64(double %x, double %y) #0 {731 %val = call double @llvm.experimental.constrained.tanh.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0732 ret double %val733}734 735; CHECK-LABEL: fmuladd_f64:736; CHECK-DP: vfma.f64737; CHECK-NODP: bl __aeabi_dmul738; CHECK-NODP: bl __aeabi_dadd739define double @fmuladd_f64(double %x, double %y, double %z) #0 {740 %val = call double @llvm.experimental.constrained.fmuladd.f64(double %x, double %y, double %z, metadata !"round.tonearest", metadata !"fpexcept.strict") #0741 ret double %val742}743 744; CHECK-LABEL: ldexp_f64:745; CHECK: bl ldexp746define double @ldexp_f64(double %x, i32 %y) #0 {747 %val = call double @llvm.experimental.constrained.ldexp.f64.i32(double %x, i32 %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0748 ret double %val749}750 751; CHECK-LABEL: roundeven_f64:752; CHECK-DP-V8: vrintn.f64753; CHECK-NODP: bl roundeven754define double @roundeven_f64(double %x) #0 {755 %val = call double @llvm.experimental.constrained.roundeven.f64(double %x, metadata !"fpexcept.strict") #0756 ret double %val757}758 759; CHECK-LABEL: uitofp_f64_i32:760; CHECK-NOSP: bl __aeabi_ui2d761; FIXME-CHECK-SP: vsub.f64762define double @uitofp_f64_i32(i32 %x) #0 {763 %val = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0764 ret double %val765}766 767; CHECK-LABEL: atan2_f64:768; CHECK: bl atan2769define double @atan2_f64(double %x, double %y) #0 {770 %val = call double @llvm.experimental.constrained.atan2.f64(double %x, double %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0771 ret double %val772}773 774; CHECK-LABEL: pow_f64:775; CHECK: bl pow776define double @pow_f64(double %x, double %y) #0 {777 %val = call double @llvm.experimental.constrained.pow.f64(double %x, double %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0778 ret double %val779}780 781; CHECK-LABEL: log_f64:782; CHECK: bl log783define double @log_f64(double %x) #0 {784 %val = call double @llvm.experimental.constrained.log.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0785 ret double %val786}787 788; CHECK-LABEL: log10_f64:789; CHECK: bl log10790define double @log10_f64(double %x) #0 {791 %val = call double @llvm.experimental.constrained.log10.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0792 ret double %val793}794 795; CHECK-LABEL: log2_f64:796; CHECK: bl log2797define double @log2_f64(double %x) #0 {798 %val = call double @llvm.experimental.constrained.log2.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0799 ret double %val800}801 802; CHECK-LABEL: exp_f64:803; CHECK: bl exp804define double @exp_f64(double %x) #0 {805 %val = call double @llvm.experimental.constrained.exp.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0806 ret double %val807}808 809; CHECK-LABEL: exp2_f64:810; CHECK: bl exp2811define double @exp2_f64(double %x) #0 {812 %val = call double @llvm.experimental.constrained.exp2.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0813 ret double %val814}815 816; CHECK-LABEL: rint_f64:817; CHECK-NODP: bl rint818; CHECK-DP-NOV8: bl rint819; CHECK-DP-V8: vrintx.f64820define double @rint_f64(double %x) #0 {821 %val = call double @llvm.experimental.constrained.rint.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0822 ret double %val823}824 825; CHECK-LABEL: nearbyint_f64:826; CHECK-NODP: bl nearbyint827; CHECK-DP-NOV8: bl nearbyint828; CHECK-DP-V8: vrintr.f64829define double @nearbyint_f64(double %x) #0 {830 %val = call double @llvm.experimental.constrained.nearbyint.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0831 ret double %val832}833 834; CHECK-LABEL: lrint_f64:835; CHECK: bl lrint836define i32 @lrint_f64(double %x) #0 {837 %val = call i32 @llvm.experimental.constrained.lrint.i32.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0838 ret i32 %val839}840 841; CHECK-LABEL: llrint_f64:842; CHECK: bl llrint843define i32 @llrint_f64(double %x) #0 {844 %val = call i32 @llvm.experimental.constrained.llrint.i32.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0845 ret i32 %val846}847 848; CHECK-LABEL: maxnum_f64:849; CHECK-NODP: bl fmax850; CHECK-DP-NOV8: bl fmax851; CHECK-DP-V8: vmaxnm.f64852define double @maxnum_f64(double %x, double %y) #0 {853 %val = call double @llvm.experimental.constrained.maxnum.f64(double %x, double %y, metadata !"fpexcept.strict") #0854 ret double %val855}856 857; CHECK-LABEL: minnum_f64:858; CHECK-NODP: bl fmin859; CHECK-DP-NOV8: bl fmin860; CHECK-DP-V8: vminnm.f64861define double @minnum_f64(double %x, double %y) #0 {862 %val = call double @llvm.experimental.constrained.minnum.f64(double %x, double %y, metadata !"fpexcept.strict") #0863 ret double %val864}865 866; CHECK-LABEL: ceil_f64:867; CHECK-NODP: bl ceil868; CHECK-DP-NOV8: bl ceil869; CHECK-DP-V8: vrintp.f64870define double @ceil_f64(double %x) #0 {871 %val = call double @llvm.experimental.constrained.ceil.f64(double %x, metadata !"fpexcept.strict") #0872 ret double %val873}874 875; CHECK-LABEL: floor_f64:876; CHECK-NODP: bl floor877; CHECK-DP-NOV8: bl floor878; CHECK-DP-V8: vrintm.f64879define double @floor_f64(double %x) #0 {880 %val = call double @llvm.experimental.constrained.floor.f64(double %x, metadata !"fpexcept.strict") #0881 ret double %val882}883 884; CHECK-LABEL: lround_f64:885; CHECK: bl lround886define i32 @lround_f64(double %x) #0 {887 %val = call i32 @llvm.experimental.constrained.lround.i32.f64(double %x, metadata !"fpexcept.strict") #0888 ret i32 %val889}890 891; CHECK-LABEL: llround_f64:892; CHECK: bl llround893define i32 @llround_f64(double %x) #0 {894 %val = call i32 @llvm.experimental.constrained.llround.i32.f64(double %x, metadata !"fpexcept.strict") #0895 ret i32 %val896}897 898; CHECK-LABEL: round_f64:899; CHECK-NODP: bl round900; CHECK-DP-NOV8: bl round901; CHECK-DP-V8: vrinta.f64902define double @round_f64(double %x) #0 {903 %val = call double @llvm.experimental.constrained.round.f64(double %x, metadata !"fpexcept.strict") #0904 ret double %val905}906 907; CHECK-LABEL: trunc_f64:908; CHECK-NODP: bl trunc909; CHECK-DP-NOV8: bl trunc910; CHECK-DP-V8: vrintz.f64911define double @trunc_f64(double %x) #0 {912 %val = call double @llvm.experimental.constrained.trunc.f64(double %x, metadata !"fpexcept.strict") #0913 ret double %val914}915 916; CHECK-LABEL: fcmp_olt_f64:917; CHECK-NODP: bl __aeabi_dcmplt918; CHECK-DP: vcmp.f64919define i32 @fcmp_olt_f64(double %a, double %b) #0 {920 %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"olt", metadata !"fpexcept.strict") #0921 %conv = zext i1 %cmp to i32922 ret i32 %conv923}924 925; CHECK-LABEL: fcmp_ole_f64:926; CHECK-NODP: bl __aeabi_dcmple927; CHECK-DP: vcmp.f64928define i32 @fcmp_ole_f64(double %a, double %b) #0 {929 %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ole", metadata !"fpexcept.strict") #0930 %conv = zext i1 %cmp to i32931 ret i32 %conv932}933 934; CHECK-LABEL: fcmp_ogt_f64:935; CHECK-NODP: bl __aeabi_dcmpgt936; CHECK-DP: vcmp.f64937define i32 @fcmp_ogt_f64(double %a, double %b) #0 {938 %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ogt", metadata !"fpexcept.strict") #0939 %conv = zext i1 %cmp to i32940 ret i32 %conv941}942 943; CHECK-LABEL: fcmp_oge_f64:944; CHECK-NODP: bl __aeabi_dcmpge945; CHECK-DP: vcmp.f64946define i32 @fcmp_oge_f64(double %a, double %b) #0 {947 %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oge", metadata !"fpexcept.strict") #0948 %conv = zext i1 %cmp to i32949 ret i32 %conv950}951 952; CHECK-LABEL: fcmp_oeq_f64:953; CHECK-NODP: bl __aeabi_dcmpeq954; CHECK-DP: vcmp.f64955define i32 @fcmp_oeq_f64(double %a, double %b) #0 {956 %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.strict") #0957 %conv = zext i1 %cmp to i32958 ret i32 %conv959}960 961; CHECK-LABEL: fcmp_one_f64:962; CHECK-NODP-DAG: bl __aeabi_dcmpeq963; CHECK-NODP-DAG: bl __aeabi_dcmpun964; CHECK-DP: vcmp.f64965define i32 @fcmp_one_f64(double %a, double %b) #0 {966 %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"one", metadata !"fpexcept.strict") #0967 %conv = zext i1 %cmp to i32968 ret i32 %conv969}970 971; CHECK-LABEL: fcmp_ult_f64:972; CHECK-NODP: bl __aeabi_dcmpge973; CHECK-DP: vcmp.f64974define i32 @fcmp_ult_f64(double %a, double %b) #0 {975 %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ult", metadata !"fpexcept.strict") #0976 %conv = zext i1 %cmp to i32977 ret i32 %conv978}979 980; CHECK-LABEL: fcmp_ule_f64:981; CHECK-NODP: bl __aeabi_dcmpgt982; CHECK-DP: vcmp.f64983define i32 @fcmp_ule_f64(double %a, double %b) #0 {984 %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ule", metadata !"fpexcept.strict") #0985 %conv = zext i1 %cmp to i32986 ret i32 %conv987}988 989; CHECK-LABEL: fcmp_ugt_f64:990; CHECK-NODP: bl __aeabi_dcmple991; CHECK-DP: vcmp.f64992define i32 @fcmp_ugt_f64(double %a, double %b) #0 {993 %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ugt", metadata !"fpexcept.strict") #0994 %conv = zext i1 %cmp to i32995 ret i32 %conv996}997 998; CHECK-LABEL: fcmp_uge_f64:999; CHECK-NODP: bl __aeabi_dcmplt1000; CHECK-DP: vcmp.f641001define i32 @fcmp_uge_f64(double %a, double %b) #0 {1002 %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"uge", metadata !"fpexcept.strict") #01003 %conv = zext i1 %cmp to i321004 ret i32 %conv1005}1006 1007; CHECK-LABEL: fcmp_ueq_f64:1008; CHECK-NODP-DAG: bl __aeabi_dcmpeq1009; CHECK-NODP-DAG: bl __aeabi_dcmpun1010; CHECK-DP: vcmp.f641011define i32 @fcmp_ueq_f64(double %a, double %b) #0 {1012 %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ueq", metadata !"fpexcept.strict") #01013 %conv = zext i1 %cmp to i321014 ret i32 %conv1015}1016 1017; CHECK-LABEL: fcmp_une_f64:1018; CHECK-NODP: bl __aeabi_dcmpeq1019; CHECK-DP: vcmp.f641020define i32 @fcmp_une_f64(double %a, double %b) #0 {1021 %cmp = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"une", metadata !"fpexcept.strict") #01022 %conv = zext i1 %cmp to i321023 ret i32 %conv1024}1025 1026; CHECK-LABEL: fcmps_olt_f64:1027; CHECK-NODP: bl __aeabi_dcmplt1028; CHECK-DP: vcmpe.f641029define i32 @fcmps_olt_f64(double %a, double %b) #0 {1030 %cmp = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"olt", metadata !"fpexcept.strict") #01031 %conv = zext i1 %cmp to i321032 ret i32 %conv1033}1034 1035; CHECK-LABEL: fcmps_ole_f64:1036; CHECK-NODP: bl __aeabi_dcmple1037; CHECK-DP: vcmpe.f641038define i32 @fcmps_ole_f64(double %a, double %b) #0 {1039 %cmp = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"ole", metadata !"fpexcept.strict") #01040 %conv = zext i1 %cmp to i321041 ret i32 %conv1042}1043 1044; CHECK-LABEL: fcmps_ogt_f64:1045; CHECK-NODP: bl __aeabi_dcmpgt1046; CHECK-DP: vcmpe.f641047define i32 @fcmps_ogt_f64(double %a, double %b) #0 {1048 %cmp = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"ogt", metadata !"fpexcept.strict") #01049 %conv = zext i1 %cmp to i321050 ret i32 %conv1051}1052 1053; CHECK-LABEL: fcmps_oge_f64:1054; CHECK-NODP: bl __aeabi_dcmpge1055; CHECK-DP: vcmpe.f641056define i32 @fcmps_oge_f64(double %a, double %b) #0 {1057 %cmp = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oge", metadata !"fpexcept.strict") #01058 %conv = zext i1 %cmp to i321059 ret i32 %conv1060}1061 1062; CHECK-LABEL: fcmps_oeq_f64:1063; CHECK-NODP: bl __aeabi_dcmpeq1064; CHECK-DP: vcmpe.f641065define i32 @fcmps_oeq_f64(double %a, double %b) #0 {1066 %cmp = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.strict") #01067 %conv = zext i1 %cmp to i321068 ret i32 %conv1069}1070 1071; CHECK-LABEL: fcmps_one_f64:1072; CHECK-NODP-DAG: bl __aeabi_dcmpeq1073; CHECK-NODP-DAG: bl __aeabi_dcmpun1074; CHECK-DP: vcmpe.f641075define i32 @fcmps_one_f64(double %a, double %b) #0 {1076 %cmp = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"one", metadata !"fpexcept.strict") #01077 %conv = zext i1 %cmp to i321078 ret i32 %conv1079}1080 1081; CHECK-LABEL: fcmps_ult_f64:1082; CHECK-NODP: bl __aeabi_dcmpge1083; CHECK-DP: vcmpe.f641084define i32 @fcmps_ult_f64(double %a, double %b) #0 {1085 %cmp = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"ult", metadata !"fpexcept.strict") #01086 %conv = zext i1 %cmp to i321087 ret i32 %conv1088}1089 1090; CHECK-LABEL: fcmps_ule_f64:1091; CHECK-NODP: bl __aeabi_dcmpgt1092; CHECK-DP: vcmpe.f641093define i32 @fcmps_ule_f64(double %a, double %b) #0 {1094 %cmp = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"ule", metadata !"fpexcept.strict") #01095 %conv = zext i1 %cmp to i321096 ret i32 %conv1097}1098 1099; CHECK-LABEL: fcmps_ugt_f64:1100; CHECK-NODP: bl __aeabi_dcmple1101; CHECK-DP: vcmpe.f641102define i32 @fcmps_ugt_f64(double %a, double %b) #0 {1103 %cmp = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"ugt", metadata !"fpexcept.strict") #01104 %conv = zext i1 %cmp to i321105 ret i32 %conv1106}1107 1108; CHECK-LABEL: fcmps_uge_f64:1109; CHECK-NODP: bl __aeabi_dcmplt1110; CHECK-DP: vcmpe.f641111define i32 @fcmps_uge_f64(double %a, double %b) #0 {1112 %cmp = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"uge", metadata !"fpexcept.strict") #01113 %conv = zext i1 %cmp to i321114 ret i32 %conv1115}1116 1117; CHECK-LABEL: fcmps_ueq_f64:1118; CHECK-NODP-DAG: bl __aeabi_dcmpeq1119; CHECK-NODP-DAG: bl __aeabi_dcmpun1120; CHECK-DP: vcmpe.f641121define i32 @fcmps_ueq_f64(double %a, double %b) #0 {1122 %cmp = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"ueq", metadata !"fpexcept.strict") #01123 %conv = zext i1 %cmp to i321124 ret i32 %conv1125}1126 1127; CHECK-LABEL: fcmps_une_f64:1128; CHECK-NODP: bl __aeabi_dcmpeq1129; CHECK-DP: vcmpe.f641130define i32 @fcmps_une_f64(double %a, double %b) #0 {1131 %cmp = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"une", metadata !"fpexcept.strict") #01132 %conv = zext i1 %cmp to i321133 ret i32 %conv1134}1135 1136 1137; Single/Double conversion intrinsics1138 1139; CHECK-LABEL: fptrunc_f32:1140; CHECK-NODP: bl __aeabi_d2f1141; CHECK-DP: vcvt.f32.f641142define float @fptrunc_f32(double %x) #0 {1143 %val = call float @llvm.experimental.constrained.fptrunc.f32.f64(double %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #01144 ret float %val1145}1146 1147; CHECK-LABEL: fpext_f32:1148; CHECK-NODP: bl __aeabi_f2d1149; CHECK-DP: vcvt.f64.f321150define double @fpext_f32(float %x) #0 {1151 %val = call double @llvm.experimental.constrained.fpext.f64.f32(float %x, metadata !"fpexcept.strict") #01152 ret double %val1153}1154 1155; CHECK-LABEL: fpext_f32_twice:1156; CHECK-NODP: bl __aeabi_f2d1157; CHECK-NODP: bl __aeabi_f2d1158; CHECK-DP: vcvt.f64.f321159; FIXME-CHECK-DP: vcvt.f64.f321160define void @fpext_f32_twice(float %arg, ptr %ptr) #0 {1161entry:1162 %conv1 = call double @llvm.experimental.constrained.fpext.f64.f32(float %arg, metadata !"fpexcept.strict") #01163 store double %conv1, ptr %ptr, align 81164 %conv2 = call double @llvm.experimental.constrained.fpext.f64.f32(float %arg, metadata !"fpexcept.strict") #01165 %idx = getelementptr inbounds double, ptr %ptr, i32 11166 store double %conv2, ptr %idx, align 81167 ret void1168}1169 1170; CHECK-LABEL: sitofp_f32_i32:1171; CHECK-NOSP: bl __aeabi_i2f1172; FIXME-CHECK-SP: vcvt.f32.s321173define float @sitofp_f32_i32(i32 %x) #0 {1174 %val = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #01175 ret float %val1176}1177 1178; CHECK-LABEL: sitofp_f64_i32:1179; FIXME-CHECK-NODP: bl __aeabi_i2d1180; FIXME-CHECK-DP: vcvt.f64.s321181define double @sitofp_f64_i32(i32 %x) #0 {1182 %val = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #01183 ret double %val1184}1185 1186 1187attributes #0 = { strictfp }1188 1189declare float @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata)1190declare float @llvm.experimental.constrained.fsub.f32(float, float, metadata, metadata)1191declare float @llvm.experimental.constrained.fmul.f32(float, float, metadata, metadata)1192declare float @llvm.experimental.constrained.fdiv.f32(float, float, metadata, metadata)1193declare float @llvm.experimental.constrained.frem.f32(float, float, metadata, metadata)1194declare float @llvm.experimental.constrained.fma.f32(float, float, float, metadata, metadata)1195declare i32 @llvm.experimental.constrained.fptosi.i32.f32(float, metadata)1196declare i32 @llvm.experimental.constrained.fptoui.i32.f32(float, metadata)1197declare float @llvm.experimental.constrained.sqrt.f32(float, metadata, metadata)1198declare float @llvm.experimental.constrained.powi.f32(float, i32, metadata, metadata)1199declare float @llvm.experimental.constrained.sin.f32(float, metadata, metadata)1200declare float @llvm.experimental.constrained.cos.f32(float, metadata, metadata)1201declare float @llvm.experimental.constrained.tan.f32(float, metadata, metadata)1202declare float @llvm.experimental.constrained.acos.f32(float, metadata, metadata)1203declare float @llvm.experimental.constrained.asin.f32(float, metadata, metadata)1204declare float @llvm.experimental.constrained.atan.f32(float, metadata, metadata)1205declare float @llvm.experimental.constrained.cosh.f32(float, metadata, metadata)1206declare float @llvm.experimental.constrained.sinh.f32(float, metadata, metadata)1207declare float @llvm.experimental.constrained.tanh.f32(float, metadata, metadata)1208declare float @llvm.experimental.constrained.fmuladd.f32(float, float, float, metadata, metadata)1209declare float @llvm.experimental.constrained.ldexp.f32.i32(float, i32, metadata, metadata)1210declare float @llvm.experimental.constrained.roundeven.f32(float, metadata)1211declare float @llvm.experimental.constrained.uitofp.f32.i32(i32, metadata, metadata)1212declare float @llvm.experimental.constrained.atan2.f32(float, float, metadata, metadata)1213declare float @llvm.experimental.constrained.pow.f32(float, float, metadata, metadata)1214declare float @llvm.experimental.constrained.log.f32(float, metadata, metadata)1215declare float @llvm.experimental.constrained.log10.f32(float, metadata, metadata)1216declare float @llvm.experimental.constrained.log2.f32(float, metadata, metadata)1217declare float @llvm.experimental.constrained.exp.f32(float, metadata, metadata)1218declare float @llvm.experimental.constrained.exp2.f32(float, metadata, metadata)1219declare float @llvm.experimental.constrained.rint.f32(float, metadata, metadata)1220declare float @llvm.experimental.constrained.nearbyint.f32(float, metadata, metadata)1221declare i32 @llvm.experimental.constrained.lrint.i32.f32(float, metadata, metadata)1222declare i32 @llvm.experimental.constrained.llrint.i32.f32(float, metadata, metadata)1223declare float @llvm.experimental.constrained.maxnum.f32(float, float, metadata)1224declare float @llvm.experimental.constrained.minnum.f32(float, float, metadata)1225declare float @llvm.experimental.constrained.ceil.f32(float, metadata)1226declare float @llvm.experimental.constrained.floor.f32(float, metadata)1227declare i32 @llvm.experimental.constrained.lround.i32.f32(float, metadata)1228declare i32 @llvm.experimental.constrained.llround.i32.f32(float, metadata)1229declare float @llvm.experimental.constrained.round.f32(float, metadata)1230declare float @llvm.experimental.constrained.trunc.f32(float, metadata)1231declare i1 @llvm.experimental.constrained.fcmps.f32(float, float, metadata, metadata)1232declare i1 @llvm.experimental.constrained.fcmp.f32(float, float, metadata, metadata)1233 1234declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata)1235declare double @llvm.experimental.constrained.fsub.f64(double, double, metadata, metadata)1236declare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata)1237declare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata)1238declare double @llvm.experimental.constrained.frem.f64(double, double, metadata, metadata)1239declare double @llvm.experimental.constrained.fma.f64(double, double, double, metadata, metadata)1240declare i32 @llvm.experimental.constrained.fptosi.i32.f64(double, metadata)1241declare i32 @llvm.experimental.constrained.fptoui.i32.f64(double, metadata)1242declare double @llvm.experimental.constrained.sqrt.f64(double, metadata, metadata)1243declare double @llvm.experimental.constrained.powi.f64(double, i32, metadata, metadata)1244declare double @llvm.experimental.constrained.sin.f64(double, metadata, metadata)1245declare double @llvm.experimental.constrained.cos.f64(double, metadata, metadata)1246declare double @llvm.experimental.constrained.tan.f64(double, metadata, metadata)1247declare double @llvm.experimental.constrained.acos.f64(double, metadata, metadata)1248declare double @llvm.experimental.constrained.asin.f64(double, metadata, metadata)1249declare double @llvm.experimental.constrained.atan.f64(double, metadata, metadata)1250declare double @llvm.experimental.constrained.cosh.f64(double, metadata, metadata)1251declare double @llvm.experimental.constrained.sinh.f64(double, metadata, metadata)1252declare double @llvm.experimental.constrained.tanh.f64(double, metadata, metadata)1253declare double @llvm.experimental.constrained.fmuladd.f64(double, double, double, metadata, metadata)1254declare double @llvm.experimental.constrained.ldexp.f64.i32(double, i32, metadata, metadata)1255declare double @llvm.experimental.constrained.roundeven.f64(double, metadata)1256declare double @llvm.experimental.constrained.uitofp.f64.i32(i32, metadata, metadata)1257declare double @llvm.experimental.constrained.atan2.f64(double, double, metadata, metadata)1258declare double @llvm.experimental.constrained.pow.f64(double, double, metadata, metadata)1259declare double @llvm.experimental.constrained.log.f64(double, metadata, metadata)1260declare double @llvm.experimental.constrained.log10.f64(double, metadata, metadata)1261declare double @llvm.experimental.constrained.log2.f64(double, metadata, metadata)1262declare double @llvm.experimental.constrained.exp.f64(double, metadata, metadata)1263declare double @llvm.experimental.constrained.exp2.f64(double, metadata, metadata)1264declare double @llvm.experimental.constrained.rint.f64(double, metadata, metadata)1265declare double @llvm.experimental.constrained.nearbyint.f64(double, metadata, metadata)1266declare i32 @llvm.experimental.constrained.lrint.i32.f64(double, metadata, metadata)1267declare i32 @llvm.experimental.constrained.llrint.i32.f64(double, metadata, metadata)1268declare double @llvm.experimental.constrained.maxnum.f64(double, double, metadata)1269declare double @llvm.experimental.constrained.minnum.f64(double, double, metadata)1270declare double @llvm.experimental.constrained.ceil.f64(double, metadata)1271declare double @llvm.experimental.constrained.floor.f64(double, metadata)1272declare i32 @llvm.experimental.constrained.lround.i32.f64(double, metadata)1273declare i32 @llvm.experimental.constrained.llround.i32.f64(double, metadata)1274declare double @llvm.experimental.constrained.round.f64(double, metadata)1275declare double @llvm.experimental.constrained.trunc.f64(double, metadata)1276declare i1 @llvm.experimental.constrained.fcmps.f64(double, double, metadata, metadata)1277declare i1 @llvm.experimental.constrained.fcmp.f64(double, double, metadata, metadata)1278 1279declare float @llvm.experimental.constrained.fptrunc.f32.f64(double, metadata, metadata)1280declare double @llvm.experimental.constrained.fpext.f64.f32(float, metadata)1281declare float @llvm.experimental.constrained.sitofp.f32.i32(i32, metadata, metadata)1282declare double @llvm.experimental.constrained.sitofp.f64.i32(i32, metadata, metadata)1283