| /* |
| * Copyright 2012, The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "bcc/Support/TargetCompilerConfigs.h" |
| |
| // Get ARM version number (i.e., __ARM_ARCH__) |
| #ifdef __arm__ |
| #include <machine/cpu-features.h> |
| #endif |
| |
| using namespace bcc; |
| |
| //===----------------------------------------------------------------------===// |
| // ARM |
| //===----------------------------------------------------------------------===// |
| #if defined(PROVIDE_ARM_CODEGEN) |
| |
| bool ARMBaseCompilerConfig::HasThumb2() { |
| #if !defined(TARGET_BUILD) |
| // Cross-compiler can always generate Thumb-2 instructions. |
| return true; |
| #else // defined(TARGET_BUILD) |
| # if (__ARM_ARCH__ >= 7) || defined(__ARM_ARCH_6T2__) |
| return true; |
| # else |
| // ARM prior to V6T2 doesn't support Thumb-2. |
| return false; |
| # endif |
| #endif |
| } |
| |
| void |
| ARMBaseCompilerConfig::GetFeatureVector(std::vector<std::string> &pAttributes, |
| bool pInThumbMode, bool pEnableNEON) { |
| #if defined(ARCH_ARM_HAVE_VFP) |
| pAttributes.push_back("+vfp3"); |
| # if !defined(ARCH_ARM_HAVE_VFP_D32) |
| pAttributes.push_back("+d16"); |
| # endif |
| #endif |
| |
| if (pInThumbMode) { |
| if (HasThumb2()) { |
| pAttributes.push_back("+thumb2"); |
| } else { |
| pAttributes.push_back("-thumb2"); |
| } |
| } |
| |
| #if defined(ARCH_ARM_HAVE_NEON) && !defined(DISABLE_ARCH_ARM_HAVE_NEON) |
| if (pEnableNEON) { |
| pAttributes.push_back("+neon"); |
| pAttributes.push_back("+neonfp"); |
| } else { |
| pAttributes.push_back("-neon"); |
| pAttributes.push_back("-neonfp"); |
| } |
| #else |
| pAttributes.push_back("-neon"); |
| pAttributes.push_back("-neonfp"); |
| #endif |
| |
| return; |
| } |
| |
| ARMBaseCompilerConfig::ARMBaseCompilerConfig(const std::string &pTriple, |
| bool pInThumbMode) |
| : CompilerConfig(pTriple), mInThumbMode(pInThumbMode) { |
| |
| // Enable NEON by default. |
| mEnableNEON = true; |
| |
| std::vector<std::string> attributes; |
| GetFeatureVector(attributes, mInThumbMode, mEnableNEON); |
| setFeatureString(attributes); |
| |
| return; |
| } |
| |
| bool ARMBaseCompilerConfig::enableNEON(bool pEnable) { |
| #if defined(ARCH_ARM_HAVE_NEON) && !defined(DISABLE_ARCH_ARM_HAVE_NEON) |
| if (mEnableNEON != pEnable) { |
| std::vector<std::string> attributes; |
| GetFeatureVector(attributes, mInThumbMode, pEnable); |
| setFeatureString(attributes); |
| mEnableNEON = pEnable; |
| return true; |
| } |
| // Fall-through |
| #endif |
| return false; |
| } |
| #endif // defined(PROVIDE_ARM_CODEGEN) |