1*f5c631daSSadaf Ebrahimi // Copyright 2015, VIXL authors 2*f5c631daSSadaf Ebrahimi // All rights reserved. 3*f5c631daSSadaf Ebrahimi // 4*f5c631daSSadaf Ebrahimi // Redistribution and use in source and binary forms, with or without 5*f5c631daSSadaf Ebrahimi // modification, are permitted provided that the following conditions are met: 6*f5c631daSSadaf Ebrahimi // 7*f5c631daSSadaf Ebrahimi // * Redistributions of source code must retain the above copyright notice, 8*f5c631daSSadaf Ebrahimi // this list of conditions and the following disclaimer. 9*f5c631daSSadaf Ebrahimi // * Redistributions in binary form must reproduce the above copyright notice, 10*f5c631daSSadaf Ebrahimi // this list of conditions and the following disclaimer in the documentation 11*f5c631daSSadaf Ebrahimi // and/or other materials provided with the distribution. 12*f5c631daSSadaf Ebrahimi // * Neither the name of ARM Limited nor the names of its contributors may be 13*f5c631daSSadaf Ebrahimi // used to endorse or promote products derived from this software without 14*f5c631daSSadaf Ebrahimi // specific prior written permission. 15*f5c631daSSadaf Ebrahimi // 16*f5c631daSSadaf Ebrahimi // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND 17*f5c631daSSadaf Ebrahimi // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18*f5c631daSSadaf Ebrahimi // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19*f5c631daSSadaf Ebrahimi // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 20*f5c631daSSadaf Ebrahimi // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*f5c631daSSadaf Ebrahimi // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22*f5c631daSSadaf Ebrahimi // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23*f5c631daSSadaf Ebrahimi // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24*f5c631daSSadaf Ebrahimi // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25*f5c631daSSadaf Ebrahimi // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*f5c631daSSadaf Ebrahimi 27*f5c631daSSadaf Ebrahimi #ifndef VIXL_GLOBALS_H 28*f5c631daSSadaf Ebrahimi #define VIXL_GLOBALS_H 29*f5c631daSSadaf Ebrahimi 30*f5c631daSSadaf Ebrahimi #if __cplusplus < 201402L 31*f5c631daSSadaf Ebrahimi #error VIXL requires C++14 32*f5c631daSSadaf Ebrahimi #endif 33*f5c631daSSadaf Ebrahimi 34*f5c631daSSadaf Ebrahimi // Get standard C99 macros for integer types. 35*f5c631daSSadaf Ebrahimi #ifndef __STDC_CONSTANT_MACROS 36*f5c631daSSadaf Ebrahimi #define __STDC_CONSTANT_MACROS 37*f5c631daSSadaf Ebrahimi #endif 38*f5c631daSSadaf Ebrahimi 39*f5c631daSSadaf Ebrahimi #ifndef __STDC_LIMIT_MACROS 40*f5c631daSSadaf Ebrahimi #define __STDC_LIMIT_MACROS 41*f5c631daSSadaf Ebrahimi #endif 42*f5c631daSSadaf Ebrahimi 43*f5c631daSSadaf Ebrahimi #ifndef __STDC_FORMAT_MACROS 44*f5c631daSSadaf Ebrahimi #define __STDC_FORMAT_MACROS 45*f5c631daSSadaf Ebrahimi #endif 46*f5c631daSSadaf Ebrahimi 47*f5c631daSSadaf Ebrahimi extern "C" { 48*f5c631daSSadaf Ebrahimi #include <inttypes.h> 49*f5c631daSSadaf Ebrahimi #include <stdint.h> 50*f5c631daSSadaf Ebrahimi } 51*f5c631daSSadaf Ebrahimi 52*f5c631daSSadaf Ebrahimi #include <cassert> 53*f5c631daSSadaf Ebrahimi #include <cstdarg> 54*f5c631daSSadaf Ebrahimi #include <cstddef> 55*f5c631daSSadaf Ebrahimi #include <cstdio> 56*f5c631daSSadaf Ebrahimi #include <cstdlib> 57*f5c631daSSadaf Ebrahimi 58*f5c631daSSadaf Ebrahimi #include "platform-vixl.h" 59*f5c631daSSadaf Ebrahimi 60*f5c631daSSadaf Ebrahimi #ifdef VIXL_NEGATIVE_TESTING 61*f5c631daSSadaf Ebrahimi #include <sstream> 62*f5c631daSSadaf Ebrahimi #include <stdexcept> 63*f5c631daSSadaf Ebrahimi #include <string> 64*f5c631daSSadaf Ebrahimi #endif 65*f5c631daSSadaf Ebrahimi 66*f5c631daSSadaf Ebrahimi namespace vixl { 67*f5c631daSSadaf Ebrahimi 68*f5c631daSSadaf Ebrahimi typedef uint8_t byte; 69*f5c631daSSadaf Ebrahimi 70*f5c631daSSadaf Ebrahimi const int KBytes = 1024; 71*f5c631daSSadaf Ebrahimi const int MBytes = 1024 * KBytes; 72*f5c631daSSadaf Ebrahimi 73*f5c631daSSadaf Ebrahimi const int kBitsPerByteLog2 = 3; 74*f5c631daSSadaf Ebrahimi const int kBitsPerByte = 1 << kBitsPerByteLog2; 75*f5c631daSSadaf Ebrahimi 76*f5c631daSSadaf Ebrahimi template <int SizeInBits> 77*f5c631daSSadaf Ebrahimi struct Unsigned; 78*f5c631daSSadaf Ebrahimi 79*f5c631daSSadaf Ebrahimi template <> 80*f5c631daSSadaf Ebrahimi struct Unsigned<32> { 81*f5c631daSSadaf Ebrahimi typedef uint32_t type; 82*f5c631daSSadaf Ebrahimi }; 83*f5c631daSSadaf Ebrahimi 84*f5c631daSSadaf Ebrahimi template <> 85*f5c631daSSadaf Ebrahimi struct Unsigned<64> { 86*f5c631daSSadaf Ebrahimi typedef uint64_t type; 87*f5c631daSSadaf Ebrahimi }; 88*f5c631daSSadaf Ebrahimi 89*f5c631daSSadaf Ebrahimi } // namespace vixl 90*f5c631daSSadaf Ebrahimi 91*f5c631daSSadaf Ebrahimi // Detect the host's pointer size. 92*f5c631daSSadaf Ebrahimi #if (UINTPTR_MAX == UINT32_MAX) 93*f5c631daSSadaf Ebrahimi #define VIXL_HOST_POINTER_32 94*f5c631daSSadaf Ebrahimi #elif (UINTPTR_MAX == UINT64_MAX) 95*f5c631daSSadaf Ebrahimi #define VIXL_HOST_POINTER_64 96*f5c631daSSadaf Ebrahimi #else 97*f5c631daSSadaf Ebrahimi #error "Unsupported host pointer size." 98*f5c631daSSadaf Ebrahimi #endif 99*f5c631daSSadaf Ebrahimi 100*f5c631daSSadaf Ebrahimi #ifdef VIXL_NEGATIVE_TESTING 101*f5c631daSSadaf Ebrahimi #define VIXL_ABORT() \ 102*f5c631daSSadaf Ebrahimi do { \ 103*f5c631daSSadaf Ebrahimi std::ostringstream oss; \ 104*f5c631daSSadaf Ebrahimi oss << "Aborting in " << __FILE__ << ", line " << __LINE__ << std::endl; \ 105*f5c631daSSadaf Ebrahimi throw std::runtime_error(oss.str()); \ 106*f5c631daSSadaf Ebrahimi } while (false) 107*f5c631daSSadaf Ebrahimi #define VIXL_ABORT_WITH_MSG(msg) \ 108*f5c631daSSadaf Ebrahimi do { \ 109*f5c631daSSadaf Ebrahimi std::ostringstream oss; \ 110*f5c631daSSadaf Ebrahimi oss << (msg) << "in " << __FILE__ << ", line " << __LINE__ << std::endl; \ 111*f5c631daSSadaf Ebrahimi throw std::runtime_error(oss.str()); \ 112*f5c631daSSadaf Ebrahimi } while (false) 113*f5c631daSSadaf Ebrahimi #define VIXL_CHECK(condition) \ 114*f5c631daSSadaf Ebrahimi do { \ 115*f5c631daSSadaf Ebrahimi if (!(condition)) { \ 116*f5c631daSSadaf Ebrahimi std::ostringstream oss; \ 117*f5c631daSSadaf Ebrahimi oss << "Assertion failed (" #condition ")\nin "; \ 118*f5c631daSSadaf Ebrahimi oss << __FILE__ << ", line " << __LINE__ << std::endl; \ 119*f5c631daSSadaf Ebrahimi throw std::runtime_error(oss.str()); \ 120*f5c631daSSadaf Ebrahimi } \ 121*f5c631daSSadaf Ebrahimi } while (false) 122*f5c631daSSadaf Ebrahimi #else 123*f5c631daSSadaf Ebrahimi #define VIXL_ABORT() \ 124*f5c631daSSadaf Ebrahimi do { \ 125*f5c631daSSadaf Ebrahimi printf("Aborting in %s, line %i\n", __FILE__, __LINE__); \ 126*f5c631daSSadaf Ebrahimi abort(); \ 127*f5c631daSSadaf Ebrahimi } while (false) 128*f5c631daSSadaf Ebrahimi #define VIXL_ABORT_WITH_MSG(msg) \ 129*f5c631daSSadaf Ebrahimi do { \ 130*f5c631daSSadaf Ebrahimi printf("%sin %s, line %i\n", (msg), __FILE__, __LINE__); \ 131*f5c631daSSadaf Ebrahimi abort(); \ 132*f5c631daSSadaf Ebrahimi } while (false) 133*f5c631daSSadaf Ebrahimi #define VIXL_CHECK(condition) \ 134*f5c631daSSadaf Ebrahimi do { \ 135*f5c631daSSadaf Ebrahimi if (!(condition)) { \ 136*f5c631daSSadaf Ebrahimi printf("Assertion failed (%s)\nin %s, line %i\n", \ 137*f5c631daSSadaf Ebrahimi #condition, \ 138*f5c631daSSadaf Ebrahimi __FILE__, \ 139*f5c631daSSadaf Ebrahimi __LINE__); \ 140*f5c631daSSadaf Ebrahimi abort(); \ 141*f5c631daSSadaf Ebrahimi } \ 142*f5c631daSSadaf Ebrahimi } while (false) 143*f5c631daSSadaf Ebrahimi #endif 144*f5c631daSSadaf Ebrahimi #ifdef VIXL_DEBUG 145*f5c631daSSadaf Ebrahimi #define VIXL_ASSERT(condition) VIXL_CHECK(condition) 146*f5c631daSSadaf Ebrahimi #define VIXL_UNIMPLEMENTED() \ 147*f5c631daSSadaf Ebrahimi do { \ 148*f5c631daSSadaf Ebrahimi VIXL_ABORT_WITH_MSG("UNIMPLEMENTED "); \ 149*f5c631daSSadaf Ebrahimi } while (false) 150*f5c631daSSadaf Ebrahimi #define VIXL_UNREACHABLE() \ 151*f5c631daSSadaf Ebrahimi do { \ 152*f5c631daSSadaf Ebrahimi VIXL_ABORT_WITH_MSG("UNREACHABLE "); \ 153*f5c631daSSadaf Ebrahimi } while (false) 154*f5c631daSSadaf Ebrahimi #else 155*f5c631daSSadaf Ebrahimi #define VIXL_ASSERT(condition) ((void)0) 156*f5c631daSSadaf Ebrahimi #define VIXL_UNIMPLEMENTED() ((void)0) 157*f5c631daSSadaf Ebrahimi #define VIXL_UNREACHABLE() ((void)0) 158*f5c631daSSadaf Ebrahimi #endif 159*f5c631daSSadaf Ebrahimi // This is not as powerful as template based assertions, but it is simple. 160*f5c631daSSadaf Ebrahimi // It assumes that the descriptions are unique. If this starts being a problem, 161*f5c631daSSadaf Ebrahimi // we can switch to a different implemention. 162*f5c631daSSadaf Ebrahimi #define VIXL_CONCAT(a, b) a##b 163*f5c631daSSadaf Ebrahimi #if __cplusplus >= 201103L 164*f5c631daSSadaf Ebrahimi #define VIXL_STATIC_ASSERT_LINE(line_unused, condition, message) \ 165*f5c631daSSadaf Ebrahimi static_assert(condition, message) 166*f5c631daSSadaf Ebrahimi #else 167*f5c631daSSadaf Ebrahimi #define VIXL_STATIC_ASSERT_LINE(line, condition, message_unused) \ 168*f5c631daSSadaf Ebrahimi typedef char VIXL_CONCAT(STATIC_ASSERT_LINE_, line)[(condition) ? 1 : -1] \ 169*f5c631daSSadaf Ebrahimi __attribute__((unused)) 170*f5c631daSSadaf Ebrahimi #endif 171*f5c631daSSadaf Ebrahimi #define VIXL_STATIC_ASSERT(condition) \ 172*f5c631daSSadaf Ebrahimi VIXL_STATIC_ASSERT_LINE(__LINE__, condition, "") 173*f5c631daSSadaf Ebrahimi #define VIXL_STATIC_ASSERT_MESSAGE(condition, message) \ 174*f5c631daSSadaf Ebrahimi VIXL_STATIC_ASSERT_LINE(__LINE__, condition, message) 175*f5c631daSSadaf Ebrahimi 176*f5c631daSSadaf Ebrahimi #define VIXL_WARNING(message) \ 177*f5c631daSSadaf Ebrahimi do { \ 178*f5c631daSSadaf Ebrahimi printf("WARNING in %s, line %i: %s", __FILE__, __LINE__, message); \ 179*f5c631daSSadaf Ebrahimi } while (false) 180*f5c631daSSadaf Ebrahimi 181*f5c631daSSadaf Ebrahimi template <typename T1> 182*f5c631daSSadaf Ebrahimi inline void USE(const T1&) {} 183*f5c631daSSadaf Ebrahimi 184*f5c631daSSadaf Ebrahimi template <typename T1, typename T2> 185*f5c631daSSadaf Ebrahimi inline void USE(const T1&, const T2&) {} 186*f5c631daSSadaf Ebrahimi 187*f5c631daSSadaf Ebrahimi template <typename T1, typename T2, typename T3> 188*f5c631daSSadaf Ebrahimi inline void USE(const T1&, const T2&, const T3&) {} 189*f5c631daSSadaf Ebrahimi 190*f5c631daSSadaf Ebrahimi template <typename T1, typename T2, typename T3, typename T4> 191*f5c631daSSadaf Ebrahimi inline void USE(const T1&, const T2&, const T3&, const T4&) {} 192*f5c631daSSadaf Ebrahimi 193*f5c631daSSadaf Ebrahimi #define VIXL_ALIGNMENT_EXCEPTION() \ 194*f5c631daSSadaf Ebrahimi do { \ 195*f5c631daSSadaf Ebrahimi VIXL_ABORT_WITH_MSG("ALIGNMENT EXCEPTION\t"); \ 196*f5c631daSSadaf Ebrahimi } while (0) 197*f5c631daSSadaf Ebrahimi 198*f5c631daSSadaf Ebrahimi // The clang::fallthrough attribute is used along with the Wimplicit-fallthrough 199*f5c631daSSadaf Ebrahimi // argument to annotate intentional fall-through between switch labels. 200*f5c631daSSadaf Ebrahimi // For more information please refer to: 201*f5c631daSSadaf Ebrahimi // http://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough 202*f5c631daSSadaf Ebrahimi #ifndef __has_warning 203*f5c631daSSadaf Ebrahimi #define __has_warning(x) 0 204*f5c631daSSadaf Ebrahimi #endif 205*f5c631daSSadaf Ebrahimi 206*f5c631daSSadaf Ebrahimi // Fallthrough annotation for Clang and C++11(201103L). 207*f5c631daSSadaf Ebrahimi #if __has_warning("-Wimplicit-fallthrough") && __cplusplus >= 201103L 208*f5c631daSSadaf Ebrahimi #define VIXL_FALLTHROUGH() [[clang::fallthrough]] 209*f5c631daSSadaf Ebrahimi // Fallthrough annotation for GCC >= 7. 210*f5c631daSSadaf Ebrahimi #elif __GNUC__ >= 7 211*f5c631daSSadaf Ebrahimi #define VIXL_FALLTHROUGH() __attribute__((fallthrough)) 212*f5c631daSSadaf Ebrahimi #else 213*f5c631daSSadaf Ebrahimi #define VIXL_FALLTHROUGH() \ 214*f5c631daSSadaf Ebrahimi do { \ 215*f5c631daSSadaf Ebrahimi } while (0) 216*f5c631daSSadaf Ebrahimi #endif 217*f5c631daSSadaf Ebrahimi 218*f5c631daSSadaf Ebrahimi #if __cplusplus >= 201103L 219*f5c631daSSadaf Ebrahimi #define VIXL_NO_RETURN [[noreturn]] 220*f5c631daSSadaf Ebrahimi #else 221*f5c631daSSadaf Ebrahimi #define VIXL_NO_RETURN __attribute__((noreturn)) 222*f5c631daSSadaf Ebrahimi #endif 223*f5c631daSSadaf Ebrahimi #ifdef VIXL_DEBUG 224*f5c631daSSadaf Ebrahimi #define VIXL_NO_RETURN_IN_DEBUG_MODE VIXL_NO_RETURN 225*f5c631daSSadaf Ebrahimi #else 226*f5c631daSSadaf Ebrahimi #define VIXL_NO_RETURN_IN_DEBUG_MODE 227*f5c631daSSadaf Ebrahimi #endif 228*f5c631daSSadaf Ebrahimi 229*f5c631daSSadaf Ebrahimi #if __cplusplus >= 201103L 230*f5c631daSSadaf Ebrahimi #define VIXL_OVERRIDE override 231*f5c631daSSadaf Ebrahimi #define VIXL_CONSTEXPR constexpr 232*f5c631daSSadaf Ebrahimi #define VIXL_HAS_CONSTEXPR 1 233*f5c631daSSadaf Ebrahimi #else 234*f5c631daSSadaf Ebrahimi #define VIXL_OVERRIDE 235*f5c631daSSadaf Ebrahimi #define VIXL_CONSTEXPR 236*f5c631daSSadaf Ebrahimi #endif 237*f5c631daSSadaf Ebrahimi 238*f5c631daSSadaf Ebrahimi // With VIXL_NEGATIVE_TESTING on, VIXL_ASSERT and VIXL_CHECK will throw 239*f5c631daSSadaf Ebrahimi // exceptions but C++11 marks destructors as noexcept(true) by default. 240*f5c631daSSadaf Ebrahimi #if defined(VIXL_NEGATIVE_TESTING) && __cplusplus >= 201103L 241*f5c631daSSadaf Ebrahimi #define VIXL_NEGATIVE_TESTING_ALLOW_EXCEPTION noexcept(false) 242*f5c631daSSadaf Ebrahimi #else 243*f5c631daSSadaf Ebrahimi #define VIXL_NEGATIVE_TESTING_ALLOW_EXCEPTION 244*f5c631daSSadaf Ebrahimi #endif 245*f5c631daSSadaf Ebrahimi 246*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_SIMULATOR_AARCH64 247*f5c631daSSadaf Ebrahimi #ifndef VIXL_AARCH64_GENERATE_SIMULATOR_CODE 248*f5c631daSSadaf Ebrahimi #define VIXL_AARCH64_GENERATE_SIMULATOR_CODE 1 249*f5c631daSSadaf Ebrahimi #endif 250*f5c631daSSadaf Ebrahimi #else 251*f5c631daSSadaf Ebrahimi #ifndef VIXL_AARCH64_GENERATE_SIMULATOR_CODE 252*f5c631daSSadaf Ebrahimi #define VIXL_AARCH64_GENERATE_SIMULATOR_CODE 0 253*f5c631daSSadaf Ebrahimi #endif 254*f5c631daSSadaf Ebrahimi #if VIXL_AARCH64_GENERATE_SIMULATOR_CODE 255*f5c631daSSadaf Ebrahimi #warning "Generating Simulator instructions without Simulator support." 256*f5c631daSSadaf Ebrahimi #endif 257*f5c631daSSadaf Ebrahimi #endif 258*f5c631daSSadaf Ebrahimi 259*f5c631daSSadaf Ebrahimi // We do not have a simulator for AArch32, although we can pretend we do so that 260*f5c631daSSadaf Ebrahimi // tests that require running natively can be skipped. 261*f5c631daSSadaf Ebrahimi #ifndef __arm__ 262*f5c631daSSadaf Ebrahimi #define VIXL_INCLUDE_SIMULATOR_AARCH32 263*f5c631daSSadaf Ebrahimi #ifndef VIXL_AARCH32_GENERATE_SIMULATOR_CODE 264*f5c631daSSadaf Ebrahimi #define VIXL_AARCH32_GENERATE_SIMULATOR_CODE 1 265*f5c631daSSadaf Ebrahimi #endif 266*f5c631daSSadaf Ebrahimi #else 267*f5c631daSSadaf Ebrahimi #ifndef VIXL_AARCH32_GENERATE_SIMULATOR_CODE 268*f5c631daSSadaf Ebrahimi #define VIXL_AARCH32_GENERATE_SIMULATOR_CODE 0 269*f5c631daSSadaf Ebrahimi #endif 270*f5c631daSSadaf Ebrahimi #endif 271*f5c631daSSadaf Ebrahimi 272*f5c631daSSadaf Ebrahimi #ifdef USE_SIMULATOR 273*f5c631daSSadaf Ebrahimi #error "Please see the release notes for USE_SIMULATOR." 274*f5c631daSSadaf Ebrahimi #endif 275*f5c631daSSadaf Ebrahimi 276*f5c631daSSadaf Ebrahimi // Target Architecture/ISA 277*f5c631daSSadaf Ebrahimi #ifdef VIXL_INCLUDE_TARGET_A64 278*f5c631daSSadaf Ebrahimi #ifndef VIXL_INCLUDE_TARGET_AARCH64 279*f5c631daSSadaf Ebrahimi #define VIXL_INCLUDE_TARGET_AARCH64 280*f5c631daSSadaf Ebrahimi #endif 281*f5c631daSSadaf Ebrahimi #endif 282*f5c631daSSadaf Ebrahimi 283*f5c631daSSadaf Ebrahimi #if defined(VIXL_INCLUDE_TARGET_A32) && defined(VIXL_INCLUDE_TARGET_T32) 284*f5c631daSSadaf Ebrahimi #ifndef VIXL_INCLUDE_TARGET_AARCH32 285*f5c631daSSadaf Ebrahimi #define VIXL_INCLUDE_TARGET_AARCH32 286*f5c631daSSadaf Ebrahimi #endif 287*f5c631daSSadaf Ebrahimi #elif defined(VIXL_INCLUDE_TARGET_A32) 288*f5c631daSSadaf Ebrahimi #ifndef VIXL_INCLUDE_TARGET_A32_ONLY 289*f5c631daSSadaf Ebrahimi #define VIXL_INCLUDE_TARGET_A32_ONLY 290*f5c631daSSadaf Ebrahimi #endif 291*f5c631daSSadaf Ebrahimi #else 292*f5c631daSSadaf Ebrahimi #ifndef VIXL_INCLUDE_TARGET_T32_ONLY 293*f5c631daSSadaf Ebrahimi #define VIXL_INCLUDE_TARGET_T32_ONLY 294*f5c631daSSadaf Ebrahimi #endif 295*f5c631daSSadaf Ebrahimi #endif 296*f5c631daSSadaf Ebrahimi 297*f5c631daSSadaf Ebrahimi 298*f5c631daSSadaf Ebrahimi #endif // VIXL_GLOBALS_H 299