[前][次][番号順一覧][スレッド一覧]

ruby-changes:68816

From: Max <ko1@a...>
Date: Thu, 21 Oct 2021 08:14:04 +0900 (JST)
Subject: [ruby-changes:68816] f63cdae3a3 (master): Support memory operands to pop

https://git.ruby-lang.org/ruby.git/commit/?id=f63cdae3a3

From f63cdae3a30df5cd39fbbc064fef0bbc95fc9bd5 Mon Sep 17 00:00:00 2001
From: Max Bernstein <emacs@f...>
Date: Fri, 26 Feb 2021 19:11:27 -0800
Subject: Support memory operands to pop

---
 ujit_asm.c       | 19 ++++++++++++-------
 ujit_asm_tests.c |  5 +++++
 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) https://github.com/ruby/ruby/blob/trunk/ujit_asm.c#L1431
 }
 
 /// 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() https://github.com/ruby/ruby/blob/trunk/ujit_asm_tests.c#L279
     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");
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]