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-rules-x86.c jit/jit-ru...


From: Aleksey Demakov
Subject: [dotgnu-pnet-commits] libjit ChangeLog jit/jit-rules-x86.c jit/jit-ru...
Date: Sun, 02 Jul 2006 23:01:24 +0000

CVSROOT:        /sources/dotgnu-pnet
Module name:    libjit
Changes by:     Aleksey Demakov <avd>   06/07/02 23:01:24

Modified files:
        .              : ChangeLog 
        jit            : jit-rules-x86.c jit-rules-x86.ins 

Log message:
        more native x86 instruction selection rules

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/libjit/ChangeLog?cvsroot=dotgnu-pnet&r1=1.239&r2=1.240
http://cvs.savannah.gnu.org/viewcvs/libjit/jit/jit-rules-x86.c?cvsroot=dotgnu-pnet&r1=1.35&r2=1.36
http://cvs.savannah.gnu.org/viewcvs/libjit/jit/jit-rules-x86.ins?cvsroot=dotgnu-pnet&r1=1.9&r2=1.10

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/ChangeLog,v
retrieving revision 1.239
retrieving revision 1.240
diff -u -b -r1.239 -r1.240
--- ChangeLog   28 Jun 2006 13:45:36 -0000      1.239
+++ ChangeLog   2 Jul 2006 23:01:24 -0000       1.240
@@ -1,3 +1,13 @@
+2006-07-03  Aleksey Demakov  <address@hidden>
+
+       * jit/jit-rules-x86.ins: add JIT_OP_LOW_WORD, JIT_OP_EXPAND_INT,
+       JIT_OP_EXPAND_UINT, JIT_OP_INT_TO_NFLOAT, JIT_OP_UINT_TO_NFLOAT,
+       JIT_OP_LONG_TO_NFLOAT, JIT_OP_ULONG_TO_NFLOAT and rewrite
+       JIT_OP_TRUNC_SBYTE, JIT_OP_TRUNC_UBYTE, JIT_OP_LOAD_PC rules.
+
+       * jit/jit-rules-x86.c (_jit_opcode_is_supported): include .inc file
+       instead of .slc if USE_NEW_REG_ALLOC is defined.
+
 2006-06-28  Aleksey Demakov  <address@hidden>
 
        * tools/gen-rules-parser.y (gensel_output_code): 

Index: jit/jit-rules-x86.c
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/jit/jit-rules-x86.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -b -r1.35 -r1.36
--- jit/jit-rules-x86.c 20 May 2006 10:43:17 -0000      1.35
+++ jit/jit-rules-x86.c 2 Jul 2006 23:01:24 -0000       1.36
@@ -187,7 +187,11 @@
        switch(opcode)
        {
                #define JIT_INCLUDE_SUPPORTED
+#if USE_NEW_REG_ALLOC
+               #include "jit-rules-x86.inc"
+#else
                #include "jit-rules-x86.slc"
+#endif
                #undef JIT_INCLUDE_SUPPORTED
        }
        return 0;
@@ -1247,6 +1251,7 @@
        }
 }
 
+#if !USE_NEW_REG_ALLOC
 /*
  * Widen a byte register.
  */
@@ -1265,6 +1270,7 @@
        }
        return inst;
 }
+#endif
 
 /*
  * Shift the contents of a register.

Index: jit/jit-rules-x86.ins
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/jit/jit-rules-x86.ins,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- jit/jit-rules-x86.ins       28 Jun 2006 13:45:36 -0000      1.9
+++ jit/jit-rules-x86.ins       2 Jul 2006 23:01:24 -0000       1.10
@@ -23,13 +23,13 @@
  */
 
 JIT_OP_TRUNC_SBYTE: unary
-       [reg] -> {
-               inst = widen_byte(inst, $1, 1);
+       [reg("eax"|"ecx"|"edx"|"ebx")] -> {
+               x86_widen_reg(inst, $1, $1, 1, 0);
        }
 
 JIT_OP_TRUNC_UBYTE: unary
-       [reg] -> {
-               inst = widen_byte(inst, $1, 0);
+       [reg("eax"|"ecx"|"edx"|"ebx")] -> {
+               x86_widen_reg(inst, $1, $1, 0, 0);
        }
 
 JIT_OP_TRUNC_SHORT: unary
@@ -102,16 +102,120 @@
                x86_patch(patch1, inst);
        }
 
-JIT_OP_NFLOAT_TO_FLOAT32: unary, stack
-       [freg] -> {
+JIT_OP_LOW_WORD:
+       [=reg, imm] -> {
+               jit_uint value = ((jit_uint *)($2))[0];
+               x86_mov_reg_imm(inst, $1, value);
+       }
+       [=reg, local] -> {
+               x86_mov_reg_membase(inst, $1, X86_EBP, $2, 4);
+       }
+       [=reg, lreg] -> {
+               if($1 != $2)
+               {
+                       x86_mov_reg_reg(inst, $1, $2, 4);
+               }
+       }
+       
+JIT_OP_EXPAND_INT:
+       [=lreg, imm] -> {
+               x86_mov_reg_imm(inst, $1, $2);
+               x86_mov_reg_reg(inst, %1, $1, 4);
+               x86_shift_reg_imm(inst, X86_SAR, %1, 31);
+       }
+       [=lreg, local] -> {
+               x86_mov_reg_membase(inst, $1, X86_EBP, $2, 4);
+               x86_mov_reg_reg(inst, %1, $1, 4);
+               x86_shift_reg_imm(inst, X86_SAR, %1, 31);
+       }
+       [=lreg, reg] -> {
+               if($1 != $2)
+               {
+                       x86_mov_reg_reg(inst, $1, $2, 4);
+               }
+               x86_mov_reg_reg(inst, %1, $1, 4);
+               x86_shift_reg_imm(inst, X86_SAR, %1, 31);
+       }
+
+JIT_OP_EXPAND_UINT:
+       [=lreg, imm] -> {
+               x86_mov_reg_imm(inst, $1, $2);
+               x86_clear_reg(inst, %1);
+       }
+       [=lreg, local] -> {
+               x86_mov_reg_membase(inst, $1, X86_EBP, $2, 4);
+               x86_clear_reg(inst, %1);
+       }
+       [=lreg, reg] -> {
+               if($1 != $2)
+               {
+                       x86_mov_reg_reg(inst, $1, $2, 4);
+               }
+               x86_clear_reg(inst, %1);
+       }
+
+JIT_OP_INT_TO_NFLOAT:
+       [=freg, local] -> {
+               x86_fild_membase(inst, X86_EBP, $2, 0);
+       }
+       [=freg, reg] -> {
+               x86_push_reg(inst, $2);
+               x86_fild_membase(inst, X86_ESP, 0, 0);
+               x86_alu_reg_imm(inst, X86_ADD, X86_ESP, sizeof(jit_nint));
+       }
+
+JIT_OP_UINT_TO_NFLOAT:
+       [=freg, reg, scratch("?")] -> {
+               x86_clear_reg(inst, $3);
+               x86_push_reg(inst, $3);
+               x86_push_reg(inst, $2);
+               x86_fild_membase(inst, X86_ESP, 0, 1);
+               x86_alu_reg_imm(inst, X86_ADD, X86_ESP, sizeof(jit_long));
+       }
+
+JIT_OP_LONG_TO_NFLOAT:
+       [=freg, local] -> {
+               x86_fild_membase(inst, X86_EBP, $2, 1);
+       }
+       [=freg, lreg] -> {
+               x86_push_reg(inst, %2);
+               x86_push_reg(inst, $2);
+               x86_fild_membase(inst, X86_ESP, 0, 1);
+               x86_alu_reg_imm(inst, X86_ADD, X86_ESP, sizeof(jit_long));
+       }
+
+JIT_OP_ULONG_TO_NFLOAT: more_space
+       [=freg, lreg] -> {
+               /* TODO: review wrt relocation for elf pre-compilation */
+               static float f2pow64;
+               static int inited;
+               if(!inited)
+               {
+                       f2pow64 = jit_float32_pow(2.0, 64);
+                       inited = 1;
+               }
+               unsigned char *patch;
+               x86_push_reg(inst, %2);
+               x86_push_reg(inst, $2);
+               x86_fild_membase(inst, X86_ESP, 0, 1);
+               x86_alu_reg_imm(inst, X86_ADD, X86_ESP, sizeof(jit_long));
+               x86_test_reg_reg(inst, %2, %2);
+               patch = inst;
+               x86_branch8(inst, X86_CC_NS, 0, 1);
+               x86_fp_op_mem(inst, X86_FADD, &f2pow64, 0);
+               x86_patch(patch, inst);
+       }
+
+JIT_OP_NFLOAT_TO_FLOAT32: stack
+       [=freg, freg] -> {
                x86_alu_reg_imm(inst, X86_SUB, X86_ESP, sizeof(void *));
                x86_fst_membase(inst, X86_ESP, 0, 0, 1);
                x86_fld_membase(inst, X86_ESP, 0, 0);
                x86_alu_reg_imm(inst, X86_ADD, X86_ESP, sizeof(void *));
        }
 
-JIT_OP_NFLOAT_TO_FLOAT64: unary, stack
-       [freg] -> {
+JIT_OP_NFLOAT_TO_FLOAT64: stack
+       [=freg, freg] -> {
                x86_alu_reg_imm(inst, X86_SUB, X86_ESP, sizeof(jit_float64));
                x86_fst_membase(inst, X86_ESP, 0, 1, 1);
                x86_fld_membase(inst, X86_ESP, 0, 1);
@@ -1399,19 +1503,10 @@
 JIT_OP_RETHROW: manual
        [] -> { /* Not used in native code back ends */ }
 
-JIT_OP_LOAD_PC: manual
-       [] -> {
-               unsigned char *inst;
-               int reg = _jit_regs_dest_value(gen, insn->dest);
-               inst = gen->posn.ptr;
-               if(!jit_cache_check_for_n(&(gen->posn), 32))
-               {
-                       jit_cache_mark_full(&(gen->posn));
-                       return;
-               }
+JIT_OP_LOAD_PC:
+       [=reg] -> {
                x86_call_imm(inst, 0);
-               x86_pop_reg(inst, _jit_reg_info[reg].cpu_reg);
-               gen->posn.ptr = inst;
+               x86_pop_reg(inst, $1);
        }
 
 JIT_OP_LOAD_EXCEPTION_PC: manual




reply via email to

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