36 37 VectorNode(Node* n1, const TypeVect* vt) : TypeNode(vt, 2) { 38 init_class_id(Class_Vector); 39 init_req(1, n1); 40 } 41 VectorNode(Node* n1, Node* n2, const TypeVect* vt) : TypeNode(vt, 3) { 42 init_class_id(Class_Vector); 43 init_req(1, n1); 44 init_req(2, n2); 45 } 46 47 const TypeVect* vect_type() const { return type()->is_vect(); } 48 uint length() const { return vect_type()->length(); } // Vector length 49 uint length_in_bytes() const { return vect_type()->length_in_bytes(); } 50 51 virtual int Opcode() const; 52 53 virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(vect_type()->length_in_bytes()); } 54 55 static VectorNode* scalar2vector(Compile* C, Node* s, uint vlen, const Type* opd_t); 56 57 static VectorNode* make(Compile* C, int opc, Node* n1, Node* n2, uint vlen, BasicType bt); 58 59 static int opcode(int opc, BasicType bt); 60 static bool implemented(int opc, uint vlen, BasicType bt); 61 static bool is_shift(Node* n); 62 static bool is_invariant_vector(Node* n); 63 // [Start, end) half-open range defining which operands are vectors 64 static void vector_operands(Node* n, uint* start, uint* end); 65 }; 66 67 //===========================Vector=ALU=Operations==================================== 68 69 //------------------------------AddVBNode--------------------------------------- 70 // Vector add byte 71 class AddVBNode : public VectorNode { 72 public: 73 AddVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 74 virtual int Opcode() const; 75 }; 76 77 //------------------------------AddVSNode--------------------------------------- 78 // Vector add char/short 79 class AddVSNode : public VectorNode { 80 public: 81 AddVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 82 virtual int Opcode() const; 83 }; 84 85 //------------------------------AddVINode--------------------------------------- 86 // Vector add int 87 class AddVINode : public VectorNode { 193 MulVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 194 virtual int Opcode() const; 195 }; 196 197 //------------------------------DivVFNode--------------------------------------- 198 // Vector divide float 199 class DivVFNode : public VectorNode { 200 public: 201 DivVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 202 virtual int Opcode() const; 203 }; 204 205 //------------------------------DivVDNode--------------------------------------- 206 // Vector Divide double 207 class DivVDNode : public VectorNode { 208 public: 209 DivVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 210 virtual int Opcode() const; 211 }; 212 213 //------------------------------LShiftVBNode--------------------------------------- 214 // Vector left shift bytes 215 class LShiftVBNode : public VectorNode { 216 public: 217 LShiftVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 218 virtual int Opcode() const; 219 }; 220 221 //------------------------------LShiftVSNode--------------------------------------- 222 // Vector left shift shorts 223 class LShiftVSNode : public VectorNode { 224 public: 225 LShiftVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 226 virtual int Opcode() const; 227 }; 228 229 //------------------------------LShiftVINode--------------------------------------- 230 // Vector left shift ints 231 class LShiftVINode : public VectorNode { 232 public: 233 LShiftVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 234 virtual int Opcode() const; 235 }; 236 237 //------------------------------LShiftVLNode--------------------------------------- 238 // Vector left shift longs 239 class LShiftVLNode : public VectorNode { 240 public: 241 LShiftVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 242 virtual int Opcode() const; 243 }; 244 245 //------------------------------RShiftVBNode--------------------------------------- 246 // Vector right arithmetic (signed) shift bytes 247 class RShiftVBNode : public VectorNode { 248 public: 249 RShiftVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 250 virtual int Opcode() const; 251 }; 252 253 //------------------------------RShiftVSNode--------------------------------------- 254 // Vector right arithmetic (signed) shift shorts 255 class RShiftVSNode : public VectorNode { 256 public: 257 RShiftVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 258 virtual int Opcode() const; 259 }; 260 261 //------------------------------RShiftVINode--------------------------------------- 262 // Vector right arithmetic (signed) shift ints 263 class RShiftVINode : public VectorNode { 264 public: 265 RShiftVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 266 virtual int Opcode() const; 267 }; 268 269 //------------------------------RShiftVLNode--------------------------------------- 270 // Vector right arithmetic (signed) shift longs 271 class RShiftVLNode : public VectorNode { 272 public: 273 RShiftVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 274 virtual int Opcode() const; 275 }; 276 277 //------------------------------URShiftVBNode--------------------------------------- 278 // Vector right logical (unsigned) shift bytes 279 class URShiftVBNode : public VectorNode { 280 public: 281 URShiftVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 282 virtual int Opcode() const; 283 }; 284 285 //------------------------------URShiftVSNode--------------------------------------- 286 // Vector right logical (unsigned) shift shorts 287 class URShiftVSNode : public VectorNode { 288 public: 289 URShiftVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 290 virtual int Opcode() const; 291 }; 292 293 //------------------------------URShiftVINode--------------------------------------- 294 // Vector right logical (unsigned) shift ints 295 class URShiftVINode : public VectorNode { 296 public: 297 URShiftVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 298 virtual int Opcode() const; 299 }; 300 301 //------------------------------URShiftVLNode--------------------------------------- 302 // Vector right logical (unsigned) shift longs 303 class URShiftVLNode : public VectorNode { 304 public: 305 URShiftVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 306 virtual int Opcode() const; 307 }; 308 309 310 //------------------------------AndVNode--------------------------------------- 311 // Vector and integer 312 class AndVNode : public VectorNode { 313 public: 314 AndVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 315 virtual int Opcode() const; 316 }; 317 318 //------------------------------OrVNode--------------------------------------- 319 // Vector or integer 320 class OrVNode : public VectorNode { 321 public: 322 OrVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 323 virtual int Opcode() const; 324 }; 325 326 //------------------------------XorVNode--------------------------------------- 327 // Vector xor integer 328 class XorVNode : public VectorNode { | 36 37 VectorNode(Node* n1, const TypeVect* vt) : TypeNode(vt, 2) { 38 init_class_id(Class_Vector); 39 init_req(1, n1); 40 } 41 VectorNode(Node* n1, Node* n2, const TypeVect* vt) : TypeNode(vt, 3) { 42 init_class_id(Class_Vector); 43 init_req(1, n1); 44 init_req(2, n2); 45 } 46 47 const TypeVect* vect_type() const { return type()->is_vect(); } 48 uint length() const { return vect_type()->length(); } // Vector length 49 uint length_in_bytes() const { return vect_type()->length_in_bytes(); } 50 51 virtual int Opcode() const; 52 53 virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(vect_type()->length_in_bytes()); } 54 55 static VectorNode* scalar2vector(Compile* C, Node* s, uint vlen, const Type* opd_t); 56 static VectorNode* shift_count(Compile* C, Node* shift, Node* cnt, uint vlen, BasicType bt); 57 static VectorNode* make(Compile* C, int opc, Node* n1, Node* n2, uint vlen, BasicType bt); 58 59 static int opcode(int opc, BasicType bt); 60 static bool implemented(int opc, uint vlen, BasicType bt); 61 static bool is_shift(Node* n); 62 static bool is_invariant_vector(Node* n); 63 // [Start, end) half-open range defining which operands are vectors 64 static void vector_operands(Node* n, uint* start, uint* end); 65 }; 66 67 //===========================Vector=ALU=Operations============================== 68 69 //------------------------------AddVBNode--------------------------------------- 70 // Vector add byte 71 class AddVBNode : public VectorNode { 72 public: 73 AddVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 74 virtual int Opcode() const; 75 }; 76 77 //------------------------------AddVSNode--------------------------------------- 78 // Vector add char/short 79 class AddVSNode : public VectorNode { 80 public: 81 AddVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 82 virtual int Opcode() const; 83 }; 84 85 //------------------------------AddVINode--------------------------------------- 86 // Vector add int 87 class AddVINode : public VectorNode { 193 MulVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 194 virtual int Opcode() const; 195 }; 196 197 //------------------------------DivVFNode--------------------------------------- 198 // Vector divide float 199 class DivVFNode : public VectorNode { 200 public: 201 DivVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 202 virtual int Opcode() const; 203 }; 204 205 //------------------------------DivVDNode--------------------------------------- 206 // Vector Divide double 207 class DivVDNode : public VectorNode { 208 public: 209 DivVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 210 virtual int Opcode() const; 211 }; 212 213 //------------------------------LShiftVBNode----------------------------------- 214 // Vector left shift bytes 215 class LShiftVBNode : public VectorNode { 216 public: 217 LShiftVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 218 virtual int Opcode() const; 219 }; 220 221 //------------------------------LShiftVSNode----------------------------------- 222 // Vector left shift shorts 223 class LShiftVSNode : public VectorNode { 224 public: 225 LShiftVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 226 virtual int Opcode() const; 227 }; 228 229 //------------------------------LShiftVINode----------------------------------- 230 // Vector left shift ints 231 class LShiftVINode : public VectorNode { 232 public: 233 LShiftVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 234 virtual int Opcode() const; 235 }; 236 237 //------------------------------LShiftVLNode----------------------------------- 238 // Vector left shift longs 239 class LShiftVLNode : public VectorNode { 240 public: 241 LShiftVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 242 virtual int Opcode() const; 243 }; 244 245 //------------------------------RShiftVBNode----------------------------------- 246 // Vector right arithmetic (signed) shift bytes 247 class RShiftVBNode : public VectorNode { 248 public: 249 RShiftVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 250 virtual int Opcode() const; 251 }; 252 253 //------------------------------RShiftVSNode----------------------------------- 254 // Vector right arithmetic (signed) shift shorts 255 class RShiftVSNode : public VectorNode { 256 public: 257 RShiftVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 258 virtual int Opcode() const; 259 }; 260 261 //------------------------------RShiftVINode----------------------------------- 262 // Vector right arithmetic (signed) shift ints 263 class RShiftVINode : public VectorNode { 264 public: 265 RShiftVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 266 virtual int Opcode() const; 267 }; 268 269 //------------------------------RShiftVLNode----------------------------------- 270 // Vector right arithmetic (signed) shift longs 271 class RShiftVLNode : public VectorNode { 272 public: 273 RShiftVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 274 virtual int Opcode() const; 275 }; 276 277 //------------------------------URShiftVBNode---------------------------------- 278 // Vector right logical (unsigned) shift bytes 279 class URShiftVBNode : public VectorNode { 280 public: 281 URShiftVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 282 virtual int Opcode() const; 283 }; 284 285 //------------------------------URShiftVSNode---------------------------------- 286 // Vector right logical (unsigned) shift shorts 287 class URShiftVSNode : public VectorNode { 288 public: 289 URShiftVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 290 virtual int Opcode() const; 291 }; 292 293 //------------------------------URShiftVINode---------------------------------- 294 // Vector right logical (unsigned) shift ints 295 class URShiftVINode : public VectorNode { 296 public: 297 URShiftVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 298 virtual int Opcode() const; 299 }; 300 301 //------------------------------URShiftVLNode---------------------------------- 302 // Vector right logical (unsigned) shift longs 303 class URShiftVLNode : public VectorNode { 304 public: 305 URShiftVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 306 virtual int Opcode() const; 307 }; 308 309 //------------------------------LShiftCntVNode--------------------------------- 310 // Vector left shift count 311 class LShiftCntVNode : public VectorNode { 312 public: 313 LShiftCntVNode(Node* cnt, const TypeVect* vt) : VectorNode(cnt,vt) {} 314 virtual int Opcode() const; 315 virtual uint ideal_reg() const { return Matcher::vector_shift_count_ideal_reg(vect_type()->length_in_bytes()); } 316 }; 317 318 //------------------------------RShiftCntVNode--------------------------------- 319 // Vector right shift count 320 class RShiftCntVNode : public VectorNode { 321 public: 322 RShiftCntVNode(Node* cnt, const TypeVect* vt) : VectorNode(cnt,vt) {} 323 virtual int Opcode() const; 324 virtual uint ideal_reg() const { return Matcher::vector_shift_count_ideal_reg(vect_type()->length_in_bytes()); } 325 }; 326 327 328 //------------------------------AndVNode--------------------------------------- 329 // Vector and integer 330 class AndVNode : public VectorNode { 331 public: 332 AndVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 333 virtual int Opcode() const; 334 }; 335 336 //------------------------------OrVNode--------------------------------------- 337 // Vector or integer 338 class OrVNode : public VectorNode { 339 public: 340 OrVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 341 virtual int Opcode() const; 342 }; 343 344 //------------------------------XorVNode--------------------------------------- 345 // Vector xor integer 346 class XorVNode : public VectorNode { |