PatchSet 5030 Date: 2004/07/30 13:57:47 Author: hkraemer Branch: HEAD Tag: (none) Log: tweak for GETSTATIC with static final fields
Members: ChangeLog:1.2588->1.2589 kaffe/kaffevm/kaffe.def:1.32->1.33 Index: kaffe/ChangeLog diff -u kaffe/ChangeLog:1.2588 kaffe/ChangeLog:1.2589 --- kaffe/ChangeLog:1.2588 Fri Jul 30 11:52:25 2004 +++ kaffe/ChangeLog Fri Jul 30 13:57:47 2004 @@ -1,3 +1,8 @@ +2004-07-30 Helmer Kraemer <[EMAIL PROTECTED]> + + * kaffe/kaffevm/kaffe.def (GETSTATIC): treat static final fields of + initialized classes as constants + 2004-07-30 Guilhem Lavaux <[EMAIL PROTECTED]> * libraries/java/lang/Thread.java: Reverted to original file from Index: kaffe/kaffe/kaffevm/kaffe.def diff -u kaffe/kaffe/kaffevm/kaffe.def:1.32 kaffe/kaffe/kaffevm/kaffe.def:1.33 --- kaffe/kaffe/kaffevm/kaffe.def:1.32 Sun Jul 25 16:33:49 2004 +++ kaffe/kaffe/kaffevm/kaffe.def Fri Jul 30 13:57:34 2004 @@ -2182,6 +2182,9 @@ softcall_initialise_class(c); \ } +#define FIELD_IS_CONSTANT() \ + field_class()->state==CSTATE_COMPLETE && (field_field()->accflags&ACC_FINAL)!=0 + define_insn(GETSTATIC) { /* @@ -2251,42 +2254,75 @@ getting data in the right type of register. */ else if (!FIELD_ISPRIM(field_field())) { push(1); - load_addr_ref(stack(0), FIELD_ADDRESS(field_field())); + if (FIELD_IS_CONSTANT()) { + move_ref_const(stack(0), *(jobject *)FIELD_ADDRESS(field_field())); + } else { + load_addr_ref(stack(0), FIELD_ADDRESS(field_field())); + } } else switch (CLASS_PRIM_SIG(FIELD_TYPE(field_field()))) { case 'I': push(1); - load_addr_int(stack(0), FIELD_ADDRESS(field_field())); + if (FIELD_IS_CONSTANT()) { + move_int_const(stack(0), *(jint *)FIELD_ADDRESS(field_field())); + } else { + load_addr_int(stack(0), FIELD_ADDRESS(field_field())); + } break; case 'S': push(1); - load_addr_short(stack(0), FIELD_ADDRESS(field_field())); + if (FIELD_IS_CONSTANT()) { + move_int_const(stack(0), *(jint *)FIELD_ADDRESS(field_field())); + } else { + load_addr_short(stack(0), FIELD_ADDRESS(field_field())); + } break; case 'B': case 'Z': push(1); - load_addr_byte(stack(0), FIELD_ADDRESS(field_field())); + if (FIELD_IS_CONSTANT()) { + move_int_const (stack(0), *(jbyte *)FIELD_ADDRESS(field_field())); + } else { + load_addr_byte(stack(0), FIELD_ADDRESS(field_field())); + } break; case 'C': push(1); - load_addr_char(stack(0), FIELD_ADDRESS(field_field())); + if (FIELD_IS_CONSTANT()) { + move_int_const(stack(0), *(jchar *)FIELD_ADDRESS(field_field())); + } else { + load_addr_char(stack(0), FIELD_ADDRESS(field_field())); + } break; case 'F': push(1); - load_addr_float(stack(0), FIELD_ADDRESS(field_field())); + if (FIELD_IS_CONSTANT()) { + move_float_const(stack(0), *(jfloat *)FIELD_ADDRESS(field_field())); + } else { + load_addr_float(stack(0), FIELD_ADDRESS(field_field())); + } break; case 'J': push(2); - load_addr_long(stack_long(0), FIELD_ADDRESS(field_field())); + if (FIELD_IS_CONSTANT()) { + move_long_const(stack(0), *(jlong *)FIELD_ADDRESS(field_field())); + } else { + load_addr_long(stack_long(0), FIELD_ADDRESS(field_field())); + } break; case 'D': push(2); - load_addr_double(stack_double(0), FIELD_ADDRESS(field_field())); + if (FIELD_IS_CONSTANT()) { + move_double_const(stack(0), *(jdouble *)FIELD_ADDRESS(field_field())); + } else { + load_addr_double(stack_double(0), FIELD_ADDRESS(field_field())); + } break; default: ABORT(); } } +#undef FIELD_IS_CONSTANT define_insn(PUTSTATIC) { _______________________________________________ kaffe mailing list [EMAIL PROTECTED] http://kaffe.org/cgi-bin/mailman/listinfo/kaffe