x86-64: hack the ABI of cg_upcall_ipret_copy_variable_to_pointer
[ajla.git] / ipret.inc
blobf6a96aecf27bf38194507153c7c33485274725f1
1 /*
2  * Copyright (C) 2024 Mikulas Patocka
3  *
4  * This file is part of Ajla.
5  *
6  * Ajla is free software: you can redistribute it and/or modify it under the
7  * terms of the GNU General Public License as published by the Free Software
8  * Foundation, either version 3 of the License, or (at your option) any later
9  * version.
10  *
11  * Ajla is distributed in the hope that it will be useful, but WITHOUT ANY
12  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13  * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along with
16  * Ajla. If not, see <https://www.gnu.org/licenses/>.
17  */
19 #ifndef START_BLOCK
20 #define START_BLOCK(declarations)
21 #endif
22 #ifndef END_BLOCK
23 #define END_BLOCK()
24 #endif
25 #ifndef DEFINE_LABEL
26 #define DEFINE_LABEL(lbl, code)
27 #endif
28 #ifndef DEFINE_OPCODE_START_LBL
29 #define DEFINE_OPCODE_START_LBL(opcode, lbl)
30 #endif
31 #ifndef DEFINE_OPCODE_END
32 #define DEFINE_OPCODE_END(opcode)
33 #endif
35 #ifdef EMIT_CODE
36 #define DEFINE_OPCODE(opcode, lbl, code)        \
37         DEFINE_OPCODE_START_LBL(opcode, lbl)    \
38         code                                    \
39         DEFINE_OPCODE_END(opcode)
40 #else
41 #define DEFINE_OPCODE(opcode, lbl, code)        \
42         DEFINE_OPCODE_START_LBL(opcode, lbl)    \
43         DEFINE_OPCODE_END(opcode)
44 #endif
46 #define ARG_MODE        0
47 #define DEFINE_OPCODE_START(opcode)     DEFINE_OPCODE_START_LBL(opcode, opcode##0)
48 #include "ipret-1.inc"
50 #ifndef EMIT_ALTTABLE
52 #if ARG_MODE_N >= 2
53 #define ARG_MODE        1
54 #define DEFINE_OPCODE_START(opcode)     DEFINE_OPCODE_START_LBL(opcode, opcode##1)
55 #include "ipret-1.inc"
56 #endif
58 #if ARG_MODE_N >= 3
59 #define ARG_MODE        2
60 #define DEFINE_OPCODE_START(opcode)     DEFINE_OPCODE_START_LBL(opcode, opcode##2)
61 #include "ipret-1.inc"
62 #endif
64 #endif
66 #undef START_BLOCK
67 #undef END_BLOCK
68 #undef DEFINE_LABEL
69 #undef DEFINE_OPCODE_START_LBL
70 #undef DEFINE_OPCODE_START
71 #undef DEFINE_OPCODE_END
72 #undef DEFINE_OPCODE
74 #ifdef EMIT_FUNCTIONS
75 #undef EMIT_FUNCTIONS
76 #endif
77 #ifdef EMIT_ALTTABLE
78 #undef EMIT_ALTTABLE
79 #endif
80 #ifdef EMIT_CODE
81 #undef EMIT_CODE
82 #endif