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

    // Call a function.
    GpVar address(c.newGpVar());
    GpVar var(c.getGpArg(0));

    c.mov(address, imm((sysint_t)(void*)calledFunc));
    X86CompilerFuncCall* ctx;

    ctx = c.call(address);
    ctx->setPrototype(kX86FuncConvCompatFastCall, FuncBuilder1<int, int>());
    ctx->setArgument(0, var);
    ctx->setReturn(var);

    ctx = c.call(address);
    ctx->setPrototype(kX86FuncConvCompatFastCall, FuncBuilder1<int, int>());
    ctx->setArgument(0, var);
    ctx->setReturn(var);

    c.ret(var);
    c.endFunc();
  }
예제 #2
0
  virtual void compile(X86Compiler& c)
  {
    c.newFunc(kX86FuncConvCompatFastCall, FuncBuilder1<int, int*>());
    c.getFunc()->setHint(kFuncHintNaked, true);

    GpVar buf(c.getGpArg(0));
    GpVar acc0(c.newGpVar(kX86VarTypeGpd));
    GpVar acc1(c.newGpVar(kX86VarTypeGpd));

    c.mov(acc0, 0);
    c.mov(acc1, 0);

    uint i;
    for (i = 0; i < 4; i++)
    {
      {
        GpVar ret = c.newGpVar(kX86VarTypeGpd);
        GpVar ptr = c.newGpVar(kX86VarTypeGpz);
        GpVar idx = c.newGpVar(kX86VarTypeGpd);

        c.mov(ptr, buf);
        c.mov(idx, imm(i));

        X86CompilerFuncCall* fCall = c.call((void*)calledFunc);
        fCall->setPrototype(kX86FuncConvCompatFastCall, FuncBuilder2<int, int*, int>());
        fCall->setArgument(0, ptr);
        fCall->setArgument(1, idx);
        fCall->setReturn(ret);

        c.add(acc0, ret);
      }

      {
        GpVar ret = c.newGpVar(kX86VarTypeGpd);
        GpVar ptr = c.newGpVar(kX86VarTypeGpz);
        GpVar idx = c.newGpVar(kX86VarTypeGpd);

        c.mov(ptr, buf);
        c.mov(idx, imm(i));

        X86CompilerFuncCall* fCall = c.call((void*)calledFunc);
        fCall->setPrototype(kX86FuncConvCompatFastCall, FuncBuilder2<int, int*, int>());
        fCall->setArgument(0, ptr);
        fCall->setArgument(1, idx);
        fCall->setReturn(ret);

        c.sub(acc1, ret);
      }
    }

    GpVar ret(c.newGpVar());
    c.mov(ret, acc0);
    c.add(ret, acc1);
    c.ret(ret);
    c.endFunc();
  }
예제 #3
0
void CompiledExpression::generateSingleArgCall(X86Compiler& c, X86XmmVar& dest, X86XmmVar& arg, double (*function)(double)) {
    X86GpVar fn(c, kVarTypeIntPtr);
    c.mov(fn, imm_ptr((void*) function));
    X86CallNode* call = c.call(fn, kFuncConvHost, FuncBuilder1<double, double>());
    call->setArg(0, arg);
    call->setRet(0, dest);
}
예제 #4
0
  virtual void compile(X86Compiler& c)
  {
    Label skip(c.newLabel());

    X86CompilerFuncDecl* func = c.newFunc(kX86FuncConvDefault, FuncBuilder1<int, int>());
    func->setHint(kFuncHintNaked, true);

    GpVar var(c.getGpArg(0));
    c.cmp(var, imm(1));
    c.jle(skip);

    GpVar tmp(c.newGpVar(kX86VarTypeInt32));
    c.mov(tmp, var);
    c.dec(tmp);

    X86CompilerFuncCall* fCall = c.call(func->getEntryLabel());
    fCall->setPrototype(kX86FuncConvDefault, FuncBuilder1<int, int>());
    fCall->setArgument(0, tmp);
    fCall->setReturn(tmp);
    c.mul(c.newGpVar(kX86VarTypeInt32), var, tmp);

    c.bind(skip);
    c.ret(var);
    c.endFunc();
  }
예제 #5
0
  virtual void compile(X86Compiler& c)
  {
    c.newFunc(kX86FuncConvDefault, FuncBuilder3<int, int, int, int>());

    GpVar v0(c.getGpArg(0));
    GpVar v1(c.getGpArg(1));
    GpVar v2(c.getGpArg(2));

    // Just do something;)
    c.shl(v0, imm(1));
    c.shl(v1, imm(1));
    c.shl(v2, imm(1));

    // Call function.
    GpVar address(c.newGpVar());
    c.mov(address, imm((sysint_t)(void*)calledFunc));

    X86CompilerFuncCall* fCall = c.call(address);
    fCall->setPrototype(kX86FuncConvDefault, FuncBuilder3<Void, int, int, int>());
    fCall->setArgument(0, v2);
    fCall->setArgument(1, v1);
    fCall->setArgument(2, v0);

    // TODO: FuncCall return value.
    // fCall->setReturn(v0);
    // c.ret(v0);

    c.endFunc();
  }
예제 #6
0
  virtual void compile(X86Compiler& c)
  {
    c.newFunc(kX86FuncConvDefault, FuncBuilder3<int, int, int, int>());

    GpVar x(c.getGpArg(0));
    GpVar y(c.getGpArg(1));
    GpVar op(c.getGpArg(2));

    GpVar result;
    X86CompilerFuncCall* fCall;

    Label opAdd(c.newLabel());
    Label opMul(c.newLabel());

    c.cmp(op, 0);
    c.jz(opAdd);
    c.cmp(op, 1);
    c.jz(opMul);

    result = c.newGpVar();
    c.mov(result, imm(0));
    c.ret(result);

    c.bind(opAdd);
    result = c.newGpVar();

    fCall = c.call((void*)calledFuncAdd);
    fCall->setPrototype(kX86FuncConvDefault, FuncBuilder2<int, int, int>());
    fCall->setArgument(0, x);
    fCall->setArgument(1, y);
    fCall->setReturn(result);
    c.ret(result);

    c.bind(opMul);
    result = c.newGpVar();

    fCall = c.call((void*)calledFuncMul);
    fCall->setPrototype(kX86FuncConvDefault, FuncBuilder2<int, int, int>());
    fCall->setArgument(0, x);
    fCall->setArgument(1, y);
    fCall->setReturn(result);
    c.ret(result);

    c.endFunc();
  }