Skip to content

Commit

Permalink
implement immediate argument for call
Browse files Browse the repository at this point in the history
  • Loading branch information
lnussel committed Nov 1, 2009
1 parent ed98f65 commit b7eae0d
Showing 1 changed file with 21 additions and 11 deletions.
32 changes: 21 additions & 11 deletions code/qcommon/vm_x86_64_assembler.c
Expand Up @@ -811,24 +811,34 @@ static void emit_call(const char* mnemonic, arg_t arg1, arg_t arg2, void* data)
{
u8 rex, modrm, sib;

if(arg1.type != T_REGISTER || arg2.type != T_NONE)
if((arg1.type != T_REGISTER && arg1.type != T_IMMEDIATE) || arg2.type != T_NONE)
CRAP_INVALID_ARGS;

if(!arg1.absolute)
crap("call must be absolute");
if(arg1.type == T_REGISTER)
{
if(!arg1.absolute)
crap("call must be absolute");

if((arg1.v.reg & R_64) != R_64)
crap("register must be 64bit");
if((arg1.v.reg & R_64) != R_64)
crap("register must be 64bit");

arg1.v.reg ^= R_64; // no rex required for call
arg1.v.reg ^= R_64; // no rex required for call

compute_rexmodrmsib(&rex, &modrm, &sib, &arg2, &arg1);
compute_rexmodrmsib(&rex, &modrm, &sib, &arg2, &arg1);

modrm |= 0x2 << 3;
modrm |= 0x2 << 3;

if(rex) emit1(rex);
emit1(0xff);
emit1(modrm);
if(rex) emit1(rex);
emit1(0xff);
emit1(modrm);
}
else
{
if(!isu32(arg1.v.imm))
crap("must be 32bit argument");
emit1(0xe8);
emit4(arg1.v.imm);
}
}


Expand Down

0 comments on commit b7eae0d

Please sign in to comment.