changeset 14621 | fd9265ab0f67 |
parent 14132 | 3c1437abcefd |
child 14627 | e377574462e9 |
14620:45167d2bc15a | 14621:fd9265ab0f67 |
---|---|
65 |
65 |
66 |
66 |
67 // Local helper class for LibraryIntrinsic: |
67 // Local helper class for LibraryIntrinsic: |
68 class LibraryCallKit : public GraphKit { |
68 class LibraryCallKit : public GraphKit { |
69 private: |
69 private: |
70 LibraryIntrinsic* _intrinsic; // the library intrinsic being called |
70 LibraryIntrinsic* _intrinsic; // the library intrinsic being called |
71 Node* _result; // the result node, if any |
|
72 int _reexecute_sp; // the stack pointer when bytecode needs to be reexecuted |
|
71 |
73 |
72 const TypeOopPtr* sharpen_unsafe_type(Compile::AliasType* alias_type, const TypePtr *adr_type, bool is_native_ptr = false); |
74 const TypeOopPtr* sharpen_unsafe_type(Compile::AliasType* alias_type, const TypePtr *adr_type, bool is_native_ptr = false); |
73 |
75 |
74 public: |
76 public: |
75 LibraryCallKit(JVMState* caller, LibraryIntrinsic* intrinsic) |
77 LibraryCallKit(JVMState* jvms, LibraryIntrinsic* intrinsic) |
76 : GraphKit(caller), |
78 : GraphKit(jvms), |
77 _intrinsic(intrinsic) |
79 _intrinsic(intrinsic), |
80 _result(NULL) |
|
78 { |
81 { |
79 } |
82 // Find out how many arguments the interpreter needs when deoptimizing |
83 // and save the stack pointer value so it can used by uncommon_trap. |
|
84 // We find the argument count by looking at the declared signature. |
|
85 bool ignored_will_link; |
|
86 ciSignature* declared_signature = NULL; |
|
87 ciMethod* ignored_callee = caller()->get_method_at_bci(bci(), ignored_will_link, &declared_signature); |
|
88 const int nargs = declared_signature->arg_size_for_bc(caller()->java_code_at_bci(bci())); |
|
89 _reexecute_sp = sp() + nargs; // "push" arguments back on stack |
|
90 } |
|
91 |
|
92 virtual LibraryCallKit* is_LibraryCallKit() const { return (LibraryCallKit*)this; } |
|
80 |
93 |
81 ciMethod* caller() const { return jvms()->method(); } |
94 ciMethod* caller() const { return jvms()->method(); } |
82 int bci() const { return jvms()->bci(); } |
95 int bci() const { return jvms()->bci(); } |
83 LibraryIntrinsic* intrinsic() const { return _intrinsic; } |
96 LibraryIntrinsic* intrinsic() const { return _intrinsic; } |
84 vmIntrinsics::ID intrinsic_id() const { return _intrinsic->intrinsic_id(); } |
97 vmIntrinsics::ID intrinsic_id() const { return _intrinsic->intrinsic_id(); } |
85 ciMethod* callee() const { return _intrinsic->method(); } |
98 ciMethod* callee() const { return _intrinsic->method(); } |
86 ciSignature* signature() const { return callee()->signature(); } |
|
87 int arg_size() const { return callee()->arg_size(); } |
|
88 |
99 |
89 bool try_to_inline(); |
100 bool try_to_inline(); |
90 Node* try_to_predicate(); |
101 Node* try_to_predicate(); |
91 |
102 |
103 void push_result() { |
|
104 // Push the result onto the stack. |
|
105 if (!stopped() && result() != NULL) { |
|
106 BasicType bt = result()->bottom_type()->basic_type(); |
|
107 push_node(bt, result()); |
|
108 } |
|
109 } |
|
110 |
|
111 private: |
|
112 void fatal_unexpected_iid(vmIntrinsics::ID iid) { |
|
113 fatal(err_msg_res("unexpected intrinsic %d: %s", iid, vmIntrinsics::name_at(iid))); |
|
114 } |
|
115 |
|
116 void set_result(Node* n) { assert(_result == NULL, "only set once"); _result = n; } |
|
117 void set_result(RegionNode* region, PhiNode* value); |
|
118 Node* result() { return _result; } |
|
119 |
|
120 virtual int reexecute_sp() { return _reexecute_sp; } |
|
121 |
|
92 // Helper functions to inline natives |
122 // Helper functions to inline natives |
93 void push_result(RegionNode* region, PhiNode* value); |
|
94 Node* generate_guard(Node* test, RegionNode* region, float true_prob); |
123 Node* generate_guard(Node* test, RegionNode* region, float true_prob); |
95 Node* generate_slow_guard(Node* test, RegionNode* region); |
124 Node* generate_slow_guard(Node* test, RegionNode* region); |
96 Node* generate_fair_guard(Node* test, RegionNode* region); |
125 Node* generate_fair_guard(Node* test, RegionNode* region); |
97 Node* generate_negative_guard(Node* index, RegionNode* region, |
126 Node* generate_negative_guard(Node* index, RegionNode* region, |
98 // resulting CastII of index: |
127 // resulting CastII of index: |
106 Node* generate_current_thread(Node* &tls_output); |
135 Node* generate_current_thread(Node* &tls_output); |
107 address basictype2arraycopy(BasicType t, Node *src_offset, Node *dest_offset, |
136 address basictype2arraycopy(BasicType t, Node *src_offset, Node *dest_offset, |
108 bool disjoint_bases, const char* &name, bool dest_uninitialized); |
137 bool disjoint_bases, const char* &name, bool dest_uninitialized); |
109 Node* load_mirror_from_klass(Node* klass); |
138 Node* load_mirror_from_klass(Node* klass); |
110 Node* load_klass_from_mirror_common(Node* mirror, bool never_see_null, |
139 Node* load_klass_from_mirror_common(Node* mirror, bool never_see_null, |
111 int nargs, |
|
112 RegionNode* region, int null_path, |
140 RegionNode* region, int null_path, |
113 int offset); |
141 int offset); |
114 Node* load_klass_from_mirror(Node* mirror, bool never_see_null, int nargs, |
142 Node* load_klass_from_mirror(Node* mirror, bool never_see_null, |
115 RegionNode* region, int null_path) { |
143 RegionNode* region, int null_path) { |
116 int offset = java_lang_Class::klass_offset_in_bytes(); |
144 int offset = java_lang_Class::klass_offset_in_bytes(); |
117 return load_klass_from_mirror_common(mirror, never_see_null, nargs, |
145 return load_klass_from_mirror_common(mirror, never_see_null, |
118 region, null_path, |
146 region, null_path, |
119 offset); |
147 offset); |
120 } |
148 } |
121 Node* load_array_klass_from_mirror(Node* mirror, bool never_see_null, |
149 Node* load_array_klass_from_mirror(Node* mirror, bool never_see_null, |
122 int nargs, |
|
123 RegionNode* region, int null_path) { |
150 RegionNode* region, int null_path) { |
124 int offset = java_lang_Class::array_klass_offset_in_bytes(); |
151 int offset = java_lang_Class::array_klass_offset_in_bytes(); |
125 return load_klass_from_mirror_common(mirror, never_see_null, nargs, |
152 return load_klass_from_mirror_common(mirror, never_see_null, |
126 region, null_path, |
153 region, null_path, |
127 offset); |
154 offset); |
128 } |
155 } |
129 Node* generate_access_flags_guard(Node* kls, |
156 Node* generate_access_flags_guard(Node* kls, |
130 int modifier_mask, int modifier_bits, |
157 int modifier_mask, int modifier_bits, |
159 Node* make_string_method_node(int opcode, Node* str1, Node* str2); |
186 Node* make_string_method_node(int opcode, Node* str1, Node* str2); |
160 bool inline_string_compareTo(); |
187 bool inline_string_compareTo(); |
161 bool inline_string_indexOf(); |
188 bool inline_string_indexOf(); |
162 Node* string_indexOf(Node* string_object, ciTypeArray* target_array, jint offset, jint cache_i, jint md2_i); |
189 Node* string_indexOf(Node* string_object, ciTypeArray* target_array, jint offset, jint cache_i, jint md2_i); |
163 bool inline_string_equals(); |
190 bool inline_string_equals(); |
164 Node* pop_math_arg(); |
191 Node* round_double_node(Node* n); |
165 bool runtime_math(const TypeFunc* call_type, address funcAddr, const char* funcName); |
192 bool runtime_math(const TypeFunc* call_type, address funcAddr, const char* funcName); |
166 bool inline_math_native(vmIntrinsics::ID id); |
193 bool inline_math_native(vmIntrinsics::ID id); |
167 bool inline_trig(vmIntrinsics::ID id); |
194 bool inline_trig(vmIntrinsics::ID id); |
168 bool inline_trans(vmIntrinsics::ID id); |
195 bool inline_math(vmIntrinsics::ID id); |
169 bool inline_abs(vmIntrinsics::ID id); |
196 bool inline_exp(); |
170 bool inline_sqrt(vmIntrinsics::ID id); |
197 bool inline_pow(); |
171 void finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName); |
198 void finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName); |
172 bool inline_pow(vmIntrinsics::ID id); |
|
173 bool inline_exp(vmIntrinsics::ID id); |
|
174 bool inline_min_max(vmIntrinsics::ID id); |
199 bool inline_min_max(vmIntrinsics::ID id); |
175 Node* generate_min_max(vmIntrinsics::ID id, Node* x, Node* y); |
200 Node* generate_min_max(vmIntrinsics::ID id, Node* x, Node* y); |
176 // This returns Type::AnyPtr, RawPtr, or OopPtr. |
201 // This returns Type::AnyPtr, RawPtr, or OopPtr. |
177 int classify_unsafe_addr(Node* &base, Node* &offset); |
202 int classify_unsafe_addr(Node* &base, Node* &offset); |
178 Node* make_unsafe_address(Node* base, Node* offset); |
203 Node* make_unsafe_address(Node* base, Node* offset); |
179 // Helper for inline_unsafe_access. |
204 // Helper for inline_unsafe_access. |
180 // Generates the guards that check whether the result of |
205 // Generates the guards that check whether the result of |
181 // Unsafe.getObject should be recorded in an SATB log buffer. |
206 // Unsafe.getObject should be recorded in an SATB log buffer. |
182 void insert_pre_barrier(Node* base_oop, Node* offset, Node* pre_val, int nargs, bool need_mem_bar); |
207 void insert_pre_barrier(Node* base_oop, Node* offset, Node* pre_val, bool need_mem_bar); |
183 bool inline_unsafe_access(bool is_native_ptr, bool is_store, BasicType type, bool is_volatile); |
208 bool inline_unsafe_access(bool is_native_ptr, bool is_store, BasicType type, bool is_volatile); |
184 bool inline_unsafe_prefetch(bool is_native_ptr, bool is_store, bool is_static); |
209 bool inline_unsafe_prefetch(bool is_native_ptr, bool is_store, bool is_static); |
185 bool inline_unsafe_allocate(); |
210 bool inline_unsafe_allocate(); |
186 bool inline_unsafe_copyMemory(); |
211 bool inline_unsafe_copyMemory(); |
187 bool inline_native_currentThread(); |
212 bool inline_native_currentThread(); |
251 Node* copy_length, bool dest_uninitialized); |
276 Node* copy_length, bool dest_uninitialized); |
252 typedef enum { LS_xadd, LS_xchg, LS_cmpxchg } LoadStoreKind; |
277 typedef enum { LS_xadd, LS_xchg, LS_cmpxchg } LoadStoreKind; |
253 bool inline_unsafe_load_store(BasicType type, LoadStoreKind kind); |
278 bool inline_unsafe_load_store(BasicType type, LoadStoreKind kind); |
254 bool inline_unsafe_ordered_store(BasicType type); |
279 bool inline_unsafe_ordered_store(BasicType type); |
255 bool inline_fp_conversions(vmIntrinsics::ID id); |
280 bool inline_fp_conversions(vmIntrinsics::ID id); |
256 bool inline_numberOfLeadingZeros(vmIntrinsics::ID id); |
281 bool inline_number_methods(vmIntrinsics::ID id); |
257 bool inline_numberOfTrailingZeros(vmIntrinsics::ID id); |
|
258 bool inline_bitCount(vmIntrinsics::ID id); |
|
259 bool inline_reverseBytes(vmIntrinsics::ID id); |
|
260 |
|
261 bool inline_reference_get(); |
282 bool inline_reference_get(); |
262 bool inline_aescrypt_Block(vmIntrinsics::ID id); |
283 bool inline_aescrypt_Block(vmIntrinsics::ID id); |
263 bool inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id); |
284 bool inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id); |
264 Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting); |
285 Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting); |
265 Node* get_key_start_from_aescrypt_object(Node* aescrypt_object); |
286 Node* get_key_start_from_aescrypt_object(Node* aescrypt_object); |
319 bool is_predicted = false; |
340 bool is_predicted = false; |
320 |
341 |
321 switch (id) { |
342 switch (id) { |
322 case vmIntrinsics::_compareTo: |
343 case vmIntrinsics::_compareTo: |
323 if (!SpecialStringCompareTo) return NULL; |
344 if (!SpecialStringCompareTo) return NULL; |
345 if (!Matcher::match_rule_supported(Op_StrComp)) return NULL; |
|
324 break; |
346 break; |
325 case vmIntrinsics::_indexOf: |
347 case vmIntrinsics::_indexOf: |
326 if (!SpecialStringIndexOf) return NULL; |
348 if (!SpecialStringIndexOf) return NULL; |
327 break; |
349 break; |
328 case vmIntrinsics::_equals: |
350 case vmIntrinsics::_equals: |
329 if (!SpecialStringEquals) return NULL; |
351 if (!SpecialStringEquals) return NULL; |
352 if (!Matcher::match_rule_supported(Op_StrEquals)) return NULL; |
|
330 break; |
353 break; |
331 case vmIntrinsics::_equalsC: |
354 case vmIntrinsics::_equalsC: |
332 if (!SpecialArraysEquals) return NULL; |
355 if (!SpecialArraysEquals) return NULL; |
356 if (!Matcher::match_rule_supported(Op_AryEq)) return NULL; |
|
333 break; |
357 break; |
334 case vmIntrinsics::_arraycopy: |
358 case vmIntrinsics::_arraycopy: |
335 if (!InlineArrayCopy) return NULL; |
359 if (!InlineArrayCopy) return NULL; |
336 break; |
360 break; |
337 case vmIntrinsics::_copyMemory: |
361 case vmIntrinsics::_copyMemory: |
378 if (!Matcher::match_rule_supported(Op_CountTrailingZerosI)) return NULL; |
402 if (!Matcher::match_rule_supported(Op_CountTrailingZerosI)) return NULL; |
379 break; |
403 break; |
380 |
404 |
381 case vmIntrinsics::_numberOfTrailingZeros_l: |
405 case vmIntrinsics::_numberOfTrailingZeros_l: |
382 if (!Matcher::match_rule_supported(Op_CountTrailingZerosL)) return NULL; |
406 if (!Matcher::match_rule_supported(Op_CountTrailingZerosL)) return NULL; |
407 break; |
|
408 |
|
409 case vmIntrinsics::_reverseBytes_c: |
|
410 if (!Matcher::match_rule_supported(Op_ReverseBytesUS)) return false; |
|
411 break; |
|
412 case vmIntrinsics::_reverseBytes_s: |
|
413 if (!Matcher::match_rule_supported(Op_ReverseBytesS)) return false; |
|
414 break; |
|
415 case vmIntrinsics::_reverseBytes_i: |
|
416 if (!Matcher::match_rule_supported(Op_ReverseBytesI)) return false; |
|
417 break; |
|
418 case vmIntrinsics::_reverseBytes_l: |
|
419 if (!Matcher::match_rule_supported(Op_ReverseBytesL)) return false; |
|
383 break; |
420 break; |
384 |
421 |
385 case vmIntrinsics::_Reference_get: |
422 case vmIntrinsics::_Reference_get: |
386 // Use the intrinsic version of Reference.get() so that the value in |
423 // Use the intrinsic version of Reference.get() so that the value in |
387 // the referent field can be registered by the G1 pre-barrier code. |
424 // the referent field can be registered by the G1 pre-barrier code. |
486 char buf[1000]; |
523 char buf[1000]; |
487 const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf)); |
524 const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf)); |
488 tty->print_cr("Intrinsic %s", str); |
525 tty->print_cr("Intrinsic %s", str); |
489 } |
526 } |
490 #endif |
527 #endif |
491 |
528 ciMethod* callee = kit.callee(); |
529 const int bci = kit.bci(); |
|
530 |
|
531 // Try to inline the intrinsic. |
|
492 if (kit.try_to_inline()) { |
532 if (kit.try_to_inline()) { |
493 if (PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) { |
533 if (PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) { |
494 CompileTask::print_inlining(kit.callee(), jvms->depth() - 1, kit.bci(), is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)"); |
534 CompileTask::print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)"); |
495 } |
535 } |
496 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked); |
536 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked); |
497 if (C->log()) { |
537 if (C->log()) { |
498 C->log()->elem("intrinsic id='%s'%s nodes='%d'", |
538 C->log()->elem("intrinsic id='%s'%s nodes='%d'", |
499 vmIntrinsics::name_at(intrinsic_id()), |
539 vmIntrinsics::name_at(intrinsic_id()), |
500 (is_virtual() ? " virtual='1'" : ""), |
540 (is_virtual() ? " virtual='1'" : ""), |
501 C->unique() - nodes); |
541 C->unique() - nodes); |
502 } |
542 } |
543 // Push the result from the inlined method onto the stack. |
|
544 kit.push_result(); |
|
503 return kit.transfer_exceptions_into_jvms(); |
545 return kit.transfer_exceptions_into_jvms(); |
504 } |
546 } |
505 |
547 |
506 // The intrinsic bailed out |
548 // The intrinsic bailed out |
507 if (PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) { |
549 if (PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) { |
508 if (jvms->has_method()) { |
550 if (jvms->has_method()) { |
509 // Not a root compile. |
551 // Not a root compile. |
510 const char* msg = is_virtual() ? "failed to inline (intrinsic, virtual)" : "failed to inline (intrinsic)"; |
552 const char* msg = is_virtual() ? "failed to inline (intrinsic, virtual)" : "failed to inline (intrinsic)"; |
511 CompileTask::print_inlining(kit.callee(), jvms->depth() - 1, kit.bci(), msg); |
553 CompileTask::print_inlining(callee, jvms->depth() - 1, bci, msg); |
512 } else { |
554 } else { |
513 // Root compile |
555 // Root compile |
514 tty->print("Did not generate intrinsic %s%s at bci:%d in", |
556 tty->print("Did not generate intrinsic %s%s at bci:%d in", |
515 vmIntrinsics::name_at(intrinsic_id()), |
557 vmIntrinsics::name_at(intrinsic_id()), |
516 (is_virtual() ? " (virtual)" : ""), kit.bci()); |
558 (is_virtual() ? " (virtual)" : ""), bci); |
517 } |
559 } |
518 } |
560 } |
519 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_failed); |
561 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_failed); |
520 return NULL; |
562 return NULL; |
521 } |
563 } |
530 char buf[1000]; |
572 char buf[1000]; |
531 const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf)); |
573 const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf)); |
532 tty->print_cr("Predicate for intrinsic %s", str); |
574 tty->print_cr("Predicate for intrinsic %s", str); |
533 } |
575 } |
534 #endif |
576 #endif |
577 ciMethod* callee = kit.callee(); |
|
578 const int bci = kit.bci(); |
|
535 |
579 |
536 Node* slow_ctl = kit.try_to_predicate(); |
580 Node* slow_ctl = kit.try_to_predicate(); |
537 if (!kit.failing()) { |
581 if (!kit.failing()) { |
582 if (PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) { |
|
583 CompileTask::print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)"); |
|
584 } |
|
585 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked); |
|
538 if (C->log()) { |
586 if (C->log()) { |
539 C->log()->elem("predicate_intrinsic id='%s'%s nodes='%d'", |
587 C->log()->elem("predicate_intrinsic id='%s'%s nodes='%d'", |
540 vmIntrinsics::name_at(intrinsic_id()), |
588 vmIntrinsics::name_at(intrinsic_id()), |
541 (is_virtual() ? " virtual='1'" : ""), |
589 (is_virtual() ? " virtual='1'" : ""), |
542 C->unique() - nodes); |
590 C->unique() - nodes); |
547 // The intrinsic bailed out |
595 // The intrinsic bailed out |
548 if (PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) { |
596 if (PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) { |
549 if (jvms->has_method()) { |
597 if (jvms->has_method()) { |
550 // Not a root compile. |
598 // Not a root compile. |
551 const char* msg = "failed to generate predicate for intrinsic"; |
599 const char* msg = "failed to generate predicate for intrinsic"; |
552 CompileTask::print_inlining(kit.callee(), jvms->depth() - 1, kit.bci(), msg); |
600 CompileTask::print_inlining(kit.callee(), jvms->depth() - 1, bci, msg); |
553 } else { |
601 } else { |
554 // Root compile |
602 // Root compile |
555 tty->print("Did not generate predicate for intrinsic %s%s at bci:%d in", |
603 tty->print("Did not generate predicate for intrinsic %s%s at bci:%d in", |
556 vmIntrinsics::name_at(intrinsic_id()), |
604 vmIntrinsics::name_at(intrinsic_id()), |
557 (is_virtual() ? " (virtual)" : ""), kit.bci()); |
605 (is_virtual() ? " (virtual)" : ""), bci); |
558 } |
606 } |
559 } |
607 } |
560 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_failed); |
608 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_failed); |
561 return NULL; |
609 return NULL; |
562 } |
610 } |
564 bool LibraryCallKit::try_to_inline() { |
612 bool LibraryCallKit::try_to_inline() { |
565 // Handle symbolic names for otherwise undistinguished boolean switches: |
613 // Handle symbolic names for otherwise undistinguished boolean switches: |
566 const bool is_store = true; |
614 const bool is_store = true; |
567 const bool is_native_ptr = true; |
615 const bool is_native_ptr = true; |
568 const bool is_static = true; |
616 const bool is_static = true; |
617 const bool is_volatile = true; |
|
569 |
618 |
570 if (!jvms()->has_method()) { |
619 if (!jvms()->has_method()) { |
571 // Root JVMState has a null method. |
620 // Root JVMState has a null method. |
572 assert(map()->memory()->Opcode() == Op_Parm, ""); |
621 assert(map()->memory()->Opcode() == Op_Parm, ""); |
573 // Insert the memory aliasing node |
622 // Insert the memory aliasing node |
574 set_all_memory(reset_memory()); |
623 set_all_memory(reset_memory()); |
575 } |
624 } |
576 assert(merged_memory(), ""); |
625 assert(merged_memory(), ""); |
577 |
626 |
627 |
|
578 switch (intrinsic_id()) { |
628 switch (intrinsic_id()) { |
579 case vmIntrinsics::_hashCode: |
629 case vmIntrinsics::_hashCode: return inline_native_hashcode(intrinsic()->is_virtual(), !is_static); |
580 return inline_native_hashcode(intrinsic()->is_virtual(), !is_static); |
630 case vmIntrinsics::_identityHashCode: return inline_native_hashcode(/*!virtual*/ false, is_static); |
581 case vmIntrinsics::_identityHashCode: |
631 case vmIntrinsics::_getClass: return inline_native_getClass(); |
582 return inline_native_hashcode(/*!virtual*/ false, is_static); |
|
583 case vmIntrinsics::_getClass: |
|
584 return inline_native_getClass(); |
|
585 |
632 |
586 case vmIntrinsics::_dsin: |
633 case vmIntrinsics::_dsin: |
587 case vmIntrinsics::_dcos: |
634 case vmIntrinsics::_dcos: |
588 case vmIntrinsics::_dtan: |
635 case vmIntrinsics::_dtan: |
589 case vmIntrinsics::_dabs: |
636 case vmIntrinsics::_dabs: |
590 case vmIntrinsics::_datan2: |
637 case vmIntrinsics::_datan2: |
591 case vmIntrinsics::_dsqrt: |
638 case vmIntrinsics::_dsqrt: |
592 case vmIntrinsics::_dexp: |
639 case vmIntrinsics::_dexp: |
593 case vmIntrinsics::_dlog: |
640 case vmIntrinsics::_dlog: |
594 case vmIntrinsics::_dlog10: |
641 case vmIntrinsics::_dlog10: |
595 case vmIntrinsics::_dpow: |
642 case vmIntrinsics::_dpow: return inline_math_native(intrinsic_id()); |
596 return inline_math_native(intrinsic_id()); |
|
597 |
643 |
598 case vmIntrinsics::_min: |
644 case vmIntrinsics::_min: |
599 case vmIntrinsics::_max: |
645 case vmIntrinsics::_max: return inline_min_max(intrinsic_id()); |
600 return inline_min_max(intrinsic_id()); |
646 |
601 |
647 case vmIntrinsics::_arraycopy: return inline_arraycopy(); |
602 case vmIntrinsics::_arraycopy: |
648 |
603 return inline_arraycopy(); |
649 case vmIntrinsics::_compareTo: return inline_string_compareTo(); |
604 |
650 case vmIntrinsics::_indexOf: return inline_string_indexOf(); |
605 case vmIntrinsics::_compareTo: |
651 case vmIntrinsics::_equals: return inline_string_equals(); |
606 return inline_string_compareTo(); |
652 |
607 case vmIntrinsics::_indexOf: |
653 case vmIntrinsics::_getObject: return inline_unsafe_access(!is_native_ptr, !is_store, T_OBJECT, !is_volatile); |
608 return inline_string_indexOf(); |
654 case vmIntrinsics::_getBoolean: return inline_unsafe_access(!is_native_ptr, !is_store, T_BOOLEAN, !is_volatile); |
609 case vmIntrinsics::_equals: |
655 case vmIntrinsics::_getByte: return inline_unsafe_access(!is_native_ptr, !is_store, T_BYTE, !is_volatile); |
610 return inline_string_equals(); |
656 case vmIntrinsics::_getShort: return inline_unsafe_access(!is_native_ptr, !is_store, T_SHORT, !is_volatile); |
611 |
657 case vmIntrinsics::_getChar: return inline_unsafe_access(!is_native_ptr, !is_store, T_CHAR, !is_volatile); |
612 case vmIntrinsics::_getObject: |
658 case vmIntrinsics::_getInt: return inline_unsafe_access(!is_native_ptr, !is_store, T_INT, !is_volatile); |
613 return inline_unsafe_access(!is_native_ptr, !is_store, T_OBJECT, false); |
659 case vmIntrinsics::_getLong: return inline_unsafe_access(!is_native_ptr, !is_store, T_LONG, !is_volatile); |
614 case vmIntrinsics::_getBoolean: |
660 case vmIntrinsics::_getFloat: return inline_unsafe_access(!is_native_ptr, !is_store, T_FLOAT, !is_volatile); |
615 return inline_unsafe_access(!is_native_ptr, !is_store, T_BOOLEAN, false); |
661 case vmIntrinsics::_getDouble: return inline_unsafe_access(!is_native_ptr, !is_store, T_DOUBLE, !is_volatile); |
616 case vmIntrinsics::_getByte: |
662 |
617 return inline_unsafe_access(!is_native_ptr, !is_store, T_BYTE, false); |
663 case vmIntrinsics::_putObject: return inline_unsafe_access(!is_native_ptr, is_store, T_OBJECT, !is_volatile); |
618 case vmIntrinsics::_getShort: |
664 case vmIntrinsics::_putBoolean: return inline_unsafe_access(!is_native_ptr, is_store, T_BOOLEAN, !is_volatile); |
619 return inline_unsafe_access(!is_native_ptr, !is_store, T_SHORT, false); |
665 case vmIntrinsics::_putByte: return inline_unsafe_access(!is_native_ptr, is_store, T_BYTE, !is_volatile); |
620 case vmIntrinsics::_getChar: |
666 case vmIntrinsics::_putShort: return inline_unsafe_access(!is_native_ptr, is_store, T_SHORT, !is_volatile); |
621 return inline_unsafe_access(!is_native_ptr, !is_store, T_CHAR, false); |
667 case vmIntrinsics::_putChar: return inline_unsafe_access(!is_native_ptr, is_store, T_CHAR, !is_volatile); |
622 case vmIntrinsics::_getInt: |
668 case vmIntrinsics::_putInt: return inline_unsafe_access(!is_native_ptr, is_store, T_INT, !is_volatile); |
623 return inline_unsafe_access(!is_native_ptr, !is_store, T_INT, false); |
669 case vmIntrinsics::_putLong: return inline_unsafe_access(!is_native_ptr, is_store, T_LONG, !is_volatile); |
624 case vmIntrinsics::_getLong: |
670 case vmIntrinsics::_putFloat: return inline_unsafe_access(!is_native_ptr, is_store, T_FLOAT, !is_volatile); |
625 return inline_unsafe_access(!is_native_ptr, !is_store, T_LONG, false); |
671 case vmIntrinsics::_putDouble: return inline_unsafe_access(!is_native_ptr, is_store, T_DOUBLE, !is_volatile); |
626 case vmIntrinsics::_getFloat: |
672 |
627 return inline_unsafe_access(!is_native_ptr, !is_store, T_FLOAT, false); |
673 case vmIntrinsics::_getByte_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_BYTE, !is_volatile); |
628 case vmIntrinsics::_getDouble: |
674 case vmIntrinsics::_getShort_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_SHORT, !is_volatile); |
629 return inline_unsafe_access(!is_native_ptr, !is_store, T_DOUBLE, false); |
675 case vmIntrinsics::_getChar_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_CHAR, !is_volatile); |
630 |
676 case vmIntrinsics::_getInt_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_INT, !is_volatile); |
631 case vmIntrinsics::_putObject: |
677 case vmIntrinsics::_getLong_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_LONG, !is_volatile); |
632 return inline_unsafe_access(!is_native_ptr, is_store, T_OBJECT, false); |
678 case vmIntrinsics::_getFloat_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_FLOAT, !is_volatile); |
633 case vmIntrinsics::_putBoolean: |
679 case vmIntrinsics::_getDouble_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_DOUBLE, !is_volatile); |
634 return inline_unsafe_access(!is_native_ptr, is_store, T_BOOLEAN, false); |
680 case vmIntrinsics::_getAddress_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_ADDRESS, !is_volatile); |
635 case vmIntrinsics::_putByte: |
681 |
636 return inline_unsafe_access(!is_native_ptr, is_store, T_BYTE, false); |
682 case vmIntrinsics::_putByte_raw: return inline_unsafe_access( is_native_ptr, is_store, T_BYTE, !is_volatile); |
637 case vmIntrinsics::_putShort: |
683 case vmIntrinsics::_putShort_raw: return inline_unsafe_access( is_native_ptr, is_store, T_SHORT, !is_volatile); |
638 return inline_unsafe_access(!is_native_ptr, is_store, T_SHORT, false); |
684 case vmIntrinsics::_putChar_raw: return inline_unsafe_access( is_native_ptr, is_store, T_CHAR, !is_volatile); |
639 case vmIntrinsics::_putChar: |
685 case vmIntrinsics::_putInt_raw: return inline_unsafe_access( is_native_ptr, is_store, T_INT, !is_volatile); |
640 return inline_unsafe_access(!is_native_ptr, is_store, T_CHAR, false); |
686 case vmIntrinsics::_putLong_raw: return inline_unsafe_access( is_native_ptr, is_store, T_LONG, !is_volatile); |
641 case vmIntrinsics::_putInt: |
687 case vmIntrinsics::_putFloat_raw: return inline_unsafe_access( is_native_ptr, is_store, T_FLOAT, !is_volatile); |
642 return inline_unsafe_access(!is_native_ptr, is_store, T_INT, false); |
688 case vmIntrinsics::_putDouble_raw: return inline_unsafe_access( is_native_ptr, is_store, T_DOUBLE, !is_volatile); |
643 case vmIntrinsics::_putLong: |
689 case vmIntrinsics::_putAddress_raw: return inline_unsafe_access( is_native_ptr, is_store, T_ADDRESS, !is_volatile); |
644 return inline_unsafe_access(!is_native_ptr, is_store, T_LONG, false); |
690 |
645 case vmIntrinsics::_putFloat: |
691 case vmIntrinsics::_getObjectVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_OBJECT, is_volatile); |
646 return inline_unsafe_access(!is_native_ptr, is_store, T_FLOAT, false); |
692 case vmIntrinsics::_getBooleanVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_BOOLEAN, is_volatile); |
647 case vmIntrinsics::_putDouble: |
693 case vmIntrinsics::_getByteVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_BYTE, is_volatile); |
648 return inline_unsafe_access(!is_native_ptr, is_store, T_DOUBLE, false); |
694 case vmIntrinsics::_getShortVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_SHORT, is_volatile); |
649 |
695 case vmIntrinsics::_getCharVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_CHAR, is_volatile); |
650 case vmIntrinsics::_getByte_raw: |
696 case vmIntrinsics::_getIntVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_INT, is_volatile); |
651 return inline_unsafe_access(is_native_ptr, !is_store, T_BYTE, false); |
697 case vmIntrinsics::_getLongVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_LONG, is_volatile); |
652 case vmIntrinsics::_getShort_raw: |
698 case vmIntrinsics::_getFloatVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_FLOAT, is_volatile); |
653 return inline_unsafe_access(is_native_ptr, !is_store, T_SHORT, false); |
699 case vmIntrinsics::_getDoubleVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_DOUBLE, is_volatile); |
654 case vmIntrinsics::_getChar_raw: |
700 |
655 return inline_unsafe_access(is_native_ptr, !is_store, T_CHAR, false); |
701 case vmIntrinsics::_putObjectVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_OBJECT, is_volatile); |
656 case vmIntrinsics::_getInt_raw: |
702 case vmIntrinsics::_putBooleanVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_BOOLEAN, is_volatile); |
657 return inline_unsafe_access(is_native_ptr, !is_store, T_INT, false); |
703 case vmIntrinsics::_putByteVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_BYTE, is_volatile); |
658 case vmIntrinsics::_getLong_raw: |
704 case vmIntrinsics::_putShortVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_SHORT, is_volatile); |
659 return inline_unsafe_access(is_native_ptr, !is_store, T_LONG, false); |
705 case vmIntrinsics::_putCharVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_CHAR, is_volatile); |
660 case vmIntrinsics::_getFloat_raw: |
706 case vmIntrinsics::_putIntVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_INT, is_volatile); |
661 return inline_unsafe_access(is_native_ptr, !is_store, T_FLOAT, false); |
707 case vmIntrinsics::_putLongVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_LONG, is_volatile); |
662 case vmIntrinsics::_getDouble_raw: |
708 case vmIntrinsics::_putFloatVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_FLOAT, is_volatile); |
663 return inline_unsafe_access(is_native_ptr, !is_store, T_DOUBLE, false); |
709 case vmIntrinsics::_putDoubleVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_DOUBLE, is_volatile); |
664 case vmIntrinsics::_getAddress_raw: |
710 |
665 return inline_unsafe_access(is_native_ptr, !is_store, T_ADDRESS, false); |
711 case vmIntrinsics::_prefetchRead: return inline_unsafe_prefetch(!is_native_ptr, !is_store, !is_static); |
666 |
712 case vmIntrinsics::_prefetchWrite: return inline_unsafe_prefetch(!is_native_ptr, is_store, !is_static); |
667 case vmIntrinsics::_putByte_raw: |
713 case vmIntrinsics::_prefetchReadStatic: return inline_unsafe_prefetch(!is_native_ptr, !is_store, is_static); |
668 return inline_unsafe_access(is_native_ptr, is_store, T_BYTE, false); |
714 case vmIntrinsics::_prefetchWriteStatic: return inline_unsafe_prefetch(!is_native_ptr, is_store, is_static); |
669 case vmIntrinsics::_putShort_raw: |
715 |
670 return inline_unsafe_access(is_native_ptr, is_store, T_SHORT, false); |
716 case vmIntrinsics::_compareAndSwapObject: return inline_unsafe_load_store(T_OBJECT, LS_cmpxchg); |
671 case vmIntrinsics::_putChar_raw: |
717 case vmIntrinsics::_compareAndSwapInt: return inline_unsafe_load_store(T_INT, LS_cmpxchg); |
672 return inline_unsafe_access(is_native_ptr, is_store, T_CHAR, false); |
718 case vmIntrinsics::_compareAndSwapLong: return inline_unsafe_load_store(T_LONG, LS_cmpxchg); |
673 case vmIntrinsics::_putInt_raw: |
719 |
674 return inline_unsafe_access(is_native_ptr, is_store, T_INT, false); |
720 case vmIntrinsics::_putOrderedObject: return inline_unsafe_ordered_store(T_OBJECT); |
675 case vmIntrinsics::_putLong_raw: |
721 case vmIntrinsics::_putOrderedInt: return inline_unsafe_ordered_store(T_INT); |
676 return inline_unsafe_access(is_native_ptr, is_store, T_LONG, false); |
722 case vmIntrinsics::_putOrderedLong: return inline_unsafe_ordered_store(T_LONG); |
677 case vmIntrinsics::_putFloat_raw: |
723 |
678 return inline_unsafe_access(is_native_ptr, is_store, T_FLOAT, false); |
724 case vmIntrinsics::_getAndAddInt: return inline_unsafe_load_store(T_INT, LS_xadd); |
679 case vmIntrinsics::_putDouble_raw: |
725 case vmIntrinsics::_getAndAddLong: return inline_unsafe_load_store(T_LONG, LS_xadd); |
680 return inline_unsafe_access(is_native_ptr, is_store, T_DOUBLE, false); |
726 case vmIntrinsics::_getAndSetInt: return inline_unsafe_load_store(T_INT, LS_xchg); |
681 case vmIntrinsics::_putAddress_raw: |
727 case vmIntrinsics::_getAndSetLong: return inline_unsafe_load_store(T_LONG, LS_xchg); |
682 return inline_unsafe_access(is_native_ptr, is_store, T_ADDRESS, false); |
728 case vmIntrinsics::_getAndSetObject: return inline_unsafe_load_store(T_OBJECT, LS_xchg); |
683 |
729 |
684 case vmIntrinsics::_getObjectVolatile: |
730 case vmIntrinsics::_currentThread: return inline_native_currentThread(); |
685 return inline_unsafe_access(!is_native_ptr, !is_store, T_OBJECT, true); |
731 case vmIntrinsics::_isInterrupted: return inline_native_isInterrupted(); |
686 case vmIntrinsics::_getBooleanVolatile: |
|
687 return inline_unsafe_access(!is_native_ptr, !is_store, T_BOOLEAN, true); |
|
688 case vmIntrinsics::_getByteVolatile: |
|
689 return inline_unsafe_access(!is_native_ptr, !is_store, T_BYTE, true); |
|
690 case vmIntrinsics::_getShortVolatile: |
|
691 return inline_unsafe_access(!is_native_ptr, !is_store, T_SHORT, true); |
|
692 case vmIntrinsics::_getCharVolatile: |
|
693 return inline_unsafe_access(!is_native_ptr, !is_store, T_CHAR, true); |
|
694 case vmIntrinsics::_getIntVolatile: |
|
695 return inline_unsafe_access(!is_native_ptr, !is_store, T_INT, true); |
|
696 case vmIntrinsics::_getLongVolatile: |
|
697 return inline_unsafe_access(!is_native_ptr, !is_store, T_LONG, true); |
|
698 case vmIntrinsics::_getFloatVolatile: |
|
699 return inline_unsafe_access(!is_native_ptr, !is_store, T_FLOAT, true); |
|
700 case vmIntrinsics::_getDoubleVolatile: |
|
701 return inline_unsafe_access(!is_native_ptr, !is_store, T_DOUBLE, true); |
|
702 |
|
703 case vmIntrinsics::_putObjectVolatile: |
|
704 return inline_unsafe_access(!is_native_ptr, is_store, T_OBJECT, true); |
|
705 case vmIntrinsics::_putBooleanVolatile: |
|
706 return inline_unsafe_access(!is_native_ptr, is_store, T_BOOLEAN, true); |
|
707 case vmIntrinsics::_putByteVolatile: |
|
708 return inline_unsafe_access(!is_native_ptr, is_store, T_BYTE, true); |
|
709 case vmIntrinsics::_putShortVolatile: |
|
710 return inline_unsafe_access(!is_native_ptr, is_store, T_SHORT, true); |
|
711 case vmIntrinsics::_putCharVolatile: |
|
712 return inline_unsafe_access(!is_native_ptr, is_store, T_CHAR, true); |
|
713 case vmIntrinsics::_putIntVolatile: |
|
714 return inline_unsafe_access(!is_native_ptr, is_store, T_INT, true); |
|
715 case vmIntrinsics::_putLongVolatile: |
|
716 return inline_unsafe_access(!is_native_ptr, is_store, T_LONG, true); |
|
717 case vmIntrinsics::_putFloatVolatile: |
|
718 return inline_unsafe_access(!is_native_ptr, is_store, T_FLOAT, true); |
|
719 case vmIntrinsics::_putDoubleVolatile: |
|
720 return inline_unsafe_access(!is_native_ptr, is_store, T_DOUBLE, true); |
|
721 |
|
722 case vmIntrinsics::_prefetchRead: |
|
723 return inline_unsafe_prefetch(!is_native_ptr, !is_store, !is_static); |
|
724 case vmIntrinsics::_prefetchWrite: |
|
725 return inline_unsafe_prefetch(!is_native_ptr, is_store, !is_static); |
|
726 case vmIntrinsics::_prefetchReadStatic: |
|
727 return inline_unsafe_prefetch(!is_native_ptr, !is_store, is_static); |
|
728 case vmIntrinsics::_prefetchWriteStatic: |
|
729 return inline_unsafe_prefetch(!is_native_ptr, is_store, is_static); |
|
730 |
|
731 case vmIntrinsics::_compareAndSwapObject: |
|
732 return inline_unsafe_load_store(T_OBJECT, LS_cmpxchg); |
|
733 case vmIntrinsics::_compareAndSwapInt: |
|
734 return inline_unsafe_load_store(T_INT, LS_cmpxchg); |
|
735 case vmIntrinsics::_compareAndSwapLong: |
|
736 return inline_unsafe_load_store(T_LONG, LS_cmpxchg); |
|
737 |
|
738 case vmIntrinsics::_putOrderedObject: |
|
739 return inline_unsafe_ordered_store(T_OBJECT); |
|
740 case vmIntrinsics::_putOrderedInt: |
|
741 return inline_unsafe_ordered_store(T_INT); |
|
742 case vmIntrinsics::_putOrderedLong: |
|
743 return inline_unsafe_ordered_store(T_LONG); |
|
744 |
|
745 case vmIntrinsics::_getAndAddInt: |
|
746 return inline_unsafe_load_store(T_INT, LS_xadd); |
|
747 case vmIntrinsics::_getAndAddLong: |
|
748 return inline_unsafe_load_store(T_LONG, LS_xadd); |
|
749 case vmIntrinsics::_getAndSetInt: |
|
750 return inline_unsafe_load_store(T_INT, LS_xchg); |
|
751 case vmIntrinsics::_getAndSetLong: |
|
752 return inline_unsafe_load_store(T_LONG, LS_xchg); |
|
753 case vmIntrinsics::_getAndSetObject: |
|
754 return inline_unsafe_load_store(T_OBJECT, LS_xchg); |
|
755 |
|
756 case vmIntrinsics::_currentThread: |
|
757 return inline_native_currentThread(); |
|
758 case vmIntrinsics::_isInterrupted: |
|
759 return inline_native_isInterrupted(); |
|
760 |
732 |
761 #ifdef TRACE_HAVE_INTRINSICS |
733 #ifdef TRACE_HAVE_INTRINSICS |
762 case vmIntrinsics::_classID: |
734 case vmIntrinsics::_classID: return inline_native_classID(); |
763 return inline_native_classID(); |
735 case vmIntrinsics::_threadID: return inline_native_threadID(); |
764 case vmIntrinsics::_threadID: |
736 case vmIntrinsics::_counterTime: return inline_native_time_funcs(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), "counterTime"); |
765 return inline_native_threadID(); |
|
766 case vmIntrinsics::_counterTime: |
|
767 return inline_native_time_funcs(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), "counterTime"); |
|
768 #endif |
737 #endif |
769 case vmIntrinsics::_currentTimeMillis: |
738 case vmIntrinsics::_currentTimeMillis: return inline_native_time_funcs(CAST_FROM_FN_PTR(address, os::javaTimeMillis), "currentTimeMillis"); |
770 return inline_native_time_funcs(CAST_FROM_FN_PTR(address, os::javaTimeMillis), "currentTimeMillis"); |
739 case vmIntrinsics::_nanoTime: return inline_native_time_funcs(CAST_FROM_FN_PTR(address, os::javaTimeNanos), "nanoTime"); |
771 case vmIntrinsics::_nanoTime: |
740 case vmIntrinsics::_allocateInstance: return inline_unsafe_allocate(); |
772 return inline_native_time_funcs(CAST_FROM_FN_PTR(address, os::javaTimeNanos), "nanoTime"); |
741 case vmIntrinsics::_copyMemory: return inline_unsafe_copyMemory(); |
773 case vmIntrinsics::_allocateInstance: |
742 case vmIntrinsics::_newArray: return inline_native_newArray(); |
774 return inline_unsafe_allocate(); |
743 case vmIntrinsics::_getLength: return inline_native_getLength(); |
775 case vmIntrinsics::_copyMemory: |
744 case vmIntrinsics::_copyOf: return inline_array_copyOf(false); |
776 return inline_unsafe_copyMemory(); |
745 case vmIntrinsics::_copyOfRange: return inline_array_copyOf(true); |
777 case vmIntrinsics::_newArray: |
746 case vmIntrinsics::_equalsC: return inline_array_equals(); |
778 return inline_native_newArray(); |
747 case vmIntrinsics::_clone: return inline_native_clone(intrinsic()->is_virtual()); |
779 case vmIntrinsics::_getLength: |
748 |
780 return inline_native_getLength(); |
749 case vmIntrinsics::_isAssignableFrom: return inline_native_subtype_check(); |
781 case vmIntrinsics::_copyOf: |
|
782 return inline_array_copyOf(false); |
|
783 case vmIntrinsics::_copyOfRange: |
|
784 return inline_array_copyOf(true); |
|
785 case vmIntrinsics::_equalsC: |
|
786 return inline_array_equals(); |
|
787 case vmIntrinsics::_clone: |
|
788 return inline_native_clone(intrinsic()->is_virtual()); |
|
789 |
|
790 case vmIntrinsics::_isAssignableFrom: |
|
791 return inline_native_subtype_check(); |
|
792 |
750 |
793 case vmIntrinsics::_isInstance: |
751 case vmIntrinsics::_isInstance: |
794 case vmIntrinsics::_getModifiers: |
752 case vmIntrinsics::_getModifiers: |
795 case vmIntrinsics::_isInterface: |
753 case vmIntrinsics::_isInterface: |
796 case vmIntrinsics::_isArray: |
754 case vmIntrinsics::_isArray: |
797 case vmIntrinsics::_isPrimitive: |
755 case vmIntrinsics::_isPrimitive: |
798 case vmIntrinsics::_getSuperclass: |
756 case vmIntrinsics::_getSuperclass: |
799 case vmIntrinsics::_getComponentType: |
757 case vmIntrinsics::_getComponentType: |
800 case vmIntrinsics::_getClassAccessFlags: |
758 case vmIntrinsics::_getClassAccessFlags: return inline_native_Class_query(intrinsic_id()); |
801 return inline_native_Class_query(intrinsic_id()); |
|
802 |
759 |
803 case vmIntrinsics::_floatToRawIntBits: |
760 case vmIntrinsics::_floatToRawIntBits: |
804 case vmIntrinsics::_floatToIntBits: |
761 case vmIntrinsics::_floatToIntBits: |
805 case vmIntrinsics::_intBitsToFloat: |
762 case vmIntrinsics::_intBitsToFloat: |
806 case vmIntrinsics::_doubleToRawLongBits: |
763 case vmIntrinsics::_doubleToRawLongBits: |
807 case vmIntrinsics::_doubleToLongBits: |
764 case vmIntrinsics::_doubleToLongBits: |
808 case vmIntrinsics::_longBitsToDouble: |
765 case vmIntrinsics::_longBitsToDouble: return inline_fp_conversions(intrinsic_id()); |
809 return inline_fp_conversions(intrinsic_id()); |
|
810 |
766 |
811 case vmIntrinsics::_numberOfLeadingZeros_i: |
767 case vmIntrinsics::_numberOfLeadingZeros_i: |
812 case vmIntrinsics::_numberOfLeadingZeros_l: |
768 case vmIntrinsics::_numberOfLeadingZeros_l: |
813 return inline_numberOfLeadingZeros(intrinsic_id()); |
|
814 |
|
815 case vmIntrinsics::_numberOfTrailingZeros_i: |
769 case vmIntrinsics::_numberOfTrailingZeros_i: |
816 case vmIntrinsics::_numberOfTrailingZeros_l: |
770 case vmIntrinsics::_numberOfTrailingZeros_l: |
817 return inline_numberOfTrailingZeros(intrinsic_id()); |
|
818 |
|
819 case vmIntrinsics::_bitCount_i: |
771 case vmIntrinsics::_bitCount_i: |
820 case vmIntrinsics::_bitCount_l: |
772 case vmIntrinsics::_bitCount_l: |
821 return inline_bitCount(intrinsic_id()); |
|
822 |
|
823 case vmIntrinsics::_reverseBytes_i: |
773 case vmIntrinsics::_reverseBytes_i: |
824 case vmIntrinsics::_reverseBytes_l: |
774 case vmIntrinsics::_reverseBytes_l: |
825 case vmIntrinsics::_reverseBytes_s: |
775 case vmIntrinsics::_reverseBytes_s: |
826 case vmIntrinsics::_reverseBytes_c: |
776 case vmIntrinsics::_reverseBytes_c: return inline_number_methods(intrinsic_id()); |
827 return inline_reverseBytes((vmIntrinsics::ID) intrinsic_id()); |
777 |
828 |
778 case vmIntrinsics::_getCallerClass: return inline_native_Reflection_getCallerClass(); |
829 case vmIntrinsics::_getCallerClass: |
779 |
830 return inline_native_Reflection_getCallerClass(); |
780 case vmIntrinsics::_Reference_get: return inline_reference_get(); |
831 |
|
832 case vmIntrinsics::_Reference_get: |
|
833 return inline_reference_get(); |
|
834 |
781 |
835 case vmIntrinsics::_aescrypt_encryptBlock: |
782 case vmIntrinsics::_aescrypt_encryptBlock: |
836 case vmIntrinsics::_aescrypt_decryptBlock: |
783 case vmIntrinsics::_aescrypt_decryptBlock: return inline_aescrypt_Block(intrinsic_id()); |
837 return inline_aescrypt_Block(intrinsic_id()); |
|
838 |
784 |
839 case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: |
785 case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: |
840 case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: |
786 case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: |
841 return inline_cipherBlockChaining_AESCrypt(intrinsic_id()); |
787 return inline_cipherBlockChaining_AESCrypt(intrinsic_id()); |
842 |
788 |
881 set_control(top()); // No fast path instrinsic |
827 set_control(top()); // No fast path instrinsic |
882 return slow_ctl; |
828 return slow_ctl; |
883 } |
829 } |
884 } |
830 } |
885 |
831 |
886 //------------------------------push_result------------------------------ |
832 //------------------------------set_result------------------------------- |
887 // Helper function for finishing intrinsics. |
833 // Helper function for finishing intrinsics. |
888 void LibraryCallKit::push_result(RegionNode* region, PhiNode* value) { |
834 void LibraryCallKit::set_result(RegionNode* region, PhiNode* value) { |
889 record_for_igvn(region); |
835 record_for_igvn(region); |
890 set_control(_gvn.transform(region)); |
836 set_control(_gvn.transform(region)); |
891 BasicType value_type = value->type()->basic_type(); |
837 set_result( _gvn.transform(value)); |
892 push_node(value_type, _gvn.transform(value)); |
838 assert(value->type()->basic_type() == result()->bottom_type()->basic_type(), "sanity"); |
893 } |
839 } |
894 |
840 |
895 //------------------------------generate_guard--------------------------- |
841 //------------------------------generate_guard--------------------------- |
896 // Helper function for generating guarded fast-slow graph structures. |
842 // Helper function for generating guarded fast-slow graph structures. |
897 // The given 'test', if true, guards a slow path. If the test fails |
843 // The given 'test', if true, guards a slow path. If the test fails |
1076 // Helper method for String intrinsic functions. This version is called |
1022 // Helper method for String intrinsic functions. This version is called |
1077 // with str1 and str2 pointing to char[] nodes, with cnt1 and cnt2 pointing |
1023 // with str1 and str2 pointing to char[] nodes, with cnt1 and cnt2 pointing |
1078 // to Int nodes containing the lenghts of str1 and str2. |
1024 // to Int nodes containing the lenghts of str1 and str2. |
1079 // |
1025 // |
1080 Node* LibraryCallKit::make_string_method_node(int opcode, Node* str1_start, Node* cnt1, Node* str2_start, Node* cnt2) { |
1026 Node* LibraryCallKit::make_string_method_node(int opcode, Node* str1_start, Node* cnt1, Node* str2_start, Node* cnt2) { |
1081 |
|
1082 Node* result = NULL; |
1027 Node* result = NULL; |
1083 switch (opcode) { |
1028 switch (opcode) { |
1084 case Op_StrIndexOf: |
1029 case Op_StrIndexOf: |
1085 result = new (C) StrIndexOfNode(control(), memory(TypeAryPtr::CHARS), |
1030 result = new (C) StrIndexOfNode(control(), memory(TypeAryPtr::CHARS), |
1086 str1_start, cnt1, str2_start, cnt2); |
1031 str1_start, cnt1, str2_start, cnt2); |
1103 |
1048 |
1104 return _gvn.transform(result); |
1049 return _gvn.transform(result); |
1105 } |
1050 } |
1106 |
1051 |
1107 //------------------------------inline_string_compareTo------------------------ |
1052 //------------------------------inline_string_compareTo------------------------ |
1053 // public int java.lang.String.compareTo(String anotherString); |
|
1108 bool LibraryCallKit::inline_string_compareTo() { |
1054 bool LibraryCallKit::inline_string_compareTo() { |
1109 |
1055 Node* receiver = null_check(argument(0)); |
1110 if (!Matcher::has_match_rule(Op_StrComp)) return false; |
1056 Node* arg = null_check(argument(1)); |
1111 |
|
1112 _sp += 2; |
|
1113 Node *argument = pop(); // pop non-receiver first: it was pushed second |
|
1114 Node *receiver = pop(); |
|
1115 |
|
1116 // Null check on self without removing any arguments. The argument |
|
1117 // null check technically happens in the wrong place, which can lead to |
|
1118 // invalid stack traces when string compare is inlined into a method |
|
1119 // which handles NullPointerExceptions. |
|
1120 _sp += 2; |
|
1121 receiver = do_null_check(receiver, T_OBJECT); |
|
1122 argument = do_null_check(argument, T_OBJECT); |
|
1123 _sp -= 2; |
|
1124 if (stopped()) { |
1057 if (stopped()) { |
1125 return true; |
1058 return true; |
1126 } |
1059 } |
1127 |
1060 set_result(make_string_method_node(Op_StrComp, receiver, arg)); |
1128 Node* compare = make_string_method_node(Op_StrComp, receiver, argument); |
|
1129 push(compare); |
|
1130 return true; |
1061 return true; |
1131 } |
1062 } |
1132 |
1063 |
1133 //------------------------------inline_string_equals------------------------ |
1064 //------------------------------inline_string_equals------------------------ |
1134 bool LibraryCallKit::inline_string_equals() { |
1065 bool LibraryCallKit::inline_string_equals() { |
1135 |
1066 Node* receiver = null_check_receiver(); |
1136 if (!Matcher::has_match_rule(Op_StrEquals)) return false; |
1067 // NOTE: Do not null check argument for String.equals() because spec |
1137 |
1068 // allows to specify NULL as argument. |
1138 int nargs = 2; |
1069 Node* argument = this->argument(1); |
1139 _sp += nargs; |
|
1140 Node* argument = pop(); // pop non-receiver first: it was pushed second |
|
1141 Node* receiver = pop(); |
|
1142 |
|
1143 // Null check on self without removing any arguments. The argument |
|
1144 // null check technically happens in the wrong place, which can lead to |
|
1145 // invalid stack traces when string compare is inlined into a method |
|
1146 // which handles NullPointerExceptions. |
|
1147 _sp += nargs; |
|
1148 receiver = do_null_check(receiver, T_OBJECT); |
|
1149 //should not do null check for argument for String.equals(), because spec |
|
1150 //allows to specify NULL as argument. |
|
1151 _sp -= nargs; |
|
1152 |
|
1153 if (stopped()) { |
1070 if (stopped()) { |
1154 return true; |
1071 return true; |
1155 } |
1072 } |
1156 |
1073 |
1157 // paths (plus control) merge |
1074 // paths (plus control) merge |
1171 |
1088 |
1172 // get String klass for instanceOf |
1089 // get String klass for instanceOf |
1173 ciInstanceKlass* klass = env()->String_klass(); |
1090 ciInstanceKlass* klass = env()->String_klass(); |
1174 |
1091 |
1175 if (!stopped()) { |
1092 if (!stopped()) { |
1176 _sp += nargs; // gen_instanceof might do an uncommon trap |
|
1177 Node* inst = gen_instanceof(argument, makecon(TypeKlassPtr::make(klass))); |
1093 Node* inst = gen_instanceof(argument, makecon(TypeKlassPtr::make(klass))); |
1178 _sp -= nargs; |
|
1179 Node* cmp = _gvn.transform(new (C) CmpINode(inst, intcon(1))); |
1094 Node* cmp = _gvn.transform(new (C) CmpINode(inst, intcon(1))); |
1180 Node* bol = _gvn.transform(new (C) BoolNode(cmp, BoolTest::ne)); |
1095 Node* bol = _gvn.transform(new (C) BoolNode(cmp, BoolTest::ne)); |
1181 |
1096 |
1182 Node* inst_false = generate_guard(bol, NULL, PROB_MIN); |
1097 Node* inst_false = generate_guard(bol, NULL, PROB_MIN); |
1183 //instanceOf == true, fallthrough |
1098 //instanceOf == true, fallthrough |
1205 |
1120 |
1206 // Get length of receiver |
1121 // Get length of receiver |
1207 Node* receiver_cnt = load_String_length(no_ctrl, receiver); |
1122 Node* receiver_cnt = load_String_length(no_ctrl, receiver); |
1208 |
1123 |
1209 // Get start addr of argument |
1124 // Get start addr of argument |
1210 Node* argument_val = load_String_value(no_ctrl, argument); |
1125 Node* argument_val = load_String_value(no_ctrl, argument); |
1211 Node* argument_offset = load_String_offset(no_ctrl, argument); |
1126 Node* argument_offset = load_String_offset(no_ctrl, argument); |
1212 Node* argument_start = array_element_address(argument_val, argument_offset, T_CHAR); |
1127 Node* argument_start = array_element_address(argument_val, argument_offset, T_CHAR); |
1213 |
1128 |
1214 // Get length of argument |
1129 // Get length of argument |
1215 Node* argument_cnt = load_String_length(no_ctrl, argument); |
1130 Node* argument_cnt = load_String_length(no_ctrl, argument); |
1234 |
1149 |
1235 // post merge |
1150 // post merge |
1236 set_control(_gvn.transform(region)); |
1151 set_control(_gvn.transform(region)); |
1237 record_for_igvn(region); |
1152 record_for_igvn(region); |
1238 |
1153 |
1239 push(_gvn.transform(phi)); |
1154 set_result(_gvn.transform(phi)); |
1240 |
|
1241 return true; |
1155 return true; |
1242 } |
1156 } |
1243 |
1157 |
1244 //------------------------------inline_array_equals---------------------------- |
1158 //------------------------------inline_array_equals---------------------------- |
1245 bool LibraryCallKit::inline_array_equals() { |
1159 bool LibraryCallKit::inline_array_equals() { |
1246 |
1160 Node* arg1 = argument(0); |
1247 if (!Matcher::has_match_rule(Op_AryEq)) return false; |
1161 Node* arg2 = argument(1); |
1248 |
1162 set_result(_gvn.transform(new (C) AryEqNode(control(), memory(TypeAryPtr::CHARS), arg1, arg2))); |
1249 _sp += 2; |
|
1250 Node *argument2 = pop(); |
|
1251 Node *argument1 = pop(); |
|
1252 |
|
1253 Node* equals = |
|
1254 _gvn.transform(new (C) AryEqNode(control(), memory(TypeAryPtr::CHARS), |
|
1255 argument1, argument2) ); |
|
1256 push(equals); |
|
1257 return true; |
1163 return true; |
1258 } |
1164 } |
1259 |
1165 |
1260 // Java version of String.indexOf(constant string) |
1166 // Java version of String.indexOf(constant string) |
1261 // class StringDecl { |
1167 // class StringDecl { |
1323 |
1229 |
1324 Node* no_ctrl = NULL; |
1230 Node* no_ctrl = NULL; |
1325 float likely = PROB_LIKELY(0.9); |
1231 float likely = PROB_LIKELY(0.9); |
1326 float unlikely = PROB_UNLIKELY(0.9); |
1232 float unlikely = PROB_UNLIKELY(0.9); |
1327 |
1233 |
1328 const int nargs = 2; // number of arguments to push back for uncommon trap in predicate |
1234 const int nargs = 0; // no arguments to push back for uncommon trap in predicate |
1329 |
1235 |
1330 Node* source = load_String_value(no_ctrl, string_object); |
1236 Node* source = load_String_value(no_ctrl, string_object); |
1331 Node* sourceOffset = load_String_offset(no_ctrl, string_object); |
1237 Node* sourceOffset = load_String_offset(no_ctrl, string_object); |
1332 Node* sourceCount = load_String_length(no_ctrl, string_object); |
1238 Node* sourceCount = load_String_length(no_ctrl, string_object); |
1333 |
1239 |
1394 return result; |
1300 return result; |
1395 } |
1301 } |
1396 |
1302 |
1397 //------------------------------inline_string_indexOf------------------------ |
1303 //------------------------------inline_string_indexOf------------------------ |
1398 bool LibraryCallKit::inline_string_indexOf() { |
1304 bool LibraryCallKit::inline_string_indexOf() { |
1399 |
1305 Node* receiver = argument(0); |
1400 _sp += 2; |
1306 Node* arg = argument(1); |
1401 Node *argument = pop(); // pop non-receiver first: it was pushed second |
|
1402 Node *receiver = pop(); |
|
1403 |
1307 |
1404 Node* result; |
1308 Node* result; |
1405 // Disable the use of pcmpestri until it can be guaranteed that |
1309 // Disable the use of pcmpestri until it can be guaranteed that |
1406 // the load doesn't cross into the uncommited space. |
1310 // the load doesn't cross into the uncommited space. |
1407 if (Matcher::has_match_rule(Op_StrIndexOf) && |
1311 if (Matcher::has_match_rule(Op_StrIndexOf) && |
1408 UseSSE42Intrinsics) { |
1312 UseSSE42Intrinsics) { |
1409 // Generate SSE4.2 version of indexOf |
1313 // Generate SSE4.2 version of indexOf |
1410 // We currently only have match rules that use SSE4.2 |
1314 // We currently only have match rules that use SSE4.2 |
1411 |
1315 |
1412 // Null check on self without removing any arguments. The argument |
1316 receiver = null_check(receiver); |
1413 // null check technically happens in the wrong place, which can lead to |
1317 arg = null_check(arg); |
1414 // invalid stack traces when string compare is inlined into a method |
|
1415 // which handles NullPointerExceptions. |
|
1416 _sp += 2; |
|
1417 receiver = do_null_check(receiver, T_OBJECT); |
|
1418 argument = do_null_check(argument, T_OBJECT); |
|
1419 _sp -= 2; |
|
1420 |
|
1421 if (stopped()) { |
1318 if (stopped()) { |
1422 return true; |
1319 return true; |
1423 } |
1320 } |
1424 |
1321 |
1425 ciInstanceKlass* str_klass = env()->String_klass(); |
1322 ciInstanceKlass* str_klass = env()->String_klass(); |
1437 |
1334 |
1438 // Get length of source string |
1335 // Get length of source string |
1439 Node* source_cnt = load_String_length(no_ctrl, receiver); |
1336 Node* source_cnt = load_String_length(no_ctrl, receiver); |
1440 |
1337 |
1441 // Get start addr of substring |
1338 // Get start addr of substring |
1442 Node* substr = load_String_value(no_ctrl, argument); |
1339 Node* substr = load_String_value(no_ctrl, arg); |
1443 Node* substr_offset = load_String_offset(no_ctrl, argument); |
1340 Node* substr_offset = load_String_offset(no_ctrl, arg); |
1444 Node* substr_start = array_element_address(substr, substr_offset, T_CHAR); |
1341 Node* substr_start = array_element_address(substr, substr_offset, T_CHAR); |
1445 |
1342 |
1446 // Get length of source string |
1343 // Get length of source string |
1447 Node* substr_cnt = load_String_length(no_ctrl, argument); |
1344 Node* substr_cnt = load_String_length(no_ctrl, arg); |
1448 |
1345 |
1449 // Check for substr count > string count |
1346 // Check for substr count > string count |
1450 Node* cmp = _gvn.transform( new(C) CmpINode(substr_cnt, source_cnt) ); |
1347 Node* cmp = _gvn.transform( new(C) CmpINode(substr_cnt, source_cnt) ); |
1451 Node* bol = _gvn.transform( new(C) BoolNode(cmp, BoolTest::gt) ); |
1348 Node* bol = _gvn.transform( new(C) BoolNode(cmp, BoolTest::gt) ); |
1452 Node* if_gt = generate_slow_guard(bol, NULL); |
1349 Node* if_gt = generate_slow_guard(bol, NULL); |
1475 record_for_igvn(result_rgn); |
1372 record_for_igvn(result_rgn); |
1476 result = _gvn.transform(result_phi); |
1373 result = _gvn.transform(result_phi); |
1477 |
1374 |
1478 } else { // Use LibraryCallKit::string_indexOf |
1375 } else { // Use LibraryCallKit::string_indexOf |
1479 // don't intrinsify if argument isn't a constant string. |
1376 // don't intrinsify if argument isn't a constant string. |
1480 if (!argument->is_Con()) { |
1377 if (!arg->is_Con()) { |
1481 return false; |
1378 return false; |
1482 } |
1379 } |
1483 const TypeOopPtr* str_type = _gvn.type(argument)->isa_oopptr(); |
1380 const TypeOopPtr* str_type = _gvn.type(arg)->isa_oopptr(); |
1484 if (str_type == NULL) { |
1381 if (str_type == NULL) { |
1485 return false; |
1382 return false; |
1486 } |
1383 } |
1487 ciInstanceKlass* klass = env()->String_klass(); |
1384 ciInstanceKlass* klass = env()->String_klass(); |
1488 ciObject* str_const = str_type->const_oop(); |
1385 ciObject* str_const = str_type->const_oop(); |
1509 // simplifies the resulting code somewhat so lets optimize for that. |
1406 // simplifies the resulting code somewhat so lets optimize for that. |
1510 if (o != 0 || c != pat->length()) { |
1407 if (o != 0 || c != pat->length()) { |
1511 return false; |
1408 return false; |
1512 } |
1409 } |
1513 |
1410 |
1514 // Null check on self without removing any arguments. The argument |
1411 receiver = null_check(receiver, T_OBJECT); |
1515 // null check technically happens in the wrong place, which can lead to |
1412 // NOTE: No null check on the argument is needed since it's a constant String oop. |
1516 // invalid stack traces when string compare is inlined into a method |
|
1517 // which handles NullPointerExceptions. |
|
1518 _sp += 2; |
|
1519 receiver = do_null_check(receiver, T_OBJECT); |
|
1520 // No null check on the argument is needed since it's a constant String oop. |
|
1521 _sp -= 2; |
|
1522 if (stopped()) { |
1413 if (stopped()) { |
1523 return true; |
1414 return true; |
1524 } |
1415 } |
1525 |
1416 |
1526 // The null string as a pattern always returns 0 (match at beginning of string) |
1417 // The null string as a pattern always returns 0 (match at beginning of string) |
1527 if (c == 0) { |
1418 if (c == 0) { |
1528 push(intcon(0)); |
1419 set_result(intcon(0)); |
1529 return true; |
1420 return true; |
1530 } |
1421 } |
1531 |
1422 |
1532 // Generate default indexOf |
1423 // Generate default indexOf |
1533 jchar lastChar = pat->char_at(o + (c - 1)); |
1424 jchar lastChar = pat->char_at(o + (c - 1)); |
1546 } |
1437 } |
1547 } |
1438 } |
1548 |
1439 |
1549 result = string_indexOf(receiver, pat, o, cache, md2); |
1440 result = string_indexOf(receiver, pat, o, cache, md2); |
1550 } |
1441 } |
1551 |
1442 set_result(result); |
1552 push(result); |
|
1553 return true; |
1443 return true; |
1554 } |
1444 } |
1555 |
1445 |
1556 //--------------------------pop_math_arg-------------------------------- |
1446 //--------------------------round_double_node-------------------------------- |
1557 // Pop a double argument to a math function from the stack |
1447 // Round a double node if necessary. |
1558 // rounding it if necessary. |
1448 Node* LibraryCallKit::round_double_node(Node* n) { |
1559 Node * LibraryCallKit::pop_math_arg() { |
1449 if (Matcher::strict_fp_requires_explicit_rounding && UseSSE <= 1) |
1560 Node *arg = pop_pair(); |
1450 n = _gvn.transform(new (C) RoundDoubleNode(0, n)); |
1561 if( Matcher::strict_fp_requires_explicit_rounding && UseSSE<=1 ) |
1451 return n; |
1562 arg = _gvn.transform( new (C) RoundDoubleNode(0, arg) ); |
1452 } |
1563 return arg; |
1453 |
1454 //------------------------------inline_math----------------------------------- |
|
1455 // public static double Math.abs(double) |
|
1456 // public static double Math.sqrt(double) |
|
1457 // public static double Math.log(double) |
|
1458 // public static double Math.log10(double) |
|
1459 bool LibraryCallKit::inline_math(vmIntrinsics::ID id) { |
|
1460 Node* arg = round_double_node(argument(0)); |
|
1461 Node* n; |
|
1462 switch (id) { |
|
1463 case vmIntrinsics::_dabs: n = new (C) AbsDNode( arg); break; |
|
1464 case vmIntrinsics::_dsqrt: n = new (C) SqrtDNode(0, arg); break; |
|
1465 case vmIntrinsics::_dlog: n = new (C) LogDNode( arg); break; |
|
1466 case vmIntrinsics::_dlog10: n = new (C) Log10DNode( arg); break; |
|
1467 default: fatal_unexpected_iid(id); break; |
|
1468 } |
|
1469 set_result(_gvn.transform(n)); |
|
1470 return true; |
|
1564 } |
1471 } |
1565 |
1472 |
1566 //------------------------------inline_trig---------------------------------- |
1473 //------------------------------inline_trig---------------------------------- |
1567 // Inline sin/cos/tan instructions, if possible. If rounding is required, do |
1474 // Inline sin/cos/tan instructions, if possible. If rounding is required, do |
1568 // argument reduction which will turn into a fast/slow diamond. |
1475 // argument reduction which will turn into a fast/slow diamond. |
1569 bool LibraryCallKit::inline_trig(vmIntrinsics::ID id) { |
1476 bool LibraryCallKit::inline_trig(vmIntrinsics::ID id) { |
1570 _sp += arg_size(); // restore stack pointer |
1477 Node* arg = round_double_node(argument(0)); |
1571 Node* arg = pop_math_arg(); |
1478 Node* n = NULL; |
1572 Node* trig = NULL; |
|
1573 |
1479 |
1574 switch (id) { |
1480 switch (id) { |
1575 case vmIntrinsics::_dsin: |
1481 case vmIntrinsics::_dsin: n = new (C) SinDNode(arg); break; |
1576 trig = _gvn.transform((Node*)new (C) SinDNode(arg)); |
1482 case vmIntrinsics::_dcos: n = new (C) CosDNode(arg); break; |
1577 break; |
1483 case vmIntrinsics::_dtan: n = new (C) TanDNode(arg); break; |
1578 case vmIntrinsics::_dcos: |
1484 default: fatal_unexpected_iid(id); break; |
1579 trig = _gvn.transform((Node*)new (C) CosDNode(arg)); |
1485 } |
1580 break; |
1486 n = _gvn.transform(n); |
1581 case vmIntrinsics::_dtan: |
|
1582 trig = _gvn.transform((Node*)new (C) TanDNode(arg)); |
|
1583 break; |
|
1584 default: |
|
1585 assert(false, "bad intrinsic was passed in"); |
|
1586 return false; |
|
1587 } |
|
1588 |
1487 |
1589 // Rounding required? Check for argument reduction! |
1488 // Rounding required? Check for argument reduction! |
1590 if( Matcher::strict_fp_requires_explicit_rounding ) { |
1489 if (Matcher::strict_fp_requires_explicit_rounding) { |
1591 |
|
1592 static const double pi_4 = 0.7853981633974483; |
1490 static const double pi_4 = 0.7853981633974483; |
1593 static const double neg_pi_4 = -0.7853981633974483; |
1491 static const double neg_pi_4 = -0.7853981633974483; |
1594 // pi/2 in 80-bit extended precision |
1492 // pi/2 in 80-bit extended precision |
1595 // static const unsigned char pi_2_bits_x[] = {0x35,0xc2,0x68,0x21,0xa2,0xda,0x0f,0xc9,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00}; |
1493 // static const unsigned char pi_2_bits_x[] = {0x35,0xc2,0x68,0x21,0xa2,0xda,0x0f,0xc9,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00}; |
1596 // -pi/2 in 80-bit extended precision |
1494 // -pi/2 in 80-bit extended precision |
1621 // requires a special machine instruction to load it. Instead we'll try |
1519 // requires a special machine instruction to load it. Instead we'll try |
1622 // the 'easy' case. If we really need the extra range +/- PI/2 we'll |
1520 // the 'easy' case. If we really need the extra range +/- PI/2 we'll |
1623 // probably do the math inside the SIN encoding. |
1521 // probably do the math inside the SIN encoding. |
1624 |
1522 |
1625 // Make the merge point |
1523 // Make the merge point |
1626 RegionNode *r = new (C) RegionNode(3); |
1524 RegionNode* r = new (C) RegionNode(3); |
1627 Node *phi = new (C) PhiNode(r,Type::DOUBLE); |
1525 Node* phi = new (C) PhiNode(r, Type::DOUBLE); |
1628 |
1526 |
1629 // Flatten arg so we need only 1 test |
1527 // Flatten arg so we need only 1 test |
1630 Node *abs = _gvn.transform(new (C) AbsDNode(arg)); |
1528 Node *abs = _gvn.transform(new (C) AbsDNode(arg)); |
1631 // Node for PI/4 constant |
1529 // Node for PI/4 constant |
1632 Node *pi4 = makecon(TypeD::make(pi_4)); |
1530 Node *pi4 = makecon(TypeD::make(pi_4)); |
1637 // Branch either way |
1535 // Branch either way |
1638 IfNode *iff = create_and_xform_if(control(),bol, PROB_STATIC_FREQUENT, COUNT_UNKNOWN); |
1536 IfNode *iff = create_and_xform_if(control(),bol, PROB_STATIC_FREQUENT, COUNT_UNKNOWN); |
1639 set_control(opt_iff(r,iff)); |
1537 set_control(opt_iff(r,iff)); |
1640 |
1538 |
1641 // Set fast path result |
1539 // Set fast path result |
1642 phi->init_req(2,trig); |
1540 phi->init_req(2, n); |
1643 |
1541 |
1644 // Slow path - non-blocking leaf call |
1542 // Slow path - non-blocking leaf call |
1645 Node* call = NULL; |
1543 Node* call = NULL; |
1646 switch (id) { |
1544 switch (id) { |
1647 case vmIntrinsics::_dsin: |
1545 case vmIntrinsics::_dsin: |
1659 CAST_FROM_FN_PTR(address, SharedRuntime::dtan), |
1557 CAST_FROM_FN_PTR(address, SharedRuntime::dtan), |
1660 "Tan", NULL, arg, top()); |
1558 "Tan", NULL, arg, top()); |
1661 break; |
1559 break; |
1662 } |
1560 } |
1663 assert(control()->in(0) == call, ""); |
1561 assert(control()->in(0) == call, ""); |
1664 Node* slow_result = _gvn.transform(new (C) ProjNode(call,TypeFunc::Parms)); |
1562 Node* slow_result = _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms)); |
1665 r->init_req(1,control()); |
1563 r->init_req(1, control()); |
1666 phi->init_req(1,slow_result); |
1564 phi->init_req(1, slow_result); |
1667 |
1565 |
1668 // Post-merge |
1566 // Post-merge |
1669 set_control(_gvn.transform(r)); |
1567 set_control(_gvn.transform(r)); |
1670 record_for_igvn(r); |
1568 record_for_igvn(r); |
1671 trig = _gvn.transform(phi); |
1569 n = _gvn.transform(phi); |
1672 |
1570 |
1673 C->set_has_split_ifs(true); // Has chance for split-if optimization |
1571 C->set_has_split_ifs(true); // Has chance for split-if optimization |
1674 } |
1572 } |
1675 // Push result back on JVM stack |
1573 set_result(n); |
1676 push_pair(trig); |
|
1677 return true; |
|
1678 } |
|
1679 |
|
1680 //------------------------------inline_sqrt------------------------------------- |
|
1681 // Inline square root instruction, if possible. |
|
1682 bool LibraryCallKit::inline_sqrt(vmIntrinsics::ID id) { |
|
1683 assert(id == vmIntrinsics::_dsqrt, "Not square root"); |
|
1684 _sp += arg_size(); // restore stack pointer |
|
1685 push_pair(_gvn.transform(new (C) SqrtDNode(0, pop_math_arg()))); |
|
1686 return true; |
|
1687 } |
|
1688 |
|
1689 //------------------------------inline_abs------------------------------------- |
|
1690 // Inline absolute value instruction, if possible. |
|
1691 bool LibraryCallKit::inline_abs(vmIntrinsics::ID id) { |
|
1692 assert(id == vmIntrinsics::_dabs, "Not absolute value"); |
|
1693 _sp += arg_size(); // restore stack pointer |
|
1694 push_pair(_gvn.transform(new (C) AbsDNode(pop_math_arg()))); |
|
1695 return true; |
1574 return true; |
1696 } |
1575 } |
1697 |
1576 |
1698 void LibraryCallKit::finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName) { |
1577 void LibraryCallKit::finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName) { |
1699 //------------------- |
1578 //------------------- |
1700 //result=(result.isNaN())? funcAddr():result; |
1579 //result=(result.isNaN())? funcAddr():result; |
1701 // Check: If isNaN() by checking result!=result? then either trap |
1580 // Check: If isNaN() by checking result!=result? then either trap |
1702 // or go to runtime |
1581 // or go to runtime |
1703 Node* cmpisnan = _gvn.transform(new (C) CmpDNode(result,result)); |
1582 Node* cmpisnan = _gvn.transform(new (C) CmpDNode(result, result)); |
1704 // Build the boolean node |
1583 // Build the boolean node |
1705 Node* bolisnum = _gvn.transform( new (C) BoolNode(cmpisnan, BoolTest::eq) ); |
1584 Node* bolisnum = _gvn.transform(new (C) BoolNode(cmpisnan, BoolTest::eq)); |
1706 |
1585 |
1707 if (!too_many_traps(Deoptimization::Reason_intrinsic)) { |
1586 if (!too_many_traps(Deoptimization::Reason_intrinsic)) { |
1708 { |
1587 { BuildCutout unless(this, bolisnum, PROB_STATIC_FREQUENT); |
1709 BuildCutout unless(this, bolisnum, PROB_STATIC_FREQUENT); |
|
1710 // End the current control-flow path |
|
1711 push_pair(x); |
|
1712 if (y != NULL) { |
|
1713 push_pair(y); |
|
1714 } |
|
1715 // The pow or exp intrinsic returned a NaN, which requires a call |
1588 // The pow or exp intrinsic returned a NaN, which requires a call |
1716 // to the runtime. Recompile with the runtime call. |
1589 // to the runtime. Recompile with the runtime call. |
1717 uncommon_trap(Deoptimization::Reason_intrinsic, |
1590 uncommon_trap(Deoptimization::Reason_intrinsic, |
1718 Deoptimization::Action_make_not_entrant); |
1591 Deoptimization::Action_make_not_entrant); |
1719 } |
1592 } |
1720 push_pair(result); |
1593 set_result(result); |
1721 } else { |
1594 } else { |
1722 // If this inlining ever returned NaN in the past, we compile a call |
1595 // If this inlining ever returned NaN in the past, we compile a call |
1723 // to the runtime to properly handle corner cases |
1596 // to the runtime to properly handle corner cases |
1724 |
1597 |
1725 IfNode* iff = create_and_xform_if(control(), bolisnum, PROB_STATIC_FREQUENT, COUNT_UNKNOWN); |
1598 IfNode* iff = create_and_xform_if(control(), bolisnum, PROB_STATIC_FREQUENT, COUNT_UNKNOWN); |
1726 Node* if_slow = _gvn.transform( new (C) IfFalseNode(iff) ); |
1599 Node* if_slow = _gvn.transform( new (C) IfFalseNode(iff) ); |
1727 Node* if_fast = _gvn.transform( new (C) IfTrueNode(iff) ); |
1600 Node* if_fast = _gvn.transform( new (C) IfTrueNode(iff) ); |
1728 |
1601 |
1729 if (!if_slow->is_top()) { |
1602 if (!if_slow->is_top()) { |
1730 RegionNode* result_region = new(C) RegionNode(3); |
1603 RegionNode* result_region = new (C) RegionNode(3); |
1731 PhiNode* result_val = new (C) PhiNode(result_region, Type::DOUBLE); |
1604 PhiNode* result_val = new (C) PhiNode(result_region, Type::DOUBLE); |
1732 |
1605 |
1733 result_region->init_req(1, if_fast); |
1606 result_region->init_req(1, if_fast); |
1734 result_val->init_req(1, result); |
1607 result_val->init_req(1, result); |
1735 |
1608 |
1745 assert(value_top == top(), "second value must be top"); |
1618 assert(value_top == top(), "second value must be top"); |
1746 #endif |
1619 #endif |
1747 |
1620 |
1748 result_region->init_req(2, control()); |
1621 result_region->init_req(2, control()); |
1749 result_val->init_req(2, value); |
1622 result_val->init_req(2, value); |
1750 push_result(result_region, result_val); |
1623 set_result(result_region, result_val); |
1751 } else { |
1624 } else { |
1752 push_pair(result); |
1625 set_result(result); |
1753 } |
1626 } |
1754 } |
1627 } |
1755 } |
1628 } |
1756 |
1629 |
1757 //------------------------------inline_exp------------------------------------- |
1630 //------------------------------inline_exp------------------------------------- |
1758 // Inline exp instructions, if possible. The Intel hardware only misses |
1631 // Inline exp instructions, if possible. The Intel hardware only misses |
1759 // really odd corner cases (+/- Infinity). Just uncommon-trap them. |
1632 // really odd corner cases (+/- Infinity). Just uncommon-trap them. |
1760 bool LibraryCallKit::inline_exp(vmIntrinsics::ID id) { |
1633 bool LibraryCallKit::inline_exp() { |
1761 assert(id == vmIntrinsics::_dexp, "Not exp"); |
1634 Node* arg = round_double_node(argument(0)); |
1762 |
1635 Node* n = _gvn.transform(new (C) ExpDNode(0, arg)); |
1763 _sp += arg_size(); // restore stack pointer |
1636 |
1764 Node *x = pop_math_arg(); |
1637 finish_pow_exp(n, arg, NULL, OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP"); |
1765 Node *result = _gvn.transform(new (C) ExpDNode(0,x)); |
|
1766 |
|
1767 finish_pow_exp(result, x, NULL, OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP"); |
|
1768 |
1638 |
1769 C->set_has_split_ifs(true); // Has chance for split-if optimization |
1639 C->set_has_split_ifs(true); // Has chance for split-if optimization |
1770 |
|
1771 return true; |
1640 return true; |
1772 } |
1641 } |
1773 |
1642 |
1774 //------------------------------inline_pow------------------------------------- |
1643 //------------------------------inline_pow------------------------------------- |
1775 // Inline power instructions, if possible. |
1644 // Inline power instructions, if possible. |
1776 bool LibraryCallKit::inline_pow(vmIntrinsics::ID id) { |
1645 bool LibraryCallKit::inline_pow() { |
1777 assert(id == vmIntrinsics::_dpow, "Not pow"); |
|
1778 |
|
1779 // Pseudocode for pow |
1646 // Pseudocode for pow |
1780 // if (x <= 0.0) { |
1647 // if (x <= 0.0) { |
1781 // long longy = (long)y; |
1648 // long longy = (long)y; |
1782 // if ((double)longy == y) { // if y is long |
1649 // if ((double)longy == y) { // if y is long |
1783 // if (y + 1 == y) longy = 0; // huge number: even |
1650 // if (y + 1 == y) longy = 0; // huge number: even |
1791 // if (result != result)? { |
1658 // if (result != result)? { |
1792 // result = uncommon_trap() or runtime_call(); |
1659 // result = uncommon_trap() or runtime_call(); |
1793 // } |
1660 // } |
1794 // return result; |
1661 // return result; |
1795 |
1662 |
1796 _sp += arg_size(); // restore stack pointer |
1663 Node* x = round_double_node(argument(0)); |
1797 Node* y = pop_math_arg(); |
1664 Node* y = round_double_node(argument(2)); |
1798 Node* x = pop_math_arg(); |
|
1799 |
1665 |
1800 Node* result = NULL; |
1666 Node* result = NULL; |
1801 |
1667 |
1802 if (!too_many_traps(Deoptimization::Reason_intrinsic)) { |
1668 if (!too_many_traps(Deoptimization::Reason_intrinsic)) { |
1803 // Short form: skip the fancy tests and just check for NaN result. |
1669 // Short form: skip the fancy tests and just check for NaN result. |
1804 result = _gvn.transform( new (C) PowDNode(0, x, y) ); |
1670 result = _gvn.transform(new (C) PowDNode(0, x, y)); |
1805 } else { |
1671 } else { |
1806 // If this inlining ever returned NaN in the past, include all |
1672 // If this inlining ever returned NaN in the past, include all |
1807 // checks + call to the runtime. |
1673 // checks + call to the runtime. |
1808 |
1674 |
1809 // Set the merge point for If node with condition of (x <= 0.0) |
1675 // Set the merge point for If node with condition of (x <= 0.0) |
1917 phi->init_req(1,slow_result); |
1783 phi->init_req(1,slow_result); |
1918 |
1784 |
1919 // Post merge |
1785 // Post merge |
1920 set_control(_gvn.transform(r)); |
1786 set_control(_gvn.transform(r)); |
1921 record_for_igvn(r); |
1787 record_for_igvn(r); |
1922 result=_gvn.transform(phi); |
1788 result = _gvn.transform(phi); |
1923 } |
1789 } |
1924 |
1790 |
1925 finish_pow_exp(result, x, y, OptoRuntime::Math_DD_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dpow), "POW"); |
1791 finish_pow_exp(result, x, y, OptoRuntime::Math_DD_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dpow), "POW"); |
1926 |
1792 |
1927 C->set_has_split_ifs(true); // Has chance for split-if optimization |
1793 C->set_has_split_ifs(true); // Has chance for split-if optimization |
1928 |
|
1929 return true; |
|
1930 } |
|
1931 |
|
1932 //------------------------------inline_trans------------------------------------- |
|
1933 // Inline transcendental instructions, if possible. The Intel hardware gets |
|
1934 // these right, no funny corner cases missed. |
|
1935 bool LibraryCallKit::inline_trans(vmIntrinsics::ID id) { |
|
1936 _sp += arg_size(); // restore stack pointer |
|
1937 Node* arg = pop_math_arg(); |
|
1938 Node* trans = NULL; |
|
1939 |
|
1940 switch (id) { |
|
1941 case vmIntrinsics::_dlog: |
|
1942 trans = _gvn.transform((Node*)new (C) LogDNode(arg)); |
|
1943 break; |
|
1944 case vmIntrinsics::_dlog10: |
|
1945 trans = _gvn.transform((Node*)new (C) Log10DNode(arg)); |
|
1946 break; |
|
1947 default: |
|
1948 assert(false, "bad intrinsic was passed in"); |
|
1949 return false; |
|
1950 } |
|
1951 |
|
1952 // Push result back on JVM stack |
|
1953 push_pair(trans); |
|
1954 return true; |
1794 return true; |
1955 } |
1795 } |
1956 |
1796 |
1957 //------------------------------runtime_math----------------------------- |
1797 //------------------------------runtime_math----------------------------- |
1958 bool LibraryCallKit::runtime_math(const TypeFunc* call_type, address funcAddr, const char* funcName) { |
1798 bool LibraryCallKit::runtime_math(const TypeFunc* call_type, address funcAddr, const char* funcName) { |
1959 Node* a = NULL; |
|
1960 Node* b = NULL; |
|
1961 |
|
1962 assert(call_type == OptoRuntime::Math_DD_D_Type() || call_type == OptoRuntime::Math_D_D_Type(), |
1799 assert(call_type == OptoRuntime::Math_DD_D_Type() || call_type == OptoRuntime::Math_D_D_Type(), |
1963 "must be (DD)D or (D)D type"); |
1800 "must be (DD)D or (D)D type"); |
1964 |
1801 |
1965 // Inputs |
1802 // Inputs |
1966 _sp += arg_size(); // restore stack pointer |
1803 Node* a = round_double_node(argument(0)); |
1967 if (call_type == OptoRuntime::Math_DD_D_Type()) { |
1804 Node* b = (call_type == OptoRuntime::Math_DD_D_Type()) ? round_double_node(argument(2)) : NULL; |
1968 b = pop_math_arg(); |
|
1969 } |
|
1970 a = pop_math_arg(); |
|
1971 |
1805 |
1972 const TypePtr* no_memory_effects = NULL; |
1806 const TypePtr* no_memory_effects = NULL; |
1973 Node* trig = make_runtime_call(RC_LEAF, call_type, funcAddr, funcName, |
1807 Node* trig = make_runtime_call(RC_LEAF, call_type, funcAddr, funcName, |
1974 no_memory_effects, |
1808 no_memory_effects, |
1975 a, top(), b, b ? top() : NULL); |
1809 a, top(), b, b ? top() : NULL); |
1977 #ifdef ASSERT |
1811 #ifdef ASSERT |
1978 Node* value_top = _gvn.transform(new (C) ProjNode(trig, TypeFunc::Parms+1)); |
1812 Node* value_top = _gvn.transform(new (C) ProjNode(trig, TypeFunc::Parms+1)); |
1979 assert(value_top == top(), "second value must be top"); |
1813 assert(value_top == top(), "second value must be top"); |
1980 #endif |
1814 #endif |
1981 |
1815 |
1982 push_pair(value); |
1816 set_result(value); |
1983 return true; |
1817 return true; |
1984 } |
1818 } |
1985 |
1819 |
1986 //------------------------------inline_math_native----------------------------- |
1820 //------------------------------inline_math_native----------------------------- |
1987 bool LibraryCallKit::inline_math_native(vmIntrinsics::ID id) { |
1821 bool LibraryCallKit::inline_math_native(vmIntrinsics::ID id) { |
1822 #define FN_PTR(f) CAST_FROM_FN_PTR(address, f) |
|
1988 switch (id) { |
1823 switch (id) { |
1989 // These intrinsics are not properly supported on all hardware |
1824 // These intrinsics are not properly supported on all hardware |
1990 case vmIntrinsics::_dcos: return Matcher::has_match_rule(Op_CosD) ? inline_trig(id) : |
1825 case vmIntrinsics::_dcos: return Matcher::has_match_rule(Op_CosD) ? inline_trig(id) : |
1991 runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dcos), "COS"); |
1826 runtime_math(OptoRuntime::Math_D_D_Type(), FN_PTR(SharedRuntime::dcos), "COS"); |
1992 case vmIntrinsics::_dsin: return Matcher::has_match_rule(Op_SinD) ? inline_trig(id) : |
1827 case vmIntrinsics::_dsin: return Matcher::has_match_rule(Op_SinD) ? inline_trig(id) : |
1993 runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dsin), "SIN"); |
1828 runtime_math(OptoRuntime::Math_D_D_Type(), FN_PTR(SharedRuntime::dsin), "SIN"); |
1994 case vmIntrinsics::_dtan: return Matcher::has_match_rule(Op_TanD) ? inline_trig(id) : |
1829 case vmIntrinsics::_dtan: return Matcher::has_match_rule(Op_TanD) ? inline_trig(id) : |
1995 runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dtan), "TAN"); |
1830 runtime_math(OptoRuntime::Math_D_D_Type(), FN_PTR(SharedRuntime::dtan), "TAN"); |
1996 |
1831 |
1997 case vmIntrinsics::_dlog: return Matcher::has_match_rule(Op_LogD) ? inline_trans(id) : |
1832 case vmIntrinsics::_dlog: return Matcher::has_match_rule(Op_LogD) ? inline_math(id) : |
1998 runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dlog), "LOG"); |
1833 runtime_math(OptoRuntime::Math_D_D_Type(), FN_PTR(SharedRuntime::dlog), "LOG"); |
1999 case vmIntrinsics::_dlog10: return Matcher::has_match_rule(Op_Log10D) ? inline_trans(id) : |
1834 case vmIntrinsics::_dlog10: return Matcher::has_match_rule(Op_Log10D) ? inline_math(id) : |
2000 runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dlog10), "LOG10"); |
1835 runtime_math(OptoRuntime::Math_D_D_Type(), FN_PTR(SharedRuntime::dlog10), "LOG10"); |
2001 |
1836 |
2002 // These intrinsics are supported on all hardware |
1837 // These intrinsics are supported on all hardware |
2003 case vmIntrinsics::_dsqrt: return Matcher::has_match_rule(Op_SqrtD) ? inline_sqrt(id) : false; |
1838 case vmIntrinsics::_dsqrt: return Matcher::has_match_rule(Op_SqrtD) ? inline_math(id) : false; |
2004 case vmIntrinsics::_dabs: return Matcher::has_match_rule(Op_AbsD) ? inline_abs(id) : false; |
1839 case vmIntrinsics::_dabs: return Matcher::has_match_rule(Op_AbsD) ? inline_math(id) : false; |
2005 |
1840 |
2006 case vmIntrinsics::_dexp: return |
1841 case vmIntrinsics::_dexp: return Matcher::has_match_rule(Op_ExpD) ? inline_exp() : |
2007 Matcher::has_match_rule(Op_ExpD) ? inline_exp(id) : |
1842 runtime_math(OptoRuntime::Math_D_D_Type(), FN_PTR(SharedRuntime::dexp), "EXP"); |
2008 runtime_math(OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP"); |
1843 case vmIntrinsics::_dpow: return Matcher::has_match_rule(Op_PowD) ? inline_pow() : |
2009 case vmIntrinsics::_dpow: return |
1844 runtime_math(OptoRuntime::Math_DD_D_Type(), FN_PTR(SharedRuntime::dpow), "POW"); |
2010 Matcher::has_match_rule(Op_PowD) ? inline_pow(id) : |
1845 #undef FN_PTR |
2011 runtime_math(OptoRuntime::Math_DD_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dpow), "POW"); |
|
2012 |
1846 |
2013 // These intrinsics are not yet correctly implemented |
1847 // These intrinsics are not yet correctly implemented |
2014 case vmIntrinsics::_datan2: |
1848 case vmIntrinsics::_datan2: |
2015 return false; |
1849 return false; |
2016 |
1850 |
2017 default: |
1851 default: |
2018 ShouldNotReachHere(); |
1852 fatal_unexpected_iid(id); |
2019 return false; |
1853 return false; |
2020 } |
1854 } |
2021 } |
1855 } |
2022 |
1856 |
2023 static bool is_simple_name(Node* n) { |
1857 static bool is_simple_name(Node* n) { |
2028 ); |
1862 ); |
2029 } |
1863 } |
2030 |
1864 |
2031 //----------------------------inline_min_max----------------------------------- |
1865 //----------------------------inline_min_max----------------------------------- |
2032 bool LibraryCallKit::inline_min_max(vmIntrinsics::ID id) { |
1866 bool LibraryCallKit::inline_min_max(vmIntrinsics::ID id) { |
2033 push(generate_min_max(id, argument(0), argument(1))); |
1867 set_result(generate_min_max(id, argument(0), argument(1))); |
2034 |
|
2035 return true; |
1868 return true; |
2036 } |
1869 } |
2037 |
1870 |
2038 Node* |
1871 Node* |
2039 LibraryCallKit::generate_min_max(vmIntrinsics::ID id, Node* x0, Node* y0) { |
1872 LibraryCallKit::generate_min_max(vmIntrinsics::ID id, Node* x0, Node* y0) { |
2252 } else { |
2085 } else { |
2253 return basic_plus_adr(base, offset); |
2086 return basic_plus_adr(base, offset); |
2254 } |
2087 } |
2255 } |
2088 } |
2256 |
2089 |
2257 //-------------------inline_numberOfLeadingZeros_int/long----------------------- |
2090 //--------------------------inline_number_methods----------------------------- |
2258 // inline int Integer.numberOfLeadingZeros(int) |
2091 // inline int Integer.numberOfLeadingZeros(int) |
2259 // inline int Long.numberOfLeadingZeros(long) |
2092 // inline int Long.numberOfLeadingZeros(long) |
2260 bool LibraryCallKit::inline_numberOfLeadingZeros(vmIntrinsics::ID id) { |
2093 // |
2261 assert(id == vmIntrinsics::_numberOfLeadingZeros_i || id == vmIntrinsics::_numberOfLeadingZeros_l, "not numberOfLeadingZeros"); |
2094 // inline int Integer.numberOfTrailingZeros(int) |
2262 if (id == vmIntrinsics::_numberOfLeadingZeros_i && !Matcher::match_rule_supported(Op_CountLeadingZerosI)) return false; |
2095 // inline int Long.numberOfTrailingZeros(long) |
2263 if (id == vmIntrinsics::_numberOfLeadingZeros_l && !Matcher::match_rule_supported(Op_CountLeadingZerosL)) return false; |
2096 // |
2264 _sp += arg_size(); // restore stack pointer |
2097 // inline int Integer.bitCount(int) |
2098 // inline int Long.bitCount(long) |
|
2099 // |
|
2100 // inline char Character.reverseBytes(char) |
|
2101 // inline short Short.reverseBytes(short) |
|
2102 // inline int Integer.reverseBytes(int) |
|
2103 // inline long Long.reverseBytes(long) |
|
2104 bool LibraryCallKit::inline_number_methods(vmIntrinsics::ID id) { |
|
2105 Node* arg = argument(0); |
|
2106 Node* n; |
|
2265 switch (id) { |
2107 switch (id) { |
2266 case vmIntrinsics::_numberOfLeadingZeros_i: |
2108 case vmIntrinsics::_numberOfLeadingZeros_i: n = new (C) CountLeadingZerosINode( arg); break; |
2267 push(_gvn.transform(new (C) CountLeadingZerosINode(pop()))); |
2109 case vmIntrinsics::_numberOfLeadingZeros_l: n = new (C) CountLeadingZerosLNode( arg); break; |
2268 break; |
2110 case vmIntrinsics::_numberOfTrailingZeros_i: n = new (C) CountTrailingZerosINode(arg); break; |
2269 case vmIntrinsics::_numberOfLeadingZeros_l: |
2111 case vmIntrinsics::_numberOfTrailingZeros_l: n = new (C) CountTrailingZerosLNode(arg); break; |
2270 push(_gvn.transform(new (C) CountLeadingZerosLNode(pop_pair()))); |
2112 case vmIntrinsics::_bitCount_i: n = new (C) PopCountINode( arg); break; |
2271 break; |
2113 case vmIntrinsics::_bitCount_l: n = new (C) PopCountLNode( arg); break; |
2272 default: |
2114 case vmIntrinsics::_reverseBytes_c: n = new (C) ReverseBytesUSNode(0, arg); break; |
2273 ShouldNotReachHere(); |
2115 case vmIntrinsics::_reverseBytes_s: n = new (C) ReverseBytesSNode( 0, arg); break; |
2274 } |
2116 case vmIntrinsics::_reverseBytes_i: n = new (C) ReverseBytesINode( 0, arg); break; |
2275 return true; |
2117 case vmIntrinsics::_reverseBytes_l: n = new (C) ReverseBytesLNode( 0, arg); break; |
2276 } |
2118 default: fatal_unexpected_iid(id); break; |
2277 |
2119 } |
2278 //-------------------inline_numberOfTrailingZeros_int/long---------------------- |
2120 set_result(_gvn.transform(n)); |
2279 // inline int Integer.numberOfTrailingZeros(int) |
|
2280 // inline int Long.numberOfTrailingZeros(long) |
|
2281 bool LibraryCallKit::inline_numberOfTrailingZeros(vmIntrinsics::ID id) { |
|
2282 assert(id == vmIntrinsics::_numberOfTrailingZeros_i || id == vmIntrinsics::_numberOfTrailingZeros_l, "not numberOfTrailingZeros"); |
|
2283 if (id == vmIntrinsics::_numberOfTrailingZeros_i && !Matcher::match_rule_supported(Op_CountTrailingZerosI)) return false; |
|
2284 if (id == vmIntrinsics::_numberOfTrailingZeros_l && !Matcher::match_rule_supported(Op_CountTrailingZerosL)) return false; |
|
2285 _sp += arg_size(); // restore stack pointer |
|
2286 switch (id) { |
|
2287 case vmIntrinsics::_numberOfTrailingZeros_i: |
|
2288 push(_gvn.transform(new (C) CountTrailingZerosINode(pop()))); |
|
2289 break; |
|
2290 case vmIntrinsics::_numberOfTrailingZeros_l: |
|
2291 push(_gvn.transform(new (C) CountTrailingZerosLNode(pop_pair()))); |
|
2292 break; |
|
2293 default: |
|
2294 ShouldNotReachHere(); |
|
2295 } |
|
2296 return true; |
|
2297 } |
|
2298 |
|
2299 //----------------------------inline_bitCount_int/long----------------------- |
|
2300 // inline int Integer.bitCount(int) |
|
2301 // inline int Long.bitCount(long) |
|
2302 bool LibraryCallKit::inline_bitCount(vmIntrinsics::ID id) { |
|
2303 assert(id == vmIntrinsics::_bitCount_i || id == vmIntrinsics::_bitCount_l, "not bitCount"); |
|
2304 if (id == vmIntrinsics::_bitCount_i && !Matcher::has_match_rule(Op_PopCountI)) return false; |
|
2305 if (id == vmIntrinsics::_bitCount_l && !Matcher::has_match_rule(Op_PopCountL)) return false; |
|
2306 _sp += arg_size(); // restore stack pointer |
|
2307 switch (id) { |
|
2308 case vmIntrinsics::_bitCount_i: |
|
2309 push(_gvn.transform(new (C) PopCountINode(pop()))); |
|
2310 break; |
|
2311 case vmIntrinsics::_bitCount_l: |
|
2312 push(_gvn.transform(new (C) PopCountLNode(pop_pair()))); |
|
2313 break; |
|
2314 default: |
|
2315 ShouldNotReachHere(); |
|
2316 } |
|
2317 return true; |
|
2318 } |
|
2319 |
|
2320 //----------------------------inline_reverseBytes_int/long/char/short------------------- |
|
2321 // inline Integer.reverseBytes(int) |
|
2322 // inline Long.reverseBytes(long) |
|
2323 // inline Character.reverseBytes(char) |
|
2324 // inline Short.reverseBytes(short) |
|
2325 bool LibraryCallKit::inline_reverseBytes(vmIntrinsics::ID id) { |
|
2326 assert(id == vmIntrinsics::_reverseBytes_i || id == vmIntrinsics::_reverseBytes_l || |
|
2327 id == vmIntrinsics::_reverseBytes_c || id == vmIntrinsics::_reverseBytes_s, |
|
2328 "not reverse Bytes"); |
|
2329 if (id == vmIntrinsics::_reverseBytes_i && !Matcher::has_match_rule(Op_ReverseBytesI)) return false; |
|
2330 if (id == vmIntrinsics::_reverseBytes_l && !Matcher::has_match_rule(Op_ReverseBytesL)) return false; |
|
2331 if (id == vmIntrinsics::_reverseBytes_c && !Matcher::has_match_rule(Op_ReverseBytesUS)) return false; |
|
2332 if (id == vmIntrinsics::_reverseBytes_s && !Matcher::has_match_rule(Op_ReverseBytesS)) return false; |
|
2333 _sp += arg_size(); // restore stack pointer |
|
2334 switch (id) { |
|
2335 case vmIntrinsics::_reverseBytes_i: |
|
2336 push(_gvn.transform(new (C) ReverseBytesINode(0, pop()))); |
|
2337 break; |
|
2338 case vmIntrinsics::_reverseBytes_l: |
|
2339 push_pair(_gvn.transform(new (C) ReverseBytesLNode(0, pop_pair()))); |
|
2340 break; |
|
2341 case vmIntrinsics::_reverseBytes_c: |
|
2342 push(_gvn.transform(new (C) ReverseBytesUSNode(0, pop()))); |
|
2343 break; |
|
2344 case vmIntrinsics::_reverseBytes_s: |
|
2345 push(_gvn.transform(new (C) ReverseBytesSNode(0, pop()))); |
|
2346 break; |
|
2347 default: |
|
2348 ; |
|
2349 } |
|
2350 return true; |
2121 return true; |
2351 } |
2122 } |
2352 |
2123 |
2353 //----------------------------inline_unsafe_access---------------------------- |
2124 //----------------------------inline_unsafe_access---------------------------- |
2354 |
2125 |
2355 const static BasicType T_ADDRESS_HOLDER = T_LONG; |
2126 const static BasicType T_ADDRESS_HOLDER = T_LONG; |
2356 |
2127 |
2357 // Helper that guards and inserts a pre-barrier. |
2128 // Helper that guards and inserts a pre-barrier. |
2358 void LibraryCallKit::insert_pre_barrier(Node* base_oop, Node* offset, |
2129 void LibraryCallKit::insert_pre_barrier(Node* base_oop, Node* offset, |
2359 Node* pre_val, int nargs, bool need_mem_bar) { |
2130 Node* pre_val, bool need_mem_bar) { |
2360 // We could be accessing the referent field of a reference object. If so, when G1 |
2131 // We could be accessing the referent field of a reference object. If so, when G1 |
2361 // is enabled, we need to log the value in the referent field in an SATB buffer. |
2132 // is enabled, we need to log the value in the referent field in an SATB buffer. |
2362 // This routine performs some compile time filters and generates suitable |
2133 // This routine performs some compile time filters and generates suitable |
2363 // runtime filters that guard the pre-barrier code. |
2134 // runtime filters that guard the pre-barrier code. |
2364 // Also add memory barrier for non volatile load from the referent field |
2135 // Also add memory barrier for non volatile load from the referent field |
2404 // if (instance_of(base, java.lang.ref.Reference)) { |
2175 // if (instance_of(base, java.lang.ref.Reference)) { |
2405 // pre_barrier(_, pre_val, ...); |
2176 // pre_barrier(_, pre_val, ...); |
2406 // } |
2177 // } |
2407 // } |
2178 // } |
2408 |
2179 |
2409 float likely = PROB_LIKELY(0.999); |
2180 float likely = PROB_LIKELY( 0.999); |
2410 float unlikely = PROB_UNLIKELY(0.999); |
2181 float unlikely = PROB_UNLIKELY(0.999); |
2411 |
2182 |
2412 IdealKit ideal(this); |
2183 IdealKit ideal(this); |
2413 #define __ ideal. |
2184 #define __ ideal. |
2414 |
2185 |
2415 Node* referent_off = __ ConX(java_lang_ref_Reference::referent_offset); |
2186 Node* referent_off = __ ConX(java_lang_ref_Reference::referent_offset); |
2417 __ if_then(offset, BoolTest::eq, referent_off, unlikely); { |
2188 __ if_then(offset, BoolTest::eq, referent_off, unlikely); { |
2418 // Update graphKit memory and control from IdealKit. |
2189 // Update graphKit memory and control from IdealKit. |
2419 sync_kit(ideal); |
2190 sync_kit(ideal); |
2420 |
2191 |
2421 Node* ref_klass_con = makecon(TypeKlassPtr::make(env()->Reference_klass())); |
2192 Node* ref_klass_con = makecon(TypeKlassPtr::make(env()->Reference_klass())); |
2422 _sp += nargs; // gen_instanceof might do an uncommon trap |
|
2423 Node* is_instof = gen_instanceof(base_oop, ref_klass_con); |
2193 Node* is_instof = gen_instanceof(base_oop, ref_klass_con); |
2424 _sp -= nargs; |
|
2425 |
2194 |
2426 // Update IdealKit memory and control from graphKit. |
2195 // Update IdealKit memory and control from graphKit. |
2427 __ sync_kit(this); |
2196 __ sync_kit(this); |
2428 |
2197 |
2429 Node* one = __ ConI(1); |
2198 Node* one = __ ConI(1); |
2503 |
2272 |
2504 #ifndef PRODUCT |
2273 #ifndef PRODUCT |
2505 { |
2274 { |
2506 ResourceMark rm; |
2275 ResourceMark rm; |
2507 // Check the signatures. |
2276 // Check the signatures. |
2508 ciSignature* sig = signature(); |
2277 ciSignature* sig = callee()->signature(); |
2509 #ifdef ASSERT |
2278 #ifdef ASSERT |
2510 if (!is_store) { |
2279 if (!is_store) { |
2511 // Object getObject(Object base, int/long offset), etc. |
2280 // Object getObject(Object base, int/long offset), etc. |
2512 BasicType rtype = sig->return_type()->basic_type(); |
2281 BasicType rtype = sig->return_type()->basic_type(); |
2513 if (rtype == T_ADDRESS_HOLDER && callee()->name() == ciSymbol::getAddress_name()) |
2282 if (rtype == T_ADDRESS_HOLDER && callee()->name() == ciSymbol::getAddress_name()) |
2541 } |
2310 } |
2542 #endif //PRODUCT |
2311 #endif //PRODUCT |
2543 |
2312 |
2544 C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe". |
2313 C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe". |
2545 |
2314 |
2546 int type_words = type2size[ (type == T_ADDRESS) ? T_LONG : type ]; |
2315 Node* receiver = argument(0); // type: oop |
2547 |
2316 |
2548 // Argument words: "this" plus (oop/offset) or (lo/hi) args plus maybe 1 or 2 value words |
2317 // Build address expression. See the code in inline_unsafe_prefetch. |
2549 int nargs = 1 + (is_native_ptr ? 2 : 3) + (is_store ? type_words : 0); |
2318 Node* adr; |
2550 assert(callee()->arg_size() == nargs, "must be"); |
2319 Node* heap_base_oop = top(); |
2551 |
2320 Node* offset = top(); |
2552 debug_only(int saved_sp = _sp); |
|
2553 _sp += nargs; |
|
2554 |
|
2555 Node* val; |
2321 Node* val; |
2556 debug_only(val = (Node*)(uintptr_t)-1); |
|
2557 |
|
2558 |
|
2559 if (is_store) { |
|
2560 // Get the value being stored. (Pop it first; it was pushed last.) |
|
2561 switch (type) { |
|
2562 case T_DOUBLE: |
|
2563 case T_LONG: |
|
2564 case T_ADDRESS: |
|
2565 val = pop_pair(); |
|
2566 break; |
|
2567 default: |
|
2568 val = pop(); |
|
2569 } |
|
2570 } |
|
2571 |
|
2572 // Build address expression. See the code in inline_unsafe_prefetch. |
|
2573 Node *adr; |
|
2574 Node *heap_base_oop = top(); |
|
2575 Node* offset = top(); |
|
2576 |
2322 |
2577 if (!is_native_ptr) { |
2323 if (!is_native_ptr) { |
2324 // The base is either a Java object or a value produced by Unsafe.staticFieldBase |
|
2325 Node* base = argument(1); // type: oop |
|
2578 // The offset is a value produced by Unsafe.staticFieldOffset or Unsafe.objectFieldOffset |
2326 // The offset is a value produced by Unsafe.staticFieldOffset or Unsafe.objectFieldOffset |
2579 offset = pop_pair(); |
2327 offset = argument(2); // type: long |
2580 // The base is either a Java object or a value produced by Unsafe.staticFieldBase |
|
2581 Node* base = pop(); |
|
2582 // We currently rely on the cookies produced by Unsafe.xxxFieldOffset |
2328 // We currently rely on the cookies produced by Unsafe.xxxFieldOffset |
2583 // to be plain byte offsets, which are also the same as those accepted |
2329 // to be plain byte offsets, which are also the same as those accepted |
2584 // by oopDesc::field_base. |
2330 // by oopDesc::field_base. |
2585 assert(Unsafe_field_offset_to_byte_offset(11) == 11, |
2331 assert(Unsafe_field_offset_to_byte_offset(11) == 11, |
2586 "fieldOffset must be byte-scaled"); |
2332 "fieldOffset must be byte-scaled"); |
2587 // 32-bit machines ignore the high half! |
2333 // 32-bit machines ignore the high half! |
2588 offset = ConvL2X(offset); |
2334 offset = ConvL2X(offset); |
2589 adr = make_unsafe_address(base, offset); |
2335 adr = make_unsafe_address(base, offset); |
2590 heap_base_oop = base; |
2336 heap_base_oop = base; |
2337 val = is_store ? argument(4) : NULL; |
|
2591 } else { |
2338 } else { |
2592 Node* ptr = pop_pair(); |
2339 Node* ptr = argument(1); // type: long |
2593 // Adjust Java long to machine word: |
2340 ptr = ConvL2X(ptr); // adjust Java long to machine word |
2594 ptr = ConvL2X(ptr); |
|
2595 adr = make_unsafe_address(NULL, ptr); |
2341 adr = make_unsafe_address(NULL, ptr); |
2596 } |
2342 val = is_store ? argument(3) : NULL; |
2597 |
2343 } |
2598 // Pop receiver last: it was pushed first. |
|
2599 Node *receiver = pop(); |
|
2600 |
|
2601 assert(saved_sp == _sp, "must have correct argument count"); |
|
2602 |
2344 |
2603 const TypePtr *adr_type = _gvn.type(adr)->isa_ptr(); |
2345 const TypePtr *adr_type = _gvn.type(adr)->isa_ptr(); |
2604 |
2346 |
2605 // First guess at the value type. |
2347 // First guess at the value type. |
2606 const Type *value_type = Type::get_const_basic_type(type); |
2348 const Type *value_type = Type::get_const_basic_type(type); |
2631 if (tjp != NULL) { |
2373 if (tjp != NULL) { |
2632 value_type = tjp; |
2374 value_type = tjp; |
2633 } |
2375 } |
2634 } |
2376 } |
2635 |
2377 |
2636 // Null check on self without removing any arguments. The argument |
2378 receiver = null_check(receiver); |
2637 // null check technically happens in the wrong place, which can lead to |
|
2638 // invalid stack traces when the primitive is inlined into a method |
|
2639 // which handles NullPointerExceptions. |
|
2640 _sp += nargs; |
|
2641 do_null_check(receiver, T_OBJECT); |
|
2642 _sp -= nargs; |
|
2643 if (stopped()) { |
2379 if (stopped()) { |
2644 return true; |
2380 return true; |
2645 } |
2381 } |
2646 // Heap pointers get a null-check from the interpreter, |
2382 // Heap pointers get a null-check from the interpreter, |
2647 // as a courtesy. However, this is not guaranteed by Unsafe, |
2383 // as a courtesy. However, this is not guaranteed by Unsafe, |
2669 // around 5701, class sun/reflect/UnsafeBooleanFieldAccessorImpl. |
2405 // around 5701, class sun/reflect/UnsafeBooleanFieldAccessorImpl. |
2670 if (need_mem_bar) insert_mem_bar(Op_MemBarCPUOrder); |
2406 if (need_mem_bar) insert_mem_bar(Op_MemBarCPUOrder); |
2671 |
2407 |
2672 if (!is_store) { |
2408 if (!is_store) { |
2673 Node* p = make_load(control(), adr, value_type, type, adr_type, is_volatile); |
2409 Node* p = make_load(control(), adr, value_type, type, adr_type, is_volatile); |
2674 // load value and push onto stack |
2410 // load value |
2675 switch (type) { |
2411 switch (type) { |
2676 case T_BOOLEAN: |
2412 case T_BOOLEAN: |
2677 case T_CHAR: |
2413 case T_CHAR: |
2678 case T_BYTE: |
2414 case T_BYTE: |
2679 case T_SHORT: |
2415 case T_SHORT: |
2680 case T_INT: |
2416 case T_INT: |
2417 case T_LONG: |
|
2681 case T_FLOAT: |
2418 case T_FLOAT: |
2682 push(p); |
2419 case T_DOUBLE: |
2683 break; |
2420 break; |
2684 case T_OBJECT: |
2421 case T_OBJECT: |
2685 if (need_read_barrier) { |
2422 if (need_read_barrier) { |
2686 insert_pre_barrier(heap_base_oop, offset, p, nargs, !(is_volatile || need_mem_bar)); |
2423 insert_pre_barrier(heap_base_oop, offset, p, !(is_volatile || need_mem_bar)); |
2687 } |
2424 } |
2688 push(p); |
|
2689 break; |
2425 break; |
2690 case T_ADDRESS: |
2426 case T_ADDRESS: |
2691 // Cast to an int type. |
2427 // Cast to an int type. |
2692 p = _gvn.transform( new (C) CastP2XNode(NULL,p) ); |
2428 p = _gvn.transform(new (C) CastP2XNode(NULL, p)); |
2693 p = ConvX2L(p); |
2429 p = ConvX2L(p); |
2694 push_pair(p); |
|
2695 break; |
2430 break; |
2696 case T_DOUBLE: |
2431 default: |
2697 case T_LONG: |
2432 fatal(err_msg_res("unexpected type %d: %s", type, type2name(type))); |
2698 push_pair( p ); |
|
2699 break; |
2433 break; |
2700 default: ShouldNotReachHere(); |
2434 } |
2701 } |
2435 // The load node has the control of the preceding MemBarCPUOrder. All |
2436 // following nodes will have the control of the MemBarCPUOrder inserted at |
|
2437 // the end of this method. So, pushing the load onto the stack at a later |
|
2438 // point is fine. |
|
2439 set_result(p); |
|
2702 } else { |
2440 } else { |
2703 // place effect of store into memory |
2441 // place effect of store into memory |
2704 switch (type) { |
2442 switch (type) { |
2705 case T_DOUBLE: |
2443 case T_DOUBLE: |
2706 val = dstore_rounding(val); |
2444 val = dstore_rounding(val); |
2760 bool LibraryCallKit::inline_unsafe_prefetch(bool is_native_ptr, bool is_store, bool is_static) { |
2498 bool LibraryCallKit::inline_unsafe_prefetch(bool is_native_ptr, bool is_store, bool is_static) { |
2761 #ifndef PRODUCT |
2499 #ifndef PRODUCT |
2762 { |
2500 { |
2763 ResourceMark rm; |
2501 ResourceMark rm; |
2764 // Check the signatures. |
2502 // Check the signatures. |
2765 ciSignature* sig = signature(); |
2503 ciSignature* sig = callee()->signature(); |
2766 #ifdef ASSERT |
2504 #ifdef ASSERT |
2767 // Object getObject(Object base, int/long offset), etc. |
2505 // Object getObject(Object base, int/long offset), etc. |
2768 BasicType rtype = sig->return_type()->basic_type(); |
2506 BasicType rtype = sig->return_type()->basic_type(); |
2769 if (!is_native_ptr) { |
2507 if (!is_native_ptr) { |
2770 assert(sig->count() == 2, "oop prefetch has 2 arguments"); |
2508 assert(sig->count() == 2, "oop prefetch has 2 arguments"); |
2778 } |
2516 } |
2779 #endif // !PRODUCT |
2517 #endif // !PRODUCT |
2780 |
2518 |
2781 C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe". |
2519 C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe". |
2782 |
2520 |
2783 // Argument words: "this" if not static, plus (oop/offset) or (lo/hi) args |
2521 const int idx = is_static ? 0 : 1; |
2784 int nargs = (is_static ? 0 : 1) + (is_native_ptr ? 2 : 3); |
2522 if (!is_static) { |
2785 |
2523 null_check_receiver(); |
2786 debug_only(int saved_sp = _sp); |
2524 if (stopped()) { |
2787 _sp += nargs; |
2525 return true; |
2526 } |
|
2527 } |
|
2788 |
2528 |
2789 // Build address expression. See the code in inline_unsafe_access. |
2529 // Build address expression. See the code in inline_unsafe_access. |
2790 Node *adr; |
2530 Node *adr; |
2791 if (!is_native_ptr) { |
2531 if (!is_native_ptr) { |
2532 // The base is either a Java object or a value produced by Unsafe.staticFieldBase |
|
2533 Node* base = argument(idx + 0); // type: oop |
|
2792 // The offset is a value produced by Unsafe.staticFieldOffset or Unsafe.objectFieldOffset |
2534 // The offset is a value produced by Unsafe.staticFieldOffset or Unsafe.objectFieldOffset |
2793 Node* offset = pop_pair(); |
2535 Node* offset = argument(idx + 1); // type: long |
2794 // The base is either a Java object or a value produced by Unsafe.staticFieldBase |
|
2795 Node* base = pop(); |
|
2796 // We currently rely on the cookies produced by Unsafe.xxxFieldOffset |
2536 // We currently rely on the cookies produced by Unsafe.xxxFieldOffset |
2797 // to be plain byte offsets, which are also the same as those accepted |
2537 // to be plain byte offsets, which are also the same as those accepted |
2798 // by oopDesc::field_base. |
2538 // by oopDesc::field_base. |
2799 assert(Unsafe_field_offset_to_byte_offset(11) == 11, |
2539 assert(Unsafe_field_offset_to_byte_offset(11) == 11, |
2800 "fieldOffset must be byte-scaled"); |
2540 "fieldOffset must be byte-scaled"); |
2801 // 32-bit machines ignore the high half! |
2541 // 32-bit machines ignore the high half! |
2802 offset = ConvL2X(offset); |
2542 offset = ConvL2X(offset); |
2803 adr = make_unsafe_address(base, offset); |
2543 adr = make_unsafe_address(base, offset); |
2804 } else { |
2544 } else { |
2805 Node* ptr = pop_pair(); |
2545 Node* ptr = argument(idx + 0); // type: long |
2806 // Adjust Java long to machine word: |
2546 ptr = ConvL2X(ptr); // adjust Java long to machine word |
2807 ptr = ConvL2X(ptr); |
|
2808 adr = make_unsafe_address(NULL, ptr); |
2547 adr = make_unsafe_address(NULL, ptr); |
2809 } |
|
2810 |
|
2811 if (is_static) { |
|
2812 assert(saved_sp == _sp, "must have correct argument count"); |
|
2813 } else { |
|
2814 // Pop receiver last: it was pushed first. |
|
2815 Node *receiver = pop(); |
|
2816 assert(saved_sp == _sp, "must have correct argument count"); |
|
2817 |
|
2818 // Null check on self without removing any arguments. The argument |
|
2819 // null check technically happens in the wrong place, which can lead to |
|
2820 // invalid stack traces when the primitive is inlined into a method |
|
2821 // which handles NullPointerExceptions. |
|
2822 _sp += nargs; |
|
2823 do_null_check(receiver, T_OBJECT); |
|
2824 _sp -= nargs; |
|
2825 if (stopped()) { |
|
2826 return true; |
|
2827 } |
|
2828 } |
2548 } |
2829 |
2549 |
2830 // Generate the read or write prefetch |
2550 // Generate the read or write prefetch |
2831 Node *prefetch; |
2551 Node *prefetch; |
2832 if (is_store) { |
2552 if (is_store) { |
2839 |
2559 |
2840 return true; |
2560 return true; |
2841 } |
2561 } |
2842 |
2562 |
2843 //----------------------------inline_unsafe_load_store---------------------------- |
2563 //----------------------------inline_unsafe_load_store---------------------------- |
2844 |
2564 // This method serves a couple of different customers (depending on LoadStoreKind): |
2565 // |
|
2566 // LS_cmpxchg: |
|
2567 // public final native boolean compareAndSwapObject(Object o, long offset, Object expected, Object x); |
|
2568 // public final native boolean compareAndSwapInt( Object o, long offset, int expected, int x); |
|
2569 // public final native boolean compareAndSwapLong( Object o, long offset, long expected, long x); |
|
2570 // |
|
2571 // LS_xadd: |
|
2572 // public int getAndAddInt( Object o, long offset, int delta) |
|
2573 // public long getAndAddLong(Object o, long offset, long delta) |
|
2574 // |
|
2575 // LS_xchg: |
|
2576 // int getAndSet(Object o, long offset, int newValue) |
|
2577 // long getAndSet(Object o, long offset, long newValue) |
|
2578 // Object getAndSet(Object o, long offset, Object newValue) |
|
2579 // |
|
2845 bool LibraryCallKit::inline_unsafe_load_store(BasicType type, LoadStoreKind kind) { |
2580 bool LibraryCallKit::inline_unsafe_load_store(BasicType type, LoadStoreKind kind) { |
2846 // This basic scheme here is the same as inline_unsafe_access, but |
2581 // This basic scheme here is the same as inline_unsafe_access, but |
2847 // differs in enough details that combining them would make the code |
2582 // differs in enough details that combining them would make the code |
2848 // overly confusing. (This is a true fact! I originally combined |
2583 // overly confusing. (This is a true fact! I originally combined |
2849 // them, but even I was confused by it!) As much code/comments as |
2584 // them, but even I was confused by it!) As much code/comments as |
2854 |
2589 |
2855 #ifndef PRODUCT |
2590 #ifndef PRODUCT |
2856 BasicType rtype; |
2591 BasicType rtype; |
2857 { |
2592 { |
2858 ResourceMark rm; |
2593 ResourceMark rm; |
2859 ciSignature* sig = signature(); |
2594 // Check the signatures. |
2595 ciSignature* sig = callee()->signature(); |
|
2860 rtype = sig->return_type()->basic_type(); |
2596 rtype = sig->return_type()->basic_type(); |
2861 if (kind == LS_xadd || kind == LS_xchg) { |
2597 if (kind == LS_xadd || kind == LS_xchg) { |
2862 // Check the signatures. |
2598 // Check the signatures. |
2863 #ifdef ASSERT |
2599 #ifdef ASSERT |
2864 assert(rtype == type, "get and set must return the expected type"); |
2600 assert(rtype == type, "get and set must return the expected type"); |
2879 ShouldNotReachHere(); |
2615 ShouldNotReachHere(); |
2880 } |
2616 } |
2881 } |
2617 } |
2882 #endif //PRODUCT |
2618 #endif //PRODUCT |
2883 |
2619 |
2884 // number of stack slots per value argument (1 or 2) |
|
2885 int type_words = type2size[type]; |
|
2886 |
|
2887 C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe". |
2620 C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe". |
2888 |
2621 |
2889 // Argument words: "this" plus oop plus offset (plus oldvalue) plus newvalue/delta; |
2622 // Get arguments: |
2890 int nargs = 1 + 1 + 2 + ((kind == LS_cmpxchg) ? type_words : 0) + type_words; |
2623 Node* receiver = NULL; |
2891 |
2624 Node* base = NULL; |
2892 // pop arguments: newval, offset, base, and receiver |
2625 Node* offset = NULL; |
2893 debug_only(int saved_sp = _sp); |
2626 Node* oldval = NULL; |
2894 _sp += nargs; |
2627 Node* newval = NULL; |
2895 Node* newval = (type_words == 1) ? pop() : pop_pair(); |
2628 if (kind == LS_cmpxchg) { |
2896 Node* oldval = (kind == LS_cmpxchg) ? ((type_words == 1) ? pop() : pop_pair()) : NULL; |
2629 const bool two_slot_type = type2size[type] == 2; |
2897 Node *offset = pop_pair(); |
2630 receiver = argument(0); // type: oop |
2898 Node *base = pop(); |
2631 base = argument(1); // type: oop |
2899 Node *receiver = pop(); |
2632 offset = argument(2); // type: long |
2900 assert(saved_sp == _sp, "must have correct argument count"); |
2633 oldval = argument(4); // type: oop, int, or long |
2901 |
2634 newval = argument(two_slot_type ? 6 : 5); // type: oop, int, or long |
2902 // Null check receiver. |
2635 } else if (kind == LS_xadd || kind == LS_xchg){ |
2903 _sp += nargs; |
2636 receiver = argument(0); // type: oop |
2904 do_null_check(receiver, T_OBJECT); |
2637 base = argument(1); // type: oop |
2905 _sp -= nargs; |
2638 offset = argument(2); // type: long |
2639 oldval = NULL; |
|
2640 newval = argument(4); // type: oop, int, or long |
|
2641 } |
|
2642 |
|
2643 // Null check receiver. |
|
2644 receiver = null_check(receiver); |
|
2906 if (stopped()) { |
2645 if (stopped()) { |
2907 return true; |
2646 return true; |
2908 } |
2647 } |
2909 |
2648 |
2910 // Build field offset expression. |
2649 // Build field offset expression. |
3006 } |
2745 } |
3007 } |
2746 } |
3008 post_barrier(control(), load_store, base, adr, alias_idx, newval, T_OBJECT, true); |
2747 post_barrier(control(), load_store, base, adr, alias_idx, newval, T_OBJECT, true); |
3009 break; |
2748 break; |
3010 default: |
2749 default: |
3011 ShouldNotReachHere(); |
2750 fatal(err_msg_res("unexpected type %d: %s", type, type2name(type))); |
3012 break; |
2751 break; |
3013 } |
2752 } |
3014 |
2753 |
3015 // SCMemProjNodes represent the memory state of a LoadStore. Their |
2754 // SCMemProjNodes represent the memory state of a LoadStore. Their |
3016 // main role is to prevent LoadStore nodes from being optimized away |
2755 // main role is to prevent LoadStore nodes from being optimized away |
3027 load_store = _gvn.transform(new (C) DecodeNNode(load_store, load_store->bottom_type()->make_ptr())); |
2766 load_store = _gvn.transform(new (C) DecodeNNode(load_store, load_store->bottom_type()->make_ptr())); |
3028 } |
2767 } |
3029 #endif |
2768 #endif |
3030 |
2769 |
3031 assert(type2size[load_store->bottom_type()->basic_type()] == type2size[rtype], "result type should match"); |
2770 assert(type2size[load_store->bottom_type()->basic_type()] == type2size[rtype], "result type should match"); |
3032 push_node(load_store->bottom_type()->basic_type(), load_store); |
2771 set_result(load_store); |
3033 return true; |
2772 return true; |
3034 } |
2773 } |
3035 |
2774 |
2775 //----------------------------inline_unsafe_ordered_store---------------------- |
|
2776 // public native void sun.misc.Unsafe.putOrderedObject(Object o, long offset, Object x); |
|
2777 // public native void sun.misc.Unsafe.putOrderedInt(Object o, long offset, int x); |
|
2778 // public native void sun.misc.Unsafe.putOrderedLong(Object o, long offset, long x); |
|
3036 bool LibraryCallKit::inline_unsafe_ordered_store(BasicType type) { |
2779 bool LibraryCallKit::inline_unsafe_ordered_store(BasicType type) { |
3037 // This is another variant of inline_unsafe_access, differing in |
2780 // This is another variant of inline_unsafe_access, differing in |
3038 // that it always issues store-store ("release") barrier and ensures |
2781 // that it always issues store-store ("release") barrier and ensures |
3039 // store-atomicity (which only matters for "long"). |
2782 // store-atomicity (which only matters for "long"). |
3040 |
2783 |
3042 |
2785 |
3043 #ifndef PRODUCT |
2786 #ifndef PRODUCT |
3044 { |
2787 { |
3045 ResourceMark rm; |
2788 ResourceMark rm; |
3046 // Check the signatures. |
2789 // Check the signatures. |
3047 ciSignature* sig = signature(); |
2790 ciSignature* sig = callee()->signature(); |
3048 #ifdef ASSERT |
2791 #ifdef ASSERT |
3049 BasicType rtype = sig->return_type()->basic_type(); |
2792 BasicType rtype = sig->return_type()->basic_type(); |
3050 assert(rtype == T_VOID, "must return void"); |
2793 assert(rtype == T_VOID, "must return void"); |
3051 assert(sig->count() == 3, "has 3 arguments"); |
2794 assert(sig->count() == 3, "has 3 arguments"); |
3052 assert(sig->type_at(0)->basic_type() == T_OBJECT, "base is object"); |
2795 assert(sig->type_at(0)->basic_type() == T_OBJECT, "base is object"); |
3053 assert(sig->type_at(1)->basic_type() == T_LONG, "offset is long"); |
2796 assert(sig->type_at(1)->basic_type() == T_LONG, "offset is long"); |
3054 #endif // ASSERT |
2797 #endif // ASSERT |
3055 } |
2798 } |
3056 #endif //PRODUCT |
2799 #endif //PRODUCT |
3057 |
2800 |
3058 // number of stack slots per value argument (1 or 2) |
|
3059 int type_words = type2size[type]; |
|
3060 |
|
3061 C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe". |
2801 C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe". |
3062 |
2802 |
3063 // Argument words: "this" plus oop plus offset plus value; |
2803 // Get arguments: |
3064 int nargs = 1 + 1 + 2 + type_words; |
2804 Node* receiver = argument(0); // type: oop |
3065 |
2805 Node* base = argument(1); // type: oop |
3066 // pop arguments: val, offset, base, and receiver |
2806 Node* offset = argument(2); // type: long |
3067 debug_only(int saved_sp = _sp); |
2807 Node* val = argument(4); // type: oop, int, or long |
3068 _sp += nargs; |
2808 |
3069 Node* val = (type_words == 1) ? pop() : pop_pair(); |
2809 // Null check receiver. |
3070 Node *offset = pop_pair(); |
2810 receiver = null_check(receiver); |
3071 Node *base = pop(); |
|
3072 Node *receiver = pop(); |
|
3073 assert(saved_sp == _sp, "must have correct argument count"); |
|
3074 |
|
3075 // Null check receiver. |
|
3076 _sp += nargs; |
|
3077 do_null_check(receiver, T_OBJECT); |
|
3078 _sp -= nargs; |
|
3079 if (stopped()) { |
2811 if (stopped()) { |
3080 return true; |
2812 return true; |
3081 } |
2813 } |
3082 |
2814 |
3083 // Build field offset expression. |
2815 // Build field offset expression. |
3090 Compile::AliasType* alias_type = C->alias_type(adr_type); |
2822 Compile::AliasType* alias_type = C->alias_type(adr_type); |
3091 |
2823 |
3092 insert_mem_bar(Op_MemBarRelease); |
2824 insert_mem_bar(Op_MemBarRelease); |
3093 insert_mem_bar(Op_MemBarCPUOrder); |
2825 insert_mem_bar(Op_MemBarCPUOrder); |
3094 // Ensure that the store is atomic for longs: |
2826 // Ensure that the store is atomic for longs: |
3095 bool require_atomic_access = true; |
2827 const bool require_atomic_access = true; |
3096 Node* store; |
2828 Node* store; |
3097 if (type == T_OBJECT) // reference stores need a store barrier. |
2829 if (type == T_OBJECT) // reference stores need a store barrier. |
3098 store = store_oop_to_unknown(control(), base, adr, adr_type, val, type); |
2830 store = store_oop_to_unknown(control(), base, adr, adr_type, val, type); |
3099 else { |
2831 else { |
3100 store = store_to_memory(control(), adr, val, type, adr_type, require_atomic_access); |
2832 store = store_to_memory(control(), adr, val, type, adr_type, require_atomic_access); |
3101 } |
2833 } |
3102 insert_mem_bar(Op_MemBarCPUOrder); |
2834 insert_mem_bar(Op_MemBarCPUOrder); |
3103 return true; |
2835 return true; |
3104 } |
2836 } |
3105 |
2837 |
2838 //----------------------------inline_unsafe_allocate--------------------------- |
|
2839 // public native Object sun.mics.Unsafe.allocateInstance(Class<?> cls); |
|
3106 bool LibraryCallKit::inline_unsafe_allocate() { |
2840 bool LibraryCallKit::inline_unsafe_allocate() { |
3107 if (callee()->is_static()) return false; // caller must have the capability! |
2841 if (callee()->is_static()) return false; // caller must have the capability! |
3108 int nargs = 1 + 1; |
2842 |
3109 assert(signature()->size() == nargs-1, "alloc has 1 argument"); |
2843 null_check_receiver(); // null-check, then ignore |
3110 null_check_receiver(callee()); // check then ignore argument(0) |
2844 Node* cls = null_check(argument(1)); |
3111 _sp += nargs; // set original stack for use by uncommon_trap |
|
3112 Node* cls = do_null_check(argument(1), T_OBJECT); |
|
3113 _sp -= nargs; |
|
3114 if (stopped()) return true; |
2845 if (stopped()) return true; |
3115 |
2846 |
3116 Node* kls = load_klass_from_mirror(cls, false, nargs, NULL, 0); |
2847 Node* kls = load_klass_from_mirror(cls, false, NULL, 0); |
3117 _sp += nargs; // set original stack for use by uncommon_trap |
2848 kls = null_check(kls); |
3118 kls = do_null_check(kls, T_OBJECT); |
|
3119 _sp -= nargs; |
|
3120 if (stopped()) return true; // argument was like int.class |
2849 if (stopped()) return true; // argument was like int.class |
3121 |
2850 |
3122 // Note: The argument might still be an illegal value like |
2851 // Note: The argument might still be an illegal value like |
3123 // Serializable.class or Object[].class. The runtime will handle it. |
2852 // Serializable.class or Object[].class. The runtime will handle it. |
3124 // But we must make an explicit check for initialization. |
2853 // But we must make an explicit check for initialization. |
3125 Node* insp = basic_plus_adr(kls, in_bytes(InstanceKlass::init_state_offset())); |
2854 Node* insp = basic_plus_adr(kls, in_bytes(InstanceKlass::init_state_offset())); |
3126 // Use T_BOOLEAN for InstanceKlass::_init_state so the compiler |
2855 // Use T_BOOLEAN for InstanceKlass::_init_state so the compiler |
3127 // can generate code to load it as unsigned byte. |
2856 // can generate code to load it as unsigned byte. |
3128 Node* inst = make_load(NULL, insp, TypeInt::UBYTE, T_BOOLEAN); |
2857 Node* inst = make_load(NULL, insp, TypeInt::UBYTE, T_BOOLEAN); |
3129 Node* bits = intcon(InstanceKlass::fully_initialized); |
2858 Node* bits = intcon(InstanceKlass::fully_initialized); |
3130 Node* test = _gvn.transform( new (C) SubINode(inst, bits) ); |
2859 Node* test = _gvn.transform(new (C) SubINode(inst, bits)); |
3131 // The 'test' is non-zero if we need to take a slow path. |
2860 // The 'test' is non-zero if we need to take a slow path. |
3132 |
2861 |
3133 Node* obj = new_instance(kls, test); |
2862 Node* obj = new_instance(kls, test); |
3134 push(obj); |
2863 set_result(obj); |
3135 |
|
3136 return true; |
2864 return true; |
3137 } |
2865 } |
3138 |
2866 |
3139 #ifdef TRACE_HAVE_INTRINSICS |
2867 #ifdef TRACE_HAVE_INTRINSICS |
3140 /* |
2868 /* |
3141 * oop -> myklass |
2869 * oop -> myklass |
3142 * myklass->trace_id |= USED |
2870 * myklass->trace_id |= USED |
3143 * return myklass->trace_id & ~0x3 |
2871 * return myklass->trace_id & ~0x3 |
3144 */ |
2872 */ |
3145 bool LibraryCallKit::inline_native_classID() { |
2873 bool LibraryCallKit::inline_native_classID() { |
3146 int nargs = 1 + 1; |
2874 null_check_receiver(); // null-check, then ignore |
3147 null_check_receiver(callee()); // check then ignore argument(0) |
2875 Node* cls = null_check(argument(1), T_OBJECT); |
3148 _sp += nargs; |
2876 Node* kls = load_klass_from_mirror(cls, false, NULL, 0); |
3149 Node* cls = do_null_check(argument(1), T_OBJECT); |
2877 kls = null_check(kls, T_OBJECT); |
3150 _sp -= nargs; |
|
3151 Node* kls = load_klass_from_mirror(cls, false, nargs, NULL, 0); |
|
3152 _sp += nargs; |
|
3153 kls = do_null_check(kls, T_OBJECT); |
|
3154 _sp -= nargs; |
|
3155 ByteSize offset = TRACE_ID_OFFSET; |
2878 ByteSize offset = TRACE_ID_OFFSET; |
3156 Node* insp = basic_plus_adr(kls, in_bytes(offset)); |
2879 Node* insp = basic_plus_adr(kls, in_bytes(offset)); |
3157 Node* tvalue = make_load(NULL, insp, TypeLong::LONG, T_LONG); |
2880 Node* tvalue = make_load(NULL, insp, TypeLong::LONG, T_LONG); |
3158 Node* bits = longcon(~0x03l); // ignore bit 0 & 1 |
2881 Node* bits = longcon(~0x03l); // ignore bit 0 & 1 |
3159 Node* andl = _gvn.transform(new (C) AndLNode(tvalue, bits)); |
2882 Node* andl = _gvn.transform(new (C) AndLNode(tvalue, bits)); |
3160 Node* clsused = longcon(0x01l); // set the class bit |
2883 Node* clsused = longcon(0x01l); // set the class bit |
3161 Node* orl = _gvn.transform(new (C) OrLNode(tvalue, clsused)); |
2884 Node* orl = _gvn.transform(new (C) OrLNode(tvalue, clsused)); |
3162 |
2885 |
3163 const TypePtr *adr_type = _gvn.type(insp)->isa_ptr(); |
2886 const TypePtr *adr_type = _gvn.type(insp)->isa_ptr(); |
3164 store_to_memory(control(), insp, orl, T_LONG, adr_type); |
2887 store_to_memory(control(), insp, orl, T_LONG, adr_type); |
3165 push_pair(andl); |
2888 set_result(andl); |
3166 return true; |
2889 return true; |
3167 } |
2890 } |
3168 |
2891 |
3169 bool LibraryCallKit::inline_native_threadID() { |
2892 bool LibraryCallKit::inline_native_threadID() { |
3170 Node* tls_ptr = NULL; |
2893 Node* tls_ptr = NULL; |
3175 |
2898 |
3176 Node* threadid = NULL; |
2899 Node* threadid = NULL; |
3177 size_t thread_id_size = OSThread::thread_id_size(); |
2900 size_t thread_id_size = OSThread::thread_id_size(); |
3178 if (thread_id_size == (size_t) BytesPerLong) { |
2901 if (thread_id_size == (size_t) BytesPerLong) { |
3179 threadid = ConvL2I(make_load(control(), p, TypeLong::LONG, T_LONG)); |
2902 threadid = ConvL2I(make_load(control(), p, TypeLong::LONG, T_LONG)); |
3180 push(threadid); |
|
3181 } else if (thread_id_size == (size_t) BytesPerInt) { |
2903 } else if (thread_id_size == (size_t) BytesPerInt) { |
3182 threadid = make_load(control(), p, TypeInt::INT, T_INT); |
2904 threadid = make_load(control(), p, TypeInt::INT, T_INT); |
3183 push(threadid); |
|
3184 } else { |
2905 } else { |
3185 ShouldNotReachHere(); |
2906 ShouldNotReachHere(); |
3186 } |
2907 } |
2908 set_result(threadid); |
|
3187 return true; |
2909 return true; |
3188 } |
2910 } |
3189 #endif |
2911 #endif |
3190 |
2912 |
3191 //------------------------inline_native_time_funcs-------------- |
2913 //------------------------inline_native_time_funcs-------------- |
3192 // inline code for System.currentTimeMillis() and System.nanoTime() |
2914 // inline code for System.currentTimeMillis() and System.nanoTime() |
3193 // these have the same type and signature |
2915 // these have the same type and signature |
3194 bool LibraryCallKit::inline_native_time_funcs(address funcAddr, const char* funcName) { |
2916 bool LibraryCallKit::inline_native_time_funcs(address funcAddr, const char* funcName) { |
3195 const TypeFunc *tf = OptoRuntime::void_long_Type(); |
2917 const TypeFunc* tf = OptoRuntime::void_long_Type(); |
3196 const TypePtr* no_memory_effects = NULL; |
2918 const TypePtr* no_memory_effects = NULL; |
3197 Node* time = make_runtime_call(RC_LEAF, tf, funcAddr, funcName, no_memory_effects); |
2919 Node* time = make_runtime_call(RC_LEAF, tf, funcAddr, funcName, no_memory_effects); |
3198 Node* value = _gvn.transform(new (C) ProjNode(time, TypeFunc::Parms+0)); |
2920 Node* value = _gvn.transform(new (C) ProjNode(time, TypeFunc::Parms+0)); |
3199 #ifdef ASSERT |
2921 #ifdef ASSERT |
3200 Node* value_top = _gvn.transform(new (C) ProjNode(time, TypeFunc::Parms + 1)); |
2922 Node* value_top = _gvn.transform(new (C) ProjNode(time, TypeFunc::Parms+1)); |
3201 assert(value_top == top(), "second value must be top"); |
2923 assert(value_top == top(), "second value must be top"); |
3202 #endif |
2924 #endif |
3203 push_pair(value); |
2925 set_result(value); |
3204 return true; |
2926 return true; |
3205 } |
2927 } |
3206 |
2928 |
3207 //------------------------inline_native_currentThread------------------ |
2929 //------------------------inline_native_currentThread------------------ |
3208 bool LibraryCallKit::inline_native_currentThread() { |
2930 bool LibraryCallKit::inline_native_currentThread() { |
3209 Node* junk = NULL; |
2931 Node* junk = NULL; |
3210 push(generate_current_thread(junk)); |
2932 set_result(generate_current_thread(junk)); |
3211 return true; |
2933 return true; |
3212 } |
2934 } |
3213 |
2935 |
3214 //------------------------inline_native_isInterrupted------------------ |
2936 //------------------------inline_native_isInterrupted------------------ |
2937 // private native boolean java.lang.Thread.isInterrupted(boolean ClearInterrupted); |
|
3215 bool LibraryCallKit::inline_native_isInterrupted() { |
2938 bool LibraryCallKit::inline_native_isInterrupted() { |
3216 const int nargs = 1+1; // receiver + boolean |
|
3217 assert(nargs == arg_size(), "sanity"); |
|
3218 // Add a fast path to t.isInterrupted(clear_int): |
2939 // Add a fast path to t.isInterrupted(clear_int): |
3219 // (t == Thread.current() && (!TLS._osthread._interrupted || !clear_int)) |
2940 // (t == Thread.current() && (!TLS._osthread._interrupted || !clear_int)) |
3220 // ? TLS._osthread._interrupted : /*slow path:*/ t.isInterrupted(clear_int) |
2941 // ? TLS._osthread._interrupted : /*slow path:*/ t.isInterrupted(clear_int) |
3221 // So, in the common case that the interrupt bit is false, |
2942 // So, in the common case that the interrupt bit is false, |
3222 // we avoid making a call into the VM. Even if the interrupt bit |
2943 // we avoid making a call into the VM. Even if the interrupt bit |
3310 |
3031 |
3311 set_all_memory( _gvn.transform(mem_phi) ); |
3032 set_all_memory( _gvn.transform(mem_phi) ); |
3312 set_i_o( _gvn.transform(io_phi) ); |
3033 set_i_o( _gvn.transform(io_phi) ); |
3313 } |
3034 } |
3314 |
3035 |
3315 push_result(result_rgn, result_val); |
|
3316 C->set_has_split_ifs(true); // Has chance for split-if optimization |
3036 C->set_has_split_ifs(true); // Has chance for split-if optimization |
3317 |
3037 set_result(result_rgn, result_val); |
3318 return true; |
3038 return true; |
3319 } |
3039 } |
3320 |
3040 |
3321 //---------------------------load_mirror_from_klass---------------------------- |
3041 //---------------------------load_mirror_from_klass---------------------------- |
3322 // Given a klass oop, load its java mirror (a java.lang.Class oop). |
3042 // Given a klass oop, load its java mirror (a java.lang.Class oop). |
3332 // If never_see_null, take an uncommon trap on null, so we can optimistically |
3052 // If never_see_null, take an uncommon trap on null, so we can optimistically |
3333 // compile for the non-null case. |
3053 // compile for the non-null case. |
3334 // If the region is NULL, force never_see_null = true. |
3054 // If the region is NULL, force never_see_null = true. |
3335 Node* LibraryCallKit::load_klass_from_mirror_common(Node* mirror, |
3055 Node* LibraryCallKit::load_klass_from_mirror_common(Node* mirror, |
3336 bool never_see_null, |
3056 bool never_see_null, |
3337 int nargs, |
|
3338 RegionNode* region, |
3057 RegionNode* region, |
3339 int null_path, |
3058 int null_path, |
3340 int offset) { |
3059 int offset) { |
3341 if (region == NULL) never_see_null = true; |
3060 if (region == NULL) never_see_null = true; |
3342 Node* p = basic_plus_adr(mirror, offset); |
3061 Node* p = basic_plus_adr(mirror, offset); |
3343 const TypeKlassPtr* kls_type = TypeKlassPtr::OBJECT_OR_NULL; |
3062 const TypeKlassPtr* kls_type = TypeKlassPtr::OBJECT_OR_NULL; |
3344 Node* kls = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p, TypeRawPtr::BOTTOM, kls_type) ); |
3063 Node* kls = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p, TypeRawPtr::BOTTOM, kls_type) ); |
3345 _sp += nargs; // any deopt will start just before call to enclosing method |
|
3346 Node* null_ctl = top(); |
3064 Node* null_ctl = top(); |
3347 kls = null_check_oop(kls, &null_ctl, never_see_null); |
3065 kls = null_check_oop(kls, &null_ctl, never_see_null); |
3348 if (region != NULL) { |
3066 if (region != NULL) { |
3349 // Set region->in(null_path) if the mirror is a primitive (e.g, int.class). |
3067 // Set region->in(null_path) if the mirror is a primitive (e.g, int.class). |
3350 region->init_req(null_path, null_ctl); |
3068 region->init_req(null_path, null_ctl); |
3351 } else { |
3069 } else { |
3352 assert(null_ctl == top(), "no loose ends"); |
3070 assert(null_ctl == top(), "no loose ends"); |
3353 } |
3071 } |
3354 _sp -= nargs; |
|
3355 return kls; |
3072 return kls; |
3356 } |
3073 } |
3357 |
3074 |
3358 //--------------------(inline_native_Class_query helpers)--------------------- |
3075 //--------------------(inline_native_Class_query helpers)--------------------- |
3359 // Use this for JVM_ACC_INTERFACE, JVM_ACC_IS_CLONEABLE, JVM_ACC_HAS_FINALIZER. |
3076 // Use this for JVM_ACC_INTERFACE, JVM_ACC_IS_CLONEABLE, JVM_ACC_HAS_FINALIZER. |
3374 return generate_access_flags_guard(kls, JVM_ACC_INTERFACE, 0, region); |
3091 return generate_access_flags_guard(kls, JVM_ACC_INTERFACE, 0, region); |
3375 } |
3092 } |
3376 |
3093 |
3377 //-------------------------inline_native_Class_query------------------- |
3094 //-------------------------inline_native_Class_query------------------- |
3378 bool LibraryCallKit::inline_native_Class_query(vmIntrinsics::ID id) { |
3095 bool LibraryCallKit::inline_native_Class_query(vmIntrinsics::ID id) { |
3379 int nargs = 1+0; // just the Class mirror, in most cases |
|
3380 const Type* return_type = TypeInt::BOOL; |
3096 const Type* return_type = TypeInt::BOOL; |
3381 Node* prim_return_value = top(); // what happens if it's a primitive class? |
3097 Node* prim_return_value = top(); // what happens if it's a primitive class? |
3382 bool never_see_null = !too_many_traps(Deoptimization::Reason_null_check); |
3098 bool never_see_null = !too_many_traps(Deoptimization::Reason_null_check); |
3383 bool expect_prim = false; // most of these guys expect to work on refs |
3099 bool expect_prim = false; // most of these guys expect to work on refs |
3384 |
3100 |
3385 enum { _normal_path = 1, _prim_path = 2, PATH_LIMIT }; |
3101 enum { _normal_path = 1, _prim_path = 2, PATH_LIMIT }; |
3386 |
3102 |
3103 Node* mirror = argument(0); |
|
3104 Node* obj = top(); |
|
3105 |
|
3387 switch (id) { |
3106 switch (id) { |
3388 case vmIntrinsics::_isInstance: |
3107 case vmIntrinsics::_isInstance: |
3389 nargs = 1+1; // the Class mirror, plus the object getting queried about |
|
3390 // nothing is an instance of a primitive type |
3108 // nothing is an instance of a primitive type |
3391 prim_return_value = intcon(0); |
3109 prim_return_value = intcon(0); |
3110 obj = argument(1); |
|
3392 break; |
3111 break; |
3393 case vmIntrinsics::_getModifiers: |
3112 case vmIntrinsics::_getModifiers: |
3394 prim_return_value = intcon(JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC); |
3113 prim_return_value = intcon(JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC); |
3395 assert(is_power_of_2((int)JVM_ACC_WRITTEN_FLAGS+1), "change next line"); |
3114 assert(is_power_of_2((int)JVM_ACC_WRITTEN_FLAGS+1), "change next line"); |
3396 return_type = TypeInt::make(0, JVM_ACC_WRITTEN_FLAGS, Type::WidenMin); |
3115 return_type = TypeInt::make(0, JVM_ACC_WRITTEN_FLAGS, Type::WidenMin); |
3417 case vmIntrinsics::_getClassAccessFlags: |
3136 case vmIntrinsics::_getClassAccessFlags: |
3418 prim_return_value = intcon(JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC); |
3137 prim_return_value = intcon(JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC); |
3419 return_type = TypeInt::INT; // not bool! 6297094 |
3138 return_type = TypeInt::INT; // not bool! 6297094 |
3420 break; |
3139 break; |
3421 default: |
3140 default: |
3422 ShouldNotReachHere(); |
3141 fatal_unexpected_iid(id); |
3423 } |
3142 break; |
3424 |
3143 } |
3425 Node* mirror = argument(0); |
|
3426 Node* obj = (nargs <= 1)? top(): argument(1); |
|
3427 |
3144 |
3428 const TypeInstPtr* mirror_con = _gvn.type(mirror)->isa_instptr(); |
3145 const TypeInstPtr* mirror_con = _gvn.type(mirror)->isa_instptr(); |
3429 if (mirror_con == NULL) return false; // cannot happen? |
3146 if (mirror_con == NULL) return false; // cannot happen? |
3430 |
3147 |
3431 #ifndef PRODUCT |
3148 #ifndef PRODUCT |
3449 // if it is. See bug 4774291. |
3166 // if it is. See bug 4774291. |
3450 |
3167 |
3451 // For Reflection.getClassAccessFlags(), the null check occurs in |
3168 // For Reflection.getClassAccessFlags(), the null check occurs in |
3452 // the wrong place; see inline_unsafe_access(), above, for a similar |
3169 // the wrong place; see inline_unsafe_access(), above, for a similar |
3453 // situation. |
3170 // situation. |
3454 _sp += nargs; // set original stack for use by uncommon_trap |
3171 mirror = null_check(mirror); |
3455 mirror = do_null_check(mirror, T_OBJECT); |
|
3456 _sp -= nargs; |
|
3457 // If mirror or obj is dead, only null-path is taken. |
3172 // If mirror or obj is dead, only null-path is taken. |
3458 if (stopped()) return true; |
3173 if (stopped()) return true; |
3459 |
3174 |
3460 if (expect_prim) never_see_null = false; // expect nulls (meaning prims) |
3175 if (expect_prim) never_see_null = false; // expect nulls (meaning prims) |
3461 |
3176 |
3462 // Now load the mirror's klass metaobject, and null-check it. |
3177 // Now load the mirror's klass metaobject, and null-check it. |
3463 // Side-effects region with the control path if the klass is null. |
3178 // Side-effects region with the control path if the klass is null. |
3464 Node* kls = load_klass_from_mirror(mirror, never_see_null, nargs, |
3179 Node* kls = load_klass_from_mirror(mirror, never_see_null, region, _prim_path); |
3465 region, _prim_path); |
|
3466 // If kls is null, we have a primitive mirror. |
3180 // If kls is null, we have a primitive mirror. |
3467 phi->init_req(_prim_path, prim_return_value); |
3181 phi->init_req(_prim_path, prim_return_value); |
3468 if (stopped()) { push_result(region, phi); return true; } |
3182 if (stopped()) { set_result(region, phi); return true; } |
3469 |
3183 |
3470 Node* p; // handy temp |
3184 Node* p; // handy temp |
3471 Node* null_ctl; |
3185 Node* null_ctl; |
3472 |
3186 |
3473 // Now that we have the non-null klass, we can perform the real query. |
3187 // Now that we have the non-null klass, we can perform the real query. |
3474 // For constant classes, the query will constant-fold in LoadNode::Value. |
3188 // For constant classes, the query will constant-fold in LoadNode::Value. |
3475 Node* query_value = top(); |
3189 Node* query_value = top(); |
3476 switch (id) { |
3190 switch (id) { |
3477 case vmIntrinsics::_isInstance: |
3191 case vmIntrinsics::_isInstance: |
3478 // nothing is an instance of a primitive type |
3192 // nothing is an instance of a primitive type |
3479 _sp += nargs; // gen_instanceof might do an uncommon trap |
|
3480 query_value = gen_instanceof(obj, kls); |
3193 query_value = gen_instanceof(obj, kls); |
3481 _sp -= nargs; |
|
3482 break; |
3194 break; |
3483 |
3195 |
3484 case vmIntrinsics::_getModifiers: |
3196 case vmIntrinsics::_getModifiers: |
3485 p = basic_plus_adr(kls, in_bytes(Klass::modifier_flags_offset())); |
3197 p = basic_plus_adr(kls, in_bytes(Klass::modifier_flags_offset())); |
3486 query_value = make_load(NULL, p, TypeInt::INT, T_INT); |
3198 query_value = make_load(NULL, p, TypeInt::INT, T_INT); |
3551 p = basic_plus_adr(kls, in_bytes(Klass::access_flags_offset())); |
3263 p = basic_plus_adr(kls, in_bytes(Klass::access_flags_offset())); |
3552 query_value = make_load(NULL, p, TypeInt::INT, T_INT); |
3264 query_value = make_load(NULL, p, TypeInt::INT, T_INT); |
3553 break; |
3265 break; |
3554 |
3266 |
3555 default: |
3267 default: |
3556 ShouldNotReachHere(); |
3268 fatal_unexpected_iid(id); |
3269 break; |
|
3557 } |
3270 } |
3558 |
3271 |
3559 // Fall-through is the normal case of a query to a real class. |
3272 // Fall-through is the normal case of a query to a real class. |
3560 phi->init_req(1, query_value); |
3273 phi->init_req(1, query_value); |
3561 region->init_req(1, control()); |
3274 region->init_req(1, control()); |
3562 |
3275 |
3563 push_result(region, phi); |
|
3564 C->set_has_split_ifs(true); // Has chance for split-if optimization |
3276 C->set_has_split_ifs(true); // Has chance for split-if optimization |
3565 |
3277 set_result(region, phi); |
3566 return true; |
3278 return true; |
3567 } |
3279 } |
3568 |
3280 |
3569 //--------------------------inline_native_subtype_check------------------------ |
3281 //--------------------------inline_native_subtype_check------------------------ |
3570 // This intrinsic takes the JNI calls out of the heart of |
3282 // This intrinsic takes the JNI calls out of the heart of |
3571 // UnsafeFieldAccessorImpl.set, which improves Field.set, readObject, etc. |
3283 // UnsafeFieldAccessorImpl.set, which improves Field.set, readObject, etc. |
3572 bool LibraryCallKit::inline_native_subtype_check() { |
3284 bool LibraryCallKit::inline_native_subtype_check() { |
3573 int nargs = 1+1; // the Class mirror, plus the other class getting examined |
|
3574 |
|
3575 // Pull both arguments off the stack. |
3285 // Pull both arguments off the stack. |
3576 Node* args[2]; // two java.lang.Class mirrors: superc, subc |
3286 Node* args[2]; // two java.lang.Class mirrors: superc, subc |
3577 args[0] = argument(0); |
3287 args[0] = argument(0); |
3578 args[1] = argument(1); |
3288 args[1] = argument(1); |
3579 Node* klasses[2]; // corresponding Klasses: superk, subk |
3289 Node* klasses[2]; // corresponding Klasses: superk, subk |
3600 |
3310 |
3601 // First null-check both mirrors and load each mirror's klass metaobject. |
3311 // First null-check both mirrors and load each mirror's klass metaobject. |
3602 int which_arg; |
3312 int which_arg; |
3603 for (which_arg = 0; which_arg <= 1; which_arg++) { |
3313 for (which_arg = 0; which_arg <= 1; which_arg++) { |
3604 Node* arg = args[which_arg]; |
3314 Node* arg = args[which_arg]; |
3605 _sp += nargs; // set original stack for use by uncommon_trap |
3315 arg = null_check(arg); |
3606 arg = do_null_check(arg, T_OBJECT); |
|
3607 _sp -= nargs; |
|
3608 if (stopped()) break; |
3316 if (stopped()) break; |
3609 args[which_arg] = _gvn.transform(arg); |
3317 args[which_arg] = _gvn.transform(arg); |
3610 |
3318 |
3611 Node* p = basic_plus_adr(arg, class_klass_offset); |
3319 Node* p = basic_plus_adr(arg, class_klass_offset); |
3612 Node* kls = LoadKlassNode::make(_gvn, immutable_memory(), p, adr_type, kls_type); |
3320 Node* kls = LoadKlassNode::make(_gvn, immutable_memory(), p, adr_type, kls_type); |
3616 // Having loaded both klasses, test each for null. |
3324 // Having loaded both klasses, test each for null. |
3617 bool never_see_null = !too_many_traps(Deoptimization::Reason_null_check); |
3325 bool never_see_null = !too_many_traps(Deoptimization::Reason_null_check); |
3618 for (which_arg = 0; which_arg <= 1; which_arg++) { |
3326 for (which_arg = 0; which_arg <= 1; which_arg++) { |
3619 Node* kls = klasses[which_arg]; |
3327 Node* kls = klasses[which_arg]; |
3620 Node* null_ctl = top(); |
3328 Node* null_ctl = top(); |
3621 _sp += nargs; // set original stack for use by uncommon_trap |
|
3622 kls = null_check_oop(kls, &null_ctl, never_see_null); |
3329 kls = null_check_oop(kls, &null_ctl, never_see_null); |
3623 _sp -= nargs; |
|
3624 int prim_path = (which_arg == 0 ? _prim_0_path : _prim_1_path); |
3330 int prim_path = (which_arg == 0 ? _prim_0_path : _prim_1_path); |
3625 region->init_req(prim_path, null_ctl); |
3331 region->init_req(prim_path, null_ctl); |
3626 if (stopped()) break; |
3332 if (stopped()) break; |
3627 klasses[which_arg] = kls; |
3333 klasses[which_arg] = kls; |
3628 } |
3334 } |
3668 phi->set_req(i, intcon(0)); // all other paths produce 'false' |
3374 phi->set_req(i, intcon(0)); // all other paths produce 'false' |
3669 } |
3375 } |
3670 } |
3376 } |
3671 |
3377 |
3672 set_control(_gvn.transform(region)); |
3378 set_control(_gvn.transform(region)); |
3673 push(_gvn.transform(phi)); |
3379 set_result(_gvn.transform(phi)); |
3674 |
|
3675 return true; |
3380 return true; |
3676 } |
3381 } |
3677 |
3382 |
3678 //---------------------generate_array_guard_common------------------------ |
3383 //---------------------generate_array_guard_common------------------------ |
3679 Node* LibraryCallKit::generate_array_guard_common(Node* kls, RegionNode* region, |
3384 Node* LibraryCallKit::generate_array_guard_common(Node* kls, RegionNode* region, |
3717 return generate_fair_guard(bol, region); |
3422 return generate_fair_guard(bol, region); |
3718 } |
3423 } |
3719 |
3424 |
3720 |
3425 |
3721 //-----------------------inline_native_newArray-------------------------- |
3426 //-----------------------inline_native_newArray-------------------------- |
3427 // private static native Object java.lang.reflect.newArray(Class<?> componentType, int length); |
|
3722 bool LibraryCallKit::inline_native_newArray() { |
3428 bool LibraryCallKit::inline_native_newArray() { |
3723 int nargs = 2; |
|
3724 Node* mirror = argument(0); |
3429 Node* mirror = argument(0); |
3725 Node* count_val = argument(1); |
3430 Node* count_val = argument(1); |
3726 |
3431 |
3727 _sp += nargs; // set original stack for use by uncommon_trap |
3432 mirror = null_check(mirror); |
3728 mirror = do_null_check(mirror, T_OBJECT); |
|
3729 _sp -= nargs; |
|
3730 // If mirror or obj is dead, only null-path is taken. |
3433 // If mirror or obj is dead, only null-path is taken. |
3731 if (stopped()) return true; |
3434 if (stopped()) return true; |
3732 |
3435 |
3733 enum { _normal_path = 1, _slow_path = 2, PATH_LIMIT }; |
3436 enum { _normal_path = 1, _slow_path = 2, PATH_LIMIT }; |
3734 RegionNode* result_reg = new(C) RegionNode(PATH_LIMIT); |
3437 RegionNode* result_reg = new(C) RegionNode(PATH_LIMIT); |
3738 PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY, |
3441 PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY, |
3739 TypePtr::BOTTOM); |
3442 TypePtr::BOTTOM); |
3740 |
3443 |
3741 bool never_see_null = !too_many_traps(Deoptimization::Reason_null_check); |
3444 bool never_see_null = !too_many_traps(Deoptimization::Reason_null_check); |
3742 Node* klass_node = load_array_klass_from_mirror(mirror, never_see_null, |
3445 Node* klass_node = load_array_klass_from_mirror(mirror, never_see_null, |
3743 nargs, |
|
3744 result_reg, _slow_path); |
3446 result_reg, _slow_path); |
3745 Node* normal_ctl = control(); |
3447 Node* normal_ctl = control(); |
3746 Node* no_array_ctl = result_reg->in(_slow_path); |
3448 Node* no_array_ctl = result_reg->in(_slow_path); |
3747 |
3449 |
3748 // Generate code for the slow case. We make a call to newArray(). |
3450 // Generate code for the slow case. We make a call to newArray(). |
3765 set_control(normal_ctl); |
3467 set_control(normal_ctl); |
3766 if (!stopped()) { |
3468 if (!stopped()) { |
3767 // Normal case: The array type has been cached in the java.lang.Class. |
3469 // Normal case: The array type has been cached in the java.lang.Class. |
3768 // The following call works fine even if the array type is polymorphic. |
3470 // The following call works fine even if the array type is polymorphic. |
3769 // It could be a dynamic mix of int[], boolean[], Object[], etc. |
3471 // It could be a dynamic mix of int[], boolean[], Object[], etc. |
3770 Node* obj = new_array(klass_node, count_val, nargs); |
3472 Node* obj = new_array(klass_node, count_val, 0); // no arguments to push |
3771 result_reg->init_req(_normal_path, control()); |
3473 result_reg->init_req(_normal_path, control()); |
3772 result_val->init_req(_normal_path, obj); |
3474 result_val->init_req(_normal_path, obj); |
3773 result_io ->init_req(_normal_path, i_o()); |
3475 result_io ->init_req(_normal_path, i_o()); |
3774 result_mem->init_req(_normal_path, reset_memory()); |
3476 result_mem->init_req(_normal_path, reset_memory()); |
3775 } |
3477 } |
3776 |
3478 |
3777 // Return the combined state. |
3479 // Return the combined state. |
3778 set_i_o( _gvn.transform(result_io) ); |
3480 set_i_o( _gvn.transform(result_io) ); |
3779 set_all_memory( _gvn.transform(result_mem) ); |
3481 set_all_memory( _gvn.transform(result_mem) ); |
3780 push_result(result_reg, result_val); |
3482 |
3781 C->set_has_split_ifs(true); // Has chance for split-if optimization |
3483 C->set_has_split_ifs(true); // Has chance for split-if optimization |
3782 |
3484 set_result(result_reg, result_val); |
3783 return true; |
3485 return true; |
3784 } |
3486 } |
3785 |
3487 |
3786 //----------------------inline_native_getLength-------------------------- |
3488 //----------------------inline_native_getLength-------------------------- |
3489 // public static native int java.lang.reflect.Array.getLength(Object array); |
|
3787 bool LibraryCallKit::inline_native_getLength() { |
3490 bool LibraryCallKit::inline_native_getLength() { |
3788 if (too_many_traps(Deoptimization::Reason_intrinsic)) return false; |
3491 if (too_many_traps(Deoptimization::Reason_intrinsic)) return false; |
3789 |
3492 |
3790 int nargs = 1; |
3493 Node* array = null_check(argument(0)); |
3791 Node* array = argument(0); |
|
3792 |
|
3793 _sp += nargs; // set original stack for use by uncommon_trap |
|
3794 array = do_null_check(array, T_OBJECT); |
|
3795 _sp -= nargs; |
|
3796 |
|
3797 // If array is dead, only null-path is taken. |
3494 // If array is dead, only null-path is taken. |
3798 if (stopped()) return true; |
3495 if (stopped()) return true; |
3799 |
3496 |
3800 // Deoptimize if it is a non-array. |
3497 // Deoptimize if it is a non-array. |
3801 Node* non_array = generate_non_array_guard(load_object_klass(array), NULL); |
3498 Node* non_array = generate_non_array_guard(load_object_klass(array), NULL); |
3802 |
3499 |
3803 if (non_array != NULL) { |
3500 if (non_array != NULL) { |
3804 PreserveJVMState pjvms(this); |
3501 PreserveJVMState pjvms(this); |
3805 set_control(non_array); |
3502 set_control(non_array); |
3806 _sp += nargs; // push the arguments back on the stack |
|
3807 uncommon_trap(Deoptimization::Reason_intrinsic, |
3503 uncommon_trap(Deoptimization::Reason_intrinsic, |
3808 Deoptimization::Action_maybe_recompile); |
3504 Deoptimization::Action_maybe_recompile); |
3809 } |
3505 } |
3810 |
3506 |
3811 // If control is dead, only non-array-path is taken. |
3507 // If control is dead, only non-array-path is taken. |
3812 if (stopped()) return true; |
3508 if (stopped()) return true; |
3813 |
3509 |
3814 // The works fine even if the array type is polymorphic. |
3510 // The works fine even if the array type is polymorphic. |
3815 // It could be a dynamic mix of int[], boolean[], Object[], etc. |
3511 // It could be a dynamic mix of int[], boolean[], Object[], etc. |
3816 push( load_array_length(array) ); |
3512 Node* result = load_array_length(array); |
3817 |
3513 |
3818 C->set_has_split_ifs(true); // Has chance for split-if optimization |
3514 C->set_has_split_ifs(true); // Has chance for split-if optimization |
3819 |
3515 set_result(result); |
3820 return true; |
3516 return true; |
3821 } |
3517 } |
3822 |
3518 |
3823 //------------------------inline_array_copyOf---------------------------- |
3519 //------------------------inline_array_copyOf---------------------------- |
3520 // public static <T,U> T[] java.util.Arrays.copyOf( U[] original, int newLength, Class<? extends T[]> newType); |
|
3521 // public static <T,U> T[] java.util.Arrays.copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType); |
|
3824 bool LibraryCallKit::inline_array_copyOf(bool is_copyOfRange) { |
3522 bool LibraryCallKit::inline_array_copyOf(bool is_copyOfRange) { |
3523 return false; |
|
3825 if (too_many_traps(Deoptimization::Reason_intrinsic)) return false; |
3524 if (too_many_traps(Deoptimization::Reason_intrinsic)) return false; |
3826 |
3525 |
3827 // Restore the stack and pop off the arguments. |
3526 // Get the arguments. |
3828 int nargs = 3 + (is_copyOfRange? 1: 0); |
|
3829 Node* original = argument(0); |
3527 Node* original = argument(0); |
3830 Node* start = is_copyOfRange? argument(1): intcon(0); |
3528 Node* start = is_copyOfRange? argument(1): intcon(0); |
3831 Node* end = is_copyOfRange? argument(2): argument(1); |
3529 Node* end = is_copyOfRange? argument(2): argument(1); |
3832 Node* array_type_mirror = is_copyOfRange? argument(3): argument(2); |
3530 Node* array_type_mirror = is_copyOfRange? argument(3): argument(2); |
3833 |
3531 |
3834 Node* newcopy; |
3532 Node* newcopy; |
3835 |
3533 |
3836 //set the original stack and the reexecute bit for the interpreter to reexecute |
3534 // Set the original stack and the reexecute bit for the interpreter to reexecute |
3837 //the bytecode that invokes Arrays.copyOf if deoptimization happens |
3535 // the bytecode that invokes Arrays.copyOf if deoptimization happens. |
3838 { PreserveReexecuteState preexecs(this); |
3536 { PreserveReexecuteState preexecs(this); |
3839 _sp += nargs; |
|
3840 jvms()->set_should_reexecute(true); |
3537 jvms()->set_should_reexecute(true); |
3841 |
3538 |
3842 array_type_mirror = do_null_check(array_type_mirror, T_OBJECT); |
3539 array_type_mirror = null_check(array_type_mirror); |
3843 original = do_null_check(original, T_OBJECT); |
3540 original = null_check(original); |
3844 |
3541 |
3845 // Check if a null path was taken unconditionally. |
3542 // Check if a null path was taken unconditionally. |
3846 if (stopped()) return true; |
3543 if (stopped()) return true; |
3847 |
3544 |
3848 Node* orig_length = load_array_length(original); |
3545 Node* orig_length = load_array_length(original); |
3849 |
3546 |
3850 Node* klass_node = load_klass_from_mirror(array_type_mirror, false, 0, |
3547 Node* klass_node = load_klass_from_mirror(array_type_mirror, false, NULL, 0); |
3851 NULL, 0); |
3548 klass_node = null_check(klass_node); |
3852 klass_node = do_null_check(klass_node, T_OBJECT); |
|
3853 |
3549 |
3854 RegionNode* bailout = new (C) RegionNode(1); |
3550 RegionNode* bailout = new (C) RegionNode(1); |
3855 record_for_igvn(bailout); |
3551 record_for_igvn(bailout); |
3856 |
3552 |
3857 // Despite the generic type of Arrays.copyOf, the mirror might be int, int[], etc. |
3553 // Despite the generic type of Arrays.copyOf, the mirror might be int, int[], etc. |
3870 generate_negative_guard(start, bailout, &start); |
3566 generate_negative_guard(start, bailout, &start); |
3871 generate_negative_guard(end, bailout, &end); |
3567 generate_negative_guard(end, bailout, &end); |
3872 |
3568 |
3873 Node* length = end; |
3569 Node* length = end; |
3874 if (_gvn.type(start) != TypeInt::ZERO) { |
3570 if (_gvn.type(start) != TypeInt::ZERO) { |
3875 length = _gvn.transform( new (C) SubINode(end, start) ); |
3571 length = _gvn.transform(new (C) SubINode(end, start)); |
3876 } |
3572 } |
3877 |
3573 |
3878 // Bail out if length is negative. |
3574 // Bail out if length is negative. |
3879 // Without this the new_array would throw |
3575 // Without this the new_array would throw |
3880 // NegativeArraySizeException but IllegalArgumentException is what |
3576 // NegativeArraySizeException but IllegalArgumentException is what |
3881 // should be thrown |
3577 // should be thrown |
3882 generate_negative_guard(length, bailout, &length); |
3578 generate_negative_guard(length, bailout, &length); |
3883 |
3579 |
3884 if (bailout->req() > 1) { |
3580 if (bailout->req() > 1) { |
3885 PreserveJVMState pjvms(this); |
3581 PreserveJVMState pjvms(this); |
3886 set_control( _gvn.transform(bailout) ); |
3582 set_control(_gvn.transform(bailout)); |
3887 uncommon_trap(Deoptimization::Reason_intrinsic, |
3583 uncommon_trap(Deoptimization::Reason_intrinsic, |
3888 Deoptimization::Action_maybe_recompile); |
3584 Deoptimization::Action_maybe_recompile); |
3889 } |
3585 } |
3890 |
3586 |
3891 if (!stopped()) { |
3587 if (!stopped()) { |
3892 |
|
3893 // How many elements will we copy from the original? |
3588 // How many elements will we copy from the original? |
3894 // The answer is MinI(orig_length - start, length). |
3589 // The answer is MinI(orig_length - start, length). |
3895 Node* orig_tail = _gvn.transform( new(C) SubINode(orig_length, start) ); |
3590 Node* orig_tail = _gvn.transform(new (C) SubINode(orig_length, start)); |
3896 Node* moved = generate_min_max(vmIntrinsics::_min, orig_tail, length); |
3591 Node* moved = generate_min_max(vmIntrinsics::_min, orig_tail, length); |
3897 |
3592 |
3898 newcopy = new_array(klass_node, length, 0); |
3593 newcopy = new_array(klass_node, length, 0); // no argments to push |
3899 |
3594 |
3900 // Generate a direct call to the right arraycopy function(s). |
3595 // Generate a direct call to the right arraycopy function(s). |
3901 // We know the copy is disjoint but we might not know if the |
3596 // We know the copy is disjoint but we might not know if the |
3902 // oop stores need checking. |
3597 // oop stores need checking. |
3903 // Extreme case: Arrays.copyOf((Integer[])x, 10, String[].class). |
3598 // Extreme case: Arrays.copyOf((Integer[])x, 10, String[].class). |
3908 bool length_never_negative = !is_copyOfRange; |
3603 bool length_never_negative = !is_copyOfRange; |
3909 generate_arraycopy(TypeAryPtr::OOPS, T_OBJECT, |
3604 generate_arraycopy(TypeAryPtr::OOPS, T_OBJECT, |
3910 original, start, newcopy, intcon(0), moved, |
3605 original, start, newcopy, intcon(0), moved, |
3911 disjoint_bases, length_never_negative); |
3606 disjoint_bases, length_never_negative); |
3912 } |
3607 } |
3913 } //original reexecute and sp are set back here |
3608 } // original reexecute is set back here |
3914 |
|
3915 if(!stopped()) { |
|
3916 push(newcopy); |
|
3917 } |
|
3918 |
3609 |
3919 C->set_has_split_ifs(true); // Has chance for split-if optimization |
3610 C->set_has_split_ifs(true); // Has chance for split-if optimization |
3920 |
3611 if (!stopped()) { |
3612 set_result(newcopy); |
|
3613 } |
|
3921 return true; |
3614 return true; |
3922 } |
3615 } |
3923 |
3616 |
3924 |
3617 |
3925 //----------------------generate_virtual_guard--------------------------- |
3618 //----------------------generate_virtual_guard--------------------------- |
3967 assert(!is_virtual, ""); |
3660 assert(!is_virtual, ""); |
3968 slow_call = new(C) CallStaticJavaNode(tf, |
3661 slow_call = new(C) CallStaticJavaNode(tf, |
3969 SharedRuntime::get_resolve_static_call_stub(), |
3662 SharedRuntime::get_resolve_static_call_stub(), |
3970 method, bci()); |
3663 method, bci()); |
3971 } else if (is_virtual) { |
3664 } else if (is_virtual) { |
3972 null_check_receiver(method); |
3665 null_check_receiver(); |
3973 int vtable_index = Method::invalid_vtable_index; |
3666 int vtable_index = Method::invalid_vtable_index; |
3974 if (UseInlineCaches) { |
3667 if (UseInlineCaches) { |
3975 // Suppress the vtable call |
3668 // Suppress the vtable call |
3976 } else { |
3669 } else { |
3977 // hashCode and clone are not a miranda methods, |
3670 // hashCode and clone are not a miranda methods, |
3981 } |
3674 } |
3982 slow_call = new(C) CallDynamicJavaNode(tf, |
3675 slow_call = new(C) CallDynamicJavaNode(tf, |
3983 SharedRuntime::get_resolve_virtual_call_stub(), |
3676 SharedRuntime::get_resolve_virtual_call_stub(), |
3984 method, vtable_index, bci()); |
3677 method, vtable_index, bci()); |
3985 } else { // neither virtual nor static: opt_virtual |
3678 } else { // neither virtual nor static: opt_virtual |
3986 null_check_receiver(method); |
3679 null_check_receiver(); |
3987 slow_call = new(C) CallStaticJavaNode(tf, |
3680 slow_call = new(C) CallStaticJavaNode(tf, |
3988 SharedRuntime::get_resolve_opt_virtual_call_stub(), |
3681 SharedRuntime::get_resolve_opt_virtual_call_stub(), |
3989 method, bci()); |
3682 method, bci()); |
3990 slow_call->set_optimized_virtual(true); |
3683 slow_call->set_optimized_virtual(true); |
3991 } |
3684 } |
4010 PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY, |
3703 PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY, |
4011 TypePtr::BOTTOM); |
3704 TypePtr::BOTTOM); |
4012 Node* obj = NULL; |
3705 Node* obj = NULL; |
4013 if (!is_static) { |
3706 if (!is_static) { |
4014 // Check for hashing null object |
3707 // Check for hashing null object |
4015 obj = null_check_receiver(callee()); |
3708 obj = null_check_receiver(); |
4016 if (stopped()) return true; // unconditionally null |
3709 if (stopped()) return true; // unconditionally null |
4017 result_reg->init_req(_null_path, top()); |
3710 result_reg->init_req(_null_path, top()); |
4018 result_val->init_req(_null_path, top()); |
3711 result_val->init_req(_null_path, top()); |
4019 } else { |
3712 } else { |
4020 // Do a null check, and return zero if null. |
3713 // Do a null check, and return zero if null. |
4026 result_val->init_req(_null_path, _gvn.intcon(0)); |
3719 result_val->init_req(_null_path, _gvn.intcon(0)); |
4027 } |
3720 } |
4028 |
3721 |
4029 // Unconditionally null? Then return right away. |
3722 // Unconditionally null? Then return right away. |
4030 if (stopped()) { |
3723 if (stopped()) { |
4031 set_control( result_reg->in(_null_path) ); |
3724 set_control( result_reg->in(_null_path)); |
4032 if (!stopped()) |
3725 if (!stopped()) |
4033 push( result_val ->in(_null_path) ); |
3726 set_result(result_val->in(_null_path)); |
4034 return true; |
3727 return true; |
4035 } |
3728 } |
4036 |
3729 |
4037 // After null check, get the object's klass. |
3730 // After null check, get the object's klass. |
4038 Node* obj_klass = load_object_klass(obj); |
3731 Node* obj_klass = load_object_klass(obj); |
4101 // Generate code for the slow case. We make a call to hashCode(). |
3794 // Generate code for the slow case. We make a call to hashCode(). |
4102 set_control(_gvn.transform(slow_region)); |
3795 set_control(_gvn.transform(slow_region)); |
4103 if (!stopped()) { |
3796 if (!stopped()) { |
4104 // No need for PreserveJVMState, because we're using up the present state. |
3797 // No need for PreserveJVMState, because we're using up the present state. |
4105 set_all_memory(init_mem); |
3798 set_all_memory(init_mem); |
4106 vmIntrinsics::ID hashCode_id = vmIntrinsics::_hashCode; |
3799 vmIntrinsics::ID hashCode_id = is_static ? vmIntrinsics::_identityHashCode : vmIntrinsics::_hashCode; |
4107 if (is_static) hashCode_id = vmIntrinsics::_identityHashCode; |
|
4108 CallJavaNode* slow_call = generate_method_call(hashCode_id, is_virtual, is_static); |
3800 CallJavaNode* slow_call = generate_method_call(hashCode_id, is_virtual, is_static); |
4109 Node* slow_result = set_results_for_java_call(slow_call); |
3801 Node* slow_result = set_results_for_java_call(slow_call); |
4110 // this->control() comes from set_results_for_java_call |
3802 // this->control() comes from set_results_for_java_call |
4111 result_reg->init_req(_slow_path, control()); |
3803 result_reg->init_req(_slow_path, control()); |
4112 result_val->init_req(_slow_path, slow_result); |
3804 result_val->init_req(_slow_path, slow_result); |
4115 } |
3807 } |
4116 |
3808 |
4117 // Return the combined state. |
3809 // Return the combined state. |
4118 set_i_o( _gvn.transform(result_io) ); |
3810 set_i_o( _gvn.transform(result_io) ); |
4119 set_all_memory( _gvn.transform(result_mem) ); |
3811 set_all_memory( _gvn.transform(result_mem) ); |
4120 push_result(result_reg, result_val); |
3812 |
4121 |
3813 set_result(result_reg, result_val); |
4122 return true; |
3814 return true; |
4123 } |
3815 } |
4124 |
3816 |
4125 //---------------------------inline_native_getClass---------------------------- |
3817 //---------------------------inline_native_getClass---------------------------- |
3818 // public final native Class<?> java.lang.Object.getClass(); |
|
3819 // |
|
4126 // Build special case code for calls to getClass on an object. |
3820 // Build special case code for calls to getClass on an object. |
4127 bool LibraryCallKit::inline_native_getClass() { |
3821 bool LibraryCallKit::inline_native_getClass() { |
4128 Node* obj = null_check_receiver(callee()); |
3822 Node* obj = null_check_receiver(); |
4129 if (stopped()) return true; |
3823 if (stopped()) return true; |
4130 push( load_mirror_from_klass(load_object_klass(obj)) ); |
3824 set_result(load_mirror_from_klass(load_object_klass(obj))); |
4131 return true; |
3825 return true; |
4132 } |
3826 } |
4133 |
3827 |
4134 //-----------------inline_native_Reflection_getCallerClass--------------------- |
3828 //-----------------inline_native_Reflection_getCallerClass--------------------- |
3829 // public static native Class<?> sun.reflect.Reflection.getCallerClass(int realFramesToSkip); |
|
3830 // |
|
4135 // In the presence of deep enough inlining, getCallerClass() becomes a no-op. |
3831 // In the presence of deep enough inlining, getCallerClass() becomes a no-op. |
4136 // |
3832 // |
4137 // NOTE that this code must perform the same logic as |
3833 // NOTE that this code must perform the same logic as |
4138 // vframeStream::security_get_caller_frame in that it must skip |
3834 // vframeStream::security_get_caller_frame in that it must skip |
4139 // Method.invoke() and auxiliary frames. |
3835 // Method.invoke() and auxiliary frames. |
4140 |
|
4141 |
|
4142 |
|
4143 |
|
4144 bool LibraryCallKit::inline_native_Reflection_getCallerClass() { |
3836 bool LibraryCallKit::inline_native_Reflection_getCallerClass() { |
4145 ciMethod* method = callee(); |
|
4146 |
|
4147 #ifndef PRODUCT |
3837 #ifndef PRODUCT |
4148 if ((PrintIntrinsics || PrintInlining || PrintOptoInlining) && Verbose) { |
3838 if ((PrintIntrinsics || PrintInlining || PrintOptoInlining) && Verbose) { |
4149 tty->print_cr("Attempting to inline sun.reflect.Reflection.getCallerClass"); |
3839 tty->print_cr("Attempting to inline sun.reflect.Reflection.getCallerClass"); |
4150 } |
3840 } |
4151 #endif |
3841 #endif |
4152 |
3842 |
4153 debug_only(int saved_sp = _sp); |
3843 Node* caller_depth_node = argument(0); |
4154 |
|
4155 // Argument words: (int depth) |
|
4156 int nargs = 1; |
|
4157 |
|
4158 _sp += nargs; |
|
4159 Node* caller_depth_node = pop(); |
|
4160 |
|
4161 assert(saved_sp == _sp, "must have correct argument count"); |
|
4162 |
3844 |
4163 // The depth value must be a constant in order for the runtime call |
3845 // The depth value must be a constant in order for the runtime call |
4164 // to be eliminated. |
3846 // to be eliminated. |
4165 const TypeInt* caller_depth_type = _gvn.type(caller_depth_node)->isa_int(); |
3847 const TypeInt* caller_depth_type = _gvn.type(caller_depth_node)->isa_int(); |
4166 if (caller_depth_type == NULL || !caller_depth_type->is_con()) { |
3848 if (caller_depth_type == NULL || !caller_depth_type->is_con()) { |
4228 #ifndef PRODUCT |
3910 #ifndef PRODUCT |
4229 if ((PrintIntrinsics || PrintInlining || PrintOptoInlining) && Verbose) { |
3911 if ((PrintIntrinsics || PrintInlining || PrintOptoInlining) && Verbose) { |
4230 tty->print_cr(" Bailing out because caller depth (%d) exceeded inlining depth (%d)", caller_depth_type->get_con(), _depth); |
3912 tty->print_cr(" Bailing out because caller depth (%d) exceeded inlining depth (%d)", caller_depth_type->get_con(), _depth); |
4231 tty->print_cr(" JVM state at this point:"); |
3913 tty->print_cr(" JVM state at this point:"); |
4232 for (int i = _depth; i >= 1; i--) { |
3914 for (int i = _depth; i >= 1; i--) { |
4233 tty->print_cr(" %d) %s", i, jvms()->of_depth(i)->method()->name()->as_utf8()); |
3915 ciMethod* m = jvms()->of_depth(i)->method(); |
3916 tty->print_cr(" %d) %s.%s", i, m->holder()->name()->as_utf8(), m->name()->as_utf8()); |
|
4234 } |
3917 } |
4235 } |
3918 } |
4236 #endif |
3919 #endif |
4237 return false; // Reached end of inlining |
3920 return false; // Reached end of inlining |
4238 } |
3921 } |
4239 |
3922 |
4240 // Acquire method holder as java.lang.Class |
3923 // Acquire method holder as java.lang.Class |
4241 ciInstanceKlass* caller_klass = caller_jvms->method()->holder(); |
3924 ciInstanceKlass* caller_klass = caller_jvms->method()->holder(); |
4242 ciInstance* caller_mirror = caller_klass->java_mirror(); |
3925 ciInstance* caller_mirror = caller_klass->java_mirror(); |
3926 |
|
4243 // Push this as a constant |
3927 // Push this as a constant |
4244 push(makecon(TypeInstPtr::make(caller_mirror))); |
3928 set_result(makecon(TypeInstPtr::make(caller_mirror))); |
3929 |
|
4245 #ifndef PRODUCT |
3930 #ifndef PRODUCT |
4246 if ((PrintIntrinsics || PrintInlining || PrintOptoInlining) && Verbose) { |
3931 if ((PrintIntrinsics || PrintInlining || PrintOptoInlining) && Verbose) { |
4247 tty->print_cr(" Succeeded: caller = %s.%s, caller depth = %d, depth = %d", caller_klass->name()->as_utf8(), caller_jvms->method()->name()->as_utf8(), caller_depth_type->get_con(), _depth); |
3932 tty->print_cr(" Succeeded: caller = %s.%s, caller depth = %d, depth = %d", caller_klass->name()->as_utf8(), caller_jvms->method()->name()->as_utf8(), caller_depth_type->get_con(), _depth); |
4248 tty->print_cr(" JVM state at this point:"); |
3933 tty->print_cr(" JVM state at this point:"); |
4249 for (int i = _depth; i >= 1; i--) { |
3934 for (int i = _depth; i >= 1; i--) { |
4250 tty->print_cr(" %d) %s", i, jvms()->of_depth(i)->method()->name()->as_utf8()); |
3935 ciMethod* m = jvms()->of_depth(i)->method(); |
3936 tty->print_cr(" %d) %s.%s", i, m->holder()->name()->as_utf8(), m->name()->as_utf8()); |
|
4251 } |
3937 } |
4252 } |
3938 } |
4253 #endif |
3939 #endif |
4254 return true; |
3940 return true; |
4255 } |
3941 } |
4281 |
3967 |
4282 return false; |
3968 return false; |
4283 } |
3969 } |
4284 |
3970 |
4285 bool LibraryCallKit::inline_fp_conversions(vmIntrinsics::ID id) { |
3971 bool LibraryCallKit::inline_fp_conversions(vmIntrinsics::ID id) { |
4286 // restore the arguments |
3972 Node* arg = argument(0); |
4287 _sp += arg_size(); |
3973 Node* result; |
4288 |
3974 |
4289 switch (id) { |
3975 switch (id) { |
4290 case vmIntrinsics::_floatToRawIntBits: |
3976 case vmIntrinsics::_floatToRawIntBits: result = new (C) MoveF2INode(arg); break; |
4291 push(_gvn.transform( new (C) MoveF2INode(pop()))); |
3977 case vmIntrinsics::_intBitsToFloat: result = new (C) MoveI2FNode(arg); break; |
4292 break; |
3978 case vmIntrinsics::_doubleToRawLongBits: result = new (C) MoveD2LNode(arg); break; |
4293 |
3979 case vmIntrinsics::_longBitsToDouble: result = new (C) MoveL2DNode(arg); break; |
4294 case vmIntrinsics::_intBitsToFloat: |
|
4295 push(_gvn.transform( new (C) MoveI2FNode(pop()))); |
|
4296 break; |
|
4297 |
|
4298 case vmIntrinsics::_doubleToRawLongBits: |
|
4299 push_pair(_gvn.transform( new (C) MoveD2LNode(pop_pair()))); |
|
4300 break; |
|
4301 |
|
4302 case vmIntrinsics::_longBitsToDouble: |
|
4303 push_pair(_gvn.transform( new (C) MoveL2DNode(pop_pair()))); |
|
4304 break; |
|
4305 |
3980 |
4306 case vmIntrinsics::_doubleToLongBits: { |
3981 case vmIntrinsics::_doubleToLongBits: { |
4307 Node* value = pop_pair(); |
|
4308 |
|
4309 // two paths (plus control) merge in a wood |
3982 // two paths (plus control) merge in a wood |
4310 RegionNode *r = new (C) RegionNode(3); |
3983 RegionNode *r = new (C) RegionNode(3); |
4311 Node *phi = new (C) PhiNode(r, TypeLong::LONG); |
3984 Node *phi = new (C) PhiNode(r, TypeLong::LONG); |
4312 |
3985 |
4313 Node *cmpisnan = _gvn.transform( new (C) CmpDNode(value, value)); |
3986 Node *cmpisnan = _gvn.transform(new (C) CmpDNode(arg, arg)); |
4314 // Build the boolean node |
3987 // Build the boolean node |
4315 Node *bolisnan = _gvn.transform( new (C) BoolNode( cmpisnan, BoolTest::ne ) ); |
3988 Node *bolisnan = _gvn.transform(new (C) BoolNode(cmpisnan, BoolTest::ne)); |
4316 |
3989 |
4317 // Branch either way. |
3990 // Branch either way. |
4318 // NaN case is less traveled, which makes all the difference. |
3991 // NaN case is less traveled, which makes all the difference. |
4319 IfNode *ifisnan = create_and_xform_if(control(), bolisnan, PROB_STATIC_FREQUENT, COUNT_UNKNOWN); |
3992 IfNode *ifisnan = create_and_xform_if(control(), bolisnan, PROB_STATIC_FREQUENT, COUNT_UNKNOWN); |
4320 Node *opt_isnan = _gvn.transform(ifisnan); |
3993 Node *opt_isnan = _gvn.transform(ifisnan); |
4328 Node *slow_result = longcon(nan_bits); // return NaN |
4001 Node *slow_result = longcon(nan_bits); // return NaN |
4329 phi->init_req(1, _gvn.transform( slow_result )); |
4002 phi->init_req(1, _gvn.transform( slow_result )); |
4330 r->init_req(1, iftrue); |
4003 r->init_req(1, iftrue); |
4331 |
4004 |
4332 // Else fall through |
4005 // Else fall through |
4333 Node *iffalse = _gvn.transform( new (C) IfFalseNode(opt_ifisnan) ); |
4006 Node *iffalse = _gvn.transform(new (C) IfFalseNode(opt_ifisnan)); |
4334 set_control(iffalse); |
4007 set_control(iffalse); |
4335 |
4008 |
4336 phi->init_req(2, _gvn.transform( new (C) MoveD2LNode(value))); |
4009 phi->init_req(2, _gvn.transform(new (C) MoveD2LNode(arg))); |
4337 r->init_req(2, iffalse); |
4010 r->init_req(2, iffalse); |
4338 |
4011 |
4339 // Post merge |
4012 // Post merge |
4340 set_control(_gvn.transform(r)); |
4013 set_control(_gvn.transform(r)); |
4341 record_for_igvn(r); |
4014 record_for_igvn(r); |
4342 |
4015 |
4343 Node* result = _gvn.transform(phi); |
4016 C->set_has_split_ifs(true); // Has chance for split-if optimization |
4017 result = phi; |
|
4344 assert(result->bottom_type()->isa_long(), "must be"); |
4018 assert(result->bottom_type()->isa_long(), "must be"); |
4345 push_pair(result); |
|
4346 |
|
4347 C->set_has_split_ifs(true); // Has chance for split-if optimization |
|
4348 |
|
4349 break; |
4019 break; |
4350 } |
4020 } |
4351 |
4021 |
4352 case vmIntrinsics::_floatToIntBits: { |
4022 case vmIntrinsics::_floatToIntBits: { |
4353 Node* value = pop(); |
|
4354 |
|
4355 // two paths (plus control) merge in a wood |
4023 // two paths (plus control) merge in a wood |
4356 RegionNode *r = new (C) RegionNode(3); |
4024 RegionNode *r = new (C) RegionNode(3); |
4357 Node *phi = new (C) PhiNode(r, TypeInt::INT); |
4025 Node *phi = new (C) PhiNode(r, TypeInt::INT); |
4358 |
4026 |
4359 Node *cmpisnan = _gvn.transform( new (C) CmpFNode(value, value)); |
4027 Node *cmpisnan = _gvn.transform(new (C) CmpFNode(arg, arg)); |
4360 // Build the boolean node |
4028 // Build the boolean node |
4361 Node *bolisnan = _gvn.transform( new (C) BoolNode( cmpisnan, BoolTest::ne ) ); |
4029 Node *bolisnan = _gvn.transform(new (C) BoolNode(cmpisnan, BoolTest::ne)); |
4362 |
4030 |
4363 // Branch either way. |
4031 // Branch either way. |
4364 // NaN case is less traveled, which makes all the difference. |
4032 // NaN case is less traveled, which makes all the difference. |
4365 IfNode *ifisnan = create_and_xform_if(control(), bolisnan, PROB_STATIC_FREQUENT, COUNT_UNKNOWN); |
4033 IfNode *ifisnan = create_and_xform_if(control(), bolisnan, PROB_STATIC_FREQUENT, COUNT_UNKNOWN); |
4366 Node *opt_isnan = _gvn.transform(ifisnan); |
4034 Node *opt_isnan = _gvn.transform(ifisnan); |
4374 Node *slow_result = makecon(TypeInt::make(nan_bits)); // return NaN |
4042 Node *slow_result = makecon(TypeInt::make(nan_bits)); // return NaN |
4375 phi->init_req(1, _gvn.transform( slow_result )); |
4043 phi->init_req(1, _gvn.transform( slow_result )); |
4376 r->init_req(1, iftrue); |
4044 r->init_req(1, iftrue); |
4377 |
4045 |
4378 // Else fall through |
4046 // Else fall through |
4379 Node *iffalse = _gvn.transform( new (C) IfFalseNode(opt_ifisnan) ); |
4047 Node *iffalse = _gvn.transform(new (C) IfFalseNode(opt_ifisnan)); |
4380 set_control(iffalse); |
4048 set_control(iffalse); |
4381 |
4049 |
4382 phi->init_req(2, _gvn.transform( new (C) MoveF2INode(value))); |
4050 phi->init_req(2, _gvn.transform(new (C) MoveF2INode(arg))); |
4383 r->init_req(2, iffalse); |
4051 r->init_req(2, iffalse); |
4384 |
4052 |
4385 // Post merge |
4053 // Post merge |
4386 set_control(_gvn.transform(r)); |
4054 set_control(_gvn.transform(r)); |
4387 record_for_igvn(r); |
4055 record_for_igvn(r); |
4388 |
4056 |
4389 Node* result = _gvn.transform(phi); |
4057 C->set_has_split_ifs(true); // Has chance for split-if optimization |
4058 result = phi; |
|
4390 assert(result->bottom_type()->isa_int(), "must be"); |
4059 assert(result->bottom_type()->isa_int(), "must be"); |
4391 push(result); |
|
4392 |
|
4393 C->set_has_split_ifs(true); // Has chance for split-if optimization |
|
4394 |
|
4395 break; |
4060 break; |
4396 } |
4061 } |
4397 |
4062 |
4398 default: |
4063 default: |
4399 ShouldNotReachHere(); |
4064 fatal_unexpected_iid(id); |
4400 } |
4065 break; |
4401 |
4066 } |
4067 set_result(_gvn.transform(result)); |
|
4402 return true; |
4068 return true; |
4403 } |
4069 } |
4404 |
4070 |
4405 #ifdef _LP64 |
4071 #ifdef _LP64 |
4406 #define XTOP ,top() /*additional argument*/ |
4072 #define XTOP ,top() /*additional argument*/ |
4407 #else //_LP64 |
4073 #else //_LP64 |
4408 #define XTOP /*no additional argument*/ |
4074 #define XTOP /*no additional argument*/ |
4409 #endif //_LP64 |
4075 #endif //_LP64 |
4410 |
4076 |
4411 //----------------------inline_unsafe_copyMemory------------------------- |
4077 //----------------------inline_unsafe_copyMemory------------------------- |
4078 // public native void sun.misc.Unsafe.copyMemory(Object srcBase, long srcOffset, Object destBase, long destOffset, long bytes); |
|
4412 bool LibraryCallKit::inline_unsafe_copyMemory() { |
4079 bool LibraryCallKit::inline_unsafe_copyMemory() { |
4413 if (callee()->is_static()) return false; // caller must have the capability! |
4080 if (callee()->is_static()) return false; // caller must have the capability! |
4414 int nargs = 1 + 5 + 3; // 5 args: (src: ptr,off, dst: ptr,off, size) |
4081 null_check_receiver(); // null-check receiver |
4415 assert(signature()->size() == nargs-1, "copy has 5 arguments"); |
|
4416 null_check_receiver(callee()); // check then ignore argument(0) |
|
4417 if (stopped()) return true; |
4082 if (stopped()) return true; |
4418 |
4083 |
4419 C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe". |
4084 C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe". |
4420 |
4085 |
4421 Node* src_ptr = argument(1); |
4086 Node* src_ptr = argument(1); // type: oop |
4422 Node* src_off = ConvL2X(argument(2)); |
4087 Node* src_off = ConvL2X(argument(2)); // type: long |
4423 assert(argument(3)->is_top(), "2nd half of long"); |
4088 Node* dst_ptr = argument(4); // type: oop |
4424 Node* dst_ptr = argument(4); |
4089 Node* dst_off = ConvL2X(argument(5)); // type: long |
4425 Node* dst_off = ConvL2X(argument(5)); |
4090 Node* size = ConvL2X(argument(7)); // type: long |
4426 assert(argument(6)->is_top(), "2nd half of long"); |
|
4427 Node* size = ConvL2X(argument(7)); |
|
4428 assert(argument(8)->is_top(), "2nd half of long"); |
|
4429 |
4091 |
4430 assert(Unsafe_field_offset_to_byte_offset(11) == 11, |
4092 assert(Unsafe_field_offset_to_byte_offset(11) == 11, |
4431 "fieldOffset must be byte-scaled"); |
4093 "fieldOffset must be byte-scaled"); |
4432 |
4094 |
4433 Node* src = make_unsafe_address(src_ptr, src_off); |
4095 Node* src = make_unsafe_address(src_ptr, src_off); |
4543 insert_mem_bar(Op_MemBarCPUOrder); |
4205 insert_mem_bar(Op_MemBarCPUOrder); |
4544 } |
4206 } |
4545 } |
4207 } |
4546 |
4208 |
4547 //------------------------inline_native_clone---------------------------- |
4209 //------------------------inline_native_clone---------------------------- |
4210 // protected native Object java.lang.Object.clone(); |
|
4211 // |
|
4548 // Here are the simple edge cases: |
4212 // Here are the simple edge cases: |
4549 // null receiver => normal trap |
4213 // null receiver => normal trap |
4550 // virtual and clone was overridden => slow path to out-of-line clone |
4214 // virtual and clone was overridden => slow path to out-of-line clone |
4551 // not cloneable or finalizer => slow path to out-of-line Object.clone |
4215 // not cloneable or finalizer => slow path to out-of-line Object.clone |
4552 // |
4216 // |
4559 // |
4223 // |
4560 // These steps fold up nicely if and when the cloned object's klass |
4224 // These steps fold up nicely if and when the cloned object's klass |
4561 // can be sharply typed as an object array, a type array, or an instance. |
4225 // can be sharply typed as an object array, a type array, or an instance. |
4562 // |
4226 // |
4563 bool LibraryCallKit::inline_native_clone(bool is_virtual) { |
4227 bool LibraryCallKit::inline_native_clone(bool is_virtual) { |
4564 int nargs = 1; |
|
4565 PhiNode* result_val; |
4228 PhiNode* result_val; |
4566 |
4229 |
4567 //set the original stack and the reexecute bit for the interpreter to reexecute |
4230 // Set the reexecute bit for the interpreter to reexecute |
4568 //the bytecode that invokes Object.clone if deoptimization happens |
4231 // the bytecode that invokes Object.clone if deoptimization happens. |
4569 { PreserveReexecuteState preexecs(this); |
4232 { PreserveReexecuteState preexecs(this); |
4570 jvms()->set_should_reexecute(true); |
4233 jvms()->set_should_reexecute(true); |
4571 |
4234 |
4572 //null_check_receiver will adjust _sp (push and pop) |
4235 Node* obj = null_check_receiver(); |
4573 Node* obj = null_check_receiver(callee()); |
|
4574 if (stopped()) return true; |
4236 if (stopped()) return true; |
4575 |
|
4576 _sp += nargs; |
|
4577 |
4237 |
4578 Node* obj_klass = load_object_klass(obj); |
4238 Node* obj_klass = load_object_klass(obj); |
4579 const TypeKlassPtr* tklass = _gvn.type(obj_klass)->isa_klassptr(); |
4239 const TypeKlassPtr* tklass = _gvn.type(obj_klass)->isa_klassptr(); |
4580 const TypeOopPtr* toop = ((tklass != NULL) |
4240 const TypeOopPtr* toop = ((tklass != NULL) |
4581 ? tklass->as_instance_type() |
4241 ? tklass->as_instance_type() |
4609 // It's an array. |
4269 // It's an array. |
4610 PreserveJVMState pjvms(this); |
4270 PreserveJVMState pjvms(this); |
4611 set_control(array_ctl); |
4271 set_control(array_ctl); |
4612 Node* obj_length = load_array_length(obj); |
4272 Node* obj_length = load_array_length(obj); |
4613 Node* obj_size = NULL; |
4273 Node* obj_size = NULL; |
4614 Node* alloc_obj = new_array(obj_klass, obj_length, 0, &obj_size); |
4274 Node* alloc_obj = new_array(obj_klass, obj_length, 0, &obj_size); // no arguments to push |
4615 |
4275 |
4616 if (!use_ReduceInitialCardMarks()) { |
4276 if (!use_ReduceInitialCardMarks()) { |
4617 // If it is an oop array, it requires very special treatment, |
4277 // If it is an oop array, it requires very special treatment, |
4618 // because card marking is required on each card of the array. |
4278 // because card marking is required on each card of the array. |
4619 Node* is_obja = generate_objArray_guard(obj_klass, (RegionNode*)NULL); |
4279 Node* is_obja = generate_objArray_guard(obj_klass, (RegionNode*)NULL); |
4709 |
4369 |
4710 // Return the combined state. |
4370 // Return the combined state. |
4711 set_control( _gvn.transform(result_reg) ); |
4371 set_control( _gvn.transform(result_reg) ); |
4712 set_i_o( _gvn.transform(result_i_o) ); |
4372 set_i_o( _gvn.transform(result_i_o) ); |
4713 set_all_memory( _gvn.transform(result_mem) ); |
4373 set_all_memory( _gvn.transform(result_mem) ); |
4714 } //original reexecute and sp are set back here |
4374 } // original reexecute is set back here |
4715 |
4375 |
4716 push(_gvn.transform(result_val)); |
4376 set_result(_gvn.transform(result_val)); |
4717 |
|
4718 return true; |
4377 return true; |
4719 } |
4378 } |
4720 |
4379 |
4721 //------------------------------basictype2arraycopy---------------------------- |
4380 //------------------------------basictype2arraycopy---------------------------- |
4722 address LibraryCallKit::basictype2arraycopy(BasicType t, |
4381 address LibraryCallKit::basictype2arraycopy(BasicType t, |
4753 return StubRoutines::select_arraycopy_function(t, aligned, disjoint, name, dest_uninitialized); |
4412 return StubRoutines::select_arraycopy_function(t, aligned, disjoint, name, dest_uninitialized); |
4754 } |
4413 } |
4755 |
4414 |
4756 |
4415 |
4757 //------------------------------inline_arraycopy----------------------- |
4416 //------------------------------inline_arraycopy----------------------- |
4417 // public static native void java.lang.System.arraycopy(Object src, int srcPos, |
|
4418 // Object dest, int destPos, |
|
4419 // int length); |
|
4758 bool LibraryCallKit::inline_arraycopy() { |
4420 bool LibraryCallKit::inline_arraycopy() { |
4759 // Restore the stack and pop off the arguments. |
4421 // Get the arguments. |
4760 int nargs = 5; // 2 oops, 3 ints, no size_t or long |
4422 Node* src = argument(0); // type: oop |
4761 assert(callee()->signature()->size() == nargs, "copy has 5 arguments"); |
4423 Node* src_offset = argument(1); // type: int |
4762 |
4424 Node* dest = argument(2); // type: oop |
4763 Node *src = argument(0); |
4425 Node* dest_offset = argument(3); // type: int |
4764 Node *src_offset = argument(1); |
4426 Node* length = argument(4); // type: int |
4765 Node *dest = argument(2); |
|
4766 Node *dest_offset = argument(3); |
|
4767 Node *length = argument(4); |
|
4768 |
4427 |
4769 // Compile time checks. If any of these checks cannot be verified at compile time, |
4428 // Compile time checks. If any of these checks cannot be verified at compile time, |
4770 // we do not make a fast path for this call. Instead, we let the call remain as it |
4429 // we do not make a fast path for this call. Instead, we let the call remain as it |
4771 // is. The checks we choose to mandate at compile time are: |
4430 // is. The checks we choose to mandate at compile time are: |
4772 // |
4431 // |
4773 // (1) src and dest are arrays. |
4432 // (1) src and dest are arrays. |
4774 const Type* src_type = src->Value(&_gvn); |
4433 const Type* src_type = src->Value(&_gvn); |
4775 const Type* dest_type = dest->Value(&_gvn); |
4434 const Type* dest_type = dest->Value(&_gvn); |
4776 const TypeAryPtr* top_src = src_type->isa_aryptr(); |
4435 const TypeAryPtr* top_src = src_type->isa_aryptr(); |
4777 const TypeAryPtr* top_dest = dest_type->isa_aryptr(); |
4436 const TypeAryPtr* top_dest = dest_type->isa_aryptr(); |
4778 if (top_src == NULL || top_src->klass() == NULL || |
4437 if (top_src == NULL || top_src->klass() == NULL || |
4779 top_dest == NULL || top_dest->klass() == NULL) { |
4438 top_dest == NULL || top_dest->klass() == NULL) { |
4780 // Conservatively insert a memory barrier on all memory slices. |
4439 // Conservatively insert a memory barrier on all memory slices. |
4781 // Do not let writes into the source float below the arraycopy. |
4440 // Do not let writes into the source float below the arraycopy. |
4826 |
4485 |
4827 RegionNode* slow_region = new (C) RegionNode(1); |
4486 RegionNode* slow_region = new (C) RegionNode(1); |
4828 record_for_igvn(slow_region); |
4487 record_for_igvn(slow_region); |
4829 |
4488 |
4830 // (3) operands must not be null |
4489 // (3) operands must not be null |
4831 // We currently perform our null checks with the do_null_check routine. |
4490 // We currently perform our null checks with the null_check routine. |
4832 // This means that the null exceptions will be reported in the caller |
4491 // This means that the null exceptions will be reported in the caller |
4833 // rather than (correctly) reported inside of the native arraycopy call. |
4492 // rather than (correctly) reported inside of the native arraycopy call. |
4834 // This should be corrected, given time. We do our null check with the |
4493 // This should be corrected, given time. We do our null check with the |
4835 // stack pointer restored. |
4494 // stack pointer restored. |
4836 _sp += nargs; |
4495 src = null_check(src, T_ARRAY); |
4837 src = do_null_check(src, T_ARRAY); |
4496 dest = null_check(dest, T_ARRAY); |
4838 dest = do_null_check(dest, T_ARRAY); |
|
4839 _sp -= nargs; |
|
4840 |
4497 |
4841 // (4) src_offset must not be negative. |
4498 // (4) src_offset must not be negative. |
4842 generate_negative_guard(src_offset, slow_region); |
4499 generate_negative_guard(src_offset, slow_region); |
4843 |
4500 |
4844 // (5) dest_offset must not be negative. |
4501 // (5) dest_offset must not be negative. |
5177 |
4834 |
5178 // Here are all the slow paths up to this point, in one bundle: |
4835 // Here are all the slow paths up to this point, in one bundle: |
5179 slow_control = top(); |
4836 slow_control = top(); |
5180 if (slow_region != NULL) |
4837 if (slow_region != NULL) |
5181 slow_control = _gvn.transform(slow_region); |
4838 slow_control = _gvn.transform(slow_region); |
5182 debug_only(slow_region = (RegionNode*)badAddress); |
4839 DEBUG_ONLY(slow_region = (RegionNode*)badAddress); |
5183 |
4840 |
5184 set_control(checked_control); |
4841 set_control(checked_control); |
5185 if (!stopped()) { |
4842 if (!stopped()) { |
5186 // Clean up after the checked call. |
4843 // Clean up after the checked call. |
5187 // The returned value is either 0 or -1^K, |
4844 // The returned value is either 0 or -1^K, |
5672 copyfunc_addr, copyfunc_name, adr_type, |
5329 copyfunc_addr, copyfunc_name, adr_type, |
5673 src_start, dest_start, copy_length XTOP); |
5330 src_start, dest_start, copy_length XTOP); |
5674 } |
5331 } |
5675 |
5332 |
5676 //----------------------------inline_reference_get---------------------------- |
5333 //----------------------------inline_reference_get---------------------------- |
5677 |
5334 // public T java.lang.ref.Reference.get(); |
5678 bool LibraryCallKit::inline_reference_get() { |
5335 bool LibraryCallKit::inline_reference_get() { |
5679 const int nargs = 1; // self |
5336 const int referent_offset = java_lang_ref_Reference::referent_offset; |
5680 |
5337 guarantee(referent_offset > 0, "should have already been set"); |
5681 guarantee(java_lang_ref_Reference::referent_offset > 0, |
5338 |
5682 "should have already been set"); |
5339 // Get the argument: |
5683 |
5340 Node* reference_obj = null_check_receiver(); |
5684 int referent_offset = java_lang_ref_Reference::referent_offset; |
|
5685 |
|
5686 // Restore the stack and pop off the argument |
|
5687 _sp += nargs; |
|
5688 Node *reference_obj = pop(); |
|
5689 |
|
5690 // Null check on self without removing any arguments. |
|
5691 _sp += nargs; |
|
5692 reference_obj = do_null_check(reference_obj, T_OBJECT); |
|
5693 _sp -= nargs;; |
|
5694 |
|
5695 if (stopped()) return true; |
5341 if (stopped()) return true; |
5696 |
5342 |
5697 Node *adr = basic_plus_adr(reference_obj, reference_obj, referent_offset); |
5343 Node* adr = basic_plus_adr(reference_obj, reference_obj, referent_offset); |
5698 |
5344 |
5699 ciInstanceKlass* klass = env()->Object_klass(); |
5345 ciInstanceKlass* klass = env()->Object_klass(); |
5700 const TypeOopPtr* object_type = TypeOopPtr::make_from_klass(klass); |
5346 const TypeOopPtr* object_type = TypeOopPtr::make_from_klass(klass); |
5701 |
5347 |
5702 Node* no_ctrl = NULL; |
5348 Node* no_ctrl = NULL; |
5703 Node *result = make_load(no_ctrl, adr, object_type, T_OBJECT); |
5349 Node* result = make_load(no_ctrl, adr, object_type, T_OBJECT); |
5704 |
5350 |
5705 // Use the pre-barrier to record the value in the referent field |
5351 // Use the pre-barrier to record the value in the referent field |
5706 pre_barrier(false /* do_load */, |
5352 pre_barrier(false /* do_load */, |
5707 control(), |
5353 control(), |
5708 NULL /* obj */, NULL /* adr */, max_juint /* alias_idx */, NULL /* val */, NULL /* val_type */, |
5354 NULL /* obj */, NULL /* adr */, max_juint /* alias_idx */, NULL /* val */, NULL /* val_type */, |
5711 |
5357 |
5712 // Add memory barrier to prevent commoning reads from this field |
5358 // Add memory barrier to prevent commoning reads from this field |
5713 // across safepoint since GC can change its value. |
5359 // across safepoint since GC can change its value. |
5714 insert_mem_bar(Op_MemBarCPUOrder); |
5360 insert_mem_bar(Op_MemBarCPUOrder); |
5715 |
5361 |
5716 push(result); |
5362 set_result(result); |
5717 return true; |
5363 return true; |
5718 } |
5364 } |
5719 |
5365 |
5720 |
5366 |
5721 Node * LibraryCallKit::load_field_from_object(Node * fromObj, const char * fieldName, const char * fieldTypeString, |
5367 Node * LibraryCallKit::load_field_from_object(Node * fromObj, const char * fieldName, const char * fieldTypeString, |
5768 stubName = "aescrypt_decryptBlock"; |
5414 stubName = "aescrypt_decryptBlock"; |
5769 break; |
5415 break; |
5770 } |
5416 } |
5771 if (stubAddr == NULL) return false; |
5417 if (stubAddr == NULL) return false; |
5772 |
5418 |
5773 // Restore the stack and pop off the arguments. |
5419 Node* aescrypt_object = argument(0); |
5774 int nargs = 5; // this + 2 oop/offset combos |
5420 Node* src = argument(1); |
5775 assert(callee()->signature()->size() == nargs-1, "encryptBlock has 4 arguments"); |
5421 Node* src_offset = argument(2); |
5776 |
5422 Node* dest = argument(3); |
5777 Node *aescrypt_object = argument(0); |
5423 Node* dest_offset = argument(4); |
5778 Node *src = argument(1); |
|
5779 Node *src_offset = argument(2); |
|
5780 Node *dest = argument(3); |
|
5781 Node *dest_offset = argument(4); |
|
5782 |
5424 |
5783 // (1) src and dest are arrays. |
5425 // (1) src and dest are arrays. |
5784 const Type* src_type = src->Value(&_gvn); |
5426 const Type* src_type = src->Value(&_gvn); |
5785 const Type* dest_type = dest->Value(&_gvn); |
5427 const Type* dest_type = dest->Value(&_gvn); |
5786 const TypeAryPtr* top_src = src_type->isa_aryptr(); |
5428 const TypeAryPtr* top_src = src_type->isa_aryptr(); |
5827 stubName = "cipherBlockChaining_decryptAESCrypt"; |
5469 stubName = "cipherBlockChaining_decryptAESCrypt"; |
5828 break; |
5470 break; |
5829 } |
5471 } |
5830 if (stubAddr == NULL) return false; |
5472 if (stubAddr == NULL) return false; |
5831 |
5473 |
5832 |
5474 Node* cipherBlockChaining_object = argument(0); |
5833 // Restore the stack and pop off the arguments. |
5475 Node* src = argument(1); |
5834 int nargs = 6; // this + oop/offset + len + oop/offset |
5476 Node* src_offset = argument(2); |
5835 assert(callee()->signature()->size() == nargs-1, "wrong number of arguments"); |
5477 Node* len = argument(3); |
5836 Node *cipherBlockChaining_object = argument(0); |
5478 Node* dest = argument(4); |
5837 Node *src = argument(1); |
5479 Node* dest_offset = argument(5); |
5838 Node *src_offset = argument(2); |
|
5839 Node *len = argument(3); |
|
5840 Node *dest = argument(4); |
|
5841 Node *dest_offset = argument(5); |
|
5842 |
5480 |
5843 // (1) src and dest are arrays. |
5481 // (1) src and dest are arrays. |
5844 const Type* src_type = src->Value(&_gvn); |
5482 const Type* src_type = src->Value(&_gvn); |
5845 const Type* dest_type = dest->Value(&_gvn); |
5483 const Type* dest_type = dest->Value(&_gvn); |
5846 const TypeAryPtr* top_src = src_type->isa_aryptr(); |
5484 const TypeAryPtr* top_src = src_type->isa_aryptr(); |
5918 // if ((embeddedCipherObj instanceof AESCrypt) && (cipher!=plain)) do_intrinsic, else do_javapath |
5556 // if ((embeddedCipherObj instanceof AESCrypt) && (cipher!=plain)) do_intrinsic, else do_javapath |
5919 // note cipher==plain is more conservative than the original java code but that's OK |
5557 // note cipher==plain is more conservative than the original java code but that's OK |
5920 // |
5558 // |
5921 Node* LibraryCallKit::inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting) { |
5559 Node* LibraryCallKit::inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting) { |
5922 // First, check receiver for NULL since it is virtual method. |
5560 // First, check receiver for NULL since it is virtual method. |
5923 int nargs = arg_size(); |
|
5924 Node* objCBC = argument(0); |
5561 Node* objCBC = argument(0); |
5925 _sp += nargs; |
5562 objCBC = null_check(objCBC); |
5926 objCBC = do_null_check(objCBC, T_OBJECT); |
|
5927 _sp -= nargs; |
|
5928 |
5563 |
5929 if (stopped()) return NULL; // Always NULL |
5564 if (stopped()) return NULL; // Always NULL |
5930 |
5565 |
5931 // Load embeddedCipher field of CipherBlockChaining object. |
5566 // Load embeddedCipher field of CipherBlockChaining object. |
5932 Node* embeddedCipherObj = load_field_from_object(objCBC, "embeddedCipher", "Lcom/sun/crypto/provider/SymmetricCipher;", /*is_exact*/ false); |
5567 Node* embeddedCipherObj = load_field_from_object(objCBC, "embeddedCipher", "Lcom/sun/crypto/provider/SymmetricCipher;", /*is_exact*/ false); |
5946 set_control(top()); // no regular fast path |
5581 set_control(top()); // no regular fast path |
5947 return ctrl; |
5582 return ctrl; |
5948 } |
5583 } |
5949 ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass(); |
5584 ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass(); |
5950 |
5585 |
5951 _sp += nargs; // gen_instanceof might do an uncommon trap |
|
5952 Node* instof = gen_instanceof(embeddedCipherObj, makecon(TypeKlassPtr::make(instklass_AESCrypt))); |
5586 Node* instof = gen_instanceof(embeddedCipherObj, makecon(TypeKlassPtr::make(instklass_AESCrypt))); |
5953 _sp -= nargs; |
|
5954 Node* cmp_instof = _gvn.transform(new (C) CmpINode(instof, intcon(1))); |
5587 Node* cmp_instof = _gvn.transform(new (C) CmpINode(instof, intcon(1))); |
5955 Node* bool_instof = _gvn.transform(new (C) BoolNode(cmp_instof, BoolTest::ne)); |
5588 Node* bool_instof = _gvn.transform(new (C) BoolNode(cmp_instof, BoolTest::ne)); |
5956 |
5589 |
5957 Node* instof_false = generate_guard(bool_instof, NULL, PROB_MIN); |
5590 Node* instof_false = generate_guard(bool_instof, NULL, PROB_MIN); |
5958 |
5591 |
5964 // taking the intrinsic path when cipher and plain are the same |
5597 // taking the intrinsic path when cipher and plain are the same |
5965 // see the original java code for why. |
5598 // see the original java code for why. |
5966 RegionNode* region = new(C) RegionNode(3); |
5599 RegionNode* region = new(C) RegionNode(3); |
5967 region->init_req(1, instof_false); |
5600 region->init_req(1, instof_false); |
5968 Node* src = argument(1); |
5601 Node* src = argument(1); |
5969 Node *dest = argument(4); |
5602 Node* dest = argument(4); |
5970 Node* cmp_src_dest = _gvn.transform(new (C) CmpPNode(src, dest)); |
5603 Node* cmp_src_dest = _gvn.transform(new (C) CmpPNode(src, dest)); |
5971 Node* bool_src_dest = _gvn.transform(new (C) BoolNode(cmp_src_dest, BoolTest::eq)); |
5604 Node* bool_src_dest = _gvn.transform(new (C) BoolNode(cmp_src_dest, BoolTest::eq)); |
5972 Node* src_dest_conjoint = generate_guard(bool_src_dest, NULL, PROB_MIN); |
5605 Node* src_dest_conjoint = generate_guard(bool_src_dest, NULL, PROB_MIN); |
5973 region->init_req(2, src_dest_conjoint); |
5606 region->init_req(2, src_dest_conjoint); |
5974 |
5607 |
5975 record_for_igvn(region); |
5608 record_for_igvn(region); |
5976 return _gvn.transform(region); |
5609 return _gvn.transform(region); |
5977 |
5610 } |
5978 } |
|
5979 |
|
5980 |