virtual void compile(X86Compiler& c) { c.newFunc(kX86FuncConvDefault, FuncBuilder3<Void, uint32_t*, const uint32_t*, size_t>()); c.getFunc()->setHint(kFuncHintNaked, true); // Omit unnecessary prolog/epilog. Label L_Loop = c.newLabel(); // Create base labels we use Label L_Exit = c.newLabel(); // in our function. GpVar dst(c.getGpArg(0)); // Get reference to function GpVar src(c.getGpArg(1)); // arguments. GpVar cnt(c.getGpArg(2)); c.alloc(dst); // Allocate all registers now, c.alloc(src); // because we want to keep them c.alloc(cnt); // in physical registers only. c.test(cnt, cnt); // Exit if length is zero. c.jz(L_Exit); c.bind(L_Loop); // Bind the loop label here. GpVar tmp(c.newGpVar(kX86VarTypeGpd)); // Copy a single dword (4 bytes). c.mov(tmp, dword_ptr(src)); c.mov(dword_ptr(dst), tmp); c.add(src, 4); // Increment dst/src pointers. c.add(dst, 4); c.dec(cnt); // Loop until cnt isn't zero. c.jnz(L_Loop); c.bind(L_Exit); // Bind the exit label here. c.endFunc(); // End of function. }
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) { int i; GpVar var[32]; c.newFunc(kX86FuncConvDefault, FuncBuilder1<Void, int*>()); for (i = 0; i < ASMJIT_ARRAY_SIZE(var); i++) { var[i] = c.newGpVar(kX86VarTypeGpd); c.xor_(var[i], var[i]); } GpVar v0(c.newGpVar(kX86VarTypeGpd)); Label L(c.newLabel()); c.mov(v0, imm(32)); c.bind(L); for (i = 0; i < ASMJIT_ARRAY_SIZE(var); i++) { c.add(var[i], imm(i)); } c.dec(v0); c.jnz(L); GpVar a0(c.getGpArg(0)); for (i = 0; i < ASMJIT_ARRAY_SIZE(var); i++) { c.mov(dword_ptr(a0, i * 4), var[i]); } c.endFunc(); }