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:
parent
57977ba30d
commit
799d248e31
4 changed files with 77 additions and 67 deletions
65
ujit_asm.c
65
ujit_asm.c
|
@ -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); }
|
||||
|
|
62
ujit_asm.h
62
ujit_asm.h
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue