Revision: 14301
Author: [email protected]
Date: Wed Apr 17 02:54:17 2013
Log: Save and restore callee-save xmm registers on Win64
BUG=
Review URL: https://codereview.chromium.org/14053008
http://code.google.com/p/v8/source/detail?r=14301
Modified:
/branches/bleeding_edge/src/x64/assembler-x64.cc
/branches/bleeding_edge/src/x64/assembler-x64.h
/branches/bleeding_edge/src/x64/code-stubs-x64.cc
=======================================
--- /branches/bleeding_edge/src/x64/assembler-x64.cc Tue Apr 16 05:30:51
2013
+++ /branches/bleeding_edge/src/x64/assembler-x64.cc Wed Apr 17 02:54:17
2013
@@ -2599,6 +2599,26 @@
emit(0x6F);
emit_sse_operand(dst, src);
}
+
+
+void Assembler::movdqu(const Operand& dst, XMMRegister src) {
+ EnsureSpace ensure_space(this);
+ emit(0xF3);
+ emit_rex_64(src, dst);
+ emit(0x0F);
+ emit(0x7F);
+ emit_sse_operand(src, dst);
+}
+
+
+void Assembler::movdqu(XMMRegister dst, const Operand& src) {
+ EnsureSpace ensure_space(this);
+ emit(0xF3);
+ emit_rex_64(dst, src);
+ emit(0x0F);
+ emit(0x6F);
+ emit_sse_operand(dst, src);
+}
void Assembler::extractps(Register dst, XMMRegister src, byte imm8) {
=======================================
--- /branches/bleeding_edge/src/x64/assembler-x64.h Tue Apr 9 03:32:00 2013
+++ /branches/bleeding_edge/src/x64/assembler-x64.h Wed Apr 17 02:54:17 2013
@@ -1309,6 +1309,9 @@
void movdqa(const Operand& dst, XMMRegister src);
void movdqa(XMMRegister dst, const Operand& src);
+ void movdqu(const Operand& dst, XMMRegister src);
+ void movdqu(XMMRegister dst, const Operand& src);
+
void movapd(XMMRegister dst, XMMRegister src);
void movaps(XMMRegister dst, XMMRegister src);
=======================================
--- /branches/bleeding_edge/src/x64/code-stubs-x64.cc Tue Apr 16 05:16:55
2013
+++ /branches/bleeding_edge/src/x64/code-stubs-x64.cc Wed Apr 17 02:54:17
2013
@@ -4272,6 +4272,11 @@
void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
Label invoke, handler_entry, exit;
Label not_outermost_js, not_outermost_js_2;
+
+#ifdef _WIN64
+ const int kCalleeSaveXMMRegisters = 10;
+ const int kFullXMMRegisterSize = 16;
+#endif
{ // NOLINT. Scope block confuses linter.
MacroAssembler::NoRootArrayScope uninitialized_root_register(masm);
// Set up frame.
@@ -4298,8 +4303,21 @@
__ push(rsi); // Only callee save in Win64 ABI, argument in AMD64 ABI.
#endif
__ push(rbx);
- // TODO(X64): On Win64, if we ever use XMM6-XMM15, the low low 64 bits
are
- // callee save as well.
+
+#ifdef _WIN64
+ // On Win64 XMM6-XMM15 are callee-save
+ __ subq(rsp, Immediate(kCalleeSaveXMMRegisters * kFullXMMRegisterSize);
+ __ movdqu(Operand(rsp, kFullXMMRegisterSize * 0), xmm6);
+ __ movdqu(Operand(rsp, kFullXMMRegisterSize * 1), xmm7);
+ __ movdqu(Operand(rsp, kFullXMMRegisterSize * 2), xmm8);
+ __ movdqu(Operand(rsp, kFullXMMRegisterSize * 3), xmm9);
+ __ movdqu(Operand(rsp, kFullXMMRegisterSize * 4), xmm10);
+ __ movdqu(Operand(rsp, kFullXMMRegisterSize * 5), xmm11);
+ __ movdqu(Operand(rsp, kFullXMMRegisterSize * 6), xmm12);
+ __ movdqu(Operand(rsp, kFullXMMRegisterSize * 7), xmm13);
+ __ movdqu(Operand(rsp, kFullXMMRegisterSize * 8), xmm14);
+ __ movdqu(Operand(rsp, kFullXMMRegisterSize * 9), xmm15);
+#endif
// Set up the roots and smi constant registers.
// Needs to be done before any further smi loads.
@@ -4389,6 +4407,21 @@
}
// Restore callee-saved registers (X64 conventions).
+#ifdef _WIN64
+ // On Win64 XMM6-XMM15 are callee-save
+ __ movdqu(xmm6, Operand(rsp, kFullXMMRegisterSize * 0));
+ __ movdqu(xmm7, Operand(rsp, kFullXMMRegisterSize * 1));
+ __ movdqu(xmm8, Operand(rsp, kFullXMMRegisterSize * 2));
+ __ movdqu(xmm8, Operand(rsp, kFullXMMRegisterSize * 3));
+ __ movdqu(xmm10, Operand(rsp, kFullXMMRegisterSize * 4));
+ __ movdqu(xmm11, Operand(rsp, kFullXMMRegisterSize * 5));
+ __ movdqu(xmm12, Operand(rsp, kFullXMMRegisterSize * 6));
+ __ movdqu(xmm13, Operand(rsp, kFullXMMRegisterSize * 7));
+ __ movdqu(xmm14, Operand(rsp, kFullXMMRegisterSize * 8));
+ __ movdqu(xmm15, Operand(rsp, kFullXMMRegisterSize * 9));
+ __ addq(rsp, Immediate(kCalleeSaveXMMRegisters * kFullXMMRegisterSize));
+#endif
+
__ pop(rbx);
#ifdef _WIN64
// Callee save on in Win64 ABI, arguments/volatile in AMD64 ABI.
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.