* src/vm/options.h, src/vm/options.c (opt_prof): Added.
authortwisti <none@none>
Mon, 30 Jan 2006 15:44:52 +0000 (15:44 +0000)
committertwisti <none@none>
Mon, 30 Jan 2006 15:44:52 +0000 (15:44 +0000)
* src/cacao/cacao.c (OPT_PROF): Added.
(exit_handler): Added profile_printstats when opt_prof is enabled.

* src/vm/class.h (classinfo): Members classUsed and impldBy removed.
* src/vm/loader.c (load_class_from_classbuffer): Likewise.
* src/vm/linker.c (link_primitivetype_table): Likewise.
(link_class_intern): Likewise.
* src/vm/jit/inline/inline.c: Likewise.

* src/vm/method.h (methodinfo): Added member executioncount.

* src/vm/jit/x86_64/codegen.c (codegen): Added profiling code.  Some
code reordering, using more macros and save some code space.
* src/vm/jit/x86_64/codegen.h (M_ILD32, M_LLD32, M_IST_IMM, M_IST32)
(M_LST32, M_IST32_IMM, M_LST32_IMM32, M_IINC_MEMBASE, M_ITEST)
(M_CMP_IMM_MEMBASE, M_ICMP, M_ICMP_IMM, M_ICMP_IMM_MEMBASE, M_CMOVEQ)
(M_CMOVNE, M_CMOVLT, M_CMOVLE, M_CMOVGE, M_CMOVGT, M_CMOVB, M_CMOVA)
(M_CMOVP, M_CLR): Added.

* src/vm/jit/x86_64/emitfuncs.c (x86_64_emit_ifcc): Use macros.
(x86_64_call_mem): Changed mem argument to ptrint type.
* src/vm/jit/x86_64/emitfuncs.h (x86_64_call_mem): Likewise.

* src/vm/jit/profile.c, src/vm/jit/profile.h: New files.
* src/vm/jit/Makefile.am (DISASS_OBJ): Renamed to DISASS_SOURCES.
(PROFILE_SOURCES): Added.

15 files changed:
src/cacao/cacao.c
src/vm/class.h
src/vm/jit/Makefile.am
src/vm/jit/inline/inline.c
src/vm/jit/profile.c [new file with mode: 0644]
src/vm/jit/profile.h [new file with mode: 0644]
src/vm/jit/x86_64/codegen.c
src/vm/jit/x86_64/codegen.h
src/vm/jit/x86_64/emitfuncs.c
src/vm/jit/x86_64/emitfuncs.h
src/vm/linker.c
src/vm/loader.c
src/vm/method.h
src/vm/options.c
src/vm/options.h

index 183ba52a8707a5caaeeae4497a2ddf78d726a670..153c2fd9ce43bf8b7718d7269d95a0d7bb207627 100644 (file)
@@ -37,7 +37,7 @@
      - Calling the class loader
      - Running the main method
 
-   $Id: cacao.c 4357 2006-01-22 23:33:38Z twisti $
+   $Id: cacao.c 4388 2006-01-30 15:44:52Z twisti $
 
 */
 
@@ -79,6 +79,7 @@
 #include "vm/suck.h"
 #include "vm/jit/asmpart.h"
 #include "vm/jit/jit.h"
+#include "vm/jit/profile.h"
 
 #ifdef TYPEINFO_DEBUG_TEST
 #include "vm/jit/verify/typeinfo.h"
@@ -178,6 +179,8 @@ enum {
        OPT_JIT,
        OPT_INTRP,
 
+       OPT_PROF,
+
 #if defined(ENABLE_INTRP)
        /* interpreter options */
 
@@ -274,6 +277,7 @@ opt_struct opts[] = {
 #endif 
        { "Xms",               true,  OPT_MS },
        { "Xmx",               true,  OPT_MX },
+       { "Xprof",             false, OPT_PROF },
        { "Xss",               true,  OPT_SS },
        { "ms",                true,  OPT_MS },
        { "mx",                true,  OPT_MX },
@@ -391,6 +395,7 @@ static void Xusage(void)
        printf("    -Xms<size>        set the initial size of the heap (default: 2MB)\n");
        printf("    -Xmx<size>        set the maximum size of the heap (default: 64MB)\n");
        printf("    -Xss<size>        set the thread stack size (default: 128kB)\n");
+       printf("    -Xprof            collect and print profiling data\n");
 #if defined(ENABLE_JVMTI)
        printf("    -Xdebug<transport> enable remote debugging\n");
 #endif 
@@ -1045,6 +1050,10 @@ int main(int argc, char **argv)
                        Xusage();
                        break;
 
+               case OPT_PROF:
+                       opt_prof = true;
+                       break;
+
                case OPT_JIT:
 #if defined(ENABLE_JIT)
                        opt_jit = true;
@@ -1649,6 +1658,9 @@ void exit_handler(void)
 
        if (showutf)
                utf_show();
+
+       if (opt_prof)
+               profile_printstats();
 #endif
 
 #if defined(USE_THREADS) && !defined(NATIVE_THREADS)
index 2952e0103a10c4883920262a66a8cf7006d7747f..73f2ef30fa7c29ed92c274978723e7281c8d1f3d 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: class.h 4357 2006-01-22 23:33:38Z twisti $
+   $Id: class.h 4388 2006-01-30 15:44:52Z twisti $
 
 */
 
@@ -118,12 +118,6 @@ struct classinfo {                /* class structure                          */
        u2          innerclasscount;  /* number of inner classes                  */
        innerclassinfo *innerclass;
 
-       s4          classUsed;        /* 0= not used 1 = used   CO-RT             */
-
-       classSetNode *impldBy;        /* interface class implemented by class set */
-                                     /*   Object class 's impldBy is list of all */
-                                     /*   interface classes used (RT & XTA only  */
-                                     /*     normally no list of interfaces used) */
        utf        *packagename;      /* full name of the package                 */
        utf        *sourcefile;       /* classfile name containing this class     */
        java_objectheader *classloader; /* NULL for bootstrap classloader         */
index 5728d0148910e52c945503dacab31833bdf68ce0..6e8df9bfb9c771c1728aeabb4ccd9387dc7c0345 100644 (file)
@@ -28,7 +28,7 @@
 ##
 ## Changes:
 ##
-## $Id: Makefile.am 4357 2006-01-22 23:33:38Z twisti $
+## $Id: Makefile.am 4388 2006-01-30 15:44:52Z twisti $
 
 ## Process this file with automake to produce Makefile.in
 
@@ -75,11 +75,15 @@ SCHEDULE_LIB = schedule/libschedule.la
 endif
 
 if WITH_BINUTILS_DISASSEMBLER
-DISASS_OBJ = disass-common.c
+DISASS_SOURCES = disass-common.c
 else
-DISASS_OBJ =
+DISASS_SOURCES =
 endif
 
+PROFILE_SOURCES = \
+       profile.c \
+       profile.h
+
 noinst_HEADERS = \
        abi.h \
        asmpart.h \
@@ -92,13 +96,14 @@ libjit_la_SOURCES = \
        codegen-common.c \
        codegen-common.h \
        disass.h \
-       $(DISASS_OBJ) \
+       $(DISASS_SOURCES) \
        dseg.c \
        dseg.h \
        jit.c \
        jit.h \
        parse.c \
        parse.h \
+       $(PROFILE_SOURCES) \
        reg.c \
        reg.h \
        stack.c \
index 88b3a4f475baabc1f0f9e76268a426e182299d7c..701d266f6076ae33fc82f04ef465a7ba4082e4c8 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Christian Thalinger
 
-   $Id: inline.c 4381 2006-01-28 14:18:06Z twisti $
+   $Id: inline.c 4388 2006-01-30 15:44:52Z twisti $
 
 */
 
@@ -300,7 +300,7 @@ utf* desc = m->descriptor;
 int cnt = 0;  /* number of times method found in USED classes in hierarchy*/
 classinfo *subs1;         
 
-if ((m->class == class) && (class->classUsed == USED)) {
+if ((m->class == class)/*  && (class->classUsed == USED) */) {
        /* found method in current class, which is used */
        if (*mout != m) {
                cnt++;
@@ -310,7 +310,7 @@ if ((m->class == class) && (class->classUsed == USED)) {
 
 if ( ((m->flags & ACC_FINAL)  
 ||    (class->sub == NULL))
-&& (class->classUsed == USED)) {
+/* && (class->classUsed == USED) */) {
        /* if final search no further */
        if (*mout != m) {
                cnt++;
@@ -325,7 +325,7 @@ for (subs1 = class->sub;subs1 != NULL;subs1 = subs1->nextsub) {
        classinfo *subs = subs1;           
         sm = class_resolveclassmethod(subs,name,desc,class,false);
         if (sm != NULL) {
-               if ((subs->classUsed == USED) && 
+               if (/* (subs->classUsed == USED) &&  */
                    (*mout != sm)) {
                        *mout = sm;
                        cnt++;
@@ -350,7 +350,8 @@ utf* desc = mi->descriptor;
        classSetNode *classImplNode;
        int icnt = 0;
 
-       for (classImplNode  = mi->class->impldBy;
+/*     for (classImplNode  = mi->class->impldBy; */
+       for (classImplNode  = NULL;
             classImplNode != NULL;                     
             classImplNode  = classImplNode->nextClass) {
 
diff --git a/src/vm/jit/profile.c b/src/vm/jit/profile.c
new file mode 100644 (file)
index 0000000..e1e568c
--- /dev/null
@@ -0,0 +1,108 @@
+/* src/vm/jit/profile.c - runtime profiling
+
+   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
+   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
+   J. Wenninger, J. Wenninger, Institut f. Computersprachen - TU Wien
+
+   This file is part of CACAO.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
+
+   Contact: cacao@cacaojvm.org
+
+   Authors: Christian Thalinger
+
+   Changes:
+
+   $Id: cacao.c 4357 2006-01-22 23:33:38Z twisti $
+
+*/
+
+
+#include "config.h"
+
+#include <assert.h>
+
+#include "vm/types.h"
+
+#include "vm/class.h"
+#include "vm/classcache.h"
+#include "vm/method.h"
+
+
+/* profile_printstats **********************************************************
+
+   Prints profiling statistics gathered during runtime.
+
+*******************************************************************************/
+
+#if !defined(NDEBUG)
+void profile_printstats(void)
+{
+       classinfo              *c;
+       methodinfo             *m;
+       u4                      slot;
+       s4                      i;
+       classcache_name_entry  *nmen;
+       classcache_class_entry *clsen;
+
+       for (slot = 0; slot < hashtable_classcache.size; slot++) {
+               nmen = (classcache_name_entry *) hashtable_classcache.ptr[slot];
+
+               for (; nmen; nmen = nmen->hashlink) {
+                       /* iterate over all class entries */
+
+                       for (clsen = nmen->classes; clsen; clsen = clsen->next) {
+                               c = clsen->classobj;
+
+                               if (!c)
+                                       continue;
+
+                               /* compile all class methods */
+
+                               for (i = 0; i < c->methodscount; i++) {
+                                       m = &(c->methods[i]);
+
+                                       /* was this method actually called? */
+
+                                       if (m->executioncount > 0) {
+                                               printf("%10d   ", m->executioncount);
+                                               method_println(m);
+
+                                               /* XXX quick hack for multiple classinfo entries */
+                                               m->executioncount = 0;
+                                       }
+                               }
+                       }
+               }
+       }
+}
+#endif /* !defined(NDEBUG) */
+
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */
diff --git a/src/vm/jit/profile.h b/src/vm/jit/profile.h
new file mode 100644 (file)
index 0000000..09ed7ba
--- /dev/null
@@ -0,0 +1,63 @@
+/* src/vm/jit/profile.h - runtime profiling
+
+   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
+   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
+   J. Wenninger, J. Wenninger, Institut f. Computersprachen - TU Wien
+
+   This file is part of CACAO.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
+
+   Contact: cacao@cacaojvm.org
+
+   Authors: Christian Thalinger
+
+   Changes:
+
+   $Id: cacao.c 4357 2006-01-22 23:33:38Z twisti $
+
+*/
+
+
+#ifndef _PROFILE_H
+#define _PROFILE_H
+
+#include "config.h"
+#include "vm/types.h"
+
+
+/* function prototypes ********************************************************/
+
+#if !defined(NDEBUG)
+void profile_printstats(void);
+#endif
+
+#endif /* _PROFILE_H */
+
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */
index fe30a92e52028040086d0374703330fa21ec41df..cacc6194d2695b6ed777bda8bed0108a55425fa7 100644 (file)
@@ -29,7 +29,7 @@
 
    Changes: Christian Ullrich
 
-   $Id: codegen.c 4357 2006-01-22 23:33:38Z twisti $
+   $Id: codegen.c 4388 2006-01-30 15:44:52Z twisti $
 
 */
 
@@ -164,12 +164,18 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
        
        cd->mcodeptr = (u1 *) cd->mcodebase;
        cd->mcodeend = (s4 *) (cd->mcodebase + cd->mcodesize);
-       MCODECHECK(512);
 
        /* initialize the last patcher pointer */
 
        cd->lastmcodeptr = cd->mcodeptr;
 
+       /* generate profiling code */
+
+       if (opt_prof) {
+               M_MOV_IMM((ptrint) m, REG_ITMP1);
+               M_IINC_MEMBASE(REG_ITMP1, OFFSET(methodinfo, executioncount));
+       }
+
        /* create stack frame (if necessary) */
 
        if (parentargs_base)
@@ -262,19 +268,19 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                /* decide which monitor enter function to call */
 
                if (m->flags & ACC_STATIC) {
-                       x86_64_mov_imm_reg(cd, (ptrint) m->class, REG_ITMP1);
-                       x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, s1 * 8);
+                       M_MOV_IMM((ptrint) m->class, REG_ITMP1);
+                       M_AST(REG_ITMP1, REG_SP, s1 * 8);
                        M_INTMOVE(REG_ITMP1, rd->argintregs[0]);
-                       x86_64_mov_imm_reg(cd, (ptrint) BUILTIN_staticmonitorenter, REG_ITMP1);
-                       x86_64_call_reg(cd, REG_ITMP1);
+                       M_MOV_IMM((ptrint) BUILTIN_staticmonitorenter, REG_ITMP1);
+                       M_CALL(REG_ITMP1);
 
                } else {
-                       x86_64_test_reg_reg(cd, rd->argintregs[0], rd->argintregs[0]);
+                       M_TEST(rd->argintregs[0]);
                        x86_64_jcc(cd, X86_64_CC_Z, 0);
                        codegen_addxnullrefs(cd, cd->mcodeptr);
-                       x86_64_mov_reg_membase(cd, rd->argintregs[0], REG_SP, s1 * 8);
-                       x86_64_mov_imm_reg(cd, (ptrint) BUILTIN_monitorenter, REG_ITMP1);
-                       x86_64_call_reg(cd, REG_ITMP1);
+                       M_AST(rd->argintregs[0], REG_SP, s1 * 8);
+                       M_MOV_IMM((ptrint) BUILTIN_monitorenter, REG_ITMP1);
+                       M_CALL(REG_ITMP1);
                }
 
                if (runverbose) {
@@ -289,8 +295,8 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
        }
 #endif
 
-       /* Copy argument registers to stack and call trace function with pointer  */
-       /* to arguments on stack.                                                 */
+       /* Copy argument registers to stack and call trace function with
+          pointer to arguments on stack. */
 
        if (runverbose || opt_stat) {
                M_LSUB_IMM((INT_ARG_CNT + FLT_ARG_CNT + INT_TMP_CNT + FLT_TMP_CNT + 1 + 1) * 8, REG_SP);
@@ -371,6 +377,7 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
        /* end of header generation */
 
        /* walk through all basic blocks */
+
        for (bptr = m->basicblocks; bptr != NULL; bptr = bptr->next) {
 
                bptr->mpc = (u4) ((u1 *) cd->mcodeptr - cd->mcodebase);
@@ -506,11 +513,10 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                      /* op1 = 0, val.i = constant                    */
 
                        d = reg_of_var(rd, iptr->dst, REG_ITMP1);
-                       if (iptr->val.i == 0) {
+                       if (iptr->val.i == 0)
                                M_XOR(d, d);
-                       } else {
+                       else
                                M_IMOV_IMM(iptr->val.i, d);
-                       }
                        store_reg_to_var_int(iptr->dst, d);
                        break;
 
@@ -518,11 +524,10 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                      /* op1 = 0, val.l = constant                    */
 
                        d = reg_of_var(rd, iptr->dst, REG_ITMP1);
-                       if (iptr->val.l == 0) {
+                       if (iptr->val.l == 0)
                                M_XOR(d, d);
-                       } else {
+                       else
                                M_MOV_IMM(iptr->val.l, d);
-                       }
                        store_reg_to_var_int(iptr->dst, d);
                        break;
 
@@ -1911,13 +1916,13 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                        var_to_reg_flt(s1, src->prev, REG_FTMP1);
                        var_to_reg_flt(s2, src, REG_FTMP2);
                        d = reg_of_var(rd, iptr->dst, REG_ITMP3);
-                       x86_64_alu_reg_reg(cd, X86_64_XOR, d, d);
-                       x86_64_mov_imm_reg(cd, 1, REG_ITMP1);
-                       x86_64_mov_imm_reg(cd, -1, REG_ITMP2);
+                       M_CLR(d);
+                       M_MOV_IMM(1, REG_ITMP1);
+                       M_MOV_IMM(-1, REG_ITMP2);
                        x86_64_ucomiss_reg_reg(cd, s1, s2);
-                       x86_64_cmovcc_reg_reg(cd, X86_64_CC_B, REG_ITMP1, d);
-                       x86_64_cmovcc_reg_reg(cd, X86_64_CC_A, REG_ITMP2, d);
-                       x86_64_cmovcc_reg_reg(cd, X86_64_CC_P, REG_ITMP2, d);    /* treat unordered as GT */
+                       M_CMOVB(REG_ITMP1, d);
+                       M_CMOVA(REG_ITMP2, d);
+                       M_CMOVP(REG_ITMP2, d);                   /* treat unordered as GT */
                        store_reg_to_var_int(iptr->dst, d);
                        break;
 
@@ -1927,13 +1932,13 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                        var_to_reg_flt(s1, src->prev, REG_FTMP1);
                        var_to_reg_flt(s2, src, REG_FTMP2);
                        d = reg_of_var(rd, iptr->dst, REG_ITMP3);
-                       x86_64_alu_reg_reg(cd, X86_64_XOR, d, d);
-                       x86_64_mov_imm_reg(cd, 1, REG_ITMP1);
-                       x86_64_mov_imm_reg(cd, -1, REG_ITMP2);
+                       M_CLR(d);
+                       M_MOV_IMM(1, REG_ITMP1);
+                       M_MOV_IMM(-1, REG_ITMP2);
                        x86_64_ucomiss_reg_reg(cd, s1, s2);
-                       x86_64_cmovcc_reg_reg(cd, X86_64_CC_B, REG_ITMP1, d);
-                       x86_64_cmovcc_reg_reg(cd, X86_64_CC_A, REG_ITMP2, d);
-                       x86_64_cmovcc_reg_reg(cd, X86_64_CC_P, REG_ITMP1, d);    /* treat unordered as LT */
+                       M_CMOVB(REG_ITMP1, d);
+                       M_CMOVA(REG_ITMP2, d);
+                       M_CMOVP(REG_ITMP1, d);                   /* treat unordered as LT */
                        store_reg_to_var_int(iptr->dst, d);
                        break;
 
@@ -1943,13 +1948,13 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                        var_to_reg_flt(s1, src->prev, REG_FTMP1);
                        var_to_reg_flt(s2, src, REG_FTMP2);
                        d = reg_of_var(rd, iptr->dst, REG_ITMP3);
-                       x86_64_alu_reg_reg(cd, X86_64_XOR, d, d);
-                       x86_64_mov_imm_reg(cd, 1, REG_ITMP1);
-                       x86_64_mov_imm_reg(cd, -1, REG_ITMP2);
+                       M_CLR(d);
+                       M_MOV_IMM(1, REG_ITMP1);
+                       M_MOV_IMM(-1, REG_ITMP2);
                        x86_64_ucomisd_reg_reg(cd, s1, s2);
-                       x86_64_cmovcc_reg_reg(cd, X86_64_CC_B, REG_ITMP1, d);
-                       x86_64_cmovcc_reg_reg(cd, X86_64_CC_A, REG_ITMP2, d);
-                       x86_64_cmovcc_reg_reg(cd, X86_64_CC_P, REG_ITMP2, d);    /* treat unordered as GT */
+                       M_CMOVB(REG_ITMP1, d);
+                       M_CMOVA(REG_ITMP2, d);
+                       M_CMOVP(REG_ITMP2, d);                   /* treat unordered as GT */
                        store_reg_to_var_int(iptr->dst, d);
                        break;
 
@@ -1959,13 +1964,13 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                        var_to_reg_flt(s1, src->prev, REG_FTMP1);
                        var_to_reg_flt(s2, src, REG_FTMP2);
                        d = reg_of_var(rd, iptr->dst, REG_ITMP3);
-                       x86_64_alu_reg_reg(cd, X86_64_XOR, d, d);
-                       x86_64_mov_imm_reg(cd, 1, REG_ITMP1);
-                       x86_64_mov_imm_reg(cd, -1, REG_ITMP2);
+                       M_CLR(d);
+                       M_MOV_IMM(1, REG_ITMP1);
+                       M_MOV_IMM(-1, REG_ITMP2);
                        x86_64_ucomisd_reg_reg(cd, s1, s2);
-                       x86_64_cmovcc_reg_reg(cd, X86_64_CC_B, REG_ITMP1, d);
-                       x86_64_cmovcc_reg_reg(cd, X86_64_CC_A, REG_ITMP2, d);
-                       x86_64_cmovcc_reg_reg(cd, X86_64_CC_P, REG_ITMP1, d);    /* treat unordered as LT */
+                       M_CMOVB(REG_ITMP1, d);
+                       M_CMOVA(REG_ITMP2, d);
+                       M_CMOVP(REG_ITMP1, d);                   /* treat unordered as LT */
                        store_reg_to_var_int(iptr->dst, d);
                        break;
 
@@ -1977,11 +1982,11 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                        var_to_reg_int(s1, src, REG_ITMP1);
                        d = reg_of_var(rd, iptr->dst, REG_ITMP3);
                        gen_nullptr_check(s1);
-                       x86_64_movl_membase_reg(cd, s1, OFFSET(java_arrayheader, size), d);
+                       M_ILD(d, s1, OFFSET(java_arrayheader, size));
                        store_reg_to_var_int(iptr->dst, d);
                        break;
 
-               case ICMD_AALOAD:     /* ..., arrayref, index  ==> ..., value         */
+               case ICMD_BALOAD:     /* ..., arrayref, index  ==> ..., value         */
 
                        var_to_reg_int(s1, src->prev, REG_ITMP1);
                        var_to_reg_int(s2, src, REG_ITMP2);
@@ -1990,11 +1995,11 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                gen_nullptr_check(s1);
                                gen_bound_check;
                        }
-                       x86_64_mov_memindex_reg(cd, OFFSET(java_objectarray, data[0]), s1, s2, 3, d);
+                       x86_64_movsbq_memindex_reg(cd, OFFSET(java_bytearray, data[0]), s1, s2, 0, d);
                        store_reg_to_var_int(iptr->dst, d);
                        break;
 
-               case ICMD_LALOAD:     /* ..., arrayref, index  ==> ..., value         */
+               case ICMD_CALOAD:     /* ..., arrayref, index  ==> ..., value         */
 
                        var_to_reg_int(s1, src->prev, REG_ITMP1);
                        var_to_reg_int(s2, src, REG_ITMP2);
@@ -2003,11 +2008,11 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                gen_nullptr_check(s1);
                                gen_bound_check;
                        }
-                       x86_64_mov_memindex_reg(cd, OFFSET(java_longarray, data[0]), s1, s2, 3, d);
+                       x86_64_movzwq_memindex_reg(cd, OFFSET(java_chararray, data[0]), s1, s2, 1, d);
                        store_reg_to_var_int(iptr->dst, d);
-                       break;
+                       break;                  
 
-               case ICMD_IALOAD:     /* ..., arrayref, index  ==> ..., value         */
+               case ICMD_SALOAD:     /* ..., arrayref, index  ==> ..., value         */
 
                        var_to_reg_int(s1, src->prev, REG_ITMP1);
                        var_to_reg_int(s2, src, REG_ITMP2);
@@ -2016,63 +2021,63 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                gen_nullptr_check(s1);
                                gen_bound_check;
                        }
-                       x86_64_movl_memindex_reg(cd, OFFSET(java_intarray, data[0]), s1, s2, 2, d);
+                       x86_64_movswq_memindex_reg(cd, OFFSET(java_shortarray, data[0]), s1, s2, 1, d);
                        store_reg_to_var_int(iptr->dst, d);
                        break;
 
-               case ICMD_FALOAD:     /* ..., arrayref, index  ==> ..., value         */
+               case ICMD_IALOAD:     /* ..., arrayref, index  ==> ..., value         */
 
                        var_to_reg_int(s1, src->prev, REG_ITMP1);
                        var_to_reg_int(s2, src, REG_ITMP2);
-                       d = reg_of_var(rd, iptr->dst, REG_FTMP3);
+                       d = reg_of_var(rd, iptr->dst, REG_ITMP3);
                        if (iptr->op1 == 0) {
                                gen_nullptr_check(s1);
                                gen_bound_check;
                        }
-                       x86_64_movss_memindex_reg(cd, OFFSET(java_floatarray, data[0]), s1, s2, 2, d);
-                       store_reg_to_var_flt(iptr->dst, d);
+                       x86_64_movl_memindex_reg(cd, OFFSET(java_intarray, data[0]), s1, s2, 2, d);
+                       store_reg_to_var_int(iptr->dst, d);
                        break;
 
-               case ICMD_DALOAD:     /* ..., arrayref, index  ==> ..., value         */
+               case ICMD_LALOAD:     /* ..., arrayref, index  ==> ..., value         */
 
                        var_to_reg_int(s1, src->prev, REG_ITMP1);
                        var_to_reg_int(s2, src, REG_ITMP2);
-                       d = reg_of_var(rd, iptr->dst, REG_FTMP3);
+                       d = reg_of_var(rd, iptr->dst, REG_ITMP3);
                        if (iptr->op1 == 0) {
                                gen_nullptr_check(s1);
                                gen_bound_check;
                        }
-                       x86_64_movsd_memindex_reg(cd, OFFSET(java_doublearray, data[0]), s1, s2, 3, d);
-                       store_reg_to_var_flt(iptr->dst, d);
+                       x86_64_mov_memindex_reg(cd, OFFSET(java_longarray, data[0]), s1, s2, 3, d);
+                       store_reg_to_var_int(iptr->dst, d);
                        break;
 
-               case ICMD_CALOAD:     /* ..., arrayref, index  ==> ..., value         */
+               case ICMD_FALOAD:     /* ..., arrayref, index  ==> ..., value         */
 
                        var_to_reg_int(s1, src->prev, REG_ITMP1);
                        var_to_reg_int(s2, src, REG_ITMP2);
-                       d = reg_of_var(rd, iptr->dst, REG_ITMP3);
+                       d = reg_of_var(rd, iptr->dst, REG_FTMP3);
                        if (iptr->op1 == 0) {
                                gen_nullptr_check(s1);
                                gen_bound_check;
                        }
-                       x86_64_movzwq_memindex_reg(cd, OFFSET(java_chararray, data[0]), s1, s2, 1, d);
-                       store_reg_to_var_int(iptr->dst, d);
-                       break;                  
+                       x86_64_movss_memindex_reg(cd, OFFSET(java_floatarray, data[0]), s1, s2, 2, d);
+                       store_reg_to_var_flt(iptr->dst, d);
+                       break;
 
-               case ICMD_SALOAD:     /* ..., arrayref, index  ==> ..., value         */
+               case ICMD_DALOAD:     /* ..., arrayref, index  ==> ..., value         */
 
                        var_to_reg_int(s1, src->prev, REG_ITMP1);
                        var_to_reg_int(s2, src, REG_ITMP2);
-                       d = reg_of_var(rd, iptr->dst, REG_ITMP3);
+                       d = reg_of_var(rd, iptr->dst, REG_FTMP3);
                        if (iptr->op1 == 0) {
                                gen_nullptr_check(s1);
                                gen_bound_check;
                        }
-                       x86_64_movswq_memindex_reg(cd, OFFSET(java_shortarray, data[0]), s1, s2, 1, d);
-                       store_reg_to_var_int(iptr->dst, d);
+                       x86_64_movsd_memindex_reg(cd, OFFSET(java_doublearray, data[0]), s1, s2, 3, d);
+                       store_reg_to_var_flt(iptr->dst, d);
                        break;
 
-               case ICMD_BALOAD:     /* ..., arrayref, index  ==> ..., value         */
+               case ICMD_AALOAD:     /* ..., arrayref, index  ==> ..., value         */
 
                        var_to_reg_int(s1, src->prev, REG_ITMP1);
                        var_to_reg_int(s2, src, REG_ITMP2);
@@ -2081,12 +2086,12 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                gen_nullptr_check(s1);
                                gen_bound_check;
                        }
-                       x86_64_movsbq_memindex_reg(cd, OFFSET(java_bytearray, data[0]), s1, s2, 0, d);
+                       x86_64_mov_memindex_reg(cd, OFFSET(java_objectarray, data[0]), s1, s2, 3, d);
                        store_reg_to_var_int(iptr->dst, d);
                        break;
 
 
-               case ICMD_LASTORE:    /* ..., arrayref, index, value  ==> ...         */
+               case ICMD_BASTORE:    /* ..., arrayref, index, value  ==> ...         */
 
                        var_to_reg_int(s1, src->prev->prev, REG_ITMP1);
                        var_to_reg_int(s2, src->prev, REG_ITMP2);
@@ -2095,10 +2100,10 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                gen_bound_check;
                        }
                        var_to_reg_int(s3, src, REG_ITMP3);
-                       x86_64_mov_reg_memindex(cd, s3, OFFSET(java_longarray, data[0]), s1, s2, 3);
+                       x86_64_movb_reg_memindex(cd, s3, OFFSET(java_bytearray, data[0]), s1, s2, 0);
                        break;
 
-               case ICMD_IASTORE:    /* ..., arrayref, index, value  ==> ...         */
+               case ICMD_CASTORE:    /* ..., arrayref, index, value  ==> ...         */
 
                        var_to_reg_int(s1, src->prev->prev, REG_ITMP1);
                        var_to_reg_int(s2, src->prev, REG_ITMP2);
@@ -2107,10 +2112,10 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                gen_bound_check;
                        }
                        var_to_reg_int(s3, src, REG_ITMP3);
-                       x86_64_movl_reg_memindex(cd, s3, OFFSET(java_intarray, data[0]), s1, s2, 2);
+                       x86_64_movw_reg_memindex(cd, s3, OFFSET(java_chararray, data[0]), s1, s2, 1);
                        break;
 
-               case ICMD_FASTORE:    /* ..., arrayref, index, value  ==> ...         */
+               case ICMD_SASTORE:    /* ..., arrayref, index, value  ==> ...         */
 
                        var_to_reg_int(s1, src->prev->prev, REG_ITMP1);
                        var_to_reg_int(s2, src->prev, REG_ITMP2);
@@ -2118,11 +2123,11 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                gen_nullptr_check(s1);
                                gen_bound_check;
                        }
-                       var_to_reg_flt(s3, src, REG_FTMP3);
-                       x86_64_movss_reg_memindex(cd, s3, OFFSET(java_floatarray, data[0]), s1, s2, 2);
+                       var_to_reg_int(s3, src, REG_ITMP3);
+                       x86_64_movw_reg_memindex(cd, s3, OFFSET(java_shortarray, data[0]), s1, s2, 1);
                        break;
 
-               case ICMD_DASTORE:    /* ..., arrayref, index, value  ==> ...         */
+               case ICMD_IASTORE:    /* ..., arrayref, index, value  ==> ...         */
 
                        var_to_reg_int(s1, src->prev->prev, REG_ITMP1);
                        var_to_reg_int(s2, src->prev, REG_ITMP2);
@@ -2130,11 +2135,11 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                gen_nullptr_check(s1);
                                gen_bound_check;
                        }
-                       var_to_reg_flt(s3, src, REG_FTMP3);
-                       x86_64_movsd_reg_memindex(cd, s3, OFFSET(java_doublearray, data[0]), s1, s2, 3);
+                       var_to_reg_int(s3, src, REG_ITMP3);
+                       x86_64_movl_reg_memindex(cd, s3, OFFSET(java_intarray, data[0]), s1, s2, 2);
                        break;
 
-               case ICMD_CASTORE:    /* ..., arrayref, index, value  ==> ...         */
+               case ICMD_LASTORE:    /* ..., arrayref, index, value  ==> ...         */
 
                        var_to_reg_int(s1, src->prev->prev, REG_ITMP1);
                        var_to_reg_int(s2, src->prev, REG_ITMP2);
@@ -2143,10 +2148,10 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                gen_bound_check;
                        }
                        var_to_reg_int(s3, src, REG_ITMP3);
-                       x86_64_movw_reg_memindex(cd, s3, OFFSET(java_chararray, data[0]), s1, s2, 1);
+                       x86_64_mov_reg_memindex(cd, s3, OFFSET(java_longarray, data[0]), s1, s2, 3);
                        break;
 
-               case ICMD_SASTORE:    /* ..., arrayref, index, value  ==> ...         */
+               case ICMD_FASTORE:    /* ..., arrayref, index, value  ==> ...         */
 
                        var_to_reg_int(s1, src->prev->prev, REG_ITMP1);
                        var_to_reg_int(s2, src->prev, REG_ITMP2);
@@ -2154,11 +2159,11 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                gen_nullptr_check(s1);
                                gen_bound_check;
                        }
-                       var_to_reg_int(s3, src, REG_ITMP3);
-                       x86_64_movw_reg_memindex(cd, s3, OFFSET(java_shortarray, data[0]), s1, s2, 1);
+                       var_to_reg_flt(s3, src, REG_FTMP3);
+                       x86_64_movss_reg_memindex(cd, s3, OFFSET(java_floatarray, data[0]), s1, s2, 2);
                        break;
 
-               case ICMD_BASTORE:    /* ..., arrayref, index, value  ==> ...         */
+               case ICMD_DASTORE:    /* ..., arrayref, index, value  ==> ...         */
 
                        var_to_reg_int(s1, src->prev->prev, REG_ITMP1);
                        var_to_reg_int(s2, src->prev, REG_ITMP2);
@@ -2166,8 +2171,8 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                gen_nullptr_check(s1);
                                gen_bound_check;
                        }
-                       var_to_reg_int(s3, src, REG_ITMP3);
-                       x86_64_movb_reg_memindex(cd, s3, OFFSET(java_bytearray, data[0]), s1, s2, 0);
+                       var_to_reg_flt(s3, src, REG_FTMP3);
+                       x86_64_movsd_reg_memindex(cd, s3, OFFSET(java_doublearray, data[0]), s1, s2, 3);
                        break;
 
                case ICMD_AASTORE:    /* ..., arrayref, index, value  ==> ...         */
@@ -2250,7 +2255,6 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
 
                        if (IS_IMM32(iptr->val.l)) {
                                x86_64_mov_imm_memindex(cd, (u4) (iptr->val.l & 0x00000000ffffffff), OFFSET(java_longarray, data[0]), s1, s2, 3);
-
                        } else {
                                x86_64_movl_imm_memindex(cd, (u4) (iptr->val.l & 0x00000000ffffffff), OFFSET(java_longarray, data[0]), s1, s2, 3);
                                x86_64_movl_imm_memindex(cd, (u4) (iptr->val.l >> 32), OFFSET(java_longarray, data[0]) + 4, s1, s2, 3);
@@ -2272,7 +2276,7 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                case ICMD_GETSTATIC:  /* ...  ==> ..., value                          */
                                      /* op1 = type, val.a = field address            */
 
-                       if (!iptr->val.a) {
+                       if (iptr->val.a == NULL) {
                                disp = dseg_addaddress(cd, NULL);
 
                                codegen_addpatchref(cd, cd->mcodeptr,
@@ -2298,19 +2302,19 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                }
                        }
 
-                       /* This approach is much faster than moving the field address     */
-                       /* inline into a register. */
+                       /* This approach is much faster than moving the field
+                          address inline into a register. */
                        x86_64_mov_membase_reg(cd, RIP, -(((ptrint) cd->mcodeptr + 7) - (ptrint) cd->mcodebase) + disp, REG_ITMP2);
                        switch (iptr->op1) {
                        case TYPE_INT:
                                d = reg_of_var(rd, iptr->dst, REG_ITMP1);
-                               x86_64_movl_membase_reg(cd, REG_ITMP2, 0, d);
+                               M_ILD(d, REG_ITMP2, 0);
                                store_reg_to_var_int(iptr->dst, d);
                                break;
                        case TYPE_LNG:
                        case TYPE_ADR:
                                d = reg_of_var(rd, iptr->dst, REG_ITMP1);
-                               x86_64_mov_membase_reg(cd, REG_ITMP2, 0, d);
+                               M_LLD(d, REG_ITMP2, 0);
                                store_reg_to_var_int(iptr->dst, d);
                                break;
                        case TYPE_FLT:
@@ -2329,7 +2333,7 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                case ICMD_PUTSTATIC:  /* ..., value  ==> ...                          */
                                      /* op1 = type, val.a = field address            */
 
-                       if (!iptr->val.a) {
+                       if (iptr->val.a == NULL) {
                                disp = dseg_addaddress(cd, NULL);
 
                                codegen_addpatchref(cd, cd->mcodeptr,
@@ -2355,18 +2359,18 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                }
                        }
 
-                       /* This approach is much faster than moving the field address     */
-                       /* inline into a register. */
+                       /* This approach is much faster than moving the field
+                          address inline into a register. */
                        x86_64_mov_membase_reg(cd, RIP, -(((ptrint) cd->mcodeptr + 7) - (ptrint) cd->mcodebase) + disp, REG_ITMP2);
                        switch (iptr->op1) {
                        case TYPE_INT:
                                var_to_reg_int(s2, src, REG_ITMP1);
-                               x86_64_movl_reg_membase(cd, s2, REG_ITMP2, 0);
+                               M_IST(s2, REG_ITMP2, 0);
                                break;
                        case TYPE_LNG:
                        case TYPE_ADR:
                                var_to_reg_int(s2, src, REG_ITMP1);
-                               x86_64_mov_reg_membase(cd, s2, REG_ITMP2, 0);
+                               M_LST(s2, REG_ITMP2, 0);
                                break;
                        case TYPE_FLT:
                                var_to_reg_flt(s2, src, REG_FTMP1);
@@ -2384,7 +2388,7 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                          /* op1 = type, val.a = field address (in    */
                                          /* following NOP)                           */
 
-                       if (!iptr[1].val.a) {
+                       if (iptr[1].val.a == NULL) {
                                disp = dseg_addaddress(cd, NULL);
 
                                codegen_addpatchref(cd, cd->mcodeptr,
@@ -2410,22 +2414,22 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                }
                        }
 
-                       /* This approach is much faster than moving the field address     */
-                       /* inline into a register. */
+                       /* This approach is much faster than moving the field
+                          address inline into a register. */
                        x86_64_mov_membase_reg(cd, RIP, -(((ptrint) cd->mcodeptr + 7) - (ptrint) cd->mcodebase) + disp, REG_ITMP1);
                        switch (iptr->op1) {
                        case TYPE_INT:
                        case TYPE_FLT:
-                               x86_64_movl_imm_membase(cd, iptr->val.i, REG_ITMP1, 0);
+                               M_IST_IMM(iptr->val.i, REG_ITMP1, 0);
                                break;
                        case TYPE_LNG:
                        case TYPE_ADR:
                        case TYPE_DBL:
                                if (IS_IMM32(iptr->val.l)) {
-                                       x86_64_mov_imm_membase(cd, iptr->val.l, REG_ITMP1, 0);
+                                       M_LST_IMM32(iptr->val.l, REG_ITMP1, 0);
                                } else {
-                                       x86_64_movl_imm_membase(cd, iptr->val.l, REG_ITMP1, 0);
-                                       x86_64_movl_imm_membase(cd, iptr->val.l >> 32, REG_ITMP1, 4);
+                                       M_IST_IMM(iptr->val.l, REG_ITMP1, 0);
+                                       M_IST_IMM(iptr->val.l >> 32, REG_ITMP1, 4);
                                }
                                break;
                        }
@@ -2437,7 +2441,7 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                        var_to_reg_int(s1, src, REG_ITMP1);
                        gen_nullptr_check(s1);
 
-                       if (!iptr->val.a) {
+                       if (iptr->val.a == NULL) {
                                codegen_addpatchref(cd, cd->mcodeptr,
                                                                        PATCHER_get_putfield,
                                                                        (unresolved_field *) iptr->target, 0);
@@ -2446,32 +2450,38 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                        M_NOP; M_NOP; M_NOP; M_NOP; M_NOP;
                                }
 
-                               a = 0;
+                               disp = 0;
 
                        } else {
-                               a = ((fieldinfo *) (iptr->val.a))->offset;
+                               disp = ((fieldinfo *) (iptr->val.a))->offset;
                        }
 
                        switch (iptr->op1) {
                        case TYPE_INT:
                                d = reg_of_var(rd, iptr->dst, REG_ITMP1);
-                               x86_64_movl_membase32_reg(cd, s1, a, d);
+                               if (iptr->val.a == NULL)
+                                       M_ILD32(d, s1, disp);
+                               else
+                                       M_ILD(d, s1, disp);
                                store_reg_to_var_int(iptr->dst, d);
                                break;
                        case TYPE_LNG:
                        case TYPE_ADR:
                                d = reg_of_var(rd, iptr->dst, REG_ITMP1);
-                               x86_64_mov_membase32_reg(cd, s1, a, d);
+                               if (iptr->val.a == NULL)
+                                       M_LLD32(d, s1, disp);
+                               else
+                                       M_LLD(d, s1, disp);
                                store_reg_to_var_int(iptr->dst, d);
                                break;
                        case TYPE_FLT:
                                d = reg_of_var(rd, iptr->dst, REG_FTMP1);
-                               x86_64_movss_membase32_reg(cd, s1, a, d);
+                               x86_64_movss_membase32_reg(cd, s1, disp, d);
                                store_reg_to_var_flt(iptr->dst, d);
                                break;
                        case TYPE_DBL:                          
                                d = reg_of_var(rd, iptr->dst, REG_FTMP1);
-                               x86_64_movsd_membase32_reg(cd, s1, a, d);
+                               x86_64_movsd_membase32_reg(cd, s1, disp, d);
                                store_reg_to_var_flt(iptr->dst, d);
                                break;
                        }
@@ -2482,13 +2492,14 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
 
                        var_to_reg_int(s1, src->prev, REG_ITMP1);
                        gen_nullptr_check(s1);
+
                        if (IS_INT_LNG_TYPE(iptr->op1)) {
                                var_to_reg_int(s2, src, REG_ITMP2);
                        } else {
                                var_to_reg_flt(s2, src, REG_FTMP2);
                        }
 
-                       if (!iptr->val.a) {
+                       if (iptr->val.a == NULL) {
                                codegen_addpatchref(cd, cd->mcodeptr,
                                                                        PATCHER_get_putfield,
                                                                        (unresolved_field *) iptr->target, 0);
@@ -2497,25 +2508,31 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                        M_NOP; M_NOP; M_NOP; M_NOP; M_NOP;
                                }
 
-                               a = 0;
+                               disp = 0;
 
                        } else {
-                               a = ((fieldinfo *) (iptr->val.a))->offset;
+                               disp = ((fieldinfo *) (iptr->val.a))->offset;
                        }
 
                        switch (iptr->op1) {
                        case TYPE_INT:
-                               x86_64_movl_reg_membase32(cd, s2, s1, a);
+                               if (iptr->val.a == NULL)
+                                       M_IST32(s2, s1, disp);
+                               else
+                                       M_IST(s2, s1, disp);
                                break;
                        case TYPE_LNG:
                        case TYPE_ADR:
-                               x86_64_mov_reg_membase32(cd, s2, s1, a);
+                               if (iptr->val.a == NULL)
+                                       M_LST32(s2, s1, disp);
+                               else
+                                       M_LST(s2, s1, disp);
                                break;
                        case TYPE_FLT:
-                               x86_64_movss_reg_membase32(cd, s2, s1, a);
+                               x86_64_movss_reg_membase32(cd, s2, s1, disp);
                                break;
                        case TYPE_DBL:
-                               x86_64_movsd_reg_membase32(cd, s2, s1, a);
+                               x86_64_movsd_reg_membase32(cd, s2, s1, disp);
                                break;
                        }
                        break;
@@ -2528,7 +2545,7 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                        var_to_reg_int(s1, src, REG_ITMP1);
                        gen_nullptr_check(s1);
 
-                       if (!iptr[1].val.a) {
+                       if (iptr[1].val.a == NULL) {
                                codegen_addpatchref(cd, cd->mcodeptr,
                                                                        PATCHER_putfieldconst,
                                                                        (unresolved_field *) iptr[1].target, 0);
@@ -2537,27 +2554,35 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                        M_NOP; M_NOP; M_NOP; M_NOP; M_NOP;
                                }
 
-                               a = 0;
+                               disp = 0;
 
                        } else {
-                               a = ((fieldinfo *) (iptr[1].val.a))->offset;
+                               disp = ((fieldinfo *) (iptr[1].val.a))->offset;
                        }
 
                        switch (iptr->op1) {
                        case TYPE_INT:
                        case TYPE_FLT:
-                               x86_64_movl_imm_membase32(cd, iptr->val.i, s1, a);
+                               if (iptr[1].val.a == NULL)
+                                       M_IST32_IMM(iptr->val.i, s1, disp);
+                               else
+                                       M_IST_IMM(iptr->val.i, s1, disp);
                                break;
                        case TYPE_LNG:
                        case TYPE_ADR:
                        case TYPE_DBL:
-                               /* We can only optimize the move, if the class is resolved.   */
-                               /* Otherwise we don't know what to patch.                     */
-                               if (iptr[1].val.a && IS_IMM32(iptr->val.l)) {
-                                       x86_64_mov_imm_membase32(cd, iptr->val.l, s1, a);
+                               /* We can only optimize the move, if the class is
+                                  resolved. Otherwise we don't know what to patch. */
+                               if (iptr[1].val.a == NULL) {
+                                       M_IST32_IMM(iptr->val.l, s1, disp);
+                                       M_IST32_IMM(iptr->val.l >> 32, s1, disp + 4);
                                } else {
-                                       x86_64_movl_imm_membase32(cd, iptr->val.l, s1, a);
-                                       x86_64_movl_imm_membase32(cd, iptr->val.l >> 32, s1, a + 4);
+                                       if (IS_IMM32(iptr->val.l)) {
+                                               M_LST_IMM32(iptr->val.l, s1, disp);
+                                       } else {
+                                               M_IST_IMM(iptr->val.l, s1, disp);
+                                               M_IST_IMM(iptr->val.l >> 32, s1, disp + 4);
+                                       }
                                }
                                break;
                        }
@@ -2615,26 +2640,22 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                case ICMD_IFNULL:       /* ..., value ==> ...                         */
                                        /* op1 = target JavaVM pc                     */
 
-                       if (src->flags & INMEMORY) {
-                               x86_64_alu_imm_membase(cd, X86_64_CMP, 0, REG_SP, src->regoff * 8);
-
-                       } else {
-                               x86_64_test_reg_reg(cd, src->regoff, src->regoff);
-                       }
-                       x86_64_jcc(cd, X86_64_CC_E, 0);
+                       if (src->flags & INMEMORY)
+                               M_CMP_IMM_MEMBASE(0, REG_SP, src->regoff * 8);
+                       else
+                               M_TEST(src->regoff);
+                       M_BEQ(0);
                        codegen_addreference(cd, (basicblock *) iptr->target, cd->mcodeptr);
                        break;
 
                case ICMD_IFNONNULL:    /* ..., value ==> ...                         */
                                        /* op1 = target JavaVM pc                     */
 
-                       if (src->flags & INMEMORY) {
-                               x86_64_alu_imm_membase(cd, X86_64_CMP, 0, REG_SP, src->regoff * 8);
-
-                       } else {
-                               x86_64_test_reg_reg(cd, src->regoff, src->regoff);
-                       }
-                       x86_64_jcc(cd, X86_64_CC_NE, 0);
+                       if (src->flags & INMEMORY)
+                               M_CMP_IMM_MEMBASE(0, REG_SP, src->regoff * 8);
+                       else
+                               M_TEST(src->regoff);
+                       M_BNE(0);
                        codegen_addreference(cd, (basicblock *) iptr->target, cd->mcodeptr);
                        break;
 
@@ -2788,7 +2809,11 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                        break;
 
                case ICMD_IFEQ_ICONST:  /* ..., value ==> ..., constant               */
-                                       /* val.i = constant                           */
+               case ICMD_IFNE_ICONST:  /* val.i = constant                           */
+               case ICMD_IFLT_ICONST:
+               case ICMD_IFGE_ICONST:
+               case ICMD_IFGT_ICONST:
+               case ICMD_IFLE_ICONST:
 
                        var_to_reg_int(s1, src, REG_ITMP1);
                        d = reg_of_var(rd, iptr->dst, REG_ITMP3);
@@ -2797,101 +2822,38 @@ bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                        M_INTMOVE(s1, REG_ITMP1);
                                        s1 = REG_ITMP1;
                                }
-                               x86_64_movl_imm_reg(cd, iptr[1].val.i, d);
+                               if (iptr[1].val.i == 0)
+                                       M_CLR(d);
+                               else
+                                       M_IMOV_IMM(iptr[1].val.i, d);
                        }
-                       x86_64_movl_imm_reg(cd, iptr->val.i, REG_ITMP2);
-                       x86_64_testl_reg_reg(cd, s1, s1);
-                       x86_64_cmovccl_reg_reg(cd, X86_64_CC_E, REG_ITMP2, d);
-                       store_reg_to_var_int(iptr->dst, d);
-                       break;
-
-               case ICMD_IFNE_ICONST:  /* ..., value ==> ..., constant               */
-                                       /* val.i = constant                           */
-
-                       var_to_reg_int(s1, src, REG_ITMP1);
-                       d = reg_of_var(rd, iptr->dst, REG_ITMP3);
-                       if (iptr[1].opc == ICMD_ELSE_ICONST) {
-                               if (s1 == d) {
-                                       M_INTMOVE(s1, REG_ITMP1);
-                                       s1 = REG_ITMP1;
-                               }
-                               x86_64_movl_imm_reg(cd, iptr[1].val.i, d);
-                       }
-                       x86_64_movl_imm_reg(cd, iptr->val.i, REG_ITMP2);
-                       x86_64_testl_reg_reg(cd, s1, s1);
-                       x86_64_cmovccl_reg_reg(cd, X86_64_CC_NE, REG_ITMP2, d);
-                       store_reg_to_var_int(iptr->dst, d);
-                       break;
-
-               case ICMD_IFLT_ICONST:  /* ..., value ==> ..., constant               */
-                                       /* val.i = constant                           */
-
-                       var_to_reg_int(s1, src, REG_ITMP1);
-                       d = reg_of_var(rd, iptr->dst, REG_ITMP3);
-                       if (iptr[1].opc == ICMD_ELSE_ICONST) {
-                               if (s1 == d) {
-                                       M_INTMOVE(s1, REG_ITMP1);
-                                       s1 = REG_ITMP1;
-                               }
-                               x86_64_movl_imm_reg(cd, iptr[1].val.i, d);
-                       }
-                       x86_64_movl_imm_reg(cd, iptr->val.i, REG_ITMP2);
-                       x86_64_testl_reg_reg(cd, s1, s1);
-                       x86_64_cmovccl_reg_reg(cd, X86_64_CC_L, REG_ITMP2, d);
-                       store_reg_to_var_int(iptr->dst, d);
-                       break;
-
-               case ICMD_IFGE_ICONST:  /* ..., value ==> ..., constant               */
-                                       /* val.i = constant                           */
-
-                       var_to_reg_int(s1, src, REG_ITMP1);
-                       d = reg_of_var(rd, iptr->dst, REG_ITMP3);
-                       if (iptr[1].opc == ICMD_ELSE_ICONST) {
-                               if (s1 == d) {
-                                       M_INTMOVE(s1, REG_ITMP1);
-                                       s1 = REG_ITMP1;
-                               }
-                               x86_64_movl_imm_reg(cd, iptr[1].val.i, d);
-                       }
-                       x86_64_movl_imm_reg(cd, iptr->val.i, REG_ITMP2);
-                       x86_64_testl_reg_reg(cd, s1, s1);
-                       x86_64_cmovccl_reg_reg(cd, X86_64_CC_GE, REG_ITMP2, d);
-                       store_reg_to_var_int(iptr->dst, d);
-                       break;
-
-               case ICMD_IFGT_ICONST:  /* ..., value ==> ..., constant               */
-                                       /* val.i = constant                           */
+                       if (iptr->val.i == 0)
+                               M_CLR(REG_ITMP2);
+                       else
+                               M_IMOV_IMM(iptr->val.i, REG_ITMP2);
+                       M_ITEST(s1);
 
-                       var_to_reg_int(s1, src, REG_ITMP1);
-                       d = reg_of_var(rd, iptr->dst, REG_ITMP3);
-                       if (iptr[1].opc == ICMD_ELSE_ICONST) {
-                               if (s1 == d) {
-                                       M_INTMOVE(s1, REG_ITMP1);
-                                       s1 = REG_ITMP1;
-                               }
-                               x86_64_movl_imm_reg(cd, iptr[1].val.i, d);
+                       switch (iptr->opc) {
+                       case ICMD_IFEQ_ICONST:
+                               M_CMOVEQ(REG_ITMP2, d);
+                               break;
+                       case ICMD_IFNE_ICONST:
+                               M_CMOVNE(REG_ITMP2, d);
+                               break;
+                       case ICMD_IFLT_ICONST:
+                               M_CMOVLT(REG_ITMP2, d);
+                               break;
+                       case ICMD_IFGE_ICONST:
+                               M_CMOVGE(REG_ITMP2, d);
+                               break;
+                       case ICMD_IFGT_ICONST:
+                               M_CMOVGT(REG_ITMP2, d);
+                               break;
+                       case ICMD_IFLE_ICONST:
+                               M_CMOVLE(REG_ITMP2, d);
+                               break;
                        }
-                       x86_64_movl_imm_reg(cd, iptr->val.i, REG_ITMP2);
-                       x86_64_testl_reg_reg(cd, s1, s1);
-                       x86_64_cmovccl_reg_reg(cd, X86_64_CC_G, REG_ITMP2, d);
-                       store_reg_to_var_int(iptr->dst, d);
-                       break;
 
-               case ICMD_IFLE_ICONST:  /* ..., value ==> ..., constant               */
-                                       /* val.i = constant                           */
-
-                       var_to_reg_int(s1, src, REG_ITMP1);
-                       d = reg_of_var(rd, iptr->dst, REG_ITMP3);
-                       if (iptr[1].opc == ICMD_ELSE_ICONST) {
-                               if (s1 == d) {
-                                       M_INTMOVE(s1, REG_ITMP1);
-                                       s1 = REG_ITMP1;
-                               }
-                               x86_64_movl_imm_reg(cd, iptr[1].val.i, d);
-                       }
-                       x86_64_movl_imm_reg(cd, iptr->val.i, REG_ITMP2);
-                       x86_64_testl_reg_reg(cd, s1, s1);
-                       x86_64_cmovccl_reg_reg(cd, X86_64_CC_LE, REG_ITMP2, d);
                        store_reg_to_var_int(iptr->dst, d);
                        break;
 
@@ -4180,7 +4142,6 @@ u1 *createnativestub(functionptr f, methodinfo *m, codegendata *cd,
        md = m->parseddesc;
        nativeparams = (m->flags & ACC_STATIC) ? 2 : 1;
 
-
        /* calculate stack frame size */
 
        stackframesize =
@@ -4192,7 +4153,6 @@ u1 *createnativestub(functionptr f, methodinfo *m, codegendata *cd,
        if (!(stackframesize & 0x1))                /* keep stack 16-byte aligned */
                stackframesize++;
 
-
        /* create method header */
 
        (void) dseg_addaddress(cd, m);                          /* MethodPointer  */
@@ -4204,12 +4164,17 @@ u1 *createnativestub(functionptr f, methodinfo *m, codegendata *cd,
        (void) dseg_addlinenumbertablesize(cd);
        (void) dseg_adds4(cd, 0);                               /* ExTableSize    */
 
-
        /* initialize mcode variables */
        
        cd->mcodeptr = (u1 *) cd->mcodebase;
        cd->mcodeend = (s4 *) (cd->mcodebase + cd->mcodesize);
 
+       /* generate profiling code */
+
+       if (opt_prof) {
+               M_MOV_IMM((ptrint) m, REG_ITMP1);
+               M_IINC_MEMBASE(REG_ITMP1, OFFSET(methodinfo, executioncount));
+       }
 
        /* generate stub code */
 
index 90059075891b7d54ff8480891fe4988c4572ae03..05a268d9d6347967ab331cc25b998d68864b96f0 100644 (file)
@@ -29,7 +29,7 @@
 
    Changes:
 
-   $Id: codegen.h 4357 2006-01-22 23:33:38Z twisti $
+   $Id: codegen.h 4388 2006-01-30 15:44:52Z twisti $
 
 */
 
@@ -132,7 +132,7 @@ typedef enum {
 
 
 #define x86_64_emit_rex(size,reg,index,rm) \
-    if ((size) == 1 || (reg) > 7 || (index) > 7 || (rm) > 7) { \
+    if (((size) == 1) || ((reg) > 7) || ((index) > 7) || ((rm) > 7)) { \
         *(cd->mcodeptr++) = (0x40 | (((size) & 0x01) << 3) | ((((reg) >> 3) & 0x01) << 2) | ((((index) >> 3) & 0x01) << 1) | (((rm) >> 3) & 0x01)); \
     }
 
@@ -430,16 +430,29 @@ typedef enum {
 #define M_LLD(a,b,disp)         x86_64_mov_membase_reg(cd, (b), (disp), (a))
 #define M_DLD(a,b,disp)         x86_64_movq_membase_reg(cd, (b), (disp), (a))
 
+#define M_ILD32(a,b,disp)       x86_64_movl_membase32_reg(cd, (b), (disp), (a))
+#define M_LLD32(a,b,disp)       x86_64_mov_membase32_reg(cd, (b), (disp), (a))
+
 #define M_IST(a,b,disp)         x86_64_movl_reg_membase(cd, (a), (b), (disp))
 #define M_LST(a,b,disp)         x86_64_mov_reg_membase(cd, (a), (b), (disp))
-#define M_LST_IMM32(a,b,disp)   x86_64_mov_imm_membase(cd, (a), (b), (disp))
 #define M_DST(a,b,disp)         x86_64_movq_reg_membase(cd, (a), (b), (disp))
 
+#define M_IST_IMM(a,b,disp)     x86_64_movl_imm_membase(cd, (a), (b), (disp))
+#define M_LST_IMM32(a,b,disp)   x86_64_mov_imm_membase(cd, (a), (b), (disp))
+
+#define M_IST32(a,b,disp)       x86_64_movl_reg_membase32(cd, (a), (b), (disp))
+#define M_LST32(a,b,disp)       x86_64_mov_reg_membase32(cd, (a), (b), (disp))
+
+#define M_IST32_IMM(a,b,disp)   x86_64_movl_imm_membase32(cd, (a), (b), (disp))
+#define M_LST32_IMM32(a,b,disp) x86_64_mov_imm_membase32(cd, (a), (b), (disp))
+
 #define M_LADD(a,b)             x86_64_alu_reg_reg(cd, X86_64_ADD, (a), (b))
 #define M_LADD_IMM(a,b)         x86_64_alu_imm_reg(cd, X86_64_ADD, (a), (b))
 #define M_LSUB(a,b)             x86_64_alu_reg_reg(cd, X86_64_SUB, (a), (b))
 #define M_LSUB_IMM(a,b)         x86_64_alu_imm_reg(cd, X86_64_SUB, (a), (b))
 
+#define M_IINC_MEMBASE(a,b)     x86_64_incl_membase(cd, (a), (b))
+
 #define M_ALD(a,b,c)            M_LLD(a,b,c)
 #define M_AST(a,b,c)            M_LST(a,b,c)
 #define M_AST_IMM32(a,b,c)      M_LST_IMM32(a,b,c)
@@ -463,16 +476,33 @@ typedef enum {
 #define M_IXOR(a,b)             x86_64_alul_reg_reg(cd, X86_64_XOR, (a), (b))
 
 #define M_TEST(a)               x86_64_test_reg_reg(cd, (a), (a))
+#define M_ITEST(a)              x86_64_testl_reg_reg(cd, (a), (a))
 
 #define M_CMP(a,b)              x86_64_alu_reg_reg(cd, X86_64_CMP, (a), (b))
 #define M_CMP_IMM(a,b)          x86_64_alu_imm_reg(cd, X86_64_CMP, (a), (b))
+#define M_CMP_IMM_MEMBASE(a,b,c) x86_64_alu_imm_membase(cd, X86_64_CMP, (a), (b), (c))
 #define M_CMP_MEMBASE(a,b,c)    x86_64_alu_membase_reg(cd, X86_64_CMP, (a), (b), (c))
 
+#define M_ICMP(a,b)             x86_64_alul_reg_reg(cd, X86_64_CMP, (a), (b))
+#define M_ICMP_IMM(a,b)         x86_64_alul_imm_reg(cd, X86_64_CMP, (a), (b))
+#define M_ICMP_IMM_MEMBASE(a,b,c) x86_64_alul_imm_membase(cd, X86_64_CMP, (a), (b), (c))
+
 #define M_BEQ(disp)             x86_64_jcc(cd, X86_64_CC_E, (disp))
 #define M_BNE(disp)             x86_64_jcc(cd, X86_64_CC_NE, (disp))
 #define M_BLE(disp)             x86_64_jcc(cd, X86_64_CC_LE, (disp))
 #define M_BA(disp)              x86_64_jcc(cd, X86_64_CC_A, (disp))
 
+#define M_CMOVEQ(a,b)           x86_64_cmovcc_reg_reg(cd, X86_64_CC_E, (a), (b))
+#define M_CMOVNE(a,b)           x86_64_cmovcc_reg_reg(cd, X86_64_CC_NE, (a), (b))
+#define M_CMOVLT(a,b)           x86_64_cmovcc_reg_reg(cd, X86_64_CC_L, (a), (b))
+#define M_CMOVLE(a,b)           x86_64_cmovcc_reg_reg(cd, X86_64_CC_LE, (a), (b))
+#define M_CMOVGE(a,b)           x86_64_cmovcc_reg_reg(cd, X86_64_CC_GE, (a), (b))
+#define M_CMOVGT(a,b)           x86_64_cmovcc_reg_reg(cd, X86_64_CC_G, (a), (b))
+
+#define M_CMOVB(a,b)            x86_64_cmovcc_reg_reg(cd, X86_64_CC_B, (a), (b))
+#define M_CMOVA(a,b)            x86_64_cmovcc_reg_reg(cd, X86_64_CC_A, (a), (b))
+#define M_CMOVP(a,b)            x86_64_cmovcc_reg_reg(cd, X86_64_CC_P, (a), (b))
+
 #define M_PUSH(a)               x86_64_push_reg(cd, (a))
 #define M_PUSH_IMM(a)           x86_64_push_imm(cd, (a))
 #define M_POP(a)                x86_64_pop_reg(cd, (a))
@@ -485,6 +515,8 @@ typedef enum {
 
 #define M_NOP                   x86_64_nop(cd)
 
+#define M_CLR(a)                M_XOR(a,a)
+
 
 /* function gen_resolvebranch **************************************************
 
index 2e648b56392e04ffa7f950e8358a19a66c33c428..a24cd110b06bb280ba54bc04d4823e673be91223 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: emitfuncs.c 4357 2006-01-22 23:33:38Z twisti $
+   $Id: emitfuncs.c 4388 2006-01-30 15:44:52Z twisti $
 
 */
 
@@ -578,16 +578,13 @@ void x86_64_emit_lshiftconst(codegendata *cd, s4 shift_op, stackptr src, instruc
 
 void x86_64_emit_ifcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr)
 {
-       if (src->flags & INMEMORY) {
-               x86_64_alul_imm_membase(cd, X86_64_CMP, iptr->val.i, REG_SP, src->regoff * 8);
-
-       } else {
-               if (iptr->val.i == 0) {
-                       x86_64_testl_reg_reg(cd, src->regoff, src->regoff);
-
-               } else {
-                       x86_64_alul_imm_reg(cd, X86_64_CMP, iptr->val.i, src->regoff);
-               }
+       if (src->flags & INMEMORY)
+               M_ICMP_IMM_MEMBASE(iptr->val.i, REG_SP, src->regoff * 8);
+       else {
+               if (iptr->val.i == 0)
+                       M_ITEST(src->regoff);
+               else
+                       M_ICMP_IMM(iptr->val.i, src->regoff);
        }
        x86_64_jcc(cd, if_op, 0);
        codegen_addreference(cd, (basicblock *) iptr->target, cd->mcodeptr);
@@ -714,16 +711,18 @@ void x86_64_mov_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
 }
 
 
-void x86_64_movl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
+void x86_64_movl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg)
+{
        x86_64_emit_rex(0,(reg),0,(basereg));
        *(cd->mcodeptr++) = 0x8b;
        x86_64_emit_membase((basereg),(disp),(reg));
 }
 
 
-/* Always emit a REX byte, because the instruction size can be smaller when   */
-/* all register indexes are smaller than 7.                                   */
-void x86_64_movl_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
+/* ATTENTION: Always emit a REX byte, because the instruction size can
+   be smaller when all register indexes are smaller than 7. */
+void x86_64_movl_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg)
+{
        x86_64_emit_byte_rex((reg),0,(basereg));
        *(cd->mcodeptr++) = 0x8b;
        x86_64_emit_membase32((basereg),(disp),(reg));
@@ -1555,7 +1554,8 @@ void x86_64_call_imm(codegendata *cd, s8 imm) {
 }
 
 
-void x86_64_call_mem(codegendata *cd, s8 mem) {
+void x86_64_call_mem(codegendata *cd, ptrint mem)
+{
        *(cd->mcodeptr++) = 0xff;
        x86_64_emit_mem(2,(mem));
 }
index 1910c081623ba0e4ab8f8eb3e8cb1ee5671594a7..9f0f16f22aa0157b6d066b5ec195b6def22efe2d 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: emitfuncs.h 4357 2006-01-22 23:33:38Z twisti $
+   $Id: emitfuncs.h 4388 2006-01-30 15:44:52Z twisti $
 
 */
 
@@ -159,7 +159,7 @@ void x86_64_xchg_reg_reg(codegendata *cd, s8 reg, s8 dreg);
 void x86_64_nop(codegendata *cd);
 void x86_64_call_reg(codegendata *cd, s8 reg);
 void x86_64_call_imm(codegendata *cd, s8 imm);
-void x86_64_call_mem(codegendata *cd, s8 mem);
+void x86_64_call_mem(codegendata *cd, ptrint mem);
 
 
 /* floating point instructions (SSE2) */
index a2308ff50adbe95106b6bbc321aefa77a191d371..907fa490acda14be622d3e5b54f76c984e7d91a7 100644 (file)
@@ -32,7 +32,7 @@
             Edwin Steiner
             Christian Thalinger
 
-   $Id: linker.c 4357 2006-01-22 23:33:38Z twisti $
+   $Id: linker.c 4388 2006-01-30 15:44:52Z twisti $
 
 */
 
@@ -300,8 +300,6 @@ static bool link_primitivetype_table(void)
                c = class_create_classinfo(utf_new_char(primitivetype_table[i].name));
 
                c->flags = ACC_PUBLIC | ACC_FINAL | ACC_ABSTRACT;
-               c->classUsed = NOTUSED; /* not used initially CO-RT */
-               c->impldBy = NULL;
                
                /* prevent loader from loading primitive class */
 
@@ -322,8 +320,6 @@ static bool link_primitivetype_table(void)
                        return false;
 
                primitivetype_table[i].class_wrap = c;
-               primitivetype_table[i].class_wrap->classUsed = NOTUSED; /* not used initially CO-RT */
-               primitivetype_table[i].class_wrap->impldBy = NULL;
 
                /* create the primitive array class */
 
@@ -509,8 +505,6 @@ static classinfo *link_class_intern(classinfo *c)
 
        if (c->super.any == NULL) {                     /* class java.lang.Object */
                c->index = 0;
-        c->classUsed = USED;              /* Object class is always used CO-RT*/
-               c->impldBy = NULL;
                c->instancesize = sizeof(java_objectheader);
                
                vftbllength = supervftbllength = 0;
index b0c3bc0393b9df1475596421568fdbd791fc0f66..4a670cb11eccad50b2a9da6e22be6f86a041e086 100644 (file)
@@ -32,7 +32,7 @@
             Edwin Steiner
             Christian Thalinger
 
-   $Id: loader.c 4382 2006-01-28 14:21:09Z twisti $
+   $Id: loader.c 4388 2006-01-30 15:44:52Z twisti $
 
 */
 
@@ -1811,9 +1811,6 @@ classinfo *load_class_from_classbuffer(classbuffer *cb)
        if (!load_constantpool(cb, descpool))
                goto return_exception;
 
-       c->classUsed = NOTUSED; /* not used initially CO-RT */
-       c->impldBy = NULL;
-
        /* ACC flags */
 
        if (!suck_check_classbuffer_size(cb, 2))
index 1e16df96169443d799645a435fc8744ce3e2888e..abf47574c9374312e38fe23a26956b93bfcd8a82 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Christian Thalinger
 
-   $Id: method.h 4381 2006-01-28 14:18:06Z twisti $
+   $Id: method.h 4388 2006-01-30 15:44:52Z twisti $
 */
 
 
@@ -104,6 +104,8 @@ struct methodinfo {                 /* method structure                       */
 #if defined(ENABLE_LSRA)
        s4            maxlifetimes;     /* helper for lsra                        */
 #endif
+
+       u4            executioncount;   /* number of method invocations           */
 };
 
 
index 7c9ff82a8012e894e2a0f5f150a844190938399d..c56d464afae8b5e26ae52822506ad14a7f50ce63 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: options.c 4357 2006-01-22 23:33:38Z twisti $
+   $Id: options.c 4388 2006-01-30 15:44:52Z twisti $
 
 */
 
@@ -110,6 +110,8 @@ bool opt_stat = false;
 bool opt_verify = true;        /* true if classfiles should be verified      */
 bool opt_eager = false;
 
+bool opt_prof = false;
+
 #if defined(ENABLE_LSRA)
 bool opt_lsra = false;
 #endif
index 43ba01f4df15058580f4359aea22d511a7e437c1..75cbd09d178764438acf8e8950aa54eb4f83a11c 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: options.h 4357 2006-01-22 23:33:38Z twisti $
+   $Id: options.h 4388 2006-01-30 15:44:52Z twisti $
 
 */
 
@@ -124,6 +124,8 @@ extern bool opt_stat;
 extern bool opt_verify;
 extern bool opt_eager;
 
+extern bool opt_prof;
+
 #if defined(ENABLE_LSRA)
 extern bool opt_lsra;
 #endif