src/cpu/x86/vm/assembler_x86.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File 6829192 Sdiff src/cpu/x86/vm

src/cpu/x86/vm/assembler_x86.cpp

Print this page
rev 1022 : 6829192: JSR 292 needs to support 64-bit x86
Summary: changes for method handles and invokedynamic
Reviewed-by: ?, ?


7630   movptr(rax, buffer.addr());
7631   push(rax);
7632   // call indirectly to solve generation ordering problem
7633   movptr(rax, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address()));
7634   call(rax);
7635 }
7636 
7637 
7638 RegisterOrConstant MacroAssembler::delayed_value_impl(intptr_t* delayed_value_addr,
7639                                                       Register tmp,
7640                                                       int offset) {
7641   intptr_t value = *delayed_value_addr;
7642   if (value != 0)
7643     return RegisterOrConstant(value + offset);
7644 
7645   // load indirectly to solve generation ordering problem
7646   movptr(tmp, ExternalAddress((address) delayed_value_addr));
7647 
7648 #ifdef ASSERT
7649   Label L;
7650   testl(tmp, tmp);
7651   jccb(Assembler::notZero, L);
7652   hlt();
7653   bind(L);
7654 #endif
7655 
7656   if (offset != 0)
7657     addptr(tmp, offset);
7658 
7659   return RegisterOrConstant(tmp);
7660 }
7661 
7662 
7663 // registers on entry:
7664 //  - rax ('check' register): required MethodType
7665 //  - rcx: method handle
7666 //  - rdx, rsi, or ?: killable temp
7667 void MacroAssembler::check_method_handle_type(Register mtype_reg, Register mh_reg,
7668                                               Register temp_reg,
7669                                               Label& wrong_method_type) {
7670   if (UseCompressedOops)  unimplemented();  // field accesses must decode




7630   movptr(rax, buffer.addr());
7631   push(rax);
7632   // call indirectly to solve generation ordering problem
7633   movptr(rax, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address()));
7634   call(rax);
7635 }
7636 
7637 
7638 RegisterOrConstant MacroAssembler::delayed_value_impl(intptr_t* delayed_value_addr,
7639                                                       Register tmp,
7640                                                       int offset) {
7641   intptr_t value = *delayed_value_addr;
7642   if (value != 0)
7643     return RegisterOrConstant(value + offset);
7644 
7645   // load indirectly to solve generation ordering problem
7646   movptr(tmp, ExternalAddress((address) delayed_value_addr));
7647 
7648 #ifdef ASSERT
7649   Label L;
7650   testptr(tmp, tmp);
7651   jccb(Assembler::notZero, L);
7652   hlt();
7653   bind(L);
7654 #endif
7655 
7656   if (offset != 0)
7657     addptr(tmp, offset);
7658 
7659   return RegisterOrConstant(tmp);
7660 }
7661 
7662 
7663 // registers on entry:
7664 //  - rax ('check' register): required MethodType
7665 //  - rcx: method handle
7666 //  - rdx, rsi, or ?: killable temp
7667 void MacroAssembler::check_method_handle_type(Register mtype_reg, Register mh_reg,
7668                                               Register temp_reg,
7669                                               Label& wrong_method_type) {
7670   if (UseCompressedOops)  unimplemented();  // field accesses must decode


src/cpu/x86/vm/assembler_x86.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File