[Top][All Lists]
[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
}
/*
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [dotgnu-pnet-commits] libjit ChangeLog jit/jit-gen-x86.h jit/jit-rule...,
Aleksey Demakov <=