216217218219220221222223224225226
// mov with a 32bit dst reg zero extends to 64bit a.mov(dstRegisters32[i], dword_ptr(rsp, disp)); break; default: a.mov(dstRegisters64[i], qword_ptr(rsp, disp)); break; } } // All the integer registers are loaded; there nothing to do for the floating
241242243244245246247248249250251
int space = resultClass == float.class || resultClass == double.class ? 24 : 8; a.sub(rsp, imm(space)); // Clear %rax, since it is used by varargs functions to determine the number of float registers to be saved a.mov(rax, imm(0)); // Call to the actual native function a.call(imm(function.getFunctionAddress())); if (saveErrno) {
262263264265266267268269270271272
case DOUBLE: a.movsd(qword_ptr(rsp, 0), xmm0); break; default: a.mov(qword_ptr(rsp, 0), rax); } // Save the errno in a thread-local variable a.call(imm(errnoFunctionAddress));
296297298299300301302303304305306
a.movsxd(rax, dword_ptr(rsp, 0)); break; case UINT: // storing a value in eax zeroes out the upper 32 bits of rax a.mov(eax, dword_ptr(rsp, 0)); break; case FLOAT: a.movss(xmm0, dword_ptr(rsp, 0)); break;
308309310311312313314315316317318
case DOUBLE: a.movsd(xmm0, qword_ptr(rsp, 0)); break; default: a.mov(rax, qword_ptr(rsp, 0)); break; } } else { // sign/zero extend the result
336337338339340341342343344345346
case SINT: if (long.class == resultClass) a.movsxd(rax, eax); break; case UINT: if (long.class == resultClass) a.mov(eax, eax); break; } } // Restore rsp to original position