1.1 --- a/src/share/vm/opto/vectornode.hpp Thu Jun 14 14:59:52 2012 -0700 1.2 +++ b/src/share/vm/opto/vectornode.hpp Fri Jun 15 01:25:19 2012 -0700 1.3 @@ -1,5 +1,5 @@ 1.4 /* 1.5 - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 1.6 + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. 1.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.8 * 1.9 * This code is free software; you can redistribute it and/or modify it 1.10 @@ -31,48 +31,32 @@ 1.11 1.12 //------------------------------VectorNode-------------------------------------- 1.13 // Vector Operation 1.14 -class VectorNode : public Node { 1.15 - virtual uint size_of() const { return sizeof(*this); } 1.16 - protected: 1.17 - uint _length; // vector length 1.18 - virtual BasicType elt_basic_type() const = 0; // Vector element basic type 1.19 +class VectorNode : public TypeNode { 1.20 + public: 1.21 1.22 - static const Type* vect_type(BasicType elt_bt, uint len); 1.23 - static const Type* vect_type(const Type* elt_type, uint len) { 1.24 - return vect_type(elt_type->array_element_basic_type(), len); 1.25 + VectorNode(Node* n1, const TypeVect* vt) : TypeNode(vt, 2) { 1.26 + init_class_id(Class_Vector); 1.27 + init_req(1, n1); 1.28 + } 1.29 + VectorNode(Node* n1, Node* n2, const TypeVect* vt) : TypeNode(vt, 3) { 1.30 + init_class_id(Class_Vector); 1.31 + init_req(1, n1); 1.32 + init_req(2, n2); 1.33 } 1.34 1.35 - public: 1.36 - friend class VectorLoadNode; // For vect_type 1.37 - friend class VectorStoreNode; // ditto. 1.38 + const TypeVect* vect_type() const { return type()->is_vect(); } 1.39 + uint length() const { return vect_type()->length(); } // Vector length 1.40 1.41 - VectorNode(Node* n1, uint vlen) : Node(NULL, n1), _length(vlen) { 1.42 - init_class_id(Class_Vector); 1.43 - } 1.44 - VectorNode(Node* n1, Node* n2, uint vlen) : Node(NULL, n1, n2), _length(vlen) { 1.45 - init_class_id(Class_Vector); 1.46 - } 1.47 virtual int Opcode() const; 1.48 1.49 - uint length() const { return _length; } // Vector length 1.50 - 1.51 - static uint max_vlen(BasicType bt) { // max vector length 1.52 - return (uint)(Matcher::vector_width_in_bytes() / type2aelembytes(bt)); 1.53 - } 1.54 - 1.55 - // Element and vector type 1.56 - const Type* elt_type() const { return Type::get_const_basic_type(elt_basic_type()); } 1.57 - const Type* vect_type() const { return vect_type(elt_basic_type(), length()); } 1.58 - 1.59 - virtual const Type *bottom_type() const { return vect_type(); } 1.60 - virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(); } 1.61 - 1.62 - // Vector opcode from scalar opcode 1.63 - static int opcode(int sopc, uint vlen, const Type* opd_t); 1.64 + virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(vect_type()->length_in_bytes()); } 1.65 1.66 static VectorNode* scalar2vector(Compile* C, Node* s, uint vlen, const Type* opd_t); 1.67 1.68 - static VectorNode* make(Compile* C, int sopc, Node* n1, Node* n2, uint vlen, const Type* elt_t); 1.69 + static VectorNode* make(Compile* C, int opc, Node* n1, Node* n2, uint vlen, BasicType bt); 1.70 + 1.71 + static int opcode(int opc, uint vlen, BasicType bt); 1.72 + static bool implemented(int opc, uint vlen, BasicType bt); 1.73 1.74 }; 1.75 1.76 @@ -81,981 +65,393 @@ 1.77 //------------------------------AddVBNode--------------------------------------- 1.78 // Vector add byte 1.79 class AddVBNode : public VectorNode { 1.80 - protected: 1.81 - virtual BasicType elt_basic_type() const { return T_BYTE; } 1.82 public: 1.83 - AddVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.84 - virtual int Opcode() const; 1.85 -}; 1.86 - 1.87 -//------------------------------AddVCNode--------------------------------------- 1.88 -// Vector add char 1.89 -class AddVCNode : public VectorNode { 1.90 - protected: 1.91 - virtual BasicType elt_basic_type() const { return T_CHAR; } 1.92 - public: 1.93 - AddVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.94 + AddVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.95 virtual int Opcode() const; 1.96 }; 1.97 1.98 //------------------------------AddVSNode--------------------------------------- 1.99 -// Vector add short 1.100 +// Vector add char/short 1.101 class AddVSNode : public VectorNode { 1.102 - protected: 1.103 - virtual BasicType elt_basic_type() const { return T_SHORT; } 1.104 public: 1.105 - AddVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.106 + AddVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.107 virtual int Opcode() const; 1.108 }; 1.109 1.110 //------------------------------AddVINode--------------------------------------- 1.111 // Vector add int 1.112 class AddVINode : public VectorNode { 1.113 - protected: 1.114 - virtual BasicType elt_basic_type() const { return T_INT; } 1.115 public: 1.116 - AddVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.117 + AddVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.118 virtual int Opcode() const; 1.119 }; 1.120 1.121 //------------------------------AddVLNode--------------------------------------- 1.122 // Vector add long 1.123 class AddVLNode : public VectorNode { 1.124 - protected: 1.125 - virtual BasicType elt_basic_type() const { return T_LONG; } 1.126 public: 1.127 - AddVLNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.128 + AddVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.129 virtual int Opcode() const; 1.130 }; 1.131 1.132 //------------------------------AddVFNode--------------------------------------- 1.133 // Vector add float 1.134 class AddVFNode : public VectorNode { 1.135 - protected: 1.136 - virtual BasicType elt_basic_type() const { return T_FLOAT; } 1.137 public: 1.138 - AddVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.139 + AddVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.140 virtual int Opcode() const; 1.141 }; 1.142 1.143 //------------------------------AddVDNode--------------------------------------- 1.144 // Vector add double 1.145 class AddVDNode : public VectorNode { 1.146 - protected: 1.147 - virtual BasicType elt_basic_type() const { return T_DOUBLE; } 1.148 public: 1.149 - AddVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.150 + AddVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.151 virtual int Opcode() const; 1.152 }; 1.153 1.154 //------------------------------SubVBNode--------------------------------------- 1.155 // Vector subtract byte 1.156 class SubVBNode : public VectorNode { 1.157 - protected: 1.158 - virtual BasicType elt_basic_type() const { return T_BYTE; } 1.159 public: 1.160 - SubVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.161 - virtual int Opcode() const; 1.162 -}; 1.163 - 1.164 -//------------------------------SubVCNode--------------------------------------- 1.165 -// Vector subtract char 1.166 -class SubVCNode : public VectorNode { 1.167 - protected: 1.168 - virtual BasicType elt_basic_type() const { return T_CHAR; } 1.169 - public: 1.170 - SubVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.171 + SubVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.172 virtual int Opcode() const; 1.173 }; 1.174 1.175 //------------------------------SubVSNode--------------------------------------- 1.176 // Vector subtract short 1.177 class SubVSNode : public VectorNode { 1.178 - protected: 1.179 - virtual BasicType elt_basic_type() const { return T_SHORT; } 1.180 public: 1.181 - SubVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.182 + SubVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.183 virtual int Opcode() const; 1.184 }; 1.185 1.186 //------------------------------SubVINode--------------------------------------- 1.187 // Vector subtract int 1.188 class SubVINode : public VectorNode { 1.189 - protected: 1.190 - virtual BasicType elt_basic_type() const { return T_INT; } 1.191 public: 1.192 - SubVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.193 + SubVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.194 virtual int Opcode() const; 1.195 }; 1.196 1.197 //------------------------------SubVLNode--------------------------------------- 1.198 // Vector subtract long 1.199 class SubVLNode : public VectorNode { 1.200 - protected: 1.201 - virtual BasicType elt_basic_type() const { return T_LONG; } 1.202 public: 1.203 - SubVLNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.204 + SubVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.205 virtual int Opcode() const; 1.206 }; 1.207 1.208 //------------------------------SubVFNode--------------------------------------- 1.209 // Vector subtract float 1.210 class SubVFNode : public VectorNode { 1.211 - protected: 1.212 - virtual BasicType elt_basic_type() const { return T_FLOAT; } 1.213 public: 1.214 - SubVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.215 + SubVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.216 virtual int Opcode() const; 1.217 }; 1.218 1.219 //------------------------------SubVDNode--------------------------------------- 1.220 // Vector subtract double 1.221 class SubVDNode : public VectorNode { 1.222 - protected: 1.223 - virtual BasicType elt_basic_type() const { return T_DOUBLE; } 1.224 public: 1.225 - SubVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.226 + SubVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.227 virtual int Opcode() const; 1.228 }; 1.229 1.230 //------------------------------MulVFNode--------------------------------------- 1.231 // Vector multiply float 1.232 class MulVFNode : public VectorNode { 1.233 - protected: 1.234 - virtual BasicType elt_basic_type() const { return T_FLOAT; } 1.235 public: 1.236 - MulVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.237 + MulVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.238 virtual int Opcode() const; 1.239 }; 1.240 1.241 //------------------------------MulVDNode--------------------------------------- 1.242 // Vector multiply double 1.243 class MulVDNode : public VectorNode { 1.244 - protected: 1.245 - virtual BasicType elt_basic_type() const { return T_DOUBLE; } 1.246 public: 1.247 - MulVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.248 + MulVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.249 virtual int Opcode() const; 1.250 }; 1.251 1.252 //------------------------------DivVFNode--------------------------------------- 1.253 // Vector divide float 1.254 class DivVFNode : public VectorNode { 1.255 - protected: 1.256 - virtual BasicType elt_basic_type() const { return T_FLOAT; } 1.257 public: 1.258 - DivVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.259 + DivVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.260 virtual int Opcode() const; 1.261 }; 1.262 1.263 //------------------------------DivVDNode--------------------------------------- 1.264 // Vector Divide double 1.265 class DivVDNode : public VectorNode { 1.266 - protected: 1.267 - virtual BasicType elt_basic_type() const { return T_DOUBLE; } 1.268 public: 1.269 - DivVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.270 + DivVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.271 virtual int Opcode() const; 1.272 }; 1.273 1.274 //------------------------------LShiftVBNode--------------------------------------- 1.275 // Vector lshift byte 1.276 class LShiftVBNode : public VectorNode { 1.277 - protected: 1.278 - virtual BasicType elt_basic_type() const { return T_BYTE; } 1.279 public: 1.280 - LShiftVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.281 - virtual int Opcode() const; 1.282 -}; 1.283 - 1.284 -//------------------------------LShiftVCNode--------------------------------------- 1.285 -// Vector lshift chars 1.286 -class LShiftVCNode : public VectorNode { 1.287 - protected: 1.288 - virtual BasicType elt_basic_type() const { return T_CHAR; } 1.289 - public: 1.290 - LShiftVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.291 + LShiftVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.292 virtual int Opcode() const; 1.293 }; 1.294 1.295 //------------------------------LShiftVSNode--------------------------------------- 1.296 // Vector lshift shorts 1.297 class LShiftVSNode : public VectorNode { 1.298 - protected: 1.299 - virtual BasicType elt_basic_type() const { return T_SHORT; } 1.300 public: 1.301 - LShiftVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.302 + LShiftVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.303 virtual int Opcode() const; 1.304 }; 1.305 1.306 //------------------------------LShiftVINode--------------------------------------- 1.307 // Vector lshift ints 1.308 class LShiftVINode : public VectorNode { 1.309 - protected: 1.310 - virtual BasicType elt_basic_type() const { return T_INT; } 1.311 public: 1.312 - LShiftVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.313 + LShiftVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.314 virtual int Opcode() const; 1.315 }; 1.316 1.317 //------------------------------URShiftVBNode--------------------------------------- 1.318 // Vector urshift bytes 1.319 -class URShiftVBNode : public VectorNode { 1.320 - protected: 1.321 - virtual BasicType elt_basic_type() const { return T_BYTE; } 1.322 +class RShiftVBNode : public VectorNode { 1.323 public: 1.324 - URShiftVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.325 - virtual int Opcode() const; 1.326 -}; 1.327 - 1.328 -//------------------------------URShiftVCNode--------------------------------------- 1.329 -// Vector urshift char 1.330 -class URShiftVCNode : public VectorNode { 1.331 - protected: 1.332 - virtual BasicType elt_basic_type() const { return T_SHORT; } 1.333 - public: 1.334 - URShiftVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.335 + RShiftVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.336 virtual int Opcode() const; 1.337 }; 1.338 1.339 //------------------------------URShiftVSNode--------------------------------------- 1.340 // Vector urshift shorts 1.341 -class URShiftVSNode : public VectorNode { 1.342 - protected: 1.343 - virtual BasicType elt_basic_type() const { return T_SHORT; } 1.344 +class RShiftVSNode : public VectorNode { 1.345 public: 1.346 - URShiftVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.347 + RShiftVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.348 virtual int Opcode() const; 1.349 }; 1.350 1.351 //------------------------------URShiftVINode--------------------------------------- 1.352 // Vector urshift ints 1.353 -class URShiftVINode : public VectorNode { 1.354 - protected: 1.355 - virtual BasicType elt_basic_type() const { return T_INT; } 1.356 +class RShiftVINode : public VectorNode { 1.357 public: 1.358 - URShiftVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {} 1.359 + RShiftVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.360 virtual int Opcode() const; 1.361 }; 1.362 1.363 //------------------------------AndVNode--------------------------------------- 1.364 // Vector and 1.365 class AndVNode : public VectorNode { 1.366 - protected: 1.367 - BasicType _bt; 1.368 - virtual BasicType elt_basic_type() const { return _bt; } 1.369 public: 1.370 - AndVNode(Node* in1, Node* in2, uint vlen, BasicType bt) : VectorNode(in1,in2,vlen), _bt(bt) {} 1.371 + AndVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.372 virtual int Opcode() const; 1.373 }; 1.374 1.375 //------------------------------OrVNode--------------------------------------- 1.376 // Vector or 1.377 class OrVNode : public VectorNode { 1.378 - protected: 1.379 - BasicType _bt; 1.380 - virtual BasicType elt_basic_type() const { return _bt; } 1.381 public: 1.382 - OrVNode(Node* in1, Node* in2, uint vlen, BasicType bt) : VectorNode(in1,in2,vlen), _bt(bt) {} 1.383 + OrVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.384 virtual int Opcode() const; 1.385 }; 1.386 1.387 //------------------------------XorVNode--------------------------------------- 1.388 // Vector xor 1.389 class XorVNode : public VectorNode { 1.390 - protected: 1.391 - BasicType _bt; 1.392 - virtual BasicType elt_basic_type() const { return _bt; } 1.393 public: 1.394 - XorVNode(Node* in1, Node* in2, uint vlen, BasicType bt) : VectorNode(in1,in2,vlen), _bt(bt) {} 1.395 + XorVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 1.396 virtual int Opcode() const; 1.397 }; 1.398 1.399 -//================================= M E M O R Y ================================== 1.400 +//================================= M E M O R Y =============================== 1.401 1.402 - 1.403 -//------------------------------VectorLoadNode-------------------------------------- 1.404 -// Vector Load from memory 1.405 -class VectorLoadNode : public LoadNode { 1.406 - virtual uint size_of() const { return sizeof(*this); } 1.407 - 1.408 - protected: 1.409 - virtual BasicType elt_basic_type() const = 0; // Vector element basic type 1.410 - // For use in constructor 1.411 - static const Type* vect_type(const Type* elt_type, uint len) { 1.412 - return VectorNode::vect_type(elt_type, len); 1.413 +//------------------------------LoadVectorNode--------------------------------- 1.414 +// Load Vector from memory 1.415 +class LoadVectorNode : public LoadNode { 1.416 + public: 1.417 + LoadVectorNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeVect* vt) 1.418 + : LoadNode(c, mem, adr, at, vt) { 1.419 + init_class_id(Class_LoadVector); 1.420 } 1.421 1.422 - public: 1.423 - VectorLoadNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *rt) 1.424 - : LoadNode(c,mem,adr,at,rt) { 1.425 - init_class_id(Class_VectorLoad); 1.426 - } 1.427 + const TypeVect* vect_type() const { return type()->is_vect(); } 1.428 + uint length() const { return vect_type()->length(); } // Vector length 1.429 + 1.430 virtual int Opcode() const; 1.431 1.432 - virtual uint length() const = 0; // Vector length 1.433 + virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(memory_size()); } 1.434 + virtual BasicType memory_type() const { return T_VOID; } 1.435 + virtual int memory_size() const { return vect_type()->length_in_bytes(); } 1.436 1.437 - // Element and vector type 1.438 - const Type* elt_type() const { return Type::get_const_basic_type(elt_basic_type()); } 1.439 - const Type* vect_type() const { return VectorNode::vect_type(elt_basic_type(), length()); } 1.440 + virtual int store_Opcode() const { return Op_StoreVector; } 1.441 1.442 - virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(); } 1.443 - virtual BasicType memory_type() const { return T_VOID; } 1.444 - virtual int memory_size() const { return length()*type2aelembytes(elt_basic_type()); } 1.445 - 1.446 - // Vector opcode from scalar opcode 1.447 - static int opcode(int sopc, uint vlen); 1.448 - 1.449 - static VectorLoadNode* make(Compile* C, int opc, Node* ctl, Node* mem, 1.450 - Node* adr, const TypePtr* atyp, uint vlen); 1.451 + static LoadVectorNode* make(Compile* C, int opc, Node* ctl, Node* mem, 1.452 + Node* adr, const TypePtr* atyp, uint vlen, BasicType bt); 1.453 }; 1.454 1.455 -//------------------------------Load16BNode-------------------------------------- 1.456 -// Vector load of 16 bytes (8bits signed) from memory 1.457 -class Load16BNode : public VectorLoadNode { 1.458 - protected: 1.459 - virtual BasicType elt_basic_type() const { return T_BYTE; } 1.460 +//------------------------------StoreVectorNode-------------------------------- 1.461 +// Store Vector to memory 1.462 +class StoreVectorNode : public StoreNode { 1.463 public: 1.464 - Load16BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::BYTE) 1.465 - : VectorLoadNode(c,mem,adr,at,vect_type(ti,16)) {} 1.466 - virtual int Opcode() const; 1.467 - virtual int store_Opcode() const { return Op_Store16B; } 1.468 - virtual uint length() const { return 16; } 1.469 -}; 1.470 + StoreVectorNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) 1.471 + : StoreNode(c, mem, adr, at, val) { 1.472 + assert(val->is_Vector() || val->is_LoadVector(), "sanity"); 1.473 + init_class_id(Class_StoreVector); 1.474 + } 1.475 1.476 -//------------------------------Load8BNode-------------------------------------- 1.477 -// Vector load of 8 bytes (8bits signed) from memory 1.478 -class Load8BNode : public VectorLoadNode { 1.479 - protected: 1.480 - virtual BasicType elt_basic_type() const { return T_BYTE; } 1.481 - public: 1.482 - Load8BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::BYTE) 1.483 - : VectorLoadNode(c,mem,adr,at,vect_type(ti,8)) {} 1.484 - virtual int Opcode() const; 1.485 - virtual int store_Opcode() const { return Op_Store8B; } 1.486 - virtual uint length() const { return 8; } 1.487 -}; 1.488 + const TypeVect* vect_type() const { return in(MemNode::ValueIn)->bottom_type()->is_vect(); } 1.489 + uint length() const { return vect_type()->length(); } // Vector length 1.490 1.491 -//------------------------------Load4BNode-------------------------------------- 1.492 -// Vector load of 4 bytes (8bits signed) from memory 1.493 -class Load4BNode : public VectorLoadNode { 1.494 - protected: 1.495 - virtual BasicType elt_basic_type() const { return T_BYTE; } 1.496 - public: 1.497 - Load4BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::BYTE) 1.498 - : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {} 1.499 - virtual int Opcode() const; 1.500 - virtual int store_Opcode() const { return Op_Store4B; } 1.501 - virtual uint length() const { return 4; } 1.502 -}; 1.503 - 1.504 -//------------------------------Load8CNode-------------------------------------- 1.505 -// Vector load of 8 chars (16bits unsigned) from memory 1.506 -class Load8CNode : public VectorLoadNode { 1.507 - protected: 1.508 - virtual BasicType elt_basic_type() const { return T_CHAR; } 1.509 - public: 1.510 - Load8CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR) 1.511 - : VectorLoadNode(c,mem,adr,at,vect_type(ti,8)) {} 1.512 - virtual int Opcode() const; 1.513 - virtual int store_Opcode() const { return Op_Store8C; } 1.514 - virtual uint length() const { return 8; } 1.515 -}; 1.516 - 1.517 -//------------------------------Load4CNode-------------------------------------- 1.518 -// Vector load of 4 chars (16bits unsigned) from memory 1.519 -class Load4CNode : public VectorLoadNode { 1.520 - protected: 1.521 - virtual BasicType elt_basic_type() const { return T_CHAR; } 1.522 - public: 1.523 - Load4CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR) 1.524 - : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {} 1.525 - virtual int Opcode() const; 1.526 - virtual int store_Opcode() const { return Op_Store4C; } 1.527 - virtual uint length() const { return 4; } 1.528 -}; 1.529 - 1.530 -//------------------------------Load2CNode-------------------------------------- 1.531 -// Vector load of 2 chars (16bits unsigned) from memory 1.532 -class Load2CNode : public VectorLoadNode { 1.533 - protected: 1.534 - virtual BasicType elt_basic_type() const { return T_CHAR; } 1.535 - public: 1.536 - Load2CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR) 1.537 - : VectorLoadNode(c,mem,adr,at,vect_type(ti,2)) {} 1.538 - virtual int Opcode() const; 1.539 - virtual int store_Opcode() const { return Op_Store2C; } 1.540 - virtual uint length() const { return 2; } 1.541 -}; 1.542 - 1.543 -//------------------------------Load8SNode-------------------------------------- 1.544 -// Vector load of 8 shorts (16bits signed) from memory 1.545 -class Load8SNode : public VectorLoadNode { 1.546 - protected: 1.547 - virtual BasicType elt_basic_type() const { return T_SHORT; } 1.548 - public: 1.549 - Load8SNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::SHORT) 1.550 - : VectorLoadNode(c,mem,adr,at,vect_type(ti,8)) {} 1.551 - virtual int Opcode() const; 1.552 - virtual int store_Opcode() const { return Op_Store8C; } 1.553 - virtual uint length() const { return 8; } 1.554 -}; 1.555 - 1.556 -//------------------------------Load4SNode-------------------------------------- 1.557 -// Vector load of 4 shorts (16bits signed) from memory 1.558 -class Load4SNode : public VectorLoadNode { 1.559 - protected: 1.560 - virtual BasicType elt_basic_type() const { return T_SHORT; } 1.561 - public: 1.562 - Load4SNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::SHORT) 1.563 - : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {} 1.564 - virtual int Opcode() const; 1.565 - virtual int store_Opcode() const { return Op_Store4C; } 1.566 - virtual uint length() const { return 4; } 1.567 -}; 1.568 - 1.569 -//------------------------------Load2SNode-------------------------------------- 1.570 -// Vector load of 2 shorts (16bits signed) from memory 1.571 -class Load2SNode : public VectorLoadNode { 1.572 - protected: 1.573 - virtual BasicType elt_basic_type() const { return T_SHORT; } 1.574 - public: 1.575 - Load2SNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::SHORT) 1.576 - : VectorLoadNode(c,mem,adr,at,vect_type(ti,2)) {} 1.577 - virtual int Opcode() const; 1.578 - virtual int store_Opcode() const { return Op_Store2C; } 1.579 - virtual uint length() const { return 2; } 1.580 -}; 1.581 - 1.582 -//------------------------------Load4INode-------------------------------------- 1.583 -// Vector load of 4 integers (32bits signed) from memory 1.584 -class Load4INode : public VectorLoadNode { 1.585 - protected: 1.586 - virtual BasicType elt_basic_type() const { return T_INT; } 1.587 - public: 1.588 - Load4INode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::INT) 1.589 - : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {} 1.590 - virtual int Opcode() const; 1.591 - virtual int store_Opcode() const { return Op_Store4I; } 1.592 - virtual uint length() const { return 4; } 1.593 -}; 1.594 - 1.595 -//------------------------------Load2INode-------------------------------------- 1.596 -// Vector load of 2 integers (32bits signed) from memory 1.597 -class Load2INode : public VectorLoadNode { 1.598 - protected: 1.599 - virtual BasicType elt_basic_type() const { return T_INT; } 1.600 - public: 1.601 - Load2INode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::INT) 1.602 - : VectorLoadNode(c,mem,adr,at,vect_type(ti,2)) {} 1.603 - virtual int Opcode() const; 1.604 - virtual int store_Opcode() const { return Op_Store2I; } 1.605 - virtual uint length() const { return 2; } 1.606 -}; 1.607 - 1.608 -//------------------------------Load2LNode-------------------------------------- 1.609 -// Vector load of 2 longs (64bits signed) from memory 1.610 -class Load2LNode : public VectorLoadNode { 1.611 - protected: 1.612 - virtual BasicType elt_basic_type() const { return T_LONG; } 1.613 - public: 1.614 - Load2LNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeLong *tl = TypeLong::LONG) 1.615 - : VectorLoadNode(c,mem,adr,at,vect_type(tl,2)) {} 1.616 - virtual int Opcode() const; 1.617 - virtual int store_Opcode() const { return Op_Store2L; } 1.618 - virtual uint length() const { return 2; } 1.619 -}; 1.620 - 1.621 -//------------------------------Load4FNode-------------------------------------- 1.622 -// Vector load of 4 floats (32bits) from memory 1.623 -class Load4FNode : public VectorLoadNode { 1.624 - protected: 1.625 - virtual BasicType elt_basic_type() const { return T_FLOAT; } 1.626 - public: 1.627 - Load4FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *t = Type::FLOAT) 1.628 - : VectorLoadNode(c,mem,adr,at,vect_type(t,4)) {} 1.629 - virtual int Opcode() const; 1.630 - virtual int store_Opcode() const { return Op_Store4F; } 1.631 - virtual uint length() const { return 4; } 1.632 -}; 1.633 - 1.634 -//------------------------------Load2FNode-------------------------------------- 1.635 -// Vector load of 2 floats (32bits) from memory 1.636 -class Load2FNode : public VectorLoadNode { 1.637 - protected: 1.638 - virtual BasicType elt_basic_type() const { return T_FLOAT; } 1.639 - public: 1.640 - Load2FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *t = Type::FLOAT) 1.641 - : VectorLoadNode(c,mem,adr,at,vect_type(t,2)) {} 1.642 - virtual int Opcode() const; 1.643 - virtual int store_Opcode() const { return Op_Store2F; } 1.644 - virtual uint length() const { return 2; } 1.645 -}; 1.646 - 1.647 -//------------------------------Load2DNode-------------------------------------- 1.648 -// Vector load of 2 doubles (64bits) from memory 1.649 -class Load2DNode : public VectorLoadNode { 1.650 - protected: 1.651 - virtual BasicType elt_basic_type() const { return T_DOUBLE; } 1.652 - public: 1.653 - Load2DNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *t = Type::DOUBLE) 1.654 - : VectorLoadNode(c,mem,adr,at,vect_type(t,2)) {} 1.655 - virtual int Opcode() const; 1.656 - virtual int store_Opcode() const { return Op_Store2D; } 1.657 - virtual uint length() const { return 2; } 1.658 -}; 1.659 - 1.660 - 1.661 -//------------------------------VectorStoreNode-------------------------------------- 1.662 -// Vector Store to memory 1.663 -class VectorStoreNode : public StoreNode { 1.664 - virtual uint size_of() const { return sizeof(*this); } 1.665 - 1.666 - protected: 1.667 - virtual BasicType elt_basic_type() const = 0; // Vector element basic type 1.668 - 1.669 - public: 1.670 - VectorStoreNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) 1.671 - : StoreNode(c,mem,adr,at,val) { 1.672 - init_class_id(Class_VectorStore); 1.673 - } 1.674 virtual int Opcode() const; 1.675 1.676 - virtual uint length() const = 0; // Vector length 1.677 + virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(memory_size()); } 1.678 + virtual BasicType memory_type() const { return T_VOID; } 1.679 + virtual int memory_size() const { return vect_type()->length_in_bytes(); } 1.680 1.681 - // Element and vector type 1.682 - const Type* elt_type() const { return Type::get_const_basic_type(elt_basic_type()); } 1.683 - const Type* vect_type() const { return VectorNode::vect_type(elt_basic_type(), length()); } 1.684 - 1.685 - virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(); } 1.686 - virtual BasicType memory_type() const { return T_VOID; } 1.687 - virtual int memory_size() const { return length()*type2aelembytes(elt_basic_type()); } 1.688 - 1.689 - // Vector opcode from scalar opcode 1.690 - static int opcode(int sopc, uint vlen); 1.691 - 1.692 - static VectorStoreNode* make(Compile* C, int opc, Node* ctl, Node* mem, 1.693 + static StoreVectorNode* make(Compile* C, int opc, Node* ctl, Node* mem, 1.694 Node* adr, const TypePtr* atyp, Node* val, 1.695 uint vlen); 1.696 }; 1.697 1.698 -//------------------------------Store16BNode-------------------------------------- 1.699 -// Vector store of 16 bytes (8bits signed) to memory 1.700 -class Store16BNode : public VectorStoreNode { 1.701 - protected: 1.702 - virtual BasicType elt_basic_type() const { return T_BYTE; } 1.703 + 1.704 +//=========================Promote_Scalar_to_Vector============================ 1.705 + 1.706 +//------------------------------ReplicateBNode--------------------------------- 1.707 +// Replicate byte scalar to be vector 1.708 +class ReplicateBNode : public VectorNode { 1.709 public: 1.710 - Store16BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) 1.711 - : VectorStoreNode(c,mem,adr,at,val) {} 1.712 - virtual int Opcode() const; 1.713 - virtual uint length() const { return 16; } 1.714 -}; 1.715 - 1.716 -//------------------------------Store8BNode-------------------------------------- 1.717 -// Vector store of 8 bytes (8bits signed) to memory 1.718 -class Store8BNode : public VectorStoreNode { 1.719 - protected: 1.720 - virtual BasicType elt_basic_type() const { return T_BYTE; } 1.721 - public: 1.722 - Store8BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) 1.723 - : VectorStoreNode(c,mem,adr,at,val) {} 1.724 - virtual int Opcode() const; 1.725 - virtual uint length() const { return 8; } 1.726 -}; 1.727 - 1.728 -//------------------------------Store4BNode-------------------------------------- 1.729 -// Vector store of 4 bytes (8bits signed) to memory 1.730 -class Store4BNode : public VectorStoreNode { 1.731 - protected: 1.732 - virtual BasicType elt_basic_type() const { return T_BYTE; } 1.733 - public: 1.734 - Store4BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) 1.735 - : VectorStoreNode(c,mem,adr,at,val) {} 1.736 - virtual int Opcode() const; 1.737 - virtual uint length() const { return 4; } 1.738 -}; 1.739 - 1.740 -//------------------------------Store8CNode-------------------------------------- 1.741 -// Vector store of 8 chars (16bits signed/unsigned) to memory 1.742 -class Store8CNode : public VectorStoreNode { 1.743 - protected: 1.744 - virtual BasicType elt_basic_type() const { return T_CHAR; } 1.745 - public: 1.746 - Store8CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) 1.747 - : VectorStoreNode(c,mem,adr,at,val) {} 1.748 - virtual int Opcode() const; 1.749 - virtual uint length() const { return 8; } 1.750 -}; 1.751 - 1.752 -//------------------------------Store4CNode-------------------------------------- 1.753 -// Vector store of 4 chars (16bits signed/unsigned) to memory 1.754 -class Store4CNode : public VectorStoreNode { 1.755 - protected: 1.756 - virtual BasicType elt_basic_type() const { return T_CHAR; } 1.757 - public: 1.758 - Store4CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) 1.759 - : VectorStoreNode(c,mem,adr,at,val) {} 1.760 - virtual int Opcode() const; 1.761 - virtual uint length() const { return 4; } 1.762 -}; 1.763 - 1.764 -//------------------------------Store2CNode-------------------------------------- 1.765 -// Vector store of 2 chars (16bits signed/unsigned) to memory 1.766 -class Store2CNode : public VectorStoreNode { 1.767 - protected: 1.768 - virtual BasicType elt_basic_type() const { return T_CHAR; } 1.769 - public: 1.770 - Store2CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) 1.771 - : VectorStoreNode(c,mem,adr,at,val) {} 1.772 - virtual int Opcode() const; 1.773 - virtual uint length() const { return 2; } 1.774 -}; 1.775 - 1.776 -//------------------------------Store4INode-------------------------------------- 1.777 -// Vector store of 4 integers (32bits signed) to memory 1.778 -class Store4INode : public VectorStoreNode { 1.779 - protected: 1.780 - virtual BasicType elt_basic_type() const { return T_INT; } 1.781 - public: 1.782 - Store4INode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) 1.783 - : VectorStoreNode(c,mem,adr,at,val) {} 1.784 - virtual int Opcode() const; 1.785 - virtual uint length() const { return 4; } 1.786 -}; 1.787 - 1.788 -//------------------------------Store2INode-------------------------------------- 1.789 -// Vector store of 2 integers (32bits signed) to memory 1.790 -class Store2INode : public VectorStoreNode { 1.791 - protected: 1.792 - virtual BasicType elt_basic_type() const { return T_INT; } 1.793 - public: 1.794 - Store2INode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) 1.795 - : VectorStoreNode(c,mem,adr,at,val) {} 1.796 - virtual int Opcode() const; 1.797 - virtual uint length() const { return 2; } 1.798 -}; 1.799 - 1.800 -//------------------------------Store2LNode-------------------------------------- 1.801 -// Vector store of 2 longs (64bits signed) to memory 1.802 -class Store2LNode : public VectorStoreNode { 1.803 - protected: 1.804 - virtual BasicType elt_basic_type() const { return T_LONG; } 1.805 - public: 1.806 - Store2LNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) 1.807 - : VectorStoreNode(c,mem,adr,at,val) {} 1.808 - virtual int Opcode() const; 1.809 - virtual uint length() const { return 2; } 1.810 -}; 1.811 - 1.812 -//------------------------------Store4FNode-------------------------------------- 1.813 -// Vector store of 4 floats (32bits) to memory 1.814 -class Store4FNode : public VectorStoreNode { 1.815 - protected: 1.816 - virtual BasicType elt_basic_type() const { return T_FLOAT; } 1.817 - public: 1.818 - Store4FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) 1.819 - : VectorStoreNode(c,mem,adr,at,val) {} 1.820 - virtual int Opcode() const; 1.821 - virtual uint length() const { return 4; } 1.822 -}; 1.823 - 1.824 -//------------------------------Store2FNode-------------------------------------- 1.825 -// Vector store of 2 floats (32bits) to memory 1.826 -class Store2FNode : public VectorStoreNode { 1.827 - protected: 1.828 - virtual BasicType elt_basic_type() const { return T_FLOAT; } 1.829 - public: 1.830 - Store2FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) 1.831 - : VectorStoreNode(c,mem,adr,at,val) {} 1.832 - virtual int Opcode() const; 1.833 - virtual uint length() const { return 2; } 1.834 -}; 1.835 - 1.836 -//------------------------------Store2DNode-------------------------------------- 1.837 -// Vector store of 2 doubles (64bits) to memory 1.838 -class Store2DNode : public VectorStoreNode { 1.839 - protected: 1.840 - virtual BasicType elt_basic_type() const { return T_DOUBLE; } 1.841 - public: 1.842 - Store2DNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) 1.843 - : VectorStoreNode(c,mem,adr,at,val) {} 1.844 - virtual int Opcode() const; 1.845 - virtual uint length() const { return 2; } 1.846 -}; 1.847 - 1.848 -//=========================Promote_Scalar_to_Vector==================================== 1.849 - 1.850 -//------------------------------Replicate16BNode--------------------------------------- 1.851 -// Replicate byte scalar to be vector of 16 bytes 1.852 -class Replicate16BNode : public VectorNode { 1.853 - protected: 1.854 - virtual BasicType elt_basic_type() const { return T_BYTE; } 1.855 - public: 1.856 - Replicate16BNode(Node* in1) : VectorNode(in1, 16) {} 1.857 + ReplicateBNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {} 1.858 virtual int Opcode() const; 1.859 }; 1.860 1.861 -//------------------------------Replicate8BNode--------------------------------------- 1.862 -// Replicate byte scalar to be vector of 8 bytes 1.863 -class Replicate8BNode : public VectorNode { 1.864 - protected: 1.865 - virtual BasicType elt_basic_type() const { return T_BYTE; } 1.866 +//------------------------------ReplicateSNode--------------------------------- 1.867 +// Replicate short scalar to be vector 1.868 +class ReplicateSNode : public VectorNode { 1.869 public: 1.870 - Replicate8BNode(Node* in1) : VectorNode(in1, 8) {} 1.871 + ReplicateSNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {} 1.872 virtual int Opcode() const; 1.873 }; 1.874 1.875 -//------------------------------Replicate4BNode--------------------------------------- 1.876 -// Replicate byte scalar to be vector of 4 bytes 1.877 -class Replicate4BNode : public VectorNode { 1.878 - protected: 1.879 - virtual BasicType elt_basic_type() const { return T_BYTE; } 1.880 +//------------------------------ReplicateINode--------------------------------- 1.881 +// Replicate int scalar to be vector 1.882 +class ReplicateINode : public VectorNode { 1.883 public: 1.884 - Replicate4BNode(Node* in1) : VectorNode(in1, 4) {} 1.885 + ReplicateINode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {} 1.886 virtual int Opcode() const; 1.887 }; 1.888 1.889 -//------------------------------Replicate8CNode--------------------------------------- 1.890 -// Replicate char scalar to be vector of 8 chars 1.891 -class Replicate8CNode : public VectorNode { 1.892 - protected: 1.893 - virtual BasicType elt_basic_type() const { return T_CHAR; } 1.894 +//------------------------------ReplicateLNode--------------------------------- 1.895 +// Replicate long scalar to be vector 1.896 +class ReplicateLNode : public VectorNode { 1.897 public: 1.898 - Replicate8CNode(Node* in1) : VectorNode(in1, 8) {} 1.899 + ReplicateLNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {} 1.900 virtual int Opcode() const; 1.901 }; 1.902 1.903 -//------------------------------Replicate4CNode--------------------------------------- 1.904 -// Replicate char scalar to be vector of 4 chars 1.905 -class Replicate4CNode : public VectorNode { 1.906 - protected: 1.907 - virtual BasicType elt_basic_type() const { return T_CHAR; } 1.908 +//------------------------------ReplicateFNode--------------------------------- 1.909 +// Replicate float scalar to be vector 1.910 +class ReplicateFNode : public VectorNode { 1.911 public: 1.912 - Replicate4CNode(Node* in1) : VectorNode(in1, 4) {} 1.913 + ReplicateFNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {} 1.914 virtual int Opcode() const; 1.915 }; 1.916 1.917 -//------------------------------Replicate2CNode--------------------------------------- 1.918 -// Replicate char scalar to be vector of 2 chars 1.919 -class Replicate2CNode : public VectorNode { 1.920 - protected: 1.921 - virtual BasicType elt_basic_type() const { return T_CHAR; } 1.922 +//------------------------------ReplicateDNode--------------------------------- 1.923 +// Replicate double scalar to be vector 1.924 +class ReplicateDNode : public VectorNode { 1.925 public: 1.926 - Replicate2CNode(Node* in1) : VectorNode(in1, 2) {} 1.927 + ReplicateDNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {} 1.928 virtual int Opcode() const; 1.929 }; 1.930 1.931 -//------------------------------Replicate8SNode--------------------------------------- 1.932 -// Replicate short scalar to be vector of 8 shorts 1.933 -class Replicate8SNode : public VectorNode { 1.934 - protected: 1.935 - virtual BasicType elt_basic_type() const { return T_SHORT; } 1.936 - public: 1.937 - Replicate8SNode(Node* in1) : VectorNode(in1, 8) {} 1.938 - virtual int Opcode() const; 1.939 -}; 1.940 - 1.941 -//------------------------------Replicate4SNode--------------------------------------- 1.942 -// Replicate short scalar to be vector of 4 shorts 1.943 -class Replicate4SNode : public VectorNode { 1.944 - protected: 1.945 - virtual BasicType elt_basic_type() const { return T_SHORT; } 1.946 - public: 1.947 - Replicate4SNode(Node* in1) : VectorNode(in1, 4) {} 1.948 - virtual int Opcode() const; 1.949 -}; 1.950 - 1.951 -//------------------------------Replicate2SNode--------------------------------------- 1.952 -// Replicate short scalar to be vector of 2 shorts 1.953 -class Replicate2SNode : public VectorNode { 1.954 - protected: 1.955 - virtual BasicType elt_basic_type() const { return T_SHORT; } 1.956 - public: 1.957 - Replicate2SNode(Node* in1) : VectorNode(in1, 2) {} 1.958 - virtual int Opcode() const; 1.959 -}; 1.960 - 1.961 -//------------------------------Replicate4INode--------------------------------------- 1.962 -// Replicate int scalar to be vector of 4 ints 1.963 -class Replicate4INode : public VectorNode { 1.964 - protected: 1.965 - virtual BasicType elt_basic_type() const { return T_INT; } 1.966 - public: 1.967 - Replicate4INode(Node* in1) : VectorNode(in1, 4) {} 1.968 - virtual int Opcode() const; 1.969 -}; 1.970 - 1.971 -//------------------------------Replicate2INode--------------------------------------- 1.972 -// Replicate int scalar to be vector of 2 ints 1.973 -class Replicate2INode : public VectorNode { 1.974 - protected: 1.975 - virtual BasicType elt_basic_type() const { return T_INT; } 1.976 - public: 1.977 - Replicate2INode(Node* in1) : VectorNode(in1, 2) {} 1.978 - virtual int Opcode() const; 1.979 -}; 1.980 - 1.981 -//------------------------------Replicate2LNode--------------------------------------- 1.982 -// Replicate long scalar to be vector of 2 longs 1.983 -class Replicate2LNode : public VectorNode { 1.984 - protected: 1.985 - virtual BasicType elt_basic_type() const { return T_LONG; } 1.986 - public: 1.987 - Replicate2LNode(Node* in1) : VectorNode(in1, 2) {} 1.988 - virtual int Opcode() const; 1.989 -}; 1.990 - 1.991 -//------------------------------Replicate4FNode--------------------------------------- 1.992 -// Replicate float scalar to be vector of 4 floats 1.993 -class Replicate4FNode : public VectorNode { 1.994 - protected: 1.995 - virtual BasicType elt_basic_type() const { return T_FLOAT; } 1.996 - public: 1.997 - Replicate4FNode(Node* in1) : VectorNode(in1, 4) {} 1.998 - virtual int Opcode() const; 1.999 -}; 1.1000 - 1.1001 -//------------------------------Replicate2FNode--------------------------------------- 1.1002 -// Replicate float scalar to be vector of 2 floats 1.1003 -class Replicate2FNode : public VectorNode { 1.1004 - protected: 1.1005 - virtual BasicType elt_basic_type() const { return T_FLOAT; } 1.1006 - public: 1.1007 - Replicate2FNode(Node* in1) : VectorNode(in1, 2) {} 1.1008 - virtual int Opcode() const; 1.1009 -}; 1.1010 - 1.1011 -//------------------------------Replicate2DNode--------------------------------------- 1.1012 -// Replicate double scalar to be vector of 2 doubles 1.1013 -class Replicate2DNode : public VectorNode { 1.1014 - protected: 1.1015 - virtual BasicType elt_basic_type() const { return T_DOUBLE; } 1.1016 - public: 1.1017 - Replicate2DNode(Node* in1) : VectorNode(in1, 2) {} 1.1018 - virtual int Opcode() const; 1.1019 -}; 1.1020 - 1.1021 -//========================Pack_Scalars_into_a_Vector============================== 1.1022 +//========================Pack_Scalars_into_a_Vector=========================== 1.1023 1.1024 //------------------------------PackNode--------------------------------------- 1.1025 // Pack parent class (not for code generation). 1.1026 class PackNode : public VectorNode { 1.1027 public: 1.1028 - PackNode(Node* in1) : VectorNode(in1, 1) {} 1.1029 - PackNode(Node* in1, Node* n2) : VectorNode(in1, n2, 2) {} 1.1030 + PackNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {} 1.1031 + PackNode(Node* in1, Node* n2, const TypeVect* vt) : VectorNode(in1, n2, vt) {} 1.1032 virtual int Opcode() const; 1.1033 1.1034 - void add_opd(Node* n) { 1.1035 - add_req(n); 1.1036 - _length++; 1.1037 - assert(_length == req() - 1, "vector length matches edge count"); 1.1038 + void add_opd(uint i, Node* n) { 1.1039 + init_req(i+1, n); 1.1040 } 1.1041 1.1042 // Create a binary tree form for Packs. [lo, hi) (half-open) range 1.1043 Node* binaryTreePack(Compile* C, int lo, int hi); 1.1044 1.1045 - static PackNode* make(Compile* C, Node* s, const Type* elt_t); 1.1046 + static PackNode* make(Compile* C, Node* s, uint vlen, BasicType bt); 1.1047 }; 1.1048 1.1049 //------------------------------PackBNode--------------------------------------- 1.1050 // Pack byte scalars into vector 1.1051 class PackBNode : public PackNode { 1.1052 - protected: 1.1053 - virtual BasicType elt_basic_type() const { return T_BYTE; } 1.1054 public: 1.1055 - PackBNode(Node* in1) : PackNode(in1) {} 1.1056 - virtual int Opcode() const; 1.1057 -}; 1.1058 - 1.1059 -//------------------------------PackCNode--------------------------------------- 1.1060 -// Pack char scalars into vector 1.1061 -class PackCNode : public PackNode { 1.1062 - protected: 1.1063 - virtual BasicType elt_basic_type() const { return T_CHAR; } 1.1064 - public: 1.1065 - PackCNode(Node* in1) : PackNode(in1) {} 1.1066 + PackBNode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {} 1.1067 virtual int Opcode() const; 1.1068 }; 1.1069 1.1070 //------------------------------PackSNode--------------------------------------- 1.1071 // Pack short scalars into a vector 1.1072 class PackSNode : public PackNode { 1.1073 - protected: 1.1074 - virtual BasicType elt_basic_type() const { return T_SHORT; } 1.1075 public: 1.1076 - PackSNode(Node* in1) : PackNode(in1) {} 1.1077 + PackSNode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {} 1.1078 + PackSNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {} 1.1079 virtual int Opcode() const; 1.1080 }; 1.1081 1.1082 //------------------------------PackINode--------------------------------------- 1.1083 // Pack integer scalars into a vector 1.1084 class PackINode : public PackNode { 1.1085 - protected: 1.1086 - virtual BasicType elt_basic_type() const { return T_INT; } 1.1087 public: 1.1088 - PackINode(Node* in1) : PackNode(in1) {} 1.1089 - PackINode(Node* in1, Node* in2) : PackNode(in1, in2) {} 1.1090 + PackINode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {} 1.1091 + PackINode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {} 1.1092 virtual int Opcode() const; 1.1093 }; 1.1094 1.1095 //------------------------------PackLNode--------------------------------------- 1.1096 // Pack long scalars into a vector 1.1097 class PackLNode : public PackNode { 1.1098 - protected: 1.1099 - virtual BasicType elt_basic_type() const { return T_LONG; } 1.1100 public: 1.1101 - PackLNode(Node* in1) : PackNode(in1) {} 1.1102 - PackLNode(Node* in1, Node* in2) : PackNode(in1, in2) {} 1.1103 + PackLNode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {} 1.1104 + PackLNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {} 1.1105 + virtual int Opcode() const; 1.1106 +}; 1.1107 + 1.1108 +//------------------------------Pack2LNode-------------------------------------- 1.1109 +// Pack 2 long scalars into a vector 1.1110 +class Pack2LNode : public PackNode { 1.1111 + public: 1.1112 + Pack2LNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {} 1.1113 virtual int Opcode() const; 1.1114 }; 1.1115 1.1116 //------------------------------PackFNode--------------------------------------- 1.1117 // Pack float scalars into vector 1.1118 class PackFNode : public PackNode { 1.1119 - protected: 1.1120 - virtual BasicType elt_basic_type() const { return T_FLOAT; } 1.1121 public: 1.1122 - PackFNode(Node* in1) : PackNode(in1) {} 1.1123 - PackFNode(Node* in1, Node* in2) : PackNode(in1, in2) {} 1.1124 + PackFNode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {} 1.1125 + PackFNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {} 1.1126 virtual int Opcode() const; 1.1127 }; 1.1128 1.1129 //------------------------------PackDNode--------------------------------------- 1.1130 // Pack double scalars into a vector 1.1131 class PackDNode : public PackNode { 1.1132 - protected: 1.1133 - virtual BasicType elt_basic_type() const { return T_DOUBLE; } 1.1134 public: 1.1135 - PackDNode(Node* in1) : PackNode(in1) {} 1.1136 - PackDNode(Node* in1, Node* in2) : PackNode(in1, in2) {} 1.1137 + PackDNode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {} 1.1138 + PackDNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {} 1.1139 virtual int Opcode() const; 1.1140 }; 1.1141 1.1142 -// The Pack2xN nodes assist code generation. They are created from 1.1143 -// Pack4C, etc. nodes in final_graph_reshape in the form of a 1.1144 -// balanced, binary tree. 1.1145 - 1.1146 -//------------------------------Pack2x1BNode----------------------------------------- 1.1147 -// Pack 2 1-byte integers into vector of 2 bytes 1.1148 -class Pack2x1BNode : public PackNode { 1.1149 - protected: 1.1150 - virtual BasicType elt_basic_type() const { return T_BYTE; } 1.1151 +//------------------------------Pack2DNode-------------------------------------- 1.1152 +// Pack 2 double scalars into a vector 1.1153 +class Pack2DNode : public PackNode { 1.1154 public: 1.1155 - Pack2x1BNode(Node *in1, Node* in2) : PackNode(in1, in2) {} 1.1156 + Pack2DNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {} 1.1157 virtual int Opcode() const; 1.1158 - virtual uint ideal_reg() const { return Op_RegI; } 1.1159 }; 1.1160 1.1161 -//------------------------------Pack2x2BNode--------------------------------------- 1.1162 -// Pack 2 2-byte integers into vector of 4 bytes 1.1163 -class Pack2x2BNode : public PackNode { 1.1164 - protected: 1.1165 - virtual BasicType elt_basic_type() const { return T_CHAR; } 1.1166 - public: 1.1167 - Pack2x2BNode(Node *in1, Node* in2) : PackNode(in1, in2) {} 1.1168 - virtual int Opcode() const; 1.1169 - virtual uint ideal_reg() const { return Op_RegI; } 1.1170 -}; 1.1171 1.1172 //========================Extract_Scalar_from_Vector=============================== 1.1173 1.1174 @@ -1069,7 +465,7 @@ 1.1175 virtual int Opcode() const; 1.1176 uint pos() const { return in(2)->get_int(); } 1.1177 1.1178 - static Node* make(Compile* C, Node* v, uint position, const Type* opd_t); 1.1179 + static Node* make(Compile* C, Node* v, uint position, BasicType bt); 1.1180 }; 1.1181 1.1182 //------------------------------ExtractBNode--------------------------------------- 1.1183 @@ -1082,6 +478,16 @@ 1.1184 virtual uint ideal_reg() const { return Op_RegI; } 1.1185 }; 1.1186 1.1187 +//------------------------------ExtractUBNode-------------------------------------- 1.1188 +// Extract a boolean from a vector at position "pos" 1.1189 +class ExtractUBNode : public ExtractNode { 1.1190 + public: 1.1191 + ExtractUBNode(Node* src, ConINode* pos) : ExtractNode(src, pos) {} 1.1192 + virtual int Opcode() const; 1.1193 + virtual const Type *bottom_type() const { return TypeInt::INT; } 1.1194 + virtual uint ideal_reg() const { return Op_RegI; } 1.1195 +}; 1.1196 + 1.1197 //------------------------------ExtractCNode--------------------------------------- 1.1198 // Extract a char from a vector at position "pos" 1.1199 class ExtractCNode : public ExtractNode {