mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Support memory operands to push
This commit is contained in:
parent
799d248e31
commit
3a365afaf5
3 changed files with 19 additions and 9 deletions
21
ujit_asm.c
21
ujit_asm.c
|
@ -1452,17 +1452,22 @@ void popfq(codeblock_t* cb)
|
|||
cb_write_bytes(cb, 2, 0x48, 0x9D);
|
||||
}
|
||||
|
||||
/// push - Push a register on the stack
|
||||
void push(codeblock_t* cb, x86opnd_t reg)
|
||||
/// push - Push an operand on the stack
|
||||
void push(codeblock_t* cb, x86opnd_t opnd)
|
||||
{
|
||||
assert (reg.num_bits == 64);
|
||||
assert (opnd.num_bits == 64);
|
||||
|
||||
//cb.writeASM("push", reg);
|
||||
//cb.writeASM("push", opnd);
|
||||
|
||||
if (rex_needed(reg))
|
||||
cb_write_rex(cb, false, 0, 0, reg.as.reg.reg_no);
|
||||
|
||||
cb_write_opcode(cb, 0x50, reg);
|
||||
if (opnd.type == OPND_REG) {
|
||||
if (rex_needed(opnd))
|
||||
cb_write_rex(cb, false, 0, 0, opnd.as.reg.reg_no);
|
||||
cb_write_opcode(cb, 0x50, opnd);
|
||||
} else if (opnd.type == OPND_MEM) {
|
||||
cb_write_rm(cb, false, false, NO_OPND, opnd, 6, 1, 0xFF);
|
||||
} else {
|
||||
assert(false && "unexpected operand type");
|
||||
}
|
||||
}
|
||||
|
||||
/// pushfq - Push the flags register (64-bit)
|
||||
|
|
|
@ -367,7 +367,7 @@ void not(codeblock_t* cb, x86opnd_t opnd);
|
|||
void or(codeblock_t* cb, x86opnd_t opnd0, x86opnd_t opnd1);
|
||||
void pop(codeblock_t* cb, x86opnd_t reg);
|
||||
void popfq(codeblock_t* cb);
|
||||
void push(codeblock_t* cb, x86opnd_t reg);
|
||||
void push(codeblock_t* cb, x86opnd_t opnd);
|
||||
void pushfq(codeblock_t* cb);
|
||||
void ret(codeblock_t* cb);
|
||||
void sal(codeblock_t* cb, x86opnd_t opnd0, x86opnd_t opnd1);
|
||||
|
|
|
@ -284,6 +284,11 @@ void run_tests()
|
|||
cb_set_pos(cb, 0); push(cb, RAX); check_bytes(cb, "50");
|
||||
cb_set_pos(cb, 0); push(cb, RBX); check_bytes(cb, "53");
|
||||
cb_set_pos(cb, 0); push(cb, R12); check_bytes(cb, "4154");
|
||||
cb_set_pos(cb, 0); push(cb, mem_opnd(64, RAX, 0)); check_bytes(cb, "FF30");
|
||||
cb_set_pos(cb, 0); push(cb, mem_opnd(64, R8, 0)); check_bytes(cb, "41FF30");
|
||||
cb_set_pos(cb, 0); push(cb, mem_opnd(64, R8, 3)); check_bytes(cb, "41FF7003");
|
||||
cb_set_pos(cb, 0); push(cb, mem_opnd_sib(64, RAX, RCX, 8, 3)); check_bytes(cb, "FF74C803");
|
||||
cb_set_pos(cb, 0); push(cb, mem_opnd_sib(64, R8, RCX, 8, 3)); check_bytes(cb, "41FF74C803");
|
||||
|
||||
// ret
|
||||
cb_set_pos(cb, 0); ret(cb); check_bytes(cb, "C3");
|
||||
|
|
Loading…
Add table
Reference in a new issue