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
|