Return-Path: Delivered-To: apmail-incubator-harmony-commits-archive@www.apache.org Received: (qmail 34555 invoked from network); 26 Dec 2005 20:49:53 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 26 Dec 2005 20:49:53 -0000 Received: (qmail 21084 invoked by uid 500); 26 Dec 2005 20:49:49 -0000 Delivered-To: apmail-incubator-harmony-commits-archive@incubator.apache.org Received: (qmail 20237 invoked by uid 500); 26 Dec 2005 20:49:47 -0000 Mailing-List: contact harmony-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: harmony-dev@incubator.apache.org Delivered-To: mailing list harmony-commits@incubator.apache.org Received: (qmail 20038 invoked by uid 99); 26 Dec 2005 20:49:46 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 26 Dec 2005 12:49:46 -0800 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME,UPPERCASE_25_50 X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Mon, 26 Dec 2005 12:49:45 -0800 Received: (qmail 34500 invoked by uid 65534); 26 Dec 2005 20:49:24 -0000 Message-ID: <20051226204924.34499.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r359098 - /incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/interp.c Date: Mon, 26 Dec 2005 20:49:24 -0000 To: harmony-commits@incubator.apache.org From: archie@apache.org X-Mailer: svnmailer-1.0.5 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: archie Date: Mon Dec 26 12:49:21 2005 New Revision: 359098 URL: http://svn.apache.org/viewcvs?rev=359098&view=rev Log: Minor optimization: eliminate redundant stack operations (e.g., pop then push). Modified: incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/interp.c Modified: incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/interp.c URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/interp.c?rev=359098&r1=359097&r2=359098&view=diff ============================================================================== --- incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/interp.c (original) +++ incubator/harmony/enhanced/trunk/sandbox/contribs/jchevm/jchevm/libjc/interp.c Mon Dec 26 12:49:21 2005 @@ -371,13 +371,13 @@ _jc_object_array *array; jint index; - POP(2); - array = (_jc_object_array *)STACKL(0); - index = STACKI(1); + POP(1); + array = (_jc_object_array *)STACKL(-1); + index = STACKI(0); ARRAYCHECK(array, index); _JC_ASSERT(_JC_LW_TEST(array->lockword, ARRAY) && _JC_LW_EXTRACT(array->lockword, TYPE) == _JC_TYPE_REFERENCE); - PUSHL(array->elems[~index]); + STACKL(-1) = array->elems[~index]; NEXT(); } TARGET(aastore) @@ -398,8 +398,7 @@ break; case 0: _jc_post_exception_msg(env, _JC_ArrayStoreException, - "can't store object of type `%s' into array" - " of `%s'", obj->type->name, + "`%s' not an instanceof `%s'", obj->type->name, array->type->u.array.element_type->name); /* FALLTHROUGH */ case -1: @@ -415,28 +414,22 @@ TARGET(anewarray) { _jc_array *array; - jint length; - POP(1); - length = STACKI(0); - if ((array = _jc_new_array(env, INFO(type), length)) == NULL) + if ((array = _jc_new_array(env, INFO(type), STACKI(-1))) == NULL) goto exception; - PUSHL((_jc_object *)array); + STACKL(-1) = (_jc_object *)array; NEXT(); } TARGET(areturn) - POP(1); - env->retval.l = STACKL(0); + env->retval.l = STACKL(-1); goto done; TARGET(arraylength) { _jc_array *array; - POP(1); - array = (_jc_array *)STACKL(0); - if (array == NULL) + if ((array = (_jc_array *)STACKL(-1)) == NULL) goto null_pointer_exception; - PUSHI(array->length); + STACKI(-1) = array->length; NEXT(); } TARGET(astore) @@ -453,18 +446,12 @@ { _jc_array *array; jint index; - int ptype; - POP(2); - array = (_jc_array *)STACKL(0); - index = STACKI(1); + POP(1); + array = (_jc_array *)STACKL(-1); + index = STACKI(0); ARRAYCHECK(array, index); - ptype = _JC_LW_EXTRACT(array->lockword, TYPE); - _JC_ASSERT(ptype == _JC_TYPE_BOOLEAN || ptype == _JC_TYPE_BYTE); - if (ptype == _JC_TYPE_BOOLEAN) - PUSHI(((_jc_boolean_array *)array)->elems[index]); - else - PUSHI(((_jc_byte_array *)array)->elems[index]); + STACKI(-1) = ((_jc_byte_array *)array)->elems[index]; NEXT(); } TARGET(bastore) @@ -490,11 +477,11 @@ _jc_char_array *array; jint index; - POP(2); - array = (_jc_char_array *)STACKL(0); - index = STACKI(1); + POP(1); + array = (_jc_char_array *)STACKL(-1); + index = STACKI(0); ARRAYCHECK(array, index); - PUSHI(array->elems[index]); + STACKI(-1) = array->elems[index]; NEXT(); } TARGET(castore) @@ -533,31 +520,29 @@ NEXT(); } TARGET(d2f) - POP2(1); - PUSHF(STACKD(0)); + POP(1); + STACKF(-1) = STACKD(-1); NEXT(); TARGET(d2i) - POP2(1); - PUSHI(_JC_CAST_FLT2INT(env, jdouble, jint, STACKD(0))); + POP(1); + STACKI(-1) = _JC_CAST_FLT2INT(env, jdouble, jint, STACKD(-1)); NEXT(); TARGET(d2l) - POP2(1); - PUSHJ(_JC_CAST_FLT2INT(env, jdouble, jlong, STACKD(0))); + STACKJ(-2) = _JC_CAST_FLT2INT(env, jdouble, jlong, STACKD(-2)); NEXT(); TARGET(dadd) - POP2(2); - PUSHD(STACKD(0) + STACKD(2)); + POP2(1); + STACKD(-2) += STACKD(0); NEXT(); TARGET(daload) { _jc_double_array *array; jint index; - POP(2); - array = (_jc_double_array *)STACKL(0); - index = STACKI(1); + array = (_jc_double_array *)STACKL(-2); + index = STACKI(-1); ARRAYCHECK(array, index); - PUSHD(array->elems[index]); + STACKD(-2) = array->elems[index]; NEXT(); } TARGET(dastore) @@ -573,43 +558,41 @@ NEXT(); } TARGET(dcmpg) - POP2(2); - PUSHI(_JC_DCMPG(STACKD(0), STACKD(2))); + POP(3); + STACKI(-1) = _JC_DCMPG(STACKD(-1), STACKD(1)); NEXT(); TARGET(dcmpl) - POP2(2); - PUSHI(_JC_DCMPL(STACKD(0), STACKD(2))); + POP(3); + STACKI(-1) = _JC_DCMPL(STACKD(-1), STACKD(1)); NEXT(); TARGET(ddiv) - POP2(2); - PUSHD(STACKD(0) / STACKD(2)); + POP2(1); + STACKD(-2) /= STACKD(0); NEXT(); TARGET(dload) PUSHD(LOCALD(INFO(local))); NEXT(); TARGET(dmul) - POP2(2); - PUSHD(STACKD(0) * STACKD(2)); + POP2(1); + STACKD(-2) *= STACKD(0); NEXT(); TARGET(dneg) - POP2(1); - PUSHD(-STACKD(0)); + STACKD(-2) = -STACKD(-2); NEXT(); TARGET(drem) - POP2(2); - PUSHD(fmod(STACKD(0), STACKD(2))); + POP2(1); + STACKD(-2) = fmod(STACKD(-2), STACKD(0)); NEXT(); TARGET(dreturn) - POP2(1); - env->retval.d = STACKD(0); + env->retval.d = STACKD(-2); goto done; TARGET(dstore) POP2(1); LOCALD(INFO(local)) = STACKD(0); NEXT(); TARGET(dsub) - POP2(2); - PUSHD(STACKD(0) - STACKD(2)); + POP2(1); + STACKD(-2) -= STACKD(0); NEXT(); TARGET(dup) STACKI(0) = STACKI(-1); @@ -651,31 +634,30 @@ POP(-2); NEXT(); TARGET(f2d) - POP(1); - PUSHD(STACKF(0)); + POP(-1); + STACKD(-2) = STACKF(-2); NEXT(); TARGET(f2i) - POP(1); - PUSHI(_JC_CAST_FLT2INT(env, jfloat, jint, STACKF(0))); + STACKI(-1) = _JC_CAST_FLT2INT(env, jfloat, jint, STACKF(-1)); NEXT(); TARGET(f2l) - POP(1); - PUSHJ(_JC_CAST_FLT2INT(env, jfloat, jlong, STACKF(0))); + POP(-1); + STACKJ(-2) = _JC_CAST_FLT2INT(env, jfloat, jlong, STACKF(-2)); NEXT(); TARGET(fadd) - POP(2); - PUSHF(STACKF(0) + STACKF(1)); + POP(1); + STACKF(-1) += STACKF(0); NEXT(); TARGET(faload) { _jc_float_array *array; jint index; - POP(2); - array = (_jc_float_array *)STACKL(0); - index = STACKI(1); + POP(1); + array = (_jc_float_array *)STACKL(-1); + index = STACKI(0); ARRAYCHECK(array, index); - PUSHF(array->elems[index]); + STACKF(-1) = array->elems[index]; NEXT(); } TARGET(failure) @@ -694,132 +676,123 @@ NEXT(); } TARGET(fcmpg) - POP(2); - PUSHI(_JC_FCMPG(STACKF(0), STACKF(1))); + POP(1); + STACKI(-1) = _JC_FCMPG(STACKF(-1), STACKF(0)); NEXT(); TARGET(fcmpl) - POP(2); - PUSHI(_JC_FCMPL(STACKF(0), STACKF(1))); + POP(1); + STACKI(-1) = _JC_FCMPL(STACKF(-1), STACKF(0)); NEXT(); TARGET(fdiv) - POP(2); - PUSHF(STACKF(0) / STACKF(1)); + POP(1); + STACKF(-1) /= STACKF(0); NEXT(); TARGET(fload) PUSHF(LOCALF(INFO(local))); NEXT(); TARGET(fmul) - POP(2); - PUSHF(STACKF(0) * STACKF(1)); + POP(1); + STACKF(-1) *= STACKF(0); NEXT(); TARGET(fneg) - POP(1); - PUSHF(-STACKF(0)); + STACKF(-1) = -STACKF(-1); NEXT(); TARGET(frem) - POP(2); - PUSHF(fmod(STACKF(0), STACKF(1))); + POP(1); + STACKF(-1) = fmod(STACKF(-1), STACKF(0)); NEXT(); TARGET(freturn) - POP(1); - env->retval.f = STACKF(0); + env->retval.f = STACKF(-1); goto done; TARGET(fstore) POP(1); LOCALF(INFO(local)) = STACKF(0); NEXT(); TARGET(fsub) - POP(2); - PUSHF(STACKF(0) - STACKF(1)); + POP(1); + STACKF(-1) -= STACKF(0); NEXT(); TARGET(getfield_z) { _jc_object *obj; - POP(1); - if ((obj = STACKL(0)) == NULL) + if ((obj = STACKL(-1)) == NULL) goto null_pointer_exception; - PUSHI(*(jboolean *)((char *)obj + INFO(field).u.offset)); + STACKI(-1) = *(jboolean *)((char *)obj + INFO(field).u.offset); NEXT(); } TARGET(getfield_b) { _jc_object *obj; - POP(1); - if ((obj = STACKL(0)) == NULL) + if ((obj = STACKL(-1)) == NULL) goto null_pointer_exception; - PUSHI(*(jbyte *)((char *)obj + INFO(field).u.offset)); + STACKI(-1) = *(jbyte *)((char *)obj + INFO(field).u.offset); NEXT(); } TARGET(getfield_c) { _jc_object *obj; - POP(1); - if ((obj = STACKL(0)) == NULL) + if ((obj = STACKL(-1)) == NULL) goto null_pointer_exception; - PUSHI(*(jchar *)((char *)obj + INFO(field).u.offset)); + STACKI(-1) = *(jchar *)((char *)obj + INFO(field).u.offset); NEXT(); } TARGET(getfield_s) { _jc_object *obj; - POP(1); - if ((obj = STACKL(0)) == NULL) + if ((obj = STACKL(-1)) == NULL) goto null_pointer_exception; - PUSHI(*(jshort *)((char *)obj + INFO(field).u.offset)); + STACKI(-1) = *(jshort *)((char *)obj + INFO(field).u.offset); NEXT(); } TARGET(getfield_i) { _jc_object *obj; - POP(1); - if ((obj = STACKL(0)) == NULL) + if ((obj = STACKL(-1)) == NULL) goto null_pointer_exception; - PUSHI(*(jint *)((char *)obj + INFO(field).u.offset)); + STACKI(-1) = *(jint *)((char *)obj + INFO(field).u.offset); NEXT(); } TARGET(getfield_j) { _jc_object *obj; - POP(1); - if ((obj = STACKL(0)) == NULL) + POP(-1); + if ((obj = STACKL(-2)) == NULL) goto null_pointer_exception; - PUSHJ(*(jlong *)((char *)obj + INFO(field).u.offset)); + STACKJ(-2) = *(jlong *)((char *)obj + INFO(field).u.offset); NEXT(); } TARGET(getfield_f) { _jc_object *obj; - POP(1); - if ((obj = STACKL(0)) == NULL) + if ((obj = STACKL(-1)) == NULL) goto null_pointer_exception; - PUSHF(*(jfloat *)((char *)obj + INFO(field).u.offset)); + STACKF(-1) = *(jfloat *)((char *)obj + INFO(field).u.offset); NEXT(); } TARGET(getfield_d) { _jc_object *obj; - POP(1); - if ((obj = STACKL(0)) == NULL) + POP(-1); + if ((obj = STACKL(-2)) == NULL) goto null_pointer_exception; - PUSHD(*(jdouble *)((char *)obj + INFO(field).u.offset)); + STACKD(-2) = *(jdouble *)((char *)obj + INFO(field).u.offset); NEXT(); } TARGET(getfield_l) { _jc_object *obj; - POP(1); - if ((obj = STACKL(0)) == NULL) + if ((obj = STACKL(-1)) == NULL) goto null_pointer_exception; - PUSHL(*(_jc_object **)((char *)obj + INFO(field).u.offset)); + STACKL(-1) = *(_jc_object **)((char *)obj + INFO(field).u.offset); NEXT(); } TARGET(getstatic) @@ -897,48 +870,44 @@ TARGET(goto) JUMP(INFO(target)); TARGET(i2b) - POP(1); - PUSHI((jbyte)STACKI(0)); + STACKI(-1) = (jbyte)STACKI(-1); NEXT(); TARGET(i2c) - POP(1); - PUSHI((jchar)STACKI(0)); + STACKI(-1) = (jchar)STACKI(-1); NEXT(); TARGET(i2d) - POP(1); - PUSHD(STACKI(0)); + POP(-1); + STACKD(-2) = STACKI(-2); NEXT(); TARGET(i2f) - POP(1); - PUSHF(STACKI(0)); + STACKF(-1) = STACKI(-1); NEXT(); TARGET(i2l) - POP(1); - PUSHJ(STACKI(0)); + POP(-1); + STACKJ(-2) = STACKI(-2); NEXT(); TARGET(i2s) - POP(1); - PUSHI((jshort)STACKI(0)); + STACKI(-1) = (jshort)STACKI(-1); NEXT(); TARGET(iadd) - POP(2); - PUSHI(STACKI(0) + STACKI(1)); + POP(1); + STACKI(-1) += STACKI(0); NEXT(); TARGET(iaload) { _jc_int_array *array; jint index; - POP(2); - array = (_jc_int_array *)STACKL(0); - index = STACKI(1); + POP(1); + array = (_jc_int_array *)STACKL(-1); + index = STACKI(0); ARRAYCHECK(array, index); - PUSHI(array->elems[index]); + STACKI(-1) = array->elems[index]; NEXT(); } TARGET(iand) - POP(2); - PUSHI(STACKI(0) & STACKI(1)); + POP(1); + STACKI(-1) &= STACKI(0); NEXT(); TARGET(iastore) { @@ -953,10 +922,10 @@ NEXT(); } TARGET(idiv) - POP(2); - if (STACKI(1) == 0) + POP(1); + if (STACKI(0) == 0) goto arithmetic_exception; - PUSHI(STACKI(0) / STACKI(1)); + STACKI(-1) /= STACKI(0); NEXT(); TARGET(if_acmpeq) POP(2); @@ -1013,28 +982,21 @@ PUSHI(LOCALI(INFO(local))); NEXT(); TARGET(imul) - POP(2); - PUSHI(STACKI(0) * STACKI(1)); + POP(1); + STACKI(-1) *= STACKI(0); NEXT(); TARGET(ineg) - POP(1); - PUSHI(-STACKI(0)); + STACKI(-1) = -STACKI(-1); NEXT(); TARGET(instanceof) - POP(1); - switch (_jc_instance_of(env, STACKL(0), INFO(type))) { - case 1: - PUSHI(1); - break; - case 0: - PUSHI(0); - break; - case -1: + { + jint result; + + if ((result = _jc_instance_of(env, STACKL(-1), INFO(type))) == -1) goto exception; - default: - _JC_ASSERT(JNI_FALSE); - } + STACKI(-1) = result; NEXT(); + } TARGET(invokestatic) { _jc_method *const imethod = INFO(invoke).method; @@ -1216,77 +1178,74 @@ NEXT(); } TARGET(ior) - POP(2); - PUSHI(STACKI(0) | STACKI(1)); + POP(1); + STACKI(-1) |= STACKI(0); NEXT(); TARGET(irem) - POP(2); - if (STACKI(1) == 0) + POP(1); + if (STACKI(0) == 0) goto arithmetic_exception; - PUSHI(STACKI(0) % STACKI(1)); + STACKI(-1) %= STACKI(0); NEXT(); TARGET(ireturn) - POP(1); - env->retval.i = STACKI(0); + env->retval.i = STACKI(-1); goto done; TARGET(ishl) - POP(2); - PUSHI(STACKI(0) << (STACKI(1) & 0x1f)); + POP(1); + STACKI(-1) <<= STACKI(0) & 0x1f; NEXT(); TARGET(ishr) - POP(2); - PUSHI(_JC_ISHR(STACKI(0), STACKI(1) & 0x1f)); + POP(1); + STACKI(-1) = _JC_ISHR(STACKI(-1), STACKI(0) & 0x1f); NEXT(); TARGET(istore) POP(1); LOCALI(INFO(local)) = STACKI(0); NEXT(); TARGET(isub) - POP(2); - PUSHI(STACKI(0) - STACKI(1)); + POP(1); + STACKI(-1) -= STACKI(0); NEXT(); TARGET(iushr) - POP(2); - PUSHI(_JC_IUSHR(STACKI(0), STACKI(1) & 0x1f)); + POP(1); + STACKI(-1) = _JC_IUSHR(STACKI(-1), STACKI(0) & 0x1f); NEXT(); TARGET(ixor) - POP(2); - PUSHI(STACKI(0) ^ STACKI(1)); + POP(1); + STACKI(-1) ^= STACKI(0); NEXT(); TARGET(jsr) PUSHI(pc + 1); JUMP(INFO(target)); TARGET(l2d) - POP2(1); - PUSHD(STACKJ(0)); + STACKD(-2) = STACKJ(-2); NEXT(); TARGET(l2f) - POP2(1); - PUSHF(STACKJ(0)); + POP(1); + STACKF(-1) = STACKJ(-1); NEXT(); TARGET(l2i) - POP2(1); - PUSHI(STACKJ(0)); + POP(1); + STACKI(-1) = STACKJ(-1); NEXT(); TARGET(ladd) - POP2(2); - PUSHJ(STACKJ(0) + STACKJ(2)); + POP2(1); + STACKJ(-2) += STACKJ(0); NEXT(); TARGET(laload) { _jc_long_array *array; jint index; - POP(2); - array = (_jc_long_array *)STACKL(0); - index = STACKI(1); + array = (_jc_long_array *)STACKL(-2); + index = STACKI(-1); ARRAYCHECK(array, index); - PUSHJ(array->elems[index]); + STACKJ(-2) = array->elems[index]; NEXT(); } TARGET(land) - POP2(2); - PUSHJ(STACKJ(0) & STACKJ(2)); + POP2(1); + STACKJ(-2) &= STACKJ(0); NEXT(); TARGET(lastore) { @@ -1301,12 +1260,11 @@ NEXT(); } TARGET(lcmp) - POP2(2); - PUSHI(_JC_LCMP(STACKJ(0), STACKJ(2))); + POP(3); + STACKI(-1) = _JC_LCMP(STACKJ(-1), STACKJ(1)); NEXT(); TARGET(ldc) - memcpy(sp, &INFO(constant), sizeof(_jc_word)); - POP(-1); + *sp++ = *((_jc_word *)&INFO(constant)); NEXT(); TARGET(ldc_string) { @@ -1338,25 +1296,24 @@ JUMP(pc); } TARGET(ldc2_w) - memcpy(sp, &INFO(constant), 2 * sizeof(_jc_word)); - POP(-2); + *sp++ = ((_jc_word *)&INFO(constant))[0]; + *sp++ = ((_jc_word *)&INFO(constant))[1]; NEXT(); TARGET(ldiv) - POP2(2); - if (STACKJ(2) == 0) + POP2(1); + if (STACKJ(0) == 0) goto arithmetic_exception; - PUSHJ(STACKJ(0) / STACKJ(2)); + STACKJ(-2) /= STACKJ(0); NEXT(); TARGET(lload) PUSHJ(LOCALJ(INFO(local))); NEXT(); TARGET(lmul) - POP2(2); - PUSHJ(STACKJ(0) * STACKJ(2)); + POP2(1); + STACKJ(-2) *= STACKJ(0); NEXT(); TARGET(lneg) - POP2(1); - PUSHJ(-STACKJ(0)); + STACKJ(-2) = -STACKJ(-2); NEXT(); TARGET(lookupswitch) { @@ -1371,42 +1328,41 @@ JUMP(entry != NULL ? entry->target : lsw->default_target); } TARGET(lor) - POP2(2); - PUSHJ(STACKJ(0) | STACKJ(2)); + POP2(1); + STACKJ(-2) |= STACKJ(0); NEXT(); TARGET(lrem) - POP2(2); - if (STACKJ(2) == 0) + POP2(1); + if (STACKJ(0) == 0) goto arithmetic_exception; - PUSHJ(STACKJ(0) % STACKJ(2)); + STACKJ(-2) %= STACKJ(0); NEXT(); TARGET(lreturn) - POP2(1); - env->retval.j = STACKJ(0); + env->retval.j = STACKJ(-2); goto done; TARGET(lshl) - POP(3); - PUSHJ(STACKJ(0) << (STACKI(2) & 0x3f)); + POP(1); + STACKJ(-2) <<= STACKI(0) & 0x3f; NEXT(); TARGET(lshr) - POP(3); - PUSHJ(_JC_LSHR(STACKJ(0), STACKI(2))); + POP(1); + STACKJ(-2) = _JC_LSHR(STACKJ(-2), STACKI(0)); NEXT(); TARGET(lstore) POP2(1); LOCALJ(INFO(local)) = STACKJ(0); NEXT(); TARGET(lsub) - POP2(2); - PUSHJ(STACKJ(0) - STACKJ(2)); + POP2(1); + STACKJ(-2) -= STACKJ(0); NEXT(); TARGET(lushr) - POP(3); - PUSHJ(_JC_LUSHR(STACKJ(0), STACKI(2))); + POP(1); + STACKJ(-2) = _JC_LUSHR(STACKJ(-2), STACKI(0)); NEXT(); TARGET(lxor) - POP2(2); - PUSHJ(STACKJ(0) ^ STACKJ(2)); + POP2(1); + STACKJ(-2) ^= STACKJ(0); NEXT(); TARGET(monitorenter) POP(1); @@ -1611,11 +1567,11 @@ _jc_short_array *array; jint index; - POP(2); - array = (_jc_short_array *)STACKL(0); - index = STACKI(1); + POP(1); + array = (_jc_short_array *)STACKL(-1); + index = STACKI(0); ARRAYCHECK(array, index); - PUSHI(array->elems[index]); + STACKI(-1) = array->elems[index]; NEXT(); } TARGET(sastore) @@ -1698,8 +1654,8 @@ } /* Clear stack, push exception, and proceed with handler */ - sp = locals + code->max_locals; - PUSHL(e); + sp = locals + code->max_locals + 1; + STACKL(-1) = e; JUMP(trap->target); }