Skip to content

Commit f9795d0

Browse files
author
Hamlin Li
committed
8318222: RISC-V: C2 CmpU3
8318223: RISC-V: C2 CmpUL3 Reviewed-by: rehn, fyang
1 parent d1077d6 commit f9795d0

File tree

3 files changed

+67
-4
lines changed

3 files changed

+67
-4
lines changed

src/hotspot/cpu/riscv/macroAssembler_riscv.cpp

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4404,8 +4404,8 @@ void MacroAssembler::sign_extend(Register dst, Register src, int bits) {
44044404
}
44054405
}
44064406

4407-
void MacroAssembler::cmp_l2i(Register dst, Register src1, Register src2, Register tmp)
4408-
{
4407+
void MacroAssembler::cmp_x2i(Register dst, Register src1, Register src2,
4408+
Register tmp, bool is_signed) {
44094409
if (src1 == src2) {
44104410
mv(dst, zr);
44114411
return;
@@ -4424,14 +4424,35 @@ void MacroAssembler::cmp_l2i(Register dst, Register src1, Register src2, Registe
44244424
}
44254425

44264426
// installs 1 if gt else 0
4427-
slt(dst, right, left);
4427+
if (is_signed) {
4428+
slt(dst, right, left);
4429+
} else {
4430+
sltu(dst, right, left);
4431+
}
44284432
bnez(dst, done);
4429-
slt(dst, left, right);
4433+
if (is_signed) {
4434+
slt(dst, left, right);
4435+
} else {
4436+
sltu(dst, left, right);
4437+
}
44304438
// dst = -1 if lt; else if eq , dst = 0
44314439
neg(dst, dst);
44324440
bind(done);
44334441
}
44344442

4443+
void MacroAssembler::cmp_l2i(Register dst, Register src1, Register src2, Register tmp)
4444+
{
4445+
cmp_x2i(dst, src1, src2, tmp);
4446+
}
4447+
4448+
void MacroAssembler::cmp_ul2i(Register dst, Register src1, Register src2, Register tmp) {
4449+
cmp_x2i(dst, src1, src2, tmp, false);
4450+
}
4451+
4452+
void MacroAssembler::cmp_uw2i(Register dst, Register src1, Register src2, Register tmp) {
4453+
cmp_x2i(dst, src1, src2, tmp, false);
4454+
}
4455+
44354456
// The java_calling_convention describes stack locations as ideal slots on
44364457
// a frame with no abi restrictions. Since we must observe abi restrictions
44374458
// (like the placement of the register window) the slots must be biased by

src/hotspot/cpu/riscv/macroAssembler_riscv.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1394,11 +1394,17 @@ class MacroAssembler: public Assembler {
13941394
void zero_extend(Register dst, Register src, int bits);
13951395
void sign_extend(Register dst, Register src, int bits);
13961396

1397+
private:
1398+
void cmp_x2i(Register dst, Register src1, Register src2, Register tmp, bool is_signed = true);
1399+
1400+
public:
13971401
// compare src1 and src2 and get -1/0/1 in dst.
13981402
// if [src1 > src2], dst = 1;
13991403
// if [src1 == src2], dst = 0;
14001404
// if [src1 < src2], dst = -1;
14011405
void cmp_l2i(Register dst, Register src1, Register src2, Register tmp = t0);
1406+
void cmp_ul2i(Register dst, Register src1, Register src2, Register tmp = t0);
1407+
void cmp_uw2i(Register dst, Register src1, Register src2, Register tmp = t0);
14021408

14031409
// support for argument shuffling
14041410
void move32_64(VMRegPair src, VMRegPair dst, Register tmp = t0);

src/hotspot/cpu/riscv/riscv.ad

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8641,6 +8641,42 @@ instruct cmpL3_reg_reg(iRegINoSp dst, iRegL op1, iRegL op2)
86418641
ins_pipe(pipe_class_default);
86428642
%}
86438643

8644+
instruct cmpUL3_reg_reg(iRegINoSp dst, iRegL op1, iRegL op2)
8645+
%{
8646+
match(Set dst (CmpUL3 op1 op2));
8647+
8648+
ins_cost(ALU_COST * 3 + BRANCH_COST);
8649+
format %{ "sltu $dst, $op2, $op1\t#@cmpUL3_reg_reg\n\t"
8650+
"bnez $dst, done\n\t"
8651+
"sltu $dst, $op1, $op2\n\t"
8652+
"neg $dst, $dst\t#@cmpUL3_reg_reg"
8653+
%}
8654+
ins_encode %{
8655+
__ cmp_ul2i(t0, as_Register($op1$$reg), as_Register($op2$$reg));
8656+
__ mv(as_Register($dst$$reg), t0);
8657+
%}
8658+
8659+
ins_pipe(pipe_class_default);
8660+
%}
8661+
8662+
instruct cmpU3_reg_reg(iRegINoSp dst, iRegI op1, iRegI op2)
8663+
%{
8664+
match(Set dst (CmpU3 op1 op2));
8665+
8666+
ins_cost(ALU_COST * 3 + BRANCH_COST);
8667+
format %{ "sltu $dst, $op2, $op1\t#@cmpU3_reg_reg\n\t"
8668+
"bnez $dst, done\n\t"
8669+
"sltu $dst, $op1, $op2\n\t"
8670+
"neg $dst, $dst\t#@cmpU3_reg_reg"
8671+
%}
8672+
ins_encode %{
8673+
__ cmp_uw2i(t0, as_Register($op1$$reg), as_Register($op2$$reg));
8674+
__ mv(as_Register($dst$$reg), t0);
8675+
%}
8676+
8677+
ins_pipe(pipe_class_default);
8678+
%}
8679+
86448680
instruct cmpLTMask_reg_reg(iRegINoSp dst, iRegI p, iRegI q)
86458681
%{
86468682
match(Set dst (CmpLTMask p q));

0 commit comments

Comments
 (0)