< prev index next >

src/share/vm/opto/parse2.cpp

Print this page




  44 #include "opto/valuetypenode.hpp"
  45 #include "runtime/deoptimization.hpp"
  46 #include "runtime/sharedRuntime.hpp"
  47 
  48 #ifndef PRODUCT
  49 extern int explicit_null_checks_inserted,
  50            explicit_null_checks_elided;
  51 #endif
  52 
  53 //---------------------------------array_load----------------------------------
  54 void Parse::array_load(BasicType elem_type) {
  55   const Type* elem = Type::TOP;
  56   Node* adr = array_addressing(elem_type, 0, &elem);
  57   if (stopped())  return;     // guaranteed null or range check
  58   Node* idx   = pop();   // Get from stack without popping
  59   Node* ary   = pop();   // in case of exception
  60   //dec_sp(2);                  // Pop array and index
  61   const TypeAryPtr* arytype = _gvn.type(ary)->is_aryptr();
  62   if (arytype->klass()->is_value_array_klass()) {
  63     ciValueArrayKlass* vak = arytype->klass()->as_value_array_klass();
  64     Node* vt = ValueTypeNode::make(gvn(), vak->element_klass()->as_value_klass(), map()->memory(), ary, adr, vak);
  65     push(vt);
  66     return;
  67   }
  68   const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(elem_type);
  69   Node* ld = make_load(control(), adr, elem, elem_type, adr_type, MemNode::unordered);
  70   push(ld);
  71 }
  72 
  73 
  74 //--------------------------------array_store----------------------------------
  75 void Parse::array_store(BasicType elem_type) {
  76   Node* adr = array_addressing(elem_type, 1);
  77   if (stopped())  return;     // guaranteed null or range check
  78   Node* val = pop();
  79   dec_sp(2);                  // Pop array and index
  80   const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(elem_type);
  81   store_to_memory(control(), adr, val, elem_type, adr_type, StoreNode::release_if_reference(elem_type));
  82 }
  83 
  84 


1732     push_pair(make_load(control(), a, Type::DOUBLE, T_DOUBLE, TypeAryPtr::DOUBLES, MemNode::unordered));
1733     break;
1734   }
1735   case Bytecodes::_bastore: array_store(T_BYTE);  break;
1736   case Bytecodes::_castore: array_store(T_CHAR);  break;
1737   case Bytecodes::_iastore: array_store(T_INT);   break;
1738   case Bytecodes::_sastore: array_store(T_SHORT); break;
1739   case Bytecodes::_fastore: array_store(T_FLOAT); break;
1740   case Bytecodes::_vastore: {
1741     d = array_addressing(T_OBJECT, 1);
1742     if (stopped())  return;     // guaranteed null or range check
1743     // TODO fix this
1744    // array_store_check();
1745     c = pop();                  // Oop to store
1746     b = pop();                  // index (already used)
1747     a = pop();                  // the array itself
1748     const TypeAryPtr* arytype = _gvn.type(a)->is_aryptr();
1749     const Type* elemtype = arytype->elem();
1750 
1751     if (elemtype->isa_valuetype()) {
1752       c->as_ValueType()->store_values(this, a, d, arytype->klass()->as_value_array_klass());
1753       break;
1754     }
1755 
1756     const TypeAryPtr* adr_type = TypeAryPtr::OOPS;
1757     Node* oop = c->as_ValueType()->store_to_memory(this);
1758     Node* store = store_oop_to_array(control(), a, d, adr_type, oop, elemtype->make_oopptr(), T_OBJECT,
1759                                      StoreNode::release_if_reference(T_OBJECT));
1760     break;
1761   }
1762   case Bytecodes::_aastore: {
1763     d = array_addressing(T_OBJECT, 1);
1764     if (stopped())  return;     // guaranteed null or range check
1765     array_store_check();
1766     c = pop();                  // Oop to store
1767     b = pop();                  // index (already used)
1768     a = pop();                  // the array itself
1769     const TypeOopPtr* elemtype  = _gvn.type(a)->is_aryptr()->elem()->make_oopptr();
1770     const TypeAryPtr* adr_type = TypeAryPtr::OOPS;
1771     Node* store = store_oop_to_array(control(), a, d, adr_type, c, elemtype, T_OBJECT,
1772                                      StoreNode::release_if_reference(T_OBJECT));




  44 #include "opto/valuetypenode.hpp"
  45 #include "runtime/deoptimization.hpp"
  46 #include "runtime/sharedRuntime.hpp"
  47 
  48 #ifndef PRODUCT
  49 extern int explicit_null_checks_inserted,
  50            explicit_null_checks_elided;
  51 #endif
  52 
  53 //---------------------------------array_load----------------------------------
  54 void Parse::array_load(BasicType elem_type) {
  55   const Type* elem = Type::TOP;
  56   Node* adr = array_addressing(elem_type, 0, &elem);
  57   if (stopped())  return;     // guaranteed null or range check
  58   Node* idx   = pop();   // Get from stack without popping
  59   Node* ary   = pop();   // in case of exception
  60   //dec_sp(2);                  // Pop array and index
  61   const TypeAryPtr* arytype = _gvn.type(ary)->is_aryptr();
  62   if (arytype->klass()->is_value_array_klass()) {
  63     ciValueArrayKlass* vak = arytype->klass()->as_value_array_klass();
  64     Node* vt = ValueTypeNode::make(gvn(), vak->element_klass()->as_value_klass(), map()->memory(), ary, adr);
  65     push(vt);
  66     return;
  67   }
  68   const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(elem_type);
  69   Node* ld = make_load(control(), adr, elem, elem_type, adr_type, MemNode::unordered);
  70   push(ld);
  71 }
  72 
  73 
  74 //--------------------------------array_store----------------------------------
  75 void Parse::array_store(BasicType elem_type) {
  76   Node* adr = array_addressing(elem_type, 1);
  77   if (stopped())  return;     // guaranteed null or range check
  78   Node* val = pop();
  79   dec_sp(2);                  // Pop array and index
  80   const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(elem_type);
  81   store_to_memory(control(), adr, val, elem_type, adr_type, StoreNode::release_if_reference(elem_type));
  82 }
  83 
  84 


1732     push_pair(make_load(control(), a, Type::DOUBLE, T_DOUBLE, TypeAryPtr::DOUBLES, MemNode::unordered));
1733     break;
1734   }
1735   case Bytecodes::_bastore: array_store(T_BYTE);  break;
1736   case Bytecodes::_castore: array_store(T_CHAR);  break;
1737   case Bytecodes::_iastore: array_store(T_INT);   break;
1738   case Bytecodes::_sastore: array_store(T_SHORT); break;
1739   case Bytecodes::_fastore: array_store(T_FLOAT); break;
1740   case Bytecodes::_vastore: {
1741     d = array_addressing(T_OBJECT, 1);
1742     if (stopped())  return;     // guaranteed null or range check
1743     // TODO fix this
1744    // array_store_check();
1745     c = pop();                  // Oop to store
1746     b = pop();                  // index (already used)
1747     a = pop();                  // the array itself
1748     const TypeAryPtr* arytype = _gvn.type(a)->is_aryptr();
1749     const Type* elemtype = arytype->elem();
1750 
1751     if (elemtype->isa_valuetype()) {
1752       c->as_ValueType()->store(this, a, d);
1753       break;
1754     }
1755 
1756     const TypeAryPtr* adr_type = TypeAryPtr::OOPS;
1757     Node* oop = c->as_ValueType()->store_to_memory(this);
1758     Node* store = store_oop_to_array(control(), a, d, adr_type, oop, elemtype->make_oopptr(), T_OBJECT,
1759                                      StoreNode::release_if_reference(T_OBJECT));
1760     break;
1761   }
1762   case Bytecodes::_aastore: {
1763     d = array_addressing(T_OBJECT, 1);
1764     if (stopped())  return;     // guaranteed null or range check
1765     array_store_check();
1766     c = pop();                  // Oop to store
1767     b = pop();                  // index (already used)
1768     a = pop();                  // the array itself
1769     const TypeOopPtr* elemtype  = _gvn.type(a)->is_aryptr()->elem()->make_oopptr();
1770     const TypeAryPtr* adr_type = TypeAryPtr::OOPS;
1771     Node* store = store_oop_to_array(control(), a, d, adr_type, c, elemtype, T_OBJECT,
1772                                      StoreNode::release_if_reference(T_OBJECT));


< prev index next >