mirror of
https://github.com/openjdk/jdk.git
synced 2026-05-19 01:47:52 +00:00
8349632: RISC-V: Add Zfa fminm/fmaxm
Reviewed-by: fyang
This commit is contained in:
parent
0454406417
commit
a7a09f69ab
@ -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
|
||||
// ==========================
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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)
|
||||
%{
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user