xref: /aosp_15_r20/external/pcre/src/sljit/sljitConfigCPU.h (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 #ifndef SLJIT_CONFIG_CPU_H_
28*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_CPU_H_
29*22dc650dSSadaf Ebrahimi 
30*22dc650dSSadaf Ebrahimi /* --------------------------------------------------------------------- */
31*22dc650dSSadaf Ebrahimi /*  Architecture                                                         */
32*22dc650dSSadaf Ebrahimi /* --------------------------------------------------------------------- */
33*22dc650dSSadaf Ebrahimi 
34*22dc650dSSadaf Ebrahimi /* Architecture selection. */
35*22dc650dSSadaf Ebrahimi /* #define SLJIT_CONFIG_X86_32 1 */
36*22dc650dSSadaf Ebrahimi /* #define SLJIT_CONFIG_X86_64 1 */
37*22dc650dSSadaf Ebrahimi /* #define SLJIT_CONFIG_ARM_V6 1 */
38*22dc650dSSadaf Ebrahimi /* #define SLJIT_CONFIG_ARM_V7 1 */
39*22dc650dSSadaf Ebrahimi /* #define SLJIT_CONFIG_ARM_THUMB2 1 */
40*22dc650dSSadaf Ebrahimi /* #define SLJIT_CONFIG_ARM_64 1 */
41*22dc650dSSadaf Ebrahimi /* #define SLJIT_CONFIG_PPC_32 1 */
42*22dc650dSSadaf Ebrahimi /* #define SLJIT_CONFIG_PPC_64 1 */
43*22dc650dSSadaf Ebrahimi /* #define SLJIT_CONFIG_MIPS_32 1 */
44*22dc650dSSadaf Ebrahimi /* #define SLJIT_CONFIG_MIPS_64 1 */
45*22dc650dSSadaf Ebrahimi /* #define SLJIT_CONFIG_RISCV_32 1 */
46*22dc650dSSadaf Ebrahimi /* #define SLJIT_CONFIG_RISCV_64 1 */
47*22dc650dSSadaf Ebrahimi /* #define SLJIT_CONFIG_S390X 1 */
48*22dc650dSSadaf Ebrahimi /* #define SLJIT_CONFIG_LOONGARCH_64 */
49*22dc650dSSadaf Ebrahimi 
50*22dc650dSSadaf Ebrahimi /* #define SLJIT_CONFIG_AUTO 1 */
51*22dc650dSSadaf Ebrahimi /* #define SLJIT_CONFIG_UNSUPPORTED 1 */
52*22dc650dSSadaf Ebrahimi 
53*22dc650dSSadaf Ebrahimi /*****************/
54*22dc650dSSadaf Ebrahimi /* Sanity check. */
55*22dc650dSSadaf Ebrahimi /*****************/
56*22dc650dSSadaf Ebrahimi 
57*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
58*22dc650dSSadaf Ebrahimi 	+ (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
59*22dc650dSSadaf Ebrahimi 	+ (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) \
60*22dc650dSSadaf Ebrahimi 	+ (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
61*22dc650dSSadaf Ebrahimi 	+ (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
62*22dc650dSSadaf Ebrahimi 	+ (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
63*22dc650dSSadaf Ebrahimi 	+ (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
64*22dc650dSSadaf Ebrahimi 	+ (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
65*22dc650dSSadaf Ebrahimi 	+ (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
66*22dc650dSSadaf Ebrahimi 	+ (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \
67*22dc650dSSadaf Ebrahimi 	+ (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) \
68*22dc650dSSadaf Ebrahimi 	+ (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) \
69*22dc650dSSadaf Ebrahimi 	+ (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \
70*22dc650dSSadaf Ebrahimi 	+ (defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64) \
71*22dc650dSSadaf Ebrahimi 	+ (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \
72*22dc650dSSadaf Ebrahimi 	+ (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) >= 2
73*22dc650dSSadaf Ebrahimi #error "Multiple architectures are selected"
74*22dc650dSSadaf Ebrahimi #endif
75*22dc650dSSadaf Ebrahimi 
76*22dc650dSSadaf Ebrahimi #if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
77*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
78*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) \
79*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
80*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
81*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
82*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
83*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
84*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
85*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \
86*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) \
87*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) \
88*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \
89*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64) \
90*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) \
91*22dc650dSSadaf Ebrahimi 	&& !(defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO)
92*22dc650dSSadaf Ebrahimi #if defined SLJIT_CONFIG_AUTO && !SLJIT_CONFIG_AUTO
93*22dc650dSSadaf Ebrahimi #error "An architecture must be selected"
94*22dc650dSSadaf Ebrahimi #else /* SLJIT_CONFIG_AUTO */
95*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_AUTO 1
96*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_CONFIG_AUTO */
97*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_CONFIG */
98*22dc650dSSadaf Ebrahimi 
99*22dc650dSSadaf Ebrahimi /********************************************************/
100*22dc650dSSadaf Ebrahimi /* Automatic CPU detection (requires compiler support). */
101*22dc650dSSadaf Ebrahimi /********************************************************/
102*22dc650dSSadaf Ebrahimi 
103*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO)
104*22dc650dSSadaf Ebrahimi #ifndef _WIN32
105*22dc650dSSadaf Ebrahimi 
106*22dc650dSSadaf Ebrahimi #if defined(__i386__) || defined(__i386)
107*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_X86_32 1
108*22dc650dSSadaf Ebrahimi #elif defined(__x86_64__)
109*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_X86_64 1
110*22dc650dSSadaf Ebrahimi #elif defined(__aarch64__)
111*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_ARM_64 1
112*22dc650dSSadaf Ebrahimi #elif defined(__thumb2__)
113*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_ARM_THUMB2 1
114*22dc650dSSadaf Ebrahimi #elif (defined(__ARM_ARCH) && __ARM_ARCH >= 7) || \
115*22dc650dSSadaf Ebrahimi 	((defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7S__)) \
116*22dc650dSSadaf Ebrahimi 	 || (defined(__ARM_ARCH_8A__) || defined(__ARM_ARCH_8R__)) \
117*22dc650dSSadaf Ebrahimi 	 || (defined(__ARM_ARCH_9A__)))
118*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_ARM_V7 1
119*22dc650dSSadaf Ebrahimi #elif defined(__arm__) || defined (__ARM__)
120*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_ARM_V6 1
121*22dc650dSSadaf Ebrahimi #elif defined(__ppc64__) || defined(__powerpc64__) || (defined(_ARCH_PPC64) && defined(__64BIT__)) || (defined(_POWER) && defined(__64BIT__))
122*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_PPC_64 1
123*22dc650dSSadaf Ebrahimi #elif defined(__ppc__) || defined(__powerpc__) || defined(_ARCH_PPC) || defined(_ARCH_PWR) || defined(_ARCH_PWR2) || defined(_POWER)
124*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_PPC_32 1
125*22dc650dSSadaf Ebrahimi #elif defined(__mips__) && !defined(_LP64)
126*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_MIPS_32 1
127*22dc650dSSadaf Ebrahimi #elif defined(__mips64)
128*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_MIPS_64 1
129*22dc650dSSadaf Ebrahimi #elif defined (__riscv_xlen) && (__riscv_xlen == 32)
130*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_RISCV_32 1
131*22dc650dSSadaf Ebrahimi #elif defined (__riscv_xlen) && (__riscv_xlen == 64)
132*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_RISCV_64 1
133*22dc650dSSadaf Ebrahimi #elif defined (__loongarch_lp64)
134*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_LOONGARCH_64 1
135*22dc650dSSadaf Ebrahimi #elif defined(__s390x__)
136*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_S390X 1
137*22dc650dSSadaf Ebrahimi #else
138*22dc650dSSadaf Ebrahimi /* Unsupported architecture */
139*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_UNSUPPORTED 1
140*22dc650dSSadaf Ebrahimi #endif
141*22dc650dSSadaf Ebrahimi 
142*22dc650dSSadaf Ebrahimi #else /* _WIN32 */
143*22dc650dSSadaf Ebrahimi 
144*22dc650dSSadaf Ebrahimi #if defined(_M_X64) || defined(__x86_64__)
145*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_X86_64 1
146*22dc650dSSadaf Ebrahimi #elif (defined(_M_ARM) && _M_ARM >= 7 && defined(_M_ARMT)) || defined(__thumb2__)
147*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_ARM_THUMB2 1
148*22dc650dSSadaf Ebrahimi #elif (defined(_M_ARM) && _M_ARM >= 7)
149*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_ARM_V7 1
150*22dc650dSSadaf Ebrahimi #elif defined(_ARM_)
151*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_ARM_V6 1
152*22dc650dSSadaf Ebrahimi #elif defined(_M_ARM64) || defined(__aarch64__)
153*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_ARM_64 1
154*22dc650dSSadaf Ebrahimi #else
155*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_X86_32 1
156*22dc650dSSadaf Ebrahimi #endif
157*22dc650dSSadaf Ebrahimi 
158*22dc650dSSadaf Ebrahimi #endif /* !_WIN32 */
159*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_AUTO */
160*22dc650dSSadaf Ebrahimi 
161*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
162*22dc650dSSadaf Ebrahimi #undef SLJIT_EXECUTABLE_ALLOCATOR
163*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_UNSUPPORTED */
164*22dc650dSSadaf Ebrahimi 
165*22dc650dSSadaf Ebrahimi /******************************/
166*22dc650dSSadaf Ebrahimi /* CPU family type detection. */
167*22dc650dSSadaf Ebrahimi /******************************/
168*22dc650dSSadaf Ebrahimi 
169*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
170*22dc650dSSadaf Ebrahimi 	|| (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
171*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_ARM_32 1
172*22dc650dSSadaf Ebrahimi #endif
173*22dc650dSSadaf Ebrahimi 
174*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
175*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_X86 1
176*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
177*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_ARM 1
178*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
179*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_PPC 1
180*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) || (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
181*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_MIPS 1
182*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) || (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
183*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_RISCV 1
184*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64)
185*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_LOONGARCH 1
186*22dc650dSSadaf Ebrahimi #endif
187*22dc650dSSadaf Ebrahimi 
188*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_CPU_H_ */
189