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-gen-x86.h jit/jit-rule...


From: Aleksey Demakov
Subject: [dotgnu-pnet-commits] libjit ChangeLog jit/jit-gen-x86.h jit/jit-rule...
Date: Sun, 23 Dec 2007 18:18:45 +0000

CVSROOT:        /sources/dotgnu-pnet
Module name:    libjit
Changes by:     Aleksey Demakov <avd>   07/12/23 18:18:45

Modified files:
        .              : ChangeLog 
        jit            : jit-gen-x86.h jit-rules-x86.ins 

Log message:
        add x86 JIT_OP_NFLOAT_TO_INT and JIT_OP_NFLOAT_TO_LONG rules

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/libjit/ChangeLog?cvsroot=dotgnu-pnet&r1=1.328&r2=1.329
http://cvs.savannah.gnu.org/viewcvs/libjit/jit/jit-gen-x86.h?cvsroot=dotgnu-pnet&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/libjit/jit/jit-rules-x86.ins?cvsroot=dotgnu-pnet&r1=1.31&r2=1.32

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/ChangeLog,v
retrieving revision 1.328
retrieving revision 1.329
diff -u -b -r1.328 -r1.329
--- ChangeLog   21 Dec 2007 06:42:45 -0000      1.328
+++ ChangeLog   23 Dec 2007 18:18:44 -0000      1.329
@@ -1,3 +1,9 @@
+2007-12-24  Aleksey Demakov  <address@hidden>
+
+       * jit/jit-gen-x86.h (x86_alu_reg16_imm): add macro.
+       * jit/jit-rules-x86.ins: add JIT_OP_NFLOAT_TO_INT and
+       JIT_OP_NFLOAT_TO_LONG rules.
+
 2007-12-21  Aleksey Demakov  <address@hidden>
 
        * jit/jit-internal.h, jit/jit-context.c, jit/jit-function.c: 

Index: jit/jit-gen-x86.h
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/jit/jit-gen-x86.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- jit/jit-gen-x86.h   26 Feb 2006 07:59:09 -0000      1.6
+++ jit/jit-gen-x86.h   23 Dec 2007 18:18:45 -0000      1.7
@@ -540,6 +540,25 @@
                }       \
        } while (0)
 
+#define x86_alu_reg16_imm(inst,opc,reg,imm)    \
+       do {    \
+               *(inst)++ = (unsigned char)0x66;        \
+               if ((reg) == X86_EAX) { \
+                       *(inst)++ = (((unsigned char)(opc)) << 3) + 5;  \
+                       x86_imm_emit16 ((inst), (imm)); \
+                       break;  \
+               }       \
+               if (x86_is_imm8((imm))) {       \
+                       *(inst)++ = (unsigned char)0x83;        \
+                       x86_reg_emit ((inst), (opc), (reg));    \
+                       x86_imm_emit8 ((inst), (imm));  \
+               } else {        \
+                       *(inst)++ = (unsigned char)0x81;        \
+                       x86_reg_emit ((inst), (opc), (reg));    \
+                       x86_imm_emit16 ((inst), (imm)); \
+               }       \
+       } while (0)
+
 #define x86_alu_mem_imm(inst,opc,mem,imm)      \
        do {    \
                if (x86_is_imm8((imm))) {       \

Index: jit/jit-rules-x86.ins
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/jit/jit-rules-x86.ins,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -b -r1.31 -r1.32
--- jit/jit-rules-x86.ins       7 Oct 2007 14:01:03 -0000       1.31
+++ jit/jit-rules-x86.ins       23 Dec 2007 18:18:45 -0000      1.32
@@ -141,6 +141,49 @@
                x86_clear_reg(inst, %1);
        }
 
+JIT_OP_NFLOAT_TO_INT: stack
+       [=reg, freg] -> {
+               /* allocate space on the stack for 2 shorts and 1 int */
+               x86_alu_reg_imm(inst, X86_SUB, X86_ESP, 8);
+               /* store FPU control word */
+               x86_fnstcw_membase(inst, X86_ESP, 0);
+               /* set "round toward zero" mode */
+               x86_mov_reg_membase(inst, $1, X86_ESP, 0, 2);
+               x86_alu_reg16_imm(inst, X86_OR, $1, 0xc00);
+               x86_mov_membase_reg(inst, X86_ESP, 2, $1, 2);
+               x86_fldcw_membase(inst, X86_ESP, 2);
+               /* convert float to int */
+               x86_fist_pop_membase(inst, X86_ESP, 4, 0);
+               /* restore FPU control word */
+               x86_fldcw_membase(inst, X86_ESP, 0);
+               /* move result to the destination */
+               x86_mov_reg_membase(inst, $1, X86_ESP, 4, 4);
+               /* restore the stack */
+               x86_alu_reg_imm(inst, X86_ADD, X86_ESP, 8);
+       }
+
+JIT_OP_NFLOAT_TO_LONG: stack
+       [=lreg, freg] -> {
+               /* allocate space on the stack for 2 shorts and 1 long */
+               x86_alu_reg_imm(inst, X86_SUB, X86_ESP, 12);
+               /* store FPU control word */
+               x86_fnstcw_membase(inst, X86_ESP, 0);
+               /* set "round toward zero" mode */
+               x86_mov_reg_membase(inst, $1, X86_ESP, 0, 2);
+               x86_alu_reg16_imm(inst, X86_OR, $1, 0xc00);
+               x86_mov_membase_reg(inst, X86_ESP, 2, $1, 2);
+               x86_fldcw_membase(inst, X86_ESP, 2);
+               /* convert float to long */
+               x86_fist_pop_membase(inst, X86_ESP, 4, 1);
+               /* restore FPU control word */
+               x86_fldcw_membase(inst, X86_ESP, 0);
+               /* move result to the destination */
+               x86_mov_reg_membase(inst, $1, X86_ESP, 4, 4);
+               x86_mov_reg_membase(inst, %1, X86_ESP, 8, 4);
+               /* restore the stack */
+               x86_alu_reg_imm(inst, X86_ADD, X86_ESP, 12);
+       }
+
 JIT_OP_INT_TO_NFLOAT:
        [=freg, local] -> {
                x86_fild_membase(inst, X86_EBP, $2, 0);
@@ -1449,12 +1492,18 @@
 
 JIT_OP_CHECK_NULL: note
        [reg] -> {
+#if 0 && defined(JIT_USE_SIGNALS)
+               /* if $1 contains NULL this generates SEGV and the signal
+                  handler will throw the exception  */
+               x86_alu_reg_membase(inst, X86_CMP, $1, $1, 0);
+#else
                unsigned char *patch;
                x86_alu_reg_reg(inst, X86_OR, $1, $1);
                patch = inst;
                x86_branch8(inst, X86_CC_NE, 0, 0);
                inst = throw_builtin(inst, func, JIT_RESULT_NULL_REFERENCE);
                x86_patch(patch, inst);
+#endif
        }
 
 /*




reply via email to

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