comparison src/share/vm/interpreter/abstractInterpreter.hpp @ 726:be93aad57795

6655646: dynamic languages need dynamically linked call sites Summary: invokedynamic instruction (JSR 292 RI) Reviewed-by: twisti, never
author jrose
date Tue, 21 Apr 2009 23:21:04 -0700
parents e5b0439ef4ae
children 9987d9d5eb0e
comparison
equal deleted inserted replaced
725:928912ce8438 726:be93aad57795
215 assert(TaggedStackInterpreter, "should not call this"); 215 assert(TaggedStackInterpreter, "should not call this");
216 return ((frame::interpreter_frame_expression_stack_direction() * n) * 216 return ((frame::interpreter_frame_expression_stack_direction() * n) *
217 stackElementSize()) + tag_offset_in_bytes(); 217 stackElementSize()) + tag_offset_in_bytes();
218 } 218 }
219 219
220 // access to stacked values according to type:
221 static oop* oop_addr_in_slot(intptr_t* slot_addr) {
222 return (oop*) slot_addr;
223 }
224 static jint* int_addr_in_slot(intptr_t* slot_addr) {
225 if ((int) sizeof(jint) < wordSize && !Bytes::is_Java_byte_ordering_different())
226 // big-endian LP64
227 return (jint*)(slot_addr + 1) - 1;
228 else
229 return (jint*) slot_addr;
230 }
231 static jlong long_in_slot(intptr_t* slot_addr) {
232 if (sizeof(intptr_t) >= sizeof(jlong)) {
233 return *(jlong*) slot_addr;
234 } else if (!TaggedStackInterpreter) {
235 return Bytes::get_native_u8((address)slot_addr);
236 } else {
237 assert(sizeof(intptr_t) * 2 == sizeof(jlong), "ILP32");
238 // assemble the long in memory order (not arithmetic order)
239 union { jlong j; jint i[2]; } u;
240 u.i[0] = (jint) slot_addr[0*stackElementSize()];
241 u.i[1] = (jint) slot_addr[1*stackElementSize()];
242 return u.j;
243 }
244 }
245 static void set_long_in_slot(intptr_t* slot_addr, jlong value) {
246 if (sizeof(intptr_t) >= sizeof(jlong)) {
247 *(jlong*) slot_addr = value;
248 } else if (!TaggedStackInterpreter) {
249 Bytes::put_native_u8((address)slot_addr, value);
250 } else {
251 assert(sizeof(intptr_t) * 2 == sizeof(jlong), "ILP32");
252 // assemble the long in memory order (not arithmetic order)
253 union { jlong j; jint i[2]; } u;
254 u.j = value;
255 slot_addr[0*stackElementSize()] = (intptr_t) u.i[0];
256 slot_addr[1*stackElementSize()] = (intptr_t) u.i[1];
257 }
258 }
259 static void get_jvalue_in_slot(intptr_t* slot_addr, BasicType type, jvalue* value) {
260 switch (type) {
261 case T_BOOLEAN: value->z = *int_addr_in_slot(slot_addr); break;
262 case T_CHAR: value->c = *int_addr_in_slot(slot_addr); break;
263 case T_BYTE: value->b = *int_addr_in_slot(slot_addr); break;
264 case T_SHORT: value->s = *int_addr_in_slot(slot_addr); break;
265 case T_INT: value->i = *int_addr_in_slot(slot_addr); break;
266 case T_LONG: value->j = long_in_slot(slot_addr); break;
267 case T_FLOAT: value->f = *(jfloat*)int_addr_in_slot(slot_addr); break;
268 case T_DOUBLE: value->d = jdouble_cast(long_in_slot(slot_addr)); break;
269 case T_OBJECT: value->l = (jobject)*oop_addr_in_slot(slot_addr); break;
270 default: ShouldNotReachHere();
271 }
272 }
273 static void set_jvalue_in_slot(intptr_t* slot_addr, BasicType type, jvalue* value) {
274 switch (type) {
275 case T_BOOLEAN: *int_addr_in_slot(slot_addr) = (value->z != 0); break;
276 case T_CHAR: *int_addr_in_slot(slot_addr) = value->c; break;
277 case T_BYTE: *int_addr_in_slot(slot_addr) = value->b; break;
278 case T_SHORT: *int_addr_in_slot(slot_addr) = value->s; break;
279 case T_INT: *int_addr_in_slot(slot_addr) = value->i; break;
280 case T_LONG: set_long_in_slot(slot_addr, value->j); break;
281 case T_FLOAT: *(jfloat*)int_addr_in_slot(slot_addr) = value->f; break;
282 case T_DOUBLE: set_long_in_slot(slot_addr, jlong_cast(value->d)); break;
283 case T_OBJECT: *oop_addr_in_slot(slot_addr) = (oop) value->l; break;
284 default: ShouldNotReachHere();
285 }
286 }
220 }; 287 };
221 288
222 //------------------------------------------------------------------------------------------------------------------------ 289 //------------------------------------------------------------------------------------------------------------------------
223 // The interpreter generator. 290 // The interpreter generator.
224 291