Skip to content

Commit 9044c55

Browse files
authored
Update (2023.08.30, 2nd)
32093: Add CMoveD-CmpN node 32079: LA port of 8313796: AsyncGetCallTrace crash on unreadable interpreter method pointer
1 parent 5ea14bb commit 9044c55

File tree

4 files changed

+37
-6
lines changed

4 files changed

+37
-6
lines changed

src/hotspot/cpu/loongarch/frame_loongarch.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ bool frame::is_interpreted_frame_valid(JavaThread* thread) const {
479479

480480
// first the method
481481

482-
Method* m = *interpreter_frame_method_addr();
482+
Method* m = safe_interpreter_frame_method();
483483

484484
// validate the method we'd find in this potential sender
485485
if (!Method::is_valid_method(m)) return false;

src/hotspot/cpu/loongarch/loongarch_64.ad

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8316,6 +8316,27 @@ instruct cmovF_cmpL_reg_reg(regF dst, regF src, mRegL tmp1, mRegL tmp2, cmpOp co
83168316
ins_pipe( pipe_slow );
83178317
%}
83188318

8319+
instruct cmovD_cmpN_reg_reg(regD dst, regD src, mRegN tmp1, mRegN tmp2, cmpOp cop) %{
8320+
match(Set dst (CMoveD (Binary cop (CmpN tmp1 tmp2)) (Binary dst src)));
8321+
ins_cost(200);
8322+
format %{
8323+
"CMP$cop $tmp1, $tmp2\t @cmovD_cmpN_reg_reg\n"
8324+
"\tCMOV $dst, $src \t @cmovD_cmpN_reg_reg"
8325+
%}
8326+
8327+
ins_encode %{
8328+
Register op1 = $tmp1$$Register;
8329+
Register op2 = $tmp2$$Register;
8330+
FloatRegister dst = as_FloatRegister($dst$$reg);
8331+
FloatRegister src = as_FloatRegister($src$$reg);
8332+
int flag = $cop$$cmpcode;
8333+
8334+
__ cmp_cmov(op1, op2, dst, src, (MacroAssembler::CMCompare) flag, false /* is_signed */);
8335+
%}
8336+
8337+
ins_pipe( pipe_slow );
8338+
%}
8339+
83198340
instruct cmovD_cmpI_reg_reg(regD dst, regD src, mRegI tmp1, mRegI tmp2, cmpOp cop) %{
83208341
match(Set dst (CMoveD (Binary cop (CmpI tmp1 tmp2)) (Binary dst src)));
83218342
ins_cost(200);

src/hotspot/cpu/loongarch/macroAssembler_loongarch.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2983,22 +2983,31 @@ void MacroAssembler::cmp_cmov(Register op1,
29832983
Register op2,
29842984
FloatRegister dst,
29852985
FloatRegister src,
2986-
CMCompare cmp) {
2986+
CMCompare cmp,
2987+
bool is_signed) {
29872988
switch (cmp) {
29882989
case EQ:
29892990
case NE:
29902991
sub_d(AT, op1, op2);
2991-
slt(AT, R0, AT);
2992+
sltu(AT, R0, AT);
29922993
break;
29932994

29942995
case GT:
29952996
case LE:
2996-
slt(AT, op2, op1);
2997+
if (is_signed) {
2998+
slt(AT, op2, op1);
2999+
} else {
3000+
sltu(AT, op2, op1);
3001+
}
29973002
break;
29983003

29993004
case GE:
30003005
case LT:
3001-
slt(AT, op1, op2);
3006+
if (is_signed) {
3007+
slt(AT, op1, op2);
3008+
} else {
3009+
sltu(AT, op1, op2);
3010+
}
30023011
break;
30033012

30043013
default:

src/hotspot/cpu/loongarch/macroAssembler_loongarch.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,8 @@ class MacroAssembler: public Assembler {
635635
Register op2,
636636
FloatRegister dst,
637637
FloatRegister src,
638-
CMCompare cmp = EQ);
638+
CMCompare cmp = EQ,
639+
bool is_signed = true);
639640

640641
void membar(Membar_mask_bits hint);
641642

0 commit comments

Comments
 (0)