# HG changeset patch # User apetrusenko # Date 1264128670 28800 # Node ID 776fb94f33cca38383bc5aca46ff9edd9afa3858 # Parent fed17682aea53cee71ec0beb693b925cf8ca10a3 6918006: G1: spill space must be reserved on the stack for barrier calls on Windows x64 Summary: Stub code generated to call G1 barriers does not allocate spill space on the stack as required by Windows x64 ABI. The fix is to use more ABI-friendly call_VM_leaf(). Reviewed-by: iveresov, never, kvn diff -r fed17682aea5 -r 776fb94f33cc src/cpu/x86/vm/stubGenerator_x86_32.cpp --- a/src/cpu/x86/vm/stubGenerator_x86_32.cpp Thu Jan 21 14:47:01 2010 -0800 +++ b/src/cpu/x86/vm/stubGenerator_x86_32.cpp Thu Jan 21 18:51:10 2010 -0800 @@ -718,10 +718,8 @@ case BarrierSet::G1SATBCTLogging: { __ pusha(); // push registers - __ push(count); - __ push(start); - __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre))); - __ addptr(rsp, 2*wordSize); + __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre), + start, count); __ popa(); } break; @@ -752,10 +750,8 @@ case BarrierSet::G1SATBCTLogging: { __ pusha(); // push registers - __ push(count); - __ push(start); - __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post))); - __ addptr(rsp, 2*wordSize); + __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post), + start, count); __ popa(); } break; diff -r fed17682aea5 -r 776fb94f33cc src/cpu/x86/vm/stubGenerator_x86_64.cpp --- a/src/cpu/x86/vm/stubGenerator_x86_64.cpp Thu Jan 21 14:47:01 2010 -0800 +++ b/src/cpu/x86/vm/stubGenerator_x86_64.cpp Thu Jan 21 18:51:10 2010 -0800 @@ -1172,7 +1172,7 @@ __ movptr(c_rarg0, addr); __ movptr(c_rarg1, count); } - __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre))); + __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre), 2); __ popa(); } break; @@ -1212,7 +1212,7 @@ __ shrptr(scratch, LogBytesPerHeapOop); // convert to element count __ mov(c_rarg0, start); __ mov(c_rarg1, scratch); - __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post))); + __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post), 2); __ popa(); } break;