# HG changeset patch # User iveresov # Date 1275022915 25200 # Node ID 87fc6aca31abdfd9a025e95e5653f3b34013fec0 # Parent 2d127394260e3fce257cc27578cebff8cac75e3a 6955349: C1: Make G1 barriers work with x64 Summary: This fixes G1 barriers in c1 on x64. Reviewed-by: never diff -r 2d127394260e -r 87fc6aca31ab src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp --- a/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Thu May 27 18:01:56 2010 -0700 +++ b/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Thu May 27 22:01:55 2010 -0700 @@ -221,7 +221,7 @@ if (needs_card_mark) { LIR_Opr ptr = new_pointer_register(); __ add(base_opr, LIR_OprFact::intptrConst(offset), ptr); - return new LIR_Address(ptr, 0, type); + return new LIR_Address(ptr, type); } else { return new LIR_Address(base_opr, offset, type); } @@ -231,7 +231,7 @@ void LIRGenerator::increment_counter(address counter, int step) { LIR_Opr pointer = new_pointer_register(); __ move(LIR_OprFact::intptrConst(counter), pointer); - LIR_Address* addr = new LIR_Address(pointer, 0, T_INT); + LIR_Address* addr = new LIR_Address(pointer, T_INT); increment_counter(addr, step); } @@ -1159,7 +1159,7 @@ if (type == T_ARRAY || type == T_OBJECT) { LIR_Opr tmp = new_pointer_register(); __ add(base_op, index_op, tmp); - addr = new LIR_Address(tmp, 0, type); + addr = new LIR_Address(tmp, type); } else { addr = new LIR_Address(base_op, index_op, type); } diff -r 2d127394260e -r 87fc6aca31ab src/cpu/x86/vm/c1_LIRAssembler_x86.cpp --- a/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Thu May 27 18:01:56 2010 -0700 +++ b/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Thu May 27 22:01:55 2010 -0700 @@ -2462,9 +2462,18 @@ } #endif // _LP64 } else { +#ifdef _LP64 + Register r_lo; + if (right->type() == T_OBJECT || right->type() == T_ARRAY) { + r_lo = right->as_register(); + } else { + r_lo = right->as_register_lo(); + } +#else Register r_lo = right->as_register_lo(); Register r_hi = right->as_register_hi(); assert(l_lo != r_hi, "overwriting registers"); +#endif switch (code) { case lir_logic_and: __ andptr(l_lo, r_lo); diff -r 2d127394260e -r 87fc6aca31ab src/cpu/x86/vm/c1_LIRGenerator_x86.cpp --- a/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Thu May 27 18:01:56 2010 -0700 +++ b/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Thu May 27 22:01:55 2010 -0700 @@ -175,7 +175,7 @@ // store and again for the card mark. LIR_Opr tmp = new_pointer_register(); __ leal(LIR_OprFact::address(addr), tmp); - return new LIR_Address(tmp, 0, type); + return new LIR_Address(tmp, type); } else { return addr; } @@ -185,7 +185,7 @@ void LIRGenerator::increment_counter(address counter, int step) { LIR_Opr pointer = new_pointer_register(); __ move(LIR_OprFact::intptrConst(counter), pointer); - LIR_Address* addr = new LIR_Address(pointer, 0, T_INT); + LIR_Address* addr = new LIR_Address(pointer, T_INT); increment_counter(addr, step); } diff -r 2d127394260e -r 87fc6aca31ab src/cpu/x86/vm/c1_Runtime1_x86.cpp --- a/src/cpu/x86/vm/c1_Runtime1_x86.cpp Thu May 27 18:01:56 2010 -0700 +++ b/src/cpu/x86/vm/c1_Runtime1_x86.cpp Thu May 27 22:01:55 2010 -0700 @@ -1581,7 +1581,6 @@ __ should_not_reach_here(); break; } - __ push(rax); __ push(rdx); @@ -1605,8 +1604,8 @@ // Can we store original value in the thread's buffer? - LP64_ONLY(__ movslq(tmp, queue_index);) #ifdef _LP64 + __ movslq(tmp, queue_index); __ cmpq(tmp, 0); #else __ cmpl(queue_index, 0); @@ -1628,13 +1627,33 @@ __ jmp(done); __ bind(runtime); + __ push(rcx); +#ifdef _LP64 + __ push(r8); + __ push(r9); + __ push(r10); + __ push(r11); +# ifndef _WIN64 + __ push(rdi); + __ push(rsi); +# endif +#endif // load the pre-value - __ push(rcx); f.load_argument(0, rcx); __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), rcx, thread); +#ifdef _LP64 +# ifndef _WIN64 + __ pop(rsi); + __ pop(rdi); +# endif + __ pop(r11); + __ pop(r10); + __ pop(r9); + __ pop(r8); +#endif __ pop(rcx); + __ bind(done); - __ bind(done); __ pop(rdx); __ pop(rax); } @@ -1664,13 +1683,13 @@ PtrQueue::byte_offset_of_buf())); __ push(rax); - __ push(rdx); + __ push(rcx); NOT_LP64(__ get_thread(thread);) ExternalAddress cardtable((address)ct->byte_map_base); assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); - const Register card_addr = rdx; + const Register card_addr = rcx; #ifdef _LP64 const Register tmp = rscratch1; f.load_argument(0, card_addr); @@ -1679,7 +1698,7 @@ // get the address of the card __ addq(card_addr, tmp); #else - const Register card_index = rdx; + const Register card_index = rcx; f.load_argument(0, card_index); __ shrl(card_index, CardTableModRefBS::card_shift); @@ -1716,12 +1735,32 @@ __ jmp(done); __ bind(runtime); - NOT_LP64(__ push(rcx);) + __ push(rdx); +#ifdef _LP64 + __ push(r8); + __ push(r9); + __ push(r10); + __ push(r11); +# ifndef _WIN64 + __ push(rdi); + __ push(rsi); +# endif +#endif __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), card_addr, thread); - NOT_LP64(__ pop(rcx);) +#ifdef _LP64 +# ifndef _WIN64 + __ pop(rsi); + __ pop(rdi); +# endif + __ pop(r11); + __ pop(r10); + __ pop(r9); + __ pop(r8); +#endif + __ pop(rdx); + __ bind(done); - __ bind(done); - __ pop(rdx); + __ pop(rcx); __ pop(rax); } diff -r 2d127394260e -r 87fc6aca31ab src/share/vm/c1/c1_LIR.hpp --- a/src/share/vm/c1/c1_LIR.hpp Thu May 27 18:01:56 2010 -0700 +++ b/src/share/vm/c1/c1_LIR.hpp Thu May 27 22:01:55 2010 -0700 @@ -505,15 +505,22 @@ , _type(type) , _disp(0) { verify(); } - LIR_Address(LIR_Opr base, int disp, BasicType type): + LIR_Address(LIR_Opr base, intx disp, BasicType type): _base(base) , _index(LIR_OprDesc::illegalOpr()) , _scale(times_1) , _type(type) , _disp(disp) { verify(); } + LIR_Address(LIR_Opr base, BasicType type): + _base(base) + , _index(LIR_OprDesc::illegalOpr()) + , _scale(times_1) + , _type(type) + , _disp(0) { verify(); } + #ifdef X86 - LIR_Address(LIR_Opr base, LIR_Opr index, Scale scale, int disp, BasicType type): + LIR_Address(LIR_Opr base, LIR_Opr index, Scale scale, intx disp, BasicType type): _base(base) , _index(index) , _scale(scale) diff -r 2d127394260e -r 87fc6aca31ab src/share/vm/c1/c1_LIRGenerator.cpp --- a/src/share/vm/c1/c1_LIRGenerator.cpp Thu May 27 18:01:56 2010 -0700 +++ b/src/share/vm/c1/c1_LIRGenerator.cpp Thu May 27 22:01:55 2010 -0700 @@ -1309,7 +1309,7 @@ __ cmp(lir_cond_notEqual, flag_val, LIR_OprFact::intConst(0)); if (!addr_opr->is_address()) { assert(addr_opr->is_register(), "must be"); - addr_opr = LIR_OprFact::address(new LIR_Address(addr_opr, 0, T_OBJECT)); + addr_opr = LIR_OprFact::address(new LIR_Address(addr_opr, T_OBJECT)); } CodeStub* slow = new G1PreBarrierStub(addr_opr, pre_val, pre_val_patch_code, info); @@ -1325,7 +1325,7 @@ new_val->as_constant_ptr()->as_jobject() == NULL) return; if (!new_val->is_register()) { - LIR_Opr new_val_reg = new_pointer_register(); + LIR_Opr new_val_reg = new_register(T_OBJECT); if (new_val->is_constant()) { __ move(new_val, new_val_reg); } else { @@ -1337,7 +1337,7 @@ if (addr->is_address()) { LIR_Address* address = addr->as_address_ptr(); - LIR_Opr ptr = new_pointer_register(); + LIR_Opr ptr = new_register(T_OBJECT); if (!address->index()->is_valid() && address->disp() == 0) { __ move(address->base(), ptr); } else { @@ -1350,7 +1350,6 @@ LIR_Opr xor_res = new_pointer_register(); LIR_Opr xor_shift_res = new_pointer_register(); - if (TwoOperandLIRForm ) { __ move(addr, xor_res); __ logical_xor(xor_res, new_val, xor_res); @@ -1368,7 +1367,7 @@ } if (!new_val->is_register()) { - LIR_Opr new_val_reg = new_pointer_register(); + LIR_Opr new_val_reg = new_register(T_OBJECT); __ leal(new_val, new_val_reg); new_val = new_val_reg; } @@ -1377,7 +1376,7 @@ __ cmp(lir_cond_notEqual, xor_shift_res, LIR_OprFact::intptrConst(NULL_WORD)); CodeStub* slow = new G1PostBarrierStub(addr, new_val); - __ branch(lir_cond_notEqual, T_INT, slow); + __ branch(lir_cond_notEqual, LP64_ONLY(T_LONG) NOT_LP64(T_INT), slow); __ branch_destination(slow->continuation()); }