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
19a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao// Get ARM version number (i.e., __ARM_ARCH__)
20a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao#ifdef __arm__
21a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao#include <machine/cpu-features.h>
22a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao#endif
23a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao
24f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Changusing namespace bcc;
25f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
26f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang//===----------------------------------------------------------------------===//
27f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang// ARM
28f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang//===----------------------------------------------------------------------===//
29f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#if defined(PROVIDE_ARM_CODEGEN)
30f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
31a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liaobool ARMBaseCompilerConfig::HasThumb2() {
32a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao#if !defined(TARGET_BUILD)
33a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao  // Cross-compiler can always generate Thumb-2 instructions.
34a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao  return true;
35a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao#else // defined(TARGET_BUILD)
3641d8dcca655fc21072b3d898b3ea5bfd6b90e96dElliott Hughes#  if (__ARM_ARCH__ >= 7) || defined(__ARM_ARCH_6T2__)
37a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao  return true;
3841d8dcca655fc21072b3d898b3ea5bfd6b90e96dElliott Hughes#  else
39a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao  // ARM prior to V6T2 doesn't support Thumb-2.
40a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao  return false;
41a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao#  endif
42a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao#endif
43a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao}
44a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao
45a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liaovoid
46a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei LiaoARMBaseCompilerConfig::GetFeatureVector(std::vector<std::string> &pAttributes,
47a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao                                        bool pInThumbMode, bool pEnableNEON) {
48f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#if defined(ARCH_ARM_HAVE_VFP)
49f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  pAttributes.push_back("+vfp3");
50f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#  if !defined(ARCH_ARM_HAVE_VFP_D32)
51f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  pAttributes.push_back("+d16");
52f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#  endif
53f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif
54f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
55a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao  if (pInThumbMode) {
56a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao    if (HasThumb2()) {
57a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao      pAttributes.push_back("+thumb2");
58a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao    } else {
59a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao      pAttributes.push_back("-thumb2");
60a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao    }
61a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao  }
62a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao
63229c99b4290e30047678a79910722c628fb2602eStephen Hines#if defined(ARCH_ARM_HAVE_NEON)
64f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  if (pEnableNEON) {
65223f3fefd33e516b3f10c8755418d5dd6c1d3125Stephen Hines    pAttributes.push_back("+neon");
66f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  } else {
67f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    pAttributes.push_back("-neon");
68f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    pAttributes.push_back("-neonfp");
69f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  }
70f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#else
71f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  pAttributes.push_back("-neon");
72f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  pAttributes.push_back("-neonfp");
73f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif
74f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
75f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  return;
76f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang}
77f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
78a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei LiaoARMBaseCompilerConfig::ARMBaseCompilerConfig(const std::string &pTriple,
79a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao                                             bool pInThumbMode)
80a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao  : CompilerConfig(pTriple), mInThumbMode(pInThumbMode) {
81f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
82f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // Enable NEON by default.
83f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  mEnableNEON = true;
84f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
85f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  std::vector<std::string> attributes;
86a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao  GetFeatureVector(attributes, mInThumbMode, mEnableNEON);
87f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  setFeatureString(attributes);
88f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
89f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  return;
90f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang}
91f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang
92a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liaobool ARMBaseCompilerConfig::enableNEON(bool pEnable) {
93229c99b4290e30047678a79910722c628fb2602eStephen Hines#if defined(ARCH_ARM_HAVE_NEON)
94f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  if (mEnableNEON != pEnable) {
95f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    std::vector<std::string> attributes;
96a1d5d7980254d70dd28f4244a2b73120847b5f15Shih-wei Liao    GetFeatureVector(attributes, mInThumbMode, pEnable);
97f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    setFeatureString(attributes);
98f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    mEnableNEON = pEnable;
99f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang    return true;
100f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  }
101f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  // Fall-through
102f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif
103f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang  return false;
104f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang}
105f74ee1940ac8e01c862e90de49eb10982648f6a1Zonr Chang#endif // defined(PROVIDE_ARM_CODEGEN)
106