308 Node* get_state_from_sha5_object(Node *sha_object);
309 Node* inline_digestBase_implCompressMB_predicate(int predicate);
310 bool inline_encodeISOArray();
311 bool inline_updateCRC32();
312 bool inline_updateBytesCRC32();
313 bool inline_updateByteBufferCRC32();
314 Node* get_table_from_crc32c_class(ciInstanceKlass *crc32c_class);
315 bool inline_updateBytesCRC32C();
316 bool inline_updateDirectByteBufferCRC32C();
317 bool inline_updateBytesAdler32();
318 bool inline_updateByteBufferAdler32();
319 bool inline_multiplyToLen();
320 bool inline_hasNegatives();
321 bool inline_squareToLen();
322 bool inline_mulAdd();
323 bool inline_montgomeryMultiply();
324 bool inline_montgomerySquare();
325 bool inline_vectorizedMismatch();
326 bool inline_fma(vmIntrinsics::ID id);
327 bool inline_character_compare(vmIntrinsics::ID id);
328
329 bool inline_profileBoolean();
330 bool inline_isCompileConstant();
331 void clear_upper_avx() {
332 #ifdef X86
333 if (UseAVX >= 2) {
334 C->set_clear_upper_avx(true);
335 }
336 #endif
337 }
338 };
339
340 //---------------------------make_vm_intrinsic----------------------------
341 CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) {
342 vmIntrinsics::ID id = m->intrinsic_id();
343 assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
344
345 if (!m->is_loaded()) {
346 // Do not attempt to inline unloaded methods.
347 return NULL;
857 return inline_updateByteBufferAdler32();
858
859 case vmIntrinsics::_profileBoolean:
860 return inline_profileBoolean();
861 case vmIntrinsics::_isCompileConstant:
862 return inline_isCompileConstant();
863
864 case vmIntrinsics::_hasNegatives:
865 return inline_hasNegatives();
866
867 case vmIntrinsics::_fmaD:
868 case vmIntrinsics::_fmaF:
869 return inline_fma(intrinsic_id());
870
871 case vmIntrinsics::_isDigit:
872 case vmIntrinsics::_isLowerCase:
873 case vmIntrinsics::_isUpperCase:
874 case vmIntrinsics::_isWhitespace:
875 return inline_character_compare(intrinsic_id());
876
877 default:
878 // If you get here, it may be that someone has added a new intrinsic
879 // to the list in vmSymbols.hpp without implementing it here.
880 #ifndef PRODUCT
881 if ((PrintMiscellaneous && (Verbose || WizardMode)) || PrintOpto) {
882 tty->print_cr("*** Warning: Unimplemented intrinsic %s(%d)",
883 vmIntrinsics::name_at(intrinsic_id()), intrinsic_id());
884 }
885 #endif
886 return false;
887 }
888 }
889
890 Node* LibraryCallKit::try_to_predicate(int predicate) {
891 if (!jvms()->has_method()) {
892 // Root JVMState has a null method.
893 assert(map()->memory()->Opcode() == Op_Parm, "");
894 // Insert the memory aliasing node
895 set_all_memory(reset_memory());
896 }
6567 Node* codePoint = argument(1);
6568 Node* n = NULL;
6569
6570 switch (id) {
6571 case vmIntrinsics::_isDigit :
6572 n = new DigitNode(control(), codePoint);
6573 break;
6574 case vmIntrinsics::_isLowerCase :
6575 n = new LowerCaseNode(control(), codePoint);
6576 break;
6577 case vmIntrinsics::_isUpperCase :
6578 n = new UpperCaseNode(control(), codePoint);
6579 break;
6580 case vmIntrinsics::_isWhitespace :
6581 n = new WhitespaceNode(control(), codePoint);
6582 break;
6583 default:
6584 fatal_unexpected_iid(id);
6585 }
6586
6587 set_result(_gvn.transform(n));
6588 return true;
6589 }
6590
6591 bool LibraryCallKit::inline_profileBoolean() {
6592 Node* counts = argument(1);
6593 const TypeAryPtr* ary = NULL;
6594 ciArray* aobj = NULL;
6595 if (counts->is_Con()
6596 && (ary = counts->bottom_type()->isa_aryptr()) != NULL
6597 && (aobj = ary->const_oop()->as_array()) != NULL
6598 && (aobj->length() == 2)) {
6599 // Profile is int[2] where [0] and [1] correspond to false and true value occurrences respectively.
6600 jint false_cnt = aobj->element_value(0).as_int();
6601 jint true_cnt = aobj->element_value(1).as_int();
6602
6603 if (C->log() != NULL) {
6604 C->log()->elem("observe source='profileBoolean' false='%d' true='%d'",
6605 false_cnt, true_cnt);
6606 }
|
308 Node* get_state_from_sha5_object(Node *sha_object);
309 Node* inline_digestBase_implCompressMB_predicate(int predicate);
310 bool inline_encodeISOArray();
311 bool inline_updateCRC32();
312 bool inline_updateBytesCRC32();
313 bool inline_updateByteBufferCRC32();
314 Node* get_table_from_crc32c_class(ciInstanceKlass *crc32c_class);
315 bool inline_updateBytesCRC32C();
316 bool inline_updateDirectByteBufferCRC32C();
317 bool inline_updateBytesAdler32();
318 bool inline_updateByteBufferAdler32();
319 bool inline_multiplyToLen();
320 bool inline_hasNegatives();
321 bool inline_squareToLen();
322 bool inline_mulAdd();
323 bool inline_montgomeryMultiply();
324 bool inline_montgomerySquare();
325 bool inline_vectorizedMismatch();
326 bool inline_fma(vmIntrinsics::ID id);
327 bool inline_character_compare(vmIntrinsics::ID id);
328 bool inline_fp_min_max(vmIntrinsics::ID id);
329
330 bool inline_profileBoolean();
331 bool inline_isCompileConstant();
332 void clear_upper_avx() {
333 #ifdef X86
334 if (UseAVX >= 2) {
335 C->set_clear_upper_avx(true);
336 }
337 #endif
338 }
339 };
340
341 //---------------------------make_vm_intrinsic----------------------------
342 CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) {
343 vmIntrinsics::ID id = m->intrinsic_id();
344 assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
345
346 if (!m->is_loaded()) {
347 // Do not attempt to inline unloaded methods.
348 return NULL;
858 return inline_updateByteBufferAdler32();
859
860 case vmIntrinsics::_profileBoolean:
861 return inline_profileBoolean();
862 case vmIntrinsics::_isCompileConstant:
863 return inline_isCompileConstant();
864
865 case vmIntrinsics::_hasNegatives:
866 return inline_hasNegatives();
867
868 case vmIntrinsics::_fmaD:
869 case vmIntrinsics::_fmaF:
870 return inline_fma(intrinsic_id());
871
872 case vmIntrinsics::_isDigit:
873 case vmIntrinsics::_isLowerCase:
874 case vmIntrinsics::_isUpperCase:
875 case vmIntrinsics::_isWhitespace:
876 return inline_character_compare(intrinsic_id());
877
878 case vmIntrinsics::_maxF:
879 case vmIntrinsics::_minF:
880 case vmIntrinsics::_maxD:
881 case vmIntrinsics::_minD:
882 return inline_fp_min_max(intrinsic_id());
883
884 default:
885 // If you get here, it may be that someone has added a new intrinsic
886 // to the list in vmSymbols.hpp without implementing it here.
887 #ifndef PRODUCT
888 if ((PrintMiscellaneous && (Verbose || WizardMode)) || PrintOpto) {
889 tty->print_cr("*** Warning: Unimplemented intrinsic %s(%d)",
890 vmIntrinsics::name_at(intrinsic_id()), intrinsic_id());
891 }
892 #endif
893 return false;
894 }
895 }
896
897 Node* LibraryCallKit::try_to_predicate(int predicate) {
898 if (!jvms()->has_method()) {
899 // Root JVMState has a null method.
900 assert(map()->memory()->Opcode() == Op_Parm, "");
901 // Insert the memory aliasing node
902 set_all_memory(reset_memory());
903 }
6574 Node* codePoint = argument(1);
6575 Node* n = NULL;
6576
6577 switch (id) {
6578 case vmIntrinsics::_isDigit :
6579 n = new DigitNode(control(), codePoint);
6580 break;
6581 case vmIntrinsics::_isLowerCase :
6582 n = new LowerCaseNode(control(), codePoint);
6583 break;
6584 case vmIntrinsics::_isUpperCase :
6585 n = new UpperCaseNode(control(), codePoint);
6586 break;
6587 case vmIntrinsics::_isWhitespace :
6588 n = new WhitespaceNode(control(), codePoint);
6589 break;
6590 default:
6591 fatal_unexpected_iid(id);
6592 }
6593
6594 set_result(_gvn.transform(n));
6595 return true;
6596 }
6597
6598 //------------------------------inline_fp_min_max------------------------------
6599 bool LibraryCallKit::inline_fp_min_max(vmIntrinsics::ID id) {
6600 Node *a = NULL;
6601 Node *b = NULL;
6602 Node *n = NULL;
6603 switch (id) {
6604 case vmIntrinsics::_maxF:
6605 case vmIntrinsics::_minF:
6606 assert(callee()->signature()->size() == 2, "minF/maxF has 2 parameters of size 1 each.");
6607 a = argument(0);
6608 b = argument(1);
6609 break;
6610 case vmIntrinsics::_maxD:
6611 case vmIntrinsics::_minD:
6612 assert(callee()->signature()->size() == 4, "minD/maxD has 2 parameters of size 2 each.");
6613 a = round_double_node(argument(0));
6614 b = round_double_node(argument(2));
6615 break;
6616 default:
6617 fatal_unexpected_iid(id);
6618 break;
6619 }
6620 if (a->is_Con() || b->is_Con()) {
6621 return false;
6622 }
6623 switch (id) {
6624 case vmIntrinsics::_maxF: n = new MaxFNode(a, b); break;
6625 case vmIntrinsics::_minF: n = new MinFNode(a, b); break;
6626 case vmIntrinsics::_maxD: n = new MaxDNode(a, b); break;
6627 case vmIntrinsics::_minD: n = new MinDNode(a, b); break;
6628 default: fatal_unexpected_iid(id); break;
6629 }
6630 set_result(_gvn.transform(n));
6631 return true;
6632 }
6633
6634 bool LibraryCallKit::inline_profileBoolean() {
6635 Node* counts = argument(1);
6636 const TypeAryPtr* ary = NULL;
6637 ciArray* aobj = NULL;
6638 if (counts->is_Con()
6639 && (ary = counts->bottom_type()->isa_aryptr()) != NULL
6640 && (aobj = ary->const_oop()->as_array()) != NULL
6641 && (aobj->length() == 2)) {
6642 // Profile is int[2] where [0] and [1] correspond to false and true value occurrences respectively.
6643 jint false_cnt = aobj->element_value(0).as_int();
6644 jint true_cnt = aobj->element_value(1).as_int();
6645
6646 if (C->log() != NULL) {
6647 C->log()->elem("observe source='profileBoolean' false='%d' true='%d'",
6648 false_cnt, true_cnt);
6649 }
|