internal/fakecgo: use C ABI in arm64/loong64/riscv64 trampolines (#395)
Same as #394 but for arm64/loong64/riscv64.
- commit
- 43e2ab6b78a92c4d7c02c4321098cac5cc43e1e7
- author
- Quim Muntal · · 2026-01-23 04:03 UTC
- committer
- GitHub · · 2026-01-23 04:03 UTC
- parent
- 4f3cc27
- signature
- GPG Unverified
B5690EEEBB952194The key is unknown
3 files · +53 -50
M internal/fakecgo/trampolines_arm64.s +20 -19
| @@ -9,29 +9,30 @@ | |||
| 9 | 9 | ||
| 10 | 10 | // These trampolines map the gcc ABI to Go ABIInternal and then calls into the Go equivalent functions. | |
| 11 | 11 | // Note that C arguments are passed in R0-R7, which matches Go ABIInternal for the first eight arguments. | |
| 12 | + | // R9 is used as a temporary register. | |
| 12 | 13 | ||
| 13 | 14 | TEXT x_cgo_init_trampoline(SB), NOSPLIT, $0-0 | |
| 14 | - | MOVD ·x_cgo_init_call(SB), R26 | |
| 15 | - | MOVD (R26), R2 | |
| 16 | - | CALL (R2) | |
| 15 | + | MOVD ·x_cgo_init_call(SB), R9 | |
| 16 | + | MOVD (R9), R9 | |
| 17 | + | CALL R9 | |
| 17 | 18 | RET | |
| 18 | 19 | ||
| 19 | 20 | TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $0-0 | |
| 20 | - | MOVD ·x_cgo_thread_start_call(SB), R26 | |
| 21 | - | MOVD (R26), R2 | |
| 22 | - | CALL (R2) | |
| 21 | + | MOVD ·x_cgo_thread_start_call(SB), R9 | |
| 22 | + | MOVD (R9), R9 | |
| 23 | + | CALL R9 | |
| 23 | 24 | RET | |
| 24 | 25 | ||
| 25 | 26 | TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $0-0 | |
| 26 | - | MOVD ·x_cgo_setenv_call(SB), R26 | |
| 27 | - | MOVD (R26), R2 | |
| 28 | - | CALL (R2) | |
| 27 | + | MOVD ·x_cgo_setenv_call(SB), R9 | |
| 28 | + | MOVD (R9), R9 | |
| 29 | + | CALL R9 | |
| 29 | 30 | RET | |
| 30 | 31 | ||
| 31 | 32 | TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $0-0 | |
| 32 | - | MOVD ·x_cgo_unsetenv_call(SB), R26 | |
| 33 | - | MOVD (R26), R2 | |
| 34 | - | CALL (R2) | |
| 33 | + | MOVD ·x_cgo_unsetenv_call(SB), R9 | |
| 34 | + | MOVD (R9), R9 | |
| 35 | + | CALL R9 | |
| 35 | 36 | RET | |
| 36 | 37 | ||
| 37 | 38 | TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0-0 | |
| @@ -45,8 +46,8 @@ TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0 | |||
| 45 | 46 | // func setg_trampoline(setg uintptr, g uintptr) | |
| 46 | 47 | TEXT ·setg_trampoline(SB), NOSPLIT, $0-16 | |
| 47 | 48 | MOVD G+8(FP), R0 | |
| 48 | - | MOVD setg+0(FP), R1 | |
| 49 | - | CALL R1 | |
| 49 | + | MOVD setg+0(FP), R9 | |
| 50 | + | CALL R9 | |
| 50 | 51 | RET | |
| 51 | 52 | ||
| 52 | 53 | TEXT threadentry_trampoline(SB), NOSPLIT, $0-0 | |
| @@ -59,9 +60,9 @@ TEXT threadentry_trampoline(SB), NOSPLIT, $0-0 | |||
| 59 | 60 | SAVE_F8_TO_F15(8*14) | |
| 60 | 61 | STP (R29, R30), (8*22)(RSP) | |
| 61 | 62 | ||
| 62 | - | MOVD ·threadentry_call(SB), R26 | |
| 63 | - | MOVD (R26), R2 | |
| 64 | - | CALL (R2) | |
| 63 | + | MOVD ·threadentry_call(SB), R9 | |
| 64 | + | MOVD (R9), R9 | |
| 65 | + | CALL R9 | |
| 65 | 66 | MOVD $0, R0 // TODO: get the return value from threadentry | |
| 66 | 67 | ||
| 67 | 68 | RESTORE_R19_TO_R28(8*4) | |
| @@ -72,12 +73,12 @@ TEXT threadentry_trampoline(SB), NOSPLIT, $0-0 | |||
| 72 | 73 | RET | |
| 73 | 74 | ||
| 74 | 75 | TEXT ·call5(SB), NOSPLIT, $0-0 | |
| 75 | - | MOVD fn+0(FP), R6 | |
| 76 | + | MOVD fn+0(FP), R9 | |
| 76 | 77 | MOVD a1+8(FP), R0 | |
| 77 | 78 | MOVD a2+16(FP), R1 | |
| 78 | 79 | MOVD a3+24(FP), R2 | |
| 79 | 80 | MOVD a4+32(FP), R3 | |
| 80 | 81 | MOVD a5+40(FP), R4 | |
| 81 | - | CALL R6 | |
| 82 | + | CALL R9 | |
| 82 | 83 | MOVD R0, ret+48(FP) | |
| 83 | 84 | RET | |
| @@ -9,29 +9,30 @@ | |||||
| 9 | 9 | ||||
| 10 | // These trampolines map the gcc ABI to Go ABIInternal and then calls into the Go equivalent functions. | 10 | // These trampolines map the gcc ABI to Go ABIInternal and then calls into the Go equivalent functions. | ||
| 11 | // Note that C arguments are passed in R0-R7, which matches Go ABIInternal for the first eight arguments. | 11 | // Note that C arguments are passed in R0-R7, which matches Go ABIInternal for the first eight arguments. | ||
| 12 | + | // R9 is used as a temporary register. | |||
| 12 | 13 | ||||
| 13 | TEXT x_cgo_init_trampoline(SB), NOSPLIT, $0-0 | 14 | TEXT x_cgo_init_trampoline(SB), NOSPLIT, $0-0 | ||
| 14 | - | MOVD ·x_cgo_init_call(SB), R26 | 15 | + | MOVD ·x_cgo_init_call(SB), R9 |
| 15 | - | MOVD (R26), R2 | 16 | + | MOVD (R9), R9 |
| 16 | - | CALL (R2) | 17 | + | CALL R9 |
| 17 | RET | 18 | RET | ||
| 18 | 19 | ||||
| 19 | TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $0-0 | 20 | TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $0-0 | ||
| 20 | - | MOVD ·x_cgo_thread_start_call(SB), R26 | 21 | + | MOVD ·x_cgo_thread_start_call(SB), R9 |
| 21 | - | MOVD (R26), R2 | 22 | + | MOVD (R9), R9 |
| 22 | - | CALL (R2) | 23 | + | CALL R9 |
| 23 | RET | 24 | RET | ||
| 24 | 25 | ||||
| 25 | TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $0-0 | 26 | TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $0-0 | ||
| 26 | - | MOVD ·x_cgo_setenv_call(SB), R26 | 27 | + | MOVD ·x_cgo_setenv_call(SB), R9 |
| 27 | - | MOVD (R26), R2 | 28 | + | MOVD (R9), R9 |
| 28 | - | CALL (R2) | 29 | + | CALL R9 |
| 29 | RET | 30 | RET | ||
| 30 | 31 | ||||
| 31 | TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $0-0 | 32 | TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $0-0 | ||
| 32 | - | MOVD ·x_cgo_unsetenv_call(SB), R26 | 33 | + | MOVD ·x_cgo_unsetenv_call(SB), R9 |
| 33 | - | MOVD (R26), R2 | 34 | + | MOVD (R9), R9 |
| 34 | - | CALL (R2) | 35 | + | CALL R9 |
| 35 | RET | 36 | RET | ||
| 36 | 37 | ||||
| 37 | TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0-0 | 38 | TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0-0 | ||
| @@ -45,8 +46,8 @@ TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0 | |||||
| 45 | // func setg_trampoline(setg uintptr, g uintptr) | 46 | // func setg_trampoline(setg uintptr, g uintptr) | ||
| 46 | TEXT ·setg_trampoline(SB), NOSPLIT, $0-16 | 47 | TEXT ·setg_trampoline(SB), NOSPLIT, $0-16 | ||
| 47 | MOVD G+8(FP), R0 | 48 | MOVD G+8(FP), R0 | ||
| 48 | - | MOVD setg+0(FP), R1 | 49 | + | MOVD setg+0(FP), R9 |
| 49 | - | CALL R1 | 50 | + | CALL R9 |
| 50 | RET | 51 | RET | ||
| 51 | 52 | ||||
| 52 | TEXT threadentry_trampoline(SB), NOSPLIT, $0-0 | 53 | TEXT threadentry_trampoline(SB), NOSPLIT, $0-0 | ||
| @@ -59,9 +60,9 @@ TEXT threadentry_trampoline(SB), NOSPLIT, $0-0 | |||||
| 59 | SAVE_F8_TO_F15(8*14) | 60 | SAVE_F8_TO_F15(8*14) | ||
| 60 | STP (R29, R30), (8*22)(RSP) | 61 | STP (R29, R30), (8*22)(RSP) | ||
| 61 | 62 | ||||
| 62 | - | MOVD ·threadentry_call(SB), R26 | 63 | + | MOVD ·threadentry_call(SB), R9 |
| 63 | - | MOVD (R26), R2 | 64 | + | MOVD (R9), R9 |
| 64 | - | CALL (R2) | 65 | + | CALL R9 |
| 65 | MOVD $0, R0 // TODO: get the return value from threadentry | 66 | MOVD $0, R0 // TODO: get the return value from threadentry | ||
| 66 | 67 | ||||
| 67 | RESTORE_R19_TO_R28(8*4) | 68 | RESTORE_R19_TO_R28(8*4) | ||
| @@ -72,12 +73,12 @@ TEXT threadentry_trampoline(SB), NOSPLIT, $0-0 | |||||
| 72 | RET | 73 | RET | ||
| 73 | 74 | ||||
| 74 | TEXT ·call5(SB), NOSPLIT, $0-0 | 75 | TEXT ·call5(SB), NOSPLIT, $0-0 | ||
| 75 | - | MOVD fn+0(FP), R6 | 76 | + | MOVD fn+0(FP), R9 |
| 76 | MOVD a1+8(FP), R0 | 77 | MOVD a1+8(FP), R0 | ||
| 77 | MOVD a2+16(FP), R1 | 78 | MOVD a2+16(FP), R1 | ||
| 78 | MOVD a3+24(FP), R2 | 79 | MOVD a3+24(FP), R2 | ||
| 79 | MOVD a4+32(FP), R3 | 80 | MOVD a4+32(FP), R3 | ||
| 80 | MOVD a5+40(FP), R4 | 81 | MOVD a5+40(FP), R4 | ||
| 81 | - | CALL R6 | 82 | + | CALL R9 |
| 82 | MOVD R0, ret+48(FP) | 83 | MOVD R0, ret+48(FP) | ||
| 83 | RET | 84 | RET | ||
M internal/fakecgo/trampolines_loong64.s +20 -19
| @@ -8,34 +8,35 @@ | |||
| 8 | 8 | #include "abi_loong64.h" | |
| 9 | 9 | ||
| 10 | 10 | // these trampolines map the gcc ABI to Go ABI and then calls into the Go equivalent functions. | |
| 11 | + | // R23 is used as temporary register. | |
| 11 | 12 | ||
| 12 | 13 | TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16 | |
| 13 | 14 | MOVV R4, 8(R3) | |
| 14 | 15 | MOVV R5, 16(R3) | |
| 15 | - | MOVV ·x_cgo_init_call(SB), R6 | |
| 16 | - | MOVV (R6), R7 | |
| 17 | - | CALL (R7) | |
| 16 | + | MOVV ·x_cgo_init_call(SB), R23 | |
| 17 | + | MOVV (R23), R23 | |
| 18 | + | CALL (R23) | |
| 18 | 19 | RET | |
| 19 | 20 | ||
| 20 | 21 | TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8 | |
| 21 | 22 | MOVV R4, 8(R3) | |
| 22 | - | MOVV ·x_cgo_thread_start_call(SB), R5 | |
| 23 | - | MOVV (R5), R6 | |
| 24 | - | CALL (R6) | |
| 23 | + | MOVV ·x_cgo_thread_start_call(SB), R23 | |
| 24 | + | MOVV (R23), R23 | |
| 25 | + | CALL (R23) | |
| 25 | 26 | RET | |
| 26 | 27 | ||
| 27 | 28 | TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8 | |
| 28 | 29 | MOVV R4, 8(R3) | |
| 29 | - | MOVV ·x_cgo_setenv_call(SB), R5 | |
| 30 | - | MOVV (R5), R6 | |
| 31 | - | CALL (R6) | |
| 30 | + | MOVV ·x_cgo_setenv_call(SB), R23 | |
| 31 | + | MOVV (R23), R23 | |
| 32 | + | CALL (R23) | |
| 32 | 33 | RET | |
| 33 | 34 | ||
| 34 | 35 | TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8 | |
| 35 | 36 | MOVV R4, 8(R3) | |
| 36 | - | MOVV ·x_cgo_unsetenv_call(SB), R5 | |
| 37 | - | MOVV (R5), R6 | |
| 38 | - | CALL (R6) | |
| 37 | + | MOVV ·x_cgo_unsetenv_call(SB), R23 | |
| 38 | + | MOVV (R23), R23 | |
| 39 | + | CALL (R23) | |
| 39 | 40 | RET | |
| 40 | 41 | ||
| 41 | 42 | TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0 | |
| @@ -49,8 +50,8 @@ TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0 | |||
| 49 | 50 | // func setg_trampoline(setg uintptr, g uintptr) | |
| 50 | 51 | TEXT ·setg_trampoline(SB), NOSPLIT, $0 | |
| 51 | 52 | MOVV G+8(FP), R4 | |
| 52 | - | MOVV setg+0(FP), R5 | |
| 53 | - | CALL (R5) | |
| 53 | + | MOVV setg+0(FP), R23 | |
| 54 | + | CALL (R23) | |
| 54 | 55 | RET | |
| 55 | 56 | ||
| 56 | 57 | TEXT threadentry_trampoline(SB), NOSPLIT, $0 | |
| @@ -64,9 +65,9 @@ TEXT threadentry_trampoline(SB), NOSPLIT, $0 | |||
| 64 | 65 | SAVE_F24_TO_F31((14*8)) | |
| 65 | 66 | MOVV R1, (22*8)(R3) | |
| 66 | 67 | ||
| 67 | - | MOVV ·threadentry_call(SB), R5 | |
| 68 | - | MOVV (R5), R6 | |
| 69 | - | CALL (R6) | |
| 68 | + | MOVV ·threadentry_call(SB), R23 | |
| 69 | + | MOVV (R23), R23 | |
| 70 | + | CALL (R23) | |
| 70 | 71 | ||
| 71 | 72 | RESTORE_R22_TO_R31((4*8)) | |
| 72 | 73 | RESTORE_F24_TO_F31((14*8)) | |
| @@ -76,12 +77,12 @@ TEXT threadentry_trampoline(SB), NOSPLIT, $0 | |||
| 76 | 77 | RET | |
| 77 | 78 | ||
| 78 | 79 | TEXT ·call5(SB), NOSPLIT, $0-0 | |
| 79 | - | MOVV fn+0(FP), R9 | |
| 80 | + | MOVV fn+0(FP), R23 | |
| 80 | 81 | MOVV a1+8(FP), R4 | |
| 81 | 82 | MOVV a2+16(FP), R5 | |
| 82 | 83 | MOVV a3+24(FP), R6 | |
| 83 | 84 | MOVV a4+32(FP), R7 | |
| 84 | 85 | MOVV a5+40(FP), R8 | |
| 85 | - | CALL (R9) | |
| 86 | + | CALL (R23) | |
| 86 | 87 | MOVV R4, ret+48(FP) | |
| 87 | 88 | RET | |
| @@ -8,34 +8,35 @@ | |||||
| 8 | #include "abi_loong64.h" | 8 | #include "abi_loong64.h" | ||
| 9 | 9 | ||||
| 10 | // these trampolines map the gcc ABI to Go ABI and then calls into the Go equivalent functions. | 10 | // these trampolines map the gcc ABI to Go ABI and then calls into the Go equivalent functions. | ||
| 11 | + | // R23 is used as temporary register. | |||
| 11 | 12 | ||||
| 12 | TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16 | 13 | TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16 | ||
| 13 | MOVV R4, 8(R3) | 14 | MOVV R4, 8(R3) | ||
| 14 | MOVV R5, 16(R3) | 15 | MOVV R5, 16(R3) | ||
| 15 | - | MOVV ·x_cgo_init_call(SB), R6 | 16 | + | MOVV ·x_cgo_init_call(SB), R23 |
| 16 | - | MOVV (R6), R7 | 17 | + | MOVV (R23), R23 |
| 17 | - | CALL (R7) | 18 | + | CALL (R23) |
| 18 | RET | 19 | RET | ||
| 19 | 20 | ||||
| 20 | TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8 | 21 | TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8 | ||
| 21 | MOVV R4, 8(R3) | 22 | MOVV R4, 8(R3) | ||
| 22 | - | MOVV ·x_cgo_thread_start_call(SB), R5 | 23 | + | MOVV ·x_cgo_thread_start_call(SB), R23 |
| 23 | - | MOVV (R5), R6 | 24 | + | MOVV (R23), R23 |
| 24 | - | CALL (R6) | 25 | + | CALL (R23) |
| 25 | RET | 26 | RET | ||
| 26 | 27 | ||||
| 27 | TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8 | 28 | TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8 | ||
| 28 | MOVV R4, 8(R3) | 29 | MOVV R4, 8(R3) | ||
| 29 | - | MOVV ·x_cgo_setenv_call(SB), R5 | 30 | + | MOVV ·x_cgo_setenv_call(SB), R23 |
| 30 | - | MOVV (R5), R6 | 31 | + | MOVV (R23), R23 |
| 31 | - | CALL (R6) | 32 | + | CALL (R23) |
| 32 | RET | 33 | RET | ||
| 33 | 34 | ||||
| 34 | TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8 | 35 | TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8 | ||
| 35 | MOVV R4, 8(R3) | 36 | MOVV R4, 8(R3) | ||
| 36 | - | MOVV ·x_cgo_unsetenv_call(SB), R5 | 37 | + | MOVV ·x_cgo_unsetenv_call(SB), R23 |
| 37 | - | MOVV (R5), R6 | 38 | + | MOVV (R23), R23 |
| 38 | - | CALL (R6) | 39 | + | CALL (R23) |
| 39 | RET | 40 | RET | ||
| 40 | 41 | ||||
| 41 | TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0 | 42 | TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0 | ||
| @@ -49,8 +50,8 @@ TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0 | |||||
| 49 | // func setg_trampoline(setg uintptr, g uintptr) | 50 | // func setg_trampoline(setg uintptr, g uintptr) | ||
| 50 | TEXT ·setg_trampoline(SB), NOSPLIT, $0 | 51 | TEXT ·setg_trampoline(SB), NOSPLIT, $0 | ||
| 51 | MOVV G+8(FP), R4 | 52 | MOVV G+8(FP), R4 | ||
| 52 | - | MOVV setg+0(FP), R5 | 53 | + | MOVV setg+0(FP), R23 |
| 53 | - | CALL (R5) | 54 | + | CALL (R23) |
| 54 | RET | 55 | RET | ||
| 55 | 56 | ||||
| 56 | TEXT threadentry_trampoline(SB), NOSPLIT, $0 | 57 | TEXT threadentry_trampoline(SB), NOSPLIT, $0 | ||
| @@ -64,9 +65,9 @@ TEXT threadentry_trampoline(SB), NOSPLIT, $0 | |||||
| 64 | SAVE_F24_TO_F31((14*8)) | 65 | SAVE_F24_TO_F31((14*8)) | ||
| 65 | MOVV R1, (22*8)(R3) | 66 | MOVV R1, (22*8)(R3) | ||
| 66 | 67 | ||||
| 67 | - | MOVV ·threadentry_call(SB), R5 | 68 | + | MOVV ·threadentry_call(SB), R23 |
| 68 | - | MOVV (R5), R6 | 69 | + | MOVV (R23), R23 |
| 69 | - | CALL (R6) | 70 | + | CALL (R23) |
| 70 | 71 | ||||
| 71 | RESTORE_R22_TO_R31((4*8)) | 72 | RESTORE_R22_TO_R31((4*8)) | ||
| 72 | RESTORE_F24_TO_F31((14*8)) | 73 | RESTORE_F24_TO_F31((14*8)) | ||
| @@ -76,12 +77,12 @@ TEXT threadentry_trampoline(SB), NOSPLIT, $0 | |||||
| 76 | RET | 77 | RET | ||
| 77 | 78 | ||||
| 78 | TEXT ·call5(SB), NOSPLIT, $0-0 | 79 | TEXT ·call5(SB), NOSPLIT, $0-0 | ||
| 79 | - | MOVV fn+0(FP), R9 | 80 | + | MOVV fn+0(FP), R23 |
| 80 | MOVV a1+8(FP), R4 | 81 | MOVV a1+8(FP), R4 | ||
| 81 | MOVV a2+16(FP), R5 | 82 | MOVV a2+16(FP), R5 | ||
| 82 | MOVV a3+24(FP), R6 | 83 | MOVV a3+24(FP), R6 | ||
| 83 | MOVV a4+32(FP), R7 | 84 | MOVV a4+32(FP), R7 | ||
| 84 | MOVV a5+40(FP), R8 | 85 | MOVV a5+40(FP), R8 | ||
| 85 | - | CALL (R9) | 86 | + | CALL (R23) |
| 86 | MOVV R4, ret+48(FP) | 87 | MOVV R4, ret+48(FP) | ||
| 87 | RET | 88 | RET | ||
M internal/fakecgo/trampolines_riscv64.s +13 -12
| @@ -7,34 +7,35 @@ | |||
| 7 | 7 | #include "go_asm.h" | |
| 8 | 8 | ||
| 9 | 9 | // these trampolines map the gcc ABI to Go ABI and then calls into the Go equivalent functions. | |
| 10 | + | // X5 is used as temporary register. | |
| 10 | 11 | ||
| 11 | 12 | TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16 | |
| 12 | 13 | MOV X10, 8(SP) | |
| 13 | 14 | MOV X11, 16(SP) | |
| 14 | 15 | MOV ·x_cgo_init_call(SB), X5 | |
| 15 | - | MOV (X5), X6 | |
| 16 | - | JALR RA, 0(X6) | |
| 16 | + | MOV (X5), X5 | |
| 17 | + | JALR RA, 0(X5) | |
| 17 | 18 | RET | |
| 18 | 19 | ||
| 19 | 20 | TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8 | |
| 20 | 21 | MOV X10, 8(SP) | |
| 21 | 22 | MOV ·x_cgo_thread_start_call(SB), X5 | |
| 22 | - | MOV (X5), X6 | |
| 23 | - | JALR RA, 0(X6) | |
| 23 | + | MOV (X5), X5 | |
| 24 | + | JALR RA, 0(X5) | |
| 24 | 25 | RET | |
| 25 | 26 | ||
| 26 | 27 | TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8 | |
| 27 | 28 | MOV X10, 8(SP) | |
| 28 | 29 | MOV ·x_cgo_setenv_call(SB), X5 | |
| 29 | - | MOV (X5), X6 | |
| 30 | - | JALR RA, 0(X6) | |
| 30 | + | MOV (X5), X5 | |
| 31 | + | JALR RA, 0(X5) | |
| 31 | 32 | RET | |
| 32 | 33 | ||
| 33 | 34 | TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8 | |
| 34 | 35 | MOV X10, 8(SP) | |
| 35 | 36 | MOV ·x_cgo_unsetenv_call(SB), X5 | |
| 36 | - | MOV (X5), X6 | |
| 37 | - | JALR RA, 0(X6) | |
| 37 | + | MOV (X5), X5 | |
| 38 | + | JALR RA, 0(X5) | |
| 38 | 39 | RET | |
| 39 | 40 | ||
| 40 | 41 | TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0 | |
| @@ -55,17 +56,17 @@ TEXT ·setg_trampoline(SB), NOSPLIT, $0 | |||
| 55 | 56 | TEXT threadentry_trampoline(SB), NOSPLIT, $16 | |
| 56 | 57 | MOV X10, 8(SP) | |
| 57 | 58 | MOV ·threadentry_call(SB), X5 | |
| 58 | - | MOV (X5), X6 | |
| 59 | - | JALR RA, 0(X6) | |
| 59 | + | MOV (X5), X5 | |
| 60 | + | JALR RA, 0(X5) | |
| 60 | 61 | RET | |
| 61 | 62 | ||
| 62 | 63 | TEXT ·call5(SB), NOSPLIT, $0-48 | |
| 63 | - | MOV fn+0(FP), X9 | |
| 64 | + | MOV fn+0(FP), X5 | |
| 64 | 65 | MOV a1+8(FP), X10 | |
| 65 | 66 | MOV a2+16(FP), X11 | |
| 66 | 67 | MOV a3+24(FP), X12 | |
| 67 | 68 | MOV a4+32(FP), X13 | |
| 68 | 69 | MOV a5+40(FP), X14 | |
| 69 | - | JALR RA, 0(X9) | |
| 70 | + | JALR RA, 0(X5) | |
| 70 | 71 | MOV X10, ret+48(FP) | |
| 71 | 72 | RET | |
| @@ -7,34 +7,35 @@ | |||||
| 7 | #include "go_asm.h" | 7 | #include "go_asm.h" | ||
| 8 | 8 | ||||
| 9 | // these trampolines map the gcc ABI to Go ABI and then calls into the Go equivalent functions. | 9 | // these trampolines map the gcc ABI to Go ABI and then calls into the Go equivalent functions. | ||
| 10 | + | // X5 is used as temporary register. | |||
| 10 | 11 | ||||
| 11 | TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16 | 12 | TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16 | ||
| 12 | MOV X10, 8(SP) | 13 | MOV X10, 8(SP) | ||
| 13 | MOV X11, 16(SP) | 14 | MOV X11, 16(SP) | ||
| 14 | MOV ·x_cgo_init_call(SB), X5 | 15 | MOV ·x_cgo_init_call(SB), X5 | ||
| 15 | - | MOV (X5), X6 | 16 | + | MOV (X5), X5 |
| 16 | - | JALR RA, 0(X6) | 17 | + | JALR RA, 0(X5) |
| 17 | RET | 18 | RET | ||
| 18 | 19 | ||||
| 19 | TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8 | 20 | TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8 | ||
| 20 | MOV X10, 8(SP) | 21 | MOV X10, 8(SP) | ||
| 21 | MOV ·x_cgo_thread_start_call(SB), X5 | 22 | MOV ·x_cgo_thread_start_call(SB), X5 | ||
| 22 | - | MOV (X5), X6 | 23 | + | MOV (X5), X5 |
| 23 | - | JALR RA, 0(X6) | 24 | + | JALR RA, 0(X5) |
| 24 | RET | 25 | RET | ||
| 25 | 26 | ||||
| 26 | TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8 | 27 | TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8 | ||
| 27 | MOV X10, 8(SP) | 28 | MOV X10, 8(SP) | ||
| 28 | MOV ·x_cgo_setenv_call(SB), X5 | 29 | MOV ·x_cgo_setenv_call(SB), X5 | ||
| 29 | - | MOV (X5), X6 | 30 | + | MOV (X5), X5 |
| 30 | - | JALR RA, 0(X6) | 31 | + | JALR RA, 0(X5) |
| 31 | RET | 32 | RET | ||
| 32 | 33 | ||||
| 33 | TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8 | 34 | TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8 | ||
| 34 | MOV X10, 8(SP) | 35 | MOV X10, 8(SP) | ||
| 35 | MOV ·x_cgo_unsetenv_call(SB), X5 | 36 | MOV ·x_cgo_unsetenv_call(SB), X5 | ||
| 36 | - | MOV (X5), X6 | 37 | + | MOV (X5), X5 |
| 37 | - | JALR RA, 0(X6) | 38 | + | JALR RA, 0(X5) |
| 38 | RET | 39 | RET | ||
| 39 | 40 | ||||
| 40 | TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0 | 41 | TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0 | ||
| @@ -55,17 +56,17 @@ TEXT ·setg_trampoline(SB), NOSPLIT, $0 | |||||
| 55 | TEXT threadentry_trampoline(SB), NOSPLIT, $16 | 56 | TEXT threadentry_trampoline(SB), NOSPLIT, $16 | ||
| 56 | MOV X10, 8(SP) | 57 | MOV X10, 8(SP) | ||
| 57 | MOV ·threadentry_call(SB), X5 | 58 | MOV ·threadentry_call(SB), X5 | ||
| 58 | - | MOV (X5), X6 | 59 | + | MOV (X5), X5 |
| 59 | - | JALR RA, 0(X6) | 60 | + | JALR RA, 0(X5) |
| 60 | RET | 61 | RET | ||
| 61 | 62 | ||||
| 62 | TEXT ·call5(SB), NOSPLIT, $0-48 | 63 | TEXT ·call5(SB), NOSPLIT, $0-48 | ||
| 63 | - | MOV fn+0(FP), X9 | 64 | + | MOV fn+0(FP), X5 |
| 64 | MOV a1+8(FP), X10 | 65 | MOV a1+8(FP), X10 | ||
| 65 | MOV a2+16(FP), X11 | 66 | MOV a2+16(FP), X11 | ||
| 66 | MOV a3+24(FP), X12 | 67 | MOV a3+24(FP), X12 | ||
| 67 | MOV a4+32(FP), X13 | 68 | MOV a4+32(FP), X13 | ||
| 68 | MOV a5+40(FP), X14 | 69 | MOV a5+40(FP), X14 | ||
| 69 | - | JALR RA, 0(X9) | 70 | + | JALR RA, 0(X5) |
| 70 | MOV X10, ret+48(FP) | 71 | MOV X10, ret+48(FP) | ||
| 71 | RET | 72 | RET | ||