trampolines_arm.s 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // SPDX-License-Identifier: Apache-2.0
  2. // SPDX-FileCopyrightText: 2026 The Ebitengine Authors
  3. //go:build !cgo && (freebsd || linux)
  4. #include "textflag.h"
  5. #include "go_asm.h"
  6. // These trampolines map the gcc ABI to Go ABI0 and then call into the Go equivalent functions.
  7. // On ARM32, Go ABI0 uses stack-based calling convention.
  8. // Arguments are placed on the stack starting at 4(SP) after the prologue.
  9. TEXT x_cgo_init_trampoline(SB), NOSPLIT, $8-0
  10. MOVW R0, 4(R13)
  11. MOVW R1, 8(R13)
  12. MOVW ·x_cgo_init_call(SB), R12
  13. MOVW (R12), R12
  14. CALL (R12)
  15. RET
  16. TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8-0
  17. MOVW R0, 4(R13)
  18. MOVW ·x_cgo_thread_start_call(SB), R12
  19. MOVW (R12), R12
  20. CALL (R12)
  21. RET
  22. TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8-0
  23. MOVW R0, 4(R13)
  24. MOVW ·x_cgo_setenv_call(SB), R12
  25. MOVW (R12), R12
  26. CALL (R12)
  27. RET
  28. TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8-0
  29. MOVW R0, 4(R13)
  30. MOVW ·x_cgo_unsetenv_call(SB), R12
  31. MOVW (R12), R12
  32. CALL (R12)
  33. RET
  34. TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0-0
  35. CALL ·x_cgo_notify_runtime_init_done(SB)
  36. RET
  37. TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0
  38. CALL ·x_cgo_bindm(SB)
  39. RET
  40. // func setg_trampoline(setg uintptr, g uintptr)
  41. TEXT ·setg_trampoline(SB), NOSPLIT, $0-8
  42. MOVW G+4(FP), R0
  43. MOVW setg+0(FP), R12
  44. BL (R12)
  45. RET
  46. TEXT threadentry_trampoline(SB), NOSPLIT, $8-0
  47. // See crosscall2.
  48. MOVW R0, 4(R13)
  49. MOVW ·threadentry_call(SB), R12
  50. MOVW (R12), R12
  51. CALL (R12)
  52. RET
  53. TEXT ·call5(SB), NOSPLIT, $8-28
  54. MOVW fn+0(FP), R12
  55. MOVW a1+4(FP), R0
  56. MOVW a2+8(FP), R1
  57. MOVW a3+12(FP), R2
  58. MOVW a4+16(FP), R3
  59. MOVW a5+20(FP), R4
  60. // Store 5th arg below SP (in local frame area)
  61. MOVW R4, arg5-8(SP)
  62. // Align SP to 8 bytes for call (required by ARM AAPCS)
  63. SUB $8, R13
  64. CALL (R12)
  65. ADD $8, R13
  66. MOVW R0, r1+24(FP)
  67. RET