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