Skip to content

Commit a7a09f6

Browse files
Anjian-WenRealFYang
authored andcommitted
8349632: RISC-V: Add Zfa fminm/fmaxm
Reviewed-by: fyang
1 parent 0454406 commit a7a09f6

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

src/hotspot/cpu/riscv/assembler_riscv.hpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,6 +1450,26 @@ enum operand_size { int8, int16, int32, uint32, int64 };
14501450
fp_base<D_64_dp, 0b11110>(Rd, Rs1, 0b00001, 0b000);
14511451
}
14521452

1453+
void fminm_s(FloatRegister Rd, FloatRegister Rs1, FloatRegister Rs2) {
1454+
assert_cond(UseZfa);
1455+
fp_base<S_32_sp, 0b00101>(Rd, Rs1, Rs2, 0b010);
1456+
}
1457+
1458+
void fmaxm_s(FloatRegister Rd, FloatRegister Rs1, FloatRegister Rs2) {
1459+
assert_cond(UseZfa);
1460+
fp_base<S_32_sp, 0b00101>(Rd, Rs1, Rs2, 0b011);
1461+
}
1462+
1463+
void fminm_d(FloatRegister Rd, FloatRegister Rs1, FloatRegister Rs2) {
1464+
assert_cond(UseZfa);
1465+
fp_base<D_64_dp, 0b00101>(Rd, Rs1, Rs2, 0b010);
1466+
}
1467+
1468+
void fmaxm_d(FloatRegister Rd, FloatRegister Rs1, FloatRegister Rs2) {
1469+
assert_cond(UseZfa);
1470+
fp_base<D_64_dp, 0b00101>(Rd, Rs1, Rs2, 0b011);
1471+
}
1472+
14531473
// ==========================
14541474
// RISC-V Vector Extension
14551475
// ==========================

src/hotspot/cpu/riscv/riscv.ad

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7349,6 +7349,7 @@ instruct nmaddD_reg_reg(fRegD dst, fRegD src1, fRegD src2, fRegD src3) %{
73497349

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

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

7367+
instruct maxF_reg_reg_zfa(fRegF dst, fRegF src1, fRegF src2) %{
7368+
predicate(UseZfa);
7369+
match(Set dst (MaxF src1 src2));
7370+
7371+
format %{ "maxF $dst, $src1, $src2" %}
7372+
7373+
ins_encode %{
7374+
__ fmaxm_s(as_FloatRegister($dst$$reg),
7375+
as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg));
7376+
%}
7377+
7378+
ins_pipe(pipe_class_default);
7379+
%}
7380+
73667381
// Math.min(FF)F
73677382
instruct minF_reg_reg(fRegF dst, fRegF src1, fRegF src2, rFlagsReg cr) %{
7383+
predicate(!UseZfa);
73687384
match(Set dst (MinF src1 src2));
73697385
effect(KILL cr);
73707386

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

7398+
instruct minF_reg_reg_zfa(fRegF dst, fRegF src1, fRegF src2) %{
7399+
predicate(UseZfa);
7400+
match(Set dst (MinF src1 src2));
7401+
7402+
format %{ "minF $dst, $src1, $src2" %}
7403+
7404+
ins_encode %{
7405+
__ fminm_s(as_FloatRegister($dst$$reg),
7406+
as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg));
7407+
%}
7408+
7409+
ins_pipe(pipe_class_default);
7410+
%}
7411+
73827412
// Math.max(DD)D
73837413
instruct maxD_reg_reg(fRegD dst, fRegD src1, fRegD src2, rFlagsReg cr) %{
7414+
predicate(!UseZfa);
73847415
match(Set dst (MaxD src1 src2));
73857416
effect(KILL cr);
73867417

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

7429+
instruct maxD_reg_reg_zfa(fRegD dst, fRegD src1, fRegD src2) %{
7430+
predicate(UseZfa);
7431+
match(Set dst (MaxD src1 src2));
7432+
7433+
format %{ "maxD $dst, $src1, $src2" %}
7434+
7435+
ins_encode %{
7436+
__ fmaxm_d(as_FloatRegister($dst$$reg),
7437+
as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg));
7438+
%}
7439+
7440+
ins_pipe(pipe_class_default);
7441+
%}
7442+
73987443
// Math.min(DD)D
73997444
instruct minD_reg_reg(fRegD dst, fRegD src1, fRegD src2, rFlagsReg cr) %{
7445+
predicate(!UseZfa);
74007446
match(Set dst (MinD src1 src2));
74017447
effect(KILL cr);
74027448

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

7460+
instruct minD_reg_reg_zfa(fRegD dst, fRegD src1, fRegD src2) %{
7461+
predicate(UseZfa);
7462+
match(Set dst (MinD src1 src2));
7463+
7464+
format %{ "minD $dst, $src1, $src2" %}
7465+
7466+
ins_encode %{
7467+
__ fminm_d(as_FloatRegister($dst$$reg),
7468+
as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg));
7469+
%}
7470+
7471+
ins_pipe(pipe_class_default);
7472+
%}
7473+
74147474
// Float.isInfinite
74157475
instruct isInfiniteF_reg_reg(iRegINoSp dst, fRegF src)
74167476
%{

0 commit comments

Comments
 (0)