src/hotspot/cpu/x86/assembler_x86.hpp
changeset 50860 480a96a43b62
parent 50699 cc7fc46cc8c1
child 51333 f6641fcf7b7e
equal deleted inserted replaced
50859:29169633327c 50860:480a96a43b62
   182   }
   182   }
   183 
   183 
   184  private:
   184  private:
   185   Register         _base;
   185   Register         _base;
   186   Register         _index;
   186   Register         _index;
       
   187   XMMRegister      _xmmindex;
   187   ScaleFactor      _scale;
   188   ScaleFactor      _scale;
   188   int              _disp;
   189   int              _disp;
       
   190   bool             _isxmmindex;
   189   RelocationHolder _rspec;
   191   RelocationHolder _rspec;
   190 
   192 
   191   // Easily misused constructors make them private
   193   // Easily misused constructors make them private
   192   // %%% can we make these go away?
   194   // %%% can we make these go away?
   193   NOT_LP64(Address(address loc, RelocationHolder spec);)
   195   NOT_LP64(Address(address loc, RelocationHolder spec);)
   199  int disp() { return _disp; }
   201  int disp() { return _disp; }
   200   // creation
   202   // creation
   201   Address()
   203   Address()
   202     : _base(noreg),
   204     : _base(noreg),
   203       _index(noreg),
   205       _index(noreg),
       
   206       _xmmindex(xnoreg),
   204       _scale(no_scale),
   207       _scale(no_scale),
   205       _disp(0) {
   208       _disp(0),
       
   209       _isxmmindex(false){
   206   }
   210   }
   207 
   211 
   208   // No default displacement otherwise Register can be implicitly
   212   // No default displacement otherwise Register can be implicitly
   209   // converted to 0(Register) which is quite a different animal.
   213   // converted to 0(Register) which is quite a different animal.
   210 
   214 
   211   Address(Register base, int disp)
   215   Address(Register base, int disp)
   212     : _base(base),
   216     : _base(base),
   213       _index(noreg),
   217       _index(noreg),
       
   218       _xmmindex(xnoreg),
   214       _scale(no_scale),
   219       _scale(no_scale),
   215       _disp(disp) {
   220       _disp(disp),
       
   221       _isxmmindex(false){
   216   }
   222   }
   217 
   223 
   218   Address(Register base, Register index, ScaleFactor scale, int disp = 0)
   224   Address(Register base, Register index, ScaleFactor scale, int disp = 0)
   219     : _base (base),
   225     : _base (base),
   220       _index(index),
   226       _index(index),
       
   227       _xmmindex(xnoreg),
   221       _scale(scale),
   228       _scale(scale),
   222       _disp (disp) {
   229       _disp (disp),
       
   230       _isxmmindex(false) {
   223     assert(!index->is_valid() == (scale == Address::no_scale),
   231     assert(!index->is_valid() == (scale == Address::no_scale),
   224            "inconsistent address");
   232            "inconsistent address");
   225   }
   233   }
   226 
   234 
   227   Address(Register base, RegisterOrConstant index, ScaleFactor scale = times_1, int disp = 0)
   235   Address(Register base, RegisterOrConstant index, ScaleFactor scale = times_1, int disp = 0)
   228     : _base (base),
   236     : _base (base),
   229       _index(index.register_or_noreg()),
   237       _index(index.register_or_noreg()),
       
   238       _xmmindex(xnoreg),
   230       _scale(scale),
   239       _scale(scale),
   231       _disp (disp + (index.constant_or_zero() * scale_size(scale))) {
   240       _disp (disp + (index.constant_or_zero() * scale_size(scale))),
       
   241       _isxmmindex(false){
   232     if (!index.is_register())  scale = Address::no_scale;
   242     if (!index.is_register())  scale = Address::no_scale;
   233     assert(!_index->is_valid() == (scale == Address::no_scale),
   243     assert(!_index->is_valid() == (scale == Address::no_scale),
   234            "inconsistent address");
   244            "inconsistent address");
       
   245   }
       
   246 
       
   247   Address(Register base, XMMRegister index, ScaleFactor scale, int disp = 0)
       
   248     : _base (base),
       
   249       _index(noreg),
       
   250       _xmmindex(index),
       
   251       _scale(scale),
       
   252       _disp(disp),
       
   253       _isxmmindex(true) {
       
   254       assert(!index->is_valid() == (scale == Address::no_scale),
       
   255              "inconsistent address");
   235   }
   256   }
   236 
   257 
   237   Address plus_disp(int disp) const {
   258   Address plus_disp(int disp) const {
   238     Address a = (*this);
   259     Address a = (*this);
   239     a._disp += disp;
   260     a._disp += disp;
   267 
   288 
   268 #ifdef ASSERT
   289 #ifdef ASSERT
   269   Address(Register base, ByteSize disp)
   290   Address(Register base, ByteSize disp)
   270     : _base(base),
   291     : _base(base),
   271       _index(noreg),
   292       _index(noreg),
       
   293       _xmmindex(xnoreg),
   272       _scale(no_scale),
   294       _scale(no_scale),
   273       _disp(in_bytes(disp)) {
   295       _disp(in_bytes(disp)),
       
   296       _isxmmindex(false){
   274   }
   297   }
   275 
   298 
   276   Address(Register base, Register index, ScaleFactor scale, ByteSize disp)
   299   Address(Register base, Register index, ScaleFactor scale, ByteSize disp)
   277     : _base(base),
   300     : _base(base),
   278       _index(index),
   301       _index(index),
       
   302       _xmmindex(xnoreg),
   279       _scale(scale),
   303       _scale(scale),
   280       _disp(in_bytes(disp)) {
   304       _disp(in_bytes(disp)),
       
   305       _isxmmindex(false){
   281     assert(!index->is_valid() == (scale == Address::no_scale),
   306     assert(!index->is_valid() == (scale == Address::no_scale),
   282            "inconsistent address");
   307            "inconsistent address");
   283   }
   308   }
   284 
       
   285   Address(Register base, RegisterOrConstant index, ScaleFactor scale, ByteSize disp)
   309   Address(Register base, RegisterOrConstant index, ScaleFactor scale, ByteSize disp)
   286     : _base (base),
   310     : _base (base),
   287       _index(index.register_or_noreg()),
   311       _index(index.register_or_noreg()),
       
   312       _xmmindex(xnoreg),
   288       _scale(scale),
   313       _scale(scale),
   289       _disp (in_bytes(disp) + (index.constant_or_zero() * scale_size(scale))) {
   314       _disp (in_bytes(disp) + (index.constant_or_zero() * scale_size(scale))),
       
   315       _isxmmindex(false) {
   290     if (!index.is_register())  scale = Address::no_scale;
   316     if (!index.is_register())  scale = Address::no_scale;
   291     assert(!_index->is_valid() == (scale == Address::no_scale),
   317     assert(!_index->is_valid() == (scale == Address::no_scale),
   292            "inconsistent address");
   318            "inconsistent address");
   293   }
   319   }
   294 
   320 
   296 
   322 
   297   // accessors
   323   // accessors
   298   bool        uses(Register reg) const { return _base == reg || _index == reg; }
   324   bool        uses(Register reg) const { return _base == reg || _index == reg; }
   299   Register    base()             const { return _base;  }
   325   Register    base()             const { return _base;  }
   300   Register    index()            const { return _index; }
   326   Register    index()            const { return _index; }
       
   327   XMMRegister xmmindex()         const { return _xmmindex; }
   301   ScaleFactor scale()            const { return _scale; }
   328   ScaleFactor scale()            const { return _scale; }
   302   int         disp()             const { return _disp;  }
   329   int         disp()             const { return _disp;  }
       
   330   bool        isxmmindex()       const { return _isxmmindex; }
   303 
   331 
   304   // Convert the raw encoding form into the form expected by the constructor for
   332   // Convert the raw encoding form into the form expected by the constructor for
   305   // Address.  An index of 4 (rsp) corresponds to having no index, so convert
   333   // Address.  An index of 4 (rsp) corresponds to having no index, so convert
   306   // that to noreg for the Address constructor.
   334   // that to noreg for the Address constructor.
   307   static Address make_raw(int base, int index, int scale, int disp, relocInfo::relocType disp_reloc);
   335   static Address make_raw(int base, int index, int scale, int disp, relocInfo::relocType disp_reloc);
   313     return _base != noreg && _base->encoding() >= 8;
   341     return _base != noreg && _base->encoding() >= 8;
   314   }
   342   }
   315 
   343 
   316   bool index_needs_rex() const {
   344   bool index_needs_rex() const {
   317     return _index != noreg &&_index->encoding() >= 8;
   345     return _index != noreg &&_index->encoding() >= 8;
       
   346   }
       
   347 
       
   348   bool xmmindex_needs_rex() const {
       
   349     return _xmmindex != xnoreg && _xmmindex->encoding() >= 8;
   318   }
   350   }
   319 
   351 
   320   relocInfo::relocType reloc() const { return _rspec.type(); }
   352   relocInfo::relocType reloc() const { return _rspec.type(); }
   321 
   353 
   322   friend class Assembler;
   354   friend class Assembler;
   680   void emit_operand(Register reg,
   712   void emit_operand(Register reg,
   681                     Register base, Register index, Address::ScaleFactor scale,
   713                     Register base, Register index, Address::ScaleFactor scale,
   682                     int disp,
   714                     int disp,
   683                     RelocationHolder const& rspec,
   715                     RelocationHolder const& rspec,
   684                     int rip_relative_correction = 0);
   716                     int rip_relative_correction = 0);
       
   717 
       
   718   void emit_operand(XMMRegister reg, Register base, XMMRegister index,
       
   719                     Address::ScaleFactor scale,
       
   720                     int disp, RelocationHolder const& rspec);
   685 
   721 
   686   void emit_operand(Register reg, Address adr, int rip_relative_correction = 0);
   722   void emit_operand(Register reg, Address adr, int rip_relative_correction = 0);
   687 
   723 
   688   // operands that only take the original 32bit registers
   724   // operands that only take the original 32bit registers
   689   void emit_operand32(Register reg, Address adr);
   725   void emit_operand32(Register reg, Address adr);
  1552   // Pemutation of 64bit words
  1588   // Pemutation of 64bit words
  1553   void vpermq(XMMRegister dst, XMMRegister src, int imm8, int vector_len);
  1589   void vpermq(XMMRegister dst, XMMRegister src, int imm8, int vector_len);
  1554   void vpermq(XMMRegister dst, XMMRegister src, int imm8);
  1590   void vpermq(XMMRegister dst, XMMRegister src, int imm8);
  1555   void vperm2i128(XMMRegister dst,  XMMRegister nds, XMMRegister src, int imm8);
  1591   void vperm2i128(XMMRegister dst,  XMMRegister nds, XMMRegister src, int imm8);
  1556   void vperm2f128(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8);
  1592   void vperm2f128(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8);
       
  1593   void evpermi2q(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
  1557 
  1594 
  1558   void pause();
  1595   void pause();
  1559 
  1596 
  1560   // Undefined Instruction
  1597   // Undefined Instruction
  1561   void ud2();
  1598   void ud2();
  1618   // SSE4.1 packed move
  1655   // SSE4.1 packed move
  1619   void pmovzxbw(XMMRegister dst, XMMRegister src);
  1656   void pmovzxbw(XMMRegister dst, XMMRegister src);
  1620   void pmovzxbw(XMMRegister dst, Address src);
  1657   void pmovzxbw(XMMRegister dst, Address src);
  1621 
  1658 
  1622   void vpmovzxbw( XMMRegister dst, Address src, int vector_len);
  1659   void vpmovzxbw( XMMRegister dst, Address src, int vector_len);
       
  1660   void vpmovzxbw(XMMRegister dst, XMMRegister src, int vector_len);
  1623   void evpmovzxbw(XMMRegister dst, KRegister mask, Address src, int vector_len);
  1661   void evpmovzxbw(XMMRegister dst, KRegister mask, Address src, int vector_len);
  1624 
  1662 
  1625   void evpmovwb(Address dst, XMMRegister src, int vector_len);
  1663   void evpmovwb(Address dst, XMMRegister src, int vector_len);
  1626   void evpmovwb(Address dst, KRegister mask, XMMRegister src, int vector_len);
  1664   void evpmovwb(Address dst, KRegister mask, XMMRegister src, int vector_len);
       
  1665 
       
  1666   void vpmovzxwd(XMMRegister dst, XMMRegister src, int vector_len);
       
  1667 
       
  1668   void evpmovdb(Address dst, XMMRegister src, int vector_len);
  1627 
  1669 
  1628 #ifndef _LP64 // no 32bit push/pop on amd64
  1670 #ifndef _LP64 // no 32bit push/pop on amd64
  1629   void popl(Address dst);
  1671   void popl(Address dst);
  1630 #endif
  1672 #endif
  1631 
  1673 
  2024   void vpsrld(XMMRegister dst, XMMRegister src, int shift, int vector_len);
  2066   void vpsrld(XMMRegister dst, XMMRegister src, int shift, int vector_len);
  2025   void vpsrlq(XMMRegister dst, XMMRegister src, int shift, int vector_len);
  2067   void vpsrlq(XMMRegister dst, XMMRegister src, int shift, int vector_len);
  2026   void vpsrlw(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len);
  2068   void vpsrlw(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len);
  2027   void vpsrld(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len);
  2069   void vpsrld(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len);
  2028   void vpsrlq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len);
  2070   void vpsrlq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len);
       
  2071   void evpsrlvw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
       
  2072   void evpsllvw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
  2029 
  2073 
  2030   // Arithmetic shift right packed integers (only shorts and ints, no instructions for longs)
  2074   // Arithmetic shift right packed integers (only shorts and ints, no instructions for longs)
  2031   void psraw(XMMRegister dst, int shift);
  2075   void psraw(XMMRegister dst, int shift);
  2032   void psrad(XMMRegister dst, int shift);
  2076   void psrad(XMMRegister dst, int shift);
  2033   void psraw(XMMRegister dst, XMMRegister shift);
  2077   void psraw(XMMRegister dst, XMMRegister shift);
  2039 
  2083 
  2040   // And packed integers
  2084   // And packed integers
  2041   void pand(XMMRegister dst, XMMRegister src);
  2085   void pand(XMMRegister dst, XMMRegister src);
  2042   void vpand(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
  2086   void vpand(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
  2043   void vpand(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
  2087   void vpand(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
       
  2088   void vpandq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
  2044 
  2089 
  2045   // Andn packed integers
  2090   // Andn packed integers
  2046   void pandn(XMMRegister dst, XMMRegister src);
  2091   void pandn(XMMRegister dst, XMMRegister src);
  2047 
  2092 
  2048   // Or packed integers
  2093   // Or packed integers
  2049   void por(XMMRegister dst, XMMRegister src);
  2094   void por(XMMRegister dst, XMMRegister src);
  2050   void vpor(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
  2095   void vpor(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
  2051   void vpor(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
  2096   void vpor(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
       
  2097   void vporq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
  2052 
  2098 
  2053   // Xor packed integers
  2099   // Xor packed integers
  2054   void pxor(XMMRegister dst, XMMRegister src);
  2100   void pxor(XMMRegister dst, XMMRegister src);
  2055   void vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
  2101   void vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
  2056   void vpxor(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
  2102   void vpxor(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
  2116   // gpr sourced byte/word/dword/qword replicate
  2162   // gpr sourced byte/word/dword/qword replicate
  2117   void evpbroadcastb(XMMRegister dst, Register src, int vector_len);
  2163   void evpbroadcastb(XMMRegister dst, Register src, int vector_len);
  2118   void evpbroadcastw(XMMRegister dst, Register src, int vector_len);
  2164   void evpbroadcastw(XMMRegister dst, Register src, int vector_len);
  2119   void evpbroadcastd(XMMRegister dst, Register src, int vector_len);
  2165   void evpbroadcastd(XMMRegister dst, Register src, int vector_len);
  2120   void evpbroadcastq(XMMRegister dst, Register src, int vector_len);
  2166   void evpbroadcastq(XMMRegister dst, Register src, int vector_len);
       
  2167 
       
  2168   void evpgatherdd(XMMRegister dst, KRegister k1, Address src, int vector_len);
  2121 
  2169 
  2122   // Carry-Less Multiplication Quadword
  2170   // Carry-Less Multiplication Quadword
  2123   void pclmulqdq(XMMRegister dst, XMMRegister src, int mask);
  2171   void pclmulqdq(XMMRegister dst, XMMRegister src, int mask);
  2124   void vpclmulqdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int mask);
  2172   void vpclmulqdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int mask);
  2125   void evpclmulqdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int mask, int vector_len);
  2173   void evpclmulqdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int mask, int vector_len);