aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2025-06-18 15:06:55 -0700
committerKeith Randall <khr@golang.org>2025-07-24 16:06:09 -0700
commit394d0bee8d1ad62ba88d4a3b2d93427d6a8ceb33 (patch)
treef01a1ae217fb040eaa771b893194d3bdbcabee9f /src/runtime
parent3024785b929cd8a740da87e1c24aef2c9b30e019 (diff)
downloadgo-394d0bee8d1ad62ba88d4a3b2d93427d6a8ceb33.tar.xz
cmd/compile: move arm64 over to new bounds check strategy
For all the static bounds checks in cmd/go, we have: 6877 just a single instruction (the call itself) 139 needs an additional reg-reg move 602 needs an additional constant load 25 needs some other instruction that's ~90% implemented using just a single instruction. Reduces the text size of cmd/go by ~0.8%. Total binary size is just barely smaller, ~0.2%. (The difference is the new pcdata table.) Change-Id: I416e9c196f5d8d0e8f08e191e6df3045e11dccbe Reviewed-on: https://go-review.googlesource.com/c/go/+/682496 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Michael Knyszek <mknyszek@google.com>
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/asm_arm64.s80
1 files changed, 16 insertions, 64 deletions
diff --git a/src/runtime/asm_arm64.s b/src/runtime/asm_arm64.s
index d2261c5160..a0072a3931 100644
--- a/src/runtime/asm_arm64.s
+++ b/src/runtime/asm_arm64.s
@@ -1574,70 +1574,22 @@ TEXT runtime·debugCallPanicked(SB),NOSPLIT,$16-16
BREAK
RET
-// Note: these functions use a special calling convention to save generated code space.
-// Arguments are passed in registers, but the space for those arguments are allocated
-// in the caller's stack frame. These stubs write the args into that stack space and
-// then tail call to the corresponding runtime handler.
-// The tail call makes these stubs disappear in backtraces.
-//
-// Defined as ABIInternal since the compiler generates ABIInternal
-// calls to it directly and it does not use the stack-based Go ABI.
-TEXT runtime·panicIndex<ABIInternal>(SB),NOSPLIT,$0-16
- JMP runtime·goPanicIndex<ABIInternal>(SB)
-TEXT runtime·panicIndexU<ABIInternal>(SB),NOSPLIT,$0-16
- JMP runtime·goPanicIndexU<ABIInternal>(SB)
-TEXT runtime·panicSliceAlen<ABIInternal>(SB),NOSPLIT,$0-16
- MOVD R1, R0
- MOVD R2, R1
- JMP runtime·goPanicSliceAlen<ABIInternal>(SB)
-TEXT runtime·panicSliceAlenU<ABIInternal>(SB),NOSPLIT,$0-16
- MOVD R1, R0
- MOVD R2, R1
- JMP runtime·goPanicSliceAlenU<ABIInternal>(SB)
-TEXT runtime·panicSliceAcap<ABIInternal>(SB),NOSPLIT,$0-16
- MOVD R1, R0
- MOVD R2, R1
- JMP runtime·goPanicSliceAcap<ABIInternal>(SB)
-TEXT runtime·panicSliceAcapU<ABIInternal>(SB),NOSPLIT,$0-16
- MOVD R1, R0
- MOVD R2, R1
- JMP runtime·goPanicSliceAcapU<ABIInternal>(SB)
-TEXT runtime·panicSliceB<ABIInternal>(SB),NOSPLIT,$0-16
- JMP runtime·goPanicSliceB<ABIInternal>(SB)
-TEXT runtime·panicSliceBU<ABIInternal>(SB),NOSPLIT,$0-16
- JMP runtime·goPanicSliceBU<ABIInternal>(SB)
-TEXT runtime·panicSlice3Alen<ABIInternal>(SB),NOSPLIT,$0-16
- MOVD R2, R0
- MOVD R3, R1
- JMP runtime·goPanicSlice3Alen<ABIInternal>(SB)
-TEXT runtime·panicSlice3AlenU<ABIInternal>(SB),NOSPLIT,$0-16
- MOVD R2, R0
- MOVD R3, R1
- JMP runtime·goPanicSlice3AlenU<ABIInternal>(SB)
-TEXT runtime·panicSlice3Acap<ABIInternal>(SB),NOSPLIT,$0-16
- MOVD R2, R0
- MOVD R3, R1
- JMP runtime·goPanicSlice3Acap<ABIInternal>(SB)
-TEXT runtime·panicSlice3AcapU<ABIInternal>(SB),NOSPLIT,$0-16
- MOVD R2, R0
- MOVD R3, R1
- JMP runtime·goPanicSlice3AcapU<ABIInternal>(SB)
-TEXT runtime·panicSlice3B<ABIInternal>(SB),NOSPLIT,$0-16
- MOVD R1, R0
- MOVD R2, R1
- JMP runtime·goPanicSlice3B<ABIInternal>(SB)
-TEXT runtime·panicSlice3BU<ABIInternal>(SB),NOSPLIT,$0-16
- MOVD R1, R0
- MOVD R2, R1
- JMP runtime·goPanicSlice3BU<ABIInternal>(SB)
-TEXT runtime·panicSlice3C<ABIInternal>(SB),NOSPLIT,$0-16
- JMP runtime·goPanicSlice3C<ABIInternal>(SB)
-TEXT runtime·panicSlice3CU<ABIInternal>(SB),NOSPLIT,$0-16
- JMP runtime·goPanicSlice3CU<ABIInternal>(SB)
-TEXT runtime·panicSliceConvert<ABIInternal>(SB),NOSPLIT,$0-16
- MOVD R2, R0
- MOVD R3, R1
- JMP runtime·goPanicSliceConvert<ABIInternal>(SB)
+TEXT runtime·panicBounds<ABIInternal>(SB),NOSPLIT,$144-0
+ NO_LOCAL_POINTERS
+ // Save all 16 int registers that could have an index in them.
+ // They may be pointers, but if they are they are dead.
+ STP (R0, R1), 24(RSP)
+ STP (R2, R3), 40(RSP)
+ STP (R4, R5), 56(RSP)
+ STP (R6, R7), 72(RSP)
+ STP (R8, R9), 88(RSP)
+ STP (R10, R11), 104(RSP)
+ STP (R12, R13), 120(RSP)
+ STP (R14, R15), 136(RSP)
+ MOVD LR, R0 // PC immediately after call to panicBounds
+ ADD $24, RSP, R1 // pointer to save area
+ CALL runtime·panicBounds64<ABIInternal>(SB)
+ RET
TEXT ·getfp<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
MOVD R29, R0