327 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -target-abi ilp32f -mattr=+zfa < %s \3; RUN: | FileCheck %s4; RUN: llc -mtriple=riscv64 -target-abi lp64f -mattr=+zfa < %s \5; RUN: | FileCheck %s6 7define float @loadfpimm1() {8; CHECK-LABEL: loadfpimm1:9; CHECK: # %bb.0:10; CHECK-NEXT: fli.s fa0, 0.062511; CHECK-NEXT: ret12 ret float 0.062513}14 15define float @loadfpimm2() {16; CHECK-LABEL: loadfpimm2:17; CHECK: # %bb.0:18; CHECK-NEXT: fli.s fa0, 0.7519; CHECK-NEXT: ret20 ret float 0.7521}22 23define float @loadfpimm3() {24; CHECK-LABEL: loadfpimm3:25; CHECK: # %bb.0:26; CHECK-NEXT: fli.s fa0, 1.2527; CHECK-NEXT: ret28 ret float 1.2529}30 31define float @loadfpimm4() {32; CHECK-LABEL: loadfpimm4:33; CHECK: # %bb.0:34; CHECK-NEXT: fli.s fa0, 3.035; CHECK-NEXT: ret36 ret float 3.037}38 39define float @loadfpimm5() {40; CHECK-LABEL: loadfpimm5:41; CHECK: # %bb.0:42; CHECK-NEXT: fli.s fa0, 256.043; CHECK-NEXT: ret44 ret float 256.045}46 47define float @loadfpimm6() {48; CHECK-LABEL: loadfpimm6:49; CHECK: # %bb.0:50; CHECK-NEXT: fli.s fa0, inf51; CHECK-NEXT: ret52 ret float 0x7FF000000000000053}54 55define float @loadfpimm7() {56; CHECK-LABEL: loadfpimm7:57; CHECK: # %bb.0:58; CHECK-NEXT: fli.s fa0, nan59; CHECK-NEXT: ret60 ret float 0x7FF800000000000061}62 63define float @loadfpimm8() {64; CHECK-LABEL: loadfpimm8:65; CHECK: # %bb.0:66; CHECK-NEXT: fli.s fa0, min67; CHECK-NEXT: ret68 ret float 0x381000000000000069}70 71define float @loadfpimm9() {72; CHECK-LABEL: loadfpimm9:73; CHECK: # %bb.0:74; CHECK-NEXT: lui a0, 27646475; CHECK-NEXT: fmv.w.x fa0, a076; CHECK-NEXT: ret77 ret float 255.078}79 80; This is the f16 minimum value. Make sure we don't use fli.s.81define float @loadfpimm10() {82; CHECK-LABEL: loadfpimm10:83; CHECK: # %bb.0:84; CHECK-NEXT: lui a0, 23142485; CHECK-NEXT: fmv.w.x fa0, a086; CHECK-NEXT: ret87 ret float 0.0000610351562588}89 90define float @loadfpimm11() {91; CHECK-LABEL: loadfpimm11:92; CHECK: # %bb.0:93; CHECK-NEXT: fli.s fa0, -1.094; CHECK-NEXT: ret95 ret float -1.096}97 98; Ensure fli isn't directly used for negated versions of numbers in the fli99; table.100define float @loadfpimm12() {101; CHECK-LABEL: loadfpimm12:102; CHECK: # %bb.0:103; CHECK-NEXT: fli.s fa5, 2.0104; CHECK-NEXT: fneg.s fa0, fa5105; CHECK-NEXT: ret106 ret float -2.0107}108 109; Ensure fli isn't directly used for negative min normal value.110define float @loadfpimm13() {111; CHECK-LABEL: loadfpimm13:112; CHECK: # %bb.0:113; CHECK-NEXT: fli.s fa5, min114; CHECK-NEXT: fneg.s fa0, fa5115; CHECK-NEXT: ret116 ret float 0xb810000000000000117}118 119define float @fminm_s(float %a, float %b) nounwind {120; CHECK-LABEL: fminm_s:121; CHECK: # %bb.0:122; CHECK-NEXT: fminm.s fa0, fa0, fa1123; CHECK-NEXT: ret124 %1 = call float @llvm.minimum.f32(float %a, float %b)125 ret float %1126}127 128define float @fmaxm_s(float %a, float %b) nounwind {129; CHECK-LABEL: fmaxm_s:130; CHECK: # %bb.0:131; CHECK-NEXT: fmaxm.s fa0, fa0, fa1132; CHECK-NEXT: ret133 %1 = call float @llvm.maximum.f32(float %a, float %b)134 ret float %1135}136 137define float @fround_s_1(float %a) nounwind {138; CHECK-LABEL: fround_s_1:139; CHECK: # %bb.0:140; CHECK-NEXT: fround.s fa0, fa0, rmm141; CHECK-NEXT: ret142 %call = tail call float @roundf(float %a) nounwind readnone143 ret float %call144}145 146declare float @roundf(float) nounwind readnone147 148define float @fround_s_2(float %a) nounwind {149; CHECK-LABEL: fround_s_2:150; CHECK: # %bb.0:151; CHECK-NEXT: fround.s fa0, fa0, rdn152; CHECK-NEXT: ret153 %call = tail call float @floorf(float %a) nounwind readnone154 ret float %call155}156 157declare float @floorf(float) nounwind readnone158 159define float @fround_s_3(float %a) nounwind {160; CHECK-LABEL: fround_s_3:161; CHECK: # %bb.0:162; CHECK-NEXT: fround.s fa0, fa0, rup163; CHECK-NEXT: ret164 %call = tail call float @ceilf(float %a) nounwind readnone165 ret float %call166}167 168declare float @ceilf(float) nounwind readnone169 170define float @fround_s_4(float %a) nounwind {171; CHECK-LABEL: fround_s_4:172; CHECK: # %bb.0:173; CHECK-NEXT: fround.s fa0, fa0, rtz174; CHECK-NEXT: ret175 %call = tail call float @truncf(float %a) nounwind readnone176 ret float %call177}178 179declare float @truncf(float) nounwind readnone180 181define float @fround_s_5(float %a) nounwind {182; CHECK-LABEL: fround_s_5:183; CHECK: # %bb.0:184; CHECK-NEXT: fround.s fa0, fa0185; CHECK-NEXT: ret186 %call = tail call float @nearbyintf(float %a) nounwind readnone187 ret float %call188}189 190declare float @nearbyintf(float) nounwind readnone191 192define float @fround_s_6(float %a) nounwind {193; CHECK-LABEL: fround_s_6:194; CHECK: # %bb.0:195; CHECK-NEXT: fround.s fa0, fa0, rne196; CHECK-NEXT: ret197 %call = tail call float @llvm.roundeven.f32(float %a) nounwind readnone198 ret float %call199}200 201define float @froundnx_s(float %a) nounwind {202; CHECK-LABEL: froundnx_s:203; CHECK: # %bb.0:204; CHECK-NEXT: froundnx.s fa0, fa0205; CHECK-NEXT: ret206 %call = tail call float @rintf(float %a) nounwind readnone207 ret float %call208}209 210declare float @rintf(float) nounwind readnone211 212define i32 @fcmp_olt_q(float %a, float %b) nounwind strictfp {213; CHECK-LABEL: fcmp_olt_q:214; CHECK: # %bb.0:215; CHECK-NEXT: fltq.s a0, fa0, fa1216; CHECK-NEXT: ret217 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"olt", metadata !"fpexcept.strict") strictfp218 %2 = zext i1 %1 to i32219 ret i32 %2220}221 222define i32 @fcmp_ole_q(float %a, float %b) nounwind strictfp {223; CHECK-LABEL: fcmp_ole_q:224; CHECK: # %bb.0:225; CHECK-NEXT: fleq.s a0, fa0, fa1226; CHECK-NEXT: ret227 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ole", metadata !"fpexcept.strict") strictfp228 %2 = zext i1 %1 to i32229 ret i32 %2230}231 232define i32 @fcmp_one_q(float %a, float %b) nounwind strictfp {233; CHECK-LABEL: fcmp_one_q:234; CHECK: # %bb.0:235; CHECK-NEXT: fltq.s a0, fa0, fa1236; CHECK-NEXT: fltq.s a1, fa1, fa0237; CHECK-NEXT: or a0, a1, a0238; CHECK-NEXT: ret239 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"one", metadata !"fpexcept.strict") strictfp240 %2 = zext i1 %1 to i32241 ret i32 %2242}243 244define i32 @fcmp_ueq_q(float %a, float %b) nounwind strictfp {245; CHECK-LABEL: fcmp_ueq_q:246; CHECK: # %bb.0:247; CHECK-NEXT: fltq.s a0, fa0, fa1248; CHECK-NEXT: fltq.s a1, fa1, fa0249; CHECK-NEXT: or a0, a1, a0250; CHECK-NEXT: xori a0, a0, 1251; CHECK-NEXT: ret252 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ueq", metadata !"fpexcept.strict") strictfp253 %2 = zext i1 %1 to i32254 ret i32 %2255}256 257declare void @foo(float, float)258 259; Make sure we use two fli instructions instead of copying.260define void @fli_remat() {261; CHECK-LABEL: fli_remat:262; CHECK: # %bb.0:263; CHECK-NEXT: fli.s fa0, 1.0264; CHECK-NEXT: fli.s fa1, 1.0265; CHECK-NEXT: tail foo266 tail call void @foo(float 1.000000e+00, float 1.000000e+00)267 ret void268}269 270define float @fadd_neg_0p5(float %x) {271; CHECK-LABEL: fadd_neg_0p5:272; CHECK: # %bb.0:273; CHECK-NEXT: fli.s fa5, 0.5274; CHECK-NEXT: fsub.s fa0, fa0, fa5275; CHECK-NEXT: ret276 %a = fadd float %x, -0.5277 ret float %a278}279 280define float @fma_neg_addend(float %x, float %y) nounwind {281; CHECK-LABEL: fma_neg_addend:282; CHECK: # %bb.0:283; CHECK-NEXT: fli.s fa5, 0.5284; CHECK-NEXT: fmsub.s fa0, fa0, fa1, fa5285; CHECK-NEXT: ret286 %a = call float @llvm.fma.f32(float %x, float %y, float -0.5)287 ret float %a288}289 290define float @fma_neg_multiplicand(float %x, float %y) nounwind {291; CHECK-LABEL: fma_neg_multiplicand:292; CHECK: # %bb.0:293; CHECK-NEXT: fli.s fa5, 0.125294; CHECK-NEXT: fnmsub.s fa0, fa5, fa0, fa1295; CHECK-NEXT: ret296 %a = call float @llvm.fma.f32(float %x, float -0.125, float %y)297 ret float %a298}299 300define float @fma_neg_addend_multiplicand(float %x) nounwind {301; CHECK-LABEL: fma_neg_addend_multiplicand:302; CHECK: # %bb.0:303; CHECK-NEXT: fli.s fa5, 0.25304; CHECK-NEXT: fli.s fa4, 0.5305; CHECK-NEXT: fnmadd.s fa0, fa4, fa0, fa5306; CHECK-NEXT: ret307 %a = call float @llvm.fma.f32(float %x, float -0.5, float -0.25)308 ret float %a309}310 311define float @select_loadfpimm(float %x) nounwind {312; CHECK-LABEL: select_loadfpimm:313; CHECK: # %bb.0: # %entry314; CHECK-NEXT: fmv.w.x fa5, zero315; CHECK-NEXT: fle.s a0, fa5, fa0316; CHECK-NEXT: fli.s fa0, 0.5317; CHECK-NEXT: bnez a0, .LBB31_2318; CHECK-NEXT: # %bb.1:319; CHECK-NEXT: fneg.s fa0, fa0320; CHECK-NEXT: .LBB31_2: # %entry321; CHECK-NEXT: ret322entry:323 %cmp = fcmp ult float %x, 0.000000e+00324 %sel = select i1 %cmp, float -5.000000e-01, float 5.000000e-01325 ret float %sel326}327