src/cpu/x86/vm/assembler_x86.hpp

Fri, 25 Jan 2013 10:04:08 -0500

author
zgu
date
Fri, 25 Jan 2013 10:04:08 -0500
changeset 4492
8b46b0196eb0
parent 4413
038dd2875b94
child 4496
cf8470eaf7e5
permissions
-rw-r--r--

8000692: Remove old KERNEL code
Summary: Removed depreciated kernel VM source code from hotspot VM
Reviewed-by: dholmes, acorn

     1 /*
     2  * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     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
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #ifndef CPU_X86_VM_ASSEMBLER_X86_HPP
    26 #define CPU_X86_VM_ASSEMBLER_X86_HPP
    28 #include "asm/register.hpp"
    30 class BiasedLockingCounters;
    32 // Contains all the definitions needed for x86 assembly code generation.
    34 // Calling convention
    35 class Argument VALUE_OBJ_CLASS_SPEC {
    36  public:
    37   enum {
    38 #ifdef _LP64
    39 #ifdef _WIN64
    40     n_int_register_parameters_c   = 4, // rcx, rdx, r8, r9 (c_rarg0, c_rarg1, ...)
    41     n_float_register_parameters_c = 4,  // xmm0 - xmm3 (c_farg0, c_farg1, ... )
    42 #else
    43     n_int_register_parameters_c   = 6, // rdi, rsi, rdx, rcx, r8, r9 (c_rarg0, c_rarg1, ...)
    44     n_float_register_parameters_c = 8,  // xmm0 - xmm7 (c_farg0, c_farg1, ... )
    45 #endif // _WIN64
    46     n_int_register_parameters_j   = 6, // j_rarg0, j_rarg1, ...
    47     n_float_register_parameters_j = 8  // j_farg0, j_farg1, ...
    48 #else
    49     n_register_parameters = 0   // 0 registers used to pass arguments
    50 #endif // _LP64
    51   };
    52 };
    55 #ifdef _LP64
    56 // Symbolically name the register arguments used by the c calling convention.
    57 // Windows is different from linux/solaris. So much for standards...
    59 #ifdef _WIN64
    61 REGISTER_DECLARATION(Register, c_rarg0, rcx);
    62 REGISTER_DECLARATION(Register, c_rarg1, rdx);
    63 REGISTER_DECLARATION(Register, c_rarg2, r8);
    64 REGISTER_DECLARATION(Register, c_rarg3, r9);
    66 REGISTER_DECLARATION(XMMRegister, c_farg0, xmm0);
    67 REGISTER_DECLARATION(XMMRegister, c_farg1, xmm1);
    68 REGISTER_DECLARATION(XMMRegister, c_farg2, xmm2);
    69 REGISTER_DECLARATION(XMMRegister, c_farg3, xmm3);
    71 #else
    73 REGISTER_DECLARATION(Register, c_rarg0, rdi);
    74 REGISTER_DECLARATION(Register, c_rarg1, rsi);
    75 REGISTER_DECLARATION(Register, c_rarg2, rdx);
    76 REGISTER_DECLARATION(Register, c_rarg3, rcx);
    77 REGISTER_DECLARATION(Register, c_rarg4, r8);
    78 REGISTER_DECLARATION(Register, c_rarg5, r9);
    80 REGISTER_DECLARATION(XMMRegister, c_farg0, xmm0);
    81 REGISTER_DECLARATION(XMMRegister, c_farg1, xmm1);
    82 REGISTER_DECLARATION(XMMRegister, c_farg2, xmm2);
    83 REGISTER_DECLARATION(XMMRegister, c_farg3, xmm3);
    84 REGISTER_DECLARATION(XMMRegister, c_farg4, xmm4);
    85 REGISTER_DECLARATION(XMMRegister, c_farg5, xmm5);
    86 REGISTER_DECLARATION(XMMRegister, c_farg6, xmm6);
    87 REGISTER_DECLARATION(XMMRegister, c_farg7, xmm7);
    89 #endif // _WIN64
    91 // Symbolically name the register arguments used by the Java calling convention.
    92 // We have control over the convention for java so we can do what we please.
    93 // What pleases us is to offset the java calling convention so that when
    94 // we call a suitable jni method the arguments are lined up and we don't
    95 // have to do little shuffling. A suitable jni method is non-static and a
    96 // small number of arguments (two fewer args on windows)
    97 //
    98 //        |-------------------------------------------------------|
    99 //        | c_rarg0   c_rarg1  c_rarg2 c_rarg3 c_rarg4 c_rarg5    |
   100 //        |-------------------------------------------------------|
   101 //        | rcx       rdx      r8      r9      rdi*    rsi*       | windows (* not a c_rarg)
   102 //        | rdi       rsi      rdx     rcx     r8      r9         | solaris/linux
   103 //        |-------------------------------------------------------|
   104 //        | j_rarg5   j_rarg0  j_rarg1 j_rarg2 j_rarg3 j_rarg4    |
   105 //        |-------------------------------------------------------|
   107 REGISTER_DECLARATION(Register, j_rarg0, c_rarg1);
   108 REGISTER_DECLARATION(Register, j_rarg1, c_rarg2);
   109 REGISTER_DECLARATION(Register, j_rarg2, c_rarg3);
   110 // Windows runs out of register args here
   111 #ifdef _WIN64
   112 REGISTER_DECLARATION(Register, j_rarg3, rdi);
   113 REGISTER_DECLARATION(Register, j_rarg4, rsi);
   114 #else
   115 REGISTER_DECLARATION(Register, j_rarg3, c_rarg4);
   116 REGISTER_DECLARATION(Register, j_rarg4, c_rarg5);
   117 #endif /* _WIN64 */
   118 REGISTER_DECLARATION(Register, j_rarg5, c_rarg0);
   120 REGISTER_DECLARATION(XMMRegister, j_farg0, xmm0);
   121 REGISTER_DECLARATION(XMMRegister, j_farg1, xmm1);
   122 REGISTER_DECLARATION(XMMRegister, j_farg2, xmm2);
   123 REGISTER_DECLARATION(XMMRegister, j_farg3, xmm3);
   124 REGISTER_DECLARATION(XMMRegister, j_farg4, xmm4);
   125 REGISTER_DECLARATION(XMMRegister, j_farg5, xmm5);
   126 REGISTER_DECLARATION(XMMRegister, j_farg6, xmm6);
   127 REGISTER_DECLARATION(XMMRegister, j_farg7, xmm7);
   129 REGISTER_DECLARATION(Register, rscratch1, r10);  // volatile
   130 REGISTER_DECLARATION(Register, rscratch2, r11);  // volatile
   132 REGISTER_DECLARATION(Register, r12_heapbase, r12); // callee-saved
   133 REGISTER_DECLARATION(Register, r15_thread, r15); // callee-saved
   135 #else
   136 // rscratch1 will apear in 32bit code that is dead but of course must compile
   137 // Using noreg ensures if the dead code is incorrectly live and executed it
   138 // will cause an assertion failure
   139 #define rscratch1 noreg
   140 #define rscratch2 noreg
   142 #endif // _LP64
   144 // JSR 292 fixed register usages:
   145 REGISTER_DECLARATION(Register, rbp_mh_SP_save, rbp);
   147 // Address is an abstraction used to represent a memory location
   148 // using any of the amd64 addressing modes with one object.
   149 //
   150 // Note: A register location is represented via a Register, not
   151 //       via an address for efficiency & simplicity reasons.
   153 class ArrayAddress;
   155 class Address VALUE_OBJ_CLASS_SPEC {
   156  public:
   157   enum ScaleFactor {
   158     no_scale = -1,
   159     times_1  =  0,
   160     times_2  =  1,
   161     times_4  =  2,
   162     times_8  =  3,
   163     times_ptr = LP64_ONLY(times_8) NOT_LP64(times_4)
   164   };
   165   static ScaleFactor times(int size) {
   166     assert(size >= 1 && size <= 8 && is_power_of_2(size), "bad scale size");
   167     if (size == 8)  return times_8;
   168     if (size == 4)  return times_4;
   169     if (size == 2)  return times_2;
   170     return times_1;
   171   }
   172   static int scale_size(ScaleFactor scale) {
   173     assert(scale != no_scale, "");
   174     assert(((1 << (int)times_1) == 1 &&
   175             (1 << (int)times_2) == 2 &&
   176             (1 << (int)times_4) == 4 &&
   177             (1 << (int)times_8) == 8), "");
   178     return (1 << (int)scale);
   179   }
   181  private:
   182   Register         _base;
   183   Register         _index;
   184   ScaleFactor      _scale;
   185   int              _disp;
   186   RelocationHolder _rspec;
   188   // Easily misused constructors make them private
   189   // %%% can we make these go away?
   190   NOT_LP64(Address(address loc, RelocationHolder spec);)
   191   Address(int disp, address loc, relocInfo::relocType rtype);
   192   Address(int disp, address loc, RelocationHolder spec);
   194  public:
   196  int disp() { return _disp; }
   197   // creation
   198   Address()
   199     : _base(noreg),
   200       _index(noreg),
   201       _scale(no_scale),
   202       _disp(0) {
   203   }
   205   // No default displacement otherwise Register can be implicitly
   206   // converted to 0(Register) which is quite a different animal.
   208   Address(Register base, int disp)
   209     : _base(base),
   210       _index(noreg),
   211       _scale(no_scale),
   212       _disp(disp) {
   213   }
   215   Address(Register base, Register index, ScaleFactor scale, int disp = 0)
   216     : _base (base),
   217       _index(index),
   218       _scale(scale),
   219       _disp (disp) {
   220     assert(!index->is_valid() == (scale == Address::no_scale),
   221            "inconsistent address");
   222   }
   224   Address(Register base, RegisterOrConstant index, ScaleFactor scale = times_1, int disp = 0)
   225     : _base (base),
   226       _index(index.register_or_noreg()),
   227       _scale(scale),
   228       _disp (disp + (index.constant_or_zero() * scale_size(scale))) {
   229     if (!index.is_register())  scale = Address::no_scale;
   230     assert(!_index->is_valid() == (scale == Address::no_scale),
   231            "inconsistent address");
   232   }
   234   Address plus_disp(int disp) const {
   235     Address a = (*this);
   236     a._disp += disp;
   237     return a;
   238   }
   239   Address plus_disp(RegisterOrConstant disp, ScaleFactor scale = times_1) const {
   240     Address a = (*this);
   241     a._disp += disp.constant_or_zero() * scale_size(scale);
   242     if (disp.is_register()) {
   243       assert(!a.index()->is_valid(), "competing indexes");
   244       a._index = disp.as_register();
   245       a._scale = scale;
   246     }
   247     return a;
   248   }
   249   bool is_same_address(Address a) const {
   250     // disregard _rspec
   251     return _base == a._base && _disp == a._disp && _index == a._index && _scale == a._scale;
   252   }
   254   // The following two overloads are used in connection with the
   255   // ByteSize type (see sizes.hpp).  They simplify the use of
   256   // ByteSize'd arguments in assembly code. Note that their equivalent
   257   // for the optimized build are the member functions with int disp
   258   // argument since ByteSize is mapped to an int type in that case.
   259   //
   260   // Note: DO NOT introduce similar overloaded functions for WordSize
   261   // arguments as in the optimized mode, both ByteSize and WordSize
   262   // are mapped to the same type and thus the compiler cannot make a
   263   // distinction anymore (=> compiler errors).
   265 #ifdef ASSERT
   266   Address(Register base, ByteSize disp)
   267     : _base(base),
   268       _index(noreg),
   269       _scale(no_scale),
   270       _disp(in_bytes(disp)) {
   271   }
   273   Address(Register base, Register index, ScaleFactor scale, ByteSize disp)
   274     : _base(base),
   275       _index(index),
   276       _scale(scale),
   277       _disp(in_bytes(disp)) {
   278     assert(!index->is_valid() == (scale == Address::no_scale),
   279            "inconsistent address");
   280   }
   282   Address(Register base, RegisterOrConstant index, ScaleFactor scale, ByteSize disp)
   283     : _base (base),
   284       _index(index.register_or_noreg()),
   285       _scale(scale),
   286       _disp (in_bytes(disp) + (index.constant_or_zero() * scale_size(scale))) {
   287     if (!index.is_register())  scale = Address::no_scale;
   288     assert(!_index->is_valid() == (scale == Address::no_scale),
   289            "inconsistent address");
   290   }
   292 #endif // ASSERT
   294   // accessors
   295   bool        uses(Register reg) const { return _base == reg || _index == reg; }
   296   Register    base()             const { return _base;  }
   297   Register    index()            const { return _index; }
   298   ScaleFactor scale()            const { return _scale; }
   299   int         disp()             const { return _disp;  }
   301   // Convert the raw encoding form into the form expected by the constructor for
   302   // Address.  An index of 4 (rsp) corresponds to having no index, so convert
   303   // that to noreg for the Address constructor.
   304   static Address make_raw(int base, int index, int scale, int disp, relocInfo::relocType disp_reloc);
   306   static Address make_array(ArrayAddress);
   308  private:
   309   bool base_needs_rex() const {
   310     return _base != noreg && _base->encoding() >= 8;
   311   }
   313   bool index_needs_rex() const {
   314     return _index != noreg &&_index->encoding() >= 8;
   315   }
   317   relocInfo::relocType reloc() const { return _rspec.type(); }
   319   friend class Assembler;
   320   friend class MacroAssembler;
   321   friend class LIR_Assembler; // base/index/scale/disp
   322 };
   324 //
   325 // AddressLiteral has been split out from Address because operands of this type
   326 // need to be treated specially on 32bit vs. 64bit platforms. By splitting it out
   327 // the few instructions that need to deal with address literals are unique and the
   328 // MacroAssembler does not have to implement every instruction in the Assembler
   329 // in order to search for address literals that may need special handling depending
   330 // on the instruction and the platform. As small step on the way to merging i486/amd64
   331 // directories.
   332 //
   333 class AddressLiteral VALUE_OBJ_CLASS_SPEC {
   334   friend class ArrayAddress;
   335   RelocationHolder _rspec;
   336   // Typically we use AddressLiterals we want to use their rval
   337   // However in some situations we want the lval (effect address) of the item.
   338   // We provide a special factory for making those lvals.
   339   bool _is_lval;
   341   // If the target is far we'll need to load the ea of this to
   342   // a register to reach it. Otherwise if near we can do rip
   343   // relative addressing.
   345   address          _target;
   347  protected:
   348   // creation
   349   AddressLiteral()
   350     : _is_lval(false),
   351       _target(NULL)
   352   {}
   354   public:
   357   AddressLiteral(address target, relocInfo::relocType rtype);
   359   AddressLiteral(address target, RelocationHolder const& rspec)
   360     : _rspec(rspec),
   361       _is_lval(false),
   362       _target(target)
   363   {}
   365   AddressLiteral addr() {
   366     AddressLiteral ret = *this;
   367     ret._is_lval = true;
   368     return ret;
   369   }
   372  private:
   374   address target() { return _target; }
   375   bool is_lval() { return _is_lval; }
   377   relocInfo::relocType reloc() const { return _rspec.type(); }
   378   const RelocationHolder& rspec() const { return _rspec; }
   380   friend class Assembler;
   381   friend class MacroAssembler;
   382   friend class Address;
   383   friend class LIR_Assembler;
   384 };
   386 // Convience classes
   387 class RuntimeAddress: public AddressLiteral {
   389   public:
   391   RuntimeAddress(address target) : AddressLiteral(target, relocInfo::runtime_call_type) {}
   393 };
   395 class ExternalAddress: public AddressLiteral {
   396  private:
   397   static relocInfo::relocType reloc_for_target(address target) {
   398     // Sometimes ExternalAddress is used for values which aren't
   399     // exactly addresses, like the card table base.
   400     // external_word_type can't be used for values in the first page
   401     // so just skip the reloc in that case.
   402     return external_word_Relocation::can_be_relocated(target) ? relocInfo::external_word_type : relocInfo::none;
   403   }
   405  public:
   407   ExternalAddress(address target) : AddressLiteral(target, reloc_for_target(target)) {}
   409 };
   411 class InternalAddress: public AddressLiteral {
   413   public:
   415   InternalAddress(address target) : AddressLiteral(target, relocInfo::internal_word_type) {}
   417 };
   419 // x86 can do array addressing as a single operation since disp can be an absolute
   420 // address amd64 can't. We create a class that expresses the concept but does extra
   421 // magic on amd64 to get the final result
   423 class ArrayAddress VALUE_OBJ_CLASS_SPEC {
   424   private:
   426   AddressLiteral _base;
   427   Address        _index;
   429   public:
   431   ArrayAddress() {};
   432   ArrayAddress(AddressLiteral base, Address index): _base(base), _index(index) {};
   433   AddressLiteral base() { return _base; }
   434   Address index() { return _index; }
   436 };
   438 const int FPUStateSizeInWords = NOT_LP64(27) LP64_ONLY( 512 / wordSize);
   440 // The Intel x86/Amd64 Assembler: Pure assembler doing NO optimizations on the instruction
   441 // level (e.g. mov rax, 0 is not translated into xor rax, rax!); i.e., what you write
   442 // is what you get. The Assembler is generating code into a CodeBuffer.
   444 class Assembler : public AbstractAssembler  {
   445   friend class AbstractAssembler; // for the non-virtual hack
   446   friend class LIR_Assembler; // as_Address()
   447   friend class StubGenerator;
   449  public:
   450   enum Condition {                     // The x86 condition codes used for conditional jumps/moves.
   451     zero          = 0x4,
   452     notZero       = 0x5,
   453     equal         = 0x4,
   454     notEqual      = 0x5,
   455     less          = 0xc,
   456     lessEqual     = 0xe,
   457     greater       = 0xf,
   458     greaterEqual  = 0xd,
   459     below         = 0x2,
   460     belowEqual    = 0x6,
   461     above         = 0x7,
   462     aboveEqual    = 0x3,
   463     overflow      = 0x0,
   464     noOverflow    = 0x1,
   465     carrySet      = 0x2,
   466     carryClear    = 0x3,
   467     negative      = 0x8,
   468     positive      = 0x9,
   469     parity        = 0xa,
   470     noParity      = 0xb
   471   };
   473   enum Prefix {
   474     // segment overrides
   475     CS_segment = 0x2e,
   476     SS_segment = 0x36,
   477     DS_segment = 0x3e,
   478     ES_segment = 0x26,
   479     FS_segment = 0x64,
   480     GS_segment = 0x65,
   482     REX        = 0x40,
   484     REX_B      = 0x41,
   485     REX_X      = 0x42,
   486     REX_XB     = 0x43,
   487     REX_R      = 0x44,
   488     REX_RB     = 0x45,
   489     REX_RX     = 0x46,
   490     REX_RXB    = 0x47,
   492     REX_W      = 0x48,
   494     REX_WB     = 0x49,
   495     REX_WX     = 0x4A,
   496     REX_WXB    = 0x4B,
   497     REX_WR     = 0x4C,
   498     REX_WRB    = 0x4D,
   499     REX_WRX    = 0x4E,
   500     REX_WRXB   = 0x4F,
   502     VEX_3bytes = 0xC4,
   503     VEX_2bytes = 0xC5
   504   };
   506   enum VexPrefix {
   507     VEX_B = 0x20,
   508     VEX_X = 0x40,
   509     VEX_R = 0x80,
   510     VEX_W = 0x80
   511   };
   513   enum VexSimdPrefix {
   514     VEX_SIMD_NONE = 0x0,
   515     VEX_SIMD_66   = 0x1,
   516     VEX_SIMD_F3   = 0x2,
   517     VEX_SIMD_F2   = 0x3
   518   };
   520   enum VexOpcode {
   521     VEX_OPCODE_NONE  = 0x0,
   522     VEX_OPCODE_0F    = 0x1,
   523     VEX_OPCODE_0F_38 = 0x2,
   524     VEX_OPCODE_0F_3A = 0x3
   525   };
   527   enum WhichOperand {
   528     // input to locate_operand, and format code for relocations
   529     imm_operand  = 0,            // embedded 32-bit|64-bit immediate operand
   530     disp32_operand = 1,          // embedded 32-bit displacement or address
   531     call32_operand = 2,          // embedded 32-bit self-relative displacement
   532 #ifndef _LP64
   533     _WhichOperand_limit = 3
   534 #else
   535      narrow_oop_operand = 3,     // embedded 32-bit immediate narrow oop
   536     _WhichOperand_limit = 4
   537 #endif
   538   };
   542   // NOTE: The general philopsophy of the declarations here is that 64bit versions
   543   // of instructions are freely declared without the need for wrapping them an ifdef.
   544   // (Some dangerous instructions are ifdef's out of inappropriate jvm's.)
   545   // In the .cpp file the implementations are wrapped so that they are dropped out
   546   // of the resulting jvm. This is done mostly to keep the footprint of MINIMAL
   547   // to the size it was prior to merging up the 32bit and 64bit assemblers.
   548   //
   549   // This does mean you'll get a linker/runtime error if you use a 64bit only instruction
   550   // in a 32bit vm. This is somewhat unfortunate but keeps the ifdef noise down.
   552 private:
   555   // 64bit prefixes
   556   int prefix_and_encode(int reg_enc, bool byteinst = false);
   557   int prefixq_and_encode(int reg_enc);
   559   int prefix_and_encode(int dst_enc, int src_enc, bool byteinst = false);
   560   int prefixq_and_encode(int dst_enc, int src_enc);
   562   void prefix(Register reg);
   563   void prefix(Address adr);
   564   void prefixq(Address adr);
   566   void prefix(Address adr, Register reg,  bool byteinst = false);
   567   void prefix(Address adr, XMMRegister reg);
   568   void prefixq(Address adr, Register reg);
   569   void prefixq(Address adr, XMMRegister reg);
   571   void prefetch_prefix(Address src);
   573   void rex_prefix(Address adr, XMMRegister xreg,
   574                   VexSimdPrefix pre, VexOpcode opc, bool rex_w);
   575   int  rex_prefix_and_encode(int dst_enc, int src_enc,
   576                              VexSimdPrefix pre, VexOpcode opc, bool rex_w);
   578   void vex_prefix(bool vex_r, bool vex_b, bool vex_x, bool vex_w,
   579                   int nds_enc, VexSimdPrefix pre, VexOpcode opc,
   580                   bool vector256);
   582   void vex_prefix(Address adr, int nds_enc, int xreg_enc,
   583                   VexSimdPrefix pre, VexOpcode opc,
   584                   bool vex_w, bool vector256);
   586   void vex_prefix(XMMRegister dst, XMMRegister nds, Address src,
   587                   VexSimdPrefix pre, bool vector256 = false) {
   588     int dst_enc = dst->encoding();
   589     int nds_enc = nds->is_valid() ? nds->encoding() : 0;
   590     vex_prefix(src, nds_enc, dst_enc, pre, VEX_OPCODE_0F, false, vector256);
   591   }
   593   int  vex_prefix_and_encode(int dst_enc, int nds_enc, int src_enc,
   594                              VexSimdPrefix pre, VexOpcode opc,
   595                              bool vex_w, bool vector256);
   597   int  vex_prefix_and_encode(XMMRegister dst, XMMRegister nds, XMMRegister src,
   598                              VexSimdPrefix pre, bool vector256 = false,
   599                              VexOpcode opc = VEX_OPCODE_0F) {
   600     int src_enc = src->encoding();
   601     int dst_enc = dst->encoding();
   602     int nds_enc = nds->is_valid() ? nds->encoding() : 0;
   603     return vex_prefix_and_encode(dst_enc, nds_enc, src_enc, pre, opc, false, vector256);
   604   }
   606   void simd_prefix(XMMRegister xreg, XMMRegister nds, Address adr,
   607                    VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F,
   608                    bool rex_w = false, bool vector256 = false);
   610   void simd_prefix(XMMRegister dst, Address src,
   611                    VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F) {
   612     simd_prefix(dst, xnoreg, src, pre, opc);
   613   }
   615   void simd_prefix(Address dst, XMMRegister src, VexSimdPrefix pre) {
   616     simd_prefix(src, dst, pre);
   617   }
   618   void simd_prefix_q(XMMRegister dst, XMMRegister nds, Address src,
   619                      VexSimdPrefix pre) {
   620     bool rex_w = true;
   621     simd_prefix(dst, nds, src, pre, VEX_OPCODE_0F, rex_w);
   622   }
   624   int simd_prefix_and_encode(XMMRegister dst, XMMRegister nds, XMMRegister src,
   625                              VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F,
   626                              bool rex_w = false, bool vector256 = false);
   628   // Move/convert 32-bit integer value.
   629   int simd_prefix_and_encode(XMMRegister dst, XMMRegister nds, Register src,
   630                              VexSimdPrefix pre) {
   631     // It is OK to cast from Register to XMMRegister to pass argument here
   632     // since only encoding is used in simd_prefix_and_encode() and number of
   633     // Gen and Xmm registers are the same.
   634     return simd_prefix_and_encode(dst, nds, as_XMMRegister(src->encoding()), pre);
   635   }
   636   int simd_prefix_and_encode(XMMRegister dst, Register src, VexSimdPrefix pre) {
   637     return simd_prefix_and_encode(dst, xnoreg, src, pre);
   638   }
   639   int simd_prefix_and_encode(Register dst, XMMRegister src,
   640                              VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F) {
   641     return simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, pre, opc);
   642   }
   644   // Move/convert 64-bit integer value.
   645   int simd_prefix_and_encode_q(XMMRegister dst, XMMRegister nds, Register src,
   646                                VexSimdPrefix pre) {
   647     bool rex_w = true;
   648     return simd_prefix_and_encode(dst, nds, as_XMMRegister(src->encoding()), pre, VEX_OPCODE_0F, rex_w);
   649   }
   650   int simd_prefix_and_encode_q(XMMRegister dst, Register src, VexSimdPrefix pre) {
   651     return simd_prefix_and_encode_q(dst, xnoreg, src, pre);
   652   }
   653   int simd_prefix_and_encode_q(Register dst, XMMRegister src,
   654                              VexSimdPrefix pre, VexOpcode opc = VEX_OPCODE_0F) {
   655     bool rex_w = true;
   656     return simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, pre, opc, rex_w);
   657   }
   659   // Helper functions for groups of instructions
   660   void emit_arith_b(int op1, int op2, Register dst, int imm8);
   662   void emit_arith(int op1, int op2, Register dst, int32_t imm32);
   663   // Force generation of a 4 byte immediate value even if it fits into 8bit
   664   void emit_arith_imm32(int op1, int op2, Register dst, int32_t imm32);
   665   void emit_arith(int op1, int op2, Register dst, Register src);
   667   void emit_simd_arith(int opcode, XMMRegister dst, Address src, VexSimdPrefix pre);
   668   void emit_simd_arith(int opcode, XMMRegister dst, XMMRegister src, VexSimdPrefix pre);
   669   void emit_simd_arith_nonds(int opcode, XMMRegister dst, Address src, VexSimdPrefix pre);
   670   void emit_simd_arith_nonds(int opcode, XMMRegister dst, XMMRegister src, VexSimdPrefix pre);
   671   void emit_vex_arith(int opcode, XMMRegister dst, XMMRegister nds,
   672                       Address src, VexSimdPrefix pre, bool vector256);
   673   void emit_vex_arith(int opcode, XMMRegister dst, XMMRegister nds,
   674                       XMMRegister src, VexSimdPrefix pre, bool vector256);
   676   void emit_operand(Register reg,
   677                     Register base, Register index, Address::ScaleFactor scale,
   678                     int disp,
   679                     RelocationHolder const& rspec,
   680                     int rip_relative_correction = 0);
   682   void emit_operand(Register reg, Address adr, int rip_relative_correction = 0);
   684   // operands that only take the original 32bit registers
   685   void emit_operand32(Register reg, Address adr);
   687   void emit_operand(XMMRegister reg,
   688                     Register base, Register index, Address::ScaleFactor scale,
   689                     int disp,
   690                     RelocationHolder const& rspec);
   692   void emit_operand(XMMRegister reg, Address adr);
   694   void emit_operand(MMXRegister reg, Address adr);
   696   // workaround gcc (3.2.1-7) bug
   697   void emit_operand(Address adr, MMXRegister reg);
   700   // Immediate-to-memory forms
   701   void emit_arith_operand(int op1, Register rm, Address adr, int32_t imm32);
   703   void emit_farith(int b1, int b2, int i);
   706  protected:
   707   #ifdef ASSERT
   708   void check_relocation(RelocationHolder const& rspec, int format);
   709   #endif
   711   void emit_data(jint data, relocInfo::relocType    rtype, int format);
   712   void emit_data(jint data, RelocationHolder const& rspec, int format);
   713   void emit_data64(jlong data, relocInfo::relocType rtype, int format = 0);
   714   void emit_data64(jlong data, RelocationHolder const& rspec, int format = 0);
   716   bool reachable(AddressLiteral adr) NOT_LP64({ return true;});
   718   // These are all easily abused and hence protected
   720   // 32BIT ONLY SECTION
   721 #ifndef _LP64
   722   // Make these disappear in 64bit mode since they would never be correct
   723   void cmp_literal32(Register src1, int32_t imm32, RelocationHolder const& rspec);   // 32BIT ONLY
   724   void cmp_literal32(Address src1, int32_t imm32, RelocationHolder const& rspec);    // 32BIT ONLY
   726   void mov_literal32(Register dst, int32_t imm32, RelocationHolder const& rspec);    // 32BIT ONLY
   727   void mov_literal32(Address dst, int32_t imm32, RelocationHolder const& rspec);     // 32BIT ONLY
   729   void push_literal32(int32_t imm32, RelocationHolder const& rspec);                 // 32BIT ONLY
   730 #else
   731   // 64BIT ONLY SECTION
   732   void mov_literal64(Register dst, intptr_t imm64, RelocationHolder const& rspec);   // 64BIT ONLY
   734   void cmp_narrow_oop(Register src1, int32_t imm32, RelocationHolder const& rspec);
   735   void cmp_narrow_oop(Address src1, int32_t imm32, RelocationHolder const& rspec);
   737   void mov_narrow_oop(Register dst, int32_t imm32, RelocationHolder const& rspec);
   738   void mov_narrow_oop(Address dst, int32_t imm32, RelocationHolder const& rspec);
   739 #endif // _LP64
   741   // These are unique in that we are ensured by the caller that the 32bit
   742   // relative in these instructions will always be able to reach the potentially
   743   // 64bit address described by entry. Since they can take a 64bit address they
   744   // don't have the 32 suffix like the other instructions in this class.
   746   void call_literal(address entry, RelocationHolder const& rspec);
   747   void jmp_literal(address entry, RelocationHolder const& rspec);
   749   // Avoid using directly section
   750   // Instructions in this section are actually usable by anyone without danger
   751   // of failure but have performance issues that are addressed my enhanced
   752   // instructions which will do the proper thing base on the particular cpu.
   753   // We protect them because we don't trust you...
   755   // Don't use next inc() and dec() methods directly. INC & DEC instructions
   756   // could cause a partial flag stall since they don't set CF flag.
   757   // Use MacroAssembler::decrement() & MacroAssembler::increment() methods
   758   // which call inc() & dec() or add() & sub() in accordance with
   759   // the product flag UseIncDec value.
   761   void decl(Register dst);
   762   void decl(Address dst);
   763   void decq(Register dst);
   764   void decq(Address dst);
   766   void incl(Register dst);
   767   void incl(Address dst);
   768   void incq(Register dst);
   769   void incq(Address dst);
   771   // New cpus require use of movsd and movss to avoid partial register stall
   772   // when loading from memory. But for old Opteron use movlpd instead of movsd.
   773   // The selection is done in MacroAssembler::movdbl() and movflt().
   775   // Move Scalar Single-Precision Floating-Point Values
   776   void movss(XMMRegister dst, Address src);
   777   void movss(XMMRegister dst, XMMRegister src);
   778   void movss(Address dst, XMMRegister src);
   780   // Move Scalar Double-Precision Floating-Point Values
   781   void movsd(XMMRegister dst, Address src);
   782   void movsd(XMMRegister dst, XMMRegister src);
   783   void movsd(Address dst, XMMRegister src);
   784   void movlpd(XMMRegister dst, Address src);
   786   // New cpus require use of movaps and movapd to avoid partial register stall
   787   // when moving between registers.
   788   void movaps(XMMRegister dst, XMMRegister src);
   789   void movapd(XMMRegister dst, XMMRegister src);
   791   // End avoid using directly
   794   // Instruction prefixes
   795   void prefix(Prefix p);
   797   public:
   799   // Creation
   800   Assembler(CodeBuffer* code) : AbstractAssembler(code) {}
   802   // Decoding
   803   static address locate_operand(address inst, WhichOperand which);
   804   static address locate_next_instruction(address inst);
   806   // Utilities
   807   static bool is_polling_page_far() NOT_LP64({ return false;});
   809   // Generic instructions
   810   // Does 32bit or 64bit as needed for the platform. In some sense these
   811   // belong in macro assembler but there is no need for both varieties to exist
   813   void lea(Register dst, Address src);
   815   void mov(Register dst, Register src);
   817   void pusha();
   818   void popa();
   820   void pushf();
   821   void popf();
   823   void push(int32_t imm32);
   825   void push(Register src);
   827   void pop(Register dst);
   829   // These are dummies to prevent surprise implicit conversions to Register
   830   void push(void* v);
   831   void pop(void* v);
   833   // These do register sized moves/scans
   834   void rep_mov();
   835   void rep_stos();
   836   void rep_stosb();
   837   void repne_scan();
   838 #ifdef _LP64
   839   void repne_scanl();
   840 #endif
   842   // Vanilla instructions in lexical order
   844   void adcl(Address dst, int32_t imm32);
   845   void adcl(Address dst, Register src);
   846   void adcl(Register dst, int32_t imm32);
   847   void adcl(Register dst, Address src);
   848   void adcl(Register dst, Register src);
   850   void adcq(Register dst, int32_t imm32);
   851   void adcq(Register dst, Address src);
   852   void adcq(Register dst, Register src);
   854   void addl(Address dst, int32_t imm32);
   855   void addl(Address dst, Register src);
   856   void addl(Register dst, int32_t imm32);
   857   void addl(Register dst, Address src);
   858   void addl(Register dst, Register src);
   860   void addq(Address dst, int32_t imm32);
   861   void addq(Address dst, Register src);
   862   void addq(Register dst, int32_t imm32);
   863   void addq(Register dst, Address src);
   864   void addq(Register dst, Register src);
   866   void addr_nop_4();
   867   void addr_nop_5();
   868   void addr_nop_7();
   869   void addr_nop_8();
   871   // Add Scalar Double-Precision Floating-Point Values
   872   void addsd(XMMRegister dst, Address src);
   873   void addsd(XMMRegister dst, XMMRegister src);
   875   // Add Scalar Single-Precision Floating-Point Values
   876   void addss(XMMRegister dst, Address src);
   877   void addss(XMMRegister dst, XMMRegister src);
   879   // AES instructions
   880   void aesdec(XMMRegister dst, Address src);
   881   void aesdec(XMMRegister dst, XMMRegister src);
   882   void aesdeclast(XMMRegister dst, Address src);
   883   void aesdeclast(XMMRegister dst, XMMRegister src);
   884   void aesenc(XMMRegister dst, Address src);
   885   void aesenc(XMMRegister dst, XMMRegister src);
   886   void aesenclast(XMMRegister dst, Address src);
   887   void aesenclast(XMMRegister dst, XMMRegister src);
   890   void andl(Address  dst, int32_t imm32);
   891   void andl(Register dst, int32_t imm32);
   892   void andl(Register dst, Address src);
   893   void andl(Register dst, Register src);
   895   void andq(Address  dst, int32_t imm32);
   896   void andq(Register dst, int32_t imm32);
   897   void andq(Register dst, Address src);
   898   void andq(Register dst, Register src);
   900   void bsfl(Register dst, Register src);
   901   void bsrl(Register dst, Register src);
   903 #ifdef _LP64
   904   void bsfq(Register dst, Register src);
   905   void bsrq(Register dst, Register src);
   906 #endif
   908   void bswapl(Register reg);
   910   void bswapq(Register reg);
   912   void call(Label& L, relocInfo::relocType rtype);
   913   void call(Register reg);  // push pc; pc <- reg
   914   void call(Address adr);   // push pc; pc <- adr
   916   void cdql();
   918   void cdqq();
   920   void cld();
   922   void clflush(Address adr);
   924   void cmovl(Condition cc, Register dst, Register src);
   925   void cmovl(Condition cc, Register dst, Address src);
   927   void cmovq(Condition cc, Register dst, Register src);
   928   void cmovq(Condition cc, Register dst, Address src);
   931   void cmpb(Address dst, int imm8);
   933   void cmpl(Address dst, int32_t imm32);
   935   void cmpl(Register dst, int32_t imm32);
   936   void cmpl(Register dst, Register src);
   937   void cmpl(Register dst, Address src);
   939   void cmpq(Address dst, int32_t imm32);
   940   void cmpq(Address dst, Register src);
   942   void cmpq(Register dst, int32_t imm32);
   943   void cmpq(Register dst, Register src);
   944   void cmpq(Register dst, Address src);
   946   // these are dummies used to catch attempting to convert NULL to Register
   947   void cmpl(Register dst, void* junk); // dummy
   948   void cmpq(Register dst, void* junk); // dummy
   950   void cmpw(Address dst, int imm16);
   952   void cmpxchg8 (Address adr);
   954   void cmpxchgl(Register reg, Address adr);
   956   void cmpxchgq(Register reg, Address adr);
   958   // Ordered Compare Scalar Double-Precision Floating-Point Values and set EFLAGS
   959   void comisd(XMMRegister dst, Address src);
   960   void comisd(XMMRegister dst, XMMRegister src);
   962   // Ordered Compare Scalar Single-Precision Floating-Point Values and set EFLAGS
   963   void comiss(XMMRegister dst, Address src);
   964   void comiss(XMMRegister dst, XMMRegister src);
   966   // Identify processor type and features
   967   void cpuid();
   969   // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value
   970   void cvtsd2ss(XMMRegister dst, XMMRegister src);
   971   void cvtsd2ss(XMMRegister dst, Address src);
   973   // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value
   974   void cvtsi2sdl(XMMRegister dst, Register src);
   975   void cvtsi2sdl(XMMRegister dst, Address src);
   976   void cvtsi2sdq(XMMRegister dst, Register src);
   977   void cvtsi2sdq(XMMRegister dst, Address src);
   979   // Convert Doubleword Integer to Scalar Single-Precision Floating-Point Value
   980   void cvtsi2ssl(XMMRegister dst, Register src);
   981   void cvtsi2ssl(XMMRegister dst, Address src);
   982   void cvtsi2ssq(XMMRegister dst, Register src);
   983   void cvtsi2ssq(XMMRegister dst, Address src);
   985   // Convert Packed Signed Doubleword Integers to Packed Double-Precision Floating-Point Value
   986   void cvtdq2pd(XMMRegister dst, XMMRegister src);
   988   // Convert Packed Signed Doubleword Integers to Packed Single-Precision Floating-Point Value
   989   void cvtdq2ps(XMMRegister dst, XMMRegister src);
   991   // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value
   992   void cvtss2sd(XMMRegister dst, XMMRegister src);
   993   void cvtss2sd(XMMRegister dst, Address src);
   995   // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer
   996   void cvttsd2sil(Register dst, Address src);
   997   void cvttsd2sil(Register dst, XMMRegister src);
   998   void cvttsd2siq(Register dst, XMMRegister src);
  1000   // Convert with Truncation Scalar Single-Precision Floating-Point Value to Doubleword Integer
  1001   void cvttss2sil(Register dst, XMMRegister src);
  1002   void cvttss2siq(Register dst, XMMRegister src);
  1004   // Divide Scalar Double-Precision Floating-Point Values
  1005   void divsd(XMMRegister dst, Address src);
  1006   void divsd(XMMRegister dst, XMMRegister src);
  1008   // Divide Scalar Single-Precision Floating-Point Values
  1009   void divss(XMMRegister dst, Address src);
  1010   void divss(XMMRegister dst, XMMRegister src);
  1012   void emms();
  1014   void fabs();
  1016   void fadd(int i);
  1018   void fadd_d(Address src);
  1019   void fadd_s(Address src);
  1021   // "Alternate" versions of x87 instructions place result down in FPU
  1022   // stack instead of on TOS
  1024   void fadda(int i); // "alternate" fadd
  1025   void faddp(int i = 1);
  1027   void fchs();
  1029   void fcom(int i);
  1031   void fcomp(int i = 1);
  1032   void fcomp_d(Address src);
  1033   void fcomp_s(Address src);
  1035   void fcompp();
  1037   void fcos();
  1039   void fdecstp();
  1041   void fdiv(int i);
  1042   void fdiv_d(Address src);
  1043   void fdivr_s(Address src);
  1044   void fdiva(int i);  // "alternate" fdiv
  1045   void fdivp(int i = 1);
  1047   void fdivr(int i);
  1048   void fdivr_d(Address src);
  1049   void fdiv_s(Address src);
  1051   void fdivra(int i); // "alternate" reversed fdiv
  1053   void fdivrp(int i = 1);
  1055   void ffree(int i = 0);
  1057   void fild_d(Address adr);
  1058   void fild_s(Address adr);
  1060   void fincstp();
  1062   void finit();
  1064   void fist_s (Address adr);
  1065   void fistp_d(Address adr);
  1066   void fistp_s(Address adr);
  1068   void fld1();
  1070   void fld_d(Address adr);
  1071   void fld_s(Address adr);
  1072   void fld_s(int index);
  1073   void fld_x(Address adr);  // extended-precision (80-bit) format
  1075   void fldcw(Address src);
  1077   void fldenv(Address src);
  1079   void fldlg2();
  1081   void fldln2();
  1083   void fldz();
  1085   void flog();
  1086   void flog10();
  1088   void fmul(int i);
  1090   void fmul_d(Address src);
  1091   void fmul_s(Address src);
  1093   void fmula(int i);  // "alternate" fmul
  1095   void fmulp(int i = 1);
  1097   void fnsave(Address dst);
  1099   void fnstcw(Address src);
  1101   void fnstsw_ax();
  1103   void fprem();
  1104   void fprem1();
  1106   void frstor(Address src);
  1108   void fsin();
  1110   void fsqrt();
  1112   void fst_d(Address adr);
  1113   void fst_s(Address adr);
  1115   void fstp_d(Address adr);
  1116   void fstp_d(int index);
  1117   void fstp_s(Address adr);
  1118   void fstp_x(Address adr); // extended-precision (80-bit) format
  1120   void fsub(int i);
  1121   void fsub_d(Address src);
  1122   void fsub_s(Address src);
  1124   void fsuba(int i);  // "alternate" fsub
  1126   void fsubp(int i = 1);
  1128   void fsubr(int i);
  1129   void fsubr_d(Address src);
  1130   void fsubr_s(Address src);
  1132   void fsubra(int i); // "alternate" reversed fsub
  1134   void fsubrp(int i = 1);
  1136   void ftan();
  1138   void ftst();
  1140   void fucomi(int i = 1);
  1141   void fucomip(int i = 1);
  1143   void fwait();
  1145   void fxch(int i = 1);
  1147   void fxrstor(Address src);
  1149   void fxsave(Address dst);
  1151   void fyl2x();
  1152   void frndint();
  1153   void f2xm1();
  1154   void fldl2e();
  1156   void hlt();
  1158   void idivl(Register src);
  1159   void divl(Register src); // Unsigned division
  1161   void idivq(Register src);
  1163   void imull(Register dst, Register src);
  1164   void imull(Register dst, Register src, int value);
  1166   void imulq(Register dst, Register src);
  1167   void imulq(Register dst, Register src, int value);
  1170   // jcc is the generic conditional branch generator to run-
  1171   // time routines, jcc is used for branches to labels. jcc
  1172   // takes a branch opcode (cc) and a label (L) and generates
  1173   // either a backward branch or a forward branch and links it
  1174   // to the label fixup chain. Usage:
  1175   //
  1176   // Label L;      // unbound label
  1177   // jcc(cc, L);   // forward branch to unbound label
  1178   // bind(L);      // bind label to the current pc
  1179   // jcc(cc, L);   // backward branch to bound label
  1180   // bind(L);      // illegal: a label may be bound only once
  1181   //
  1182   // Note: The same Label can be used for forward and backward branches
  1183   // but it may be bound only once.
  1185   void jcc(Condition cc, Label& L, bool maybe_short = true);
  1187   // Conditional jump to a 8-bit offset to L.
  1188   // WARNING: be very careful using this for forward jumps.  If the label is
  1189   // not bound within an 8-bit offset of this instruction, a run-time error
  1190   // will occur.
  1191   void jccb(Condition cc, Label& L);
  1193   void jmp(Address entry);    // pc <- entry
  1195   // Label operations & relative jumps (PPUM Appendix D)
  1196   void jmp(Label& L, bool maybe_short = true);   // unconditional jump to L
  1198   void jmp(Register entry); // pc <- entry
  1200   // Unconditional 8-bit offset jump to L.
  1201   // WARNING: be very careful using this for forward jumps.  If the label is
  1202   // not bound within an 8-bit offset of this instruction, a run-time error
  1203   // will occur.
  1204   void jmpb(Label& L);
  1206   void ldmxcsr( Address src );
  1208   void leal(Register dst, Address src);
  1210   void leaq(Register dst, Address src);
  1212   void lfence();
  1214   void lock();
  1216   void lzcntl(Register dst, Register src);
  1218 #ifdef _LP64
  1219   void lzcntq(Register dst, Register src);
  1220 #endif
  1222   enum Membar_mask_bits {
  1223     StoreStore = 1 << 3,
  1224     LoadStore  = 1 << 2,
  1225     StoreLoad  = 1 << 1,
  1226     LoadLoad   = 1 << 0
  1227   };
  1229   // Serializes memory and blows flags
  1230   void membar(Membar_mask_bits order_constraint) {
  1231     if (os::is_MP()) {
  1232       // We only have to handle StoreLoad
  1233       if (order_constraint & StoreLoad) {
  1234         // All usable chips support "locked" instructions which suffice
  1235         // as barriers, and are much faster than the alternative of
  1236         // using cpuid instruction. We use here a locked add [esp],0.
  1237         // This is conveniently otherwise a no-op except for blowing
  1238         // flags.
  1239         // Any change to this code may need to revisit other places in
  1240         // the code where this idiom is used, in particular the
  1241         // orderAccess code.
  1242         lock();
  1243         addl(Address(rsp, 0), 0);// Assert the lock# signal here
  1248   void mfence();
  1250   // Moves
  1252   void mov64(Register dst, int64_t imm64);
  1254   void movb(Address dst, Register src);
  1255   void movb(Address dst, int imm8);
  1256   void movb(Register dst, Address src);
  1258   void movdl(XMMRegister dst, Register src);
  1259   void movdl(Register dst, XMMRegister src);
  1260   void movdl(XMMRegister dst, Address src);
  1261   void movdl(Address dst, XMMRegister src);
  1263   // Move Double Quadword
  1264   void movdq(XMMRegister dst, Register src);
  1265   void movdq(Register dst, XMMRegister src);
  1267   // Move Aligned Double Quadword
  1268   void movdqa(XMMRegister dst, XMMRegister src);
  1270   // Move Unaligned Double Quadword
  1271   void movdqu(Address     dst, XMMRegister src);
  1272   void movdqu(XMMRegister dst, Address src);
  1273   void movdqu(XMMRegister dst, XMMRegister src);
  1275   // Move Unaligned 256bit Vector
  1276   void vmovdqu(Address dst, XMMRegister src);
  1277   void vmovdqu(XMMRegister dst, Address src);
  1278   void vmovdqu(XMMRegister dst, XMMRegister src);
  1280   // Move lower 64bit to high 64bit in 128bit register
  1281   void movlhps(XMMRegister dst, XMMRegister src);
  1283   void movl(Register dst, int32_t imm32);
  1284   void movl(Address dst, int32_t imm32);
  1285   void movl(Register dst, Register src);
  1286   void movl(Register dst, Address src);
  1287   void movl(Address dst, Register src);
  1289   // These dummies prevent using movl from converting a zero (like NULL) into Register
  1290   // by giving the compiler two choices it can't resolve
  1292   void movl(Address  dst, void* junk);
  1293   void movl(Register dst, void* junk);
  1295 #ifdef _LP64
  1296   void movq(Register dst, Register src);
  1297   void movq(Register dst, Address src);
  1298   void movq(Address  dst, Register src);
  1299 #endif
  1301   void movq(Address     dst, MMXRegister src );
  1302   void movq(MMXRegister dst, Address src );
  1304 #ifdef _LP64
  1305   // These dummies prevent using movq from converting a zero (like NULL) into Register
  1306   // by giving the compiler two choices it can't resolve
  1308   void movq(Address  dst, void* dummy);
  1309   void movq(Register dst, void* dummy);
  1310 #endif
  1312   // Move Quadword
  1313   void movq(Address     dst, XMMRegister src);
  1314   void movq(XMMRegister dst, Address src);
  1316   void movsbl(Register dst, Address src);
  1317   void movsbl(Register dst, Register src);
  1319 #ifdef _LP64
  1320   void movsbq(Register dst, Address src);
  1321   void movsbq(Register dst, Register src);
  1323   // Move signed 32bit immediate to 64bit extending sign
  1324   void movslq(Address  dst, int32_t imm64);
  1325   void movslq(Register dst, int32_t imm64);
  1327   void movslq(Register dst, Address src);
  1328   void movslq(Register dst, Register src);
  1329   void movslq(Register dst, void* src); // Dummy declaration to cause NULL to be ambiguous
  1330 #endif
  1332   void movswl(Register dst, Address src);
  1333   void movswl(Register dst, Register src);
  1335 #ifdef _LP64
  1336   void movswq(Register dst, Address src);
  1337   void movswq(Register dst, Register src);
  1338 #endif
  1340   void movw(Address dst, int imm16);
  1341   void movw(Register dst, Address src);
  1342   void movw(Address dst, Register src);
  1344   void movzbl(Register dst, Address src);
  1345   void movzbl(Register dst, Register src);
  1347 #ifdef _LP64
  1348   void movzbq(Register dst, Address src);
  1349   void movzbq(Register dst, Register src);
  1350 #endif
  1352   void movzwl(Register dst, Address src);
  1353   void movzwl(Register dst, Register src);
  1355 #ifdef _LP64
  1356   void movzwq(Register dst, Address src);
  1357   void movzwq(Register dst, Register src);
  1358 #endif
  1360   void mull(Address src);
  1361   void mull(Register src);
  1363   // Multiply Scalar Double-Precision Floating-Point Values
  1364   void mulsd(XMMRegister dst, Address src);
  1365   void mulsd(XMMRegister dst, XMMRegister src);
  1367   // Multiply Scalar Single-Precision Floating-Point Values
  1368   void mulss(XMMRegister dst, Address src);
  1369   void mulss(XMMRegister dst, XMMRegister src);
  1371   void negl(Register dst);
  1373 #ifdef _LP64
  1374   void negq(Register dst);
  1375 #endif
  1377   void nop(int i = 1);
  1379   void notl(Register dst);
  1381 #ifdef _LP64
  1382   void notq(Register dst);
  1383 #endif
  1385   void orl(Address dst, int32_t imm32);
  1386   void orl(Register dst, int32_t imm32);
  1387   void orl(Register dst, Address src);
  1388   void orl(Register dst, Register src);
  1390   void orq(Address dst, int32_t imm32);
  1391   void orq(Register dst, int32_t imm32);
  1392   void orq(Register dst, Address src);
  1393   void orq(Register dst, Register src);
  1395   // Pack with unsigned saturation
  1396   void packuswb(XMMRegister dst, XMMRegister src);
  1397   void packuswb(XMMRegister dst, Address src);
  1399   // SSE4.2 string instructions
  1400   void pcmpestri(XMMRegister xmm1, XMMRegister xmm2, int imm8);
  1401   void pcmpestri(XMMRegister xmm1, Address src, int imm8);
  1403   // SSE4.1 packed move
  1404   void pmovzxbw(XMMRegister dst, XMMRegister src);
  1405   void pmovzxbw(XMMRegister dst, Address src);
  1407 #ifndef _LP64 // no 32bit push/pop on amd64
  1408   void popl(Address dst);
  1409 #endif
  1411 #ifdef _LP64
  1412   void popq(Address dst);
  1413 #endif
  1415   void popcntl(Register dst, Address src);
  1416   void popcntl(Register dst, Register src);
  1418 #ifdef _LP64
  1419   void popcntq(Register dst, Address src);
  1420   void popcntq(Register dst, Register src);
  1421 #endif
  1423   // Prefetches (SSE, SSE2, 3DNOW only)
  1425   void prefetchnta(Address src);
  1426   void prefetchr(Address src);
  1427   void prefetcht0(Address src);
  1428   void prefetcht1(Address src);
  1429   void prefetcht2(Address src);
  1430   void prefetchw(Address src);
  1432   // Shuffle Bytes
  1433   void pshufb(XMMRegister dst, XMMRegister src);
  1434   void pshufb(XMMRegister dst, Address src);
  1436   // Shuffle Packed Doublewords
  1437   void pshufd(XMMRegister dst, XMMRegister src, int mode);
  1438   void pshufd(XMMRegister dst, Address src,     int mode);
  1440   // Shuffle Packed Low Words
  1441   void pshuflw(XMMRegister dst, XMMRegister src, int mode);
  1442   void pshuflw(XMMRegister dst, Address src,     int mode);
  1444   // Shift Right by bytes Logical DoubleQuadword Immediate
  1445   void psrldq(XMMRegister dst, int shift);
  1447   // Logical Compare 128bit
  1448   void ptest(XMMRegister dst, XMMRegister src);
  1449   void ptest(XMMRegister dst, Address src);
  1450   // Logical Compare 256bit
  1451   void vptest(XMMRegister dst, XMMRegister src);
  1452   void vptest(XMMRegister dst, Address src);
  1454   // Interleave Low Bytes
  1455   void punpcklbw(XMMRegister dst, XMMRegister src);
  1456   void punpcklbw(XMMRegister dst, Address src);
  1458   // Interleave Low Doublewords
  1459   void punpckldq(XMMRegister dst, XMMRegister src);
  1460   void punpckldq(XMMRegister dst, Address src);
  1462   // Interleave Low Quadwords
  1463   void punpcklqdq(XMMRegister dst, XMMRegister src);
  1465 #ifndef _LP64 // no 32bit push/pop on amd64
  1466   void pushl(Address src);
  1467 #endif
  1469   void pushq(Address src);
  1471   void rcll(Register dst, int imm8);
  1473   void rclq(Register dst, int imm8);
  1475   void ret(int imm16);
  1477   void sahf();
  1479   void sarl(Register dst, int imm8);
  1480   void sarl(Register dst);
  1482   void sarq(Register dst, int imm8);
  1483   void sarq(Register dst);
  1485   void sbbl(Address dst, int32_t imm32);
  1486   void sbbl(Register dst, int32_t imm32);
  1487   void sbbl(Register dst, Address src);
  1488   void sbbl(Register dst, Register src);
  1490   void sbbq(Address dst, int32_t imm32);
  1491   void sbbq(Register dst, int32_t imm32);
  1492   void sbbq(Register dst, Address src);
  1493   void sbbq(Register dst, Register src);
  1495   void setb(Condition cc, Register dst);
  1497   void shldl(Register dst, Register src);
  1499   void shll(Register dst, int imm8);
  1500   void shll(Register dst);
  1502   void shlq(Register dst, int imm8);
  1503   void shlq(Register dst);
  1505   void shrdl(Register dst, Register src);
  1507   void shrl(Register dst, int imm8);
  1508   void shrl(Register dst);
  1510   void shrq(Register dst, int imm8);
  1511   void shrq(Register dst);
  1513   void smovl(); // QQQ generic?
  1515   // Compute Square Root of Scalar Double-Precision Floating-Point Value
  1516   void sqrtsd(XMMRegister dst, Address src);
  1517   void sqrtsd(XMMRegister dst, XMMRegister src);
  1519   // Compute Square Root of Scalar Single-Precision Floating-Point Value
  1520   void sqrtss(XMMRegister dst, Address src);
  1521   void sqrtss(XMMRegister dst, XMMRegister src);
  1523   void std();
  1525   void stmxcsr( Address dst );
  1527   void subl(Address dst, int32_t imm32);
  1528   void subl(Address dst, Register src);
  1529   void subl(Register dst, int32_t imm32);
  1530   void subl(Register dst, Address src);
  1531   void subl(Register dst, Register src);
  1533   void subq(Address dst, int32_t imm32);
  1534   void subq(Address dst, Register src);
  1535   void subq(Register dst, int32_t imm32);
  1536   void subq(Register dst, Address src);
  1537   void subq(Register dst, Register src);
  1539   // Force generation of a 4 byte immediate value even if it fits into 8bit
  1540   void subl_imm32(Register dst, int32_t imm32);
  1541   void subq_imm32(Register dst, int32_t imm32);
  1543   // Subtract Scalar Double-Precision Floating-Point Values
  1544   void subsd(XMMRegister dst, Address src);
  1545   void subsd(XMMRegister dst, XMMRegister src);
  1547   // Subtract Scalar Single-Precision Floating-Point Values
  1548   void subss(XMMRegister dst, Address src);
  1549   void subss(XMMRegister dst, XMMRegister src);
  1551   void testb(Register dst, int imm8);
  1553   void testl(Register dst, int32_t imm32);
  1554   void testl(Register dst, Register src);
  1555   void testl(Register dst, Address src);
  1557   void testq(Register dst, int32_t imm32);
  1558   void testq(Register dst, Register src);
  1561   // Unordered Compare Scalar Double-Precision Floating-Point Values and set EFLAGS
  1562   void ucomisd(XMMRegister dst, Address src);
  1563   void ucomisd(XMMRegister dst, XMMRegister src);
  1565   // Unordered Compare Scalar Single-Precision Floating-Point Values and set EFLAGS
  1566   void ucomiss(XMMRegister dst, Address src);
  1567   void ucomiss(XMMRegister dst, XMMRegister src);
  1569   void xaddl(Address dst, Register src);
  1571   void xaddq(Address dst, Register src);
  1573   void xchgl(Register reg, Address adr);
  1574   void xchgl(Register dst, Register src);
  1576   void xchgq(Register reg, Address adr);
  1577   void xchgq(Register dst, Register src);
  1579   // Get Value of Extended Control Register
  1580   void xgetbv();
  1582   void xorl(Register dst, int32_t imm32);
  1583   void xorl(Register dst, Address src);
  1584   void xorl(Register dst, Register src);
  1586   void xorq(Register dst, Address src);
  1587   void xorq(Register dst, Register src);
  1589   void set_byte_if_not_zero(Register dst); // sets reg to 1 if not zero, otherwise 0
  1591   // AVX 3-operands scalar instructions (encoded with VEX prefix)
  1593   void vaddsd(XMMRegister dst, XMMRegister nds, Address src);
  1594   void vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
  1595   void vaddss(XMMRegister dst, XMMRegister nds, Address src);
  1596   void vaddss(XMMRegister dst, XMMRegister nds, XMMRegister src);
  1597   void vdivsd(XMMRegister dst, XMMRegister nds, Address src);
  1598   void vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
  1599   void vdivss(XMMRegister dst, XMMRegister nds, Address src);
  1600   void vdivss(XMMRegister dst, XMMRegister nds, XMMRegister src);
  1601   void vmulsd(XMMRegister dst, XMMRegister nds, Address src);
  1602   void vmulsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
  1603   void vmulss(XMMRegister dst, XMMRegister nds, Address src);
  1604   void vmulss(XMMRegister dst, XMMRegister nds, XMMRegister src);
  1605   void vsubsd(XMMRegister dst, XMMRegister nds, Address src);
  1606   void vsubsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
  1607   void vsubss(XMMRegister dst, XMMRegister nds, Address src);
  1608   void vsubss(XMMRegister dst, XMMRegister nds, XMMRegister src);
  1611   //====================VECTOR ARITHMETIC=====================================
  1613   // Add Packed Floating-Point Values
  1614   void addpd(XMMRegister dst, XMMRegister src);
  1615   void addps(XMMRegister dst, XMMRegister src);
  1616   void vaddpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1617   void vaddps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1618   void vaddpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1619   void vaddps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1621   // Subtract Packed Floating-Point Values
  1622   void subpd(XMMRegister dst, XMMRegister src);
  1623   void subps(XMMRegister dst, XMMRegister src);
  1624   void vsubpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1625   void vsubps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1626   void vsubpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1627   void vsubps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1629   // Multiply Packed Floating-Point Values
  1630   void mulpd(XMMRegister dst, XMMRegister src);
  1631   void mulps(XMMRegister dst, XMMRegister src);
  1632   void vmulpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1633   void vmulps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1634   void vmulpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1635   void vmulps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1637   // Divide Packed Floating-Point Values
  1638   void divpd(XMMRegister dst, XMMRegister src);
  1639   void divps(XMMRegister dst, XMMRegister src);
  1640   void vdivpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1641   void vdivps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1642   void vdivpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1643   void vdivps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1645   // Bitwise Logical AND of Packed Floating-Point Values
  1646   void andpd(XMMRegister dst, XMMRegister src);
  1647   void andps(XMMRegister dst, XMMRegister src);
  1648   void vandpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1649   void vandps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1650   void vandpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1651   void vandps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1653   // Bitwise Logical XOR of Packed Floating-Point Values
  1654   void xorpd(XMMRegister dst, XMMRegister src);
  1655   void xorps(XMMRegister dst, XMMRegister src);
  1656   void vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1657   void vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1658   void vxorpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1659   void vxorps(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1661   // Add packed integers
  1662   void paddb(XMMRegister dst, XMMRegister src);
  1663   void paddw(XMMRegister dst, XMMRegister src);
  1664   void paddd(XMMRegister dst, XMMRegister src);
  1665   void paddq(XMMRegister dst, XMMRegister src);
  1666   void vpaddb(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1667   void vpaddw(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1668   void vpaddd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1669   void vpaddq(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1670   void vpaddb(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1671   void vpaddw(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1672   void vpaddd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1673   void vpaddq(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1675   // Sub packed integers
  1676   void psubb(XMMRegister dst, XMMRegister src);
  1677   void psubw(XMMRegister dst, XMMRegister src);
  1678   void psubd(XMMRegister dst, XMMRegister src);
  1679   void psubq(XMMRegister dst, XMMRegister src);
  1680   void vpsubb(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1681   void vpsubw(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1682   void vpsubd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1683   void vpsubq(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1684   void vpsubb(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1685   void vpsubw(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1686   void vpsubd(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1687   void vpsubq(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1689   // Multiply packed integers (only shorts and ints)
  1690   void pmullw(XMMRegister dst, XMMRegister src);
  1691   void pmulld(XMMRegister dst, XMMRegister src);
  1692   void vpmullw(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1693   void vpmulld(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1694   void vpmullw(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1695   void vpmulld(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1697   // Shift left packed integers
  1698   void psllw(XMMRegister dst, int shift);
  1699   void pslld(XMMRegister dst, int shift);
  1700   void psllq(XMMRegister dst, int shift);
  1701   void psllw(XMMRegister dst, XMMRegister shift);
  1702   void pslld(XMMRegister dst, XMMRegister shift);
  1703   void psllq(XMMRegister dst, XMMRegister shift);
  1704   void vpsllw(XMMRegister dst, XMMRegister src, int shift, bool vector256);
  1705   void vpslld(XMMRegister dst, XMMRegister src, int shift, bool vector256);
  1706   void vpsllq(XMMRegister dst, XMMRegister src, int shift, bool vector256);
  1707   void vpsllw(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
  1708   void vpslld(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
  1709   void vpsllq(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
  1711   // Logical shift right packed integers
  1712   void psrlw(XMMRegister dst, int shift);
  1713   void psrld(XMMRegister dst, int shift);
  1714   void psrlq(XMMRegister dst, int shift);
  1715   void psrlw(XMMRegister dst, XMMRegister shift);
  1716   void psrld(XMMRegister dst, XMMRegister shift);
  1717   void psrlq(XMMRegister dst, XMMRegister shift);
  1718   void vpsrlw(XMMRegister dst, XMMRegister src, int shift, bool vector256);
  1719   void vpsrld(XMMRegister dst, XMMRegister src, int shift, bool vector256);
  1720   void vpsrlq(XMMRegister dst, XMMRegister src, int shift, bool vector256);
  1721   void vpsrlw(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
  1722   void vpsrld(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
  1723   void vpsrlq(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
  1725   // Arithmetic shift right packed integers (only shorts and ints, no instructions for longs)
  1726   void psraw(XMMRegister dst, int shift);
  1727   void psrad(XMMRegister dst, int shift);
  1728   void psraw(XMMRegister dst, XMMRegister shift);
  1729   void psrad(XMMRegister dst, XMMRegister shift);
  1730   void vpsraw(XMMRegister dst, XMMRegister src, int shift, bool vector256);
  1731   void vpsrad(XMMRegister dst, XMMRegister src, int shift, bool vector256);
  1732   void vpsraw(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
  1733   void vpsrad(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256);
  1735   // And packed integers
  1736   void pand(XMMRegister dst, XMMRegister src);
  1737   void vpand(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1738   void vpand(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1740   // Or packed integers
  1741   void por(XMMRegister dst, XMMRegister src);
  1742   void vpor(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1743   void vpor(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1745   // Xor packed integers
  1746   void pxor(XMMRegister dst, XMMRegister src);
  1747   void vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256);
  1748   void vpxor(XMMRegister dst, XMMRegister nds, Address src, bool vector256);
  1750   // Copy low 128bit into high 128bit of YMM registers.
  1751   void vinsertf128h(XMMRegister dst, XMMRegister nds, XMMRegister src);
  1752   void vinserti128h(XMMRegister dst, XMMRegister nds, XMMRegister src);
  1754   // Load/store high 128bit of YMM registers which does not destroy other half.
  1755   void vinsertf128h(XMMRegister dst, Address src);
  1756   void vinserti128h(XMMRegister dst, Address src);
  1757   void vextractf128h(Address dst, XMMRegister src);
  1758   void vextracti128h(Address dst, XMMRegister src);
  1760   // duplicate 4-bytes integer data from src into 8 locations in dest
  1761   void vpbroadcastd(XMMRegister dst, XMMRegister src);
  1763   // AVX instruction which is used to clear upper 128 bits of YMM registers and
  1764   // to avoid transaction penalty between AVX and SSE states. There is no
  1765   // penalty if legacy SSE instructions are encoded using VEX prefix because
  1766   // they always clear upper 128 bits. It should be used before calling
  1767   // runtime code and native libraries.
  1768   void vzeroupper();
  1770  protected:
  1771   // Next instructions require address alignment 16 bytes SSE mode.
  1772   // They should be called only from corresponding MacroAssembler instructions.
  1773   void andpd(XMMRegister dst, Address src);
  1774   void andps(XMMRegister dst, Address src);
  1775   void xorpd(XMMRegister dst, Address src);
  1776   void xorps(XMMRegister dst, Address src);
  1778 };
  1780 #endif // CPU_X86_VM_ASSEMBLER_X86_HPP

mercurial