Mercurial > hg > graal-compiler
diff src/share/vm/opto/vectornode.hpp @ 6823:859c45fb8cea
7201026: add vector for shift count
Summary: Add generation of vectors for scalar shift count.
Reviewed-by: roland, twisti, dlong
author | kvn |
---|---|
date | Tue, 02 Oct 2012 12:25:13 -0700 |
parents | 5af51c882207 |
children | 2113136690bc |
line wrap: on
line diff
--- a/src/share/vm/opto/vectornode.hpp Mon Oct 01 14:50:10 2012 -0700 +++ b/src/share/vm/opto/vectornode.hpp Tue Oct 02 12:25:13 2012 -0700 @@ -29,7 +29,7 @@ #include "opto/node.hpp" #include "opto/opcodes.hpp" -//------------------------------VectorNode-------------------------------------- +//------------------------------VectorNode------------------------------------- // Vector Operation class VectorNode : public TypeNode { public: @@ -53,7 +53,7 @@ virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(vect_type()->length_in_bytes()); } static VectorNode* scalar2vector(Compile* C, Node* s, uint vlen, const Type* opd_t); - + static VectorNode* shift_count(Compile* C, Node* shift, Node* cnt, uint vlen, BasicType bt); static VectorNode* make(Compile* C, int opc, Node* n1, Node* n2, uint vlen, BasicType bt); static int opcode(int opc, BasicType bt); @@ -64,9 +64,9 @@ static void vector_operands(Node* n, uint* start, uint* end); }; -//===========================Vector=ALU=Operations==================================== +//===========================Vector=ALU=Operations============================= -//------------------------------AddVBNode--------------------------------------- +//------------------------------AddVBNode-------------------------------------- // Vector add byte class AddVBNode : public VectorNode { public: @@ -74,7 +74,7 @@ virtual int Opcode() const; }; -//------------------------------AddVSNode--------------------------------------- +//------------------------------AddVSNode-------------------------------------- // Vector add char/short class AddVSNode : public VectorNode { public: @@ -82,7 +82,7 @@ virtual int Opcode() const; }; -//------------------------------AddVINode--------------------------------------- +//------------------------------AddVINode-------------------------------------- // Vector add int class AddVINode : public VectorNode { public: @@ -90,7 +90,7 @@ virtual int Opcode() const; }; -//------------------------------AddVLNode--------------------------------------- +//------------------------------AddVLNode-------------------------------------- // Vector add long class AddVLNode : public VectorNode { public: @@ -98,7 +98,7 @@ virtual int Opcode() const; }; -//------------------------------AddVFNode--------------------------------------- +//------------------------------AddVFNode-------------------------------------- // Vector add float class AddVFNode : public VectorNode { public: @@ -106,7 +106,7 @@ virtual int Opcode() const; }; -//------------------------------AddVDNode--------------------------------------- +//------------------------------AddVDNode-------------------------------------- // Vector add double class AddVDNode : public VectorNode { public: @@ -114,7 +114,7 @@ virtual int Opcode() const; }; -//------------------------------SubVBNode--------------------------------------- +//------------------------------SubVBNode-------------------------------------- // Vector subtract byte class SubVBNode : public VectorNode { public: @@ -122,7 +122,7 @@ virtual int Opcode() const; }; -//------------------------------SubVSNode--------------------------------------- +//------------------------------SubVSNode-------------------------------------- // Vector subtract short class SubVSNode : public VectorNode { public: @@ -130,7 +130,7 @@ virtual int Opcode() const; }; -//------------------------------SubVINode--------------------------------------- +//------------------------------SubVINode-------------------------------------- // Vector subtract int class SubVINode : public VectorNode { public: @@ -138,7 +138,7 @@ virtual int Opcode() const; }; -//------------------------------SubVLNode--------------------------------------- +//------------------------------SubVLNode-------------------------------------- // Vector subtract long class SubVLNode : public VectorNode { public: @@ -146,7 +146,7 @@ virtual int Opcode() const; }; -//------------------------------SubVFNode--------------------------------------- +//------------------------------SubVFNode-------------------------------------- // Vector subtract float class SubVFNode : public VectorNode { public: @@ -154,7 +154,7 @@ virtual int Opcode() const; }; -//------------------------------SubVDNode--------------------------------------- +//------------------------------SubVDNode-------------------------------------- // Vector subtract double class SubVDNode : public VectorNode { public: @@ -162,7 +162,7 @@ virtual int Opcode() const; }; -//------------------------------MulVSNode--------------------------------------- +//------------------------------MulVSNode-------------------------------------- // Vector multiply short class MulVSNode : public VectorNode { public: @@ -170,7 +170,7 @@ virtual int Opcode() const; }; -//------------------------------MulVINode--------------------------------------- +//------------------------------MulVINode-------------------------------------- // Vector multiply int class MulVINode : public VectorNode { public: @@ -178,7 +178,7 @@ virtual int Opcode() const; }; -//------------------------------MulVFNode--------------------------------------- +//------------------------------MulVFNode-------------------------------------- // Vector multiply float class MulVFNode : public VectorNode { public: @@ -186,7 +186,7 @@ virtual int Opcode() const; }; -//------------------------------MulVDNode--------------------------------------- +//------------------------------MulVDNode-------------------------------------- // Vector multiply double class MulVDNode : public VectorNode { public: @@ -194,7 +194,7 @@ virtual int Opcode() const; }; -//------------------------------DivVFNode--------------------------------------- +//------------------------------DivVFNode-------------------------------------- // Vector divide float class DivVFNode : public VectorNode { public: @@ -202,7 +202,7 @@ virtual int Opcode() const; }; -//------------------------------DivVDNode--------------------------------------- +//------------------------------DivVDNode-------------------------------------- // Vector Divide double class DivVDNode : public VectorNode { public: @@ -210,7 +210,7 @@ virtual int Opcode() const; }; -//------------------------------LShiftVBNode--------------------------------------- +//------------------------------LShiftVBNode----------------------------------- // Vector left shift bytes class LShiftVBNode : public VectorNode { public: @@ -218,7 +218,7 @@ virtual int Opcode() const; }; -//------------------------------LShiftVSNode--------------------------------------- +//------------------------------LShiftVSNode----------------------------------- // Vector left shift shorts class LShiftVSNode : public VectorNode { public: @@ -226,7 +226,7 @@ virtual int Opcode() const; }; -//------------------------------LShiftVINode--------------------------------------- +//------------------------------LShiftVINode----------------------------------- // Vector left shift ints class LShiftVINode : public VectorNode { public: @@ -234,7 +234,7 @@ virtual int Opcode() const; }; -//------------------------------LShiftVLNode--------------------------------------- +//------------------------------LShiftVLNode----------------------------------- // Vector left shift longs class LShiftVLNode : public VectorNode { public: @@ -242,7 +242,7 @@ virtual int Opcode() const; }; -//------------------------------RShiftVBNode--------------------------------------- +//------------------------------RShiftVBNode----------------------------------- // Vector right arithmetic (signed) shift bytes class RShiftVBNode : public VectorNode { public: @@ -250,7 +250,7 @@ virtual int Opcode() const; }; -//------------------------------RShiftVSNode--------------------------------------- +//------------------------------RShiftVSNode----------------------------------- // Vector right arithmetic (signed) shift shorts class RShiftVSNode : public VectorNode { public: @@ -258,7 +258,7 @@ virtual int Opcode() const; }; -//------------------------------RShiftVINode--------------------------------------- +//------------------------------RShiftVINode----------------------------------- // Vector right arithmetic (signed) shift ints class RShiftVINode : public VectorNode { public: @@ -266,7 +266,7 @@ virtual int Opcode() const; }; -//------------------------------RShiftVLNode--------------------------------------- +//------------------------------RShiftVLNode----------------------------------- // Vector right arithmetic (signed) shift longs class RShiftVLNode : public VectorNode { public: @@ -274,7 +274,7 @@ virtual int Opcode() const; }; -//------------------------------URShiftVBNode--------------------------------------- +//------------------------------URShiftVBNode---------------------------------- // Vector right logical (unsigned) shift bytes class URShiftVBNode : public VectorNode { public: @@ -282,7 +282,7 @@ virtual int Opcode() const; }; -//------------------------------URShiftVSNode--------------------------------------- +//------------------------------URShiftVSNode---------------------------------- // Vector right logical (unsigned) shift shorts class URShiftVSNode : public VectorNode { public: @@ -290,7 +290,7 @@ virtual int Opcode() const; }; -//------------------------------URShiftVINode--------------------------------------- +//------------------------------URShiftVINode---------------------------------- // Vector right logical (unsigned) shift ints class URShiftVINode : public VectorNode { public: @@ -298,7 +298,7 @@ virtual int Opcode() const; }; -//------------------------------URShiftVLNode--------------------------------------- +//------------------------------URShiftVLNode---------------------------------- // Vector right logical (unsigned) shift longs class URShiftVLNode : public VectorNode { public: @@ -306,6 +306,24 @@ virtual int Opcode() const; }; +//------------------------------LShiftCntVNode--------------------------------- +// Vector left shift count +class LShiftCntVNode : public VectorNode { + public: + LShiftCntVNode(Node* cnt, const TypeVect* vt) : VectorNode(cnt,vt) {} + virtual int Opcode() const; + virtual uint ideal_reg() const { return Matcher::vector_shift_count_ideal_reg(vect_type()->length_in_bytes()); } +}; + +//------------------------------RShiftCntVNode--------------------------------- +// Vector right shift count +class RShiftCntVNode : public VectorNode { + public: + RShiftCntVNode(Node* cnt, const TypeVect* vt) : VectorNode(cnt,vt) {} + virtual int Opcode() const; + virtual uint ideal_reg() const { return Matcher::vector_shift_count_ideal_reg(vect_type()->length_in_bytes()); } +}; + //------------------------------AndVNode--------------------------------------- // Vector and integer @@ -452,7 +470,7 @@ static PackNode* make(Compile* C, Node* s, uint vlen, BasicType bt); }; -//------------------------------PackBNode--------------------------------------- +//------------------------------PackBNode-------------------------------------- // Pack byte scalars into vector class PackBNode : public PackNode { public: @@ -460,7 +478,7 @@ virtual int Opcode() const; }; -//------------------------------PackSNode--------------------------------------- +//------------------------------PackSNode-------------------------------------- // Pack short scalars into a vector class PackSNode : public PackNode { public: @@ -469,7 +487,7 @@ virtual int Opcode() const; }; -//------------------------------PackINode--------------------------------------- +//------------------------------PackINode-------------------------------------- // Pack integer scalars into a vector class PackINode : public PackNode { public: @@ -478,7 +496,7 @@ virtual int Opcode() const; }; -//------------------------------PackLNode--------------------------------------- +//------------------------------PackLNode-------------------------------------- // Pack long scalars into a vector class PackLNode : public PackNode { public: @@ -487,7 +505,7 @@ virtual int Opcode() const; }; -//------------------------------Pack2LNode-------------------------------------- +//------------------------------Pack2LNode------------------------------------- // Pack 2 long scalars into a vector class Pack2LNode : public PackNode { public: @@ -495,7 +513,7 @@ virtual int Opcode() const; }; -//------------------------------PackFNode--------------------------------------- +//------------------------------PackFNode-------------------------------------- // Pack float scalars into vector class PackFNode : public PackNode { public: @@ -504,7 +522,7 @@ virtual int Opcode() const; }; -//------------------------------PackDNode--------------------------------------- +//------------------------------PackDNode-------------------------------------- // Pack double scalars into a vector class PackDNode : public PackNode { public: @@ -513,7 +531,7 @@ virtual int Opcode() const; }; -//------------------------------Pack2DNode-------------------------------------- +//------------------------------Pack2DNode------------------------------------- // Pack 2 double scalars into a vector class Pack2DNode : public PackNode { public: @@ -522,9 +540,9 @@ }; -//========================Extract_Scalar_from_Vector=============================== +//========================Extract_Scalar_from_Vector=========================== -//------------------------------ExtractNode--------------------------------------- +//------------------------------ExtractNode------------------------------------ // Extract a scalar from a vector at position "pos" class ExtractNode : public Node { public: @@ -537,7 +555,7 @@ static Node* make(Compile* C, Node* v, uint position, BasicType bt); }; -//------------------------------ExtractBNode--------------------------------------- +//------------------------------ExtractBNode----------------------------------- // Extract a byte from a vector at position "pos" class ExtractBNode : public ExtractNode { public: @@ -547,7 +565,7 @@ virtual uint ideal_reg() const { return Op_RegI; } }; -//------------------------------ExtractUBNode-------------------------------------- +//------------------------------ExtractUBNode---------------------------------- // Extract a boolean from a vector at position "pos" class ExtractUBNode : public ExtractNode { public: @@ -557,7 +575,7 @@ virtual uint ideal_reg() const { return Op_RegI; } }; -//------------------------------ExtractCNode--------------------------------------- +//------------------------------ExtractCNode----------------------------------- // Extract a char from a vector at position "pos" class ExtractCNode : public ExtractNode { public: @@ -567,7 +585,7 @@ virtual uint ideal_reg() const { return Op_RegI; } }; -//------------------------------ExtractSNode--------------------------------------- +//------------------------------ExtractSNode----------------------------------- // Extract a short from a vector at position "pos" class ExtractSNode : public ExtractNode { public: @@ -577,7 +595,7 @@ virtual uint ideal_reg() const { return Op_RegI; } }; -//------------------------------ExtractINode--------------------------------------- +//------------------------------ExtractINode----------------------------------- // Extract an int from a vector at position "pos" class ExtractINode : public ExtractNode { public: @@ -587,7 +605,7 @@ virtual uint ideal_reg() const { return Op_RegI; } }; -//------------------------------ExtractLNode--------------------------------------- +//------------------------------ExtractLNode----------------------------------- // Extract a long from a vector at position "pos" class ExtractLNode : public ExtractNode { public: @@ -597,7 +615,7 @@ virtual uint ideal_reg() const { return Op_RegL; } }; -//------------------------------ExtractFNode--------------------------------------- +//------------------------------ExtractFNode----------------------------------- // Extract a float from a vector at position "pos" class ExtractFNode : public ExtractNode { public: @@ -607,7 +625,7 @@ virtual uint ideal_reg() const { return Op_RegF; } }; -//------------------------------ExtractDNode--------------------------------------- +//------------------------------ExtractDNode----------------------------------- // Extract a double from a vector at position "pos" class ExtractDNode : public ExtractNode { public: