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) { 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(); }