343 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -target-abi ilp32f -mattr=+zfa,+zfh < %s \3; RUN: | FileCheck %s4; RUN: llc -mtriple=riscv64 -target-abi lp64f -mattr=+zfa,+zfh < %s \5; RUN: | FileCheck %s6; RUN: llc -mtriple=riscv32 -target-abi ilp32f -mattr=+zfa,+zfhmin < %s \7; RUN: | FileCheck %s --check-prefix=ZFHMIN8; RUN: llc -mtriple=riscv64 -target-abi lp64f -mattr=+zfa,+zfhmin < %s \9; RUN: | FileCheck %s --check-prefix=ZFHMIN10 11define half @fminm_h(half %a, half %b) nounwind {12; CHECK-LABEL: fminm_h:13; CHECK: # %bb.0:14; CHECK-NEXT: fminm.h fa0, fa0, fa115; CHECK-NEXT: ret16;17; ZFHMIN-LABEL: fminm_h:18; ZFHMIN: # %bb.0:19; ZFHMIN-NEXT: fcvt.s.h fa5, fa120; ZFHMIN-NEXT: fcvt.s.h fa4, fa021; ZFHMIN-NEXT: fminm.s fa5, fa4, fa522; ZFHMIN-NEXT: fcvt.h.s fa0, fa523; ZFHMIN-NEXT: ret24 %1 = call half @llvm.minimum.f16(half %a, half %b)25 ret half %126}27 28define half @fmaxm_h(half %a, half %b) nounwind {29; CHECK-LABEL: fmaxm_h:30; CHECK: # %bb.0:31; CHECK-NEXT: fmaxm.h fa0, fa0, fa132; CHECK-NEXT: ret33;34; ZFHMIN-LABEL: fmaxm_h:35; ZFHMIN: # %bb.0:36; ZFHMIN-NEXT: fcvt.s.h fa5, fa137; ZFHMIN-NEXT: fcvt.s.h fa4, fa038; ZFHMIN-NEXT: fmaxm.s fa5, fa4, fa539; ZFHMIN-NEXT: fcvt.h.s fa0, fa540; ZFHMIN-NEXT: ret41 %1 = tail call half @llvm.maximum.f16(half %a, half %b)42 ret half %143}44 45define half @fround_h_1(half %a) nounwind {46; CHECK-LABEL: fround_h_1:47; CHECK: # %bb.0:48; CHECK-NEXT: fround.h fa0, fa0, rmm49; CHECK-NEXT: ret50;51; ZFHMIN-LABEL: fround_h_1:52; ZFHMIN: # %bb.0:53; ZFHMIN-NEXT: fcvt.s.h fa5, fa054; ZFHMIN-NEXT: fround.s fa5, fa5, rmm55; ZFHMIN-NEXT: fcvt.h.s fa0, fa556; ZFHMIN-NEXT: ret57 %call = tail call half @llvm.round.f16(half %a) nounwind readnone58 ret half %call59}60 61define half @fround_h_2(half %a) nounwind {62; CHECK-LABEL: fround_h_2:63; CHECK: # %bb.0:64; CHECK-NEXT: fround.h fa0, fa0, rdn65; CHECK-NEXT: ret66;67; ZFHMIN-LABEL: fround_h_2:68; ZFHMIN: # %bb.0:69; ZFHMIN-NEXT: fcvt.s.h fa5, fa070; ZFHMIN-NEXT: fround.s fa5, fa5, rdn71; ZFHMIN-NEXT: fcvt.h.s fa0, fa572; ZFHMIN-NEXT: ret73 %call = tail call half @llvm.floor.f16(half %a) nounwind readnone74 ret half %call75}76 77define half @fround_h_3(half %a) nounwind {78; CHECK-LABEL: fround_h_3:79; CHECK: # %bb.0:80; CHECK-NEXT: fround.h fa0, fa0, rup81; CHECK-NEXT: ret82;83; ZFHMIN-LABEL: fround_h_3:84; ZFHMIN: # %bb.0:85; ZFHMIN-NEXT: fcvt.s.h fa5, fa086; ZFHMIN-NEXT: fround.s fa5, fa5, rup87; ZFHMIN-NEXT: fcvt.h.s fa0, fa588; ZFHMIN-NEXT: ret89 %call = tail call half @llvm.ceil.f16(half %a) nounwind readnone90 ret half %call91}92 93define half @fround_h_4(half %a) nounwind {94; CHECK-LABEL: fround_h_4:95; CHECK: # %bb.0:96; CHECK-NEXT: fround.h fa0, fa0, rtz97; CHECK-NEXT: ret98;99; ZFHMIN-LABEL: fround_h_4:100; ZFHMIN: # %bb.0:101; ZFHMIN-NEXT: fcvt.s.h fa5, fa0102; ZFHMIN-NEXT: fround.s fa5, fa5, rtz103; ZFHMIN-NEXT: fcvt.h.s fa0, fa5104; ZFHMIN-NEXT: ret105 %call = tail call half @llvm.trunc.f16(half %a) nounwind readnone106 ret half %call107}108 109define half @fround_h_5(half %a) nounwind {110; CHECK-LABEL: fround_h_5:111; CHECK: # %bb.0:112; CHECK-NEXT: fround.h fa0, fa0113; CHECK-NEXT: ret114;115; ZFHMIN-LABEL: fround_h_5:116; ZFHMIN: # %bb.0:117; ZFHMIN-NEXT: fcvt.s.h fa5, fa0118; ZFHMIN-NEXT: fround.s fa5, fa5119; ZFHMIN-NEXT: fcvt.h.s fa0, fa5120; ZFHMIN-NEXT: ret121 %call = tail call half @llvm.nearbyint.f16(half %a) nounwind readnone122 ret half %call123}124 125define half @fround_h_6(half %a) nounwind {126; CHECK-LABEL: fround_h_6:127; CHECK: # %bb.0:128; CHECK-NEXT: fround.h fa0, fa0, rne129; CHECK-NEXT: ret130;131; ZFHMIN-LABEL: fround_h_6:132; ZFHMIN: # %bb.0:133; ZFHMIN-NEXT: fcvt.s.h fa5, fa0134; ZFHMIN-NEXT: fround.s fa5, fa5, rne135; ZFHMIN-NEXT: fcvt.h.s fa0, fa5136; ZFHMIN-NEXT: ret137 %call = tail call half @llvm.roundeven.f16(half %a) nounwind readnone138 ret half %call139}140 141define half @froundnx_h(half %a) nounwind {142; CHECK-LABEL: froundnx_h:143; CHECK: # %bb.0:144; CHECK-NEXT: froundnx.h fa0, fa0145; CHECK-NEXT: ret146;147; ZFHMIN-LABEL: froundnx_h:148; ZFHMIN: # %bb.0:149; ZFHMIN-NEXT: fcvt.s.h fa5, fa0150; ZFHMIN-NEXT: froundnx.s fa5, fa5151; ZFHMIN-NEXT: fcvt.h.s fa0, fa5152; ZFHMIN-NEXT: ret153 %call = tail call half @llvm.rint.f16(half %a) nounwind readnone154 ret half %call155}156 157define i32 @fcmp_olt_q(half %a, half %b) nounwind strictfp {158; CHECK-LABEL: fcmp_olt_q:159; CHECK: # %bb.0:160; CHECK-NEXT: fltq.h a0, fa0, fa1161; CHECK-NEXT: ret162;163; ZFHMIN-LABEL: fcmp_olt_q:164; ZFHMIN: # %bb.0:165; ZFHMIN-NEXT: fcvt.s.h fa5, fa1166; ZFHMIN-NEXT: fcvt.s.h fa4, fa0167; ZFHMIN-NEXT: fltq.s a0, fa4, fa5168; ZFHMIN-NEXT: ret169 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"olt", metadata !"fpexcept.strict") strictfp170 %2 = zext i1 %1 to i32171 ret i32 %2172}173 174define i32 @fcmp_ole_q(half %a, half %b) nounwind strictfp {175; CHECK-LABEL: fcmp_ole_q:176; CHECK: # %bb.0:177; CHECK-NEXT: fleq.h a0, fa0, fa1178; CHECK-NEXT: ret179;180; ZFHMIN-LABEL: fcmp_ole_q:181; ZFHMIN: # %bb.0:182; ZFHMIN-NEXT: fcvt.s.h fa5, fa1183; ZFHMIN-NEXT: fcvt.s.h fa4, fa0184; ZFHMIN-NEXT: fleq.s a0, fa4, fa5185; ZFHMIN-NEXT: ret186 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ole", metadata !"fpexcept.strict") strictfp187 %2 = zext i1 %1 to i32188 ret i32 %2189}190 191define i32 @fcmp_one_q(half %a, half %b) nounwind strictfp {192; CHECK-LABEL: fcmp_one_q:193; CHECK: # %bb.0:194; CHECK-NEXT: fltq.h a0, fa0, fa1195; CHECK-NEXT: fltq.h a1, fa1, fa0196; CHECK-NEXT: or a0, a1, a0197; CHECK-NEXT: ret198;199; ZFHMIN-LABEL: fcmp_one_q:200; ZFHMIN: # %bb.0:201; ZFHMIN-NEXT: fcvt.s.h fa5, fa1202; ZFHMIN-NEXT: fcvt.s.h fa4, fa0203; ZFHMIN-NEXT: fltq.s a0, fa4, fa5204; ZFHMIN-NEXT: fltq.s a1, fa5, fa4205; ZFHMIN-NEXT: or a0, a1, a0206; ZFHMIN-NEXT: ret207 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"one", metadata !"fpexcept.strict") strictfp208 %2 = zext i1 %1 to i32209 ret i32 %2210}211 212define i32 @fcmp_ueq_q(half %a, half %b) nounwind strictfp {213; CHECK-LABEL: fcmp_ueq_q:214; CHECK: # %bb.0:215; CHECK-NEXT: fltq.h a0, fa0, fa1216; CHECK-NEXT: fltq.h a1, fa1, fa0217; CHECK-NEXT: or a0, a1, a0218; CHECK-NEXT: xori a0, a0, 1219; CHECK-NEXT: ret220;221; ZFHMIN-LABEL: fcmp_ueq_q:222; ZFHMIN: # %bb.0:223; ZFHMIN-NEXT: fcvt.s.h fa5, fa1224; ZFHMIN-NEXT: fcvt.s.h fa4, fa0225; ZFHMIN-NEXT: fltq.s a0, fa4, fa5226; ZFHMIN-NEXT: fltq.s a1, fa5, fa4227; ZFHMIN-NEXT: or a0, a1, a0228; ZFHMIN-NEXT: xori a0, a0, 1229; ZFHMIN-NEXT: ret230 %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ueq", metadata !"fpexcept.strict") strictfp231 %2 = zext i1 %1 to i32232 ret i32 %2233}234 235define half @fadd_neg_0p5(half %x) {236; CHECK-LABEL: fadd_neg_0p5:237; CHECK: # %bb.0:238; CHECK-NEXT: fli.h fa5, 0.5239; CHECK-NEXT: fsub.h fa0, fa0, fa5240; CHECK-NEXT: ret241;242; ZFHMIN-LABEL: fadd_neg_0p5:243; ZFHMIN: # %bb.0:244; ZFHMIN-NEXT: fcvt.s.h fa5, fa0245; ZFHMIN-NEXT: fli.s fa4, 0.5246; ZFHMIN-NEXT: fsub.s fa5, fa5, fa4247; ZFHMIN-NEXT: fcvt.h.s fa0, fa5248; ZFHMIN-NEXT: ret249 %a = fadd half %x, -0.5250 ret half %a251}252 253define half @fma_neg_addend(half %x, half %y) nounwind {254; CHECK-LABEL: fma_neg_addend:255; CHECK: # %bb.0:256; CHECK-NEXT: fli.h fa5, 0.5257; CHECK-NEXT: fmsub.h fa0, fa0, fa1, fa5258; CHECK-NEXT: ret259;260; ZFHMIN-LABEL: fma_neg_addend:261; ZFHMIN: # %bb.0:262; ZFHMIN-NEXT: fcvt.s.h fa5, fa1263; ZFHMIN-NEXT: fcvt.s.h fa4, fa0264; ZFHMIN-NEXT: fli.s fa3, 0.5265; ZFHMIN-NEXT: fmsub.s fa5, fa4, fa5, fa3266; ZFHMIN-NEXT: fcvt.h.s fa0, fa5267; ZFHMIN-NEXT: ret268 %a = call half @llvm.fma.f32(half %x, half %y, half -0.5)269 ret half %a270}271 272define half @fma_neg_multiplicand(half %x, half %y) nounwind {273; CHECK-LABEL: fma_neg_multiplicand:274; CHECK: # %bb.0:275; CHECK-NEXT: fli.h fa5, 0.125276; CHECK-NEXT: fnmsub.h fa0, fa5, fa0, fa1277; CHECK-NEXT: ret278;279; ZFHMIN-LABEL: fma_neg_multiplicand:280; ZFHMIN: # %bb.0:281; ZFHMIN-NEXT: fcvt.s.h fa5, fa1282; ZFHMIN-NEXT: fcvt.s.h fa4, fa0283; ZFHMIN-NEXT: fli.s fa3, 0.125284; ZFHMIN-NEXT: fnmsub.s fa5, fa3, fa4, fa5285; ZFHMIN-NEXT: fcvt.h.s fa0, fa5286; ZFHMIN-NEXT: ret287 %a = call half @llvm.fma.f32(half %x, half -0.125, half %y)288 ret half %a289}290 291define half @fma_neg_addend_multiplicand(half %x) nounwind {292; CHECK-LABEL: fma_neg_addend_multiplicand:293; CHECK: # %bb.0:294; CHECK-NEXT: fli.h fa5, 0.25295; CHECK-NEXT: fli.h fa4, 0.5296; CHECK-NEXT: fnmadd.h fa0, fa4, fa0, fa5297; CHECK-NEXT: ret298;299; ZFHMIN-LABEL: fma_neg_addend_multiplicand:300; ZFHMIN: # %bb.0:301; ZFHMIN-NEXT: fcvt.s.h fa5, fa0302; ZFHMIN-NEXT: fli.s fa4, 0.25303; ZFHMIN-NEXT: fli.s fa3, 0.5304; ZFHMIN-NEXT: fnmadd.s fa5, fa3, fa5, fa4305; ZFHMIN-NEXT: fcvt.h.s fa0, fa5306; ZFHMIN-NEXT: ret307 %a = call half @llvm.fma.f32(half %x, half -0.5, half -0.25)308 ret half %a309}310 311define half @select_loadfpimm(half %x) nounwind {312; CHECK-LABEL: select_loadfpimm:313; CHECK: # %bb.0: # %entry314; CHECK-NEXT: fmv.h.x fa5, zero315; CHECK-NEXT: fle.h a0, fa5, fa0316; CHECK-NEXT: fli.h fa0, 0.5317; CHECK-NEXT: bnez a0, .LBB17_2318; CHECK-NEXT: # %bb.1:319; CHECK-NEXT: fneg.h fa0, fa0320; CHECK-NEXT: .LBB17_2: # %entry321; CHECK-NEXT: ret322;323; ZFHMIN-LABEL: select_loadfpimm:324; ZFHMIN: # %bb.0: # %entry325; ZFHMIN-NEXT: fcvt.s.h fa5, fa0326; ZFHMIN-NEXT: fmv.w.x fa4, zero327; ZFHMIN-NEXT: fle.s a0, fa4, fa5328; ZFHMIN-NEXT: beqz a0, .LBB17_2329; ZFHMIN-NEXT: # %bb.1: # %entry330; ZFHMIN-NEXT: li a0, 7331; ZFHMIN-NEXT: j .LBB17_3332; ZFHMIN-NEXT: .LBB17_2:333; ZFHMIN-NEXT: li a0, -9334; ZFHMIN-NEXT: .LBB17_3: # %entry335; ZFHMIN-NEXT: slli a0, a0, 11336; ZFHMIN-NEXT: fmv.h.x fa0, a0337; ZFHMIN-NEXT: ret338entry:339 %cmp = fcmp ult half %x, 0.000000e+00340 %sel = select i1 %cmp, half -5.000000e-01, half 5.000000e-01341 ret half %sel342}343