xref: /arkcompiler/toolchain/build/config/arm.gni (revision e509ee18)
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