comparison src/share/vm/opto/type.hpp @ 6179:8c92982cbbc4

7119644: Increase superword's vector size up to 256 bits Summary: Increase vector size up to 256-bits for YMM AVX registers on x86. Reviewed-by: never, twisti, roland
author kvn
date Fri, 15 Jun 2012 01:25:19 -0700
parents f6f3bb0ee072
children da91efe96a93
comparison
equal deleted inserted replaced
6146:eba1d5bce9e8 6179:8c92982cbbc4
1 /* 1 /*
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
49 class TypeInt; 49 class TypeInt;
50 class TypeLong; 50 class TypeLong;
51 class TypeNarrowOop; 51 class TypeNarrowOop;
52 class TypeAry; 52 class TypeAry;
53 class TypeTuple; 53 class TypeTuple;
54 class TypeVect;
55 class TypeVectS;
56 class TypeVectD;
57 class TypeVectX;
58 class TypeVectY;
54 class TypePtr; 59 class TypePtr;
55 class TypeRawPtr; 60 class TypeRawPtr;
56 class TypeOopPtr; 61 class TypeOopPtr;
57 class TypeInstPtr; 62 class TypeInstPtr;
58 class TypeAryPtr; 63 class TypeAryPtr;
76 Half, // Placeholder half of doubleword 81 Half, // Placeholder half of doubleword
77 NarrowOop, // Compressed oop pointer 82 NarrowOop, // Compressed oop pointer
78 83
79 Tuple, // Method signature or object layout 84 Tuple, // Method signature or object layout
80 Array, // Array types 85 Array, // Array types
86 VectorS, // 32bit Vector types
87 VectorD, // 64bit Vector types
88 VectorX, // 128bit Vector types
89 VectorY, // 256bit Vector types
81 90
82 AnyPtr, // Any old raw, klass, inst, or array pointer 91 AnyPtr, // Any old raw, klass, inst, or array pointer
83 RawPtr, // Raw (non-oop) pointers 92 RawPtr, // Raw (non-oop) pointers
84 OopPtr, // Any and all Java heap entities 93 OopPtr, // Any and all Java heap entities
85 InstPtr, // Instance pointers (non-array objects) 94 InstPtr, // Instance pointers (non-array objects)
220 const TypeD *isa_double_constant() const; // Returns NULL if not a DoubleCon 229 const TypeD *isa_double_constant() const; // Returns NULL if not a DoubleCon
221 const TypeF *is_float_constant() const; // Asserts it is a FloatCon 230 const TypeF *is_float_constant() const; // Asserts it is a FloatCon
222 const TypeF *isa_float_constant() const; // Returns NULL if not a FloatCon 231 const TypeF *isa_float_constant() const; // Returns NULL if not a FloatCon
223 const TypeTuple *is_tuple() const; // Collection of fields, NOT a pointer 232 const TypeTuple *is_tuple() const; // Collection of fields, NOT a pointer
224 const TypeAry *is_ary() const; // Array, NOT array pointer 233 const TypeAry *is_ary() const; // Array, NOT array pointer
234 const TypeVect *is_vect() const; // Vector
235 const TypeVect *isa_vect() const; // Returns NULL if not a Vector
225 const TypePtr *is_ptr() const; // Asserts it is a ptr type 236 const TypePtr *is_ptr() const; // Asserts it is a ptr type
226 const TypePtr *isa_ptr() const; // Returns NULL if not ptr type 237 const TypePtr *isa_ptr() const; // Returns NULL if not ptr type
227 const TypeRawPtr *isa_rawptr() const; // NOT Java oop 238 const TypeRawPtr *isa_rawptr() const; // NOT Java oop
228 const TypeRawPtr *is_rawptr() const; // Asserts is rawptr 239 const TypeRawPtr *is_rawptr() const; // Asserts is rawptr
229 const TypeNarrowOop *is_narrowoop() const; // Java-style GC'd pointer 240 const TypeNarrowOop *is_narrowoop() const; // Java-style GC'd pointer
572 #ifndef PRODUCT 583 #ifndef PRODUCT
573 virtual void dump2( Dict &d, uint, outputStream *st ) const; // Specialized per-Type dumping 584 virtual void dump2( Dict &d, uint, outputStream *st ) const; // Specialized per-Type dumping
574 #endif 585 #endif
575 }; 586 };
576 587
588 //------------------------------TypeVect---------------------------------------
589 // Class of Vector Types
590 class TypeVect : public Type {
591 const Type* _elem; // Vector's element type
592 const uint _length; // Elements in vector (power of 2)
593
594 protected:
595 TypeVect(TYPES t, const Type* elem, uint length) : Type(t),
596 _elem(elem), _length(length) {}
597
598 public:
599 const Type* element_type() const { return _elem; }
600 BasicType element_basic_type() const { return _elem->array_element_basic_type(); }
601 uint length() const { return _length; }
602 uint length_in_bytes() const {
603 return _length * type2aelembytes(element_basic_type());
604 }
605
606 virtual bool eq(const Type *t) const;
607 virtual int hash() const; // Type specific hashing
608 virtual bool singleton(void) const; // TRUE if type is a singleton
609 virtual bool empty(void) const; // TRUE if type is vacuous
610
611 static const TypeVect *make(const BasicType elem_bt, uint length) {
612 // Use bottom primitive type.
613 return make(get_const_basic_type(elem_bt), length);
614 }
615 // Used directly by Replicate nodes to construct singleton vector.
616 static const TypeVect *make(const Type* elem, uint length);
617
618 virtual const Type *xmeet( const Type *t) const;
619 virtual const Type *xdual() const; // Compute dual right now.
620
621 static const TypeVect *VECTS;
622 static const TypeVect *VECTD;
623 static const TypeVect *VECTX;
624 static const TypeVect *VECTY;
625
626 #ifndef PRODUCT
627 virtual void dump2(Dict &d, uint, outputStream *st) const; // Specialized per-Type dumping
628 #endif
629 };
630
631 class TypeVectS : public TypeVect {
632 friend class TypeVect;
633 TypeVectS(const Type* elem, uint length) : TypeVect(VectorS, elem, length) {}
634 };
635
636 class TypeVectD : public TypeVect {
637 friend class TypeVect;
638 TypeVectD(const Type* elem, uint length) : TypeVect(VectorD, elem, length) {}
639 };
640
641 class TypeVectX : public TypeVect {
642 friend class TypeVect;
643 TypeVectX(const Type* elem, uint length) : TypeVect(VectorX, elem, length) {}
644 };
645
646 class TypeVectY : public TypeVect {
647 friend class TypeVect;
648 TypeVectY(const Type* elem, uint length) : TypeVect(VectorY, elem, length) {}
649 };
650
577 //------------------------------TypePtr---------------------------------------- 651 //------------------------------TypePtr----------------------------------------
578 // Class of machine Pointer Types: raw data, instances or arrays. 652 // Class of machine Pointer Types: raw data, instances or arrays.
579 // If the _base enum is AnyPtr, then this refers to all of the above. 653 // If the _base enum is AnyPtr, then this refers to all of the above.
580 // Otherwise the _base will indicate which subset of pointers is affected, 654 // Otherwise the _base will indicate which subset of pointers is affected,
581 // and the class will be inherited from. 655 // and the class will be inherited from.
1109 } 1183 }
1110 1184
1111 inline const TypeAry *Type::is_ary() const { 1185 inline const TypeAry *Type::is_ary() const {
1112 assert( _base == Array , "Not an Array" ); 1186 assert( _base == Array , "Not an Array" );
1113 return (TypeAry*)this; 1187 return (TypeAry*)this;
1188 }
1189
1190 inline const TypeVect *Type::is_vect() const {
1191 assert( _base >= VectorS && _base <= VectorY, "Not a Vector" );
1192 return (TypeVect*)this;
1193 }
1194
1195 inline const TypeVect *Type::isa_vect() const {
1196 return (_base >= VectorS && _base <= VectorY) ? (TypeVect*)this : NULL;
1114 } 1197 }
1115 1198
1116 inline const TypePtr *Type::is_ptr() const { 1199 inline const TypePtr *Type::is_ptr() const {
1117 // AnyPtr is the first Ptr and KlassPtr the last, with no non-ptrs between. 1200 // AnyPtr is the first Ptr and KlassPtr the last, with no non-ptrs between.
1118 assert(_base >= AnyPtr && _base <= KlassPtr, "Not a pointer"); 1201 assert(_base >= AnyPtr && _base <= KlassPtr, "Not a pointer");