< prev index next >

src/share/vm/opto/parse2.cpp

Print this page




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


1744   case Bytecodes::_castore: array_store(T_CHAR);  break;
1745   case Bytecodes::_iastore: array_store(T_INT);   break;
1746   case Bytecodes::_sastore: array_store(T_SHORT); break;
1747   case Bytecodes::_fastore: array_store(T_FLOAT); break;
1748   case Bytecodes::_vastore: {
1749     d = array_addressing(T_OBJECT, 1);
1750     if (stopped())  return;     // guaranteed null or range check
1751     array_store_check(true);
1752     c = pop();                  // Oop to store
1753     b = pop();                  // index (already used)
1754     a = pop();                  // the array itself
1755     const TypeAryPtr* arytype = _gvn.type(a)->is_aryptr();
1756     const Type* elemtype = arytype->elem();
1757 
1758     if (elemtype->isa_valuetype()) {
1759       c->as_ValueType()->store_flattened(this, a, d);
1760       break;
1761     }
1762 
1763     const TypeAryPtr* adr_type = TypeAryPtr::OOPS;
1764     Node* oop = c->as_ValueType()->allocate(this);
1765     Node* store = store_oop_to_array(control(), a, d, adr_type, oop, elemtype->make_oopptr(), T_OBJECT,
1766                                      StoreNode::release_if_reference(T_OBJECT));
1767     break;
1768   }
1769   case Bytecodes::_aastore: {
1770     d = array_addressing(T_OBJECT, 1);
1771     if (stopped())  return;     // guaranteed null or range check
1772     array_store_check();
1773     c = pop();                  // Oop to store
1774     b = pop();                  // index (already used)
1775     a = pop();                  // the array itself
1776     const TypeOopPtr* elemtype  = _gvn.type(a)->is_aryptr()->elem()->make_oopptr();
1777     const TypeAryPtr* adr_type = TypeAryPtr::OOPS;
1778     Node* store = store_oop_to_array(control(), a, d, adr_type, c, elemtype, T_OBJECT,
1779                                      StoreNode::release_if_reference(T_OBJECT));
1780     break;
1781   }
1782   case Bytecodes::_lastore: {
1783     a = array_addressing(T_LONG, 2);
1784     if (stopped())  return;     // guaranteed null or range check




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


1744   case Bytecodes::_castore: array_store(T_CHAR);  break;
1745   case Bytecodes::_iastore: array_store(T_INT);   break;
1746   case Bytecodes::_sastore: array_store(T_SHORT); break;
1747   case Bytecodes::_fastore: array_store(T_FLOAT); break;
1748   case Bytecodes::_vastore: {
1749     d = array_addressing(T_OBJECT, 1);
1750     if (stopped())  return;     // guaranteed null or range check
1751     array_store_check(true);
1752     c = pop();                  // Oop to store
1753     b = pop();                  // index (already used)
1754     a = pop();                  // the array itself
1755     const TypeAryPtr* arytype = _gvn.type(a)->is_aryptr();
1756     const Type* elemtype = arytype->elem();
1757 
1758     if (elemtype->isa_valuetype()) {
1759       c->as_ValueType()->store_flattened(this, a, d);
1760       break;
1761     }
1762 
1763     const TypeAryPtr* adr_type = TypeAryPtr::OOPS;
1764     Node* oop = c->as_ValueType()->allocate(this)->get_oop();
1765     Node* store = store_oop_to_array(control(), a, d, adr_type, oop, elemtype->make_oopptr(), T_OBJECT,
1766                                      StoreNode::release_if_reference(T_OBJECT));
1767     break;
1768   }
1769   case Bytecodes::_aastore: {
1770     d = array_addressing(T_OBJECT, 1);
1771     if (stopped())  return;     // guaranteed null or range check
1772     array_store_check();
1773     c = pop();                  // Oop to store
1774     b = pop();                  // index (already used)
1775     a = pop();                  // the array itself
1776     const TypeOopPtr* elemtype  = _gvn.type(a)->is_aryptr()->elem()->make_oopptr();
1777     const TypeAryPtr* adr_type = TypeAryPtr::OOPS;
1778     Node* store = store_oop_to_array(control(), a, d, adr_type, c, elemtype, T_OBJECT,
1779                                      StoreNode::release_if_reference(T_OBJECT));
1780     break;
1781   }
1782   case Bytecodes::_lastore: {
1783     a = array_addressing(T_LONG, 2);
1784     if (stopped())  return;     // guaranteed null or range check


< prev index next >