src/hotspot/share/opto/library_call.cpp
Print this page
@@ -322,10 +322,11 @@
bool inline_mulAdd();
bool inline_montgomeryMultiply();
bool inline_montgomerySquare();
bool inline_vectorizedMismatch();
bool inline_fma(vmIntrinsics::ID id);
+ bool inline_character_compare(vmIntrinsics::ID id);
bool inline_profileBoolean();
bool inline_isCompileConstant();
void clear_upper_avx() {
#ifdef X86
@@ -865,10 +866,16 @@
case vmIntrinsics::_fmaD:
case vmIntrinsics::_fmaF:
return inline_fma(intrinsic_id());
+ case vmIntrinsics::_isDigit:
+ case vmIntrinsics::_isLowerCase:
+ case vmIntrinsics::_isUpperCase:
+ case vmIntrinsics::_isWhitespace:
+ return inline_character_compare(intrinsic_id());
+
default:
// If you get here, it may be that someone has added a new intrinsic
// to the list in vmSymbols.hpp without implementing it here.
#ifndef PRODUCT
if ((PrintMiscellaneous && (Verbose || WizardMode)) || PrintOpto) {
@@ -6553,10 +6560,36 @@
}
set_result(result);
return true;
}
+bool LibraryCallKit::inline_character_compare(vmIntrinsics::ID id) {
+ // argument(0) is receiver
+ Node* codePoint = argument(1);
+ Node* n = NULL;
+
+ switch (id) {
+ case vmIntrinsics::_isDigit :
+ n = new DigitNode(control(), codePoint);
+ break;
+ case vmIntrinsics::_isLowerCase :
+ n = new LowerCaseNode(control(), codePoint);
+ break;
+ case vmIntrinsics::_isUpperCase :
+ n = new UpperCaseNode(control(), codePoint);
+ break;
+ case vmIntrinsics::_isWhitespace :
+ n = new WhitespaceNode(control(), codePoint);
+ break;
+ default:
+ fatal_unexpected_iid(id);
+ }
+
+ set_result(_gvn.transform(n));
+ return true;
+}
+
bool LibraryCallKit::inline_profileBoolean() {
Node* counts = argument(1);
const TypeAryPtr* ary = NULL;
ciArray* aobj = NULL;
if (counts->is_Con()