// call (Thread*)TlsGetValue(thread_index()); void MacroAssembler::get_thread(Register thread) { if (thread != rax) { push(rax); } push(rdi); push(rsi); push(rdx); push(rcx); push(r8); push(r9); push(r10); // XXX mov(r10, rsp); andq(rsp, -16); push(r10); push(r11); movl(c_rarg0, ThreadLocalStorage::thread_index()); call(RuntimeAddress((address)TlsGetValue)); pop(r11); pop(rsp); pop(r10); pop(r9); pop(r8); pop(rcx); pop(rdx); pop(rsi); pop(rdi); if (thread != rax) { mov(thread, rax); pop(rax); } }
void MacroAssembler::get_thread(Register thread) { // call pthread_getspecific // void * pthread_getspecific(pthread_key_t key); if (thread != rax) { push(rax); } push(rdi); push(rsi); push(rdx); push(rcx); push(r8); push(r9); push(r10); // XXX mov(r10, rsp); andq(rsp, -16); push(r10); push(r11); movl(rdi, ThreadLocalStorage::thread_index()); call(RuntimeAddress(CAST_FROM_FN_PTR(address, pthread_getspecific))); pop(r11); pop(rsp); pop(r10); pop(r9); pop(r8); pop(rcx); pop(rdx); pop(rsi); pop(rdi); if (thread != rax) { mov(thread, rax); pop(rax); } }