< prev index next >
src/share/vm/opto/parse2.cpp
Print this page
*** 53,63 ****
//---------------------------------array_load----------------------------------
void Parse::array_load(BasicType elem_type) {
const Type* elem = Type::TOP;
Node* adr = array_addressing(elem_type, 0, &elem);
if (stopped()) return; // guaranteed null or range check
! dec_sp(2); // Pop array and index
const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(elem_type);
Node* ld = make_load(control(), adr, elem, elem_type, adr_type, MemNode::unordered);
push(ld);
}
--- 53,72 ----
//---------------------------------array_load----------------------------------
void Parse::array_load(BasicType elem_type) {
const Type* elem = Type::TOP;
Node* adr = array_addressing(elem_type, 0, &elem);
if (stopped()) return; // guaranteed null or range check
! Node* idx = pop(); // Get from stack without popping
! Node* ary = pop(); // in case of exception
! //dec_sp(2); // Pop array and index
! const TypeAryPtr* arytype = _gvn.type(ary)->is_aryptr();
! if (arytype->klass()->is_value_array_klass()) {
! ciValueArrayKlass* vak = arytype->klass()->as_value_array_klass();
! Node* vt = ValueTypeNode::make(gvn(), vak->element_klass()->as_value_klass(), map()->memory(), ary, adr, vak);
! push(vt);
! return;
! }
const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(elem_type);
Node* ld = make_load(control(), adr, elem, elem_type, adr_type, MemNode::unordered);
push(ld);
}
*** 1705,1714 ****
--- 1714,1724 ----
case Bytecodes::_baload: array_load(T_BYTE); break;
case Bytecodes::_caload: array_load(T_CHAR); break;
case Bytecodes::_iaload: array_load(T_INT); break;
case Bytecodes::_saload: array_load(T_SHORT); break;
case Bytecodes::_faload: array_load(T_FLOAT); break;
+ case Bytecodes::_vaload: array_load(T_VALUETYPE); break;
case Bytecodes::_aaload: array_load(T_OBJECT); break;
case Bytecodes::_laload: {
a = array_addressing(T_LONG, 0);
if (stopped()) return; // guaranteed null or range check
dec_sp(2); // Pop array and index
*** 1725,1734 ****
--- 1735,1768 ----
case Bytecodes::_bastore: array_store(T_BYTE); break;
case Bytecodes::_castore: array_store(T_CHAR); break;
case Bytecodes::_iastore: array_store(T_INT); break;
case Bytecodes::_sastore: array_store(T_SHORT); break;
case Bytecodes::_fastore: array_store(T_FLOAT); break;
+ case Bytecodes::_vastore: {
+ d = array_addressing(T_OBJECT, 1);
+ if (stopped()) return; // guaranteed null or range check
+ // TODO fix this
+ // array_store_check();
+ c = pop(); // Oop to store
+ b = pop(); // index (already used)
+ a = pop(); // the array itself
+ const TypeAryPtr* arytype = _gvn.type(a)->is_aryptr();
+ const TypeOopPtr* elemtype = arytype->elem()->make_oopptr();
+ const TypeAryPtr* adr_type = TypeAryPtr::OOPS;
+
+ if (elemtype->isa_valuetypeptr()) {
+ if (elemtype->isa_valuetypeptr()->value_type()->value_klass()->flatten_array()) {
+ c->as_ValueType()->store_values(this, a, d, arytype->klass()->as_value_array_klass());
+ break;
+ }
+ }
+
+ Node* oop = c->as_ValueType()->store_to_memory(this);
+ Node* store = store_oop_to_array(control(), a, d, adr_type, oop, elemtype, T_OBJECT,
+ StoreNode::release_if_reference(T_OBJECT));
+ break;
+ }
case Bytecodes::_aastore: {
d = array_addressing(T_OBJECT, 1);
if (stopped()) return; // guaranteed null or range check
array_store_check();
c = pop(); // Oop to store
*** 2351,2361 ****
break;
case Bytecodes::_instanceof:
do_instanceof();
break;
case Bytecodes::_anewarray:
! do_anewarray();
break;
case Bytecodes::_newarray:
do_newarray((BasicType)iter().get_index());
break;
case Bytecodes::_multianewarray:
--- 2385,2395 ----
break;
case Bytecodes::_instanceof:
do_instanceof();
break;
case Bytecodes::_anewarray:
! do_newarray();
break;
case Bytecodes::_newarray:
do_newarray((BasicType)iter().get_index());
break;
case Bytecodes::_multianewarray:
< prev index next >