sys_loong64.s 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // SPDX-License-Identifier: Apache-2.0
  2. // SPDX-FileCopyrightText: 2025 The Ebitengine Authors
  3. //go:build linux
  4. #include "textflag.h"
  5. #include "go_asm.h"
  6. #include "funcdata.h"
  7. #define STACK_SIZE 64
  8. #define PTR_ADDRESS (STACK_SIZE - 8)
  9. // syscall15X calls a function in libc on behalf of the syscall package.
  10. // syscall15X takes a pointer to a struct like:
  11. // struct {
  12. // fn uintptr
  13. // a1 uintptr
  14. // a2 uintptr
  15. // a3 uintptr
  16. // a4 uintptr
  17. // a5 uintptr
  18. // a6 uintptr
  19. // a7 uintptr
  20. // a8 uintptr
  21. // a9 uintptr
  22. // a10 uintptr
  23. // a11 uintptr
  24. // a12 uintptr
  25. // a13 uintptr
  26. // a14 uintptr
  27. // a15 uintptr
  28. // r1 uintptr
  29. // r2 uintptr
  30. // err uintptr
  31. // }
  32. // syscall15X must be called on the g0 stack with the
  33. // C calling convention (use libcCall).
  34. GLOBL ·syscall15XABI0(SB), NOPTR|RODATA, $8
  35. DATA ·syscall15XABI0(SB)/8, $syscall15X(SB)
  36. TEXT syscall15X(SB), NOSPLIT, $0
  37. // push structure pointer
  38. SUBV $STACK_SIZE, R3
  39. MOVV R4, PTR_ADDRESS(R3)
  40. MOVV R4, R13
  41. MOVD syscall15Args_f1(R13), F0 // f1
  42. MOVD syscall15Args_f2(R13), F1 // f2
  43. MOVD syscall15Args_f3(R13), F2 // f3
  44. MOVD syscall15Args_f4(R13), F3 // f4
  45. MOVD syscall15Args_f5(R13), F4 // f5
  46. MOVD syscall15Args_f6(R13), F5 // f6
  47. MOVD syscall15Args_f7(R13), F6 // f7
  48. MOVD syscall15Args_f8(R13), F7 // f8
  49. MOVV syscall15Args_a1(R13), R4 // a1
  50. MOVV syscall15Args_a2(R13), R5 // a2
  51. MOVV syscall15Args_a3(R13), R6 // a3
  52. MOVV syscall15Args_a4(R13), R7 // a4
  53. MOVV syscall15Args_a5(R13), R8 // a5
  54. MOVV syscall15Args_a6(R13), R9 // a6
  55. MOVV syscall15Args_a7(R13), R10 // a7
  56. MOVV syscall15Args_a8(R13), R11 // a8
  57. // push a9-a15 onto stack
  58. MOVV syscall15Args_a9(R13), R12
  59. MOVV R12, 0(R3)
  60. MOVV syscall15Args_a10(R13), R12
  61. MOVV R12, 8(R3)
  62. MOVV syscall15Args_a11(R13), R12
  63. MOVV R12, 16(R3)
  64. MOVV syscall15Args_a12(R13), R12
  65. MOVV R12, 24(R3)
  66. MOVV syscall15Args_a13(R13), R12
  67. MOVV R12, 32(R3)
  68. MOVV syscall15Args_a14(R13), R12
  69. MOVV R12, 40(R3)
  70. MOVV syscall15Args_a15(R13), R12
  71. MOVV R12, 48(R3)
  72. MOVV syscall15Args_fn(R13), R12
  73. JAL (R12)
  74. // pop structure pointer
  75. MOVV PTR_ADDRESS(R3), R13
  76. ADDV $STACK_SIZE, R3
  77. // save R4, R5
  78. MOVV R4, syscall15Args_a1(R13)
  79. MOVV R5, syscall15Args_a2(R13)
  80. // save f0-f3
  81. MOVD F0, syscall15Args_f1(R13)
  82. MOVD F1, syscall15Args_f2(R13)
  83. MOVD F2, syscall15Args_f3(R13)
  84. MOVD F3, syscall15Args_f4(R13)
  85. RET