Mercurial > hg > truffle
comparison src/cpu/x86/vm/sharedRuntime_x86_64.cpp @ 17780:606acabe7b5c
8031320: Use Intel RTM instructions for locks
Summary: Use RTM for inflated locks and stack locks.
Reviewed-by: iveresov, twisti, roland, dcubed
author | kvn |
---|---|
date | Thu, 20 Mar 2014 17:49:27 -0700 |
parents | 55fb97c4c58d |
children | 62c54fcc0a35 |
comparison
equal
deleted
inserted
replaced
17778:a48e16541e6b | 17780:606acabe7b5c |
---|---|
2008 __ subptr(rsp, stack_size - 2*wordSize); | 2008 __ subptr(rsp, stack_size - 2*wordSize); |
2009 | 2009 |
2010 // Frame is now completed as far as size and linkage. | 2010 // Frame is now completed as far as size and linkage. |
2011 int frame_complete = ((intptr_t)__ pc()) - start; | 2011 int frame_complete = ((intptr_t)__ pc()) - start; |
2012 | 2012 |
2013 if (UseRTMLocking) { | |
2014 // Abort RTM transaction before calling JNI | |
2015 // because critical section will be large and will be | |
2016 // aborted anyway. Also nmethod could be deoptimized. | |
2017 __ xabort(0); | |
2018 } | |
2019 | |
2013 #ifdef ASSERT | 2020 #ifdef ASSERT |
2014 { | 2021 { |
2015 Label L; | 2022 Label L; |
2016 __ mov(rax, rsp); | 2023 __ mov(rax, rsp); |
2017 __ andptr(rax, -16); // must be 16 byte boundary (see amd64 ABI) | 2024 __ andptr(rax, -16); // must be 16 byte boundary (see amd64 ABI) |
3608 | 3615 |
3609 assert(SimpleRuntimeFrame::framesize % 4 == 0, "sp not 16-byte aligned"); | 3616 assert(SimpleRuntimeFrame::framesize % 4 == 0, "sp not 16-byte aligned"); |
3610 | 3617 |
3611 address start = __ pc(); | 3618 address start = __ pc(); |
3612 | 3619 |
3620 if (UseRTMLocking) { | |
3621 // Abort RTM transaction before possible nmethod deoptimization. | |
3622 __ xabort(0); | |
3623 } | |
3624 | |
3613 // Push self-frame. We get here with a return address on the | 3625 // Push self-frame. We get here with a return address on the |
3614 // stack, so rsp is 8-byte aligned until we allocate our frame. | 3626 // stack, so rsp is 8-byte aligned until we allocate our frame. |
3615 __ subptr(rsp, SimpleRuntimeFrame::return_off << LogBytesPerInt); // Epilog! | 3627 __ subptr(rsp, SimpleRuntimeFrame::return_off << LogBytesPerInt); // Epilog! |
3616 | 3628 |
3617 // No callee saved registers. rbp is assumed implicitly saved | 3629 // No callee saved registers. rbp is assumed implicitly saved |
3787 address start = __ pc(); | 3799 address start = __ pc(); |
3788 address call_pc = NULL; | 3800 address call_pc = NULL; |
3789 int frame_size_in_words; | 3801 int frame_size_in_words; |
3790 bool cause_return = (poll_type == POLL_AT_RETURN); | 3802 bool cause_return = (poll_type == POLL_AT_RETURN); |
3791 bool save_vectors = (poll_type == POLL_AT_VECTOR_LOOP); | 3803 bool save_vectors = (poll_type == POLL_AT_VECTOR_LOOP); |
3804 | |
3805 if (UseRTMLocking) { | |
3806 // Abort RTM transaction before calling runtime | |
3807 // because critical section will be large and will be | |
3808 // aborted anyway. Also nmethod could be deoptimized. | |
3809 __ xabort(0); | |
3810 } | |
3792 | 3811 |
3793 // Make room for return address (or push it again) | 3812 // Make room for return address (or push it again) |
3794 if (!cause_return) { | 3813 if (!cause_return) { |
3795 __ push(rbx); | 3814 __ push(rbx); |
3796 } | 3815 } |