--- old/src/hotspot/cpu/x86/templateTable_x86.cpp 2018-05-07 22:23:39.060766051 +0200 +++ new/src/hotspot/cpu/x86/templateTable_x86.cpp 2018-05-07 22:23:38.762769781 +0200 @@ -767,9 +767,10 @@ // rax: index // rdx: array index_check(rdx, rax); // kills rbx - __ movl(rax, Address(rdx, rax, - Address::times_4, - arrayOopDesc::base_offset_in_bytes(T_INT))); + __ access_load_at(T_INT, IN_HEAP | IN_HEAP_ARRAY, rax, + Address(rdx, rax, Address::times_4, + arrayOopDesc::base_offset_in_bytes(T_INT)), + noreg, noreg); } void TemplateTable::laload() { @@ -779,8 +780,10 @@ index_check(rdx, rax); // kills rbx NOT_LP64(__ mov(rbx, rax)); // rbx,: index - __ movptr(rax, Address(rdx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize)); - NOT_LP64(__ movl(rdx, Address(rdx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 1 * wordSize))); + __ access_load_at(T_LONG, IN_HEAP | IN_HEAP_ARRAY, noreg /* ltos */, + Address(rdx, rbx, Address::times_8, + arrayOopDesc::base_offset_in_bytes(T_LONG)), + noreg, noreg); } @@ -790,9 +793,11 @@ // rax: index // rdx: array index_check(rdx, rax); // kills rbx - __ load_float(Address(rdx, rax, - Address::times_4, - arrayOopDesc::base_offset_in_bytes(T_FLOAT))); + __ access_load_at(T_FLOAT, IN_HEAP | IN_HEAP_ARRAY, noreg /* ftos */, + Address(rdx, rax, + Address::times_4, + arrayOopDesc::base_offset_in_bytes(T_FLOAT)), + noreg, noreg); } void TemplateTable::daload() { @@ -800,9 +805,11 @@ // rax: index // rdx: array index_check(rdx, rax); // kills rbx - __ load_double(Address(rdx, rax, - Address::times_8, - arrayOopDesc::base_offset_in_bytes(T_DOUBLE))); + __ access_load_at(T_DOUBLE, IN_HEAP | IN_HEAP_ARRAY, noreg /* dtos */, + Address(rdx, rax, + Address::times_8, + arrayOopDesc::base_offset_in_bytes(T_DOUBLE)), + noreg, noreg); } void TemplateTable::aaload() { @@ -823,7 +830,9 @@ // rax: index // rdx: array index_check(rdx, rax); // kills rbx - __ load_signed_byte(rax, Address(rdx, rax, Address::times_1, arrayOopDesc::base_offset_in_bytes(T_BYTE))); + __ access_load_at(T_BYTE, IN_HEAP | IN_HEAP_ARRAY, rax, + Address(rdx, rax, Address::times_1, arrayOopDesc::base_offset_in_bytes(T_BYTE)), + noreg, noreg); } void TemplateTable::caload() { @@ -831,7 +840,9 @@ // rax: index // rdx: array index_check(rdx, rax); // kills rbx - __ load_unsigned_short(rax, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); + __ access_load_at(T_CHAR, IN_HEAP | IN_HEAP_ARRAY, rax, + Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)), + noreg, noreg); } // iload followed by caload frequent pair @@ -844,10 +855,9 @@ // rax: index // rdx: array index_check(rdx, rax); // kills rbx - __ load_unsigned_short(rax, - Address(rdx, rax, - Address::times_2, - arrayOopDesc::base_offset_in_bytes(T_CHAR))); + __ access_load_at(T_CHAR, IN_HEAP | IN_HEAP_ARRAY, rax, + Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)), + noreg, noreg); } @@ -856,7 +866,9 @@ // rax: index // rdx: array index_check(rdx, rax); // kills rbx - __ load_signed_short(rax, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_SHORT))); + __ access_load_at(T_SHORT, IN_HEAP | IN_HEAP_ARRAY, rax, + Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_SHORT)), + noreg, noreg); } void TemplateTable::iload(int n) { @@ -1048,10 +1060,10 @@ // rbx: index // rdx: array index_check(rdx, rbx); // prefer index in rbx - __ movl(Address(rdx, rbx, - Address::times_4, - arrayOopDesc::base_offset_in_bytes(T_INT)), - rax); + __ access_store_at(T_INT, IN_HEAP | IN_HEAP_ARRAY, + Address(rdx, rbx, Address::times_4, + arrayOopDesc::base_offset_in_bytes(T_INT)), + rax, noreg, noreg); } void TemplateTable::lastore() { @@ -1062,8 +1074,10 @@ // rdx: high(value) index_check(rcx, rbx); // prefer index in rbx, // rbx,: index - __ movptr(Address(rcx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize), rax); - NOT_LP64(__ movl(Address(rcx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 1 * wordSize), rdx)); + __ access_store_at(T_LONG, IN_HEAP | IN_HEAP_ARRAY, + Address(rcx, rbx, Address::times_8, + arrayOopDesc::base_offset_in_bytes(T_LONG)), + noreg /* ltos */, noreg, noreg); } @@ -1074,7 +1088,10 @@ // rbx: index // rdx: array index_check(rdx, rbx); // prefer index in rbx - __ store_float(Address(rdx, rbx, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_FLOAT))); + __ access_store_at(T_FLOAT, IN_HEAP | IN_HEAP_ARRAY, + Address(rdx, rbx, Address::times_4, + arrayOopDesc::base_offset_in_bytes(T_FLOAT)), + noreg /* ftos */, noreg, noreg); } void TemplateTable::dastore() { @@ -1084,7 +1101,10 @@ // rbx: index // rdx: array index_check(rdx, rbx); // prefer index in rbx - __ store_double(Address(rdx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_DOUBLE))); + __ access_store_at(T_DOUBLE, IN_HEAP | IN_HEAP_ARRAY, + Address(rdx, rbx, Address::times_8, + arrayOopDesc::base_offset_in_bytes(T_DOUBLE)), + noreg /* dtos */, noreg, noreg); } void TemplateTable::aastore() { @@ -1157,10 +1177,10 @@ __ jccb(Assembler::zero, L_skip); __ andl(rax, 1); // if it is a T_BOOLEAN array, mask the stored value to 0/1 __ bind(L_skip); - __ movb(Address(rdx, rbx, - Address::times_1, - arrayOopDesc::base_offset_in_bytes(T_BYTE)), - rax); + __ access_store_at(T_BYTE, IN_HEAP | IN_HEAP_ARRAY, + Address(rdx, rbx,Address::times_1, + arrayOopDesc::base_offset_in_bytes(T_BYTE)), + rax, noreg, noreg); } void TemplateTable::castore() { @@ -1170,10 +1190,10 @@ // rbx: index // rdx: array index_check(rdx, rbx); // prefer index in rbx - __ movw(Address(rdx, rbx, - Address::times_2, - arrayOopDesc::base_offset_in_bytes(T_CHAR)), - rax); + __ access_store_at(T_CHAR, IN_HEAP | IN_HEAP_ARRAY, + Address(rdx, rbx, Address::times_2, + arrayOopDesc::base_offset_in_bytes(T_CHAR)), + rax, noreg, noreg); } @@ -2849,7 +2869,6 @@ if (!is_static) pop_and_check_object(obj); const Address field(obj, off, Address::times_1, 0*wordSize); - NOT_LP64(const Address hi(obj, off, Address::times_1, 1*wordSize)); Label Done, notByte, notBool, notInt, notShort, notChar, notLong, notFloat, notObj, notDouble; @@ -2861,7 +2880,7 @@ __ jcc(Assembler::notZero, notByte); // btos - __ load_signed_byte(rax, field); + __ access_load_at(T_BYTE, IN_HEAP, rax, field, noreg, noreg); __ push(btos); // Rewrite bytecode to be faster if (!is_static && rc == may_rewrite) { @@ -2874,7 +2893,7 @@ __ jcc(Assembler::notEqual, notBool); // ztos (same code as btos) - __ load_signed_byte(rax, field); + __ access_load_at(T_BOOLEAN, IN_HEAP, rax, field, noreg, noreg); __ push(ztos); // Rewrite bytecode to be faster if (!is_static && rc == may_rewrite) { @@ -2898,7 +2917,7 @@ __ cmpl(flags, itos); __ jcc(Assembler::notEqual, notInt); // itos - __ movl(rax, field); + __ access_load_at(T_INT, IN_HEAP, rax, field, noreg, noreg); __ push(itos); // Rewrite bytecode to be faster if (!is_static && rc == may_rewrite) { @@ -2910,7 +2929,7 @@ __ cmpl(flags, ctos); __ jcc(Assembler::notEqual, notChar); // ctos - __ load_unsigned_short(rax, field); + __ access_load_at(T_CHAR, IN_HEAP, rax, field, noreg, noreg); __ push(ctos); // Rewrite bytecode to be faster if (!is_static && rc == may_rewrite) { @@ -2922,7 +2941,7 @@ __ cmpl(flags, stos); __ jcc(Assembler::notEqual, notShort); // stos - __ load_signed_short(rax, field); + __ access_load_at(T_SHORT, IN_HEAP, rax, field, noreg, noreg); __ push(stos); // Rewrite bytecode to be faster if (!is_static && rc == may_rewrite) { @@ -2934,19 +2953,9 @@ __ cmpl(flags, ltos); __ jcc(Assembler::notEqual, notLong); // ltos - -#ifndef _LP64 - // Generate code as if volatile. There just aren't enough registers to - // save that information and this code is faster than the test. - __ fild_d(field); // Must load atomically - __ subptr(rsp,2*wordSize); // Make space for store - __ fistp_d(Address(rsp,0)); - __ pop(rax); - __ pop(rdx); -#else - __ movq(rax, field); -#endif - + // Generate code as if volatile (x86_32). There just aren't enough registers to + // save that information and this code is faster than the test. + __ access_load_at(T_LONG, IN_HEAP | MO_RELAXED, noreg /* ltos */, field, noreg, noreg); __ push(ltos); // Rewrite bytecode to be faster LP64_ONLY(if (!is_static && rc == may_rewrite) patch_bytecode(Bytecodes::_fast_lgetfield, bc, rbx)); @@ -2957,7 +2966,7 @@ __ jcc(Assembler::notEqual, notFloat); // ftos - __ load_float(field); + __ access_load_at(T_FLOAT, IN_HEAP, noreg /* ftos */, field, noreg, noreg); __ push(ftos); // Rewrite bytecode to be faster if (!is_static && rc == may_rewrite) { @@ -2971,7 +2980,7 @@ __ jcc(Assembler::notEqual, notDouble); #endif // dtos - __ load_double(field); + __ access_load_at(T_DOUBLE, IN_HEAP, noreg /* dtos */, field, noreg, noreg); __ push(dtos); // Rewrite bytecode to be faster if (!is_static && rc == may_rewrite) { @@ -3130,7 +3139,7 @@ { __ pop(btos); if (!is_static) pop_and_check_object(obj); - __ movb(field, rax); + __ access_store_at(T_BYTE, IN_HEAP, field, rax, noreg, noreg); if (!is_static && rc == may_rewrite) { patch_bytecode(Bytecodes::_fast_bputfield, bc, rbx, true, byte_no); } @@ -3145,8 +3154,7 @@ { __ pop(ztos); if (!is_static) pop_and_check_object(obj); - __ andl(rax, 0x1); - __ movb(field, rax); + __ access_store_at(T_BOOLEAN, IN_HEAP, field, rax, noreg, noreg); if (!is_static && rc == may_rewrite) { patch_bytecode(Bytecodes::_fast_zputfield, bc, rbx, true, byte_no); } @@ -3177,7 +3185,7 @@ { __ pop(itos); if (!is_static) pop_and_check_object(obj); - __ movl(field, rax); + __ access_store_at(T_INT, IN_HEAP, field, rax, noreg, noreg); if (!is_static && rc == may_rewrite) { patch_bytecode(Bytecodes::_fast_iputfield, bc, rbx, true, byte_no); } @@ -3192,7 +3200,7 @@ { __ pop(ctos); if (!is_static) pop_and_check_object(obj); - __ movw(field, rax); + __ access_store_at(T_CHAR, IN_HEAP, field, rax, noreg, noreg); if (!is_static && rc == may_rewrite) { patch_bytecode(Bytecodes::_fast_cputfield, bc, rbx, true, byte_no); } @@ -3207,7 +3215,7 @@ { __ pop(stos); if (!is_static) pop_and_check_object(obj); - __ movw(field, rax); + __ access_store_at(T_SHORT, IN_HEAP, field, rax, noreg, noreg); if (!is_static && rc == may_rewrite) { patch_bytecode(Bytecodes::_fast_sputfield, bc, rbx, true, byte_no); } @@ -3223,7 +3231,7 @@ { __ pop(ltos); if (!is_static) pop_and_check_object(obj); - __ movq(field, rax); + __ access_store_at(T_LONG, IN_HEAP, field, noreg /* ltos*/, noreg, noreg); if (!is_static && rc == may_rewrite) { patch_bytecode(Bytecodes::_fast_lputfield, bc, rbx, true, byte_no); } @@ -3239,11 +3247,7 @@ if (!is_static) pop_and_check_object(obj); // Replace with real volatile test - __ push(rdx); - __ push(rax); // Must update atomically with FIST - __ fild_d(Address(rsp,0)); // So load into FPU register - __ fistp_d(field); // and put into memory atomically - __ addptr(rsp, 2*wordSize); + __ access_store_at(T_LONG, IN_HEAP | MO_RELAXED, field, noreg /* ltos */, noreg, noreg); // volatile_barrier(); volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad | Assembler::StoreStore)); @@ -3254,8 +3258,7 @@ __ pop(ltos); // overwrites rdx if (!is_static) pop_and_check_object(obj); - __ movptr(hi, rdx); - __ movptr(field, rax); + __ access_store_at(T_LONG, IN_HEAP, field, noreg /* ltos */, noreg, noreg); // Don't rewrite to _fast_lputfield for potential volatile case. __ jmp(notVolatile); } @@ -3269,7 +3272,7 @@ { __ pop(ftos); if (!is_static) pop_and_check_object(obj); - __ store_float(field); + __ access_store_at(T_FLOAT, IN_HEAP, field, noreg /* ftos */, noreg, noreg); if (!is_static && rc == may_rewrite) { patch_bytecode(Bytecodes::_fast_fputfield, bc, rbx, true, byte_no); } @@ -3286,7 +3289,7 @@ { __ pop(dtos); if (!is_static) pop_and_check_object(obj); - __ store_double(field); + __ access_store_at(T_DOUBLE, IN_HEAP, field, noreg /* dtos */, noreg, noreg); if (!is_static && rc == may_rewrite) { patch_bytecode(Bytecodes::_fast_dputfield, bc, rbx, true, byte_no); } @@ -3419,30 +3422,31 @@ break; case Bytecodes::_fast_lputfield: #ifdef _LP64 - __ movq(field, rax); + __ access_store_at(T_LONG, IN_HEAP, field, noreg /* ltos */, noreg, noreg); #else __ stop("should not be rewritten"); #endif break; case Bytecodes::_fast_iputfield: - __ movl(field, rax); + __ access_store_at(T_INT, IN_HEAP, field, rax, noreg, noreg); break; case Bytecodes::_fast_zputfield: - __ andl(rax, 0x1); // boolean is true if LSB is 1 - // fall through to bputfield + __ access_store_at(T_BOOLEAN, IN_HEAP, field, rax, noreg, noreg); + break; case Bytecodes::_fast_bputfield: - __ movb(field, rax); + __ access_store_at(T_BYTE, IN_HEAP, field, rax, noreg, noreg); break; case Bytecodes::_fast_sputfield: - // fall through + __ access_store_at(T_SHORT, IN_HEAP, field, rax, noreg, noreg); + break; case Bytecodes::_fast_cputfield: - __ movw(field, rax); + __ access_store_at(T_CHAR, IN_HEAP, field, rax, noreg, noreg); break; case Bytecodes::_fast_fputfield: - __ store_float(field); + __ access_store_at(T_FLOAT, IN_HEAP, field, noreg /* ftos*/, noreg, noreg); break; case Bytecodes::_fast_dputfield: - __ store_double(field); + __ access_store_at(T_DOUBLE, IN_HEAP, field, noreg /* dtos*/, noreg, noreg); break; default: ShouldNotReachHere(); @@ -3509,28 +3513,28 @@ break; case Bytecodes::_fast_lgetfield: #ifdef _LP64 - __ movq(rax, field); + __ access_load_at(T_LONG, IN_HEAP, noreg /* ltos */, field, noreg, noreg); #else __ stop("should not be rewritten"); #endif break; case Bytecodes::_fast_igetfield: - __ movl(rax, field); + __ access_load_at(T_INT, IN_HEAP, rax, field, noreg, noreg); break; case Bytecodes::_fast_bgetfield: - __ movsbl(rax, field); + __ access_load_at(T_BYTE, IN_HEAP, rax, field, noreg, noreg); break; case Bytecodes::_fast_sgetfield: - __ load_signed_short(rax, field); + __ access_load_at(T_SHORT, IN_HEAP, rax, field, noreg, noreg); break; case Bytecodes::_fast_cgetfield: - __ load_unsigned_short(rax, field); + __ access_load_at(T_CHAR, IN_HEAP, rax, field, noreg, noreg); break; case Bytecodes::_fast_fgetfield: - __ load_float(field); + __ access_load_at(T_FLOAT, IN_HEAP, noreg /* ftos */, field, noreg, noreg); break; case Bytecodes::_fast_dgetfield: - __ load_double(field); + __ access_load_at(T_DOUBLE, IN_HEAP, noreg /* dtos */, field, noreg, noreg); break; default: ShouldNotReachHere(); @@ -3563,14 +3567,14 @@ const Address field = Address(rax, rbx, Address::times_1, 0*wordSize); switch (state) { case itos: - __ movl(rax, field); + __ access_load_at(T_INT, IN_HEAP, rax, field, noreg, noreg); break; case atos: do_oop_load(_masm, field, rax); __ verify_oop(rax); break; case ftos: - __ load_float(field); + __ access_load_at(T_FLOAT, IN_HEAP, noreg /* ftos */, field, noreg, noreg); break; default: ShouldNotReachHere();