From: Aleksey Demakov Date: Thu, 23 Feb 2006 23:58:24 +0000 (+0000) Subject: fixed jit_insn_address_of_label() X-Git-Tag: before.move.to.git~268 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=673865190eeb9124e3235170df616a98295d5a0d;p=francis%2Flibjit.git fixed jit_insn_address_of_label() --- diff --git a/ChangeLog b/ChangeLog index cec46df..25538bb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-02-24 Aleksey Demakov + + * jit/jit-insn.c (jit_insn_address_of_label): fix a typo. + * jit/jit-rules-x86.sel: fix JIT_OP_ADDRESS_OF_LABEL rule. + 2006-02-20 Aleksey Demakov * jit/jit-rules-x86.c (_jit_create_call_return_insns): fix return diff --git a/jit/jit-insn.c b/jit/jit-insn.c index ad0fc28..712ad14 100644 --- a/jit/jit-insn.c +++ b/jit/jit-insn.c @@ -4100,7 +4100,7 @@ jit_value_t jit_insn_address_of_label(jit_function_t func, jit_label_t *label) insn->opcode = (short)JIT_OP_ADDRESS_OF_LABEL; insn->flags = JIT_INSN_VALUE1_IS_LABEL; insn->dest = dest; - insn->value1 = (jit_value_t)label; + insn->value1 = (jit_value_t)(*label); return dest; } diff --git a/jit/jit-rules-x86.sel b/jit/jit-rules-x86.sel index b56715f..5c43320 100644 --- a/jit/jit-rules-x86.sel +++ b/jit/jit-rules-x86.sel @@ -1925,7 +1925,11 @@ JIT_OP_CALL_FILTER_RETURN: manual JIT_OP_ADDRESS_OF_LABEL: manual [] -> { unsigned char *inst; - int reg = _jit_regs_dest_value(gen, insn->dest); + jit_block_t block; + int reg; + + reg = _jit_regs_dest_value(gen, insn->dest); + inst = gen->posn.ptr; if(!jit_cache_check_for_n(&(gen->posn), 32)) { @@ -1933,11 +1937,19 @@ JIT_OP_ADDRESS_OF_LABEL: manual return; } reg = _jit_reg_info[reg].cpu_reg; - inst = output_branch(func, inst, 0xB8 + reg /* mov reg, imm */, insn); - x86_call_imm(inst, 0); - x86_alu_reg_membase(inst, X86_ADD, reg, X86_ESP, 0); - x86_alu_reg_imm(inst, X86_ADD, X86_ESP, sizeof(void *)); - x86_alu_reg_imm(inst, X86_SUB, reg, 5); + + block = jit_block_from_label(func, (jit_label_t)(insn->value1)); + if(block->address) + { + x86_mov_reg_imm(inst, reg, block->address); + } + else + { + /* Output a placeholder and record on the block's fixup list */ + x86_mov_reg_imm(inst, reg, (int)(block->fixup_absolute_list)); + block->fixup_absolute_list = (void *)(inst - 4); + } + gen->posn.ptr = inst; }