summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Bernstein <emacs@fb.com>2021-02-26 19:11:27 -0800
committerAlan Wu <XrXr@users.noreply.github.com>2021-10-20 18:19:30 -0400
commitf63cdae3a30df5cd39fbbc064fef0bbc95fc9bd5 (patch)
treec6dc0494fb3fd33a26fa590597404f2f61844614
parent831ac473faae9cfb184752e5db2bc9b309a78eeb (diff)
Support memory operands to pop
-rw-r--r--ujit_asm.c19
-rw-r--r--ujit_asm_tests.c5
2 files changed, 17 insertions, 7 deletions
diff --git a/ujit_asm.c b/ujit_asm.c
index 8eb5da7593..6b85b58075 100644
--- a/ujit_asm.c
+++ b/ujit_asm.c
@@ -1431,16 +1431,21 @@ void or(codeblock_t* cb, x86opnd_t opnd0, x86opnd_t opnd1)
}
/// pop - Pop a register off the stack
-void pop(codeblock_t* cb, x86opnd_t reg)
+void pop(codeblock_t* cb, x86opnd_t opnd)
{
- assert (reg.num_bits == 64);
-
- //cb.writeASM("pop", reg);
+ assert (opnd.num_bits == 64);
- if (rex_needed(reg))
- cb_write_rex(cb, false, 0, 0, reg.as.reg.reg_no);
+ //cb.writeASM("pop", opnd);
- cb_write_opcode(cb, 0x58, 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, 0x58, opnd);
+ } else if (opnd.type == OPND_MEM) {
+ cb_write_rm(cb, false, false, NO_OPND, opnd, 0, 1, 0x8F);
+ } else {
+ assert(false && "unexpected operand type");
+ }
}
/// popfq - Pop the flags register (64-bit)
diff --git a/ujit_asm_tests.c b/ujit_asm_tests.c
index 10e9845eaf..59b98c443b 100644
--- a/ujit_asm_tests.c
+++ b/ujit_asm_tests.c
@@ -279,6 +279,11 @@ void run_tests()
cb_set_pos(cb, 0); pop(cb, RSP); check_bytes(cb, "5C");
cb_set_pos(cb, 0); pop(cb, RBP); check_bytes(cb, "5D");
cb_set_pos(cb, 0); pop(cb, R12); check_bytes(cb, "415C");
+ cb_set_pos(cb, 0); pop(cb, mem_opnd(64, RAX, 0)); check_bytes(cb, "8F00");
+ cb_set_pos(cb, 0); pop(cb, mem_opnd(64, R8, 0)); check_bytes(cb, "418F00");
+ cb_set_pos(cb, 0); pop(cb, mem_opnd(64, R8, 3)); check_bytes(cb, "418F4003");
+ cb_set_pos(cb, 0); pop(cb, mem_opnd_sib(64, RAX, RCX, 8, 3)); check_bytes(cb, "8F44C803");
+ cb_set_pos(cb, 0); pop(cb, mem_opnd_sib(64, R8, RCX, 8, 3)); check_bytes(cb, "418F44C803");
// push
cb_set_pos(cb, 0); push(cb, RAX); check_bytes(cb, "50");