< prev index next >

src/share/vm/opto/parse2.cpp

Print this page

        

@@ -53,11 +53,20 @@
 //---------------------------------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
+  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,10 +1714,11 @@
   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,10 +1735,34 @@
   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,11 +2385,11 @@
     break;
   case Bytecodes::_instanceof:
     do_instanceof();
     break;
   case Bytecodes::_anewarray:
-    do_anewarray();
+    do_newarray();
     break;
   case Bytecodes::_newarray:
     do_newarray((BasicType)iter().get_index());
     break;
   case Bytecodes::_multianewarray:
< prev index next >