runtime: use LLVM intrinsic to read the stack pointer

This should result in smaller code.
Этот коммит содержится в:
Ayke van Laethem 2021-11-27 14:34:34 +01:00 коммит произвёл Ron Evans
родитель 3d73ee77d3
коммит 74b20ca234
10 изменённых файлов: 17 добавлений и 28 удалений

Просмотреть файл

@ -1,7 +1,5 @@
package runtime package runtime
import "device"
const GOARCH = "386" const GOARCH = "386"
// The bitness of the CPU (e.g. 8, 32, 64). // The bitness of the CPU (e.g. 8, 32, 64).
@ -13,5 +11,5 @@ func align(ptr uintptr) uintptr {
} }
func getCurrentStackPointer() uintptr { func getCurrentStackPointer() uintptr {
return device.AsmFull("movl %esp, {}", nil) return uintptr(stacksave())
} }

Просмотреть файл

@ -1,7 +1,5 @@
package runtime package runtime
import "device"
const GOARCH = "amd64" const GOARCH = "amd64"
// The bitness of the CPU (e.g. 8, 32, 64). // The bitness of the CPU (e.g. 8, 32, 64).
@ -15,5 +13,5 @@ func align(ptr uintptr) uintptr {
} }
func getCurrentStackPointer() uintptr { func getCurrentStackPointer() uintptr {
return device.AsmFull("movq %rsp, {}", nil) return uintptr(stacksave())
} }

Просмотреть файл

@ -2,8 +2,6 @@
package runtime package runtime
import "device/arm"
const GOARCH = "arm" const GOARCH = "arm"
// The bitness of the CPU (e.g. 8, 32, 64). // The bitness of the CPU (e.g. 8, 32, 64).
@ -15,5 +13,5 @@ func align(ptr uintptr) uintptr {
} }
func getCurrentStackPointer() uintptr { func getCurrentStackPointer() uintptr {
return arm.AsmFull("mov {}, sp", nil) return uintptr(stacksave())
} }

Просмотреть файл

@ -1,7 +1,5 @@
package runtime package runtime
import "device/arm"
const GOARCH = "arm64" const GOARCH = "arm64"
// The bitness of the CPU (e.g. 8, 32, 64). // The bitness of the CPU (e.g. 8, 32, 64).
@ -11,6 +9,7 @@ const TargetBits = 64
func align(ptr uintptr) uintptr { func align(ptr uintptr) uintptr {
return (ptr + 7) &^ 7 return (ptr + 7) &^ 7
} }
func getCurrentStackPointer() uintptr { func getCurrentStackPointer() uintptr {
return arm.AsmFull("mov {}, sp", nil) return uintptr(stacksave())
} }

Просмотреть файл

@ -13,4 +13,6 @@ func align(ptr uintptr) uintptr {
return ptr return ptr
} }
func getCurrentStackPointer() uintptr func getCurrentStackPointer() uintptr {
return uintptr(stacksave())
}

Просмотреть файл

@ -17,7 +17,7 @@ func align(ptr uintptr) uintptr {
} }
func getCurrentStackPointer() uintptr { func getCurrentStackPointer() uintptr {
return arm.AsmFull("mov {}, sp", nil) return uintptr(stacksave())
} }
// Documentation: // Documentation:

Просмотреть файл

@ -5,7 +5,7 @@ package runtime
import "device/riscv" import "device/riscv"
func getCurrentStackPointer() uintptr { func getCurrentStackPointer() uintptr {
return riscv.AsmFull("mv {}, sp", nil) return uintptr(stacksave())
} }
// Documentation: // Documentation:

Просмотреть файл

@ -2,8 +2,6 @@
package runtime package runtime
import "device"
const GOARCH = "arm" // xtensa pretends to be arm const GOARCH = "arm" // xtensa pretends to be arm
// The bitness of the CPU (e.g. 8, 32, 64). // The bitness of the CPU (e.g. 8, 32, 64).
@ -15,6 +13,5 @@ func align(ptr uintptr) uintptr {
} }
func getCurrentStackPointer() uintptr { func getCurrentStackPointer() uintptr {
// The stack pointer (sp) is a1. return uintptr(stacksave())
return device.AsmFull("mov {}, sp", nil)
} }

Просмотреть файл

@ -39,6 +39,12 @@ func memmove(dst, src unsafe.Pointer, size uintptr)
// llvm.memset.p0i8.i32(ptr, 0, size, false). // llvm.memset.p0i8.i32(ptr, 0, size, false).
func memzero(ptr unsafe.Pointer, size uintptr) func memzero(ptr unsafe.Pointer, size uintptr)
// This intrinsic returns the current stack pointer.
// It is normally used together with llvm.stackrestore but also works to get the
// current stack pointer in a platform-independent way.
//export llvm.stacksave
func stacksave() unsafe.Pointer
//export strlen //export strlen
func strlen(ptr unsafe.Pointer) uintptr func strlen(ptr unsafe.Pointer) uintptr

Просмотреть файл

@ -69,12 +69,3 @@ __vector_WDT:
pop r16 pop r16
reti reti
; This is necessary for the garbage collector.
; It returns the stack pointer as an uintptr.
.section .text.runtime.getCurrentStackPointer
.global runtime.getCurrentStackPointer
runtime.getCurrentStackPointer:
in r24, 0x3d; SPL
in r25, 0x3e; SPH
ret