ruby-changes:68805
From: Maxime <ko1@a...>
Date: Thu, 21 Oct 2021 08:13:38 +0900 (JST)
Subject: [ruby-changes:68805] 799d248e31 (master): Fix jmp encoding. Rename conditional jumps jxx() to jxx_label()
https://git.ruby-lang.org/ruby.git/commit/?id=799d248e31 From 799d248e314d98b28837b921c9e0fc97ae93b574 Mon Sep 17 00:00:00 2001 From: Maxime Chevalier-Boisvert <maxime.chevalierboisvert@s...> Date: Thu, 25 Feb 2021 17:01:52 -0500 Subject: Fix jmp encoding. Rename conditional jumps jxx() to jxx_label() --- ujit_asm.c | 65 ++++++++++++++++++++++++++++---------------------------- ujit_asm.h | 62 ++++++++++++++++++++++++++--------------------------- ujit_asm_tests.c | 15 ++++++++++--- ujit_codegen.c | 2 +- 4 files changed, 77 insertions(+), 67 deletions(-) diff --git a/ujit_asm.c b/ujit_asm.c index 5f53ca35c0..3355acae90 100644 --- a/ujit_asm.c +++ b/ujit_asm.c @@ -787,7 +787,8 @@ void cb_write_jcc(codeblock_t* cb, const char* mnem, uint8_t op0, uint8_t op1, u https://github.com/ruby/ruby/blob/trunk/ujit_asm.c#L787 //cb.writeASM(mnem, label); // Write the opcode - cb_write_byte(cb, op0); + if (op0 != 0xFF) + cb_write_byte(cb, op0); cb_write_byte(cb, op1); // Add a reference to the label @@ -1099,37 +1100,37 @@ void imul(CodeBlock cb, X86Opnd opnd0, X86Opnd opnd1, X86Opnd opnd2) https://github.com/ruby/ruby/blob/trunk/ujit_asm.c#L1100 */ /// jcc - relative jumps to a label -void ja (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "ja" , 0x0F, 0x87, label_idx); } -void jae (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jae" , 0x0F, 0x83, label_idx); } -void jb (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jb" , 0x0F, 0x82, label_idx); } -void jbe (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jbe" , 0x0F, 0x86, label_idx); } -void jc (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jc" , 0x0F, 0x82, label_idx); } -void je (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "je" , 0x0F, 0x84, label_idx); } -void jg (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jg" , 0x0F, 0x8F, label_idx); } -void jge (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jge" , 0x0F, 0x8D, label_idx); } -void jl (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jl" , 0x0F, 0x8C, label_idx); } -void jle (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jle" , 0x0F, 0x8E, label_idx); } -void jna (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jna" , 0x0F, 0x86, label_idx); } -void jnae(codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnae", 0x0F, 0x82, label_idx); } -void jnb (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnb" , 0x0F, 0x83, label_idx); } -void jnbe(codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnbe", 0x0F, 0x87, label_idx); } -void jnc (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnc" , 0x0F, 0x83, label_idx); } -void jne (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jne" , 0x0F, 0x85, label_idx); } -void jng (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jng" , 0x0F, 0x8E, label_idx); } -void jnge(codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnge", 0x0F, 0x8C, label_idx); } -void jnl (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnl" , 0x0F, 0x8D, label_idx); } -void jnle(codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnle", 0x0F, 0x8F, label_idx); } -void jno (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jno" , 0x0F, 0x81, label_idx); } -void jnp (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnp" , 0x0F, 0x8b, label_idx); } -void jns (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jns" , 0x0F, 0x89, label_idx); } -void jnz (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnz" , 0x0F, 0x85, label_idx); } -void jo (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jo" , 0x0F, 0x80, label_idx); } -void jp (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jp" , 0x0F, 0x8A, label_idx); } -void jpe (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jpe" , 0x0F, 0x8A, label_idx); } -void jpo (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jpo" , 0x0F, 0x8B, label_idx); } -void js (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "js" , 0x0F, 0x88, label_idx); } -void jz (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jz" , 0x0F, 0x84, label_idx); } -void jmp (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jmp" , 0xFF, 0xE9, label_idx); } +void ja_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "ja" , 0x0F, 0x87, label_idx); } +void jae_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jae" , 0x0F, 0x83, label_idx); } +void jb_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jb" , 0x0F, 0x82, label_idx); } +void jbe_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jbe" , 0x0F, 0x86, label_idx); } +void jc_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jc" , 0x0F, 0x82, label_idx); } +void je_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "je" , 0x0F, 0x84, label_idx); } +void jg_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jg" , 0x0F, 0x8F, label_idx); } +void jge_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jge" , 0x0F, 0x8D, label_idx); } +void jl_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jl" , 0x0F, 0x8C, label_idx); } +void jle_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jle" , 0x0F, 0x8E, label_idx); } +void jna_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jna" , 0x0F, 0x86, label_idx); } +void jnae_label(codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnae", 0x0F, 0x82, label_idx); } +void jnb_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnb" , 0x0F, 0x83, label_idx); } +void jnbe_label(codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnbe", 0x0F, 0x87, label_idx); } +void jnc_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnc" , 0x0F, 0x83, label_idx); } +void jne_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jne" , 0x0F, 0x85, label_idx); } +void jng_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jng" , 0x0F, 0x8E, label_idx); } +void jnge_label(codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnge", 0x0F, 0x8C, label_idx); } +void jnl_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnl" , 0x0F, 0x8D, label_idx); } +void jnle_label(codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnle", 0x0F, 0x8F, label_idx); } +void jno_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jno" , 0x0F, 0x81, label_idx); } +void jnp_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnp" , 0x0F, 0x8b, label_idx); } +void jns_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jns" , 0x0F, 0x89, label_idx); } +void jnz_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jnz" , 0x0F, 0x85, label_idx); } +void jo_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jo" , 0x0F, 0x80, label_idx); } +void jp_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jp" , 0x0F, 0x8A, label_idx); } +void jpe_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jpe" , 0x0F, 0x8A, label_idx); } +void jpo_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jpo" , 0x0F, 0x8B, label_idx); } +void js_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "js" , 0x0F, 0x88, label_idx); } +void jz_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jz" , 0x0F, 0x84, label_idx); } +void jmp_label (codeblock_t* cb, uint32_t label_idx) { cb_write_jcc(cb, "jmp" , 0xFF, 0xE9, label_idx); } /// jcc - relative jumps to a pointer (32-bit offset) void ja_ptr (codeblock_t* cb, uint8_t* ptr) { cb_write_jcc_ptr(cb, "ja" , 0x0F, 0x87, ptr); } diff --git a/ujit_asm.h b/ujit_asm.h index 98f1b9877b..1b7030dfb6 100644 --- a/ujit_asm.h +++ b/ujit_asm.h @@ -294,36 +294,36 @@ void cmp(codeblock_t* cb, x86opnd_t opnd0, x86opnd_t opnd1); https://github.com/ruby/ruby/blob/trunk/ujit_asm.h#L294 void cdq(codeblock_t* cb); void cqo(codeblock_t* cb); void int3(codeblock_t* cb); -void ja(codeblock_t* cb, uint32_t label_idx); -void jae(codeblock_t* cb, uint32_t label_idx); -void jb(codeblock_t* cb, uint32_t label_idx); -void jbe(codeblock_t* cb, uint32_t label_idx); -void jc(codeblock_t* cb, uint32_t label_idx); -void je(codeblock_t* cb, uint32_t label_idx); -void jg(codeblock_t* cb, uint32_t label_idx); -void jge(codeblock_t* cb, uint32_t label_idx); -void jl(codeblock_t* cb, uint32_t label_idx); -void jle(codeblock_t* cb, uint32_t label_idx); -void jna(codeblock_t* cb, uint32_t label_idx); -void jnae(codeblock_t* cb, uint32_t label_idx); -void jnb(codeblock_t* cb, uint32_t label_idx); -void jnbe(codeblock_t* cb, uint32_t label_idx); -void jnc(codeblock_t* cb, uint32_t label_idx); -void jne(codeblock_t* cb, uint32_t label_idx); -void jng(codeblock_t* cb, uint32_t label_idx); -void jnge(codeblock_t* cb, uint32_t label_idx); -// void jnl(codeblock_t* cb, uint32_t label_idx); // this conflicts with jnl(3) -void jnle(codeblock_t* cb, uint32_t label_idx); -void jno(codeblock_t* cb, uint32_t label_idx); -void jnp(codeblock_t* cb, uint32_t label_idx); -void jns(codeblock_t* cb, uint32_t label_idx); -void jnz(codeblock_t* cb, uint32_t label_idx); -void jo(codeblock_t* cb, uint32_t label_idx); -void jp(codeblock_t* cb, uint32_t label_idx); -void jpe(codeblock_t* cb, uint32_t label_idx); -void jpo(codeblock_t* cb, uint32_t label_idx); -void js(codeblock_t* cb, uint32_t label_idx); -void jz(codeblock_t* cb, uint32_t label_idx); +void ja_label(codeblock_t* cb, uint32_t label_idx); +void jae_label(codeblock_t* cb, uint32_t label_idx); +void jb_label(codeblock_t* cb, uint32_t label_idx); +void jbe_label(codeblock_t* cb, uint32_t label_idx); +void jc_label(codeblock_t* cb, uint32_t label_idx); +void je_label(codeblock_t* cb, uint32_t label_idx); +void jg_label(codeblock_t* cb, uint32_t label_idx); +void jge_label(codeblock_t (... truncated) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/