all: cherry-pick assembly optimizations from #397 (#423)
Whilst we are debating the pros and cons of #397 I figured it made sense for my to cherry-pick the actual assembly optimizations over in a separate PR. I also ran asmfmt which made some small changes to two other assembly files that have recently been changed.
- commit
- 7618415b05edb090c4c7128ec75a03d1805004c4
- author
- George Adams · · 2026-02-25 14:53 UTC
- committer
- GitHub · · 2026-02-25 14:53 UTC
- parent
- 585a4c5
- signature
- GPG Unverified
B5690EEEBB952194The key is unknown - refs
- tag: v0.11.0-alpha
4 files · +6 -14
M internal/fakecgo/trampolines_loong64.s +0 -5
| @@ -11,29 +11,24 @@ | |||
| 11 | 11 | // R23 is used as temporary register. | |
| 12 | 12 | ||
| 13 | 13 | TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16 | |
| 14 | - | MOVV R4, 8(R3) | |
| 15 | - | MOVV R5, 16(R3) | |
| 16 | 14 | MOVV ·x_cgo_init_call(SB), R23 | |
| 17 | 15 | MOVV (R23), R23 | |
| 18 | 16 | CALL (R23) | |
| 19 | 17 | RET | |
| 20 | 18 | ||
| 21 | 19 | TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8 | |
| 22 | - | MOVV R4, 8(R3) | |
| 23 | 20 | MOVV ·x_cgo_thread_start_call(SB), R23 | |
| 24 | 21 | MOVV (R23), R23 | |
| 25 | 22 | CALL (R23) | |
| 26 | 23 | RET | |
| 27 | 24 | ||
| 28 | 25 | TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8 | |
| 29 | - | MOVV R4, 8(R3) | |
| 30 | 26 | MOVV ·x_cgo_setenv_call(SB), R23 | |
| 31 | 27 | MOVV (R23), R23 | |
| 32 | 28 | CALL (R23) | |
| 33 | 29 | RET | |
| 34 | 30 | ||
| 35 | 31 | TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8 | |
| 36 | - | MOVV R4, 8(R3) | |
| 37 | 32 | MOVV ·x_cgo_unsetenv_call(SB), R23 | |
| 38 | 33 | MOVV (R23), R23 | |
| 39 | 34 | CALL (R23) | |
| @@ -11,29 +11,24 @@ | |||||
| 11 | // R23 is used as temporary register. | 11 | // R23 is used as temporary register. | ||
| 12 | 12 | ||||
| 13 | TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16 | 13 | TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16 | ||
| 14 | - | MOVV R4, 8(R3) | |||
| 15 | - | MOVV R5, 16(R3) | |||
| 16 | MOVV ·x_cgo_init_call(SB), R23 | 14 | MOVV ·x_cgo_init_call(SB), R23 | ||
| 17 | MOVV (R23), R23 | 15 | MOVV (R23), R23 | ||
| 18 | CALL (R23) | 16 | CALL (R23) | ||
| 19 | RET | 17 | RET | ||
| 20 | 18 | ||||
| 21 | TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8 | 19 | TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8 | ||
| 22 | - | MOVV R4, 8(R3) | |||
| 23 | MOVV ·x_cgo_thread_start_call(SB), R23 | 20 | MOVV ·x_cgo_thread_start_call(SB), R23 | ||
| 24 | MOVV (R23), R23 | 21 | MOVV (R23), R23 | ||
| 25 | CALL (R23) | 22 | CALL (R23) | ||
| 26 | RET | 23 | RET | ||
| 27 | 24 | ||||
| 28 | TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8 | 25 | TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8 | ||
| 29 | - | MOVV R4, 8(R3) | |||
| 30 | MOVV ·x_cgo_setenv_call(SB), R23 | 26 | MOVV ·x_cgo_setenv_call(SB), R23 | ||
| 31 | MOVV (R23), R23 | 27 | MOVV (R23), R23 | ||
| 32 | CALL (R23) | 28 | CALL (R23) | ||
| 33 | RET | 29 | RET | ||
| 34 | 30 | ||||
| 35 | TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8 | 31 | TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8 | ||
| 36 | - | MOVV R4, 8(R3) | |||
| 37 | MOVV ·x_cgo_unsetenv_call(SB), R23 | 32 | MOVV ·x_cgo_unsetenv_call(SB), R23 | ||
| 38 | MOVV (R23), R23 | 33 | MOVV (R23), R23 | ||
| 39 | CALL (R23) | 34 | CALL (R23) | ||
M internal/fakecgo/trampolines_riscv64.s +0 -5
| @@ -10,29 +10,24 @@ | |||
| 10 | 10 | // X5 is used as temporary register. | |
| 11 | 11 | ||
| 12 | 12 | TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16 | |
| 13 | - | MOV X10, 8(SP) | |
| 14 | - | MOV X11, 16(SP) | |
| 15 | 13 | MOV ·x_cgo_init_call(SB), X5 | |
| 16 | 14 | MOV (X5), X5 | |
| 17 | 15 | CALL X5 | |
| 18 | 16 | RET | |
| 19 | 17 | ||
| 20 | 18 | TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8 | |
| 21 | - | MOV X10, 8(SP) | |
| 22 | 19 | MOV ·x_cgo_thread_start_call(SB), X5 | |
| 23 | 20 | MOV (X5), X5 | |
| 24 | 21 | CALL X5 | |
| 25 | 22 | RET | |
| 26 | 23 | ||
| 27 | 24 | TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8 | |
| 28 | - | MOV X10, 8(SP) | |
| 29 | 25 | MOV ·x_cgo_setenv_call(SB), X5 | |
| 30 | 26 | MOV (X5), X5 | |
| 31 | 27 | CALL X5 | |
| 32 | 28 | RET | |
| 33 | 29 | ||
| 34 | 30 | TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8 | |
| 35 | - | MOV X10, 8(SP) | |
| 36 | 31 | MOV ·x_cgo_unsetenv_call(SB), X5 | |
| 37 | 32 | MOV (X5), X5 | |
| 38 | 33 | CALL X5 | |
| @@ -10,29 +10,24 @@ | |||||
| 10 | // X5 is used as temporary register. | 10 | // X5 is used as temporary register. | ||
| 11 | 11 | ||||
| 12 | TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16 | 12 | TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16 | ||
| 13 | - | MOV X10, 8(SP) | |||
| 14 | - | MOV X11, 16(SP) | |||
| 15 | MOV ·x_cgo_init_call(SB), X5 | 13 | MOV ·x_cgo_init_call(SB), X5 | ||
| 16 | MOV (X5), X5 | 14 | MOV (X5), X5 | ||
| 17 | CALL X5 | 15 | CALL X5 | ||
| 18 | RET | 16 | RET | ||
| 19 | 17 | ||||
| 20 | TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8 | 18 | TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8 | ||
| 21 | - | MOV X10, 8(SP) | |||
| 22 | MOV ·x_cgo_thread_start_call(SB), X5 | 19 | MOV ·x_cgo_thread_start_call(SB), X5 | ||
| 23 | MOV (X5), X5 | 20 | MOV (X5), X5 | ||
| 24 | CALL X5 | 21 | CALL X5 | ||
| 25 | RET | 22 | RET | ||
| 26 | 23 | ||||
| 27 | TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8 | 24 | TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8 | ||
| 28 | - | MOV X10, 8(SP) | |||
| 29 | MOV ·x_cgo_setenv_call(SB), X5 | 25 | MOV ·x_cgo_setenv_call(SB), X5 | ||
| 30 | MOV (X5), X5 | 26 | MOV (X5), X5 | ||
| 31 | CALL X5 | 27 | CALL X5 | ||
| 32 | RET | 28 | RET | ||
| 33 | 29 | ||||
| 34 | TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8 | 30 | TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8 | ||
| 35 | - | MOV X10, 8(SP) | |||
| 36 | MOV ·x_cgo_unsetenv_call(SB), X5 | 31 | MOV ·x_cgo_unsetenv_call(SB), X5 | ||
| 37 | MOV (X5), X5 | 32 | MOV (X5), X5 | ||
| 38 | CALL X5 | 33 | CALL X5 | ||
M sys_amd64.s +4 -3
| @@ -92,9 +92,10 @@ TEXT syscall15X(SB), NOSPLIT|NOFRAME, $0 | |||
| 92 | 92 | MOVQ X1, syscall15Args_f2(DI) // f2 | |
| 93 | 93 | ||
| 94 | 94 | #ifdef GOOS_darwin | |
| 95 | - | CALL purego_error(SB) | |
| 96 | - | MOVD (AX), AX | |
| 97 | - | MOVD AX, syscall15Args_a3(DI) // save errno | |
| 95 | + | CALL purego_error(SB) | |
| 96 | + | MOVD (AX), AX | |
| 97 | + | MOVD AX, syscall15Args_a3(DI) // save errno | |
| 98 | + | ||
| 98 | 99 | #endif | |
| 99 | 100 | ||
| 100 | 101 | XORL AX, AX // no error (it's ignored anyway) | |
| @@ -92,9 +92,10 @@ TEXT syscall15X(SB), NOSPLIT|NOFRAME, $0 | |||||
| 92 | MOVQ X1, syscall15Args_f2(DI) // f2 | 92 | MOVQ X1, syscall15Args_f2(DI) // f2 | ||
| 93 | 93 | ||||
| 94 | #ifdef GOOS_darwin | 94 | #ifdef GOOS_darwin | ||
| 95 | - | CALL purego_error(SB) | 95 | + | CALL purego_error(SB) |
| 96 | - | MOVD (AX), AX | 96 | + | MOVD (AX), AX |
| 97 | - | MOVD AX, syscall15Args_a3(DI) // save errno | 97 | + | MOVD AX, syscall15Args_a3(DI) // save errno |
| 98 | + | ||||
| 98 | #endif | 99 | #endif | ||
| 99 | 100 | ||||
| 100 | XORL AX, AX // no error (it's ignored anyway) | 101 | XORL AX, AX // no error (it's ignored anyway) | ||
M sys_arm64.s +2 -1
| @@ -90,8 +90,9 @@ TEXT syscall15X(SB), NOSPLIT, $0 | |||
| 90 | 90 | FMOVD F3, syscall15Args_f4(R2) // save f3 | |
| 91 | 91 | ||
| 92 | 92 | #ifdef GOOS_darwin | |
| 93 | - | BL purego_error(SB) | |
| 93 | + | BL purego_error(SB) | |
| 94 | 94 | MOVD (R0), R0 | |
| 95 | 95 | MOVD R0, syscall15Args_a3(R2) // save errno | |
| 96 | + | ||
| 96 | 97 | #endif | |
| 97 | 98 | RET | |
| @@ -90,8 +90,9 @@ TEXT syscall15X(SB), NOSPLIT, $0 | |||||
| 90 | FMOVD F3, syscall15Args_f4(R2) // save f3 | 90 | FMOVD F3, syscall15Args_f4(R2) // save f3 | ||
| 91 | 91 | ||||
| 92 | #ifdef GOOS_darwin | 92 | #ifdef GOOS_darwin | ||
| 93 | - | BL purego_error(SB) | 93 | + | BL purego_error(SB) |
| 94 | MOVD (R0), R0 | 94 | MOVD (R0), R0 | ||
| 95 | MOVD R0, syscall15Args_a3(R2) // save errno | 95 | MOVD R0, syscall15Args_a3(R2) // save errno | ||
| 96 | + | ||||
| 96 | #endif | 97 | #endif | ||
| 97 | RET | 98 | RET | ||