src/cpu/x86/vm/stubGenerator_x86_64.cpp

changeset 2689
b1c22848507b
parent 2606
0ac769a57c64
child 2691
348c0df561a9
     1.1 --- a/src/cpu/x86/vm/stubGenerator_x86_64.cpp	Tue Mar 29 09:11:51 2011 -0700
     1.2 +++ b/src/cpu/x86/vm/stubGenerator_x86_64.cpp	Tue Mar 29 17:35:34 2011 -0700
     1.3 @@ -144,8 +144,11 @@
     1.4    //     [ return_from_Java     ] <--- rsp
     1.5    //     [ argument word n      ]
     1.6    //      ...
     1.7 -  //  -8 [ argument word 1      ]
     1.8 -  //  -7 [ saved r15            ] <--- rsp_after_call
     1.9 +  // -28 [ argument word 1      ]
    1.10 +  // -27 [ saved xmm15          ] <--- rsp_after_call
    1.11 +  //     [ saved xmm7-xmm14     ]
    1.12 +  //  -9 [ saved xmm6           ] (each xmm register takes 2 slots)
    1.13 +  //  -7 [ saved r15            ]
    1.14    //  -6 [ saved r14            ]
    1.15    //  -5 [ saved r13            ]
    1.16    //  -4 [ saved r12            ]
    1.17 @@ -169,8 +172,11 @@
    1.18    // Call stub stack layout word offsets from rbp
    1.19    enum call_stub_layout {
    1.20  #ifdef _WIN64
    1.21 -    rsp_after_call_off = -7,
    1.22 -    r15_off            = rsp_after_call_off,
    1.23 +    xmm_save_first     = 6,  // save from xmm6
    1.24 +    xmm_save_last      = 15, // to xmm15
    1.25 +    xmm_save_base      = -9,
    1.26 +    rsp_after_call_off = xmm_save_base - 2 * (xmm_save_last - xmm_save_first), // -27
    1.27 +    r15_off            = -7,
    1.28      r14_off            = -6,
    1.29      r13_off            = -5,
    1.30      r12_off            = -4,
    1.31 @@ -208,6 +214,13 @@
    1.32  #endif
    1.33    };
    1.34  
    1.35 +#ifdef _WIN64
    1.36 +  Address xmm_save(int reg) {
    1.37 +    assert(reg >= xmm_save_first && reg <= xmm_save_last, "XMM register number out of range");
    1.38 +    return Address(rbp, (xmm_save_base - (reg - xmm_save_first) * 2) * wordSize);
    1.39 +  }
    1.40 +#endif
    1.41 +
    1.42    address generate_call_stub(address& return_address) {
    1.43      assert((int)frame::entry_frame_after_call_words == -(int)rsp_after_call_off + 1 &&
    1.44             (int)frame::entry_frame_call_wrapper_offset == (int)call_wrapper_off,
    1.45 @@ -256,8 +269,11 @@
    1.46      __ movptr(r13_save, r13);
    1.47      __ movptr(r14_save, r14);
    1.48      __ movptr(r15_save, r15);
    1.49 -
    1.50  #ifdef _WIN64
    1.51 +    for (int i = 6; i <= 15; i++) {
    1.52 +      __ movdqu(xmm_save(i), as_XMMRegister(i));
    1.53 +    }
    1.54 +
    1.55      const Address rdi_save(rbp, rdi_off * wordSize);
    1.56      const Address rsi_save(rbp, rsi_off * wordSize);
    1.57  
    1.58 @@ -360,6 +376,11 @@
    1.59  #endif
    1.60  
    1.61      // restore regs belonging to calling function
    1.62 +#ifdef _WIN64
    1.63 +    for (int i = 15; i >= 6; i--) {
    1.64 +      __ movdqu(as_XMMRegister(i), xmm_save(i));
    1.65 +    }
    1.66 +#endif
    1.67      __ movptr(r15, r15_save);
    1.68      __ movptr(r14, r14_save);
    1.69      __ movptr(r13, r13_save);

mercurial