virtual void compile(X86Compiler& c) { c.newFunc(kX86FuncConvDefault, FuncBuilder0<int>()); GpVar v0(c.newGpVar(kX86VarTypeGpd)); GpVar v1(c.newGpVar(kX86VarTypeGpd)); GpVar v2(c.newGpVar(kX86VarTypeGpd)); GpVar v3(c.newGpVar(kX86VarTypeGpd)); GpVar v4(c.newGpVar(kX86VarTypeGpd)); c.xor_(v0, v0); c.mov(v1, 1); c.mov(v2, 2); c.mov(v3, 3); c.mov(v4, 4); c.add(v0, v1); c.add(v0, v2); c.add(v0, v3); c.add(v0, v4); c.ret(v0); c.endFunc(); }
virtual void compile(X86Compiler& c) { c.newFunc(kX86FuncConvDefault, FuncBuilder0<int>()); c.getFunc()->setHint(kFuncHintNaked, false); GpVar v0(c.newGpVar(kX86VarTypeGpd)); GpVar v1(c.newGpVar(kX86VarTypeGpd)); GpVar cnt(c.newGpVar(kX86VarTypeGpd)); c.xor_(v0, v0); c.xor_(v1, v1); c.spill(v0); c.spill(v1); Label L(c.newLabel()); c.mov(cnt, imm(32)); c.bind(L); c.inc(v1); c.add(v0, v1); c.dec(cnt); c.jnz(L); c.ret(v0); c.endFunc(); }
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, 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(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(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(); }
virtual void compile(X86Compiler& c) { switch (_argsCount) { case 0: c.newFunc(kX86FuncConvDefault, FuncBuilder0<int>()); break; case 1: c.newFunc(kX86FuncConvDefault, FuncBuilder1<int, int>()); break; case 2: c.newFunc(kX86FuncConvDefault, FuncBuilder2<int, int, int>()); break; case 3: c.newFunc(kX86FuncConvDefault, FuncBuilder3<int, int, int, int>()); break; } if (_naked ) c.getFunc()->setHint(kFuncHintNaked, true); if (_pushPop) c.getFunc()->setHint(kX86FuncHintPushPop, true); GpVar gvar(c.newGpVar()); XmmVar xvar(c.newXmmVar(kX86VarTypeXmm)); // Alloc, use and spill preserved registers. if (_varsCount) { uint var = 0; uint index = 0; uint mask = 1; uint preserved = c.getFunc()->getDecl()->getGpPreservedMask(); do { if ((preserved & mask) != 0 && (index != kX86RegIndexEsp && index != kX86RegIndexEbp)) { GpVar somevar(c.newGpVar(kX86VarTypeGpd)); c.alloc(somevar, index); c.mov(somevar, imm(0)); c.spill(somevar); var++; } index++; mask <<= 1; } while (var < _varsCount && index < kX86RegNumGp); } c.alloc(gvar, zax); c.lea(gvar, xvar.m()); c.and_(gvar, imm(15)); c.ret(gvar); c.endFunc(); }
virtual void compile(X86Compiler& c) { c.newFunc(kX86FuncConvDefault, FuncBuilder0<Void>()); Label L_A = c.newLabel(); Label L_B = c.newLabel(); Label L_C = c.newLabel(); c.jmp(L_B); c.bind(L_A); c.jmp(L_C); c.bind(L_B); c.jmp(L_A); c.bind(L_C); c.ret(); c.endFunc(); }
int main(int argc, char* argv[]) { using namespace AsmJit; // ========================================================================== // Log compiler output. FileLogger logger(stderr); logger.setLogBinary(true); // Create compiler. /* X86Compiler c; c.setLogger(&logger); c.newFunc(kX86FuncConvDefault, FuncBuilder0<Void>()); c.getFunc()->setHint(kFuncHintNaked, true); X86CompilerFuncCall* ctx = c.call((void*)dummyFunc); ctx->setPrototype(kX86FuncConvDefault, FuncBuilder0<Void>()); c.endFunc(); */ X86Compiler c; c.setLogger(&logger); c.newFunc(kX86FuncConvDefault, FuncBuilder0<void>()); c.getFunc()->setHint(kFuncHintNaked, true); Label l91 = c.newLabel(); Label l92 = c.newLabel(); Label l93 = c.newLabel(); Label l94 = c.newLabel(); Label l95 = c.newLabel(); Label l96 = c.newLabel(); Label l97 = c.newLabel(); c.bind(l92); GpVar _var91(c.newGpVar()); GpVar _var92(c.newGpVar()); c.bind(l93); c.jmp(l91); c.bind(l95); c.mov(_var91, imm(0)); c.bind(l96); c.jmp(l93); c.mov(_var92, imm(1)); c.jmp(l91); c.bind(l94); c.jmp(l92); c.bind(l97); c.add(_var91, _var92); c.bind(l91); c.ret(); c.endFunc(); typedef void (*Func9)(void); Func9 func9 = asmjit_cast<Func9>(c.make()); // ========================================================================== // ========================================================================== // Make the function. // MyFn fn = asmjit_cast<MyFn>(c.make()); // Call it. // printf("Result %llu\n", (unsigned long long)fn()); // Free the generated function if it's not needed anymore. //MemoryManager::getGlobal()->free((void*)fn); // ========================================================================== return 0; }