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
|
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
|
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче