817 }
818 virtual int Opcode() const;
819 virtual bool guaranteed_safepoint() { return false; }
820 #ifndef PRODUCT
821 virtual void dump_spec(outputStream *st) const;
822 #endif
823 };
824
825 //------------------------------CallNativeNode-----------------------------------
826 // Make a direct call into a foreign function with an arbitrary ABI
827 // safepoints
828 class CallNativeNode : public CallNode {
829 friend class MachCallNativeNode;
830 virtual bool cmp( const Node &n ) const;
831 virtual uint size_of() const;
832 static void print_regs(const GrowableArray<VMReg>& regs, outputStream* st);
833 public:
834 GrowableArray<VMReg> _arg_regs;
835 GrowableArray<VMReg> _ret_regs;
836 const int _shadow_space_bytes;
837 const bool _need_transition;
838
839 CallNativeNode(const TypeFunc* tf, address addr, const char* name,
840 const TypePtr* adr_type,
841 const GrowableArray<VMReg>& arg_regs,
842 const GrowableArray<VMReg>& ret_regs,
843 int shadow_space_bytes,
844 bool need_transition)
845 : CallNode(tf, addr, adr_type), _arg_regs(arg_regs),
846 _ret_regs(ret_regs), _shadow_space_bytes(shadow_space_bytes),
847 _need_transition(need_transition)
848 {
849 init_class_id(Class_CallNative);
850 _name = name;
851 }
852 virtual int Opcode() const;
853 virtual bool guaranteed_safepoint() { return _need_transition; }
854 virtual Node* match(const ProjNode *proj, const Matcher *m);
855 virtual void calling_convention( BasicType* sig_bt, VMRegPair *parm_regs, uint argcnt ) const;
856 #ifndef PRODUCT
857 virtual void dump_spec(outputStream *st) const;
858 #endif
859 };
860
861 //------------------------------CallLeafNoFPNode-------------------------------
862 // CallLeafNode, not using floating point or using it in the same manner as
863 // the generated code
864 class CallLeafNoFPNode : public CallLeafNode {
865 public:
866 CallLeafNoFPNode(const TypeFunc* tf, address addr, const char* name,
867 const TypePtr* adr_type)
868 : CallLeafNode(tf, addr, name, adr_type)
869 {
870 init_class_id(Class_CallLeafNoFP);
871 }
872 virtual int Opcode() const;
873 };
|
817 }
818 virtual int Opcode() const;
819 virtual bool guaranteed_safepoint() { return false; }
820 #ifndef PRODUCT
821 virtual void dump_spec(outputStream *st) const;
822 #endif
823 };
824
825 //------------------------------CallNativeNode-----------------------------------
826 // Make a direct call into a foreign function with an arbitrary ABI
827 // safepoints
828 class CallNativeNode : public CallNode {
829 friend class MachCallNativeNode;
830 virtual bool cmp( const Node &n ) const;
831 virtual uint size_of() const;
832 static void print_regs(const GrowableArray<VMReg>& regs, outputStream* st);
833 public:
834 GrowableArray<VMReg> _arg_regs;
835 GrowableArray<VMReg> _ret_regs;
836 const int _shadow_space_bytes;
837
838 CallNativeNode(const TypeFunc* tf, address addr, const char* name,
839 const TypePtr* adr_type,
840 const GrowableArray<VMReg>& arg_regs,
841 const GrowableArray<VMReg>& ret_regs,
842 int shadow_space_bytes)
843 : CallNode(tf, addr, adr_type), _arg_regs(arg_regs),
844 _ret_regs(ret_regs), _shadow_space_bytes(shadow_space_bytes)
845 {
846 init_class_id(Class_CallNative);
847 _name = name;
848 }
849 virtual int Opcode() const;
850 virtual bool guaranteed_safepoint() { return false; }
851 virtual Node* match(const ProjNode *proj, const Matcher *m);
852 virtual void calling_convention( BasicType* sig_bt, VMRegPair *parm_regs, uint argcnt ) const;
853 #ifndef PRODUCT
854 virtual void dump_spec(outputStream *st) const;
855 #endif
856 };
857
858 //------------------------------CallLeafNoFPNode-------------------------------
859 // CallLeafNode, not using floating point or using it in the same manner as
860 // the generated code
861 class CallLeafNoFPNode : public CallLeafNode {
862 public:
863 CallLeafNoFPNode(const TypeFunc* tf, address addr, const char* name,
864 const TypePtr* adr_type)
865 : CallLeafNode(tf, addr, name, adr_type)
866 {
867 init_class_id(Class_CallLeafNoFP);
868 }
869 virtual int Opcode() const;
870 };
|