< prev index next >

src/hotspot/share/opto/library_call.cpp

Print this page
rev 53034 : 8212043: Add floating-point Math.min/max intrinsics
Summary: Floating-point Math.min() and Math.max() intrinsics are enabled on AArch64 platform
Reviewed-by: adinn, aph


 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     }


< prev index next >