diff -r 928912ce8438 -r be93aad57795 src/share/vm/interpreter/abstractInterpreter.hpp --- a/src/share/vm/interpreter/abstractInterpreter.hpp Mon Apr 20 14:48:03 2009 -0700 +++ b/src/share/vm/interpreter/abstractInterpreter.hpp Tue Apr 21 23:21:04 2009 -0700 @@ -217,6 +217,73 @@ stackElementSize()) + tag_offset_in_bytes(); } + // access to stacked values according to type: + static oop* oop_addr_in_slot(intptr_t* slot_addr) { + return (oop*) slot_addr; + } + static jint* int_addr_in_slot(intptr_t* slot_addr) { + if ((int) sizeof(jint) < wordSize && !Bytes::is_Java_byte_ordering_different()) + // big-endian LP64 + return (jint*)(slot_addr + 1) - 1; + else + return (jint*) slot_addr; + } + static jlong long_in_slot(intptr_t* slot_addr) { + if (sizeof(intptr_t) >= sizeof(jlong)) { + return *(jlong*) slot_addr; + } else if (!TaggedStackInterpreter) { + return Bytes::get_native_u8((address)slot_addr); + } else { + assert(sizeof(intptr_t) * 2 == sizeof(jlong), "ILP32"); + // assemble the long in memory order (not arithmetic order) + union { jlong j; jint i[2]; } u; + u.i[0] = (jint) slot_addr[0*stackElementSize()]; + u.i[1] = (jint) slot_addr[1*stackElementSize()]; + return u.j; + } + } + static void set_long_in_slot(intptr_t* slot_addr, jlong value) { + if (sizeof(intptr_t) >= sizeof(jlong)) { + *(jlong*) slot_addr = value; + } else if (!TaggedStackInterpreter) { + Bytes::put_native_u8((address)slot_addr, value); + } else { + assert(sizeof(intptr_t) * 2 == sizeof(jlong), "ILP32"); + // assemble the long in memory order (not arithmetic order) + union { jlong j; jint i[2]; } u; + u.j = value; + slot_addr[0*stackElementSize()] = (intptr_t) u.i[0]; + slot_addr[1*stackElementSize()] = (intptr_t) u.i[1]; + } + } + static void get_jvalue_in_slot(intptr_t* slot_addr, BasicType type, jvalue* value) { + switch (type) { + case T_BOOLEAN: value->z = *int_addr_in_slot(slot_addr); break; + case T_CHAR: value->c = *int_addr_in_slot(slot_addr); break; + case T_BYTE: value->b = *int_addr_in_slot(slot_addr); break; + case T_SHORT: value->s = *int_addr_in_slot(slot_addr); break; + case T_INT: value->i = *int_addr_in_slot(slot_addr); break; + case T_LONG: value->j = long_in_slot(slot_addr); break; + case T_FLOAT: value->f = *(jfloat*)int_addr_in_slot(slot_addr); break; + case T_DOUBLE: value->d = jdouble_cast(long_in_slot(slot_addr)); break; + case T_OBJECT: value->l = (jobject)*oop_addr_in_slot(slot_addr); break; + default: ShouldNotReachHere(); + } + } + static void set_jvalue_in_slot(intptr_t* slot_addr, BasicType type, jvalue* value) { + switch (type) { + case T_BOOLEAN: *int_addr_in_slot(slot_addr) = (value->z != 0); break; + case T_CHAR: *int_addr_in_slot(slot_addr) = value->c; break; + case T_BYTE: *int_addr_in_slot(slot_addr) = value->b; break; + case T_SHORT: *int_addr_in_slot(slot_addr) = value->s; break; + case T_INT: *int_addr_in_slot(slot_addr) = value->i; break; + case T_LONG: set_long_in_slot(slot_addr, value->j); break; + case T_FLOAT: *(jfloat*)int_addr_in_slot(slot_addr) = value->f; break; + case T_DOUBLE: set_long_in_slot(slot_addr, jlong_cast(value->d)); break; + case T_OBJECT: *oop_addr_in_slot(slot_addr) = (oop) value->l; break; + default: ShouldNotReachHere(); + } + } }; //------------------------------------------------------------------------------------------------------------------------