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