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 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(); }
virtual void compile(X86Compiler& c) { c.newFunc(kX86FuncConvDefault, FuncBuilder3<Void, int, int, char*>()); c.getFunc()->setHint(kFuncHintNaked, true); GpVar src0(c.getGpArg(0)); GpVar src1(c.getGpArg(1)); GpVar dst0(c.getGpArg(2)); c.cmp(src0, src1); c.setz(byte_ptr(dst0)); c.endFunc(); }