25 #ifndef SHARE_VM_OPTO_CASTNODE_HPP
26 #define SHARE_VM_OPTO_CASTNODE_HPP
27
28 #include "opto/node.hpp"
29 #include "opto/opcodes.hpp"
30
31
32 //------------------------------ConstraintCastNode-----------------------------
33 // cast to a different range
34 class ConstraintCastNode: public TypeNode {
35 public:
36 ConstraintCastNode (Node *n, const Type *t ): TypeNode(t,2) {
37 init_class_id(Class_ConstraintCast);
38 init_req(1, n);
39 }
40 virtual Node *Identity( PhaseTransform *phase );
41 virtual const Type *Value( PhaseTransform *phase ) const;
42 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
43 virtual int Opcode() const;
44 virtual uint ideal_reg() const = 0;
45 virtual Node *Ideal_DU_postCCP( PhaseCCP * );
46 };
47
48 //------------------------------CastIINode-------------------------------------
49 // cast integer to integer (different range)
50 class CastIINode: public ConstraintCastNode {
51 private:
52 // Can this node be removed post CCP or does it carry a required dependency?
53 const bool _carry_dependency;
54
55 protected:
56 virtual uint cmp( const Node &n ) const;
57 virtual uint size_of() const;
58
59 public:
60 CastIINode(Node *n, const Type *t, bool carry_dependency = false)
61 : ConstraintCastNode(n,t), _carry_dependency(carry_dependency) {}
62 virtual int Opcode() const;
63 virtual uint ideal_reg() const { return Op_RegI; }
64 virtual Node *Identity( PhaseTransform *phase );
65 virtual const Type *Value( PhaseTransform *phase ) const;
66 virtual Node *Ideal_DU_postCCP( PhaseCCP * );
67 #ifndef PRODUCT
68 virtual void dump_spec(outputStream *st) const;
69 #endif
70 };
71
72 //------------------------------CastPPNode-------------------------------------
73 // cast pointer to pointer (different type)
74 class CastPPNode: public ConstraintCastNode {
75 public:
76 CastPPNode (Node *n, const Type *t ): ConstraintCastNode(n, t) {}
77 virtual int Opcode() const;
78 virtual uint ideal_reg() const { return Op_RegP; }
79 virtual Node *Ideal_DU_postCCP( PhaseCCP * );
80 };
81
82 //------------------------------CheckCastPPNode--------------------------------
83 // for _checkcast, cast pointer to pointer (different type), without JOIN,
84 class CheckCastPPNode: public TypeNode {
85 public:
86 CheckCastPPNode( Node *c, Node *n, const Type *t ) : TypeNode(t,2) {
87 init_class_id(Class_CheckCastPP);
88 init_req(0, c);
89 init_req(1, n);
90 }
91
92 virtual Node *Identity( PhaseTransform *phase );
93 virtual const Type *Value( PhaseTransform *phase ) const;
94 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
95 virtual int Opcode() const;
96 virtual uint ideal_reg() const { return Op_RegP; }
97 // No longer remove CheckCast after CCP as it gives me a place to hang
98 // the proper address type - which is required to compute anti-deps.
99 //virtual Node *Ideal_DU_postCCP( PhaseCCP * );
100 };
101
102
103 //------------------------------CastX2PNode-------------------------------------
104 // convert a machine-pointer-sized integer to a raw pointer
105 class CastX2PNode : public Node {
106 public:
107 CastX2PNode( Node *n ) : Node(NULL, n) {}
108 virtual int Opcode() const;
109 virtual const Type *Value( PhaseTransform *phase ) const;
110 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
111 virtual Node *Identity( PhaseTransform *phase );
112 virtual uint ideal_reg() const { return Op_RegP; }
113 virtual const Type *bottom_type() const { return TypeRawPtr::BOTTOM; }
114 };
115
116 //------------------------------CastP2XNode-------------------------------------
117 // Used in both 32-bit and 64-bit land.
118 // Used for card-marks and unsafe pointer math.
119 class CastP2XNode : public Node {
|
25 #ifndef SHARE_VM_OPTO_CASTNODE_HPP
26 #define SHARE_VM_OPTO_CASTNODE_HPP
27
28 #include "opto/node.hpp"
29 #include "opto/opcodes.hpp"
30
31
32 //------------------------------ConstraintCastNode-----------------------------
33 // cast to a different range
34 class ConstraintCastNode: public TypeNode {
35 public:
36 ConstraintCastNode (Node *n, const Type *t ): TypeNode(t,2) {
37 init_class_id(Class_ConstraintCast);
38 init_req(1, n);
39 }
40 virtual Node *Identity( PhaseTransform *phase );
41 virtual const Type *Value( PhaseTransform *phase ) const;
42 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
43 virtual int Opcode() const;
44 virtual uint ideal_reg() const = 0;
45 };
46
47 //------------------------------CastIINode-------------------------------------
48 // cast integer to integer (different range)
49 class CastIINode: public ConstraintCastNode {
50 private:
51 // Can this node be removed post CCP or does it carry a required dependency?
52 const bool _carry_dependency;
53
54 protected:
55 virtual uint cmp( const Node &n ) const;
56 virtual uint size_of() const;
57
58 public:
59 CastIINode(Node *n, const Type *t, bool carry_dependency = false)
60 : ConstraintCastNode(n,t), _carry_dependency(carry_dependency) {}
61 virtual int Opcode() const;
62 virtual uint ideal_reg() const { return Op_RegI; }
63 virtual Node *Identity( PhaseTransform *phase );
64 virtual const Type *Value( PhaseTransform *phase ) const;
65 #ifndef PRODUCT
66 virtual void dump_spec(outputStream *st) const;
67 #endif
68 };
69
70 //------------------------------CastPPNode-------------------------------------
71 // cast pointer to pointer (different type)
72 class CastPPNode: public ConstraintCastNode {
73 public:
74 CastPPNode (Node *n, const Type *t ): ConstraintCastNode(n, t) {}
75 virtual int Opcode() const;
76 virtual uint ideal_reg() const { return Op_RegP; }
77 };
78
79 //------------------------------CheckCastPPNode--------------------------------
80 // for _checkcast, cast pointer to pointer (different type), without JOIN,
81 class CheckCastPPNode: public TypeNode {
82 public:
83 CheckCastPPNode( Node *c, Node *n, const Type *t ) : TypeNode(t,2) {
84 init_class_id(Class_CheckCastPP);
85 init_req(0, c);
86 init_req(1, n);
87 }
88
89 virtual Node *Identity( PhaseTransform *phase );
90 virtual const Type *Value( PhaseTransform *phase ) const;
91 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
92 virtual int Opcode() const;
93 virtual uint ideal_reg() const { return Op_RegP; }
94 };
95
96
97 //------------------------------CastX2PNode-------------------------------------
98 // convert a machine-pointer-sized integer to a raw pointer
99 class CastX2PNode : public Node {
100 public:
101 CastX2PNode( Node *n ) : Node(NULL, n) {}
102 virtual int Opcode() const;
103 virtual const Type *Value( PhaseTransform *phase ) const;
104 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
105 virtual Node *Identity( PhaseTransform *phase );
106 virtual uint ideal_reg() const { return Op_RegP; }
107 virtual const Type *bottom_type() const { return TypeRawPtr::BOTTOM; }
108 };
109
110 //------------------------------CastP2XNode-------------------------------------
111 // Used in both 32-bit and 64-bit land.
112 // Used for card-marks and unsafe pointer math.
113 class CastP2XNode : public Node {
|