Skip to content

Commit

Permalink
8318158: RISC-V: implement roundD/roundF intrisics
Browse files Browse the repository at this point in the history
  • Loading branch information
omikhaltsova committed Oct 26, 2023
1 parent eb7d972 commit 5a22e5c
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 6 deletions.
5 changes: 3 additions & 2 deletions src/hotspot/cpu/riscv/macroAssembler_riscv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4222,15 +4222,16 @@ void MacroAssembler::zero_dcache_blocks(Register base, Register cnt, Register tm
}

#define FCVT_SAFE(FLOATCVT, FLOATSIG) \
void MacroAssembler::FLOATCVT##_safe(Register dst, FloatRegister src, Register tmp) { \
void MacroAssembler::FLOATCVT##_safe(Register dst, FloatRegister src, \
RoundingMode rm, Register tmp) { \
Label done; \
assert_different_registers(dst, tmp); \
fclass_##FLOATSIG(tmp, src); \
mv(dst, zr); \
/* check if src is NaN */ \
andi(tmp, tmp, 0b1100000000); \
bnez(tmp, done); \
FLOATCVT(dst, src); \
FLOATCVT(dst, src, rm); \
bind(done); \
}

Expand Down
8 changes: 4 additions & 4 deletions src/hotspot/cpu/riscv/macroAssembler_riscv.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1246,10 +1246,10 @@ class MacroAssembler: public Assembler {
// e.g. convert from NaN, +Inf, -Inf to int, float, double
// will trigger exception, we need to deal with these situations
// to get correct results.
void fcvt_w_s_safe(Register dst, FloatRegister src, Register tmp = t0);
void fcvt_l_s_safe(Register dst, FloatRegister src, Register tmp = t0);
void fcvt_w_d_safe(Register dst, FloatRegister src, Register tmp = t0);
void fcvt_l_d_safe(Register dst, FloatRegister src, Register tmp = t0);
void fcvt_w_s_safe(Register dst, FloatRegister src, RoundingMode rm = RoundingMode::rtz, Register tmp = t0);
void fcvt_l_s_safe(Register dst, FloatRegister src, RoundingMode rm = RoundingMode::rtz, Register tmp = t0);
void fcvt_w_d_safe(Register dst, FloatRegister src, RoundingMode rm = RoundingMode::rtz, Register tmp = t0);
void fcvt_l_d_safe(Register dst, FloatRegister src, RoundingMode rm = RoundingMode::rtz, Register tmp = t0);

// vector load/store unit-stride instructions
void vlex_v(VectorRegister vd, Register base, Assembler::SEW sew, VectorMask vm = unmasked) {
Expand Down
24 changes: 24 additions & 0 deletions src/hotspot/cpu/riscv/riscv.ad
Original file line number Diff line number Diff line change
Expand Up @@ -8240,6 +8240,30 @@ instruct convN2I(iRegINoSp dst, iRegN src)
ins_pipe(ialu_reg);
%}

instruct round_double_reg(iRegLNoSp dst, fRegD src) %{
match(Set dst (RoundD src));

format %{ "fcvt.l.d $dst, $src\t#@round_double_reg" %}

ins_encode %{
__ fcvt_l_d_safe(as_Register($dst$$reg), as_FloatRegister($src$$reg), Assembler::RoundingMode::rne);
%}

ins_pipe(pipe_class_default);
%}

instruct round_float_reg(iRegINoSp dst, fRegF src) %{
match(Set dst (RoundF src));

format %{ "fcvt.w.s $dst, $src\t#@round_float_reg" %}

ins_encode %{
__ fcvt_w_s_safe(as_Register($dst$$reg), as_FloatRegister($src$$reg), Assembler::RoundingMode::rne);
%}

ins_pipe(pipe_class_default);
%}

// Convert oop pointer into compressed form
instruct encodeHeapOop(iRegNNoSp dst, iRegP src) %{
match(Set dst (EncodeP src));
Expand Down

0 comments on commit 5a22e5c

Please sign in to comment.