< 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 >