Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions src/hotspot/cpu/riscv/assembler_riscv.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1450,6 +1450,26 @@ enum operand_size { int8, int16, int32, uint32, int64 };
fp_base<D_64_dp, 0b11110>(Rd, Rs1, 0b00001, 0b000);
}

void fminm_s(FloatRegister Rd, FloatRegister Rs1, FloatRegister Rs2) {
assert_cond(UseZfa);
fp_base<S_32_sp, 0b00101>(Rd, Rs1, Rs2, 0b010);
}

void fmaxm_s(FloatRegister Rd, FloatRegister Rs1, FloatRegister Rs2) {
assert_cond(UseZfa);
fp_base<S_32_sp, 0b00101>(Rd, Rs1, Rs2, 0b011);
}

void fminm_d(FloatRegister Rd, FloatRegister Rs1, FloatRegister Rs2) {
assert_cond(UseZfa);
fp_base<D_64_dp, 0b00101>(Rd, Rs1, Rs2, 0b010);
}

void fmaxm_d(FloatRegister Rd, FloatRegister Rs1, FloatRegister Rs2) {
assert_cond(UseZfa);
fp_base<D_64_dp, 0b00101>(Rd, Rs1, Rs2, 0b011);
}

// ==========================
// RISC-V Vector Extension
// ==========================
Expand Down
60 changes: 60 additions & 0 deletions src/hotspot/cpu/riscv/riscv.ad
Original file line number Diff line number Diff line change
Expand Up @@ -7349,6 +7349,7 @@ instruct nmaddD_reg_reg(fRegD dst, fRegD src1, fRegD src2, fRegD src3) %{

// Math.max(FF)F
instruct maxF_reg_reg(fRegF dst, fRegF src1, fRegF src2, rFlagsReg cr) %{
predicate(!UseZfa);
match(Set dst (MaxF src1 src2));
effect(KILL cr);

Expand All @@ -7363,8 +7364,23 @@ instruct maxF_reg_reg(fRegF dst, fRegF src1, fRegF src2, rFlagsReg cr) %{
ins_pipe(pipe_class_default);
%}

instruct maxF_reg_reg_zfa(fRegF dst, fRegF src1, fRegF src2) %{
predicate(UseZfa);
match(Set dst (MaxF src1 src2));

format %{ "maxF $dst, $src1, $src2" %}

ins_encode %{
__ fmaxm_s(as_FloatRegister($dst$$reg),
as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg));
%}

ins_pipe(pipe_class_default);
%}

// Math.min(FF)F
instruct minF_reg_reg(fRegF dst, fRegF src1, fRegF src2, rFlagsReg cr) %{
predicate(!UseZfa);
match(Set dst (MinF src1 src2));
effect(KILL cr);

Expand All @@ -7379,8 +7395,23 @@ instruct minF_reg_reg(fRegF dst, fRegF src1, fRegF src2, rFlagsReg cr) %{
ins_pipe(pipe_class_default);
%}

instruct minF_reg_reg_zfa(fRegF dst, fRegF src1, fRegF src2) %{
predicate(UseZfa);
match(Set dst (MinF src1 src2));

format %{ "minF $dst, $src1, $src2" %}

ins_encode %{
__ fminm_s(as_FloatRegister($dst$$reg),
as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg));
%}

ins_pipe(pipe_class_default);
%}

// Math.max(DD)D
instruct maxD_reg_reg(fRegD dst, fRegD src1, fRegD src2, rFlagsReg cr) %{
predicate(!UseZfa);
match(Set dst (MaxD src1 src2));
effect(KILL cr);

Expand All @@ -7395,8 +7426,23 @@ instruct maxD_reg_reg(fRegD dst, fRegD src1, fRegD src2, rFlagsReg cr) %{
ins_pipe(pipe_class_default);
%}

instruct maxD_reg_reg_zfa(fRegD dst, fRegD src1, fRegD src2) %{
predicate(UseZfa);
match(Set dst (MaxD src1 src2));

format %{ "maxD $dst, $src1, $src2" %}

ins_encode %{
__ fmaxm_d(as_FloatRegister($dst$$reg),
as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg));
%}

ins_pipe(pipe_class_default);
%}

// Math.min(DD)D
instruct minD_reg_reg(fRegD dst, fRegD src1, fRegD src2, rFlagsReg cr) %{
predicate(!UseZfa);
match(Set dst (MinD src1 src2));
effect(KILL cr);

Expand All @@ -7411,6 +7457,20 @@ instruct minD_reg_reg(fRegD dst, fRegD src1, fRegD src2, rFlagsReg cr) %{
ins_pipe(pipe_class_default);
%}

instruct minD_reg_reg_zfa(fRegD dst, fRegD src1, fRegD src2) %{
predicate(UseZfa);
match(Set dst (MinD src1 src2));

format %{ "minD $dst, $src1, $src2" %}

ins_encode %{
__ fminm_d(as_FloatRegister($dst$$reg),
as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg));
%}

ins_pipe(pipe_class_default);
%}

// Float.isInfinite
instruct isInfiniteF_reg_reg(iRegINoSp dst, fRegF src)
%{
Expand Down