runtime: use LLVM intrinsic to read the stack pointer
This should result in smaller code.
Этот коммит содержится в:
родитель
3d73ee77d3
коммит
74b20ca234
10 изменённых файлов: 17 добавлений и 28 удалений
|
@ -1,7 +1,5 @@
|
|||
package runtime
|
||||
|
||||
import "device"
|
||||
|
||||
const GOARCH = "386"
|
||||
|
||||
// The bitness of the CPU (e.g. 8, 32, 64).
|
||||
|
@ -13,5 +11,5 @@ func align(ptr uintptr) uintptr {
|
|||
}
|
||||
|
||||
func getCurrentStackPointer() uintptr {
|
||||
return device.AsmFull("movl %esp, {}", nil)
|
||||
return uintptr(stacksave())
|
||||
}
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
package runtime
|
||||
|
||||
import "device"
|
||||
|
||||
const GOARCH = "amd64"
|
||||
|
||||
// The bitness of the CPU (e.g. 8, 32, 64).
|
||||
|
@ -15,5 +13,5 @@ func align(ptr uintptr) uintptr {
|
|||
}
|
||||
|
||||
func getCurrentStackPointer() uintptr {
|
||||
return device.AsmFull("movq %rsp, {}", nil)
|
||||
return uintptr(stacksave())
|
||||
}
|
||||
|
|
|
@ -2,8 +2,6 @@
|
|||
|
||||
package runtime
|
||||
|
||||
import "device/arm"
|
||||
|
||||
const GOARCH = "arm"
|
||||
|
||||
// The bitness of the CPU (e.g. 8, 32, 64).
|
||||
|
@ -15,5 +13,5 @@ func align(ptr uintptr) uintptr {
|
|||
}
|
||||
|
||||
func getCurrentStackPointer() uintptr {
|
||||
return arm.AsmFull("mov {}, sp", nil)
|
||||
return uintptr(stacksave())
|
||||
}
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
package runtime
|
||||
|
||||
import "device/arm"
|
||||
|
||||
const GOARCH = "arm64"
|
||||
|
||||
// The bitness of the CPU (e.g. 8, 32, 64).
|
||||
|
@ -11,6 +9,7 @@ const TargetBits = 64
|
|||
func align(ptr uintptr) uintptr {
|
||||
return (ptr + 7) &^ 7
|
||||
}
|
||||
|
||||
func getCurrentStackPointer() uintptr {
|
||||
return arm.AsmFull("mov {}, sp", nil)
|
||||
return uintptr(stacksave())
|
||||
}
|
||||
|
|
|
@ -13,4 +13,6 @@ func align(ptr uintptr) uintptr {
|
|||
return ptr
|
||||
}
|
||||
|
||||
func getCurrentStackPointer() uintptr
|
||||
func getCurrentStackPointer() uintptr {
|
||||
return uintptr(stacksave())
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ func align(ptr uintptr) uintptr {
|
|||
}
|
||||
|
||||
func getCurrentStackPointer() uintptr {
|
||||
return arm.AsmFull("mov {}, sp", nil)
|
||||
return uintptr(stacksave())
|
||||
}
|
||||
|
||||
// Documentation:
|
||||
|
|
|
@ -5,7 +5,7 @@ package runtime
|
|||
import "device/riscv"
|
||||
|
||||
func getCurrentStackPointer() uintptr {
|
||||
return riscv.AsmFull("mv {}, sp", nil)
|
||||
return uintptr(stacksave())
|
||||
}
|
||||
|
||||
// Documentation:
|
||||
|
|
|
@ -2,8 +2,6 @@
|
|||
|
||||
package runtime
|
||||
|
||||
import "device"
|
||||
|
||||
const GOARCH = "arm" // xtensa pretends to be arm
|
||||
|
||||
// The bitness of the CPU (e.g. 8, 32, 64).
|
||||
|
@ -15,6 +13,5 @@ func align(ptr uintptr) uintptr {
|
|||
}
|
||||
|
||||
func getCurrentStackPointer() uintptr {
|
||||
// The stack pointer (sp) is a1.
|
||||
return device.AsmFull("mov {}, sp", nil)
|
||||
return uintptr(stacksave())
|
||||
}
|
||||
|
|
|
@ -39,6 +39,12 @@ func memmove(dst, src unsafe.Pointer, size uintptr)
|
|||
// llvm.memset.p0i8.i32(ptr, 0, size, false).
|
||||
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
|
||||
func strlen(ptr unsafe.Pointer) uintptr
|
||||
|
||||
|
|
|
@ -69,12 +69,3 @@ __vector_WDT:
|
|||
|
||||
pop r16
|
||||
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
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче