41 #include "opto/mulnode.hpp"
42 #include "opto/opaquenode.hpp"
43 #include "opto/parse.hpp"
44 #include "opto/runtime.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 dec_sp(2); // Pop array and index
59 const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(elem_type);
60 Node* ld = make_load(control(), adr, elem, elem_type, adr_type, MemNode::unordered);
61 if (UseLoadBarrier && elem_type == T_OBJECT) {
62 ld = load_barrier(ld, adr);
63 }
64 push(ld);
65 }
66
67
68 //--------------------------------array_store----------------------------------
69 void Parse::array_store(BasicType elem_type) {
70 const Type* elem = Type::TOP;
71 Node* adr = array_addressing(elem_type, 1, &elem);
72 if (stopped()) return; // guaranteed null or range check
73 Node* val = pop();
74 dec_sp(2); // Pop array and index
75 const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(elem_type);
76 if (elem == TypeInt::BOOL) {
77 elem_type = T_BOOLEAN;
78 }
79 store_to_memory(control(), adr, val, elem_type, adr_type, StoreNode::release_if_reference(elem_type));
80 }
81
|
41 #include "opto/mulnode.hpp"
42 #include "opto/opaquenode.hpp"
43 #include "opto/parse.hpp"
44 #include "opto/runtime.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 dec_sp(2); // Pop array and index
59 const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(elem_type);
60 Node* ld = make_load(control(), adr, elem, elem_type, adr_type, MemNode::unordered);
61 if (UseZGC && elem_type == T_OBJECT) {
62 ld = load_barrier(ld, adr);
63 }
64 push(ld);
65 }
66
67
68 //--------------------------------array_store----------------------------------
69 void Parse::array_store(BasicType elem_type) {
70 const Type* elem = Type::TOP;
71 Node* adr = array_addressing(elem_type, 1, &elem);
72 if (stopped()) return; // guaranteed null or range check
73 Node* val = pop();
74 dec_sp(2); // Pop array and index
75 const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(elem_type);
76 if (elem == TypeInt::BOOL) {
77 elem_type = T_BOOLEAN;
78 }
79 store_to_memory(control(), adr, val, elem_type, adr_type, StoreNode::release_if_reference(elem_type));
80 }
81
|