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