]> git.unchartedbackwaters.co.uk Git - francis/libjit.git/commitdiff
fixed jit_insn_address_of_label()
authorAleksey Demakov <ademakov@gmail.com>
Thu, 23 Feb 2006 23:58:24 +0000 (23:58 +0000)
committerAleksey Demakov <ademakov@gmail.com>
Thu, 23 Feb 2006 23:58:24 +0000 (23:58 +0000)
ChangeLog
jit/jit-insn.c
jit/jit-rules-x86.sel

index cec46df5e7bc2dd78fd7a6e8bac68b2a874a834f..25538bbe0f4f68e834a70de194d5792a7a5759f4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-02-24  Aleksey Demakov  <ademakov@gmail.com>
+
+       * 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  <ademakov@gmail.com>
 
        * jit/jit-rules-x86.c (_jit_create_call_return_insns): fix return
index ad0fc288817bb92aad5ea23dc5d2abe67576deef..712ad14aaab735f46c259570722d2f7a95dcaedd 100644 (file)
@@ -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;
 }
 
index b56715f481e8ea6398ec6161b86451c7491997b6..5c433203de93cd6278b3cb3b8f85afb14b511e18 100644 (file)
@@ -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;
        }