diff options
| author | Keith Randall <khr@golang.org> | 2025-06-18 15:06:55 -0700 |
|---|---|---|
| committer | Keith Randall <khr@golang.org> | 2025-07-24 16:06:09 -0700 |
| commit | 394d0bee8d1ad62ba88d4a3b2d93427d6a8ceb33 (patch) | |
| tree | f01a1ae217fb040eaa771b893194d3bdbcabee9f /src/runtime | |
| parent | 3024785b929cd8a740da87e1c24aef2c9b30e019 (diff) | |
| download | go-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.s | 80 |
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 |
