comparison src/cpu/x86/vm/templateTable_x86_32.cpp @ 1681:126ea7725993

6953477: Increase portability and flexibility of building Hotspot Summary: A collection of portability improvements including shared code support for PPC, ARM platforms, software floating point, cross compilation support and improvements in error crash detail. Reviewed-by: phh, never, coleenp, dholmes
author bobv
date Tue, 03 Aug 2010 08:13:38 -0400
parents 136b78722a08
children d5d065957597
comparison
equal deleted inserted replaced
1680:a64438a2b7e8 1681:126ea7725993
3110 3110
3111 void TemplateTable::_new() { 3111 void TemplateTable::_new() {
3112 transition(vtos, atos); 3112 transition(vtos, atos);
3113 __ get_unsigned_2_byte_index_at_bcp(rdx, 1); 3113 __ get_unsigned_2_byte_index_at_bcp(rdx, 1);
3114 Label slow_case; 3114 Label slow_case;
3115 Label slow_case_no_pop;
3115 Label done; 3116 Label done;
3116 Label initialize_header; 3117 Label initialize_header;
3117 Label initialize_object; // including clearing the fields 3118 Label initialize_object; // including clearing the fields
3118 Label allocate_shared; 3119 Label allocate_shared;
3119 3120
3120 __ get_cpool_and_tags(rcx, rax); 3121 __ get_cpool_and_tags(rcx, rax);
3122
3123 // Make sure the class we're about to instantiate has been resolved.
3124 // This is done before loading instanceKlass to be consistent with the order
3125 // how Constant Pool is updated (see constantPoolOopDesc::klass_at_put)
3126 const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
3127 __ cmpb(Address(rax, rdx, Address::times_1, tags_offset), JVM_CONSTANT_Class);
3128 __ jcc(Assembler::notEqual, slow_case_no_pop);
3129
3121 // get instanceKlass 3130 // get instanceKlass
3122 __ movptr(rcx, Address(rcx, rdx, Address::times_ptr, sizeof(constantPoolOopDesc))); 3131 __ movptr(rcx, Address(rcx, rdx, Address::times_ptr, sizeof(constantPoolOopDesc)));
3123 __ push(rcx); // save the contexts of klass for initializing the header 3132 __ push(rcx); // save the contexts of klass for initializing the header
3124
3125 // make sure the class we're about to instantiate has been resolved.
3126 // Note: slow_case does a pop of stack, which is why we loaded class/pushed above
3127 const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
3128 __ cmpb(Address(rax, rdx, Address::times_1, tags_offset), JVM_CONSTANT_Class);
3129 __ jcc(Assembler::notEqual, slow_case);
3130 3133
3131 // make sure klass is initialized & doesn't have finalizer 3134 // make sure klass is initialized & doesn't have finalizer
3132 // make sure klass is fully initialized 3135 // make sure klass is fully initialized
3133 __ cmpl(Address(rcx, instanceKlass::init_state_offset_in_bytes() + sizeof(oopDesc)), instanceKlass::fully_initialized); 3136 __ cmpl(Address(rcx, instanceKlass::init_state_offset_in_bytes() + sizeof(oopDesc)), instanceKlass::fully_initialized);
3134 __ jcc(Assembler::notEqual, slow_case); 3137 __ jcc(Assembler::notEqual, slow_case);
3253 } 3256 }
3254 3257
3255 // slow case 3258 // slow case
3256 __ bind(slow_case); 3259 __ bind(slow_case);
3257 __ pop(rcx); // restore stack pointer to what it was when we came in. 3260 __ pop(rcx); // restore stack pointer to what it was when we came in.
3261 __ bind(slow_case_no_pop);
3258 __ get_constant_pool(rax); 3262 __ get_constant_pool(rax);
3259 __ get_unsigned_2_byte_index_at_bcp(rdx, 1); 3263 __ get_unsigned_2_byte_index_at_bcp(rdx, 1);
3260 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), rax, rdx); 3264 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), rax, rdx);
3261 3265
3262 // continue 3266 // continue