Print this page


Split Close
Expand all
Collapse all
          --- old/src/cpu/x86/vm/stubGenerator_x86_64.cpp
          +++ new/src/cpu/x86/vm/stubGenerator_x86_64.cpp
↓ open down ↓ 136 lines elided ↑ open up ↑
 137  137    //    c_rarg2:   result type                            BasicType
 138  138    //    c_rarg3:   method                                 methodOop
 139  139    //    48(rbp): (interpreter) entry point              address
 140  140    //    56(rbp): parameters                             intptr_t*
 141  141    //    64(rbp): parameter size (in words)              int
 142  142    //    72(rbp): thread                                 Thread*
 143  143    //
 144  144    //     [ return_from_Java     ] <--- rsp
 145  145    //     [ argument word n      ]
 146  146    //      ...
 147      -  //  -8 [ argument word 1      ]
 148      -  //  -7 [ saved r15            ] <--- rsp_after_call
      147 +  // -28 [ argument word 1      ]
      148 +  // -27 [ saved xmm15          ] <--- rsp_after_call 
      149 +  //     [ saved xmm7-xmm14     ] 
      150 +  //  -9 [ saved xmm6           ] (each xmm register takes 2 slots)
      151 +  //  -7 [ saved r15            ] 
 149  152    //  -6 [ saved r14            ]
 150  153    //  -5 [ saved r13            ]
 151  154    //  -4 [ saved r12            ]
 152  155    //  -3 [ saved rdi            ]
 153  156    //  -2 [ saved rsi            ]
 154  157    //  -1 [ saved rbx            ]
 155  158    //   0 [ saved rbp            ] <--- rbp
 156  159    //   1 [ return address       ]
 157  160    //   2 [ call wrapper         ]
 158  161    //   3 [ result               ]
↓ open down ↓ 3 lines elided ↑ open up ↑
 162  165    //   7 [ parameters           ]
 163  166    //   8 [ parameter size       ]
 164  167    //   9 [ thread               ]
 165  168    //
 166  169    //    Windows reserves the callers stack space for arguments 1-4.
 167  170    //    We spill c_rarg0-c_rarg3 to this space.
 168  171  
 169  172    // Call stub stack layout word offsets from rbp
 170  173    enum call_stub_layout {
 171  174  #ifdef _WIN64
 172      -    rsp_after_call_off = -7,
 173      -    r15_off            = rsp_after_call_off,
      175 +    xmm_save_first     = 6,  // save from xmm6
      176 +    xmm_save_last      = 15, // to xmm15
      177 +    xmm_save_base      = -9,
      178 +    rsp_after_call_off = xmm_save_base - 2 * (xmm_save_last - xmm_save_first), // -27
      179 +    r15_off            = -7,
 174  180      r14_off            = -6,
 175  181      r13_off            = -5,
 176  182      r12_off            = -4,
 177  183      rdi_off            = -3,
 178  184      rsi_off            = -2,
 179  185      rbx_off            = -1,
 180  186      rbp_off            =  0,
 181  187      retaddr_off        =  1,
 182  188      call_wrapper_off   =  2,
 183  189      result_off         =  3,
↓ open down ↓ 17 lines elided ↑ open up ↑
 201  207      method_off         = -3,
 202  208      entry_point_off    = -2,
 203  209      parameters_off     = -1,
 204  210      rbp_off            =  0,
 205  211      retaddr_off        =  1,
 206  212      parameter_size_off =  2,
 207  213      thread_off         =  3
 208  214  #endif
 209  215    };
 210  216  
      217 +#ifdef _WIN64
      218 +  Address xmm_save(int reg) {
      219 +    assert(reg >= xmm_save_first && reg <= xmm_save_last, "XMM register number out of range");
      220 +    return Address(rbp, (xmm_save_base - (reg - xmm_save_first) * 2) * wordSize);
      221 +  }
      222 +#endif
      223 +
 211  224    address generate_call_stub(address& return_address) {
 212  225      assert((int)frame::entry_frame_after_call_words == -(int)rsp_after_call_off + 1 &&
 213  226             (int)frame::entry_frame_call_wrapper_offset == (int)call_wrapper_off,
 214  227             "adjust this code");
 215  228      StubCodeMark mark(this, "StubRoutines", "call_stub");
 216  229      address start = __ pc();
 217  230  
 218  231      // same as in generate_catch_exception()!
 219  232      const Address rsp_after_call(rbp, rsp_after_call_off * wordSize);
 220  233  
↓ open down ↓ 28 lines elided ↑ open up ↑
 249  262      __ movl(result_type,  c_rarg2);   // result type
 250  263      __ movptr(result,       c_rarg1); // result
 251  264      __ movptr(call_wrapper, c_rarg0); // call wrapper
 252  265  
 253  266      // save regs belonging to calling function
 254  267      __ movptr(rbx_save, rbx);
 255  268      __ movptr(r12_save, r12);
 256  269      __ movptr(r13_save, r13);
 257  270      __ movptr(r14_save, r14);
 258  271      __ movptr(r15_save, r15);
 259      -
 260  272  #ifdef _WIN64
      273 +    for (int i = 6; i <= 15; i++) {
      274 +      __ movdqu(xmm_save(i), as_XMMRegister(i));
      275 +    }
      276 +
 261  277      const Address rdi_save(rbp, rdi_off * wordSize);
 262  278      const Address rsi_save(rbp, rsi_off * wordSize);
 263  279  
 264  280      __ movptr(rsi_save, rsi);
 265  281      __ movptr(rdi_save, rdi);
 266  282  #else
 267  283      const Address mxcsr_save(rbp, mxcsr_off * wordSize);
 268  284      {
 269  285        Label skip_ldmx;
 270  286        __ stmxcsr(mxcsr_save);
↓ open down ↓ 82 lines elided ↑ open up ↑
 353  369        __ cmpptr(r15_thread, rbx);
 354  370        __ jcc(Assembler::equal, L);
 355  371        __ bind(S);
 356  372        __ jcc(Assembler::equal, L);
 357  373        __ stop("StubRoutines::call_stub: threads must correspond");
 358  374        __ bind(L);
 359  375      }
 360  376  #endif
 361  377  
 362  378      // restore regs belonging to calling function
      379 +#ifdef _WIN64
      380 +    for (int i = 15; i >= 6; i--) {
      381 +      __ movdqu(as_XMMRegister(i), xmm_save(i));
      382 +    }
      383 +#endif
 363  384      __ movptr(r15, r15_save);
 364  385      __ movptr(r14, r14_save);
 365  386      __ movptr(r13, r13_save);
 366  387      __ movptr(r12, r12_save);
 367  388      __ movptr(rbx, rbx_save);
 368  389  
 369  390  #ifdef _WIN64
 370  391      __ movptr(rdi, rdi_save);
 371  392      __ movptr(rsi, rsi_save);
 372  393  #else
↓ open down ↓ 2744 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX