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.sel


From: Aleksey Demakov
Subject: [dotgnu-pnet-commits] libjit ./ChangeLog jit/jit-rules-x86.sel
Date: Wed, 28 Dec 2005 14:11:39 +0000

CVSROOT:        /sources/dotgnu-pnet
Module name:    libjit
Branch:         
Changes by:     Aleksey Demakov <address@hidden>        05/12/28 14:11:39

Modified files:
        .              : ChangeLog 
        jit            : jit-rules-x86.sel 

Log message:
        implement JIT_OP_MEMMOVE

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/libjit/ChangeLog.diff?tr1=1.185&tr2=1.186&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/libjit/jit/jit-rules-x86.sel.diff?tr1=1.36&tr2=1.37&r1=text&r2=text

Patches:
Index: libjit/ChangeLog
diff -u libjit/ChangeLog:1.185 libjit/ChangeLog:1.186
--- libjit/ChangeLog:1.185      Sat Dec 24 06:55:13 2005
+++ libjit/ChangeLog    Wed Dec 28 14:11:38 2005
@@ -1,3 +1,8 @@
+2005-12-28  Aleksey Demakov  <address@hidden>
+
+       * jit/jit-rules-x86.sel: implement JIT_OP_MEMMOVE rule. Get rid of
+       compiler warnings in JIT_OP_MEMSET.
+
 2005-12-24  Avinash Atreya  <address@hidden>
 
        * dpas/dpas-parser.y: implement array expressions (committed by Aleksey
Index: libjit/jit/jit-rules-x86.sel
diff -u libjit/jit/jit-rules-x86.sel:1.36 libjit/jit/jit-rules-x86.sel:1.37
--- libjit/jit/jit-rules-x86.sel:1.36   Thu Dec 22 08:24:28 2005
+++ libjit/jit/jit-rules-x86.sel        Wed Dec 28 14:11:38 2005
@@ -3146,8 +3146,37 @@
 
 JIT_OP_MEMMOVE: manual
        [] -> {
-               /* TODO */
-               TODO();
+               unsigned char *inst;
+               int reg, reg2, reg3;
+
+               reg = _jit_regs_load_value
+                       (gen, insn->dest, 0,
+                        (insn->flags & (JIT_INSN_DEST_NEXT_USE | 
JIT_INSN_DEST_LIVE)));
+               reg2 = _jit_regs_load_value
+                       (gen, insn->value1, 0,
+                        (insn->flags & (JIT_INSN_VALUE1_NEXT_USE | 
JIT_INSN_VALUE1_LIVE)));
+               reg3 = _jit_regs_load_value
+                       (gen, insn->value2, 0,
+                        (insn->flags & (JIT_INSN_VALUE2_NEXT_USE | 
JIT_INSN_VALUE2_LIVE)));
+
+               /* A function call may destroy EAX,EBX,ECX,EDX registers. */
+               /* TODO: do not spill ESI and EDI. */
+               _jit_regs_spill_all(gen);
+
+               inst = gen->posn.ptr;
+               if(!jit_cache_check_for_n(&(gen->posn), 32))
+               {
+                       jit_cache_mark_full(&(gen->posn));
+                       return;
+               }
+
+               x86_push_reg(inst, _jit_reg_info[reg3].cpu_reg);
+               x86_push_reg(inst, _jit_reg_info[reg2].cpu_reg);
+               x86_push_reg(inst, _jit_reg_info[reg].cpu_reg);
+               x86_call_code(inst, jit_memmove);
+               x86_alu_reg_imm(inst, X86_ADD, X86_ESP, 3 * sizeof(void *));
+
+               gen->posn.ptr = inst;
        }
 
 JIT_OP_MEMSET: manual
@@ -3162,12 +3191,14 @@
                }
                else if(insn->value2->is_constant && insn->value2->address <= 
32)
                {
-                       save_reg3 = 0;
-
                        reg = _jit_regs_load_value
                                (gen, insn->dest, 0,
                                 (insn->flags & (JIT_INSN_DEST_NEXT_USE | 
JIT_INSN_DEST_LIVE)));
 
+                       reg2 = -1;
+                       reg3 = -1;
+                       save_reg3 = 0;
+
                        if(insn->value1->is_constant)
                        {
                                inst = gen->posn.ptr;
@@ -3309,6 +3340,9 @@
                        reg3 = _jit_regs_load_value
                                (gen, insn->value2, 0,
                                 (insn->flags & (JIT_INSN_VALUE2_NEXT_USE | 
JIT_INSN_VALUE2_LIVE)));
+
+                       /* A function call may destroy EAX,EBX,ECX,EDX 
registers. */
+                       /* TODO: do not spill ESI and EDI. */
                        _jit_regs_spill_all(gen);
 
                        inst = gen->posn.ptr;




reply via email to

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