45 // Extend the set of intrinsics known to the runtime: |
45 // Extend the set of intrinsics known to the runtime: |
46 public: |
46 public: |
47 private: |
47 private: |
48 bool _is_virtual; |
48 bool _is_virtual; |
49 bool _is_predicted; |
49 bool _is_predicted; |
|
50 bool _does_virtual_dispatch; |
50 vmIntrinsics::ID _intrinsic_id; |
51 vmIntrinsics::ID _intrinsic_id; |
51 |
52 |
52 public: |
53 public: |
53 LibraryIntrinsic(ciMethod* m, bool is_virtual, bool is_predicted, vmIntrinsics::ID id) |
54 LibraryIntrinsic(ciMethod* m, bool is_virtual, bool is_predicted, bool does_virtual_dispatch, vmIntrinsics::ID id) |
54 : InlineCallGenerator(m), |
55 : InlineCallGenerator(m), |
55 _is_virtual(is_virtual), |
56 _is_virtual(is_virtual), |
56 _is_predicted(is_predicted), |
57 _is_predicted(is_predicted), |
|
58 _does_virtual_dispatch(does_virtual_dispatch), |
57 _intrinsic_id(id) |
59 _intrinsic_id(id) |
58 { |
60 { |
59 } |
61 } |
60 virtual bool is_intrinsic() const { return true; } |
62 virtual bool is_intrinsic() const { return true; } |
61 virtual bool is_virtual() const { return _is_virtual; } |
63 virtual bool is_virtual() const { return _is_virtual; } |
62 virtual bool is_predicted() const { return _is_predicted; } |
64 virtual bool is_predicted() const { return _is_predicted; } |
|
65 virtual bool does_virtual_dispatch() const { return _does_virtual_dispatch; } |
63 virtual JVMState* generate(JVMState* jvms); |
66 virtual JVMState* generate(JVMState* jvms); |
64 virtual Node* generate_predicate(JVMState* jvms); |
67 virtual Node* generate_predicate(JVMState* jvms); |
65 vmIntrinsics::ID intrinsic_id() const { return _intrinsic_id; } |
68 vmIntrinsics::ID intrinsic_id() const { return _intrinsic_id; } |
66 }; |
69 }; |
67 |
70 |
379 if (StubRoutines::unsafe_arraycopy() == NULL) return NULL; |
383 if (StubRoutines::unsafe_arraycopy() == NULL) return NULL; |
380 if (!InlineArrayCopy) return NULL; |
384 if (!InlineArrayCopy) return NULL; |
381 break; |
385 break; |
382 case vmIntrinsics::_hashCode: |
386 case vmIntrinsics::_hashCode: |
383 if (!InlineObjectHash) return NULL; |
387 if (!InlineObjectHash) return NULL; |
|
388 does_virtual_dispatch = true; |
384 break; |
389 break; |
385 case vmIntrinsics::_clone: |
390 case vmIntrinsics::_clone: |
|
391 does_virtual_dispatch = true; |
386 case vmIntrinsics::_copyOf: |
392 case vmIntrinsics::_copyOf: |
387 case vmIntrinsics::_copyOfRange: |
393 case vmIntrinsics::_copyOfRange: |
388 if (!InlineObjectCopy) return NULL; |
394 if (!InlineObjectCopy) return NULL; |
389 // These also use the arraycopy intrinsic mechanism: |
395 // These also use the arraycopy intrinsic mechanism: |
390 if (!InlineArrayCopy) return NULL; |
396 if (!InlineArrayCopy) return NULL; |
539 // -XX:-InlineUnsafeOps disables natives from the Unsafe class. |
545 // -XX:-InlineUnsafeOps disables natives from the Unsafe class. |
540 if (m->holder()->name() == ciSymbol::sun_misc_Unsafe()) { |
546 if (m->holder()->name() == ciSymbol::sun_misc_Unsafe()) { |
541 if (!InlineUnsafeOps) return NULL; |
547 if (!InlineUnsafeOps) return NULL; |
542 } |
548 } |
543 |
549 |
544 return new LibraryIntrinsic(m, is_virtual, is_predicted, (vmIntrinsics::ID) id); |
550 return new LibraryIntrinsic(m, is_virtual, is_predicted, does_virtual_dispatch, (vmIntrinsics::ID) id); |
545 } |
551 } |
546 |
552 |
547 //----------------------register_library_intrinsics----------------------- |
553 //----------------------register_library_intrinsics----------------------- |
548 // Initialize this file's data structures, for each Compile instance. |
554 // Initialize this file's data structures, for each Compile instance. |
549 void Compile::register_library_intrinsics() { |
555 void Compile::register_library_intrinsics() { |