]> git.unchartedbackwaters.co.uk Git - francis/libjit.git/commitdiff
add _jit_gen_move_top() to take part of the _jit_gen_exch_top() functionality
authorAleksey Demakov <ademakov@gmail.com>
Tue, 29 Aug 2006 11:57:12 +0000 (11:57 +0000)
committerAleksey Demakov <ademakov@gmail.com>
Tue, 29 Aug 2006 11:57:12 +0000 (11:57 +0000)
thus making the interface cleaner

ChangeLog
jit/jit-reg-alloc.c
jit/jit-rules-alpha.c
jit/jit-rules-arm.c
jit/jit-rules-interp.c
jit/jit-rules-x86.c
jit/jit-rules.h

index b444d69c44145484d98c4f1de436e3e333a5b60e..a39fd3a6ae4adc51d6c636b4b412be591906444a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2006-08-29  Aleksey Demakov  <ademakov@gmail.com>
 
+       * jit/jit-rules.h, jit/jit-rules-alpha.c, jit/jit-rules-arm.c,
+       * jit/jit-rules-interp.c, jit/jit-rules-x86.c, jit/jit-reg-alloc.c:
+       move part of the _jit_gen_exch_top() functionality into a separate
+       _jit_gen_move_top() function.
+
        * include/jit/jit-opcode.h:
        * jit/jit-opcode.c: add JIT_OPCODE_IS_JUMP_TABLE flag to mark the
        JIT_OP_JUMP_TABLE opcode.
index aaa669f65020238d09974d962687488fa276cc1a..01328fb9d4ac3d0862e955f2378cc3c3548b392e 100644 (file)
@@ -3341,12 +3341,17 @@ exch_stack_top(jit_gencode_t gen, int reg, int pop)
        stack_start = get_stack_start(reg);
        top = get_stack_top(gen, stack_start);
 
-       /* Generate exchange instruction. */
-       _jit_gen_exch_top(gen, reg, pop);
        if(pop)
        {
+               /* Generate move/pop-top instruction. */
+               _jit_gen_move_top(gen, reg);
                remap_stack_down(gen, stack_start, top);
        }
+       else
+       {
+               /* Generate exchange instruction. */
+               _jit_gen_exch_top(gen, reg);
+       }
 
        /* Update information about the contents of the registers.  */
        for(index = 0;
index d9c737164f55765f3d7c35b918f71f369a979ab9..733347da7065cb1422b165d07d48b7f1ada092fb 100644 (file)
@@ -267,10 +267,13 @@ int _jit_setup_indirect_pointer(jit_function_t func, jit_value_t value) {
        return 0;
 }
 
-void _jit_gen_exch_top(jit_gencode_t gen, int reg, int pop) {
+void _jit_gen_exch_top(jit_gencode_t gen, int reg) {
        /* not used by alpha */;
 }
 
+void _jit_gen_move_top(jit_gencode_t gen, int reg) {
+       /* not used by alpha */;
+}
 
 void _jit_gen_spill_top(jit_gencode_t gen, int reg, jit_value_t value, int pop) {
        /* not used by alpha */;
index dbff5df93f96e1555fe2f92740bb8af32864823f..8adc8699386e0ba2244b35cb17e701cce79b2fe9 100644 (file)
@@ -774,7 +774,11 @@ void _jit_gen_load_global(jit_gencode_t gen, int reg, jit_value_t value)
        jit_cache_end_output();
 }
 
-void _jit_gen_exch_top(jit_gencode_t gen, int reg, int pop)
+void _jit_gen_exch_top(jit_gencode_t gen, int reg)
+{
+}
+
+void _jit_gen_move_top(jit_gencode_t gen, int reg)
 {
 }
 
index 759ad6e242685a4a31edfc8d49e894951a666172..28bd8210497fa36ec58773c6d38fb16e862333d0 100644 (file)
@@ -932,12 +932,46 @@ void _jit_gen_load_global(jit_gencode_t gen, int reg, jit_value_t value)
        /* Global registers are not used in the interpreted back end */
 }
 
-void _jit_gen_exch_top(jit_gencode_t gen, int reg, int pop)
+/*@
+ * @deftypefun void _jit_gen_exch_top (jit_gencode_t gen, int reg)
+ * Generate instructions to exchange the contents of the top stack register
+ * with a stack register specified by the @code{reg} argument.
+ *
+ * It needs to be implemented only by backends that support stack registers.
+ * @end deftypefun
+@*/
+void _jit_gen_exch_top(jit_gencode_t gen, int reg)
 {
+       /* Stack registers are not used in the interpreted back end */
 }
 
+/*@
+ * @deftypefun void _jit_gen_move_top (jit_gencode_t gen, int reg)
+ * Generate instructions to copy the contents of the top stack register
+ * into a stack register specified by the @code{reg} argument and pop
+ * the top register after this. If @code{reg} is equal to the top register
+ * then the top register is just popped without copying it.
+ *
+ * It needs to be implemented only by backends that support stack registers.
+ * @end deftypefun
+@*/
+void _jit_gen_move_top(jit_gencode_t gen, int reg)
+{
+       /* Stack registers are not used in the interpreted back end */
+}
+
+/*@
+ * @deftypefun _jit_gen_spill_top (jit_gencode_t gen, int reg, jit_value_t value, int pop)
+ * Generate instructions to spill the top stack register to the local
+ * variable frame. The @code{pop} argument indicates if the top register
+ * is popped from the stack.
+ *
+ * It needs to be implemented only by backends that support stack registers.
+ * @end deftypefun
+@*/
 void _jit_gen_spill_top(jit_gencode_t gen, int reg, jit_value_t value, int pop)
 {
+       /* Stack registers are not used in the interpreted back end */
 }
 
 /*@
index 57fcf8ee24266bfe2d302afb1a15b0f91eb52c21..c90a375a8b102da9c19e0e494cbea0add01134cf 100644 (file)
@@ -778,19 +778,23 @@ fp_stack_index(jit_gencode_t gen, int reg)
 }
 
 void
-_jit_gen_exch_top(jit_gencode_t gen, int reg, int pop)
+_jit_gen_exch_top(jit_gencode_t gen, int reg)
 {
        if(IS_FLOAT_REG(reg))
        {
                jit_cache_setup_output(2);
-               if(pop)
-               {
-                       x86_fstp(inst, fp_stack_index(gen, reg));
-               }
-               else
-               {
-                       x86_fxch(inst, fp_stack_index(gen, reg));
-               }
+               x86_fxch(inst, fp_stack_index(gen, reg));
+               jit_cache_end_output();
+       }
+}
+
+void
+ _jit_gen_move_top(jit_gencode_t gen, int reg)
+{
+       if(IS_FLOAT_REG(reg))
+       {
+               jit_cache_setup_output(2);
+               x86_fstp(inst, fp_stack_index(gen, reg));
                jit_cache_end_output();
        }
 }
index 444a4e4b597e0544826c97500d83a828d6d20e3e..d3050e11ae560aa814b276b25d86412488f9707a 100644 (file)
@@ -200,7 +200,8 @@ void _jit_gen_load_value
        (jit_gencode_t gen, int reg, int other_reg, jit_value_t value);
 void _jit_gen_spill_global(jit_gencode_t gen, int reg, jit_value_t value);
 void _jit_gen_load_global(jit_gencode_t gen, int reg, jit_value_t value);
-void _jit_gen_exch_top(jit_gencode_t gen, int reg, int pop);
+void _jit_gen_exch_top(jit_gencode_t gen, int reg);
+void _jit_gen_move_top(jit_gencode_t gen, int reg);
 void _jit_gen_spill_top(jit_gencode_t gen, int reg, jit_value_t value, int pop);
 void _jit_gen_fix_value(jit_value_t value);
 void _jit_gen_insn(jit_gencode_t gen, jit_function_t func,