1 /*
2  *    Stack-less Just-In-Time compiler
3  *
4  *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without modification, are
7  * permitted provided that the following conditions are met:
8  *
9  *   1. Redistributions of source code must retain the above copyright notice, this list of
10  *      conditions and the following disclaimer.
11  *
12  *   2. Redistributions in binary form must reproduce the above copyright notice, this list
13  *      of conditions and the following disclaimer in the documentation and/or other materials
14  *      provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
19  * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
22  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
24  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 
27 #include "sljitLir.h"
28 
29 #ifdef _WIN32
30 
31 #include <windows.h>
32 
33 #endif /* _WIN32 */
34 
35 #if !(defined SLJIT_STD_MACROS_DEFINED && SLJIT_STD_MACROS_DEFINED)
36 
37 /* These libraries are needed for the macros below. */
38 #include <stdlib.h>
39 #include <string.h>
40 
41 #endif /* SLJIT_STD_MACROS_DEFINED */
42 
43 #define CHECK_ERROR() \
44 	do { \
45 		if (SLJIT_UNLIKELY(compiler->error)) \
46 			return compiler->error; \
47 	} while (0)
48 
49 #define CHECK_ERROR_PTR() \
50 	do { \
51 		if (SLJIT_UNLIKELY(compiler->error)) \
52 			return NULL; \
53 	} while (0)
54 
55 #define FAIL_IF(expr) \
56 	do { \
57 		if (SLJIT_UNLIKELY(expr)) \
58 			return compiler->error; \
59 	} while (0)
60 
61 #define PTR_FAIL_IF(expr) \
62 	do { \
63 		if (SLJIT_UNLIKELY(expr)) \
64 			return NULL; \
65 	} while (0)
66 
67 #define FAIL_IF_NULL(ptr) \
68 	do { \
69 		if (SLJIT_UNLIKELY(!(ptr))) { \
70 			compiler->error = SLJIT_ERR_ALLOC_FAILED; \
71 			return SLJIT_ERR_ALLOC_FAILED; \
72 		} \
73 	} while (0)
74 
75 #define PTR_FAIL_IF_NULL(ptr) \
76 	do { \
77 		if (SLJIT_UNLIKELY(!(ptr))) { \
78 			compiler->error = SLJIT_ERR_ALLOC_FAILED; \
79 			return NULL; \
80 		} \
81 	} while (0)
82 
83 #define PTR_FAIL_WITH_EXEC_IF(ptr) \
84 	do { \
85 		if (SLJIT_UNLIKELY(!(ptr))) { \
86 			compiler->error = SLJIT_ERR_EX_ALLOC_FAILED; \
87 			return NULL; \
88 		} \
89 	} while (0)
90 
91 #if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
92 
93 #define VARIABLE_FLAG_SHIFT (10)
94 #define VARIABLE_FLAG_MASK (0x3f << VARIABLE_FLAG_SHIFT)
95 #define GET_FLAG_TYPE(op) ((op) >> VARIABLE_FLAG_SHIFT)
96 
97 #define GET_OPCODE(op) \
98 	((op) & ~(SLJIT_I32_OP | SLJIT_SET_Z | VARIABLE_FLAG_MASK))
99 
100 #define HAS_FLAGS(op) \
101 	((op) & (SLJIT_SET_Z | VARIABLE_FLAG_MASK))
102 
103 #define GET_ALL_FLAGS(op) \
104 	((op) & (SLJIT_I32_OP | SLJIT_SET_Z | VARIABLE_FLAG_MASK))
105 
106 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
107 #define TYPE_CAST_NEEDED(op) \
108 	((op) >= SLJIT_MOV_U8 && (op) <= SLJIT_MOV_S32)
109 #else
110 #define TYPE_CAST_NEEDED(op) \
111 	((op) >= SLJIT_MOV_U8 && (op) <= SLJIT_MOV_S16)
112 #endif
113 
114 #define BUF_SIZE	4096
115 
116 #if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE)
117 #define ABUF_SIZE	2048
118 #else
119 #define ABUF_SIZE	4096
120 #endif
121 
122 /* Parameter parsing. */
123 #define REG_MASK		0x3f
124 #define OFFS_REG(reg)		(((reg) >> 8) & REG_MASK)
125 #define OFFS_REG_MASK		(REG_MASK << 8)
126 #define TO_OFFS_REG(reg)	((reg) << 8)
127 /* When reg cannot be unused. */
128 #define FAST_IS_REG(reg)	((reg) <= REG_MASK)
129 /* When reg can be unused. */
130 #define SLOW_IS_REG(reg)	((reg) > 0 && (reg) <= REG_MASK)
131 
132 /* Mask for argument types. */
133 #define SLJIT_DEF_MASK ((1 << SLJIT_DEF_SHIFT) - 1)
134 
135 /* Jump flags. */
136 #define JUMP_LABEL	0x1
137 #define JUMP_ADDR	0x2
138 /* SLJIT_REWRITABLE_JUMP is 0x1000. */
139 
140 #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
141 #	define PATCH_MB		0x4
142 #	define PATCH_MW		0x8
143 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
144 #	define PATCH_MD		0x10
145 #endif
146 #	define TYPE_SHIFT	13
147 #endif
148 
149 #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
150 #	define IS_BL		0x4
151 #	define PATCH_B		0x8
152 #endif
153 
154 #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
155 #	define CPOOL_SIZE	512
156 #endif
157 
158 #if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
159 #	define IS_COND		0x04
160 #	define IS_BL		0x08
161 	/* conditional + imm8 */
162 #	define PATCH_TYPE1	0x10
163 	/* conditional + imm20 */
164 #	define PATCH_TYPE2	0x20
165 	/* IT + imm24 */
166 #	define PATCH_TYPE3	0x30
167 	/* imm11 */
168 #	define PATCH_TYPE4	0x40
169 	/* imm24 */
170 #	define PATCH_TYPE5	0x50
171 	/* BL + imm24 */
172 #	define PATCH_BL		0x60
173 	/* 0xf00 cc code for branches */
174 #endif
175 
176 #if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
177 #	define IS_COND		0x004
178 #	define IS_CBZ		0x008
179 #	define IS_BL		0x010
180 #	define PATCH_B		0x020
181 #	define PATCH_COND	0x040
182 #	define PATCH_ABS48	0x080
183 #	define PATCH_ABS64	0x100
184 #endif
185 
186 #if (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
187 #	define IS_COND		0x004
188 #	define IS_CALL		0x008
189 #	define PATCH_B		0x010
190 #	define PATCH_ABS_B	0x020
191 #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
192 #	define PATCH_ABS32	0x040
193 #	define PATCH_ABS48	0x080
194 #endif
195 #	define REMOVE_COND	0x100
196 #endif
197 
198 #if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
199 #	define IS_MOVABLE	0x004
200 #	define IS_JAL		0x008
201 #	define IS_CALL		0x010
202 #	define IS_BIT26_COND	0x020
203 #	define IS_BIT16_COND	0x040
204 #	define IS_BIT23_COND	0x080
205 
206 #	define IS_COND		(IS_BIT26_COND | IS_BIT16_COND | IS_BIT23_COND)
207 
208 #	define PATCH_B		0x100
209 #	define PATCH_J		0x200
210 
211 #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
212 #	define PATCH_ABS32	0x400
213 #	define PATCH_ABS48	0x800
214 #endif
215 
216 	/* instruction types */
217 #	define MOVABLE_INS	0
218 	/* 1 - 31 last destination register */
219 	/* no destination (i.e: store) */
220 #	define UNMOVABLE_INS	32
221 	/* FPU status register */
222 #	define FCSR_FCC		33
223 #endif
224 
225 #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
226 #	define IS_MOVABLE	0x04
227 #	define IS_COND		0x08
228 #	define IS_CALL		0x10
229 
230 #	define PATCH_B		0x20
231 #	define PATCH_CALL	0x40
232 
233 	/* instruction types */
234 #	define MOVABLE_INS	0
235 	/* 1 - 31 last destination register */
236 	/* no destination (i.e: store) */
237 #	define UNMOVABLE_INS	32
238 
239 #	define DST_INS_MASK	0xff
240 
241 	/* ICC_SET is the same as SET_FLAGS. */
242 #	define ICC_IS_SET	(1 << 23)
243 #	define FCC_IS_SET	(1 << 24)
244 #endif
245 
246 /* Stack management. */
247 
248 #define GET_SAVED_REGISTERS_SIZE(scratches, saveds, extra) \
249 	(((scratches < SLJIT_NUMBER_OF_SCRATCH_REGISTERS ? 0 : (scratches - SLJIT_NUMBER_OF_SCRATCH_REGISTERS)) + \
250 		(saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? saveds : SLJIT_NUMBER_OF_SAVED_REGISTERS) + \
251 		extra) * sizeof(sljit_sw))
252 
253 #define ADJUST_LOCAL_OFFSET(p, i) \
254 	if ((p) == (SLJIT_MEM1(SLJIT_SP))) \
255 		(i) += SLJIT_LOCALS_OFFSET;
256 
257 #endif /* !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) */
258 
259 /* Utils can still be used even if SLJIT_CONFIG_UNSUPPORTED is set. */
260 #include "sljitUtils.c"
261 
262 #if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
263 
264 #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
265 
266 #if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)
267 #include "sljitProtExecAllocator.c"
268 #elif (defined SLJIT_WX_EXECUTABLE_ALLOCATOR && SLJIT_WX_EXECUTABLE_ALLOCATOR)
269 #include "sljitWXExecAllocator.c"
270 #else
271 #include "sljitExecAllocator.c"
272 #endif
273 
274 #endif
275 
276 #if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)
277 #define SLJIT_ADD_EXEC_OFFSET(ptr, exec_offset) ((sljit_u8 *)(ptr) + (exec_offset))
278 #else
279 #define SLJIT_ADD_EXEC_OFFSET(ptr, exec_offset) ((sljit_u8 *)(ptr))
280 #endif
281 
282 #ifndef SLJIT_UPDATE_WX_FLAGS
283 #define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec)
284 #endif
285 
286 /* Argument checking features. */
287 
288 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
289 
290 /* Returns with error when an invalid argument is passed. */
291 
292 #define CHECK_ARGUMENT(x) \
293 	do { \
294 		if (SLJIT_UNLIKELY(!(x))) \
295 			return 1; \
296 	} while (0)
297 
298 #define CHECK_RETURN_TYPE sljit_s32
299 #define CHECK_RETURN_OK return 0
300 
301 #define CHECK(x) \
302 	do { \
303 		if (SLJIT_UNLIKELY(x)) { \
304 			compiler->error = SLJIT_ERR_BAD_ARGUMENT; \
305 			return SLJIT_ERR_BAD_ARGUMENT; \
306 		} \
307 	} while (0)
308 
309 #define CHECK_PTR(x) \
310 	do { \
311 		if (SLJIT_UNLIKELY(x)) { \
312 			compiler->error = SLJIT_ERR_BAD_ARGUMENT; \
313 			return NULL; \
314 		} \
315 	} while (0)
316 
317 #define CHECK_REG_INDEX(x) \
318 	do { \
319 		if (SLJIT_UNLIKELY(x)) { \
320 			return -2; \
321 		} \
322 	} while (0)
323 
324 #elif (defined SLJIT_DEBUG && SLJIT_DEBUG)
325 
326 /* Assertion failure occures if an invalid argument is passed. */
327 #undef SLJIT_ARGUMENT_CHECKS
328 #define SLJIT_ARGUMENT_CHECKS 1
329 
330 #define CHECK_ARGUMENT(x) SLJIT_ASSERT(x)
331 #define CHECK_RETURN_TYPE void
332 #define CHECK_RETURN_OK return
333 #define CHECK(x) x
334 #define CHECK_PTR(x) x
335 #define CHECK_REG_INDEX(x) x
336 
337 #elif (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
338 
339 /* Arguments are not checked. */
340 #define CHECK_RETURN_TYPE void
341 #define CHECK_RETURN_OK return
342 #define CHECK(x) x
343 #define CHECK_PTR(x) x
344 #define CHECK_REG_INDEX(x) x
345 
346 #else
347 
348 /* Arguments are not checked. */
349 #define CHECK(x)
350 #define CHECK_PTR(x)
351 #define CHECK_REG_INDEX(x)
352 
353 #endif /* SLJIT_ARGUMENT_CHECKS */
354 
355 /* --------------------------------------------------------------------- */
356 /*  Public functions                                                     */
357 /* --------------------------------------------------------------------- */
358 
359 #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
360 #define SLJIT_NEEDS_COMPILER_INIT 1
361 static sljit_s32 compiler_initialized = 0;
362 /* A thread safe initialization. */
363 static void init_compiler(void);
364 #endif
365 
sljit_create_compiler(void * allocator_data,void * exec_allocator_data)366 SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void *allocator_data, void *exec_allocator_data)
367 {
368 	struct sljit_compiler *compiler = (struct sljit_compiler*)SLJIT_MALLOC(sizeof(struct sljit_compiler), allocator_data);
369 	if (!compiler)
370 		return NULL;
371 	SLJIT_ZEROMEM(compiler, sizeof(struct sljit_compiler));
372 
373 	SLJIT_COMPILE_ASSERT(
374 		sizeof(sljit_s8) == 1 && sizeof(sljit_u8) == 1
375 		&& sizeof(sljit_s16) == 2 && sizeof(sljit_u16) == 2
376 		&& sizeof(sljit_s32) == 4 && sizeof(sljit_u32) == 4
377 		&& (sizeof(sljit_p) == 4 || sizeof(sljit_p) == 8)
378 		&& sizeof(sljit_p) <= sizeof(sljit_sw)
379 		&& (sizeof(sljit_sw) == 4 || sizeof(sljit_sw) == 8)
380 		&& (sizeof(sljit_uw) == 4 || sizeof(sljit_uw) == 8),
381 		invalid_integer_types);
382 	SLJIT_COMPILE_ASSERT(SLJIT_I32_OP == SLJIT_F32_OP,
383 		int_op_and_single_op_must_be_the_same);
384 	SLJIT_COMPILE_ASSERT(SLJIT_REWRITABLE_JUMP != SLJIT_F32_OP,
385 		rewritable_jump_and_single_op_must_not_be_the_same);
386 	SLJIT_COMPILE_ASSERT(!(SLJIT_EQUAL & 0x1) && !(SLJIT_LESS & 0x1) && !(SLJIT_EQUAL_F64 & 0x1) && !(SLJIT_JUMP & 0x1),
387 		conditional_flags_must_be_even_numbers);
388 
389 	/* Only the non-zero members must be set. */
390 	compiler->error = SLJIT_SUCCESS;
391 
392 	compiler->allocator_data = allocator_data;
393 	compiler->exec_allocator_data = exec_allocator_data;
394 	compiler->buf = (struct sljit_memory_fragment*)SLJIT_MALLOC(BUF_SIZE, allocator_data);
395 	compiler->abuf = (struct sljit_memory_fragment*)SLJIT_MALLOC(ABUF_SIZE, allocator_data);
396 
397 	if (!compiler->buf || !compiler->abuf) {
398 		if (compiler->buf)
399 			SLJIT_FREE(compiler->buf, allocator_data);
400 		if (compiler->abuf)
401 			SLJIT_FREE(compiler->abuf, allocator_data);
402 		SLJIT_FREE(compiler, allocator_data);
403 		return NULL;
404 	}
405 
406 	compiler->buf->next = NULL;
407 	compiler->buf->used_size = 0;
408 	compiler->abuf->next = NULL;
409 	compiler->abuf->used_size = 0;
410 
411 	compiler->scratches = -1;
412 	compiler->saveds = -1;
413 	compiler->fscratches = -1;
414 	compiler->fsaveds = -1;
415 	compiler->local_size = -1;
416 
417 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
418 	compiler->args = -1;
419 #endif
420 
421 #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
422 	compiler->cpool = (sljit_uw*)SLJIT_MALLOC(CPOOL_SIZE * sizeof(sljit_uw)
423 		+ CPOOL_SIZE * sizeof(sljit_u8), allocator_data);
424 	if (!compiler->cpool) {
425 		SLJIT_FREE(compiler->buf, allocator_data);
426 		SLJIT_FREE(compiler->abuf, allocator_data);
427 		SLJIT_FREE(compiler, allocator_data);
428 		return NULL;
429 	}
430 	compiler->cpool_unique = (sljit_u8*)(compiler->cpool + CPOOL_SIZE);
431 	compiler->cpool_diff = 0xffffffff;
432 #endif
433 
434 #if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
435 	compiler->delay_slot = UNMOVABLE_INS;
436 #endif
437 
438 #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
439 	compiler->delay_slot = UNMOVABLE_INS;
440 #endif
441 
442 #if (defined SLJIT_NEEDS_COMPILER_INIT && SLJIT_NEEDS_COMPILER_INIT)
443 	if (!compiler_initialized) {
444 		init_compiler();
445 		compiler_initialized = 1;
446 	}
447 #endif
448 
449 	return compiler;
450 }
451 
sljit_free_compiler(struct sljit_compiler * compiler)452 SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler)
453 {
454 	struct sljit_memory_fragment *buf;
455 	struct sljit_memory_fragment *curr;
456 	void *allocator_data = compiler->allocator_data;
457 	SLJIT_UNUSED_ARG(allocator_data);
458 
459 	buf = compiler->buf;
460 	while (buf) {
461 		curr = buf;
462 		buf = buf->next;
463 		SLJIT_FREE(curr, allocator_data);
464 	}
465 
466 	buf = compiler->abuf;
467 	while (buf) {
468 		curr = buf;
469 		buf = buf->next;
470 		SLJIT_FREE(curr, allocator_data);
471 	}
472 
473 #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
474 	SLJIT_FREE(compiler->cpool, allocator_data);
475 #endif
476 	SLJIT_FREE(compiler, allocator_data);
477 }
478 
sljit_set_compiler_memory_error(struct sljit_compiler * compiler)479 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_compiler_memory_error(struct sljit_compiler *compiler)
480 {
481 	if (compiler->error == SLJIT_SUCCESS)
482 		compiler->error = SLJIT_ERR_ALLOC_FAILED;
483 }
484 
485 #if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
sljit_free_code(void * code,void * exec_allocator_data)486 SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code, void *exec_allocator_data)
487 {
488 	SLJIT_UNUSED_ARG(exec_allocator_data);
489 
490 	/* Remove thumb mode flag. */
491 	SLJIT_FREE_EXEC((void*)((sljit_uw)code & ~0x1), exec_allocator_data);
492 }
493 #elif (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
sljit_free_code(void * code,void * exec_allocator_data)494 SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code, void *exec_allocator_data)
495 {
496 	SLJIT_UNUSED_ARG(exec_allocator_data);
497 
498 	/* Resolve indirection. */
499 	code = (void*)(*(sljit_uw*)code);
500 	SLJIT_FREE_EXEC(code, exec_allocator_data);
501 }
502 #else
sljit_free_code(void * code,void * exec_allocator_data)503 SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code, void *exec_allocator_data)
504 {
505 	SLJIT_UNUSED_ARG(exec_allocator_data);
506 
507 	SLJIT_FREE_EXEC(code, exec_allocator_data);
508 }
509 #endif
510 
sljit_set_label(struct sljit_jump * jump,struct sljit_label * label)511 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label)
512 {
513 	if (SLJIT_LIKELY(!!jump) && SLJIT_LIKELY(!!label)) {
514 		jump->flags &= ~JUMP_ADDR;
515 		jump->flags |= JUMP_LABEL;
516 		jump->u.label = label;
517 	}
518 }
519 
sljit_set_target(struct sljit_jump * jump,sljit_uw target)520 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target)
521 {
522 	if (SLJIT_LIKELY(!!jump)) {
523 		jump->flags &= ~JUMP_LABEL;
524 		jump->flags |= JUMP_ADDR;
525 		jump->u.target = target;
526 	}
527 }
528 
sljit_set_put_label(struct sljit_put_label * put_label,struct sljit_label * label)529 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_put_label(struct sljit_put_label *put_label, struct sljit_label *label)
530 {
531 	if (SLJIT_LIKELY(!!put_label))
532 		put_label->label = label;
533 }
534 
sljit_set_current_flags(struct sljit_compiler * compiler,sljit_s32 current_flags)535 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags)
536 {
537 	SLJIT_UNUSED_ARG(compiler);
538 	SLJIT_UNUSED_ARG(current_flags);
539 
540 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
541 	if ((current_flags & ~(VARIABLE_FLAG_MASK | SLJIT_I32_OP | SLJIT_SET_Z)) == 0) {
542 		compiler->last_flags = GET_FLAG_TYPE(current_flags) | (current_flags & (SLJIT_I32_OP | SLJIT_SET_Z));
543 	}
544 #endif
545 }
546 
547 /* --------------------------------------------------------------------- */
548 /*  Private functions                                                    */
549 /* --------------------------------------------------------------------- */
550 
ensure_buf(struct sljit_compiler * compiler,sljit_uw size)551 static void* ensure_buf(struct sljit_compiler *compiler, sljit_uw size)
552 {
553 	sljit_u8 *ret;
554 	struct sljit_memory_fragment *new_frag;
555 
556 	SLJIT_ASSERT(size <= 256);
557 	if (compiler->buf->used_size + size <= (BUF_SIZE - (sljit_uw)SLJIT_OFFSETOF(struct sljit_memory_fragment, memory))) {
558 		ret = compiler->buf->memory + compiler->buf->used_size;
559 		compiler->buf->used_size += size;
560 		return ret;
561 	}
562 	new_frag = (struct sljit_memory_fragment*)SLJIT_MALLOC(BUF_SIZE, compiler->allocator_data);
563 	PTR_FAIL_IF_NULL(new_frag);
564 	new_frag->next = compiler->buf;
565 	compiler->buf = new_frag;
566 	new_frag->used_size = size;
567 	return new_frag->memory;
568 }
569 
ensure_abuf(struct sljit_compiler * compiler,sljit_uw size)570 static void* ensure_abuf(struct sljit_compiler *compiler, sljit_uw size)
571 {
572 	sljit_u8 *ret;
573 	struct sljit_memory_fragment *new_frag;
574 
575 	SLJIT_ASSERT(size <= 256);
576 	if (compiler->abuf->used_size + size <= (ABUF_SIZE - (sljit_uw)SLJIT_OFFSETOF(struct sljit_memory_fragment, memory))) {
577 		ret = compiler->abuf->memory + compiler->abuf->used_size;
578 		compiler->abuf->used_size += size;
579 		return ret;
580 	}
581 	new_frag = (struct sljit_memory_fragment*)SLJIT_MALLOC(ABUF_SIZE, compiler->allocator_data);
582 	PTR_FAIL_IF_NULL(new_frag);
583 	new_frag->next = compiler->abuf;
584 	compiler->abuf = new_frag;
585 	new_frag->used_size = size;
586 	return new_frag->memory;
587 }
588 
sljit_alloc_memory(struct sljit_compiler * compiler,sljit_s32 size)589 SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, sljit_s32 size)
590 {
591 	CHECK_ERROR_PTR();
592 
593 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
594 	if (size <= 0 || size > 128)
595 		return NULL;
596 	size = (size + 7) & ~7;
597 #else
598 	if (size <= 0 || size > 64)
599 		return NULL;
600 	size = (size + 3) & ~3;
601 #endif
602 	return ensure_abuf(compiler, size);
603 }
604 
reverse_buf(struct sljit_compiler * compiler)605 static SLJIT_INLINE void reverse_buf(struct sljit_compiler *compiler)
606 {
607 	struct sljit_memory_fragment *buf = compiler->buf;
608 	struct sljit_memory_fragment *prev = NULL;
609 	struct sljit_memory_fragment *tmp;
610 
611 	do {
612 		tmp = buf->next;
613 		buf->next = prev;
614 		prev = buf;
615 		buf = tmp;
616 	} while (buf != NULL);
617 
618 	compiler->buf = prev;
619 }
620 
get_arg_count(sljit_s32 arg_types)621 static SLJIT_INLINE sljit_s32 get_arg_count(sljit_s32 arg_types)
622 {
623 	sljit_s32 arg_count = 0;
624 
625 	arg_types >>= SLJIT_DEF_SHIFT;
626 	while (arg_types) {
627 		arg_count++;
628 		arg_types >>= SLJIT_DEF_SHIFT;
629 	}
630 
631 	return arg_count;
632 }
633 
634 
635 /* Only used in RISC architectures where the instruction size is constant */
636 #if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
637 	&& !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)
638 
compute_next_addr(struct sljit_label * label,struct sljit_jump * jump,struct sljit_const * const_,struct sljit_put_label * put_label)639 static SLJIT_INLINE sljit_uw compute_next_addr(struct sljit_label *label, struct sljit_jump *jump,
640 	struct sljit_const *const_, struct sljit_put_label *put_label)
641 {
642 	sljit_uw result = ~(sljit_uw)0;
643 
644 	if (label)
645 		result = label->size;
646 
647 	if (jump && jump->addr < result)
648 		result = jump->addr;
649 
650 	if (const_ && const_->addr < result)
651 		result = const_->addr;
652 
653 	if (put_label && put_label->addr < result)
654 		result = put_label->addr;
655 
656 	return result;
657 }
658 
659 #endif /* !SLJIT_CONFIG_X86 && !SLJIT_CONFIG_S390X */
660 
set_emit_enter(struct sljit_compiler * compiler,sljit_s32 options,sljit_s32 args,sljit_s32 scratches,sljit_s32 saveds,sljit_s32 fscratches,sljit_s32 fsaveds,sljit_s32 local_size)661 static SLJIT_INLINE void set_emit_enter(struct sljit_compiler *compiler,
662 	sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
663 	sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
664 {
665 	SLJIT_UNUSED_ARG(args);
666 	SLJIT_UNUSED_ARG(local_size);
667 
668 	compiler->options = options;
669 	compiler->scratches = scratches;
670 	compiler->saveds = saveds;
671 	compiler->fscratches = fscratches;
672 	compiler->fsaveds = fsaveds;
673 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
674 	compiler->logical_local_size = local_size;
675 #endif
676 }
677 
set_set_context(struct sljit_compiler * compiler,sljit_s32 options,sljit_s32 args,sljit_s32 scratches,sljit_s32 saveds,sljit_s32 fscratches,sljit_s32 fsaveds,sljit_s32 local_size)678 static SLJIT_INLINE void set_set_context(struct sljit_compiler *compiler,
679 	sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
680 	sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
681 {
682 	SLJIT_UNUSED_ARG(args);
683 	SLJIT_UNUSED_ARG(local_size);
684 
685 	compiler->options = options;
686 	compiler->scratches = scratches;
687 	compiler->saveds = saveds;
688 	compiler->fscratches = fscratches;
689 	compiler->fsaveds = fsaveds;
690 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
691 	compiler->logical_local_size = local_size;
692 #endif
693 }
694 
set_label(struct sljit_label * label,struct sljit_compiler * compiler)695 static SLJIT_INLINE void set_label(struct sljit_label *label, struct sljit_compiler *compiler)
696 {
697 	label->next = NULL;
698 	label->size = compiler->size;
699 	if (compiler->last_label)
700 		compiler->last_label->next = label;
701 	else
702 		compiler->labels = label;
703 	compiler->last_label = label;
704 }
705 
set_jump(struct sljit_jump * jump,struct sljit_compiler * compiler,sljit_s32 flags)706 static SLJIT_INLINE void set_jump(struct sljit_jump *jump, struct sljit_compiler *compiler, sljit_s32 flags)
707 {
708 	jump->next = NULL;
709 	jump->flags = flags;
710 	if (compiler->last_jump)
711 		compiler->last_jump->next = jump;
712 	else
713 		compiler->jumps = jump;
714 	compiler->last_jump = jump;
715 }
716 
set_const(struct sljit_const * const_,struct sljit_compiler * compiler)717 static SLJIT_INLINE void set_const(struct sljit_const *const_, struct sljit_compiler *compiler)
718 {
719 	const_->next = NULL;
720 	const_->addr = compiler->size;
721 	if (compiler->last_const)
722 		compiler->last_const->next = const_;
723 	else
724 		compiler->consts = const_;
725 	compiler->last_const = const_;
726 }
727 
set_put_label(struct sljit_put_label * put_label,struct sljit_compiler * compiler,sljit_uw offset)728 static SLJIT_INLINE void set_put_label(struct sljit_put_label *put_label, struct sljit_compiler *compiler, sljit_uw offset)
729 {
730 	put_label->next = NULL;
731 	put_label->label = NULL;
732 	put_label->addr = compiler->size - offset;
733 	put_label->flags = 0;
734 	if (compiler->last_put_label)
735 		compiler->last_put_label->next = put_label;
736 	else
737 		compiler->put_labels = put_label;
738 	compiler->last_put_label = put_label;
739 }
740 
741 #define ADDRESSING_DEPENDS_ON(exp, reg) \
742 	(((exp) & SLJIT_MEM) && (((exp) & REG_MASK) == reg || OFFS_REG(exp) == reg))
743 
744 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
745 
746 #define FUNCTION_CHECK_IS_REG(r) \
747 	(((r) >= SLJIT_R0 && (r) < (SLJIT_R0 + compiler->scratches)) \
748 	|| ((r) > (SLJIT_S0 - compiler->saveds) && (r) <= SLJIT_S0))
749 
750 #define FUNCTION_CHECK_IS_FREG(fr) \
751 	(((fr) >= SLJIT_FR0 && (fr) < (SLJIT_FR0 + compiler->fscratches)) \
752 	|| ((fr) > (SLJIT_FS0 - compiler->fsaveds) && (fr) <= SLJIT_FS0))
753 
754 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
755 #define CHECK_IF_VIRTUAL_REGISTER(p) ((p) <= SLJIT_S3 && (p) >= SLJIT_S8)
756 #else
757 #define CHECK_IF_VIRTUAL_REGISTER(p) 0
758 #endif
759 
function_check_src_mem(struct sljit_compiler * compiler,sljit_s32 p,sljit_sw i)760 static sljit_s32 function_check_src_mem(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)
761 {
762 	if (compiler->scratches == -1 || compiler->saveds == -1)
763 		return 0;
764 
765 	if (!(p & SLJIT_MEM))
766 		return 0;
767 
768 	if (!((p & REG_MASK) == SLJIT_UNUSED || FUNCTION_CHECK_IS_REG(p & REG_MASK)))
769 		return 0;
770 
771 	if (CHECK_IF_VIRTUAL_REGISTER(p & REG_MASK))
772 		return 0;
773 
774 	if (p & OFFS_REG_MASK) {
775 		if ((p & REG_MASK) == SLJIT_UNUSED)
776 			return 0;
777 
778 		if (!(FUNCTION_CHECK_IS_REG(OFFS_REG(p))))
779 			return 0;
780 
781 		if (CHECK_IF_VIRTUAL_REGISTER(OFFS_REG(p)))
782 			return 0;
783 
784 		if ((i & ~0x3) != 0)
785 			return 0;
786 	}
787 
788 	return (p & ~(SLJIT_MEM | REG_MASK | OFFS_REG_MASK)) == 0;
789 }
790 
791 #define FUNCTION_CHECK_SRC_MEM(p, i) \
792 	CHECK_ARGUMENT(function_check_src_mem(compiler, p, i));
793 
function_check_src(struct sljit_compiler * compiler,sljit_s32 p,sljit_sw i)794 static sljit_s32 function_check_src(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)
795 {
796 	if (compiler->scratches == -1 || compiler->saveds == -1)
797 		return 0;
798 
799 	if (FUNCTION_CHECK_IS_REG(p))
800 		return (i == 0);
801 
802 	if (p == SLJIT_IMM)
803 		return 1;
804 
805 	if (p == SLJIT_MEM1(SLJIT_SP))
806 		return (i >= 0 && i < compiler->logical_local_size);
807 
808 	return function_check_src_mem(compiler, p, i);
809 }
810 
811 #define FUNCTION_CHECK_SRC(p, i) \
812 	CHECK_ARGUMENT(function_check_src(compiler, p, i));
813 
function_check_dst(struct sljit_compiler * compiler,sljit_s32 p,sljit_sw i,sljit_s32 unused)814 static sljit_s32 function_check_dst(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i, sljit_s32 unused)
815 {
816 	if (compiler->scratches == -1 || compiler->saveds == -1)
817 		return 0;
818 
819 	if (FUNCTION_CHECK_IS_REG(p) || ((unused) && (p) == SLJIT_UNUSED))
820 		return (i == 0);
821 
822 	if (p == SLJIT_MEM1(SLJIT_SP))
823 		return (i >= 0 && i < compiler->logical_local_size);
824 
825 	return function_check_src_mem(compiler, p, i);
826 }
827 
828 #define FUNCTION_CHECK_DST(p, i, unused) \
829 	CHECK_ARGUMENT(function_check_dst(compiler, p, i, unused));
830 
function_fcheck(struct sljit_compiler * compiler,sljit_s32 p,sljit_sw i)831 static sljit_s32 function_fcheck(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)
832 {
833 	if (compiler->scratches == -1 || compiler->saveds == -1)
834 		return 0;
835 
836 	if (FUNCTION_CHECK_IS_FREG(p))
837 		return (i == 0);
838 
839 	if (p == SLJIT_MEM1(SLJIT_SP))
840 		return (i >= 0 && i < compiler->logical_local_size);
841 
842 	return function_check_src_mem(compiler, p, i);
843 }
844 
845 #define FUNCTION_FCHECK(p, i) \
846 	CHECK_ARGUMENT(function_fcheck(compiler, p, i));
847 
848 #endif /* SLJIT_ARGUMENT_CHECKS */
849 
850 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
851 
sljit_compiler_verbose(struct sljit_compiler * compiler,FILE * verbose)852 SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose)
853 {
854 	compiler->verbose = verbose;
855 }
856 
857 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
858 #ifdef _WIN64
859 #	define SLJIT_PRINT_D	"I64"
860 #else
861 #	define SLJIT_PRINT_D	"l"
862 #endif
863 #else
864 #	define SLJIT_PRINT_D	""
865 #endif
866 
sljit_verbose_reg(struct sljit_compiler * compiler,sljit_s32 r)867 static void sljit_verbose_reg(struct sljit_compiler *compiler, sljit_s32 r)
868 {
869 	if (r < (SLJIT_R0 + compiler->scratches))
870 		fprintf(compiler->verbose, "r%d", r - SLJIT_R0);
871 	else if (r != SLJIT_SP)
872 		fprintf(compiler->verbose, "s%d", SLJIT_NUMBER_OF_REGISTERS - r);
873 	else
874 		fprintf(compiler->verbose, "sp");
875 }
876 
sljit_verbose_freg(struct sljit_compiler * compiler,sljit_s32 r)877 static void sljit_verbose_freg(struct sljit_compiler *compiler, sljit_s32 r)
878 {
879 	if (r < (SLJIT_FR0 + compiler->fscratches))
880 		fprintf(compiler->verbose, "fr%d", r - SLJIT_FR0);
881 	else
882 		fprintf(compiler->verbose, "fs%d", SLJIT_NUMBER_OF_FLOAT_REGISTERS - r);
883 }
884 
sljit_verbose_param(struct sljit_compiler * compiler,sljit_s32 p,sljit_sw i)885 static void sljit_verbose_param(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)
886 {
887 	if ((p) & SLJIT_IMM)
888 		fprintf(compiler->verbose, "#%" SLJIT_PRINT_D "d", (i));
889 	else if ((p) & SLJIT_MEM) {
890 		if ((p) & REG_MASK) {
891 			fputc('[', compiler->verbose);
892 			sljit_verbose_reg(compiler, (p) & REG_MASK);
893 			if ((p) & OFFS_REG_MASK) {
894 				fprintf(compiler->verbose, " + ");
895 				sljit_verbose_reg(compiler, OFFS_REG(p));
896 				if (i)
897 					fprintf(compiler->verbose, " * %d", 1 << (i));
898 			}
899 			else if (i)
900 				fprintf(compiler->verbose, " + %" SLJIT_PRINT_D "d", (i));
901 			fputc(']', compiler->verbose);
902 		}
903 		else
904 			fprintf(compiler->verbose, "[#%" SLJIT_PRINT_D "d]", (i));
905 	} else if (p)
906 		sljit_verbose_reg(compiler, p);
907 	else
908 		fprintf(compiler->verbose, "unused");
909 }
910 
sljit_verbose_fparam(struct sljit_compiler * compiler,sljit_s32 p,sljit_sw i)911 static void sljit_verbose_fparam(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)
912 {
913 	if ((p) & SLJIT_MEM) {
914 		if ((p) & REG_MASK) {
915 			fputc('[', compiler->verbose);
916 			sljit_verbose_reg(compiler, (p) & REG_MASK);
917 			if ((p) & OFFS_REG_MASK) {
918 				fprintf(compiler->verbose, " + ");
919 				sljit_verbose_reg(compiler, OFFS_REG(p));
920 				if (i)
921 					fprintf(compiler->verbose, "%d", 1 << (i));
922 			}
923 			else if (i)
924 				fprintf(compiler->verbose, " + %" SLJIT_PRINT_D "d", (i));
925 			fputc(']', compiler->verbose);
926 		}
927 		else
928 			fprintf(compiler->verbose, "[#%" SLJIT_PRINT_D "d]", (i));
929 	}
930 	else
931 		sljit_verbose_freg(compiler, p);
932 }
933 
934 static const char* op0_names[] = {
935 	(char*)"breakpoint", (char*)"nop", (char*)"lmul.uw", (char*)"lmul.sw",
936 	(char*)"divmod.u", (char*)"divmod.s", (char*)"div.u", (char*)"div.s",
937 	(char*)"endbr", (char*)"skip_frames_before_return"
938 };
939 
940 static const char* op1_names[] = {
941 	(char*)"", (char*)".u8", (char*)".s8", (char*)".u16",
942 	(char*)".s16", (char*)".u32", (char*)".s32", (char*)".p",
943 	(char*)"", (char*)".u8", (char*)".s8", (char*)".u16",
944 	(char*)".s16", (char*)".u32", (char*)".s32", (char*)".p",
945 	(char*)"not", (char*)"neg", (char*)"clz",
946 };
947 
948 static const char* op2_names[] = {
949 	(char*)"add", (char*)"addc", (char*)"sub", (char*)"subc",
950 	(char*)"mul", (char*)"and", (char*)"or", (char*)"xor",
951 	(char*)"shl", (char*)"lshr", (char*)"ashr",
952 };
953 
954 static const char* op_src_names[] = {
955 	(char*)"fast_return", (char*)"skip_frames_before_fast_return",
956 	(char*)"prefetch_l1", (char*)"prefetch_l2",
957 	(char*)"prefetch_l3", (char*)"prefetch_once",
958 };
959 
960 static const char* fop1_names[] = {
961 	(char*)"mov", (char*)"conv", (char*)"conv", (char*)"conv",
962 	(char*)"conv", (char*)"conv", (char*)"cmp", (char*)"neg",
963 	(char*)"abs",
964 };
965 
966 static const char* fop2_names[] = {
967 	(char*)"add", (char*)"sub", (char*)"mul", (char*)"div"
968 };
969 
970 #define JUMP_POSTFIX(type) \
971 	((type & 0xff) <= SLJIT_MUL_NOT_OVERFLOW ? ((type & SLJIT_I32_OP) ? "32" : "") \
972 	: ((type & 0xff) <= SLJIT_ORDERED_F64 ? ((type & SLJIT_F32_OP) ? ".f32" : ".f64") : ""))
973 
974 static char* jump_names[] = {
975 	(char*)"equal", (char*)"not_equal",
976 	(char*)"less", (char*)"greater_equal",
977 	(char*)"greater", (char*)"less_equal",
978 	(char*)"sig_less", (char*)"sig_greater_equal",
979 	(char*)"sig_greater", (char*)"sig_less_equal",
980 	(char*)"overflow", (char*)"not_overflow",
981 	(char*)"mul_overflow", (char*)"mul_not_overflow",
982 	(char*)"carry", (char*)"",
983 	(char*)"equal", (char*)"not_equal",
984 	(char*)"less", (char*)"greater_equal",
985 	(char*)"greater", (char*)"less_equal",
986 	(char*)"unordered", (char*)"ordered",
987 	(char*)"jump", (char*)"fast_call",
988 	(char*)"call", (char*)"call.cdecl"
989 };
990 
991 static char* call_arg_names[] = {
992 	(char*)"void", (char*)"sw", (char*)"uw", (char*)"s32", (char*)"u32", (char*)"f32", (char*)"f64"
993 };
994 
995 #endif /* SLJIT_VERBOSE */
996 
997 /* --------------------------------------------------------------------- */
998 /*  Arch dependent                                                       */
999 /* --------------------------------------------------------------------- */
1000 
1001 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \
1002 	|| (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1003 
check_sljit_generate_code(struct sljit_compiler * compiler)1004 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_generate_code(struct sljit_compiler *compiler)
1005 {
1006 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1007 	struct sljit_jump *jump;
1008 #endif
1009 
1010 	SLJIT_UNUSED_ARG(compiler);
1011 
1012 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1013 	CHECK_ARGUMENT(compiler->size > 0);
1014 	jump = compiler->jumps;
1015 	while (jump) {
1016 		/* All jumps have target. */
1017 		CHECK_ARGUMENT(jump->flags & (JUMP_LABEL | JUMP_ADDR));
1018 		jump = jump->next;
1019 	}
1020 #endif
1021 	CHECK_RETURN_OK;
1022 }
1023 
check_sljit_emit_enter(struct sljit_compiler * compiler,sljit_s32 options,sljit_s32 arg_types,sljit_s32 scratches,sljit_s32 saveds,sljit_s32 fscratches,sljit_s32 fsaveds,sljit_s32 local_size)1024 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_enter(struct sljit_compiler *compiler,
1025 	sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,
1026 	sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
1027 {
1028 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1029 	sljit_s32 types, arg_count, curr_type;
1030 #endif
1031 
1032 	SLJIT_UNUSED_ARG(compiler);
1033 
1034 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1035 	CHECK_ARGUMENT(!(options & ~SLJIT_F64_ALIGNMENT));
1036 	CHECK_ARGUMENT(scratches >= 0 && scratches <= SLJIT_NUMBER_OF_REGISTERS);
1037 	CHECK_ARGUMENT(saveds >= 0 && saveds <= SLJIT_NUMBER_OF_REGISTERS);
1038 	CHECK_ARGUMENT(scratches + saveds <= SLJIT_NUMBER_OF_REGISTERS);
1039 	CHECK_ARGUMENT(fscratches >= 0 && fscratches <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
1040 	CHECK_ARGUMENT(fsaveds >= 0 && fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
1041 	CHECK_ARGUMENT(fscratches + fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
1042 	CHECK_ARGUMENT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);
1043 	CHECK_ARGUMENT((arg_types & SLJIT_DEF_MASK) == 0);
1044 
1045 	types = (arg_types >> SLJIT_DEF_SHIFT);
1046 	arg_count = 0;
1047 	while (types != 0 && arg_count < 3) {
1048 		curr_type = (types & SLJIT_DEF_MASK);
1049 		CHECK_ARGUMENT(curr_type == SLJIT_ARG_TYPE_SW || curr_type == SLJIT_ARG_TYPE_UW);
1050 		arg_count++;
1051 		types >>= SLJIT_DEF_SHIFT;
1052 	}
1053 	CHECK_ARGUMENT(arg_count <= saveds && types == 0);
1054 
1055 	compiler->last_flags = 0;
1056 #endif
1057 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1058 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1059 		fprintf(compiler->verbose, "  enter options:%s args[", (options & SLJIT_F64_ALIGNMENT) ? "f64_align" : "");
1060 
1061 		arg_types >>= SLJIT_DEF_SHIFT;
1062 		while (arg_types) {
1063 			fprintf(compiler->verbose, "%s", call_arg_names[arg_types & SLJIT_DEF_MASK]);
1064 			arg_types >>= SLJIT_DEF_SHIFT;
1065 			if (arg_types)
1066 				fprintf(compiler->verbose, ",");
1067 		}
1068 
1069 		fprintf(compiler->verbose, "] scratches:%d saveds:%d fscratches:%d fsaveds:%d local_size:%d\n",
1070 			scratches, saveds, fscratches, fsaveds, local_size);
1071 	}
1072 #endif
1073 	CHECK_RETURN_OK;
1074 }
1075 
check_sljit_set_context(struct sljit_compiler * compiler,sljit_s32 options,sljit_s32 arg_types,sljit_s32 scratches,sljit_s32 saveds,sljit_s32 fscratches,sljit_s32 fsaveds,sljit_s32 local_size)1076 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_set_context(struct sljit_compiler *compiler,
1077 	sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,
1078 	sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
1079 {
1080 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1081 	sljit_s32 types, arg_count, curr_type;
1082 #endif
1083 
1084 	SLJIT_UNUSED_ARG(compiler);
1085 
1086 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1087 	CHECK_ARGUMENT(!(options & ~SLJIT_F64_ALIGNMENT));
1088 	CHECK_ARGUMENT(scratches >= 0 && scratches <= SLJIT_NUMBER_OF_REGISTERS);
1089 	CHECK_ARGUMENT(saveds >= 0 && saveds <= SLJIT_NUMBER_OF_REGISTERS);
1090 	CHECK_ARGUMENT(scratches + saveds <= SLJIT_NUMBER_OF_REGISTERS);
1091 	CHECK_ARGUMENT(fscratches >= 0 && fscratches <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
1092 	CHECK_ARGUMENT(fsaveds >= 0 && fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
1093 	CHECK_ARGUMENT(fscratches + fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
1094 	CHECK_ARGUMENT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);
1095 
1096 	types = (arg_types >> SLJIT_DEF_SHIFT);
1097 	arg_count = 0;
1098 	while (types != 0 && arg_count < 3) {
1099 		curr_type = (types & SLJIT_DEF_MASK);
1100 		CHECK_ARGUMENT(curr_type == SLJIT_ARG_TYPE_SW || curr_type == SLJIT_ARG_TYPE_UW);
1101 		arg_count++;
1102 		types >>= SLJIT_DEF_SHIFT;
1103 	}
1104 	CHECK_ARGUMENT(arg_count <= saveds && types == 0);
1105 
1106 	compiler->last_flags = 0;
1107 #endif
1108 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1109 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1110 		fprintf(compiler->verbose, "  set_context options:%s args[", (options & SLJIT_F64_ALIGNMENT) ? "f64_align" : "");
1111 
1112 		arg_types >>= SLJIT_DEF_SHIFT;
1113 		while (arg_types) {
1114 			fprintf(compiler->verbose, "%s", call_arg_names[arg_types & SLJIT_DEF_MASK]);
1115 			arg_types >>= SLJIT_DEF_SHIFT;
1116 			if (arg_types)
1117 				fprintf(compiler->verbose, ",");
1118 		}
1119 
1120 		fprintf(compiler->verbose, "] scratches:%d saveds:%d fscratches:%d fsaveds:%d local_size:%d\n",
1121 			scratches, saveds, fscratches, fsaveds, local_size);
1122 	}
1123 #endif
1124 	CHECK_RETURN_OK;
1125 }
1126 
check_sljit_emit_return(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 src,sljit_sw srcw)1127 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
1128 {
1129 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1130 	CHECK_ARGUMENT(compiler->scratches >= 0);
1131 	if (op != SLJIT_UNUSED) {
1132 		CHECK_ARGUMENT(op >= SLJIT_MOV && op <= SLJIT_MOV_P);
1133 		FUNCTION_CHECK_SRC(src, srcw);
1134 	}
1135 	else
1136 		CHECK_ARGUMENT(src == 0 && srcw == 0);
1137 	compiler->last_flags = 0;
1138 #endif
1139 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1140 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1141 		if (op == SLJIT_UNUSED)
1142 			fprintf(compiler->verbose, "  return\n");
1143 		else {
1144 			fprintf(compiler->verbose, "  return%s ", op1_names[op - SLJIT_OP1_BASE]);
1145 			sljit_verbose_param(compiler, src, srcw);
1146 			fprintf(compiler->verbose, "\n");
1147 		}
1148 	}
1149 #endif
1150 	CHECK_RETURN_OK;
1151 }
1152 
check_sljit_emit_fast_enter(struct sljit_compiler * compiler,sljit_s32 dst,sljit_sw dstw)1153 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
1154 {
1155 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1156 	FUNCTION_CHECK_DST(dst, dstw, 0);
1157 	compiler->last_flags = 0;
1158 #endif
1159 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1160 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1161 		fprintf(compiler->verbose, "  fast_enter ");
1162 		sljit_verbose_param(compiler, dst, dstw);
1163 		fprintf(compiler->verbose, "\n");
1164 	}
1165 #endif
1166 	CHECK_RETURN_OK;
1167 }
1168 
check_sljit_emit_op0(struct sljit_compiler * compiler,sljit_s32 op)1169 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)
1170 {
1171 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1172 	CHECK_ARGUMENT((op >= SLJIT_BREAKPOINT && op <= SLJIT_LMUL_SW)
1173 		|| ((op & ~SLJIT_I32_OP) >= SLJIT_DIVMOD_UW && (op & ~SLJIT_I32_OP) <= SLJIT_DIV_SW)
1174 		|| (op >= SLJIT_ENDBR && op <= SLJIT_SKIP_FRAMES_BEFORE_RETURN));
1175 	CHECK_ARGUMENT(GET_OPCODE(op) < SLJIT_LMUL_UW || GET_OPCODE(op) >= SLJIT_ENDBR || compiler->scratches >= 2);
1176 	if ((GET_OPCODE(op) >= SLJIT_LMUL_UW && GET_OPCODE(op) <= SLJIT_DIV_SW) || op == SLJIT_SKIP_FRAMES_BEFORE_RETURN)
1177 		compiler->last_flags = 0;
1178 #endif
1179 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1180 	if (SLJIT_UNLIKELY(!!compiler->verbose))
1181 	{
1182 		fprintf(compiler->verbose, "  %s", op0_names[GET_OPCODE(op) - SLJIT_OP0_BASE]);
1183 		if (GET_OPCODE(op) >= SLJIT_DIVMOD_UW && GET_OPCODE(op) <= SLJIT_DIV_SW) {
1184 			fprintf(compiler->verbose, (op & SLJIT_I32_OP) ? "32" : "w");
1185 		}
1186 		fprintf(compiler->verbose, "\n");
1187 	}
1188 #endif
1189 	CHECK_RETURN_OK;
1190 }
1191 
check_sljit_emit_op1(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst,sljit_sw dstw,sljit_s32 src,sljit_sw srcw)1192 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,
1193 	sljit_s32 dst, sljit_sw dstw,
1194 	sljit_s32 src, sljit_sw srcw)
1195 {
1196 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1197 		compiler->skip_checks = 0;
1198 		CHECK_RETURN_OK;
1199 	}
1200 
1201 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1202 	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_CLZ);
1203 
1204 	switch (GET_OPCODE(op)) {
1205 	case SLJIT_NOT:
1206 		/* Only SLJIT_I32_OP and SLJIT_SET_Z are allowed. */
1207 		CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK));
1208 		break;
1209 	case SLJIT_NEG:
1210 		CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)
1211 			|| GET_FLAG_TYPE(op) == SLJIT_OVERFLOW);
1212 		break;
1213 	case SLJIT_MOV:
1214 	case SLJIT_MOV_U32:
1215 	case SLJIT_MOV_P:
1216 		/* Nothing allowed */
1217 		CHECK_ARGUMENT(!(op & (SLJIT_I32_OP | SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1218 		break;
1219 	default:
1220 		/* Only SLJIT_I32_OP is allowed. */
1221 		CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1222 		break;
1223 	}
1224 
1225 	FUNCTION_CHECK_DST(dst, dstw, HAS_FLAGS(op));
1226 	FUNCTION_CHECK_SRC(src, srcw);
1227 
1228 	if (GET_OPCODE(op) >= SLJIT_NOT) {
1229 		CHECK_ARGUMENT(src != SLJIT_IMM);
1230 		compiler->last_flags = GET_FLAG_TYPE(op) | (op & (SLJIT_I32_OP | SLJIT_SET_Z));
1231 	}
1232 #endif
1233 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1234 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1235 		if (GET_OPCODE(op) <= SLJIT_MOV_P)
1236 		{
1237 			fprintf(compiler->verbose, "  mov%s%s ", !(op & SLJIT_I32_OP) ? "" : "32",
1238 				(op != SLJIT_MOV32) ? op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE] : "");
1239 		}
1240 		else
1241 		{
1242 			fprintf(compiler->verbose, "  %s%s%s%s%s ", op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE], !(op & SLJIT_I32_OP) ? "" : "32",
1243 				!(op & SLJIT_SET_Z) ? "" : ".z", !(op & VARIABLE_FLAG_MASK) ? "" : ".",
1244 				!(op & VARIABLE_FLAG_MASK) ? "" : jump_names[GET_FLAG_TYPE(op)]);
1245 		}
1246 
1247 		sljit_verbose_param(compiler, dst, dstw);
1248 		fprintf(compiler->verbose, ", ");
1249 		sljit_verbose_param(compiler, src, srcw);
1250 		fprintf(compiler->verbose, "\n");
1251 	}
1252 #endif
1253 	CHECK_RETURN_OK;
1254 }
1255 
check_sljit_emit_op2(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst,sljit_sw dstw,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)1256 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,
1257 	sljit_s32 dst, sljit_sw dstw,
1258 	sljit_s32 src1, sljit_sw src1w,
1259 	sljit_s32 src2, sljit_sw src2w)
1260 {
1261 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1262 		compiler->skip_checks = 0;
1263 		CHECK_RETURN_OK;
1264 	}
1265 
1266 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1267 	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_ADD && GET_OPCODE(op) <= SLJIT_ASHR);
1268 
1269 	switch (GET_OPCODE(op)) {
1270 	case SLJIT_AND:
1271 	case SLJIT_OR:
1272 	case SLJIT_XOR:
1273 	case SLJIT_SHL:
1274 	case SLJIT_LSHR:
1275 	case SLJIT_ASHR:
1276 		CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK));
1277 		break;
1278 	case SLJIT_MUL:
1279 		CHECK_ARGUMENT(!(op & SLJIT_SET_Z));
1280 		CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)
1281 			|| GET_FLAG_TYPE(op) == SLJIT_MUL_OVERFLOW);
1282 		break;
1283 	case SLJIT_ADD:
1284 		CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)
1285 			|| GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)
1286 			|| GET_FLAG_TYPE(op) == SLJIT_OVERFLOW);
1287 		break;
1288 	case SLJIT_SUB:
1289 		CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)
1290 			|| (GET_FLAG_TYPE(op) >= SLJIT_LESS && GET_FLAG_TYPE(op) <= SLJIT_OVERFLOW)
1291 			|| GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY));
1292 		break;
1293 	case SLJIT_ADDC:
1294 	case SLJIT_SUBC:
1295 		CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)
1296 			|| GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY));
1297 		CHECK_ARGUMENT((compiler->last_flags & 0xff) == GET_FLAG_TYPE(SLJIT_SET_CARRY));
1298 		CHECK_ARGUMENT((op & SLJIT_I32_OP) == (compiler->last_flags & SLJIT_I32_OP));
1299 		break;
1300 	default:
1301 		SLJIT_UNREACHABLE();
1302 		break;
1303 	}
1304 
1305 	FUNCTION_CHECK_DST(dst, dstw, HAS_FLAGS(op));
1306 	FUNCTION_CHECK_SRC(src1, src1w);
1307 	FUNCTION_CHECK_SRC(src2, src2w);
1308 	compiler->last_flags = GET_FLAG_TYPE(op) | (op & (SLJIT_I32_OP | SLJIT_SET_Z));
1309 #endif
1310 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1311 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1312 		fprintf(compiler->verbose, "  %s%s%s%s%s ", op2_names[GET_OPCODE(op) - SLJIT_OP2_BASE], !(op & SLJIT_I32_OP) ? "" : "32",
1313 			!(op & SLJIT_SET_Z) ? "" : ".z", !(op & VARIABLE_FLAG_MASK) ? "" : ".",
1314 			!(op & VARIABLE_FLAG_MASK) ? "" : jump_names[GET_FLAG_TYPE(op)]);
1315 		sljit_verbose_param(compiler, dst, dstw);
1316 		fprintf(compiler->verbose, ", ");
1317 		sljit_verbose_param(compiler, src1, src1w);
1318 		fprintf(compiler->verbose, ", ");
1319 		sljit_verbose_param(compiler, src2, src2w);
1320 		fprintf(compiler->verbose, "\n");
1321 	}
1322 #endif
1323 	CHECK_RETURN_OK;
1324 }
1325 
check_sljit_emit_op_src(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 src,sljit_sw srcw)1326 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
1327 	sljit_s32 src, sljit_sw srcw)
1328 {
1329 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1330 	CHECK_ARGUMENT(op >= SLJIT_FAST_RETURN && op <= SLJIT_PREFETCH_ONCE);
1331 	FUNCTION_CHECK_SRC(src, srcw);
1332 
1333 	if (op == SLJIT_FAST_RETURN || op == SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN)
1334 	{
1335 		CHECK_ARGUMENT(src != SLJIT_IMM);
1336 		compiler->last_flags = 0;
1337 	}
1338 	else if (op >= SLJIT_PREFETCH_L1 && op <= SLJIT_PREFETCH_ONCE)
1339 	{
1340 		CHECK_ARGUMENT(src & SLJIT_MEM);
1341 	}
1342 #endif
1343 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1344 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1345 		fprintf(compiler->verbose, "  %s ", op_src_names[op - SLJIT_OP_SRC_BASE]);
1346 		sljit_verbose_param(compiler, src, srcw);
1347 		fprintf(compiler->verbose, "\n");
1348 	}
1349 #endif
1350 	CHECK_RETURN_OK;
1351 }
1352 
check_sljit_get_register_index(sljit_s32 reg)1353 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_register_index(sljit_s32 reg)
1354 {
1355 	SLJIT_UNUSED_ARG(reg);
1356 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1357 	CHECK_ARGUMENT(reg > 0 && reg <= SLJIT_NUMBER_OF_REGISTERS);
1358 #endif
1359 	CHECK_RETURN_OK;
1360 }
1361 
check_sljit_get_float_register_index(sljit_s32 reg)1362 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_float_register_index(sljit_s32 reg)
1363 {
1364 	SLJIT_UNUSED_ARG(reg);
1365 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1366 	CHECK_ARGUMENT(reg > 0 && reg <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
1367 #endif
1368 	CHECK_RETURN_OK;
1369 }
1370 
check_sljit_emit_op_custom(struct sljit_compiler * compiler,void * instruction,sljit_s32 size)1371 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_custom(struct sljit_compiler *compiler,
1372 	void *instruction, sljit_s32 size)
1373 {
1374 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1375 	int i;
1376 #endif
1377 
1378 	SLJIT_UNUSED_ARG(compiler);
1379 
1380 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1381 	CHECK_ARGUMENT(instruction);
1382 
1383 #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
1384 	CHECK_ARGUMENT(size > 0 && size < 16);
1385 #elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
1386 	CHECK_ARGUMENT((size == 2 && (((sljit_sw)instruction) & 0x1) == 0)
1387 		|| (size == 4 && (((sljit_sw)instruction) & 0x3) == 0));
1388 #elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)
1389 	CHECK_ARGUMENT(size == 2 || size == 4 || size == 6);
1390 #else
1391 	CHECK_ARGUMENT(size == 4 && (((sljit_sw)instruction) & 0x3) == 0);
1392 #endif
1393 
1394 	compiler->last_flags = 0;
1395 #endif
1396 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1397 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1398 		fprintf(compiler->verbose, "  op_custom");
1399 		for (i = 0; i < size; i++)
1400 			fprintf(compiler->verbose, " 0x%x", ((sljit_u8*)instruction)[i]);
1401 		fprintf(compiler->verbose, "\n");
1402 	}
1403 #endif
1404 	CHECK_RETURN_OK;
1405 }
1406 
check_sljit_emit_fop1(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst,sljit_sw dstw,sljit_s32 src,sljit_sw srcw)1407 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,
1408 	sljit_s32 dst, sljit_sw dstw,
1409 	sljit_s32 src, sljit_sw srcw)
1410 {
1411 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1412 		compiler->skip_checks = 0;
1413 		CHECK_RETURN_OK;
1414 	}
1415 
1416 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1417 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
1418 	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV_F64 && GET_OPCODE(op) <= SLJIT_ABS_F64);
1419 	CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1420 	FUNCTION_FCHECK(src, srcw);
1421 	FUNCTION_FCHECK(dst, dstw);
1422 #endif
1423 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1424 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1425 		if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32)
1426 			fprintf(compiler->verbose, "  %s%s ", fop1_names[SLJIT_CONV_F64_FROM_F32 - SLJIT_FOP1_BASE],
1427 				(op & SLJIT_F32_OP) ? ".f32.from.f64" : ".f64.from.f32");
1428 		else
1429 			fprintf(compiler->verbose, "  %s%s ", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE],
1430 				(op & SLJIT_F32_OP) ? ".f32" : ".f64");
1431 
1432 		sljit_verbose_fparam(compiler, dst, dstw);
1433 		fprintf(compiler->verbose, ", ");
1434 		sljit_verbose_fparam(compiler, src, srcw);
1435 		fprintf(compiler->verbose, "\n");
1436 	}
1437 #endif
1438 	CHECK_RETURN_OK;
1439 }
1440 
check_sljit_emit_fop1_cmp(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)1441 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,
1442 	sljit_s32 src1, sljit_sw src1w,
1443 	sljit_s32 src2, sljit_sw src2w)
1444 {
1445 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1446 	compiler->last_flags = GET_FLAG_TYPE(op) | (op & (SLJIT_I32_OP | SLJIT_SET_Z));
1447 #endif
1448 
1449 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1450 		compiler->skip_checks = 0;
1451 		CHECK_RETURN_OK;
1452 	}
1453 
1454 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1455 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
1456 	CHECK_ARGUMENT(GET_OPCODE(op) == SLJIT_CMP_F64);
1457 	CHECK_ARGUMENT(!(op & SLJIT_SET_Z));
1458 	CHECK_ARGUMENT((op & VARIABLE_FLAG_MASK)
1459 		|| (GET_FLAG_TYPE(op) >= SLJIT_EQUAL_F64 && GET_FLAG_TYPE(op) <= SLJIT_ORDERED_F64));
1460 	FUNCTION_FCHECK(src1, src1w);
1461 	FUNCTION_FCHECK(src2, src2w);
1462 #endif
1463 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1464 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1465 		fprintf(compiler->verbose, "  %s%s", fop1_names[SLJIT_CMP_F64 - SLJIT_FOP1_BASE], (op & SLJIT_F32_OP) ? ".f32" : ".f64");
1466 		if (op & VARIABLE_FLAG_MASK) {
1467 			fprintf(compiler->verbose, ".%s_f", jump_names[GET_FLAG_TYPE(op)]);
1468 		}
1469 		fprintf(compiler->verbose, " ");
1470 		sljit_verbose_fparam(compiler, src1, src1w);
1471 		fprintf(compiler->verbose, ", ");
1472 		sljit_verbose_fparam(compiler, src2, src2w);
1473 		fprintf(compiler->verbose, "\n");
1474 	}
1475 #endif
1476 	CHECK_RETURN_OK;
1477 }
1478 
check_sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst,sljit_sw dstw,sljit_s32 src,sljit_sw srcw)1479 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,
1480 	sljit_s32 dst, sljit_sw dstw,
1481 	sljit_s32 src, sljit_sw srcw)
1482 {
1483 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1484 		compiler->skip_checks = 0;
1485 		CHECK_RETURN_OK;
1486 	}
1487 
1488 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1489 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
1490 	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_CONV_SW_FROM_F64 && GET_OPCODE(op) <= SLJIT_CONV_S32_FROM_F64);
1491 	CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1492 	FUNCTION_FCHECK(src, srcw);
1493 	FUNCTION_CHECK_DST(dst, dstw, 0);
1494 #endif
1495 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1496 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1497 		fprintf(compiler->verbose, "  %s%s.from%s ", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE],
1498 			(GET_OPCODE(op) == SLJIT_CONV_S32_FROM_F64) ? ".s32" : ".sw",
1499 			(op & SLJIT_F32_OP) ? ".f32" : ".f64");
1500 		sljit_verbose_param(compiler, dst, dstw);
1501 		fprintf(compiler->verbose, ", ");
1502 		sljit_verbose_fparam(compiler, src, srcw);
1503 		fprintf(compiler->verbose, "\n");
1504 	}
1505 #endif
1506 	CHECK_RETURN_OK;
1507 }
1508 
check_sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst,sljit_sw dstw,sljit_s32 src,sljit_sw srcw)1509 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
1510 	sljit_s32 dst, sljit_sw dstw,
1511 	sljit_s32 src, sljit_sw srcw)
1512 {
1513 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1514 		compiler->skip_checks = 0;
1515 		CHECK_RETURN_OK;
1516 	}
1517 
1518 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1519 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
1520 	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_CONV_F64_FROM_SW && GET_OPCODE(op) <= SLJIT_CONV_F64_FROM_S32);
1521 	CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1522 	FUNCTION_CHECK_SRC(src, srcw);
1523 	FUNCTION_FCHECK(dst, dstw);
1524 #endif
1525 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1526 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1527 		fprintf(compiler->verbose, "  %s%s.from%s ", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE],
1528 			(op & SLJIT_F32_OP) ? ".f32" : ".f64",
1529 			(GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) ? ".s32" : ".sw");
1530 		sljit_verbose_fparam(compiler, dst, dstw);
1531 		fprintf(compiler->verbose, ", ");
1532 		sljit_verbose_param(compiler, src, srcw);
1533 		fprintf(compiler->verbose, "\n");
1534 	}
1535 #endif
1536 	CHECK_RETURN_OK;
1537 }
1538 
check_sljit_emit_fop2(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst,sljit_sw dstw,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)1539 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,
1540 	sljit_s32 dst, sljit_sw dstw,
1541 	sljit_s32 src1, sljit_sw src1w,
1542 	sljit_s32 src2, sljit_sw src2w)
1543 {
1544 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1545 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
1546 	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_ADD_F64 && GET_OPCODE(op) <= SLJIT_DIV_F64);
1547 	CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1548 	FUNCTION_FCHECK(src1, src1w);
1549 	FUNCTION_FCHECK(src2, src2w);
1550 	FUNCTION_FCHECK(dst, dstw);
1551 #endif
1552 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1553 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1554 		fprintf(compiler->verbose, "  %s%s ", fop2_names[GET_OPCODE(op) - SLJIT_FOP2_BASE], (op & SLJIT_F32_OP) ? ".f32" : ".f64");
1555 		sljit_verbose_fparam(compiler, dst, dstw);
1556 		fprintf(compiler->verbose, ", ");
1557 		sljit_verbose_fparam(compiler, src1, src1w);
1558 		fprintf(compiler->verbose, ", ");
1559 		sljit_verbose_fparam(compiler, src2, src2w);
1560 		fprintf(compiler->verbose, "\n");
1561 	}
1562 #endif
1563 	CHECK_RETURN_OK;
1564 }
1565 
check_sljit_emit_label(struct sljit_compiler * compiler)1566 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_label(struct sljit_compiler *compiler)
1567 {
1568 	SLJIT_UNUSED_ARG(compiler);
1569 
1570 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1571 		compiler->skip_checks = 0;
1572 		CHECK_RETURN_OK;
1573 	}
1574 
1575 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1576 	compiler->last_flags = 0;
1577 #endif
1578 
1579 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1580 	if (SLJIT_UNLIKELY(!!compiler->verbose))
1581 		fprintf(compiler->verbose, "label:\n");
1582 #endif
1583 	CHECK_RETURN_OK;
1584 }
1585 
check_sljit_emit_jump(struct sljit_compiler * compiler,sljit_s32 type)1586 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)
1587 {
1588 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1589 		compiler->skip_checks = 0;
1590 		CHECK_RETURN_OK;
1591 	}
1592 
1593 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1594 	CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | SLJIT_I32_OP)));
1595 	CHECK_ARGUMENT((type & 0xff) != GET_FLAG_TYPE(SLJIT_SET_CARRY) && (type & 0xff) != (GET_FLAG_TYPE(SLJIT_SET_CARRY) + 1));
1596 	CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_FAST_CALL);
1597 	CHECK_ARGUMENT((type & 0xff) < SLJIT_JUMP || !(type & SLJIT_I32_OP));
1598 
1599 	if ((type & 0xff) < SLJIT_JUMP) {
1600 		if ((type & 0xff) <= SLJIT_NOT_ZERO)
1601 			CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z);
1602 		else
1603 			CHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff)
1604 				|| ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)
1605 				|| ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW));
1606 		CHECK_ARGUMENT((type & SLJIT_I32_OP) == (compiler->last_flags & SLJIT_I32_OP));
1607 	}
1608 #endif
1609 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1610 	if (SLJIT_UNLIKELY(!!compiler->verbose))
1611 		fprintf(compiler->verbose, "  jump%s %s%s\n", !(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r",
1612 			jump_names[type & 0xff], JUMP_POSTFIX(type));
1613 #endif
1614 	CHECK_RETURN_OK;
1615 }
1616 
check_sljit_emit_call(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 arg_types)1617 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,
1618 	sljit_s32 arg_types)
1619 {
1620 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1621 	sljit_s32 i, types, curr_type, scratches, fscratches;
1622 
1623 	CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP)));
1624 	CHECK_ARGUMENT((type & 0xff) == SLJIT_CALL || (type & 0xff) == SLJIT_CALL_CDECL);
1625 
1626 	types = arg_types;
1627 	scratches = 0;
1628 	fscratches = 0;
1629 	for (i = 0; i < 5; i++) {
1630 		curr_type = (types & SLJIT_DEF_MASK);
1631 		CHECK_ARGUMENT(curr_type <= SLJIT_ARG_TYPE_F64);
1632 		if (i > 0) {
1633 			if (curr_type == 0) {
1634 				break;
1635 			}
1636 			if (curr_type >= SLJIT_ARG_TYPE_F32)
1637 				fscratches++;
1638 			else
1639 				scratches++;
1640 		} else {
1641 			if (curr_type >= SLJIT_ARG_TYPE_F32) {
1642 				CHECK_ARGUMENT(compiler->fscratches > 0);
1643 			} else if (curr_type >= SLJIT_ARG_TYPE_SW) {
1644 				CHECK_ARGUMENT(compiler->scratches > 0);
1645 			}
1646 		}
1647 		types >>= SLJIT_DEF_SHIFT;
1648 	}
1649 	CHECK_ARGUMENT(compiler->scratches >= scratches);
1650 	CHECK_ARGUMENT(compiler->fscratches >= fscratches);
1651 	CHECK_ARGUMENT(types == 0);
1652 #endif
1653 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1654 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1655 		fprintf(compiler->verbose, "  %s%s ret[%s", jump_names[type & 0xff],
1656 			!(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r", call_arg_names[arg_types & SLJIT_DEF_MASK]);
1657 
1658 		arg_types >>= SLJIT_DEF_SHIFT;
1659 		if (arg_types) {
1660 			fprintf(compiler->verbose, "], args[");
1661 			do {
1662 				fprintf(compiler->verbose, "%s", call_arg_names[arg_types & SLJIT_DEF_MASK]);
1663 				arg_types >>= SLJIT_DEF_SHIFT;
1664 				if (arg_types)
1665 					fprintf(compiler->verbose, ",");
1666 			} while (arg_types);
1667 		}
1668 		fprintf(compiler->verbose, "]\n");
1669 	}
1670 #endif
1671 	CHECK_RETURN_OK;
1672 }
1673 
check_sljit_emit_cmp(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)1674 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type,
1675 	sljit_s32 src1, sljit_sw src1w,
1676 	sljit_s32 src2, sljit_sw src2w)
1677 {
1678 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1679 	CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | SLJIT_I32_OP)));
1680 	CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_SIG_LESS_EQUAL);
1681 	FUNCTION_CHECK_SRC(src1, src1w);
1682 	FUNCTION_CHECK_SRC(src2, src2w);
1683 	compiler->last_flags = 0;
1684 #endif
1685 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1686 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1687 		fprintf(compiler->verbose, "  cmp%s %s%s, ", !(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r",
1688 			jump_names[type & 0xff], (type & SLJIT_I32_OP) ? "32" : "");
1689 		sljit_verbose_param(compiler, src1, src1w);
1690 		fprintf(compiler->verbose, ", ");
1691 		sljit_verbose_param(compiler, src2, src2w);
1692 		fprintf(compiler->verbose, "\n");
1693 	}
1694 #endif
1695 	CHECK_RETURN_OK;
1696 }
1697 
check_sljit_emit_fcmp(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)1698 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_s32 type,
1699 	sljit_s32 src1, sljit_sw src1w,
1700 	sljit_s32 src2, sljit_sw src2w)
1701 {
1702 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1703 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
1704 	CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | SLJIT_F32_OP)));
1705 	CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL_F64 && (type & 0xff) <= SLJIT_ORDERED_F64);
1706 	FUNCTION_FCHECK(src1, src1w);
1707 	FUNCTION_FCHECK(src2, src2w);
1708 	compiler->last_flags = 0;
1709 #endif
1710 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1711 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1712 		fprintf(compiler->verbose, "  fcmp%s %s%s, ", !(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r",
1713 			jump_names[type & 0xff], (type & SLJIT_F32_OP) ? ".f32" : ".f64");
1714 		sljit_verbose_fparam(compiler, src1, src1w);
1715 		fprintf(compiler->verbose, ", ");
1716 		sljit_verbose_fparam(compiler, src2, src2w);
1717 		fprintf(compiler->verbose, "\n");
1718 	}
1719 #endif
1720 	CHECK_RETURN_OK;
1721 }
1722 
check_sljit_emit_ijump(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 src,sljit_sw srcw)1723 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type,
1724 	sljit_s32 src, sljit_sw srcw)
1725 {
1726 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1727 		compiler->skip_checks = 0;
1728 		CHECK_RETURN_OK;
1729 	}
1730 
1731 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1732 	CHECK_ARGUMENT(type >= SLJIT_JUMP && type <= SLJIT_FAST_CALL);
1733 	FUNCTION_CHECK_SRC(src, srcw);
1734 #endif
1735 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1736 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1737 		fprintf(compiler->verbose, "  ijump.%s ", jump_names[type]);
1738 		sljit_verbose_param(compiler, src, srcw);
1739 		fprintf(compiler->verbose, "\n");
1740 	}
1741 #endif
1742 	CHECK_RETURN_OK;
1743 }
1744 
check_sljit_emit_icall(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 arg_types,sljit_s32 src,sljit_sw srcw)1745 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type,
1746 	sljit_s32 arg_types,
1747 	sljit_s32 src, sljit_sw srcw)
1748 {
1749 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1750 	sljit_s32 i, types, curr_type, scratches, fscratches;
1751 
1752 	CHECK_ARGUMENT(type == SLJIT_CALL || type == SLJIT_CALL_CDECL);
1753 	FUNCTION_CHECK_SRC(src, srcw);
1754 
1755 	types = arg_types;
1756 	scratches = 0;
1757 	fscratches = 0;
1758 	for (i = 0; i < 5; i++) {
1759 		curr_type = (types & SLJIT_DEF_MASK);
1760 		CHECK_ARGUMENT(curr_type <= SLJIT_ARG_TYPE_F64);
1761 		if (i > 0) {
1762 			if (curr_type == 0) {
1763 				break;
1764 			}
1765 			if (curr_type >= SLJIT_ARG_TYPE_F32)
1766 				fscratches++;
1767 			else
1768 				scratches++;
1769 		} else {
1770 			if (curr_type >= SLJIT_ARG_TYPE_F32) {
1771 				CHECK_ARGUMENT(compiler->fscratches > 0);
1772 			} else if (curr_type >= SLJIT_ARG_TYPE_SW) {
1773 				CHECK_ARGUMENT(compiler->scratches > 0);
1774 			}
1775 		}
1776 		types >>= SLJIT_DEF_SHIFT;
1777 	}
1778 	CHECK_ARGUMENT(compiler->scratches >= scratches);
1779 	CHECK_ARGUMENT(compiler->fscratches >= fscratches);
1780 	CHECK_ARGUMENT(types == 0);
1781 #endif
1782 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1783 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1784 		fprintf(compiler->verbose, "  i%s%s ret[%s", jump_names[type & 0xff],
1785 			!(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r", call_arg_names[arg_types & SLJIT_DEF_MASK]);
1786 
1787 		arg_types >>= SLJIT_DEF_SHIFT;
1788 		if (arg_types) {
1789 			fprintf(compiler->verbose, "], args[");
1790 			do {
1791 				fprintf(compiler->verbose, "%s", call_arg_names[arg_types & SLJIT_DEF_MASK]);
1792 				arg_types >>= SLJIT_DEF_SHIFT;
1793 				if (arg_types)
1794 					fprintf(compiler->verbose, ",");
1795 			} while (arg_types);
1796 		}
1797 		fprintf(compiler->verbose, "], ");
1798 		sljit_verbose_param(compiler, src, srcw);
1799 		fprintf(compiler->verbose, "\n");
1800 	}
1801 #endif
1802 	CHECK_RETURN_OK;
1803 }
1804 
check_sljit_emit_op_flags(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst,sljit_sw dstw,sljit_s32 type)1805 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,
1806 	sljit_s32 dst, sljit_sw dstw,
1807 	sljit_s32 type)
1808 {
1809 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1810 	CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_I32_OP)));
1811 	CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_ORDERED_F64);
1812 	CHECK_ARGUMENT((type & 0xff) != GET_FLAG_TYPE(SLJIT_SET_CARRY) && (type & 0xff) != (GET_FLAG_TYPE(SLJIT_SET_CARRY) + 1));
1813 	CHECK_ARGUMENT(op == SLJIT_MOV || op == SLJIT_MOV32
1814 		|| (GET_OPCODE(op) >= SLJIT_AND && GET_OPCODE(op) <= SLJIT_XOR));
1815 	CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK));
1816 
1817 	if ((type & 0xff) <= SLJIT_NOT_ZERO)
1818 		CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z);
1819 	else
1820 		CHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff)
1821 			|| ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)
1822 			|| ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW));
1823 
1824 	FUNCTION_CHECK_DST(dst, dstw, 0);
1825 
1826 	if (GET_OPCODE(op) >= SLJIT_ADD)
1827 		compiler->last_flags = GET_FLAG_TYPE(op) | (op & (SLJIT_I32_OP | SLJIT_SET_Z));
1828 #endif
1829 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1830 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1831 		fprintf(compiler->verbose, "  flags%s %s%s, ",
1832 			!(op & SLJIT_SET_Z) ? "" : ".z",
1833 			GET_OPCODE(op) < SLJIT_OP2_BASE ? "mov" : op2_names[GET_OPCODE(op) - SLJIT_OP2_BASE],
1834 			GET_OPCODE(op) < SLJIT_OP2_BASE ? op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE] : ((op & SLJIT_I32_OP) ? "32" : ""));
1835 		sljit_verbose_param(compiler, dst, dstw);
1836 		fprintf(compiler->verbose, ", %s%s\n", jump_names[type & 0xff], JUMP_POSTFIX(type));
1837 	}
1838 #endif
1839 	CHECK_RETURN_OK;
1840 }
1841 
check_sljit_emit_cmov(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 dst_reg,sljit_s32 src,sljit_sw srcw)1842 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,
1843 	sljit_s32 dst_reg,
1844 	sljit_s32 src, sljit_sw srcw)
1845 {
1846 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1847 	CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_I32_OP)));
1848 	CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_ORDERED_F64);
1849 
1850 	CHECK_ARGUMENT(compiler->scratches != -1 && compiler->saveds != -1);
1851 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(dst_reg & ~SLJIT_I32_OP));
1852 	if (src != SLJIT_IMM) {
1853 		CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src));
1854 		CHECK_ARGUMENT(srcw == 0);
1855 	}
1856 
1857 	if ((type & 0xff) <= SLJIT_NOT_ZERO)
1858 		CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z);
1859 	else
1860 		CHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff)
1861 			|| ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)
1862 			|| ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW));
1863 #endif
1864 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1865 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1866 		fprintf(compiler->verbose, "  cmov%s %s%s, ",
1867 			!(dst_reg & SLJIT_I32_OP) ? "" : "32",
1868 			jump_names[type & 0xff], JUMP_POSTFIX(type));
1869 		sljit_verbose_reg(compiler, dst_reg & ~SLJIT_I32_OP);
1870 		fprintf(compiler->verbose, ", ");
1871 		sljit_verbose_param(compiler, src, srcw);
1872 		fprintf(compiler->verbose, "\n");
1873 	}
1874 #endif
1875 	CHECK_RETURN_OK;
1876 }
1877 
check_sljit_emit_mem(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 reg,sljit_s32 mem,sljit_sw memw)1878 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type,
1879 	sljit_s32 reg,
1880 	sljit_s32 mem, sljit_sw memw)
1881 {
1882 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1883 	CHECK_ARGUMENT((type & 0xff) >= SLJIT_MOV && (type & 0xff) <= SLJIT_MOV_P);
1884 	CHECK_ARGUMENT(!(type & SLJIT_I32_OP) || ((type & 0xff) != SLJIT_MOV && (type & 0xff) != SLJIT_MOV_U32 && (type & 0xff) != SLJIT_MOV_P));
1885 	CHECK_ARGUMENT((type & SLJIT_MEM_PRE) || (type & SLJIT_MEM_POST));
1886 	CHECK_ARGUMENT((type & (SLJIT_MEM_PRE | SLJIT_MEM_POST)) != (SLJIT_MEM_PRE | SLJIT_MEM_POST));
1887 	CHECK_ARGUMENT((type & ~(0xff | SLJIT_I32_OP | SLJIT_MEM_STORE | SLJIT_MEM_SUPP | SLJIT_MEM_PRE | SLJIT_MEM_POST)) == 0);
1888 
1889 	FUNCTION_CHECK_SRC_MEM(mem, memw);
1890 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(reg));
1891 
1892 	CHECK_ARGUMENT((mem & REG_MASK) != SLJIT_UNUSED && (mem & REG_MASK) != reg);
1893 #endif
1894 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1895 	if (!(type & SLJIT_MEM_SUPP) && SLJIT_UNLIKELY(!!compiler->verbose)) {
1896 		if (sljit_emit_mem(compiler, type | SLJIT_MEM_SUPP, reg, mem, memw) == SLJIT_ERR_UNSUPPORTED)
1897 			fprintf(compiler->verbose, "  //");
1898 
1899 		fprintf(compiler->verbose, "  mem%s.%s%s%s ",
1900 			!(type & SLJIT_I32_OP) ? "" : "32",
1901 			(type & SLJIT_MEM_STORE) ? "st" : "ld",
1902 			op1_names[(type & 0xff) - SLJIT_OP1_BASE],
1903 			(type & SLJIT_MEM_PRE) ? ".pre" : ".post");
1904 		sljit_verbose_reg(compiler, reg);
1905 		fprintf(compiler->verbose, ", ");
1906 		sljit_verbose_param(compiler, mem, memw);
1907 		fprintf(compiler->verbose, "\n");
1908 	}
1909 #endif
1910 	CHECK_RETURN_OK;
1911 }
1912 
check_sljit_emit_fmem(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 mem,sljit_sw memw)1913 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type,
1914 	sljit_s32 freg,
1915 	sljit_s32 mem, sljit_sw memw)
1916 {
1917 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1918 	CHECK_ARGUMENT((type & 0xff) == SLJIT_MOV_F64);
1919 	CHECK_ARGUMENT((type & SLJIT_MEM_PRE) || (type & SLJIT_MEM_POST));
1920 	CHECK_ARGUMENT((type & (SLJIT_MEM_PRE | SLJIT_MEM_POST)) != (SLJIT_MEM_PRE | SLJIT_MEM_POST));
1921 	CHECK_ARGUMENT((type & ~(0xff | SLJIT_I32_OP | SLJIT_MEM_STORE | SLJIT_MEM_SUPP | SLJIT_MEM_PRE | SLJIT_MEM_POST)) == 0);
1922 
1923 	FUNCTION_CHECK_SRC_MEM(mem, memw);
1924 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg));
1925 #endif
1926 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1927 	if (!(type & SLJIT_MEM_SUPP) && SLJIT_UNLIKELY(!!compiler->verbose)) {
1928 		if (sljit_emit_fmem(compiler, type | SLJIT_MEM_SUPP, freg, mem, memw) == SLJIT_ERR_UNSUPPORTED)
1929 			fprintf(compiler->verbose, "  //");
1930 
1931 		fprintf(compiler->verbose, "  fmem.%s%s%s ",
1932 			(type & SLJIT_MEM_STORE) ? "st" : "ld",
1933 			!(type & SLJIT_I32_OP) ? ".f64" : ".f32",
1934 			(type & SLJIT_MEM_PRE) ? ".pre" : ".post");
1935 		sljit_verbose_freg(compiler, freg);
1936 		fprintf(compiler->verbose, ", ");
1937 		sljit_verbose_param(compiler, mem, memw);
1938 		fprintf(compiler->verbose, "\n");
1939 	}
1940 #endif
1941 	CHECK_RETURN_OK;
1942 }
1943 
check_sljit_get_local_base(struct sljit_compiler * compiler,sljit_s32 dst,sljit_sw dstw,sljit_sw offset)1944 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)
1945 {
1946 	/* Any offset is allowed. */
1947 	SLJIT_UNUSED_ARG(offset);
1948 
1949 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1950 	FUNCTION_CHECK_DST(dst, dstw, 0);
1951 #endif
1952 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1953 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1954 		fprintf(compiler->verbose, "  local_base ");
1955 		sljit_verbose_param(compiler, dst, dstw);
1956 		fprintf(compiler->verbose, ", #%" SLJIT_PRINT_D "d\n", offset);
1957 	}
1958 #endif
1959 	CHECK_RETURN_OK;
1960 }
1961 
check_sljit_emit_const(struct sljit_compiler * compiler,sljit_s32 dst,sljit_sw dstw,sljit_sw init_value)1962 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)
1963 {
1964 	SLJIT_UNUSED_ARG(init_value);
1965 
1966 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1967 	FUNCTION_CHECK_DST(dst, dstw, 0);
1968 #endif
1969 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1970 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1971 		fprintf(compiler->verbose, "  const ");
1972 		sljit_verbose_param(compiler, dst, dstw);
1973 		fprintf(compiler->verbose, ", #%" SLJIT_PRINT_D "d\n", init_value);
1974 	}
1975 #endif
1976 	CHECK_RETURN_OK;
1977 }
1978 
check_sljit_emit_put_label(struct sljit_compiler * compiler,sljit_s32 dst,sljit_sw dstw)1979 static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
1980 {
1981 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1982 	FUNCTION_CHECK_DST(dst, dstw, 0);
1983 #endif
1984 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1985 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1986 		fprintf(compiler->verbose, "  put_label ");
1987 		sljit_verbose_param(compiler, dst, dstw);
1988 		fprintf(compiler->verbose, "\n");
1989 	}
1990 #endif
1991 	CHECK_RETURN_OK;
1992 }
1993 
1994 #endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_VERBOSE */
1995 
1996 #define SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw) \
1997 	SLJIT_COMPILE_ASSERT(!(SLJIT_CONV_SW_FROM_F64 & 0x1) && !(SLJIT_CONV_F64_FROM_SW & 0x1), \
1998 		invalid_float_opcodes); \
1999 	if (GET_OPCODE(op) >= SLJIT_CONV_SW_FROM_F64 && GET_OPCODE(op) <= SLJIT_CMP_F64) { \
2000 		if (GET_OPCODE(op) == SLJIT_CMP_F64) { \
2001 			CHECK(check_sljit_emit_fop1_cmp(compiler, op, dst, dstw, src, srcw)); \
2002 			ADJUST_LOCAL_OFFSET(dst, dstw); \
2003 			ADJUST_LOCAL_OFFSET(src, srcw); \
2004 			return sljit_emit_fop1_cmp(compiler, op, dst, dstw, src, srcw); \
2005 		} \
2006 		if ((GET_OPCODE(op) | 0x1) == SLJIT_CONV_S32_FROM_F64) { \
2007 			CHECK(check_sljit_emit_fop1_conv_sw_from_f64(compiler, op, dst, dstw, src, srcw)); \
2008 			ADJUST_LOCAL_OFFSET(dst, dstw); \
2009 			ADJUST_LOCAL_OFFSET(src, srcw); \
2010 			return sljit_emit_fop1_conv_sw_from_f64(compiler, op, dst, dstw, src, srcw); \
2011 		} \
2012 		CHECK(check_sljit_emit_fop1_conv_f64_from_sw(compiler, op, dst, dstw, src, srcw)); \
2013 		ADJUST_LOCAL_OFFSET(dst, dstw); \
2014 		ADJUST_LOCAL_OFFSET(src, srcw); \
2015 		return sljit_emit_fop1_conv_f64_from_sw(compiler, op, dst, dstw, src, srcw); \
2016 	} \
2017 	CHECK(check_sljit_emit_fop1(compiler, op, dst, dstw, src, srcw)); \
2018 	ADJUST_LOCAL_OFFSET(dst, dstw); \
2019 	ADJUST_LOCAL_OFFSET(src, srcw);
2020 
emit_mov_before_return(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 src,sljit_sw srcw)2021 static SLJIT_INLINE sljit_s32 emit_mov_before_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
2022 {
2023 	/* Return if don't need to do anything. */
2024 	if (op == SLJIT_UNUSED)
2025 		return SLJIT_SUCCESS;
2026 
2027 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2028 	/* At the moment the pointer size is always equal to sljit_sw. May be changed in the future. */
2029 	if (src == SLJIT_RETURN_REG && (op == SLJIT_MOV || op == SLJIT_MOV_P))
2030 		return SLJIT_SUCCESS;
2031 #else
2032 	if (src == SLJIT_RETURN_REG && (op == SLJIT_MOV || op == SLJIT_MOV_U32 || op == SLJIT_MOV_S32 || op == SLJIT_MOV_P))
2033 		return SLJIT_SUCCESS;
2034 #endif
2035 
2036 #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \
2037 		|| (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2038 	compiler->skip_checks = 1;
2039 #endif
2040 	return sljit_emit_op1(compiler, op, SLJIT_RETURN_REG, 0, src, srcw);
2041 }
2042 
2043 #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
2044 		|| (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \
2045 		|| (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) \
2046 		|| ((defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) && !(defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1 && SLJIT_MIPS_REV < 6))
2047 
sljit_emit_cmov_generic(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 dst_reg,sljit_s32 src,sljit_sw srcw)2048 static SLJIT_INLINE sljit_s32 sljit_emit_cmov_generic(struct sljit_compiler *compiler, sljit_s32 type,
2049 	sljit_s32 dst_reg,
2050 	sljit_s32 src, sljit_sw srcw)
2051 {
2052 	struct sljit_label *label;
2053 	struct sljit_jump *jump;
2054 	sljit_s32 op = (dst_reg & SLJIT_I32_OP) ? SLJIT_MOV32 : SLJIT_MOV;
2055 
2056 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
2057 		|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2058 	compiler->skip_checks = 1;
2059 #endif
2060 	jump = sljit_emit_jump(compiler, type ^ 0x1);
2061 	FAIL_IF(!jump);
2062 
2063 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
2064 		|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2065 	compiler->skip_checks = 1;
2066 #endif
2067 	FAIL_IF(sljit_emit_op1(compiler, op, dst_reg & ~SLJIT_I32_OP, 0, src, srcw));
2068 
2069 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
2070 		|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2071 	compiler->skip_checks = 1;
2072 #endif
2073 	label = sljit_emit_label(compiler);
2074 	FAIL_IF(!label);
2075 	sljit_set_label(jump, label);
2076 	return SLJIT_SUCCESS;
2077 }
2078 
2079 #endif
2080 
2081 /* CPU description section */
2082 
2083 #if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE)
2084 #define SLJIT_CPUINFO_PART1 " 32bit ("
2085 #elif (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2086 #define SLJIT_CPUINFO_PART1 " 64bit ("
2087 #else
2088 #error "Internal error: CPU type info missing"
2089 #endif
2090 
2091 #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
2092 #define SLJIT_CPUINFO_PART2 "little endian + "
2093 #elif (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN)
2094 #define SLJIT_CPUINFO_PART2 "big endian + "
2095 #else
2096 #error "Internal error: CPU type info missing"
2097 #endif
2098 
2099 #if (defined SLJIT_UNALIGNED && SLJIT_UNALIGNED)
2100 #define SLJIT_CPUINFO_PART3 "unaligned)"
2101 #else
2102 #define SLJIT_CPUINFO_PART3 "aligned)"
2103 #endif
2104 
2105 #define SLJIT_CPUINFO SLJIT_CPUINFO_PART1 SLJIT_CPUINFO_PART2 SLJIT_CPUINFO_PART3
2106 
2107 #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
2108 #	include "sljitNativeX86_common.c"
2109 #elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
2110 #	include "sljitNativeARM_32.c"
2111 #elif (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
2112 #	include "sljitNativeARM_32.c"
2113 #elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
2114 #	include "sljitNativeARM_T2_32.c"
2115 #elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
2116 #	include "sljitNativeARM_64.c"
2117 #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
2118 #	include "sljitNativePPC_common.c"
2119 #elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
2120 #	include "sljitNativeMIPS_common.c"
2121 #elif (defined SLJIT_CONFIG_SPARC && SLJIT_CONFIG_SPARC)
2122 #	include "sljitNativeSPARC_common.c"
2123 #elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)
2124 #	include "sljitNativeS390X.c"
2125 #endif
2126 
2127 #if !(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
2128 
sljit_emit_cmp(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)2129 SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type,
2130 	sljit_s32 src1, sljit_sw src1w,
2131 	sljit_s32 src2, sljit_sw src2w)
2132 {
2133 	/* Default compare for most architectures. */
2134 	sljit_s32 flags, tmp_src, condition;
2135 	sljit_sw tmp_srcw;
2136 
2137 	CHECK_ERROR_PTR();
2138 	CHECK_PTR(check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w));
2139 
2140 	condition = type & 0xff;
2141 #if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
2142 	if ((condition == SLJIT_EQUAL || condition == SLJIT_NOT_EQUAL)) {
2143 		if ((src1 & SLJIT_IMM) && !src1w) {
2144 			src1 = src2;
2145 			src1w = src2w;
2146 			src2 = SLJIT_IMM;
2147 			src2w = 0;
2148 		}
2149 		if ((src2 & SLJIT_IMM) && !src2w)
2150 			return emit_cmp_to0(compiler, type, src1, src1w);
2151 	}
2152 #endif
2153 
2154 	if (SLJIT_UNLIKELY((src1 & SLJIT_IMM) && !(src2 & SLJIT_IMM))) {
2155 		/* Immediate is preferred as second argument by most architectures. */
2156 		switch (condition) {
2157 		case SLJIT_LESS:
2158 			condition = SLJIT_GREATER;
2159 			break;
2160 		case SLJIT_GREATER_EQUAL:
2161 			condition = SLJIT_LESS_EQUAL;
2162 			break;
2163 		case SLJIT_GREATER:
2164 			condition = SLJIT_LESS;
2165 			break;
2166 		case SLJIT_LESS_EQUAL:
2167 			condition = SLJIT_GREATER_EQUAL;
2168 			break;
2169 		case SLJIT_SIG_LESS:
2170 			condition = SLJIT_SIG_GREATER;
2171 			break;
2172 		case SLJIT_SIG_GREATER_EQUAL:
2173 			condition = SLJIT_SIG_LESS_EQUAL;
2174 			break;
2175 		case SLJIT_SIG_GREATER:
2176 			condition = SLJIT_SIG_LESS;
2177 			break;
2178 		case SLJIT_SIG_LESS_EQUAL:
2179 			condition = SLJIT_SIG_GREATER_EQUAL;
2180 			break;
2181 		}
2182 
2183 		type = condition | (type & (SLJIT_I32_OP | SLJIT_REWRITABLE_JUMP));
2184 		tmp_src = src1;
2185 		src1 = src2;
2186 		src2 = tmp_src;
2187 		tmp_srcw = src1w;
2188 		src1w = src2w;
2189 		src2w = tmp_srcw;
2190 	}
2191 
2192 	if (condition <= SLJIT_NOT_ZERO)
2193 		flags = SLJIT_SET_Z;
2194 	else
2195 		flags = condition << VARIABLE_FLAG_SHIFT;
2196 
2197 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
2198 		|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2199 	compiler->skip_checks = 1;
2200 #endif
2201 	PTR_FAIL_IF(sljit_emit_op2(compiler, SLJIT_SUB | flags | (type & SLJIT_I32_OP),
2202 		SLJIT_UNUSED, 0, src1, src1w, src2, src2w));
2203 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
2204 		|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2205 	compiler->skip_checks = 1;
2206 #endif
2207 	return sljit_emit_jump(compiler, condition | (type & (SLJIT_REWRITABLE_JUMP | SLJIT_I32_OP)));
2208 }
2209 
2210 #endif
2211 
sljit_emit_fcmp(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)2212 SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_s32 type,
2213 	sljit_s32 src1, sljit_sw src1w,
2214 	sljit_s32 src2, sljit_sw src2w)
2215 {
2216 	CHECK_ERROR_PTR();
2217 	CHECK_PTR(check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w));
2218 
2219 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
2220 		|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2221 	compiler->skip_checks = 1;
2222 #endif
2223 	sljit_emit_fop1(compiler, SLJIT_CMP_F64 | ((type & 0xff) << VARIABLE_FLAG_SHIFT) | (type & SLJIT_I32_OP), src1, src1w, src2, src2w);
2224 
2225 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
2226 		|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2227 	compiler->skip_checks = 1;
2228 #endif
2229 	return sljit_emit_jump(compiler, type);
2230 }
2231 
2232 #if !(defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \
2233 	&& !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
2234 	&& !(defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
2235 
sljit_emit_mem(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 reg,sljit_s32 mem,sljit_sw memw)2236 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type,
2237 	sljit_s32 reg,
2238 	sljit_s32 mem, sljit_sw memw)
2239 {
2240 	SLJIT_UNUSED_ARG(compiler);
2241 	SLJIT_UNUSED_ARG(type);
2242 	SLJIT_UNUSED_ARG(reg);
2243 	SLJIT_UNUSED_ARG(mem);
2244 	SLJIT_UNUSED_ARG(memw);
2245 
2246 	CHECK_ERROR();
2247 	CHECK(check_sljit_emit_mem(compiler, type, reg, mem, memw));
2248 
2249 	return SLJIT_ERR_UNSUPPORTED;
2250 }
2251 
2252 #endif
2253 
2254 #if !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
2255 	&& !(defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
2256 
sljit_emit_fmem(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 mem,sljit_sw memw)2257 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type,
2258 	sljit_s32 freg,
2259 	sljit_s32 mem, sljit_sw memw)
2260 {
2261 	SLJIT_UNUSED_ARG(compiler);
2262 	SLJIT_UNUSED_ARG(type);
2263 	SLJIT_UNUSED_ARG(freg);
2264 	SLJIT_UNUSED_ARG(mem);
2265 	SLJIT_UNUSED_ARG(memw);
2266 
2267 	CHECK_ERROR();
2268 	CHECK(check_sljit_emit_fmem(compiler, type, freg, mem, memw));
2269 
2270 	return SLJIT_ERR_UNSUPPORTED;
2271 }
2272 
2273 #endif
2274 
2275 #if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
2276 	&& !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
2277 
sljit_get_local_base(struct sljit_compiler * compiler,sljit_s32 dst,sljit_sw dstw,sljit_sw offset)2278 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)
2279 {
2280 	CHECK_ERROR();
2281 	CHECK(check_sljit_get_local_base(compiler, dst, dstw, offset));
2282 
2283 	ADJUST_LOCAL_OFFSET(SLJIT_MEM1(SLJIT_SP), offset);
2284 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
2285 		|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2286 	compiler->skip_checks = 1;
2287 #endif
2288 	if (offset != 0)
2289 		return sljit_emit_op2(compiler, SLJIT_ADD, dst, dstw, SLJIT_SP, 0, SLJIT_IMM, offset);
2290 	return sljit_emit_op1(compiler, SLJIT_MOV, dst, dstw, SLJIT_SP, 0);
2291 }
2292 
2293 #endif
2294 
2295 #else /* SLJIT_CONFIG_UNSUPPORTED */
2296 
2297 /* Empty function bodies for those machines, which are not (yet) supported. */
2298 
sljit_get_platform_name(void)2299 SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)
2300 {
2301 	return "unsupported";
2302 }
2303 
sljit_create_compiler(void * allocator_data,void * exec_allocator_data)2304 SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void *allocator_data, void *exec_allocator_data)
2305 {
2306 	SLJIT_UNUSED_ARG(allocator_data);
2307 	SLJIT_UNUSED_ARG(exec_allocator_data);
2308 	SLJIT_UNREACHABLE();
2309 	return NULL;
2310 }
2311 
sljit_free_compiler(struct sljit_compiler * compiler)2312 SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler)
2313 {
2314 	SLJIT_UNUSED_ARG(compiler);
2315 	SLJIT_UNREACHABLE();
2316 }
2317 
sljit_set_compiler_memory_error(struct sljit_compiler * compiler)2318 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_compiler_memory_error(struct sljit_compiler *compiler)
2319 {
2320 	SLJIT_UNUSED_ARG(compiler);
2321 	SLJIT_UNREACHABLE();
2322 }
2323 
sljit_alloc_memory(struct sljit_compiler * compiler,sljit_s32 size)2324 SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, sljit_s32 size)
2325 {
2326 	SLJIT_UNUSED_ARG(compiler);
2327 	SLJIT_UNUSED_ARG(size);
2328 	SLJIT_UNREACHABLE();
2329 	return NULL;
2330 }
2331 
2332 #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
sljit_compiler_verbose(struct sljit_compiler * compiler,FILE * verbose)2333 SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose)
2334 {
2335 	SLJIT_UNUSED_ARG(compiler);
2336 	SLJIT_UNUSED_ARG(verbose);
2337 	SLJIT_UNREACHABLE();
2338 }
2339 #endif
2340 
sljit_generate_code(struct sljit_compiler * compiler)2341 SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)
2342 {
2343 	SLJIT_UNUSED_ARG(compiler);
2344 	SLJIT_UNREACHABLE();
2345 	return NULL;
2346 }
2347 
sljit_has_cpu_feature(sljit_s32 feature_type)2348 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)
2349 {
2350 	SLJIT_UNUSED_ARG(feature_type);
2351 	SLJIT_UNREACHABLE();
2352 	return 0;
2353 }
2354 
sljit_free_code(void * code,void * exec_allocator_data)2355 SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code, void *exec_allocator_data)
2356 {
2357 	SLJIT_UNUSED_ARG(code);
2358 	SLJIT_UNUSED_ARG(exec_allocator_data);
2359 	SLJIT_UNREACHABLE();
2360 }
2361 
sljit_emit_enter(struct sljit_compiler * compiler,sljit_s32 options,sljit_s32 arg_types,sljit_s32 scratches,sljit_s32 saveds,sljit_s32 fscratches,sljit_s32 fsaveds,sljit_s32 local_size)2362 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,
2363 	sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,
2364 	sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
2365 {
2366 	SLJIT_UNUSED_ARG(compiler);
2367 	SLJIT_UNUSED_ARG(options);
2368 	SLJIT_UNUSED_ARG(arg_types);
2369 	SLJIT_UNUSED_ARG(scratches);
2370 	SLJIT_UNUSED_ARG(saveds);
2371 	SLJIT_UNUSED_ARG(fscratches);
2372 	SLJIT_UNUSED_ARG(fsaveds);
2373 	SLJIT_UNUSED_ARG(local_size);
2374 	SLJIT_UNREACHABLE();
2375 	return SLJIT_ERR_UNSUPPORTED;
2376 }
2377 
sljit_set_context(struct sljit_compiler * compiler,sljit_s32 options,sljit_s32 arg_types,sljit_s32 scratches,sljit_s32 saveds,sljit_s32 fscratches,sljit_s32 fsaveds,sljit_s32 local_size)2378 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,
2379 	sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,
2380 	sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
2381 {
2382 	SLJIT_UNUSED_ARG(compiler);
2383 	SLJIT_UNUSED_ARG(options);
2384 	SLJIT_UNUSED_ARG(arg_types);
2385 	SLJIT_UNUSED_ARG(scratches);
2386 	SLJIT_UNUSED_ARG(saveds);
2387 	SLJIT_UNUSED_ARG(fscratches);
2388 	SLJIT_UNUSED_ARG(fsaveds);
2389 	SLJIT_UNUSED_ARG(local_size);
2390 	SLJIT_UNREACHABLE();
2391 	return SLJIT_ERR_UNSUPPORTED;
2392 }
2393 
sljit_emit_return(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 src,sljit_sw srcw)2394 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
2395 {
2396 	SLJIT_UNUSED_ARG(compiler);
2397 	SLJIT_UNUSED_ARG(op);
2398 	SLJIT_UNUSED_ARG(src);
2399 	SLJIT_UNUSED_ARG(srcw);
2400 	SLJIT_UNREACHABLE();
2401 	return SLJIT_ERR_UNSUPPORTED;
2402 }
2403 
sljit_emit_fast_enter(struct sljit_compiler * compiler,sljit_s32 dst,sljit_sw dstw)2404 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
2405 {
2406 	SLJIT_UNUSED_ARG(compiler);
2407 	SLJIT_UNUSED_ARG(dst);
2408 	SLJIT_UNUSED_ARG(dstw);
2409 	SLJIT_UNREACHABLE();
2410 	return SLJIT_ERR_UNSUPPORTED;
2411 }
2412 
sljit_emit_op0(struct sljit_compiler * compiler,sljit_s32 op)2413 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)
2414 {
2415 	SLJIT_UNUSED_ARG(compiler);
2416 	SLJIT_UNUSED_ARG(op);
2417 	SLJIT_UNREACHABLE();
2418 	return SLJIT_ERR_UNSUPPORTED;
2419 }
2420 
sljit_emit_op1(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst,sljit_sw dstw,sljit_s32 src,sljit_sw srcw)2421 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,
2422 	sljit_s32 dst, sljit_sw dstw,
2423 	sljit_s32 src, sljit_sw srcw)
2424 {
2425 	SLJIT_UNUSED_ARG(compiler);
2426 	SLJIT_UNUSED_ARG(op);
2427 	SLJIT_UNUSED_ARG(dst);
2428 	SLJIT_UNUSED_ARG(dstw);
2429 	SLJIT_UNUSED_ARG(src);
2430 	SLJIT_UNUSED_ARG(srcw);
2431 	SLJIT_UNREACHABLE();
2432 	return SLJIT_ERR_UNSUPPORTED;
2433 }
2434 
sljit_emit_op2(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst,sljit_sw dstw,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)2435 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,
2436 	sljit_s32 dst, sljit_sw dstw,
2437 	sljit_s32 src1, sljit_sw src1w,
2438 	sljit_s32 src2, sljit_sw src2w)
2439 {
2440 	SLJIT_UNUSED_ARG(compiler);
2441 	SLJIT_UNUSED_ARG(op);
2442 	SLJIT_UNUSED_ARG(dst);
2443 	SLJIT_UNUSED_ARG(dstw);
2444 	SLJIT_UNUSED_ARG(src1);
2445 	SLJIT_UNUSED_ARG(src1w);
2446 	SLJIT_UNUSED_ARG(src2);
2447 	SLJIT_UNUSED_ARG(src2w);
2448 	SLJIT_UNREACHABLE();
2449 	return SLJIT_ERR_UNSUPPORTED;
2450 }
2451 
sljit_emit_op_src(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 src,sljit_sw srcw)2452 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
2453 	sljit_s32 src, sljit_sw srcw)
2454 {
2455 	SLJIT_UNUSED_ARG(compiler);
2456 	SLJIT_UNUSED_ARG(op);
2457 	SLJIT_UNUSED_ARG(src);
2458 	SLJIT_UNUSED_ARG(srcw);
2459 	SLJIT_UNREACHABLE();
2460 	return SLJIT_ERR_UNSUPPORTED;
2461 }
2462 
sljit_get_register_index(sljit_s32 reg)2463 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
2464 {
2465 	SLJIT_UNREACHABLE();
2466 	return reg;
2467 }
2468 
sljit_emit_op_custom(struct sljit_compiler * compiler,void * instruction,sljit_s32 size)2469 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
2470 	void *instruction, sljit_s32 size)
2471 {
2472 	SLJIT_UNUSED_ARG(compiler);
2473 	SLJIT_UNUSED_ARG(instruction);
2474 	SLJIT_UNUSED_ARG(size);
2475 	SLJIT_UNREACHABLE();
2476 	return SLJIT_ERR_UNSUPPORTED;
2477 }
2478 
sljit_set_current_flags(struct sljit_compiler * compiler,sljit_s32 current_flags)2479 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags)
2480 {
2481 	SLJIT_UNUSED_ARG(compiler);
2482 	SLJIT_UNUSED_ARG(current_flags);
2483 }
2484 
sljit_emit_fop1(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst,sljit_sw dstw,sljit_s32 src,sljit_sw srcw)2485 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,
2486 	sljit_s32 dst, sljit_sw dstw,
2487 	sljit_s32 src, sljit_sw srcw)
2488 {
2489 	SLJIT_UNUSED_ARG(compiler);
2490 	SLJIT_UNUSED_ARG(op);
2491 	SLJIT_UNUSED_ARG(dst);
2492 	SLJIT_UNUSED_ARG(dstw);
2493 	SLJIT_UNUSED_ARG(src);
2494 	SLJIT_UNUSED_ARG(srcw);
2495 	SLJIT_UNREACHABLE();
2496 	return SLJIT_ERR_UNSUPPORTED;
2497 }
2498 
sljit_emit_fop2(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst,sljit_sw dstw,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)2499 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,
2500 	sljit_s32 dst, sljit_sw dstw,
2501 	sljit_s32 src1, sljit_sw src1w,
2502 	sljit_s32 src2, sljit_sw src2w)
2503 {
2504 	SLJIT_UNUSED_ARG(compiler);
2505 	SLJIT_UNUSED_ARG(op);
2506 	SLJIT_UNUSED_ARG(dst);
2507 	SLJIT_UNUSED_ARG(dstw);
2508 	SLJIT_UNUSED_ARG(src1);
2509 	SLJIT_UNUSED_ARG(src1w);
2510 	SLJIT_UNUSED_ARG(src2);
2511 	SLJIT_UNUSED_ARG(src2w);
2512 	SLJIT_UNREACHABLE();
2513 	return SLJIT_ERR_UNSUPPORTED;
2514 }
2515 
sljit_emit_label(struct sljit_compiler * compiler)2516 SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)
2517 {
2518 	SLJIT_UNUSED_ARG(compiler);
2519 	SLJIT_UNREACHABLE();
2520 	return NULL;
2521 }
2522 
sljit_emit_jump(struct sljit_compiler * compiler,sljit_s32 type)2523 SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)
2524 {
2525 	SLJIT_UNUSED_ARG(compiler);
2526 	SLJIT_UNUSED_ARG(type);
2527 	SLJIT_UNREACHABLE();
2528 	return NULL;
2529 }
2530 
sljit_emit_call(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 arg_types)2531 SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,
2532 	sljit_s32 arg_types)
2533 {
2534 	SLJIT_UNUSED_ARG(compiler);
2535 	SLJIT_UNUSED_ARG(type);
2536 	SLJIT_UNUSED_ARG(arg_types);
2537 	SLJIT_UNREACHABLE();
2538 	return NULL;
2539 }
2540 
sljit_emit_cmp(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)2541 SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type,
2542 	sljit_s32 src1, sljit_sw src1w,
2543 	sljit_s32 src2, sljit_sw src2w)
2544 {
2545 	SLJIT_UNUSED_ARG(compiler);
2546 	SLJIT_UNUSED_ARG(type);
2547 	SLJIT_UNUSED_ARG(src1);
2548 	SLJIT_UNUSED_ARG(src1w);
2549 	SLJIT_UNUSED_ARG(src2);
2550 	SLJIT_UNUSED_ARG(src2w);
2551 	SLJIT_UNREACHABLE();
2552 	return NULL;
2553 }
2554 
sljit_emit_fcmp(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)2555 SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_s32 type,
2556 	sljit_s32 src1, sljit_sw src1w,
2557 	sljit_s32 src2, sljit_sw src2w)
2558 {
2559 	SLJIT_UNUSED_ARG(compiler);
2560 	SLJIT_UNUSED_ARG(type);
2561 	SLJIT_UNUSED_ARG(src1);
2562 	SLJIT_UNUSED_ARG(src1w);
2563 	SLJIT_UNUSED_ARG(src2);
2564 	SLJIT_UNUSED_ARG(src2w);
2565 	SLJIT_UNREACHABLE();
2566 	return NULL;
2567 }
2568 
sljit_set_label(struct sljit_jump * jump,struct sljit_label * label)2569 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label)
2570 {
2571 	SLJIT_UNUSED_ARG(jump);
2572 	SLJIT_UNUSED_ARG(label);
2573 	SLJIT_UNREACHABLE();
2574 }
2575 
sljit_set_target(struct sljit_jump * jump,sljit_uw target)2576 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target)
2577 {
2578 	SLJIT_UNUSED_ARG(jump);
2579 	SLJIT_UNUSED_ARG(target);
2580 	SLJIT_UNREACHABLE();
2581 }
2582 
sljit_set_put_label(struct sljit_put_label * put_label,struct sljit_label * label)2583 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_put_label(struct sljit_put_label *put_label, struct sljit_label *label)
2584 {
2585 	SLJIT_UNUSED_ARG(put_label);
2586 	SLJIT_UNUSED_ARG(label);
2587 	SLJIT_UNREACHABLE();
2588 }
2589 
sljit_emit_ijump(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 src,sljit_sw srcw)2590 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)
2591 {
2592 	SLJIT_UNUSED_ARG(compiler);
2593 	SLJIT_UNUSED_ARG(type);
2594 	SLJIT_UNUSED_ARG(src);
2595 	SLJIT_UNUSED_ARG(srcw);
2596 	SLJIT_UNREACHABLE();
2597 	return SLJIT_ERR_UNSUPPORTED;
2598 }
2599 
sljit_emit_icall(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 arg_types,sljit_s32 src,sljit_sw srcw)2600 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type,
2601 	sljit_s32 arg_types,
2602 	sljit_s32 src, sljit_sw srcw)
2603 {
2604 	SLJIT_UNUSED_ARG(compiler);
2605 	SLJIT_UNUSED_ARG(type);
2606 	SLJIT_UNUSED_ARG(arg_types);
2607 	SLJIT_UNUSED_ARG(src);
2608 	SLJIT_UNUSED_ARG(srcw);
2609 	SLJIT_UNREACHABLE();
2610 	return SLJIT_ERR_UNSUPPORTED;
2611 }
2612 
sljit_emit_op_flags(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst,sljit_sw dstw,sljit_s32 type)2613 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,
2614 	sljit_s32 dst, sljit_sw dstw,
2615 	sljit_s32 type)
2616 {
2617 	SLJIT_UNUSED_ARG(compiler);
2618 	SLJIT_UNUSED_ARG(op);
2619 	SLJIT_UNUSED_ARG(dst);
2620 	SLJIT_UNUSED_ARG(dstw);
2621 	SLJIT_UNUSED_ARG(type);
2622 	SLJIT_UNREACHABLE();
2623 	return SLJIT_ERR_UNSUPPORTED;
2624 }
2625 
sljit_emit_cmov(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 dst_reg,sljit_s32 src,sljit_sw srcw)2626 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,
2627 	sljit_s32 dst_reg,
2628 	sljit_s32 src, sljit_sw srcw)
2629 {
2630 	SLJIT_UNUSED_ARG(compiler);
2631 	SLJIT_UNUSED_ARG(type);
2632 	SLJIT_UNUSED_ARG(dst_reg);
2633 	SLJIT_UNUSED_ARG(src);
2634 	SLJIT_UNUSED_ARG(srcw);
2635 	SLJIT_UNREACHABLE();
2636 	return SLJIT_ERR_UNSUPPORTED;
2637 }
2638 
sljit_emit_mem(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 reg,sljit_s32 mem,sljit_sw memw)2639 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 reg, sljit_s32 mem, sljit_sw memw)
2640 {
2641 	SLJIT_UNUSED_ARG(compiler);
2642 	SLJIT_UNUSED_ARG(type);
2643 	SLJIT_UNUSED_ARG(reg);
2644 	SLJIT_UNUSED_ARG(mem);
2645 	SLJIT_UNUSED_ARG(memw);
2646 	SLJIT_UNREACHABLE();
2647 	return SLJIT_ERR_UNSUPPORTED;
2648 }
2649 
sljit_emit_fmem(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 mem,sljit_sw memw)2650 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 freg, sljit_s32 mem, sljit_sw memw)
2651 {
2652 	SLJIT_UNUSED_ARG(compiler);
2653 	SLJIT_UNUSED_ARG(type);
2654 	SLJIT_UNUSED_ARG(freg);
2655 	SLJIT_UNUSED_ARG(mem);
2656 	SLJIT_UNUSED_ARG(memw);
2657 	SLJIT_UNREACHABLE();
2658 	return SLJIT_ERR_UNSUPPORTED;
2659 }
2660 
sljit_get_local_base(struct sljit_compiler * compiler,sljit_s32 dst,sljit_sw dstw,sljit_sw offset)2661 SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)
2662 {
2663 	SLJIT_UNUSED_ARG(compiler);
2664 	SLJIT_UNUSED_ARG(dst);
2665 	SLJIT_UNUSED_ARG(dstw);
2666 	SLJIT_UNUSED_ARG(offset);
2667 	SLJIT_UNREACHABLE();
2668 	return SLJIT_ERR_UNSUPPORTED;
2669 }
2670 
sljit_emit_const(struct sljit_compiler * compiler,sljit_s32 dst,sljit_sw dstw,sljit_sw initval)2671 SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw initval)
2672 {
2673 	SLJIT_UNUSED_ARG(compiler);
2674 	SLJIT_UNUSED_ARG(dst);
2675 	SLJIT_UNUSED_ARG(dstw);
2676 	SLJIT_UNUSED_ARG(initval);
2677 	SLJIT_UNREACHABLE();
2678 	return NULL;
2679 }
2680 
sljit_emit_put_label(struct sljit_compiler * compiler,sljit_s32 dst,sljit_sw dstw)2681 SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
2682 {
2683 	SLJIT_UNUSED_ARG(compiler);
2684 	SLJIT_UNUSED_ARG(dst);
2685 	SLJIT_UNUSED_ARG(dstw);
2686 	return NULL;
2687 }
2688 
sljit_set_jump_addr(sljit_uw addr,sljit_uw new_target,sljit_sw executable_offset)2689 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)
2690 {
2691 	SLJIT_UNUSED_ARG(addr);
2692 	SLJIT_UNUSED_ARG(new_target);
2693 	SLJIT_UNUSED_ARG(executable_offset);
2694 	SLJIT_UNREACHABLE();
2695 }
2696 
sljit_set_const(sljit_uw addr,sljit_sw new_constant,sljit_sw executable_offset)2697 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset)
2698 {
2699 	SLJIT_UNUSED_ARG(addr);
2700 	SLJIT_UNUSED_ARG(new_constant);
2701 	SLJIT_UNUSED_ARG(executable_offset);
2702 	SLJIT_UNREACHABLE();
2703 }
2704 
2705 #endif /* !SLJIT_CONFIG_UNSUPPORTED */
2706