From a7f7a9cca749a676cee73f28e48c6f7bffa64807 Mon Sep 17 00:00:00 2001 From: Shenghou Ma Date: Thu, 24 Mar 2016 19:35:10 -0400 Subject: [PATCH] runtime, runtime/cgo: save callee-saved FP registers on arm64 For #14876. Change-Id: I0992859264cbaf9c9b691fad53345bbb01b4cf3b Reviewed-on: https://go-review.googlesource.com/21085 Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/runtime/cgo/asm_arm64.s | 20 ++++++++++++++++++-- src/runtime/rt0_darwin_arm64.s | 18 +++++++++++++++++- src/runtime/rt0_linux_arm64.s | 18 +++++++++++++++++- 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/runtime/cgo/asm_arm64.s b/src/runtime/cgo/asm_arm64.s index 64043d0250..9c2e834c0f 100644 --- a/src/runtime/cgo/asm_arm64.s +++ b/src/runtime/cgo/asm_arm64.s @@ -16,7 +16,7 @@ TEXT crosscall2(SB),NOSPLIT,$-8 * first arg. * TODO(minux): use LDP/STP here if it matters. */ - SUB $128, RSP + SUB $(8*24), RSP MOVD R1, (8*1)(RSP) MOVD R2, (8*2)(RSP) MOVD R19, (8*3)(RSP) @@ -31,6 +31,14 @@ TEXT crosscall2(SB),NOSPLIT,$-8 MOVD g, (8*12)(RSP) MOVD R29, (8*13)(RSP) MOVD R30, (8*14)(RSP) + FMOVD F8, (8*15)(RSP) + FMOVD F9, (8*16)(RSP) + FMOVD F10, (8*17)(RSP) + FMOVD F11, (8*18)(RSP) + FMOVD F12, (8*19)(RSP) + FMOVD F13, (8*20)(RSP) + FMOVD F14, (8*21)(RSP) + FMOVD F15, (8*22)(RSP) MOVD R0, R19 @@ -53,5 +61,13 @@ TEXT crosscall2(SB),NOSPLIT,$-8 MOVD (8*12)(RSP), g MOVD (8*13)(RSP), R29 MOVD (8*14)(RSP), R30 - ADD $128, RSP + FMOVD (8*15)(RSP), F8 + FMOVD (8*16)(RSP), F9 + FMOVD (8*17)(RSP), F10 + FMOVD (8*18)(RSP), F11 + FMOVD (8*19)(RSP), F12 + FMOVD (8*20)(RSP), F13 + FMOVD (8*21)(RSP), F14 + FMOVD (8*22)(RSP), F15 + ADD $(8*24), RSP RET diff --git a/src/runtime/rt0_darwin_arm64.s b/src/runtime/rt0_darwin_arm64.s index 0a1feb14a4..f607683d2c 100644 --- a/src/runtime/rt0_darwin_arm64.s +++ b/src/runtime/rt0_darwin_arm64.s @@ -16,7 +16,7 @@ TEXT _rt0_arm64_darwin(SB),NOSPLIT,$-8 // // Note that all currently shipping darwin/arm64 platforms require // cgo and do not support c-shared. -TEXT _rt0_arm64_darwin_lib(SB),NOSPLIT,$88 +TEXT _rt0_arm64_darwin_lib(SB),NOSPLIT,$168 // Preserve callee-save registers. MOVD R19, 24(RSP) MOVD R20, 32(RSP) @@ -27,6 +27,14 @@ TEXT _rt0_arm64_darwin_lib(SB),NOSPLIT,$88 MOVD R25, 72(RSP) MOVD R26, 80(RSP) MOVD R27, 88(RSP) + FMOVD F8, 96(RSP) + FMOVD F9, 104(RSP) + FMOVD F10, 112(RSP) + FMOVD F11, 120(RSP) + FMOVD F12, 128(RSP) + FMOVD F13, 136(RSP) + FMOVD F14, 144(RSP) + FMOVD F15, 152(RSP) MOVD R0, _rt0_arm64_darwin_lib_argc<>(SB) MOVD R1, _rt0_arm64_darwin_lib_argv<>(SB) @@ -51,6 +59,14 @@ TEXT _rt0_arm64_darwin_lib(SB),NOSPLIT,$88 MOVD 72(RSP), R25 MOVD 80(RSP), R26 MOVD 88(RSP), R27 + FMOVD 96(RSP), F8 + FMOVD 104(RSP), F9 + FMOVD 112(RSP), F10 + FMOVD 120(RSP), F11 + FMOVD 128(RSP), F12 + FMOVD 136(RSP), F13 + FMOVD 144(RSP), F14 + FMOVD 152(RSP), F15 RET TEXT _rt0_arm64_darwin_lib_go(SB),NOSPLIT,$0 diff --git a/src/runtime/rt0_linux_arm64.s b/src/runtime/rt0_linux_arm64.s index 31c2367bca..d01d415945 100644 --- a/src/runtime/rt0_linux_arm64.s +++ b/src/runtime/rt0_linux_arm64.s @@ -11,7 +11,7 @@ TEXT _rt0_arm64_linux(SB),NOSPLIT,$-8 // When building with -buildmode=c-shared, this symbol is called when the shared // library is loaded. -TEXT _rt0_arm64_linux_lib(SB),NOSPLIT,$88 +TEXT _rt0_arm64_linux_lib(SB),NOSPLIT,$168 // Preserve callee-save registers. MOVD R19, 24(RSP) MOVD R20, 32(RSP) @@ -22,6 +22,14 @@ TEXT _rt0_arm64_linux_lib(SB),NOSPLIT,$88 MOVD R25, 72(RSP) MOVD R26, 80(RSP) MOVD R27, 88(RSP) + FMOVD F8, 96(RSP) + FMOVD F9, 104(RSP) + FMOVD F10, 112(RSP) + FMOVD F11, 120(RSP) + FMOVD F12, 128(RSP) + FMOVD F13, 136(RSP) + FMOVD F14, 144(RSP) + FMOVD F15, 152(RSP) MOVD R0, _rt0_arm64_linux_lib_argc<>(SB) MOVD R1, _rt0_arm64_linux_lib_argv<>(SB) @@ -58,6 +66,14 @@ restore: MOVD 72(RSP), R25 MOVD 80(RSP), R26 MOVD 88(RSP), R27 + FMOVD 96(RSP), F8 + FMOVD 104(RSP), F9 + FMOVD 112(RSP), F10 + FMOVD 120(RSP), F11 + FMOVD 128(RSP), F12 + FMOVD 136(RSP), F13 + FMOVD 144(RSP), F14 + FMOVD 152(RSP), F15 RET TEXT _rt0_arm64_linux_lib_go(SB),NOSPLIT,$0 -- 2.48.1