Skip to content

Commit b61da16

Browse files
authored
Update (2023.08.30)
31974: LA port of 8301996: Move field resolution information out of the cpCache 31973: LA port of 8313023: Return value corrupted when using CCS + isTrivial (mainline) 30508: Add 32, 64bit vectorAPI of HF2F, F2HF
1 parent c6a84e2 commit b61da16

File tree

6 files changed

+184
-110
lines changed

6 files changed

+184
-110
lines changed

src/hotspot/cpu/loongarch/assembler_loongarch.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ class Address {
155155
assert_different_registers(_base, AT);
156156
}
157157

158-
Address(Register base, Register index, ScaleFactor scale, int disp = 0)
158+
Address(Register base, Register index, ScaleFactor scale = no_scale, int disp = 0)
159159
: _base (base),
160160
_index(index),
161161
_scale(scale),

src/hotspot/cpu/loongarch/downcallLinker_loongarch_64.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ void DowncallStubGenerator::generate() {
166166
assert(_abi._shadow_space_bytes == 0, "not expecting shadow space on LoongArch64");
167167
allocated_frame_size += arg_shuffle.out_arg_bytes();
168168

169-
bool should_save_return_value = !_needs_return_buffer && _needs_transition;
169+
bool should_save_return_value = !_needs_return_buffer;
170170
RegSpiller out_reg_spiller(_output_registers);
171171
int spill_offset = -1;
172172

src/hotspot/cpu/loongarch/interp_masm_loongarch.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ class InterpreterMacroAssembler: public MacroAssembler {
121121
void get_method_counters(Register method, Register mcs, Label& skip);
122122

123123
void load_resolved_indy_entry(Register cache, Register index);
124+
void load_field_entry(Register cache, Register index, int bcp_offset = 1);
124125

125126
// load cpool->resolved_references(index);
126127
void load_resolved_reference_at_index(Register result, Register index, Register tmp);

src/hotspot/cpu/loongarch/interp_masm_loongarch_64.cpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@
3131
#include "interpreter/interpreterRuntime.hpp"
3232
#include "oops/arrayOop.hpp"
3333
#include "oops/markWord.hpp"
34-
#include "oops/methodData.hpp"
3534
#include "oops/method.hpp"
35+
#include "oops/methodData.hpp"
36+
#include "oops/resolvedFieldEntry.hpp"
3637
#include "oops/resolvedIndyEntry.hpp"
3738
#include "prims/jvmtiExport.hpp"
3839
#include "prims/jvmtiThreadState.hpp"
@@ -330,12 +331,29 @@ void InterpreterMacroAssembler::load_resolved_indy_entry(Register cache, Registe
330331
// Get address of invokedynamic array
331332
ld_d(cache, FP, frame::interpreter_frame_cache_offset * wordSize);
332333
ld_d(cache, Address(cache, in_bytes(ConstantPoolCache::invokedynamic_entries_offset())));
333-
// Scale the index to be the entry index * sizeof(ResolvedInvokeDynamicInfo)
334+
// Scale the index to be the entry index * sizeof(ResolvedIndyEntry)
334335
slli_d(index, index, log2i_exact(sizeof(ResolvedIndyEntry)));
335336
addi_d(cache, cache, Array<ResolvedIndyEntry>::base_offset_in_bytes());
336337
add_d(cache, cache, index);
337338
}
338339

340+
void InterpreterMacroAssembler::load_field_entry(Register cache, Register index, int bcp_offset) {
341+
// Get index out of bytecode pointer
342+
get_cache_index_at_bcp(index, bcp_offset, sizeof(u2));
343+
// Take shortcut if the size is a power of 2
344+
if (is_power_of_2(sizeof(ResolvedFieldEntry))) {
345+
slli_d(index, index, log2i_exact(sizeof(ResolvedFieldEntry))); // Scale index by power of 2
346+
} else {
347+
li(cache, sizeof(ResolvedFieldEntry));
348+
mul_d(index, index, cache); // Scale the index to be the entry index * sizeof(ResolvedIndyEntry)
349+
}
350+
ld_d(cache, FP, frame::interpreter_frame_cache_offset * wordSize);
351+
// Get address of field entries array
352+
ld_d(cache, Address(cache, ConstantPoolCache::field_entries_offset()));
353+
addi_d(cache, cache, Array<ResolvedIndyEntry>::base_offset_in_bytes());
354+
add_d(cache, cache, index);
355+
}
356+
339357
// Load object from cpool->resolved_references(index)
340358
void InterpreterMacroAssembler::load_resolved_reference_at_index(
341359
Register result, Register index, Register tmp) {

src/hotspot/cpu/loongarch/loongarch_64.ad

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14590,26 +14590,36 @@ instruct cvtVD(vReg dst, vReg src) %{
1459014590

1459114591
// ---------------------------- Vector Cast HF2F -------------------------------
1459214592

14593-
instruct cvt8HFto8F(vReg dst, vReg src) %{
14594-
predicate(Matcher::vector_length(n) == 8);
14593+
instruct cvtHFtoF(vReg dst, vReg src) %{
1459514594
match(Set dst (VectorCastHF2F src));
14596-
format %{ "(x)vconvert $dst, $src\t# @cvt8HFto8F" %}
14595+
format %{ "(x)vconvert $dst, $src\t# @cvtHFtoF" %}
1459714596
ins_encode %{
14598-
__ xvpermi_d($dst$$FloatRegister, $src$$FloatRegister, 0b01010000);
14599-
__ xvfcvtl_s_h($dst$$FloatRegister, $dst$$FloatRegister);
14597+
switch(Matcher::vector_length(this)) {
14598+
case 2:
14599+
case 4: __ vfcvtl_s_h($dst$$FloatRegister, $src$$FloatRegister); break;
14600+
case 8: __ xvpermi_d($dst$$FloatRegister, $src$$FloatRegister, 0b01010000);
14601+
__ xvfcvtl_s_h($dst$$FloatRegister, $dst$$FloatRegister); break;
14602+
default:
14603+
ShouldNotReachHere();
14604+
}
1460014605
%}
1460114606
ins_pipe( pipe_slow );
1460214607
%}
1460314608

1460414609
// ---------------------------- Vector Cast F2HF -------------------------------
1460514610

14606-
instruct cvt8Fto8HF(vReg dst, vReg src) %{
14607-
predicate(Matcher::vector_length(n) == 8);
14611+
instruct cvtFtoHF(vReg dst, vReg src) %{
1460814612
match(Set dst (VectorCastF2HF src));
14609-
format %{ "(x)vconvert $dst, $src\t# @cvt8Fto8HF" %}
14613+
format %{ "(x)vconvert $dst, $src\t# @cvtFtoHF" %}
1461014614
ins_encode %{
14611-
__ xvfcvt_h_s($dst$$FloatRegister, $src$$FloatRegister, $src$$FloatRegister);
14612-
__ xvpermi_d($dst$$FloatRegister, $dst$$FloatRegister, 0b11011000);
14615+
switch(Matcher::vector_length(this)) {
14616+
case 2:
14617+
case 4: __ vfcvt_h_s($dst$$FloatRegister, $src$$FloatRegister, $src$$FloatRegister); break;
14618+
case 8: __ xvfcvt_h_s($dst$$FloatRegister, $src$$FloatRegister, $src$$FloatRegister);
14619+
__ xvpermi_d($dst$$FloatRegister, $dst$$FloatRegister, 0b11011000); break;
14620+
default:
14621+
ShouldNotReachHere();
14622+
}
1461314623
%}
1461414624
ins_pipe( pipe_slow );
1461514625
%}

0 commit comments

Comments
 (0)