32 class Node;
33
34 class PhaseGVN;
35 class PhaseTransform;
36
37 class MathExactNode : public MultiNode {
38 public:
39 MathExactNode(Node* ctrl, Node* in1, Node* in2);
40 enum {
41 result_proj_node = 0,
42 flags_proj_node = 1
43 };
44 virtual int Opcode() const;
45 virtual Node* Identity(PhaseTransform* phase) { return this; }
46 virtual Node* Ideal(PhaseGVN* phase, bool can_reshape) { return NULL; }
47 virtual const Type* Value(PhaseTransform* phase) const { return bottom_type(); }
48 virtual uint hash() const { return Node::hash(); }
49 virtual bool is_CFG() const { return false; }
50 virtual uint ideal_reg() const { return NotAMachineReg; }
51
52 ProjNode* result_node() { return proj_out(result_proj_node); }
53 ProjNode* flags_node() { return proj_out(flags_proj_node); }
54 protected:
55 Node* no_overflow(PhaseGVN *phase, Node* new_result);
56 };
57
58 class AddExactINode : public MathExactNode {
59 public:
60 AddExactINode(Node* ctrl, Node* in1, Node* in2) : MathExactNode(ctrl, in1, in2) {}
61 virtual int Opcode() const;
62 virtual const Type* bottom_type() const { return TypeTuple::INT_CC_PAIR; }
63 virtual Node* match(const ProjNode* proj, const Matcher* m);
64 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
65 };
66
67 class FlagsProjNode : public ProjNode {
68 public:
69 FlagsProjNode(Node* src, uint con) : ProjNode(src, con) {
70 init_class_id(Class_FlagsProj);
71 }
72
73 virtual int Opcode() const;
|
32 class Node;
33
34 class PhaseGVN;
35 class PhaseTransform;
36
37 class MathExactNode : public MultiNode {
38 public:
39 MathExactNode(Node* ctrl, Node* in1, Node* in2);
40 enum {
41 result_proj_node = 0,
42 flags_proj_node = 1
43 };
44 virtual int Opcode() const;
45 virtual Node* Identity(PhaseTransform* phase) { return this; }
46 virtual Node* Ideal(PhaseGVN* phase, bool can_reshape) { return NULL; }
47 virtual const Type* Value(PhaseTransform* phase) const { return bottom_type(); }
48 virtual uint hash() const { return Node::hash(); }
49 virtual bool is_CFG() const { return false; }
50 virtual uint ideal_reg() const { return NotAMachineReg; }
51
52 ProjNode* result_node() const { return proj_out(result_proj_node); }
53 ProjNode* flags_node() const { return proj_out(flags_proj_node); }
54 Node* control_node() const;
55 Node* non_throwing_branch() const;
56 protected:
57 Node* no_overflow(PhaseGVN *phase, Node* new_result);
58 };
59
60 class AddExactINode : public MathExactNode {
61 public:
62 AddExactINode(Node* ctrl, Node* in1, Node* in2) : MathExactNode(ctrl, in1, in2) {}
63 virtual int Opcode() const;
64 virtual const Type* bottom_type() const { return TypeTuple::INT_CC_PAIR; }
65 virtual Node* match(const ProjNode* proj, const Matcher* m);
66 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
67 };
68
69 class FlagsProjNode : public ProjNode {
70 public:
71 FlagsProjNode(Node* src, uint con) : ProjNode(src, con) {
72 init_class_id(Class_FlagsProj);
73 }
74
75 virtual int Opcode() const;
|