예제 #1
0
  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.
  }
예제 #2
0
  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();
  }