hotspot/src/cpu/x86/vm/x86_32.ad
changeset 30624 2e1803c8a26d
parent 30305 b92a97e1e9cb
child 31047 50c0dc40661c
equal deleted inserted replaced
30596:0322b394e7fd 30624:2e1803c8a26d
    99 reg_def FPR5H( SOC, SOC, Op_RegF, 5, as_FloatRegister(4)->as_VMReg()->next());
    99 reg_def FPR5H( SOC, SOC, Op_RegF, 5, as_FloatRegister(4)->as_VMReg()->next());
   100 reg_def FPR6L( SOC, SOC, Op_RegF, 6, as_FloatRegister(5)->as_VMReg());
   100 reg_def FPR6L( SOC, SOC, Op_RegF, 6, as_FloatRegister(5)->as_VMReg());
   101 reg_def FPR6H( SOC, SOC, Op_RegF, 6, as_FloatRegister(5)->as_VMReg()->next());
   101 reg_def FPR6H( SOC, SOC, Op_RegF, 6, as_FloatRegister(5)->as_VMReg()->next());
   102 reg_def FPR7L( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg());
   102 reg_def FPR7L( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg());
   103 reg_def FPR7H( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next());
   103 reg_def FPR7H( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next());
       
   104 //
       
   105 // Empty fill registers, which are never used, but supply alignment to xmm regs
       
   106 //
       
   107 reg_def FILL0( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(2));
       
   108 reg_def FILL1( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(3));
       
   109 reg_def FILL2( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(4));
       
   110 reg_def FILL3( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(5));
       
   111 reg_def FILL4( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(6));
       
   112 reg_def FILL5( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(7));
       
   113 reg_def FILL6( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(8));
       
   114 reg_def FILL7( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(9));
   104 
   115 
   105 // Specify priority of register selection within phases of register
   116 // Specify priority of register selection within phases of register
   106 // allocation.  Highest priority is first.  A useful heuristic is to
   117 // allocation.  Highest priority is first.  A useful heuristic is to
   107 // give registers a low priority when they are required by machine
   118 // give registers a low priority when they are required by machine
   108 // instructions, like EAX and EDX.  Registers which are used as
   119 // instructions, like EAX and EDX.  Registers which are used as
   110 // For the Intel integer registers, the equivalent Long pairs are
   121 // For the Intel integer registers, the equivalent Long pairs are
   111 // EDX:EAX, EBX:ECX, and EDI:EBP.
   122 // EDX:EAX, EBX:ECX, and EDI:EBP.
   112 alloc_class chunk0( ECX,   EBX,   EBP,   EDI,   EAX,   EDX,   ESI, ESP,
   123 alloc_class chunk0( ECX,   EBX,   EBP,   EDI,   EAX,   EDX,   ESI, ESP,
   113                     FPR0L, FPR0H, FPR1L, FPR1H, FPR2L, FPR2H,
   124                     FPR0L, FPR0H, FPR1L, FPR1H, FPR2L, FPR2H,
   114                     FPR3L, FPR3H, FPR4L, FPR4H, FPR5L, FPR5H,
   125                     FPR3L, FPR3H, FPR4L, FPR4H, FPR5L, FPR5H,
   115                     FPR6L, FPR6H, FPR7L, FPR7H );
   126                     FPR6L, FPR6H, FPR7L, FPR7H,
       
   127                     FILL0, FILL1, FILL2, FILL3, FILL4, FILL5, FILL6, FILL7);
   116 
   128 
   117 
   129 
   118 //----------Architecture Description Register Classes--------------------------
   130 //----------Architecture Description Register Classes--------------------------
   119 // Several register classes are automatically defined based upon information in
   131 // Several register classes are automatically defined based upon information in
   120 // this architecture description.
   132 // this architecture description.
   129 // Class for all registers
   141 // Class for all registers
   130 reg_class any_reg_with_ebp(EAX, EDX, EBP, EDI, ESI, ECX, EBX, ESP);
   142 reg_class any_reg_with_ebp(EAX, EDX, EBP, EDI, ESI, ECX, EBX, ESP);
   131 // Class for all registers (excluding EBP)
   143 // Class for all registers (excluding EBP)
   132 reg_class any_reg_no_ebp(EAX, EDX, EDI, ESI, ECX, EBX, ESP);
   144 reg_class any_reg_no_ebp(EAX, EDX, EDI, ESI, ECX, EBX, ESP);
   133 // Dynamic register class that selects at runtime between register classes
   145 // Dynamic register class that selects at runtime between register classes
   134 // any_reg and any_no_ebp_reg (depending on the value of the flag PreserveFramePointer). 
   146 // any_reg and any_no_ebp_reg (depending on the value of the flag PreserveFramePointer).
   135 // Equivalent to: return PreserveFramePointer ? any_no_ebp_reg : any_reg;
   147 // Equivalent to: return PreserveFramePointer ? any_no_ebp_reg : any_reg;
   136 reg_class_dynamic any_reg(any_reg_no_ebp, any_reg_with_ebp, %{ PreserveFramePointer %});
   148 reg_class_dynamic any_reg(any_reg_no_ebp, any_reg_with_ebp, %{ PreserveFramePointer %});
   137 
   149 
   138 // Class for general registers
   150 // Class for general registers
   139 reg_class int_reg_with_ebp(EAX, EDX, EBP, EDI, ESI, ECX, EBX);
   151 reg_class int_reg_with_ebp(EAX, EDX, EBP, EDI, ESI, ECX, EBX);
   277   Compile* C = Compile::current();
   289   Compile* C = Compile::current();
   278   if (C->in_24_bit_fp_mode()) {
   290   if (C->in_24_bit_fp_mode()) {
   279     size += 6; // fldcw
   291     size += 6; // fldcw
   280   }
   292   }
   281   if (C->max_vector_size() > 16) {
   293   if (C->max_vector_size() > 16) {
   282     size += 3; // vzeroupper
   294     if(UseAVX <= 2) {
       
   295       size += 3; // vzeroupper
       
   296     }
   283   }
   297   }
   284   return size;
   298   return size;
   285 }
   299 }
   286 
   300 
   287 // !!!!! Special hack to get all type of calls to specify the byte offset
   301 // !!!!! Special hack to get all type of calls to specify the byte offset
   288 //       from the start of the call to the point where the return address
   302 //       from the start of the call to the point where the return address
   289 //       will point.
   303 //       will point.
   290 int MachCallStaticJavaNode::ret_addr_offset() {
   304 int MachCallStaticJavaNode::ret_addr_offset() {
   291   return 5 + pre_call_resets_size();  // 5 bytes from start of call to where return address points  
   305   return 5 + pre_call_resets_size();  // 5 bytes from start of call to where return address points
   292 }
   306 }
   293 
   307 
   294 int MachCallDynamicJavaNode::ret_addr_offset() {
   308 int MachCallDynamicJavaNode::ret_addr_offset() {
   295   return 10 + pre_call_resets_size();  // 10 bytes from start of call to where return address points
   309   return 10 + pre_call_resets_size();  // 10 bytes from start of call to where return address points
   296 }
   310 }
   765 }
   779 }
   766 
   780 
   767 // Helper for XMM registers.  Extra opcode bits, limited syntax.
   781 // Helper for XMM registers.  Extra opcode bits, limited syntax.
   768 static int impl_x_helper( CodeBuffer *cbuf, bool do_size, bool is_load,
   782 static int impl_x_helper( CodeBuffer *cbuf, bool do_size, bool is_load,
   769                          int offset, int reg_lo, int reg_hi, int size, outputStream* st ) {
   783                          int offset, int reg_lo, int reg_hi, int size, outputStream* st ) {
       
   784   int in_size_in_bits = Assembler::EVEX_32bit;
       
   785   int evex_encoding = 0;
       
   786   if (reg_lo+1 == reg_hi) {
       
   787     in_size_in_bits = Assembler::EVEX_64bit;
       
   788     evex_encoding = Assembler::VEX_W;
       
   789   }
   770   if (cbuf) {
   790   if (cbuf) {
   771     MacroAssembler _masm(cbuf);
   791     MacroAssembler _masm(cbuf);
   772     if (reg_lo+1 == reg_hi) { // double move?
   792     if (reg_lo+1 == reg_hi) { // double move?
   773       if (is_load) {
   793       if (is_load) {
   774         __ movdbl(as_XMMRegister(Matcher::_regEncode[reg_lo]), Address(rsp, offset));
   794         __ movdbl(as_XMMRegister(Matcher::_regEncode[reg_lo]), Address(rsp, offset));
   797       else         st->print("MOVSS  [ESP + #%d],%s",
   817       else         st->print("MOVSS  [ESP + #%d],%s",
   798                               offset, Matcher::regName[reg_lo]);
   818                               offset, Matcher::regName[reg_lo]);
   799     }
   819     }
   800 #endif
   820 #endif
   801   }
   821   }
   802   int offset_size = (offset == 0) ? 0 : ((offset <= 127) ? 1 : 4);
   822   bool is_single_byte = false;
       
   823   if ((UseAVX > 2) && (offset != 0)) {
       
   824     is_single_byte = Assembler::query_compressed_disp_byte(offset, true, 0, Assembler::EVEX_T1S, in_size_in_bits, evex_encoding);
       
   825   }
       
   826   int offset_size = 0;
       
   827   if (UseAVX > 2 ) {
       
   828     offset_size = (offset == 0) ? 0 : ((is_single_byte) ? 1 : 4);
       
   829   } else {
       
   830     offset_size = (offset == 0) ? 0 : ((offset <= 127) ? 1 : 4);
       
   831   }
       
   832   size += (UseAVX > 2) ? 2 : 0; // Need an additional two bytes for EVEX
   803   // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix.
   833   // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix.
   804   return size+5+offset_size;
   834   return size+5+offset_size;
   805 }
   835 }
   806 
   836 
   807 
   837 
   833       }
   863       }
   834     }
   864     }
   835 #endif
   865 #endif
   836   }
   866   }
   837   // VEX_2bytes prefix is used if UseAVX > 0, and it takes the same 2 bytes as SIMD prefix.
   867   // VEX_2bytes prefix is used if UseAVX > 0, and it takes the same 2 bytes as SIMD prefix.
   838   // Only MOVAPS SSE prefix uses 1 byte.
   868   // Only MOVAPS SSE prefix uses 1 byte.  EVEX uses an additional 2 bytes.
   839   int sz = 4;
   869   int sz = (UseAVX > 2) ? 6 : 4;
   840   if (!(src_lo+1 == src_hi && dst_lo+1 == dst_hi) &&
   870   if (!(src_lo+1 == src_hi && dst_lo+1 == dst_hi) &&
   841       UseXmmRegToRegMoveAll && (UseAVX == 0)) sz = 3;
   871       UseXmmRegToRegMoveAll && (UseAVX == 0)) sz = 3;
   842   return size + sz;
   872   return size + sz;
   843 }
   873 }
   844 
   874 
   852 #ifndef PRODUCT
   882 #ifndef PRODUCT
   853   } else if (!do_size) {
   883   } else if (!do_size) {
   854     st->print("movdl   %s, %s\t# spill", Matcher::regName[dst_lo], Matcher::regName[src_lo]);
   884     st->print("movdl   %s, %s\t# spill", Matcher::regName[dst_lo], Matcher::regName[src_lo]);
   855 #endif
   885 #endif
   856   }
   886   }
   857   return 4;
   887   return (UseAVX> 2) ? 6 : 4;
   858 }
   888 }
   859 
   889 
   860 
   890 
   861 static int impl_movx2gpr_helper( CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo,
   891 static int impl_movx2gpr_helper( CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo,
   862                                  int src_hi, int dst_hi, int size, outputStream* st ) {
   892                                  int src_hi, int dst_hi, int size, outputStream* st ) {
   868 #ifndef PRODUCT
   898 #ifndef PRODUCT
   869   } else if (!do_size) {
   899   } else if (!do_size) {
   870     st->print("movdl   %s, %s\t# spill", Matcher::regName[dst_lo], Matcher::regName[src_lo]);
   900     st->print("movdl   %s, %s\t# spill", Matcher::regName[dst_lo], Matcher::regName[src_lo]);
   871 #endif
   901 #endif
   872   }
   902   }
   873   return 4;
   903   return (UseAVX> 2) ? 6 : 4;
   874 }
   904 }
   875 
   905 
   876 static int impl_mov_helper( CodeBuffer *cbuf, bool do_size, int src, int dst, int size, outputStream* st ) {
   906 static int impl_mov_helper( CodeBuffer *cbuf, bool do_size, int src, int dst, int size, outputStream* st ) {
   877   if( cbuf ) {
   907   if( cbuf ) {
   878     emit_opcode(*cbuf, 0x8B );
   908     emit_opcode(*cbuf, 0x8B );
   939     src_offset_size = (src_offset == 0) ? 0 : ((src_offset < 0x80) ? 1 : 4);
   969     src_offset_size = (src_offset == 0) ? 0 : ((src_offset < 0x80) ? 1 : 4);
   940     dst_offset_size = (dst_offset == 0) ? 0 : ((dst_offset < 0x80) ? 1 : 4);
   970     dst_offset_size = (dst_offset == 0) ? 0 : ((dst_offset < 0x80) ? 1 : 4);
   941     calc_size += 3+src_offset_size + 3+dst_offset_size;
   971     calc_size += 3+src_offset_size + 3+dst_offset_size;
   942     break;
   972     break;
   943   case Op_VecX:
   973   case Op_VecX:
   944     calc_size = 6 + 6 + 5+src_offset_size + 5+dst_offset_size;
       
   945     break;
       
   946   case Op_VecY:
   974   case Op_VecY:
       
   975   case Op_VecZ:
   947     calc_size = 6 + 6 + 5+src_offset_size + 5+dst_offset_size;
   976     calc_size = 6 + 6 + 5+src_offset_size + 5+dst_offset_size;
   948     break;
   977     break;
   949   default:
   978   default:
   950     ShouldNotReachHere();
   979     ShouldNotReachHere();
   951   }
   980   }
   972     case Op_VecY:
  1001     case Op_VecY:
   973       __ vmovdqu(Address(rsp, -32), xmm0);
  1002       __ vmovdqu(Address(rsp, -32), xmm0);
   974       __ vmovdqu(xmm0, Address(rsp, src_offset));
  1003       __ vmovdqu(xmm0, Address(rsp, src_offset));
   975       __ vmovdqu(Address(rsp, dst_offset), xmm0);
  1004       __ vmovdqu(Address(rsp, dst_offset), xmm0);
   976       __ vmovdqu(xmm0, Address(rsp, -32));
  1005       __ vmovdqu(xmm0, Address(rsp, -32));
       
  1006     case Op_VecZ:
       
  1007       __ evmovdqu(Address(rsp, -64), xmm0, 2);
       
  1008       __ evmovdqu(xmm0, Address(rsp, src_offset), 2);
       
  1009       __ evmovdqu(Address(rsp, dst_offset), xmm0, 2);
       
  1010       __ evmovdqu(xmm0, Address(rsp, -64), 2);
   977       break;
  1011       break;
   978     default:
  1012     default:
   979       ShouldNotReachHere();
  1013       ShouldNotReachHere();
   980     }
  1014     }
   981     int size = __ offset() - offset;
  1015     int size = __ offset() - offset;
  1007       st->print("vmovdqu [rsp - #32], xmm0\t# 256-bit mem-mem spill\n\t"
  1041       st->print("vmovdqu [rsp - #32], xmm0\t# 256-bit mem-mem spill\n\t"
  1008                 "vmovdqu xmm0, [rsp + #%d]\n\t"
  1042                 "vmovdqu xmm0, [rsp + #%d]\n\t"
  1009                 "vmovdqu [rsp + #%d], xmm0\n\t"
  1043                 "vmovdqu [rsp + #%d], xmm0\n\t"
  1010                 "vmovdqu xmm0, [rsp - #32]",
  1044                 "vmovdqu xmm0, [rsp - #32]",
  1011                 src_offset, dst_offset);
  1045                 src_offset, dst_offset);
       
  1046     case Op_VecZ:
       
  1047       st->print("vmovdqu [rsp - #64], xmm0\t# 512-bit mem-mem spill\n\t"
       
  1048                 "vmovdqu xmm0, [rsp + #%d]\n\t"
       
  1049                 "vmovdqu [rsp + #%d], xmm0\n\t"
       
  1050                 "vmovdqu xmm0, [rsp - #64]",
       
  1051                 src_offset, dst_offset);
  1012       break;
  1052       break;
  1013     default:
  1053     default:
  1014       ShouldNotReachHere();
  1054       ShouldNotReachHere();
  1015     }
  1055     }
  1016 #endif
  1056 #endif
  1040 
  1080 
  1041   if (bottom_type()->isa_vect() != NULL) {
  1081   if (bottom_type()->isa_vect() != NULL) {
  1042     uint ireg = ideal_reg();
  1082     uint ireg = ideal_reg();
  1043     assert((src_first_rc != rc_int && dst_first_rc != rc_int), "sanity");
  1083     assert((src_first_rc != rc_int && dst_first_rc != rc_int), "sanity");
  1044     assert((src_first_rc != rc_float && dst_first_rc != rc_float), "sanity");
  1084     assert((src_first_rc != rc_float && dst_first_rc != rc_float), "sanity");
  1045     assert((ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY), "sanity");
  1085     assert((ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY || ireg == Op_VecZ ), "sanity");
  1046     if( src_first_rc == rc_stack && dst_first_rc == rc_stack ) {
  1086     if( src_first_rc == rc_stack && dst_first_rc == rc_stack ) {
  1047       // mem -> mem
  1087       // mem -> mem
  1048       int src_offset = ra_->reg2offset(src_first);
  1088       int src_offset = ra_->reg2offset(src_first);
  1049       int dst_offset = ra_->reg2offset(dst_first);
  1089       int dst_offset = ra_->reg2offset(dst_first);
  1050       return vec_stack_to_stack_helper(cbuf, do_size, src_offset, dst_offset, ireg, st);
  1090       return vec_stack_to_stack_helper(cbuf, do_size, src_offset, dst_offset, ireg, st);
  3996 %}
  4036 %}
  3997 
  4037 
  3998 // XMM Float register operands
  4038 // XMM Float register operands
  3999 operand regF() %{
  4039 operand regF() %{
  4000   predicate( UseSSE>=1 );
  4040   predicate( UseSSE>=1 );
  4001   constraint(ALLOC_IN_RC(float_reg));
  4041   constraint(ALLOC_IN_RC(float_reg_legacy));
  4002   match(RegF);
  4042   match(RegF);
  4003   format %{ %}
  4043   format %{ %}
  4004   interface(REG_INTER);
  4044   interface(REG_INTER);
  4005 %}
  4045 %}
  4006 
  4046 
  4007 // XMM Double register operands
  4047 // XMM Double register operands
  4008 operand regD() %{
  4048 operand regD() %{
  4009   predicate( UseSSE>=2 );
  4049   predicate( UseSSE>=2 );
  4010   constraint(ALLOC_IN_RC(double_reg));
  4050   constraint(ALLOC_IN_RC(double_reg_legacy));
  4011   match(RegD);
  4051   match(RegD);
  4012   format %{ %}
  4052   format %{ %}
  4013   interface(REG_INTER);
  4053   interface(REG_INTER);
  4014 %}
  4054 %}
  4015 
  4055 
       
  4056 // Vectors : note, we use legacy registers to avoid extra (unneeded in 32-bit VM)
       
  4057 // runtime code generation via reg_class_dynamic.
       
  4058 operand vecS() %{
       
  4059   constraint(ALLOC_IN_RC(vectors_reg_legacy));
       
  4060   match(VecS);
       
  4061 
       
  4062   format %{ %}
       
  4063   interface(REG_INTER);
       
  4064 %}
       
  4065 
       
  4066 operand vecD() %{
       
  4067   constraint(ALLOC_IN_RC(vectord_reg_legacy));
       
  4068   match(VecD);
       
  4069 
       
  4070   format %{ %}
       
  4071   interface(REG_INTER);
       
  4072 %}
       
  4073 
       
  4074 operand vecX() %{
       
  4075   constraint(ALLOC_IN_RC(vectorx_reg_legacy));
       
  4076   match(VecX);
       
  4077 
       
  4078   format %{ %}
       
  4079   interface(REG_INTER);
       
  4080 %}
       
  4081 
       
  4082 operand vecY() %{
       
  4083   constraint(ALLOC_IN_RC(vectory_reg_legacy));
       
  4084   match(VecY);
       
  4085 
       
  4086   format %{ %}
       
  4087   interface(REG_INTER);
       
  4088 %}
  4016 
  4089 
  4017 //----------Memory Operands----------------------------------------------------
  4090 //----------Memory Operands----------------------------------------------------
  4018 // Direct Memory Operand
  4091 // Direct Memory Operand
  4019 operand direct(immP addr) %{
  4092 operand direct(immP addr) %{
  4020   match(addr);
  4093   match(addr);
  5018 
  5091 
  5019 instruct bytes_reverse_unsigned_short(rRegI dst, eFlagsReg cr) %{
  5092 instruct bytes_reverse_unsigned_short(rRegI dst, eFlagsReg cr) %{
  5020   match(Set dst (ReverseBytesUS dst));
  5093   match(Set dst (ReverseBytesUS dst));
  5021   effect(KILL cr);
  5094   effect(KILL cr);
  5022 
  5095 
  5023   format %{ "BSWAP  $dst\n\t" 
  5096   format %{ "BSWAP  $dst\n\t"
  5024             "SHR    $dst,16\n\t" %}
  5097             "SHR    $dst,16\n\t" %}
  5025   ins_encode %{
  5098   ins_encode %{
  5026     __ bswapl($dst$$Register);
  5099     __ bswapl($dst$$Register);
  5027     __ shrl($dst$$Register, 16); 
  5100     __ shrl($dst$$Register, 16);
  5028   %}
  5101   %}
  5029   ins_pipe( ialu_reg );
  5102   ins_pipe( ialu_reg );
  5030 %}
  5103 %}
  5031 
  5104 
  5032 instruct bytes_reverse_short(rRegI dst, eFlagsReg cr) %{
  5105 instruct bytes_reverse_short(rRegI dst, eFlagsReg cr) %{
  5033   match(Set dst (ReverseBytesS dst));
  5106   match(Set dst (ReverseBytesS dst));
  5034   effect(KILL cr);
  5107   effect(KILL cr);
  5035 
  5108 
  5036   format %{ "BSWAP  $dst\n\t" 
  5109   format %{ "BSWAP  $dst\n\t"
  5037             "SAR    $dst,16\n\t" %}
  5110             "SAR    $dst,16\n\t" %}
  5038   ins_encode %{
  5111   ins_encode %{
  5039     __ bswapl($dst$$Register);
  5112     __ bswapl($dst$$Register);
  5040     __ sarl($dst$$Register, 16); 
  5113     __ sarl($dst$$Register, 16);
  5041   %}
  5114   %}
  5042   ins_pipe( ialu_reg );
  5115   ins_pipe( ialu_reg );
  5043 %}
  5116 %}
  5044 
  5117 
  5045 
  5118 
  6523 instruct membar_volatile(eFlagsReg cr) %{
  6596 instruct membar_volatile(eFlagsReg cr) %{
  6524   match(MemBarVolatile);
  6597   match(MemBarVolatile);
  6525   effect(KILL cr);
  6598   effect(KILL cr);
  6526   ins_cost(400);
  6599   ins_cost(400);
  6527 
  6600 
  6528   format %{ 
  6601   format %{
  6529     $$template
  6602     $$template
  6530     if (os::is_MP()) {
  6603     if (os::is_MP()) {
  6531       $$emit$$"LOCK ADDL [ESP + #0], 0\t! membar_volatile"
  6604       $$emit$$"LOCK ADDL [ESP + #0], 0\t! membar_volatile"
  6532     } else {
  6605     } else {
  6533       $$emit$$"MEMBAR-volatile ! (empty encoding)"
  6606       $$emit$$"MEMBAR-volatile ! (empty encoding)"
  8286   ins_pipe( ialu_reg_reg );
  8359   ins_pipe( ialu_reg_reg );
  8287 %}
  8360 %}
  8288 
  8361 
  8289 // Xor Register with Immediate -1
  8362 // Xor Register with Immediate -1
  8290 instruct xorI_eReg_im1(rRegI dst, immI_M1 imm) %{
  8363 instruct xorI_eReg_im1(rRegI dst, immI_M1 imm) %{
  8291   match(Set dst (XorI dst imm));  
  8364   match(Set dst (XorI dst imm));
  8292 
  8365 
  8293   size(2);
  8366   size(2);
  8294   format %{ "NOT    $dst" %}  
  8367   format %{ "NOT    $dst" %}
  8295   ins_encode %{
  8368   ins_encode %{
  8296      __ notl($dst$$Register);
  8369      __ notl($dst$$Register);
  8297   %}
  8370   %}
  8298   ins_pipe( ialu_reg );
  8371   ins_pipe( ialu_reg );
  8299 %}
  8372 %}
  8937   ins_pipe( ialu_reg_reg_long );
  9010   ins_pipe( ialu_reg_reg_long );
  8938 %}
  9011 %}
  8939 
  9012 
  8940 // Xor Long Register with Immediate -1
  9013 // Xor Long Register with Immediate -1
  8941 instruct xorl_eReg_im1(eRegL dst, immL_M1 imm) %{
  9014 instruct xorl_eReg_im1(eRegL dst, immL_M1 imm) %{
  8942   match(Set dst (XorL dst imm));  
  9015   match(Set dst (XorL dst imm));
  8943   format %{ "NOT    $dst.lo\n\t"
  9016   format %{ "NOT    $dst.lo\n\t"
  8944             "NOT    $dst.hi" %}
  9017             "NOT    $dst.hi" %}
  8945   ins_encode %{
  9018   ins_encode %{
  8946      __ notl($dst$$Register);
  9019      __ notl($dst$$Register);
  8947      __ notl(HIGH_FROM_LOW($dst$$Register));
  9020      __ notl(HIGH_FROM_LOW($dst$$Register));
  8992   predicate(UseNewLongLShift);
  9065   predicate(UseNewLongLShift);
  8993   match(Set dst (LShiftL dst cnt));
  9066   match(Set dst (LShiftL dst cnt));
  8994   effect(KILL cr);
  9067   effect(KILL cr);
  8995   ins_cost(100);
  9068   ins_cost(100);
  8996   format %{ "ADD    $dst.lo,$dst.lo\n\t"
  9069   format %{ "ADD    $dst.lo,$dst.lo\n\t"
  8997             "ADC    $dst.hi,$dst.hi\n\t" 
  9070             "ADC    $dst.hi,$dst.hi\n\t"
  8998             "ADD    $dst.lo,$dst.lo\n\t"
  9071             "ADD    $dst.lo,$dst.lo\n\t"
  8999             "ADC    $dst.hi,$dst.hi" %}
  9072             "ADC    $dst.hi,$dst.hi" %}
  9000   ins_encode %{
  9073   ins_encode %{
  9001     __ addl($dst$$Register,$dst$$Register);
  9074     __ addl($dst$$Register,$dst$$Register);
  9002     __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
  9075     __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
  9011   predicate(UseNewLongLShift);
  9084   predicate(UseNewLongLShift);
  9012   match(Set dst (LShiftL dst cnt));
  9085   match(Set dst (LShiftL dst cnt));
  9013   effect(KILL cr);
  9086   effect(KILL cr);
  9014   ins_cost(100);
  9087   ins_cost(100);
  9015   format %{ "ADD    $dst.lo,$dst.lo\n\t"
  9088   format %{ "ADD    $dst.lo,$dst.lo\n\t"
  9016             "ADC    $dst.hi,$dst.hi\n\t" 
  9089             "ADC    $dst.hi,$dst.hi\n\t"
  9017             "ADD    $dst.lo,$dst.lo\n\t"
  9090             "ADD    $dst.lo,$dst.lo\n\t"
  9018             "ADC    $dst.hi,$dst.hi\n\t" 
  9091             "ADC    $dst.hi,$dst.hi\n\t"
  9019             "ADD    $dst.lo,$dst.lo\n\t"
  9092             "ADD    $dst.lo,$dst.lo\n\t"
  9020             "ADC    $dst.hi,$dst.hi" %}
  9093             "ADC    $dst.hi,$dst.hi" %}
  9021   ins_encode %{
  9094   ins_encode %{
  9022     __ addl($dst$$Register,$dst$$Register);
  9095     __ addl($dst$$Register,$dst$$Register);
  9023     __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
  9096     __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
 11166   format %{ "MOV    $dst,$src.lo" %}
 11239   format %{ "MOV    $dst,$src.lo" %}
 11167   ins_encode(enc_CopyL_Lo(dst,src));
 11240   ins_encode(enc_CopyL_Lo(dst,src));
 11168   ins_pipe( ialu_reg_reg );
 11241   ins_pipe( ialu_reg_reg );
 11169 %}
 11242 %}
 11170 
 11243 
 11171 
       
 11172 instruct MoveF2I_stack_reg(rRegI dst, stackSlotF src) %{
 11244 instruct MoveF2I_stack_reg(rRegI dst, stackSlotF src) %{
 11173   match(Set dst (MoveF2I src));
 11245   match(Set dst (MoveF2I src));
 11174   effect( DEF dst, USE src );
 11246   effect( DEF dst, USE src );
 11175   ins_cost(100);
 11247   ins_cost(100);
 11176   format %{ "MOV    $dst,$src\t# MoveF2I_stack_reg" %}
 11248   format %{ "MOV    $dst,$src\t# MoveF2I_stack_reg" %}
 11398   match(Set dummy (ClearArray cnt base));
 11470   match(Set dummy (ClearArray cnt base));
 11399   effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr);
 11471   effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr);
 11400   format %{ "XOR    EAX,EAX\t# ClearArray:\n\t"
 11472   format %{ "XOR    EAX,EAX\t# ClearArray:\n\t"
 11401             "SHL    ECX,1\t# Convert doublewords to words\n\t"
 11473             "SHL    ECX,1\t# Convert doublewords to words\n\t"
 11402             "REP STOS\t# store EAX into [EDI++] while ECX--" %}
 11474             "REP STOS\t# store EAX into [EDI++] while ECX--" %}
 11403   ins_encode %{ 
 11475   ins_encode %{
 11404     __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register);
 11476     __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register);
 11405   %}
 11477   %}
 11406   ins_pipe( pipe_slow );
 11478   ins_pipe( pipe_slow );
 11407 %}
 11479 %}
 11408 
 11480 
 11411   match(Set dummy (ClearArray cnt base));
 11483   match(Set dummy (ClearArray cnt base));
 11412   effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr);
 11484   effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr);
 11413   format %{ "XOR    EAX,EAX\t# ClearArray:\n\t"
 11485   format %{ "XOR    EAX,EAX\t# ClearArray:\n\t"
 11414             "SHL    ECX,3\t# Convert doublewords to bytes\n\t"
 11486             "SHL    ECX,3\t# Convert doublewords to bytes\n\t"
 11415             "REP STOSB\t# store EAX into [EDI++] while ECX--" %}
 11487             "REP STOSB\t# store EAX into [EDI++] while ECX--" %}
 11416   ins_encode %{ 
 11488   ins_encode %{
 11417     __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register);
 11489     __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register);
 11418   %}
 11490   %}
 11419   ins_pipe( pipe_slow );
 11491   ins_pipe( pipe_slow );
 11420 %}
 11492 %}
 11421 
 11493