1 /* 2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #ifndef SHARE_VM_OPTO_CONVERTNODE_HPP 26 #define SHARE_VM_OPTO_CONVERTNODE_HPP 27 28 #include "opto/node.hpp" 29 #include "opto/opcodes.hpp" 30 31 32 //------------------------------Conv2BNode------------------------------------- 33 // Convert int/pointer to a Boolean. Map zero to zero, all else to 1. 34 class Conv2BNode : public Node { 35 public: 36 Conv2BNode( Node *i ) : Node(0,i) {} 37 virtual int Opcode() const; 38 virtual const Type *bottom_type() const { return TypeInt::BOOL; } 39 virtual Node* Identity(PhaseGVN* phase); 40 virtual const Type* Value(PhaseGVN* phase) const; 41 virtual uint ideal_reg() const { return Op_RegI; } 42 }; 43 44 // The conversions operations are all Alpha sorted. Please keep it that way! 45 //------------------------------ConvD2FNode------------------------------------ 46 // Convert double to float 47 class ConvD2FNode : public Node { 48 public: 49 ConvD2FNode( Node *in1 ) : Node(0,in1) {} 50 virtual int Opcode() const; 51 virtual const Type *bottom_type() const { return Type::FLOAT; } 52 virtual const Type* Value(PhaseGVN* phase) const; 53 virtual Node* Identity(PhaseGVN* phase); 54 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); 55 virtual uint ideal_reg() const { return Op_RegF; } 56 }; 57 58 //------------------------------ConvD2INode------------------------------------ 59 // Convert Double to Integer 60 class ConvD2INode : public Node { 61 public: 62 ConvD2INode( Node *in1 ) : Node(0,in1) {} 63 virtual int Opcode() const; 64 virtual const Type *bottom_type() const { return TypeInt::INT; } 65 virtual const Type* Value(PhaseGVN* phase) const; 66 virtual Node* Identity(PhaseGVN* phase); 67 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); 68 virtual uint ideal_reg() const { return Op_RegI; } 69 }; 70 71 //------------------------------ConvD2LNode------------------------------------ 72 // Convert Double to Long 73 class ConvD2LNode : public Node { 74 public: 75 ConvD2LNode( Node *dbl ) : Node(0,dbl) {} 76 virtual int Opcode() const; 77 virtual const Type *bottom_type() const { return TypeLong::LONG; } 78 virtual const Type* Value(PhaseGVN* phase) const; 79 virtual Node* Identity(PhaseGVN* phase); 80 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); 81 virtual uint ideal_reg() const { return Op_RegL; } 82 }; 83 84 //------------------------------ConvF2DNode------------------------------------ 85 // Convert Float to a Double. 86 class ConvF2DNode : public Node { 87 public: 88 ConvF2DNode( Node *in1 ) : Node(0,in1) {} 89 virtual int Opcode() const; 90 virtual const Type *bottom_type() const { return Type::DOUBLE; } 91 virtual const Type* Value(PhaseGVN* phase) const; 92 virtual uint ideal_reg() const { return Op_RegD; } 93 }; 94 95 //------------------------------ConvF2INode------------------------------------ 96 // Convert float to integer 97 class ConvF2INode : public Node { 98 public: 99 ConvF2INode( Node *in1 ) : Node(0,in1) {} 100 virtual int Opcode() const; 101 virtual const Type *bottom_type() const { return TypeInt::INT; } 102 virtual const Type* Value(PhaseGVN* phase) const; 103 virtual Node* Identity(PhaseGVN* phase); 104 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); 105 virtual uint ideal_reg() const { return Op_RegI; } 106 }; 107 108 //------------------------------ConvF2LNode------------------------------------ 109 // Convert float to long 110 class ConvF2LNode : public Node { 111 public: 112 ConvF2LNode( Node *in1 ) : Node(0,in1) {} 113 virtual int Opcode() const; 114 virtual const Type *bottom_type() const { return TypeLong::LONG; } 115 virtual const Type* Value(PhaseGVN* phase) const; 116 virtual Node* Identity(PhaseGVN* phase); 117 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); 118 virtual uint ideal_reg() const { return Op_RegL; } 119 }; 120 121 //------------------------------ConvI2DNode------------------------------------ 122 // Convert Integer to Double 123 class ConvI2DNode : public Node { 124 public: 125 ConvI2DNode( Node *in1 ) : Node(0,in1) {} 126 virtual int Opcode() const; 127 virtual const Type *bottom_type() const { return Type::DOUBLE; } 128 virtual const Type* Value(PhaseGVN* phase) const; 129 virtual uint ideal_reg() const { return Op_RegD; } 130 }; 131 132 //------------------------------ConvI2FNode------------------------------------ 133 // Convert Integer to Float 134 class ConvI2FNode : public Node { 135 public: 136 ConvI2FNode( Node *in1 ) : Node(0,in1) {} 137 virtual int Opcode() const; 138 virtual const Type *bottom_type() const { return Type::FLOAT; } 139 virtual const Type* Value(PhaseGVN* phase) const; 140 virtual Node* Identity(PhaseGVN* phase); 141 virtual uint ideal_reg() const { return Op_RegF; } 142 }; 143 144 //------------------------------ConvI2LNode------------------------------------ 145 // Convert integer to long 146 class ConvI2LNode : public TypeNode { 147 public: 148 ConvI2LNode(Node *in1, const TypeLong* t = TypeLong::INT) 149 : TypeNode(t, 2) 150 { init_req(1, in1); } 151 virtual int Opcode() const; 152 virtual const Type* Value(PhaseGVN* phase) const; 153 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); 154 virtual uint ideal_reg() const { return Op_RegL; } 155 }; 156 157 //------------------------------ConvL2DNode------------------------------------ 158 // Convert Long to Double 159 class ConvL2DNode : public Node { 160 public: 161 ConvL2DNode( Node *in1 ) : Node(0,in1) {} 162 virtual int Opcode() const; 163 virtual const Type *bottom_type() const { return Type::DOUBLE; } 164 virtual const Type* Value(PhaseGVN* phase) const; 165 virtual uint ideal_reg() const { return Op_RegD; } 166 }; 167 168 //------------------------------ConvL2FNode------------------------------------ 169 // Convert Long to Float 170 class ConvL2FNode : public Node { 171 public: 172 ConvL2FNode( Node *in1 ) : Node(0,in1) {} 173 virtual int Opcode() const; 174 virtual const Type *bottom_type() const { return Type::FLOAT; } 175 virtual const Type* Value(PhaseGVN* phase) const; 176 virtual uint ideal_reg() const { return Op_RegF; } 177 }; 178 179 //------------------------------ConvL2INode------------------------------------ 180 // Convert long to integer 181 class ConvL2INode : public Node { 182 public: 183 ConvL2INode( Node *in1 ) : Node(0,in1) {} 184 virtual int Opcode() const; 185 virtual const Type *bottom_type() const { return TypeInt::INT; } 186 virtual Node* Identity(PhaseGVN* phase); 187 virtual const Type* Value(PhaseGVN* phase) const; 188 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); 189 virtual uint ideal_reg() const { return Op_RegI; } 190 }; 191 192 //-----------------------------RoundFloatNode---------------------------------- 193 class RoundFloatNode: public Node { 194 public: 195 RoundFloatNode(Node* c, Node *in1): Node(c, in1) {} 196 virtual int Opcode() const; 197 virtual const Type *bottom_type() const { return Type::FLOAT; } 198 virtual uint ideal_reg() const { return Op_RegF; } 199 virtual Node* Identity(PhaseGVN* phase); 200 virtual const Type* Value(PhaseGVN* phase) const; 201 }; 202 203 204 //-----------------------------RoundDoubleNode--------------------------------- 205 class RoundDoubleNode: public Node { 206 public: 207 RoundDoubleNode(Node* c, Node *in1): Node(c, in1) {} 208 virtual int Opcode() const; 209 virtual const Type *bottom_type() const { return Type::DOUBLE; } 210 virtual uint ideal_reg() const { return Op_RegD; } 211 virtual Node* Identity(PhaseGVN* phase); 212 virtual const Type* Value(PhaseGVN* phase) const; 213 }; 214 215 216 #endif // SHARE_VM_OPTO_CONVERTNODE_HPP