dotgnu-pnet-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dotgnu-pnet-commits] libjit ./ChangeLog jit/jit-interp.c jit/jit-rul...


From: Aleksey Demakov
Subject: [dotgnu-pnet-commits] libjit ./ChangeLog jit/jit-interp.c jit/jit-rul...
Date: Wed, 11 Jan 2006 00:24:43 +0000

CVSROOT:        /sources/dotgnu-pnet
Module name:    libjit
Branch:         
Changes by:     Aleksey Demakov <address@hidden>        06/01/11 00:24:43

Modified files:
        .              : ChangeLog 
        jit            : jit-interp.c jit-rules-interp.c 

Log message:
        implement JIT_OP_JUMP_TABLE in interpreter

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/libjit/ChangeLog.diff?tr1=1.190&tr2=1.191&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/libjit/jit/jit-interp.c.diff?tr1=1.13&tr2=1.14&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/libjit/jit/jit-rules-interp.c.diff?tr1=1.22&tr2=1.23&r1=text&r2=text

Patches:
Index: libjit/ChangeLog
diff -u libjit/ChangeLog:1.190 libjit/ChangeLog:1.191
--- libjit/ChangeLog:1.190      Tue Jan 10 21:24:42 2006
+++ libjit/ChangeLog    Wed Jan 11 00:24:42 2006
@@ -5,10 +5,10 @@
        * jit/jit-internal.h, jit/jit-function.c, jiy/jit-rules-x86.c:
        add fixup_absolute_list field to _jit_block struct for fixing up
        absolute address references to a block.
-       * include/jit/jit-opcode.h (JIT_OP_JUMP_TABLE),
-       * jit/jit-rules-x86.sel (JIT_OP_JUMP_TABLE),
-       * include/jit/jit-insn.h, jit/jit-insn.c (jit_insn_jump_table):
-       add new opcode.
+       * include/jit/jit-opcode.h, include/jit/jit-insn.h, jit/jit-insn.c
+       (jit_insn_jump_table), jit/jit-rules-x86.sel, jit/jit-rules-interp.c
+       (_jit_gen_insn), jit/jit-interp.c (_jit_run_function):
+       add JIT_OP_JUMP_TABLE opcode.
 
 2006-01-08  Aleksey Demakov  <address@hidden>
 
Index: libjit/jit/jit-interp.c
diff -u libjit/jit/jit-interp.c:1.13 libjit/jit/jit-interp.c:1.14
--- libjit/jit/jit-interp.c:1.13        Thu Nov 18 01:41:54 2004
+++ libjit/jit/jit-interp.c     Wed Jan 11 00:24:42 2006
@@ -2045,6 +2045,20 @@
                }
                VMBREAK;
 
+               VMCASE(JIT_OP_JUMP_TABLE):
+               {
+                       if(VM_STK_INT0 < VM_NINT_ARG && VM_STK_INT0 >= 0)
+                       {
+                               pc = pc[2 + VM_STK_INT0];
+                               VM_MODIFY_STACK(1);
+                       }
+                       else
+                       {
+                               VM_MODIFY_PC_AND_STACK(2 + VM_NINT_ARG, 1);
+                       }
+               }
+               VMBREAK;
+
                
/******************************************************************
                 * Comparison opcodes.
                 
******************************************************************/
Index: libjit/jit/jit-rules-interp.c
diff -u libjit/jit/jit-rules-interp.c:1.22 libjit/jit/jit-rules-interp.c:1.23
--- libjit/jit/jit-rules-interp.c:1.22  Thu Nov 18 01:41:54 2004
+++ libjit/jit/jit-rules-interp.c       Wed Jan 11 00:24:43 2006
@@ -1103,6 +1103,47 @@
                }
                /* Not reached */
 
+               case JIT_OP_JUMP_TABLE:
+               {
+                       jit_label_t *labels;
+                       jit_nint num_labels;
+                       jit_nint index;
+
+                       labels = (jit_label_t *) insn->value1->address;
+                       num_labels = insn->value2->address;
+
+                       _jit_regs_spill_all(gen);
+                       _jit_regs_load_to_top(gen,
+                                             insn->dest,
+                                             (insn->flags & 
(JIT_INSN_DEST_NEXT_USE |
+                                                             
JIT_INSN_DEST_LIVE)),
+                                             0);
+
+                       jit_cache_opcode(&(gen->posn), insn->opcode);
+                       jit_cache_native(&(gen->posn), num_labels);
+                       for(index = 0; index < num_labels; index++)
+                       {
+                               block = jit_block_from_label(func, 
labels[index]);
+                               if(!block)
+                               {
+                                       return;
+                               }
+                               if(block->address)
+                               {
+                                       /* We already know the address of the 
block */
+                                       jit_cache_native(&(gen->posn), 
block->address);
+                               }
+                               else
+                               {
+                                       /* Record this position on the block's 
fixup list */
+                                       pc = (void **)(gen->posn.ptr);
+                                       jit_cache_native(&(gen->posn), 
block->fixup_absolute_list);
+                                       block->fixup_absolute_list = pc;
+                               }
+                       }
+               }
+               break;
+
                case JIT_OP_ADDRESS_OF_LABEL:
                {
                        /* Get the address of a particular label */
@@ -1751,6 +1792,15 @@
        }
        block->fixup_list = 0;
 
+       fixup = (void **)(block->fixup_absolute_list);
+       while(fixup != 0)
+       {
+               next = (void **)(fixup[0]);
+               fixup[0] = (void *)(jit_nint)((void **)(block->address));
+               fixup = next;
+       }
+       block->fixup_absolute_list = 0;
+
        /* If this is the exception catcher block, then we need to update
           the exception cookie for the function to point to here */
        if(block->label == block->func->builder->catcher_label &&




reply via email to

[Prev in Thread] Current Thread [Next in Thread]