63
64 pushl(0); // allocate space for return value
65 if (thread != rax) pushl(rax); // save rax, if caller still wants it
66 pushl(rcx); // save caller save
67 pushl(rdx); // save caller save
68 if (thread != rax) {
69 leal(thread, Address(rsp, 3 * sizeof(int))); // address of return value
70 } else {
71 leal(thread, Address(rsp, 2 * sizeof(int))); // address of return value
72 }
73 pushl(thread); // and pass the address
74 pushl(ThreadLocalStorage::thread_index()); // the key
75 call(RuntimeAddress(CAST_FROM_FN_PTR(address, thr_getspecific)));
76 increment(rsp, 2 * wordSize);
77 popl(rdx);
78 popl(rcx);
79 if (thread != rax) popl(rax);
80 popl(thread);
81 }
82
83 bool MacroAssembler::needs_explicit_null_check(int offset) {
84 // Identical to Sparc/Solaris code
85 bool offset_in_first_page = 0 <= offset && offset < os::vm_page_size();
86 return !offset_in_first_page;
87 }
|
63
64 pushl(0); // allocate space for return value
65 if (thread != rax) pushl(rax); // save rax, if caller still wants it
66 pushl(rcx); // save caller save
67 pushl(rdx); // save caller save
68 if (thread != rax) {
69 leal(thread, Address(rsp, 3 * sizeof(int))); // address of return value
70 } else {
71 leal(thread, Address(rsp, 2 * sizeof(int))); // address of return value
72 }
73 pushl(thread); // and pass the address
74 pushl(ThreadLocalStorage::thread_index()); // the key
75 call(RuntimeAddress(CAST_FROM_FN_PTR(address, thr_getspecific)));
76 increment(rsp, 2 * wordSize);
77 popl(rdx);
78 popl(rcx);
79 if (thread != rax) popl(rax);
80 popl(thread);
81 }
82
83 bool MacroAssembler::needs_explicit_null_check(intptr_t offset) {
84 // Identical to Sparc/Solaris code
85 bool offset_in_first_page = 0 <= offset && offset < os::vm_page_size();
86 return !offset_in_first_page;
87 }
|