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