1 /* 2 * Stack-less Just-In-Time compiler 3 * 4 * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without modification, are 7 * permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright notice, this list of 10 * conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright notice, this list 13 * of conditions and the following disclaimer in the documentation and/or other materials 14 * provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY 17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 19 * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 21 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 22 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 24 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 #ifndef SLJIT_CONFIG_CPU_H_ 28 #define SLJIT_CONFIG_CPU_H_ 29 30 /* --------------------------------------------------------------------- */ 31 /* Architecture */ 32 /* --------------------------------------------------------------------- */ 33 34 /* Architecture selection. */ 35 /* #define SLJIT_CONFIG_X86_32 1 */ 36 /* #define SLJIT_CONFIG_X86_64 1 */ 37 /* #define SLJIT_CONFIG_ARM_V6 1 */ 38 /* #define SLJIT_CONFIG_ARM_V7 1 */ 39 /* #define SLJIT_CONFIG_ARM_THUMB2 1 */ 40 /* #define SLJIT_CONFIG_ARM_64 1 */ 41 /* #define SLJIT_CONFIG_PPC_32 1 */ 42 /* #define SLJIT_CONFIG_PPC_64 1 */ 43 /* #define SLJIT_CONFIG_MIPS_32 1 */ 44 /* #define SLJIT_CONFIG_MIPS_64 1 */ 45 /* #define SLJIT_CONFIG_RISCV_32 1 */ 46 /* #define SLJIT_CONFIG_RISCV_64 1 */ 47 /* #define SLJIT_CONFIG_S390X 1 */ 48 /* #define SLJIT_CONFIG_LOONGARCH_64 */ 49 50 /* #define SLJIT_CONFIG_AUTO 1 */ 51 /* #define SLJIT_CONFIG_UNSUPPORTED 1 */ 52 53 /*****************/ 54 /* Sanity check. */ 55 /*****************/ 56 57 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \ 58 + (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \ 59 + (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) \ 60 + (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ 61 + (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \ 62 + (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ 63 + (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \ 64 + (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \ 65 + (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \ 66 + (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \ 67 + (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) \ 68 + (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) \ 69 + (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \ 70 + (defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64) \ 71 + (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \ 72 + (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) >= 2 73 #error "Multiple architectures are selected" 74 #endif 75 76 #if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \ 77 && !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \ 78 && !(defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) \ 79 && !(defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ 80 && !(defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \ 81 && !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ 82 && !(defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \ 83 && !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \ 84 && !(defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \ 85 && !(defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \ 86 && !(defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) \ 87 && !(defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) \ 88 && !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \ 89 && !(defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64) \ 90 && !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) \ 91 && !(defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) 92 #if defined SLJIT_CONFIG_AUTO && !SLJIT_CONFIG_AUTO 93 #error "An architecture must be selected" 94 #else /* SLJIT_CONFIG_AUTO */ 95 #define SLJIT_CONFIG_AUTO 1 96 #endif /* !SLJIT_CONFIG_AUTO */ 97 #endif /* !SLJIT_CONFIG */ 98 99 /********************************************************/ 100 /* Automatic CPU detection (requires compiler support). */ 101 /********************************************************/ 102 103 #if (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) 104 #ifndef _WIN32 105 106 #if defined(__i386__) || defined(__i386) 107 #define SLJIT_CONFIG_X86_32 1 108 #elif defined(__x86_64__) 109 #define SLJIT_CONFIG_X86_64 1 110 #elif defined(__aarch64__) 111 #define SLJIT_CONFIG_ARM_64 1 112 #elif defined(__thumb2__) 113 #define SLJIT_CONFIG_ARM_THUMB2 1 114 #elif (defined(__ARM_ARCH) && __ARM_ARCH >= 7) || \ 115 ((defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7S__)) \ 116 || (defined(__ARM_ARCH_8A__) || defined(__ARM_ARCH_8R__)) \ 117 || (defined(__ARM_ARCH_9A__))) 118 #define SLJIT_CONFIG_ARM_V7 1 119 #elif defined(__arm__) || defined (__ARM__) 120 #define SLJIT_CONFIG_ARM_V6 1 121 #elif defined(__ppc64__) || defined(__powerpc64__) || (defined(_ARCH_PPC64) && defined(__64BIT__)) || (defined(_POWER) && defined(__64BIT__)) 122 #define SLJIT_CONFIG_PPC_64 1 123 #elif defined(__ppc__) || defined(__powerpc__) || defined(_ARCH_PPC) || defined(_ARCH_PWR) || defined(_ARCH_PWR2) || defined(_POWER) 124 #define SLJIT_CONFIG_PPC_32 1 125 #elif defined(__mips__) && !defined(_LP64) 126 #define SLJIT_CONFIG_MIPS_32 1 127 #elif defined(__mips64) 128 #define SLJIT_CONFIG_MIPS_64 1 129 #elif defined (__riscv_xlen) && (__riscv_xlen == 32) 130 #define SLJIT_CONFIG_RISCV_32 1 131 #elif defined (__riscv_xlen) && (__riscv_xlen == 64) 132 #define SLJIT_CONFIG_RISCV_64 1 133 #elif defined (__loongarch_lp64) 134 #define SLJIT_CONFIG_LOONGARCH_64 1 135 #elif defined(__s390x__) 136 #define SLJIT_CONFIG_S390X 1 137 #else 138 /* Unsupported architecture */ 139 #define SLJIT_CONFIG_UNSUPPORTED 1 140 #endif 141 142 #else /* _WIN32 */ 143 144 #if defined(_M_X64) || defined(__x86_64__) 145 #define SLJIT_CONFIG_X86_64 1 146 #elif (defined(_M_ARM) && _M_ARM >= 7 && defined(_M_ARMT)) || defined(__thumb2__) 147 #define SLJIT_CONFIG_ARM_THUMB2 1 148 #elif (defined(_M_ARM) && _M_ARM >= 7) 149 #define SLJIT_CONFIG_ARM_V7 1 150 #elif defined(_ARM_) 151 #define SLJIT_CONFIG_ARM_V6 1 152 #elif defined(_M_ARM64) || defined(__aarch64__) 153 #define SLJIT_CONFIG_ARM_64 1 154 #else 155 #define SLJIT_CONFIG_X86_32 1 156 #endif 157 158 #endif /* !_WIN32 */ 159 #endif /* SLJIT_CONFIG_AUTO */ 160 161 #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) 162 #undef SLJIT_EXECUTABLE_ALLOCATOR 163 #endif /* SLJIT_CONFIG_UNSUPPORTED */ 164 165 /******************************/ 166 /* CPU family type detection. */ 167 /******************************/ 168 169 #if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ 170 || (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) 171 #define SLJIT_CONFIG_ARM_32 1 172 #endif 173 174 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) 175 #define SLJIT_CONFIG_X86 1 176 #elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) 177 #define SLJIT_CONFIG_ARM 1 178 #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) 179 #define SLJIT_CONFIG_PPC 1 180 #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) || (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) 181 #define SLJIT_CONFIG_MIPS 1 182 #elif (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32) || (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) 183 #define SLJIT_CONFIG_RISCV 1 184 #elif (defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64) 185 #define SLJIT_CONFIG_LOONGARCH 1 186 #endif 187 188 #endif /* SLJIT_CONFIG_CPU_H_ */ 189