267268269270271272273274275276277
case SCHAR: case SSHORT: case SINT: case SLONG: // sign extend eax to edx:eax a.mov(edx, eax); a.sar(edx, imm(31)); break; case UCHAR: case USHORT:
276277278279280281282283284285286
case UCHAR: case USHORT: case UINT: case ULONG: case ADDRESS: a.mov(edx, imm(0)); break; } } // Restore esp to the original position and return
169170171172173174175176177178179
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;
173174175176177178179180181182183
// 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) {
208209210211212213214215216217218
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;
212213214215216217218219220221222
// 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
237238239240241242243244245246247
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) {
258259260261262263264265266267268
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));
292293294295296297298299300301302
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;
304305306307308309310311312313314
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