sljitLir.c revision 1.1.1.2 1 1.1 alnsn /*
2 1.1 alnsn * Stack-less Just-In-Time compiler
3 1.1 alnsn *
4 1.1 alnsn * Copyright 2009-2012 Zoltan Herczeg (hzmester (at) freemail.hu). All rights reserved.
5 1.1 alnsn *
6 1.1 alnsn * Redistribution and use in source and binary forms, with or without modification, are
7 1.1 alnsn * permitted provided that the following conditions are met:
8 1.1 alnsn *
9 1.1 alnsn * 1. Redistributions of source code must retain the above copyright notice, this list of
10 1.1 alnsn * conditions and the following disclaimer.
11 1.1 alnsn *
12 1.1 alnsn * 2. Redistributions in binary form must reproduce the above copyright notice, this list
13 1.1 alnsn * of conditions and the following disclaimer in the documentation and/or other materials
14 1.1 alnsn * provided with the distribution.
15 1.1 alnsn *
16 1.1 alnsn * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY
17 1.1 alnsn * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 1.1 alnsn * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
19 1.1 alnsn * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 1.1 alnsn * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21 1.1 alnsn * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
22 1.1 alnsn * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 1.1 alnsn * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
24 1.1 alnsn * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 1.1 alnsn */
26 1.1 alnsn
27 1.1 alnsn #include "sljitLir.h"
28 1.1 alnsn
29 1.1 alnsn #define CHECK_ERROR() \
30 1.1 alnsn do { \
31 1.1 alnsn if (SLJIT_UNLIKELY(compiler->error)) \
32 1.1 alnsn return compiler->error; \
33 1.1 alnsn } while (0)
34 1.1 alnsn
35 1.1 alnsn #define CHECK_ERROR_PTR() \
36 1.1 alnsn do { \
37 1.1 alnsn if (SLJIT_UNLIKELY(compiler->error)) \
38 1.1 alnsn return NULL; \
39 1.1 alnsn } while (0)
40 1.1 alnsn
41 1.1 alnsn #define CHECK_ERROR_VOID() \
42 1.1 alnsn do { \
43 1.1 alnsn if (SLJIT_UNLIKELY(compiler->error)) \
44 1.1 alnsn return; \
45 1.1 alnsn } while (0)
46 1.1 alnsn
47 1.1 alnsn #define FAIL_IF(expr) \
48 1.1 alnsn do { \
49 1.1 alnsn if (SLJIT_UNLIKELY(expr)) \
50 1.1 alnsn return compiler->error; \
51 1.1 alnsn } while (0)
52 1.1 alnsn
53 1.1 alnsn #define PTR_FAIL_IF(expr) \
54 1.1 alnsn do { \
55 1.1 alnsn if (SLJIT_UNLIKELY(expr)) \
56 1.1 alnsn return NULL; \
57 1.1 alnsn } while (0)
58 1.1 alnsn
59 1.1 alnsn #define FAIL_IF_NULL(ptr) \
60 1.1 alnsn do { \
61 1.1 alnsn if (SLJIT_UNLIKELY(!(ptr))) { \
62 1.1 alnsn compiler->error = SLJIT_ERR_ALLOC_FAILED; \
63 1.1 alnsn return SLJIT_ERR_ALLOC_FAILED; \
64 1.1 alnsn } \
65 1.1 alnsn } while (0)
66 1.1 alnsn
67 1.1 alnsn #define PTR_FAIL_IF_NULL(ptr) \
68 1.1 alnsn do { \
69 1.1 alnsn if (SLJIT_UNLIKELY(!(ptr))) { \
70 1.1 alnsn compiler->error = SLJIT_ERR_ALLOC_FAILED; \
71 1.1 alnsn return NULL; \
72 1.1 alnsn } \
73 1.1 alnsn } while (0)
74 1.1 alnsn
75 1.1 alnsn #define PTR_FAIL_WITH_EXEC_IF(ptr) \
76 1.1 alnsn do { \
77 1.1 alnsn if (SLJIT_UNLIKELY(!(ptr))) { \
78 1.1 alnsn compiler->error = SLJIT_ERR_EX_ALLOC_FAILED; \
79 1.1 alnsn return NULL; \
80 1.1 alnsn } \
81 1.1 alnsn } while (0)
82 1.1 alnsn
83 1.1 alnsn #if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
84 1.1 alnsn
85 1.1 alnsn #define GET_OPCODE(op) \
86 1.1 alnsn ((op) & ~(SLJIT_INT_OP | SLJIT_SET_E | SLJIT_SET_S | SLJIT_SET_U | SLJIT_SET_O | SLJIT_SET_C | SLJIT_KEEP_FLAGS))
87 1.1 alnsn
88 1.1 alnsn #define GET_FLAGS(op) \
89 1.1 alnsn ((op) & (SLJIT_SET_E | SLJIT_SET_S | SLJIT_SET_U | SLJIT_SET_O | SLJIT_SET_C))
90 1.1 alnsn
91 1.1 alnsn #define GET_ALL_FLAGS(op) \
92 1.1 alnsn ((op) & (SLJIT_SET_E | SLJIT_SET_S | SLJIT_SET_U | SLJIT_SET_O | SLJIT_SET_C | SLJIT_KEEP_FLAGS))
93 1.1 alnsn
94 1.1 alnsn #define BUF_SIZE 4096
95 1.1 alnsn
96 1.1 alnsn #if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE)
97 1.1 alnsn #define ABUF_SIZE 2048
98 1.1 alnsn #else
99 1.1 alnsn #define ABUF_SIZE 4096
100 1.1 alnsn #endif
101 1.1 alnsn
102 1.1 alnsn /* Jump flags. */
103 1.1 alnsn #define JUMP_LABEL 0x1
104 1.1 alnsn #define JUMP_ADDR 0x2
105 1.1 alnsn /* SLJIT_REWRITABLE_JUMP is 0x1000. */
106 1.1 alnsn
107 1.1 alnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
108 1.1 alnsn #define PATCH_MB 0x4
109 1.1 alnsn #define PATCH_MW 0x8
110 1.1 alnsn #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
111 1.1 alnsn #define PATCH_MD 0x10
112 1.1 alnsn #endif
113 1.1 alnsn #endif
114 1.1 alnsn
115 1.1 alnsn #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
116 1.1 alnsn #define IS_BL 0x4
117 1.1 alnsn #define PATCH_B 0x8
118 1.1 alnsn #endif
119 1.1 alnsn
120 1.1 alnsn #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
121 1.1 alnsn #define CPOOL_SIZE 512
122 1.1 alnsn #endif
123 1.1 alnsn
124 1.1 alnsn #if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
125 1.1 alnsn #define IS_CONDITIONAL 0x04
126 1.1 alnsn #define IS_BL 0x08
127 1.1 alnsn /* cannot be encoded as branch */
128 1.1 alnsn #define B_TYPE0 0x00
129 1.1 alnsn /* conditional + imm8 */
130 1.1 alnsn #define B_TYPE1 0x10
131 1.1 alnsn /* conditional + imm20 */
132 1.1 alnsn #define B_TYPE2 0x20
133 1.1 alnsn /* IT + imm24 */
134 1.1 alnsn #define B_TYPE3 0x30
135 1.1 alnsn /* imm11 */
136 1.1 alnsn #define B_TYPE4 0x40
137 1.1 alnsn /* imm24 */
138 1.1 alnsn #define B_TYPE5 0x50
139 1.1 alnsn /* BL + imm24 */
140 1.1 alnsn #define BL_TYPE6 0x60
141 1.1 alnsn /* 0xf00 cc code for branches */
142 1.1 alnsn #endif
143 1.1 alnsn
144 1.1 alnsn #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
145 1.1 alnsn #define UNCOND_B 0x04
146 1.1 alnsn #define PATCH_B 0x08
147 1.1 alnsn #define ABSOLUTE_B 0x10
148 1.1 alnsn #endif
149 1.1 alnsn
150 1.1 alnsn #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
151 1.1 alnsn #define IS_MOVABLE 0x04
152 1.1 alnsn #define IS_JAL 0x08
153 1.1 alnsn #define IS_BIT26_COND 0x10
154 1.1 alnsn #define IS_BIT16_COND 0x20
155 1.1 alnsn
156 1.1 alnsn #define IS_COND (IS_BIT26_COND | IS_BIT16_COND)
157 1.1 alnsn
158 1.1 alnsn #define PATCH_B 0x40
159 1.1 alnsn #define PATCH_J 0x80
160 1.1 alnsn
161 1.1 alnsn /* instruction types */
162 1.1 alnsn #define UNMOVABLE_INS 0
163 1.1 alnsn /* 1 - 31 last destination register */
164 1.1 alnsn #define FCSR_FCC 32
165 1.1 alnsn /* no destination (i.e: store) */
166 1.1 alnsn #define MOVABLE_INS 33
167 1.1 alnsn #endif
168 1.1 alnsn
169 1.1 alnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
170 1.1 alnsn #define SLJIT_HAS_VARIABLE_LOCALS_OFFSET 1
171 1.1 alnsn #endif
172 1.1 alnsn
173 1.1 alnsn #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
174 1.1 alnsn #define SLJIT_HAS_FIXED_LOCALS_OFFSET 1
175 1.1 alnsn #ifdef _WIN64
176 1.1 alnsn #define FIXED_LOCALS_OFFSET (4 * sizeof(sljit_w))
177 1.1 alnsn #else
178 1.1 alnsn #define FIXED_LOCALS_OFFSET (sizeof(sljit_w))
179 1.1 alnsn #endif
180 1.1 alnsn #endif
181 1.1 alnsn
182 1.1 alnsn #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
183 1.1 alnsn #define SLJIT_HAS_FIXED_LOCALS_OFFSET 1
184 1.1 alnsn #define FIXED_LOCALS_OFFSET (4 * sizeof(sljit_w))
185 1.1 alnsn #endif
186 1.1 alnsn
187 1.1 alnsn #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
188 1.1 alnsn #define SLJIT_HAS_FIXED_LOCALS_OFFSET 1
189 1.1 alnsn #if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
190 1.1 alnsn #define FIXED_LOCALS_OFFSET ((6 + 8) * sizeof(sljit_w))
191 1.1 alnsn #else
192 1.1 alnsn #define FIXED_LOCALS_OFFSET (2 * sizeof(sljit_w))
193 1.1 alnsn #endif
194 1.1 alnsn #endif
195 1.1 alnsn
196 1.1 alnsn #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
197 1.1 alnsn #define SLJIT_HAS_FIXED_LOCALS_OFFSET 1
198 1.1 alnsn #define FIXED_LOCALS_OFFSET ((6 + 8) * sizeof(sljit_w))
199 1.1 alnsn #endif
200 1.1 alnsn
201 1.1 alnsn #if (defined SLJIT_HAS_VARIABLE_LOCALS_OFFSET && SLJIT_HAS_VARIABLE_LOCALS_OFFSET)
202 1.1 alnsn
203 1.1 alnsn #define ADJUST_LOCAL_OFFSET(p, i) \
204 1.1 alnsn if ((p) == (SLJIT_MEM1(SLJIT_LOCALS_REG))) \
205 1.1 alnsn (i) += compiler->locals_offset;
206 1.1 alnsn
207 1.1 alnsn #elif (defined SLJIT_HAS_FIXED_LOCALS_OFFSET && SLJIT_HAS_FIXED_LOCALS_OFFSET)
208 1.1 alnsn
209 1.1 alnsn #define ADJUST_LOCAL_OFFSET(p, i) \
210 1.1 alnsn if ((p) == (SLJIT_MEM1(SLJIT_LOCALS_REG))) \
211 1.1 alnsn (i) += FIXED_LOCALS_OFFSET;
212 1.1 alnsn
213 1.1 alnsn #else
214 1.1 alnsn
215 1.1 alnsn #define ADJUST_LOCAL_OFFSET(p, i)
216 1.1 alnsn
217 1.1 alnsn #endif
218 1.1 alnsn
219 1.1 alnsn #endif /* !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) */
220 1.1 alnsn
221 1.1 alnsn /* Utils can still be used even if SLJIT_CONFIG_UNSUPPORTED is set. */
222 1.1 alnsn #include "sljitUtils.c"
223 1.1 alnsn
224 1.1 alnsn #if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
225 1.1 alnsn
226 1.1 alnsn #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
227 1.1 alnsn #include "sljitExecAllocator.c"
228 1.1 alnsn #endif
229 1.1 alnsn
230 1.1 alnsn #if (defined SLJIT_SSE2_AUTO && SLJIT_SSE2_AUTO) && !(defined SLJIT_SSE2 && SLJIT_SSE2)
231 1.1 alnsn #error SLJIT_SSE2_AUTO cannot be enabled without SLJIT_SSE2
232 1.1 alnsn #endif
233 1.1 alnsn
234 1.1 alnsn /* --------------------------------------------------------------------- */
235 1.1 alnsn /* Public functions */
236 1.1 alnsn /* --------------------------------------------------------------------- */
237 1.1 alnsn
238 1.1 alnsn #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || ((defined SLJIT_SSE2 && SLJIT_SSE2) && ((defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)))
239 1.1 alnsn #define SLJIT_NEEDS_COMPILER_INIT 1
240 1.1 alnsn static int compiler_initialized = 0;
241 1.1 alnsn /* A thread safe initialization. */
242 1.1 alnsn static void init_compiler(void);
243 1.1 alnsn #endif
244 1.1 alnsn
245 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void)
246 1.1 alnsn {
247 1.1 alnsn struct sljit_compiler *compiler = (struct sljit_compiler*)SLJIT_MALLOC(sizeof(struct sljit_compiler));
248 1.1 alnsn if (!compiler)
249 1.1 alnsn return NULL;
250 1.1 alnsn SLJIT_ZEROMEM(compiler, sizeof(struct sljit_compiler));
251 1.1 alnsn
252 1.1 alnsn SLJIT_COMPILE_ASSERT(
253 1.1 alnsn sizeof(sljit_b) == 1 && sizeof(sljit_ub) == 1
254 1.1 alnsn && sizeof(sljit_h) == 2 && sizeof(sljit_uh) == 2
255 1.1 alnsn && sizeof(sljit_i) == 4 && sizeof(sljit_ui) == 4
256 1.1 alnsn && ((sizeof(sljit_w) == 4 && sizeof(sljit_uw) == 4) || (sizeof(sljit_w) == 8 && sizeof(sljit_uw) == 8)),
257 1.1 alnsn invalid_integer_types);
258 1.1 alnsn
259 1.1 alnsn /* Only the non-zero members must be set. */
260 1.1 alnsn compiler->error = SLJIT_SUCCESS;
261 1.1 alnsn
262 1.1 alnsn compiler->buf = (struct sljit_memory_fragment*)SLJIT_MALLOC(BUF_SIZE);
263 1.1 alnsn compiler->abuf = (struct sljit_memory_fragment*)SLJIT_MALLOC(ABUF_SIZE);
264 1.1 alnsn
265 1.1 alnsn if (!compiler->buf || !compiler->abuf) {
266 1.1 alnsn if (compiler->buf)
267 1.1 alnsn SLJIT_FREE(compiler->buf);
268 1.1 alnsn if (compiler->abuf)
269 1.1 alnsn SLJIT_FREE(compiler->abuf);
270 1.1 alnsn SLJIT_FREE(compiler);
271 1.1 alnsn return NULL;
272 1.1 alnsn }
273 1.1 alnsn
274 1.1 alnsn compiler->buf->next = NULL;
275 1.1 alnsn compiler->buf->used_size = 0;
276 1.1 alnsn compiler->abuf->next = NULL;
277 1.1 alnsn compiler->abuf->used_size = 0;
278 1.1 alnsn
279 1.1 alnsn compiler->temporaries = -1;
280 1.1 alnsn compiler->saveds = -1;
281 1.1 alnsn
282 1.1 alnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
283 1.1 alnsn compiler->args = -1;
284 1.1 alnsn #endif
285 1.1 alnsn
286 1.1 alnsn #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
287 1.1 alnsn compiler->cpool = (sljit_uw*)SLJIT_MALLOC(CPOOL_SIZE * sizeof(sljit_uw) + CPOOL_SIZE * sizeof(sljit_ub));
288 1.1 alnsn if (!compiler->cpool) {
289 1.1 alnsn SLJIT_FREE(compiler->buf);
290 1.1 alnsn SLJIT_FREE(compiler->abuf);
291 1.1 alnsn SLJIT_FREE(compiler);
292 1.1 alnsn return NULL;
293 1.1 alnsn }
294 1.1 alnsn compiler->cpool_unique = (sljit_ub*)(compiler->cpool + CPOOL_SIZE);
295 1.1 alnsn compiler->cpool_diff = 0xffffffff;
296 1.1 alnsn #endif
297 1.1 alnsn
298 1.1 alnsn #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
299 1.1 alnsn compiler->delay_slot = UNMOVABLE_INS;
300 1.1 alnsn #endif
301 1.1 alnsn
302 1.1 alnsn #if (defined SLJIT_NEEDS_COMPILER_INIT && SLJIT_NEEDS_COMPILER_INIT)
303 1.1 alnsn if (!compiler_initialized) {
304 1.1 alnsn init_compiler();
305 1.1 alnsn compiler_initialized = 1;
306 1.1 alnsn }
307 1.1 alnsn #endif
308 1.1 alnsn
309 1.1 alnsn return compiler;
310 1.1 alnsn }
311 1.1 alnsn
312 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler)
313 1.1 alnsn {
314 1.1 alnsn struct sljit_memory_fragment *buf;
315 1.1 alnsn struct sljit_memory_fragment *curr;
316 1.1 alnsn
317 1.1 alnsn buf = compiler->buf;
318 1.1 alnsn while (buf) {
319 1.1 alnsn curr = buf;
320 1.1 alnsn buf = buf->next;
321 1.1 alnsn SLJIT_FREE(curr);
322 1.1 alnsn }
323 1.1 alnsn
324 1.1 alnsn buf = compiler->abuf;
325 1.1 alnsn while (buf) {
326 1.1 alnsn curr = buf;
327 1.1 alnsn buf = buf->next;
328 1.1 alnsn SLJIT_FREE(curr);
329 1.1 alnsn }
330 1.1 alnsn
331 1.1 alnsn #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
332 1.1 alnsn SLJIT_FREE(compiler->cpool);
333 1.1 alnsn #endif
334 1.1 alnsn SLJIT_FREE(compiler);
335 1.1 alnsn }
336 1.1 alnsn
337 1.1 alnsn #if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
338 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)
339 1.1 alnsn {
340 1.1 alnsn /* Remove thumb mode flag. */
341 1.1 alnsn SLJIT_FREE_EXEC((void*)((sljit_uw)code & ~0x1));
342 1.1 alnsn }
343 1.1 alnsn #elif (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
344 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)
345 1.1 alnsn {
346 1.1 alnsn /* Resolve indirection. */
347 1.1 alnsn code = (void*)(*(sljit_uw*)code);
348 1.1 alnsn SLJIT_FREE_EXEC(code);
349 1.1 alnsn }
350 1.1 alnsn #else
351 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)
352 1.1 alnsn {
353 1.1 alnsn SLJIT_FREE_EXEC(code);
354 1.1 alnsn }
355 1.1 alnsn #endif
356 1.1 alnsn
357 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label)
358 1.1 alnsn {
359 1.1 alnsn if (SLJIT_LIKELY(!!jump) && SLJIT_LIKELY(!!label)) {
360 1.1 alnsn jump->flags &= ~JUMP_ADDR;
361 1.1 alnsn jump->flags |= JUMP_LABEL;
362 1.1 alnsn jump->u.label = label;
363 1.1 alnsn }
364 1.1 alnsn }
365 1.1 alnsn
366 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target)
367 1.1 alnsn {
368 1.1 alnsn if (SLJIT_LIKELY(!!jump)) {
369 1.1 alnsn SLJIT_ASSERT(jump->flags & SLJIT_REWRITABLE_JUMP);
370 1.1 alnsn
371 1.1 alnsn jump->flags &= ~JUMP_LABEL;
372 1.1 alnsn jump->flags |= JUMP_ADDR;
373 1.1 alnsn jump->u.target = target;
374 1.1 alnsn }
375 1.1 alnsn }
376 1.1 alnsn
377 1.1 alnsn /* --------------------------------------------------------------------- */
378 1.1 alnsn /* Private functions */
379 1.1 alnsn /* --------------------------------------------------------------------- */
380 1.1 alnsn
381 1.1 alnsn static void* ensure_buf(struct sljit_compiler *compiler, int size)
382 1.1 alnsn {
383 1.1 alnsn sljit_ub *ret;
384 1.1 alnsn struct sljit_memory_fragment *new_frag;
385 1.1 alnsn
386 1.1 alnsn if (compiler->buf->used_size + size <= (int)(BUF_SIZE - sizeof(sljit_uw) - sizeof(void*))) {
387 1.1 alnsn ret = compiler->buf->memory + compiler->buf->used_size;
388 1.1 alnsn compiler->buf->used_size += size;
389 1.1 alnsn return ret;
390 1.1 alnsn }
391 1.1 alnsn new_frag = (struct sljit_memory_fragment*)SLJIT_MALLOC(BUF_SIZE);
392 1.1 alnsn PTR_FAIL_IF_NULL(new_frag);
393 1.1 alnsn new_frag->next = compiler->buf;
394 1.1 alnsn compiler->buf = new_frag;
395 1.1 alnsn new_frag->used_size = size;
396 1.1 alnsn return new_frag->memory;
397 1.1 alnsn }
398 1.1 alnsn
399 1.1 alnsn static void* ensure_abuf(struct sljit_compiler *compiler, int size)
400 1.1 alnsn {
401 1.1 alnsn sljit_ub *ret;
402 1.1 alnsn struct sljit_memory_fragment *new_frag;
403 1.1 alnsn
404 1.1 alnsn if (compiler->abuf->used_size + size <= (int)(ABUF_SIZE - sizeof(sljit_uw) - sizeof(void*))) {
405 1.1 alnsn ret = compiler->abuf->memory + compiler->abuf->used_size;
406 1.1 alnsn compiler->abuf->used_size += size;
407 1.1 alnsn return ret;
408 1.1 alnsn }
409 1.1 alnsn new_frag = (struct sljit_memory_fragment*)SLJIT_MALLOC(ABUF_SIZE);
410 1.1 alnsn PTR_FAIL_IF_NULL(new_frag);
411 1.1 alnsn new_frag->next = compiler->abuf;
412 1.1 alnsn compiler->abuf = new_frag;
413 1.1 alnsn new_frag->used_size = size;
414 1.1 alnsn return new_frag->memory;
415 1.1 alnsn }
416 1.1 alnsn
417 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, int size)
418 1.1 alnsn {
419 1.1 alnsn CHECK_ERROR_PTR();
420 1.1 alnsn
421 1.1 alnsn #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
422 1.1 alnsn if (size <= 0 || size > 128)
423 1.1 alnsn return NULL;
424 1.1 alnsn size = (size + 7) & ~7;
425 1.1 alnsn #else
426 1.1 alnsn if (size <= 0 || size > 64)
427 1.1 alnsn return NULL;
428 1.1 alnsn size = (size + 3) & ~3;
429 1.1 alnsn #endif
430 1.1 alnsn return ensure_abuf(compiler, size);
431 1.1 alnsn }
432 1.1 alnsn
433 1.1 alnsn static SLJIT_INLINE void reverse_buf(struct sljit_compiler *compiler)
434 1.1 alnsn {
435 1.1 alnsn struct sljit_memory_fragment *buf = compiler->buf;
436 1.1 alnsn struct sljit_memory_fragment *prev = NULL;
437 1.1 alnsn struct sljit_memory_fragment *tmp;
438 1.1 alnsn
439 1.1 alnsn do {
440 1.1 alnsn tmp = buf->next;
441 1.1 alnsn buf->next = prev;
442 1.1 alnsn prev = buf;
443 1.1 alnsn buf = tmp;
444 1.1 alnsn } while (buf != NULL);
445 1.1 alnsn
446 1.1 alnsn compiler->buf = prev;
447 1.1 alnsn }
448 1.1 alnsn
449 1.1 alnsn static SLJIT_INLINE void set_label(struct sljit_label *label, struct sljit_compiler *compiler)
450 1.1 alnsn {
451 1.1 alnsn label->next = NULL;
452 1.1 alnsn label->size = compiler->size;
453 1.1 alnsn if (compiler->last_label)
454 1.1 alnsn compiler->last_label->next = label;
455 1.1 alnsn else
456 1.1 alnsn compiler->labels = label;
457 1.1 alnsn compiler->last_label = label;
458 1.1 alnsn }
459 1.1 alnsn
460 1.1 alnsn static SLJIT_INLINE void set_jump(struct sljit_jump *jump, struct sljit_compiler *compiler, int flags)
461 1.1 alnsn {
462 1.1 alnsn jump->next = NULL;
463 1.1 alnsn jump->flags = flags;
464 1.1 alnsn if (compiler->last_jump)
465 1.1 alnsn compiler->last_jump->next = jump;
466 1.1 alnsn else
467 1.1 alnsn compiler->jumps = jump;
468 1.1 alnsn compiler->last_jump = jump;
469 1.1 alnsn }
470 1.1 alnsn
471 1.1 alnsn static SLJIT_INLINE void set_const(struct sljit_const *const_, struct sljit_compiler *compiler)
472 1.1 alnsn {
473 1.1 alnsn const_->next = NULL;
474 1.1 alnsn const_->addr = compiler->size;
475 1.1 alnsn if (compiler->last_const)
476 1.1 alnsn compiler->last_const->next = const_;
477 1.1 alnsn else
478 1.1 alnsn compiler->consts = const_;
479 1.1 alnsn compiler->last_const = const_;
480 1.1 alnsn }
481 1.1 alnsn
482 1.1 alnsn #define ADDRESSING_DEPENDS_ON(exp, reg) \
483 1.1 alnsn (((exp) & SLJIT_MEM) && (((exp) & 0xf) == reg || (((exp) >> 4) & 0xf) == reg))
484 1.1 alnsn
485 1.1 alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
486 1.1 alnsn #define FUNCTION_CHECK_OP() \
487 1.1 alnsn SLJIT_ASSERT(!GET_FLAGS(op) || !(op & SLJIT_KEEP_FLAGS)); \
488 1.1 alnsn switch (GET_OPCODE(op)) { \
489 1.1 alnsn case SLJIT_NOT: \
490 1.1 alnsn case SLJIT_CLZ: \
491 1.1 alnsn case SLJIT_AND: \
492 1.1 alnsn case SLJIT_OR: \
493 1.1 alnsn case SLJIT_XOR: \
494 1.1 alnsn case SLJIT_SHL: \
495 1.1 alnsn case SLJIT_LSHR: \
496 1.1 alnsn case SLJIT_ASHR: \
497 1.1 alnsn SLJIT_ASSERT(!(op & (SLJIT_SET_S | SLJIT_SET_U | SLJIT_SET_O | SLJIT_SET_C))); \
498 1.1 alnsn break; \
499 1.1 alnsn case SLJIT_NEG: \
500 1.1 alnsn SLJIT_ASSERT(!(op & (SLJIT_SET_S | SLJIT_SET_U | SLJIT_SET_C))); \
501 1.1 alnsn break; \
502 1.1 alnsn case SLJIT_MUL: \
503 1.1 alnsn SLJIT_ASSERT(!(op & (SLJIT_SET_E | SLJIT_SET_S | SLJIT_SET_U | SLJIT_SET_C))); \
504 1.1 alnsn break; \
505 1.1 alnsn case SLJIT_FCMP: \
506 1.1 alnsn SLJIT_ASSERT(!(op & (SLJIT_INT_OP | SLJIT_SET_U | SLJIT_SET_O | SLJIT_SET_C | SLJIT_KEEP_FLAGS))); \
507 1.1 alnsn SLJIT_ASSERT((op & (SLJIT_SET_E | SLJIT_SET_S))); \
508 1.1 alnsn break; \
509 1.1 alnsn case SLJIT_ADD: \
510 1.1 alnsn SLJIT_ASSERT(!(op & (SLJIT_SET_S | SLJIT_SET_U))); \
511 1.1 alnsn break; \
512 1.1 alnsn case SLJIT_SUB: \
513 1.1 alnsn break; \
514 1.1 alnsn case SLJIT_ADDC: \
515 1.1 alnsn case SLJIT_SUBC: \
516 1.1 alnsn SLJIT_ASSERT(!(op & (SLJIT_SET_E | SLJIT_SET_S | SLJIT_SET_U | SLJIT_SET_O))); \
517 1.1 alnsn break; \
518 1.1 alnsn default: \
519 1.1 alnsn /* Nothing allowed */ \
520 1.1 alnsn SLJIT_ASSERT(!(op & (SLJIT_INT_OP | SLJIT_SET_E | SLJIT_SET_S | SLJIT_SET_U | SLJIT_SET_O | SLJIT_SET_C | SLJIT_KEEP_FLAGS))); \
521 1.1 alnsn break; \
522 1.1 alnsn }
523 1.1 alnsn
524 1.1 alnsn #define FUNCTION_CHECK_IS_REG(r) \
525 1.1 alnsn ((r) == SLJIT_UNUSED || \
526 1.1 alnsn ((r) >= SLJIT_TEMPORARY_REG1 && (r) <= SLJIT_TEMPORARY_REG1 - 1 + compiler->temporaries) || \
527 1.1 alnsn ((r) >= SLJIT_SAVED_REG1 && (r) <= SLJIT_SAVED_REG1 - 1 + compiler->saveds))
528 1.1 alnsn
529 1.1 alnsn #define FUNCTION_CHECK_SRC(p, i) \
530 1.1 alnsn SLJIT_ASSERT(compiler->temporaries != -1 && compiler->saveds != -1); \
531 1.1 alnsn if (FUNCTION_CHECK_IS_REG(p)) \
532 1.1 alnsn SLJIT_ASSERT((i) == 0 && (p) != SLJIT_UNUSED); \
533 1.1 alnsn else if ((p) == SLJIT_IMM) \
534 1.1 alnsn ; \
535 1.1 alnsn else if ((p) == (SLJIT_MEM1(SLJIT_LOCALS_REG))) \
536 1.1 alnsn SLJIT_ASSERT((i) >= 0 && (i) < compiler->logical_local_size); \
537 1.1 alnsn else if ((p) & SLJIT_MEM) { \
538 1.1 alnsn SLJIT_ASSERT(FUNCTION_CHECK_IS_REG((p) & 0xf)); \
539 1.1 alnsn if ((p) & 0xf0) { \
540 1.1 alnsn SLJIT_ASSERT(FUNCTION_CHECK_IS_REG(((p) >> 4) & 0xf)); \
541 1.1 alnsn SLJIT_ASSERT(!((i) & ~0x3)); \
542 1.1 alnsn } \
543 1.1 alnsn SLJIT_ASSERT(((p) >> 9) == 0); \
544 1.1 alnsn } \
545 1.1 alnsn else \
546 1.1 alnsn SLJIT_ASSERT_STOP();
547 1.1 alnsn
548 1.1 alnsn #define FUNCTION_CHECK_DST(p, i) \
549 1.1 alnsn SLJIT_ASSERT(compiler->temporaries != -1 && compiler->saveds != -1); \
550 1.1 alnsn if (FUNCTION_CHECK_IS_REG(p)) \
551 1.1 alnsn SLJIT_ASSERT((i) == 0); \
552 1.1 alnsn else if ((p) == (SLJIT_MEM1(SLJIT_LOCALS_REG))) \
553 1.1 alnsn SLJIT_ASSERT((i) >= 0 && (i) < compiler->logical_local_size); \
554 1.1 alnsn else if ((p) & SLJIT_MEM) { \
555 1.1 alnsn SLJIT_ASSERT(FUNCTION_CHECK_IS_REG((p) & 0xf)); \
556 1.1 alnsn if ((p) & 0xf0) { \
557 1.1 alnsn SLJIT_ASSERT(FUNCTION_CHECK_IS_REG(((p) >> 4) & 0xf)); \
558 1.1 alnsn SLJIT_ASSERT(!((i) & ~0x3)); \
559 1.1 alnsn } \
560 1.1 alnsn SLJIT_ASSERT(((p) >> 9) == 0); \
561 1.1 alnsn } \
562 1.1 alnsn else \
563 1.1 alnsn SLJIT_ASSERT_STOP();
564 1.1 alnsn
565 1.1 alnsn #define FUNCTION_FCHECK(p, i) \
566 1.1 alnsn if ((p) >= SLJIT_FLOAT_REG1 && (p) <= SLJIT_FLOAT_REG4) \
567 1.1 alnsn SLJIT_ASSERT(i == 0); \
568 1.1 alnsn else if ((p) & SLJIT_MEM) { \
569 1.1 alnsn SLJIT_ASSERT(FUNCTION_CHECK_IS_REG((p) & 0xf)); \
570 1.1 alnsn if ((p) & 0xf0) { \
571 1.1 alnsn SLJIT_ASSERT(FUNCTION_CHECK_IS_REG(((p) >> 4) & 0xf)); \
572 1.1 alnsn SLJIT_ASSERT(((p) & 0xf0) != (SLJIT_LOCALS_REG << 4) && !(i & ~0x3)); \
573 1.1 alnsn } else \
574 1.1 alnsn SLJIT_ASSERT((((p) >> 4) & 0xf) == 0); \
575 1.1 alnsn SLJIT_ASSERT(((p) >> 9) == 0); \
576 1.1 alnsn } \
577 1.1 alnsn else \
578 1.1 alnsn SLJIT_ASSERT_STOP();
579 1.1 alnsn
580 1.1 alnsn #define FUNCTION_CHECK_OP1() \
581 1.1 alnsn if (GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_MOVU_SI) { \
582 1.1 alnsn SLJIT_ASSERT(!GET_ALL_FLAGS(op)); \
583 1.1 alnsn } \
584 1.1 alnsn if (GET_OPCODE(op) >= SLJIT_MOVU && GET_OPCODE(op) <= SLJIT_MOVU_SI) { \
585 1.1 alnsn SLJIT_ASSERT(!(src & SLJIT_MEM) || (src & 0xf) != SLJIT_LOCALS_REG); \
586 1.1 alnsn SLJIT_ASSERT(!(dst & SLJIT_MEM) || (dst & 0xf) != SLJIT_LOCALS_REG); \
587 1.1 alnsn if ((src & SLJIT_MEM) && (src & 0xf)) \
588 1.1 alnsn SLJIT_ASSERT((dst & 0xf) != (src & 0xf) && ((dst >> 4) & 0xf) != (src & 0xf)); \
589 1.1 alnsn }
590 1.1 alnsn
591 1.1 alnsn #endif
592 1.1 alnsn
593 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
594 1.1 alnsn
595 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose)
596 1.1 alnsn {
597 1.1 alnsn compiler->verbose = verbose;
598 1.1 alnsn }
599 1.1 alnsn
600 1.1 alnsn static char* reg_names[] = {
601 1.1 alnsn (char*)"<noreg>", (char*)"t1", (char*)"t2", (char*)"t3",
602 1.1 alnsn (char*)"te1", (char*)"te2", (char*)"s1", (char*)"s2",
603 1.1 alnsn (char*)"s3", (char*)"se1", (char*)"se2", (char*)"lcr"
604 1.1 alnsn };
605 1.1 alnsn
606 1.1 alnsn static char* freg_names[] = {
607 1.1 alnsn (char*)"<noreg>", (char*)"float_r1", (char*)"float_r2", (char*)"float_r3", (char*)"float_r4"
608 1.1 alnsn };
609 1.1 alnsn
610 1.1 alnsn #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
611 1.1 alnsn #ifdef _WIN64
612 1.1 alnsn #define SLJIT_PRINT_D "I64"
613 1.1 alnsn #else
614 1.1 alnsn #define SLJIT_PRINT_D "l"
615 1.1 alnsn #endif
616 1.1 alnsn #else
617 1.1 alnsn #define SLJIT_PRINT_D ""
618 1.1 alnsn #endif
619 1.1 alnsn
620 1.1 alnsn #define sljit_verbose_param(p, i) \
621 1.1 alnsn if ((p) & SLJIT_IMM) \
622 1.1 alnsn fprintf(compiler->verbose, "#%" SLJIT_PRINT_D "d", (i)); \
623 1.1 alnsn else if ((p) & SLJIT_MEM) { \
624 1.1 alnsn if ((p) & 0xf) { \
625 1.1 alnsn if (i) { \
626 1.1 alnsn if (((p) >> 4) & 0xf) \
627 1.1 alnsn fprintf(compiler->verbose, "[%s + %s * %d]", reg_names[(p) & 0xF], reg_names[((p) >> 4)& 0xF], 1 << (i)); \
628 1.1 alnsn else \
629 1.1 alnsn fprintf(compiler->verbose, "[%s + #%" SLJIT_PRINT_D "d]", reg_names[(p) & 0xF], (i)); \
630 1.1 alnsn } \
631 1.1 alnsn else { \
632 1.1 alnsn if (((p) >> 4) & 0xf) \
633 1.1 alnsn fprintf(compiler->verbose, "[%s + %s]", reg_names[(p) & 0xF], reg_names[((p) >> 4)& 0xF]); \
634 1.1 alnsn else \
635 1.1 alnsn fprintf(compiler->verbose, "[%s]", reg_names[(p) & 0xF]); \
636 1.1 alnsn } \
637 1.1 alnsn } \
638 1.1 alnsn else \
639 1.1 alnsn fprintf(compiler->verbose, "[#%" SLJIT_PRINT_D "d]", (i)); \
640 1.1 alnsn } else \
641 1.1 alnsn fprintf(compiler->verbose, "%s", reg_names[p]);
642 1.1 alnsn #define sljit_verbose_fparam(p, i) \
643 1.1 alnsn if ((p) & SLJIT_MEM) { \
644 1.1 alnsn if ((p) & 0xf) { \
645 1.1 alnsn if (i) { \
646 1.1 alnsn if (((p) >> 4) & 0xf) \
647 1.1 alnsn fprintf(compiler->verbose, "[%s + %s * %d]", reg_names[(p) & 0xF], reg_names[((p) >> 4)& 0xF], 1 << (i)); \
648 1.1 alnsn else \
649 1.1 alnsn fprintf(compiler->verbose, "[%s + #%" SLJIT_PRINT_D "d]", reg_names[(p) & 0xF], (i)); \
650 1.1 alnsn } \
651 1.1 alnsn else { \
652 1.1 alnsn if (((p) >> 4) & 0xF) \
653 1.1 alnsn fprintf(compiler->verbose, "[%s + %s]", reg_names[(p) & 0xF], reg_names[((p) >> 4)& 0xF]); \
654 1.1 alnsn else \
655 1.1 alnsn fprintf(compiler->verbose, "[%s]", reg_names[(p) & 0xF]); \
656 1.1 alnsn } \
657 1.1 alnsn } \
658 1.1 alnsn else \
659 1.1 alnsn fprintf(compiler->verbose, "[#%" SLJIT_PRINT_D "d]", (i)); \
660 1.1 alnsn } else \
661 1.1 alnsn fprintf(compiler->verbose, "%s", freg_names[p]);
662 1.1 alnsn
663 1.1 alnsn static SLJIT_CONST char* op_names[] = {
664 1.1 alnsn /* op0 */
665 1.1 alnsn (char*)"breakpoint", (char*)"nop",
666 1.1 alnsn (char*)"umul", (char*)"smul", (char*)"udiv", (char*)"sdiv",
667 1.1 alnsn /* op1 */
668 1.1 alnsn (char*)"mov", (char*)"mov.ub", (char*)"mov.sb", (char*)"mov.uh",
669 1.1 alnsn (char*)"mov.sh", (char*)"mov.ui", (char*)"mov.si", (char*)"movu",
670 1.1 alnsn (char*)"movu.ub", (char*)"movu.sb", (char*)"movu.uh", (char*)"movu.sh",
671 1.1 alnsn (char*)"movu.ui", (char*)"movu.si", (char*)"not", (char*)"neg",
672 1.1 alnsn (char*)"clz",
673 1.1 alnsn /* op2 */
674 1.1 alnsn (char*)"add", (char*)"addc", (char*)"sub", (char*)"subc",
675 1.1 alnsn (char*)"mul", (char*)"and", (char*)"or", (char*)"xor",
676 1.1 alnsn (char*)"shl", (char*)"lshr", (char*)"ashr",
677 1.1 alnsn /* fop1 */
678 1.1 alnsn (char*)"fcmp", (char*)"fmov", (char*)"fneg", (char*)"fabs",
679 1.1 alnsn /* fop2 */
680 1.1 alnsn (char*)"fadd", (char*)"fsub", (char*)"fmul", (char*)"fdiv"
681 1.1 alnsn };
682 1.1 alnsn
683 1.1 alnsn static char* jump_names[] = {
684 1.1 alnsn (char*)"c_equal", (char*)"c_not_equal",
685 1.1 alnsn (char*)"c_less", (char*)"c_greater_equal",
686 1.1 alnsn (char*)"c_greater", (char*)"c_less_equal",
687 1.1 alnsn (char*)"c_sig_less", (char*)"c_sig_greater_equal",
688 1.1 alnsn (char*)"c_sig_greater", (char*)"c_sig_less_equal",
689 1.1 alnsn (char*)"c_overflow", (char*)"c_not_overflow",
690 1.1 alnsn (char*)"c_mul_overflow", (char*)"c_mul_not_overflow",
691 1.1 alnsn (char*)"c_float_equal", (char*)"c_float_not_equal",
692 1.1 alnsn (char*)"c_float_less", (char*)"c_float_greater_equal",
693 1.1 alnsn (char*)"c_float_greater", (char*)"c_float_less_equal",
694 1.1 alnsn (char*)"c_float_nan", (char*)"c_float_not_nan",
695 1.1 alnsn (char*)"jump", (char*)"fast_call",
696 1.1 alnsn (char*)"call0", (char*)"call1", (char*)"call2", (char*)"call3"
697 1.1 alnsn };
698 1.1 alnsn
699 1.1 alnsn #endif
700 1.1 alnsn
701 1.1 alnsn /* --------------------------------------------------------------------- */
702 1.1 alnsn /* Arch dependent */
703 1.1 alnsn /* --------------------------------------------------------------------- */
704 1.1 alnsn
705 1.1 alnsn static SLJIT_INLINE void check_sljit_generate_code(struct sljit_compiler *compiler)
706 1.1 alnsn {
707 1.1 alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
708 1.1 alnsn struct sljit_jump *jump;
709 1.1 alnsn #endif
710 1.1 alnsn /* If debug and verbose are disabled, all arguments are unused. */
711 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
712 1.1 alnsn
713 1.1 alnsn SLJIT_ASSERT(compiler->size > 0);
714 1.1 alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
715 1.1 alnsn jump = compiler->jumps;
716 1.1 alnsn while (jump) {
717 1.1 alnsn /* All jumps have target. */
718 1.1 alnsn SLJIT_ASSERT(jump->flags & (JUMP_LABEL | JUMP_ADDR));
719 1.1 alnsn jump = jump->next;
720 1.1 alnsn }
721 1.1 alnsn #endif
722 1.1 alnsn }
723 1.1 alnsn
724 1.1 alnsn static SLJIT_INLINE void check_sljit_emit_enter(struct sljit_compiler *compiler, int args, int temporaries, int saveds, int local_size)
725 1.1 alnsn {
726 1.1 alnsn /* If debug and verbose are disabled, all arguments are unused. */
727 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
728 1.1 alnsn SLJIT_UNUSED_ARG(args);
729 1.1 alnsn SLJIT_UNUSED_ARG(temporaries);
730 1.1 alnsn SLJIT_UNUSED_ARG(saveds);
731 1.1 alnsn SLJIT_UNUSED_ARG(local_size);
732 1.1 alnsn
733 1.1 alnsn SLJIT_ASSERT(args >= 0 && args <= 3);
734 1.1 alnsn SLJIT_ASSERT(temporaries >= 0 && temporaries <= SLJIT_NO_TMP_REGISTERS);
735 1.1 alnsn SLJIT_ASSERT(saveds >= 0 && saveds <= SLJIT_NO_GEN_REGISTERS);
736 1.1 alnsn SLJIT_ASSERT(args <= saveds);
737 1.1 alnsn SLJIT_ASSERT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);
738 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
739 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose))
740 1.1 alnsn fprintf(compiler->verbose, " enter args=%d temporaries=%d saveds=%d local_size=%d\n", args, temporaries, saveds, local_size);
741 1.1 alnsn #endif
742 1.1 alnsn }
743 1.1 alnsn
744 1.1 alnsn static SLJIT_INLINE void check_sljit_set_context(struct sljit_compiler *compiler, int args, int temporaries, int saveds, int local_size)
745 1.1 alnsn {
746 1.1 alnsn /* If debug and verbose are disabled, all arguments are unused. */
747 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
748 1.1 alnsn SLJIT_UNUSED_ARG(args);
749 1.1 alnsn SLJIT_UNUSED_ARG(temporaries);
750 1.1 alnsn SLJIT_UNUSED_ARG(saveds);
751 1.1 alnsn SLJIT_UNUSED_ARG(local_size);
752 1.1 alnsn
753 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
754 1.1 alnsn if (SLJIT_UNLIKELY(compiler->skip_checks)) {
755 1.1 alnsn compiler->skip_checks = 0;
756 1.1 alnsn return;
757 1.1 alnsn }
758 1.1 alnsn #endif
759 1.1 alnsn
760 1.1 alnsn SLJIT_ASSERT(args >= 0 && args <= 3);
761 1.1 alnsn SLJIT_ASSERT(temporaries >= 0 && temporaries <= SLJIT_NO_TMP_REGISTERS);
762 1.1 alnsn SLJIT_ASSERT(saveds >= 0 && saveds <= SLJIT_NO_GEN_REGISTERS);
763 1.1 alnsn SLJIT_ASSERT(args <= saveds);
764 1.1 alnsn SLJIT_ASSERT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);
765 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
766 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose))
767 1.1 alnsn fprintf(compiler->verbose, " set_context args=%d temporaries=%d saveds=%d local_size=%d\n", args, temporaries, saveds, local_size);
768 1.1 alnsn #endif
769 1.1 alnsn }
770 1.1 alnsn
771 1.1 alnsn static SLJIT_INLINE void check_sljit_emit_return(struct sljit_compiler *compiler, int op, int src, sljit_w srcw)
772 1.1 alnsn {
773 1.1 alnsn /* If debug and verbose are disabled, all arguments are unused. */
774 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
775 1.1 alnsn SLJIT_UNUSED_ARG(op);
776 1.1 alnsn SLJIT_UNUSED_ARG(src);
777 1.1 alnsn SLJIT_UNUSED_ARG(srcw);
778 1.1 alnsn
779 1.1 alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
780 1.1 alnsn if (op != SLJIT_UNUSED) {
781 1.1 alnsn SLJIT_ASSERT(op >= SLJIT_MOV && op <= SLJIT_MOV_SI);
782 1.1 alnsn FUNCTION_CHECK_SRC(src, srcw);
783 1.1 alnsn }
784 1.1 alnsn else
785 1.1 alnsn SLJIT_ASSERT(src == 0 && srcw == 0);
786 1.1 alnsn #endif
787 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
788 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose)) {
789 1.1 alnsn if (op == SLJIT_UNUSED)
790 1.1 alnsn fprintf(compiler->verbose, " return\n");
791 1.1 alnsn else {
792 1.1 alnsn fprintf(compiler->verbose, " return %s ", op_names[op]);
793 1.1 alnsn sljit_verbose_param(src, srcw);
794 1.1 alnsn fprintf(compiler->verbose, "\n");
795 1.1 alnsn }
796 1.1 alnsn }
797 1.1 alnsn #endif
798 1.1 alnsn }
799 1.1 alnsn
800 1.1 alnsn static SLJIT_INLINE void check_sljit_emit_fast_enter(struct sljit_compiler *compiler, int dst, sljit_w dstw)
801 1.1 alnsn {
802 1.1 alnsn /* If debug and verbose are disabled, all arguments are unused. */
803 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
804 1.1 alnsn SLJIT_UNUSED_ARG(dst);
805 1.1 alnsn SLJIT_UNUSED_ARG(dstw);
806 1.1 alnsn
807 1.1 alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
808 1.1 alnsn FUNCTION_CHECK_DST(dst, dstw);
809 1.1 alnsn #endif
810 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
811 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose)) {
812 1.1 alnsn fprintf(compiler->verbose, " fast_enter ");
813 1.1 alnsn sljit_verbose_param(dst, dstw);
814 1.1 alnsn fprintf(compiler->verbose, "\n");
815 1.1 alnsn }
816 1.1 alnsn #endif
817 1.1 alnsn }
818 1.1 alnsn
819 1.1 alnsn static SLJIT_INLINE void check_sljit_emit_fast_return(struct sljit_compiler *compiler, int src, sljit_w srcw)
820 1.1 alnsn {
821 1.1 alnsn /* If debug and verbose are disabled, all arguments are unused. */
822 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
823 1.1 alnsn SLJIT_UNUSED_ARG(src);
824 1.1 alnsn SLJIT_UNUSED_ARG(srcw);
825 1.1 alnsn
826 1.1 alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
827 1.1 alnsn FUNCTION_CHECK_SRC(src, srcw);
828 1.1 alnsn #endif
829 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
830 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose)) {
831 1.1 alnsn fprintf(compiler->verbose, " fast_return ");
832 1.1 alnsn sljit_verbose_param(src, srcw);
833 1.1 alnsn fprintf(compiler->verbose, "\n");
834 1.1 alnsn }
835 1.1 alnsn #endif
836 1.1 alnsn }
837 1.1 alnsn
838 1.1 alnsn static SLJIT_INLINE void check_sljit_emit_op0(struct sljit_compiler *compiler, int op)
839 1.1 alnsn {
840 1.1 alnsn /* If debug and verbose are disabled, all arguments are unused. */
841 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
842 1.1 alnsn SLJIT_UNUSED_ARG(op);
843 1.1 alnsn
844 1.1 alnsn SLJIT_ASSERT((op >= SLJIT_BREAKPOINT && op <= SLJIT_SMUL)
845 1.1 alnsn || ((op & ~SLJIT_INT_OP) >= SLJIT_UDIV && (op & ~SLJIT_INT_OP) <= SLJIT_SDIV));
846 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
847 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose))
848 1.1 alnsn fprintf(compiler->verbose, " %s%s\n", !(op & SLJIT_INT_OP) ? "" : "i", op_names[GET_OPCODE(op)]);
849 1.1 alnsn #endif
850 1.1 alnsn }
851 1.1 alnsn
852 1.1 alnsn static SLJIT_INLINE void check_sljit_emit_op1(struct sljit_compiler *compiler, int op,
853 1.1 alnsn int dst, sljit_w dstw,
854 1.1 alnsn int src, sljit_w srcw)
855 1.1 alnsn {
856 1.1 alnsn /* If debug and verbose are disabled, all arguments are unused. */
857 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
858 1.1 alnsn SLJIT_UNUSED_ARG(op);
859 1.1 alnsn SLJIT_UNUSED_ARG(dst);
860 1.1 alnsn SLJIT_UNUSED_ARG(dstw);
861 1.1 alnsn SLJIT_UNUSED_ARG(src);
862 1.1 alnsn SLJIT_UNUSED_ARG(srcw);
863 1.1 alnsn
864 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
865 1.1 alnsn if (SLJIT_UNLIKELY(compiler->skip_checks)) {
866 1.1 alnsn compiler->skip_checks = 0;
867 1.1 alnsn return;
868 1.1 alnsn }
869 1.1 alnsn #endif
870 1.1 alnsn
871 1.1 alnsn SLJIT_ASSERT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_CLZ);
872 1.1 alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
873 1.1 alnsn FUNCTION_CHECK_OP();
874 1.1 alnsn FUNCTION_CHECK_SRC(src, srcw);
875 1.1 alnsn FUNCTION_CHECK_DST(dst, dstw);
876 1.1 alnsn FUNCTION_CHECK_OP1();
877 1.1 alnsn #endif
878 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
879 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose)) {
880 1.1 alnsn fprintf(compiler->verbose, " %s%s%s%s%s%s%s%s ", !(op & SLJIT_INT_OP) ? "" : "i", op_names[GET_OPCODE(op)],
881 1.1 alnsn !(op & SLJIT_SET_E) ? "" : "E", !(op & SLJIT_SET_S) ? "" : "S", !(op & SLJIT_SET_U) ? "" : "U", !(op & SLJIT_SET_O) ? "" : "O", !(op & SLJIT_SET_C) ? "" : "C", !(op & SLJIT_KEEP_FLAGS) ? "" : "K");
882 1.1 alnsn sljit_verbose_param(dst, dstw);
883 1.1 alnsn fprintf(compiler->verbose, ", ");
884 1.1 alnsn sljit_verbose_param(src, srcw);
885 1.1 alnsn fprintf(compiler->verbose, "\n");
886 1.1 alnsn }
887 1.1 alnsn #endif
888 1.1 alnsn }
889 1.1 alnsn
890 1.1 alnsn static SLJIT_INLINE void check_sljit_emit_op2(struct sljit_compiler *compiler, int op,
891 1.1 alnsn int dst, sljit_w dstw,
892 1.1 alnsn int src1, sljit_w src1w,
893 1.1 alnsn int src2, sljit_w src2w)
894 1.1 alnsn {
895 1.1 alnsn /* If debug and verbose are disabled, all arguments are unused. */
896 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
897 1.1 alnsn SLJIT_UNUSED_ARG(op);
898 1.1 alnsn SLJIT_UNUSED_ARG(dst);
899 1.1 alnsn SLJIT_UNUSED_ARG(dstw);
900 1.1 alnsn SLJIT_UNUSED_ARG(src1);
901 1.1 alnsn SLJIT_UNUSED_ARG(src1w);
902 1.1 alnsn SLJIT_UNUSED_ARG(src2);
903 1.1 alnsn SLJIT_UNUSED_ARG(src2w);
904 1.1 alnsn
905 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
906 1.1 alnsn if (SLJIT_UNLIKELY(compiler->skip_checks)) {
907 1.1 alnsn compiler->skip_checks = 0;
908 1.1 alnsn return;
909 1.1 alnsn }
910 1.1 alnsn #endif
911 1.1 alnsn
912 1.1 alnsn SLJIT_ASSERT(GET_OPCODE(op) >= SLJIT_ADD && GET_OPCODE(op) <= SLJIT_ASHR);
913 1.1 alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
914 1.1 alnsn FUNCTION_CHECK_OP();
915 1.1 alnsn FUNCTION_CHECK_SRC(src1, src1w);
916 1.1 alnsn FUNCTION_CHECK_SRC(src2, src2w);
917 1.1 alnsn FUNCTION_CHECK_DST(dst, dstw);
918 1.1 alnsn #endif
919 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
920 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose)) {
921 1.1 alnsn fprintf(compiler->verbose, " %s%s%s%s%s%s%s%s ", !(op & SLJIT_INT_OP) ? "" : "i", op_names[GET_OPCODE(op)],
922 1.1 alnsn !(op & SLJIT_SET_E) ? "" : "E", !(op & SLJIT_SET_S) ? "" : "S", !(op & SLJIT_SET_U) ? "" : "U", !(op & SLJIT_SET_O) ? "" : "O", !(op & SLJIT_SET_C) ? "" : "C", !(op & SLJIT_KEEP_FLAGS) ? "" : "K");
923 1.1 alnsn sljit_verbose_param(dst, dstw);
924 1.1 alnsn fprintf(compiler->verbose, ", ");
925 1.1 alnsn sljit_verbose_param(src1, src1w);
926 1.1 alnsn fprintf(compiler->verbose, ", ");
927 1.1 alnsn sljit_verbose_param(src2, src2w);
928 1.1 alnsn fprintf(compiler->verbose, "\n");
929 1.1 alnsn }
930 1.1 alnsn #endif
931 1.1 alnsn }
932 1.1 alnsn
933 1.1 alnsn static SLJIT_INLINE void check_sljit_get_register_index(int reg)
934 1.1 alnsn {
935 1.1 alnsn SLJIT_UNUSED_ARG(reg);
936 1.1 alnsn SLJIT_ASSERT(reg > 0 && reg <= SLJIT_NO_REGISTERS);
937 1.1 alnsn }
938 1.1 alnsn
939 1.1 alnsn static SLJIT_INLINE void check_sljit_emit_op_custom(struct sljit_compiler *compiler,
940 1.1 alnsn void *instruction, int size)
941 1.1 alnsn {
942 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
943 1.1 alnsn SLJIT_UNUSED_ARG(instruction);
944 1.1 alnsn SLJIT_UNUSED_ARG(size);
945 1.1 alnsn SLJIT_ASSERT(instruction);
946 1.1 alnsn }
947 1.1 alnsn
948 1.1 alnsn static SLJIT_INLINE void check_sljit_emit_fop1(struct sljit_compiler *compiler, int op,
949 1.1 alnsn int dst, sljit_w dstw,
950 1.1 alnsn int src, sljit_w srcw)
951 1.1 alnsn {
952 1.1 alnsn /* If debug and verbose are disabled, all arguments are unused. */
953 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
954 1.1 alnsn SLJIT_UNUSED_ARG(op);
955 1.1 alnsn SLJIT_UNUSED_ARG(dst);
956 1.1 alnsn SLJIT_UNUSED_ARG(dstw);
957 1.1 alnsn SLJIT_UNUSED_ARG(src);
958 1.1 alnsn SLJIT_UNUSED_ARG(srcw);
959 1.1 alnsn
960 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
961 1.1 alnsn if (SLJIT_UNLIKELY(compiler->skip_checks)) {
962 1.1 alnsn compiler->skip_checks = 0;
963 1.1 alnsn return;
964 1.1 alnsn }
965 1.1 alnsn #endif
966 1.1 alnsn
967 1.1 alnsn SLJIT_ASSERT(sljit_is_fpu_available());
968 1.1 alnsn SLJIT_ASSERT(GET_OPCODE(op) >= SLJIT_FCMP && GET_OPCODE(op) <= SLJIT_FABS);
969 1.1 alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
970 1.1 alnsn FUNCTION_CHECK_OP();
971 1.1 alnsn FUNCTION_FCHECK(src, srcw);
972 1.1 alnsn FUNCTION_FCHECK(dst, dstw);
973 1.1 alnsn #endif
974 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
975 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose)) {
976 1.1 alnsn fprintf(compiler->verbose, " %s%s%s ", op_names[GET_OPCODE(op)],
977 1.1 alnsn !(op & SLJIT_SET_E) ? "" : "E", !(op & SLJIT_SET_S) ? "" : "S");
978 1.1 alnsn sljit_verbose_fparam(dst, dstw);
979 1.1 alnsn fprintf(compiler->verbose, ", ");
980 1.1 alnsn sljit_verbose_fparam(src, srcw);
981 1.1 alnsn fprintf(compiler->verbose, "\n");
982 1.1 alnsn }
983 1.1 alnsn #endif
984 1.1 alnsn }
985 1.1 alnsn
986 1.1 alnsn static SLJIT_INLINE void check_sljit_emit_fop2(struct sljit_compiler *compiler, int op,
987 1.1 alnsn int dst, sljit_w dstw,
988 1.1 alnsn int src1, sljit_w src1w,
989 1.1 alnsn int src2, sljit_w src2w)
990 1.1 alnsn {
991 1.1 alnsn /* If debug and verbose are disabled, all arguments are unused. */
992 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
993 1.1 alnsn SLJIT_UNUSED_ARG(op);
994 1.1 alnsn SLJIT_UNUSED_ARG(dst);
995 1.1 alnsn SLJIT_UNUSED_ARG(dstw);
996 1.1 alnsn SLJIT_UNUSED_ARG(src1);
997 1.1 alnsn SLJIT_UNUSED_ARG(src1w);
998 1.1 alnsn SLJIT_UNUSED_ARG(src2);
999 1.1 alnsn SLJIT_UNUSED_ARG(src2w);
1000 1.1 alnsn
1001 1.1 alnsn SLJIT_ASSERT(sljit_is_fpu_available());
1002 1.1 alnsn SLJIT_ASSERT(GET_OPCODE(op) >= SLJIT_FADD && GET_OPCODE(op) <= SLJIT_FDIV);
1003 1.1 alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
1004 1.1 alnsn FUNCTION_CHECK_OP();
1005 1.1 alnsn FUNCTION_FCHECK(src1, src1w);
1006 1.1 alnsn FUNCTION_FCHECK(src2, src2w);
1007 1.1 alnsn FUNCTION_FCHECK(dst, dstw);
1008 1.1 alnsn #endif
1009 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1010 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1011 1.1 alnsn fprintf(compiler->verbose, " %s ", op_names[GET_OPCODE(op)]);
1012 1.1 alnsn sljit_verbose_fparam(dst, dstw);
1013 1.1 alnsn fprintf(compiler->verbose, ", ");
1014 1.1 alnsn sljit_verbose_fparam(src1, src1w);
1015 1.1 alnsn fprintf(compiler->verbose, ", ");
1016 1.1 alnsn sljit_verbose_fparam(src2, src2w);
1017 1.1 alnsn fprintf(compiler->verbose, "\n");
1018 1.1 alnsn }
1019 1.1 alnsn #endif
1020 1.1 alnsn }
1021 1.1 alnsn
1022 1.1 alnsn static SLJIT_INLINE void check_sljit_emit_label(struct sljit_compiler *compiler)
1023 1.1 alnsn {
1024 1.1 alnsn /* If debug and verbose are disabled, all arguments are unused. */
1025 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1026 1.1 alnsn
1027 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1028 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose))
1029 1.1 alnsn fprintf(compiler->verbose, "label:\n");
1030 1.1 alnsn #endif
1031 1.1 alnsn }
1032 1.1 alnsn
1033 1.1 alnsn static SLJIT_INLINE void check_sljit_emit_jump(struct sljit_compiler *compiler, int type)
1034 1.1 alnsn {
1035 1.1 alnsn /* If debug and verbose are disabled, all arguments are unused. */
1036 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1037 1.1 alnsn SLJIT_UNUSED_ARG(type);
1038 1.1 alnsn
1039 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
1040 1.1 alnsn if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1041 1.1 alnsn compiler->skip_checks = 0;
1042 1.1 alnsn return;
1043 1.1 alnsn }
1044 1.1 alnsn #endif
1045 1.1 alnsn
1046 1.1 alnsn SLJIT_ASSERT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP)));
1047 1.1 alnsn SLJIT_ASSERT((type & 0xff) >= SLJIT_C_EQUAL && (type & 0xff) <= SLJIT_CALL3);
1048 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1049 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose))
1050 1.1 alnsn fprintf(compiler->verbose, " jump%s <%s>\n", !(type & SLJIT_REWRITABLE_JUMP) ? "" : "R", jump_names[type & 0xff]);
1051 1.1 alnsn #endif
1052 1.1 alnsn }
1053 1.1 alnsn
1054 1.1 alnsn static SLJIT_INLINE void check_sljit_emit_cmp(struct sljit_compiler *compiler, int type,
1055 1.1 alnsn int src1, sljit_w src1w,
1056 1.1 alnsn int src2, sljit_w src2w)
1057 1.1 alnsn {
1058 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1059 1.1 alnsn SLJIT_UNUSED_ARG(type);
1060 1.1 alnsn SLJIT_UNUSED_ARG(src1);
1061 1.1 alnsn SLJIT_UNUSED_ARG(src1w);
1062 1.1 alnsn SLJIT_UNUSED_ARG(src2);
1063 1.1 alnsn SLJIT_UNUSED_ARG(src2w);
1064 1.1 alnsn
1065 1.1 alnsn SLJIT_ASSERT(!(type & ~(0xff | SLJIT_INT_OP | SLJIT_REWRITABLE_JUMP)));
1066 1.1 alnsn SLJIT_ASSERT((type & 0xff) >= SLJIT_C_EQUAL && (type & 0xff) <= SLJIT_C_SIG_LESS_EQUAL);
1067 1.1 alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
1068 1.1 alnsn FUNCTION_CHECK_SRC(src1, src1w);
1069 1.1 alnsn FUNCTION_CHECK_SRC(src2, src2w);
1070 1.1 alnsn #endif
1071 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1072 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1073 1.1 alnsn fprintf(compiler->verbose, " %scmp%s <%s> ", !(type & SLJIT_INT_OP) ? "" : "i", !(type & SLJIT_REWRITABLE_JUMP) ? "" : "R", jump_names[type & 0xff]);
1074 1.1 alnsn sljit_verbose_param(src1, src1w);
1075 1.1 alnsn fprintf(compiler->verbose, ", ");
1076 1.1 alnsn sljit_verbose_param(src2, src2w);
1077 1.1 alnsn fprintf(compiler->verbose, "\n");
1078 1.1 alnsn }
1079 1.1 alnsn #endif
1080 1.1 alnsn }
1081 1.1 alnsn
1082 1.1 alnsn static SLJIT_INLINE void check_sljit_emit_fcmp(struct sljit_compiler *compiler, int type,
1083 1.1 alnsn int src1, sljit_w src1w,
1084 1.1 alnsn int src2, sljit_w src2w)
1085 1.1 alnsn {
1086 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1087 1.1 alnsn SLJIT_UNUSED_ARG(type);
1088 1.1 alnsn SLJIT_UNUSED_ARG(src1);
1089 1.1 alnsn SLJIT_UNUSED_ARG(src1w);
1090 1.1 alnsn SLJIT_UNUSED_ARG(src2);
1091 1.1 alnsn SLJIT_UNUSED_ARG(src2w);
1092 1.1 alnsn
1093 1.1 alnsn SLJIT_ASSERT(sljit_is_fpu_available());
1094 1.1 alnsn SLJIT_ASSERT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP)));
1095 1.1 alnsn SLJIT_ASSERT((type & 0xff) >= SLJIT_C_FLOAT_EQUAL && (type & 0xff) <= SLJIT_C_FLOAT_NOT_NAN);
1096 1.1 alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
1097 1.1 alnsn FUNCTION_FCHECK(src1, src1w);
1098 1.1 alnsn FUNCTION_FCHECK(src2, src2w);
1099 1.1 alnsn #endif
1100 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1101 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1102 1.1 alnsn fprintf(compiler->verbose, " fcmp%s <%s> ", !(type & SLJIT_REWRITABLE_JUMP) ? "" : "R", jump_names[type & 0xff]);
1103 1.1 alnsn sljit_verbose_fparam(src1, src1w);
1104 1.1 alnsn fprintf(compiler->verbose, ", ");
1105 1.1 alnsn sljit_verbose_fparam(src2, src2w);
1106 1.1 alnsn fprintf(compiler->verbose, "\n");
1107 1.1 alnsn }
1108 1.1 alnsn #endif
1109 1.1 alnsn }
1110 1.1 alnsn
1111 1.1 alnsn static SLJIT_INLINE void check_sljit_emit_ijump(struct sljit_compiler *compiler, int type, int src, sljit_w srcw)
1112 1.1 alnsn {
1113 1.1 alnsn /* If debug and verbose are disabled, all arguments are unused. */
1114 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1115 1.1 alnsn SLJIT_UNUSED_ARG(type);
1116 1.1 alnsn SLJIT_UNUSED_ARG(src);
1117 1.1 alnsn SLJIT_UNUSED_ARG(srcw);
1118 1.1 alnsn
1119 1.1 alnsn SLJIT_ASSERT(type >= SLJIT_JUMP && type <= SLJIT_CALL3);
1120 1.1 alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
1121 1.1 alnsn FUNCTION_CHECK_SRC(src, srcw);
1122 1.1 alnsn #endif
1123 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1124 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1125 1.1 alnsn fprintf(compiler->verbose, " ijump <%s> ", jump_names[type]);
1126 1.1 alnsn sljit_verbose_param(src, srcw);
1127 1.1 alnsn fprintf(compiler->verbose, "\n");
1128 1.1 alnsn }
1129 1.1 alnsn #endif
1130 1.1 alnsn }
1131 1.1 alnsn
1132 1.1 alnsn static SLJIT_INLINE void check_sljit_emit_cond_value(struct sljit_compiler *compiler, int op, int dst, sljit_w dstw, int type)
1133 1.1 alnsn {
1134 1.1 alnsn /* If debug and verbose are disabled, all arguments are unused. */
1135 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1136 1.1 alnsn SLJIT_UNUSED_ARG(op);
1137 1.1 alnsn SLJIT_UNUSED_ARG(dst);
1138 1.1 alnsn SLJIT_UNUSED_ARG(dstw);
1139 1.1 alnsn SLJIT_UNUSED_ARG(type);
1140 1.1 alnsn
1141 1.1 alnsn SLJIT_ASSERT(type >= SLJIT_C_EQUAL && type < SLJIT_JUMP);
1142 1.1 alnsn SLJIT_ASSERT(op == SLJIT_MOV || GET_OPCODE(op) == SLJIT_OR);
1143 1.1 alnsn SLJIT_ASSERT(GET_ALL_FLAGS(op) == 0 || GET_ALL_FLAGS(op) == SLJIT_SET_E || GET_ALL_FLAGS(op) == SLJIT_KEEP_FLAGS);
1144 1.1 alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
1145 1.1 alnsn FUNCTION_CHECK_DST(dst, dstw);
1146 1.1 alnsn #endif
1147 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1148 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1149 1.1 alnsn fprintf(compiler->verbose, " cond_set%s%s <%s> ", !(op & SLJIT_SET_E) ? "" : "E",
1150 1.1 alnsn !(op & SLJIT_KEEP_FLAGS) ? "" : "K", op_names[GET_OPCODE(op)]);
1151 1.1 alnsn sljit_verbose_param(dst, dstw);
1152 1.1 alnsn fprintf(compiler->verbose, ", <%s>\n", jump_names[type]);
1153 1.1 alnsn }
1154 1.1 alnsn #endif
1155 1.1 alnsn }
1156 1.1 alnsn
1157 1.1 alnsn static SLJIT_INLINE void check_sljit_get_local_base(struct sljit_compiler *compiler, int dst, sljit_w dstw, sljit_w offset)
1158 1.1 alnsn {
1159 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1160 1.1 alnsn SLJIT_UNUSED_ARG(dst);
1161 1.1 alnsn SLJIT_UNUSED_ARG(dstw);
1162 1.1 alnsn SLJIT_UNUSED_ARG(offset);
1163 1.1 alnsn
1164 1.1 alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
1165 1.1 alnsn FUNCTION_CHECK_DST(dst, dstw);
1166 1.1 alnsn #endif
1167 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1168 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1169 1.1 alnsn fprintf(compiler->verbose, " local_base ");
1170 1.1 alnsn sljit_verbose_param(dst, dstw);
1171 1.1 alnsn fprintf(compiler->verbose, ", #%" SLJIT_PRINT_D "d\n", offset);
1172 1.1 alnsn }
1173 1.1 alnsn #endif
1174 1.1 alnsn }
1175 1.1 alnsn
1176 1.1 alnsn static SLJIT_INLINE void check_sljit_emit_const(struct sljit_compiler *compiler, int dst, sljit_w dstw, sljit_w init_value)
1177 1.1 alnsn {
1178 1.1 alnsn /* If debug and verbose are disabled, all arguments are unused. */
1179 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1180 1.1 alnsn SLJIT_UNUSED_ARG(dst);
1181 1.1 alnsn SLJIT_UNUSED_ARG(dstw);
1182 1.1 alnsn SLJIT_UNUSED_ARG(init_value);
1183 1.1 alnsn
1184 1.1 alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
1185 1.1 alnsn FUNCTION_CHECK_DST(dst, dstw);
1186 1.1 alnsn #endif
1187 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1188 1.1 alnsn if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1189 1.1 alnsn fprintf(compiler->verbose, " const ");
1190 1.1 alnsn sljit_verbose_param(dst, dstw);
1191 1.1 alnsn fprintf(compiler->verbose, ", #%" SLJIT_PRINT_D "d\n", init_value);
1192 1.1 alnsn }
1193 1.1 alnsn #endif
1194 1.1 alnsn }
1195 1.1 alnsn
1196 1.1 alnsn static SLJIT_INLINE int emit_mov_before_return(struct sljit_compiler *compiler, int op, int src, sljit_w srcw)
1197 1.1 alnsn {
1198 1.1 alnsn /* Return if don't need to do anything. */
1199 1.1 alnsn if (op == SLJIT_UNUSED)
1200 1.1 alnsn return SLJIT_SUCCESS;
1201 1.1 alnsn
1202 1.1 alnsn #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
1203 1.1 alnsn if (src == SLJIT_RETURN_REG && op == SLJIT_MOV)
1204 1.1 alnsn return SLJIT_SUCCESS;
1205 1.1 alnsn #else
1206 1.1 alnsn if (src == SLJIT_RETURN_REG && (op == SLJIT_MOV || op == SLJIT_MOV_UI || op == SLJIT_MOV_SI))
1207 1.1 alnsn return SLJIT_SUCCESS;
1208 1.1 alnsn #endif
1209 1.1 alnsn
1210 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
1211 1.1 alnsn compiler->skip_checks = 1;
1212 1.1 alnsn #endif
1213 1.1 alnsn return sljit_emit_op1(compiler, op, SLJIT_RETURN_REG, 0, src, srcw);
1214 1.1 alnsn }
1215 1.1 alnsn
1216 1.1 alnsn /* CPU description section */
1217 1.1 alnsn
1218 1.1 alnsn #if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE)
1219 1.1 alnsn #define SLJIT_CPUINFO_PART1 " 32bit ("
1220 1.1 alnsn #elif (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
1221 1.1 alnsn #define SLJIT_CPUINFO_PART1 " 64bit ("
1222 1.1 alnsn #else
1223 1.1 alnsn #error "Internal error: CPU type info missing"
1224 1.1 alnsn #endif
1225 1.1 alnsn
1226 1.1 alnsn #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
1227 1.1 alnsn #define SLJIT_CPUINFO_PART2 "little endian + "
1228 1.1 alnsn #elif (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN)
1229 1.1 alnsn #define SLJIT_CPUINFO_PART2 "big endian + "
1230 1.1 alnsn #else
1231 1.1 alnsn #error "Internal error: CPU type info missing"
1232 1.1 alnsn #endif
1233 1.1 alnsn
1234 1.1 alnsn #if (defined SLJIT_UNALIGNED && SLJIT_UNALIGNED)
1235 1.1 alnsn #define SLJIT_CPUINFO_PART3 "unaligned)"
1236 1.1 alnsn #else
1237 1.1 alnsn #define SLJIT_CPUINFO_PART3 "aligned)"
1238 1.1 alnsn #endif
1239 1.1 alnsn
1240 1.1 alnsn #define SLJIT_CPUINFO SLJIT_CPUINFO_PART1 SLJIT_CPUINFO_PART2 SLJIT_CPUINFO_PART3
1241 1.1 alnsn
1242 1.1 alnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
1243 1.1 alnsn #include "sljitNativeX86_common.c"
1244 1.1 alnsn #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1245 1.1 alnsn #include "sljitNativeX86_common.c"
1246 1.1 alnsn #elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
1247 1.1 alnsn #include "sljitNativeARM_v5.c"
1248 1.1 alnsn #elif (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
1249 1.1 alnsn #include "sljitNativeARM_v5.c"
1250 1.1 alnsn #elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
1251 1.1 alnsn #include "sljitNativeARM_Thumb2.c"
1252 1.1 alnsn #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
1253 1.1 alnsn #include "sljitNativePPC_common.c"
1254 1.1 alnsn #elif (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1255 1.1 alnsn #include "sljitNativePPC_common.c"
1256 1.1 alnsn #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
1257 1.1 alnsn #include "sljitNativeMIPS_common.c"
1258 1.1 alnsn #endif
1259 1.1 alnsn
1260 1.1 alnsn #if !(defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
1261 1.1 alnsn
1262 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, int type,
1263 1.1 alnsn int src1, sljit_w src1w,
1264 1.1 alnsn int src2, sljit_w src2w)
1265 1.1 alnsn {
1266 1.1 alnsn /* Default compare for most architectures. */
1267 1.1 alnsn int flags, tmp_src, condition;
1268 1.1 alnsn sljit_w tmp_srcw;
1269 1.1 alnsn
1270 1.1 alnsn CHECK_ERROR_PTR();
1271 1.1 alnsn check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w);
1272 1.1 alnsn
1273 1.1 alnsn condition = type & 0xff;
1274 1.1 alnsn if (SLJIT_UNLIKELY((src1 & SLJIT_IMM) && !(src2 & SLJIT_IMM))) {
1275 1.1 alnsn /* Immediate is prefered as second argument by most architectures. */
1276 1.1 alnsn switch (condition) {
1277 1.1 alnsn case SLJIT_C_LESS:
1278 1.1 alnsn condition = SLJIT_C_GREATER;
1279 1.1 alnsn break;
1280 1.1 alnsn case SLJIT_C_GREATER_EQUAL:
1281 1.1 alnsn condition = SLJIT_C_LESS_EQUAL;
1282 1.1 alnsn break;
1283 1.1 alnsn case SLJIT_C_GREATER:
1284 1.1 alnsn condition = SLJIT_C_LESS;
1285 1.1 alnsn break;
1286 1.1 alnsn case SLJIT_C_LESS_EQUAL:
1287 1.1 alnsn condition = SLJIT_C_GREATER_EQUAL;
1288 1.1 alnsn break;
1289 1.1 alnsn case SLJIT_C_SIG_LESS:
1290 1.1 alnsn condition = SLJIT_C_SIG_GREATER;
1291 1.1 alnsn break;
1292 1.1 alnsn case SLJIT_C_SIG_GREATER_EQUAL:
1293 1.1 alnsn condition = SLJIT_C_SIG_LESS_EQUAL;
1294 1.1 alnsn break;
1295 1.1 alnsn case SLJIT_C_SIG_GREATER:
1296 1.1 alnsn condition = SLJIT_C_SIG_LESS;
1297 1.1 alnsn break;
1298 1.1 alnsn case SLJIT_C_SIG_LESS_EQUAL:
1299 1.1 alnsn condition = SLJIT_C_SIG_GREATER_EQUAL;
1300 1.1 alnsn break;
1301 1.1 alnsn }
1302 1.1 alnsn type = condition | (type & (SLJIT_INT_OP | SLJIT_REWRITABLE_JUMP));
1303 1.1 alnsn tmp_src = src1;
1304 1.1 alnsn src1 = src2;
1305 1.1 alnsn src2 = tmp_src;
1306 1.1 alnsn tmp_srcw = src1w;
1307 1.1 alnsn src1w = src2w;
1308 1.1 alnsn src2w = tmp_srcw;
1309 1.1 alnsn }
1310 1.1 alnsn
1311 1.1 alnsn if (condition <= SLJIT_C_NOT_ZERO)
1312 1.1 alnsn flags = SLJIT_SET_E;
1313 1.1 alnsn else if (condition <= SLJIT_C_LESS_EQUAL)
1314 1.1 alnsn flags = SLJIT_SET_U;
1315 1.1 alnsn else
1316 1.1 alnsn flags = SLJIT_SET_S;
1317 1.1 alnsn
1318 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
1319 1.1 alnsn compiler->skip_checks = 1;
1320 1.1 alnsn #endif
1321 1.1 alnsn PTR_FAIL_IF(sljit_emit_op2(compiler, SLJIT_SUB | flags | (type & SLJIT_INT_OP),
1322 1.1 alnsn SLJIT_UNUSED, 0, src1, src1w, src2, src2w));
1323 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
1324 1.1 alnsn compiler->skip_checks = 1;
1325 1.1 alnsn #endif
1326 1.1 alnsn return sljit_emit_jump(compiler, condition | (type & SLJIT_REWRITABLE_JUMP));
1327 1.1 alnsn }
1328 1.1 alnsn
1329 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, int type,
1330 1.1 alnsn int src1, sljit_w src1w,
1331 1.1 alnsn int src2, sljit_w src2w)
1332 1.1 alnsn {
1333 1.1 alnsn int flags, condition;
1334 1.1 alnsn
1335 1.1 alnsn check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w);
1336 1.1 alnsn
1337 1.1 alnsn condition = type & 0xff;
1338 1.1 alnsn if (condition <= SLJIT_C_FLOAT_NOT_EQUAL)
1339 1.1 alnsn flags = SLJIT_SET_E;
1340 1.1 alnsn else
1341 1.1 alnsn flags = SLJIT_SET_S;
1342 1.1 alnsn
1343 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
1344 1.1 alnsn compiler->skip_checks = 1;
1345 1.1 alnsn #endif
1346 1.1 alnsn sljit_emit_fop1(compiler, SLJIT_FCMP | flags, src1, src1w, src2, src2w);
1347 1.1 alnsn
1348 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
1349 1.1 alnsn compiler->skip_checks = 1;
1350 1.1 alnsn #endif
1351 1.1 alnsn return sljit_emit_jump(compiler, condition | (type & SLJIT_REWRITABLE_JUMP));
1352 1.1 alnsn }
1353 1.1 alnsn
1354 1.1 alnsn #endif
1355 1.1 alnsn
1356 1.1 alnsn #if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) && !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1357 1.1 alnsn
1358 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE int sljit_get_local_base(struct sljit_compiler *compiler, int dst, sljit_w dstw, sljit_w offset)
1359 1.1 alnsn {
1360 1.1 alnsn CHECK_ERROR();
1361 1.1 alnsn check_sljit_get_local_base(compiler, dst, dstw, offset);
1362 1.1 alnsn
1363 1.1 alnsn ADJUST_LOCAL_OFFSET(SLJIT_MEM1(SLJIT_LOCALS_REG), offset);
1364 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
1365 1.1 alnsn compiler->skip_checks = 1;
1366 1.1 alnsn #endif
1367 1.1 alnsn if (offset != 0)
1368 1.1 alnsn return sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_KEEP_FLAGS, dst, dstw, SLJIT_LOCALS_REG, 0, SLJIT_IMM, offset);
1369 1.1 alnsn return sljit_emit_op1(compiler, SLJIT_MOV, dst, dstw, SLJIT_LOCALS_REG, 0);
1370 1.1 alnsn }
1371 1.1 alnsn
1372 1.1 alnsn #endif
1373 1.1 alnsn
1374 1.1 alnsn #else /* SLJIT_CONFIG_UNSUPPORTED */
1375 1.1 alnsn
1376 1.1 alnsn /* Empty function bodies for those machines, which are not (yet) supported. */
1377 1.1 alnsn
1378 1.1.1.2 alnsn SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name(void)
1379 1.1 alnsn {
1380 1.1 alnsn return "unsupported";
1381 1.1 alnsn }
1382 1.1 alnsn
1383 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void)
1384 1.1 alnsn {
1385 1.1 alnsn SLJIT_ASSERT_STOP();
1386 1.1 alnsn return NULL;
1387 1.1 alnsn }
1388 1.1 alnsn
1389 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler)
1390 1.1 alnsn {
1391 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1392 1.1 alnsn SLJIT_ASSERT_STOP();
1393 1.1 alnsn }
1394 1.1 alnsn
1395 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, int size)
1396 1.1 alnsn {
1397 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1398 1.1 alnsn SLJIT_UNUSED_ARG(size);
1399 1.1 alnsn SLJIT_ASSERT_STOP();
1400 1.1 alnsn return NULL;
1401 1.1 alnsn }
1402 1.1 alnsn
1403 1.1 alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1404 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose)
1405 1.1 alnsn {
1406 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1407 1.1 alnsn SLJIT_UNUSED_ARG(verbose);
1408 1.1 alnsn SLJIT_ASSERT_STOP();
1409 1.1 alnsn }
1410 1.1 alnsn #endif
1411 1.1 alnsn
1412 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)
1413 1.1 alnsn {
1414 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1415 1.1 alnsn SLJIT_ASSERT_STOP();
1416 1.1 alnsn return NULL;
1417 1.1 alnsn }
1418 1.1 alnsn
1419 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)
1420 1.1 alnsn {
1421 1.1 alnsn SLJIT_UNUSED_ARG(code);
1422 1.1 alnsn SLJIT_ASSERT_STOP();
1423 1.1 alnsn }
1424 1.1 alnsn
1425 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_enter(struct sljit_compiler *compiler, int args, int temporaries, int saveds, int local_size)
1426 1.1 alnsn {
1427 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1428 1.1 alnsn SLJIT_UNUSED_ARG(args);
1429 1.1 alnsn SLJIT_UNUSED_ARG(temporaries);
1430 1.1 alnsn SLJIT_UNUSED_ARG(saveds);
1431 1.1 alnsn SLJIT_UNUSED_ARG(local_size);
1432 1.1 alnsn SLJIT_ASSERT_STOP();
1433 1.1 alnsn return SLJIT_ERR_UNSUPPORTED;
1434 1.1 alnsn }
1435 1.1 alnsn
1436 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler, int args, int temporaries, int saveds, int local_size)
1437 1.1 alnsn {
1438 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1439 1.1 alnsn SLJIT_UNUSED_ARG(args);
1440 1.1 alnsn SLJIT_UNUSED_ARG(temporaries);
1441 1.1 alnsn SLJIT_UNUSED_ARG(saveds);
1442 1.1 alnsn SLJIT_UNUSED_ARG(local_size);
1443 1.1 alnsn SLJIT_ASSERT_STOP();
1444 1.1 alnsn }
1445 1.1 alnsn
1446 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_return(struct sljit_compiler *compiler, int op, int src, sljit_w srcw)
1447 1.1 alnsn {
1448 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1449 1.1 alnsn SLJIT_UNUSED_ARG(op);
1450 1.1 alnsn SLJIT_UNUSED_ARG(src);
1451 1.1 alnsn SLJIT_UNUSED_ARG(srcw);
1452 1.1 alnsn SLJIT_ASSERT_STOP();
1453 1.1 alnsn return SLJIT_ERR_UNSUPPORTED;
1454 1.1 alnsn }
1455 1.1 alnsn
1456 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fast_enter(struct sljit_compiler *compiler, int dst, sljit_w dstw, int args, int temporaries, int saveds, int local_size)
1457 1.1 alnsn {
1458 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1459 1.1 alnsn SLJIT_UNUSED_ARG(dst);
1460 1.1 alnsn SLJIT_UNUSED_ARG(dstw);
1461 1.1 alnsn SLJIT_UNUSED_ARG(args);
1462 1.1 alnsn SLJIT_UNUSED_ARG(temporaries);
1463 1.1 alnsn SLJIT_UNUSED_ARG(saveds);
1464 1.1 alnsn SLJIT_UNUSED_ARG(local_size);
1465 1.1 alnsn SLJIT_ASSERT_STOP();
1466 1.1 alnsn return SLJIT_ERR_UNSUPPORTED;
1467 1.1 alnsn }
1468 1.1 alnsn
1469 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fast_return(struct sljit_compiler *compiler, int src, sljit_w srcw)
1470 1.1 alnsn {
1471 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1472 1.1 alnsn SLJIT_UNUSED_ARG(src);
1473 1.1 alnsn SLJIT_UNUSED_ARG(srcw);
1474 1.1 alnsn SLJIT_ASSERT_STOP();
1475 1.1 alnsn return SLJIT_ERR_UNSUPPORTED;
1476 1.1 alnsn }
1477 1.1 alnsn
1478 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op0(struct sljit_compiler *compiler, int op)
1479 1.1 alnsn {
1480 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1481 1.1 alnsn SLJIT_UNUSED_ARG(op);
1482 1.1 alnsn SLJIT_ASSERT_STOP();
1483 1.1 alnsn return SLJIT_ERR_UNSUPPORTED;
1484 1.1 alnsn }
1485 1.1 alnsn
1486 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op1(struct sljit_compiler *compiler, int op,
1487 1.1 alnsn int dst, sljit_w dstw,
1488 1.1 alnsn int src, sljit_w srcw)
1489 1.1 alnsn {
1490 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1491 1.1 alnsn SLJIT_UNUSED_ARG(op);
1492 1.1 alnsn SLJIT_UNUSED_ARG(dst);
1493 1.1 alnsn SLJIT_UNUSED_ARG(dstw);
1494 1.1 alnsn SLJIT_UNUSED_ARG(src);
1495 1.1 alnsn SLJIT_UNUSED_ARG(srcw);
1496 1.1 alnsn SLJIT_ASSERT_STOP();
1497 1.1 alnsn return SLJIT_ERR_UNSUPPORTED;
1498 1.1 alnsn }
1499 1.1 alnsn
1500 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op2(struct sljit_compiler *compiler, int op,
1501 1.1 alnsn int dst, sljit_w dstw,
1502 1.1 alnsn int src1, sljit_w src1w,
1503 1.1 alnsn int src2, sljit_w src2w)
1504 1.1 alnsn {
1505 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1506 1.1 alnsn SLJIT_UNUSED_ARG(op);
1507 1.1 alnsn SLJIT_UNUSED_ARG(dst);
1508 1.1 alnsn SLJIT_UNUSED_ARG(dstw);
1509 1.1 alnsn SLJIT_UNUSED_ARG(src1);
1510 1.1 alnsn SLJIT_UNUSED_ARG(src1w);
1511 1.1 alnsn SLJIT_UNUSED_ARG(src2);
1512 1.1 alnsn SLJIT_UNUSED_ARG(src2w);
1513 1.1 alnsn SLJIT_ASSERT_STOP();
1514 1.1 alnsn return SLJIT_ERR_UNSUPPORTED;
1515 1.1 alnsn }
1516 1.1 alnsn
1517 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE int sljit_get_register_index(int reg)
1518 1.1 alnsn {
1519 1.1 alnsn SLJIT_ASSERT_STOP();
1520 1.1 alnsn return reg;
1521 1.1 alnsn }
1522 1.1 alnsn
1523 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op_custom(struct sljit_compiler *compiler,
1524 1.1 alnsn void *instruction, int size)
1525 1.1 alnsn {
1526 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1527 1.1 alnsn SLJIT_UNUSED_ARG(instruction);
1528 1.1 alnsn SLJIT_UNUSED_ARG(size);
1529 1.1 alnsn SLJIT_ASSERT_STOP();
1530 1.1 alnsn return SLJIT_ERR_UNSUPPORTED;
1531 1.1 alnsn }
1532 1.1 alnsn
1533 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE int sljit_is_fpu_available(void)
1534 1.1 alnsn {
1535 1.1 alnsn SLJIT_ASSERT_STOP();
1536 1.1 alnsn return 0;
1537 1.1 alnsn }
1538 1.1 alnsn
1539 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fop1(struct sljit_compiler *compiler, int op,
1540 1.1 alnsn int dst, sljit_w dstw,
1541 1.1 alnsn int src, sljit_w srcw)
1542 1.1 alnsn {
1543 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1544 1.1 alnsn SLJIT_UNUSED_ARG(op);
1545 1.1 alnsn SLJIT_UNUSED_ARG(dst);
1546 1.1 alnsn SLJIT_UNUSED_ARG(dstw);
1547 1.1 alnsn SLJIT_UNUSED_ARG(src);
1548 1.1 alnsn SLJIT_UNUSED_ARG(srcw);
1549 1.1 alnsn SLJIT_ASSERT_STOP();
1550 1.1 alnsn return SLJIT_ERR_UNSUPPORTED;
1551 1.1 alnsn }
1552 1.1 alnsn
1553 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fop2(struct sljit_compiler *compiler, int op,
1554 1.1 alnsn int dst, sljit_w dstw,
1555 1.1 alnsn int src1, sljit_w src1w,
1556 1.1 alnsn int src2, sljit_w src2w)
1557 1.1 alnsn {
1558 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1559 1.1 alnsn SLJIT_UNUSED_ARG(op);
1560 1.1 alnsn SLJIT_UNUSED_ARG(dst);
1561 1.1 alnsn SLJIT_UNUSED_ARG(dstw);
1562 1.1 alnsn SLJIT_UNUSED_ARG(src1);
1563 1.1 alnsn SLJIT_UNUSED_ARG(src1w);
1564 1.1 alnsn SLJIT_UNUSED_ARG(src2);
1565 1.1 alnsn SLJIT_UNUSED_ARG(src2w);
1566 1.1 alnsn SLJIT_ASSERT_STOP();
1567 1.1 alnsn return SLJIT_ERR_UNSUPPORTED;
1568 1.1 alnsn }
1569 1.1 alnsn
1570 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)
1571 1.1 alnsn {
1572 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1573 1.1 alnsn SLJIT_ASSERT_STOP();
1574 1.1 alnsn return NULL;
1575 1.1 alnsn }
1576 1.1 alnsn
1577 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, int type)
1578 1.1 alnsn {
1579 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1580 1.1 alnsn SLJIT_UNUSED_ARG(type);
1581 1.1 alnsn SLJIT_ASSERT_STOP();
1582 1.1 alnsn return NULL;
1583 1.1 alnsn }
1584 1.1 alnsn
1585 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, int type,
1586 1.1 alnsn int src1, sljit_w src1w,
1587 1.1 alnsn int src2, sljit_w src2w)
1588 1.1 alnsn {
1589 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1590 1.1 alnsn SLJIT_UNUSED_ARG(type);
1591 1.1 alnsn SLJIT_UNUSED_ARG(src1);
1592 1.1 alnsn SLJIT_UNUSED_ARG(src1w);
1593 1.1 alnsn SLJIT_UNUSED_ARG(src2);
1594 1.1 alnsn SLJIT_UNUSED_ARG(src2w);
1595 1.1 alnsn SLJIT_ASSERT_STOP();
1596 1.1 alnsn return NULL;
1597 1.1 alnsn }
1598 1.1 alnsn
1599 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, int type,
1600 1.1 alnsn int src1, sljit_w src1w,
1601 1.1 alnsn int src2, sljit_w src2w)
1602 1.1 alnsn {
1603 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1604 1.1 alnsn SLJIT_UNUSED_ARG(type);
1605 1.1 alnsn SLJIT_UNUSED_ARG(src1);
1606 1.1 alnsn SLJIT_UNUSED_ARG(src1w);
1607 1.1 alnsn SLJIT_UNUSED_ARG(src2);
1608 1.1 alnsn SLJIT_UNUSED_ARG(src2w);
1609 1.1 alnsn SLJIT_ASSERT_STOP();
1610 1.1 alnsn return NULL;
1611 1.1 alnsn }
1612 1.1 alnsn
1613 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label)
1614 1.1 alnsn {
1615 1.1 alnsn SLJIT_UNUSED_ARG(jump);
1616 1.1 alnsn SLJIT_UNUSED_ARG(label);
1617 1.1 alnsn SLJIT_ASSERT_STOP();
1618 1.1 alnsn }
1619 1.1 alnsn
1620 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target)
1621 1.1 alnsn {
1622 1.1 alnsn SLJIT_UNUSED_ARG(jump);
1623 1.1 alnsn SLJIT_UNUSED_ARG(target);
1624 1.1 alnsn SLJIT_ASSERT_STOP();
1625 1.1 alnsn }
1626 1.1 alnsn
1627 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_ijump(struct sljit_compiler *compiler, int type, int src, sljit_w srcw)
1628 1.1 alnsn {
1629 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1630 1.1 alnsn SLJIT_UNUSED_ARG(type);
1631 1.1 alnsn SLJIT_UNUSED_ARG(src);
1632 1.1 alnsn SLJIT_UNUSED_ARG(srcw);
1633 1.1 alnsn SLJIT_ASSERT_STOP();
1634 1.1 alnsn return SLJIT_ERR_UNSUPPORTED;
1635 1.1 alnsn }
1636 1.1 alnsn
1637 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_cond_value(struct sljit_compiler *compiler, int op, int dst, sljit_w dstw, int type)
1638 1.1 alnsn {
1639 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1640 1.1 alnsn SLJIT_UNUSED_ARG(op);
1641 1.1 alnsn SLJIT_UNUSED_ARG(dst);
1642 1.1 alnsn SLJIT_UNUSED_ARG(dstw);
1643 1.1 alnsn SLJIT_UNUSED_ARG(type);
1644 1.1 alnsn SLJIT_ASSERT_STOP();
1645 1.1 alnsn return SLJIT_ERR_UNSUPPORTED;
1646 1.1 alnsn }
1647 1.1 alnsn
1648 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE int sljit_get_local_base(struct sljit_compiler *compiler, int dst, sljit_w dstw, sljit_w offset)
1649 1.1 alnsn {
1650 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1651 1.1 alnsn SLJIT_UNUSED_ARG(dst);
1652 1.1 alnsn SLJIT_UNUSED_ARG(dstw);
1653 1.1 alnsn SLJIT_UNUSED_ARG(offset);
1654 1.1 alnsn SLJIT_ASSERT_STOP();
1655 1.1 alnsn return SLJIT_ERR_UNSUPPORTED;
1656 1.1 alnsn }
1657 1.1 alnsn
1658 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, int dst, sljit_w dstw, sljit_w initval)
1659 1.1 alnsn {
1660 1.1 alnsn SLJIT_UNUSED_ARG(compiler);
1661 1.1 alnsn SLJIT_UNUSED_ARG(dst);
1662 1.1 alnsn SLJIT_UNUSED_ARG(dstw);
1663 1.1 alnsn SLJIT_UNUSED_ARG(initval);
1664 1.1 alnsn SLJIT_ASSERT_STOP();
1665 1.1 alnsn return NULL;
1666 1.1 alnsn }
1667 1.1 alnsn
1668 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_addr)
1669 1.1 alnsn {
1670 1.1 alnsn SLJIT_UNUSED_ARG(addr);
1671 1.1 alnsn SLJIT_UNUSED_ARG(new_addr);
1672 1.1 alnsn SLJIT_ASSERT_STOP();
1673 1.1 alnsn }
1674 1.1 alnsn
1675 1.1 alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_w new_constant)
1676 1.1 alnsn {
1677 1.1 alnsn SLJIT_UNUSED_ARG(addr);
1678 1.1 alnsn SLJIT_UNUSED_ARG(new_constant);
1679 1.1 alnsn SLJIT_ASSERT_STOP();
1680 1.1 alnsn }
1681 1.1 alnsn
1682 1.1 alnsn #endif
1683