internal/fakecgo: match Go's implementation (#142)
This code inlined the macros to avoid copying the header. However, the header was copied into the project for other reasons and this code never got updated to match the Go implementation.
- commit
- b178e7518254895d38a88b4bcdbc02cda4221263
- author
- TotallyGamerJet · · 2023-07-04 12:19 UTC
- committer
- GitHub · · 2023-07-04 12:19 UTC
- parent
- 08ca952
- signature
- GPG Unverified
4AEE18F83AFDEB23The key is unknown - refs
- tag: v0.4.0-alpha.5
1 file · +15 -52
M internal/fakecgo/asm_amd64.s +15 -52
| @@ -3,74 +3,37 @@ | |||
| 3 | 3 | // license that can be found in the LICENSE file. | |
| 4 | 4 | ||
| 5 | 5 | #include "textflag.h" | |
| 6 | + | #include "../abi/abi_amd64.h" | |
| 6 | 7 | ||
| 7 | 8 | // Called by C code generated by cmd/cgo. | |
| 8 | 9 | // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr) | |
| 9 | 10 | // Saves C callee-saved registers and calls cgocallback with three arguments. | |
| 10 | 11 | // fn is the PC of a func(a unsafe.Pointer) function. | |
| 11 | 12 | // This signature is known to SWIG, so we can't change it. | |
| 12 | - | #ifndef GOOS_windows | |
| 13 | - | TEXT crosscall2(SB), NOSPLIT, $0x50-0 // keeps stack pointer 32-byte aligned | |
| 14 | - | #else | |
| 15 | - | TEXT crosscall2(SB), NOSPLIT, $0x110-0 // also need to save xmm6 - xmm15 | |
| 16 | - | #endif | |
| 17 | - | MOVQ BX, 0x18(SP) | |
| 18 | - | MOVQ R12, 0x28(SP) | |
| 19 | - | MOVQ R13, 0x30(SP) | |
| 20 | - | MOVQ R14, 0x38(SP) | |
| 21 | - | MOVQ R15, 0x40(SP) | |
| 22 | - | ||
| 23 | - | #ifdef GOOS_windows | |
| 24 | - | // Win64 save RBX, RBP, RDI, RSI, RSP, R12, R13, R14, R15 and XMM6 -- XMM15. | |
| 25 | - | MOVQ DI, 0x48(SP) | |
| 26 | - | MOVQ SI, 0x50(SP) | |
| 27 | - | MOVUPS X6, 0x60(SP) | |
| 28 | - | MOVUPS X7, 0x70(SP) | |
| 29 | - | MOVUPS X8, 0x80(SP) | |
| 30 | - | MOVUPS X9, 0x90(SP) | |
| 31 | - | MOVUPS X10, 0xa0(SP) | |
| 32 | - | MOVUPS X11, 0xb0(SP) | |
| 33 | - | MOVUPS X12, 0xc0(SP) | |
| 34 | - | MOVUPS X13, 0xd0(SP) | |
| 35 | - | MOVUPS X14, 0xe0(SP) | |
| 36 | - | MOVUPS X15, 0xf0(SP) | |
| 37 | - | ||
| 38 | - | MOVQ CX, 0x0(SP) // fn | |
| 39 | - | MOVQ DX, 0x8(SP) // arg | |
| 40 | - | ||
| 41 | - | // Skip n in R8. | |
| 42 | - | MOVQ R9, 0x10(SP) // ctxt | |
| 43 | - | ||
| 44 | - | CALL runtime·cgocallback(SB) | |
| 13 | + | TEXT crosscall2(SB), NOSPLIT|NOFRAME, $0-0 | |
| 14 | + | PUSH_REGS_HOST_TO_ABI0() | |
| 45 | 15 | ||
| 46 | - | MOVQ 0x48(SP), DI | |
| 47 | - | MOVQ 0x50(SP), SI | |
| 48 | - | MOVUPS 0x60(SP), X6 | |
| 49 | - | MOVUPS 0x70(SP), X7 | |
| 50 | - | MOVUPS 0x80(SP), X8 | |
| 51 | - | MOVUPS 0x90(SP), X9 | |
| 52 | - | MOVUPS 0xa0(SP), X10 | |
| 53 | - | MOVUPS 0xb0(SP), X11 | |
| 54 | - | MOVUPS 0xc0(SP), X12 | |
| 55 | - | MOVUPS 0xd0(SP), X13 | |
| 56 | - | MOVUPS 0xe0(SP), X14 | |
| 57 | - | MOVUPS 0xf0(SP), X15 | |
| 16 | + | // Make room for arguments to cgocallback. | |
| 17 | + | ADJSP $0x18 | |
| 58 | 18 | ||
| 59 | - | #else | |
| 19 | + | #ifndef GOOS_windows | |
| 60 | 20 | MOVQ DI, 0x0(SP) // fn | |
| 61 | 21 | MOVQ SI, 0x8(SP) // arg | |
| 62 | 22 | ||
| 63 | 23 | // Skip n in DX. | |
| 64 | 24 | MOVQ CX, 0x10(SP) // ctxt | |
| 65 | 25 | ||
| 66 | - | CALL runtime·cgocallback(SB) | |
| 26 | + | #else | |
| 27 | + | MOVQ CX, 0x0(SP) // fn | |
| 28 | + | MOVQ DX, 0x8(SP) // arg | |
| 29 | + | ||
| 30 | + | // Skip n in R8. | |
| 31 | + | MOVQ R9, 0x10(SP) // ctxt | |
| 67 | 32 | ||
| 68 | 33 | #endif | |
| 69 | 34 | ||
| 70 | - | MOVQ 0x18(SP), BX | |
| 71 | - | MOVQ 0x28(SP), R12 | |
| 72 | - | MOVQ 0x30(SP), R13 | |
| 73 | - | MOVQ 0x38(SP), R14 | |
| 74 | - | MOVQ 0x40(SP), R15 | |
| 35 | + | CALL runtime·cgocallback(SB) | |
| 75 | 36 | ||
| 37 | + | ADJSP $-0x18 | |
| 38 | + | POP_REGS_HOST_TO_ABI0() | |
| 76 | 39 | RET | |
| @@ -3,74 +3,37 @@ | |||||
| 3 | // license that can be found in the LICENSE file. | 3 | // license that can be found in the LICENSE file. | ||
| 4 | 4 | ||||
| 5 | #include "textflag.h" | 5 | #include "textflag.h" | ||
| 6 | + | #include "../abi/abi_amd64.h" | |||
| 6 | 7 | ||||
| 7 | // Called by C code generated by cmd/cgo. | 8 | // Called by C code generated by cmd/cgo. | ||
| 8 | // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr) | 9 | // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr) | ||
| 9 | // Saves C callee-saved registers and calls cgocallback with three arguments. | 10 | // Saves C callee-saved registers and calls cgocallback with three arguments. | ||
| 10 | // fn is the PC of a func(a unsafe.Pointer) function. | 11 | // fn is the PC of a func(a unsafe.Pointer) function. | ||
| 11 | // This signature is known to SWIG, so we can't change it. | 12 | // This signature is known to SWIG, so we can't change it. | ||
| 12 | - | #ifndef GOOS_windows | 13 | + | TEXT crosscall2(SB), NOSPLIT|NOFRAME, $0-0 |
| 13 | - | TEXT crosscall2(SB), NOSPLIT, $0x50-0 // keeps stack pointer 32-byte aligned | 14 | + | PUSH_REGS_HOST_TO_ABI0() |
| 14 | - | #else | |||
| 15 | - | TEXT crosscall2(SB), NOSPLIT, $0x110-0 // also need to save xmm6 - xmm15 | |||
| 16 | - | #endif | |||
| 17 | - | MOVQ BX, 0x18(SP) | |||
| 18 | - | MOVQ R12, 0x28(SP) | |||
| 19 | - | MOVQ R13, 0x30(SP) | |||
| 20 | - | MOVQ R14, 0x38(SP) | |||
| 21 | - | MOVQ R15, 0x40(SP) | |||
| 22 | - | ||||
| 23 | - | #ifdef GOOS_windows | |||
| 24 | - | // Win64 save RBX, RBP, RDI, RSI, RSP, R12, R13, R14, R15 and XMM6 -- XMM15. | |||
| 25 | - | MOVQ DI, 0x48(SP) | |||
| 26 | - | MOVQ SI, 0x50(SP) | |||
| 27 | - | MOVUPS X6, 0x60(SP) | |||
| 28 | - | MOVUPS X7, 0x70(SP) | |||
| 29 | - | MOVUPS X8, 0x80(SP) | |||
| 30 | - | MOVUPS X9, 0x90(SP) | |||
| 31 | - | MOVUPS X10, 0xa0(SP) | |||
| 32 | - | MOVUPS X11, 0xb0(SP) | |||
| 33 | - | MOVUPS X12, 0xc0(SP) | |||
| 34 | - | MOVUPS X13, 0xd0(SP) | |||
| 35 | - | MOVUPS X14, 0xe0(SP) | |||
| 36 | - | MOVUPS X15, 0xf0(SP) | |||
| 37 | - | ||||
| 38 | - | MOVQ CX, 0x0(SP) // fn | |||
| 39 | - | MOVQ DX, 0x8(SP) // arg | |||
| 40 | - | ||||
| 41 | - | // Skip n in R8. | |||
| 42 | - | MOVQ R9, 0x10(SP) // ctxt | |||
| 43 | - | ||||
| 44 | - | CALL runtime·cgocallback(SB) | |||
| 45 | 15 | ||||
| 46 | - | MOVQ 0x48(SP), DI | 16 | + | // Make room for arguments to cgocallback. |
| 47 | - | MOVQ 0x50(SP), SI | 17 | + | ADJSP $0x18 |
| 48 | - | MOVUPS 0x60(SP), X6 | |||
| 49 | - | MOVUPS 0x70(SP), X7 | |||
| 50 | - | MOVUPS 0x80(SP), X8 | |||
| 51 | - | MOVUPS 0x90(SP), X9 | |||
| 52 | - | MOVUPS 0xa0(SP), X10 | |||
| 53 | - | MOVUPS 0xb0(SP), X11 | |||
| 54 | - | MOVUPS 0xc0(SP), X12 | |||
| 55 | - | MOVUPS 0xd0(SP), X13 | |||
| 56 | - | MOVUPS 0xe0(SP), X14 | |||
| 57 | - | MOVUPS 0xf0(SP), X15 | |||
| 58 | 18 | ||||
| 59 | - | #else | 19 | + | #ifndef GOOS_windows |
| 60 | MOVQ DI, 0x0(SP) // fn | 20 | MOVQ DI, 0x0(SP) // fn | ||
| 61 | MOVQ SI, 0x8(SP) // arg | 21 | MOVQ SI, 0x8(SP) // arg | ||
| 62 | 22 | ||||
| 63 | // Skip n in DX. | 23 | // Skip n in DX. | ||
| 64 | MOVQ CX, 0x10(SP) // ctxt | 24 | MOVQ CX, 0x10(SP) // ctxt | ||
| 65 | 25 | ||||
| 66 | - | CALL runtime·cgocallback(SB) | 26 | + | #else |
| 27 | + | MOVQ CX, 0x0(SP) // fn | |||
| 28 | + | MOVQ DX, 0x8(SP) // arg | |||
| 29 | + | ||||
| 30 | + | // Skip n in R8. | |||
| 31 | + | MOVQ R9, 0x10(SP) // ctxt | |||
| 67 | 32 | ||||
| 68 | #endif | 33 | #endif | ||
| 69 | 34 | ||||
| 70 | - | MOVQ 0x18(SP), BX | 35 | + | CALL runtime·cgocallback(SB) |
| 71 | - | MOVQ 0x28(SP), R12 | |||
| 72 | - | MOVQ 0x30(SP), R13 | |||
| 73 | - | MOVQ 0x38(SP), R14 | |||
| 74 | - | MOVQ 0x40(SP), R15 | |||
| 75 | 36 | ||||
| 37 | + | ADJSP $-0x18 | |||
| 38 | + | POP_REGS_HOST_TO_ABI0() | |||
| 76 | RET | 39 | RET | ||