Skip to content

Commit 114dfbe

Browse files
authored
Update (2023.12.13)
31769: [6000] Support AM{SWAP/ADD}{_DB}.{B/H} and AMCAS{_DB}.{B/H/W/D} insns
1 parent 8ff0b92 commit 114dfbe

File tree

11 files changed

+958
-132
lines changed

11 files changed

+958
-132
lines changed

src/hotspot/cpu/loongarch/assembler_loongarch.hpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,22 @@ class Assembler : public AbstractAssembler {
739739
vstx_op = 0b00111000010001000,
740740
xvldx_op = 0b00111000010010000,
741741
xvstx_op = 0b00111000010011000,
742+
amcas_b_op = 0b00111000010110000,
743+
amcas_h_op = 0b00111000010110001,
744+
amcas_w_op = 0b00111000010110010,
745+
amcas_d_op = 0b00111000010110011,
746+
amcas_db_b_op = 0b00111000010110100,
747+
amcas_db_h_op = 0b00111000010110101,
748+
amcas_db_w_op = 0b00111000010110110,
749+
amcas_db_d_op = 0b00111000010110111,
750+
amswap_b_op = 0b00111000010111000,
751+
amswap_h_op = 0b00111000010111001,
752+
amadd_b_op = 0b00111000010111010,
753+
amadd_h_op = 0b00111000010111011,
754+
amswap_db_b_op = 0b00111000010111100,
755+
amswap_db_h_op = 0b00111000010111101,
756+
amadd_db_b_op = 0b00111000010111110,
757+
amadd_db_h_op = 0b00111000010111111,
742758
amswap_w_op = 0b00111000011000000,
743759
amswap_d_op = 0b00111000011000001,
744760
amadd_w_op = 0b00111000011000010,
@@ -2148,8 +2164,16 @@ class Assembler : public AbstractAssembler {
21482164
void fst_s (FloatRegister fd, const Address &dst);
21492165
void fst_d (FloatRegister fd, const Address &dst);
21502166

2167+
void amcas_b (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amcas_b_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
2168+
void amcas_h (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amcas_h_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
2169+
void amcas_w (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amcas_w_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
2170+
void amcas_d (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amcas_d_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
2171+
void amswap_b (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amswap_b_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
2172+
void amswap_h (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amswap_h_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
21512173
void amswap_w (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amswap_w_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
21522174
void amswap_d (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amswap_d_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
2175+
void amadd_b (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amadd_b_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
2176+
void amadd_h (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amadd_h_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
21532177
void amadd_w (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amadd_w_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
21542178
void amadd_d (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amadd_d_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
21552179
void amand_w (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amand_w_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
@@ -2166,8 +2190,16 @@ class Assembler : public AbstractAssembler {
21662190
void ammax_du (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(ammax_du_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
21672191
void ammin_wu (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(ammin_wu_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
21682192
void ammin_du (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(ammin_du_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
2193+
void amcas_db_b(Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amcas_db_b_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
2194+
void amcas_db_h(Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amcas_db_h_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
2195+
void amcas_db_w(Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amcas_db_w_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
2196+
void amcas_db_d(Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amcas_db_d_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
2197+
void amswap_db_b(Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amswap_db_b_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
2198+
void amswap_db_h(Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amswap_db_h_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
21692199
void amswap_db_w(Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amswap_db_w_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
21702200
void amswap_db_d(Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amswap_db_d_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
2201+
void amadd_db_b (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amadd_db_b_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
2202+
void amadd_db_h (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amadd_db_h_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
21712203
void amadd_db_w (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amadd_db_w_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
21722204
void amadd_db_d (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amadd_db_d_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
21732205
void amand_db_w (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amand_db_w_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
@@ -3169,6 +3201,7 @@ class Assembler : public AbstractAssembler {
31693201
#undef ASSERT_LASX
31703202

31713203
public:
3204+
enum operand_size { byte, halfword, word, dword };
31723205
// Creation
31733206
Assembler(CodeBuffer* code) : AbstractAssembler(code) {}
31743207

src/hotspot/cpu/loongarch/globals_loongarch.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,12 @@ define_pd_global(intx, InitArrayShortSize, 8*BytesPerLong);
9595
product(bool, UseGR2CF, false, \
9696
"Use GR to CFR instructions") \
9797
\
98+
product(bool, UseAMBH, false, \
99+
"Use AM{SWAP/ADD}{_DB}.{B/H} instructions") \
100+
\
101+
product(bool, UseAMCAS, false, \
102+
"Use AMCAS{_DB}.{B/H/W/D} instructions") \
103+
\
98104
product(bool, UseBarriersForVolatile, false, \
99105
"Use memory barriers to implement volatile accesses") \
100106
\

0 commit comments

Comments
 (0)