Merged revisions 7674-7687 via svnmerge from
authormichi <none@none>
Thu, 12 Apr 2007 09:05:12 +0000 (09:05 +0000)
committermichi <none@none>
Thu, 12 Apr 2007 09:05:12 +0000 (09:05 +0000)
svn+ssh://michi@c1.complang.tuwien.ac.at/ahome/cacao/svn/cacao/trunk

........
  r7675 | michi | 2007-04-05 16:23:04 +0200 (Thu, 05 Apr 2007) | 10 lines

  * src/vm/global.h (compiler_lock, compiler_unlock): Removed.
  * src/cacaoh/dummy.c (compiler_lock, compiler_unlock): Removed.
  * src/threads/native/threads.c (compiler_lock, compiler_unlock): Removed.

  * src/vmcore/linker.h (linker_classrenumber_lock): Added.
  * src/vmcore/linker.c (linker_classrenumber_lock): Added.
  (linker_compute_subclasses): Uses above lock object instead of compiler_lock.

  * src/vm/jit/intrp/asmpart.c (intrp_asm_getclassvalues_atomic): Likewise.
........
  r7676 | twisti | 2007-04-08 23:14:40 +0200 (Sun, 08 Apr 2007) | 3 lines

  * src/native/vm/cldc1.1/java_lang_Object.c (notifyAll): Implemented.
  * src/native/vm/cldc1.1/java_lang_String.c (lastIndexOf__I): Likewise.
........
  r7677 | twisti | 2007-04-09 13:51:25 +0200 (Mon, 09 Apr 2007) | 8 lines

  * src/vm/jit/mips/codegen.h (BRANCH_NOPS): Added long-branches case.

  * src/vm/jit/mips/emit.c (emit_load): Use switch-case instead of
  if-else contruct.
  (emit_store): Likewise.
  (emit_copy): Likewise.
  (emit_branch): Implemented conditional long-branches.
........
  r7678 | twisti | 2007-04-09 19:23:55 +0200 (Mon, 09 Apr 2007) | 11 lines

  * src/vm/jit/alpha/asmpart.S: Use % instead of @ for progbits as ARM's
  assembler uses @ as comment character.
  * src/vm/jit/arm/asmpart.S: Likewise.
  * src/vm/jit/i386/asmpart.S: Likewise.
  * src/vm/jit/mips/asmpart.S: Likewise.
  * src/vm/jit/powerpc/asmpart.S: Likewise.
  * src/vm/jit/powerpc64/asmpart.S: Likewise.
  * src/vm/jit/s390/asmpart.S: Likewise.
  * src/vm/jit/sparc64/asmpart.S: Likewise.
  * src/vm/jit/x86_64/asmpart.S: Likewise.
........
  r7679 | twisti | 2007-04-09 23:17:36 +0200 (Mon, 09 Apr 2007) | 2 lines

  * src/vm/jit/alpha/emit.c (emit_copy): Check src-type, not dst-type.
........
  r7680 | pm | 2007-04-10 07:02:20 +0200 (Tue, 10 Apr 2007) | 8 lines

  * src/vm/jit/s390/emit.c,
  src/vm/jit/s390/md-abi.h,
  src/vm/jit/s390/codegen.c,
  src/vm/jit/s390/codegen.h,
  src/vm/jit/s390/arch.h,
  src/vm/jit/s390/asmpart.S,
  src/vm/jit/s390/tests/tests.java.pp: Changed very much.
........
  r7681 | twisti | 2007-04-10 14:22:16 +0200 (Tue, 10 Apr 2007) | 3 lines

  * src/vm/jit/mips/linux/md-os.c (md_signal_handler_sigsegv): Set val
  accordingly.
........
  r7682 | twisti | 2007-04-10 23:24:14 +0200 (Tue, 10 Apr 2007) | 3 lines

  * src/vm/jit/mips/codegen.c (codegen_emit): Fixed ICMD_IF_Lxx
  instructions for 64-bit.
........
  r7683 | twisti | 2007-04-10 23:37:03 +0200 (Tue, 10 Apr 2007) | 3 lines

  * src/vm/jit/mips/linux/md-os.c (md_signal_handler_sigsegv): We only
  need to check the cause for pre glibc-2.5.
........
  r7684 | twisti | 2007-04-11 10:11:49 +0200 (Wed, 11 Apr 2007) | 3 lines

  * src/vm/jit/codegen-common.c (codegen_generate): Added re-generating
  debug message.
........
  r7685 | twisti | 2007-04-11 10:21:06 +0200 (Wed, 11 Apr 2007) | 2 lines

  * src/toolbox/logging.c (log_finish): Also print a \n in the log-file.
........
  r7687 | tbfg | 2007-04-11 18:39:22 +0200 (Wed, 11 Apr 2007) | 19 lines

  * src/vm/jit/powerpc64/arch.h (SUPPORT_LONG_SHIFT): Enabled.

  * src/vm/jit/powerpc64/codegen.c (ICMD_LSHLCONST): Implemented.
  (ICMD_LSHRCONST): Likewise.
  (ICMD_LUSHRCONST): Likewise.
  (ICMD_LSHL): Likewise.
  (ICMD_LSHR): Likewise.
  (ICMD_LUSHR): Likewise.
  (ICMD_IUSHR): Fixed.
  (ICMD_IUSHRCONST): Fixed.

  * src/vm/jit/powerpc64/codegen.h (M_SRL): Use 64bit opcode.
  (M_SRA): Likewise.
  (M_SRA_IMM): Likewise.
  (M_SRL_IMM): Likewise.
  (M_SSL_IMM): Likewise.
  (M_SSL): Likewise.
  (M_CLR_HIGH): Added.
........

--HG--
branch : exact-gc

33 files changed:
src/cacaoh/dummy.c
src/native/vm/cldc1.1/java_lang_Object.c
src/native/vm/cldc1.1/java_lang_String.c
src/threads/native/threads.c
src/toolbox/logging.c
src/vm/global.h
src/vm/jit/alpha/asmpart.S
src/vm/jit/alpha/emit.c
src/vm/jit/arm/asmpart.S
src/vm/jit/codegen-common.c
src/vm/jit/i386/asmpart.S
src/vm/jit/intrp/asmpart.c
src/vm/jit/mips/asmpart.S
src/vm/jit/mips/codegen.c
src/vm/jit/mips/codegen.h
src/vm/jit/mips/emit.c
src/vm/jit/mips/linux/md-os.c
src/vm/jit/powerpc/asmpart.S
src/vm/jit/powerpc64/arch.h
src/vm/jit/powerpc64/asmpart.S
src/vm/jit/powerpc64/codegen.c
src/vm/jit/powerpc64/codegen.h
src/vm/jit/s390/arch.h
src/vm/jit/s390/asmpart.S
src/vm/jit/s390/codegen.c
src/vm/jit/s390/codegen.h
src/vm/jit/s390/emit.c
src/vm/jit/s390/md-abi.h
src/vm/jit/s390/tests/tests.java.pp
src/vm/jit/sparc64/asmpart.S
src/vm/jit/x86_64/asmpart.S
src/vmcore/linker.c
src/vmcore/linker.h

index 03e9afb885245b357f9ce5ce61bb9408eae1921c..c2f60fc87726dcfa7df1d231a487f5e9398491bf 100644 (file)
 char *_Jv_bootclasspath;
 
 
-void compiler_lock()
-{
-}
-
-void compiler_unlock()
-{
-}
-
 java_objectheader *javastring_new_slash_to_dot(utf *u)
 {
        vm_abort("javastring_new_slash_to_dot");
index c6fb86320189c8a2f54b9b0cf1299c00898fca5a..ef5b83399b22580389be37c16c07da8e6ff72a1d 100644 (file)
@@ -89,14 +89,15 @@ JNIEXPORT void JNICALL Java_java_lang_Object_notify(JNIEnv *env, java_lang_Objec
 }
 
 
-#if 0
 /*
  * Class:     java/lang/Object
  * Method:    notifyAll
  * Signature: ()V
  */
-JNIEXPORT void JNICALL Java_java_lang_Object_notifyAll(JNIEnv *env, struct java_lang_Object* this);
-#endif
+JNIEXPORT void JNICALL Java_java_lang_Object_notifyAll(JNIEnv *env, java_lang_Object *this)
+{
+       _Jv_java_lang_Object_notifyAll(this);
+}
 
 
 /*
index 6a34bc6841a10af4b8fce5f6be2b908043e79a06..76acde4454693fb23c43a5cb9ea7d2a8f2e268a7 100644 (file)
@@ -134,6 +134,17 @@ JNIEXPORT s4 JNICALL Java_java_lang_String_indexOf__II(JNIEnv *env, java_lang_St
 }
 
 
+/*
+ * Class:     java/lang/String
+ * Method:    lastIndexOf
+ * Signature: (I)I
+ */
+JNIEXPORT s4 JNICALL Java_java_lang_String_lastIndexOf__I(JNIEnv *env, java_lang_String *this, s4 ch)
+{
+       return Java_java_lang_String_lastIndexOf__II(env, this, ch, this->count - 1);
+}
+
+
 /*
  * Class:     java/lang/String
  * Method:    lastIndexOf
index e5f4ceb052fe1960885b021abdac65a94866b81e..90a13bfcc986f2ab5cee90d65b804cf617456a03 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: threads.c 7674 2007-04-05 13:27:11Z michi $
+   $Id: threads.c 7688 2007-04-12 09:05:12Z michi $
 
 */
 
@@ -240,9 +240,6 @@ pthread_key_t threads_current_threadobject_key;
 /* global threads table                                                       */
 static threads_table_t threads_table;
 
-/* global compiler mutex                                                      */
-static pthread_mutex_t compiler_mutex;
-
 /* global mutex for changing the thread list                                  */
 static pthread_mutex_t threadlistlock;
 
@@ -350,30 +347,6 @@ void threads_sem_post(sem_t *sem)
 }
 
 
-/* compiler_lock ***************************************************************
-
-   Enter the compiler lock.
-
-******************************************************************************/
-
-void compiler_lock(void)
-{
-       pthread_mutex_lock(&compiler_mutex);
-}
-
-
-/* compiler_unlock *************************************************************
-
-   Release the compiler lock.
-
-******************************************************************************/
-
-void compiler_unlock(void)
-{
-       pthread_mutex_unlock(&compiler_mutex);
-}
-
-
 /* lock_stopworld **************************************************************
 
    Enter the stopworld lock, specifying why the world shall be stopped.
@@ -683,12 +656,6 @@ threadobject *threads_get_current_threadobject(void)
 
 void threads_preinit(void)
 {
-       pthread_mutexattr_t mutexattr;
-       pthread_mutexattr_init(&mutexattr);
-       pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE);
-       pthread_mutex_init(&compiler_mutex, &mutexattr);
-       pthread_mutexattr_destroy(&mutexattr);
-
        pthread_mutex_init(&threadlistlock, NULL);
        pthread_mutex_init(&stopworldlock, NULL);
 
index 5a86a4fa7a27242ebb028f8d87464b99f803e6b5..8a90374b76d6292bd393a85df39b0b05d0d737ae 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: logging.c 7345 2007-02-13 13:04:21Z twisti $
+   $Id: logging.c 7685 2007-04-11 08:21:06Z twisti $
 
 */
 
@@ -172,11 +172,11 @@ void log_println(const char *text, ...)
 void log_finish(void)
 {
        if (logfile) {
+               fputs("\n", logfile);
                fflush(logfile);
-
-       else {
+       }
+       else {
                fputs("\n", stdout);
-
                fflush(stdout);
        }
 }
index cf4d928433cebcae7d50efabb36bb14d7ac69694..6c68eb2366451dfa001e5e31a484ba6b4429a0f9 100644 (file)
@@ -32,7 +32,7 @@
             Joseph Wenninger
             Christian Thalinger
 
-   $Id: global.h 7601 2007-03-28 23:02:50Z michi $
+   $Id: global.h 7688 2007-04-12 09:05:12Z michi $
 
 */
 
@@ -328,14 +328,6 @@ struct java_objectarray {
 };
 
 
-/* Synchronization ************************************************************/
-
-#if defined(ENABLE_THREADS)
-void compiler_lock();
-void compiler_unlock();
-#endif
-
-
 /* global constants related to the verifier ***********************************/
 
 /* The verifier needs additional variables in the variable array. Since these */
index a4ce901f8f3f12b5eeb113cca1dd3a58eb8ee305..d5ba25312f08e4eb544d8420cf9e9c04dac4c08a 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.S 7667 2007-04-05 00:16:05Z michi $
+   $Id: asmpart.S 7678 2007-04-09 17:23:55Z twisti $
 
 */
 
@@ -854,7 +854,7 @@ asm_cacheflush:
 /* disable exec-stacks ********************************************************/
 
 #if defined(__linux__) && defined(__ELF__)
-       .section .note.GNU-stack,"",@progbits
+       .section .note.GNU-stack,"",%progbits
 #endif
 
 
index 0ee8f57dbd62f45d6d0999b59ae162fd4665c15f..8ba787a62892872037ed1c1e4762f9897238ef88 100644 (file)
@@ -168,7 +168,7 @@ void emit_copy(jitdata *jd, instruction *iptr, varinfo *src, varinfo *dst)
                }
 
                if (s1 != d) {
-                       switch (dst->type) {
+                       switch (src->type) {
                        case TYPE_INT:
                        case TYPE_LNG:
                        case TYPE_ADR:
@@ -179,7 +179,7 @@ void emit_copy(jitdata *jd, instruction *iptr, varinfo *src, varinfo *dst)
                                M_FMOV(s1, d);
                                break;
                        default:
-                               vm_abort("emit_copy: unknown type %d", dst->type);
+                               vm_abort("emit_copy: unknown type %d", src->type);
                        }
                }
 
index 904e55c744464a989614e155ce5d847d09786efe..fae35ce6df7dc5499cfdff46ed2b20a7203295d3 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.S 7667 2007-04-05 00:16:05Z michi $
+   $Id: asmpart.S 7678 2007-04-09 17:23:55Z twisti $
 
 */
 
@@ -447,7 +447,7 @@ _crit_end:
 /* disable exec-stacks ********************************************************/
 
 #if defined(__linux__) && defined(__ELF__)
-       .section .note.GNU-stack,"",@progbits
+       .section .note.GNU-stack,"",%progbits
 #endif
 
 
index aefd39379aedc55b034dd6fd708292264c32d5d0..5b5118161483947be8bcbc99ba747cfeda4aacdb 100644 (file)
@@ -39,7 +39,7 @@
    memory. All functions writing values into the data area return the offset
    relative the begin of the code area (start of procedure).   
 
-   $Id: codegen-common.c 7674 2007-04-05 13:27:11Z michi $
+   $Id: codegen-common.c 7688 2007-04-12 09:05:12Z michi $
 
 */
 
@@ -301,6 +301,12 @@ bool codegen_generate(jitdata *jd)
        if (CODEGENDATA_HAS_FLAG_ERROR(cd)) {
                /* check for long-branches flag, if it is set we recompile the
                   method */
+
+#if !defined(NDEBUG)
+        if (compileverbose)
+            log_message_method("Re-generating code: ", jd->m);
+#endif
+
                /* XXX maybe we should tag long-branches-methods for recompilation */
 
                if (CODEGENDATA_HAS_FLAG_LONGBRANCHES(cd)) {
@@ -316,6 +322,11 @@ bool codegen_generate(jitdata *jd)
                else {
                        vm_abort("codegen_generate: unknown error occurred during codegen_emit: flags=%x\n", cd->flags);
                }
+
+#if !defined(NDEBUG)
+        if (compileverbose)
+            log_message_method("Re-generating code done: ", jd->m);
+#endif
        }
 
        /* reallocate the memory and finish the code generation */
index ce2a997298a0b0de8be388c518be7b9f19db89e8..f40b406a3e981e795b81fc938abbc9785f89820f 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.S 7667 2007-04-05 00:16:05Z michi $
+   $Id: asmpart.S 7678 2007-04-09 17:23:55Z twisti $
 
 */
 
@@ -708,13 +708,6 @@ asm_criticalsections:
        .long 0
 
 
-/* disable exec-stacks ********************************************************/
-
-#if defined(__linux__) && defined(__ELF__)
-       .section .note.GNU-stack,"",@progbits
-#endif
-
-
 /* asm_get_cycle_count *********************************************************
 
    Get the current time-stamp counter from the CPU.
@@ -726,6 +719,13 @@ asm_get_cycle_count:
        ret
 
 
+/* disable exec-stacks ********************************************************/
+
+#if defined(__linux__) && defined(__ELF__)
+       .section .note.GNU-stack,"",%progbits
+#endif
+
+
 /*
  * 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
index 52ec0d470acac331d8535efd2928a613aa5a3c4d..085c39deca064cc5a9b963fab34960284061ca5b 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.c 7357 2007-02-14 11:35:59Z twisti $
+   $Id: asmpart.c 7675 2007-04-05 14:23:04Z michi $
 
 */
 
@@ -50,6 +50,7 @@
 #include "vm/jit/dseg.h"
 
 #include "vmcore/class.h"
+#include "vmcore/linker.h"
 #include "vmcore/loader.h"
 #include "vmcore/options.h"
 
@@ -307,17 +308,13 @@ void intrp_asm_getclassvalues_atomic(vftbl_t *super, vftbl_t *sub, castinfo *out
 {
        s4 sbv, sdv, sv;
 
-#if defined(ENABLE_THREADS)
-       compiler_lock();
-#endif
+       LOCK_MONITOR_ENTER(linker_classrenumber_lock);
 
        sbv = super->baseval;
        sdv = super->diffval;
        sv  = sub->baseval;
 
-#if defined(ENABLE_THREADS)
-       compiler_unlock();
-#endif
+       LOCK_MONITOR_EXIT(linker_classrenumber_lock);
 
        out->super_baseval = sbv;
        out->super_diffval = sdv;
index 074f33da4d237f651828f60214345276ff37a79c..a2768dfe41524ee68d22e13654d1ac03c21281aa 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.S 7667 2007-04-05 00:16:05Z michi $
+   $Id: asmpart.S 7678 2007-04-09 17:23:55Z twisti $
 
 */
 
@@ -1073,7 +1073,7 @@ compare_and_swap:
 /* disable exec-stacks ********************************************************/
 
 #if defined(__linux__) && defined(__ELF__)
-       .section .note.GNU-stack,"",@progbits
+       .section .note.GNU-stack,"",%progbits
 #endif
 
 
index 69434f9fdd337c2b5b1a528bbf0dd7af9cd6c035..637de3856fb5485aa6ad49568e7480c2bb90b0a3 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 7601 2007-03-28 23:02:50Z michi $
+   $Id: codegen.c 7682 2007-04-10 21:24:14Z twisti $
 
 */
 
@@ -2449,10 +2449,10 @@ bool codegen_emit(jitdata *jd)
 #if SIZEOF_VOID_P == 8
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        if (iptr->sx.val.l == 0)
-                               M_BEQZ(s1, 0);
+                               emit_beqz(cd, iptr->dst.block, s1);
                        else {
                                LCONST(REG_ITMP2, iptr->sx.val.l);
-                               M_BEQ(s1, REG_ITMP2, 0);
+                               emit_beq(cd, iptr->dst.block, s1, REG_ITMP2);
                        }
 #else
                        if (iptr->sx.val.l == 0) {
@@ -2477,16 +2477,16 @@ bool codegen_emit(jitdata *jd)
 
 #if SIZEOF_VOID_P == 8
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       if (iptr->sx.val.l == 0) {
-                               M_BLTZ(s1, 0);
-                       else {
-                               if ((iptr->sx.val.l >= -32768) && (iptr->sx.val.l <= 32767)) {
-                                       M_CMPLT_IMM(s1, iptr->sx.val.l, REG_ITMP1);
-                               else {
+                       if (iptr->sx.val.l == 0)
+                               emit_bltz(cd, iptr->dst.block, s1);
+                       else {
+                               if ((iptr->sx.val.l >= -32768) && (iptr->sx.val.l <= 32767))
+                                       M_CMPLT_IMM(s1, iptr->sx.val.l, REG_ITMP3);
+                               else {
                                        LCONST(REG_ITMP2, iptr->sx.val.l);
-                                       M_CMPLT(s1, REG_ITMP2, REG_ITMP1);
+                                       M_CMPLT(s1, REG_ITMP2, REG_ITMP3);
                                }
-                               M_BNEZ(REG_ITMP1, 0);
+                               emit_bnez(cd, iptr->dst.block, REG_ITMP3);
                        }
 #else
                        if (iptr->sx.val.l == 0) {
@@ -2513,16 +2513,17 @@ bool codegen_emit(jitdata *jd)
 
 #if SIZEOF_VOID_P == 8
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       if (iptr->sx.val.l == 0) {
-                               M_BLEZ(s1, 0);
-                       else {
+                       if (iptr->sx.val.l == 0)
+                               emit_blez(cd, iptr->dst.block, s1);
+                       else {
                                if ((iptr->sx.val.l >= -32769) && (iptr->sx.val.l <= 32766)) {
-                                       M_CMPLT_IMM(s1, iptr->sx.val.l + 1, REG_ITMP1);
-                                       M_BNEZ(REG_ITMP1, 0);
-                               } else {
+                                       M_CMPLT_IMM(s1, iptr->sx.val.l + 1, REG_ITMP2);
+                                       emit_bnez(cd, iptr->dst.block, REG_ITMP2);
+                               }
+                               else {
                                        LCONST(REG_ITMP2, iptr->sx.val.l);
-                                       M_CMPGT(s1, REG_ITMP2, REG_ITMP1);
-                                       M_BEQZ(REG_ITMP1, 0);
+                                       M_CMPGT(s1, REG_ITMP2, REG_ITMP3);
+                                       emit_beqz(cd, iptr->dst.block, REG_ITMP3);
                                }
                        }
 #else
@@ -2552,11 +2553,11 @@ bool codegen_emit(jitdata *jd)
 
 #if SIZEOF_VOID_P == 8
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       if (iptr->sx.val.l == 0) {
-                               M_BNEZ(s1, 0);
-                       else {
+                       if (iptr->sx.val.l == 0)
+                               emit_bnez(cd, iptr->dst.block, s1);
+                       else {
                                LCONST(REG_ITMP2, iptr->sx.val.l);
-                               M_BNE(s1, REG_ITMP2, 0);
+                               emit_bne(cd, iptr->dst.block, s1, REG_ITMP2);
                        }
 #else
                        if (iptr->sx.val.l == 0) {
@@ -2581,16 +2582,17 @@ bool codegen_emit(jitdata *jd)
 
 #if SIZEOF_VOID_P == 8
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       if (iptr->sx.val.l == 0) {
-                               M_BGTZ(s1, 0);
-                       else {
+                       if (iptr->sx.val.l == 0)
+                               emit_bgtz(cd, iptr->dst.block, s1);
+                       else {
                                if ((iptr->sx.val.l >= -32769) && (iptr->sx.val.l <= 32766)) {
-                                       M_CMPLT_IMM(s1, iptr->sx.val.l + 1, REG_ITMP1);
-                                       M_BEQZ(REG_ITMP1, 0);
-                               } else {
+                                       M_CMPLT_IMM(s1, iptr->sx.val.l + 1, REG_ITMP2);
+                                       emit_beqz(cd, iptr->dst.block, REG_ITMP2);
+                               }
+                               else {
                                        LCONST(REG_ITMP2, iptr->sx.val.l);
-                                       M_CMPGT(s1, REG_ITMP2, REG_ITMP1);
-                                       M_BNEZ(REG_ITMP1, 0);
+                                       M_CMPGT(s1, REG_ITMP2, REG_ITMP3);
+                                       emit_bnez(cd, iptr->dst.block, REG_ITMP3);
                                }
                        }
 #else
@@ -2620,16 +2622,17 @@ bool codegen_emit(jitdata *jd)
 
 #if SIZEOF_VOID_P == 8
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       if (iptr->sx.val.l == 0) {
-                               M_BGEZ(s1, 0);
-                       else {
+                       if (iptr->sx.val.l == 0)
+                               emit_bgez(cd, iptr->dst.block, s1);
+                       else {
                                if ((iptr->sx.val.l >= -32768) && (iptr->sx.val.l <= 32767)) {
-                                       M_CMPLT_IMM(s1, iptr->sx.val.l, REG_ITMP1);
-                               } else {
+                                       M_CMPLT_IMM(s1, iptr->sx.val.l, REG_ITMP3);
+                               }
+                               else {
                                        LCONST(REG_ITMP2, iptr->sx.val.l);
-                                       M_CMPLT(s1, REG_ITMP2, REG_ITMP1);
+                                       M_CMPLT(s1, REG_ITMP2, REG_ITMP3);
                                }
-                               M_BEQZ(REG_ITMP1, 0);
+                               emit_beqz(cd, iptr->dst.block, REG_ITMP3);
                        }
 #else
                        if (iptr->sx.val.l == 0) {
index 74a8cfe72dbd9ed91cf621a1ecbdd6b03a409892..24e2cb9767a5d5742fa14ad4d79d2210157c2715 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.h 7601 2007-03-28 23:02:50Z michi $
+   $Id: codegen.h 7677 2007-04-09 11:51:25Z twisti $
 
 */
 
 
 #define BRANCH_NOPS \
     do { \
-        M_NOP; \
-        M_NOP; \
+        if (CODEGENDATA_HAS_FLAG_LONGBRANCHES(cd)) { \
+            M_NOP; \
+            M_NOP; \
+            M_NOP; \
+            M_NOP; \
+            M_NOP; \
+            M_NOP; \
+        } \
+        else { \
+            M_NOP; \
+            M_NOP; \
+        } \
     } while (0)
 
 
index 6e7f7f61d5af6f8dfdd648f5c842406bc2f65cfc..e3feaf675fbd7b576ac01467de34449f5644743c 100644 (file)
@@ -77,21 +77,28 @@ s4 emit_load(jitdata *jd, instruction *iptr, varinfo *src, s4 tempreg)
 
                disp = src->vv.regoff * 8;
 
-               if (IS_FLT_DBL_TYPE(src->type)) {
-                       if (IS_2_WORD_TYPE(src->type))
-                               M_DLD(tempreg, REG_SP, disp);
-                       else
-                               M_FLD(tempreg, REG_SP, disp);
-               }
-               else {
+               switch (src->type) {
 #if SIZEOF_VOID_P == 8
+               case TYPE_INT:
+               case TYPE_LNG:
+               case TYPE_ADR:
                        M_LLD(tempreg, REG_SP, disp);
+                       break;
 #else
-                       if (IS_2_WORD_TYPE(src->type))
-                               M_LLD(tempreg, REG_SP, disp);
-                       else
-                               M_ILD(tempreg, REG_SP, disp);
+               case TYPE_INT:
+               case TYPE_ADR:
+                       M_ILD(tempreg, REG_SP, disp);
+                       break;
+               case TYPE_LNG:
+                       M_LLD(tempreg, REG_SP, disp);
+                       break;
 #endif
+               case TYPE_FLT:
+               case TYPE_DBL:
+                       M_DLD(tempreg, REG_SP, disp);
+                       break;
+               default:
+                       vm_abort("emit_load: unknown type %d", src->type);
                }
 
                reg = tempreg;
@@ -203,21 +210,28 @@ void emit_store(jitdata *jd, instruction *iptr, varinfo *dst, s4 d)
 
                disp = dst->vv.regoff * 8;
 
-               if (IS_FLT_DBL_TYPE(dst->type)) {
-                       if (IS_2_WORD_TYPE(dst->type))
-                               M_DST(d, REG_SP, disp);
-                       else
-                               M_FST(d, REG_SP, disp);
-               }
-               else {
+               switch (dst->type) {
 #if SIZEOF_VOID_P == 8
+               case TYPE_INT:
+               case TYPE_LNG:
+               case TYPE_ADR:
                        M_LST(d, REG_SP, disp);
+                       break;
 #else
-                       if (IS_2_WORD_TYPE(dst->type))
-                               M_LST(d, REG_SP, disp);
-                       else
-                               M_IST(d, REG_SP, disp);
+               case TYPE_INT:
+               case TYPE_ADR:
+                       M_IST(d, REG_SP, disp);
+                       break;
+               case TYPE_LNG:
+                       M_LST(d, REG_SP, disp);
+                       break;
 #endif
+               case TYPE_FLT:
+               case TYPE_DBL:
+                       M_DST(d, REG_SP, disp);
+                       break;
+               default:
+                       vm_abort("emit_store: unknown type %d", dst->type);
                }
        }
 }
@@ -264,21 +278,30 @@ void emit_copy(jitdata *jd, instruction *iptr, varinfo *src, varinfo *dst)
                }
 
                if (s1 != d) {
-                       if (IS_FLT_DBL_TYPE(src->type)) {
-                               if (IS_2_WORD_TYPE(src->type))
-                                       M_DMOV(s1, d);
-                               else
-                                       M_FMOV(s1, d);
-                       }
-                       else {
+                       switch (dst->type) {
 #if SIZEOF_VOID_P == 8
+                       case TYPE_INT:
+                       case TYPE_LNG:
+                       case TYPE_ADR:
                                M_MOV(s1, d);
+                               break;
 #else
-                               if (IS_2_WORD_TYPE(src->type))
-                                       M_LNGMOVE(s1, d);
-                               else
-                                       M_MOV(s1, d);
+                       case TYPE_INT:
+                       case TYPE_ADR:
+                               M_MOV(s1, d);
+                               break;
+                       case TYPE_LNG:
+                               M_LNGMOVE(s1, d);
+                               break;
 #endif
+                       case TYPE_FLT:
+                               M_FMOV(s1, d);
+                               break;
+                       case TYPE_DBL:
+                               M_DMOV(s1, d);
+                               break;
+                       default:
+                               vm_abort("emit_copy: unknown type %d", dst->type);
                        }
                }
 
@@ -383,7 +406,38 @@ void emit_branch(codegendata *cd, s4 disp, s4 condition, s4 reg, u4 opt)
                                                          CODEGENDATA_FLAG_LONGBRANCHES);
                        }
 
-                       vm_abort("emit_branch: emit conditional long-branch code");
+                       switch (condition) {
+                       case BRANCH_EQ:
+                               M_BNE(GET_HIGH_REG(reg), GET_LOW_REG(reg), 5);
+                               break;
+                       case BRANCH_NE:
+                               M_BEQ(GET_HIGH_REG(reg), GET_LOW_REG(reg), 5);
+                               break;
+                       case BRANCH_LT:
+                               M_BGEZ(reg, 5);
+                               break;
+                       case BRANCH_GE:
+                               M_BLTZ(reg, 5);
+                               break;
+                       case BRANCH_GT:
+                               M_BLEZ(reg, 5);
+                               break;
+                       case BRANCH_LE:
+                               M_BGTZ(reg, 5);
+                               break;
+                       default:
+                               vm_abort("emit_branch: unknown condition %d", condition);
+                       }
+
+                       /* The actual branch code which is over-jumped (NOTE: we
+                          don't use a branch delay slot here). */
+
+                       M_LUI(REG_ITMP3, branchdisp >> 16);
+                       M_OR_IMM(REG_ITMP3, branchdisp, REG_ITMP3);
+                       M_AADD(REG_PV, REG_ITMP3, REG_ITMP3);
+                       M_JMP(REG_ITMP3);
+                       M_NOP;
+
                }
                else {
                        switch (condition) {
index 59e7ced9397bd96e12899805434bc501a6e9bb72..8beb3adf7954352d5d1578919ee1515543e58b73 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-os.c 7615 2007-03-29 23:10:59Z michi $
+   $Id: md-os.c 7688 2007-04-12 09:05:12Z michi $
 
 */
 
@@ -119,17 +119,14 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
        sp  = (u1 *) (ptrint) _gregs[REG_SP];
        ra  = (u1 *) (ptrint) _gregs[REG_RA];        /* this is correct for leafs */
 
-#if defined(__UCLIBC__)
-       xpc = (u1 *) (ptrint) _gregs[CTX_EPC];
+#if !defined(__UCLIBC__) && ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 5))
+       /* NOTE: We only need this for pre glibc-2.5. */
 
-#error how to get the cause?
-#else
        xpc = (u1 *) (ptrint) _mc->pc;
 
        /* get the cause of this exception */
 
        cause = _mc->cause;
-#endif
 
        /* check the cause to find the faulting instruction */
 
@@ -143,7 +140,11 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
        case 0x00000010:
                /* AdEL: XPC is of the following instruction */
                xpc = xpc - 4;
+               break;
        }
+#else
+       xpc = (u1 *) (ptrint) _gregs[CTX_EPC];
+#endif
 
        /* get exception-throwing instruction */
 
@@ -153,14 +154,13 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
        s1   = M_ITYPE_GET_RS(mcode);
        disp = M_ITYPE_GET_IMM(mcode);
 
-       val   = _gregs[d];
-
        /* check for special-load */
 
        if (s1 == REG_ZERO) {
                /* we use the exception type as load displacement */
 
                type = disp;
+               val  = _gregs[d];
        }
        else {
                /* This is a normal NPE: addr must be NULL and the NPE-type
@@ -168,6 +168,7 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
 
                addr = _gregs[s1];
                type = (s4) addr;
+               val  = 0;
        }
 
        /* generate appropriate exception */
index 3ffb9d19d00a234679e93ace34820b296f7ecf18..7d8ce2f4885b56095d0f54bacd0f8ab6e8764816 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.S 7667 2007-04-05 00:16:05Z michi $
+   $Id: asmpart.S 7678 2007-04-09 17:23:55Z twisti $
 
 */
 
@@ -1697,7 +1697,7 @@ L_replace_free_safestack$lazy_ptr:
 /* disable exec-stacks ********************************************************/
 
 #if defined(__linux__) && defined(__ELF__)
-       .section .note.GNU-stack,"",@progbits
+       .section .note.GNU-stack,"",%progbits
 #endif
 
 
index 6147447c515646f2c3864e346b2bd0804bd5753b..9b8de657a20605f6d8e984a1d28996783223e7be 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: arch.h 7596 2007-03-28 21:05:53Z twisti $
+   $Id: arch.h 7687 2007-04-11 16:39:22Z tbfg $
 
 */
 
@@ -52,7 +52,7 @@
 #define SUPPORT_LONG_CMP                 1
 #define SUPPORT_LONG_CMP_CONST           1
 #define SUPPORT_LONG_LOGICAL             1
-#define SUPPORT_LONG_SHIFT               0     /* TODO: implement ICMD_IMULPOW2 and reenable*/
+#define SUPPORT_LONG_SHIFT               1     
 #define SUPPORT_LONG_MUL                 1
 #define SUPPORT_LONG_DIV                 1
 #define SUPPORT_LONG_ICVT                1
index e3262a34f16fa0f8624ee70905fdc45c7e22db76..af871ae593ace58e176260d07a51f93bcbbdbc54 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.S 7667 2007-04-05 00:16:05Z michi $
+   $Id: asmpart.S 7678 2007-04-09 17:23:55Z twisti $
 
 */
 
@@ -1553,7 +1553,7 @@ L_replace_me$lazy_ptr:
 /* disable exec-stacks ********************************************************/
 
 #if defined(__linux__) && defined(__ELF__)
-       .section .note.GNU-stack,"",@progbits
+       .section .note.GNU-stack,"",%progbits
 #endif
 
 
index a31cbd8d113a1c8483cf988615e9a24b950bb526..baa30d41362a1f131864e6486161419e08d49852 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 7596 2007-03-28 21:05:53Z twisti $
+   $Id: codegen.c 7687 2007-04-11 16:39:22Z tbfg $
 
 */
 
@@ -736,7 +736,7 @@ bool codegen_emit(jitdata *jd)
                        break;
 
                case ICMD_IDIVPOW2:   /* ..., value  ==> ..., value << constant       */
-                                     
+                     
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
                        M_SRA_IMM(s1, iptr->sx.val.i, d);
@@ -790,7 +790,9 @@ bool codegen_emit(jitdata *jd)
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
                        M_AND_IMM(s2, 0x1f, REG_ITMP2);
-                       M_SRL(s1, REG_ITMP2, d);
+                       M_MOV(s1, REG_ITMP1);
+                       M_CLR_HIGH(REG_ITMP1);
+                       M_SRL(REG_ITMP1, REG_ITMP2, d);
                        emit_store_dst(jd, iptr, d);
                        break;
 
@@ -800,12 +802,56 @@ bool codegen_emit(jitdata *jd)
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
                        if (iptr->sx.val.i & 0x1f) {
-                               M_SRL_IMM(s1, iptr->sx.val.i & 0x1f, d);
+                               M_MOV(s1, REG_ITMP1);
+                               M_CLR_HIGH(REG_ITMP1);
+                               M_SRA_IMM(REG_ITMP1, iptr->sx.val.i & 0x1f, d);
                        } else {
                                M_INTMOVE(s1, d);
                        }
                        emit_store_dst(jd, iptr, d);
                        break;
+       
+               case ICMD_LSHLCONST:
+                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
+                       M_SLL_IMM(s1, iptr->sx.val.i & 0x3f, d);
+                       emit_store_dst(jd, iptr, d);
+                       break;
+               case ICMD_LSHL:
+                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, REG_ITMP2);
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
+                       M_AND_IMM(s2, 0x3f, REG_ITMP2);
+                       M_SLL(s1, REG_ITMP2, d);
+                       emit_store_dst(jd, iptr, d);
+                       break;
+               case ICMD_LSHRCONST:
+                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
+                       M_SRA_IMM(s1, iptr->sx.val.i & 0x3f, d);
+                       emit_store_dst(jd, iptr, d);
+                       break;
+               case ICMD_LSHR:
+                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, REG_ITMP2);
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
+                       M_SRA(s1, s2, d);
+                       emit_store_dst(jd, iptr, d);
+                       break;
+               case ICMD_LUSHRCONST:
+                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
+                       M_SRL_IMM(s1, iptr->sx.val.i & 0x3f, d);
+                       emit_store_dst(jd, iptr, d);
+                       break;
+               case ICMD_LUSHR:
+                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, REG_ITMP2);
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
+                       M_AND_IMM(s2, 0x3f, REG_ITMP2);
+                       M_SRL(s1, REG_ITMP2, d);
+                       emit_store_dst(jd, iptr, d);
+                       break;
 
                case ICMD_IAND:       /* ..., val1, val2  ==> ..., val1 & val2        */
                case ICMD_LAND:
index ae16d48dc63a6d3d80c6fe72c34f1977f49cb530..a049348fa2745dc264d97c83e262aebdad3ba06d 100644 (file)
@@ -30,7 +30,7 @@
             Christian Thalinger
             Christian Ullrich
 
-   $Id: codegen.h 7596 2007-03-28 21:05:53Z twisti $
+   $Id: codegen.h 7687 2007-04-11 16:39:22Z tbfg $
 
 */
 
 #define M_XOR_IMM(a,b,c)                M_OP2_IMM(26, a, c, b)
 #define M_XORIS(a,b,c)                  M_OP2_IMM(27, a, c, b)
 
+/* RLDICR is said to be turing complete, this seems right */
 #define M_SLL(a,b,c)                    M_OP3(31, 27, 0, 0, a, c, b)
-#define M_SRL(a,b,c)                    M_OP3(31, 536, 0, 0, a, c, b)
-#define M_SRA(a,b,c)                    M_OP3(31, 792, 0, 0, a, c, b)
-#define M_SRA_IMM(a,b,c)                M_OP3(31, 824, 0, 0, a, c, b)
+#define M_SLL_IMM(a,b,c)                M_OP3(30, ((b)&0x20 ? 1:0), 0, ((((63-(b))&0x1f)<<6) | (((63-(b))&0x20 ? 1:0)<<5) | 0x04), a, c, (b)&0x1f);
+#define M_SRL(a,b,c)                    M_OP3(31, 539, 0, 0, a, c, b)
+#define M_SRL_IMM(a,b,c)                M_OP3(30, ((64-(b))&0x20 ? 1:0), 0, (((((b))&0x1f)<<6) | ((((b))&0x20 ? 1:0)<<5) | 0x00), a, c, (64-(b))&0x1f);
+#define M_SRA(a,b,c)                    M_OP3(31, 794, 0, 0, a, c, b)
+#define M_SRA_IMM(a,b,c)                M_OP3(31, (826 | ((b)&0x20?1:0)), 0, 0, a, c, ((b)&0x1f))
 
 #define M_MUL(a,b,c)                   M_OP3(31, 233, 0, 0, c, a, b)
 #define M_MUL_IMM(a,b,c)               M_OP2_IMM(7, c, a, b)
 #define M_SUBFZE(a,b)                   M_OP3(31, 200, 0, 0, b, a, 0)
 #define M_RLWINM(a,b,c,d,e)             M_OP4(21, d, 0, a, e, b, c)
 #define M_ADDZE(a,b)                    M_OP3(31, 202, 0, 0, b, a, 0)
-#define M_SLL_IMM(a,b,c)                M_OP3(30, ((b)&0x20 ? 1:0), 0, ((((63-(b))&0x1f)<<6) | (((63-(b))&0x20 ? 1:0)<<5) | 0x04), a, c, (b)&0x1f);    /* RLDICR is said to be turing complete, this seems right */
-#define M_SRL_IMM(a,b,c)                M_RLWINM(a,32-(b),b,31,c)
 #define M_ADDIS(a,b,c)                  M_OP2_IMM(15, c, a, b)
 #define M_STFIWX(a,b,c)                 M_OP3(31, 983, 0, 0, a, b, c)
 
 
 #define M_LDATST(a,b,c)                 M_ADDICTST(b, c, a)
 #define M_CLR(a)                        M_LADD_IMM(0, 0, a)
+#define M_CLR_HIGH(a)                  M_OP3(30, 0, 0, 0x20, (a), (a), 0);
 #define M_AADD_IMM(a,b,c)               M_LADD_IMM(a, b, c)
 
 #endif /* _CODEGEN_H */
index 33290ba506fa9b6b03920e03ca198a81246ed0cf..68426c2c69cf7dcdff8eda3c1eb1abf9ded24335 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: arch.h 7616 2007-03-29 23:21:50Z michi $
+   $Id: arch.h 7680 2007-04-10 05:02:20Z pm $
 
 */
 
 
 #define SUPPORT_I2F                      1
 #define SUPPORT_I2D                      1
-#define SUPPORT_L2F                      1
-#define SUPPORT_L2D                      1
+#define SUPPORT_L2F                      0
+#define SUPPORT_L2D                      0
 
-#define SUPPORT_F2I                      0
+#define SUPPORT_F2I                      1
 #define SUPPORT_F2L                      0
-#define SUPPORT_D2I                      0
+#define SUPPORT_D2I                      1
 #define SUPPORT_D2L                      0
 
 #define SUPPORT_LONG_ADD                 1
@@ -60,8 +60,8 @@
 #define SUPPORT_LONG_MUL                 0
 #define SUPPORT_LONG_DIV                 0
 
-#define SUPPORT_LONG_DIV_POW2            1
-#define SUPPORT_LONG_REM_POW2            1
+#define SUPPORT_LONG_DIV_POW2            0
+#define SUPPORT_LONG_REM_POW2            0
 
 #define SUPPORT_CONST_LOGICAL            1  /* AND, OR, XOR with immediates   */
 #define SUPPORT_CONST_MUL                1  /* mutiply with immediate         */
index ff864b1f63309de1cfd764cff2fe468ec1bd6b59..1cceb97d3d313dd1eaa5d6f94e848daa5668fbc8 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.S 7667 2007-04-05 00:16:05Z michi $
+   $Id: asmpart.S 7680 2007-04-10 05:02:20Z pm $
 
 */
 
  * We setup a temporary literal pool pointer.
  */
 
-#define PIC_CALL(fun, magic)                                  \
-       bras itmp3, L_##magic##_lp_end                          ; \
-L_##magic##_lp:                                             ; \
-L_##magic##_lp_5:                                           ; \
-       .long fun@PLTOFF                                        ; \
-L_##magic##_lp_4:                                           ; \
-       .long _GLOBAL_OFFSET_TABLE_-L_##magic##_lp              ; \
-L_##magic##_lp_end:                                         ; \
-       l       itmp2,L_##magic##_lp_4-L_##magic##_lp(itmp3)    ; \
-       la      itmp2,0(itmp2,itmp3)                            ; \
-       l       itmp1,L_##magic##_lp_5-L_##magic##_lp(itmp3)    ; \
-       bas     %r14,0(itmp1,itmp2)                             
-
        .text
 
 
@@ -452,7 +439,7 @@ L_handle_d1:
        j     L_register_copy
 
 asm_vm_call_method_end:
-       nop
+       brc   0,0       
 
 /****************** function asm_call_jit_compiler *****************************
 *                                                                              *
@@ -599,6 +586,7 @@ L_ahe_bras2:
 
        lr      xpc,v0                      /* move handlerpc into xpc            */
        l       xptr,0*4(sp)                /* restore exception pointer          */
+       l       pv,2*4(sp)                  /* restore PV                         */
        l       %r0,4*4(sp)                 /* get maybe-leaf flag                */
        ahi     sp,(6*4)                    /* free stack frame                   */
 
@@ -624,7 +612,7 @@ L_asm_handle_exception_not_catched:
        jz      L_asm_handle_exception_no_leaf_stack
 
        ahi     sp, (ARGUMENT_REGISTERS_SIZE + TEMPORARY_REGISTERS_SIZE) /* Remove maybe-leaf stackframe */
-       lhi     %r0,0                       /* clear the isleaf flags             */
+       lhi     %r0,0                       /* clear the isleaf flag              */
 
        /*
        +-----------------+-----------+---------+----+
@@ -633,59 +621,59 @@ L_asm_handle_exception_not_catched:
        +-----------------+-----------+---------+----+
        ^                 ^           ^
        SP                F           I
+
+                                     ^         ^    ^
+                                  p3        p2   p1    
        */
 
 L_asm_handle_exception_no_leaf_stack:
 
        l       itmp2,0xfff+FrameSize(itmp3)/* get frame size                     */
-       la      itmp2,0(itmp2,sp)           /* pointer to save area */
-       ahi     itmp2,-4                    /* skip RA */
+       la      itmp2,0(itmp2,sp)           /* pointer to save area (p1) */
+       ahi     itmp2,-4                    /* skip RA (p2) */
+       ahi     itmp2,-0xfff                /* for negative displacements */
 
        l       a0,0xfff+IntSave(itmp3)     /* a0 = saved int register count  */
 
        ltr     a0,a0
        je      noint
 
-       sll     a0,2                        /* a0 = saved int register count * 4 */
-       sr      itmp2, a0                   /* skip Int Sav */
-
-       chi     a0,1*4
+       chi     a0,1
        je      int1
-       chi     a0,2*4
+       chi     a0,2
        je      int2
-       chi     a0,3*4
+       chi     a0,3
        je      int3
-       chi     a0,4*4
+       chi     a0,4
        je      int4
        
-       l       s0,0*4(itmp2)
+int5:
+       l       s0,0xfff-5*4(itmp2)
 int4:   
-       l       s1,1*4(itmp2)
+       l       s1,0xfff-4*4(itmp2)
 int3:   
-       l       s2,2*4(itmp2)
+       l       s2,0xfff-3*4(itmp2)
 int2:   
-       l       s3,3*4(itmp2)
+       l       s3,0xfff-2*4(itmp2)
 int1:   
-       l       s4,4*4(itmp2)
+       l       s4,0xfff-1*4(itmp2)
 
 noint:
 
+       sll     a0,2                        /* a0 = saved int register count * 4 */
+       sr      itmp2, a0                   /* skip Int Sav (p3) */
+
        l       a0,0xfff+FltSave(itmp3)
        ltr         a0,a0                       /* Number of saved floating point registers */
        je      noflt
 
-       sll     a0,3                        /* Number of saved floating point registers * 8 */
-       sr      itmp2,a0
-       
-       chi     a0,1*8
+       chi     a0,1
        je      flt1
-       chi    a0,2*8
-       je      flt2
 
 flt2:   
-       ld    %f6,1*8(itmp2)
+       ld    %f4,0xfff-2*8(itmp2)
 flt1:   
-       ld    %f4,0*8(itmp2)
+       ld    %f6,0xfff-1*8(itmp2)
                 
 noflt:
 
@@ -1014,7 +1002,7 @@ asm_criticalsections:
 #if 0
 
 #if defined(__linux__) && defined(__ELF__)
-       .section .note.GNU-stack,"",@progbits
+       .section .note.GNU-stack,"",%progbits
 #endif
 
 
index b3a7920b99764bed88bca202eb714b41722ce122..6880e972ff50573d502d6076eec3591b6a243655 100644 (file)
@@ -29,7 +29,7 @@
             Christian Ullrich
             Edwin Steiner
 
-   $Id: codegen.c 7616 2007-03-29 23:21:50Z michi $
+   $Id: codegen.c 7680 2007-04-10 05:02:20Z pm $
 
 */
 
 
 void panic() { }
 
-#if 0
-u1 *createcompilerstub(methodinfo *m) {
-       OOPS();
-       u1 *stub = malloc(8);
-       bzero(stub, 8);
-       return stub;
-}
-#endif
-
-#if 0
-u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd) {
-       OOPS();
-       return createcompilerstub(NULL);
-}
-#endif
-
-
-
 /* codegen *********************************************************************
 
    Generates machine code.
@@ -114,7 +96,7 @@ bool codegen(jitdata *jd)
        codeinfo           *code;
        codegendata        *cd;
        registerdata       *rd;
-       s4                  len, s1, s2, s3, d, disp;
+       s4                  len, s1, s2, s3, d, dd, disp;
        u2                  currentline;
        ptrint              a;
        varinfo            *var, *var1, *var2, *dst;
@@ -599,30 +581,30 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1); 
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
-                       N_LCR(d, s1);
+                       M_INEG(s1, d);
                        emit_store_dst(jd, iptr, d);
 
                        break;
 
                case ICMD_LNEG:       /* ..., value  ==> ..., - value                 */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1); 
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
-                       M_INTMOVE(s1, d);
-                       M_LNEG(d);
+
+                       s1 = emit_load_s1(jd, iptr, REG_ITMP12_PACKED);
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP12_PACKED);
+                       M_INEG(GET_HIGH_REG(s1), GET_HIGH_REG(d));
+                       M_INEG(GET_LOW_REG(s1), GET_LOW_REG(d));
+                       N_BRC(8 /* result zero, no overflow */, SZ_BRC + SZ_AHI); 
+                       N_AHI(GET_HIGH_REG(d), -1);
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_I2L:        /* ..., value  ==> ..., value                   */
 
                        d = emit_alloc_dst_even_odd(jd, iptr, R0, REG_ITMP1, REG_ITMP2);
-                       s2 = emit_load_s2(jd, iptr, GET_HIGH_REG(d)); 
+                       s1 = emit_load_s1(jd, iptr, GET_HIGH_REG(d)); 
 
-                       M_INTMOVE(s2, GET_HIGH_REG(d));
+                       M_INTMOVE(s1, GET_HIGH_REG(d));
                        ICONST(GET_LOW_REG(d), 0);
-                       N_SRDA(GET_HIGH_REG(d), 32, RN);
+                       M_SRDA_IMM(32, GET_HIGH_REG(d));
 
                        emit_copy_dst(jd, iptr, d);
                        emit_store_dst(jd, iptr, d);
@@ -638,35 +620,33 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_INT2BYTE:   /* ..., value  ==> ..., value                   */
-                       OOPS();
-#if 0
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
-                       M_BSEXT(s1, d);
+                       M_SLA_IMM(24, d);
+                       M_SRA_IMM(24, d);
+                       M_INTMOVE(s1, d);
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_INT2CHAR:   /* ..., value  ==> ..., value                   */
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
                        M_INTMOVE(s1, d);
-                       N_SLL(d, 16, RN);
-                       N_SRL(d, 16, RN);
+                       M_SLL_IMM(16, d);
+                       M_SRL_IMM(16, d);
                        emit_store_dst(jd, iptr, d);
                        break;
 
                case ICMD_INT2SHORT:  /* ..., value  ==> ..., value                   */
-                       OOPS();
-#if 0
+
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
-                       M_SSEXT(s1, d);
+                       M_SLA_IMM(16, d);
+                       M_SRA_IMM(16, d);
+                       M_INTMOVE(s1, d);
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
-
                case ICMD_IADD:       /* ..., val1, val2  ==> ..., val1 + val2        */
 
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
@@ -700,36 +680,65 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_LADD:       /* ..., val1, val2  ==> ..., val1 + val2        */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
-                       if (s2 == d)
-                               M_LADD(s1, d);
-                       else {
-                               M_INTMOVE(s1, d);
-                               M_LADD(s2, d);
+
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP12_PACKED);
+
+                       s1 = emit_load_s1_high(jd, iptr, GET_HIGH_REG(d));
+                       s2 = emit_load_s2_high(jd, iptr, REG_ITMP3);
+                       dd = GET_HIGH_REG(d);
+
+                       if (s2 == dd) {
+                               M_IADD(s1, dd);
+                       } else {
+                               M_INTMOVE(s1, dd);
+                               M_IADD(s2, dd);
+                       }
+
+                       s1 = emit_load_s1_low(jd, iptr, GET_LOW_REG(d));
+                       s2 = emit_load_s2_low(jd, iptr, REG_ITMP3);
+                       dd = GET_LOW_REG(d);
+
+                       if (s2 == dd) {
+                               N_ALR(dd, s1);
+                       } else {
+                               M_INTMOVE(s1, dd);
+                               N_ALR(dd, s2);
                        }
+
+                       N_BRC(8 | 4, SZ_BRC + SZ_AHI); 
+                       N_AHI(GET_HIGH_REG(d), 1);
+
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_LADDCONST:  /* ..., value  ==> ..., value + constant        */
                                      /* sx.val.l = constant                             */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
-                       M_INTMOVE(s1, d);
-                       if (IS_IMM32(iptr->sx.val.l))
-                               M_LADD_IMM(iptr->sx.val.l, d);
-                       else {
-                               M_MOV_IMM(iptr->sx.val.l, REG_ITMP2);
-                               M_LADD(REG_ITMP2, d);
+
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP12_PACKED);
+
+                       s1 = emit_load_s1_high(jd, iptr, GET_HIGH_REG(d));
+                       s3 = iptr->sx.val.l >> 32;
+
+                       M_INTMOVE(s1, GET_HIGH_REG(d));
+
+                       if (N_VALID_IMM(s3)) {
+                               N_AHI(s1, s3);
+                       } else {
+                               ICONST(REG_ITMP3, s3);
+                               M_IADD(REG_ITMP3, s1);
                        }
+
+                       s1 = emit_load_s1_low(jd, iptr, GET_LOW_REG(d));
+                       s3 = iptr->sx.val.l & 0xffffffff;
+                       ICONST(REG_ITMP3, s3);
+
+                       M_INTMOVE(s1, GET_LOW_REG(d));
+                       N_ALR(GET_LOW_REG(d), REG_ITMP3);
+
+                       N_BRC(8 | 4, SZ_BRC + SZ_AHI); 
+                       N_AHI(GET_HIGH_REG(d), 1);
+
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_ISUB:       /* ..., val1, val2  ==> ..., val1 - val2        */
@@ -768,38 +777,66 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_LSUB:       /* ..., val1, val2  ==> ..., val1 - val2        */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
-                       if (s2 == d) {
-                               M_INTMOVE(s1, REG_ITMP1);
-                               M_LSUB(s2, REG_ITMP1);
-                               M_INTMOVE(REG_ITMP1, d);
-                       } else {
-                               M_INTMOVE(s1, d);
-                               M_LSUB(s2, d);
+
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP12_PACKED);
+
+                       s1 = emit_load_s1_high(jd, iptr, GET_HIGH_REG(d));
+                       s2 = emit_load_s2_high(jd, iptr, REG_ITMP3);
+                       dd = GET_HIGH_REG(d);
+
+                       if (s2 == dd) {
+                               M_INTMOVE(s2, REG_ITMP3);
+                               s2 = REG_ITMP3;
                        }
+
+                       M_INTMOVE(s1, dd);
+                       M_ISUB(s2, dd);
+
+                       s1 = emit_load_s1_low(jd, iptr, GET_LOW_REG(d));
+                       s2 = emit_load_s2_low(jd, iptr, REG_ITMP3);
+                       dd = GET_LOW_REG(d);
+
+                       if (s2 == dd) {
+                               M_INTMOVE(s2, REG_ITMP3);
+                               s2 = REG_ITMP3;
+                       } 
+
+                       M_INTMOVE(s1, dd);
+                       N_SLR(dd, s2);
+
+                       N_BRC(1 | 2, SZ_BRC + SZ_AHI); 
+                       N_AHI(GET_HIGH_REG(d), -1);
+
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_LSUBCONST:  /* ..., value  ==> ..., value - constant        */
                                      /* sx.val.l = constant                             */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
-                       M_INTMOVE(s1, d);
-                       if (IS_IMM32(iptr->sx.val.l))
-                               M_LSUB_IMM(iptr->sx.val.l, d);
-                       else {
-                               M_MOV_IMM(iptr->sx.val.l, REG_ITMP2);
-                               M_LSUB(REG_ITMP2, d);
+
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP12_PACKED);
+
+                       s1 = emit_load_s1_high(jd, iptr, GET_HIGH_REG(d));
+                       s3 = iptr->sx.val.l >> 32;
+
+                       M_INTMOVE(s1, GET_HIGH_REG(d));
+
+                       if (N_VALID_IMM(-s3)) {
+                               M_IADD_IMM(-s3, s1);
+                       } else {
+                               ICONST(REG_ITMP3, s3);
+                               M_ISUB(REG_ITMP3, s1);
                        }
+
+                       s1 = emit_load_s1_low(jd, iptr, GET_LOW_REG(d));
+                       s3 = iptr->sx.val.l & 0xffffffff;
+                       ICONST(REG_ITMP3, s3);
+
+                       N_SLR(GET_LOW_REG(d), REG_ITMP3);
+
+                       N_BRC(1 | 2, SZ_BRC + SZ_AHI); 
+                       N_AHI(GET_HIGH_REG(d), -1);
+
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_IMUL:       /* ..., val1, val2  ==> ..., val1 * val2        */
@@ -823,7 +860,7 @@ bool codegen(jitdata *jd)
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
                        M_INTMOVE(s1, d);
                        if (iptr->sx.val.i == 2) {
-                               M_ISLL_IMM(1, d);
+                               M_SLL_IMM(1, d);
                        } else if (N_VALID_IMM(iptr->sx.val.i)) {
                                M_IMUL_IMM(iptr->sx.val.i, d);
                        } else {
@@ -845,19 +882,26 @@ bool codegen(jitdata *jd)
 
                        s2 = emit_load_s2_notzero(jd, iptr, REG_ITMP2);
 
+                       M_TEST(s2);
+                       M_BEQ(0);
+                       codegen_add_arithmeticexception_ref(cd);
+
                        s1 = emit_load_s1(jd, iptr, R0);
                        M_INTMOVE(s1, R0);
-                       N_LHI(REG_ITMP1, 0);
-                       N_SRDA(R0, 32, RN);
+                       M_CLR(REG_ITMP1);
+                       M_SRDA_IMM(32, R0);
 
                        N_DR(R0, s2);
 
-                       if (iptr->opc == ICMD_IREM) {
-                               d = codegen_reg_of_dst(jd, iptr, R0);
-                               M_INTMOVE(R0, d);
-                       } else {
-                               d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
-                               M_INTMOVE(REG_ITMP1, d);
+                       switch (iptr->opc) {
+                               case ICMD_IREM:
+                                       d = codegen_reg_of_dst(jd, iptr, R0);
+                                       M_INTMOVE(R0, d);
+                                       break;
+                               case ICMD_IDIV:
+                                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
+                                       M_INTMOVE(REG_ITMP1, d);
+                                       break;
                        }
 
                        emit_store_dst(jd, iptr, d);
@@ -866,71 +910,42 @@ bool codegen(jitdata *jd)
 
                        break;
 
-               case ICMD_IDIVPOW2:   /* ..., value  ==> ..., value >> constant       */
-                                     /* sx.val.i = constant                             */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
-                       M_INTMOVE(s1, REG_ITMP1);
-                       emit_alul_imm_reg(cd, ALU_CMP, -1, REG_ITMP1);
-                       emit_leal_membase_reg(cd, REG_ITMP1, (1 << iptr->sx.val.i) - 1, REG_ITMP2);
-                       emit_cmovccl_reg_reg(cd, CC_LE, REG_ITMP2, REG_ITMP1);
-                       emit_shiftl_imm_reg(cd, SHIFT_SAR, iptr->sx.val.i, REG_ITMP1);
-                       emit_mov_reg_reg(cd, REG_ITMP1, d);
-                       emit_store_dst(jd, iptr, d);
-#endif
-                       break;
+               case ICMD_LDIV:       /* ..., val1, val2  ==> ..., val1 / val2        */
+               case ICMD_LREM:       /* ..., val1, val2  ==> ..., val1 % val2        */
 
-               case ICMD_IREMPOW2:   /* ..., value  ==> ..., value % constant        */
-                                     /* sx.val.i = constant                             */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
-                       M_INTMOVE(s1, REG_ITMP1);
-                       emit_alul_imm_reg(cd, ALU_CMP, -1, REG_ITMP1);
-                       emit_leal_membase_reg(cd, REG_ITMP1, iptr->sx.val.i, REG_ITMP2);
-                       emit_cmovccl_reg_reg(cd, CC_G, REG_ITMP1, REG_ITMP2);
-                       emit_alul_imm_reg(cd, ALU_AND, -1 - (iptr->sx.val.i), REG_ITMP2);
-                       emit_alul_reg_reg(cd, ALU_SUB, REG_ITMP2, REG_ITMP1);
-                       emit_mov_reg_reg(cd, REG_ITMP1, d);
-                       emit_store_dst(jd, iptr, d);
-#endif
-                       break;
+                       bte = iptr->sx.s23.s3.bte;
+                       md  = bte->md;
 
+                       /* test s2 for zero */
 
-               case ICMD_LDIVPOW2:   /* ..., value  ==> ..., value >> constant       */
-                                     /* sx.val.i = constant                             */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
-                       M_INTMOVE(s1, REG_ITMP1);
-                       emit_alu_imm_reg(cd, ALU_CMP, -1, REG_ITMP1);
-                       emit_lea_membase_reg(cd, REG_ITMP1, (1 << iptr->sx.val.i) - 1, REG_ITMP2);
-                       emit_cmovcc_reg_reg(cd, CC_LE, REG_ITMP2, REG_ITMP1);
-                       emit_shift_imm_reg(cd, SHIFT_SAR, iptr->sx.val.i, REG_ITMP1);
-                       emit_mov_reg_reg(cd, REG_ITMP1, d);
-                       emit_store_dst(jd, iptr, d);
-#endif
-                       break;
+                       s2 = emit_load_s2(jd, iptr, REG_ITMP12_PACKED);
+                       M_INTMOVE(GET_LOW_REG(s2), REG_ITMP3);
+                       M_IOR(GET_HIGH_REG(s2), REG_ITMP3);
+                       M_BEQ(0);
+                       codegen_add_arithmeticexception_ref(cd);
 
-               case ICMD_LREMPOW2:   /* ..., value  ==> ..., value % constant        */
-                                     /* sx.val.l = constant                             */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
-                       M_INTMOVE(s1, REG_ITMP1);
-                       emit_alu_imm_reg(cd, ALU_CMP, -1, REG_ITMP1);
-                       emit_lea_membase_reg(cd, REG_ITMP1, iptr->sx.val.i, REG_ITMP2);
-                       emit_cmovcc_reg_reg(cd, CC_G, REG_ITMP1, REG_ITMP2);
-                       emit_alu_imm_reg(cd, ALU_AND, -1 - (iptr->sx.val.i), REG_ITMP2);
-                       emit_alu_reg_reg(cd, ALU_SUB, REG_ITMP2, REG_ITMP1);
-                       emit_mov_reg_reg(cd, REG_ITMP1, d);
+                       disp = dseg_add_functionptr(cd, bte->fp);
+
+                       /* load arguments */
+
+                       M_LNGMOVE(s2, PACK_REGS(REG_A3, REG_A2));
+
+                       s1 = emit_load_s1(jd, iptr, PACK_REGS(REG_A1, REG_A0));
+                       M_LNGMOVE(s1, PACK_REGS(REG_A1, REG_A0));
+
+                       /* call builtin */
+
+                       M_ASUB_IMM(96, REG_SP);
+                       M_ALD(REG_ITMP3, REG_PV, disp);
+                       M_JSR(REG_RA, REG_ITMP3);
+                       M_AADD_IMM(96, REG_SP);
+
+                       /* store result */
+
+                       d = codegen_reg_of_dst(jd, iptr, REG_RESULT_PACKED);
+                       M_LNGMOVE(REG_RESULT_PACKED, d);
                        emit_store_dst(jd, iptr, d);
-#endif
+
                        break;
 
                case ICMD_ISHL:       /* ..., val1, val2  ==> ..., val1 << val2       */
@@ -938,18 +953,25 @@ bool codegen(jitdata *jd)
                case ICMD_IUSHR:      /* ..., val1, val2  ==> ..., val1 >>> val2      */
 
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_ITMP2);
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
+                       s2 = emit_load_s2_notzero(jd, iptr, REG_ITMP2);
+
+                       if (s2 == d) {
+                               M_INTMOVE(s2, REG_ITMP2);
+                               s2 = REG_ITMP2;
+                       }
+
                        M_INTMOVE(s1, d);
+
                        switch (iptr->opc) {
                                case ICMD_ISHL:
-                                       N_SLA(d, 0, s2);
+                                       M_SLA(s2, d);
                                        break;
                                case ICMD_ISHR:
-                                       N_SRA(d, 0, s2);
+                                       M_SRA(s2, d);
                                        break;
                                case ICMD_IUSHR:
-                                       N_SRL(d, 0, s2);
+                                       M_SRL(s2, d);
                                        break;
                                default:
                                        assert(0);
@@ -957,13 +979,73 @@ bool codegen(jitdata *jd)
                        emit_store_dst(jd, iptr, d);
                        break;
 
+               case ICMD_IDIVPOW2:   /* ..., value  ==> ..., value >> constant       */
+                                     /* sx.val.i = constant                             */
+                       {
+                               u1 *ref;
+
+                               assert(iptr->sx.val.i <= 32);
+
+                               s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                               d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
+
+                               M_INTMOVE(s1, d);
+                               M_TEST(d);
+                               ref = cd->mcodeptr;
+                               M_BGE(0);
+
+                               s3 = (1 << iptr->sx.val.i) - 1;
+
+                               if (N_VALID_IMM(s3)) {
+                                       M_IADD_IMM(s3, d);
+                               } else  {
+                                       ICONST(REG_ITMP1, -1);
+                                       M_SRL_IMM(32 - iptr->sx.val.i, REG_ITMP1);
+                                       M_IADD(REG_ITMP1, d);
+                               }
+
+                               *(u4 *)ref |= (u4)(cd->mcodeptr - ref) / 2;
+
+                               M_SRA_IMM(iptr->sx.val.i, d);
+
+                               emit_store_dst(jd, iptr, d);
+                       }
+
+                       break;
+       
+               case ICMD_IREMPOW2:   /* ..., value  ==> ..., value % constant        */
+                                     /* sx.val.i = constant                             */
+
+                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
+
+                       if (s1 == d) {
+                               M_MOV(s1, REG_ITMP1);
+                               s1 = REG_ITMP1;
+                       }
+                               
+                       ICONST(REG_ITMP3, iptr->sx.val.i);
+
+                       M_INTMOVE(s1, d);
+                       M_IAND(REG_ITMP3, d);
+
+                       M_TEST(s1);
+                       M_BGE(SZ_BRC + SZ_LCR + SZ_NR + SZ_LCR);
+
+                       N_LCR(d, s1);
+                       N_NR(d, REG_ITMP3);
+                       N_LCR(d, d);
+
+                       emit_store_dst(jd, iptr, d);
+
+                       break;
+
                case ICMD_ISHLCONST:  /* ..., value  ==> ..., value << constant       */
                                      /* sx.val.i = constant                             */
                case ICMD_ISHRCONST:  /* ..., value  ==> ..., value >> constant       */
                                      /* sx.val.i = constant                             */
                case ICMD_IUSHRCONST: /* ..., value  ==> ..., value >>> constant      */
                                      /* sx.val.i = constant                             */
-
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
 
@@ -1015,13 +1097,13 @@ bool codegen(jitdata *jd)
 
                        switch (iptr->opc) {
                                case ICMD_LSHL:
-                                       N_SLDA(GET_HIGH_REG(d), 0, s2);
+                                       M_SLDA(s2, GET_HIGH_REG(d));
                                        break;
                                case ICMD_LSHR:
-                                       N_SRDA(GET_HIGH_REG(d), 0, s2);
+                                       M_SRDA(s2, GET_HIGH_REG(d));
                                        break;
                                case ICMD_LUSHR:
-                                       N_SRDL(GET_HIGH_REG(d), 0, s2);
+                                       M_SRDL(s2, GET_HIGH_REG(d));
                                        break;
                                default:
                                        assert(0);
@@ -1039,6 +1121,7 @@ bool codegen(jitdata *jd)
                                      /* sx.val.i = constant                             */
                case ICMD_LUSHRCONST: /* ..., value  ==> ..., value >>> constant      */
                                      /* sx.val.l = constant                             */
+               case ICMD_LMULPOW2:
                
                        d = emit_alloc_dst_even_odd(jd, iptr, R0, REG_ITMP1, REG_ITMP2); /* won't contain itmp3 */
                        s1 = emit_load_s1(jd, iptr, d);
@@ -1064,6 +1147,9 @@ bool codegen(jitdata *jd)
                                case ICMD_LUSHRCONST:
                                        N_SRDL(GET_HIGH_REG(d), disp, s3);
                                        break;
+                               case ICMD_LMULPOW2:
+                                       N_SLDL(GET_HIGH_REG(d), disp, s3);
+                                       break;
                                default:
                                        assert(0);
                        }
@@ -1121,16 +1207,35 @@ bool codegen(jitdata *jd)
 
 
 
+               case ICMD_IORCONST:   /* ..., value  ==> ..., value | constant        */
+                                     /* sx.val.i = constant                             */
                case ICMD_IANDCONST:  /* ..., value  ==> ..., value & constant        */
                                      /* sx.val.i = constant                             */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+               case ICMD_IXORCONST:  /* ..., value  ==> ..., value ^ constant        */
+                                     /* sx.val.i = constant                             */
+
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
+                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+
                        M_INTMOVE(s1, d);
-                       M_IAND_IMM(iptr->sx.val.i, d);
+                       ICONST(REG_ITMP2, iptr->sx.val.i);
+
+                       switch (iptr->opc) {
+                               case ICMD_IANDCONST:
+                                       M_IAND(REG_ITMP2, d);
+                                       break;
+                               case ICMD_IXORCONST:
+                                       M_IXOR(REG_ITMP2, d);
+                                       break;
+                               case ICMD_IORCONST:
+                                       M_IOR(REG_ITMP2, d);
+                                       break;
+                               default:
+                                       assert(0);
+                       }
+
                        emit_store_dst(jd, iptr, d);
-#endif
+
                        break;
 
                case ICMD_LOR:        /* ..., val1, val2  ==> ..., val1 | val2        */
@@ -1141,18 +1246,32 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1_low(jd, iptr, GET_LOW_REG(d));
                        s2 = emit_load_s2_low(jd, iptr, REG_ITMP3);
-
-                       M_INTMOVE(s1, GET_LOW_REG(d));
+                       dd = GET_LOW_REG(d);
 
                        switch (iptr->opc) {
                                case ICMD_LAND:
-                                       M_IAND(s2, GET_LOW_REG(d));
+                                       if (s2 == dd) {
+                                               M_IAND(s1, dd);
+                                       } else {
+                                               M_INTMOVE(s1, dd);
+                                               M_IAND(s2, dd);
+                                       }
                                        break;
                                case ICMD_LXOR:
-                                       M_IXOR(s2, GET_LOW_REG(d));
+                                       if (s2 == dd) {
+                                               M_IXOR(s1, dd);
+                                       } else {
+                                               M_INTMOVE(s1, dd);
+                                               M_IXOR(s2, dd);
+                                       }
                                        break;
                                case ICMD_LOR:
-                                       M_IOR(s2, GET_LOW_REG(d));
+                                       if (s2 == dd) {
+                                               M_IOR(s1, dd);
+                                       } else {
+                                               M_INTMOVE(s1, dd);
+                                               M_IOR(s2, dd);
+                                       }
                                        break;
                                default:
                                        assert(0);
@@ -1160,18 +1279,32 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1_high(jd, iptr, GET_HIGH_REG(d));
                        s2 = emit_load_s2_high(jd, iptr, REG_ITMP3);
-
-                       M_INTMOVE(s1, GET_HIGH_REG(d));
+                       dd = GET_HIGH_REG(d);
 
                        switch (iptr->opc) {
                                case ICMD_LAND:
-                                       M_IAND(s2, GET_HIGH_REG(d));
+                                       if (s2 == dd) {
+                                               M_IAND(s1, dd);
+                                       } else {
+                                               M_INTMOVE(s1, dd);
+                                               M_IAND(s2, dd);
+                                       }
                                        break;
                                case ICMD_LXOR:
-                                       M_IXOR(s2, GET_HIGH_REG(d));
+                                       if (s2 == dd) {
+                                               M_IXOR(s1, dd);
+                                       } else {
+                                               M_INTMOVE(s1, dd);
+                                               M_IXOR(s2, dd);
+                                       }
                                        break;
                                case ICMD_LOR:
-                                       M_IOR(s2, GET_HIGH_REG(d));
+                                       if (s2 == dd) {
+                                               M_IOR(s1, dd);
+                                       } else {
+                                               M_INTMOVE(s1, dd);
+                                               M_IOR(s2, dd);
+                                       }
                                        break;
                                default:
                                        assert(0);
@@ -1237,57 +1370,20 @@ bool codegen(jitdata *jd)
 
                        break;
 
-               case ICMD_IORCONST:   /* ..., value  ==> ..., value | constant        */
-                                     /* sx.val.i = constant                             */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
-                       M_INTMOVE(s1, d);
-                       M_IOR_IMM(iptr->sx.val.i, d);
-                       emit_store_dst(jd, iptr, d);
-#endif
-                       break;
-
-               case ICMD_IXORCONST:  /* ..., value  ==> ..., value ^ constant        */
-                                     /* sx.val.i = constant                             */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
-                       M_INTMOVE(s1, d);
-                       M_IXOR_IMM(iptr->sx.val.i, d);
-                       emit_store_dst(jd, iptr, d);
-#endif
-                       break;
-
-
                /* floating operations ************************************************/
 
                case ICMD_FNEG:       /* ..., value  ==> ..., - value                 */
-                       OOPS();
-#if 0
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
-                       disp = dseg_add_s4(cd, 0x80000000);
-                       M_FLTMOVE(s1, d);
-                       emit_movss_membase_reg(cd, RIP, -((cd->mcodeptr + 9) - cd->mcodebase) + disp, REG_FTMP2);
-                       emit_xorps_reg_reg(cd, REG_FTMP2, d);
+                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
+                       M_FMOVN(s1, d);
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_DNEG:       /* ..., value  ==> ..., - value                 */
-                       OOPS();
-#if 0
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
-                       disp = dseg_add_s8(cd, 0x8000000000000000);
-                       M_FLTMOVE(s1, d);
-                       emit_movd_membase_reg(cd, RIP, -((cd->mcodeptr + 9) - cd->mcodebase) + disp, REG_FTMP2);
-                       emit_xorpd_reg_reg(cd, REG_FTMP2, d);
+                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
+                       M_DMOVN(s1, d);
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_FADD:       /* ..., val1, val2  ==> ..., val1 + val2        */
@@ -1396,26 +1492,6 @@ bool codegen(jitdata *jd)
                        emit_store_dst(jd, iptr, d);
                        break;
 
-               case ICMD_L2F:       /* ..., value  ==> ..., (float) value            */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
-                       M_CVTLF(s1, d);
-                       emit_store_dst(jd, iptr, d);
-#endif
-                       break;
-                       
-               case ICMD_L2D:       /* ..., value  ==> ..., (double) value           */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
-                       M_CVTLD(s1, d);
-                       emit_store_dst(jd, iptr, d);
-#endif
-                       break;
-                       
                case ICMD_F2I:       /* ..., value  ==> ..., (int) value              */
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
@@ -1432,42 +1508,6 @@ bool codegen(jitdata *jd)
                        /* TODO: corner cases ? */
                        break;
 
-               case ICMD_F2L:       /* ..., value  ==> ..., (long) value             */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
-                       M_CVTFL(s1, d);
-                       M_MOV_IMM(0x8000000000000000, REG_ITMP2);
-                       M_LCMP(REG_ITMP2, d);                             /* corner cases */
-                       disp = ((s1 == REG_FTMP1) ? 0 : 5) + 10 + 3 +
-                               ((REG_RESULT == d) ? 0 : 3);
-                       M_BNE(disp);
-                       M_FLTMOVE(s1, REG_FTMP1);
-                       M_MOV_IMM(asm_builtin_f2l, REG_ITMP2);
-                       M_CALL(REG_ITMP2);
-                       M_INTMOVE(REG_RESULT, d);
-                       emit_store_dst(jd, iptr, d);
-#endif
-                       break;
-
-               case ICMD_D2L:       /* ..., value  ==> ..., (long) value             */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
-                       M_CVTDL(s1, d);
-                       M_MOV_IMM(0x8000000000000000, REG_ITMP2);
-                       M_LCMP(REG_ITMP2, d);                             /* corner cases */
-                       disp = ((s1 == REG_FTMP1) ? 0 : 5) + 10 + 3 +
-                               ((REG_RESULT == d) ? 0 : 3);
-                       M_BNE(disp);
-                       M_FLTMOVE(s1, REG_FTMP1);
-                       M_MOV_IMM(asm_builtin_d2l, REG_ITMP2);
-                       M_CALL(REG_ITMP2);
-                       M_INTMOVE(REG_RESULT, d);
-                       emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_F2D:       /* ..., value  ==> ..., (double) value           */
@@ -1478,13 +1518,10 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_D2F:       /* ..., value  ==> ..., (float) value            */
-                       OOPS();
-#if 0
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
+                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
                        M_CVTDF(s1, d);
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_FCMPL:      /* ..., val1, val2  ==> ..., val1 fcmpl val2    */
@@ -1503,11 +1540,11 @@ bool codegen(jitdata *jd)
                        switch (iptr->opc) {
                                case ICMD_FCMPG:
                                case ICMD_FCMPL:
-                                       N_CEBR(s1, s2);
+                                       M_FCMP(s1, s2);
                                        break;
                                case ICMD_DCMPG:
                                case ICMD_DCMPL:
-                                       N_CDBR(s1, s2);
+                                       M_DCMP(s1, s2);
                                        break;  
                        }
 
@@ -1558,8 +1595,8 @@ bool codegen(jitdata *jd)
 
                        N_IC(d, OFFSET(java_bytearray, data[0]), s2, s1);
                        /* TODO improove this */
-                       N_SLL(d, 24, RN);
-                       N_SRL(d, 24, RN);
+                       M_SLL_IMM(24, d);
+                       M_SRL_IMM(24, d);
                        emit_store_dst(jd, iptr, d);
                        break;
 
@@ -1572,7 +1609,7 @@ bool codegen(jitdata *jd)
                        emit_array_checks(cd, iptr, s1, s2);
 
                        M_INTMOVE(s2, REG_ITMP2);
-                       M_ISLL_IMM(1, REG_ITMP2);
+                       M_SLL_IMM(1, REG_ITMP2);
 
                        N_LH(d, OFFSET(java_chararray, data[0]), REG_ITMP2, s1);
                        emit_store_dst(jd, iptr, d);
@@ -1586,7 +1623,7 @@ bool codegen(jitdata *jd)
                        emit_array_checks(cd, iptr, s1, s2);
 
                        M_INTMOVE(s2, REG_ITMP2);
-                       M_ISLL_IMM(1, REG_ITMP2);
+                       M_SLL_IMM(1, REG_ITMP2);
 
                        N_LH(d, OFFSET(java_shortarray, data[0]), REG_ITMP2, s1);
                        emit_store_dst(jd, iptr, d);
@@ -1599,7 +1636,7 @@ bool codegen(jitdata *jd)
                        emit_array_checks(cd, iptr, s1, s2);
                        
                        M_INTMOVE(s2, REG_ITMP2);
-                       M_ISLL_IMM(2, REG_ITMP2); /* scale index by 4 */
+                       M_SLL_IMM(2, REG_ITMP2); /* scale index by 4 */
                        N_L(d, OFFSET(java_intarray, data[0]), REG_ITMP2, s1);
                        emit_store_dst(jd, iptr, d);
                        break;
@@ -1613,7 +1650,7 @@ bool codegen(jitdata *jd)
                        emit_array_checks(cd, iptr, s1, s2);
                        
                        M_INTMOVE(s2, REG_ITMP2);
-                       M_ISLL_IMM(3, REG_ITMP2); /* scale index by 8 */
+                       M_SLL_IMM(3, REG_ITMP2); /* scale index by 8 */
 
                        N_L(GET_HIGH_REG(d) /* evntl. itmp1 */, OFFSET(java_intarray, data[0]), REG_ITMP2, s1);
                        N_L(GET_LOW_REG(d) /* evntl. itmp2 */, OFFSET(java_intarray, data[0]) + 4, REG_ITMP2, s1);
@@ -1622,33 +1659,32 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_FALOAD:     /* ..., arrayref, index  ==> ..., value         */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+
+                       s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
-                       if (INSTRUCTION_MUST_CHECK(iptr)) {
-                               gen_nullptr_check(s1);
-                               gen_bound_check;
-                       }
-                       emit_movss_memindex_reg(cd, OFFSET(java_floatarray, data[0]), s1, s2, 2, d);
+                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
+                       emit_array_checks(cd, iptr, s1, s2);
+
+                       M_INTMOVE(s2, REG_ITMP2);
+                       M_SLL_IMM(2, REG_ITMP2); /* scale index by 4 */
+       
+                       N_LE(d, OFFSET(java_floatarray, data[0]), REG_ITMP2, s1);
+
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_DALOAD:     /* ..., arrayref, index  ==> ..., value         */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                       s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
-                       if (INSTRUCTION_MUST_CHECK(iptr)) {
-                               gen_nullptr_check(s1);
-                               gen_bound_check;
-                       }
-                       emit_movsd_memindex_reg(cd, OFFSET(java_doublearray, data[0]), s1, s2, 3, d);
+                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
+                       emit_array_checks(cd, iptr, s1, s2);
+
+                       M_INTMOVE(s2, REG_ITMP2);
+                       M_SLL_IMM(3, REG_ITMP2); /* scale index by 8 */
+       
+                       N_LD(d, OFFSET(java_floatarray, data[0]), REG_ITMP2, s1);
+
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_AALOAD:     /* ..., arrayref, index  ==> ..., value         */
@@ -1658,7 +1694,7 @@ bool codegen(jitdata *jd)
                        emit_array_checks(cd, iptr, s1, s2);
                        
                        M_INTMOVE(s2, REG_ITMP2);
-                       M_ISLL_IMM(2, REG_ITMP2); /* scale index by 4 */
+                       M_SLL_IMM(2, REG_ITMP2); /* scale index by 4 */
                        N_L(d, OFFSET(java_objectarray, data[0]), REG_ITMP2, s1);
                        emit_store_dst(jd, iptr, d);
                        break;
@@ -1680,7 +1716,7 @@ bool codegen(jitdata *jd)
                        s3 = emit_load_s3(jd, iptr, REG_ITMP3);
 
                        M_INTMOVE(s2, REG_ITMP2);
-                       M_ISLL_IMM(1, REG_ITMP2);
+                       M_SLL_IMM(1, REG_ITMP2);
 
                        N_STH(s3, OFFSET(java_chararray, data[0]), REG_ITMP2, s1);
 
@@ -1693,30 +1729,33 @@ bool codegen(jitdata *jd)
                        s3 = emit_load_s3(jd, iptr, REG_ITMP3);
 
                        M_INTMOVE(s2, REG_ITMP2);
-                       M_ISLL_IMM(1, REG_ITMP2);
+                       M_SLL_IMM(1, REG_ITMP2);
 
                        N_STH(s3, OFFSET(java_shortarray, data[0]), REG_ITMP2, s1);
                        break;
 
                case ICMD_IASTORE:    /* ..., arrayref, index, value  ==> ...         */
+
                        s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
                        emit_array_checks(cd, iptr, s1, s2);
+
                        s3 = emit_load_s3(jd, iptr, REG_ITMP3);
 
                        M_INTMOVE(s2, REG_ITMP2);
-                       M_ISLL_IMM(2, REG_ITMP2);
+                       M_SLL_IMM(2, REG_ITMP2);
 
                        N_ST(s3, OFFSET(java_intarray, data[0]), REG_ITMP2, s1);
                        break;
 
                case ICMD_LASTORE:    /* ..., arrayref, index, value  ==> ...         */
+
                        s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
                        emit_array_checks(cd, iptr, s1, s2);
 
                        M_INTMOVE(s2, REG_ITMP2);
-                       M_ISLL_IMM(3, REG_ITMP2);
+                       M_SLL_IMM(3, REG_ITMP2);
 
                        s3 = emit_load_s3_high(jd, iptr, REG_ITMP3);
                        N_ST(s3, OFFSET(java_intarray, data[0]), REG_ITMP2, s1);
@@ -1731,7 +1770,7 @@ bool codegen(jitdata *jd)
                        s3 = emit_load_s3(jd, iptr, REG_FTMP1);
 
                        M_INTMOVE(s2, REG_ITMP2);
-                       M_ISLL_IMM(2, REG_ITMP2);
+                       M_SLL_IMM(2, REG_ITMP2);
 
                        N_STE(s3, OFFSET(java_floatarray, data[0]), REG_ITMP2, s1);
                        break;
@@ -1743,7 +1782,7 @@ bool codegen(jitdata *jd)
                        s3 = emit_load_s3(jd, iptr, REG_FTMP1);
 
                        M_INTMOVE(s2, REG_ITMP2);
-                       M_ISLL_IMM(3, REG_ITMP2);
+                       M_SLL_IMM(3, REG_ITMP2);
 
                        N_STD(s3, OFFSET(java_doublearray, data[0]), REG_ITMP2, s1);
                        break;
@@ -1759,14 +1798,10 @@ bool codegen(jitdata *jd)
                        M_INTMOVE(s3, REG_A1);
 
                        disp = dseg_add_functionptr(cd, BUILTIN_canstore);
-                       ICONST(REG_ITMP3, disp);
-                       N_L(REG_PV, 0, REG_ITMP3, REG_PV);
-                       M_ISUB_IMM(96, REG_SP);
-                       M_JSR(REG_RA, REG_PV);
-                       M_IADD_IMM(96, REG_SP);
-                       N_BASR(REG_ITMP1, RN);
-                       disp = (s4) (cd->mcodeptr - cd->mcodebase);
-                       M_LDA(REG_PV, REG_ITMP1, -disp);
+                       M_ALD(REG_ITMP3, REG_PV, disp);
+                       M_ASUB_IMM(96, REG_SP);
+                       M_JSR(REG_RA, REG_ITMP3);
+                       M_AADD_IMM(96, REG_SP);
 
                        M_TEST(REG_RESULT);
                        M_BEQ(0);
@@ -1777,7 +1812,7 @@ bool codegen(jitdata *jd)
                        s3 = emit_load_s3(jd, iptr, REG_ITMP3);
 
                        M_INTMOVE(s2, REG_ITMP2);
-                       M_ISLL_IMM(2, REG_ITMP2);
+                       M_SLL_IMM(2, REG_ITMP2);
                        N_ST(s3, OFFSET(java_objectarray, data[0]), REG_ITMP2, s1);
 
                        /*
@@ -1787,91 +1822,6 @@ bool codegen(jitdata *jd)
                        break;
 
 
-               case ICMD_BASTORECONST: /* ..., arrayref, index  ==> ...              */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       if (INSTRUCTION_MUST_CHECK(iptr)) {
-                               gen_nullptr_check(s1);
-                               gen_bound_check;
-                       }
-                       emit_movb_imm_memindex(cd, iptr->sx.s23.s3.constval, OFFSET(java_bytearray, data[0]), s1, s2, 0);
-#endif
-                       break;
-
-               case ICMD_CASTORECONST:   /* ..., arrayref, index  ==> ...            */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       if (INSTRUCTION_MUST_CHECK(iptr)) {
-                               gen_nullptr_check(s1);
-                               gen_bound_check;
-                       }
-                       emit_movw_imm_memindex(cd, iptr->sx.s23.s3.constval, OFFSET(java_chararray, data[0]), s1, s2, 1);
-#endif
-                       break;
-
-               case ICMD_SASTORECONST:   /* ..., arrayref, index  ==> ...            */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       if (INSTRUCTION_MUST_CHECK(iptr)) {
-                               gen_nullptr_check(s1);
-                               gen_bound_check;
-                       }
-                       emit_movw_imm_memindex(cd, iptr->sx.s23.s3.constval, OFFSET(java_shortarray, data[0]), s1, s2, 1);
-#endif
-                       break;
-
-               case ICMD_IASTORECONST: /* ..., arrayref, index  ==> ...              */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       if (INSTRUCTION_MUST_CHECK(iptr)) {
-                               gen_nullptr_check(s1);
-                               gen_bound_check;
-                       }
-                       emit_movl_imm_memindex(cd, iptr->sx.s23.s3.constval, OFFSET(java_intarray, data[0]), s1, s2, 2);
-#endif
-                       break;
-
-               case ICMD_LASTORECONST: /* ..., arrayref, index  ==> ...              */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       if (INSTRUCTION_MUST_CHECK(iptr)) {
-                               gen_nullptr_check(s1);
-                               gen_bound_check;
-                       }
-
-                       if (IS_IMM32(iptr->sx.s23.s3.constval)) {
-                               emit_mov_imm_memindex(cd, (u4) (iptr->sx.s23.s3.constval & 0x00000000ffffffff), OFFSET(java_longarray, data[0]), s1, s2, 3);
-                       } else {
-                               emit_movl_imm_memindex(cd, (u4) (iptr->sx.s23.s3.constval & 0x00000000ffffffff), OFFSET(java_longarray, data[0]), s1, s2, 3);
-                               emit_movl_imm_memindex(cd, (u4) (iptr->sx.s23.s3.constval >> 32), OFFSET(java_longarray, data[0]) + 4, s1, s2, 3);
-                       }
-#endif
-                       break;
-
-               case ICMD_AASTORECONST: /* ..., arrayref, index  ==> ...              */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       if (INSTRUCTION_MUST_CHECK(iptr)) {
-                               gen_nullptr_check(s1);
-                               gen_bound_check;
-                       }
-                       emit_mov_imm_memindex(cd, 0, OFFSET(java_objectarray, data[0]), s1, s2, 3);
-#endif
-                       break;
-
-
                case ICMD_GETSTATIC:  /* ...  ==> ..., value                          */
 
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
@@ -1972,54 +1922,10 @@ bool codegen(jitdata *jd)
                        }
                        break;
 
-               case ICMD_PUTSTATICCONST: /* ...  ==> ...                             */
-                                         /* val = value (in current instruction)     */
-                                         /* following NOP)                           */
-                       OOPS();
-#if 0
-                       if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
-                               uf        = iptr->sx.s23.s3.uf;
-                               fieldtype = uf->fieldref->parseddesc.fd->type;
-                               disp      = dseg_add_unique_address(cd, uf);
-
-                               codegen_add_patch_ref(cd, PATCHER_get_putstatic, uf, disp);
-                       }
-                       else {
-                               fi        = iptr->sx.s23.s3.fmiref->p.field;
-                               fieldtype = fi->type;
-                               disp      = dseg_add_address(cd, &(fi->value));
-
-                               if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
-                                       codegen_add_patch_ref(cd, PATCHER_initialize_class, fi->class,
-                                                                                 0);
-                       }
-                       
-                       M_ALD(REG_ITMP1, REG_PV, disp);
-
-                       switch (fieldtype) {
-                       case TYPE_INT:
-                               M_IST(REG_ZERO, REG_ITMP1, 0);
-                               break;
-                       case TYPE_LNG:
-                               M_LST(REG_ZERO, REG_ITMP1, 0);
-                               break;
-                       case TYPE_ADR:
-                               M_AST(REG_ZERO, REG_ITMP1, 0);
-                               break;
-                       case TYPE_FLT:
-                               M_FST(REG_ZERO, REG_ITMP1, 0);
-                               break;
-                       case TYPE_DBL:
-                               M_DST(REG_ZERO, REG_ITMP1, 0);
-                               break;
-                       }
-#endif
-                       break;
-
                case ICMD_GETFIELD:   /* ...  ==> ..., value                          */
 
                        s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
-                       emit_nullpointer_check(cd, iptr, s1);
+                       gen_nullptr_check(s1);
 
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
                                uf        = iptr->sx.s23.s3.uf;
@@ -2068,11 +1974,9 @@ bool codegen(jitdata *jd)
 
                case ICMD_PUTFIELD:   /* ..., objectref, value  ==> ...               */
 
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                       s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
                        gen_nullptr_check(s1);
 
-                       s2 = emit_load_s2(jd, iptr, REG_IFTMP);
-
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
                                uf        = iptr->sx.s23.s3.uf;
                                fieldtype = uf->fieldref->parseddesc.fd->type;
@@ -2117,48 +2021,6 @@ bool codegen(jitdata *jd)
                        }
                        break;
 
-               case ICMD_PUTFIELDCONST:  /* ..., objectref, value  ==> ...           */
-                                         /* val = value (in current instruction)     */
-                                         /* following NOP)                           */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       gen_nullptr_check(s1);
-
-                       if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
-                               uf        = iptr->sx.s23.s3.uf;
-                               fieldtype = uf->fieldref->parseddesc.fd->type;
-                               disp      = 0;
-
-/*                             PROFILE_CYCLE_STOP; */
-
-                               codegen_add_patch_ref(cd, PATCHER_putfieldconst, uf, 0);
-
-/*                             PROFILE_CYCLE_START; */
-                       } 
-                       else {
-                               fi        = iptr->sx.s23.s3.fmiref->p.field;
-                               fieldtype = fi->type;
-                               disp      = fi->offset;
-                       }
-
-                       switch (fieldtype) {
-                       case TYPE_INT:
-                       case TYPE_FLT:
-                               M_IST32_IMM(iptr->sx.s23.s2.constval, s1, disp);
-                               break;
-                       case TYPE_LNG:
-                       case TYPE_ADR:
-                       case TYPE_DBL:
-                               /* XXX why no check for IS_IMM32? */
-                               M_IST32_IMM(iptr->sx.s23.s2.constval, s1, disp);
-                               M_IST32_IMM(iptr->sx.s23.s2.constval >> 32, s1, disp + 4);
-                               break;
-                       }
-#endif
-                       break;
-
-
                /* branch operations **************************************************/
 
                case ICMD_ATHROW:       /* ..., objectref ==> ... (, objectref)       */
@@ -2192,11 +2054,10 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_JSR:          /* ... ==> ...                                */
-                       OOPS();
-#if 0
-                       M_JMP_IMM(0);
+
+                       M_BR(0);
                        codegen_add_branch_ref(cd, iptr->sx.s23.s3.jsrtarget.block);
-#endif
+
                        break;
                        
                case ICMD_IFNULL:       /* ..., value ==> ...                         */
@@ -2224,10 +2085,10 @@ bool codegen(jitdata *jd)
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
 
                        if (N_VALID_IMM(iptr->sx.val.i))
-                               N_CHI(s1, iptr->sx.val.i);
+                               M_ICMP_IMM(s1, iptr->sx.val.i);
                        else {
                                disp = dseg_add_s4(cd, iptr->sx.val.i);
-                               N_LHI(REG_ITMP2, disp);
+                               ICONST(REG_ITMP2, disp);
                                N_C(s1, 0, REG_ITMP2, REG_PV);
                        }
 
@@ -2270,10 +2131,10 @@ bool codegen(jitdata *jd)
                                s1 = emit_load_s1_high(jd, iptr, REG_ITMP1);
 
                                if (N_VALID_IMM(iptr->sx.val.l >> 32))
-                                       N_CHI(s1, iptr->sx.val.l >> 32);
+                                       M_ICMP_IMM(s1, iptr->sx.val.l >> 32);
                                else {
                                        disp = dseg_add_s4(cd, iptr->sx.val.l >> 32);
-                                       N_LHI(REG_ITMP2, disp);
+                                       ICONST(REG_ITMP2, disp);
                                        N_C(s1, 0, REG_ITMP2, REG_PV);
                                }
 
@@ -2311,7 +2172,7 @@ bool codegen(jitdata *jd)
                                s1 = emit_load_s1_low(jd, iptr, REG_ITMP1);
 
                                disp = dseg_add_s4(cd, (s4)(iptr->sx.val.l & 0xffffffff));
-                               N_LHI(REG_ITMP2, disp);
+                               ICONST(REG_ITMP2, disp);
                                N_CL(s1, 0, REG_ITMP2, REG_PV);
 
                                switch(iptr->opc) {
@@ -2351,10 +2212,10 @@ bool codegen(jitdata *jd)
                        /* Compare addresses as 31 bit unsigned integers */
 
                        s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
-                       N_LA(REG_ITMP1, 0, RN, s1);
+                       M_LDA(REG_ITMP1, s1, 0);
 
                        s2 = emit_load_s2_notzero(jd, iptr, REG_ITMP2);
-                       N_LA(REG_ITMP2, 0, RN, s2);
+                       M_LDA(REG_ITMP2, s2, 0);
 
                        M_CMP(REG_ITMP1, REG_ITMP2);
 
@@ -2420,7 +2281,7 @@ bool codegen(jitdata *jd)
                                s1 = emit_load_s1_high(jd, iptr, REG_ITMP1);
                                s2 = emit_load_s2_high(jd, iptr, REG_ITMP2);
 
-                               N_CR(s1, s2);
+                               M_ICMP(s1, s2);
 
                                switch(iptr->opc) {
                                case ICMD_IF_LCMPLT:
@@ -2456,7 +2317,7 @@ bool codegen(jitdata *jd)
                                s1 = emit_load_s1_low(jd, iptr, REG_ITMP1);
                                s2 = emit_load_s2_low(jd, iptr, REG_ITMP2);
        
-                               N_CLR(s1, s2);
+                               M_ICMPU(s1, s2);
 
                                switch(iptr->opc) {
                                case ICMD_IF_LCMPLT:
@@ -2615,8 +2476,6 @@ nowperformreturn:
                        break;
 
                case ICMD_TABLESWITCH:  /* ..., index ==> ...                         */
-                       OOPS();
-#if 0
                        {
                                s4 i, l;
                                branch_target_t *table;
@@ -2629,42 +2488,47 @@ nowperformreturn:
                                s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                                M_INTMOVE(s1, REG_ITMP1);
 
-                               if (l != 0)
+                               if (l == 0) {
+                                       /* do nothing */
+                               } else if (N_VALID_IMM(-l)) {
                                        M_ISUB_IMM(l, REG_ITMP1);
+                               } else {
+                                       ICONST(REG_ITMP2, l);
+                                       M_ISUB(REG_ITMP2, REG_ITMP1);
+                               }
 
                                /* number of targets */
+
                                i = i - l + 1;
 
-                /* range check */
-                               M_ICMP_IMM(i - 1, REG_ITMP1);
-                               M_BA(0);
+                               /* range check */
 
-                               codegen_add_branch_ref(cd, table[0].block); /* default target */
+                               ICONST(REG_ITMP2, i);
+                               M_ICMPU(REG_ITMP1, REG_ITMP2);
+                               M_BGE(0);
+                               codegen_add_branch_ref(cd, table[0].block);
 
                                /* build jump table top down and use address of lowest entry */
 
                                table += i;
 
                                while (--i >= 0) {
-                                       dseg_add_target(cd, table->block);
+                                       dseg_add_target(cd, table->block); 
                                        --table;
                                }
+                       }
 
-                               /* length of dataseg after last dseg_add_target is used
-                                  by load */
+                       /* length of dataseg after last dseg_add_target is used by load */
+
+                       M_SLL_IMM(2, REG_ITMP1); /* scale by 4 */
+                       M_ASUB_IMM(cd->dseglen, REG_ITMP1);
+                       N_L(REG_ITMP1, 0, REG_ITMP1, REG_PV);
+                       M_JMP(RN, REG_ITMP1);
 
-                               M_MOV_IMM(0, REG_ITMP2);
-                               dseg_adddata(cd);
-                               emit_mov_memindex_reg(cd, -(cd->dseglen), REG_ITMP2, REG_ITMP1, 3, REG_ITMP1);
-                               M_JMP(REG_ITMP1);
-                       }
-#endif
                        break;
 
 
                case ICMD_LOOKUPSWITCH: /* ..., key ==> ...                           */
-                       OOPS();
-#if 0
                        {
                                s4 i;
                                lookup_target_t *lookup;
@@ -2677,17 +2541,21 @@ nowperformreturn:
                                s1 = emit_load_s1(jd, iptr, REG_ITMP1);
 
                                while (--i >= 0) {
-                                       M_ICMP_IMM(lookup->value, s1);
+                                       if (N_VALID_IMM(lookup->value)) {
+                                               M_ICMP_IMM(s1, lookup->value);
+                                       } else {
+                                               ICONST(REG_ITMP2, lookup->value);
+                                               M_ICMP(REG_ITMP2, s1);
+                                       }
                                        M_BEQ(0);
                                        codegen_add_branch_ref(cd, lookup->target.block);
                                        lookup++;
                                }
 
-                               M_JMP_IMM(0);
+                               M_BR(0);
                        
                                codegen_add_branch_ref(cd, iptr->sx.s23.s3.lookupdefault.block);
                        }
-#endif
                        break;
 
 
@@ -2776,14 +2644,17 @@ gen_method:
                        case ICMD_BUILTIN:
                                disp = dseg_add_functionptr(cd, bte->fp);
 
-                               N_AHI(REG_SP, -96); /* register save area as required by C abi */       
+                               M_ASUB_IMM(96, REG_SP); /* register save area as required by C abi */   
                                N_LHI(REG_ITMP1, disp);
                                N_L(REG_PV, 0, REG_ITMP1, REG_PV);
                                break;
 
                        case ICMD_INVOKESPECIAL:
-                               emit_nullpointer_check(cd, iptr, REG_A0);
-                               M_ILD(REG_ITMP1, REG_A0, 0); /* hardware nullptr   */
+                               if (checknull) {
+                                       gen_nullptr_check_intern(REG_A0);
+                               } else {
+                                       M_ILD(REG_ITMP1, REG_A0, 0); /* hardware nullptr   */
+                               }
                                /* fall through */
 
                        case ICMD_INVOKESTATIC:
@@ -2801,7 +2672,7 @@ gen_method:
                                break;
 
                        case ICMD_INVOKEVIRTUAL:
-                               emit_nullpointer_check(cd, iptr, REG_A0);
+                               gen_nullptr_check(REG_A0);
 
                                if (lm == NULL) {
                                        codegen_addpatchref(cd, PATCHER_invokevirtual, um, 0);
@@ -2818,7 +2689,7 @@ gen_method:
                                break;
 
                        case ICMD_INVOKEINTERFACE:
-                               emit_nullpointer_check(cd, iptr, REG_A0);
+                               gen_nullptr_check(REG_A0);
 
                                /* s1 will be negative here, so use (0xFFF + s1) as displacement
                                 * and -0xFFF in index register (itmp1)
@@ -2850,14 +2721,14 @@ gen_method:
 
                        M_CALL(REG_PV);
                        REPLACEMENT_POINT_INVOKE_RETURN(cd, iptr);
-                       N_BASR(REG_ITMP1, RN);
+                       N_BASR(REG_PV, RN);
                        disp = (s4) (cd->mcodeptr - cd->mcodebase);
-                       M_LDA(REG_PV, REG_ITMP1, -disp);
+                       M_ASUB_IMM(disp, REG_PV);
        
                        /* post call finalization */
 
                        if (iptr->opc == ICMD_BUILTIN) {
-                               N_AHI(REG_SP, 96); /* remove C abi register save area */
+                               M_AADD_IMM(96, REG_SP); /* remove C abi register save area */
                        }
 
                        /* actually only used for ICMD_BUILTIN */
@@ -2934,7 +2805,7 @@ gen_method:
 #if defined(ENABLE_THREADS)
                                codegen_threadcritrestart(cd, cd->mcodeptr - cd->mcodebase);
 #endif
-                               s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                               s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
 
                                /* if class is not resolved, check which code to call */
 
@@ -3034,7 +2905,7 @@ gen_method:
                                        codegen_threadcritstop(cd, cd->mcodeptr - cd->mcodebase);
 #endif
                                        /*                              } */
-                                       N_CLR(REG_ITMP2, REG_ITMP3); /* Unsigned compare */
+                                       M_CMPU(REG_ITMP2, REG_ITMP3); /* Unsigned compare */
                                        /* M_CMPULE(REG_ITMP2, REG_ITMP3, REG_ITMP3); itmp3 = (itmp2 <= itmp3) */
                                        M_BGT(0); /* Branch if greater then */
                                        /* M_BEQZ(REG_ITMP3, 0); branch if (! itmp) -> branch if > */
@@ -3074,12 +2945,10 @@ gen_method:
 
                                M_ALD(REG_A1, REG_PV, disp);
                                disp = dseg_add_functionptr(cd, BUILTIN_arraycheckcast);
-                               ICONST(REG_ITMP1, disp); /* TODO negative displacement */
-                               N_L(REG_PV, 0, REG_ITMP1, REG_PV);
-                               M_JSR(REG_RA, REG_PV);
-                               N_BASR(REG_ITMP1, RN);
-                               disp = (s4) (cd->mcodeptr - cd->mcodebase);
-                               M_LDA(REG_PV, REG_ITMP1, -disp);
+                               M_ALD(REG_ITMP1, REG_PV, disp);
+                               M_ASUB_IMM(96, REG_SP);
+                               M_JSR(REG_RA, REG_ITMP1);
+                               M_AADD_IMM(96, REG_SP);
 
                                s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                                M_TEST(REG_RESULT);
@@ -3241,7 +3110,7 @@ gen_method:
 #endif
                                M_ISUB(REG_ITMP3, REG_ITMP1); /* itmp1 :=  itmp1 (sub.baseval) - itmp3 (super.baseval) */
 
-                               N_CLR(REG_ITMP1, REG_ITMP2); /* d := (uint)REG_ITMP1 <= (uint)REG_ITMP2 */
+                               M_CMPU(REG_ITMP1, REG_ITMP2); /* d := (uint)REG_ITMP1 <= (uint)REG_ITMP2 */
                                N_LHI(d, 0);
                                M_BGT(SZ_BRC + SZ_LHI);
                                N_LHI(d, 1);
@@ -3271,12 +3140,11 @@ gen_method:
                        break;
 
                case ICMD_MULTIANEWARRAY:/* ..., cnt1, [cnt2, ...] ==> ..., arrayref  */
-                       OOPS();
-#if 0
 
                        /* check for negative sizes and copy sizes to stack if necessary  */
 
-                       MCODECHECK((10 * 4 * iptr->s1.argcount) + 5 + 10 * 8);
+                       /*MCODECHECK((10 * 4 * iptr->s1.argcount) + 5 + 10 * 8);*/
+                       MCODECHECK(512);
 
                        for (s1 = iptr->s1.argcount; --s1 >= 0; ) {
 
@@ -3286,31 +3154,39 @@ gen_method:
                                /* Already Preallocated? */
                                if (!(var->flags & PREALLOC)) {
                                        s2 = emit_load(jd, iptr, var, REG_ITMP1);
-                                       M_LST(s2, REG_SP, s1 * 8);
+                                       M_IST(s2, REG_SP, s1 * 4);
                                }
                        }
 
                        /* is a patcher function set? */
 
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
-                               codegen_add_patch_ref(cd, PATCHER_builtin_multianewarray,
-                                                                         iptr->sx.s23.s3.c.ref, 0);
+                               disp = dseg_add_unique_address(cd, 0);
+
+                               codegen_add_patch_ref(cd, PATCHER_resolve_classref_to_classinfo,
+                                                                         iptr->sx.s23.s3.c.ref,
+                                                                         disp);
                        }
+                       else
+                               disp = dseg_add_address(cd, iptr->sx.s23.s3.c.cls);
 
                        /* a0 = dimension count */
 
-                       M_MOV_IMM(iptr->s1.argcount, REG_A0);
+                       ICONST(REG_A0, iptr->s1.argcount);
 
                        /* a1 = classinfo */
 
-                       M_MOV_IMM(iptr->sx.s23.s3.c.cls, REG_A1);
+                       M_ALD(REG_A1, REG_PV, disp);
 
                        /* a2 = pointer to dimensions = stack pointer */
 
                        M_MOV(REG_SP, REG_A2);
 
-                       M_MOV_IMM(BUILTIN_multianewarray, REG_ITMP1);
-                       M_CALL(REG_ITMP1);
+                       disp = dseg_add_functionptr(cd, BUILTIN_multianewarray);
+                       M_ALD(REG_ITMP1, REG_PV, disp);
+                       M_ASUB_IMM(96, REG_SP);
+                       M_JSR(REG_RA, REG_ITMP1);
+                       M_AADD_IMM(96, REG_SP);
 
                        /* check for exception before result assignment */
 
@@ -3321,7 +3197,7 @@ gen_method:
                        s1 = codegen_reg_of_dst(jd, iptr, REG_RESULT);
                        M_INTMOVE(REG_RESULT, s1);
                        emit_store_dst(jd, iptr, s1);
-#endif
+
                        break;
 
                default:
@@ -3484,16 +3360,6 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
        nativeparams = (m->flags & ACC_STATIC) ? 2 : 1;
 
        /* calculate stack frame size */
-#if 0
-       cd->stackframesize =
-               sizeof(stackframeinfo) / SIZEOF_VOID_P +
-               sizeof(localref_table) / SIZEOF_VOID_P +
-               INT_ARG_CNT + FLT_ARG_CNT +
-               1 +                       /* functionptr, TODO: store in data segment */
-               nmd->memuse;
-
-       cd->stackframesize |= 0x1;                  /* keep stack 16-byte aligned */
-#endif
 
        cd->stackframesize = 
                1 + /* r14 - return address */ +
@@ -3536,11 +3402,9 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
 
        N_ST(R14, (cd->stackframesize - 1) * SIZEOF_VOID_P, RN, REG_SP);
 
-#if 0
 #if !defined(NDEBUG)
        if (JITDATA_HAS_FLAG_VERBOSECALL(jd))
                emit_verbosecall_enter(jd);
-#endif
 #endif
 
        /* get function address (this must happen before the stackframeinfo) */
@@ -3720,11 +3584,9 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
                }
        }
 
-#if 0
 #if !defined(NDEBUG)
        if (JITDATA_HAS_FLAG_VERBOSECALL(jd))
                emit_verbosecall_exit(jd);
-#endif
 #endif
 
        /* remove native stackframe info */
@@ -3773,13 +3635,14 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
        /* handle exception */
 
        M_MOV(REG_ITMP3, REG_ITMP1_XPTR);
-       M_ALD(REG_ITMP2_XPC, REG_SP, (cd->stackframesize - 1) * 4);     /* get return address from stack */
+       M_MOV(REG_ITMP2, REG_ITMP2_XPC); /* get return address from stack */
+
 #if 0
        /* TODO */
        M_ASUB_IMM(3, REG_ITMP2_XPC);                                    /* callq */
 #endif
-       disp = dseg_add_functionptr(cd, /*asm_handle_nat_exception*/ panic);
-       N_AHI(REG_SP, 96);
+
+       disp = dseg_add_functionptr(cd, asm_handle_nat_exception);
        M_ALD(REG_ITMP3, REG_PV, disp);
        M_JMP(RN, REG_ITMP3);
 
index 17eb14ecbaf1fca28acb8150551bb2b27dccfde3..3fa484793b1fc31f8871f145319954c2ce8823fc 100644 (file)
@@ -27,7 +27,7 @@
    Authors: Andreas Krall
             Christian Thalinger
 
-   $Id: codegen.h 7616 2007-03-29 23:21:50Z michi $
+   $Id: codegen.h 7680 2007-04-10 05:02:20Z pm $
 
 */
 
     else (var) += 1;
 
 
-/* gen_nullptr_check(objreg) */
+#define gen_nullptr_check_intern(objreg) \
+       do { \
+               M_TEST(objreg); \
+               M_BEQ(0); \
+               codegen_add_nullpointerexception_ref(cd); \
+       } while (0);
 
 #define gen_nullptr_check(objreg) \
        if (checknull) { \
-        M_TEST(objreg); \
-        M_BEQ(0); \
-           codegen_add_nullpointerexception_ref(cd); \
+               gen_nullptr_check_intern(objreg); \
        }
 
 
 #define N_ALR(r1, r2) N_RR(0x1E, r1, r2)
 #define N_AL(r1, d2, x2, b2) N_RX(0x5E, r1, d2, x2, b2)
 #define N_NR(r1, r2) N_RR(0x14, r1, r2)
+#      define SZ_NR SZ_RR
 #define N_N(r1, d2, x2, b2) N_RX(0x54, r1, d2, x2, b2)
 #define N_NI(d1, b1, i2) N_SI(0x94, d1, b1, i2)
 #define N_NC(d1, l, b1, d2, b2) N_NC(0xD4, l, b1, d1, b2, d2)
 #define N_LAE(r1, d2, x2, b2) N_RX(0x51, r1, d2, x2, b2)
 #define N_LTR(r1, r2) N_RR(0x12, r1, r2)
 #define N_LCR(r1, r2) N_RR(0x13, r1, r2)
+#      define SZ_LCR SZ_RR
 #define N_LH(r1, d2, x2, b2) N_RX(0x48, r1, d2, x2, b2)
 #define N_LHI(r1, i2) N_RI(0xA7, 0x8, r1, i2)
 #      define SZ_LHI SZ_RI
 #define N_DEB(r1, d2, x2, b2) N_RXE(0xED0D, r1, d2, x2, b2)
 #define N_DDB(r1, d2, x2, b2) N_RXE(0xED1D, r1, d2, x2, b2)
 
+#define N_LCEBR(r1, r2) N_RRE(0xB303, r1, r2)
+#define N_LCDBR(r1, r2) N_RRE(0xB313, r1, r2)
+#define N_LCXBR(r1, r2) N_RRE(0xB343, r1, r2)
+
 #define N_LDEBR(r1, r2) N_RRE(0xB304, r1, r2)
 #define N_LXDBR(r1, r2) N_RRE(0xB305, r1, r2)
 #define N_LXEBR(r1, r2) N_RRE(0xB306, r1, r2)
 
+#define N_LEDBR(r1, r2) N_RRE(0xB344, r1, r2)
+#define N_LDXBR(r1, r2) N_RRE(0xB345, r1, r2)
+#define N_LEXBR(r1, r2) N_RRE(0xB346, r1, r2)
+
 #define N_MEEBR(r1, r2) N_RRE(0xB317, r1, r2)
 #define N_MDBR(r1, r2) N_RRE(0xB31C, r1, r2)
 #define N_MXBR(r1, r2) N_RRE(0xB34C, r1, r2)
 
 #define M_CALL(r2) N_BASR(R14, r2)
 
-#define M_ILD(r, b, d) _IFNEG( \
-       d, \
-       N_LHI(r, d); N_L(r, 0, r, b), \
-       N_L(r, d, RN, b) \
-)
+#define M_ILD(r, b, d) \
+       do { \
+               if (N_VALID_DISP(d)) { \
+                       N_L(r, d, RN, b); \
+               } else if (r == R0) { \
+                       N_LR(R0, R1); \
+                       N_LHI(R1, d); \
+                       N_L(R1, 0, R1, b); \
+                       N_XR(R1, R0); \
+                       N_XR(R0, R1); \
+                       N_XR(R1, R0); \
+               } else { \
+                       N_LHI(r, d); N_L(r, 0, r, b); \
+               } \
+       } while (0)
 
 #define M_ALD(r, b, d) M_ILD(r, b, d)
 
        N_LHI(GET_LOW_REG(r), d); \
                N_L(GET_HIGH_REG(r), 0, GET_LOW_REG(r), b); \
                N_L(GET_LOW_REG(r), 4, GET_LOW_REG(r), b), \
-       N_L(GET_HIGH_REG(r), 0, RN, b); N_L(GET_LOW_REG(r), 4, RN, b) \
+       N_L(GET_HIGH_REG(r), (d) + 0, RN, b); N_L(GET_LOW_REG(r), (d) + 4, RN, b) \
 )
 
 /* MOV(a, b) -> mov from A to B */
 #define M_LST(r, b, d) _IFNEG( \
        d, \
        assert(0), \
-       N_ST(GET_HIGH_REG(r), 0, RN, b); N_ST(GET_LOW_REG(r), 4, RN, b) \
+       N_ST(GET_HIGH_REG(r), (d) + 0, RN, b); N_ST(GET_LOW_REG(r), (d) + 4, RN, b) \
 )
 #define M_TEST(r) N_LTR(r, r)
 #define M_BEQ(off) N_BRC(DD_E, off)
 #define M_BO(off) N_BRC(DD_O, off)
 
 #define M_CMP(r1, r2) N_CR(r1, r2)
+#define M_CMPU(r1, r2) N_CLR(r1, r2)
 #define M_CLR(r) N_LHI(r, 0)
 #define M_AADD_IMM(val, reg) N_AHI(reg, val)
 #define M_IADD_IMM(val, reg) N_AHI(reg, val)
 #define M_NOP N_BC(0, 0, RN, RN)
 #define M_JSR(reg_ret, reg_addr) N_BASR(reg_ret, reg_addr)
 #define M_ICMP(a, b) N_CR(a, b)
+#define M_ICMPU(a, b) N_CLR(a, b)
+#define M_ICMP_IMM(a, b) N_CHI(a, b)
 #define M_CVTIF(src, dst) N_CEFBR(dst, src)
 #define M_CVTID(src, dst) N_CDFBR(dst, src)
 #define M_FMUL(a, dest) N_MEEBR(dest, a)
 #define M_IOR(a, dest) N_OR(dest, a)
 #define M_IXOR(a, dest) N_XR(dest, a)
 #define M_CVTFD(src,dst) N_LDEBR(dst, src)
+#define M_CVTDF(src,dst) N_LEDBR(dst, src)
+
+#define M_SLL_IMM(imm, reg) N_SLL(reg, imm, RN) 
+#define M_SLA_IMM(imm, reg) N_SLA(reg, imm, RN) 
+
+#define M_SLDL_IMM(imm, reg) N_SLDL(reg, imm, RN) 
+#define M_SLDA_IMM(imm, reg) N_SLDA(reg, imm, RN) 
+
+#define M_SRL_IMM(imm, reg) N_SRL(reg, imm, RN)
+#define M_SRA_IMM(imm, reg) N_SRA(reg, imm, RN)
 
-#define M_ISLL_IMM(imm,reg) N_SLL(reg, imm, RN) 
-#define M_ISRL_IMM(imm,reg) N_SRL(reg, imm, RN)
+#define M_SRDL_IMM(imm, reg) N_SRDL(reg, imm, RN)
+#define M_SRDA_IMM(imm, reg) N_SRDA(reg, imm, RN)
+
+#define M_SLL(op, dst) N_SLL(dst, 0, op)
+#define M_SLA(op, dst) N_SLA(dst, 0, op)
+
+#define M_SLDL(op, dst) N_SLDL(dst, 0, op)
+#define M_SLDA(op, dst) N_SLDA(dst, 0, op)
+
+#define M_SRL(op, dst) N_SRL(dst, 0, op)
+#define M_SRA(op, dst) N_SRA(dst, 0, op)
+
+#define M_SRDL(op, dst) N_SRDL(dst, 0, op)
+#define M_SRDA(op, dst) N_SRDA(dst, 0, op)
 
 #define M_IMUL_IMM(val, reg) N_MHI(reg, val)
 #define M_IMUL(a, dest) N_MSR(dest, a)
 
+#define M_INEG(a, dest) N_LCR(dest, a)
+
+#define M_FCMP(a, b) N_CEBR(a, b)
+#define M_DCMP(a, b) N_CDBR(a, b)
+
+#define M_FMOVN(r, dst) N_LCEBR(dst, r)
+#define M_DMOVN(r, dst) N_LCDBR(dst, r)
+
 #define ICONST(reg, i) \
        do { \
                if (N_VALID_IMM(i)) { \
         } \
     } while (0)
 
-
-
 /* ----------------------------------------------- */
 
 #define _DEPR(x) \
 #define M_LLEA(a,b,c) _DEPR( M_LLEA(a,b,c) )
 #define M_ALEA(a,b,c) _DEPR( M_ALEA(a,b,c) )
 
-#define M_INEG(a) _DEPR( M_INEG(a) )
 #define M_LNEG(a) _DEPR( M_LNEG(a) )
 
 #define M_IAND_IMM(a,b) _DEPR( M_IAND_IMM(a,b) )
 #define M_LCMP_IMM_MEMBASE(a,b,c) _DEPR( M_LCMP_IMM_MEMBASE(a,b,c) )
 #define M_LCMP_MEMBASE(a,b,c) _DEPR( M_LCMP_MEMBASE(a,b,c) )
 
-#define M_ICMP_IMM(a,b) _DEPR( M_ICMP_IMM(a,b) )
 #define M_ICMP_IMM_MEMBASE(a,b,c) _DEPR( M_ICMP_IMM_MEMBASE(a,b,c) )
 #define M_ICMP_MEMBASE(a,b,c) _DEPR( M_ICMP_MEMBASE(a,b,c) )
 
 #define M_FST32(a,b,disp) _DEPR( M_FST32(a,b,disp) )
 #define M_DST32(a,b,disp) _DEPR( M_DST32(a,b,disp) )
 
-#define M_CVTLF(a,b) _DEPR( M_CVTLF(a,b) )
-#define M_CVTLD(a,b) _DEPR( M_CVTLD(a,b) )
-#define M_CVTFL(a,b) _DEPR( M_CVTFL(a,b) )
-#define M_CVTDL(a,b) _DEPR( M_CVTDL(a,b) )
-
-#define M_CVTDF(a,b) _DEPR( M_CVTDF(a,b) )
-
 
 /* system instructions ********************************************************/
 
index d6ca4e2a5c1484a5335696bfb210c6888fb3079a..6b823bf8e25c6265703d576ff1ee9a859defbc41 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Christian Thalinger
 
-   $Id: emit.c 7616 2007-03-29 23:21:50Z michi $
+   $Id: emit.c 7680 2007-04-10 05:02:20Z pm $
 
 */
 
@@ -159,11 +159,17 @@ __PORTED__ void emit_copy(jitdata *jd, instruction *iptr, varinfo *src, varinfo
                   order of getting the destination register and the load. */
 
                if (IS_INMEMORY(src->flags)) {
-                       d = codegen_reg_of_var(iptr->opc, dst, REG_IFTMP);
+                       if (IS_FLT_DBL_TYPE(dst->type))
+                               d = codegen_reg_of_var(iptr->opc, dst, REG_FTMP1);
+                       else
+                               d = codegen_reg_of_var(iptr->opc, dst, REG_ITMP1);
                        s1 = emit_load(jd, iptr, src, d);
                }
                else {
-                       s1 = emit_load(jd, iptr, src, REG_IFTMP);
+                       if (IS_FLT_DBL_TYPE(src->type))
+                               s1 = emit_load(jd, iptr, src, REG_FTMP1);
+                       else
+                               s1 = emit_load(jd, iptr, src, REG_ITMP1);
                        d = codegen_reg_of_var(iptr->opc, dst, s1);
                }
 
@@ -256,7 +262,7 @@ __PORTED__ void emit_exception_stubs(jitdata *jd)
                        M_LDA(rd->argintregs[3], REG_PV, er->branchpos - 4);
                } else {
                        M_INTMOVE(REG_PV, rd->argintregs[3]);
-                       M_AADD_IMM(er->branchpos - 4, REG_PV);
+                       M_AADD_IMM(er->branchpos - 4, rd->argintregs[3]);
                }
 
                /* move function to call into REG_ITMP! */
@@ -277,14 +283,7 @@ __PORTED__ void emit_exception_stubs(jitdata *jd)
 
                        M_AST(rd->argintregs[3], REG_SP, (0 * 4) + 96); /* store XPC */
 
-                       M_MOV(REG_ITMP1, REG_PV);
-                       M_JSR(REG_RA, REG_PV);
-
-                       /* Recalculate PV */
-
-                       N_BASR(REG_ITMP1, RN);
-                       disp = (s4) (cd->mcodeptr - cd->mcodebase);
-                       M_LDA(REG_PV, REG_ITMP1, -disp);
+                       M_JSR(REG_RA, REG_ITMP1);
 
                        M_MOV(REG_RESULT, REG_ITMP1_XPTR);
 
@@ -2376,7 +2375,7 @@ __PORTED__ s4 emit_load_high(jitdata *jd, instruction *iptr, varinfo *src, s4 te
 
                disp = src->vv.regoff * 4;
 
-               M_ILD(tempreg, REG_SP, disp + 4);
+               M_ILD(tempreg, REG_SP, disp);
 
                reg = tempreg;
        }
@@ -2409,7 +2408,7 @@ __PORTED__ s4 emit_load_low(jitdata *jd, instruction *iptr, varinfo *src, s4 tem
 
                disp = src->vv.regoff * 4;
 
-               M_ILD(tempreg, REG_SP, disp);
+               M_ILD(tempreg, REG_SP, disp + 4);
 
                reg = tempreg;
        }
@@ -2443,7 +2442,10 @@ __PORTED__ void emit_nullpointer_check(codegendata *cd, instruction *iptr, s4 re
 __PORTED__ void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1, s4 s2)
 {
        if (INSTRUCTION_MUST_CHECK(iptr)) {
-               N_C(s2, OFFSET(java_arrayheader, size), RN, s1);
+               /* Size is s4, >= 0
+                * Do unsigned comparison to catch negative indexes.
+                */
+               N_CL(s2, OFFSET(java_arrayheader, size), RN, s1);
         M_BGE(0);
         codegen_add_arrayindexoutofboundsexception_ref(cd, s2);
        }
@@ -2566,7 +2568,9 @@ void emit_restore_dst_even_odd(jitdata *jd, instruction *iptr, s4 htmpreg, s4 lt
        } else {
                hr = GET_HIGH_REG(dst->vv.regoff);
                lr = GET_LOW_REG(dst->vv.regoff);
-               if (((hr % 2) == 0) && (hr < R12)) {
+               if (((hr % 2) == 0) && lr == (hr + 1)) {
+                       return;
+               } else if (((hr % 2) == 0) && (hr < R12)) {
                        M_INTMOVE(breg, hr + 1);
                } else if (((lr % 2) == 1) && (lr < R12)) {
                        M_INTMOVE(breg, lr - 1);
index f1260527de7513249847f134e9075865951582ab..16dfc515d4e6f76fb47422e8331c561b060f582c 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: md-abi.h 7616 2007-03-29 23:21:50Z michi $
+   $Id: md-abi.h 7680 2007-04-10 05:02:20Z pm $
 
 */
 
@@ -75,8 +75,6 @@
 #define XMM15  15
 
 
-#define REG_IFTMP       10   /* temporary integer and floating point register */
-
 
 /* define registers ***********************************************************/
 
 /* No ftmp3 */
 /* #define REG_FTMP3       F5 */       /* temporary floating point register         */
 
-#define __REG_IFTMP       10       /* temporary integer and floating point register */
-
 
 #define INT_REG_CNT     16       /* number of integer registers               */
 #define INT_SAV_CNT     5        /* number of integer callee saved registers  */
index cc367379b35a520c22b07dd14a6f9fd59f0a0a50..1f6427660a8c83b2070d52e30e6378eb83f3cfc4 100644 (file)
@@ -2,15 +2,23 @@ package tests;
 
 #define TEST(cond) test(#cond, (cond), __LINE__)
 #define TODO() test("TODO: Implement", false, __LINE__)
+#define echo(x) System.out.println(x);
+#define between(l, x, h) (((l) <= (x)) && ((x) <= (h)))
 
 class tests {
 
        static int s_i, s_i1, s_i2;
        static float s_f, s_f1, s_f2;
+       static final float[] s_fa = { 111.11f, 222.22f, 333.33f, 444.44f, 555.55f };
+       static float[] s_fa2 = { 1.0f, 2.0f, 3.0f };
        static char s_c, s_c1;
        static short s_s, s_s1;
        static long s_l, s_l1, s_l2;
+       static final long[] s_la = { 0x11111111AAAAAAAAl, 0x22222222BBBBBBBBl, 0x33333333CCCCCCCCl };
+       static long[] s_la2 = { 0l, 1l, 2l };
        static double s_d, s_d1, s_d2;
+       static final double[] s_da = { 111.11, 222.22, 333.33, 444.44, 555.55 };
+       static double[] s_da2 = { 1.0, 2.0, 3.0 };
        static boolean s_b;
        static Object s_a;
        static final char[] s_ca = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
@@ -263,10 +271,20 @@ class tests {
        }
 
        static void test_IREM() {
-               s_i1 = 5570664;
-               s_i2 = 10000;
-               s_i = s_i1 % s_i2;
-               TEST(s_i == 664);
+#              define ITEST(a, op, b, res) \
+                       s_i1 = a; \
+                       s_i2 = b; \
+                       s_i = s_i1 op s_i2; \
+                       TEST(s_i == res); 
+
+               ITEST(5570664, %, 10000, 664);
+
+               ITEST(7, %, 3, 1);
+               ITEST(-7, %, 3, -1);
+               ITEST(7, %, -3, 1);
+               ITEST(-7, %, -3, -1);
+
+#              undef ITEST
        }
 
        static void test_FMUL() {
@@ -280,8 +298,7 @@ class tests {
                s_d1 = 1.1337;
                s_d2 = 100.0;
                s_d = s_d1 * s_d2;
-               TEST(s_d == 113.37);
-               System.out.println(s_d);
+               TEST(between(113.369, s_d, 113.371));
        }
 
        static void test_FDIV() {
@@ -295,7 +312,7 @@ class tests {
                s_d1 = 113.37;
                s_d2 = 100.0;
                s_d = s_d1 / s_d2;
-               TEST(s_d == 1.1337);
+               TEST(between(1.13369, s_d, 1.13371));
        }
 
        static void test_FSUB() {
@@ -335,10 +352,6 @@ class tests {
                TEST(s_f == 0.0f);
        }
 
-       static void test_I2D() {
-               TODO();
-       }
-
        static void test_F2I() {
                s_f = 1337.1337f;
                s_i = (int)s_f;
@@ -348,6 +361,76 @@ class tests {
                TEST(s_i == 0);
        }
 
+       static void test_L2I() {
+               s_l = -987l;
+               s_i = (int)s_l;
+               TEST(s_i == -987);
+
+               s_l = 987l;
+               s_i = (int)s_l;
+               TEST(s_i == 987);
+
+               s_l = 0x10ABBCCDDl;
+               s_i = (int)s_l;
+               TEST(s_i == 0x0ABBCCDD);
+
+       }
+
+       static void test_I2L() {
+               s_i = 987;
+               s_l = (long)s_i;
+               TEST(s_l == 987l);
+
+               s_i = -987;
+               s_l = (long)s_i;
+               TEST(s_l == -987l);
+       }
+
+       static void test_D2I() {
+               s_d = 987.77;
+               s_i = (int)s_d;
+               TEST(s_i == 987);
+
+               s_d = -987.77;
+               s_i = (int)s_d;
+               TEST(s_i == -987);
+       }
+
+       static void test_I2D() {
+               s_i = 987;
+               s_d = (double)s_i;
+               TEST(s_d == 987.0);
+
+               s_i = -987;
+               s_d = (double)s_i;
+               TEST(s_d == -987.0);
+       }
+
+       static void test_F2D() {
+               s_f = 987.77f;
+               s_d = (double)s_f;
+               TEST(between(987.76, s_d,  987.78));
+               /* i don't trust the comparing mechanism, test even it */
+               TEST(!between(987.78, s_d, 987.79));
+
+               s_f = -987.77f;
+               s_d = (double)s_f;
+               TEST(between(-987.78, s_d, -987.76));
+               TEST(!between(-987.79, s_d, -987.78));
+       }
+
+       static void test_D2F() {
+               s_d = 987.77;
+               s_f = (float)s_d;
+               TEST(between(987.76f, s_f, 987.78f));
+               TEST(!between(987.78f, s_f, 987.79f));
+
+               s_d = -987.77;
+               s_f = (float)s_d;
+               TEST(between(-987.78f, s_f, -987.76f));
+               TEST(!between(-987.79, s_f, -987.78f));
+       }
+
        static void test_FCMP() {
 
                // tests FCMPL and FCMPG
@@ -427,6 +510,8 @@ class tests {
                TEST(s_ca.length != 11);
        }
 
+       // ALOAD
+
        static void test_CALOAD() {
                s_c = s_ca[4];
                TEST(s_c == '4');
@@ -453,6 +538,23 @@ class tests {
                TEST(s_a == s_a1);
        }
 
+       static void test_LALOAD() {
+               s_l = s_la[1];
+               TEST(s_l == 0x22222222BBBBBBBBl);
+       }
+
+       static void test_FALOAD() {
+               s_f = s_fa[1];
+               TEST(s_f == 222.22f);
+       }
+
+       static void test_DALOAD() {
+               s_d = s_da[2];
+               TEST(s_d == 333.33);
+       }
+
+       // ASTORE
+
        static void test_CASTORE() {
                s_ca2[1] = 'X';
                s_c = s_ca2[1];
@@ -486,6 +588,27 @@ class tests {
                TEST(s_a == s_a1);
        }
 
+       static void test_LASTORE() {
+               s_l1 = 0xaabbccdd11223344l;
+               s_la2[2] = s_l1;
+               s_l = s_la2[2];
+               TEST(s_l == 0xaabbccdd11223344l);
+       }
+
+       static void test_FASTORE() {
+               s_f1 = 768.44f;
+               s_fa2[2] = s_f1;
+               s_f = s_fa2[2];
+               TEST(s_f == 768.44f);
+       }
+
+       static void test_DASTORE() {
+               s_d1 = 765.445;
+               s_da2[2] = s_d1;
+               s_d = s_da2[2];
+               TEST(s_d == 765.445);
+       }
+
        static void test_GETPUTSTATIC() {
                s_c1 = 'X';
                s_c = s_c1;
@@ -824,6 +947,7 @@ class tests {
                s_i = s_i1 | s_i2;
                TEST(s_i == 0x1a2b3c5d);
        }
+
        static void test_IXOR() {
                s_i1 =      0x0f0f1700;
                s_i2 =      0xf00f3300;
@@ -843,8 +967,373 @@ class tests {
                TEST(s_i1 == 0x1458aa56);
        }
 
+       static void test_IANDORXORCONST() {
+#              define LTEST(a, op, b, res) \
+                       s_i = a; \
+                       s_i ##op##= b; \
+                       TEST(s_i == res); 
+
+               LTEST(0xcccccccc, &,
+                     0x0f080400,
+                         0x0c080400);
+               
+               LTEST(0x0a0b0c1d, |,
+                     0x10203040,
+                         0x1a2b3c5d);
+
+               LTEST(0x0f0f1700, ^,
+                     0xf00f3300,
+                         0xff002400);
+
+#              undef LTEST
+       }
+
+       static void test_LSHX_LSHXCONST() {
+#              define STEST(a, op, b, res) \
+                       s_l1 = a; \
+                       s_i = b; \
+                       s_l = s_l1 op s_i; \
+                       TEST(s_l == res); \
+                       s_l = a; \
+                       s_l ##op##= b; \
+                       TEST(s_l == res); 
+
+               STEST(0x000000ABCD000000l, >>, 4, 
+                     0x0000000ABCD00000l);
+
+               STEST(-0x00000ABCD000000l, >>, 4, 
+                     -0x000000ABCD00000l);
+
+               STEST(0x000000ABCD000000l, <<, 4, 
+                     0x00000ABCD0000000l);
+
+               STEST(-0x00000ABCD000000l, <<, 4, 
+                     -0x0000ABCD0000000l);
+
+               STEST(0x000000ABCD000000l, >>>, 4, 
+                     0x0000000ABCD00000l);
+
+               STEST(0xF00000ABCD000000l, >>>, 4, 
+                     0x0F00000ABCD00000l);
+
+#              undef STEST
+       }
+
+       static void test_LANDORXOR_LANDORXORCONST() {
+#              define LTEST(a, op, b, res) \
+                       s_l1 = a; \
+                       s_l2 = b; \
+                       s_l = s_l1 op s_l2; \
+                       TEST(s_l == res); \
+                       s_l = a; \
+                       s_l ##op##= b; \
+                       TEST(s_l == res); 
+
+               LTEST(0x0000AAAA55550000l, &,
+                     0x0000F0800F400000l,
+                         0x0000A08005400000l);
+
+               LTEST(0x0000A0A050500000l, |,
+                     0x0000010908030000l,
+                         0x0000A1A958530000l);
+
+               LTEST(0x0000ABCD12340000l, ^,
+                     0x0000444411110000l,
+                         0x0000EF8903250000l);
+#              undef LTEST
+       }
+
+       static void test_ISHX_ISHXCONST() {
+#              define STEST(a, op, b, res) \
+                       s_i1 = a; \
+                       s_i2 = b; \
+                       s_i = s_i1 op s_i2; \
+                       TEST(s_i == res); \
+                       s_i = a; \
+                       s_i ##op##= b; \
+                       TEST(s_i == res); 
+
+               STEST(0x00A0B0C0, >>, 8,
+                         0x0000A0B0);
+
+               STEST(-0x0A0B0C0, >>, 8,
+                         -41137); /* don't ask why ... this is the result i get when executing on i386. */
+
+               STEST(0x00A0B0C0, <<, 4,
+                         0x0A0B0C00);
+
+               STEST(-0x00A0B0C0, <<, 4,
+                         -0x0A0B0C00);
+
+               STEST(0x00A0B0C0, >>>, 8,
+                         0x0000A0B0);
+
+               STEST(0xF0A0B0C0, >>>, 8,
+                         0x00F0A0B0);
+
+#              undef STEST
+       }
+
+       static void test_LADDSUB_LADDSUBCONST() {
+#              define LTEST(a, op, b, res) \
+                       s_l1 = a; \
+                       s_l2 = b; \
+                       s_l = s_l1 op s_l2; \
+                       TEST(s_l == res); \
+                       s_l = a; \
+                       s_l ##op##= b; \
+                       TEST(s_l == res);
+
+               /* addtion, with carry and normal */
+
+               LTEST(0x1A0000000l, +,
+                     0x1B0000000l,
+                         0x350000000l);
+
+               LTEST(0x10000000Al, +,
+                     0x20000000Bl, 
+                         0x300000015l);
+
+               /* substraction, random and the inverse of the two above */
+
+               LTEST(465365887678385708l, -,
+                              678300000l,
+                     465365887000085708l);
+
+               LTEST(0x350000000l, -,
+                     0x1B0000000l,
+                         0x1A0000000l);
+
+               LTEST(0x300000015l, -,
+                     0x20000000Bl,
+                         0x10000000Al);
+
+               /* The above with negative numbers. */
+
+               LTEST( 0x350000000l, +,
+                     -0x1B0000000l,
+                          0x1A0000000l);
+
+               LTEST( 0x300000015l, +,
+                     -0x20000000Bl,
+                          0x10000000Al);
+
+               LTEST( 0x1A0000000l, -,
+                     -0x1B0000000l,
+                          0x350000000l);
+
+               LTEST( 0x10000000Al, -,
+                     -0x20000000Bl, 
+                          0x300000015l);
+
+#              undef LTEST
+
+       }
+
+       static void test_LMULDIVREM() {
+#              define LTEST(a, op, b, res) \
+                       s_l1 = a; \
+                       s_l2 = b; \
+                       s_l = s_l1 op s_l2; \
+                       TEST(s_l == res);
+
+               LTEST(0x100000001l, *,
+                     0x200000002l,
+              17179869186l);
+
+               LTEST(0x800000008l, /,
+                     0x100000001l,
+              8);
+
+               LTEST(348761346749l, %,
+                     100000000000l,
+                          48761346749l);
+                         
+#              undef LTEST
+       }
+
+       static void test_LNEG() {
+#              define NTEST(val, res) \
+                       s_l1 = val; \
+                       s_l = -s_l1; \
+                       TEST(s_l == res); \
+
+               NTEST( 0x100000000l,
+                     -0x100000000l);
+
+               NTEST( 0x1F0000000l,
+                     -0x1F0000000l);
+
+#              undef NTEST
+       }
+
+       static void test_doubleToString() {
+               TEST(Double.toString(113.77).equals("113.77"));
+       }
+
+       static void test_INT2BYTE() {
+               s_i = 127;
+               s_by = (byte)s_i;
+               TEST(s_by == (byte)127);
+
+               s_i = -128;
+               s_by = (byte)s_i;
+               TEST(s_by == (byte)-128);
+       }
+
+       static void test_INT2SHORT() {
+               s_i = -0xabc;
+               s_s = (short)s_i;
+               TEST(s_s == (short)-0xabc);
+
+               s_i = 0xabc;
+               s_s = (short)s_i;
+               TEST(s_s == (short)0xabc);
+       }
+
+       static void test_IDIVREMPOW2() {
+#              define ITEST(a, op, b, res) \
+                       s_i = a; \
+                       s_i ##op##= b; \
+                       TEST(s_i == res); 
+
+               ITEST(98453466, /, 
+                     32, 
+                         3076670);
+
+               ITEST(-98453466, /, 
+                     32, 
+                         -3076670);
+
+               ITEST(9, %, 4, 1);
+               ITEST(-9, %, 4, -1);
+               ITEST(9, %, -4, 1);
+               ITEST(-9, %, -4, -1);
+
+#              undef ITEST
+       }
+
+       static void test_LDIVREMPOW2() {
+#              define LTEST(a, op, b, res) \
+                       s_l = a; \
+                       s_l ##op##= b; \
+                       TEST(s_l == res); 
+
+               LTEST(98453466l, /, 
+                     32l, 
+                         3076670l);
+
+               LTEST(-98453466l, /, 
+                     32l, 
+                         -3076670l);
+
+               LTEST(9l, %, 4l, 1l);
+               LTEST(-9l, %, 4l, -1l);
+               LTEST(9l, %, -4l, 1l);
+               LTEST(-9l, %, -4l, -1l);
+
+#              undef LTEST
+       }
+
+       static void test_FNEG_DNEG() {
+               s_f1 = 34.57f;
+               s_f = -s_f1;
+               TEST(s_f == -34.57f);
+
+               s_f1 = -34.57f;
+               s_f = -s_f1;
+               TEST(s_f == 34.57f);
+
+               s_d1 = 34.57;
+               s_d = -s_d1;
+               TEST(between(-34.58, s_d, -34.56));
+
+               s_d1 = -34.57;
+               s_d = -s_d1;
+               TEST(between(34.56, s_d, 34.58));
+       }
+
+       static void test_TABLESWITCH() {
+               s_i1 = 3;
+
+               switch (s_i1) {
+                       case 1:
+                               s_i = 11;
+                               break;
+                       case 2:
+                               s_i = 22;
+                               break;
+                       case 3:
+                               s_i = 33;
+                               break;
+                       case 4:
+                               s_i = 44;
+                               break;
+                       case 5:
+                               s_i = 55;
+                               break;
+               }
+
+               TEST(s_i == 33);
+
+               s_i1 = 2;
+
+               switch (s_i1) {
+                       case 0:
+                               s_i = 11;
+                               break;
+                       case 1:
+                               s_i = 12;
+                               break;
+                       default:
+                               s_i = 13;
+                               break;
+               }
+
+               TEST(s_i == 13);
+       }
+
+       static void test_LOOKUPSWITCH() {
+               s_i1 = 675;
+
+               switch (s_i1) {
+                       case 1:
+                               s_i = 11;
+                               break;
+                       case 23:
+                               s_i = 22;
+                               break;
+                       case 675:
+                               s_i = 33;
+                               break;
+                       case 9876:
+                               s_i = 44;
+                               break;
+                       case 181234:
+                               s_i = 55;
+                               break;
+               }
+
+               TEST(s_i == 33);
+
+               s_i1 = 5678;
+
+               switch (s_i1) {
+                       case 234:
+                               s_i = 11;
+                               break;
+                       case 1255:
+                               s_i = 12;
+                               break;
+                       default:
+                               s_i = 13;
+                               break;
+               }
+
+               TEST(s_i == 13);
+       }
+
        static void main(String[] args) {
-               /*
                test_ICONST();
                test_FCONST();
                test_INEG();
@@ -855,10 +1344,6 @@ class tests {
                test_ISUBCONST();
                test_IMULCONST();
                test_IDIV();
-               test_IREM();
-               test_I2F();
-               test_I2D();
-               test_F2I();
                test_FCMP();
                test_ARRAYLENGTH();
                test_CALOAD();
@@ -886,7 +1371,6 @@ class tests {
                test_SALOAD();
                test_IALOAD();
                test_IASTORE();
-               */
                test_FADD();
                test_FMUL();
                test_FSUB();
@@ -896,10 +1380,46 @@ class tests {
                test_DSUB();
                test_DDIV();
 
+               test_LSHX_LSHXCONST();
+               test_LANDORXOR_LANDORXORCONST();
+               test_IANDORXORCONST();
+               test_ISHX_ISHXCONST();
+               test_LADDSUB_LADDSUBCONST();
+               test_LNEG();
+               test_LMULDIVREM();
+
+               test_L2I();
+               test_I2L();
+               test_D2I();
+               test_I2D();
+               test_I2F();
+               test_F2I();
+               test_F2D();
+
+               test_doubleToString();
+
+               test_INT2BYTE();
+               test_INT2SHORT();
+
+               test_IDIVREMPOW2();
+               test_IREM();
+               test_LDIVREMPOW2();
+               test_FNEG_DNEG();
+               test_D2F();
+               test_LALOAD();
+               test_FALOAD();
+               test_DALOAD();
+               test_LASTORE();
+               test_FASTORE();
+               test_DASTORE();
+               test_TABLESWITCH();
+               test_LOOKUPSWITCH();
                summary();
-       }
 
 
+
+       }
+
 };
 
 // vim: syntax=java
index c19e01e6280dc9b3438aba759e24628d944ccdd5..2b2abed3faa28ddf832b1fcf60ca2041e0910381 100644 (file)
@@ -442,4 +442,23 @@ asm_criticalsections:
     .xword   0
 
 
+/* disable exec-stacks ********************************************************/
 
+#if defined(__linux__) && defined(__ELF__)
+       .section .note.GNU-stack,"",%progbits
+#endif
+
+
+/*
+ * 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: asm
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ * vim:noexpandtab:sw=4:ts=4:
+ */
index 68ffd15136950b4eefd8843d3b751f11596ae0e6..20b343895121153c46542eda72a775fb2824d772 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.S 7667 2007-04-05 00:16:05Z michi $
+   $Id: asmpart.S 7678 2007-04-09 17:23:55Z twisti $
 
 */
 
@@ -833,7 +833,7 @@ asm_criticalsections:
 /* disable exec-stacks ********************************************************/
 
 #if defined(__linux__) && defined(__ELF__)
-       .section .note.GNU-stack,"",@progbits
+       .section .note.GNU-stack,"",%progbits
 #endif
 
 
index 5967a17b872c9202ad1ae85ee38ff1ce5b4cbc9c..1cfcfe91537ed96974a0950959a57277f212683e 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: linker.c 7601 2007-03-28 23:02:50Z michi $
+   $Id: linker.c 7675 2007-04-05 14:23:04Z michi $
 
 */
 
@@ -77,6 +77,8 @@ classinfo *resolve_classref_or_classinfo_eager(classref_or_classinfo cls, bool c
 static s4 interfaceindex;       /* sequential numbering of interfaces         */
 static s4 classvalue;
 
+java_objectheader *linker_classrenumber_lock;
+
 
 /* primitivetype_table *********************************************************
 
@@ -132,6 +134,10 @@ bool linker_init(void)
 
        interfaceindex = 0;
 
+       /* create the global lock object */
+
+       linker_classrenumber_lock = NEW(java_objectheader);
+
        /* link java.lang.Class as first class of the system, because we
        need it's vftbl for all other classes so we can use a class as
        object */
@@ -1205,9 +1211,7 @@ static arraydescriptor *link_array(classinfo *c)
 
 static void linker_compute_subclasses(classinfo *c)
 {
-#if defined(ENABLE_THREADS)
-       compiler_lock();
-#endif
+       LOCK_MONITOR_ENTER(linker_classrenumber_lock);
 
        if (!(c->flags & ACC_INTERFACE)) {
                c->nextsub = NULL;
@@ -1225,9 +1229,7 @@ static void linker_compute_subclasses(classinfo *c)
 
        linker_compute_class_values(class_java_lang_Object);
 
-#if defined(ENABLE_THREADS)
-       compiler_unlock();
-#endif
+       LOCK_MONITOR_EXIT(linker_classrenumber_lock);
 }
 
 
index efd6b2ed2721664b0ed62e1f17e25e56f0e90f0a..f2b5b7e808f8cecb9c5e5f0d78c31b4f742cd0b8 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: linker.h 7246 2007-01-29 18:49:05Z twisti $
+   $Id: linker.h 7675 2007-04-05 14:23:04Z michi $
 */
 
 
@@ -155,6 +155,11 @@ struct primitivetypeinfo {
 
 extern primitivetypeinfo primitivetype_table[PRIMITIVETYPE_COUNT];
 
+/* This lock must be taken while renumbering classes or while atomically      */
+/* accessing classes.                                                         */
+
+extern java_objectheader *linker_classrenumber_lock;
+
 
 /* function prototypes ********************************************************/