| 1 | module pref |
| 2 | |
| 3 | pub const C.__V_architecture int |
| 4 | |
| 5 | pub enum Arch { |
| 6 | _auto |
| 7 | amd64 // aka x86_64 |
| 8 | arm64 // 64-bit arm |
| 9 | arm32 // 32-bit arm |
| 10 | rv64 // 64-bit risc-v |
| 11 | rv32 // 32-bit risc-v |
| 12 | i386 |
| 13 | s390x |
| 14 | ppc64le |
| 15 | loongarch64 |
| 16 | sparc64 |
| 17 | ppc64 |
| 18 | ppc |
| 19 | js_node |
| 20 | js_browser |
| 21 | js_freestanding |
| 22 | wasm32 |
| 23 | _max |
| 24 | } |
| 25 | |
| 26 | pub fn get_host_arch() Arch { |
| 27 | // Note: we can not use `$if arch` here, because V skips cgen for the non |
| 28 | // current comptime branches by default, so there is a bootstrapping |
| 29 | // problem => the __V_architecture macro is used to resolve it. |
| 30 | // TODO: think about how to solve it for non C backends, perhaps we |
| 31 | // need a mechanism to always generate all branches for specific functions? |
| 32 | if C.__V_architecture <= int(Arch._auto) || C.__V_architecture >= int(Arch._max) { |
| 33 | return Arch.amd64 |
| 34 | } |
| 35 | return unsafe { Arch(C.__V_architecture) } |
| 36 | } |
| 37 | |
| 38 | pub fn arch_from_string(arch_str string) !Arch { |
| 39 | match arch_str { |
| 40 | 'amd64', 'x86_64', 'x64', 'x86' { // amd64 recommended |
| 41 | return .amd64 |
| 42 | } |
| 43 | 'aarch64', 'arm64' { // arm64 recommended |
| 44 | return .arm64 |
| 45 | } |
| 46 | 'aarch32', 'arm32', 'arm' { // arm32 recommended |
| 47 | return .arm32 |
| 48 | } |
| 49 | 'rv64', 'riscv64', 'risc-v64', 'riscv', 'risc-v' { // rv64 recommended |
| 50 | return .rv64 |
| 51 | } |
| 52 | 'rv32', 'riscv32' { // rv32 recommended |
| 53 | return .rv32 |
| 54 | } |
| 55 | 'x86_32', 'x32', 'i386', 'IA-32', 'ia-32', 'ia32' { // i386 recommended |
| 56 | return .i386 |
| 57 | } |
| 58 | 's390x' { |
| 59 | return .s390x |
| 60 | } |
| 61 | 'loongarch64' { |
| 62 | return .loongarch64 |
| 63 | } |
| 64 | 'ppc64le' { |
| 65 | return .ppc64le |
| 66 | } |
| 67 | 'sparc64' { |
| 68 | return .sparc64 |
| 69 | } |
| 70 | 'ppc64' { |
| 71 | return .ppc64 |
| 72 | } |
| 73 | 'ppc', 'ppc32', 'powerpc' { |
| 74 | return .ppc |
| 75 | } |
| 76 | 'js', 'js_node' { |
| 77 | return .js_node |
| 78 | } |
| 79 | 'js_browser' { |
| 80 | return .js_browser |
| 81 | } |
| 82 | 'js_freestanding' { |
| 83 | return .js_freestanding |
| 84 | } |
| 85 | 'wasm32', 'wasm' { |
| 86 | return .wasm32 |
| 87 | } |
| 88 | '' { |
| 89 | return ._auto |
| 90 | } |
| 91 | else { |
| 92 | return error('invalid arch: ${arch_str}') |
| 93 | } |
| 94 | } |
| 95 | } |
| 96 | |