878 void set_entry_point(address p) { _entry_point = p; } 879 void set_cnt(float c) { _cnt = c; } 880 void set_argsize(int s) { _argsize = s; } 881 882 MachCallNode() : MachSafePointNode() { 883 init_class_id(Class_MachCall); 884 } 885 886 virtual const Type *bottom_type() const; 887 virtual bool pinned() const { return false; } 888 virtual const Type* Value(PhaseGVN* phase) const; 889 virtual const RegMask &in_RegMask(uint) const; 890 virtual int ret_addr_offset() { return 0; } 891 892 bool returns_long() const { return tf()->return_type() == T_LONG; } 893 bool return_value_is_used() const; 894 895 // Similar to cousin class CallNode::returns_pointer 896 bool returns_pointer() const; 897 898 #ifndef PRODUCT 899 virtual void dump_spec(outputStream *st) const; 900 #endif 901 }; 902 903 //------------------------------MachCallJavaNode------------------------------ 904 // "Base" class for machine-specific versions of subroutine calls 905 class MachCallJavaNode : public MachCallNode { 906 protected: 907 virtual uint cmp( const Node &n ) const; 908 virtual uint size_of() const; // Size is bigger 909 public: 910 ciMethod* _method; // Method being direct called 911 bool _override_symbolic_info; // Override symbolic call site info from bytecode 912 int _bci; // Byte Code index of call byte code 913 bool _optimized_virtual; // Tells if node is a static call or an optimized virtual 914 bool _method_handle_invoke; // Tells if the call has to preserve SP 915 MachCallJavaNode() : MachCallNode(), _override_symbolic_info(false) { 916 init_class_id(Class_MachCallJava); 917 } 956 }; 957 958 //------------------------------MachCallDynamicJavaNode------------------------ 959 // Machine-specific versions of possibly megamorphic subroutine calls 960 class MachCallDynamicJavaNode : public MachCallJavaNode { 961 public: 962 int _vtable_index; 963 MachCallDynamicJavaNode() : MachCallJavaNode() { 964 init_class_id(Class_MachCallDynamicJava); 965 DEBUG_ONLY(_vtable_index = -99); // throw an assert if uninitialized 966 } 967 virtual int ret_addr_offset(); 968 #ifndef PRODUCT 969 virtual void dump_spec(outputStream *st) const; 970 #endif 971 }; 972 973 //------------------------------MachCallRuntimeNode---------------------------- 974 // Machine-specific versions of subroutine calls 975 class MachCallRuntimeNode : public MachCallNode { 976 virtual uint cmp( const Node &n ) const; 977 virtual uint size_of() const; // Size is bigger 978 public: 979 const char *_name; // Printable name, if _method is NULL 980 MachCallRuntimeNode() : MachCallNode() { 981 init_class_id(Class_MachCallRuntime); 982 } 983 virtual int ret_addr_offset(); 984 #ifndef PRODUCT 985 virtual void dump_spec(outputStream *st) const; 986 #endif 987 }; 988 989 class MachCallLeafNode: public MachCallRuntimeNode { 990 public: 991 MachCallLeafNode() : MachCallRuntimeNode() { 992 init_class_id(Class_MachCallLeaf); 993 } 994 }; 995 996 //------------------------------MachHaltNode----------------------------------- 997 // Machine-specific versions of halt nodes 998 class MachHaltNode : public MachReturnNode { 999 public: 1000 virtual JVMState* jvms() const; 1001 }; 1002 1003 class MachMemBarNode : public MachNode { 1004 virtual uint size_of() const; // Size is bigger 1005 public: 1006 const TypePtr* _adr_type; // memory effects 1007 MachMemBarNode() : MachNode() { 1008 init_class_id(Class_MachMemBar); 1009 _adr_type = TypePtr::BOTTOM; // the default: all of memory 1010 } 1011 1012 void set_adr_type(const TypePtr* atp) { _adr_type = atp; } 1013 virtual const TypePtr *adr_type() const; | 878 void set_entry_point(address p) { _entry_point = p; } 879 void set_cnt(float c) { _cnt = c; } 880 void set_argsize(int s) { _argsize = s; } 881 882 MachCallNode() : MachSafePointNode() { 883 init_class_id(Class_MachCall); 884 } 885 886 virtual const Type *bottom_type() const; 887 virtual bool pinned() const { return false; } 888 virtual const Type* Value(PhaseGVN* phase) const; 889 virtual const RegMask &in_RegMask(uint) const; 890 virtual int ret_addr_offset() { return 0; } 891 892 bool returns_long() const { return tf()->return_type() == T_LONG; } 893 bool return_value_is_used() const; 894 895 // Similar to cousin class CallNode::returns_pointer 896 bool returns_pointer() const; 897 898 virtual bool preserves_fp_registers() const { return false; } 899 900 #ifndef PRODUCT 901 virtual void dump_spec(outputStream *st) const; 902 #endif 903 }; 904 905 //------------------------------MachCallJavaNode------------------------------ 906 // "Base" class for machine-specific versions of subroutine calls 907 class MachCallJavaNode : public MachCallNode { 908 protected: 909 virtual uint cmp( const Node &n ) const; 910 virtual uint size_of() const; // Size is bigger 911 public: 912 ciMethod* _method; // Method being direct called 913 bool _override_symbolic_info; // Override symbolic call site info from bytecode 914 int _bci; // Byte Code index of call byte code 915 bool _optimized_virtual; // Tells if node is a static call or an optimized virtual 916 bool _method_handle_invoke; // Tells if the call has to preserve SP 917 MachCallJavaNode() : MachCallNode(), _override_symbolic_info(false) { 918 init_class_id(Class_MachCallJava); 919 } 958 }; 959 960 //------------------------------MachCallDynamicJavaNode------------------------ 961 // Machine-specific versions of possibly megamorphic subroutine calls 962 class MachCallDynamicJavaNode : public MachCallJavaNode { 963 public: 964 int _vtable_index; 965 MachCallDynamicJavaNode() : MachCallJavaNode() { 966 init_class_id(Class_MachCallDynamicJava); 967 DEBUG_ONLY(_vtable_index = -99); // throw an assert if uninitialized 968 } 969 virtual int ret_addr_offset(); 970 #ifndef PRODUCT 971 virtual void dump_spec(outputStream *st) const; 972 #endif 973 }; 974 975 //------------------------------MachCallRuntimeNode---------------------------- 976 // Machine-specific versions of subroutine calls 977 class MachCallRuntimeNode : public MachCallNode { 978 protected: 979 virtual uint cmp( const Node &n ) const; 980 private: 981 virtual uint size_of() const; // Size is bigger 982 public: 983 const char *_name; // Printable name, if _method is NULL 984 MachCallRuntimeNode() : MachCallNode() { 985 init_class_id(Class_MachCallRuntime); 986 } 987 virtual int ret_addr_offset(); 988 #ifndef PRODUCT 989 virtual void dump_spec(outputStream *st) const; 990 #endif 991 }; 992 993 class MachCallLeafNode: public MachCallRuntimeNode { 994 virtual uint cmp( const Node &n ) const; 995 virtual uint size_of() const; // Size is bigger 996 private: 997 bool _preserves_fp_registers; 998 public: 999 MachCallLeafNode() : MachCallRuntimeNode() { 1000 init_class_id(Class_MachCallLeaf); 1001 } 1002 1003 void set_preserves_fp_registers(bool v) { _preserves_fp_registers = v; } 1004 virtual bool preserves_fp_registers() const { return _preserves_fp_registers; } 1005 #ifndef PRODUCT 1006 virtual void dump_spec(outputStream *st) const; 1007 #endif 1008 }; 1009 1010 //------------------------------MachHaltNode----------------------------------- 1011 // Machine-specific versions of halt nodes 1012 class MachHaltNode : public MachReturnNode { 1013 public: 1014 virtual JVMState* jvms() const; 1015 }; 1016 1017 class MachMemBarNode : public MachNode { 1018 virtual uint size_of() const; // Size is bigger 1019 public: 1020 const TypePtr* _adr_type; // memory effects 1021 MachMemBarNode() : MachNode() { 1022 init_class_id(Class_MachMemBar); 1023 _adr_type = TypePtr::BOTTOM; // the default: all of memory 1024 } 1025 1026 void set_adr_type(const TypePtr* atp) { _adr_type = atp; } 1027 virtual const TypePtr *adr_type() const; |