rbackman@5791: /* rbackman@5791: * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. rbackman@5791: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. rbackman@5791: * rbackman@5791: * This code is free software; you can redistribute it and/or modify it rbackman@5791: * under the terms of the GNU General Public License version 2 only, as rbackman@5791: * published by the Free Software Foundation. rbackman@5791: * rbackman@5791: * This code is distributed in the hope that it will be useful, but WITHOUT rbackman@5791: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or rbackman@5791: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License rbackman@5791: * version 2 for more details (a copy is included in the LICENSE file that rbackman@5791: * accompanied this code). rbackman@5791: * rbackman@5791: * You should have received a copy of the GNU General Public License version rbackman@5791: * 2 along with this work; if not, write to the Free Software Foundation, rbackman@5791: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. rbackman@5791: * rbackman@5791: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA rbackman@5791: * or visit www.oracle.com if you need additional information or have any rbackman@5791: * questions. rbackman@5791: * rbackman@5791: */ rbackman@5791: rbackman@5791: #ifndef SHARE_VM_OPTO_MATHEXACTNODE_HPP rbackman@5791: #define SHARE_VM_OPTO_MATHEXACTNODE_HPP rbackman@5791: rbackman@5791: #include "opto/multnode.hpp" rbackman@5791: #include "opto/node.hpp" rbackman@5927: #include "opto/subnode.hpp" rbackman@5791: #include "opto/type.hpp" rbackman@5791: rbackman@5927: class BoolNode; rbackman@5927: class IfNode; rbackman@5791: class Node; rbackman@5791: rbackman@5791: class PhaseGVN; rbackman@5791: class PhaseTransform; rbackman@5791: rbackman@5791: class MathExactNode : public MultiNode { rbackman@5791: public: rbackman@5997: MathExactNode(Node* ctrl, Node* in1); rbackman@5791: MathExactNode(Node* ctrl, Node* in1, Node* in2); rbackman@5791: enum { rbackman@5791: result_proj_node = 0, rbackman@5791: flags_proj_node = 1 rbackman@5791: }; rbackman@5791: virtual int Opcode() const; rbackman@5791: virtual Node* Identity(PhaseTransform* phase) { return this; } rbackman@5791: virtual Node* Ideal(PhaseGVN* phase, bool can_reshape) { return NULL; } rbackman@5791: virtual const Type* Value(PhaseTransform* phase) const { return bottom_type(); } rbackman@6102: virtual uint hash() const { return NO_HASH; } rbackman@5791: virtual bool is_CFG() const { return false; } rbackman@5791: virtual uint ideal_reg() const { return NotAMachineReg; } rbackman@5791: rbackman@5927: ProjNode* result_node() const { return proj_out(result_proj_node); } rbackman@5927: ProjNode* flags_node() const { return proj_out(flags_proj_node); } rbackman@5927: Node* control_node() const; rbackman@5927: Node* non_throwing_branch() const; rbackman@5791: protected: rbackman@5927: IfNode* if_node() const; rbackman@5927: BoolNode* bool_node() const; rbackman@5791: Node* no_overflow(PhaseGVN *phase, Node* new_result); rbackman@5791: }; rbackman@5791: rbackman@5997: class MathExactINode : public MathExactNode { rbackman@5997: public: rbackman@5997: MathExactINode(Node* ctrl, Node* in1) : MathExactNode(ctrl, in1) {} rbackman@5997: MathExactINode(Node* ctrl, Node* in1, Node* in2) : MathExactNode(ctrl, in1, in2) {} rbackman@5997: virtual int Opcode() const; rbackman@5997: virtual Node* match(const ProjNode* proj, const Matcher* m); rbackman@5997: virtual const Type* bottom_type() const { return TypeTuple::INT_CC_PAIR; } rbackman@5997: }; rbackman@5997: rbackman@5997: class MathExactLNode : public MathExactNode { rbackman@5791: public: rbackman@5997: MathExactLNode(Node* ctrl, Node* in1) : MathExactNode(ctrl, in1) {} rbackman@5997: MathExactLNode(Node* ctrl, Node* in1, Node* in2) : MathExactNode(ctrl, in1, in2) {} rbackman@5791: virtual int Opcode() const; rbackman@5791: virtual Node* match(const ProjNode* proj, const Matcher* m); rbackman@5997: virtual const Type* bottom_type() const { return TypeTuple::LONG_CC_PAIR; } rbackman@5997: }; rbackman@5997: rbackman@5997: class AddExactINode : public MathExactINode { rbackman@5997: public: rbackman@5997: AddExactINode(Node* ctrl, Node* in1, Node* in2) : MathExactINode(ctrl, in1, in2) {} rbackman@5997: virtual int Opcode() const; rbackman@5791: virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); rbackman@5791: }; rbackman@5791: rbackman@5997: class AddExactLNode : public MathExactLNode { rbackman@5997: public: rbackman@5997: AddExactLNode(Node* ctrl, Node* in1, Node* in2) : MathExactLNode(ctrl, in1, in2) {} rbackman@5997: virtual int Opcode() const; rbackman@5997: virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); rbackman@5997: }; rbackman@5997: rbackman@5997: class SubExactINode : public MathExactINode { rbackman@5997: public: rbackman@5997: SubExactINode(Node* ctrl, Node* in1, Node* in2) : MathExactINode(ctrl, in1, in2) {} rbackman@5997: virtual int Opcode() const; rbackman@5997: virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); rbackman@5997: }; rbackman@5997: rbackman@5997: class SubExactLNode : public MathExactLNode { rbackman@5997: public: rbackman@5997: SubExactLNode(Node* ctrl, Node* in1, Node* in2) : MathExactLNode(ctrl, in1, in2) {} rbackman@5997: virtual int Opcode() const; rbackman@5997: virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); rbackman@5997: }; rbackman@5997: rbackman@5997: class NegExactINode : public MathExactINode { rbackman@5997: public: rbackman@5997: NegExactINode(Node* ctrl, Node* in1) : MathExactINode(ctrl, in1) {} rbackman@5997: virtual int Opcode() const; rbackman@5997: virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); rbackman@5997: }; rbackman@5997: rbackman@5997: class NegExactLNode : public MathExactLNode { rbackman@5997: public: rbackman@5997: NegExactLNode(Node* ctrl, Node* in1) : MathExactLNode(ctrl, in1) {} rbackman@5997: virtual int Opcode() const; rbackman@5997: virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); rbackman@5997: }; rbackman@5997: rbackman@5997: class MulExactINode : public MathExactINode { rbackman@5997: public: rbackman@5997: MulExactINode(Node* ctrl, Node* in1, Node* in2) : MathExactINode(ctrl, in1, in2) {} rbackman@5997: virtual int Opcode() const; rbackman@5997: virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); rbackman@5997: }; rbackman@5997: rbackman@5997: class MulExactLNode : public MathExactLNode { rbackman@5997: public: rbackman@5997: MulExactLNode(Node* ctrl, Node* in1, Node* in2) : MathExactLNode(ctrl, in1, in2) {} rbackman@5997: virtual int Opcode() const; rbackman@5997: virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); rbackman@5997: }; rbackman@5997: rbackman@5791: class FlagsProjNode : public ProjNode { rbackman@5791: public: rbackman@5791: FlagsProjNode(Node* src, uint con) : ProjNode(src, con) { rbackman@5791: init_class_id(Class_FlagsProj); rbackman@5791: } rbackman@5791: rbackman@5791: virtual int Opcode() const; rbackman@5791: virtual bool is_CFG() const { return false; } rbackman@5791: virtual const Type* bottom_type() const { return TypeInt::CC; } rbackman@5791: virtual uint ideal_reg() const { return Op_RegFlags; } rbackman@5791: }; rbackman@5791: rbackman@5791: rbackman@5791: #endif rbackman@5791: