1
0
mirror of https://github.com/golang/go synced 2024-11-19 16:14:49 -07:00
go/src/runtime/cgo/asm_arm.s
Elias Naur 72eb46c5a0 runtime,runtime/cgo: save callee-saved FP register on arm
Other GOARCHs already handle their callee-saved FP registers, but
arm was missing. Without this change, code using Cgo and floating
point code might fail in mysterious and hard to debug ways.

There are no floating point registers when GOARM=5, so skip the
registers when runtime.goarm < 6.

darwin/arm doesn't support GOARM=5, so the check is left out of
rt0_darwin_arm.s.

Fixes #14876

Change-Id: I6bcb90a76df3664d8ba1f33123a74b1eb2c9f8b2
Reviewed-on: https://go-review.googlesource.com/23140
Run-TryBot: Elias Naur <elias.naur@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Minux Ma <minux@golang.org>
2016-05-25 06:54:28 +00:00

56 lines
1.7 KiB
ArmAsm

// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#include "textflag.h"
// Called by C code generated by cmd/cgo.
// func crosscall2(fn func(a unsafe.Pointer, n int32, ctxt uintptr), a unsafe.Pointer, n int32, ctxt uintptr)
// Saves C callee-saved registers and calls fn with three arguments.
TEXT crosscall2(SB),NOSPLIT,$-4
/*
* We still need to save all callee save register as before, and then
* push 3 args for fn (R1, R2, R3).
* Also note that at procedure entry in gc world, 4(R13) will be the
* first arg, so we must push another dummy reg (R0) for 0(R13).
* Additionally, runtime·load_g will clobber R0, so we need to save R0
* nevertheless.
*/
SUB $(8*9), R13 // Reserve space for the floating point registers.
MOVM.WP [R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, g, R11, R12, R14], (R13)
// Skip floating point registers on GOARM < 6.
MOVB runtime·goarm(SB), R11
CMP $6, R11
BLT skipfpsave
MOVD F8, (14*4+8*1)(R13)
MOVD F9, (14*4+8*2)(R13)
MOVD F10, (14*4+8*3)(R13)
MOVD F11, (14*4+8*4)(R13)
MOVD F12, (14*4+8*5)(R13)
MOVD F13, (14*4+8*6)(R13)
MOVD F14, (14*4+8*7)(R13)
MOVD F15, (14*4+8*8)(R13)
skipfpsave:
BL runtime·load_g(SB)
MOVW R15, R14 // R15 is PC.
MOVW 0(R13), R15
MOVB runtime·goarm(SB), R11
CMP $6, R11
BLT skipfprest
MOVD (14*4+8*1)(R13), F8
MOVD (14*4+8*2)(R13), F9
MOVD (14*4+8*3)(R13), F10
MOVD (14*4+8*4)(R13), F11
MOVD (14*4+8*5)(R13), F12
MOVD (14*4+8*6)(R13), F13
MOVD (14*4+8*7)(R13), F14
MOVD (14*4+8*8)(R13), F15
skipfprest:
MOVM.IAW (R13), [R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, g, R11, R12, R14]
ADD $(8*9), R13
MOVW R14, R15