Skip to content

Commit 7191643

Browse files
committed
runtime/cgo: save callee-saved xmm registers on windows/amd64
For golang#14876. Change-Id: I33947f74e8058437a784862f1f064974afc99250 Reviewed-on: https://go-review.googlesource.com/21084 Reviewed-by: Alex Brainman <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]>
1 parent eb033b1 commit 7191643

1 file changed

Lines changed: 29 additions & 1 deletion

File tree

src/runtime/cgo/asm_amd64.s

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@
99
* Save registers and call fn with two arguments.
1010
*/
1111
TEXT crosscall2(SB),NOSPLIT,$0
12+
#ifndef GOOS_windows
1213
SUBQ $0x58, SP /* keeps stack pointer 32-byte aligned */
14+
#else
15+
SUBQ $0xf8, SP /* also need to save xmm6 - xmm15 */
16+
#endif
1317
MOVQ BX, 0x10(SP)
1418
MOVQ BP, 0x18(SP)
1519
MOVQ R12, 0x20(SP)
@@ -18,9 +22,19 @@ TEXT crosscall2(SB),NOSPLIT,$0
1822
MOVQ R15, 0x38(SP)
1923

2024
#ifdef GOOS_windows
21-
// Win64 save RBX, RBP, RDI, RSI, RSP, R12, R13, R14, and R15
25+
// Win64 save RBX, RBP, RDI, RSI, RSP, R12, R13, R14, R15 and XMM6 -- XMM15.
2226
MOVQ DI, 0x40(SP)
2327
MOVQ SI, 0x48(SP)
28+
MOVUPS X6, 0x50(SP)
29+
MOVUPS X7, 0x60(SP)
30+
MOVUPS X8, 0x70(SP)
31+
MOVUPS X9, 0x80(SP)
32+
MOVUPS X10, 0x90(SP)
33+
MOVUPS X11, 0xa0(SP)
34+
MOVUPS X12, 0xb0(SP)
35+
MOVUPS X13, 0xc0(SP)
36+
MOVUPS X14, 0xd0(SP)
37+
MOVUPS X15, 0xe0(SP)
2438

2539
MOVQ DX, 0(SP) /* arg */
2640
MOVQ R8, 8(SP) /* argsize (includes padding) */
@@ -29,6 +43,16 @@ TEXT crosscall2(SB),NOSPLIT,$0
2943

3044
MOVQ 0x40(SP), DI
3145
MOVQ 0x48(SP), SI
46+
MOVUPS 0x50(SP), X6
47+
MOVUPS 0x60(SP), X7
48+
MOVUPS 0x70(SP), X8
49+
MOVUPS 0x80(SP), X9
50+
MOVUPS 0x90(SP), X10
51+
MOVUPS 0xa0(SP), X11
52+
MOVUPS 0xb0(SP), X12
53+
MOVUPS 0xc0(SP), X13
54+
MOVUPS 0xd0(SP), X14
55+
MOVUPS 0xe0(SP), X15
3256
#else
3357
MOVQ SI, 0(SP) /* arg */
3458
MOVQ DX, 8(SP) /* argsize (includes padding) */
@@ -43,5 +67,9 @@ TEXT crosscall2(SB),NOSPLIT,$0
4367
MOVQ 0x30(SP), R14
4468
MOVQ 0x38(SP), R15
4569

70+
#ifndef GOOS_windows
4671
ADDQ $0x58, SP
72+
#else
73+
ADDQ $0xf8, SP
74+
#endif
4775
RET

0 commit comments

Comments
 (0)