trampolines_amd64.s 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // SPDX-License-Identifier: Apache-2.0
  2. // SPDX-FileCopyrightText: 2022 The Ebitengine Authors
  3. //go:build !cgo && (darwin || linux || freebsd)
  4. /*
  5. trampoline for emulating required C functions for cgo in go (see cgo.go)
  6. (we convert cdecl calling convention to go and vice-versa)
  7. C Calling convention cdecl used here (we only need integer args):
  8. 1. arg: DI
  9. 2. arg: SI
  10. 3. arg: DX
  11. 4. arg: CX
  12. 5. arg: R8
  13. 6. arg: R9
  14. We don't need floats with these functions -> AX=0
  15. return value will be in AX
  16. temporary register is R11
  17. */
  18. #include "textflag.h"
  19. #include "go_asm.h"
  20. #include "abi_amd64.h"
  21. // these trampolines map the gcc ABI to Go ABI and then calls into the Go equivalent functions.
  22. TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16
  23. MOVQ DI, AX
  24. MOVQ SI, BX
  25. MOVQ ·x_cgo_init_call(SB), R11
  26. MOVQ (R11), R11
  27. CALL R11
  28. RET
  29. TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8
  30. MOVQ DI, AX
  31. MOVQ ·x_cgo_thread_start_call(SB), R11
  32. MOVQ (R11), R11
  33. CALL R11
  34. RET
  35. TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8
  36. MOVQ DI, AX
  37. MOVQ ·x_cgo_setenv_call(SB), R11
  38. MOVQ (R11), R11
  39. CALL R11
  40. RET
  41. TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8
  42. MOVQ DI, AX
  43. MOVQ ·x_cgo_unsetenv_call(SB), R11
  44. MOVQ (R11), R11
  45. CALL R11
  46. RET
  47. TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0
  48. JMP ·x_cgo_notify_runtime_init_done(SB)
  49. TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0
  50. JMP ·x_cgo_bindm(SB)
  51. // func setg_trampoline(setg uintptr, g uintptr)
  52. TEXT ·setg_trampoline(SB), NOSPLIT, $0-16
  53. MOVQ G+8(FP), DI
  54. MOVQ setg+0(FP), R11
  55. XORL AX, AX
  56. CALL R11
  57. RET
  58. TEXT threadentry_trampoline(SB), NOSPLIT, $0
  59. // See crosscall2.
  60. PUSH_REGS_HOST_TO_ABI0()
  61. // X15 is designated by Go as a fixed zero register.
  62. // Calling directly into ABIInternal, ensure it is zero.
  63. PXOR X15, X15
  64. MOVQ DI, AX
  65. MOVQ ·threadentry_call(SB), R11
  66. MOVQ (R11), R11
  67. CALL R11
  68. POP_REGS_HOST_TO_ABI0()
  69. RET
  70. TEXT ·call5(SB), NOSPLIT, $0-56
  71. MOVQ fn+0(FP), R11
  72. MOVQ a1+8(FP), DI
  73. MOVQ a2+16(FP), SI
  74. MOVQ a3+24(FP), DX
  75. MOVQ a4+32(FP), CX
  76. MOVQ a5+40(FP), R8
  77. XORL AX, AX // no floats
  78. PUSHQ BP // save BP
  79. MOVQ SP, BP // save SP inside BP bc BP is callee-saved
  80. SUBQ $16, SP // allocate space for alignment
  81. ANDQ $-16, SP // align on 16 bytes for SSE
  82. CALL R11
  83. MOVQ BP, SP // get SP back
  84. POPQ BP // restore BP
  85. MOVQ AX, ret+48(FP)
  86. RET