virtual void compile(X86Compiler& c) { c.newFunc(kX86FuncConvDefault, FuncBuilder1<int, int>()); c.getFunc()->setHint(kFuncHintNaked, true); // Call a function. GpVar address(c.newGpVar()); GpVar var(c.getGpArg(0)); c.mov(address, imm((sysint_t)(void*)calledFunc)); X86CompilerFuncCall* ctx; ctx = c.call(address); ctx->setPrototype(kX86FuncConvCompatFastCall, FuncBuilder1<int, int>()); ctx->setArgument(0, var); ctx->setReturn(var); ctx = c.call(address); ctx->setPrototype(kX86FuncConvCompatFastCall, FuncBuilder1<int, int>()); ctx->setArgument(0, var); ctx->setReturn(var); c.ret(var); c.endFunc(); }
virtual void compile(X86Compiler& c) { c.newFunc(kX86FuncConvCompatFastCall, FuncBuilder1<int, int*>()); c.getFunc()->setHint(kFuncHintNaked, true); GpVar buf(c.getGpArg(0)); GpVar acc0(c.newGpVar(kX86VarTypeGpd)); GpVar acc1(c.newGpVar(kX86VarTypeGpd)); c.mov(acc0, 0); c.mov(acc1, 0); uint i; for (i = 0; i < 4; i++) { { GpVar ret = c.newGpVar(kX86VarTypeGpd); GpVar ptr = c.newGpVar(kX86VarTypeGpz); GpVar idx = c.newGpVar(kX86VarTypeGpd); c.mov(ptr, buf); c.mov(idx, imm(i)); X86CompilerFuncCall* fCall = c.call((void*)calledFunc); fCall->setPrototype(kX86FuncConvCompatFastCall, FuncBuilder2<int, int*, int>()); fCall->setArgument(0, ptr); fCall->setArgument(1, idx); fCall->setReturn(ret); c.add(acc0, ret); } { GpVar ret = c.newGpVar(kX86VarTypeGpd); GpVar ptr = c.newGpVar(kX86VarTypeGpz); GpVar idx = c.newGpVar(kX86VarTypeGpd); c.mov(ptr, buf); c.mov(idx, imm(i)); X86CompilerFuncCall* fCall = c.call((void*)calledFunc); fCall->setPrototype(kX86FuncConvCompatFastCall, FuncBuilder2<int, int*, int>()); fCall->setArgument(0, ptr); fCall->setArgument(1, idx); fCall->setReturn(ret); c.sub(acc1, ret); } } GpVar ret(c.newGpVar()); c.mov(ret, acc0); c.add(ret, acc1); c.ret(ret); c.endFunc(); }
void CompiledExpression::generateSingleArgCall(X86Compiler& c, X86XmmVar& dest, X86XmmVar& arg, double (*function)(double)) { X86GpVar fn(c, kVarTypeIntPtr); c.mov(fn, imm_ptr((void*) function)); X86CallNode* call = c.call(fn, kFuncConvHost, FuncBuilder1<double, double>()); call->setArg(0, arg); call->setRet(0, dest); }
virtual void compile(X86Compiler& c) { Label skip(c.newLabel()); X86CompilerFuncDecl* func = c.newFunc(kX86FuncConvDefault, FuncBuilder1<int, int>()); func->setHint(kFuncHintNaked, true); GpVar var(c.getGpArg(0)); c.cmp(var, imm(1)); c.jle(skip); GpVar tmp(c.newGpVar(kX86VarTypeInt32)); c.mov(tmp, var); c.dec(tmp); X86CompilerFuncCall* fCall = c.call(func->getEntryLabel()); fCall->setPrototype(kX86FuncConvDefault, FuncBuilder1<int, int>()); fCall->setArgument(0, tmp); fCall->setReturn(tmp); c.mul(c.newGpVar(kX86VarTypeInt32), var, tmp); c.bind(skip); c.ret(var); c.endFunc(); }
virtual void compile(X86Compiler& c) { c.newFunc(kX86FuncConvDefault, FuncBuilder3<int, int, int, int>()); GpVar v0(c.getGpArg(0)); GpVar v1(c.getGpArg(1)); GpVar v2(c.getGpArg(2)); // Just do something;) c.shl(v0, imm(1)); c.shl(v1, imm(1)); c.shl(v2, imm(1)); // Call function. GpVar address(c.newGpVar()); c.mov(address, imm((sysint_t)(void*)calledFunc)); X86CompilerFuncCall* fCall = c.call(address); fCall->setPrototype(kX86FuncConvDefault, FuncBuilder3<Void, int, int, int>()); fCall->setArgument(0, v2); fCall->setArgument(1, v1); fCall->setArgument(2, v0); // TODO: FuncCall return value. // fCall->setReturn(v0); // c.ret(v0); c.endFunc(); }
virtual void compile(X86Compiler& c) { c.newFunc(kX86FuncConvDefault, FuncBuilder3<int, int, int, int>()); GpVar x(c.getGpArg(0)); GpVar y(c.getGpArg(1)); GpVar op(c.getGpArg(2)); GpVar result; X86CompilerFuncCall* fCall; Label opAdd(c.newLabel()); Label opMul(c.newLabel()); c.cmp(op, 0); c.jz(opAdd); c.cmp(op, 1); c.jz(opMul); result = c.newGpVar(); c.mov(result, imm(0)); c.ret(result); c.bind(opAdd); result = c.newGpVar(); fCall = c.call((void*)calledFuncAdd); fCall->setPrototype(kX86FuncConvDefault, FuncBuilder2<int, int, int>()); fCall->setArgument(0, x); fCall->setArgument(1, y); fCall->setReturn(result); c.ret(result); c.bind(opMul); result = c.newGpVar(); fCall = c.call((void*)calledFuncMul); fCall->setPrototype(kX86FuncConvDefault, FuncBuilder2<int, int, int>()); fCall->setArgument(0, x); fCall->setArgument(1, y); fCall->setReturn(result); c.ret(result); c.endFunc(); }