Skip to content

Commit 0d1279d

Browse files
authored
Update (2023.08.15)
31942: Implement ExtractV 31838: 32 and 64 bits vector implementation 31751: Use base+disp for cmpxchg 31927: Typo in xBarrierSetAssembler_loongarch.cpp 30985: Insert acqure membar for load-exclusive with acquire 31863: [C2] Effect TEMP_DEF res for cmpxchg
1 parent cffa896 commit 0d1279d

17 files changed

+2316
-4138
lines changed

src/hotspot/cpu/loongarch/c1_LIRAssembler_loongarch_64.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,12 +1511,16 @@ void LIR_Assembler::emit_opTypeCheck(LIR_OpTypeCheck* op) {
15111511

15121512
void LIR_Assembler::casw(Register addr, Register newval, Register cmpval, Register result, bool sign) {
15131513
__ cmpxchg32(Address(addr, 0), cmpval, newval, result, sign,
1514-
/* retold */ false, /* barrier */ true, /* weak */ false, /* exchange */ false);
1514+
/* retold */ false, /* acquire */ true, /* weak */ false, /* exchange */ false);
1515+
// LA SC equals store-conditional dbar, so no need AnyAny after CAS.
1516+
//__ membar(__ AnyAny);
15151517
}
15161518

15171519
void LIR_Assembler::casl(Register addr, Register newval, Register cmpval, Register result) {
15181520
__ cmpxchg(Address(addr, 0), cmpval, newval, result,
1519-
/* retold */ false, /* barrier */ true, /* weak */ false, /* exchange */ false);
1521+
/* retold */ false, /* acquire */ true, /* weak */ false, /* exchange */ false);
1522+
// LA SC equals store-conditional dbar, so no need AnyAny after CAS.
1523+
//__ membar(__ AnyAny);
15201524
}
15211525

15221526
void LIR_Assembler::emit_compare_and_swap(LIR_OpCompareAndSwap* op) {

src/hotspot/cpu/loongarch/c1_MacroAssembler_loongarch_64.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register disp_hdr
7272
// displaced header address in the object header - if it is not the same, get the
7373
// object header instead
7474
lea(SCR2, Address(obj, hdr_offset));
75-
cmpxchg(Address(SCR2, 0), hdr, disp_hdr, SCR1, true, false, done);
75+
cmpxchg(Address(SCR2, 0), hdr, disp_hdr, SCR1, true, true /* acquire */, done);
7676
// if the object header was the same, we're done
7777
// if the object header was not the same, it is now in the hdr register
7878
// => test if it is a stack pointer into the same stack (recursive locking), i.e.:
@@ -134,9 +134,9 @@ void C1_MacroAssembler::unlock_object(Register hdr, Register obj, Register disp_
134134
// we do unlocking via runtime call
135135
if (hdr_offset) {
136136
lea(SCR1, Address(obj, hdr_offset));
137-
cmpxchg(Address(SCR1, 0), disp_hdr, hdr, SCR2, false, false, done, &slow_case);
137+
cmpxchg(Address(SCR1, 0), disp_hdr, hdr, SCR2, false, true /* acquire */, done, &slow_case);
138138
} else {
139-
cmpxchg(Address(obj, 0), disp_hdr, hdr, SCR2, false, false, done, &slow_case);
139+
cmpxchg(Address(obj, 0), disp_hdr, hdr, SCR2, false, true /* acquire */, done, &slow_case);
140140
}
141141
// done
142142
bind(done);

src/hotspot/cpu/loongarch/c2_MacroAssembler_loongarch.cpp

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ void C2_MacroAssembler::fast_lock_c2(Register oop, Register box, Register flag,
7272
st_d(tmp, box, BasicLock::displaced_header_offset_in_bytes());
7373

7474
// If cmpxchg is succ, then flag = 1
75-
cmpxchg(Address(oop, 0), tmp, box, flag, true, false);
75+
cmpxchg(Address(oop, 0), tmp, box, flag, true, true /* acquire */);
7676
bnez(flag, cont);
7777

7878
// If the compare-and-exchange succeeded, then we found an unlocked
@@ -106,7 +106,7 @@ void C2_MacroAssembler::fast_lock_c2(Register oop, Register box, Register flag,
106106
// Try to CAS m->owner from null to current thread.
107107
move(AT, R0);
108108
addi_d(tmp, disp_hdr, in_bytes(ObjectMonitor::owner_offset()) - markWord::monitor_value);
109-
cmpxchg(Address(tmp, 0), AT, TREG, flag, true, false);
109+
cmpxchg(Address(tmp, 0), AT, TREG, flag, true, true /* acquire */);
110110
if (LockingMode != LM_LIGHTWEIGHT) {
111111
// Store a non-null value into the box to avoid looking like a re-entrant
112112
// lock. The fast-path monitor unlock code checks for
@@ -166,7 +166,7 @@ void C2_MacroAssembler::fast_unlock_c2(Register oop, Register box, Register flag
166166
// Check if it is still a light weight lock, this is true if we
167167
// see the stack address of the basicLock in the markWord of the
168168
// object.
169-
cmpxchg(Address(oop, 0), box, disp_hdr, flag, false, false);
169+
cmpxchg(Address(oop, 0), box, disp_hdr, flag, false, false /* acquire */);
170170
b(cont);
171171
} else {
172172
assert(LockingMode == LM_LIGHTWEIGHT, "must be");
@@ -1317,16 +1317,26 @@ void C2_MacroAssembler::reduce(Register dst, Register src, FloatRegister vsrc, F
13171317
} else if (vector_size == 16) {
13181318
vpermi_w(tmp1, vsrc, 0b00001110);
13191319
reduce_ins_v(tmp1, vsrc, tmp1, type, opcode);
1320+
} else if (vector_size == 8) {
1321+
vshuf4i_w(tmp1, vsrc, 0b00000001);
1322+
reduce_ins_v(tmp1, vsrc, tmp1, type, opcode);
1323+
} else if (vector_size == 4) {
1324+
vshuf4i_h(tmp1, vsrc, 0b00000001);
1325+
reduce_ins_v(tmp1, vsrc, tmp1, type, opcode);
13201326
} else {
13211327
ShouldNotReachHere();
13221328
}
13231329

13241330
if (type != T_LONG) {
1325-
vshuf4i_w(tmp2, tmp1, 0b00000001);
1326-
reduce_ins_v(tmp1, tmp2, tmp1, type, opcode);
1327-
if (type != T_INT) {
1328-
vshuf4i_h(tmp2, tmp1, 0b00000001);
1331+
if (vector_size > 8) {
1332+
vshuf4i_w(tmp2, tmp1, 0b00000001);
13291333
reduce_ins_v(tmp1, tmp2, tmp1, type, opcode);
1334+
}
1335+
if (type != T_INT) {
1336+
if (vector_size > 4) {
1337+
vshuf4i_h(tmp2, tmp1, 0b00000001);
1338+
reduce_ins_v(tmp1, tmp2, tmp1, type, opcode);
1339+
}
13301340
if (type != T_SHORT) {
13311341
vshuf4i_b(tmp2, tmp1, 0b00000001);
13321342
reduce_ins_v(tmp1, tmp2, tmp1, type, opcode);
@@ -1414,6 +1424,11 @@ void C2_MacroAssembler::reduce(FloatRegister dst, FloatRegister src, FloatRegist
14141424
default:
14151425
ShouldNotReachHere();
14161426
}
1427+
} else if (vector_size == 8) {
1428+
assert(type == T_FLOAT, "must be");
1429+
vpermi_w(tmp, vsrc, 0b00000001);
1430+
reduce_ins_f(dst, vsrc, src, type, opcode);
1431+
reduce_ins_f(dst, tmp, dst, type, opcode);
14171432
} else {
14181433
ShouldNotReachHere();
14191434
}
@@ -1487,8 +1502,8 @@ void C2_MacroAssembler::vector_compare(FloatRegister dst, FloatRegister src1, Fl
14871502
case BoolTest::eq: xvfcmp_ceq_s (dst, src1, src2); break;
14881503
case BoolTest::ge: xvfcmp_cle_s (dst, src2, src1); break;
14891504
case BoolTest::gt: xvfcmp_clt_s (dst, src2, src1); break;
1490-
case BoolTest::le: xvfcmp_cule_s(dst, src1, src2); break;
1491-
case BoolTest::lt: xvfcmp_cult_s(dst, src1, src2); break;
1505+
case BoolTest::le: xvfcmp_cle_s (dst, src1, src2); break;
1506+
case BoolTest::lt: xvfcmp_clt_s (dst, src1, src2); break;
14921507
default:
14931508
ShouldNotReachHere();
14941509
}
@@ -1498,15 +1513,15 @@ void C2_MacroAssembler::vector_compare(FloatRegister dst, FloatRegister src1, Fl
14981513
case BoolTest::eq: xvfcmp_ceq_d (dst, src1, src2); break;
14991514
case BoolTest::ge: xvfcmp_cle_d (dst, src2, src1); break;
15001515
case BoolTest::gt: xvfcmp_clt_d (dst, src2, src1); break;
1501-
case BoolTest::le: xvfcmp_cule_d(dst, src1, src2); break;
1502-
case BoolTest::lt: xvfcmp_cult_d(dst, src1, src2); break;
1516+
case BoolTest::le: xvfcmp_cle_d (dst, src1, src2); break;
1517+
case BoolTest::lt: xvfcmp_clt_d (dst, src1, src2); break;
15031518
default:
15041519
ShouldNotReachHere();
15051520
}
15061521
} else {
15071522
ShouldNotReachHere();
15081523
}
1509-
} else if (vector_size == 16) {
1524+
} else if (vector_size == 16 || vector_size == 8 || vector_size == 4) {
15101525
if (bt == T_BYTE) {
15111526
switch (cond) {
15121527
case BoolTest::ne: vseq_b (dst, src1, src2); vxori_b(dst, dst, 0xff); break;
@@ -1573,8 +1588,8 @@ void C2_MacroAssembler::vector_compare(FloatRegister dst, FloatRegister src1, Fl
15731588
case BoolTest::eq: vfcmp_ceq_s (dst, src1, src2); break;
15741589
case BoolTest::ge: vfcmp_cle_s (dst, src2, src1); break;
15751590
case BoolTest::gt: vfcmp_clt_s (dst, src2, src1); break;
1576-
case BoolTest::le: vfcmp_cule_s(dst, src1, src2); break;
1577-
case BoolTest::lt: vfcmp_cult_s(dst, src1, src2); break;
1591+
case BoolTest::le: vfcmp_cle_s (dst, src1, src2); break;
1592+
case BoolTest::lt: vfcmp_clt_s (dst, src1, src2); break;
15781593
default:
15791594
ShouldNotReachHere();
15801595
}
@@ -1584,8 +1599,8 @@ void C2_MacroAssembler::vector_compare(FloatRegister dst, FloatRegister src1, Fl
15841599
case BoolTest::eq: vfcmp_ceq_d (dst, src1, src2); break;
15851600
case BoolTest::ge: vfcmp_cle_d (dst, src2, src1); break;
15861601
case BoolTest::gt: vfcmp_clt_d (dst, src2, src1); break;
1587-
case BoolTest::le: vfcmp_cule_d(dst, src1, src2); break;
1588-
case BoolTest::lt: vfcmp_cult_d(dst, src1, src2); break;
1602+
case BoolTest::le: vfcmp_cle_d (dst, src1, src2); break;
1603+
case BoolTest::lt: vfcmp_clt_d (dst, src1, src2); break;
15891604
default:
15901605
ShouldNotReachHere();
15911606
}

src/hotspot/cpu/loongarch/gc/shenandoah/shenandoahBarrierSetAssembler_loongarch.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ void ShenandoahBarrierSetAssembler::try_resolve_jobject_in_native(MacroAssembler
463463
//
464464
// Clobbers SCR1, SCR2
465465
void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm,
466-
Register mem,
466+
Address addr,
467467
Register expected,
468468
Register new_val,
469469
bool acquire, bool is_cae,
@@ -472,10 +472,9 @@ void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm,
472472
Register tmp2 = SCR1;
473473
bool is_narrow = UseCompressedOops;
474474

475-
assert_different_registers(mem, expected, tmp1, tmp2);
476-
assert_different_registers(mem, new_val, tmp1, tmp2);
475+
assert_different_registers(addr.base(), expected, tmp1, tmp2);
476+
assert_different_registers(addr.base(), new_val, tmp1, tmp2);
477477

478-
Address addr(mem);
479478
Label step4, done_succ, done_fail, done;
480479

481480
// There are two ways to reach this label. Initial entry into the
@@ -513,9 +512,9 @@ void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm,
513512

514513
if (is_narrow) {
515514
__ cmpxchg32(addr, expected, new_val, tmp2, false /* sign */, false /* retold */,
516-
acquire /* barrier */, false /* weak */, true /* exchange */);
515+
acquire /* acquire */, false /* weak */, true /* exchange */);
517516
} else {
518-
__ cmpxchg(addr, expected, new_val, tmp2, false /* retold */, acquire /* barrier */,
517+
__ cmpxchg(addr, expected, new_val, tmp2, false /* retold */, acquire /* acquire */,
519518
false /* weak */, true /* exchange */);
520519
}
521520
// tmp2 holds value fetched.
@@ -579,9 +578,9 @@ void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm,
579578
// compares result with expected.
580579
if (is_narrow) {
581580
__ cmpxchg32(addr, tmp2, new_val, tmp1, false /* sign */, false /* retold */,
582-
acquire /* barrier */, false /* weak */, false /* exchange */);
581+
acquire /* acquire */, false /* weak */, false /* exchange */);
583582
} else {
584-
__ cmpxchg(addr, tmp2, new_val, tmp1, false /* retold */, acquire /* barrier */,
583+
__ cmpxchg(addr, tmp2, new_val, tmp1, false /* retold */, acquire /* acquire */,
585584
false /* weak */, false /* exchange */);
586585
}
587586
// tmp1 set iff success, tmp2 holds value fetched.

src/hotspot/cpu/loongarch/gc/shenandoah/shenandoahBarrierSetAssembler_loongarch.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class ShenandoahBarrierSetAssembler: public BarrierSetAssembler {
8181
Address dst, Register val, Register tmp1, Register tmp2, Register tmp3);
8282
virtual void try_resolve_jobject_in_native(MacroAssembler* masm, Register jni_env,
8383
Register obj, Register tmp, Label& slowpath);
84-
void cmpxchg_oop(MacroAssembler* masm, Register mem, Register expected, Register new_val,
84+
void cmpxchg_oop(MacroAssembler* masm, Address mem, Register expected, Register new_val,
8585
bool acquire, bool is_cae, Register result);
8686
};
8787

0 commit comments

Comments
 (0)