vectornode.hpp 22.1 KB
Newer Older
D
duke 已提交
1
/*
2
 * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
D
duke 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
19 20 21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
D
duke 已提交
22 23
 */

24 25 26 27 28 29 30 31
#ifndef SHARE_VM_OPTO_VECTORNODE_HPP
#define SHARE_VM_OPTO_VECTORNODE_HPP

#include "opto/matcher.hpp"
#include "opto/memnode.hpp"
#include "opto/node.hpp"
#include "opto/opcodes.hpp"

D
duke 已提交
32 33
//------------------------------VectorNode--------------------------------------
// Vector Operation
34
class VectorNode : public TypeNode {
D
duke 已提交
35 36
 public:

37
  VectorNode(Node* n1, const TypeVect* vt) : TypeNode(vt, 2) {
K
kvn 已提交
38
    init_class_id(Class_Vector);
39
    init_req(1, n1);
D
duke 已提交
40
  }
41
  VectorNode(Node* n1, Node* n2, const TypeVect* vt) : TypeNode(vt, 3) {
K
kvn 已提交
42
    init_class_id(Class_Vector);
43 44
    init_req(1, n1);
    init_req(2, n2);
D
duke 已提交
45 46
  }

47 48
  const TypeVect* vect_type() const { return type()->is_vect(); }
  uint length() const { return vect_type()->length(); } // Vector length
49
  uint length_in_bytes() const { return vect_type()->length_in_bytes(); }
D
duke 已提交
50

51
  virtual int Opcode() const;
D
duke 已提交
52

53
  virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(vect_type()->length_in_bytes()); }
D
duke 已提交
54 55 56

  static VectorNode* scalar2vector(Compile* C, Node* s, uint vlen, const Type* opd_t);

57 58
  static VectorNode* make(Compile* C, int opc, Node* n1, Node* n2, uint vlen, BasicType bt);

59
  static int  opcode(int opc, BasicType bt);
60
  static bool implemented(int opc, uint vlen, BasicType bt);
61 62
  static bool is_shift(Node* n);
  static bool is_invariant_vector(Node* n);
63 64
  // [Start, end) half-open range defining which operands are vectors
  static void vector_operands(Node* n, uint* start, uint* end);
D
duke 已提交
65 66 67 68 69 70 71 72
};

//===========================Vector=ALU=Operations====================================

//------------------------------AddVBNode---------------------------------------
// Vector add byte
class AddVBNode : public VectorNode {
 public:
73
  AddVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
74 75 76 77
  virtual int Opcode() const;
};

//------------------------------AddVSNode---------------------------------------
78
// Vector add char/short
D
duke 已提交
79 80
class AddVSNode : public VectorNode {
 public:
81
  AddVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
82 83 84 85 86 87 88
  virtual int Opcode() const;
};

//------------------------------AddVINode---------------------------------------
// Vector add int
class AddVINode : public VectorNode {
 public:
89
  AddVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
90 91 92 93 94 95 96
  virtual int Opcode() const;
};

//------------------------------AddVLNode---------------------------------------
// Vector add long
class AddVLNode : public VectorNode {
 public:
97
  AddVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
98 99 100 101 102 103 104
  virtual int Opcode() const;
};

//------------------------------AddVFNode---------------------------------------
// Vector add float
class AddVFNode : public VectorNode {
 public:
105
  AddVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
106 107 108 109 110 111 112
  virtual int Opcode() const;
};

//------------------------------AddVDNode---------------------------------------
// Vector add double
class AddVDNode : public VectorNode {
 public:
113
  AddVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
114 115 116 117 118 119 120
  virtual int Opcode() const;
};

//------------------------------SubVBNode---------------------------------------
// Vector subtract byte
class SubVBNode : public VectorNode {
 public:
121
  SubVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
122 123 124 125 126 127 128
  virtual int Opcode() const;
};

//------------------------------SubVSNode---------------------------------------
// Vector subtract short
class SubVSNode : public VectorNode {
 public:
129
  SubVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
130 131 132 133 134 135 136
  virtual int Opcode() const;
};

//------------------------------SubVINode---------------------------------------
// Vector subtract int
class SubVINode : public VectorNode {
 public:
137
  SubVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
138 139 140 141 142 143 144
  virtual int Opcode() const;
};

//------------------------------SubVLNode---------------------------------------
// Vector subtract long
class SubVLNode : public VectorNode {
 public:
145
  SubVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
146 147 148 149 150 151 152
  virtual int Opcode() const;
};

//------------------------------SubVFNode---------------------------------------
// Vector subtract float
class SubVFNode : public VectorNode {
 public:
153
  SubVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
154 155 156 157 158 159 160
  virtual int Opcode() const;
};

//------------------------------SubVDNode---------------------------------------
// Vector subtract double
class SubVDNode : public VectorNode {
 public:
161
  SubVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
162 163 164
  virtual int Opcode() const;
};

165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
//------------------------------MulVSNode---------------------------------------
// Vector multiply short
class MulVSNode : public VectorNode {
 public:
  MulVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
  virtual int Opcode() const;
};

//------------------------------MulVINode---------------------------------------
// Vector multiply int
class MulVINode : public VectorNode {
 public:
  MulVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
  virtual int Opcode() const;
};

D
duke 已提交
181 182 183 184
//------------------------------MulVFNode---------------------------------------
// Vector multiply float
class MulVFNode : public VectorNode {
 public:
185
  MulVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
186 187 188 189 190 191 192
  virtual int Opcode() const;
};

//------------------------------MulVDNode---------------------------------------
// Vector multiply double
class MulVDNode : public VectorNode {
 public:
193
  MulVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
194 195 196 197 198 199 200
  virtual int Opcode() const;
};

//------------------------------DivVFNode---------------------------------------
// Vector divide float
class DivVFNode : public VectorNode {
 public:
201
  DivVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
202 203 204 205 206 207 208
  virtual int Opcode() const;
};

//------------------------------DivVDNode---------------------------------------
// Vector Divide double
class DivVDNode : public VectorNode {
 public:
209
  DivVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
210 211 212 213
  virtual int Opcode() const;
};

//------------------------------LShiftVBNode---------------------------------------
214
// Vector left shift bytes
D
duke 已提交
215 216
class LShiftVBNode : public VectorNode {
 public:
217
  LShiftVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
218 219 220 221
  virtual int Opcode() const;
};

//------------------------------LShiftVSNode---------------------------------------
222
// Vector left shift shorts
D
duke 已提交
223 224
class LShiftVSNode : public VectorNode {
 public:
225
  LShiftVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
226 227 228 229
  virtual int Opcode() const;
};

//------------------------------LShiftVINode---------------------------------------
230
// Vector left shift ints
D
duke 已提交
231 232
class LShiftVINode : public VectorNode {
 public:
233
  LShiftVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
234 235 236
  virtual int Opcode() const;
};

237 238 239 240 241 242 243 244 245 246
//------------------------------LShiftVLNode---------------------------------------
// Vector left shift longs
class LShiftVLNode : public VectorNode {
 public:
  LShiftVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
  virtual int Opcode() const;
};

//------------------------------RShiftVBNode---------------------------------------
// Vector right arithmetic (signed) shift bytes
247
class RShiftVBNode : public VectorNode {
D
duke 已提交
248
 public:
249
  RShiftVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
250 251 252
  virtual int Opcode() const;
};

253 254
//------------------------------RShiftVSNode---------------------------------------
// Vector right arithmetic (signed) shift shorts
255
class RShiftVSNode : public VectorNode {
D
duke 已提交
256
 public:
257
  RShiftVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
258 259 260
  virtual int Opcode() const;
};

261 262
//------------------------------RShiftVINode---------------------------------------
// Vector right arithmetic (signed) shift ints
263
class RShiftVINode : public VectorNode {
D
duke 已提交
264
 public:
265
  RShiftVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
266 267 268
  virtual int Opcode() const;
};

269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
//------------------------------RShiftVLNode---------------------------------------
// Vector right arithmetic (signed) shift longs
class RShiftVLNode : public VectorNode {
 public:
  RShiftVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
  virtual int Opcode() const;
};

//------------------------------URShiftVBNode---------------------------------------
// Vector right logical (unsigned) shift bytes
class URShiftVBNode : public VectorNode {
 public:
  URShiftVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
  virtual int Opcode() const;
};

//------------------------------URShiftVSNode---------------------------------------
// Vector right logical (unsigned) shift shorts
class URShiftVSNode : public VectorNode {
 public:
  URShiftVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
  virtual int Opcode() const;
};

//------------------------------URShiftVINode---------------------------------------
// Vector right logical (unsigned) shift ints
class URShiftVINode : public VectorNode {
 public:
  URShiftVINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
  virtual int Opcode() const;
};

//------------------------------URShiftVLNode---------------------------------------
// Vector right logical (unsigned) shift longs
class URShiftVLNode : public VectorNode {
 public:
  URShiftVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
  virtual int Opcode() const;
};


D
duke 已提交
310
//------------------------------AndVNode---------------------------------------
311
// Vector and integer
D
duke 已提交
312 313
class AndVNode : public VectorNode {
 public:
314
  AndVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
315 316 317 318
  virtual int Opcode() const;
};

//------------------------------OrVNode---------------------------------------
319
// Vector or integer
D
duke 已提交
320 321
class OrVNode : public VectorNode {
 public:
322
  OrVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
323 324 325 326
  virtual int Opcode() const;
};

//------------------------------XorVNode---------------------------------------
327
// Vector xor integer
D
duke 已提交
328 329
class XorVNode : public VectorNode {
 public:
330
  XorVNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {}
D
duke 已提交
331 332 333
  virtual int Opcode() const;
};

334
//================================= M E M O R Y ===============================
D
duke 已提交
335

336 337 338
//------------------------------LoadVectorNode---------------------------------
// Load Vector from memory
class LoadVectorNode : public LoadNode {
D
duke 已提交
339
 public:
340 341 342
  LoadVectorNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeVect* vt)
    : LoadNode(c, mem, adr, at, vt) {
    init_class_id(Class_LoadVector);
D
duke 已提交
343 344
  }

345 346
  const TypeVect* vect_type() const { return type()->is_vect(); }
  uint length() const { return vect_type()->length(); } // Vector length
D
duke 已提交
347 348 349

  virtual int Opcode() const;

350 351 352
  virtual uint ideal_reg() const  { return Matcher::vector_ideal_reg(memory_size()); }
  virtual BasicType memory_type() const { return T_VOID; }
  virtual int memory_size() const { return vect_type()->length_in_bytes(); }
D
duke 已提交
353

354
  virtual int store_Opcode() const { return Op_StoreVector; }
D
duke 已提交
355

356 357
  static LoadVectorNode* make(Compile* C, int opc, Node* ctl, Node* mem,
                              Node* adr, const TypePtr* atyp, uint vlen, BasicType bt);
D
duke 已提交
358 359
};

360 361 362
//------------------------------StoreVectorNode--------------------------------
// Store Vector to memory
class StoreVectorNode : public StoreNode {
D
duke 已提交
363
 public:
364 365 366 367
  StoreVectorNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
    : StoreNode(c, mem, adr, at, val) {
    assert(val->is_Vector() || val->is_LoadVector(), "sanity");
    init_class_id(Class_StoreVector);
D
duke 已提交
368 369
  }

370 371
  const TypeVect* vect_type() const { return in(MemNode::ValueIn)->bottom_type()->is_vect(); }
  uint length() const { return vect_type()->length(); } // Vector length
D
duke 已提交
372

373
  virtual int Opcode() const;
D
duke 已提交
374

375
  virtual uint ideal_reg() const  { return Matcher::vector_ideal_reg(memory_size()); }
D
duke 已提交
376
  virtual BasicType memory_type() const { return T_VOID; }
377
  virtual int memory_size() const { return vect_type()->length_in_bytes(); }
D
duke 已提交
378

379
  static StoreVectorNode* make(Compile* C, int opc, Node* ctl, Node* mem,
K
kvn 已提交
380
                               Node* adr, const TypePtr* atyp, Node* val,
D
duke 已提交
381 382 383 384
                               uint vlen);
};


385
//=========================Promote_Scalar_to_Vector============================
D
duke 已提交
386

387 388 389
//------------------------------ReplicateBNode---------------------------------
// Replicate byte scalar to be vector
class ReplicateBNode : public VectorNode {
D
duke 已提交
390
 public:
391
  ReplicateBNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
D
duke 已提交
392 393 394
  virtual int Opcode() const;
};

395 396 397
//------------------------------ReplicateSNode---------------------------------
// Replicate short scalar to be vector
class ReplicateSNode : public VectorNode {
D
duke 已提交
398
 public:
399
  ReplicateSNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
D
duke 已提交
400 401 402
  virtual int Opcode() const;
};

403 404 405
//------------------------------ReplicateINode---------------------------------
// Replicate int scalar to be vector
class ReplicateINode : public VectorNode {
D
duke 已提交
406
 public:
407
  ReplicateINode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
D
duke 已提交
408 409 410
  virtual int Opcode() const;
};

411 412 413
//------------------------------ReplicateLNode---------------------------------
// Replicate long scalar to be vector
class ReplicateLNode : public VectorNode {
D
duke 已提交
414
 public:
415
  ReplicateLNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
D
duke 已提交
416 417 418
  virtual int Opcode() const;
};

419 420 421
//------------------------------ReplicateFNode---------------------------------
// Replicate float scalar to be vector
class ReplicateFNode : public VectorNode {
D
duke 已提交
422
 public:
423
  ReplicateFNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
D
duke 已提交
424 425 426
  virtual int Opcode() const;
};

427 428 429
//------------------------------ReplicateDNode---------------------------------
// Replicate double scalar to be vector
class ReplicateDNode : public VectorNode {
D
duke 已提交
430
 public:
431
  ReplicateDNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
D
duke 已提交
432 433 434
  virtual int Opcode() const;
};

435
//========================Pack_Scalars_into_a_Vector===========================
D
duke 已提交
436 437 438 439 440

//------------------------------PackNode---------------------------------------
// Pack parent class (not for code generation).
class PackNode : public VectorNode {
 public:
441 442
  PackNode(Node* in1, const TypeVect* vt) : VectorNode(in1, vt) {}
  PackNode(Node* in1, Node* n2, const TypeVect* vt) : VectorNode(in1, n2, vt) {}
D
duke 已提交
443 444
  virtual int Opcode() const;

445 446
  void add_opd(Node* n) {
    add_req(n);
D
duke 已提交
447 448 449
  }

  // Create a binary tree form for Packs. [lo, hi) (half-open) range
450
  PackNode* binary_tree_pack(Compile* C, int lo, int hi);
D
duke 已提交
451

452
  static PackNode* make(Compile* C, Node* s, uint vlen, BasicType bt);
D
duke 已提交
453 454 455 456 457 458
};

//------------------------------PackBNode---------------------------------------
// Pack byte scalars into vector
class PackBNode : public PackNode {
 public:
459
  PackBNode(Node* in1, const TypeVect* vt)  : PackNode(in1, vt) {}
D
duke 已提交
460 461 462 463 464 465 466
  virtual int Opcode() const;
};

//------------------------------PackSNode---------------------------------------
// Pack short scalars into a vector
class PackSNode : public PackNode {
 public:
467 468
  PackSNode(Node* in1, const TypeVect* vt)  : PackNode(in1, vt) {}
  PackSNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
D
duke 已提交
469 470 471 472 473 474 475
  virtual int Opcode() const;
};

//------------------------------PackINode---------------------------------------
// Pack integer scalars into a vector
class PackINode : public PackNode {
 public:
476 477
  PackINode(Node* in1, const TypeVect* vt)  : PackNode(in1, vt) {}
  PackINode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
D
duke 已提交
478 479 480 481 482 483 484
  virtual int Opcode() const;
};

//------------------------------PackLNode---------------------------------------
// Pack long scalars into a vector
class PackLNode : public PackNode {
 public:
485 486 487 488 489 490 491 492 493 494
  PackLNode(Node* in1, const TypeVect* vt)  : PackNode(in1, vt) {}
  PackLNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
  virtual int Opcode() const;
};

//------------------------------Pack2LNode--------------------------------------
// Pack 2 long scalars into a vector
class Pack2LNode : public PackNode {
 public:
  Pack2LNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
D
duke 已提交
495 496 497 498 499 500 501
  virtual int Opcode() const;
};

//------------------------------PackFNode---------------------------------------
// Pack float scalars into vector
class PackFNode : public PackNode {
 public:
502 503
  PackFNode(Node* in1, const TypeVect* vt)  : PackNode(in1, vt) {}
  PackFNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
D
duke 已提交
504 505 506 507 508 509 510
  virtual int Opcode() const;
};

//------------------------------PackDNode---------------------------------------
// Pack double scalars into a vector
class PackDNode : public PackNode {
 public:
511 512
  PackDNode(Node* in1, const TypeVect* vt) : PackNode(in1, vt) {}
  PackDNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
D
duke 已提交
513 514 515
  virtual int Opcode() const;
};

516 517 518
//------------------------------Pack2DNode--------------------------------------
// Pack 2 double scalars into a vector
class Pack2DNode : public PackNode {
D
duke 已提交
519
 public:
520
  Pack2DNode(Node* in1, Node* in2, const TypeVect* vt) : PackNode(in1, in2, vt) {}
D
duke 已提交
521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536
  virtual int Opcode() const;
};


//========================Extract_Scalar_from_Vector===============================

//------------------------------ExtractNode---------------------------------------
// Extract a scalar from a vector at position "pos"
class ExtractNode : public Node {
 public:
  ExtractNode(Node* src, ConINode* pos) : Node(NULL, src, (Node*)pos) {
    assert(in(2)->get_int() >= 0, "positive constants");
  }
  virtual int Opcode() const;
  uint  pos() const { return in(2)->get_int(); }

537
  static Node* make(Compile* C, Node* v, uint position, BasicType bt);
D
duke 已提交
538 539 540 541 542 543 544 545 546 547 548 549
};

//------------------------------ExtractBNode---------------------------------------
// Extract a byte from a vector at position "pos"
class ExtractBNode : public ExtractNode {
 public:
  ExtractBNode(Node* src, ConINode* pos) : ExtractNode(src, pos) {}
  virtual int Opcode() const;
  virtual const Type *bottom_type() const { return TypeInt::INT; }
  virtual uint ideal_reg() const { return Op_RegI; }
};

550 551 552 553 554 555 556 557 558 559
//------------------------------ExtractUBNode--------------------------------------
// Extract a boolean from a vector at position "pos"
class ExtractUBNode : public ExtractNode {
 public:
  ExtractUBNode(Node* src, ConINode* pos) : ExtractNode(src, pos) {}
  virtual int Opcode() const;
  virtual const Type *bottom_type() const { return TypeInt::INT; }
  virtual uint ideal_reg() const { return Op_RegI; }
};

D
duke 已提交
560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618
//------------------------------ExtractCNode---------------------------------------
// Extract a char from a vector at position "pos"
class ExtractCNode : public ExtractNode {
 public:
  ExtractCNode(Node* src, ConINode* pos) : ExtractNode(src, pos) {}
  virtual int Opcode() const;
  virtual const Type *bottom_type() const { return TypeInt::INT; }
  virtual uint ideal_reg() const { return Op_RegI; }
};

//------------------------------ExtractSNode---------------------------------------
// Extract a short from a vector at position "pos"
class ExtractSNode : public ExtractNode {
 public:
  ExtractSNode(Node* src, ConINode* pos) : ExtractNode(src, pos) {}
  virtual int Opcode() const;
  virtual const Type *bottom_type() const { return TypeInt::INT; }
  virtual uint ideal_reg() const { return Op_RegI; }
};

//------------------------------ExtractINode---------------------------------------
// Extract an int from a vector at position "pos"
class ExtractINode : public ExtractNode {
 public:
  ExtractINode(Node* src, ConINode* pos) : ExtractNode(src, pos) {}
  virtual int Opcode() const;
  virtual const Type *bottom_type() const { return TypeInt::INT; }
  virtual uint ideal_reg() const { return Op_RegI; }
};

//------------------------------ExtractLNode---------------------------------------
// Extract a long from a vector at position "pos"
class ExtractLNode : public ExtractNode {
 public:
  ExtractLNode(Node* src, ConINode* pos) : ExtractNode(src, pos) {}
  virtual int Opcode() const;
  virtual const Type *bottom_type() const { return TypeLong::LONG; }
  virtual uint ideal_reg() const { return Op_RegL; }
};

//------------------------------ExtractFNode---------------------------------------
// Extract a float from a vector at position "pos"
class ExtractFNode : public ExtractNode {
 public:
  ExtractFNode(Node* src, ConINode* pos) : ExtractNode(src, pos) {}
  virtual int Opcode() const;
  virtual const Type *bottom_type() const { return Type::FLOAT; }
  virtual uint ideal_reg() const { return Op_RegF; }
};

//------------------------------ExtractDNode---------------------------------------
// Extract a double from a vector at position "pos"
class ExtractDNode : public ExtractNode {
 public:
  ExtractDNode(Node* src, ConINode* pos) : ExtractNode(src, pos) {}
  virtual int Opcode() const;
  virtual const Type *bottom_type() const { return Type::DOUBLE; }
  virtual uint ideal_reg() const { return Op_RegD; }
};
619 620

#endif // SHARE_VM_OPTO_VECTORNODE_HPP