trampolines_arm64.s 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // SPDX-License-Identifier: Apache-2.0
  2. // SPDX-FileCopyrightText: 2022 The Ebitengine Authors
  3. //go:build !cgo && (darwin || freebsd || linux)
  4. #include "textflag.h"
  5. #include "go_asm.h"
  6. #include "abi_arm64.h"
  7. // These trampolines map the gcc ABI to Go ABIInternal and then calls into the Go equivalent functions.
  8. // Note that C arguments are passed in R0-R7, which matches Go ABIInternal for the first eight arguments.
  9. // R9 is used as a temporary register.
  10. TEXT x_cgo_init_trampoline(SB), NOSPLIT, $0-0
  11. MOVD ·x_cgo_init_call(SB), R9
  12. MOVD (R9), R9
  13. CALL R9
  14. RET
  15. TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $0-0
  16. MOVD ·x_cgo_thread_start_call(SB), R9
  17. MOVD (R9), R9
  18. CALL R9
  19. RET
  20. TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $0-0
  21. MOVD ·x_cgo_setenv_call(SB), R9
  22. MOVD (R9), R9
  23. CALL R9
  24. RET
  25. TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $0-0
  26. MOVD ·x_cgo_unsetenv_call(SB), R9
  27. MOVD (R9), R9
  28. CALL R9
  29. RET
  30. TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0-0
  31. CALL ·x_cgo_notify_runtime_init_done(SB)
  32. RET
  33. TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0
  34. CALL ·x_cgo_bindm(SB)
  35. RET
  36. // func setg_trampoline(setg uintptr, g uintptr)
  37. TEXT ·setg_trampoline(SB), NOSPLIT, $0-16
  38. MOVD G+8(FP), R0
  39. MOVD setg+0(FP), R9
  40. CALL R9
  41. RET
  42. TEXT threadentry_trampoline(SB), NOSPLIT, $0-0
  43. // See crosscall2.
  44. SUB $(8*24), RSP
  45. STP (R0, R1), (8*1)(RSP)
  46. MOVD R3, (8*3)(RSP)
  47. SAVE_R19_TO_R28(8*4)
  48. SAVE_F8_TO_F15(8*14)
  49. STP (R29, R30), (8*22)(RSP)
  50. MOVD ·threadentry_call(SB), R9
  51. MOVD (R9), R9
  52. CALL R9
  53. MOVD $0, R0 // TODO: get the return value from threadentry
  54. RESTORE_R19_TO_R28(8*4)
  55. RESTORE_F8_TO_F15(8*14)
  56. LDP (8*22)(RSP), (R29, R30)
  57. ADD $(8*24), RSP
  58. RET
  59. TEXT ·call5(SB), NOSPLIT, $0-0
  60. MOVD fn+0(FP), R9
  61. MOVD a1+8(FP), R0
  62. MOVD a2+16(FP), R1
  63. MOVD a3+24(FP), R2
  64. MOVD a4+32(FP), R3
  65. MOVD a5+40(FP), R4
  66. CALL R9
  67. MOVD R0, ret+48(FP)
  68. RET