69 pushq(r11);
70
71 movl(rdi, ThreadLocalStorage::thread_index());
72 call(RuntimeAddress(CAST_FROM_FN_PTR(address, thr_getspecific)));
73
74 popq(r11);
75 popq(rsp);
76 popq(r10);
77 popq(r9);
78 popq(r8);
79 popq(rcx);
80 popq(rdx);
81 popq(rsi);
82 popq(rdi);
83 popq(thread); // load return value
84 if (thread != rax) {
85 popq(rax);
86 }
87 }
88
89 bool MacroAssembler::needs_explicit_null_check(int offset) {
90 // Identical to Sparc/Solaris code
91 bool offset_in_first_page = 0 <= offset && offset < os::vm_page_size();
92 return !offset_in_first_page;
93 }
|
69 pushq(r11);
70
71 movl(rdi, ThreadLocalStorage::thread_index());
72 call(RuntimeAddress(CAST_FROM_FN_PTR(address, thr_getspecific)));
73
74 popq(r11);
75 popq(rsp);
76 popq(r10);
77 popq(r9);
78 popq(r8);
79 popq(rcx);
80 popq(rdx);
81 popq(rsi);
82 popq(rdi);
83 popq(thread); // load return value
84 if (thread != rax) {
85 popq(rax);
86 }
87 }
88
89 bool MacroAssembler::needs_explicit_null_check(intptr_t offset) {
90 // Identical to Sparc/Solaris code
91 if (UseCompressedOops) {
92 uintptr_t heap_base = (uintptr_t)Universe::heap_base();
93 if ((uintptr_t)offset >= heap_base) {
94 offset = (intptr_t)(pointer_delta((void*)offset, (void*)heap_base, 1));
95 }
96 }
97 bool offset_in_first_page = 0 <= offset && offset < os::vm_page_size();
98 return !offset_in_first_page;
99 }
|