Skip to content

Commit c95fd63

Browse files
authored
Update (2023.07.12, 4th)
31556: Supplement missing nodes about CMoveF/D 31469: LA port of 8310459: [BACKOUT] 8304450: [vectorapi] Refactor VectorShuffle implementation 31470: LA port of 8309685: Fix -Wconversion warnings in assembler and register code 31471: LA port of 8310906: Fix -Wconversion warnings in runtime, oops and some code header files.
1 parent 24440db commit c95fd63

File tree

5 files changed

+106
-15
lines changed

5 files changed

+106
-15
lines changed

src/hotspot/cpu/loongarch/continuationFreezeThaw_loongarch.inline.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ template<typename FKind> frame ThawBase::new_stack_frame(const frame& hf, frame&
210210
intptr_t* heap_sp = hf.unextended_sp();
211211
// If caller is interpreted it already made room for the callee arguments
212212
int overlap = caller.is_interpreted_frame() ? ContinuationHelper::InterpretedFrame::stack_argsize(hf) : 0;
213-
const int fsize = ContinuationHelper::InterpretedFrame::frame_bottom(hf) - hf.unextended_sp() - overlap;
213+
const int fsize = (int)(ContinuationHelper::InterpretedFrame::frame_bottom(hf) - hf.unextended_sp() - overlap);
214214
const int locals = hf.interpreter_frame_method()->max_locals();
215215
intptr_t* frame_sp = caller.unextended_sp() - fsize;
216216
intptr_t* fp = frame_sp + (hf.fp() - heap_sp);

src/hotspot/cpu/loongarch/frame_loongarch.inline.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ inline intptr_t* frame::real_fp() const {
223223

224224
inline int frame::frame_size() const {
225225
return is_interpreted_frame()
226-
? sender_sp() - sp()
226+
? pointer_delta_as_int(sender_sp(), sp())
227227
: cb()->frame_size();
228228
}
229229

src/hotspot/cpu/loongarch/loongarch_64.ad

Lines changed: 99 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,10 +1093,6 @@ const bool Matcher::vector_needs_partial_operations(Node* node, const TypeVect*
10931093
return false;
10941094
}
10951095

1096-
const bool Matcher::vector_needs_load_shuffle(BasicType elem_bt, int vlen) {
1097-
return false;
1098-
}
1099-
11001096
const RegMask* Matcher::predicate_reg_mask(void) {
11011097
return nullptr;
11021098
}
@@ -4181,7 +4177,8 @@ opclass memory( indirect, indOffset12, indOffset12I2L, indIndex, indIndexI2L,
41814177
opclass memory_loadRange(indOffset12, indirect);
41824178

41834179
opclass mRegLorI2L(mRegI2L, mRegL);
4184-
opclass mRegIorL2I( mRegI, mRegL2I);
4180+
opclass mRegIorL2I(mRegI, mRegL2I);
4181+
opclass mRegLorP(mRegL, mRegP);
41854182

41864183
//----------PIPELINE-----------------------------------------------------------
41874184
// Rules which define the behavior of the target architectures pipeline.
@@ -8112,6 +8109,26 @@ instruct cmovD_cmpD_reg_reg(regD dst, regD src, regD tmp1, regD tmp2, cmpOp cop
81128109
ins_pipe( pipe_slow );
81138110
%}
81148111

8112+
instruct cmovD_cmpF_reg_reg(regD dst, regD src, regF tmp1, regF tmp2, cmpOp cop ) %{
8113+
match(Set dst (CMoveD (Binary cop (CmpF tmp1 tmp2)) (Binary dst src)));
8114+
ins_cost(200);
8115+
format %{
8116+
"CMP$cop $tmp1, $tmp2\t @cmovD_cmpF_reg_reg\n"
8117+
"\tCMOV $dst,$src \t @cmovD_cmpF_reg_reg"
8118+
%}
8119+
ins_encode %{
8120+
FloatRegister reg_op1 = as_FloatRegister($tmp1$$reg);
8121+
FloatRegister reg_op2 = as_FloatRegister($tmp2$$reg);
8122+
FloatRegister dst = as_FloatRegister($dst$$reg);
8123+
FloatRegister src = as_FloatRegister($src$$reg);
8124+
int flag = $cop$$cmpcode;
8125+
8126+
__ cmp_cmov(reg_op1, reg_op2, dst, src, (MacroAssembler::CMCompare) flag, true /* is_float */);
8127+
%}
8128+
8129+
ins_pipe( pipe_slow );
8130+
%}
8131+
81158132
instruct cmovF_cmpI_reg_reg(regF dst, regF src, mRegI tmp1, mRegI tmp2, cmpOp cop) %{
81168133
match(Set dst (CMoveF (Binary cop (CmpI tmp1 tmp2)) (Binary dst src)));
81178134
ins_cost(200);
@@ -8133,6 +8150,27 @@ instruct cmovF_cmpI_reg_reg(regF dst, regF src, mRegI tmp1, mRegI tmp2, cmpOp co
81338150
ins_pipe( pipe_slow );
81348151
%}
81358152

8153+
instruct cmovF_cmpL_reg_reg(regF dst, regF src, mRegL tmp1, mRegL tmp2, cmpOp cop) %{
8154+
match(Set dst (CMoveF (Binary cop (CmpL tmp1 tmp2)) (Binary dst src)));
8155+
ins_cost(200);
8156+
format %{
8157+
"CMP$cop $tmp1, $tmp2\t @cmovF_cmpL_reg_reg\n"
8158+
"\tCMOV $dst, $src \t @cmovF_cmpL_reg_reg"
8159+
%}
8160+
8161+
ins_encode %{
8162+
Register op1 = $tmp1$$Register;
8163+
Register op2 = $tmp2$$Register;
8164+
FloatRegister dst = as_FloatRegister($dst$$reg);
8165+
FloatRegister src = as_FloatRegister($src$$reg);
8166+
int flag = $cop$$cmpcode;
8167+
8168+
__ cmp_cmov(op1, op2, dst, src, (MacroAssembler::CMCompare) flag);
8169+
%}
8170+
8171+
ins_pipe( pipe_slow );
8172+
%}
8173+
81368174
instruct cmovD_cmpI_reg_reg(regD dst, regD src, mRegI tmp1, mRegI tmp2, cmpOp cop) %{
81378175
match(Set dst (CMoveD (Binary cop (CmpI tmp1 tmp2)) (Binary dst src)));
81388176
ins_cost(200);
@@ -8154,12 +8192,13 @@ instruct cmovD_cmpI_reg_reg(regD dst, regD src, mRegI tmp1, mRegI tmp2, cmpOp co
81548192
ins_pipe( pipe_slow );
81558193
%}
81568194

8157-
instruct cmovD_cmpP_reg_reg(regD dst, regD src, mRegP tmp1, mRegP tmp2, cmpOp cop) %{
8195+
instruct cmovD_cmpLorP_reg_reg(regD dst, regD src, mRegLorP tmp1, mRegLorP tmp2, cmpOp cop) %{
81588196
match(Set dst (CMoveD (Binary cop (CmpP tmp1 tmp2)) (Binary dst src)));
8197+
match(Set dst (CMoveD (Binary cop (CmpL tmp1 tmp2)) (Binary dst src)));
81598198
ins_cost(200);
81608199
format %{
8161-
"CMP$cop $tmp1, $tmp2\t @cmovD_cmpP_reg_reg\n"
8162-
"\tCMOV $dst, $src \t @cmovD_cmpP_reg_reg"
8200+
"CMP$cop $tmp1, $tmp2\t @cmovD_cmpLorP_reg_reg\n"
8201+
"\tCMOV $dst, $src \t @cmovD_cmpLorP_reg_reg"
81638202
%}
81648203

81658204
ins_encode %{
@@ -8221,6 +8260,26 @@ instruct cmovF_cmpF_reg_reg(regF dst, regF src, regF tmp1, regF tmp2, cmpOp cop
82218260
ins_pipe( pipe_slow );
82228261
%}
82238262

8263+
instruct cmovF_cmpD_reg_reg(regF dst, regF src, regD tmp1, regD tmp2, cmpOp cop ) %{
8264+
match(Set dst (CMoveF (Binary cop (CmpD tmp1 tmp2)) (Binary dst src)));
8265+
ins_cost(200);
8266+
format %{
8267+
"CMP$cop $tmp1, $tmp2\t @cmovF_cmpD_reg_reg\n"
8268+
"\tCMOV $dst,$src \t @cmovF_cmpD_reg_reg"
8269+
%}
8270+
8271+
ins_encode %{
8272+
FloatRegister reg_op1 = $tmp1$$FloatRegister;
8273+
FloatRegister reg_op2 = $tmp2$$FloatRegister;
8274+
FloatRegister dst = $dst$$FloatRegister;
8275+
FloatRegister src = $src$$FloatRegister;
8276+
int flag = $cop$$cmpcode;
8277+
8278+
__ cmp_cmov(reg_op1, reg_op2, dst, src, (MacroAssembler::CMCompare) flag, false /* is_float */);
8279+
%}
8280+
ins_pipe( pipe_slow );
8281+
%}
8282+
82248283
// Manifest a CmpL result in an integer register. Very painful.
82258284
// This is the test to avoid.
82268285
instruct cmpL3_reg_zero(mRegI dst, mRegL src1, immL_0 zero) %{
@@ -17207,6 +17266,38 @@ instruct loadconV32(vecY dst, immI_0 src) %{
1720717266
ins_pipe( pipe_slow );
1720817267
%}
1720917268

17269+
// ---------------------------- LOAD_SHUFFLE ----------------------------------
17270+
17271+
instruct loadShuffle16B(vecX dst) %{
17272+
predicate(Matcher::vector_length(n) == 16 && Matcher::vector_element_basic_type(n) == T_BYTE);
17273+
match(Set dst (VectorLoadShuffle dst));
17274+
format %{ "vld_shuffle $dst\t# @loadShuffle16B" %}
17275+
ins_encode %{
17276+
// empty
17277+
%}
17278+
ins_pipe( pipe_slow );
17279+
%}
17280+
17281+
instruct loadShuffle32B(vecY dst) %{
17282+
predicate(Matcher::vector_length(n) == 32 && Matcher::vector_element_basic_type(n) == T_BYTE);
17283+
match(Set dst (VectorLoadShuffle dst));
17284+
format %{ "xvld_shuffle $dst\t# @loadShuffle32B" %}
17285+
ins_encode %{
17286+
// empty
17287+
%}
17288+
ins_pipe( pipe_slow );
17289+
%}
17290+
17291+
instruct loadShuffle16S(vecY dst, vecX src) %{
17292+
predicate(Matcher::vector_length(n) == 16 && Matcher::vector_element_basic_type(n) == T_SHORT);
17293+
match(Set dst (VectorLoadShuffle src));
17294+
format %{ "vext2xv.hu.bu $dst, $src\t# @loadShuffle16S" %}
17295+
ins_encode %{
17296+
__ vext2xv_hu_bu($dst$$FloatRegister, $src$$FloatRegister);
17297+
%}
17298+
ins_pipe( pipe_slow );
17299+
%}
17300+
1721017301
// ---------------------------- Rearrange -------------------------------------
1721117302

1721217303
instruct rearrange16B(vecX dst, vecX src, vecX shuffle) %{

src/hotspot/cpu/loongarch/register_loongarch.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class Register {
5555

5656
public:
5757
// accessors
58-
constexpr int raw_encoding() const { return this - first(); }
58+
constexpr int raw_encoding() const { return checked_cast<int>(this - first()); }
5959
constexpr int encoding() const { assert(is_valid(), "invalid register"); return raw_encoding(); }
6060
constexpr bool is_valid() const { return 0 <= raw_encoding() && raw_encoding() < number_of_registers; }
6161

@@ -225,7 +225,7 @@ class FloatRegister {
225225

226226
public:
227227
// accessors
228-
constexpr int raw_encoding() const { return this - first(); }
228+
constexpr int raw_encoding() const { return checked_cast<int>(this - first()); }
229229
constexpr int encoding() const { assert(is_valid(), "invalid register"); return raw_encoding(); }
230230
constexpr bool is_valid() const { return 0 <= raw_encoding() && raw_encoding() < number_of_registers; }
231231

@@ -386,7 +386,7 @@ class ConditionalFlagRegister {
386386

387387
public:
388388
// accessors
389-
int raw_encoding() const { return this - first(); }
389+
int raw_encoding() const { return checked_cast<int>(this - first()); }
390390
int encoding() const { assert(is_valid(), "invalid register"); return raw_encoding(); }
391391
bool is_valid() const { return 0 <= raw_encoding() && raw_encoding() < number_of_registers; }
392392

src/hotspot/cpu/loongarch/stackChunkFrameStream_loongarch.inline.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@ inline int StackChunkFrameStream<frame_kind>::interpreter_frame_num_oops() const
115115
f.interpreted_frame_oop_map(&mask);
116116
return mask.num_oops()
117117
+ 1 // for the mirror oop
118-
+ ((intptr_t*)f.interpreter_frame_monitor_begin()
119-
- (intptr_t*)f.interpreter_frame_monitor_end()) / BasicObjectLock::size();
118+
+ pointer_delta_as_int((intptr_t*)f.interpreter_frame_monitor_begin(),
119+
(intptr_t*)f.interpreter_frame_monitor_end()) / BasicObjectLock::size();
120120
}
121121

122122
template<>

0 commit comments

Comments
 (0)