1e509ee18Sopenharmony_ci# Copyright (c) 2023 Huawei Device Co., Ltd. 2e509ee18Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); 3e509ee18Sopenharmony_ci# you may not use this file except in compliance with the License. 4e509ee18Sopenharmony_ci# You may obtain a copy of the License at 5e509ee18Sopenharmony_ci# 6e509ee18Sopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 7e509ee18Sopenharmony_ci# 8e509ee18Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software 9e509ee18Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, 10e509ee18Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11e509ee18Sopenharmony_ci# See the License for the specific language governing permissions and 12e509ee18Sopenharmony_ci# limitations under the License. 13e509ee18Sopenharmony_ci 14e509ee18Sopenharmony_ci# These are primarily relevant in current_cpu == "arm" contexts, where 15e509ee18Sopenharmony_ci# ARM code is being compiled. But they can also be relevant in the 16e509ee18Sopenharmony_ci# other contexts when the code will change its behavior based on the 17e509ee18Sopenharmony_ci# cpu it wants to generate code for. 18e509ee18Sopenharmony_ciif (current_cpu == "arm") { 19e509ee18Sopenharmony_ci declare_args() { 20e509ee18Sopenharmony_ci # Version of the ARM processor when compiling on ARM. Ignored on non-ARM 21e509ee18Sopenharmony_ci # platforms. 22e509ee18Sopenharmony_ci arm_version = 7 23e509ee18Sopenharmony_ci 24e509ee18Sopenharmony_ci # The ARM architecture. This will be a string like "armv6" or "armv7-a". 25e509ee18Sopenharmony_ci # An empty string means to use the default for the arm_version. 26e509ee18Sopenharmony_ci arm_arch = "" 27e509ee18Sopenharmony_ci 28e509ee18Sopenharmony_ci # The ARM floating point hardware. This will be a string like "neon" or 29e509ee18Sopenharmony_ci # "vfpv3". An empty string means to use the default for the arm_version. 30e509ee18Sopenharmony_ci arm_fpu = "" 31e509ee18Sopenharmony_ci 32e509ee18Sopenharmony_ci # The ARM floating point mode. This is either the string "hard", "soft", or 33e509ee18Sopenharmony_ci # "softfp". An empty string means to use the default one for the 34e509ee18Sopenharmony_ci # arm_version. 35e509ee18Sopenharmony_ci arm_float_abi = "" 36e509ee18Sopenharmony_ci 37e509ee18Sopenharmony_ci # The ARM variant-specific tuning mode. This will be a string like "armv6" 38e509ee18Sopenharmony_ci # or "cortex-a15". An empty string means to use the default for the 39e509ee18Sopenharmony_ci # arm_version. 40e509ee18Sopenharmony_ci arm_tune = "" 41e509ee18Sopenharmony_ci 42e509ee18Sopenharmony_ci # Whether to use the neon FPU instruction set or not. 43e509ee18Sopenharmony_ci arm_use_neon = "" 44e509ee18Sopenharmony_ci 45e509ee18Sopenharmony_ci # Whether to enable optional NEON code paths. 46e509ee18Sopenharmony_ci arm_optionally_use_neon = false 47e509ee18Sopenharmony_ci 48e509ee18Sopenharmony_ci # Thumb is a reduced instruction set available on some ARM processors that 49e509ee18Sopenharmony_ci # has increased code density. 50e509ee18Sopenharmony_ci arm_use_thumb = true 51e509ee18Sopenharmony_ci } 52e509ee18Sopenharmony_ci 53e509ee18Sopenharmony_ci assert(arm_float_abi == "" || arm_float_abi == "hard" || 54e509ee18Sopenharmony_ci arm_float_abi == "soft" || arm_float_abi == "softfp") 55e509ee18Sopenharmony_ci 56e509ee18Sopenharmony_ci if (arm_use_neon == "") { 57e509ee18Sopenharmony_ci if (current_os == "linux") { 58e509ee18Sopenharmony_ci # Don't use neon as a default. 59e509ee18Sopenharmony_ci arm_use_neon = false 60e509ee18Sopenharmony_ci } else { 61e509ee18Sopenharmony_ci arm_use_neon = true 62e509ee18Sopenharmony_ci } 63e509ee18Sopenharmony_ci } 64e509ee18Sopenharmony_ci 65e509ee18Sopenharmony_ci if (arm_version == 6) { 66e509ee18Sopenharmony_ci if (arm_arch == "") { 67e509ee18Sopenharmony_ci arm_arch = "armv6" 68e509ee18Sopenharmony_ci } 69e509ee18Sopenharmony_ci if (arm_tune != "") { 70e509ee18Sopenharmony_ci arm_tune = "" 71e509ee18Sopenharmony_ci } 72e509ee18Sopenharmony_ci if (arm_float_abi == "") { 73e509ee18Sopenharmony_ci arm_float_abi = "softfp" 74e509ee18Sopenharmony_ci } 75e509ee18Sopenharmony_ci if (arm_fpu == "") { 76e509ee18Sopenharmony_ci arm_fpu = "vfp" 77e509ee18Sopenharmony_ci } 78e509ee18Sopenharmony_ci arm_use_thumb = false 79e509ee18Sopenharmony_ci arm_use_neon = false 80e509ee18Sopenharmony_ci } else if (arm_version == 7) { 81e509ee18Sopenharmony_ci if (arm_arch == "") { 82e509ee18Sopenharmony_ci arm_arch = "armv7-a" 83e509ee18Sopenharmony_ci } 84e509ee18Sopenharmony_ci if (arm_tune == "") { 85e509ee18Sopenharmony_ci arm_tune = "generic-armv7-a" 86e509ee18Sopenharmony_ci } 87e509ee18Sopenharmony_ci 88e509ee18Sopenharmony_ci if (arm_float_abi == "") { 89e509ee18Sopenharmony_ci if (current_os == "ohos" || target_os == "ohos") { 90e509ee18Sopenharmony_ci arm_float_abi = "softfp" 91e509ee18Sopenharmony_ci } else if (current_os == "linux") { 92e509ee18Sopenharmony_ci arm_float_abi = "softfp" 93e509ee18Sopenharmony_ci } else { 94e509ee18Sopenharmony_ci arm_float_abi = "hard" 95e509ee18Sopenharmony_ci } 96e509ee18Sopenharmony_ci } 97e509ee18Sopenharmony_ci 98e509ee18Sopenharmony_ci if (arm_fpu == "") { 99e509ee18Sopenharmony_ci if (arm_use_neon) { 100e509ee18Sopenharmony_ci arm_fpu = "neon" 101e509ee18Sopenharmony_ci } else { 102e509ee18Sopenharmony_ci arm_fpu = "vfpv3-d16" 103e509ee18Sopenharmony_ci } 104e509ee18Sopenharmony_ci } 105e509ee18Sopenharmony_ci } else if (arm_version == 8) { 106e509ee18Sopenharmony_ci if (arm_arch == "") { 107e509ee18Sopenharmony_ci arm_arch = "armv8-a" 108e509ee18Sopenharmony_ci } 109e509ee18Sopenharmony_ci if (arm_tune == "") { 110e509ee18Sopenharmony_ci arm_tune = "generic-armv8-a" 111e509ee18Sopenharmony_ci } 112e509ee18Sopenharmony_ci 113e509ee18Sopenharmony_ci if (arm_float_abi == "") { 114e509ee18Sopenharmony_ci if (current_os == "ohos" || target_os == "ohos") { 115e509ee18Sopenharmony_ci arm_float_abi = "softfp" 116e509ee18Sopenharmony_ci } else { 117e509ee18Sopenharmony_ci arm_float_abi = "hard" 118e509ee18Sopenharmony_ci } 119e509ee18Sopenharmony_ci } 120e509ee18Sopenharmony_ci 121e509ee18Sopenharmony_ci if (arm_fpu == "") { 122e509ee18Sopenharmony_ci if (arm_use_neon) { 123e509ee18Sopenharmony_ci arm_fpu = "neon" 124e509ee18Sopenharmony_ci } else { 125e509ee18Sopenharmony_ci arm_fpu = "vfpv3-d16" 126e509ee18Sopenharmony_ci } 127e509ee18Sopenharmony_ci } 128e509ee18Sopenharmony_ci } 129e509ee18Sopenharmony_ci} else if (current_cpu == "arm64") { 130e509ee18Sopenharmony_ci if (!defined(board_arch)) { 131e509ee18Sopenharmony_ci arm_arch = "armv8-a" 132e509ee18Sopenharmony_ci } else { 133e509ee18Sopenharmony_ci arm_arch = "$board_arch" 134e509ee18Sopenharmony_ci } 135e509ee18Sopenharmony_ci if (!defined(board_cpu)) { 136e509ee18Sopenharmony_ci arm_cpu = "cortex-a55" 137e509ee18Sopenharmony_ci } else { 138e509ee18Sopenharmony_ci arm_cpu = "$board_cpu" 139e509ee18Sopenharmony_ci } 140e509ee18Sopenharmony_ci if (!defined(board_fpu)) { 141e509ee18Sopenharmony_ci arm_fpu = "neon-fp-armv8" 142e509ee18Sopenharmony_ci } else { 143e509ee18Sopenharmony_ci arm_fpu = "$board_fpu" 144e509ee18Sopenharmony_ci } 145e509ee18Sopenharmony_ci 146e509ee18Sopenharmony_ci # arm64 supports only "hard". 147e509ee18Sopenharmony_ci arm_float_abi = "hard" 148e509ee18Sopenharmony_ci arm_use_neon = true 149e509ee18Sopenharmony_ci} 150