src/hotspot/cpu/arm/interpreterRT_arm.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File
*** old/src/hotspot/cpu/arm/interpreterRT_arm.cpp	Mon Sep 17 10:30:13 2018
--- new/src/hotspot/cpu/arm/interpreterRT_arm.cpp	Mon Sep 17 10:30:12 2018

*** 42,58 **** --- 42,54 ---- const methodHandle& method, CodeBuffer* buffer) : NativeSignatureIterator(method) { _masm = new MacroAssembler(buffer); _abi_offset = 0; _ireg = is_static() ? 2 : 1; #ifdef __ABI_HARD__ #ifdef AARCH64 _freg = 0; #else _fp_slot = 0; _single_fpr_slot = 0; #endif #endif } #ifdef SHARING_FAST_NATIVE_FINGERPRINTS // mapping from SignatureIterator param to (common) type of parsing static const u1 shared_type[] = {
*** 124,144 **** --- 120,129 ---- _abi_offset++; } } void InterpreterRuntime::SignatureHandlerGenerator::pass_long() { #ifdef AARCH64 if (_ireg < GPR_PARAMS) { Register dst = as_Register(_ireg); __ ldr(dst, Address(Rlocals, Interpreter::local_offset_in_bytes(offset() + 1))); _ireg++; } else { __ ldr(Rtemp, Address(Rlocals, Interpreter::local_offset_in_bytes(offset() + 1))); __ str(Rtemp, Address(SP, _abi_offset * wordSize)); _abi_offset++; } #else if (_ireg <= 2) { #if (ALIGN_WIDE_ARGUMENTS == 1) if ((_ireg & 1) != 0) { // 64-bit values should be 8-byte aligned _ireg++;
*** 168,195 **** --- 153,165 ---- __ ldr(Rtemp, Address(Rlocals, Interpreter::local_offset_in_bytes(offset()))); __ str(Rtemp, Address(SP, (_abi_offset+1) * wordSize)); _abi_offset += 2; _ireg = 4; } #endif // AARCH64 } void InterpreterRuntime::SignatureHandlerGenerator::pass_object() { #ifdef AARCH64 __ ldr(Rtemp, Address(Rlocals, Interpreter::local_offset_in_bytes(offset()))); __ cmp(Rtemp, 0); __ sub(Rtemp, Rlocals, -Interpreter::local_offset_in_bytes(offset())); if (_ireg < GPR_PARAMS) { Register dst = as_Register(_ireg); __ csel(dst, ZR, Rtemp, eq); _ireg++; } else { __ csel(Rtemp, ZR, Rtemp, eq); __ str(Rtemp, Address(SP, _abi_offset * wordSize)); _abi_offset++; } #else if (_ireg < 4) { Register dst = as_Register(_ireg); __ ldr(dst, Address(Rlocals, Interpreter::local_offset_in_bytes(offset()))); __ cmp(dst, 0); __ sub(dst, Rlocals, -Interpreter::local_offset_in_bytes(offset()), ne);
*** 199,209 **** --- 169,178 ---- __ cmp(Rtemp, 0); __ sub(Rtemp, Rlocals, -Interpreter::local_offset_in_bytes(offset()), ne); __ str(Rtemp, Address(SP, _abi_offset * wordSize)); _abi_offset++; } #endif // AARCH64 } #ifndef __ABI_HARD__ void InterpreterRuntime::SignatureHandlerGenerator::pass_float() { if (_ireg < 4) {
*** 218,238 **** --- 187,196 ---- } #else #ifndef __SOFTFP__ void InterpreterRuntime::SignatureHandlerGenerator::pass_float() { #ifdef AARCH64 if (_freg < FPR_PARAMS) { FloatRegister dst = as_FloatRegister(_freg); __ ldr_s(dst, Address(Rlocals, Interpreter::local_offset_in_bytes(offset()))); _freg++; } else { __ ldr_u32(Rtemp, Address(Rlocals, Interpreter::local_offset_in_bytes(offset()))); __ str_32(Rtemp, Address(SP, _abi_offset * wordSize)); _abi_offset++; } #else if((_fp_slot < 16) || (_single_fpr_slot & 1)) { if ((_single_fpr_slot & 1) == 0) { _single_fpr_slot = _fp_slot; _fp_slot += 2; }
*** 241,265 **** --- 199,211 ---- } else { __ ldr(Rtemp, Address(Rlocals, Interpreter::local_offset_in_bytes(offset()))); __ str(Rtemp, Address(SP, _abi_offset * wordSize)); _abi_offset++; } #endif // AARCH64 } void InterpreterRuntime::SignatureHandlerGenerator::pass_double() { #ifdef AARCH64 if (_freg < FPR_PARAMS) { FloatRegister dst = as_FloatRegister(_freg); __ ldr_d(dst, Address(Rlocals, Interpreter::local_offset_in_bytes(offset() + 1))); _freg++; } else { __ ldr(Rtemp, Address(Rlocals, Interpreter::local_offset_in_bytes(offset() + 1))); __ str(Rtemp, Address(SP, _abi_offset * wordSize)); _abi_offset++; } #else if(_fp_slot <= 14) { __ fldd(as_FloatRegister(_fp_slot), Address(Rlocals, Interpreter::local_offset_in_bytes(offset()+1))); _fp_slot += 2; } else { __ ldr(Rtemp, Address(Rlocals, Interpreter::local_offset_in_bytes(offset()+1)));
*** 267,277 **** --- 213,222 ---- __ ldr(Rtemp, Address(Rlocals, Interpreter::local_offset_in_bytes(offset()))); __ str(Rtemp, Address(SP, (_abi_offset+1) * wordSize)); _abi_offset += 2; _single_fpr_slot = 16; } #endif // AARCH64 } #endif // __SOFTFP__ #endif // __ABI_HARD__ void InterpreterRuntime::SignatureHandlerGenerator::generate(uint64_t fingerprint) {
*** 279,296 **** --- 224,237 ---- BasicType result_type = SignatureIterator::return_type(fingerprint); address result_handler = Interpreter::result_handler(result_type); #ifdef AARCH64 __ mov_slow(R0, (address)result_handler); #else // Check that result handlers are not real handler on ARM (0 or -1). // This ensures the signature handlers do not need symbolic information. assert((result_handler == NULL)||(result_handler==(address)0xffffffff),""); __ mov_slow(R0, (intptr_t)result_handler); #endif __ ret(); }
*** 337,349 **** --- 278,288 ---- intptr_t* _toFP; intptr_t* _toGP; int _last_gp; int _last_fp; #ifndef AARCH64 int _last_single_fp; #endif // !AARCH64 virtual void pass_int() { if(_last_gp < GPR_PARAMS) { _toGP[_last_gp++] = *(jint *)(_from+Interpreter::local_offset_in_bytes(0)); } else {
*** 351,367 **** --- 290,299 ---- } _from -= Interpreter::stackElementSize; } virtual void pass_long() { #ifdef AARCH64 if(_last_gp < GPR_PARAMS) { _toGP[_last_gp++] = *(jlong *)(_from+Interpreter::local_offset_in_bytes(1)); } else { *_to++ = *(jlong *)(_from+Interpreter::local_offset_in_bytes(1)); } #else assert(ALIGN_WIDE_ARGUMENTS == 1, "ABI_HARD not supported with unaligned wide arguments"); if (_last_gp <= 2) { if(_last_gp & 1) _last_gp++; _toGP[_last_gp++] = *(jint *)(_from+Interpreter::local_offset_in_bytes(1)); _toGP[_last_gp++] = *(jint *)(_from+Interpreter::local_offset_in_bytes(0));
*** 373,383 **** --- 305,314 ---- _to[0] = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(1)); _to[1] = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(0)); _to += 2; _last_gp = 4; } #endif // AARCH64 _from -= 2*Interpreter::stackElementSize; } virtual void pass_object() { intptr_t from_addr = (intptr_t)(_from + Interpreter::local_offset_in_bytes(0));
*** 388,426 **** --- 319,342 ---- } _from -= Interpreter::stackElementSize; } virtual void pass_float() { #ifdef AARCH64 if(_last_fp < FPR_PARAMS) { _toFP[_last_fp++] = *(jint *)(_from+Interpreter::local_offset_in_bytes(0)); } else { *_to++ = *(jint *)(_from+Interpreter::local_offset_in_bytes(0)); } #else if((_last_fp < 16) || (_last_single_fp & 1)) { if ((_last_single_fp & 1) == 0) { _last_single_fp = _last_fp; _last_fp += 2; } _toFP[_last_single_fp++] = *(jint *)(_from+Interpreter::local_offset_in_bytes(0)); } else { *_to++ = *(jint *)(_from+Interpreter::local_offset_in_bytes(0)); } #endif // AARCH64 _from -= Interpreter::stackElementSize; } virtual void pass_double() { #ifdef AARCH64 if(_last_fp < FPR_PARAMS) { _toFP[_last_fp++] = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(1)); } else { *_to++ = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(1)); } #else assert(ALIGN_WIDE_ARGUMENTS == 1, "ABI_HARD not supported with unaligned wide arguments"); if(_last_fp <= 14) { _toFP[_last_fp++] = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(1)); _toFP[_last_fp++] = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(0)); } else {
*** 430,440 **** --- 346,355 ---- _to[0] = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(1)); _to[1] = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(0)); _to += 2; _last_single_fp = 16; } #endif // AARCH64 _from -= 2*Interpreter::stackElementSize; } #endif // !__ABI_HARD__
*** 444,459 **** --- 359,372 ---- _from = from; #ifdef __ABI_HARD__ _toGP = to; _toFP = _toGP + GPR_PARAMS; - _to = _toFP + AARCH64_ONLY(FPR_PARAMS) NOT_AARCH64(8*2); _last_gp = (is_static() ? 2 : 1); _last_fp = 0; #ifndef AARCH64 _last_single_fp = 0; #endif // !AARCH64 #else _to = to + (is_static() ? 2 : 1); #endif // __ABI_HARD__ } };

src/hotspot/cpu/arm/interpreterRT_arm.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File