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

ruby-changes:68575

From: Maxime <ko1@a...>
Date: Thu, 21 Oct 2021 08:09:49 +0900 (JST)
Subject: [ruby-changes:68575] 2e31949225 (master): Ported xor and cmovcc instructions

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

From 2e319492254e529a2f5673038ec6c3ea44087199 Mon Sep 17 00:00:00 2001
From: Maxime Chevalier-Boisvert <maxime.chevalierboisvert@s...>
Date: Tue, 15 Sep 2020 10:44:46 -0400
Subject: Ported xor and cmovcc instructions

---
 ujit_asm.c       | 107 ++++++++++++++++++++++++++++---------------------------
 ujit_asm.h       |  31 ++++++++++++++++
 ujit_asm_tests.c |  34 ++++--------------
 3 files changed, 91 insertions(+), 81 deletions(-)

diff --git a/ujit_asm.c b/ujit_asm.c
index ce0e9fb2fe..75c2dc8dc8 100644
--- a/ujit_asm.c
+++ b/ujit_asm.c
@@ -747,20 +747,19 @@ void cb_write_jcc(codeblock_t* cb, const char* mnem, uint8_t op0, uint8_t op1, s https://github.com/ruby/ruby/blob/trunk/ujit_asm.c#L747
 }
 
 // Encode a conditional move instruction
-/*
-void writeCmov(CodeBlock cb, const char mnem, ubyte opcode1, X86Reg dst, X86Opnd src)
+void cb_write_cmov(codeblock_t* cb, const char* mnem, uint8_t opcode1, x86opnd_t dst, x86opnd_t src)
 {
     //cb.writeASM(mnem, dst, src);
 
-    assert (src.isReg || src.isMem);
-    assert (dst.size >= 16, "invalid dst reg size in cmov");
+    assert (dst.type == OPND_REG);
+    assert (src.type == OPND_REG || src.type == OPND_MEM);
+    assert (dst.num_bits >= 16 && "invalid dst reg size in cmov");
 
-    auto szPref = dst.size is 16;
-    auto rexW = dst.size is 64;
+    bool szPref = dst.num_bits == 16;
+    bool rexW = dst.num_bits == 64;
 
-    cb.writeRMInstr!('r', 0xFF, 0x0F, opcode1)(szPref, rexW, X86Opnd(dst), src);
+    cb_write_rm(cb, szPref, rexW, dst, src, 0xFF, 2, 0x0F, opcode1);
 }
-*/
 
 // add - Integer addition
 void add(codeblock_t* cb, x86opnd_t opnd0, x86opnd_t opnd1)
@@ -822,39 +821,37 @@ void call(codeblock_t* cb, x86opnd_t opnd) https://github.com/ruby/ruby/blob/trunk/ujit_asm.c#L821
     cb_write_rm(cb, false, false, NO_OPND, opnd, 2, 1, 0xFF);
 }
 
-/*
 /// cmovcc - Conditional move
-alias cmova = writeCmov!("cmova", 0x47);
-alias cmovae = writeCmov!("cmovae", 0x43);
-alias cmovb = writeCmov!("cmovb", 0x42);
-alias cmovbe = writeCmov!("cmovbe", 0x46);
-alias cmovc = writeCmov!("cmovc", 0x42);
-alias cmove = writeCmov!("cmove", 0x44);
-alias cmovg = writeCmov!("cmovg", 0x4F);
-alias cmovge = writeCmov!("cmovge", 0x4D);
-alias cmovl = writeCmov!("cmovl", 0x4C);
-alias cmovle = writeCmov!("cmovle", 0x4E);
-alias cmovna = writeCmov!("cmovna", 0x46);
-alias cmovnae = writeCmov!("cmovnae", 0x42);
-alias cmovnb = writeCmov!("cmovnb", 0x43);
-alias cmovnbe = writeCmov!("cmovnbe", 0x47);
-alias cmovnc = writeCmov!("cmovnc", 0x43);
-alias cmovne = writeCmov!("cmovne", 0x45);
-alias cmovnge = writeCmov!("cmovng", 0x4E);
-alias cmovnge = writeCmov!("cmovnge", 0x4C);
-alias cmovnl = writeCmov!("cmovnl", 0x4D);
-alias cmovnle = writeCmov!("cmovnle", 0x4F);
-alias cmovno = writeCmov!("cmovno", 0x41);
-alias cmovnp = writeCmov!("cmovnp", 0x4B);
-alias cmovns = writeCmov!("cmovns", 0x49);
-alias cmovnz = writeCmov!("cmovnz", 0x45);
-alias cmovo = writeCmov!("cmovno", 0x40);
-alias cmovp = writeCmov!("cmovp", 0x4A);
-alias cmovpe = writeCmov!("cmovpe", 0x4A);
-alias cmovpo = writeCmov!("cmovpo", 0x4B);
-alias cmovs = writeCmov!("cmovs", 0x48);
-alias cmovz = writeCmov!("cmovz", 0x44);
-*/
+void cmova(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmova", 0x47, dst, src); }
+void cmovae(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovae", 0x43, dst, src); }
+void cmovb(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovb", 0x42, dst, src); }
+void cmovbe(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovbe", 0x46, dst, src); }
+void cmovc(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovc", 0x42, dst, src); }
+void cmove(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmove", 0x44, dst, src); }
+void cmovg(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovg", 0x4F, dst, src); }
+void cmovge(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovge", 0x4D, dst, src); }
+void cmovl(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovl", 0x4C, dst, src); }
+void cmovle(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovle", 0x4E, dst, src); }
+void cmovna(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovna", 0x46, dst, src); }
+void cmovnae(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovnae", 0x42, dst, src); }
+void cmovnb(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovnb", 0x43, dst, src); }
+void cmovnbe(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovnbe", 0x47, dst, src); }
+void cmovnc(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovnc", 0x43, dst, src); }
+void cmovne(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovne", 0x45, dst, src); }
+void cmovng(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovng", 0x4E, dst, src); }
+void cmovnge(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovnge", 0x4C, dst, src); }
+void cmovnl(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovnl" , 0x4D, dst, src); }
+void cmovnle(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovnle", 0x4F, dst, src); }
+void cmovno(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovno", 0x41, dst, src); }
+void cmovnp(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovnp", 0x4B, dst, src); }
+void cmovns(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovns", 0x49, dst, src); }
+void cmovnz(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovnz", 0x45, dst, src); }
+void cmovo(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovo", 0x40, dst, src); }
+void cmovp(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovp", 0x4A, dst, src); }
+void cmovpe(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovpe", 0x4A, dst, src); }
+void cmovpo(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovpo", 0x4B, dst, src); }
+void cmovs(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovs", 0x48, dst, src); }
+void cmovz(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) { cb_write_cmov(cb, "cmovz", 0x44, dst, src); }
 
 /// cmp - Compare and set flags
 void cmp(codeblock_t* cb, x86opnd_t opnd0, x86opnd_t opnd1)
@@ -1386,17 +1383,21 @@ void sub(codeblock_t* cb, x86opnd_t opnd0, x86opnd_t opnd1) https://github.com/ruby/ruby/blob/trunk/ujit_asm.c#L1383
     );
 }
 
-/*
 /// xor - Exclusive bitwise OR
-alias xor = writeRMMulti!(
-    "xor",
-    0x30, // opMemReg8
-    0x31, // opMemRegPref
-    0x32, // opRegMem8
-    0x33, // opRegMemPref
-    0x80, // opMemImm8
-    0x83, // opMemImmSml
-    0x81, // opMemImmLrg
-    0x06  // opExtImm
-);
-*/
+void xor(codeblock_t* cb, x86opnd_t opnd0, x86opnd_t opnd1)
+{
+    cb_write_rm_multi(
+        cb,
+        "xor",
+        0x30, // opMemReg8
+        0x31, // opMemRegPref
+        0x32, // opRegMem8
+        0x33, // opRegMemPref
+        0x80, // opMemImm8
+        0x83, // opMemImmSml
+        0x81, // opMemImmLrg
+        0x06, // opExtImm
+        opnd0,
+        opnd1
+    );
+}
diff --git a/ujit_asm.h b/ujit_asm.h
index 569c310381..502b7c665f 100644
--- a/ujit_asm.h
+++ b/ujit_asm.h
@@ -196,6 +196,36 @@ void add(codeblock_t* cb, x86opnd_t opnd0, x86opnd_t opnd1); https://github.com/ruby/ruby/blob/trunk/ujit_asm.h#L196
 void and(codeblock_t* cb, x86opnd_t opnd0, x86opnd_t opnd1);
 void call_label(codeblock_t* cb, size_t label_idx);
 void call(codeblock_t* cb, x86opnd_t opnd);
+void cmova(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovae(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovb(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovbe(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovc(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmove(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovg(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovge(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovl(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovle(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovna(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovnae(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovnb(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovnbe(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovnc(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovne(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovng(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovnge(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovnl(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovnle(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovno(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovnp(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovns(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovnz(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovo(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovp(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovpe(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovpo(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovs(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
+void cmovz(codeblock_t* cb, x86opnd_t dst, x86opnd_t src);
 void cmp(codeblock_t* cb, x86opnd_t opnd0, x86opnd_t opnd1);
 void cdq(codeblock_t* cb);
 void cqo(codeblock_t* cb);
@@ -247,5 +277,6 @@ void sar(codeblock_t* cb, x86opnd_t opnd0, x86opnd_t opnd1); https://github.com/ruby/ruby/blob/trunk/ujit_asm.h#L277
 void shl(codeblock_t* cb, x86opnd_t opnd0, x86opnd_t opnd1);
 void shr(codeblock_t* cb, x86opnd_t opnd0, x86opnd_t opnd1);
 void sub(code (... truncated)

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

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