1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Fix jmp encoding. Rename conditional jumps jxx() to jxx_label()

This commit is contained in:
Maxime Chevalier-Boisvert 2021-02-25 17:01:52 -05:00 committed by Alan Wu
parent 57977ba30d
commit 799d248e31
4 changed files with 77 additions and 67 deletions

View file

@ -787,7 +787,8 @@ void cb_write_jcc(codeblock_t* cb, const char* mnem, uint8_t op0, uint8_t op1, u
//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)
*/
/// 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); }

View file

@ -294,36 +294,36 @@ void cmp(codeblock_t* cb, x86opnd_t opnd0, x86opnd_t opnd1);
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* cb, uint32_t label_idx);
void jl_label(codeblock_t* cb, uint32_t label_idx);
void jle_label(codeblock_t* cb, uint32_t label_idx);
void jna_label(codeblock_t* cb, uint32_t label_idx);
void jnae_label(codeblock_t* cb, uint32_t label_idx);
void jnb_label(codeblock_t* cb, uint32_t label_idx);
void jnbe_label(codeblock_t* cb, uint32_t label_idx);
void jnc_label(codeblock_t* cb, uint32_t label_idx);
void jne_label(codeblock_t* cb, uint32_t label_idx);
void jng_label(codeblock_t* cb, uint32_t label_idx);
void jnge_label(codeblock_t* cb, uint32_t label_idx);
void jnl_label(codeblock_t* cb, uint32_t label_idx);
void jnle_label(codeblock_t* cb, uint32_t label_idx);
void jno_label(codeblock_t* cb, uint32_t label_idx);
void jnp_label(codeblock_t* cb, uint32_t label_idx);
void jns_label(codeblock_t* cb, uint32_t label_idx);
void jnz_label(codeblock_t* cb, uint32_t label_idx);
void jo_label(codeblock_t* cb, uint32_t label_idx);
void jp_label(codeblock_t* cb, uint32_t label_idx);
void jpe_label(codeblock_t* cb, uint32_t label_idx);
void jpo_label(codeblock_t* cb, uint32_t label_idx);
void js_label(codeblock_t* cb, uint32_t label_idx);
void jz_label(codeblock_t* cb, uint32_t label_idx);
void ja_ptr(codeblock_t* cb, uint8_t* ptr);
void jae_ptr(codeblock_t* cb, uint8_t* ptr);
void jb_ptr(codeblock_t* cb, uint8_t* ptr);
@ -354,7 +354,7 @@ void jpe_ptr(codeblock_t* cb, uint8_t* ptr);
void jpo_ptr(codeblock_t* cb, uint8_t* ptr);
void js_ptr(codeblock_t* cb, uint8_t* ptr);
void jz_ptr(codeblock_t* cb, uint8_t* ptr);
void jmp(codeblock_t* cb, uint32_t label_idx);
void jmp_label(codeblock_t* cb, uint32_t label_idx);
void jmp_ptr(codeblock_t* cb, uint8_t* ptr);
void jmp_rm(codeblock_t* cb, x86opnd_t opnd);
void jmp32(codeblock_t* cb, int32_t offset);

View file

@ -128,22 +128,31 @@ void run_tests()
);
*/
// jcc
// jcc to label
{
cb_set_pos(cb, 0);
uint32_t loop_label = cb_new_label(cb, "loop");
jge(cb, loop_label);
jge_label(cb, loop_label);
cb_link_labels(cb);
check_bytes(cb, "0F8DFAFFFFFF");
}
{
cb_set_pos(cb, 0);
uint32_t loop_label = cb_new_label(cb, "loop");
jo(cb, loop_label);
jo_label(cb, loop_label);
cb_link_labels(cb);
check_bytes(cb, "0F80FAFFFFFF");
}
// jmp to label
{
cb_set_pos(cb, 0);
uint32_t loop_label = cb_new_label(cb, "loop");
jmp_label(cb, loop_label);
cb_link_labels(cb);
check_bytes(cb, "E9FBFFFFFF");
}
// jmp with RM operand
cb_set_pos(cb, 0); jmp_rm(cb, R12); check_bytes(cb, "41FFE4");

View file

@ -1561,7 +1561,7 @@ gen_leave(jitstate_t* jit, ctx_t* ctx)
// If the return address is NULL, fall back to the interpreter
int FALLBACK_LABEL = cb_new_label(cb, "FALLBACK");
cmp(cb, REG1, imm_opnd(0));
jz(cb, FALLBACK_LABEL);
jz_label(cb, FALLBACK_LABEL);
// Jump to the JIT return address
jmp_rm(cb, REG1);