172173174175176177178179180181182
a.movsxd(dstRegisters64[i], srcRegisters32[i]); break; case UINT: // mov with a 32bit dst reg zero extends to 64bit a.mov(dstRegisters32[i], srcRegisters32[i]); break; default: a.mov(dstRegisters64[i], srcRegisters64[i]); break;
176177178179180181182183184185186
// mov with a 32bit dst reg zero extends to 64bit a.mov(dstRegisters32[i], srcRegisters32[i]); break; default: a.mov(dstRegisters64[i], srcRegisters64[i]); break; } } if (iCount > 6) {
211212213214215216217218219220221
a.movsxd(dstRegisters64[i], dword_ptr(rsp, disp)); break; case UINT: // 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;
215216217218219220221222223224225
// 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
240241242243244245246247248249250
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) {
261262263264265266267268269270271
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));
295296297298299300301302303304305
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;
307308309310311312313314315316317
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
335336337338339340341342343344345
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
142143144145146147148149150151152
case USHORT: a.movzx(eax, ptr(esp, disp, parameterTypes[i].nativeType)); break; default: a.mov(eax, dword_ptr(esp, disp)); break; } a.mov(dword_ptr(esp, dstoff), eax); if (dstParameterSize > 4) {