xref: /aosp_15_r20/external/pcre/src/sljit/sljitLir.c (revision 22dc650d8ae982c6770746019a6f94af92b0f024)
1*22dc650dSSadaf Ebrahimi /*
2*22dc650dSSadaf Ebrahimi  *    Stack-less Just-In-Time compiler
3*22dc650dSSadaf Ebrahimi  *
4*22dc650dSSadaf Ebrahimi  *    Copyright Zoltan Herczeg ([email protected]). All rights reserved.
5*22dc650dSSadaf Ebrahimi  *
6*22dc650dSSadaf Ebrahimi  * Redistribution and use in source and binary forms, with or without modification, are
7*22dc650dSSadaf Ebrahimi  * permitted provided that the following conditions are met:
8*22dc650dSSadaf Ebrahimi  *
9*22dc650dSSadaf Ebrahimi  *   1. Redistributions of source code must retain the above copyright notice, this list of
10*22dc650dSSadaf Ebrahimi  *      conditions and the following disclaimer.
11*22dc650dSSadaf Ebrahimi  *
12*22dc650dSSadaf Ebrahimi  *   2. Redistributions in binary form must reproduce the above copyright notice, this list
13*22dc650dSSadaf Ebrahimi  *      of conditions and the following disclaimer in the documentation and/or other materials
14*22dc650dSSadaf Ebrahimi  *      provided with the distribution.
15*22dc650dSSadaf Ebrahimi  *
16*22dc650dSSadaf Ebrahimi  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY
17*22dc650dSSadaf Ebrahimi  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18*22dc650dSSadaf Ebrahimi  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
19*22dc650dSSadaf Ebrahimi  * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20*22dc650dSSadaf Ebrahimi  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21*22dc650dSSadaf Ebrahimi  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
22*22dc650dSSadaf Ebrahimi  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23*22dc650dSSadaf Ebrahimi  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
24*22dc650dSSadaf Ebrahimi  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25*22dc650dSSadaf Ebrahimi  */
26*22dc650dSSadaf Ebrahimi 
27*22dc650dSSadaf Ebrahimi #include "sljitLir.h"
28*22dc650dSSadaf Ebrahimi 
29*22dc650dSSadaf Ebrahimi #ifdef _WIN32
30*22dc650dSSadaf Ebrahimi 
31*22dc650dSSadaf Ebrahimi #include <windows.h>
32*22dc650dSSadaf Ebrahimi 
33*22dc650dSSadaf Ebrahimi #endif /* _WIN32 */
34*22dc650dSSadaf Ebrahimi 
35*22dc650dSSadaf Ebrahimi #if !(defined SLJIT_STD_MACROS_DEFINED && SLJIT_STD_MACROS_DEFINED)
36*22dc650dSSadaf Ebrahimi 
37*22dc650dSSadaf Ebrahimi /* These libraries are needed for the macros below. */
38*22dc650dSSadaf Ebrahimi #include <stdlib.h>
39*22dc650dSSadaf Ebrahimi #include <string.h>
40*22dc650dSSadaf Ebrahimi 
41*22dc650dSSadaf Ebrahimi #endif /* SLJIT_STD_MACROS_DEFINED */
42*22dc650dSSadaf Ebrahimi 
43*22dc650dSSadaf Ebrahimi #define CHECK_ERROR() \
44*22dc650dSSadaf Ebrahimi 	do { \
45*22dc650dSSadaf Ebrahimi 		if (SLJIT_UNLIKELY(compiler->error)) \
46*22dc650dSSadaf Ebrahimi 			return compiler->error; \
47*22dc650dSSadaf Ebrahimi 	} while (0)
48*22dc650dSSadaf Ebrahimi 
49*22dc650dSSadaf Ebrahimi #define CHECK_ERROR_PTR() \
50*22dc650dSSadaf Ebrahimi 	do { \
51*22dc650dSSadaf Ebrahimi 		if (SLJIT_UNLIKELY(compiler->error)) \
52*22dc650dSSadaf Ebrahimi 			return NULL; \
53*22dc650dSSadaf Ebrahimi 	} while (0)
54*22dc650dSSadaf Ebrahimi 
55*22dc650dSSadaf Ebrahimi #define FAIL_IF(expr) \
56*22dc650dSSadaf Ebrahimi 	do { \
57*22dc650dSSadaf Ebrahimi 		if (SLJIT_UNLIKELY(expr)) \
58*22dc650dSSadaf Ebrahimi 			return compiler->error; \
59*22dc650dSSadaf Ebrahimi 	} while (0)
60*22dc650dSSadaf Ebrahimi 
61*22dc650dSSadaf Ebrahimi #define PTR_FAIL_IF(expr) \
62*22dc650dSSadaf Ebrahimi 	do { \
63*22dc650dSSadaf Ebrahimi 		if (SLJIT_UNLIKELY(expr)) \
64*22dc650dSSadaf Ebrahimi 			return NULL; \
65*22dc650dSSadaf Ebrahimi 	} while (0)
66*22dc650dSSadaf Ebrahimi 
67*22dc650dSSadaf Ebrahimi #define FAIL_IF_NULL(ptr) \
68*22dc650dSSadaf Ebrahimi 	do { \
69*22dc650dSSadaf Ebrahimi 		if (SLJIT_UNLIKELY(!(ptr))) { \
70*22dc650dSSadaf Ebrahimi 			compiler->error = SLJIT_ERR_ALLOC_FAILED; \
71*22dc650dSSadaf Ebrahimi 			return SLJIT_ERR_ALLOC_FAILED; \
72*22dc650dSSadaf Ebrahimi 		} \
73*22dc650dSSadaf Ebrahimi 	} while (0)
74*22dc650dSSadaf Ebrahimi 
75*22dc650dSSadaf Ebrahimi #define PTR_FAIL_IF_NULL(ptr) \
76*22dc650dSSadaf Ebrahimi 	do { \
77*22dc650dSSadaf Ebrahimi 		if (SLJIT_UNLIKELY(!(ptr))) { \
78*22dc650dSSadaf Ebrahimi 			compiler->error = SLJIT_ERR_ALLOC_FAILED; \
79*22dc650dSSadaf Ebrahimi 			return NULL; \
80*22dc650dSSadaf Ebrahimi 		} \
81*22dc650dSSadaf Ebrahimi 	} while (0)
82*22dc650dSSadaf Ebrahimi 
83*22dc650dSSadaf Ebrahimi #define PTR_FAIL_WITH_EXEC_IF(ptr) \
84*22dc650dSSadaf Ebrahimi 	do { \
85*22dc650dSSadaf Ebrahimi 		if (SLJIT_UNLIKELY(!(ptr))) { \
86*22dc650dSSadaf Ebrahimi 			compiler->error = SLJIT_ERR_EX_ALLOC_FAILED; \
87*22dc650dSSadaf Ebrahimi 			return NULL; \
88*22dc650dSSadaf Ebrahimi 		} \
89*22dc650dSSadaf Ebrahimi 	} while (0)
90*22dc650dSSadaf Ebrahimi 
91*22dc650dSSadaf Ebrahimi #if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
92*22dc650dSSadaf Ebrahimi 
93*22dc650dSSadaf Ebrahimi #define SSIZE_OF(type) ((sljit_s32)sizeof(sljit_ ## type))
94*22dc650dSSadaf Ebrahimi 
95*22dc650dSSadaf Ebrahimi #define VARIABLE_FLAG_SHIFT (10)
96*22dc650dSSadaf Ebrahimi /* All variable flags are even. */
97*22dc650dSSadaf Ebrahimi #define VARIABLE_FLAG_MASK (0x3e << VARIABLE_FLAG_SHIFT)
98*22dc650dSSadaf Ebrahimi #define GET_FLAG_TYPE(op) ((op) >> VARIABLE_FLAG_SHIFT)
99*22dc650dSSadaf Ebrahimi 
100*22dc650dSSadaf Ebrahimi #define GET_OPCODE(op) \
101*22dc650dSSadaf Ebrahimi 	((op) & ~(SLJIT_32 | SLJIT_SET_Z | VARIABLE_FLAG_MASK))
102*22dc650dSSadaf Ebrahimi 
103*22dc650dSSadaf Ebrahimi #define HAS_FLAGS(op) \
104*22dc650dSSadaf Ebrahimi 	((op) & (SLJIT_SET_Z | VARIABLE_FLAG_MASK))
105*22dc650dSSadaf Ebrahimi 
106*22dc650dSSadaf Ebrahimi #define GET_ALL_FLAGS(op) \
107*22dc650dSSadaf Ebrahimi 	((op) & (SLJIT_32 | SLJIT_SET_Z | VARIABLE_FLAG_MASK))
108*22dc650dSSadaf Ebrahimi 
109*22dc650dSSadaf Ebrahimi #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
110*22dc650dSSadaf Ebrahimi #define TYPE_CAST_NEEDED(op) \
111*22dc650dSSadaf Ebrahimi 	((op) >= SLJIT_MOV_U8 && (op) <= SLJIT_MOV_S32)
112*22dc650dSSadaf Ebrahimi #else /* !SLJIT_64BIT_ARCHITECTURE */
113*22dc650dSSadaf Ebrahimi #define TYPE_CAST_NEEDED(op) \
114*22dc650dSSadaf Ebrahimi 	((op) >= SLJIT_MOV_U8 && (op) <= SLJIT_MOV_S16)
115*22dc650dSSadaf Ebrahimi #endif /* SLJIT_64BIT_ARCHITECTURE */
116*22dc650dSSadaf Ebrahimi 
117*22dc650dSSadaf Ebrahimi #define BUF_SIZE	4096
118*22dc650dSSadaf Ebrahimi 
119*22dc650dSSadaf Ebrahimi #if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE)
120*22dc650dSSadaf Ebrahimi #define ABUF_SIZE	2048
121*22dc650dSSadaf Ebrahimi #else
122*22dc650dSSadaf Ebrahimi #define ABUF_SIZE	4096
123*22dc650dSSadaf Ebrahimi #endif
124*22dc650dSSadaf Ebrahimi 
125*22dc650dSSadaf Ebrahimi /* Parameter parsing. */
126*22dc650dSSadaf Ebrahimi #define REG_MASK		0x7f
127*22dc650dSSadaf Ebrahimi #define OFFS_REG(reg)		(((reg) >> 8) & REG_MASK)
128*22dc650dSSadaf Ebrahimi #define OFFS_REG_MASK		(REG_MASK << 8)
129*22dc650dSSadaf Ebrahimi #define TO_OFFS_REG(reg)	((reg) << 8)
130*22dc650dSSadaf Ebrahimi #define FAST_IS_REG(reg)	((reg) < REG_MASK)
131*22dc650dSSadaf Ebrahimi 
132*22dc650dSSadaf Ebrahimi /* Mask for argument types. */
133*22dc650dSSadaf Ebrahimi #define SLJIT_ARG_MASK		0x7
134*22dc650dSSadaf Ebrahimi #define SLJIT_ARG_FULL_MASK	(SLJIT_ARG_MASK | SLJIT_ARG_TYPE_SCRATCH_REG)
135*22dc650dSSadaf Ebrahimi 
136*22dc650dSSadaf Ebrahimi /* Mask for register pairs. */
137*22dc650dSSadaf Ebrahimi #define REG_PAIR_MASK		0x7f00
138*22dc650dSSadaf Ebrahimi #define REG_PAIR_FIRST(reg)	((reg) & 0x7f)
139*22dc650dSSadaf Ebrahimi #define REG_PAIR_SECOND(reg)	((reg) >> 8)
140*22dc650dSSadaf Ebrahimi 
141*22dc650dSSadaf Ebrahimi /* Mask for sljit_emit_enter. */
142*22dc650dSSadaf Ebrahimi #define SLJIT_KEPT_SAVEDS_COUNT(options) ((options) & 0x3)
143*22dc650dSSadaf Ebrahimi 
144*22dc650dSSadaf Ebrahimi /* Getters for simd operations, which returns with log2(size). */
145*22dc650dSSadaf Ebrahimi #define SLJIT_SIMD_GET_OPCODE(type)		((type) & 0xff)
146*22dc650dSSadaf Ebrahimi #define SLJIT_SIMD_GET_REG_SIZE(type)		(((type) >> 12) & 0x3f)
147*22dc650dSSadaf Ebrahimi #define SLJIT_SIMD_GET_ELEM_SIZE(type)		(((type) >> 18) & 0x3f)
148*22dc650dSSadaf Ebrahimi #define SLJIT_SIMD_GET_ELEM2_SIZE(type)		(((type) >> 24) & 0x3f)
149*22dc650dSSadaf Ebrahimi 
150*22dc650dSSadaf Ebrahimi #define SLJIT_SIMD_CHECK_REG(type) (((type) & 0x3f000) >= SLJIT_SIMD_REG_64 && ((type) & 0x3f000) <= SLJIT_SIMD_REG_512)
151*22dc650dSSadaf Ebrahimi #define SLJIT_SIMD_TYPE_MASK(m) ((sljit_s32)0xff000fff & ~(SLJIT_SIMD_FLOAT | SLJIT_SIMD_TEST | (m)))
152*22dc650dSSadaf Ebrahimi #define SLJIT_SIMD_TYPE_MASK2(m) ((sljit_s32)0xc0000fff & ~(SLJIT_SIMD_FLOAT | SLJIT_SIMD_TEST | (m)))
153*22dc650dSSadaf Ebrahimi 
154*22dc650dSSadaf Ebrahimi /* Jump flags. */
155*22dc650dSSadaf Ebrahimi #define JUMP_ADDR	0x1
156*22dc650dSSadaf Ebrahimi #define JUMP_MOV_ADDR	0x2
157*22dc650dSSadaf Ebrahimi /* SLJIT_REWRITABLE_JUMP is 0x1000. */
158*22dc650dSSadaf Ebrahimi 
159*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
160*22dc650dSSadaf Ebrahimi #	define PATCH_MB		0x04
161*22dc650dSSadaf Ebrahimi #	define PATCH_MW		0x08
162*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
163*22dc650dSSadaf Ebrahimi #	define PATCH_MD		0x10
164*22dc650dSSadaf Ebrahimi #	define MOV_ADDR_HI	0x20
165*22dc650dSSadaf Ebrahimi #	define JUMP_MAX_SIZE	((sljit_uw)(10 + 3))
166*22dc650dSSadaf Ebrahimi #	define CJUMP_MAX_SIZE	((sljit_uw)(2 + 10 + 3))
167*22dc650dSSadaf Ebrahimi #else /* !SLJIT_CONFIG_X86_64 */
168*22dc650dSSadaf Ebrahimi #	define JUMP_MAX_SIZE	((sljit_uw)5)
169*22dc650dSSadaf Ebrahimi #	define CJUMP_MAX_SIZE	((sljit_uw)6)
170*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_X86_64 */
171*22dc650dSSadaf Ebrahimi #	define TYPE_SHIFT	13
172*22dc650dSSadaf Ebrahimi #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
173*22dc650dSSadaf Ebrahimi /* Bits 7..12 is for debug jump size, SLJIT_REWRITABLE_JUMP is 0x1000 */
174*22dc650dSSadaf Ebrahimi #	define JUMP_SIZE_SHIFT	7
175*22dc650dSSadaf Ebrahimi #endif /* SLJIT_DEBUG */
176*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_X86 */
177*22dc650dSSadaf Ebrahimi 
178*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
179*22dc650dSSadaf Ebrahimi #	define IS_BL		0x04
180*22dc650dSSadaf Ebrahimi #	define PATCH_B		0x08
181*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_ARM_V6 || SLJIT_CONFIG_ARM_V7 */
182*22dc650dSSadaf Ebrahimi 
183*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
184*22dc650dSSadaf Ebrahimi #	define CPOOL_SIZE	512
185*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_ARM_V6 */
186*22dc650dSSadaf Ebrahimi 
187*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
188*22dc650dSSadaf Ebrahimi #	define JUMP_SIZE_SHIFT	26
189*22dc650dSSadaf Ebrahimi #	define JUMP_MAX_SIZE	((sljit_uw)3)
190*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_ARM_V7 */
191*22dc650dSSadaf Ebrahimi 
192*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
193*22dc650dSSadaf Ebrahimi #	define IS_COND		0x04
194*22dc650dSSadaf Ebrahimi #	define IS_BL		0x08
195*22dc650dSSadaf Ebrahimi 	/* conditional + imm8 */
196*22dc650dSSadaf Ebrahimi #	define PATCH_TYPE1	0x10
197*22dc650dSSadaf Ebrahimi 	/* conditional + imm20 */
198*22dc650dSSadaf Ebrahimi #	define PATCH_TYPE2	0x20
199*22dc650dSSadaf Ebrahimi 	/* imm11 */
200*22dc650dSSadaf Ebrahimi #	define PATCH_TYPE3	0x30
201*22dc650dSSadaf Ebrahimi 	/* imm24 */
202*22dc650dSSadaf Ebrahimi #	define PATCH_TYPE4	0x40
203*22dc650dSSadaf Ebrahimi 	/* BL + imm24 */
204*22dc650dSSadaf Ebrahimi #	define PATCH_TYPE5	0x50
205*22dc650dSSadaf Ebrahimi 	/* addwi/subwi */
206*22dc650dSSadaf Ebrahimi #	define PATCH_TYPE6	0x60
207*22dc650dSSadaf Ebrahimi 	/* 0xf00 cc code for branches */
208*22dc650dSSadaf Ebrahimi #	define JUMP_SIZE_SHIFT	26
209*22dc650dSSadaf Ebrahimi #	define JUMP_MAX_SIZE	((sljit_uw)5)
210*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_ARM_THUMB2 */
211*22dc650dSSadaf Ebrahimi 
212*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
213*22dc650dSSadaf Ebrahimi #	define IS_COND		0x004
214*22dc650dSSadaf Ebrahimi #	define IS_CBZ		0x008
215*22dc650dSSadaf Ebrahimi #	define IS_BL		0x010
216*22dc650dSSadaf Ebrahimi #	define PATCH_COND	0x020
217*22dc650dSSadaf Ebrahimi #	define PATCH_B		0x040
218*22dc650dSSadaf Ebrahimi #	define PATCH_B32	0x080
219*22dc650dSSadaf Ebrahimi #	define PATCH_ABS48	0x100
220*22dc650dSSadaf Ebrahimi #	define PATCH_ABS64	0x200
221*22dc650dSSadaf Ebrahimi #	define JUMP_SIZE_SHIFT	58
222*22dc650dSSadaf Ebrahimi #	define JUMP_MAX_SIZE	((sljit_uw)5)
223*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_ARM_64 */
224*22dc650dSSadaf Ebrahimi 
225*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
226*22dc650dSSadaf Ebrahimi #	define IS_COND		0x004
227*22dc650dSSadaf Ebrahimi #	define IS_CALL		0x008
228*22dc650dSSadaf Ebrahimi #	define PATCH_B		0x010
229*22dc650dSSadaf Ebrahimi #	define PATCH_ABS_B	0x020
230*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
231*22dc650dSSadaf Ebrahimi #	define PATCH_ABS32	0x040
232*22dc650dSSadaf Ebrahimi #	define PATCH_ABS48	0x080
233*22dc650dSSadaf Ebrahimi #	define JUMP_SIZE_SHIFT	58
234*22dc650dSSadaf Ebrahimi #	define JUMP_MAX_SIZE	((sljit_uw)7)
235*22dc650dSSadaf Ebrahimi #else /* !SLJIT_CONFIG_PPC_64 */
236*22dc650dSSadaf Ebrahimi #	define JUMP_SIZE_SHIFT	26
237*22dc650dSSadaf Ebrahimi #	define JUMP_MAX_SIZE	((sljit_uw)4)
238*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_PPC_64 */
239*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_PPC */
240*22dc650dSSadaf Ebrahimi 
241*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
242*22dc650dSSadaf Ebrahimi #	define IS_MOVABLE	0x004
243*22dc650dSSadaf Ebrahimi #	define IS_JAL		0x008
244*22dc650dSSadaf Ebrahimi #	define IS_CALL		0x010
245*22dc650dSSadaf Ebrahimi #	define IS_BIT26_COND	0x020
246*22dc650dSSadaf Ebrahimi #	define IS_BIT16_COND	0x040
247*22dc650dSSadaf Ebrahimi #	define IS_BIT23_COND	0x080
248*22dc650dSSadaf Ebrahimi 
249*22dc650dSSadaf Ebrahimi #	define IS_COND		(IS_BIT26_COND | IS_BIT16_COND | IS_BIT23_COND)
250*22dc650dSSadaf Ebrahimi 
251*22dc650dSSadaf Ebrahimi #	define PATCH_B		0x100
252*22dc650dSSadaf Ebrahimi #	define PATCH_J		0x200
253*22dc650dSSadaf Ebrahimi 
254*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
255*22dc650dSSadaf Ebrahimi #	define PATCH_ABS32	0x400
256*22dc650dSSadaf Ebrahimi #	define PATCH_ABS48	0x800
257*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_MIPS_64 */
258*22dc650dSSadaf Ebrahimi 
259*22dc650dSSadaf Ebrahimi 	/* instruction types */
260*22dc650dSSadaf Ebrahimi #	define MOVABLE_INS	0
261*22dc650dSSadaf Ebrahimi 	/* 1 - 31 last destination register */
262*22dc650dSSadaf Ebrahimi 	/* no destination (i.e: store) */
263*22dc650dSSadaf Ebrahimi #	define UNMOVABLE_INS	32
264*22dc650dSSadaf Ebrahimi 	/* FPU status register */
265*22dc650dSSadaf Ebrahimi #	define FCSR_FCC		33
266*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_MIPS */
267*22dc650dSSadaf Ebrahimi 
268*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV)
269*22dc650dSSadaf Ebrahimi #	define IS_COND		0x004
270*22dc650dSSadaf Ebrahimi #	define IS_CALL		0x008
271*22dc650dSSadaf Ebrahimi 
272*22dc650dSSadaf Ebrahimi #	define PATCH_B		0x010
273*22dc650dSSadaf Ebrahimi #	define PATCH_J		0x020
274*22dc650dSSadaf Ebrahimi 
275*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
276*22dc650dSSadaf Ebrahimi #	define PATCH_REL32	0x040
277*22dc650dSSadaf Ebrahimi #	define PATCH_ABS32	0x080
278*22dc650dSSadaf Ebrahimi #	define PATCH_ABS44	0x100
279*22dc650dSSadaf Ebrahimi #	define PATCH_ABS52	0x200
280*22dc650dSSadaf Ebrahimi #	define JUMP_SIZE_SHIFT	58
281*22dc650dSSadaf Ebrahimi #	define JUMP_MAX_SIZE	((sljit_uw)6)
282*22dc650dSSadaf Ebrahimi #else /* !SLJIT_CONFIG_RISCV_64 */
283*22dc650dSSadaf Ebrahimi #	define JUMP_SIZE_SHIFT	26
284*22dc650dSSadaf Ebrahimi #	define JUMP_MAX_SIZE	((sljit_uw)2)
285*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_RISCV_64 */
286*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_RISCV */
287*22dc650dSSadaf Ebrahimi 
288*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)
289*22dc650dSSadaf Ebrahimi #	define IS_COND		0x004
290*22dc650dSSadaf Ebrahimi #	define IS_CALL		0x008
291*22dc650dSSadaf Ebrahimi 
292*22dc650dSSadaf Ebrahimi #	define PATCH_B		0x010
293*22dc650dSSadaf Ebrahimi #	define PATCH_J		0x020
294*22dc650dSSadaf Ebrahimi 
295*22dc650dSSadaf Ebrahimi #	define PATCH_REL32	0x040
296*22dc650dSSadaf Ebrahimi #	define PATCH_ABS32	0x080
297*22dc650dSSadaf Ebrahimi #	define PATCH_ABS52	0x100
298*22dc650dSSadaf Ebrahimi #	define JUMP_SIZE_SHIFT	58
299*22dc650dSSadaf Ebrahimi #	define JUMP_MAX_SIZE	((sljit_uw)4)
300*22dc650dSSadaf Ebrahimi 
301*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_LOONGARCH */
302*22dc650dSSadaf Ebrahimi /* Stack management. */
303*22dc650dSSadaf Ebrahimi 
304*22dc650dSSadaf Ebrahimi #define GET_SAVED_REGISTERS_SIZE(scratches, saveds, extra) \
305*22dc650dSSadaf Ebrahimi 	(((scratches < SLJIT_NUMBER_OF_SCRATCH_REGISTERS ? 0 : (scratches - SLJIT_NUMBER_OF_SCRATCH_REGISTERS)) + \
306*22dc650dSSadaf Ebrahimi 		(saveds) + (sljit_s32)(extra)) * (sljit_s32)sizeof(sljit_sw))
307*22dc650dSSadaf Ebrahimi 
308*22dc650dSSadaf Ebrahimi #define GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, type) \
309*22dc650dSSadaf Ebrahimi 	(((fscratches < SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS ? 0 : (fscratches - SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS)) + \
310*22dc650dSSadaf Ebrahimi 		(fsaveds)) * SSIZE_OF(type))
311*22dc650dSSadaf Ebrahimi 
312*22dc650dSSadaf Ebrahimi #define ADJUST_LOCAL_OFFSET(p, i) \
313*22dc650dSSadaf Ebrahimi 	if ((p) == (SLJIT_MEM1(SLJIT_SP))) \
314*22dc650dSSadaf Ebrahimi 		(i) += SLJIT_LOCALS_OFFSET;
315*22dc650dSSadaf Ebrahimi 
316*22dc650dSSadaf Ebrahimi #endif /* !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) */
317*22dc650dSSadaf Ebrahimi 
318*22dc650dSSadaf Ebrahimi /* Utils can still be used even if SLJIT_CONFIG_UNSUPPORTED is set. */
319*22dc650dSSadaf Ebrahimi #include "sljitUtils.c"
320*22dc650dSSadaf Ebrahimi 
321*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
322*22dc650dSSadaf Ebrahimi #define SLJIT_CODE_TO_PTR(code) ((void*)((sljit_up)(code) & ~(sljit_up)0x1))
323*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
324*22dc650dSSadaf Ebrahimi #define SLJIT_CODE_TO_PTR(code) ((void*)(*(sljit_up*)code))
325*22dc650dSSadaf Ebrahimi #else /* !SLJIT_CONFIG_ARM_THUMB2 && !SLJIT_INDIRECT_CALL */
326*22dc650dSSadaf Ebrahimi #define SLJIT_CODE_TO_PTR(code) ((void*)(code))
327*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_ARM_THUMB2 || SLJIT_INDIRECT_CALL */
328*22dc650dSSadaf Ebrahimi 
329*22dc650dSSadaf Ebrahimi #if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
330*22dc650dSSadaf Ebrahimi 
331*22dc650dSSadaf Ebrahimi #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
332*22dc650dSSadaf Ebrahimi 
333*22dc650dSSadaf Ebrahimi #if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)
334*22dc650dSSadaf Ebrahimi 
335*22dc650dSSadaf Ebrahimi #if defined(__NetBSD__)
336*22dc650dSSadaf Ebrahimi #include "allocator_src/sljitProtExecAllocatorNetBSD.c"
337*22dc650dSSadaf Ebrahimi #else
338*22dc650dSSadaf Ebrahimi #include "allocator_src/sljitProtExecAllocatorPosix.c"
339*22dc650dSSadaf Ebrahimi #endif
340*22dc650dSSadaf Ebrahimi 
341*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_WX_EXECUTABLE_ALLOCATOR && SLJIT_WX_EXECUTABLE_ALLOCATOR)
342*22dc650dSSadaf Ebrahimi 
343*22dc650dSSadaf Ebrahimi #if defined(_WIN32)
344*22dc650dSSadaf Ebrahimi #include "allocator_src/sljitWXExecAllocatorWindows.c"
345*22dc650dSSadaf Ebrahimi #else
346*22dc650dSSadaf Ebrahimi #include "allocator_src/sljitWXExecAllocatorPosix.c"
347*22dc650dSSadaf Ebrahimi #endif
348*22dc650dSSadaf Ebrahimi 
349*22dc650dSSadaf Ebrahimi #else
350*22dc650dSSadaf Ebrahimi 
351*22dc650dSSadaf Ebrahimi #if defined(_WIN32)
352*22dc650dSSadaf Ebrahimi #include "allocator_src/sljitExecAllocatorWindows.c"
353*22dc650dSSadaf Ebrahimi #elif defined(__APPLE__)
354*22dc650dSSadaf Ebrahimi #include "allocator_src/sljitExecAllocatorApple.c"
355*22dc650dSSadaf Ebrahimi #elif defined(__FreeBSD__)
356*22dc650dSSadaf Ebrahimi #include "allocator_src/sljitExecAllocatorFreeBSD.c"
357*22dc650dSSadaf Ebrahimi #else
358*22dc650dSSadaf Ebrahimi #include "allocator_src/sljitExecAllocatorPosix.c"
359*22dc650dSSadaf Ebrahimi #endif
360*22dc650dSSadaf Ebrahimi 
361*22dc650dSSadaf Ebrahimi #endif
362*22dc650dSSadaf Ebrahimi 
363*22dc650dSSadaf Ebrahimi #else /* !SLJIT_EXECUTABLE_ALLOCATOR */
364*22dc650dSSadaf Ebrahimi 
365*22dc650dSSadaf Ebrahimi #ifndef SLJIT_UPDATE_WX_FLAGS
366*22dc650dSSadaf Ebrahimi #define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec)
367*22dc650dSSadaf Ebrahimi #endif
368*22dc650dSSadaf Ebrahimi 
369*22dc650dSSadaf Ebrahimi #endif /* SLJIT_EXECUTABLE_ALLOCATOR */
370*22dc650dSSadaf Ebrahimi 
371*22dc650dSSadaf Ebrahimi #if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)
372*22dc650dSSadaf Ebrahimi #define SLJIT_ADD_EXEC_OFFSET(ptr, exec_offset) ((sljit_u8 *)(ptr) + (exec_offset))
373*22dc650dSSadaf Ebrahimi #else
374*22dc650dSSadaf Ebrahimi #define SLJIT_ADD_EXEC_OFFSET(ptr, exec_offset) ((sljit_u8 *)(ptr))
375*22dc650dSSadaf Ebrahimi #endif
376*22dc650dSSadaf Ebrahimi 
377*22dc650dSSadaf Ebrahimi /* Argument checking features. */
378*22dc650dSSadaf Ebrahimi 
379*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
380*22dc650dSSadaf Ebrahimi 
381*22dc650dSSadaf Ebrahimi /* Returns with error when an invalid argument is passed. */
382*22dc650dSSadaf Ebrahimi 
383*22dc650dSSadaf Ebrahimi #define CHECK_ARGUMENT(x) \
384*22dc650dSSadaf Ebrahimi 	do { \
385*22dc650dSSadaf Ebrahimi 		if (SLJIT_UNLIKELY(!(x))) \
386*22dc650dSSadaf Ebrahimi 			return 1; \
387*22dc650dSSadaf Ebrahimi 	} while (0)
388*22dc650dSSadaf Ebrahimi 
389*22dc650dSSadaf Ebrahimi #define CHECK_RETURN_TYPE sljit_s32
390*22dc650dSSadaf Ebrahimi #define CHECK_RETURN_OK return 0
391*22dc650dSSadaf Ebrahimi 
392*22dc650dSSadaf Ebrahimi #define CHECK(x) \
393*22dc650dSSadaf Ebrahimi 	do { \
394*22dc650dSSadaf Ebrahimi 		if (SLJIT_UNLIKELY(x)) { \
395*22dc650dSSadaf Ebrahimi 			compiler->error = SLJIT_ERR_BAD_ARGUMENT; \
396*22dc650dSSadaf Ebrahimi 			return SLJIT_ERR_BAD_ARGUMENT; \
397*22dc650dSSadaf Ebrahimi 		} \
398*22dc650dSSadaf Ebrahimi 	} while (0)
399*22dc650dSSadaf Ebrahimi 
400*22dc650dSSadaf Ebrahimi #define CHECK_PTR(x) \
401*22dc650dSSadaf Ebrahimi 	do { \
402*22dc650dSSadaf Ebrahimi 		if (SLJIT_UNLIKELY(x)) { \
403*22dc650dSSadaf Ebrahimi 			compiler->error = SLJIT_ERR_BAD_ARGUMENT; \
404*22dc650dSSadaf Ebrahimi 			return NULL; \
405*22dc650dSSadaf Ebrahimi 		} \
406*22dc650dSSadaf Ebrahimi 	} while (0)
407*22dc650dSSadaf Ebrahimi 
408*22dc650dSSadaf Ebrahimi #define CHECK_REG_INDEX(x) \
409*22dc650dSSadaf Ebrahimi 	do { \
410*22dc650dSSadaf Ebrahimi 		if (SLJIT_UNLIKELY(x)) { \
411*22dc650dSSadaf Ebrahimi 			return -2; \
412*22dc650dSSadaf Ebrahimi 		} \
413*22dc650dSSadaf Ebrahimi 	} while (0)
414*22dc650dSSadaf Ebrahimi 
415*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_DEBUG && SLJIT_DEBUG)
416*22dc650dSSadaf Ebrahimi 
417*22dc650dSSadaf Ebrahimi /* Assertion failure occures if an invalid argument is passed. */
418*22dc650dSSadaf Ebrahimi #undef SLJIT_ARGUMENT_CHECKS
419*22dc650dSSadaf Ebrahimi #define SLJIT_ARGUMENT_CHECKS 1
420*22dc650dSSadaf Ebrahimi 
421*22dc650dSSadaf Ebrahimi #define CHECK_ARGUMENT(x) SLJIT_ASSERT(x)
422*22dc650dSSadaf Ebrahimi #define CHECK_RETURN_TYPE void
423*22dc650dSSadaf Ebrahimi #define CHECK_RETURN_OK return
424*22dc650dSSadaf Ebrahimi #define CHECK(x) x
425*22dc650dSSadaf Ebrahimi #define CHECK_PTR(x) x
426*22dc650dSSadaf Ebrahimi #define CHECK_REG_INDEX(x) x
427*22dc650dSSadaf Ebrahimi 
428*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
429*22dc650dSSadaf Ebrahimi 
430*22dc650dSSadaf Ebrahimi /* Arguments are not checked. */
431*22dc650dSSadaf Ebrahimi #define CHECK_RETURN_TYPE void
432*22dc650dSSadaf Ebrahimi #define CHECK_RETURN_OK return
433*22dc650dSSadaf Ebrahimi #define CHECK(x) x
434*22dc650dSSadaf Ebrahimi #define CHECK_PTR(x) x
435*22dc650dSSadaf Ebrahimi #define CHECK_REG_INDEX(x) x
436*22dc650dSSadaf Ebrahimi 
437*22dc650dSSadaf Ebrahimi #else
438*22dc650dSSadaf Ebrahimi 
439*22dc650dSSadaf Ebrahimi /* Arguments are not checked. */
440*22dc650dSSadaf Ebrahimi #define CHECK(x)
441*22dc650dSSadaf Ebrahimi #define CHECK_PTR(x)
442*22dc650dSSadaf Ebrahimi #define CHECK_REG_INDEX(x)
443*22dc650dSSadaf Ebrahimi 
444*22dc650dSSadaf Ebrahimi #endif /* SLJIT_ARGUMENT_CHECKS */
445*22dc650dSSadaf Ebrahimi 
446*22dc650dSSadaf Ebrahimi /* --------------------------------------------------------------------- */
447*22dc650dSSadaf Ebrahimi /*  Public functions                                                     */
448*22dc650dSSadaf Ebrahimi /* --------------------------------------------------------------------- */
449*22dc650dSSadaf Ebrahimi 
450*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
451*22dc650dSSadaf Ebrahimi #define SLJIT_NEEDS_COMPILER_INIT 1
452*22dc650dSSadaf Ebrahimi static sljit_s32 compiler_initialized = 0;
453*22dc650dSSadaf Ebrahimi /* A thread safe initialization. */
454*22dc650dSSadaf Ebrahimi static void init_compiler(void);
455*22dc650dSSadaf Ebrahimi #endif
456*22dc650dSSadaf Ebrahimi 
sljit_create_compiler(void * allocator_data)457*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void *allocator_data)
458*22dc650dSSadaf Ebrahimi {
459*22dc650dSSadaf Ebrahimi 	struct sljit_compiler *compiler = (struct sljit_compiler*)SLJIT_MALLOC(sizeof(struct sljit_compiler), allocator_data);
460*22dc650dSSadaf Ebrahimi 	if (!compiler)
461*22dc650dSSadaf Ebrahimi 		return NULL;
462*22dc650dSSadaf Ebrahimi 	SLJIT_ZEROMEM(compiler, sizeof(struct sljit_compiler));
463*22dc650dSSadaf Ebrahimi 
464*22dc650dSSadaf Ebrahimi 	SLJIT_COMPILE_ASSERT(
465*22dc650dSSadaf Ebrahimi 		sizeof(sljit_s8) == 1 && sizeof(sljit_u8) == 1
466*22dc650dSSadaf Ebrahimi 		&& sizeof(sljit_s16) == 2 && sizeof(sljit_u16) == 2
467*22dc650dSSadaf Ebrahimi 		&& sizeof(sljit_s32) == 4 && sizeof(sljit_u32) == 4
468*22dc650dSSadaf Ebrahimi 		&& (sizeof(sljit_up) == 4 || sizeof(sljit_up) == 8)
469*22dc650dSSadaf Ebrahimi 		&& sizeof(sljit_up) <= sizeof(sljit_sw)
470*22dc650dSSadaf Ebrahimi 		&& sizeof(sljit_up) == sizeof(sljit_sp)
471*22dc650dSSadaf Ebrahimi 		&& (sizeof(sljit_sw) == 4 || sizeof(sljit_sw) == 8)
472*22dc650dSSadaf Ebrahimi 		&& (sizeof(sljit_uw) == sizeof(sljit_sw)),
473*22dc650dSSadaf Ebrahimi 		invalid_integer_types);
474*22dc650dSSadaf Ebrahimi 	SLJIT_COMPILE_ASSERT(SLJIT_REWRITABLE_JUMP != SLJIT_32,
475*22dc650dSSadaf Ebrahimi 		rewritable_jump_and_single_op_must_not_be_the_same);
476*22dc650dSSadaf Ebrahimi 	SLJIT_COMPILE_ASSERT(!(SLJIT_EQUAL & 0x1) && !(SLJIT_LESS & 0x1) && !(SLJIT_F_EQUAL & 0x1) && !(SLJIT_JUMP & 0x1),
477*22dc650dSSadaf Ebrahimi 		conditional_flags_must_be_even_numbers);
478*22dc650dSSadaf Ebrahimi 
479*22dc650dSSadaf Ebrahimi 	/* Only the non-zero members must be set. */
480*22dc650dSSadaf Ebrahimi 	compiler->error = SLJIT_SUCCESS;
481*22dc650dSSadaf Ebrahimi 
482*22dc650dSSadaf Ebrahimi 	compiler->allocator_data = allocator_data;
483*22dc650dSSadaf Ebrahimi 	compiler->buf = (struct sljit_memory_fragment*)SLJIT_MALLOC(BUF_SIZE, allocator_data);
484*22dc650dSSadaf Ebrahimi 	compiler->abuf = (struct sljit_memory_fragment*)SLJIT_MALLOC(ABUF_SIZE, allocator_data);
485*22dc650dSSadaf Ebrahimi 
486*22dc650dSSadaf Ebrahimi 	if (!compiler->buf || !compiler->abuf) {
487*22dc650dSSadaf Ebrahimi 		if (compiler->buf)
488*22dc650dSSadaf Ebrahimi 			SLJIT_FREE(compiler->buf, allocator_data);
489*22dc650dSSadaf Ebrahimi 		if (compiler->abuf)
490*22dc650dSSadaf Ebrahimi 			SLJIT_FREE(compiler->abuf, allocator_data);
491*22dc650dSSadaf Ebrahimi 		SLJIT_FREE(compiler, allocator_data);
492*22dc650dSSadaf Ebrahimi 		return NULL;
493*22dc650dSSadaf Ebrahimi 	}
494*22dc650dSSadaf Ebrahimi 
495*22dc650dSSadaf Ebrahimi 	compiler->buf->next = NULL;
496*22dc650dSSadaf Ebrahimi 	compiler->buf->used_size = 0;
497*22dc650dSSadaf Ebrahimi 	compiler->abuf->next = NULL;
498*22dc650dSSadaf Ebrahimi 	compiler->abuf->used_size = 0;
499*22dc650dSSadaf Ebrahimi 
500*22dc650dSSadaf Ebrahimi 	compiler->scratches = -1;
501*22dc650dSSadaf Ebrahimi 	compiler->saveds = -1;
502*22dc650dSSadaf Ebrahimi 	compiler->fscratches = -1;
503*22dc650dSSadaf Ebrahimi 	compiler->fsaveds = -1;
504*22dc650dSSadaf Ebrahimi 	compiler->local_size = -1;
505*22dc650dSSadaf Ebrahimi 
506*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
507*22dc650dSSadaf Ebrahimi 	compiler->args_size = -1;
508*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_X86_32 */
509*22dc650dSSadaf Ebrahimi 
510*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
511*22dc650dSSadaf Ebrahimi 	compiler->cpool = (sljit_uw*)SLJIT_MALLOC(CPOOL_SIZE * sizeof(sljit_uw)
512*22dc650dSSadaf Ebrahimi 		+ CPOOL_SIZE * sizeof(sljit_u8), allocator_data);
513*22dc650dSSadaf Ebrahimi 	if (!compiler->cpool) {
514*22dc650dSSadaf Ebrahimi 		SLJIT_FREE(compiler->buf, allocator_data);
515*22dc650dSSadaf Ebrahimi 		SLJIT_FREE(compiler->abuf, allocator_data);
516*22dc650dSSadaf Ebrahimi 		SLJIT_FREE(compiler, allocator_data);
517*22dc650dSSadaf Ebrahimi 		return NULL;
518*22dc650dSSadaf Ebrahimi 	}
519*22dc650dSSadaf Ebrahimi 	compiler->cpool_unique = (sljit_u8*)(compiler->cpool + CPOOL_SIZE);
520*22dc650dSSadaf Ebrahimi 	compiler->cpool_diff = 0xffffffff;
521*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_ARM_V6 */
522*22dc650dSSadaf Ebrahimi 
523*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
524*22dc650dSSadaf Ebrahimi 	compiler->delay_slot = UNMOVABLE_INS;
525*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_MIPS */
526*22dc650dSSadaf Ebrahimi 
527*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \
528*22dc650dSSadaf Ebrahimi 		|| (defined SLJIT_DEBUG && SLJIT_DEBUG)
529*22dc650dSSadaf Ebrahimi 	compiler->last_flags = 0;
530*22dc650dSSadaf Ebrahimi 	compiler->last_return = -1;
531*22dc650dSSadaf Ebrahimi 	compiler->logical_local_size = 0;
532*22dc650dSSadaf Ebrahimi #endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_DEBUG */
533*22dc650dSSadaf Ebrahimi 
534*22dc650dSSadaf Ebrahimi #if (defined SLJIT_NEEDS_COMPILER_INIT && SLJIT_NEEDS_COMPILER_INIT)
535*22dc650dSSadaf Ebrahimi 	if (!compiler_initialized) {
536*22dc650dSSadaf Ebrahimi 		init_compiler();
537*22dc650dSSadaf Ebrahimi 		compiler_initialized = 1;
538*22dc650dSSadaf Ebrahimi 	}
539*22dc650dSSadaf Ebrahimi #endif
540*22dc650dSSadaf Ebrahimi 
541*22dc650dSSadaf Ebrahimi 	return compiler;
542*22dc650dSSadaf Ebrahimi }
543*22dc650dSSadaf Ebrahimi 
sljit_free_compiler(struct sljit_compiler * compiler)544*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler)
545*22dc650dSSadaf Ebrahimi {
546*22dc650dSSadaf Ebrahimi 	struct sljit_memory_fragment *buf;
547*22dc650dSSadaf Ebrahimi 	struct sljit_memory_fragment *curr;
548*22dc650dSSadaf Ebrahimi 	void *allocator_data = compiler->allocator_data;
549*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(allocator_data);
550*22dc650dSSadaf Ebrahimi 
551*22dc650dSSadaf Ebrahimi 	buf = compiler->buf;
552*22dc650dSSadaf Ebrahimi 	while (buf) {
553*22dc650dSSadaf Ebrahimi 		curr = buf;
554*22dc650dSSadaf Ebrahimi 		buf = buf->next;
555*22dc650dSSadaf Ebrahimi 		SLJIT_FREE(curr, allocator_data);
556*22dc650dSSadaf Ebrahimi 	}
557*22dc650dSSadaf Ebrahimi 
558*22dc650dSSadaf Ebrahimi 	buf = compiler->abuf;
559*22dc650dSSadaf Ebrahimi 	while (buf) {
560*22dc650dSSadaf Ebrahimi 		curr = buf;
561*22dc650dSSadaf Ebrahimi 		buf = buf->next;
562*22dc650dSSadaf Ebrahimi 		SLJIT_FREE(curr, allocator_data);
563*22dc650dSSadaf Ebrahimi 	}
564*22dc650dSSadaf Ebrahimi 
565*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
566*22dc650dSSadaf Ebrahimi 	SLJIT_FREE(compiler->cpool, allocator_data);
567*22dc650dSSadaf Ebrahimi #endif
568*22dc650dSSadaf Ebrahimi 	SLJIT_FREE(compiler, allocator_data);
569*22dc650dSSadaf Ebrahimi }
570*22dc650dSSadaf Ebrahimi 
sljit_set_compiler_memory_error(struct sljit_compiler * compiler)571*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE void sljit_set_compiler_memory_error(struct sljit_compiler *compiler)
572*22dc650dSSadaf Ebrahimi {
573*22dc650dSSadaf Ebrahimi 	if (compiler->error == SLJIT_SUCCESS)
574*22dc650dSSadaf Ebrahimi 		compiler->error = SLJIT_ERR_ALLOC_FAILED;
575*22dc650dSSadaf Ebrahimi }
576*22dc650dSSadaf Ebrahimi 
sljit_free_code(void * code,void * exec_allocator_data)577*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code, void *exec_allocator_data)
578*22dc650dSSadaf Ebrahimi {
579*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(exec_allocator_data);
580*22dc650dSSadaf Ebrahimi 
581*22dc650dSSadaf Ebrahimi 	SLJIT_FREE_EXEC(SLJIT_CODE_TO_PTR(code), exec_allocator_data);
582*22dc650dSSadaf Ebrahimi }
583*22dc650dSSadaf Ebrahimi 
sljit_set_label(struct sljit_jump * jump,struct sljit_label * label)584*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label)
585*22dc650dSSadaf Ebrahimi {
586*22dc650dSSadaf Ebrahimi 	if (SLJIT_LIKELY(!!jump) && SLJIT_LIKELY(!!label)) {
587*22dc650dSSadaf Ebrahimi 		jump->flags &= (sljit_uw)~JUMP_ADDR;
588*22dc650dSSadaf Ebrahimi 		jump->u.label = label;
589*22dc650dSSadaf Ebrahimi 	}
590*22dc650dSSadaf Ebrahimi }
591*22dc650dSSadaf Ebrahimi 
sljit_set_target(struct sljit_jump * jump,sljit_uw target)592*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target)
593*22dc650dSSadaf Ebrahimi {
594*22dc650dSSadaf Ebrahimi 	if (SLJIT_LIKELY(!!jump)) {
595*22dc650dSSadaf Ebrahimi 		jump->flags |= JUMP_ADDR;
596*22dc650dSSadaf Ebrahimi 		jump->u.target = target;
597*22dc650dSSadaf Ebrahimi 	}
598*22dc650dSSadaf Ebrahimi }
599*22dc650dSSadaf Ebrahimi 
600*22dc650dSSadaf Ebrahimi #define SLJIT_CURRENT_FLAGS_ALL \
601*22dc650dSSadaf Ebrahimi 	(SLJIT_CURRENT_FLAGS_32 | SLJIT_CURRENT_FLAGS_ADD | SLJIT_CURRENT_FLAGS_SUB | SLJIT_CURRENT_FLAGS_COMPARE)
602*22dc650dSSadaf Ebrahimi 
sljit_set_current_flags(struct sljit_compiler * compiler,sljit_s32 current_flags)603*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags)
604*22dc650dSSadaf Ebrahimi {
605*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(compiler);
606*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(current_flags);
607*22dc650dSSadaf Ebrahimi 
608*22dc650dSSadaf Ebrahimi #if (defined SLJIT_HAS_STATUS_FLAGS_STATE && SLJIT_HAS_STATUS_FLAGS_STATE)
609*22dc650dSSadaf Ebrahimi 	compiler->status_flags_state = current_flags;
610*22dc650dSSadaf Ebrahimi #endif
611*22dc650dSSadaf Ebrahimi 
612*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
613*22dc650dSSadaf Ebrahimi 	compiler->last_flags = 0;
614*22dc650dSSadaf Ebrahimi 	if ((current_flags & ~(VARIABLE_FLAG_MASK | SLJIT_SET_Z | SLJIT_CURRENT_FLAGS_ALL)) == 0) {
615*22dc650dSSadaf Ebrahimi 		compiler->last_flags = GET_FLAG_TYPE(current_flags) | (current_flags & (SLJIT_32 | SLJIT_SET_Z));
616*22dc650dSSadaf Ebrahimi 	}
617*22dc650dSSadaf Ebrahimi #endif
618*22dc650dSSadaf Ebrahimi }
619*22dc650dSSadaf Ebrahimi 
620*22dc650dSSadaf Ebrahimi /* --------------------------------------------------------------------- */
621*22dc650dSSadaf Ebrahimi /*  Private functions                                                    */
622*22dc650dSSadaf Ebrahimi /* --------------------------------------------------------------------- */
623*22dc650dSSadaf Ebrahimi 
ensure_buf(struct sljit_compiler * compiler,sljit_uw size)624*22dc650dSSadaf Ebrahimi static void* ensure_buf(struct sljit_compiler *compiler, sljit_uw size)
625*22dc650dSSadaf Ebrahimi {
626*22dc650dSSadaf Ebrahimi 	sljit_u8 *ret;
627*22dc650dSSadaf Ebrahimi 	struct sljit_memory_fragment *new_frag;
628*22dc650dSSadaf Ebrahimi 
629*22dc650dSSadaf Ebrahimi 	SLJIT_ASSERT(size <= 256);
630*22dc650dSSadaf Ebrahimi 	if (compiler->buf->used_size + size <= (BUF_SIZE - (sljit_uw)SLJIT_OFFSETOF(struct sljit_memory_fragment, memory))) {
631*22dc650dSSadaf Ebrahimi 		ret = compiler->buf->memory + compiler->buf->used_size;
632*22dc650dSSadaf Ebrahimi 		compiler->buf->used_size += size;
633*22dc650dSSadaf Ebrahimi 		return ret;
634*22dc650dSSadaf Ebrahimi 	}
635*22dc650dSSadaf Ebrahimi 	new_frag = (struct sljit_memory_fragment*)SLJIT_MALLOC(BUF_SIZE, compiler->allocator_data);
636*22dc650dSSadaf Ebrahimi 	PTR_FAIL_IF_NULL(new_frag);
637*22dc650dSSadaf Ebrahimi 	new_frag->next = compiler->buf;
638*22dc650dSSadaf Ebrahimi 	compiler->buf = new_frag;
639*22dc650dSSadaf Ebrahimi 	new_frag->used_size = size;
640*22dc650dSSadaf Ebrahimi 	return new_frag->memory;
641*22dc650dSSadaf Ebrahimi }
642*22dc650dSSadaf Ebrahimi 
ensure_abuf(struct sljit_compiler * compiler,sljit_uw size)643*22dc650dSSadaf Ebrahimi static void* ensure_abuf(struct sljit_compiler *compiler, sljit_uw size)
644*22dc650dSSadaf Ebrahimi {
645*22dc650dSSadaf Ebrahimi 	sljit_u8 *ret;
646*22dc650dSSadaf Ebrahimi 	struct sljit_memory_fragment *new_frag;
647*22dc650dSSadaf Ebrahimi 
648*22dc650dSSadaf Ebrahimi 	SLJIT_ASSERT(size <= 256);
649*22dc650dSSadaf Ebrahimi 	if (compiler->abuf->used_size + size <= (ABUF_SIZE - (sljit_uw)SLJIT_OFFSETOF(struct sljit_memory_fragment, memory))) {
650*22dc650dSSadaf Ebrahimi 		ret = compiler->abuf->memory + compiler->abuf->used_size;
651*22dc650dSSadaf Ebrahimi 		compiler->abuf->used_size += size;
652*22dc650dSSadaf Ebrahimi 		return ret;
653*22dc650dSSadaf Ebrahimi 	}
654*22dc650dSSadaf Ebrahimi 	new_frag = (struct sljit_memory_fragment*)SLJIT_MALLOC(ABUF_SIZE, compiler->allocator_data);
655*22dc650dSSadaf Ebrahimi 	PTR_FAIL_IF_NULL(new_frag);
656*22dc650dSSadaf Ebrahimi 	new_frag->next = compiler->abuf;
657*22dc650dSSadaf Ebrahimi 	compiler->abuf = new_frag;
658*22dc650dSSadaf Ebrahimi 	new_frag->used_size = size;
659*22dc650dSSadaf Ebrahimi 	return new_frag->memory;
660*22dc650dSSadaf Ebrahimi }
661*22dc650dSSadaf Ebrahimi 
sljit_alloc_memory(struct sljit_compiler * compiler,sljit_s32 size)662*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, sljit_s32 size)
663*22dc650dSSadaf Ebrahimi {
664*22dc650dSSadaf Ebrahimi 	CHECK_ERROR_PTR();
665*22dc650dSSadaf Ebrahimi 
666*22dc650dSSadaf Ebrahimi #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
667*22dc650dSSadaf Ebrahimi 	if (size <= 0 || size > 128)
668*22dc650dSSadaf Ebrahimi 		return NULL;
669*22dc650dSSadaf Ebrahimi 	size = (size + 7) & ~7;
670*22dc650dSSadaf Ebrahimi #else
671*22dc650dSSadaf Ebrahimi 	if (size <= 0 || size > 64)
672*22dc650dSSadaf Ebrahimi 		return NULL;
673*22dc650dSSadaf Ebrahimi 	size = (size + 3) & ~3;
674*22dc650dSSadaf Ebrahimi #endif
675*22dc650dSSadaf Ebrahimi 	return ensure_abuf(compiler, (sljit_uw)size);
676*22dc650dSSadaf Ebrahimi }
677*22dc650dSSadaf Ebrahimi 
reverse_buf(struct sljit_compiler * compiler)678*22dc650dSSadaf Ebrahimi static SLJIT_INLINE void reverse_buf(struct sljit_compiler *compiler)
679*22dc650dSSadaf Ebrahimi {
680*22dc650dSSadaf Ebrahimi 	struct sljit_memory_fragment *buf = compiler->buf;
681*22dc650dSSadaf Ebrahimi 	struct sljit_memory_fragment *prev = NULL;
682*22dc650dSSadaf Ebrahimi 	struct sljit_memory_fragment *tmp;
683*22dc650dSSadaf Ebrahimi 
684*22dc650dSSadaf Ebrahimi 	do {
685*22dc650dSSadaf Ebrahimi 		tmp = buf->next;
686*22dc650dSSadaf Ebrahimi 		buf->next = prev;
687*22dc650dSSadaf Ebrahimi 		prev = buf;
688*22dc650dSSadaf Ebrahimi 		buf = tmp;
689*22dc650dSSadaf Ebrahimi 	} while (buf != NULL);
690*22dc650dSSadaf Ebrahimi 
691*22dc650dSSadaf Ebrahimi 	compiler->buf = prev;
692*22dc650dSSadaf Ebrahimi }
693*22dc650dSSadaf Ebrahimi 
allocate_executable_memory(sljit_uw size,sljit_s32 options,void * exec_allocator_data,sljit_sw * executable_offset)694*22dc650dSSadaf Ebrahimi static SLJIT_INLINE void* allocate_executable_memory(sljit_uw size, sljit_s32 options,
695*22dc650dSSadaf Ebrahimi 	void *exec_allocator_data, sljit_sw *executable_offset)
696*22dc650dSSadaf Ebrahimi {
697*22dc650dSSadaf Ebrahimi 	void *code;
698*22dc650dSSadaf Ebrahimi 	struct sljit_generate_code_buffer *buffer;
699*22dc650dSSadaf Ebrahimi 
700*22dc650dSSadaf Ebrahimi 	if (SLJIT_LIKELY(!(options & SLJIT_GENERATE_CODE_BUFFER))) {
701*22dc650dSSadaf Ebrahimi 		code = SLJIT_MALLOC_EXEC(size, exec_allocator_data);
702*22dc650dSSadaf Ebrahimi 		*executable_offset = SLJIT_EXEC_OFFSET(code);
703*22dc650dSSadaf Ebrahimi 		return code;
704*22dc650dSSadaf Ebrahimi 	}
705*22dc650dSSadaf Ebrahimi 
706*22dc650dSSadaf Ebrahimi 	buffer = (struct sljit_generate_code_buffer*)exec_allocator_data;
707*22dc650dSSadaf Ebrahimi 
708*22dc650dSSadaf Ebrahimi 	if (size <= buffer->size) {
709*22dc650dSSadaf Ebrahimi 		*executable_offset = buffer->executable_offset;
710*22dc650dSSadaf Ebrahimi 		return buffer->buffer;
711*22dc650dSSadaf Ebrahimi 	}
712*22dc650dSSadaf Ebrahimi 
713*22dc650dSSadaf Ebrahimi 	return NULL;
714*22dc650dSSadaf Ebrahimi }
715*22dc650dSSadaf Ebrahimi 
716*22dc650dSSadaf Ebrahimi #define SLJIT_MAX_ADDRESS ~(sljit_uw)0
717*22dc650dSSadaf Ebrahimi 
718*22dc650dSSadaf Ebrahimi #define SLJIT_GET_NEXT_SIZE(ptr) (ptr != NULL) ? ((ptr)->size) : SLJIT_MAX_ADDRESS
719*22dc650dSSadaf Ebrahimi #define SLJIT_GET_NEXT_ADDRESS(ptr) (ptr != NULL) ? ((ptr)->addr) : SLJIT_MAX_ADDRESS
720*22dc650dSSadaf Ebrahimi 
721*22dc650dSSadaf Ebrahimi #if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
722*22dc650dSSadaf Ebrahimi 
723*22dc650dSSadaf Ebrahimi #define SLJIT_NEXT_DEFINE_TYPES \
724*22dc650dSSadaf Ebrahimi 	sljit_uw next_label_size; \
725*22dc650dSSadaf Ebrahimi 	sljit_uw next_jump_addr; \
726*22dc650dSSadaf Ebrahimi 	sljit_uw next_const_addr; \
727*22dc650dSSadaf Ebrahimi 	sljit_uw next_min_addr
728*22dc650dSSadaf Ebrahimi 
729*22dc650dSSadaf Ebrahimi #define SLJIT_NEXT_INIT_TYPES() \
730*22dc650dSSadaf Ebrahimi 	next_label_size = SLJIT_GET_NEXT_SIZE(label); \
731*22dc650dSSadaf Ebrahimi 	next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump); \
732*22dc650dSSadaf Ebrahimi 	next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_);
733*22dc650dSSadaf Ebrahimi 
734*22dc650dSSadaf Ebrahimi #define SLJIT_GET_NEXT_MIN() \
735*22dc650dSSadaf Ebrahimi 	next_min_addr = sljit_get_next_min(next_label_size, next_jump_addr, next_const_addr);
736*22dc650dSSadaf Ebrahimi 
sljit_get_next_min(sljit_uw next_label_size,sljit_uw next_jump_addr,sljit_uw next_const_addr)737*22dc650dSSadaf Ebrahimi static SLJIT_INLINE sljit_uw sljit_get_next_min(sljit_uw next_label_size,
738*22dc650dSSadaf Ebrahimi 	sljit_uw next_jump_addr, sljit_uw next_const_addr)
739*22dc650dSSadaf Ebrahimi {
740*22dc650dSSadaf Ebrahimi 	sljit_uw result = next_jump_addr;
741*22dc650dSSadaf Ebrahimi 
742*22dc650dSSadaf Ebrahimi 	SLJIT_ASSERT(result == SLJIT_MAX_ADDRESS || result != next_const_addr);
743*22dc650dSSadaf Ebrahimi 
744*22dc650dSSadaf Ebrahimi 	if (next_const_addr < result)
745*22dc650dSSadaf Ebrahimi 		result = next_const_addr;
746*22dc650dSSadaf Ebrahimi 
747*22dc650dSSadaf Ebrahimi 	if (next_label_size < result)
748*22dc650dSSadaf Ebrahimi 		result = next_label_size;
749*22dc650dSSadaf Ebrahimi 
750*22dc650dSSadaf Ebrahimi 	return result;
751*22dc650dSSadaf Ebrahimi }
752*22dc650dSSadaf Ebrahimi 
753*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_CONFIG_X86 */
754*22dc650dSSadaf Ebrahimi 
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)755*22dc650dSSadaf Ebrahimi static SLJIT_INLINE void set_emit_enter(struct sljit_compiler *compiler,
756*22dc650dSSadaf Ebrahimi 	sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
757*22dc650dSSadaf Ebrahimi 	sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
758*22dc650dSSadaf Ebrahimi {
759*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(args);
760*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(local_size);
761*22dc650dSSadaf Ebrahimi 
762*22dc650dSSadaf Ebrahimi 	compiler->options = options;
763*22dc650dSSadaf Ebrahimi 	compiler->scratches = scratches;
764*22dc650dSSadaf Ebrahimi 	compiler->saveds = saveds;
765*22dc650dSSadaf Ebrahimi 	compiler->fscratches = fscratches;
766*22dc650dSSadaf Ebrahimi 	compiler->fsaveds = fsaveds;
767*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
768*22dc650dSSadaf Ebrahimi 	compiler->last_return = args & SLJIT_ARG_MASK;
769*22dc650dSSadaf Ebrahimi 	compiler->logical_local_size = local_size;
770*22dc650dSSadaf Ebrahimi #endif
771*22dc650dSSadaf Ebrahimi }
772*22dc650dSSadaf Ebrahimi 
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)773*22dc650dSSadaf Ebrahimi static SLJIT_INLINE void set_set_context(struct sljit_compiler *compiler,
774*22dc650dSSadaf Ebrahimi 	sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
775*22dc650dSSadaf Ebrahimi 	sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
776*22dc650dSSadaf Ebrahimi {
777*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(args);
778*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(local_size);
779*22dc650dSSadaf Ebrahimi 
780*22dc650dSSadaf Ebrahimi 	compiler->options = options;
781*22dc650dSSadaf Ebrahimi 	compiler->scratches = scratches;
782*22dc650dSSadaf Ebrahimi 	compiler->saveds = saveds;
783*22dc650dSSadaf Ebrahimi 	compiler->fscratches = fscratches;
784*22dc650dSSadaf Ebrahimi 	compiler->fsaveds = fsaveds;
785*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
786*22dc650dSSadaf Ebrahimi 	compiler->last_return = args & SLJIT_ARG_MASK;
787*22dc650dSSadaf Ebrahimi 	compiler->logical_local_size = local_size;
788*22dc650dSSadaf Ebrahimi #endif
789*22dc650dSSadaf Ebrahimi }
790*22dc650dSSadaf Ebrahimi 
set_label(struct sljit_label * label,struct sljit_compiler * compiler)791*22dc650dSSadaf Ebrahimi static SLJIT_INLINE void set_label(struct sljit_label *label, struct sljit_compiler *compiler)
792*22dc650dSSadaf Ebrahimi {
793*22dc650dSSadaf Ebrahimi 	label->next = NULL;
794*22dc650dSSadaf Ebrahimi 	label->u.index = compiler->label_count++;
795*22dc650dSSadaf Ebrahimi 	label->size = compiler->size;
796*22dc650dSSadaf Ebrahimi 	if (compiler->last_label != NULL)
797*22dc650dSSadaf Ebrahimi 		compiler->last_label->next = label;
798*22dc650dSSadaf Ebrahimi 	else
799*22dc650dSSadaf Ebrahimi 		compiler->labels = label;
800*22dc650dSSadaf Ebrahimi 	compiler->last_label = label;
801*22dc650dSSadaf Ebrahimi }
802*22dc650dSSadaf Ebrahimi 
set_jump(struct sljit_jump * jump,struct sljit_compiler * compiler,sljit_u32 flags)803*22dc650dSSadaf Ebrahimi static SLJIT_INLINE void set_jump(struct sljit_jump *jump, struct sljit_compiler *compiler, sljit_u32 flags)
804*22dc650dSSadaf Ebrahimi {
805*22dc650dSSadaf Ebrahimi 	jump->next = NULL;
806*22dc650dSSadaf Ebrahimi 	jump->flags = flags;
807*22dc650dSSadaf Ebrahimi 	jump->u.label = NULL;
808*22dc650dSSadaf Ebrahimi 	if (compiler->last_jump != NULL)
809*22dc650dSSadaf Ebrahimi 		compiler->last_jump->next = jump;
810*22dc650dSSadaf Ebrahimi 	else
811*22dc650dSSadaf Ebrahimi 		compiler->jumps = jump;
812*22dc650dSSadaf Ebrahimi 	compiler->last_jump = jump;
813*22dc650dSSadaf Ebrahimi }
814*22dc650dSSadaf Ebrahimi 
set_mov_addr(struct sljit_jump * jump,struct sljit_compiler * compiler,sljit_uw offset)815*22dc650dSSadaf Ebrahimi static SLJIT_INLINE void set_mov_addr(struct sljit_jump *jump, struct sljit_compiler *compiler, sljit_uw offset)
816*22dc650dSSadaf Ebrahimi {
817*22dc650dSSadaf Ebrahimi 	jump->next = NULL;
818*22dc650dSSadaf Ebrahimi 	jump->addr = compiler->size - offset;
819*22dc650dSSadaf Ebrahimi 	jump->flags = JUMP_MOV_ADDR;
820*22dc650dSSadaf Ebrahimi 	jump->u.label = NULL;
821*22dc650dSSadaf Ebrahimi 	if (compiler->last_jump != NULL)
822*22dc650dSSadaf Ebrahimi 		compiler->last_jump->next = jump;
823*22dc650dSSadaf Ebrahimi 	else
824*22dc650dSSadaf Ebrahimi 		compiler->jumps = jump;
825*22dc650dSSadaf Ebrahimi 	compiler->last_jump = jump;
826*22dc650dSSadaf Ebrahimi }
827*22dc650dSSadaf Ebrahimi 
set_const(struct sljit_const * const_,struct sljit_compiler * compiler)828*22dc650dSSadaf Ebrahimi static SLJIT_INLINE void set_const(struct sljit_const *const_, struct sljit_compiler *compiler)
829*22dc650dSSadaf Ebrahimi {
830*22dc650dSSadaf Ebrahimi 	const_->next = NULL;
831*22dc650dSSadaf Ebrahimi 	const_->addr = compiler->size;
832*22dc650dSSadaf Ebrahimi 	if (compiler->last_const != NULL)
833*22dc650dSSadaf Ebrahimi 		compiler->last_const->next = const_;
834*22dc650dSSadaf Ebrahimi 	else
835*22dc650dSSadaf Ebrahimi 		compiler->consts = const_;
836*22dc650dSSadaf Ebrahimi 	compiler->last_const = const_;
837*22dc650dSSadaf Ebrahimi }
838*22dc650dSSadaf Ebrahimi 
839*22dc650dSSadaf Ebrahimi #define ADDRESSING_DEPENDS_ON(exp, reg) \
840*22dc650dSSadaf Ebrahimi 	(((exp) & SLJIT_MEM) && (((exp) & REG_MASK) == reg || OFFS_REG(exp) == reg))
841*22dc650dSSadaf Ebrahimi 
842*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
843*22dc650dSSadaf Ebrahimi 
function_check_arguments(sljit_s32 arg_types,sljit_s32 scratches,sljit_s32 saveds,sljit_s32 fscratches)844*22dc650dSSadaf Ebrahimi static sljit_s32 function_check_arguments(sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, sljit_s32 fscratches)
845*22dc650dSSadaf Ebrahimi {
846*22dc650dSSadaf Ebrahimi 	sljit_s32 word_arg_count, scratch_arg_end, saved_arg_count, float_arg_count, curr_type;
847*22dc650dSSadaf Ebrahimi 
848*22dc650dSSadaf Ebrahimi 	curr_type = (arg_types & SLJIT_ARG_FULL_MASK);
849*22dc650dSSadaf Ebrahimi 
850*22dc650dSSadaf Ebrahimi 	if (curr_type >= SLJIT_ARG_TYPE_F64) {
851*22dc650dSSadaf Ebrahimi 		if (curr_type > SLJIT_ARG_TYPE_F32 || fscratches == 0)
852*22dc650dSSadaf Ebrahimi 			return 0;
853*22dc650dSSadaf Ebrahimi 	} else if (curr_type >= SLJIT_ARG_TYPE_W) {
854*22dc650dSSadaf Ebrahimi 		if (scratches == 0)
855*22dc650dSSadaf Ebrahimi 			return 0;
856*22dc650dSSadaf Ebrahimi 	}
857*22dc650dSSadaf Ebrahimi 
858*22dc650dSSadaf Ebrahimi 	arg_types >>= SLJIT_ARG_SHIFT;
859*22dc650dSSadaf Ebrahimi 
860*22dc650dSSadaf Ebrahimi 	word_arg_count = 0;
861*22dc650dSSadaf Ebrahimi 	scratch_arg_end = 0;
862*22dc650dSSadaf Ebrahimi 	saved_arg_count = 0;
863*22dc650dSSadaf Ebrahimi 	float_arg_count = 0;
864*22dc650dSSadaf Ebrahimi 	while (arg_types != 0) {
865*22dc650dSSadaf Ebrahimi 		if (word_arg_count + float_arg_count >= 4)
866*22dc650dSSadaf Ebrahimi 			return 0;
867*22dc650dSSadaf Ebrahimi 
868*22dc650dSSadaf Ebrahimi 		curr_type = (arg_types & SLJIT_ARG_MASK);
869*22dc650dSSadaf Ebrahimi 
870*22dc650dSSadaf Ebrahimi 		if (arg_types & SLJIT_ARG_TYPE_SCRATCH_REG) {
871*22dc650dSSadaf Ebrahimi 			if (saveds == -1 || curr_type < SLJIT_ARG_TYPE_W || curr_type > SLJIT_ARG_TYPE_P)
872*22dc650dSSadaf Ebrahimi 				return 0;
873*22dc650dSSadaf Ebrahimi 
874*22dc650dSSadaf Ebrahimi 			word_arg_count++;
875*22dc650dSSadaf Ebrahimi 			scratch_arg_end = word_arg_count;
876*22dc650dSSadaf Ebrahimi 		} else {
877*22dc650dSSadaf Ebrahimi 			if (curr_type < SLJIT_ARG_TYPE_W || curr_type > SLJIT_ARG_TYPE_F32)
878*22dc650dSSadaf Ebrahimi 				return 0;
879*22dc650dSSadaf Ebrahimi 
880*22dc650dSSadaf Ebrahimi 			if (curr_type < SLJIT_ARG_TYPE_F64) {
881*22dc650dSSadaf Ebrahimi 				word_arg_count++;
882*22dc650dSSadaf Ebrahimi 				saved_arg_count++;
883*22dc650dSSadaf Ebrahimi 			} else
884*22dc650dSSadaf Ebrahimi 				float_arg_count++;
885*22dc650dSSadaf Ebrahimi 		}
886*22dc650dSSadaf Ebrahimi 
887*22dc650dSSadaf Ebrahimi 		arg_types >>= SLJIT_ARG_SHIFT;
888*22dc650dSSadaf Ebrahimi 	}
889*22dc650dSSadaf Ebrahimi 
890*22dc650dSSadaf Ebrahimi 	if (saveds == -1)
891*22dc650dSSadaf Ebrahimi 		return (word_arg_count <= scratches && float_arg_count <= fscratches);
892*22dc650dSSadaf Ebrahimi 
893*22dc650dSSadaf Ebrahimi 	return (saved_arg_count <= saveds && scratch_arg_end <= scratches && float_arg_count <= fscratches);
894*22dc650dSSadaf Ebrahimi }
895*22dc650dSSadaf Ebrahimi 
896*22dc650dSSadaf Ebrahimi #define FUNCTION_CHECK_IS_REG(r) \
897*22dc650dSSadaf Ebrahimi 	(((r) >= SLJIT_R0 && (r) < (SLJIT_R0 + compiler->scratches)) \
898*22dc650dSSadaf Ebrahimi 	|| ((r) > (SLJIT_S0 - compiler->saveds) && (r) <= SLJIT_S0) \
899*22dc650dSSadaf Ebrahimi 	|| ((r) >= SLJIT_TMP_REGISTER_BASE && (r) < (SLJIT_TMP_REGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_REGISTERS)))
900*22dc650dSSadaf Ebrahimi 
901*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
902*22dc650dSSadaf Ebrahimi #define CHECK_IF_VIRTUAL_REGISTER(p) ((p) <= SLJIT_S3 && (p) >= SLJIT_S8)
903*22dc650dSSadaf Ebrahimi #else
904*22dc650dSSadaf Ebrahimi #define CHECK_IF_VIRTUAL_REGISTER(p) 0
905*22dc650dSSadaf Ebrahimi #endif
906*22dc650dSSadaf Ebrahimi 
function_check_src_mem(struct sljit_compiler * compiler,sljit_s32 p,sljit_sw i)907*22dc650dSSadaf Ebrahimi static sljit_s32 function_check_src_mem(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)
908*22dc650dSSadaf Ebrahimi {
909*22dc650dSSadaf Ebrahimi 	if (compiler->scratches == -1)
910*22dc650dSSadaf Ebrahimi 		return 0;
911*22dc650dSSadaf Ebrahimi 
912*22dc650dSSadaf Ebrahimi 	if (!(p & SLJIT_MEM))
913*22dc650dSSadaf Ebrahimi 		return 0;
914*22dc650dSSadaf Ebrahimi 
915*22dc650dSSadaf Ebrahimi 	if (p == SLJIT_MEM1(SLJIT_SP))
916*22dc650dSSadaf Ebrahimi 		return (i >= 0 && i < compiler->logical_local_size);
917*22dc650dSSadaf Ebrahimi 
918*22dc650dSSadaf Ebrahimi 	if (!(!(p & REG_MASK) || FUNCTION_CHECK_IS_REG(p & REG_MASK)))
919*22dc650dSSadaf Ebrahimi 		return 0;
920*22dc650dSSadaf Ebrahimi 
921*22dc650dSSadaf Ebrahimi 	if (CHECK_IF_VIRTUAL_REGISTER(p & REG_MASK))
922*22dc650dSSadaf Ebrahimi 		return 0;
923*22dc650dSSadaf Ebrahimi 
924*22dc650dSSadaf Ebrahimi 	if (p & OFFS_REG_MASK) {
925*22dc650dSSadaf Ebrahimi 		if (!(p & REG_MASK))
926*22dc650dSSadaf Ebrahimi 			return 0;
927*22dc650dSSadaf Ebrahimi 
928*22dc650dSSadaf Ebrahimi 		if (!(FUNCTION_CHECK_IS_REG(OFFS_REG(p))))
929*22dc650dSSadaf Ebrahimi 			return 0;
930*22dc650dSSadaf Ebrahimi 
931*22dc650dSSadaf Ebrahimi 		if (CHECK_IF_VIRTUAL_REGISTER(OFFS_REG(p)))
932*22dc650dSSadaf Ebrahimi 			return 0;
933*22dc650dSSadaf Ebrahimi 
934*22dc650dSSadaf Ebrahimi 		if ((i & ~0x3) != 0)
935*22dc650dSSadaf Ebrahimi 			return 0;
936*22dc650dSSadaf Ebrahimi 	}
937*22dc650dSSadaf Ebrahimi 
938*22dc650dSSadaf Ebrahimi 	return (p & ~(SLJIT_MEM | REG_MASK | OFFS_REG_MASK)) == 0;
939*22dc650dSSadaf Ebrahimi }
940*22dc650dSSadaf Ebrahimi 
941*22dc650dSSadaf Ebrahimi #define FUNCTION_CHECK_SRC_MEM(p, i) \
942*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(function_check_src_mem(compiler, p, i));
943*22dc650dSSadaf Ebrahimi 
function_check_src(struct sljit_compiler * compiler,sljit_s32 p,sljit_sw i)944*22dc650dSSadaf Ebrahimi static sljit_s32 function_check_src(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)
945*22dc650dSSadaf Ebrahimi {
946*22dc650dSSadaf Ebrahimi 	if (compiler->scratches == -1)
947*22dc650dSSadaf Ebrahimi 		return 0;
948*22dc650dSSadaf Ebrahimi 
949*22dc650dSSadaf Ebrahimi 	if (FUNCTION_CHECK_IS_REG(p))
950*22dc650dSSadaf Ebrahimi 		return (i == 0);
951*22dc650dSSadaf Ebrahimi 
952*22dc650dSSadaf Ebrahimi 	if (p == SLJIT_IMM)
953*22dc650dSSadaf Ebrahimi 		return 1;
954*22dc650dSSadaf Ebrahimi 
955*22dc650dSSadaf Ebrahimi 	return function_check_src_mem(compiler, p, i);
956*22dc650dSSadaf Ebrahimi }
957*22dc650dSSadaf Ebrahimi 
958*22dc650dSSadaf Ebrahimi #define FUNCTION_CHECK_SRC(p, i) \
959*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(function_check_src(compiler, p, i));
960*22dc650dSSadaf Ebrahimi 
function_check_dst(struct sljit_compiler * compiler,sljit_s32 p,sljit_sw i)961*22dc650dSSadaf Ebrahimi static sljit_s32 function_check_dst(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)
962*22dc650dSSadaf Ebrahimi {
963*22dc650dSSadaf Ebrahimi 	if (compiler->scratches == -1)
964*22dc650dSSadaf Ebrahimi 		return 0;
965*22dc650dSSadaf Ebrahimi 
966*22dc650dSSadaf Ebrahimi 	if (FUNCTION_CHECK_IS_REG(p))
967*22dc650dSSadaf Ebrahimi 		return (i == 0);
968*22dc650dSSadaf Ebrahimi 
969*22dc650dSSadaf Ebrahimi 	return function_check_src_mem(compiler, p, i);
970*22dc650dSSadaf Ebrahimi }
971*22dc650dSSadaf Ebrahimi 
972*22dc650dSSadaf Ebrahimi #define FUNCTION_CHECK_DST(p, i) \
973*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(function_check_dst(compiler, p, i));
974*22dc650dSSadaf Ebrahimi 
975*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \
976*22dc650dSSadaf Ebrahimi 	|| (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
977*22dc650dSSadaf Ebrahimi 
978*22dc650dSSadaf Ebrahimi #define FUNCTION_CHECK_IS_FREG(fr, is_32) \
979*22dc650dSSadaf Ebrahimi 	function_check_is_freg(compiler, (fr), (is_32))
980*22dc650dSSadaf Ebrahimi 
981*22dc650dSSadaf Ebrahimi static sljit_s32 function_check_is_freg(struct sljit_compiler *compiler, sljit_s32 fr, sljit_s32 is_32);
982*22dc650dSSadaf Ebrahimi 
983*22dc650dSSadaf Ebrahimi #define FUNCTION_FCHECK(p, i, is_32) \
984*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(function_fcheck(compiler, (p), (i), (is_32)));
985*22dc650dSSadaf Ebrahimi 
function_fcheck(struct sljit_compiler * compiler,sljit_s32 p,sljit_sw i,sljit_s32 is_32)986*22dc650dSSadaf Ebrahimi static sljit_s32 function_fcheck(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i, sljit_s32 is_32)
987*22dc650dSSadaf Ebrahimi {
988*22dc650dSSadaf Ebrahimi 	if (compiler->scratches == -1)
989*22dc650dSSadaf Ebrahimi 		return 0;
990*22dc650dSSadaf Ebrahimi 
991*22dc650dSSadaf Ebrahimi 	if (FUNCTION_CHECK_IS_FREG(p, is_32))
992*22dc650dSSadaf Ebrahimi 		return (i == 0);
993*22dc650dSSadaf Ebrahimi 
994*22dc650dSSadaf Ebrahimi 	return function_check_src_mem(compiler, p, i);
995*22dc650dSSadaf Ebrahimi }
996*22dc650dSSadaf Ebrahimi 
997*22dc650dSSadaf Ebrahimi #else /* !SLJIT_CONFIG_ARM_32 && !SLJIT_CONFIG_MIPS_32 */
998*22dc650dSSadaf Ebrahimi #define FUNCTION_CHECK_IS_FREG(fr, is_32) \
999*22dc650dSSadaf Ebrahimi 	function_check_is_freg(compiler, (fr))
1000*22dc650dSSadaf Ebrahimi 
function_check_is_freg(struct sljit_compiler * compiler,sljit_s32 fr)1001*22dc650dSSadaf Ebrahimi static sljit_s32 function_check_is_freg(struct sljit_compiler *compiler, sljit_s32 fr)
1002*22dc650dSSadaf Ebrahimi {
1003*22dc650dSSadaf Ebrahimi 	if (compiler->scratches == -1)
1004*22dc650dSSadaf Ebrahimi 		return 0;
1005*22dc650dSSadaf Ebrahimi 
1006*22dc650dSSadaf Ebrahimi 	return (fr >= SLJIT_FR0 && fr < (SLJIT_FR0 + compiler->fscratches))
1007*22dc650dSSadaf Ebrahimi 		|| (fr > (SLJIT_FS0 - compiler->fsaveds) && fr <= SLJIT_FS0)
1008*22dc650dSSadaf Ebrahimi 		|| (fr >= SLJIT_TMP_FREGISTER_BASE && fr < (SLJIT_TMP_FREGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS));
1009*22dc650dSSadaf Ebrahimi }
1010*22dc650dSSadaf Ebrahimi 
1011*22dc650dSSadaf Ebrahimi #define FUNCTION_FCHECK(p, i, is_32) \
1012*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(function_fcheck(compiler, (p), (i)));
1013*22dc650dSSadaf Ebrahimi 
function_fcheck(struct sljit_compiler * compiler,sljit_s32 p,sljit_sw i)1014*22dc650dSSadaf Ebrahimi static sljit_s32 function_fcheck(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)
1015*22dc650dSSadaf Ebrahimi {
1016*22dc650dSSadaf Ebrahimi 	if (compiler->scratches == -1)
1017*22dc650dSSadaf Ebrahimi 		return 0;
1018*22dc650dSSadaf Ebrahimi 
1019*22dc650dSSadaf Ebrahimi 	if ((p >= SLJIT_FR0 && p < (SLJIT_FR0 + compiler->fscratches))
1020*22dc650dSSadaf Ebrahimi 			|| (p > (SLJIT_FS0 - compiler->fsaveds) && p <= SLJIT_FS0)
1021*22dc650dSSadaf Ebrahimi 			|| (p >= SLJIT_TMP_FREGISTER_BASE && p < (SLJIT_TMP_FREGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS)))
1022*22dc650dSSadaf Ebrahimi 		return (i == 0);
1023*22dc650dSSadaf Ebrahimi 
1024*22dc650dSSadaf Ebrahimi 	return function_check_src_mem(compiler, p, i);
1025*22dc650dSSadaf Ebrahimi }
1026*22dc650dSSadaf Ebrahimi 
1027*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_ARM_32 || SLJIT_CONFIG_MIPS_32 */
1028*22dc650dSSadaf Ebrahimi 
1029*22dc650dSSadaf Ebrahimi #endif /* SLJIT_ARGUMENT_CHECKS */
1030*22dc650dSSadaf Ebrahimi 
1031*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1032*22dc650dSSadaf Ebrahimi 
sljit_compiler_verbose(struct sljit_compiler * compiler,FILE * verbose)1033*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose)
1034*22dc650dSSadaf Ebrahimi {
1035*22dc650dSSadaf Ebrahimi 	compiler->verbose = verbose;
1036*22dc650dSSadaf Ebrahimi }
1037*22dc650dSSadaf Ebrahimi 
1038*22dc650dSSadaf Ebrahimi #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
1039*22dc650dSSadaf Ebrahimi #ifdef _WIN64
1040*22dc650dSSadaf Ebrahimi #ifdef __GNUC__
1041*22dc650dSSadaf Ebrahimi #	define SLJIT_PRINT_D	"ll"
1042*22dc650dSSadaf Ebrahimi #else
1043*22dc650dSSadaf Ebrahimi #	define SLJIT_PRINT_D	"I64"
1044*22dc650dSSadaf Ebrahimi #endif
1045*22dc650dSSadaf Ebrahimi #else
1046*22dc650dSSadaf Ebrahimi #	define SLJIT_PRINT_D	"l"
1047*22dc650dSSadaf Ebrahimi #endif
1048*22dc650dSSadaf Ebrahimi #else
1049*22dc650dSSadaf Ebrahimi #	define SLJIT_PRINT_D	""
1050*22dc650dSSadaf Ebrahimi #endif
1051*22dc650dSSadaf Ebrahimi 
sljit_verbose_reg(struct sljit_compiler * compiler,sljit_s32 r)1052*22dc650dSSadaf Ebrahimi static void sljit_verbose_reg(struct sljit_compiler *compiler, sljit_s32 r)
1053*22dc650dSSadaf Ebrahimi {
1054*22dc650dSSadaf Ebrahimi 	if (r < (SLJIT_R0 + compiler->scratches))
1055*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "r%d", r - SLJIT_R0);
1056*22dc650dSSadaf Ebrahimi 	else if (r < SLJIT_SP)
1057*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "s%d", SLJIT_NUMBER_OF_REGISTERS - r);
1058*22dc650dSSadaf Ebrahimi 	else if (r == SLJIT_SP)
1059*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "sp");
1060*22dc650dSSadaf Ebrahimi 	else
1061*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "t%d", r - SLJIT_TMP_REGISTER_BASE);
1062*22dc650dSSadaf Ebrahimi }
1063*22dc650dSSadaf Ebrahimi 
sljit_verbose_freg(struct sljit_compiler * compiler,sljit_s32 r)1064*22dc650dSSadaf Ebrahimi static void sljit_verbose_freg(struct sljit_compiler *compiler, sljit_s32 r)
1065*22dc650dSSadaf Ebrahimi {
1066*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \
1067*22dc650dSSadaf Ebrahimi 		|| (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
1068*22dc650dSSadaf Ebrahimi 	if (r >= SLJIT_F64_SECOND(SLJIT_FR0)) {
1069*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "^");
1070*22dc650dSSadaf Ebrahimi 		r -= SLJIT_F64_SECOND(0);
1071*22dc650dSSadaf Ebrahimi 	}
1072*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_ARM_32 || SLJIT_CONFIG_MIPS_32 */
1073*22dc650dSSadaf Ebrahimi 
1074*22dc650dSSadaf Ebrahimi 	if (r < (SLJIT_FR0 + compiler->fscratches))
1075*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "fr%d", r - SLJIT_FR0);
1076*22dc650dSSadaf Ebrahimi 	else if (r < SLJIT_TMP_FREGISTER_BASE)
1077*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "fs%d", SLJIT_NUMBER_OF_FLOAT_REGISTERS - r);
1078*22dc650dSSadaf Ebrahimi 	else
1079*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "ft%d", r - SLJIT_TMP_FREGISTER_BASE);
1080*22dc650dSSadaf Ebrahimi }
1081*22dc650dSSadaf Ebrahimi 
sljit_verbose_param(struct sljit_compiler * compiler,sljit_s32 p,sljit_sw i)1082*22dc650dSSadaf Ebrahimi static void sljit_verbose_param(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)
1083*22dc650dSSadaf Ebrahimi {
1084*22dc650dSSadaf Ebrahimi 	if ((p) == SLJIT_IMM)
1085*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "#%" SLJIT_PRINT_D "d", (i));
1086*22dc650dSSadaf Ebrahimi 	else if ((p) & SLJIT_MEM) {
1087*22dc650dSSadaf Ebrahimi 		if ((p) & REG_MASK) {
1088*22dc650dSSadaf Ebrahimi 			fputc('[', compiler->verbose);
1089*22dc650dSSadaf Ebrahimi 			sljit_verbose_reg(compiler, (p) & REG_MASK);
1090*22dc650dSSadaf Ebrahimi 			if ((p) & OFFS_REG_MASK) {
1091*22dc650dSSadaf Ebrahimi 				fprintf(compiler->verbose, " + ");
1092*22dc650dSSadaf Ebrahimi 				sljit_verbose_reg(compiler, OFFS_REG(p));
1093*22dc650dSSadaf Ebrahimi 				if (i)
1094*22dc650dSSadaf Ebrahimi 					fprintf(compiler->verbose, " * %d", 1 << (i));
1095*22dc650dSSadaf Ebrahimi 			}
1096*22dc650dSSadaf Ebrahimi 			else if (i)
1097*22dc650dSSadaf Ebrahimi 				fprintf(compiler->verbose, " + %" SLJIT_PRINT_D "d", (i));
1098*22dc650dSSadaf Ebrahimi 			fputc(']', compiler->verbose);
1099*22dc650dSSadaf Ebrahimi 		}
1100*22dc650dSSadaf Ebrahimi 		else
1101*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "[#%" SLJIT_PRINT_D "d]", (i));
1102*22dc650dSSadaf Ebrahimi 	} else
1103*22dc650dSSadaf Ebrahimi 		sljit_verbose_reg(compiler, p);
1104*22dc650dSSadaf Ebrahimi }
1105*22dc650dSSadaf Ebrahimi 
sljit_verbose_fparam(struct sljit_compiler * compiler,sljit_s32 p,sljit_sw i)1106*22dc650dSSadaf Ebrahimi static void sljit_verbose_fparam(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)
1107*22dc650dSSadaf Ebrahimi {
1108*22dc650dSSadaf Ebrahimi 	if ((p) & SLJIT_MEM) {
1109*22dc650dSSadaf Ebrahimi 		if ((p) & REG_MASK) {
1110*22dc650dSSadaf Ebrahimi 			fputc('[', compiler->verbose);
1111*22dc650dSSadaf Ebrahimi 			sljit_verbose_reg(compiler, (p) & REG_MASK);
1112*22dc650dSSadaf Ebrahimi 			if ((p) & OFFS_REG_MASK) {
1113*22dc650dSSadaf Ebrahimi 				fprintf(compiler->verbose, " + ");
1114*22dc650dSSadaf Ebrahimi 				sljit_verbose_reg(compiler, OFFS_REG(p));
1115*22dc650dSSadaf Ebrahimi 				if (i)
1116*22dc650dSSadaf Ebrahimi 					fprintf(compiler->verbose, "%d", 1 << (i));
1117*22dc650dSSadaf Ebrahimi 			}
1118*22dc650dSSadaf Ebrahimi 			else if (i)
1119*22dc650dSSadaf Ebrahimi 				fprintf(compiler->verbose, " + %" SLJIT_PRINT_D "d", (i));
1120*22dc650dSSadaf Ebrahimi 			fputc(']', compiler->verbose);
1121*22dc650dSSadaf Ebrahimi 		}
1122*22dc650dSSadaf Ebrahimi 		else
1123*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "[#%" SLJIT_PRINT_D "d]", (i));
1124*22dc650dSSadaf Ebrahimi 	}
1125*22dc650dSSadaf Ebrahimi 	else
1126*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, p);
1127*22dc650dSSadaf Ebrahimi }
1128*22dc650dSSadaf Ebrahimi 
1129*22dc650dSSadaf Ebrahimi static const char* op0_names[] = {
1130*22dc650dSSadaf Ebrahimi 	"breakpoint", "nop", "lmul.uw", "lmul.sw",
1131*22dc650dSSadaf Ebrahimi 	"divmod.u", "divmod.s", "div.u", "div.s",
1132*22dc650dSSadaf Ebrahimi 	"endbr", "skip_frames_before_return"
1133*22dc650dSSadaf Ebrahimi };
1134*22dc650dSSadaf Ebrahimi 
1135*22dc650dSSadaf Ebrahimi static const char* op1_names[] = {
1136*22dc650dSSadaf Ebrahimi 	"mov", "mov", "mov", "mov",
1137*22dc650dSSadaf Ebrahimi 	"mov", "mov", "mov", "mov",
1138*22dc650dSSadaf Ebrahimi 	"mov", "clz", "ctz", "rev",
1139*22dc650dSSadaf Ebrahimi 	"rev", "rev", "rev", "rev"
1140*22dc650dSSadaf Ebrahimi };
1141*22dc650dSSadaf Ebrahimi 
1142*22dc650dSSadaf Ebrahimi static const char* op1_types[] = {
1143*22dc650dSSadaf Ebrahimi 	"", ".u8", ".s8", ".u16",
1144*22dc650dSSadaf Ebrahimi 	".s16", ".u32", ".s32", "32",
1145*22dc650dSSadaf Ebrahimi 	".p", "", "", "",
1146*22dc650dSSadaf Ebrahimi 	".u16", ".s16", ".u32", ".s32"
1147*22dc650dSSadaf Ebrahimi };
1148*22dc650dSSadaf Ebrahimi 
1149*22dc650dSSadaf Ebrahimi static const char* op2_names[] = {
1150*22dc650dSSadaf Ebrahimi 	"add", "addc", "sub", "subc",
1151*22dc650dSSadaf Ebrahimi 	"mul", "and", "or", "xor",
1152*22dc650dSSadaf Ebrahimi 	"shl", "mshl", "lshr", "mlshr",
1153*22dc650dSSadaf Ebrahimi 	"ashr", "mashr", "rotl", "rotr"
1154*22dc650dSSadaf Ebrahimi };
1155*22dc650dSSadaf Ebrahimi 
1156*22dc650dSSadaf Ebrahimi static const char* op2r_names[] = {
1157*22dc650dSSadaf Ebrahimi 	"muladd"
1158*22dc650dSSadaf Ebrahimi };
1159*22dc650dSSadaf Ebrahimi 
1160*22dc650dSSadaf Ebrahimi static const char* op_src_dst_names[] = {
1161*22dc650dSSadaf Ebrahimi 	"fast_return", "skip_frames_before_fast_return",
1162*22dc650dSSadaf Ebrahimi 	"prefetch_l1", "prefetch_l2",
1163*22dc650dSSadaf Ebrahimi 	"prefetch_l3", "prefetch_once",
1164*22dc650dSSadaf Ebrahimi 	"fast_enter", "get_return_address"
1165*22dc650dSSadaf Ebrahimi };
1166*22dc650dSSadaf Ebrahimi 
1167*22dc650dSSadaf Ebrahimi static const char* fop1_names[] = {
1168*22dc650dSSadaf Ebrahimi 	"mov", "conv", "conv", "conv",
1169*22dc650dSSadaf Ebrahimi 	"conv", "conv", "conv", "conv",
1170*22dc650dSSadaf Ebrahimi 	"cmp", "neg", "abs",
1171*22dc650dSSadaf Ebrahimi };
1172*22dc650dSSadaf Ebrahimi 
1173*22dc650dSSadaf Ebrahimi static const char* fop1_conv_types[] = {
1174*22dc650dSSadaf Ebrahimi 	"sw", "s32", "sw", "s32",
1175*22dc650dSSadaf Ebrahimi 	"uw", "u32"
1176*22dc650dSSadaf Ebrahimi };
1177*22dc650dSSadaf Ebrahimi 
1178*22dc650dSSadaf Ebrahimi static const char* fop2_names[] = {
1179*22dc650dSSadaf Ebrahimi 	"add", "sub", "mul", "div"
1180*22dc650dSSadaf Ebrahimi };
1181*22dc650dSSadaf Ebrahimi 
1182*22dc650dSSadaf Ebrahimi static const char* fop2r_names[] = {
1183*22dc650dSSadaf Ebrahimi 	"copysign"
1184*22dc650dSSadaf Ebrahimi };
1185*22dc650dSSadaf Ebrahimi 
1186*22dc650dSSadaf Ebrahimi static const char* simd_op2_names[] = {
1187*22dc650dSSadaf Ebrahimi 	"and", "or", "xor"
1188*22dc650dSSadaf Ebrahimi };
1189*22dc650dSSadaf Ebrahimi 
1190*22dc650dSSadaf Ebrahimi static const char* jump_names[] = {
1191*22dc650dSSadaf Ebrahimi 	"equal", "not_equal",
1192*22dc650dSSadaf Ebrahimi 	"less", "greater_equal",
1193*22dc650dSSadaf Ebrahimi 	"greater", "less_equal",
1194*22dc650dSSadaf Ebrahimi 	"sig_less", "sig_greater_equal",
1195*22dc650dSSadaf Ebrahimi 	"sig_greater", "sig_less_equal",
1196*22dc650dSSadaf Ebrahimi 	"overflow", "not_overflow",
1197*22dc650dSSadaf Ebrahimi 	"carry", "not_carry",
1198*22dc650dSSadaf Ebrahimi 	"atomic_stored", "atomic_not_stored",
1199*22dc650dSSadaf Ebrahimi 	"f_equal", "f_not_equal",
1200*22dc650dSSadaf Ebrahimi 	"f_less", "f_greater_equal",
1201*22dc650dSSadaf Ebrahimi 	"f_greater", "f_less_equal",
1202*22dc650dSSadaf Ebrahimi 	"unordered", "ordered",
1203*22dc650dSSadaf Ebrahimi 	"ordered_equal", "unordered_or_not_equal",
1204*22dc650dSSadaf Ebrahimi 	"ordered_less", "unordered_or_greater_equal",
1205*22dc650dSSadaf Ebrahimi 	"ordered_greater", "unordered_or_less_equal",
1206*22dc650dSSadaf Ebrahimi 	"unordered_or_equal", "ordered_not_equal",
1207*22dc650dSSadaf Ebrahimi 	"unordered_or_less", "ordered_greater_equal",
1208*22dc650dSSadaf Ebrahimi 	"unordered_or_greater", "ordered_less_equal",
1209*22dc650dSSadaf Ebrahimi 	"jump", "fast_call",
1210*22dc650dSSadaf Ebrahimi 	"call", "call_reg_arg"
1211*22dc650dSSadaf Ebrahimi };
1212*22dc650dSSadaf Ebrahimi 
1213*22dc650dSSadaf Ebrahimi static const char* call_arg_names[] = {
1214*22dc650dSSadaf Ebrahimi 	"void", "w", "32", "p", "f64", "f32"
1215*22dc650dSSadaf Ebrahimi };
1216*22dc650dSSadaf Ebrahimi 
1217*22dc650dSSadaf Ebrahimi #endif /* SLJIT_VERBOSE */
1218*22dc650dSSadaf Ebrahimi 
1219*22dc650dSSadaf Ebrahimi /* --------------------------------------------------------------------- */
1220*22dc650dSSadaf Ebrahimi /*  Arch dependent                                                       */
1221*22dc650dSSadaf Ebrahimi /* --------------------------------------------------------------------- */
1222*22dc650dSSadaf Ebrahimi 
1223*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \
1224*22dc650dSSadaf Ebrahimi 	|| (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1225*22dc650dSSadaf Ebrahimi 
1226*22dc650dSSadaf Ebrahimi #define SLJIT_SKIP_CHECKS(compiler) (compiler)->skip_checks = 1
1227*22dc650dSSadaf Ebrahimi 
check_sljit_generate_code(struct sljit_compiler * compiler)1228*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_generate_code(struct sljit_compiler *compiler)
1229*22dc650dSSadaf Ebrahimi {
1230*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1231*22dc650dSSadaf Ebrahimi 	struct sljit_jump *jump;
1232*22dc650dSSadaf Ebrahimi #endif
1233*22dc650dSSadaf Ebrahimi 
1234*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(compiler);
1235*22dc650dSSadaf Ebrahimi 
1236*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1237*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(compiler->size > 0);
1238*22dc650dSSadaf Ebrahimi 	jump = compiler->jumps;
1239*22dc650dSSadaf Ebrahimi 	while (jump) {
1240*22dc650dSSadaf Ebrahimi 		/* All jumps have target. */
1241*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT((jump->flags & JUMP_ADDR) || jump->u.label != NULL);
1242*22dc650dSSadaf Ebrahimi 		jump = jump->next;
1243*22dc650dSSadaf Ebrahimi 	}
1244*22dc650dSSadaf Ebrahimi #endif
1245*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1246*22dc650dSSadaf Ebrahimi }
1247*22dc650dSSadaf Ebrahimi 
1248*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
1249*22dc650dSSadaf Ebrahimi #define SLJIT_ENTER_CPU_SPECIFIC_OPTIONS (SLJIT_ENTER_USE_VEX)
1250*22dc650dSSadaf Ebrahimi #else /* !SLJIT_CONFIG_X86 */
1251*22dc650dSSadaf Ebrahimi #define SLJIT_ENTER_CPU_SPECIFIC_OPTIONS (0)
1252*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_CONFIG_X86 */
1253*22dc650dSSadaf Ebrahimi 
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)1254*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_enter(struct sljit_compiler *compiler,
1255*22dc650dSSadaf Ebrahimi 	sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,
1256*22dc650dSSadaf Ebrahimi 	sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
1257*22dc650dSSadaf Ebrahimi {
1258*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(compiler);
1259*22dc650dSSadaf Ebrahimi 
1260*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1261*22dc650dSSadaf Ebrahimi 	if (options & SLJIT_ENTER_REG_ARG) {
1262*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(options & ~(0x3 | SLJIT_ENTER_REG_ARG | SLJIT_ENTER_CPU_SPECIFIC_OPTIONS)));
1263*22dc650dSSadaf Ebrahimi 	} else {
1264*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT((options & ~SLJIT_ENTER_CPU_SPECIFIC_OPTIONS) == 0);
1265*22dc650dSSadaf Ebrahimi 	}
1266*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_KEPT_SAVEDS_COUNT(options) <= 3 && SLJIT_KEPT_SAVEDS_COUNT(options) <= saveds);
1267*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(scratches >= 0 && scratches <= SLJIT_NUMBER_OF_REGISTERS);
1268*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(saveds >= 0 && saveds <= SLJIT_NUMBER_OF_SAVED_REGISTERS);
1269*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(scratches + saveds <= SLJIT_NUMBER_OF_REGISTERS);
1270*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(fscratches >= 0 && fscratches <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
1271*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(fsaveds >= 0 && fsaveds <= SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS);
1272*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(fscratches + fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
1273*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);
1274*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((arg_types & SLJIT_ARG_FULL_MASK) <= SLJIT_ARG_TYPE_F32);
1275*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(function_check_arguments(arg_types, scratches, (options & SLJIT_ENTER_REG_ARG) ? 0 : saveds, fscratches));
1276*22dc650dSSadaf Ebrahimi 
1277*22dc650dSSadaf Ebrahimi 	compiler->last_flags = 0;
1278*22dc650dSSadaf Ebrahimi #endif
1279*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1280*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1281*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  enter ret[%s", call_arg_names[arg_types & SLJIT_ARG_MASK]);
1282*22dc650dSSadaf Ebrahimi 
1283*22dc650dSSadaf Ebrahimi 		arg_types >>= SLJIT_ARG_SHIFT;
1284*22dc650dSSadaf Ebrahimi 		if (arg_types) {
1285*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "], args[");
1286*22dc650dSSadaf Ebrahimi 			do {
1287*22dc650dSSadaf Ebrahimi 				fprintf(compiler->verbose, "%s%s", call_arg_names[arg_types & SLJIT_ARG_MASK],
1288*22dc650dSSadaf Ebrahimi 					(arg_types & SLJIT_ARG_TYPE_SCRATCH_REG) ? "_r" : "");
1289*22dc650dSSadaf Ebrahimi 				arg_types >>= SLJIT_ARG_SHIFT;
1290*22dc650dSSadaf Ebrahimi 				if (arg_types)
1291*22dc650dSSadaf Ebrahimi 					fprintf(compiler->verbose, ",");
1292*22dc650dSSadaf Ebrahimi 			} while (arg_types);
1293*22dc650dSSadaf Ebrahimi 		}
1294*22dc650dSSadaf Ebrahimi 
1295*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "],");
1296*22dc650dSSadaf Ebrahimi 
1297*22dc650dSSadaf Ebrahimi 		if (options & SLJIT_ENTER_REG_ARG) {
1298*22dc650dSSadaf Ebrahimi 			if (SLJIT_KEPT_SAVEDS_COUNT(options) > 0)
1299*22dc650dSSadaf Ebrahimi 				fprintf(compiler->verbose, " opt:reg_arg(%d),", SLJIT_KEPT_SAVEDS_COUNT(options));
1300*22dc650dSSadaf Ebrahimi 			else
1301*22dc650dSSadaf Ebrahimi 				fprintf(compiler->verbose, " opt:reg_arg,");
1302*22dc650dSSadaf Ebrahimi 		}
1303*22dc650dSSadaf Ebrahimi 
1304*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
1305*22dc650dSSadaf Ebrahimi 		if (options & SLJIT_ENTER_USE_VEX) {
1306*22dc650dSSadaf Ebrahimi 				fprintf(compiler->verbose, " opt:use_vex,");
1307*22dc650dSSadaf Ebrahimi 		}
1308*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_CONFIG_X86 */
1309*22dc650dSSadaf Ebrahimi 
1310*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, " scratches:%d, saveds:%d, fscratches:%d, fsaveds:%d, local_size:%d\n",
1311*22dc650dSSadaf Ebrahimi 			scratches, saveds, fscratches, fsaveds, local_size);
1312*22dc650dSSadaf Ebrahimi 	}
1313*22dc650dSSadaf Ebrahimi #endif
1314*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1315*22dc650dSSadaf Ebrahimi }
1316*22dc650dSSadaf Ebrahimi 
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)1317*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_set_context(struct sljit_compiler *compiler,
1318*22dc650dSSadaf Ebrahimi 	sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,
1319*22dc650dSSadaf Ebrahimi 	sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
1320*22dc650dSSadaf Ebrahimi {
1321*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(compiler);
1322*22dc650dSSadaf Ebrahimi 
1323*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1324*22dc650dSSadaf Ebrahimi 	if (options & SLJIT_ENTER_REG_ARG) {
1325*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(options & ~(0x3 | SLJIT_ENTER_REG_ARG | SLJIT_ENTER_CPU_SPECIFIC_OPTIONS)));
1326*22dc650dSSadaf Ebrahimi 	} else {
1327*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT((options & ~SLJIT_ENTER_CPU_SPECIFIC_OPTIONS) == 0);
1328*22dc650dSSadaf Ebrahimi 	}
1329*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_KEPT_SAVEDS_COUNT(options) <= 3 && SLJIT_KEPT_SAVEDS_COUNT(options) <= saveds);
1330*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(scratches >= 0 && scratches <= SLJIT_NUMBER_OF_REGISTERS);
1331*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(saveds >= 0 && saveds <= SLJIT_NUMBER_OF_SAVED_REGISTERS);
1332*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(scratches + saveds <= SLJIT_NUMBER_OF_REGISTERS);
1333*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(fscratches >= 0 && fscratches <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
1334*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(fsaveds >= 0 && fsaveds <= SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS);
1335*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(fscratches + fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
1336*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);
1337*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((arg_types & SLJIT_ARG_FULL_MASK) < SLJIT_ARG_TYPE_F64);
1338*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(function_check_arguments(arg_types, scratches, (options & SLJIT_ENTER_REG_ARG) ? 0 : saveds, fscratches));
1339*22dc650dSSadaf Ebrahimi 
1340*22dc650dSSadaf Ebrahimi 	compiler->last_flags = 0;
1341*22dc650dSSadaf Ebrahimi #endif
1342*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1343*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1344*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  set_context ret[%s", call_arg_names[arg_types & SLJIT_ARG_MASK]);
1345*22dc650dSSadaf Ebrahimi 
1346*22dc650dSSadaf Ebrahimi 		arg_types >>= SLJIT_ARG_SHIFT;
1347*22dc650dSSadaf Ebrahimi 		if (arg_types) {
1348*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "], args[");
1349*22dc650dSSadaf Ebrahimi 			do {
1350*22dc650dSSadaf Ebrahimi 				fprintf(compiler->verbose, "%s%s", call_arg_names[arg_types & SLJIT_ARG_MASK],
1351*22dc650dSSadaf Ebrahimi 					(arg_types & SLJIT_ARG_TYPE_SCRATCH_REG) ? "_r" : "");
1352*22dc650dSSadaf Ebrahimi 				arg_types >>= SLJIT_ARG_SHIFT;
1353*22dc650dSSadaf Ebrahimi 				if (arg_types)
1354*22dc650dSSadaf Ebrahimi 					fprintf(compiler->verbose, ",");
1355*22dc650dSSadaf Ebrahimi 			} while (arg_types);
1356*22dc650dSSadaf Ebrahimi 		}
1357*22dc650dSSadaf Ebrahimi 
1358*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "],");
1359*22dc650dSSadaf Ebrahimi 
1360*22dc650dSSadaf Ebrahimi 		if (options & SLJIT_ENTER_REG_ARG) {
1361*22dc650dSSadaf Ebrahimi 			if (SLJIT_KEPT_SAVEDS_COUNT(options) > 0)
1362*22dc650dSSadaf Ebrahimi 				fprintf(compiler->verbose, " opt:reg_arg(%d),", SLJIT_KEPT_SAVEDS_COUNT(options));
1363*22dc650dSSadaf Ebrahimi 			else
1364*22dc650dSSadaf Ebrahimi 				fprintf(compiler->verbose, " opt:reg_arg,");
1365*22dc650dSSadaf Ebrahimi 		}
1366*22dc650dSSadaf Ebrahimi 
1367*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
1368*22dc650dSSadaf Ebrahimi 		if (options & SLJIT_ENTER_USE_VEX) {
1369*22dc650dSSadaf Ebrahimi 				fprintf(compiler->verbose, " opt:use_vex,");
1370*22dc650dSSadaf Ebrahimi 		}
1371*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_CONFIG_X86 */
1372*22dc650dSSadaf Ebrahimi 
1373*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, " scratches:%d, saveds:%d, fscratches:%d, fsaveds:%d, local_size:%d\n",
1374*22dc650dSSadaf Ebrahimi 			scratches, saveds, fscratches, fsaveds, local_size);
1375*22dc650dSSadaf Ebrahimi 	}
1376*22dc650dSSadaf Ebrahimi #endif
1377*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1378*22dc650dSSadaf Ebrahimi }
1379*22dc650dSSadaf Ebrahimi 
1380*22dc650dSSadaf Ebrahimi #undef SLJIT_ENTER_CPU_SPECIFIC_OPTIONS
1381*22dc650dSSadaf Ebrahimi 
check_sljit_emit_return_void(struct sljit_compiler * compiler)1382*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_return_void(struct sljit_compiler *compiler)
1383*22dc650dSSadaf Ebrahimi {
1384*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1385*22dc650dSSadaf Ebrahimi 		compiler->skip_checks = 0;
1386*22dc650dSSadaf Ebrahimi 		CHECK_RETURN_OK;
1387*22dc650dSSadaf Ebrahimi 	}
1388*22dc650dSSadaf Ebrahimi 
1389*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1390*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(compiler->last_return == SLJIT_ARG_TYPE_RET_VOID);
1391*22dc650dSSadaf Ebrahimi #endif
1392*22dc650dSSadaf Ebrahimi 
1393*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1394*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1395*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  return_void\n");
1396*22dc650dSSadaf Ebrahimi 	}
1397*22dc650dSSadaf Ebrahimi #endif
1398*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1399*22dc650dSSadaf Ebrahimi }
1400*22dc650dSSadaf Ebrahimi 
check_sljit_emit_return(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 src,sljit_sw srcw)1401*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
1402*22dc650dSSadaf Ebrahimi {
1403*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1404*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(compiler->scratches >= 0);
1405*22dc650dSSadaf Ebrahimi 
1406*22dc650dSSadaf Ebrahimi 	switch (compiler->last_return) {
1407*22dc650dSSadaf Ebrahimi 	case SLJIT_ARG_TYPE_W:
1408*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(op >= SLJIT_MOV && op <= SLJIT_MOV_S32);
1409*22dc650dSSadaf Ebrahimi 		break;
1410*22dc650dSSadaf Ebrahimi 	case SLJIT_ARG_TYPE_32:
1411*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(op == SLJIT_MOV32 || (op >= SLJIT_MOV32_U8 && op <= SLJIT_MOV32_S16));
1412*22dc650dSSadaf Ebrahimi 		break;
1413*22dc650dSSadaf Ebrahimi 	case SLJIT_ARG_TYPE_P:
1414*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(op == SLJIT_MOV_P);
1415*22dc650dSSadaf Ebrahimi 		break;
1416*22dc650dSSadaf Ebrahimi 	case SLJIT_ARG_TYPE_F64:
1417*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
1418*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(op == SLJIT_MOV_F64);
1419*22dc650dSSadaf Ebrahimi 		break;
1420*22dc650dSSadaf Ebrahimi 	case SLJIT_ARG_TYPE_F32:
1421*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
1422*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(op == SLJIT_MOV_F32);
1423*22dc650dSSadaf Ebrahimi 		break;
1424*22dc650dSSadaf Ebrahimi 	default:
1425*22dc650dSSadaf Ebrahimi 		/* Context not initialized, void, etc. */
1426*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(0);
1427*22dc650dSSadaf Ebrahimi 		break;
1428*22dc650dSSadaf Ebrahimi 	}
1429*22dc650dSSadaf Ebrahimi 
1430*22dc650dSSadaf Ebrahimi 	if (GET_OPCODE(op) < SLJIT_MOV_F64) {
1431*22dc650dSSadaf Ebrahimi 		FUNCTION_CHECK_SRC(src, srcw);
1432*22dc650dSSadaf Ebrahimi 	} else {
1433*22dc650dSSadaf Ebrahimi 		FUNCTION_FCHECK(src, srcw, op & SLJIT_32);
1434*22dc650dSSadaf Ebrahimi 	}
1435*22dc650dSSadaf Ebrahimi 	compiler->last_flags = 0;
1436*22dc650dSSadaf Ebrahimi #endif
1437*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1438*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1439*22dc650dSSadaf Ebrahimi 		if (GET_OPCODE(op) < SLJIT_MOV_F64) {
1440*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "  return%s%s ", !(op & SLJIT_32) ? "" : "32",
1441*22dc650dSSadaf Ebrahimi 				op1_types[GET_OPCODE(op) - SLJIT_OP1_BASE]);
1442*22dc650dSSadaf Ebrahimi 			sljit_verbose_param(compiler, src, srcw);
1443*22dc650dSSadaf Ebrahimi 		} else {
1444*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "  return%s ", !(op & SLJIT_32) ? ".f64" : ".f32");
1445*22dc650dSSadaf Ebrahimi 			sljit_verbose_fparam(compiler, src, srcw);
1446*22dc650dSSadaf Ebrahimi 		}
1447*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
1448*22dc650dSSadaf Ebrahimi 	}
1449*22dc650dSSadaf Ebrahimi #endif
1450*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1451*22dc650dSSadaf Ebrahimi }
1452*22dc650dSSadaf Ebrahimi 
check_sljit_emit_return_to(struct sljit_compiler * compiler,sljit_s32 src,sljit_sw srcw)1453*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_return_to(struct sljit_compiler *compiler,
1454*22dc650dSSadaf Ebrahimi 	sljit_s32 src, sljit_sw srcw)
1455*22dc650dSSadaf Ebrahimi {
1456*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1457*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC(src, srcw);
1458*22dc650dSSadaf Ebrahimi #endif
1459*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1460*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1461*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  return_to ");
1462*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, src, srcw);
1463*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
1464*22dc650dSSadaf Ebrahimi 	}
1465*22dc650dSSadaf Ebrahimi #endif
1466*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1467*22dc650dSSadaf Ebrahimi }
1468*22dc650dSSadaf Ebrahimi 
check_sljit_emit_op0(struct sljit_compiler * compiler,sljit_s32 op)1469*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)
1470*22dc650dSSadaf Ebrahimi {
1471*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1472*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((op >= SLJIT_BREAKPOINT && op <= SLJIT_LMUL_SW)
1473*22dc650dSSadaf Ebrahimi 		|| ((op & ~SLJIT_32) >= SLJIT_DIVMOD_UW && (op & ~SLJIT_32) <= SLJIT_DIV_SW)
1474*22dc650dSSadaf Ebrahimi 		|| (op >= SLJIT_ENDBR && op <= SLJIT_SKIP_FRAMES_BEFORE_RETURN));
1475*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(GET_OPCODE(op) < SLJIT_LMUL_UW || GET_OPCODE(op) >= SLJIT_ENDBR || compiler->scratches >= 2);
1476*22dc650dSSadaf Ebrahimi 	if ((GET_OPCODE(op) >= SLJIT_LMUL_UW && GET_OPCODE(op) <= SLJIT_DIV_SW) || op == SLJIT_SKIP_FRAMES_BEFORE_RETURN)
1477*22dc650dSSadaf Ebrahimi 		compiler->last_flags = 0;
1478*22dc650dSSadaf Ebrahimi #endif
1479*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1480*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose))
1481*22dc650dSSadaf Ebrahimi 	{
1482*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  %s", op0_names[GET_OPCODE(op) - SLJIT_OP0_BASE]);
1483*22dc650dSSadaf Ebrahimi 		if (GET_OPCODE(op) >= SLJIT_DIVMOD_UW && GET_OPCODE(op) <= SLJIT_DIV_SW) {
1484*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, (op & SLJIT_32) ? "32" : "w");
1485*22dc650dSSadaf Ebrahimi 		}
1486*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
1487*22dc650dSSadaf Ebrahimi 	}
1488*22dc650dSSadaf Ebrahimi #endif
1489*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1490*22dc650dSSadaf Ebrahimi }
1491*22dc650dSSadaf Ebrahimi 
check_sljit_emit_op1(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst,sljit_sw dstw,sljit_s32 src,sljit_sw srcw)1492*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,
1493*22dc650dSSadaf Ebrahimi 	sljit_s32 dst, sljit_sw dstw,
1494*22dc650dSSadaf Ebrahimi 	sljit_s32 src, sljit_sw srcw)
1495*22dc650dSSadaf Ebrahimi {
1496*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1497*22dc650dSSadaf Ebrahimi 		compiler->skip_checks = 0;
1498*22dc650dSSadaf Ebrahimi 		CHECK_RETURN_OK;
1499*22dc650dSSadaf Ebrahimi 	}
1500*22dc650dSSadaf Ebrahimi 
1501*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1502*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_REV_S32);
1503*22dc650dSSadaf Ebrahimi 
1504*22dc650dSSadaf Ebrahimi 	switch (GET_OPCODE(op)) {
1505*22dc650dSSadaf Ebrahimi 	case SLJIT_MOV:
1506*22dc650dSSadaf Ebrahimi 	case SLJIT_MOV_U32:
1507*22dc650dSSadaf Ebrahimi 	case SLJIT_MOV_S32:
1508*22dc650dSSadaf Ebrahimi 	case SLJIT_MOV32:
1509*22dc650dSSadaf Ebrahimi 	case SLJIT_MOV_P:
1510*22dc650dSSadaf Ebrahimi 	case SLJIT_REV_U32:
1511*22dc650dSSadaf Ebrahimi 	case SLJIT_REV_S32:
1512*22dc650dSSadaf Ebrahimi 		/* Nothing allowed */
1513*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(op & (SLJIT_32 | SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1514*22dc650dSSadaf Ebrahimi 		break;
1515*22dc650dSSadaf Ebrahimi 	default:
1516*22dc650dSSadaf Ebrahimi 		/* Only SLJIT_32 is allowed. */
1517*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1518*22dc650dSSadaf Ebrahimi 		break;
1519*22dc650dSSadaf Ebrahimi 	}
1520*22dc650dSSadaf Ebrahimi 
1521*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_DST(dst, dstw);
1522*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC(src, srcw);
1523*22dc650dSSadaf Ebrahimi #endif
1524*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1525*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1526*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  %s%s%s ", op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE],
1527*22dc650dSSadaf Ebrahimi 			!(op & SLJIT_32) ? "" : "32", op1_types[GET_OPCODE(op) - SLJIT_OP1_BASE]);
1528*22dc650dSSadaf Ebrahimi 
1529*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, dst, dstw);
1530*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
1531*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, src, srcw);
1532*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
1533*22dc650dSSadaf Ebrahimi 	}
1534*22dc650dSSadaf Ebrahimi #endif
1535*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1536*22dc650dSSadaf Ebrahimi }
1537*22dc650dSSadaf Ebrahimi 
check_sljit_emit_atomic_load(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst_reg,sljit_s32 mem_reg)1538*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_atomic_load(struct sljit_compiler *compiler, sljit_s32 op,
1539*22dc650dSSadaf Ebrahimi 	sljit_s32 dst_reg,
1540*22dc650dSSadaf Ebrahimi 	sljit_s32 mem_reg)
1541*22dc650dSSadaf Ebrahimi {
1542*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1543*22dc650dSSadaf Ebrahimi 		compiler->skip_checks = 0;
1544*22dc650dSSadaf Ebrahimi 		CHECK_RETURN_OK;
1545*22dc650dSSadaf Ebrahimi 	}
1546*22dc650dSSadaf Ebrahimi 
1547*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1548*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_ATOMIC));
1549*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_MOV_P);
1550*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(GET_OPCODE(op) != SLJIT_MOV_S8 && GET_OPCODE(op) != SLJIT_MOV_S16 && GET_OPCODE(op) != SLJIT_MOV_S32);
1551*22dc650dSSadaf Ebrahimi 
1552*22dc650dSSadaf Ebrahimi 	/* All arguments must be valid registers. */
1553*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(dst_reg));
1554*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(mem_reg) && !CHECK_IF_VIRTUAL_REGISTER(mem_reg));
1555*22dc650dSSadaf Ebrahimi 
1556*22dc650dSSadaf Ebrahimi 	if (op == SLJIT_MOV32_U8 || op == SLJIT_MOV32_U16) {
1557*22dc650dSSadaf Ebrahimi 		/* Only SLJIT_32 is allowed. */
1558*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(op & (VARIABLE_FLAG_MASK | SLJIT_SET_Z)));
1559*22dc650dSSadaf Ebrahimi 	} else {
1560*22dc650dSSadaf Ebrahimi 		/* Nothing allowed. */
1561*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(op & (SLJIT_32 | SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1562*22dc650dSSadaf Ebrahimi 	}
1563*22dc650dSSadaf Ebrahimi 
1564*22dc650dSSadaf Ebrahimi 	compiler->last_flags = 0;
1565*22dc650dSSadaf Ebrahimi #endif /* SLJIT_ARGUMENT_CHECKS */
1566*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1567*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1568*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  atomic_load%s%s ", !(op & SLJIT_32) ? "" : "32",
1569*22dc650dSSadaf Ebrahimi 				op1_types[GET_OPCODE(op) - SLJIT_OP1_BASE]);
1570*22dc650dSSadaf Ebrahimi 		sljit_verbose_reg(compiler, dst_reg);
1571*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", [");
1572*22dc650dSSadaf Ebrahimi 		sljit_verbose_reg(compiler, mem_reg);
1573*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "]\n");
1574*22dc650dSSadaf Ebrahimi 	}
1575*22dc650dSSadaf Ebrahimi #endif /* SLJIT_VERBOSE */
1576*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1577*22dc650dSSadaf Ebrahimi }
1578*22dc650dSSadaf Ebrahimi 
check_sljit_emit_atomic_store(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 src_reg,sljit_s32 mem_reg,sljit_s32 temp_reg)1579*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_atomic_store(struct sljit_compiler *compiler, sljit_s32 op,
1580*22dc650dSSadaf Ebrahimi 	sljit_s32 src_reg,
1581*22dc650dSSadaf Ebrahimi 	sljit_s32 mem_reg,
1582*22dc650dSSadaf Ebrahimi 	sljit_s32 temp_reg)
1583*22dc650dSSadaf Ebrahimi {
1584*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1585*22dc650dSSadaf Ebrahimi 		compiler->skip_checks = 0;
1586*22dc650dSSadaf Ebrahimi 		CHECK_RETURN_OK;
1587*22dc650dSSadaf Ebrahimi 	}
1588*22dc650dSSadaf Ebrahimi 
1589*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1590*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_ATOMIC));
1591*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_MOV_P);
1592*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(GET_OPCODE(op) != SLJIT_MOV_S8 && GET_OPCODE(op) != SLJIT_MOV_S16 && GET_OPCODE(op) != SLJIT_MOV_S32);
1593*22dc650dSSadaf Ebrahimi 
1594*22dc650dSSadaf Ebrahimi 	/* All arguments must be valid registers. */
1595*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src_reg));
1596*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(mem_reg) && !CHECK_IF_VIRTUAL_REGISTER(mem_reg));
1597*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(temp_reg) && src_reg != temp_reg);
1598*22dc650dSSadaf Ebrahimi 
1599*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK) || GET_FLAG_TYPE(op) == SLJIT_ATOMIC_STORED);
1600*22dc650dSSadaf Ebrahimi 
1601*22dc650dSSadaf Ebrahimi 	if (GET_OPCODE(op) == SLJIT_MOV_U8 || GET_OPCODE(op) == SLJIT_MOV_U16) {
1602*22dc650dSSadaf Ebrahimi 		/* Only SLJIT_32, SLJIT_ATOMIC_STORED are allowed. */
1603*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(op & SLJIT_SET_Z));
1604*22dc650dSSadaf Ebrahimi 	} else {
1605*22dc650dSSadaf Ebrahimi 		/* Only SLJIT_ATOMIC_STORED is allowed. */
1606*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(op & (SLJIT_32 | SLJIT_SET_Z)));
1607*22dc650dSSadaf Ebrahimi 	}
1608*22dc650dSSadaf Ebrahimi 
1609*22dc650dSSadaf Ebrahimi 	compiler->last_flags = GET_FLAG_TYPE(op) | (op & SLJIT_32);
1610*22dc650dSSadaf Ebrahimi #endif /* SLJIT_ARGUMENT_CHECKS */
1611*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1612*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1613*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  atomic_store%s%s%s ", !(op & SLJIT_32) ? "" : "32",
1614*22dc650dSSadaf Ebrahimi 				op1_types[GET_OPCODE(op) - SLJIT_OP1_BASE], !(op & VARIABLE_FLAG_MASK) ? "" : ".stored");
1615*22dc650dSSadaf Ebrahimi 		sljit_verbose_reg(compiler, src_reg);
1616*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", [");
1617*22dc650dSSadaf Ebrahimi 		sljit_verbose_reg(compiler, mem_reg);
1618*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "], ");
1619*22dc650dSSadaf Ebrahimi 		sljit_verbose_reg(compiler, temp_reg);
1620*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
1621*22dc650dSSadaf Ebrahimi 	}
1622*22dc650dSSadaf Ebrahimi #endif /* SLJIT_VERBOSE */
1623*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1624*22dc650dSSadaf Ebrahimi }
1625*22dc650dSSadaf Ebrahimi 
check_sljit_emit_op2(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 unset,sljit_s32 dst,sljit_sw dstw,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)1626*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 unset,
1627*22dc650dSSadaf Ebrahimi 	sljit_s32 dst, sljit_sw dstw,
1628*22dc650dSSadaf Ebrahimi 	sljit_s32 src1, sljit_sw src1w,
1629*22dc650dSSadaf Ebrahimi 	sljit_s32 src2, sljit_sw src2w)
1630*22dc650dSSadaf Ebrahimi {
1631*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1632*22dc650dSSadaf Ebrahimi 		compiler->skip_checks = 0;
1633*22dc650dSSadaf Ebrahimi 		CHECK_RETURN_OK;
1634*22dc650dSSadaf Ebrahimi 	}
1635*22dc650dSSadaf Ebrahimi 
1636*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1637*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_ADD && GET_OPCODE(op) <= SLJIT_ROTR);
1638*22dc650dSSadaf Ebrahimi 
1639*22dc650dSSadaf Ebrahimi 	switch (GET_OPCODE(op)) {
1640*22dc650dSSadaf Ebrahimi 	case SLJIT_AND:
1641*22dc650dSSadaf Ebrahimi 	case SLJIT_OR:
1642*22dc650dSSadaf Ebrahimi 	case SLJIT_XOR:
1643*22dc650dSSadaf Ebrahimi 	case SLJIT_SHL:
1644*22dc650dSSadaf Ebrahimi 	case SLJIT_MSHL:
1645*22dc650dSSadaf Ebrahimi 	case SLJIT_LSHR:
1646*22dc650dSSadaf Ebrahimi 	case SLJIT_MLSHR:
1647*22dc650dSSadaf Ebrahimi 	case SLJIT_ASHR:
1648*22dc650dSSadaf Ebrahimi 	case SLJIT_MASHR:
1649*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK));
1650*22dc650dSSadaf Ebrahimi 		break;
1651*22dc650dSSadaf Ebrahimi 	case SLJIT_MUL:
1652*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(op & SLJIT_SET_Z));
1653*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)
1654*22dc650dSSadaf Ebrahimi 			|| GET_FLAG_TYPE(op) == SLJIT_OVERFLOW);
1655*22dc650dSSadaf Ebrahimi 		break;
1656*22dc650dSSadaf Ebrahimi 	case SLJIT_ADD:
1657*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)
1658*22dc650dSSadaf Ebrahimi 			|| GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)
1659*22dc650dSSadaf Ebrahimi 			|| GET_FLAG_TYPE(op) == SLJIT_OVERFLOW);
1660*22dc650dSSadaf Ebrahimi 		break;
1661*22dc650dSSadaf Ebrahimi 	case SLJIT_SUB:
1662*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)
1663*22dc650dSSadaf Ebrahimi 			|| (GET_FLAG_TYPE(op) >= SLJIT_LESS && GET_FLAG_TYPE(op) <= SLJIT_OVERFLOW)
1664*22dc650dSSadaf Ebrahimi 			|| GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY));
1665*22dc650dSSadaf Ebrahimi 		break;
1666*22dc650dSSadaf Ebrahimi 	case SLJIT_ADDC:
1667*22dc650dSSadaf Ebrahimi 	case SLJIT_SUBC:
1668*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)
1669*22dc650dSSadaf Ebrahimi 			|| GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY));
1670*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT((compiler->last_flags & 0xff) == GET_FLAG_TYPE(SLJIT_SET_CARRY));
1671*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT((op & SLJIT_32) == (compiler->last_flags & SLJIT_32));
1672*22dc650dSSadaf Ebrahimi 		break;
1673*22dc650dSSadaf Ebrahimi 	case SLJIT_ROTL:
1674*22dc650dSSadaf Ebrahimi 	case SLJIT_ROTR:
1675*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1676*22dc650dSSadaf Ebrahimi 		break;
1677*22dc650dSSadaf Ebrahimi 	default:
1678*22dc650dSSadaf Ebrahimi 		SLJIT_UNREACHABLE();
1679*22dc650dSSadaf Ebrahimi 		break;
1680*22dc650dSSadaf Ebrahimi 	}
1681*22dc650dSSadaf Ebrahimi 
1682*22dc650dSSadaf Ebrahimi 	if (unset) {
1683*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(HAS_FLAGS(op));
1684*22dc650dSSadaf Ebrahimi 	} else {
1685*22dc650dSSadaf Ebrahimi 		FUNCTION_CHECK_DST(dst, dstw);
1686*22dc650dSSadaf Ebrahimi 	}
1687*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC(src1, src1w);
1688*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC(src2, src2w);
1689*22dc650dSSadaf Ebrahimi 	compiler->last_flags = GET_FLAG_TYPE(op) | (op & (SLJIT_32 | SLJIT_SET_Z));
1690*22dc650dSSadaf Ebrahimi #endif
1691*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1692*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1693*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  %s%s%s%s%s ", op2_names[GET_OPCODE(op) - SLJIT_OP2_BASE], !(op & SLJIT_32) ? "" : "32",
1694*22dc650dSSadaf Ebrahimi 			!(op & SLJIT_SET_Z) ? "" : ".z", !(op & VARIABLE_FLAG_MASK) ? "" : ".",
1695*22dc650dSSadaf Ebrahimi 			!(op & VARIABLE_FLAG_MASK) ? "" : jump_names[GET_FLAG_TYPE(op)]);
1696*22dc650dSSadaf Ebrahimi 		if (unset)
1697*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "unset");
1698*22dc650dSSadaf Ebrahimi 		else
1699*22dc650dSSadaf Ebrahimi 			sljit_verbose_param(compiler, dst, dstw);
1700*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
1701*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, src1, src1w);
1702*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
1703*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, src2, src2w);
1704*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
1705*22dc650dSSadaf Ebrahimi 	}
1706*22dc650dSSadaf Ebrahimi #endif
1707*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1708*22dc650dSSadaf Ebrahimi }
1709*22dc650dSSadaf Ebrahimi 
check_sljit_emit_op2r(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst_reg,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)1710*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op2r(struct sljit_compiler *compiler, sljit_s32 op,
1711*22dc650dSSadaf Ebrahimi 	sljit_s32 dst_reg,
1712*22dc650dSSadaf Ebrahimi 	sljit_s32 src1, sljit_sw src1w,
1713*22dc650dSSadaf Ebrahimi 	sljit_s32 src2, sljit_sw src2w)
1714*22dc650dSSadaf Ebrahimi {
1715*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1716*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((op | SLJIT_32) == SLJIT_MULADD32);
1717*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(dst_reg));
1718*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC(src1, src1w);
1719*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC(src2, src2w);
1720*22dc650dSSadaf Ebrahimi 	compiler->last_flags = 0;
1721*22dc650dSSadaf Ebrahimi #endif
1722*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1723*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1724*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  %s%s ", op2r_names[GET_OPCODE(op) - SLJIT_OP2R_BASE], !(op & SLJIT_32) ? "" : "32");
1725*22dc650dSSadaf Ebrahimi 
1726*22dc650dSSadaf Ebrahimi 		sljit_verbose_reg(compiler, dst_reg);
1727*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
1728*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, src1, src1w);
1729*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
1730*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, src2, src2w);
1731*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
1732*22dc650dSSadaf Ebrahimi 	}
1733*22dc650dSSadaf Ebrahimi #endif
1734*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1735*22dc650dSSadaf Ebrahimi }
1736*22dc650dSSadaf Ebrahimi 
check_sljit_emit_shift_into(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst_reg,sljit_s32 src1_reg,sljit_s32 src2_reg,sljit_s32 src3,sljit_sw src3w)1737*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_shift_into(struct sljit_compiler *compiler, sljit_s32 op,
1738*22dc650dSSadaf Ebrahimi 	sljit_s32 dst_reg,
1739*22dc650dSSadaf Ebrahimi 	sljit_s32 src1_reg,
1740*22dc650dSSadaf Ebrahimi 	sljit_s32 src2_reg,
1741*22dc650dSSadaf Ebrahimi 	sljit_s32 src3, sljit_sw src3w)
1742*22dc650dSSadaf Ebrahimi {
1743*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1744*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(GET_OPCODE(op) == SLJIT_SHL || GET_OPCODE(op) == SLJIT_LSHR
1745*22dc650dSSadaf Ebrahimi 		|| GET_OPCODE(op) == SLJIT_MSHL || GET_OPCODE(op) == SLJIT_MLSHR);
1746*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((op & ~(0xff | SLJIT_32 | SLJIT_SHIFT_INTO_NON_ZERO)) == 0);
1747*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(dst_reg));
1748*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src1_reg));
1749*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src2_reg));
1750*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC(src3, src3w);
1751*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(dst_reg != src2_reg);
1752*22dc650dSSadaf Ebrahimi #endif
1753*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1754*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1755*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  %s%s.into%s ", op2_names[GET_OPCODE(op) - SLJIT_OP2_BASE], !(op & SLJIT_32) ? "" : "32",
1756*22dc650dSSadaf Ebrahimi 			(op & SLJIT_SHIFT_INTO_NON_ZERO) ? ".nz" : "");
1757*22dc650dSSadaf Ebrahimi 
1758*22dc650dSSadaf Ebrahimi 		sljit_verbose_reg(compiler, dst_reg);
1759*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
1760*22dc650dSSadaf Ebrahimi 		sljit_verbose_reg(compiler, src1_reg);
1761*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
1762*22dc650dSSadaf Ebrahimi 		sljit_verbose_reg(compiler, src2_reg);
1763*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
1764*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, src3, src3w);
1765*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
1766*22dc650dSSadaf Ebrahimi 	}
1767*22dc650dSSadaf Ebrahimi #endif
1768*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1769*22dc650dSSadaf Ebrahimi }
1770*22dc650dSSadaf Ebrahimi 
check_sljit_emit_op_src(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 src,sljit_sw srcw)1771*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op,
1772*22dc650dSSadaf Ebrahimi 	sljit_s32 src, sljit_sw srcw)
1773*22dc650dSSadaf Ebrahimi {
1774*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1775*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(op >= SLJIT_FAST_RETURN && op <= SLJIT_PREFETCH_ONCE);
1776*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC(src, srcw);
1777*22dc650dSSadaf Ebrahimi 
1778*22dc650dSSadaf Ebrahimi 	if (op == SLJIT_FAST_RETURN || op == SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN) {
1779*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(src != SLJIT_IMM);
1780*22dc650dSSadaf Ebrahimi 		compiler->last_flags = 0;
1781*22dc650dSSadaf Ebrahimi 	} else if (op >= SLJIT_PREFETCH_L1 && op <= SLJIT_PREFETCH_ONCE) {
1782*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(src & SLJIT_MEM);
1783*22dc650dSSadaf Ebrahimi 	}
1784*22dc650dSSadaf Ebrahimi #endif
1785*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1786*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1787*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  %s ", op_src_dst_names[op - SLJIT_OP_SRC_DST_BASE]);
1788*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, src, srcw);
1789*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
1790*22dc650dSSadaf Ebrahimi 	}
1791*22dc650dSSadaf Ebrahimi #endif
1792*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1793*22dc650dSSadaf Ebrahimi }
1794*22dc650dSSadaf Ebrahimi 
check_sljit_emit_op_dst(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst,sljit_sw dstw)1795*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_dst(struct sljit_compiler *compiler, sljit_s32 op,
1796*22dc650dSSadaf Ebrahimi 	sljit_s32 dst, sljit_sw dstw)
1797*22dc650dSSadaf Ebrahimi {
1798*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1799*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(op >= SLJIT_FAST_ENTER && op <= SLJIT_GET_RETURN_ADDRESS);
1800*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_DST(dst, dstw);
1801*22dc650dSSadaf Ebrahimi 
1802*22dc650dSSadaf Ebrahimi 	if (op == SLJIT_FAST_ENTER)
1803*22dc650dSSadaf Ebrahimi 		compiler->last_flags = 0;
1804*22dc650dSSadaf Ebrahimi #endif
1805*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1806*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1807*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  %s ", op_src_dst_names[op - SLJIT_OP_SRC_DST_BASE]);
1808*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, dst, dstw);
1809*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
1810*22dc650dSSadaf Ebrahimi 	}
1811*22dc650dSSadaf Ebrahimi #endif
1812*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1813*22dc650dSSadaf Ebrahimi }
1814*22dc650dSSadaf Ebrahimi 
check_sljit_get_register_index(sljit_s32 type,sljit_s32 reg)1815*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_register_index(sljit_s32 type, sljit_s32 reg)
1816*22dc650dSSadaf Ebrahimi {
1817*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(type);
1818*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(reg);
1819*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1820*22dc650dSSadaf Ebrahimi 	if (type == SLJIT_GP_REGISTER) {
1821*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT((reg > 0 && reg <= SLJIT_NUMBER_OF_REGISTERS)
1822*22dc650dSSadaf Ebrahimi 			|| (reg >= SLJIT_TMP_REGISTER_BASE && reg < (SLJIT_TMP_REGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_REGISTERS)));
1823*22dc650dSSadaf Ebrahimi 	} else {
1824*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(type == SLJIT_FLOAT_REGISTER || ((type >> 12) == 0 || ((type >> 12) >= 3 && (type >> 12) <= 6)));
1825*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT((reg > 0 && reg <= SLJIT_NUMBER_OF_FLOAT_REGISTERS)
1826*22dc650dSSadaf Ebrahimi 			|| (reg >= SLJIT_TMP_FREGISTER_BASE && reg < (SLJIT_TMP_FREGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS)));
1827*22dc650dSSadaf Ebrahimi 	}
1828*22dc650dSSadaf Ebrahimi #endif
1829*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1830*22dc650dSSadaf Ebrahimi }
1831*22dc650dSSadaf Ebrahimi 
check_sljit_emit_op_custom(struct sljit_compiler * compiler,void * instruction,sljit_u32 size)1832*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_custom(struct sljit_compiler *compiler,
1833*22dc650dSSadaf Ebrahimi 	void *instruction, sljit_u32 size)
1834*22dc650dSSadaf Ebrahimi {
1835*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1836*22dc650dSSadaf Ebrahimi 	sljit_u32 i;
1837*22dc650dSSadaf Ebrahimi #endif
1838*22dc650dSSadaf Ebrahimi 
1839*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(compiler);
1840*22dc650dSSadaf Ebrahimi 
1841*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1842*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(instruction);
1843*22dc650dSSadaf Ebrahimi 
1844*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
1845*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(size > 0 && size < 16);
1846*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
1847*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((size == 2 && (((sljit_sw)instruction) & 0x1) == 0)
1848*22dc650dSSadaf Ebrahimi 		|| (size == 4 && (((sljit_sw)instruction) & 0x3) == 0));
1849*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)
1850*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(size == 2 || size == 4 || size == 6);
1851*22dc650dSSadaf Ebrahimi #else
1852*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(size == 4 && (((sljit_sw)instruction) & 0x3) == 0);
1853*22dc650dSSadaf Ebrahimi #endif
1854*22dc650dSSadaf Ebrahimi 
1855*22dc650dSSadaf Ebrahimi 	compiler->last_flags = 0;
1856*22dc650dSSadaf Ebrahimi #endif
1857*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1858*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1859*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  op_custom");
1860*22dc650dSSadaf Ebrahimi 		for (i = 0; i < size; i++)
1861*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, " 0x%x", ((sljit_u8*)instruction)[i]);
1862*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
1863*22dc650dSSadaf Ebrahimi 	}
1864*22dc650dSSadaf Ebrahimi #endif
1865*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1866*22dc650dSSadaf Ebrahimi }
1867*22dc650dSSadaf Ebrahimi 
check_sljit_emit_fop1(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst,sljit_sw dstw,sljit_s32 src,sljit_sw srcw)1868*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,
1869*22dc650dSSadaf Ebrahimi 	sljit_s32 dst, sljit_sw dstw,
1870*22dc650dSSadaf Ebrahimi 	sljit_s32 src, sljit_sw srcw)
1871*22dc650dSSadaf Ebrahimi {
1872*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1873*22dc650dSSadaf Ebrahimi 		compiler->skip_checks = 0;
1874*22dc650dSSadaf Ebrahimi 		CHECK_RETURN_OK;
1875*22dc650dSSadaf Ebrahimi 	}
1876*22dc650dSSadaf Ebrahimi 
1877*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1878*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
1879*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV_F64 && GET_OPCODE(op) <= SLJIT_ABS_F64);
1880*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1881*22dc650dSSadaf Ebrahimi 	FUNCTION_FCHECK(src, srcw, op & SLJIT_32);
1882*22dc650dSSadaf Ebrahimi 	FUNCTION_FCHECK(dst, dstw, op & SLJIT_32);
1883*22dc650dSSadaf Ebrahimi #endif
1884*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1885*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1886*22dc650dSSadaf Ebrahimi 		if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32)
1887*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "  %s%s ", fop1_names[SLJIT_CONV_F64_FROM_F32 - SLJIT_FOP1_BASE],
1888*22dc650dSSadaf Ebrahimi 				(op & SLJIT_32) ? ".f32.from.f64" : ".f64.from.f32");
1889*22dc650dSSadaf Ebrahimi 		else
1890*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "  %s%s ", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE],
1891*22dc650dSSadaf Ebrahimi 				(op & SLJIT_32) ? ".f32" : ".f64");
1892*22dc650dSSadaf Ebrahimi 
1893*22dc650dSSadaf Ebrahimi 		sljit_verbose_fparam(compiler, dst, dstw);
1894*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
1895*22dc650dSSadaf Ebrahimi 		sljit_verbose_fparam(compiler, src, srcw);
1896*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
1897*22dc650dSSadaf Ebrahimi 	}
1898*22dc650dSSadaf Ebrahimi #endif
1899*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1900*22dc650dSSadaf Ebrahimi }
1901*22dc650dSSadaf Ebrahimi 
check_sljit_emit_fop1_cmp(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)1902*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,
1903*22dc650dSSadaf Ebrahimi 	sljit_s32 src1, sljit_sw src1w,
1904*22dc650dSSadaf Ebrahimi 	sljit_s32 src2, sljit_sw src2w)
1905*22dc650dSSadaf Ebrahimi {
1906*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1907*22dc650dSSadaf Ebrahimi 	compiler->last_flags = GET_FLAG_TYPE(op) | (op & SLJIT_32);
1908*22dc650dSSadaf Ebrahimi #endif
1909*22dc650dSSadaf Ebrahimi 
1910*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1911*22dc650dSSadaf Ebrahimi 		compiler->skip_checks = 0;
1912*22dc650dSSadaf Ebrahimi 		CHECK_RETURN_OK;
1913*22dc650dSSadaf Ebrahimi 	}
1914*22dc650dSSadaf Ebrahimi 
1915*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1916*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
1917*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(GET_OPCODE(op) == SLJIT_CMP_F64);
1918*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(!(op & SLJIT_SET_Z));
1919*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((op & VARIABLE_FLAG_MASK)
1920*22dc650dSSadaf Ebrahimi 		|| (GET_FLAG_TYPE(op) >= SLJIT_F_EQUAL && GET_FLAG_TYPE(op) <= SLJIT_ORDERED_LESS_EQUAL));
1921*22dc650dSSadaf Ebrahimi 	FUNCTION_FCHECK(src1, src1w, op & SLJIT_32);
1922*22dc650dSSadaf Ebrahimi 	FUNCTION_FCHECK(src2, src2w, op & SLJIT_32);
1923*22dc650dSSadaf Ebrahimi #endif
1924*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1925*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1926*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  %s%s", fop1_names[SLJIT_CMP_F64 - SLJIT_FOP1_BASE], (op & SLJIT_32) ? ".f32" : ".f64");
1927*22dc650dSSadaf Ebrahimi 		if (op & VARIABLE_FLAG_MASK) {
1928*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, ".%s", jump_names[GET_FLAG_TYPE(op)]);
1929*22dc650dSSadaf Ebrahimi 		}
1930*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, " ");
1931*22dc650dSSadaf Ebrahimi 		sljit_verbose_fparam(compiler, src1, src1w);
1932*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
1933*22dc650dSSadaf Ebrahimi 		sljit_verbose_fparam(compiler, src2, src2w);
1934*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
1935*22dc650dSSadaf Ebrahimi 	}
1936*22dc650dSSadaf Ebrahimi #endif
1937*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1938*22dc650dSSadaf Ebrahimi }
1939*22dc650dSSadaf Ebrahimi 
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)1940*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,
1941*22dc650dSSadaf Ebrahimi 	sljit_s32 dst, sljit_sw dstw,
1942*22dc650dSSadaf Ebrahimi 	sljit_s32 src, sljit_sw srcw)
1943*22dc650dSSadaf Ebrahimi {
1944*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1945*22dc650dSSadaf Ebrahimi 		compiler->skip_checks = 0;
1946*22dc650dSSadaf Ebrahimi 		CHECK_RETURN_OK;
1947*22dc650dSSadaf Ebrahimi 	}
1948*22dc650dSSadaf Ebrahimi 
1949*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1950*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
1951*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1952*22dc650dSSadaf Ebrahimi 	FUNCTION_FCHECK(src, srcw, op & SLJIT_32);
1953*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_DST(dst, dstw);
1954*22dc650dSSadaf Ebrahimi #endif
1955*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1956*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1957*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  %s%s.from%s ", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE],
1958*22dc650dSSadaf Ebrahimi 			fop1_conv_types[GET_OPCODE(op) - SLJIT_CONV_SW_FROM_F64],
1959*22dc650dSSadaf Ebrahimi 			(op & SLJIT_32) ? ".f32" : ".f64");
1960*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, dst, dstw);
1961*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
1962*22dc650dSSadaf Ebrahimi 		sljit_verbose_fparam(compiler, src, srcw);
1963*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
1964*22dc650dSSadaf Ebrahimi 	}
1965*22dc650dSSadaf Ebrahimi #endif
1966*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1967*22dc650dSSadaf Ebrahimi }
1968*22dc650dSSadaf Ebrahimi 
check_sljit_emit_fop1_conv_f64_from_w(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst,sljit_sw dstw,sljit_s32 src,sljit_sw srcw)1969*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_conv_f64_from_w(struct sljit_compiler *compiler, sljit_s32 op,
1970*22dc650dSSadaf Ebrahimi 	sljit_s32 dst, sljit_sw dstw,
1971*22dc650dSSadaf Ebrahimi 	sljit_s32 src, sljit_sw srcw)
1972*22dc650dSSadaf Ebrahimi {
1973*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
1974*22dc650dSSadaf Ebrahimi 		compiler->skip_checks = 0;
1975*22dc650dSSadaf Ebrahimi 		CHECK_RETURN_OK;
1976*22dc650dSSadaf Ebrahimi 	}
1977*22dc650dSSadaf Ebrahimi 
1978*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1979*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
1980*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1981*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC(src, srcw);
1982*22dc650dSSadaf Ebrahimi 	FUNCTION_FCHECK(dst, dstw, op & SLJIT_32);
1983*22dc650dSSadaf Ebrahimi #endif
1984*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1985*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
1986*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  %s%s.from.%s ", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE],
1987*22dc650dSSadaf Ebrahimi 			(op & SLJIT_32) ? ".f32" : ".f64",
1988*22dc650dSSadaf Ebrahimi 			fop1_conv_types[GET_OPCODE(op) - SLJIT_CONV_SW_FROM_F64]);
1989*22dc650dSSadaf Ebrahimi 		sljit_verbose_fparam(compiler, dst, dstw);
1990*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
1991*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, src, srcw);
1992*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
1993*22dc650dSSadaf Ebrahimi 	}
1994*22dc650dSSadaf Ebrahimi #endif
1995*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
1996*22dc650dSSadaf Ebrahimi }
1997*22dc650dSSadaf Ebrahimi 
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)1998*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,
1999*22dc650dSSadaf Ebrahimi 	sljit_s32 dst, sljit_sw dstw,
2000*22dc650dSSadaf Ebrahimi 	sljit_s32 src1, sljit_sw src1w,
2001*22dc650dSSadaf Ebrahimi 	sljit_s32 src2, sljit_sw src2w)
2002*22dc650dSSadaf Ebrahimi {
2003*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
2004*22dc650dSSadaf Ebrahimi 		compiler->skip_checks = 0;
2005*22dc650dSSadaf Ebrahimi 		CHECK_RETURN_OK;
2006*22dc650dSSadaf Ebrahimi 	}
2007*22dc650dSSadaf Ebrahimi 
2008*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2009*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
2010*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_ADD_F64 && GET_OPCODE(op) <= SLJIT_DIV_F64);
2011*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
2012*22dc650dSSadaf Ebrahimi 	FUNCTION_FCHECK(src1, src1w, op & SLJIT_32);
2013*22dc650dSSadaf Ebrahimi 	FUNCTION_FCHECK(src2, src2w, op & SLJIT_32);
2014*22dc650dSSadaf Ebrahimi 	FUNCTION_FCHECK(dst, dstw, op & SLJIT_32);
2015*22dc650dSSadaf Ebrahimi #endif
2016*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2017*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2018*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  %s%s ", fop2_names[GET_OPCODE(op) - SLJIT_FOP2_BASE], (op & SLJIT_32) ? ".f32" : ".f64");
2019*22dc650dSSadaf Ebrahimi 		sljit_verbose_fparam(compiler, dst, dstw);
2020*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2021*22dc650dSSadaf Ebrahimi 		sljit_verbose_fparam(compiler, src1, src1w);
2022*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2023*22dc650dSSadaf Ebrahimi 		sljit_verbose_fparam(compiler, src2, src2w);
2024*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2025*22dc650dSSadaf Ebrahimi 	}
2026*22dc650dSSadaf Ebrahimi #endif
2027*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2028*22dc650dSSadaf Ebrahimi }
2029*22dc650dSSadaf Ebrahimi 
check_sljit_emit_fop2r(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst_freg,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)2030*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop2r(struct sljit_compiler *compiler, sljit_s32 op,
2031*22dc650dSSadaf Ebrahimi 	sljit_s32 dst_freg,
2032*22dc650dSSadaf Ebrahimi 	sljit_s32 src1, sljit_sw src1w,
2033*22dc650dSSadaf Ebrahimi 	sljit_s32 src2, sljit_sw src2w)
2034*22dc650dSSadaf Ebrahimi {
2035*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2036*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
2037*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(GET_OPCODE(op) == SLJIT_COPYSIGN_F64);
2038*22dc650dSSadaf Ebrahimi 	FUNCTION_FCHECK(src1, src1w, op & SLJIT_32);
2039*22dc650dSSadaf Ebrahimi 	FUNCTION_FCHECK(src2, src2w, op & SLJIT_32);
2040*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(dst_freg, op & SLJIT_32));
2041*22dc650dSSadaf Ebrahimi #endif
2042*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2043*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2044*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  %s%s ", fop2r_names[GET_OPCODE(op) - SLJIT_FOP2R_BASE], (op & SLJIT_32) ? ".f32" : ".f64");
2045*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, dst_freg);
2046*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2047*22dc650dSSadaf Ebrahimi 		sljit_verbose_fparam(compiler, src1, src1w);
2048*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2049*22dc650dSSadaf Ebrahimi 		sljit_verbose_fparam(compiler, src2, src2w);
2050*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2051*22dc650dSSadaf Ebrahimi 	}
2052*22dc650dSSadaf Ebrahimi #endif
2053*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2054*22dc650dSSadaf Ebrahimi }
2055*22dc650dSSadaf Ebrahimi 
check_sljit_emit_fset32(struct sljit_compiler * compiler,sljit_s32 freg,sljit_f32 value)2056*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fset32(struct sljit_compiler *compiler,
2057*22dc650dSSadaf Ebrahimi 	sljit_s32 freg, sljit_f32 value)
2058*22dc650dSSadaf Ebrahimi {
2059*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(value);
2060*22dc650dSSadaf Ebrahimi 
2061*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
2062*22dc650dSSadaf Ebrahimi 		compiler->skip_checks = 0;
2063*22dc650dSSadaf Ebrahimi 		CHECK_RETURN_OK;
2064*22dc650dSSadaf Ebrahimi 	}
2065*22dc650dSSadaf Ebrahimi 
2066*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2067*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
2068*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 1));
2069*22dc650dSSadaf Ebrahimi #endif
2070*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2071*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2072*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  fset32 ");
2073*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, freg);
2074*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", %f\n", value);
2075*22dc650dSSadaf Ebrahimi 	}
2076*22dc650dSSadaf Ebrahimi #endif
2077*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2078*22dc650dSSadaf Ebrahimi }
2079*22dc650dSSadaf Ebrahimi 
check_sljit_emit_fset64(struct sljit_compiler * compiler,sljit_s32 freg,sljit_f64 value)2080*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fset64(struct sljit_compiler *compiler,
2081*22dc650dSSadaf Ebrahimi 	sljit_s32 freg, sljit_f64 value)
2082*22dc650dSSadaf Ebrahimi {
2083*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(value);
2084*22dc650dSSadaf Ebrahimi 
2085*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
2086*22dc650dSSadaf Ebrahimi 		compiler->skip_checks = 0;
2087*22dc650dSSadaf Ebrahimi 		CHECK_RETURN_OK;
2088*22dc650dSSadaf Ebrahimi 	}
2089*22dc650dSSadaf Ebrahimi 
2090*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2091*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
2092*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
2093*22dc650dSSadaf Ebrahimi #endif
2094*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2095*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2096*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  fset64 ");
2097*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, freg);
2098*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", %f\n", value);
2099*22dc650dSSadaf Ebrahimi 	}
2100*22dc650dSSadaf Ebrahimi #endif
2101*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2102*22dc650dSSadaf Ebrahimi }
2103*22dc650dSSadaf Ebrahimi 
check_sljit_emit_fcopy(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 freg,sljit_s32 reg)2104*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op,
2105*22dc650dSSadaf Ebrahimi 	sljit_s32 freg, sljit_s32 reg)
2106*22dc650dSSadaf Ebrahimi {
2107*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2108*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
2109*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_COPY_TO_F64 && GET_OPCODE(op) <= SLJIT_COPY_FROM_F64);
2110*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
2111*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, op & SLJIT_32));
2112*22dc650dSSadaf Ebrahimi 
2113*22dc650dSSadaf Ebrahimi #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2114*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(reg));
2115*22dc650dSSadaf Ebrahimi #else /* !SLJIT_64BIT_ARCHITECTURE */
2116*22dc650dSSadaf Ebrahimi 	switch (op) {
2117*22dc650dSSadaf Ebrahimi 	case SLJIT_COPY32_TO_F32:
2118*22dc650dSSadaf Ebrahimi 	case SLJIT_COPY32_FROM_F32:
2119*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(reg));
2120*22dc650dSSadaf Ebrahimi 		break;
2121*22dc650dSSadaf Ebrahimi 	case SLJIT_COPY_TO_F64:
2122*22dc650dSSadaf Ebrahimi 	case SLJIT_COPY_FROM_F64:
2123*22dc650dSSadaf Ebrahimi 		if (reg & REG_PAIR_MASK) {
2124*22dc650dSSadaf Ebrahimi 			CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(REG_PAIR_FIRST(reg)));
2125*22dc650dSSadaf Ebrahimi 			CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(REG_PAIR_SECOND(reg)));
2126*22dc650dSSadaf Ebrahimi 
2127*22dc650dSSadaf Ebrahimi 			if (op == SLJIT_COPY_TO_F64)
2128*22dc650dSSadaf Ebrahimi 				break;
2129*22dc650dSSadaf Ebrahimi 
2130*22dc650dSSadaf Ebrahimi 			CHECK_ARGUMENT(REG_PAIR_FIRST(reg) != REG_PAIR_SECOND(reg));
2131*22dc650dSSadaf Ebrahimi 			break;
2132*22dc650dSSadaf Ebrahimi 		}
2133*22dc650dSSadaf Ebrahimi 
2134*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(reg));
2135*22dc650dSSadaf Ebrahimi 		break;
2136*22dc650dSSadaf Ebrahimi 	}
2137*22dc650dSSadaf Ebrahimi #endif /* SLJIT_64BIT_ARCHITECTURE */
2138*22dc650dSSadaf Ebrahimi #endif
2139*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2140*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2141*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  copy%s_%s_f%s ", (op & SLJIT_32) ? "32" : "",
2142*22dc650dSSadaf Ebrahimi 			GET_OPCODE(op) == SLJIT_COPY_TO_F64 ? "to" : "from", (op & SLJIT_32) ? "32" : "64");
2143*22dc650dSSadaf Ebrahimi 
2144*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, freg);
2145*22dc650dSSadaf Ebrahimi 
2146*22dc650dSSadaf Ebrahimi 		if (reg & REG_PAIR_MASK) {
2147*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, ", {");
2148*22dc650dSSadaf Ebrahimi 			sljit_verbose_reg(compiler, REG_PAIR_FIRST(reg));
2149*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, ", ");
2150*22dc650dSSadaf Ebrahimi 			sljit_verbose_reg(compiler, REG_PAIR_SECOND(reg));
2151*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "}\n");
2152*22dc650dSSadaf Ebrahimi 		} else {
2153*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, ", ");
2154*22dc650dSSadaf Ebrahimi 			sljit_verbose_reg(compiler, reg);
2155*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "\n");
2156*22dc650dSSadaf Ebrahimi 		}
2157*22dc650dSSadaf Ebrahimi 	}
2158*22dc650dSSadaf Ebrahimi #endif
2159*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2160*22dc650dSSadaf Ebrahimi }
2161*22dc650dSSadaf Ebrahimi 
check_sljit_emit_label(struct sljit_compiler * compiler)2162*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_label(struct sljit_compiler *compiler)
2163*22dc650dSSadaf Ebrahimi {
2164*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(compiler);
2165*22dc650dSSadaf Ebrahimi 
2166*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
2167*22dc650dSSadaf Ebrahimi 		compiler->skip_checks = 0;
2168*22dc650dSSadaf Ebrahimi 		CHECK_RETURN_OK;
2169*22dc650dSSadaf Ebrahimi 	}
2170*22dc650dSSadaf Ebrahimi 
2171*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2172*22dc650dSSadaf Ebrahimi 	compiler->last_flags = 0;
2173*22dc650dSSadaf Ebrahimi #endif
2174*22dc650dSSadaf Ebrahimi 
2175*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2176*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose))
2177*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "label:\n");
2178*22dc650dSSadaf Ebrahimi #endif
2179*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2180*22dc650dSSadaf Ebrahimi }
2181*22dc650dSSadaf Ebrahimi 
2182*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2183*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
2184*22dc650dSSadaf Ebrahimi 	|| (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
2185*22dc650dSSadaf Ebrahimi #define CHECK_UNORDERED(type, last_flags) \
2186*22dc650dSSadaf Ebrahimi 	((((type) & 0xfe) == SLJIT_ORDERED) && \
2187*22dc650dSSadaf Ebrahimi 		((last_flags) & 0xff) >= SLJIT_UNORDERED && ((last_flags) & 0xff) <= SLJIT_ORDERED_LESS_EQUAL)
2188*22dc650dSSadaf Ebrahimi #else
2189*22dc650dSSadaf Ebrahimi #define CHECK_UNORDERED(type, last_flags) 0
2190*22dc650dSSadaf Ebrahimi #endif
2191*22dc650dSSadaf Ebrahimi #endif /* SLJIT_ARGUMENT_CHECKS */
2192*22dc650dSSadaf Ebrahimi 
check_sljit_emit_jump(struct sljit_compiler * compiler,sljit_s32 type)2193*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)
2194*22dc650dSSadaf Ebrahimi {
2195*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
2196*22dc650dSSadaf Ebrahimi 		compiler->skip_checks = 0;
2197*22dc650dSSadaf Ebrahimi 		CHECK_RETURN_OK;
2198*22dc650dSSadaf Ebrahimi 	}
2199*22dc650dSSadaf Ebrahimi 
2200*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2201*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP)));
2202*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_FAST_CALL);
2203*22dc650dSSadaf Ebrahimi 
2204*22dc650dSSadaf Ebrahimi 	if ((type & 0xff) < SLJIT_JUMP) {
2205*22dc650dSSadaf Ebrahimi 		if ((type & 0xff) <= SLJIT_NOT_ZERO)
2206*22dc650dSSadaf Ebrahimi 			CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z);
2207*22dc650dSSadaf Ebrahimi 		else if ((compiler->last_flags & 0xff) == SLJIT_CARRY) {
2208*22dc650dSSadaf Ebrahimi 			CHECK_ARGUMENT((type & 0xfe) == SLJIT_CARRY);
2209*22dc650dSSadaf Ebrahimi 			compiler->last_flags = 0;
2210*22dc650dSSadaf Ebrahimi 		} else
2211*22dc650dSSadaf Ebrahimi 			CHECK_ARGUMENT((type & 0xfe) == (compiler->last_flags & 0xff)
2212*22dc650dSSadaf Ebrahimi 				|| CHECK_UNORDERED(type, compiler->last_flags));
2213*22dc650dSSadaf Ebrahimi 	}
2214*22dc650dSSadaf Ebrahimi #endif
2215*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2216*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose))
2217*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  jump%s %s\n", !(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r",
2218*22dc650dSSadaf Ebrahimi 			jump_names[type & 0xff]);
2219*22dc650dSSadaf Ebrahimi #endif
2220*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2221*22dc650dSSadaf Ebrahimi }
2222*22dc650dSSadaf Ebrahimi 
check_sljit_emit_call(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 arg_types)2223*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,
2224*22dc650dSSadaf Ebrahimi 	sljit_s32 arg_types)
2225*22dc650dSSadaf Ebrahimi {
2226*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2227*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | SLJIT_CALL_RETURN)));
2228*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & 0xff) >= SLJIT_CALL && (type & 0xff) <= SLJIT_CALL_REG_ARG);
2229*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(function_check_arguments(arg_types, compiler->scratches, -1, compiler->fscratches));
2230*22dc650dSSadaf Ebrahimi 
2231*22dc650dSSadaf Ebrahimi 	if (type & SLJIT_CALL_RETURN) {
2232*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT((arg_types & SLJIT_ARG_MASK) == compiler->last_return);
2233*22dc650dSSadaf Ebrahimi 
2234*22dc650dSSadaf Ebrahimi 		if (compiler->options & SLJIT_ENTER_REG_ARG) {
2235*22dc650dSSadaf Ebrahimi 			CHECK_ARGUMENT((type & 0xff) == SLJIT_CALL_REG_ARG);
2236*22dc650dSSadaf Ebrahimi 		} else {
2237*22dc650dSSadaf Ebrahimi 			CHECK_ARGUMENT((type & 0xff) != SLJIT_CALL_REG_ARG);
2238*22dc650dSSadaf Ebrahimi 		}
2239*22dc650dSSadaf Ebrahimi 	}
2240*22dc650dSSadaf Ebrahimi #endif
2241*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2242*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2243*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  %s%s%s ret[%s", jump_names[type & 0xff],
2244*22dc650dSSadaf Ebrahimi 			!(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r",
2245*22dc650dSSadaf Ebrahimi 			!(type & SLJIT_CALL_RETURN) ? "" : ".ret",
2246*22dc650dSSadaf Ebrahimi 			call_arg_names[arg_types & SLJIT_ARG_MASK]);
2247*22dc650dSSadaf Ebrahimi 
2248*22dc650dSSadaf Ebrahimi 		arg_types >>= SLJIT_ARG_SHIFT;
2249*22dc650dSSadaf Ebrahimi 		if (arg_types) {
2250*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "], args[");
2251*22dc650dSSadaf Ebrahimi 			do {
2252*22dc650dSSadaf Ebrahimi 				fprintf(compiler->verbose, "%s", call_arg_names[arg_types & SLJIT_ARG_MASK]);
2253*22dc650dSSadaf Ebrahimi 				arg_types >>= SLJIT_ARG_SHIFT;
2254*22dc650dSSadaf Ebrahimi 				if (arg_types)
2255*22dc650dSSadaf Ebrahimi 					fprintf(compiler->verbose, ",");
2256*22dc650dSSadaf Ebrahimi 			} while (arg_types);
2257*22dc650dSSadaf Ebrahimi 		}
2258*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "]\n");
2259*22dc650dSSadaf Ebrahimi 	}
2260*22dc650dSSadaf Ebrahimi #endif
2261*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2262*22dc650dSSadaf Ebrahimi }
2263*22dc650dSSadaf Ebrahimi 
check_sljit_emit_cmp(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)2264*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type,
2265*22dc650dSSadaf Ebrahimi 	sljit_s32 src1, sljit_sw src1w,
2266*22dc650dSSadaf Ebrahimi 	sljit_s32 src2, sljit_sw src2w)
2267*22dc650dSSadaf Ebrahimi {
2268*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2269*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | SLJIT_32)));
2270*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_SIG_LESS_EQUAL);
2271*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC(src1, src1w);
2272*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC(src2, src2w);
2273*22dc650dSSadaf Ebrahimi 	compiler->last_flags = 0;
2274*22dc650dSSadaf Ebrahimi #endif
2275*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2276*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2277*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  cmp%s%s %s, ", (type & SLJIT_32) ? "32" : "",
2278*22dc650dSSadaf Ebrahimi 			!(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r", jump_names[type & 0xff]);
2279*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, src1, src1w);
2280*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2281*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, src2, src2w);
2282*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2283*22dc650dSSadaf Ebrahimi 	}
2284*22dc650dSSadaf Ebrahimi #endif
2285*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2286*22dc650dSSadaf Ebrahimi }
2287*22dc650dSSadaf Ebrahimi 
check_sljit_emit_fcmp(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)2288*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_s32 type,
2289*22dc650dSSadaf Ebrahimi 	sljit_s32 src1, sljit_sw src1w,
2290*22dc650dSSadaf Ebrahimi 	sljit_s32 src2, sljit_sw src2w)
2291*22dc650dSSadaf Ebrahimi {
2292*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2293*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
2294*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | SLJIT_32)));
2295*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & 0xff) >= SLJIT_F_EQUAL && (type & 0xff) <= SLJIT_ORDERED_LESS_EQUAL);
2296*22dc650dSSadaf Ebrahimi 	FUNCTION_FCHECK(src1, src1w, type & SLJIT_32);
2297*22dc650dSSadaf Ebrahimi 	FUNCTION_FCHECK(src2, src2w, type & SLJIT_32);
2298*22dc650dSSadaf Ebrahimi 	compiler->last_flags = 0;
2299*22dc650dSSadaf Ebrahimi #endif
2300*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2301*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2302*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  fcmp%s%s %s, ", (type & SLJIT_32) ? ".f32" : ".f64",
2303*22dc650dSSadaf Ebrahimi 			!(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r", jump_names[type & 0xff]);
2304*22dc650dSSadaf Ebrahimi 		sljit_verbose_fparam(compiler, src1, src1w);
2305*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2306*22dc650dSSadaf Ebrahimi 		sljit_verbose_fparam(compiler, src2, src2w);
2307*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2308*22dc650dSSadaf Ebrahimi 	}
2309*22dc650dSSadaf Ebrahimi #endif
2310*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2311*22dc650dSSadaf Ebrahimi }
2312*22dc650dSSadaf Ebrahimi 
check_sljit_emit_ijump(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 src,sljit_sw srcw)2313*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type,
2314*22dc650dSSadaf Ebrahimi 	sljit_s32 src, sljit_sw srcw)
2315*22dc650dSSadaf Ebrahimi {
2316*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
2317*22dc650dSSadaf Ebrahimi 		compiler->skip_checks = 0;
2318*22dc650dSSadaf Ebrahimi 		CHECK_RETURN_OK;
2319*22dc650dSSadaf Ebrahimi 	}
2320*22dc650dSSadaf Ebrahimi 
2321*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2322*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(type >= SLJIT_JUMP && type <= SLJIT_FAST_CALL);
2323*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC(src, srcw);
2324*22dc650dSSadaf Ebrahimi #endif
2325*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2326*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2327*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  ijump.%s ", jump_names[type]);
2328*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, src, srcw);
2329*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2330*22dc650dSSadaf Ebrahimi 	}
2331*22dc650dSSadaf Ebrahimi #endif
2332*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2333*22dc650dSSadaf Ebrahimi }
2334*22dc650dSSadaf Ebrahimi 
check_sljit_emit_icall(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 arg_types,sljit_s32 src,sljit_sw srcw)2335*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type,
2336*22dc650dSSadaf Ebrahimi 	sljit_s32 arg_types,
2337*22dc650dSSadaf Ebrahimi 	sljit_s32 src, sljit_sw srcw)
2338*22dc650dSSadaf Ebrahimi {
2339*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2340*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_CALL_RETURN)));
2341*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & 0xff) >= SLJIT_CALL && (type & 0xff) <= SLJIT_CALL_REG_ARG);
2342*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(function_check_arguments(arg_types, compiler->scratches, -1, compiler->fscratches));
2343*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC(src, srcw);
2344*22dc650dSSadaf Ebrahimi 
2345*22dc650dSSadaf Ebrahimi 	if (type & SLJIT_CALL_RETURN) {
2346*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT((arg_types & SLJIT_ARG_MASK) == compiler->last_return);
2347*22dc650dSSadaf Ebrahimi 
2348*22dc650dSSadaf Ebrahimi 		if (compiler->options & SLJIT_ENTER_REG_ARG) {
2349*22dc650dSSadaf Ebrahimi 			CHECK_ARGUMENT((type & 0xff) == SLJIT_CALL_REG_ARG);
2350*22dc650dSSadaf Ebrahimi 		} else {
2351*22dc650dSSadaf Ebrahimi 			CHECK_ARGUMENT((type & 0xff) != SLJIT_CALL_REG_ARG);
2352*22dc650dSSadaf Ebrahimi 		}
2353*22dc650dSSadaf Ebrahimi 	}
2354*22dc650dSSadaf Ebrahimi #endif
2355*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2356*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2357*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  i%s%s ret[%s", jump_names[type & 0xff],
2358*22dc650dSSadaf Ebrahimi 			!(type & SLJIT_CALL_RETURN) ? "" : ".ret",
2359*22dc650dSSadaf Ebrahimi 			call_arg_names[arg_types & SLJIT_ARG_MASK]);
2360*22dc650dSSadaf Ebrahimi 
2361*22dc650dSSadaf Ebrahimi 		arg_types >>= SLJIT_ARG_SHIFT;
2362*22dc650dSSadaf Ebrahimi 		if (arg_types) {
2363*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "], args[");
2364*22dc650dSSadaf Ebrahimi 			do {
2365*22dc650dSSadaf Ebrahimi 				fprintf(compiler->verbose, "%s", call_arg_names[arg_types & SLJIT_ARG_MASK]);
2366*22dc650dSSadaf Ebrahimi 				arg_types >>= SLJIT_ARG_SHIFT;
2367*22dc650dSSadaf Ebrahimi 				if (arg_types)
2368*22dc650dSSadaf Ebrahimi 					fprintf(compiler->verbose, ",");
2369*22dc650dSSadaf Ebrahimi 			} while (arg_types);
2370*22dc650dSSadaf Ebrahimi 		}
2371*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "], ");
2372*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, src, srcw);
2373*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2374*22dc650dSSadaf Ebrahimi 	}
2375*22dc650dSSadaf Ebrahimi #endif
2376*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2377*22dc650dSSadaf Ebrahimi }
2378*22dc650dSSadaf Ebrahimi 
check_sljit_emit_op_flags(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst,sljit_sw dstw,sljit_s32 type)2379*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,
2380*22dc650dSSadaf Ebrahimi 	sljit_s32 dst, sljit_sw dstw,
2381*22dc650dSSadaf Ebrahimi 	sljit_s32 type)
2382*22dc650dSSadaf Ebrahimi {
2383*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2384*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(type >= SLJIT_EQUAL && type <= SLJIT_ORDERED_LESS_EQUAL);
2385*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(op == SLJIT_MOV || op == SLJIT_MOV32
2386*22dc650dSSadaf Ebrahimi 		|| (GET_OPCODE(op) >= SLJIT_AND && GET_OPCODE(op) <= SLJIT_XOR));
2387*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK));
2388*22dc650dSSadaf Ebrahimi 
2389*22dc650dSSadaf Ebrahimi 	if (type <= SLJIT_NOT_ZERO)
2390*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z);
2391*22dc650dSSadaf Ebrahimi 	else
2392*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT((type & 0xfe) == (compiler->last_flags & 0xff)
2393*22dc650dSSadaf Ebrahimi 			|| CHECK_UNORDERED(type, compiler->last_flags));
2394*22dc650dSSadaf Ebrahimi 
2395*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_DST(dst, dstw);
2396*22dc650dSSadaf Ebrahimi 
2397*22dc650dSSadaf Ebrahimi 	if (GET_OPCODE(op) >= SLJIT_ADD)
2398*22dc650dSSadaf Ebrahimi 		compiler->last_flags = GET_FLAG_TYPE(op) | (op & (SLJIT_32 | SLJIT_SET_Z));
2399*22dc650dSSadaf Ebrahimi #endif
2400*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2401*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2402*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  flags.%s%s%s ",
2403*22dc650dSSadaf Ebrahimi 			GET_OPCODE(op) < SLJIT_OP2_BASE ? "mov" : op2_names[GET_OPCODE(op) - SLJIT_OP2_BASE],
2404*22dc650dSSadaf Ebrahimi 			GET_OPCODE(op) < SLJIT_OP2_BASE ? op1_types[GET_OPCODE(op) - SLJIT_OP1_BASE] : ((op & SLJIT_32) ? "32" : ""),
2405*22dc650dSSadaf Ebrahimi 			!(op & SLJIT_SET_Z) ? "" : ".z");
2406*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, dst, dstw);
2407*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", %s\n", jump_names[type]);
2408*22dc650dSSadaf Ebrahimi 	}
2409*22dc650dSSadaf Ebrahimi #endif
2410*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2411*22dc650dSSadaf Ebrahimi }
2412*22dc650dSSadaf Ebrahimi 
check_sljit_emit_select(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 dst_reg,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2_reg)2413*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type,
2414*22dc650dSSadaf Ebrahimi 	sljit_s32 dst_reg,
2415*22dc650dSSadaf Ebrahimi 	sljit_s32 src1, sljit_sw src1w,
2416*22dc650dSSadaf Ebrahimi 	sljit_s32 src2_reg)
2417*22dc650dSSadaf Ebrahimi {
2418*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2419*22dc650dSSadaf Ebrahimi 	sljit_s32 cond = type & ~SLJIT_32;
2420*22dc650dSSadaf Ebrahimi 
2421*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(cond >= SLJIT_EQUAL && cond <= SLJIT_ORDERED_LESS_EQUAL);
2422*22dc650dSSadaf Ebrahimi 
2423*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(compiler->scratches != -1 && compiler->saveds != -1);
2424*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(dst_reg));
2425*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC(src1, src1w);
2426*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src2_reg));
2427*22dc650dSSadaf Ebrahimi 
2428*22dc650dSSadaf Ebrahimi 	if (cond <= SLJIT_NOT_ZERO)
2429*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z);
2430*22dc650dSSadaf Ebrahimi 	else if ((compiler->last_flags & 0xff) == SLJIT_CARRY) {
2431*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT((type & 0xfe) == SLJIT_CARRY);
2432*22dc650dSSadaf Ebrahimi 		compiler->last_flags = 0;
2433*22dc650dSSadaf Ebrahimi 	} else
2434*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT((cond & 0xfe) == (compiler->last_flags & 0xff)
2435*22dc650dSSadaf Ebrahimi 			|| CHECK_UNORDERED(cond, compiler->last_flags));
2436*22dc650dSSadaf Ebrahimi #endif
2437*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2438*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2439*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  select%s %s, ",
2440*22dc650dSSadaf Ebrahimi 			!(type & SLJIT_32) ? "" : "32",
2441*22dc650dSSadaf Ebrahimi 			jump_names[type & ~SLJIT_32]);
2442*22dc650dSSadaf Ebrahimi 		sljit_verbose_reg(compiler, dst_reg);
2443*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2444*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, src1, src1w);
2445*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2446*22dc650dSSadaf Ebrahimi 		sljit_verbose_reg(compiler, src2_reg);
2447*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2448*22dc650dSSadaf Ebrahimi 	}
2449*22dc650dSSadaf Ebrahimi #endif
2450*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2451*22dc650dSSadaf Ebrahimi }
2452*22dc650dSSadaf Ebrahimi 
check_sljit_emit_fselect(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 dst_freg,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2_freg)2453*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type,
2454*22dc650dSSadaf Ebrahimi 	sljit_s32 dst_freg,
2455*22dc650dSSadaf Ebrahimi 	sljit_s32 src1, sljit_sw src1w,
2456*22dc650dSSadaf Ebrahimi 	sljit_s32 src2_freg)
2457*22dc650dSSadaf Ebrahimi {
2458*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2459*22dc650dSSadaf Ebrahimi 	sljit_s32 cond = type & ~SLJIT_32;
2460*22dc650dSSadaf Ebrahimi 
2461*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(cond >= SLJIT_EQUAL && cond <= SLJIT_ORDERED_LESS_EQUAL);
2462*22dc650dSSadaf Ebrahimi 
2463*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(compiler->fscratches != -1 && compiler->fsaveds != -1);
2464*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(dst_freg, type & SLJIT_32));
2465*22dc650dSSadaf Ebrahimi 	FUNCTION_FCHECK(src1, src1w, type & SLJIT_32);
2466*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(src2_freg, type & SLJIT_32));
2467*22dc650dSSadaf Ebrahimi 
2468*22dc650dSSadaf Ebrahimi 	if (cond <= SLJIT_NOT_ZERO)
2469*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z);
2470*22dc650dSSadaf Ebrahimi 	else if ((compiler->last_flags & 0xff) == SLJIT_CARRY) {
2471*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT((type & 0xfe) == SLJIT_CARRY);
2472*22dc650dSSadaf Ebrahimi 		compiler->last_flags = 0;
2473*22dc650dSSadaf Ebrahimi 	} else
2474*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT((cond & 0xfe) == (compiler->last_flags & 0xff)
2475*22dc650dSSadaf Ebrahimi 			|| CHECK_UNORDERED(cond, compiler->last_flags));
2476*22dc650dSSadaf Ebrahimi #endif
2477*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2478*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2479*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  fselect%s %s, ",
2480*22dc650dSSadaf Ebrahimi 			!(type & SLJIT_32) ? "" : "32",
2481*22dc650dSSadaf Ebrahimi 			jump_names[type & ~SLJIT_32]);
2482*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, dst_freg);
2483*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2484*22dc650dSSadaf Ebrahimi 		sljit_verbose_fparam(compiler, src1, src1w);
2485*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2486*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, src2_freg);
2487*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2488*22dc650dSSadaf Ebrahimi 	}
2489*22dc650dSSadaf Ebrahimi #endif
2490*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2491*22dc650dSSadaf Ebrahimi }
2492*22dc650dSSadaf Ebrahimi 
check_sljit_emit_mem(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 reg,sljit_s32 mem,sljit_sw memw)2493*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type,
2494*22dc650dSSadaf Ebrahimi 	sljit_s32 reg,
2495*22dc650dSSadaf Ebrahimi 	sljit_s32 mem, sljit_sw memw)
2496*22dc650dSSadaf Ebrahimi {
2497*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2498*22dc650dSSadaf Ebrahimi 	sljit_s32 allowed_flags;
2499*22dc650dSSadaf Ebrahimi #endif /* SLJIT_ARGUMENT_CHECKS */
2500*22dc650dSSadaf Ebrahimi 
2501*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
2502*22dc650dSSadaf Ebrahimi 		compiler->skip_checks = 0;
2503*22dc650dSSadaf Ebrahimi 		CHECK_RETURN_OK;
2504*22dc650dSSadaf Ebrahimi 	}
2505*22dc650dSSadaf Ebrahimi 
2506*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2507*22dc650dSSadaf Ebrahimi 	if (type & SLJIT_MEM_UNALIGNED) {
2508*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(type & (SLJIT_MEM_ALIGNED_16 | SLJIT_MEM_ALIGNED_32)));
2509*22dc650dSSadaf Ebrahimi 	} else if (type & SLJIT_MEM_ALIGNED_16) {
2510*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(type & SLJIT_MEM_ALIGNED_32));
2511*22dc650dSSadaf Ebrahimi 	} else {
2512*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT((reg & REG_PAIR_MASK) || (type & SLJIT_MEM_ALIGNED_32));
2513*22dc650dSSadaf Ebrahimi 	}
2514*22dc650dSSadaf Ebrahimi 
2515*22dc650dSSadaf Ebrahimi 	allowed_flags = SLJIT_MEM_UNALIGNED;
2516*22dc650dSSadaf Ebrahimi 
2517*22dc650dSSadaf Ebrahimi 	switch (type & 0xff) {
2518*22dc650dSSadaf Ebrahimi 	case SLJIT_MOV_P:
2519*22dc650dSSadaf Ebrahimi 	case SLJIT_MOV:
2520*22dc650dSSadaf Ebrahimi 		allowed_flags |= SLJIT_MEM_ALIGNED_32;
2521*22dc650dSSadaf Ebrahimi 		/* fallthrough */
2522*22dc650dSSadaf Ebrahimi 	case SLJIT_MOV_U32:
2523*22dc650dSSadaf Ebrahimi 	case SLJIT_MOV_S32:
2524*22dc650dSSadaf Ebrahimi 	case SLJIT_MOV32:
2525*22dc650dSSadaf Ebrahimi 		allowed_flags |= SLJIT_MEM_ALIGNED_16;
2526*22dc650dSSadaf Ebrahimi 		break;
2527*22dc650dSSadaf Ebrahimi 	}
2528*22dc650dSSadaf Ebrahimi 
2529*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & ~(0xff | SLJIT_32 | SLJIT_MEM_STORE | allowed_flags)) == 0);
2530*22dc650dSSadaf Ebrahimi 
2531*22dc650dSSadaf Ebrahimi 	if (reg & REG_PAIR_MASK) {
2532*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT((type & 0xff) == SLJIT_MOV);
2533*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(REG_PAIR_FIRST(reg)));
2534*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(REG_PAIR_SECOND(reg)));
2535*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(REG_PAIR_FIRST(reg) != REG_PAIR_SECOND(reg));
2536*22dc650dSSadaf Ebrahimi 	} else {
2537*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT((type & 0xff) >= SLJIT_MOV && (type & 0xff) <= SLJIT_MOV_P);
2538*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(type & SLJIT_32) || ((type & 0xff) >= SLJIT_MOV_U8 && (type & 0xff) <= SLJIT_MOV_S16));
2539*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(reg));
2540*22dc650dSSadaf Ebrahimi 	}
2541*22dc650dSSadaf Ebrahimi 
2542*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC_MEM(mem, memw);
2543*22dc650dSSadaf Ebrahimi #endif
2544*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2545*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2546*22dc650dSSadaf Ebrahimi 		if ((type & 0xff) == SLJIT_MOV32)
2547*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "  %s32",
2548*22dc650dSSadaf Ebrahimi 				(type & SLJIT_MEM_STORE) ? "store" : "load");
2549*22dc650dSSadaf Ebrahimi 		else
2550*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "  %s%s%s",
2551*22dc650dSSadaf Ebrahimi 				(type & SLJIT_MEM_STORE) ? "store" : "load",
2552*22dc650dSSadaf Ebrahimi 				!(type & SLJIT_32) ? "" : "32", op1_types[(type & 0xff) - SLJIT_OP1_BASE]);
2553*22dc650dSSadaf Ebrahimi 
2554*22dc650dSSadaf Ebrahimi 		if (type & SLJIT_MEM_UNALIGNED)
2555*22dc650dSSadaf Ebrahimi 			printf(".unal");
2556*22dc650dSSadaf Ebrahimi 		else if (type & SLJIT_MEM_ALIGNED_16)
2557*22dc650dSSadaf Ebrahimi 			printf(".al16");
2558*22dc650dSSadaf Ebrahimi 		else if (type & SLJIT_MEM_ALIGNED_32)
2559*22dc650dSSadaf Ebrahimi 			printf(".al32");
2560*22dc650dSSadaf Ebrahimi 
2561*22dc650dSSadaf Ebrahimi 		if (reg & REG_PAIR_MASK) {
2562*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, " {");
2563*22dc650dSSadaf Ebrahimi 			sljit_verbose_reg(compiler, REG_PAIR_FIRST(reg));
2564*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, ", ");
2565*22dc650dSSadaf Ebrahimi 			sljit_verbose_reg(compiler, REG_PAIR_SECOND(reg));
2566*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "}, ");
2567*22dc650dSSadaf Ebrahimi 		} else {
2568*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, " ");
2569*22dc650dSSadaf Ebrahimi 			sljit_verbose_reg(compiler, reg);
2570*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, ", ");
2571*22dc650dSSadaf Ebrahimi 		}
2572*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, mem, memw);
2573*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2574*22dc650dSSadaf Ebrahimi 	}
2575*22dc650dSSadaf Ebrahimi #endif
2576*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2577*22dc650dSSadaf Ebrahimi }
2578*22dc650dSSadaf Ebrahimi 
check_sljit_emit_mem_update(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 reg,sljit_s32 mem,sljit_sw memw)2579*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_mem_update(struct sljit_compiler *compiler, sljit_s32 type,
2580*22dc650dSSadaf Ebrahimi 	sljit_s32 reg,
2581*22dc650dSSadaf Ebrahimi 	sljit_s32 mem, sljit_sw memw)
2582*22dc650dSSadaf Ebrahimi {
2583*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(compiler->skip_checks)) {
2584*22dc650dSSadaf Ebrahimi 		compiler->skip_checks = 0;
2585*22dc650dSSadaf Ebrahimi 		CHECK_RETURN_OK;
2586*22dc650dSSadaf Ebrahimi 	}
2587*22dc650dSSadaf Ebrahimi 
2588*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2589*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & 0xff) >= SLJIT_MOV && (type & 0xff) <= SLJIT_MOV_P);
2590*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & ~(0xff | SLJIT_32 | SLJIT_MEM_STORE | SLJIT_MEM_SUPP | SLJIT_MEM_POST)) == 0);
2591*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((mem & REG_MASK) != 0 && (mem & REG_MASK) != reg);
2592*22dc650dSSadaf Ebrahimi 
2593*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC_MEM(mem, memw);
2594*22dc650dSSadaf Ebrahimi #endif
2595*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2596*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2597*22dc650dSSadaf Ebrahimi 		if (type & SLJIT_MEM_SUPP)
2598*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2599*22dc650dSSadaf Ebrahimi 		if (sljit_emit_mem_update(compiler, type | SLJIT_MEM_SUPP, reg, mem, memw) == SLJIT_ERR_UNSUPPORTED) {
2600*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "    # mem: unsupported form, no instructions are emitted\n");
2601*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2602*22dc650dSSadaf Ebrahimi 		}
2603*22dc650dSSadaf Ebrahimi 
2604*22dc650dSSadaf Ebrahimi 		if ((type & 0xff) == SLJIT_MOV32)
2605*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "  %s32.%s ",
2606*22dc650dSSadaf Ebrahimi 				(type & SLJIT_MEM_STORE) ? "store" : "load",
2607*22dc650dSSadaf Ebrahimi 				(type & SLJIT_MEM_POST) ? "post" : "pre");
2608*22dc650dSSadaf Ebrahimi 		else
2609*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "  %s%s%s.%s ",
2610*22dc650dSSadaf Ebrahimi 				(type & SLJIT_MEM_STORE) ? "store" : "load",
2611*22dc650dSSadaf Ebrahimi 				!(type & SLJIT_32) ? "" : "32",
2612*22dc650dSSadaf Ebrahimi 				op1_types[(type & 0xff) - SLJIT_OP1_BASE],
2613*22dc650dSSadaf Ebrahimi 				(type & SLJIT_MEM_POST) ? "post" : "pre");
2614*22dc650dSSadaf Ebrahimi 
2615*22dc650dSSadaf Ebrahimi 		sljit_verbose_reg(compiler, reg);
2616*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2617*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, mem, memw);
2618*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2619*22dc650dSSadaf Ebrahimi 	}
2620*22dc650dSSadaf Ebrahimi #endif
2621*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2622*22dc650dSSadaf Ebrahimi }
2623*22dc650dSSadaf Ebrahimi 
check_sljit_emit_fmem(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 mem,sljit_sw memw)2624*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type,
2625*22dc650dSSadaf Ebrahimi 	sljit_s32 freg,
2626*22dc650dSSadaf Ebrahimi 	sljit_s32 mem, sljit_sw memw)
2627*22dc650dSSadaf Ebrahimi {
2628*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2629*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
2630*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & 0xff) == SLJIT_MOV_F64);
2631*22dc650dSSadaf Ebrahimi 
2632*22dc650dSSadaf Ebrahimi 	if (type & SLJIT_MEM_UNALIGNED) {
2633*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(type & (SLJIT_MEM_ALIGNED_16 | SLJIT_MEM_ALIGNED_32)));
2634*22dc650dSSadaf Ebrahimi 	} else if (type & SLJIT_MEM_ALIGNED_16) {
2635*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(type & SLJIT_MEM_ALIGNED_32));
2636*22dc650dSSadaf Ebrahimi 	} else {
2637*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(type & SLJIT_MEM_ALIGNED_32);
2638*22dc650dSSadaf Ebrahimi 		CHECK_ARGUMENT(!(type & SLJIT_32));
2639*22dc650dSSadaf Ebrahimi 	}
2640*22dc650dSSadaf Ebrahimi 
2641*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_32 | SLJIT_MEM_STORE | SLJIT_MEM_UNALIGNED | SLJIT_MEM_ALIGNED_16 | SLJIT_MEM_ALIGNED_32)));
2642*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, type & SLJIT_32));
2643*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC_MEM(mem, memw);
2644*22dc650dSSadaf Ebrahimi #endif
2645*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2646*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2647*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  %s.%s",
2648*22dc650dSSadaf Ebrahimi 			(type & SLJIT_MEM_STORE) ? "store" : "load",
2649*22dc650dSSadaf Ebrahimi 			!(type & SLJIT_32) ? "f64" : "f32");
2650*22dc650dSSadaf Ebrahimi 
2651*22dc650dSSadaf Ebrahimi 		if (type & SLJIT_MEM_UNALIGNED)
2652*22dc650dSSadaf Ebrahimi 			printf(".unal");
2653*22dc650dSSadaf Ebrahimi 		else if (type & SLJIT_MEM_ALIGNED_16)
2654*22dc650dSSadaf Ebrahimi 			printf(".al16");
2655*22dc650dSSadaf Ebrahimi 		else if (type & SLJIT_MEM_ALIGNED_32)
2656*22dc650dSSadaf Ebrahimi 			printf(".al32");
2657*22dc650dSSadaf Ebrahimi 
2658*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, " ");
2659*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, freg);
2660*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2661*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, mem, memw);
2662*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2663*22dc650dSSadaf Ebrahimi 	}
2664*22dc650dSSadaf Ebrahimi #endif
2665*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2666*22dc650dSSadaf Ebrahimi }
2667*22dc650dSSadaf Ebrahimi 
check_sljit_emit_fmem_update(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 mem,sljit_sw memw)2668*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fmem_update(struct sljit_compiler *compiler, sljit_s32 type,
2669*22dc650dSSadaf Ebrahimi 	sljit_s32 freg,
2670*22dc650dSSadaf Ebrahimi 	sljit_s32 mem, sljit_sw memw)
2671*22dc650dSSadaf Ebrahimi {
2672*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2673*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));
2674*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & 0xff) == SLJIT_MOV_F64);
2675*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & ~(0xff | SLJIT_32 | SLJIT_MEM_STORE | SLJIT_MEM_SUPP | SLJIT_MEM_POST)) == 0);
2676*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_SRC_MEM(mem, memw);
2677*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, type & SLJIT_32));
2678*22dc650dSSadaf Ebrahimi #endif
2679*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2680*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2681*22dc650dSSadaf Ebrahimi 		if (type & SLJIT_MEM_SUPP)
2682*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2683*22dc650dSSadaf Ebrahimi 		if (sljit_emit_fmem_update(compiler, type | SLJIT_MEM_SUPP, freg, mem, memw) == SLJIT_ERR_UNSUPPORTED) {
2684*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "    # fmem: unsupported form, no instructions are emitted\n");
2685*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2686*22dc650dSSadaf Ebrahimi 		}
2687*22dc650dSSadaf Ebrahimi 
2688*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  %s.%s.%s ",
2689*22dc650dSSadaf Ebrahimi 			(type & SLJIT_MEM_STORE) ? "store" : "load",
2690*22dc650dSSadaf Ebrahimi 			!(type & SLJIT_32) ? "f64" : "f32",
2691*22dc650dSSadaf Ebrahimi 			(type & SLJIT_MEM_POST) ? "post" : "pre");
2692*22dc650dSSadaf Ebrahimi 
2693*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, freg);
2694*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2695*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, mem, memw);
2696*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2697*22dc650dSSadaf Ebrahimi 	}
2698*22dc650dSSadaf Ebrahimi #endif
2699*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2700*22dc650dSSadaf Ebrahimi }
2701*22dc650dSSadaf Ebrahimi 
check_sljit_emit_simd_mov(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 srcdst,sljit_sw srcdstw)2702*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type,
2703*22dc650dSSadaf Ebrahimi 	sljit_s32 freg,
2704*22dc650dSSadaf Ebrahimi 	sljit_s32 srcdst, sljit_sw srcdstw)
2705*22dc650dSSadaf Ebrahimi {
2706*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2707*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD));
2708*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK2(SLJIT_SIMD_STORE)) == 0);
2709*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type));
2710*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) <= SLJIT_SIMD_GET_REG_SIZE(type));
2711*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM2_SIZE(type) <= (srcdst & SLJIT_MEM) ? SLJIT_SIMD_GET_REG_SIZE(type) : 0);
2712*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
2713*22dc650dSSadaf Ebrahimi 	FUNCTION_FCHECK(srcdst, srcdstw, 0);
2714*22dc650dSSadaf Ebrahimi #endif
2715*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2716*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2717*22dc650dSSadaf Ebrahimi 		if (type & SLJIT_SIMD_TEST)
2718*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2719*22dc650dSSadaf Ebrahimi 		if (sljit_emit_simd_mov(compiler, type | SLJIT_SIMD_TEST, freg, srcdst, srcdstw) == SLJIT_ERR_UNSUPPORTED) {
2720*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "    # simd_mem: unsupported form, no instructions are emitted\n");
2721*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2722*22dc650dSSadaf Ebrahimi 		}
2723*22dc650dSSadaf Ebrahimi 
2724*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  simd_%s.%d.%s%d",
2725*22dc650dSSadaf Ebrahimi 			(type & SLJIT_SIMD_STORE) ? "store" : "load",
2726*22dc650dSSadaf Ebrahimi 			(8 << SLJIT_SIMD_GET_REG_SIZE(type)),
2727*22dc650dSSadaf Ebrahimi 			(type & SLJIT_SIMD_FLOAT) ? "f" : "",
2728*22dc650dSSadaf Ebrahimi 			(8 << SLJIT_SIMD_GET_ELEM_SIZE(type)));
2729*22dc650dSSadaf Ebrahimi 
2730*22dc650dSSadaf Ebrahimi 		if ((type & 0x3f000000) == SLJIT_SIMD_MEM_UNALIGNED)
2731*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, ".unal ");
2732*22dc650dSSadaf Ebrahimi 		else
2733*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, ".al%d ", (8 << SLJIT_SIMD_GET_ELEM2_SIZE(type)));
2734*22dc650dSSadaf Ebrahimi 
2735*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, freg);
2736*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2737*22dc650dSSadaf Ebrahimi 		sljit_verbose_fparam(compiler, srcdst, srcdstw);
2738*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2739*22dc650dSSadaf Ebrahimi 	}
2740*22dc650dSSadaf Ebrahimi #endif
2741*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2742*22dc650dSSadaf Ebrahimi }
2743*22dc650dSSadaf Ebrahimi 
check_sljit_emit_simd_replicate(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 src,sljit_sw srcw)2744*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type,
2745*22dc650dSSadaf Ebrahimi 	sljit_s32 freg,
2746*22dc650dSSadaf Ebrahimi 	sljit_s32 src, sljit_sw srcw)
2747*22dc650dSSadaf Ebrahimi {
2748*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2749*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD));
2750*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK(0)) == 0);
2751*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type));
2752*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) < SLJIT_SIMD_GET_REG_SIZE(type));
2753*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
2754*22dc650dSSadaf Ebrahimi 
2755*22dc650dSSadaf Ebrahimi 	if (type & SLJIT_SIMD_FLOAT) {
2756*22dc650dSSadaf Ebrahimi 		if (src == SLJIT_IMM) {
2757*22dc650dSSadaf Ebrahimi 			CHECK_ARGUMENT(srcw == 0);
2758*22dc650dSSadaf Ebrahimi 		} else {
2759*22dc650dSSadaf Ebrahimi 			FUNCTION_FCHECK(src, srcw, SLJIT_SIMD_GET_ELEM_SIZE(type) == 2);
2760*22dc650dSSadaf Ebrahimi 		}
2761*22dc650dSSadaf Ebrahimi 	} else if (src != SLJIT_IMM) {
2762*22dc650dSSadaf Ebrahimi 		FUNCTION_CHECK_DST(src, srcw);
2763*22dc650dSSadaf Ebrahimi 	}
2764*22dc650dSSadaf Ebrahimi #endif
2765*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2766*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2767*22dc650dSSadaf Ebrahimi 		if (type & SLJIT_SIMD_TEST)
2768*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2769*22dc650dSSadaf Ebrahimi 		if (sljit_emit_simd_replicate(compiler, type | SLJIT_SIMD_TEST, freg, src, srcw) == SLJIT_ERR_UNSUPPORTED) {
2770*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "    # simd_dup: unsupported form, no instructions are emitted\n");
2771*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2772*22dc650dSSadaf Ebrahimi 		}
2773*22dc650dSSadaf Ebrahimi 
2774*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  simd_replicate.%d.%s%d ",
2775*22dc650dSSadaf Ebrahimi 			(8 << SLJIT_SIMD_GET_REG_SIZE(type)),
2776*22dc650dSSadaf Ebrahimi 			(type & SLJIT_SIMD_FLOAT) ? "f" : "",
2777*22dc650dSSadaf Ebrahimi 			(8 << SLJIT_SIMD_GET_ELEM_SIZE(type)));
2778*22dc650dSSadaf Ebrahimi 
2779*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, freg);
2780*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2781*22dc650dSSadaf Ebrahimi 		if (type & SLJIT_SIMD_FLOAT)
2782*22dc650dSSadaf Ebrahimi 			sljit_verbose_fparam(compiler, src, srcw);
2783*22dc650dSSadaf Ebrahimi 		else
2784*22dc650dSSadaf Ebrahimi 			sljit_verbose_param(compiler, src, srcw);
2785*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2786*22dc650dSSadaf Ebrahimi 	}
2787*22dc650dSSadaf Ebrahimi #endif
2788*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2789*22dc650dSSadaf Ebrahimi }
2790*22dc650dSSadaf Ebrahimi 
check_sljit_emit_simd_lane_mov(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 lane_index,sljit_s32 srcdst,sljit_sw srcdstw)2791*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type,
2792*22dc650dSSadaf Ebrahimi 	sljit_s32 freg, sljit_s32 lane_index,
2793*22dc650dSSadaf Ebrahimi 	sljit_s32 srcdst, sljit_sw srcdstw)
2794*22dc650dSSadaf Ebrahimi {
2795*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2796*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD));
2797*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK(SLJIT_SIMD_STORE | SLJIT_SIMD_LANE_ZERO | SLJIT_SIMD_LANE_SIGNED | SLJIT_32)) == 0);
2798*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & (SLJIT_SIMD_STORE | SLJIT_SIMD_LANE_ZERO)) != (SLJIT_SIMD_STORE | SLJIT_SIMD_LANE_ZERO));
2799*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & (SLJIT_SIMD_STORE | SLJIT_SIMD_LANE_SIGNED)) != SLJIT_SIMD_LANE_SIGNED);
2800*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(!(type & SLJIT_SIMD_FLOAT) || !(type & (SLJIT_SIMD_LANE_SIGNED | SLJIT_32)));
2801*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type));
2802*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) < SLJIT_SIMD_GET_REG_SIZE(type));
2803*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(!(type & SLJIT_32) || SLJIT_SIMD_GET_ELEM_SIZE(type) <= 2);
2804*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
2805*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(lane_index >= 0 && lane_index < (1 << (SLJIT_SIMD_GET_REG_SIZE(type) - SLJIT_SIMD_GET_ELEM_SIZE(type))));
2806*22dc650dSSadaf Ebrahimi 
2807*22dc650dSSadaf Ebrahimi 	if (type & SLJIT_SIMD_FLOAT) {
2808*22dc650dSSadaf Ebrahimi 		FUNCTION_FCHECK(srcdst, srcdstw, SLJIT_SIMD_GET_ELEM_SIZE(type) == 2);
2809*22dc650dSSadaf Ebrahimi 	} else if ((type & SLJIT_SIMD_STORE) || srcdst != SLJIT_IMM) {
2810*22dc650dSSadaf Ebrahimi 		FUNCTION_CHECK_DST(srcdst, srcdstw);
2811*22dc650dSSadaf Ebrahimi 	}
2812*22dc650dSSadaf Ebrahimi #endif
2813*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2814*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2815*22dc650dSSadaf Ebrahimi 		if (type & SLJIT_SIMD_TEST)
2816*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2817*22dc650dSSadaf Ebrahimi 		if (sljit_emit_simd_lane_mov(compiler, type | SLJIT_SIMD_TEST, freg, lane_index, srcdst, srcdstw) == SLJIT_ERR_UNSUPPORTED) {
2818*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "    # simd_move_lane: unsupported form, no instructions are emitted\n");
2819*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2820*22dc650dSSadaf Ebrahimi 		}
2821*22dc650dSSadaf Ebrahimi 
2822*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  simd_%s_lane%s%s%s.%d.%s%d ",
2823*22dc650dSSadaf Ebrahimi 			(type & SLJIT_SIMD_STORE) ? "store" : "load",
2824*22dc650dSSadaf Ebrahimi 			(type & SLJIT_32) ? "32" : "",
2825*22dc650dSSadaf Ebrahimi 			(type & SLJIT_SIMD_LANE_ZERO) ? "_z" : "",
2826*22dc650dSSadaf Ebrahimi 			(type & SLJIT_SIMD_LANE_SIGNED) ? "_s" : "",
2827*22dc650dSSadaf Ebrahimi 			(8 << SLJIT_SIMD_GET_REG_SIZE(type)),
2828*22dc650dSSadaf Ebrahimi 			(type & SLJIT_SIMD_FLOAT) ? "f" : "",
2829*22dc650dSSadaf Ebrahimi 			(8 << SLJIT_SIMD_GET_ELEM_SIZE(type)));
2830*22dc650dSSadaf Ebrahimi 
2831*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, freg);
2832*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "[%d], ", lane_index);
2833*22dc650dSSadaf Ebrahimi 		if (type & SLJIT_SIMD_FLOAT)
2834*22dc650dSSadaf Ebrahimi 			sljit_verbose_fparam(compiler, srcdst, srcdstw);
2835*22dc650dSSadaf Ebrahimi 		else
2836*22dc650dSSadaf Ebrahimi 			sljit_verbose_param(compiler, srcdst, srcdstw);
2837*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2838*22dc650dSSadaf Ebrahimi 	}
2839*22dc650dSSadaf Ebrahimi #endif
2840*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2841*22dc650dSSadaf Ebrahimi }
2842*22dc650dSSadaf Ebrahimi 
check_sljit_emit_simd_lane_replicate(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 src,sljit_s32 src_lane_index)2843*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type,
2844*22dc650dSSadaf Ebrahimi 	sljit_s32 freg,
2845*22dc650dSSadaf Ebrahimi 	sljit_s32 src, sljit_s32 src_lane_index)
2846*22dc650dSSadaf Ebrahimi {
2847*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2848*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD));
2849*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK(0)) == 0);
2850*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type));
2851*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) < SLJIT_SIMD_GET_REG_SIZE(type));
2852*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
2853*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(src, 0));
2854*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(src_lane_index >= 0 && src_lane_index < (1 << (SLJIT_SIMD_GET_REG_SIZE(type) - SLJIT_SIMD_GET_ELEM_SIZE(type))));
2855*22dc650dSSadaf Ebrahimi #endif
2856*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2857*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2858*22dc650dSSadaf Ebrahimi 		if (type & SLJIT_SIMD_TEST)
2859*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2860*22dc650dSSadaf Ebrahimi 		if (sljit_emit_simd_lane_replicate(compiler, type | SLJIT_SIMD_TEST, freg, src, src_lane_index) == SLJIT_ERR_UNSUPPORTED) {
2861*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "    # simd_lane_replicate: unsupported form, no instructions are emitted\n");
2862*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2863*22dc650dSSadaf Ebrahimi 		}
2864*22dc650dSSadaf Ebrahimi 
2865*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  simd_lane_replicate.%d.%s%d ",
2866*22dc650dSSadaf Ebrahimi 			(8 << SLJIT_SIMD_GET_REG_SIZE(type)),
2867*22dc650dSSadaf Ebrahimi 			(type & SLJIT_SIMD_FLOAT) ? "f" : "",
2868*22dc650dSSadaf Ebrahimi 			(8 << SLJIT_SIMD_GET_ELEM_SIZE(type)));
2869*22dc650dSSadaf Ebrahimi 
2870*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, freg);
2871*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2872*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, src);
2873*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "[%d]\n", src_lane_index);
2874*22dc650dSSadaf Ebrahimi 	}
2875*22dc650dSSadaf Ebrahimi #endif
2876*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2877*22dc650dSSadaf Ebrahimi }
2878*22dc650dSSadaf Ebrahimi 
check_sljit_emit_simd_extend(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 src,sljit_sw srcw)2879*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type,
2880*22dc650dSSadaf Ebrahimi 	sljit_s32 freg,
2881*22dc650dSSadaf Ebrahimi 	sljit_s32 src, sljit_sw srcw)
2882*22dc650dSSadaf Ebrahimi {
2883*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2884*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD));
2885*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK2(SLJIT_SIMD_EXTEND_SIGNED)) == 0);
2886*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & (SLJIT_SIMD_EXTEND_SIGNED | SLJIT_SIMD_FLOAT)) != (SLJIT_SIMD_EXTEND_SIGNED | SLJIT_SIMD_FLOAT));
2887*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type));
2888*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM2_SIZE(type) < SLJIT_SIMD_GET_REG_SIZE(type));
2889*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) < SLJIT_SIMD_GET_ELEM2_SIZE(type));
2890*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
2891*22dc650dSSadaf Ebrahimi 	FUNCTION_FCHECK(src, srcw, SLJIT_SIMD_GET_ELEM_SIZE(type) == 2);
2892*22dc650dSSadaf Ebrahimi #endif
2893*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2894*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2895*22dc650dSSadaf Ebrahimi 		if (type & SLJIT_SIMD_TEST)
2896*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2897*22dc650dSSadaf Ebrahimi 		if (sljit_emit_simd_extend(compiler, type | SLJIT_SIMD_TEST, freg, src, srcw) == SLJIT_ERR_UNSUPPORTED) {
2898*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "    # simd_extend: unsupported form, no instructions are emitted\n");
2899*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2900*22dc650dSSadaf Ebrahimi 		}
2901*22dc650dSSadaf Ebrahimi 
2902*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  simd_load_extend%s.%d.%s%d.%s%d ",
2903*22dc650dSSadaf Ebrahimi 			(type & SLJIT_SIMD_EXTEND_SIGNED) ? "_s" : "",
2904*22dc650dSSadaf Ebrahimi 			(8 << SLJIT_SIMD_GET_REG_SIZE(type)),
2905*22dc650dSSadaf Ebrahimi 			(type & SLJIT_SIMD_FLOAT) ? "f" : "",
2906*22dc650dSSadaf Ebrahimi 			(8 << SLJIT_SIMD_GET_ELEM2_SIZE(type)),
2907*22dc650dSSadaf Ebrahimi 			(type & SLJIT_SIMD_FLOAT) ? "f" : "",
2908*22dc650dSSadaf Ebrahimi 			(8 << SLJIT_SIMD_GET_ELEM_SIZE(type)));
2909*22dc650dSSadaf Ebrahimi 
2910*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, freg);
2911*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2912*22dc650dSSadaf Ebrahimi 		sljit_verbose_fparam(compiler, src, srcw);
2913*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2914*22dc650dSSadaf Ebrahimi 	}
2915*22dc650dSSadaf Ebrahimi #endif
2916*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2917*22dc650dSSadaf Ebrahimi }
2918*22dc650dSSadaf Ebrahimi 
check_sljit_emit_simd_sign(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 dst,sljit_sw dstw)2919*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type,
2920*22dc650dSSadaf Ebrahimi 	sljit_s32 freg,
2921*22dc650dSSadaf Ebrahimi 	sljit_s32 dst, sljit_sw dstw)
2922*22dc650dSSadaf Ebrahimi {
2923*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2924*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD));
2925*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK(SLJIT_32)) == SLJIT_SIMD_STORE);
2926*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type));
2927*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) < SLJIT_SIMD_GET_REG_SIZE(type));
2928*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
2929*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_DST(dst, dstw);
2930*22dc650dSSadaf Ebrahimi #endif
2931*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2932*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2933*22dc650dSSadaf Ebrahimi 		if (type & SLJIT_SIMD_TEST)
2934*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2935*22dc650dSSadaf Ebrahimi 		if (sljit_emit_simd_sign(compiler, type | SLJIT_SIMD_TEST, freg, dst, dstw) == SLJIT_ERR_UNSUPPORTED) {
2936*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "    # simd_sign: unsupported form, no instructions are emitted\n");
2937*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2938*22dc650dSSadaf Ebrahimi 		}
2939*22dc650dSSadaf Ebrahimi 
2940*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  simd_store_sign%s.%d.%s%d ",
2941*22dc650dSSadaf Ebrahimi 			(type & SLJIT_32) ? "32" : "",
2942*22dc650dSSadaf Ebrahimi 			(8 << SLJIT_SIMD_GET_REG_SIZE(type)),
2943*22dc650dSSadaf Ebrahimi 			(type & SLJIT_SIMD_FLOAT) ? "f" : "",
2944*22dc650dSSadaf Ebrahimi 			(8 << SLJIT_SIMD_GET_ELEM_SIZE(type)));
2945*22dc650dSSadaf Ebrahimi 
2946*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, freg);
2947*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2948*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, dst, dstw);
2949*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2950*22dc650dSSadaf Ebrahimi 	}
2951*22dc650dSSadaf Ebrahimi #endif
2952*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2953*22dc650dSSadaf Ebrahimi }
2954*22dc650dSSadaf Ebrahimi 
check_sljit_emit_simd_op2(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 dst_freg,sljit_s32 src1_freg,sljit_s32 src2_freg)2955*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type,
2956*22dc650dSSadaf Ebrahimi 	sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg)
2957*22dc650dSSadaf Ebrahimi {
2958*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2959*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_SIMD));
2960*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT((type & SLJIT_SIMD_TYPE_MASK(0)) >= SLJIT_SIMD_OP2_AND && (type & SLJIT_SIMD_TYPE_MASK(0)) <= SLJIT_SIMD_OP2_XOR);
2961*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(type));
2962*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(type) <= SLJIT_SIMD_GET_REG_SIZE(type));
2963*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(dst_freg, 0));
2964*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(src1_freg, 0));
2965*22dc650dSSadaf Ebrahimi 	CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(src2_freg, 0));
2966*22dc650dSSadaf Ebrahimi #endif
2967*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2968*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
2969*22dc650dSSadaf Ebrahimi 		if (type & SLJIT_SIMD_TEST)
2970*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2971*22dc650dSSadaf Ebrahimi 		if (sljit_emit_simd_op2(compiler, type | SLJIT_SIMD_TEST, dst_freg, src1_freg, src2_freg) == SLJIT_ERR_UNSUPPORTED) {
2972*22dc650dSSadaf Ebrahimi 			fprintf(compiler->verbose, "    # simd_op2: unsupported form, no instructions are emitted\n");
2973*22dc650dSSadaf Ebrahimi 			CHECK_RETURN_OK;
2974*22dc650dSSadaf Ebrahimi 		}
2975*22dc650dSSadaf Ebrahimi 
2976*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  simd_%s.%d.%s%d ",
2977*22dc650dSSadaf Ebrahimi 			simd_op2_names[SLJIT_SIMD_GET_OPCODE(type) - 1],
2978*22dc650dSSadaf Ebrahimi 			(8 << SLJIT_SIMD_GET_REG_SIZE(type)),
2979*22dc650dSSadaf Ebrahimi 			(type & SLJIT_SIMD_FLOAT) ? "f" : "",
2980*22dc650dSSadaf Ebrahimi 			(8 << SLJIT_SIMD_GET_ELEM_SIZE(type)));
2981*22dc650dSSadaf Ebrahimi 
2982*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, dst_freg);
2983*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2984*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, src1_freg);
2985*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", ");
2986*22dc650dSSadaf Ebrahimi 		sljit_verbose_freg(compiler, src2_freg);
2987*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
2988*22dc650dSSadaf Ebrahimi 	}
2989*22dc650dSSadaf Ebrahimi #endif
2990*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
2991*22dc650dSSadaf Ebrahimi }
2992*22dc650dSSadaf Ebrahimi 
check_sljit_get_local_base(struct sljit_compiler * compiler,sljit_s32 dst,sljit_sw dstw,sljit_sw offset)2993*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)
2994*22dc650dSSadaf Ebrahimi {
2995*22dc650dSSadaf Ebrahimi 	/* Any offset is allowed. */
2996*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(offset);
2997*22dc650dSSadaf Ebrahimi 
2998*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2999*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_DST(dst, dstw);
3000*22dc650dSSadaf Ebrahimi #endif
3001*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
3002*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
3003*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  local_base ");
3004*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, dst, dstw);
3005*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", #%" SLJIT_PRINT_D "d\n", offset);
3006*22dc650dSSadaf Ebrahimi 	}
3007*22dc650dSSadaf Ebrahimi #endif
3008*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
3009*22dc650dSSadaf Ebrahimi }
3010*22dc650dSSadaf Ebrahimi 
check_sljit_emit_const(struct sljit_compiler * compiler,sljit_s32 dst,sljit_sw dstw,sljit_sw init_value)3011*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)
3012*22dc650dSSadaf Ebrahimi {
3013*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(init_value);
3014*22dc650dSSadaf Ebrahimi 
3015*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
3016*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_DST(dst, dstw);
3017*22dc650dSSadaf Ebrahimi #endif
3018*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
3019*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
3020*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  const ");
3021*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, dst, dstw);
3022*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, ", #%" SLJIT_PRINT_D "d\n", init_value);
3023*22dc650dSSadaf Ebrahimi 	}
3024*22dc650dSSadaf Ebrahimi #endif
3025*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
3026*22dc650dSSadaf Ebrahimi }
3027*22dc650dSSadaf Ebrahimi 
check_sljit_emit_mov_addr(struct sljit_compiler * compiler,sljit_s32 dst,sljit_sw dstw)3028*22dc650dSSadaf Ebrahimi static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_mov_addr(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
3029*22dc650dSSadaf Ebrahimi {
3030*22dc650dSSadaf Ebrahimi #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
3031*22dc650dSSadaf Ebrahimi 	FUNCTION_CHECK_DST(dst, dstw);
3032*22dc650dSSadaf Ebrahimi #endif
3033*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
3034*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(!!compiler->verbose)) {
3035*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "  mov_addr ");
3036*22dc650dSSadaf Ebrahimi 		sljit_verbose_param(compiler, dst, dstw);
3037*22dc650dSSadaf Ebrahimi 		fprintf(compiler->verbose, "\n");
3038*22dc650dSSadaf Ebrahimi 	}
3039*22dc650dSSadaf Ebrahimi #endif
3040*22dc650dSSadaf Ebrahimi 	CHECK_RETURN_OK;
3041*22dc650dSSadaf Ebrahimi }
3042*22dc650dSSadaf Ebrahimi 
3043*22dc650dSSadaf Ebrahimi #else /* !SLJIT_ARGUMENT_CHECKS && !SLJIT_VERBOSE */
3044*22dc650dSSadaf Ebrahimi 
3045*22dc650dSSadaf Ebrahimi #define SLJIT_SKIP_CHECKS(compiler)
3046*22dc650dSSadaf Ebrahimi 
3047*22dc650dSSadaf Ebrahimi #endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_VERBOSE */
3048*22dc650dSSadaf Ebrahimi 
3049*22dc650dSSadaf Ebrahimi #define SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw) \
3050*22dc650dSSadaf Ebrahimi 	SLJIT_COMPILE_ASSERT(!(SLJIT_CONV_SW_FROM_F64 & 0x1) && !(SLJIT_CONV_F64_FROM_SW & 0x1) && !(SLJIT_CONV_F64_FROM_UW & 0x1), \
3051*22dc650dSSadaf Ebrahimi 		invalid_float_opcodes); \
3052*22dc650dSSadaf Ebrahimi 	if (GET_OPCODE(op) >= SLJIT_CONV_SW_FROM_F64 && GET_OPCODE(op) <= SLJIT_CMP_F64) { \
3053*22dc650dSSadaf Ebrahimi 		if (GET_OPCODE(op) == SLJIT_CMP_F64) { \
3054*22dc650dSSadaf Ebrahimi 			CHECK(check_sljit_emit_fop1_cmp(compiler, op, dst, dstw, src, srcw)); \
3055*22dc650dSSadaf Ebrahimi 			ADJUST_LOCAL_OFFSET(dst, dstw); \
3056*22dc650dSSadaf Ebrahimi 			ADJUST_LOCAL_OFFSET(src, srcw); \
3057*22dc650dSSadaf Ebrahimi 			return sljit_emit_fop1_cmp(compiler, op, dst, dstw, src, srcw); \
3058*22dc650dSSadaf Ebrahimi 		} \
3059*22dc650dSSadaf Ebrahimi 		if ((GET_OPCODE(op) | 0x1) == SLJIT_CONV_S32_FROM_F64) { \
3060*22dc650dSSadaf Ebrahimi 			CHECK(check_sljit_emit_fop1_conv_sw_from_f64(compiler, op, dst, dstw, src, srcw)); \
3061*22dc650dSSadaf Ebrahimi 			ADJUST_LOCAL_OFFSET(dst, dstw); \
3062*22dc650dSSadaf Ebrahimi 			ADJUST_LOCAL_OFFSET(src, srcw); \
3063*22dc650dSSadaf Ebrahimi 			return sljit_emit_fop1_conv_sw_from_f64(compiler, op, dst, dstw, src, srcw); \
3064*22dc650dSSadaf Ebrahimi 		} \
3065*22dc650dSSadaf Ebrahimi 		if ((GET_OPCODE(op) | 0x1) == SLJIT_CONV_F64_FROM_S32) { \
3066*22dc650dSSadaf Ebrahimi 			CHECK(check_sljit_emit_fop1_conv_f64_from_w(compiler, op, dst, dstw, src, srcw)); \
3067*22dc650dSSadaf Ebrahimi 			ADJUST_LOCAL_OFFSET(dst, dstw); \
3068*22dc650dSSadaf Ebrahimi 			ADJUST_LOCAL_OFFSET(src, srcw); \
3069*22dc650dSSadaf Ebrahimi 			return sljit_emit_fop1_conv_f64_from_sw(compiler, op, dst, dstw, src, srcw); \
3070*22dc650dSSadaf Ebrahimi 		} \
3071*22dc650dSSadaf Ebrahimi 		CHECK(check_sljit_emit_fop1_conv_f64_from_w(compiler, op, dst, dstw, src, srcw)); \
3072*22dc650dSSadaf Ebrahimi 		ADJUST_LOCAL_OFFSET(dst, dstw); \
3073*22dc650dSSadaf Ebrahimi 		ADJUST_LOCAL_OFFSET(src, srcw); \
3074*22dc650dSSadaf Ebrahimi 		return sljit_emit_fop1_conv_f64_from_uw(compiler, op, dst, dstw, src, srcw); \
3075*22dc650dSSadaf Ebrahimi 	} \
3076*22dc650dSSadaf Ebrahimi 	CHECK(check_sljit_emit_fop1(compiler, op, dst, dstw, src, srcw)); \
3077*22dc650dSSadaf Ebrahimi 	ADJUST_LOCAL_OFFSET(dst, dstw); \
3078*22dc650dSSadaf Ebrahimi 	ADJUST_LOCAL_OFFSET(src, srcw);
3079*22dc650dSSadaf Ebrahimi 
3080*22dc650dSSadaf Ebrahimi #if (!(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) || (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6))
3081*22dc650dSSadaf Ebrahimi 
sljit_emit_mem_unaligned(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 reg,sljit_s32 mem,sljit_sw memw)3082*22dc650dSSadaf Ebrahimi static sljit_s32 sljit_emit_mem_unaligned(struct sljit_compiler *compiler, sljit_s32 type,
3083*22dc650dSSadaf Ebrahimi 	sljit_s32 reg,
3084*22dc650dSSadaf Ebrahimi 	sljit_s32 mem, sljit_sw memw)
3085*22dc650dSSadaf Ebrahimi {
3086*22dc650dSSadaf Ebrahimi 	SLJIT_SKIP_CHECKS(compiler);
3087*22dc650dSSadaf Ebrahimi 
3088*22dc650dSSadaf Ebrahimi 	if (type & SLJIT_MEM_STORE)
3089*22dc650dSSadaf Ebrahimi 		return sljit_emit_op1(compiler, type & (0xff | SLJIT_32), mem, memw, reg, 0);
3090*22dc650dSSadaf Ebrahimi 	return sljit_emit_op1(compiler, type & (0xff | SLJIT_32), reg, 0, mem, memw);
3091*22dc650dSSadaf Ebrahimi }
3092*22dc650dSSadaf Ebrahimi 
3093*22dc650dSSadaf Ebrahimi #endif /* (!SLJIT_CONFIG_MIPS || SLJIT_MIPS_REV >= 6) */
3094*22dc650dSSadaf Ebrahimi 
3095*22dc650dSSadaf Ebrahimi #if (!(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) || (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)) \
3096*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32)
3097*22dc650dSSadaf Ebrahimi 
sljit_emit_fmem_unaligned(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 mem,sljit_sw memw)3098*22dc650dSSadaf Ebrahimi static sljit_s32 sljit_emit_fmem_unaligned(struct sljit_compiler *compiler, sljit_s32 type,
3099*22dc650dSSadaf Ebrahimi 	sljit_s32 freg,
3100*22dc650dSSadaf Ebrahimi 	sljit_s32 mem, sljit_sw memw)
3101*22dc650dSSadaf Ebrahimi {
3102*22dc650dSSadaf Ebrahimi 	SLJIT_SKIP_CHECKS(compiler);
3103*22dc650dSSadaf Ebrahimi 
3104*22dc650dSSadaf Ebrahimi 	if (type & SLJIT_MEM_STORE)
3105*22dc650dSSadaf Ebrahimi 		return sljit_emit_fop1(compiler, type & (0xff | SLJIT_32), mem, memw, freg, 0);
3106*22dc650dSSadaf Ebrahimi 	return sljit_emit_fop1(compiler, type & (0xff | SLJIT_32), freg, 0, mem, memw);
3107*22dc650dSSadaf Ebrahimi }
3108*22dc650dSSadaf Ebrahimi 
3109*22dc650dSSadaf Ebrahimi #endif /* (!SLJIT_CONFIG_MIPS || SLJIT_MIPS_REV >= 6) && !SLJIT_CONFIG_ARM */
3110*22dc650dSSadaf Ebrahimi 
3111*22dc650dSSadaf Ebrahimi /* CPU description section */
3112*22dc650dSSadaf Ebrahimi 
3113*22dc650dSSadaf Ebrahimi #if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE)
3114*22dc650dSSadaf Ebrahimi #define SLJIT_CPUINFO_PART1 " 32bit ("
3115*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3116*22dc650dSSadaf Ebrahimi #define SLJIT_CPUINFO_PART1 " 64bit ("
3117*22dc650dSSadaf Ebrahimi #else
3118*22dc650dSSadaf Ebrahimi #error "Internal error: CPU type info missing"
3119*22dc650dSSadaf Ebrahimi #endif
3120*22dc650dSSadaf Ebrahimi 
3121*22dc650dSSadaf Ebrahimi #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
3122*22dc650dSSadaf Ebrahimi #define SLJIT_CPUINFO_PART2 "little endian + "
3123*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN)
3124*22dc650dSSadaf Ebrahimi #define SLJIT_CPUINFO_PART2 "big endian + "
3125*22dc650dSSadaf Ebrahimi #else
3126*22dc650dSSadaf Ebrahimi #error "Internal error: CPU type info missing"
3127*22dc650dSSadaf Ebrahimi #endif
3128*22dc650dSSadaf Ebrahimi 
3129*22dc650dSSadaf Ebrahimi #if (defined SLJIT_UNALIGNED && SLJIT_UNALIGNED)
3130*22dc650dSSadaf Ebrahimi #define SLJIT_CPUINFO_PART3 "unaligned)"
3131*22dc650dSSadaf Ebrahimi #else
3132*22dc650dSSadaf Ebrahimi #define SLJIT_CPUINFO_PART3 "aligned)"
3133*22dc650dSSadaf Ebrahimi #endif
3134*22dc650dSSadaf Ebrahimi 
3135*22dc650dSSadaf Ebrahimi #define SLJIT_CPUINFO SLJIT_CPUINFO_PART1 SLJIT_CPUINFO_PART2 SLJIT_CPUINFO_PART3
3136*22dc650dSSadaf Ebrahimi 
3137*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
3138*22dc650dSSadaf Ebrahimi #	include "sljitNativeX86_common.c"
3139*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
3140*22dc650dSSadaf Ebrahimi #	include "sljitNativeARM_32.c"
3141*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
3142*22dc650dSSadaf Ebrahimi #	include "sljitNativeARM_32.c"
3143*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
3144*22dc650dSSadaf Ebrahimi #	include "sljitNativeARM_T2_32.c"
3145*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
3146*22dc650dSSadaf Ebrahimi #	include "sljitNativeARM_64.c"
3147*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
3148*22dc650dSSadaf Ebrahimi #	include "sljitNativePPC_common.c"
3149*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
3150*22dc650dSSadaf Ebrahimi #	include "sljitNativeMIPS_common.c"
3151*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV)
3152*22dc650dSSadaf Ebrahimi #	include "sljitNativeRISCV_common.c"
3153*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)
3154*22dc650dSSadaf Ebrahimi #	include "sljitNativeS390X.c"
3155*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)
3156*22dc650dSSadaf Ebrahimi #	include "sljitNativeLOONGARCH_64.c"
3157*22dc650dSSadaf Ebrahimi #endif
3158*22dc650dSSadaf Ebrahimi 
3159*22dc650dSSadaf Ebrahimi #include "sljitSerialize.c"
3160*22dc650dSSadaf Ebrahimi 
emit_mov_before_return(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 src,sljit_sw srcw)3161*22dc650dSSadaf Ebrahimi static SLJIT_INLINE sljit_s32 emit_mov_before_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
3162*22dc650dSSadaf Ebrahimi {
3163*22dc650dSSadaf Ebrahimi #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3164*22dc650dSSadaf Ebrahimi 	/* At the moment the pointer size is always equal to sljit_sw. May be changed in the future. */
3165*22dc650dSSadaf Ebrahimi 	if (src == SLJIT_RETURN_REG && (op == SLJIT_MOV || op == SLJIT_MOV_P))
3166*22dc650dSSadaf Ebrahimi 		return SLJIT_SUCCESS;
3167*22dc650dSSadaf Ebrahimi #else
3168*22dc650dSSadaf Ebrahimi 	if (src == SLJIT_RETURN_REG && (op == SLJIT_MOV || op == SLJIT_MOV_U32 || op == SLJIT_MOV_S32 || op == SLJIT_MOV_P))
3169*22dc650dSSadaf Ebrahimi 		return SLJIT_SUCCESS;
3170*22dc650dSSadaf Ebrahimi #endif
3171*22dc650dSSadaf Ebrahimi 
3172*22dc650dSSadaf Ebrahimi 	SLJIT_SKIP_CHECKS(compiler);
3173*22dc650dSSadaf Ebrahimi 	return sljit_emit_op1(compiler, op, SLJIT_RETURN_REG, 0, src, srcw);
3174*22dc650dSSadaf Ebrahimi }
3175*22dc650dSSadaf Ebrahimi 
3176*22dc650dSSadaf Ebrahimi #if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
3177*22dc650dSSadaf Ebrahimi 	&& !((defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) && defined __SOFTFP__)
3178*22dc650dSSadaf Ebrahimi 
emit_fmov_before_return(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 src,sljit_sw srcw)3179*22dc650dSSadaf Ebrahimi static SLJIT_INLINE sljit_s32 emit_fmov_before_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
3180*22dc650dSSadaf Ebrahimi {
3181*22dc650dSSadaf Ebrahimi 	if (src == SLJIT_FR0)
3182*22dc650dSSadaf Ebrahimi 		return SLJIT_SUCCESS;
3183*22dc650dSSadaf Ebrahimi 
3184*22dc650dSSadaf Ebrahimi 	SLJIT_SKIP_CHECKS(compiler);
3185*22dc650dSSadaf Ebrahimi 	return sljit_emit_fop1(compiler, op, SLJIT_RETURN_FREG, 0, src, srcw);
3186*22dc650dSSadaf Ebrahimi }
3187*22dc650dSSadaf Ebrahimi 
3188*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_CONFIG_X86_32 && !(SLJIT_CONFIG_ARM_32 && __SOFTFP__) */
3189*22dc650dSSadaf Ebrahimi 
sljit_emit_return(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 src,sljit_sw srcw)3190*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
3191*22dc650dSSadaf Ebrahimi {
3192*22dc650dSSadaf Ebrahimi 	CHECK_ERROR();
3193*22dc650dSSadaf Ebrahimi 	CHECK(check_sljit_emit_return(compiler, op, src, srcw));
3194*22dc650dSSadaf Ebrahimi 
3195*22dc650dSSadaf Ebrahimi 	if (GET_OPCODE(op) < SLJIT_MOV_F64) {
3196*22dc650dSSadaf Ebrahimi 		FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
3197*22dc650dSSadaf Ebrahimi 	} else {
3198*22dc650dSSadaf Ebrahimi 		FAIL_IF(emit_fmov_before_return(compiler, op, src, srcw));
3199*22dc650dSSadaf Ebrahimi 	}
3200*22dc650dSSadaf Ebrahimi 
3201*22dc650dSSadaf Ebrahimi 	SLJIT_SKIP_CHECKS(compiler);
3202*22dc650dSSadaf Ebrahimi 	return sljit_emit_return_void(compiler);
3203*22dc650dSSadaf Ebrahimi }
3204*22dc650dSSadaf Ebrahimi 
3205*22dc650dSSadaf Ebrahimi #if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
3206*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \
3207*22dc650dSSadaf Ebrahimi 	&& !(defined(SLJIT_CONFIG_LOONGARCH_64) && SLJIT_CONFIG_LOONGARCH_64)
3208*22dc650dSSadaf Ebrahimi 
sljit_emit_fop2r(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst_freg,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)3209*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2r(struct sljit_compiler *compiler, sljit_s32 op,
3210*22dc650dSSadaf Ebrahimi 	sljit_s32 dst_freg,
3211*22dc650dSSadaf Ebrahimi 	sljit_s32 src1, sljit_sw src1w,
3212*22dc650dSSadaf Ebrahimi 	sljit_s32 src2, sljit_sw src2w)
3213*22dc650dSSadaf Ebrahimi {
3214*22dc650dSSadaf Ebrahimi 	CHECK_ERROR();
3215*22dc650dSSadaf Ebrahimi 	CHECK(check_sljit_emit_fop2r(compiler, op, dst_freg, src1, src1w, src2, src2w));
3216*22dc650dSSadaf Ebrahimi 	ADJUST_LOCAL_OFFSET(src1, src1w);
3217*22dc650dSSadaf Ebrahimi 	ADJUST_LOCAL_OFFSET(src2, src2w);
3218*22dc650dSSadaf Ebrahimi 
3219*22dc650dSSadaf Ebrahimi 	SLJIT_SKIP_CHECKS(compiler);
3220*22dc650dSSadaf Ebrahimi 	return sljit_emit_fop2(compiler, op, dst_freg, 0, src1, src1w, src2, src2w);
3221*22dc650dSSadaf Ebrahimi }
3222*22dc650dSSadaf Ebrahimi 
3223*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_CONFIG_X86 && !SLJIT_CONFIG_S390X && !SLJIT_CONFIG_LOONGARCH_64 */
3224*22dc650dSSadaf Ebrahimi 
3225*22dc650dSSadaf Ebrahimi #if !(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) \
3226*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \
3227*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)
3228*22dc650dSSadaf Ebrahimi 
sljit_emit_cmp(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)3229*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type,
3230*22dc650dSSadaf Ebrahimi 	sljit_s32 src1, sljit_sw src1w,
3231*22dc650dSSadaf Ebrahimi 	sljit_s32 src2, sljit_sw src2w)
3232*22dc650dSSadaf Ebrahimi {
3233*22dc650dSSadaf Ebrahimi 	/* Default compare for most architectures. */
3234*22dc650dSSadaf Ebrahimi 	sljit_s32 flags, tmp_src, condition;
3235*22dc650dSSadaf Ebrahimi 	sljit_sw tmp_srcw;
3236*22dc650dSSadaf Ebrahimi 
3237*22dc650dSSadaf Ebrahimi 	CHECK_ERROR_PTR();
3238*22dc650dSSadaf Ebrahimi 	CHECK_PTR(check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w));
3239*22dc650dSSadaf Ebrahimi 
3240*22dc650dSSadaf Ebrahimi 	condition = type & 0xff;
3241*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
3242*22dc650dSSadaf Ebrahimi 	if ((condition == SLJIT_EQUAL || condition == SLJIT_NOT_EQUAL)) {
3243*22dc650dSSadaf Ebrahimi 		if (src1 == SLJIT_IMM && !src1w) {
3244*22dc650dSSadaf Ebrahimi 			src1 = src2;
3245*22dc650dSSadaf Ebrahimi 			src1w = src2w;
3246*22dc650dSSadaf Ebrahimi 			src2 = SLJIT_IMM;
3247*22dc650dSSadaf Ebrahimi 			src2w = 0;
3248*22dc650dSSadaf Ebrahimi 		}
3249*22dc650dSSadaf Ebrahimi 		if (src2 == SLJIT_IMM && !src2w)
3250*22dc650dSSadaf Ebrahimi 			return emit_cmp_to0(compiler, type, src1, src1w);
3251*22dc650dSSadaf Ebrahimi 	}
3252*22dc650dSSadaf Ebrahimi #endif
3253*22dc650dSSadaf Ebrahimi 
3254*22dc650dSSadaf Ebrahimi 	if (SLJIT_UNLIKELY(src1 == SLJIT_IMM && src2 != SLJIT_IMM)) {
3255*22dc650dSSadaf Ebrahimi 		/* Immediate is preferred as second argument by most architectures. */
3256*22dc650dSSadaf Ebrahimi 		switch (condition) {
3257*22dc650dSSadaf Ebrahimi 		case SLJIT_LESS:
3258*22dc650dSSadaf Ebrahimi 			condition = SLJIT_GREATER;
3259*22dc650dSSadaf Ebrahimi 			break;
3260*22dc650dSSadaf Ebrahimi 		case SLJIT_GREATER_EQUAL:
3261*22dc650dSSadaf Ebrahimi 			condition = SLJIT_LESS_EQUAL;
3262*22dc650dSSadaf Ebrahimi 			break;
3263*22dc650dSSadaf Ebrahimi 		case SLJIT_GREATER:
3264*22dc650dSSadaf Ebrahimi 			condition = SLJIT_LESS;
3265*22dc650dSSadaf Ebrahimi 			break;
3266*22dc650dSSadaf Ebrahimi 		case SLJIT_LESS_EQUAL:
3267*22dc650dSSadaf Ebrahimi 			condition = SLJIT_GREATER_EQUAL;
3268*22dc650dSSadaf Ebrahimi 			break;
3269*22dc650dSSadaf Ebrahimi 		case SLJIT_SIG_LESS:
3270*22dc650dSSadaf Ebrahimi 			condition = SLJIT_SIG_GREATER;
3271*22dc650dSSadaf Ebrahimi 			break;
3272*22dc650dSSadaf Ebrahimi 		case SLJIT_SIG_GREATER_EQUAL:
3273*22dc650dSSadaf Ebrahimi 			condition = SLJIT_SIG_LESS_EQUAL;
3274*22dc650dSSadaf Ebrahimi 			break;
3275*22dc650dSSadaf Ebrahimi 		case SLJIT_SIG_GREATER:
3276*22dc650dSSadaf Ebrahimi 			condition = SLJIT_SIG_LESS;
3277*22dc650dSSadaf Ebrahimi 			break;
3278*22dc650dSSadaf Ebrahimi 		case SLJIT_SIG_LESS_EQUAL:
3279*22dc650dSSadaf Ebrahimi 			condition = SLJIT_SIG_GREATER_EQUAL;
3280*22dc650dSSadaf Ebrahimi 			break;
3281*22dc650dSSadaf Ebrahimi 		}
3282*22dc650dSSadaf Ebrahimi 
3283*22dc650dSSadaf Ebrahimi 		type = condition | (type & (SLJIT_32 | SLJIT_REWRITABLE_JUMP));
3284*22dc650dSSadaf Ebrahimi 		tmp_src = src1;
3285*22dc650dSSadaf Ebrahimi 		src1 = src2;
3286*22dc650dSSadaf Ebrahimi 		src2 = tmp_src;
3287*22dc650dSSadaf Ebrahimi 		tmp_srcw = src1w;
3288*22dc650dSSadaf Ebrahimi 		src1w = src2w;
3289*22dc650dSSadaf Ebrahimi 		src2w = tmp_srcw;
3290*22dc650dSSadaf Ebrahimi 	}
3291*22dc650dSSadaf Ebrahimi 
3292*22dc650dSSadaf Ebrahimi 	if (condition <= SLJIT_NOT_ZERO)
3293*22dc650dSSadaf Ebrahimi 		flags = SLJIT_SET_Z;
3294*22dc650dSSadaf Ebrahimi 	else
3295*22dc650dSSadaf Ebrahimi 		flags = (condition & 0xfe) << VARIABLE_FLAG_SHIFT;
3296*22dc650dSSadaf Ebrahimi 
3297*22dc650dSSadaf Ebrahimi 	SLJIT_SKIP_CHECKS(compiler);
3298*22dc650dSSadaf Ebrahimi 	PTR_FAIL_IF(sljit_emit_op2u(compiler,
3299*22dc650dSSadaf Ebrahimi 		SLJIT_SUB | flags | (type & SLJIT_32), src1, src1w, src2, src2w));
3300*22dc650dSSadaf Ebrahimi 
3301*22dc650dSSadaf Ebrahimi 	SLJIT_SKIP_CHECKS(compiler);
3302*22dc650dSSadaf Ebrahimi 	return sljit_emit_jump(compiler, condition | (type & (SLJIT_REWRITABLE_JUMP | SLJIT_32)));
3303*22dc650dSSadaf Ebrahimi }
3304*22dc650dSSadaf Ebrahimi 
3305*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_CONFIG_MIPS */
3306*22dc650dSSadaf Ebrahimi 
3307*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32)
3308*22dc650dSSadaf Ebrahimi 
sljit_cmp_info(sljit_s32 type)3309*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type)
3310*22dc650dSSadaf Ebrahimi {
3311*22dc650dSSadaf Ebrahimi 	switch (type) {
3312*22dc650dSSadaf Ebrahimi 	case SLJIT_UNORDERED_OR_EQUAL:
3313*22dc650dSSadaf Ebrahimi 	case SLJIT_ORDERED_NOT_EQUAL:
3314*22dc650dSSadaf Ebrahimi 		return 1;
3315*22dc650dSSadaf Ebrahimi 	}
3316*22dc650dSSadaf Ebrahimi 
3317*22dc650dSSadaf Ebrahimi 	return 0;
3318*22dc650dSSadaf Ebrahimi }
3319*22dc650dSSadaf Ebrahimi 
3320*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_ARM */
3321*22dc650dSSadaf Ebrahimi 
sljit_emit_fcmp(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 src1,sljit_sw src1w,sljit_s32 src2,sljit_sw src2w)3322*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_s32 type,
3323*22dc650dSSadaf Ebrahimi 	sljit_s32 src1, sljit_sw src1w,
3324*22dc650dSSadaf Ebrahimi 	sljit_s32 src2, sljit_sw src2w)
3325*22dc650dSSadaf Ebrahimi {
3326*22dc650dSSadaf Ebrahimi 	CHECK_ERROR_PTR();
3327*22dc650dSSadaf Ebrahimi 	CHECK_PTR(check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w));
3328*22dc650dSSadaf Ebrahimi 
3329*22dc650dSSadaf Ebrahimi 	SLJIT_SKIP_CHECKS(compiler);
3330*22dc650dSSadaf Ebrahimi 	sljit_emit_fop1(compiler, SLJIT_CMP_F64 | ((type & 0xfe) << VARIABLE_FLAG_SHIFT) | (type & SLJIT_32), src1, src1w, src2, src2w);
3331*22dc650dSSadaf Ebrahimi 
3332*22dc650dSSadaf Ebrahimi 	SLJIT_SKIP_CHECKS(compiler);
3333*22dc650dSSadaf Ebrahimi 	return sljit_emit_jump(compiler, type);
3334*22dc650dSSadaf Ebrahimi }
3335*22dc650dSSadaf Ebrahimi 
3336*22dc650dSSadaf Ebrahimi #if !(defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM) \
3337*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
3338*22dc650dSSadaf Ebrahimi 
sljit_emit_mem_update(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 reg,sljit_s32 mem,sljit_sw memw)3339*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem_update(struct sljit_compiler *compiler, sljit_s32 type,
3340*22dc650dSSadaf Ebrahimi 	sljit_s32 reg,
3341*22dc650dSSadaf Ebrahimi 	sljit_s32 mem, sljit_sw memw)
3342*22dc650dSSadaf Ebrahimi {
3343*22dc650dSSadaf Ebrahimi 	CHECK_ERROR();
3344*22dc650dSSadaf Ebrahimi 	CHECK(check_sljit_emit_mem_update(compiler, type, reg, mem, memw));
3345*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(type);
3346*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(reg);
3347*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(mem);
3348*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(memw);
3349*22dc650dSSadaf Ebrahimi 
3350*22dc650dSSadaf Ebrahimi 	return SLJIT_ERR_UNSUPPORTED;
3351*22dc650dSSadaf Ebrahimi }
3352*22dc650dSSadaf Ebrahimi 
3353*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_CONFIG_ARM && !SLJIT_CONFIG_PPC */
3354*22dc650dSSadaf Ebrahimi 
3355*22dc650dSSadaf Ebrahimi #if !(defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \
3356*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
3357*22dc650dSSadaf Ebrahimi 
sljit_emit_fmem(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 mem,sljit_sw memw)3358*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type,
3359*22dc650dSSadaf Ebrahimi 	sljit_s32 freg,
3360*22dc650dSSadaf Ebrahimi 	sljit_s32 mem, sljit_sw memw)
3361*22dc650dSSadaf Ebrahimi {
3362*22dc650dSSadaf Ebrahimi 	CHECK_ERROR();
3363*22dc650dSSadaf Ebrahimi 	CHECK(check_sljit_emit_fmem(compiler, type, freg, mem, memw));
3364*22dc650dSSadaf Ebrahimi 
3365*22dc650dSSadaf Ebrahimi 	return sljit_emit_fmem_unaligned(compiler, type, freg, mem, memw);
3366*22dc650dSSadaf Ebrahimi }
3367*22dc650dSSadaf Ebrahimi 
3368*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_CONFIG_ARM_32 && !SLJIT_CONFIG_MIPS */
3369*22dc650dSSadaf Ebrahimi 
3370*22dc650dSSadaf Ebrahimi #if !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
3371*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
3372*22dc650dSSadaf Ebrahimi 
sljit_emit_fmem_update(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 mem,sljit_sw memw)3373*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem_update(struct sljit_compiler *compiler, sljit_s32 type,
3374*22dc650dSSadaf Ebrahimi 	sljit_s32 freg,
3375*22dc650dSSadaf Ebrahimi 	sljit_s32 mem, sljit_sw memw)
3376*22dc650dSSadaf Ebrahimi {
3377*22dc650dSSadaf Ebrahimi 	CHECK_ERROR();
3378*22dc650dSSadaf Ebrahimi 	CHECK(check_sljit_emit_fmem_update(compiler, type, freg, mem, memw));
3379*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(type);
3380*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(freg);
3381*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(mem);
3382*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(memw);
3383*22dc650dSSadaf Ebrahimi 
3384*22dc650dSSadaf Ebrahimi 	return SLJIT_ERR_UNSUPPORTED;
3385*22dc650dSSadaf Ebrahimi }
3386*22dc650dSSadaf Ebrahimi 
3387*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_CONFIG_ARM_64 && !SLJIT_CONFIG_PPC */
3388*22dc650dSSadaf Ebrahimi 
3389*22dc650dSSadaf Ebrahimi #if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
3390*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM) \
3391*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \
3392*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)
3393*22dc650dSSadaf Ebrahimi 
sljit_emit_simd_mov(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 srcdst,sljit_sw srcdstw)3394*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type,
3395*22dc650dSSadaf Ebrahimi 	sljit_s32 freg,
3396*22dc650dSSadaf Ebrahimi 	sljit_s32 srcdst, sljit_sw srcdstw)
3397*22dc650dSSadaf Ebrahimi {
3398*22dc650dSSadaf Ebrahimi 	CHECK_ERROR();
3399*22dc650dSSadaf Ebrahimi 	CHECK(check_sljit_emit_simd_mov(compiler, type, freg, srcdst, srcdstw));
3400*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(compiler);
3401*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(type);
3402*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(freg);
3403*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(srcdst);
3404*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(srcdstw);
3405*22dc650dSSadaf Ebrahimi 
3406*22dc650dSSadaf Ebrahimi 	return SLJIT_ERR_UNSUPPORTED;
3407*22dc650dSSadaf Ebrahimi }
3408*22dc650dSSadaf Ebrahimi 
sljit_emit_simd_replicate(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 src,sljit_sw srcw)3409*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type,
3410*22dc650dSSadaf Ebrahimi 	sljit_s32 freg,
3411*22dc650dSSadaf Ebrahimi 	sljit_s32 src, sljit_sw srcw)
3412*22dc650dSSadaf Ebrahimi {
3413*22dc650dSSadaf Ebrahimi 	CHECK_ERROR();
3414*22dc650dSSadaf Ebrahimi 	CHECK(check_sljit_emit_simd_replicate(compiler, type, freg, src, srcw));
3415*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(compiler);
3416*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(type);
3417*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(freg);
3418*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(src);
3419*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(srcw);
3420*22dc650dSSadaf Ebrahimi 
3421*22dc650dSSadaf Ebrahimi 	return SLJIT_ERR_UNSUPPORTED;
3422*22dc650dSSadaf Ebrahimi }
3423*22dc650dSSadaf Ebrahimi 
sljit_emit_simd_lane_mov(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 lane_index,sljit_s32 srcdst,sljit_sw srcdstw)3424*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type,
3425*22dc650dSSadaf Ebrahimi 	sljit_s32 freg, sljit_s32 lane_index,
3426*22dc650dSSadaf Ebrahimi 	sljit_s32 srcdst, sljit_sw srcdstw)
3427*22dc650dSSadaf Ebrahimi {
3428*22dc650dSSadaf Ebrahimi 	CHECK_ERROR();
3429*22dc650dSSadaf Ebrahimi 	CHECK(check_sljit_emit_simd_lane_mov(compiler, type, freg, lane_index, srcdst, srcdstw));
3430*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(compiler);
3431*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(type);
3432*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(freg);
3433*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(lane_index);
3434*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(srcdst);
3435*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(srcdstw);
3436*22dc650dSSadaf Ebrahimi 
3437*22dc650dSSadaf Ebrahimi 	return SLJIT_ERR_UNSUPPORTED;
3438*22dc650dSSadaf Ebrahimi }
3439*22dc650dSSadaf Ebrahimi 
sljit_emit_simd_lane_replicate(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 src,sljit_s32 src_lane_index)3440*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type,
3441*22dc650dSSadaf Ebrahimi 	sljit_s32 freg,
3442*22dc650dSSadaf Ebrahimi 	sljit_s32 src, sljit_s32 src_lane_index)
3443*22dc650dSSadaf Ebrahimi {
3444*22dc650dSSadaf Ebrahimi 	CHECK_ERROR();
3445*22dc650dSSadaf Ebrahimi 	CHECK(check_sljit_emit_simd_lane_replicate(compiler, type, freg, src, src_lane_index));
3446*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(compiler);
3447*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(type);
3448*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(freg);
3449*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(src);
3450*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(src_lane_index);
3451*22dc650dSSadaf Ebrahimi 
3452*22dc650dSSadaf Ebrahimi 	return SLJIT_ERR_UNSUPPORTED;
3453*22dc650dSSadaf Ebrahimi }
3454*22dc650dSSadaf Ebrahimi 
sljit_emit_simd_extend(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 src,sljit_sw srcw)3455*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type,
3456*22dc650dSSadaf Ebrahimi 	sljit_s32 freg,
3457*22dc650dSSadaf Ebrahimi 	sljit_s32 src, sljit_sw srcw)
3458*22dc650dSSadaf Ebrahimi {
3459*22dc650dSSadaf Ebrahimi 	CHECK_ERROR();
3460*22dc650dSSadaf Ebrahimi 	CHECK(check_sljit_emit_simd_extend(compiler, type, freg, src, srcw));
3461*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(compiler);
3462*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(type);
3463*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(freg);
3464*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(src);
3465*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(srcw);
3466*22dc650dSSadaf Ebrahimi 
3467*22dc650dSSadaf Ebrahimi 	return SLJIT_ERR_UNSUPPORTED;
3468*22dc650dSSadaf Ebrahimi }
3469*22dc650dSSadaf Ebrahimi 
sljit_emit_simd_sign(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 freg,sljit_s32 dst,sljit_sw dstw)3470*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type,
3471*22dc650dSSadaf Ebrahimi 	sljit_s32 freg,
3472*22dc650dSSadaf Ebrahimi 	sljit_s32 dst, sljit_sw dstw)
3473*22dc650dSSadaf Ebrahimi {
3474*22dc650dSSadaf Ebrahimi 	CHECK_ERROR();
3475*22dc650dSSadaf Ebrahimi 	CHECK(check_sljit_emit_simd_sign(compiler, type, freg, dst, dstw));
3476*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(compiler);
3477*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(type);
3478*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(freg);
3479*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(dst);
3480*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(dstw);
3481*22dc650dSSadaf Ebrahimi 
3482*22dc650dSSadaf Ebrahimi 	return SLJIT_ERR_UNSUPPORTED;
3483*22dc650dSSadaf Ebrahimi }
3484*22dc650dSSadaf Ebrahimi 
sljit_emit_simd_op2(struct sljit_compiler * compiler,sljit_s32 type,sljit_s32 dst_freg,sljit_s32 src1_freg,sljit_s32 src2_freg)3485*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type,
3486*22dc650dSSadaf Ebrahimi 	sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg)
3487*22dc650dSSadaf Ebrahimi {
3488*22dc650dSSadaf Ebrahimi 	CHECK_ERROR();
3489*22dc650dSSadaf Ebrahimi 	CHECK(check_sljit_emit_simd_op2(compiler, type, dst_freg, src1_freg, src2_freg));
3490*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(compiler);
3491*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(type);
3492*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(dst_freg);
3493*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(src1_freg);
3494*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(src2_freg);
3495*22dc650dSSadaf Ebrahimi 
3496*22dc650dSSadaf Ebrahimi 	return SLJIT_ERR_UNSUPPORTED;
3497*22dc650dSSadaf Ebrahimi }
3498*22dc650dSSadaf Ebrahimi 
3499*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_CONFIG_X86 && !SLJIT_CONFIG_ARM */
3500*22dc650dSSadaf Ebrahimi 
3501*22dc650dSSadaf Ebrahimi #if !(defined(SLJIT_CONFIG_X86) && SLJIT_CONFIG_X86) \
3502*22dc650dSSadaf Ebrahimi 	&& !(defined(SLJIT_CONFIG_ARM) && SLJIT_CONFIG_ARM) \
3503*22dc650dSSadaf Ebrahimi 	&& !(defined(SLJIT_CONFIG_S390X) && SLJIT_CONFIG_S390X) \
3504*22dc650dSSadaf Ebrahimi 	&& !(defined(SLJIT_CONFIG_LOONGARCH) && SLJIT_CONFIG_LOONGARCH)
3505*22dc650dSSadaf Ebrahimi 
sljit_emit_atomic_load(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 dst_reg,sljit_s32 mem_reg)3506*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_load(struct sljit_compiler *compiler,
3507*22dc650dSSadaf Ebrahimi 	sljit_s32 op,
3508*22dc650dSSadaf Ebrahimi 	sljit_s32 dst_reg,
3509*22dc650dSSadaf Ebrahimi 	sljit_s32 mem_reg)
3510*22dc650dSSadaf Ebrahimi {
3511*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(compiler);
3512*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(op);
3513*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(dst_reg);
3514*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(mem_reg);
3515*22dc650dSSadaf Ebrahimi 
3516*22dc650dSSadaf Ebrahimi 	CHECK_ERROR();
3517*22dc650dSSadaf Ebrahimi 	CHECK(check_sljit_emit_atomic_load(compiler, op, dst_reg, mem_reg));
3518*22dc650dSSadaf Ebrahimi 
3519*22dc650dSSadaf Ebrahimi 	return SLJIT_ERR_UNSUPPORTED;
3520*22dc650dSSadaf Ebrahimi }
3521*22dc650dSSadaf Ebrahimi 
sljit_emit_atomic_store(struct sljit_compiler * compiler,sljit_s32 op,sljit_s32 src_reg,sljit_s32 mem_reg,sljit_s32 temp_reg)3522*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_store(struct sljit_compiler *compiler,
3523*22dc650dSSadaf Ebrahimi 	sljit_s32 op,
3524*22dc650dSSadaf Ebrahimi 	sljit_s32 src_reg,
3525*22dc650dSSadaf Ebrahimi 	sljit_s32 mem_reg,
3526*22dc650dSSadaf Ebrahimi 	sljit_s32 temp_reg)
3527*22dc650dSSadaf Ebrahimi {
3528*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(compiler);
3529*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(op);
3530*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(src_reg);
3531*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(mem_reg);
3532*22dc650dSSadaf Ebrahimi 	SLJIT_UNUSED_ARG(temp_reg);
3533*22dc650dSSadaf Ebrahimi 
3534*22dc650dSSadaf Ebrahimi 	CHECK_ERROR();
3535*22dc650dSSadaf Ebrahimi 	CHECK(check_sljit_emit_atomic_store(compiler, op, src_reg, mem_reg, temp_reg));
3536*22dc650dSSadaf Ebrahimi 
3537*22dc650dSSadaf Ebrahimi 	return SLJIT_ERR_UNSUPPORTED;
3538*22dc650dSSadaf Ebrahimi }
3539*22dc650dSSadaf Ebrahimi 
3540*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_CONFIG_X86 && !SLJIT_CONFIG_ARM && !SLJIT_CONFIG_S390X && !SLJIT_CONFIG_LOONGARCH */
3541*22dc650dSSadaf Ebrahimi 
3542*22dc650dSSadaf Ebrahimi #if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
3543*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
3544*22dc650dSSadaf Ebrahimi 
sljit_get_local_base(struct sljit_compiler * compiler,sljit_s32 dst,sljit_sw dstw,sljit_sw offset)3545*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)
3546*22dc650dSSadaf Ebrahimi {
3547*22dc650dSSadaf Ebrahimi 	CHECK_ERROR();
3548*22dc650dSSadaf Ebrahimi 	CHECK(check_sljit_get_local_base(compiler, dst, dstw, offset));
3549*22dc650dSSadaf Ebrahimi 
3550*22dc650dSSadaf Ebrahimi 	ADJUST_LOCAL_OFFSET(SLJIT_MEM1(SLJIT_SP), offset);
3551*22dc650dSSadaf Ebrahimi 
3552*22dc650dSSadaf Ebrahimi 	SLJIT_SKIP_CHECKS(compiler);
3553*22dc650dSSadaf Ebrahimi 
3554*22dc650dSSadaf Ebrahimi 	if (offset != 0)
3555*22dc650dSSadaf Ebrahimi 		return sljit_emit_op2(compiler, SLJIT_ADD, dst, dstw, SLJIT_SP, 0, SLJIT_IMM, offset);
3556*22dc650dSSadaf Ebrahimi 	return sljit_emit_op1(compiler, SLJIT_MOV, dst, dstw, SLJIT_SP, 0);
3557*22dc650dSSadaf Ebrahimi }
3558*22dc650dSSadaf Ebrahimi 
3559*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_CONFIG_X86 && !SLJIT_CONFIG_ARM_64 */
3560*22dc650dSSadaf Ebrahimi 
3561*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_CONFIG_UNSUPPORTED */
3562