411 |
411 |
412 resolve_cache_and_index(f1_oop, rax, cache, index, wide ? sizeof(u2) : sizeof(u1)); |
412 resolve_cache_and_index(f1_oop, rax, cache, index, wide ? sizeof(u2) : sizeof(u1)); |
413 if (VerifyOops) { |
413 if (VerifyOops) { |
414 __ verify_oop(rax); |
414 __ verify_oop(rax); |
415 } |
415 } |
|
416 |
|
417 Label L_done, L_throw_exception; |
|
418 const Register con_klass_temp = rcx; // same as cache |
|
419 const Register array_klass_temp = rdx; // same as index |
|
420 __ movptr(con_klass_temp, Address(rax, oopDesc::klass_offset_in_bytes())); |
|
421 __ lea(array_klass_temp, ExternalAddress((address)Universe::systemObjArrayKlassObj_addr())); |
|
422 __ cmpptr(con_klass_temp, Address(array_klass_temp, 0)); |
|
423 __ jcc(Assembler::notEqual, L_done); |
|
424 __ cmpl(Address(rax, arrayOopDesc::length_offset_in_bytes()), 0); |
|
425 __ jcc(Assembler::notEqual, L_throw_exception); |
|
426 __ xorptr(rax, rax); |
|
427 __ jmp(L_done); |
|
428 |
|
429 // Load the exception from the system-array which wraps it: |
|
430 __ bind(L_throw_exception); |
|
431 __ movptr(rax, Address(rax, arrayOopDesc::base_offset_in_bytes(T_OBJECT))); |
|
432 __ jump(ExternalAddress(Interpreter::throw_exception_entry())); |
|
433 |
|
434 __ bind(L_done); |
416 } |
435 } |
417 |
436 |
418 void TemplateTable::ldc2_w() { |
437 void TemplateTable::ldc2_w() { |
419 transition(vtos, vtos); |
438 transition(vtos, vtos); |
420 Label Long, Done; |
439 Label Long, Done; |