1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: 2026 The Ebitengine Authors
3
4//go:build linux
5
6#include "textflag.h"
7#include "go_asm.h"
8#include "funcdata.h"
9
10TEXT callbackasm1(SB), NOSPLIT|NOFRAME, $0
11 NO_LOCAL_POINTERS
12
13 // Allocate stack frame: 48 + 16 + 64 + 16 = 144 bytes
14 SUB $144, R13
15
16 // Save callee-saved registers at SP+0
17 MOVW R4, 0(R13)
18 MOVW R5, 4(R13)
19 MOVW R6, 8(R13)
20 MOVW R7, 12(R13)
21 MOVW R8, 16(R13)
22 MOVW R9, 20(R13)
23 MOVW g, 24(R13)
24 MOVW R11, 28(R13)
25 MOVW R14, 32(R13)
26
27 // Save callback index (passed in R12) at SP+36
28 MOVW R12, 36(R13)
29
30 // Save integer arguments R0-R3 at SP+128 (frame[16..19])
31 MOVW R0, 128(R13)
32 MOVW R1, 132(R13)
33 MOVW R2, 136(R13)
34 MOVW R3, 140(R13)
35
36 // Skip floating point registers if runtime.goarmsoftfp!=0.
37 MOVB runtime·goarmsoftfp(SB), R11
38 CMP $0, R11
39 BNE skipfpsave
40 // Save floating point registers F0-F7 at SP+64 (frame[0..15])
41 MOVD F0, 64(R13)
42 MOVD F1, 72(R13)
43 MOVD F2, 80(R13)
44 MOVD F3, 88(R13)
45 MOVD F4, 96(R13)
46 MOVD F5, 104(R13)
47 MOVD F6, 112(R13)
48 MOVD F7, 120(R13)
49
50skipfpsave:
51 // Set up callbackArgs at SP+48
52 MOVW 36(R13), R4
53 MOVW R4, 48(R13)
54 ADD $64, R13, R4
55 MOVW R4, 52(R13)
56 MOVW $0, R4
57 MOVW R4, 56(R13)
58 MOVW R4, 60(R13) // high word of a 64-bit return
59
60 // Call crosscall2(fn, frame, 0, ctxt)
61 MOVW ·callbackWrap_call(SB), R0
62 MOVW (R0), R0
63 ADD $48, R13, R1
64 MOVW $0, R2
65 MOVW $0, R3
66
67 BL crosscall2(SB)
68
69 // Get result
70 MOVW 56(R13), R0
71 MOVW 60(R13), R1 // high word of a 64-bit return
72
73 MOVB runtime·goarmsoftfp(SB), R11
74 CMP $0, R11
75 BNE skipfprest
76 // Restore float registers
77 MOVD 64(R13), F0
78 MOVD 72(R13), F1
79 MOVD 80(R13), F2
80 MOVD 88(R13), F3
81 MOVD 96(R13), F4
82 MOVD 104(R13), F5
83 MOVD 112(R13), F6
84 MOVD 120(R13), F7
85
86skipfprest:
87 // Restore callee-saved registers
88 MOVW 0(R13), R4
89 MOVW 4(R13), R5
90 MOVW 8(R13), R6
91 MOVW 12(R13), R7
92 MOVW 16(R13), R8
93 MOVW 20(R13), R9
94 MOVW 24(R13), g
95 MOVW 28(R13), R11
96 MOVW 32(R13), R14
97
98 ADD $144, R13
99 RET