예제 #1
0
  virtual void compile(X86Compiler& c)
  {
    c.newFunc(kX86FuncConvDefault, FuncBuilder4<Void, int*, int*, int, int>());
    c.getFunc()->setHint(kFuncHintNaked, true);

    GpVar dst0_hi(c.getGpArg(0));
    GpVar dst0_lo(c.getGpArg(1));

    GpVar v0_hi(c.newGpVar(kX86VarTypeGpd));
    GpVar v0_lo(c.getGpArg(2));

    GpVar src0(c.getGpArg(3));
    c.imul(v0_hi, v0_lo, src0);

    c.mov(dword_ptr(dst0_hi), v0_hi);
    c.mov(dword_ptr(dst0_lo), v0_lo);
    c.endFunc();
  }
예제 #2
0
  virtual void compile(X86Compiler& c)
  {
    c.newFunc(kX86FuncConvDefault, FuncBuilder2<Void, int*, const int*>());
    c.getFunc()->setHint(kFuncHintNaked, true);

    GpVar dst = c.getGpArg(0);
    GpVar src = c.getGpArg(1);

    for (uint i = 0; i < 4; i++)
    {
      GpVar x = c.newGpVar(kX86VarTypeGpd);
      GpVar y = c.newGpVar(kX86VarTypeGpd);
      GpVar hi = c.newGpVar(kX86VarTypeGpd);

      c.mov(x, dword_ptr(src, 0));
      c.mov(y, dword_ptr(src, 4));

      c.imul(hi, x, y);
      c.add(dword_ptr(dst, 0), hi);
      c.add(dword_ptr(dst, 4), x);
    }

    c.endFunc();
  }