1278 assert((uintptr_t)vmIntrinsics::ID_LIMIT <= max_id_uint, "else fix size"); 1279 assert(intrinsic_id_size_in_bytes() == sizeof(_intrinsic_id), ""); 1280 1281 // the klass name is well-known: 1282 vmSymbols::SID klass_id = klass_id_for_intrinsics(method_holder()); 1283 assert(klass_id != vmSymbols::NO_SID, "caller responsibility"); 1284 1285 // ditto for method and signature: 1286 vmSymbols::SID name_id = vmSymbols::find_sid(name()); 1287 if (klass_id != vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_MethodHandle) 1288 && name_id == vmSymbols::NO_SID) 1289 return; 1290 vmSymbols::SID sig_id = vmSymbols::find_sid(signature()); 1291 if (klass_id != vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_MethodHandle) 1292 && sig_id == vmSymbols::NO_SID) return; 1293 jshort flags = access_flags().as_short(); 1294 1295 vmIntrinsics::ID id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags); 1296 if (id != vmIntrinsics::_none) { 1297 set_intrinsic_id(id); 1298 return; 1299 } 1300 1301 // A few slightly irregular cases: 1302 switch (klass_id) { 1303 case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_StrictMath): 1304 // Second chance: check in regular Math. 1305 switch (name_id) { 1306 case vmSymbols::VM_SYMBOL_ENUM_NAME(min_name): 1307 case vmSymbols::VM_SYMBOL_ENUM_NAME(max_name): 1308 case vmSymbols::VM_SYMBOL_ENUM_NAME(sqrt_name): 1309 // pretend it is the corresponding method in the non-strict class: 1310 klass_id = vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_Math); 1311 id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags); 1312 break; 1313 } 1314 break; 1315 1316 // Signature-polymorphic methods: MethodHandle.invoke*, InvokeDynamic.*. 1317 case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_MethodHandle): | 1278 assert((uintptr_t)vmIntrinsics::ID_LIMIT <= max_id_uint, "else fix size"); 1279 assert(intrinsic_id_size_in_bytes() == sizeof(_intrinsic_id), ""); 1280 1281 // the klass name is well-known: 1282 vmSymbols::SID klass_id = klass_id_for_intrinsics(method_holder()); 1283 assert(klass_id != vmSymbols::NO_SID, "caller responsibility"); 1284 1285 // ditto for method and signature: 1286 vmSymbols::SID name_id = vmSymbols::find_sid(name()); 1287 if (klass_id != vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_MethodHandle) 1288 && name_id == vmSymbols::NO_SID) 1289 return; 1290 vmSymbols::SID sig_id = vmSymbols::find_sid(signature()); 1291 if (klass_id != vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_MethodHandle) 1292 && sig_id == vmSymbols::NO_SID) return; 1293 jshort flags = access_flags().as_short(); 1294 1295 vmIntrinsics::ID id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags); 1296 if (id != vmIntrinsics::_none) { 1297 set_intrinsic_id(id); 1298 if (id == vmIntrinsics::_Class_cast) { 1299 // Even if the intrinsic is rejected, we want to inline this simple method. 1300 set_force_inline(true); 1301 } 1302 return; 1303 } 1304 1305 // A few slightly irregular cases: 1306 switch (klass_id) { 1307 case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_StrictMath): 1308 // Second chance: check in regular Math. 1309 switch (name_id) { 1310 case vmSymbols::VM_SYMBOL_ENUM_NAME(min_name): 1311 case vmSymbols::VM_SYMBOL_ENUM_NAME(max_name): 1312 case vmSymbols::VM_SYMBOL_ENUM_NAME(sqrt_name): 1313 // pretend it is the corresponding method in the non-strict class: 1314 klass_id = vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_Math); 1315 id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags); 1316 break; 1317 } 1318 break; 1319 1320 // Signature-polymorphic methods: MethodHandle.invoke*, InvokeDynamic.*. 1321 case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_MethodHandle): |