< prev index next >
src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
Print this page
*** 39,48 ****
--- 39,49 ----
#include "opto/node.hpp"
#include "runtime/biasedLocking.hpp"
#include "runtime/icache.hpp"
#include "runtime/interfaceSupport.hpp"
#include "runtime/sharedRuntime.hpp"
+ #include "runtime/thread.hpp"
#if INCLUDE_ALL_GCS
#include "gc/g1/g1CollectedHeap.inline.hpp"
#include "gc/g1/g1SATBCardTableModRefBS.hpp"
#include "gc/g1/heapRegion.hpp"
*** 4647,4651 ****
--- 4648,4673 ----
br(GT, NEXT_1);
BIND(DONE);
sub(result, result, len); // Return index where we stopped
}
+
+ // get_thread can be called anywhere inside generated code so we need
+ // to save whatever non-callee save context might get clobbered by the
+ // call to Thread::current or, indeed, the call setup code.
+ // x86 appears to save C arg registers.
+
+ void MacroAssembler::get_thread(Register dst) {
+
+ // Save all call-clobbered regs except dst, plus r19 and r20.
+ RegSet saved_regs = RegSet::range(r0, r20) + lr - dst;
+ push(saved_regs, sp);
+
+ // FIX-ME: implement
+ // return Thread::current()
+
+ if (dst != c_rarg0) {
+ mov(dst, c_rarg0);
+ }
+ // restore pushed registers
+ pop(saved_regs, sp);
+ }
< prev index next >