Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: codegen.c 7564 2007-03-23 23:36:17Z twisti $
-
*/
s1 = emit_load_s1(jd, iptr, REG_ATMP1);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
/* implicit null-pointer check */
- M_ILD(d, s1, OFFSET(java_arrayheader, size));
+ M_ILD(d, s1, OFFSET(java_array_t, size));
emit_store_dst(jd, iptr, d);
break;
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
M_INTMOVE(s2, REG_ITMP2);
- M_IADD_IMM(OFFSET(java_bytearray, data[0]), REG_ITMP2);
+ M_IADD_IMM(OFFSET(java_bytearray_t, data[0]), REG_ITMP2);
M_ADRMOVE(s1, REG_ATMP1);
M_AADDINT(REG_ITMP2, REG_ATMP1);
/* implicit null-pointer check */
emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
M_INTMOVE(s2, REG_ITMP2);
M_ISSL_IMM(1, REG_ITMP2);
- M_IADD_IMM(OFFSET(java_chararray, data[0]), REG_ITMP2);
+ M_IADD_IMM(OFFSET(java_chararray_t, data[0]), REG_ITMP2);
M_ADRMOVE(s1, REG_ATMP1);
M_AADDINT(REG_ITMP2, REG_ATMP1);
/* implicit null-pointer check */
emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
M_INTMOVE(s2, REG_ITMP2);
M_ISSL_IMM(1, REG_ITMP2);
- M_IADD_IMM(OFFSET(java_shortarray, data[0]), REG_ITMP2);
+ M_IADD_IMM(OFFSET(java_shortarray_t, data[0]), REG_ITMP2);
M_ADRMOVE(s1, REG_ATMP1);
M_AADDINT(REG_ITMP2, REG_ATMP1);
emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
M_INTMOVE(s2, REG_ITMP2);
M_ISSL_IMM(2, REG_ITMP2);
- M_IADD_IMM(OFFSET(java_intarray, data[0]), REG_ITMP2);
+ M_IADD_IMM(OFFSET(java_intarray_t, data[0]), REG_ITMP2);
M_ADRMOVE(s1, REG_ATMP1);
M_AADDINT(REG_ITMP2, REG_ATMP1);
/* implicit null-pointer check */
emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
M_INTMOVE(s2, REG_ITMP1);
M_ISSL_IMM(3, REG_ITMP1);
- M_IADD_IMM(OFFSET(java_longarray, data[0]), REG_ITMP1);
+ M_IADD_IMM(OFFSET(java_longarray_t, data[0]), REG_ITMP1);
M_ADRMOVE(s1, REG_ATMP1);
M_AADDINT(REG_ITMP1, REG_ATMP1);
/* implicit null-pointer check */
emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
M_INTMOVE(s2, REG_ITMP2);
M_ISSL_IMM(2, REG_ITMP2);
- M_IADD_IMM(OFFSET(java_floatarray, data[0]), REG_ITMP2);
+ M_IADD_IMM(OFFSET(java_floatarray_t, data[0]), REG_ITMP2);
M_ADRMOVE(s1, REG_ATMP1);
M_AADDINT(REG_ITMP2, REG_ATMP1);
/* implicit null-pointer check */
emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
M_INTMOVE(s2, REG_ITMP2);
M_ISSL_IMM(3, REG_ITMP2);
- M_IADD_IMM(OFFSET(java_doublearray, data[0]), REG_ITMP2);
+ M_IADD_IMM(OFFSET(java_doublearray_t, data[0]), REG_ITMP2);
M_ADRMOVE(s1, REG_ATMP1);
M_AADDINT(REG_ITMP2, REG_ATMP1);
/* implicit null-pointer check */
emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
M_INTMOVE(s2, REG_ITMP2);
M_ISSL_IMM(2, REG_ITMP2);
- M_IADD_IMM(OFFSET(java_objectarray, data[0]), REG_ITMP2);
+ M_IADD_IMM(OFFSET(java_objectarray_t, data[0]), REG_ITMP2);
M_ADRMOVE(s1, REG_ATMP1);
M_AADDINT(REG_ITMP2, REG_ATMP1);
emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
M_INTMOVE(s2, REG_ITMP2);
- M_IADD_IMM(OFFSET(java_bytearray, data[0]), REG_ITMP2);
+ M_IADD_IMM(OFFSET(java_bytearray_t, data[0]), REG_ITMP2);
M_ADRMOVE(s1, REG_ATMP1);
M_AADDINT(REG_ITMP2, REG_ATMP1);
/* implicit null-pointer check */
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
M_INTMOVE(s2, REG_ITMP2);
M_ISSL_IMM(1, REG_ITMP2);
- M_IADD_IMM(OFFSET(java_chararray, data[0]), REG_ITMP2);
+ M_IADD_IMM(OFFSET(java_chararray_t, data[0]), REG_ITMP2);
M_ADRMOVE(s1, REG_ATMP1);
M_AADDINT(REG_ITMP2, REG_ATMP1);
/* implicit null-pointer check */
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
M_INTMOVE(s2, REG_ITMP2);
M_ISSL_IMM(1, REG_ITMP2);
- M_IADD_IMM(OFFSET(java_shortarray, data[0]), REG_ITMP2);
+ M_IADD_IMM(OFFSET(java_shortarray_t, data[0]), REG_ITMP2);
M_ADRMOVE(s1, REG_ATMP1);
M_AADDINT(REG_ITMP2, REG_ATMP1);
/* implicit null-pointer check */
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
M_INTMOVE(s2, REG_ITMP2);
M_ISSL_IMM(2, REG_ITMP2);
- M_IADD_IMM(OFFSET(java_intarray, data[0]), REG_ITMP2);
+ M_IADD_IMM(OFFSET(java_intarray_t, data[0]), REG_ITMP2);
M_ADRMOVE(s1, REG_ATMP1);
M_AADDINT(REG_ITMP2, REG_ATMP1);
/* implicit null-pointer check */
M_INTMOVE(s2, REG_ITMP1);
M_ISSL_IMM(3, REG_ITMP1);
- M_IADD_IMM(OFFSET(java_longarray, data[0]), REG_ITMP1);
+ M_IADD_IMM(OFFSET(java_longarray_t, data[0]), REG_ITMP1);
M_ADRMOVE(s1, REG_ATMP1);
M_AADDINT(REG_ITMP1, REG_ATMP1);
/* implicit null-pointer check */
emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
M_INTMOVE(s2, REG_ITMP2);
M_ISSL_IMM(2, REG_ITMP2);
- M_IADD_IMM(OFFSET(java_floatarray, data[0]), REG_ITMP2);
+ M_IADD_IMM(OFFSET(java_floatarray_t, data[0]), REG_ITMP2);
M_ADRMOVE(s1, REG_ATMP1);
M_AADDINT(REG_ITMP2, REG_ATMP1);
/* implicit null-pointer check */
emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
M_INTMOVE(s2, REG_ITMP2);
M_ISSL_IMM(3, REG_ITMP2);
- M_IADD_IMM(OFFSET(java_doublearray, data[0]), REG_ITMP2);
+ M_IADD_IMM(OFFSET(java_doublearray_t, data[0]), REG_ITMP2);
M_ADRMOVE(s1, REG_ATMP1);
M_AADDINT(REG_ITMP2, REG_ATMP1);
/* implicit null-pointer check */
s3 = emit_load_s3(jd, iptr, REG_ATMP2);
/* XXX what if array is NULL */
- disp = dseg_add_functionptr(cd, BUILTIN_canstore);
+ disp = dseg_add_functionptr(cd, BUILTIN_FAST_canstore);
M_AST(s1, REG_SP, 0*4);
M_AST(s3, REG_SP, 1*4);
- M_JSR_IMM(BUILTIN_canstore);
- emit_exception_check(cd, iptr);
+ M_JSR_IMM(BUILTIN_FAST_canstore);
+ emit_arraystore_check(cd, iptr);
s1 = emit_load_s1(jd, iptr, REG_ATMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP1);
s3 = emit_load_s3(jd, iptr, REG_ATMP2);
M_INTMOVE(s2, REG_ITMP1);
M_ISSL_IMM(2, REG_ITMP1);
- M_IADD_IMM(OFFSET(java_objectarray, data[0]), REG_ITMP1);
+ M_IADD_IMM(OFFSET(java_objectarray_t, data[0]), REG_ITMP1);
M_ADRMOVE(s1, REG_ATMP1);
M_AADDINT(REG_ITMP1, REG_ATMP1);
/* implicit null-pointer check */
M_JSR_IMM(codegen_stub_builtin_enter);
- /* builtins are allowed to have 4 arguments max */
-
- assert(md->paramcount <= 4);
-
/* copy arguments into new stackframe */
for (i = 0; i < md->paramcount; i++) {
M_AADD_IMM(-(cd->stackframesize*4), REG_SP);
/* get function address (this must happen before the stackframeinfo) */
-#if !defined(WITH_STATIC_CLASSPATH)
if (f == NULL) {
codegen_addpatchref(cd, PATCHER_resolve_native_function, m, 0);
}
-#endif
+
M_AMOV_IMM(f, REG_ATMP2); /* do not move this line, the patcher is needed */
M_AST(REG_ATMP2, REG_SP, 4 * 4);
/* void codegen_start_native_call(u1 *datasp, u1 *pv, u1 *sp, u1 *ra) */
M_AMOV(REG_SP, REG_ATMP1);
- M_AADD_IMM(cd->stackframesize * 4, REG_ATMP1);
-
- M_ALD(REG_ATMP3, REG_ATMP1, 0 * 4);
- M_AST(REG_ATMP3, REG_SP, 3 * 4); /* ra */
-
- M_AST(REG_ATMP1, REG_SP, 0 * 4); /* datasp */
-
- M_AADD_IMM(1 * 4 , REG_ATMP1);
- M_AST(REG_ATMP1, REG_SP, 2 * 4); /* sp */
+ M_AST(REG_ATMP1, REG_SP, 0 * 4); /* currentsp */
M_AMOV_IMM(0, REG_ATMP2); /* 0 needs to patched */
dseg_adddata(cd); /* this patches it */
M_JSR_IMM(codegen_start_native_call);
+ /* remember class argument */
+ if (m->flags & ACC_STATIC)
+ M_INT2ADRMOVE(REG_RESULT, REG_ATMP3);
+
/* load function pointer */
M_ALD(REG_ATMP2, REG_SP, 4 * 4);
}
/* for static function class as second arg */
- if (m->flags & ACC_STATIC) {
- M_AMOV_IMM(m->class, REG_ATMP1);
- M_AST(REG_ATMP1, REG_SP, 1 * 4);
- }
+ if (m->flags & ACC_STATIC)
+ M_AST(REG_ATMP3, REG_SP, 1 * 4);
+
/* env ist first argument */
M_AMOV_IMM(_Jv_env, REG_ATMP1);
M_AST(REG_ATMP1, REG_SP, 0 * 4);