1f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang/*
2f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * Copyright 2012, The Android Open Source Project
3f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang *
4f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
5f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * you may not use this file except in compliance with the License.
6f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * You may obtain a copy of the License at
7f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang *
8f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
9f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang *
10f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * Unless required by applicable law or agreed to in writing, software
11f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
12f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * See the License for the specific language governing permissions and
14f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang * limitations under the License.
15f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang */
16f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
17c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/Support/TargetCompilerConfigs.h"
18f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
19f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changusing namespace bcc;
20f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
21f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang//===----------------------------------------------------------------------===//
22f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang// ARM
23f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang//===----------------------------------------------------------------------===//
24f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#if defined(PROVIDE_ARM_CODEGEN)
25f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
26f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changvoid ARMCompilerConfig::GetFeatureVector(std::vector<std::string> &pAttributes,
27f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang                                         bool pEnableNEON) {
28f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#if defined(ARCH_ARM_HAVE_VFP)
29f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  pAttributes.push_back("+vfp3");
30f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#  if !defined(ARCH_ARM_HAVE_VFP_D32)
31f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  pAttributes.push_back("+d16");
32f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#  endif
33f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif
34f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
35f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#if defined(ARCH_ARM_HAVE_NEON) && !defined(DISABLE_ARCH_ARM_HAVE_NEON)
36f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  if (pEnableNEON) {
37223f3fefd33e516b3f10c8755418d5dd6c1d3125Stephen Hines    pAttributes.push_back("+neon");
38223f3fefd33e516b3f10c8755418d5dd6c1d3125Stephen Hines    pAttributes.push_back("+neonfp");
39f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  } else {
40f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    pAttributes.push_back("-neon");
41f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    pAttributes.push_back("-neonfp");
42f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  }
43f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#else
44f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  pAttributes.push_back("-neon");
45f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  pAttributes.push_back("-neonfp");
46f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif
47f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
48f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  return;
49f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang}
50f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
51f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr ChangARMCompilerConfig::ARMCompilerConfig()
52f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  : CompilerConfig(DEFAULT_ARM_TRIPLE_STRING) {
53f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
54f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // Enable NEON by default.
55f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  mEnableNEON = true;
56f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
57f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  std::vector<std::string> attributes;
58f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  GetFeatureVector(attributes, /* pEnableNEON */mEnableNEON);
59f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  setFeatureString(attributes);
60f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
61f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  return;
62f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang}
63f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
64f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changbool ARMCompilerConfig::enableNEON(bool pEnable) {
65f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#if defined(ARCH_ARM_HAVE_NEON) && !defined(DISABLE_ARCH_ARM_HAVE_NEON)
66f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  if (mEnableNEON != pEnable) {
67f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    std::vector<std::string> attributes;
68f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    GetFeatureVector(attributes, pEnable);
69f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    setFeatureString(attributes);
70f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    mEnableNEON = pEnable;
71f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    return true;
72f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  }
73f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // Fall-through
74f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif
75f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  return false;
76f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang}
77f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif // defined(PROVIDE_ARM_CODEGEN)
78