diff -r 844bf1deff1a -r 8dc742d9bbab src/hotspot/cpu/x86/interp_masm_x86.cpp --- a/src/hotspot/cpu/x86/interp_masm_x86.cpp Tue Feb 20 07:46:40 2018 -0500 +++ b/src/hotspot/cpu/x86/interp_masm_x86.cpp Tue Feb 20 16:10:21 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -830,13 +830,12 @@ if (verifyoop) { verify_oop(rax, state); } + + address* const safepoint_table = Interpreter::safept_table(state); #ifdef _LP64 - Label no_safepoint, dispatch; - address* const safepoint_table = Interpreter::safept_table(state); if (SafepointMechanism::uses_thread_local_poll() && table != safepoint_table && generate_poll) { NOT_PRODUCT(block_comment("Thread-local Safepoint poll")); - testb(Address(r15_thread, Thread::polling_page_offset()), SafepointMechanism::poll_bit()); jccb(Assembler::zero, no_safepoint); @@ -851,9 +850,23 @@ #else Address index(noreg, rbx, Address::times_ptr); - ExternalAddress tbl((address)table); - ArrayAddress dispatch(tbl, index); - jump(dispatch); + if (SafepointMechanism::uses_thread_local_poll() && table != safepoint_table && generate_poll) { + NOT_PRODUCT(block_comment("Thread-local Safepoint poll")); + Label no_safepoint; + const Register thread = rcx; + get_thread(thread); + testb(Address(thread, Thread::polling_page_offset()), SafepointMechanism::poll_bit()); + + jccb(Assembler::zero, no_safepoint); + ArrayAddress dispatch_addr(ExternalAddress((address)safepoint_table), index); + jump(dispatch_addr); + bind(no_safepoint); + } + + { + ArrayAddress dispatch_addr(ExternalAddress((address)table), index); + jump(dispatch_addr); + } #endif // _LP64 }