34 #include "gc/shared/collectedHeap.hpp" |
34 #include "gc/shared/collectedHeap.hpp" |
35 #include "gc/shared/barrierSet.hpp" |
35 #include "gc/shared/barrierSet.hpp" |
36 #include "gc/shared/cardTableModRefBS.hpp" |
36 #include "gc/shared/cardTableModRefBS.hpp" |
37 #include "nativeInst_ppc.hpp" |
37 #include "nativeInst_ppc.hpp" |
38 #include "oops/objArrayKlass.hpp" |
38 #include "oops/objArrayKlass.hpp" |
|
39 #include "runtime/safepointMechanism.inline.hpp" |
39 #include "runtime/sharedRuntime.hpp" |
40 #include "runtime/sharedRuntime.hpp" |
40 |
41 |
41 #define __ _masm-> |
42 #define __ _masm-> |
42 |
43 |
43 |
44 |
1312 __ addi(R1_SP, R1_SP, frame_size); |
1313 __ addi(R1_SP, R1_SP, frame_size); |
1313 } else { |
1314 } else { |
1314 __ pop_frame(); |
1315 __ pop_frame(); |
1315 } |
1316 } |
1316 |
1317 |
1317 if (LoadPollAddressFromThread) { |
1318 if (SafepointMechanism::uses_thread_local_poll()) { |
1318 // TODO: PPC port __ ld(polling_page, in_bytes(JavaThread::poll_address_offset()), R16_thread); |
1319 __ ld(polling_page, in_bytes(Thread::polling_page_offset()), R16_thread); |
1319 Unimplemented(); |
1320 } else { |
1320 } else { |
1321 __ load_const_optimized(polling_page, (long)(address) os::get_polling_page(), R0); |
1321 __ load_const_optimized(polling_page, (long)(address) os::get_polling_page(), R0); // TODO: PPC port: get_standard_polling_page() |
|
1322 } |
1322 } |
1323 |
1323 |
1324 // Restore return pc relative to callers' sp. |
1324 // Restore return pc relative to callers' sp. |
1325 __ ld(return_pc, _abi(lr), R1_SP); |
1325 __ ld(return_pc, _abi(lr), R1_SP); |
1326 // Move return pc to LR. |
1326 // Move return pc to LR. |
1339 __ blr(); |
1339 __ blr(); |
1340 } |
1340 } |
1341 |
1341 |
1342 |
1342 |
1343 int LIR_Assembler::safepoint_poll(LIR_Opr tmp, CodeEmitInfo* info) { |
1343 int LIR_Assembler::safepoint_poll(LIR_Opr tmp, CodeEmitInfo* info) { |
1344 |
1344 const Register poll_addr = tmp->as_register(); |
1345 if (LoadPollAddressFromThread) { |
1345 if (SafepointMechanism::uses_thread_local_poll()) { |
1346 const Register poll_addr = tmp->as_register(); |
1346 __ ld(poll_addr, in_bytes(Thread::polling_page_offset()), R16_thread); |
1347 // TODO: PPC port __ ld(poll_addr, in_bytes(JavaThread::poll_address_offset()), R16_thread); |
1347 } else { |
1348 Unimplemented(); |
1348 __ load_const_optimized(poll_addr, (intptr_t)os::get_polling_page(), R0); |
1349 __ relocate(relocInfo::poll_type); // XXX |
1349 } |
1350 guarantee(info != NULL, "Shouldn't be NULL"); |
|
1351 int offset = __ offset(); |
|
1352 add_debug_info_for_branch(info); |
|
1353 __ load_from_polling_page(poll_addr); |
|
1354 return offset; |
|
1355 } |
|
1356 |
|
1357 __ load_const_optimized(tmp->as_register(), (intptr_t)os::get_polling_page(), R0); // TODO: PPC port: get_standard_polling_page() |
|
1358 if (info != NULL) { |
1350 if (info != NULL) { |
1359 add_debug_info_for_branch(info); |
1351 add_debug_info_for_branch(info); |
1360 } |
1352 } |
1361 int offset = __ offset(); |
1353 int offset = __ offset(); |
1362 __ relocate(relocInfo::poll_type); |
1354 __ relocate(relocInfo::poll_type); |
1363 __ load_from_polling_page(tmp->as_register()); |
1355 __ load_from_polling_page(poll_addr); |
1364 |
1356 |
1365 return offset; |
1357 return offset; |
1366 } |
1358 } |
1367 |
1359 |
1368 |
1360 |