15f9996aaSopenharmony_ci# Copyright 2014 The Chromium Authors. All rights reserved.
25f9996aaSopenharmony_ci# Use of this source code is governed by a BSD-style license that can be
35f9996aaSopenharmony_ci# found in the LICENSE file.
45f9996aaSopenharmony_ci
55f9996aaSopenharmony_ciimport("//build/config/v8_target_cpu.gni")
65f9996aaSopenharmony_ci
75f9996aaSopenharmony_ci# These are primarily relevant in current_cpu == "arm" contexts, where
85f9996aaSopenharmony_ci# ARM code is being compiled.  But they can also be relevant in the
95f9996aaSopenharmony_ci# other contexts when the code will change its behavior based on the
105f9996aaSopenharmony_ci# cpu it wants to generate code for.
115f9996aaSopenharmony_ciif (current_cpu == "arm" || v8_current_cpu == "arm") {
125f9996aaSopenharmony_ci  declare_args() {
135f9996aaSopenharmony_ci    # Version of the ARM processor when compiling on ARM. Ignored on non-ARM
145f9996aaSopenharmony_ci    # platforms.
155f9996aaSopenharmony_ci    arm_version = 7
165f9996aaSopenharmony_ci
175f9996aaSopenharmony_ci    # The ARM architecture. This will be a string like "armv6" or "armv7-a".
185f9996aaSopenharmony_ci    # An empty string means to use the default for the arm_version.
195f9996aaSopenharmony_ci    arm_arch = ""
205f9996aaSopenharmony_ci
215f9996aaSopenharmony_ci    # The ARM floating point hardware. This will be a string like "neon" or
225f9996aaSopenharmony_ci    # "vfpv3". An empty string means to use the default for the arm_version.
235f9996aaSopenharmony_ci    arm_fpu = ""
245f9996aaSopenharmony_ci
255f9996aaSopenharmony_ci    # The ARM floating point mode. This is either the string "hard", "soft", or
265f9996aaSopenharmony_ci    # "softfp". An empty string means to use the default one for the
275f9996aaSopenharmony_ci    # arm_version.
285f9996aaSopenharmony_ci    arm_float_abi = ""
295f9996aaSopenharmony_ci
305f9996aaSopenharmony_ci    # The ARM variant-specific tuning mode. This will be a string like "armv6"
315f9996aaSopenharmony_ci    # or "cortex-a15". An empty string means to use the default for the
325f9996aaSopenharmony_ci    # arm_version.
335f9996aaSopenharmony_ci    arm_tune = ""
345f9996aaSopenharmony_ci
355f9996aaSopenharmony_ci    # Whether to use the neon FPU instruction set or not.
365f9996aaSopenharmony_ci    arm_use_neon = ""
375f9996aaSopenharmony_ci
385f9996aaSopenharmony_ci    # Whether to enable optional NEON code paths.
395f9996aaSopenharmony_ci    arm_optionally_use_neon = false
405f9996aaSopenharmony_ci
415f9996aaSopenharmony_ci    # Thumb is a reduced instruction set available on some ARM processors that
425f9996aaSopenharmony_ci    # has increased code density.
435f9996aaSopenharmony_ci    arm_use_thumb = true
445f9996aaSopenharmony_ci  }
455f9996aaSopenharmony_ci
465f9996aaSopenharmony_ci  assert(arm_float_abi == "" || arm_float_abi == "hard" ||
475f9996aaSopenharmony_ci         arm_float_abi == "soft" || arm_float_abi == "softfp")
485f9996aaSopenharmony_ci
495f9996aaSopenharmony_ci  if (arm_use_neon == "") {
505f9996aaSopenharmony_ci    if (current_os == "linux" && target_cpu != v8_target_cpu) {
515f9996aaSopenharmony_ci      # Don't use neon on V8 simulator builds as a default.
525f9996aaSopenharmony_ci      arm_use_neon = false
535f9996aaSopenharmony_ci    } else {
545f9996aaSopenharmony_ci      arm_use_neon = true
555f9996aaSopenharmony_ci    }
565f9996aaSopenharmony_ci  }
575f9996aaSopenharmony_ci
585f9996aaSopenharmony_ci  if (arm_version == 6) {
595f9996aaSopenharmony_ci    if (arm_arch == "") {
605f9996aaSopenharmony_ci      arm_arch = "armv6"
615f9996aaSopenharmony_ci    }
625f9996aaSopenharmony_ci    if (arm_tune != "") {
635f9996aaSopenharmony_ci      arm_tune = ""
645f9996aaSopenharmony_ci    }
655f9996aaSopenharmony_ci    if (arm_float_abi == "") {
665f9996aaSopenharmony_ci      arm_float_abi = "softfp"
675f9996aaSopenharmony_ci    }
685f9996aaSopenharmony_ci    if (arm_fpu == "") {
695f9996aaSopenharmony_ci      arm_fpu = "vfp"
705f9996aaSopenharmony_ci    }
715f9996aaSopenharmony_ci    arm_use_thumb = false
725f9996aaSopenharmony_ci    arm_use_neon = false
735f9996aaSopenharmony_ci  } else if (arm_version == 7) {
745f9996aaSopenharmony_ci    if (arm_arch == "") {
755f9996aaSopenharmony_ci      arm_arch = "armv7-a"
765f9996aaSopenharmony_ci    }
775f9996aaSopenharmony_ci    if (arm_tune == "") {
785f9996aaSopenharmony_ci      arm_tune = "generic-armv7-a"
795f9996aaSopenharmony_ci    }
805f9996aaSopenharmony_ci
815f9996aaSopenharmony_ci    if (arm_float_abi == "") {
825f9996aaSopenharmony_ci      if (current_os == "ohos" || target_os == "ohos" ||
835f9996aaSopenharmony_ci          target_os == "android") {
845f9996aaSopenharmony_ci        arm_float_abi = "softfp"
855f9996aaSopenharmony_ci      } else if (current_os == "linux" && target_cpu != v8_target_cpu) {
865f9996aaSopenharmony_ci        arm_float_abi = "softfp"
875f9996aaSopenharmony_ci      } else {
885f9996aaSopenharmony_ci        arm_float_abi = "hard"
895f9996aaSopenharmony_ci      }
905f9996aaSopenharmony_ci    }
915f9996aaSopenharmony_ci
925f9996aaSopenharmony_ci    if (arm_fpu == "") {
935f9996aaSopenharmony_ci      if (arm_use_neon) {
945f9996aaSopenharmony_ci        arm_fpu = "neon"
955f9996aaSopenharmony_ci      } else {
965f9996aaSopenharmony_ci        arm_fpu = "vfpv3-d16"
975f9996aaSopenharmony_ci      }
985f9996aaSopenharmony_ci    }
995f9996aaSopenharmony_ci  } else if (arm_version == 8) {
1005f9996aaSopenharmony_ci    if (arm_arch == "") {
1015f9996aaSopenharmony_ci      arm_arch = "armv8-a"
1025f9996aaSopenharmony_ci    }
1035f9996aaSopenharmony_ci    if (arm_tune == "") {
1045f9996aaSopenharmony_ci      arm_tune = "generic-armv8-a"
1055f9996aaSopenharmony_ci    }
1065f9996aaSopenharmony_ci
1075f9996aaSopenharmony_ci    if (arm_float_abi == "") {
1085f9996aaSopenharmony_ci      if (current_os == "ohos" || target_os == "ohos" ||
1095f9996aaSopenharmony_ci          target_os == "android") {
1105f9996aaSopenharmony_ci        arm_float_abi = "softfp"
1115f9996aaSopenharmony_ci      } else {
1125f9996aaSopenharmony_ci        arm_float_abi = "hard"
1135f9996aaSopenharmony_ci      }
1145f9996aaSopenharmony_ci    }
1155f9996aaSopenharmony_ci
1165f9996aaSopenharmony_ci    if (arm_fpu == "") {
1175f9996aaSopenharmony_ci      if (arm_use_neon) {
1185f9996aaSopenharmony_ci        arm_fpu = "neon"
1195f9996aaSopenharmony_ci      } else {
1205f9996aaSopenharmony_ci        arm_fpu = "vfpv3-d16"
1215f9996aaSopenharmony_ci      }
1225f9996aaSopenharmony_ci    }
1235f9996aaSopenharmony_ci  }
1245f9996aaSopenharmony_ci} else if (current_cpu == "arm64" || v8_current_cpu == "arm64") {
1255f9996aaSopenharmony_ci  if (!defined(board_arch)) {
1265f9996aaSopenharmony_ci    arm_arch = "armv8-a"
1275f9996aaSopenharmony_ci  } else {
1285f9996aaSopenharmony_ci    arm_arch = "$board_arch"
1295f9996aaSopenharmony_ci  }
1305f9996aaSopenharmony_ci  if (!defined(board_cpu)) {
1315f9996aaSopenharmony_ci    arm_cpu = "cortex-a55"
1325f9996aaSopenharmony_ci  } else {
1335f9996aaSopenharmony_ci    arm_cpu = "$board_cpu"
1345f9996aaSopenharmony_ci  }
1355f9996aaSopenharmony_ci  if (!defined(board_fpu)) {
1365f9996aaSopenharmony_ci    arm_fpu = "neon-fp-armv8"
1375f9996aaSopenharmony_ci  } else {
1385f9996aaSopenharmony_ci    arm_fpu = "$board_fpu"
1395f9996aaSopenharmony_ci  }
1405f9996aaSopenharmony_ci
1415f9996aaSopenharmony_ci  # arm64 supports only "hard".
1425f9996aaSopenharmony_ci  arm_float_abi = "hard"
1435f9996aaSopenharmony_ci  arm_use_neon = true
1445f9996aaSopenharmony_ci}
145