8000 Merge pull request #59 from tekknolagi/microjit · jamatthews/ruby@f648bcf · GitHub
[go: up one dir, main page]

Skip to content

Commit f648bcf

Browse files
authored
Merge pull request ruby#59 from tekknolagi/microjit
Support memory operands to pop
2 parents c3c81cf + 4467c66 commit f648bcf

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

ujit_asm.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,16 +1431,21 @@ void or(codeblock_t* cb, x86opnd_t opnd0, x86opnd_t opnd1)
14311431
}
14321432

14331433
/// pop - Pop a register off the stack
1434-
void pop(codeblock_t* cb, x86opnd_t reg)
1434+
void pop(codeblock_t* cb, x86opnd_t opnd)
14351435
{
1436-
assert (reg.num_bits == 64);
1437-
1438-
//cb.writeASM("pop", reg);
1436+
assert (opnd.num_bits == 64);
14391437

1440-
if (rex_needed(reg))
1441-
cb_write_rex(cb, false, 0, 0, reg.as.reg.reg_no);
1438+
//cb.writeASM("pop", opnd);
14421439

1443-
cb_write_opcode(cb, 0x58, reg);
1440+
if (opnd.type == OPND_REG) {
1441+
if (rex_needed(opnd))
1442+
cb_write_rex(cb, false, 0, 0, opnd.as.reg.reg_no);
1443+
cb_write_opcode(cb, 0x58, opnd);
1444+
} else if (opnd.type == OPND_MEM) {
1445+
cb_write_rm(cb, false, false, NO_OPND, opnd, 0, 1, 0x8F);
1446+
} else {
1447+
assert(false && "unexpected operand type");
1448+
}
14441449
}
14451450

14461451
/// popfq - Pop the flags register (64-bit)

ujit_asm_tests.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,11 @@ void run_tests()
279279
cb_set_pos(cb, 0); pop(cb, RSP); check_bytes(cb, "5C");
280280
cb_set_pos(cb, 0); pop(cb, RBP); check_bytes(cb, "5D");
281281
cb_set_pos(cb, 0); pop(cb, R12); check_bytes(cb, "415C");
282+
cb_set_pos(cb, 0); pop(cb, mem_opnd(64, RAX, 0)); check_bytes(cb, "8F00");
283+
cb_set_pos(cb, 0); pop(cb, mem_opnd(64, R8, 0)); check_bytes(cb, "418F00");
284+
cb_set_pos(cb, 0); pop(cb, mem_opnd(64, R8, 3)); check_bytes(cb, "418F4003");
285+
cb_set_pos(cb, 0); pop(cb, mem_opnd_sib(64, RAX, RCX, 8, 3)); check_bytes(cb, "8F44C803");
286+
cb_set_pos(cb, 0); pop(cb, mem_opnd_sib(64, R8, RCX, 8, 3)); check_bytes(cb, "418F44C803");
282287

283288
// push
284289
cb_set_pos(cb, 0); push(cb, RAX); check_bytes(cb, "50");

0 commit comments

Comments
 (0)
0