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