163
164 if (id < vmIntrinsics::FIRST_ID || id > vmIntrinsics::LAST_COMPILER_INLINE) {
165 return false;
166 }
167
168 // Only Object.hashCode and Object.clone intrinsics implement also a virtual
169 // dispatch because calling both methods is expensive but both methods are
170 // frequently overridden. All other intrinsics implement only a non-virtual
171 // dispatch.
172 if (is_virtual) {
173 switch (id) {
174 case vmIntrinsics::_hashCode:
175 case vmIntrinsics::_clone:
176 break;
177 default:
178 return false;
179 }
180 }
181
182 switch (id) {
183 case vmIntrinsics::_compareTo:
184 if (!Matcher::match_rule_supported(Op_StrComp)) return false;
185 break;
186 case vmIntrinsics::_equals:
187 if (!Matcher::match_rule_supported(Op_StrEquals)) return false;
188 break;
189 case vmIntrinsics::_equalsC:
190 if (!Matcher::match_rule_supported(Op_AryEq)) return false;
191 break;
192 case vmIntrinsics::_copyMemory:
193 if (StubRoutines::unsafe_arraycopy() == NULL) return false;
194 break;
195 case vmIntrinsics::_encodeISOArray:
196 if (!Matcher::match_rule_supported(Op_EncodeISOArray)) return false;
197 break;
198 case vmIntrinsics::_bitCount_i:
199 if (!Matcher::match_rule_supported(Op_PopCountI)) return false;
200 break;
201 case vmIntrinsics::_bitCount_l:
202 if (!Matcher::match_rule_supported(Op_PopCountL)) return false;
203 break;
204 case vmIntrinsics::_numberOfLeadingZeros_i:
205 if (!Matcher::match_rule_supported(Op_CountLeadingZerosI)) return false;
206 break;
207 case vmIntrinsics::_numberOfLeadingZeros_l:
208 if (!Matcher::match_rule_supported(Op_CountLeadingZerosL)) return false;
209 break;
210 case vmIntrinsics::_numberOfTrailingZeros_i:
211 if (!Matcher::match_rule_supported(Op_CountTrailingZerosI)) return false;
212 break;
213 case vmIntrinsics::_numberOfTrailingZeros_l:
214 if (!Matcher::match_rule_supported(Op_CountTrailingZerosL)) return false;
215 break;
216 case vmIntrinsics::_reverseBytes_c:
217 if (!Matcher::match_rule_supported(Op_ReverseBytesUS)) return false;
284 break;
285 case vmIntrinsics::_getCallerClass:
286 if (SystemDictionary::reflect_CallerSensitive_klass() == NULL) return false;
287 break;
288 case vmIntrinsics::_hashCode:
289 case vmIntrinsics::_identityHashCode:
290 case vmIntrinsics::_getClass:
291 case vmIntrinsics::_dsin:
292 case vmIntrinsics::_dcos:
293 case vmIntrinsics::_dtan:
294 case vmIntrinsics::_dabs:
295 case vmIntrinsics::_datan2:
296 case vmIntrinsics::_dsqrt:
297 case vmIntrinsics::_dexp:
298 case vmIntrinsics::_dlog:
299 case vmIntrinsics::_dlog10:
300 case vmIntrinsics::_dpow:
301 case vmIntrinsics::_min:
302 case vmIntrinsics::_max:
303 case vmIntrinsics::_arraycopy:
304 case vmIntrinsics::_indexOf:
305 case vmIntrinsics::_getObject:
306 case vmIntrinsics::_getBoolean:
307 case vmIntrinsics::_getByte:
308 case vmIntrinsics::_getShort:
309 case vmIntrinsics::_getChar:
310 case vmIntrinsics::_getInt:
311 case vmIntrinsics::_getLong:
312 case vmIntrinsics::_getFloat:
313 case vmIntrinsics::_getDouble:
314 case vmIntrinsics::_putObject:
315 case vmIntrinsics::_putBoolean:
316 case vmIntrinsics::_putByte:
317 case vmIntrinsics::_putShort:
318 case vmIntrinsics::_putChar:
319 case vmIntrinsics::_putInt:
320 case vmIntrinsics::_putLong:
321 case vmIntrinsics::_putFloat:
322 case vmIntrinsics::_putDouble:
323 case vmIntrinsics::_getByte_raw:
324 case vmIntrinsics::_getShort_raw:
|
163
164 if (id < vmIntrinsics::FIRST_ID || id > vmIntrinsics::LAST_COMPILER_INLINE) {
165 return false;
166 }
167
168 // Only Object.hashCode and Object.clone intrinsics implement also a virtual
169 // dispatch because calling both methods is expensive but both methods are
170 // frequently overridden. All other intrinsics implement only a non-virtual
171 // dispatch.
172 if (is_virtual) {
173 switch (id) {
174 case vmIntrinsics::_hashCode:
175 case vmIntrinsics::_clone:
176 break;
177 default:
178 return false;
179 }
180 }
181
182 switch (id) {
183 case vmIntrinsics::_compressStringC:
184 case vmIntrinsics::_compressStringB:
185 if (!Matcher::has_match_rule(Op_StrCompressedCopy)) return false;
186 break;
187 case vmIntrinsics::_inflateStringC:
188 case vmIntrinsics::_inflateStringB:
189 if (!Matcher::has_match_rule(Op_StrInflatedCopy)) return false;
190 break;
191 case vmIntrinsics::_compareToL:
192 case vmIntrinsics::_compareToU:
193 case vmIntrinsics::_compareToLU:
194 case vmIntrinsics::_compareToUL:
195 if (!Matcher::match_rule_supported(Op_StrComp)) return false;
196 break;
197 case vmIntrinsics::_equalsL:
198 case vmIntrinsics::_equalsU:
199 if (!Matcher::match_rule_supported(Op_StrEquals)) return false;
200 break;
201 case vmIntrinsics::_equalsB:
202 case vmIntrinsics::_equalsC:
203 if (!Matcher::match_rule_supported(Op_AryEq)) return false;
204 break;
205 case vmIntrinsics::_copyMemory:
206 if (StubRoutines::unsafe_arraycopy() == NULL) return false;
207 break;
208 case vmIntrinsics::_encodeISOArray:
209 case vmIntrinsics::_encodeByteISOArray:
210 if (!Matcher::match_rule_supported(Op_EncodeISOArray)) return false;
211 break;
212 case vmIntrinsics::_hasNegatives:
213 if (!Matcher::match_rule_supported(Op_HasNegatives)) return false;
214 break;
215 case vmIntrinsics::_bitCount_i:
216 if (!Matcher::match_rule_supported(Op_PopCountI)) return false;
217 break;
218 case vmIntrinsics::_bitCount_l:
219 if (!Matcher::match_rule_supported(Op_PopCountL)) return false;
220 break;
221 case vmIntrinsics::_numberOfLeadingZeros_i:
222 if (!Matcher::match_rule_supported(Op_CountLeadingZerosI)) return false;
223 break;
224 case vmIntrinsics::_numberOfLeadingZeros_l:
225 if (!Matcher::match_rule_supported(Op_CountLeadingZerosL)) return false;
226 break;
227 case vmIntrinsics::_numberOfTrailingZeros_i:
228 if (!Matcher::match_rule_supported(Op_CountTrailingZerosI)) return false;
229 break;
230 case vmIntrinsics::_numberOfTrailingZeros_l:
231 if (!Matcher::match_rule_supported(Op_CountTrailingZerosL)) return false;
232 break;
233 case vmIntrinsics::_reverseBytes_c:
234 if (!Matcher::match_rule_supported(Op_ReverseBytesUS)) return false;
301 break;
302 case vmIntrinsics::_getCallerClass:
303 if (SystemDictionary::reflect_CallerSensitive_klass() == NULL) return false;
304 break;
305 case vmIntrinsics::_hashCode:
306 case vmIntrinsics::_identityHashCode:
307 case vmIntrinsics::_getClass:
308 case vmIntrinsics::_dsin:
309 case vmIntrinsics::_dcos:
310 case vmIntrinsics::_dtan:
311 case vmIntrinsics::_dabs:
312 case vmIntrinsics::_datan2:
313 case vmIntrinsics::_dsqrt:
314 case vmIntrinsics::_dexp:
315 case vmIntrinsics::_dlog:
316 case vmIntrinsics::_dlog10:
317 case vmIntrinsics::_dpow:
318 case vmIntrinsics::_min:
319 case vmIntrinsics::_max:
320 case vmIntrinsics::_arraycopy:
321 case vmIntrinsics::_indexOfL:
322 case vmIntrinsics::_indexOfU:
323 case vmIntrinsics::_indexOfUL:
324 case vmIntrinsics::_indexOfIL:
325 case vmIntrinsics::_indexOfIU:
326 case vmIntrinsics::_indexOfIUL:
327 case vmIntrinsics::_indexOfU_char:
328 case vmIntrinsics::_toBytesStringU:
329 case vmIntrinsics::_getCharsStringU:
330 case vmIntrinsics::_getCharStringU:
331 case vmIntrinsics::_putCharStringU:
332 case vmIntrinsics::_getObject:
333 case vmIntrinsics::_getBoolean:
334 case vmIntrinsics::_getByte:
335 case vmIntrinsics::_getShort:
336 case vmIntrinsics::_getChar:
337 case vmIntrinsics::_getInt:
338 case vmIntrinsics::_getLong:
339 case vmIntrinsics::_getFloat:
340 case vmIntrinsics::_getDouble:
341 case vmIntrinsics::_putObject:
342 case vmIntrinsics::_putBoolean:
343 case vmIntrinsics::_putByte:
344 case vmIntrinsics::_putShort:
345 case vmIntrinsics::_putChar:
346 case vmIntrinsics::_putInt:
347 case vmIntrinsics::_putLong:
348 case vmIntrinsics::_putFloat:
349 case vmIntrinsics::_putDouble:
350 case vmIntrinsics::_getByte_raw:
351 case vmIntrinsics::_getShort_raw:
|