1e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden/* 2e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * Copyright (C) 2009 The Android Open Source Project 3e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * 4e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * Licensed under the Apache License, Version 2.0 (the "License"); 5e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * you may not use this file except in compliance with the License. 6e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * You may obtain a copy of the License at 7e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * 8e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * http://www.apache.org/licenses/LICENSE-2.0 9e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * 10e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * Unless required by applicable law or agreed to in writing, software 11e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * distributed under the License is distributed on an "AS IS" BASIS, 12e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * See the License for the specific language governing permissions and 14e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * limitations under the License. 15e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden */ 16e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 17e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden/* 18e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * Dalvik instruction fragments, useful when porting mterp. 19e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * 20e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * Compile this and examine the output to see what your compiler generates. 21e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * This can give you a head start on some of the more complicated operations. 22e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * 23e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * Example: 24e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * % gcc -c -O2 -save-temps -fverbose-asm porting-proto.c 25e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * % less porting-proto.s 26e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden */ 27e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden#include <stdint.h> 28e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 29e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddentypedef int8_t s1; 30e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddentypedef uint8_t u1; 31e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddentypedef int16_t s2; 32e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddentypedef uint16_t u2; 33e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddentypedef int32_t s4; 34e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddentypedef uint32_t u4; 35e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddentypedef int64_t s8; 36e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddentypedef uint64_t u8; 37e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 38e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens4 iadd32(s4 x, s4 y) { return x + y; } 39e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens8 iadd64(s8 x, s8 y) { return x + y; } 40e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenfloat fadd32(float x, float y) { return x + y; } 41e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddendouble fadd64(double x, double y) { return x + y; } 42e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 43e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens4 isub32(s4 x, s4 y) { return x - y; } 44e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens8 isub64(s8 x, s8 y) { return x - y; } 45e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenfloat fsub32(float x, float y) { return x - y; } 46e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddendouble fsub64(double x, double y) { return x - y; } 47e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 48e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens4 irsub32lit8(s4 x) { return 25 - x; } 49e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 50e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens4 imul32(s4 x, s4 y) { return x * y; } 51e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens8 imul64(s8 x, s8 y) { return x * y; } 52e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenfloat fmul32(float x, float y) { return x * y; } 53e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddendouble fmul64(double x, double y) { return x * y; } 54e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 55e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens4 idiv32(s4 x, s4 y) { return x / y; } 56e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens8 idiv64(s8 x, s8 y) { return x / y; } 57e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenfloat fdiv32(float x, float y) { return x / y; } 58e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddendouble fdiv64(double x, double y) { return x / y; } 59e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 60e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens4 irem32(s4 x, s4 y) { return x % y; } 61e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens8 irem64(s8 x, s8 y) { return x % y; } 62e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 63e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens4 iand32(s4 x, s4 y) { return x & y; } 64e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens8 iand64(s8 x, s8 y) { return x & y; } 65e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 66e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens4 ior32(s4 x, s4 y) { return x | y; } 67e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens8 ior64(s8 x, s8 y) { return x | y; } 68e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 69e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens4 ixor32(s4 x, s4 y) { return x ^ y; } 70e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens8 ixor64(s8 x, s8 y) { return x ^ y; } 71e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 72e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens4 iasl32(s4 x, s4 count) { return x << (count & 0x1f); } 73e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens8 iasl64(s8 x, s4 count) { return x << (count & 0x3f); } 74e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 75e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens4 iasr32(s4 x, s4 count) { return x >> (count & 0x1f); } 76e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens8 iasr64(s8 x, s4 count) { return x >> (count & 0x3f); } 77e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 78e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens4 ilsr32(s4 x, s4 count) { return ((u4)x) >> (count & 0x1f); } // unsigned 79e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens8 ilsr64(s8 x, s4 count) { return ((u8)x) >> (count & 0x3f); } // unsigned 80e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 81e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens4 ineg32(s4 x) { return -x; } 82e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens8 ineg64(s8 x) { return -x; } 83e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenfloat fneg32(float x) { return -x; } 84e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddendouble fneg64(double x) { return -x; } 85e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 86e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens4 inot32(s4 x) { return x ^ -1; } 87e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens8 inot64(s8 x) { return x ^ -1LL; } 88e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 89e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens4 float2int(float x) { return (s4) x; } 90e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddendouble float2double(float x) { return (double) x; } 91e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens4 double2int(double x) { return (s4) x; } 92e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenfloat double2float(double x) { return (float) x; } 93e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 94d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden/* 95d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden * ARM lib doesn't clamp large values or NaN the way we want on these two. 96d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden * If the simple version isn't correct, use the long version. (You can use 97d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden * dalvik/tests/041-narrowing to verify.) 98d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden */ 99d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFaddens8 float2long(float x) { return (s8) x; } 100d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFaddens8 float2long_clamp(float x) 101d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden{ 102d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden static const float kMaxLong = (float)0x7fffffffffffffffULL; 103d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden static const float kMinLong = (float)0x8000000000000000ULL; 104d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden 105d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden if (x >= kMaxLong) { 106d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden return 0x7fffffffffffffffULL; 107d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden } else if (x <= kMinLong) { 108d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden return 0x8000000000000000ULL; 109d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden } else if (x != x) { 110d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden return 0; 111d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden } else { 112d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden return (s8) x; 113d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden } 114d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden} 115d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFaddens8 double2long(double x) { return (s8) x; } 116d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFaddens8 double2long_clamp(double x) 117d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden{ 118d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden static const double kMaxLong = (double)0x7fffffffffffffffULL; 119d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden static const double kMinLong = (double)0x8000000000000000ULL; 120d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden 121d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden if (x >= kMaxLong) { 122d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden return 0x7fffffffffffffffULL; 123d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden } else if (x <= kMinLong) { 124d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden return 0x8000000000000000ULL; 125d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden } else if (x != x) { 126d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden return 0; 127d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden } else { 128d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden return (s8) x; 129d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden } 130d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden} 131d06170d29cc6d75b35e78f89e9b8ed717f21f9c3Andy McFadden 132e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens1 int2byte(s4 x) { return (s1) x; } 133e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens2 int2short(s4 x) { return (s2) x; } 134e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenu2 int2char(s4 x) { return (u2) x; } 135e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens8 int2long(s4 x) { return (s8) x; } 136e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenfloat int2float(s4 x) { return (float) x; } 137e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddendouble int2double(s4 x) { return (double) x; } 138e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 139e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens4 long2int(s8 x) { return (s4) x; } 140e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenfloat long2float(s8 x) { return (float) x; } 141e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddendouble long2double(s8 x) { return (double) x; } 142e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 143e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenint cmpl_float(float x, float y) 144e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden{ 145e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden int result; 146e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 147e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden if (x == y) 148e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden result = 0; 149e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden else if (x > y) 150e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden result = 1; 151e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden else /* (x < y) or NaN */ 152e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden result = -1; 153e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden return result; 154e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden} 155e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 156e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenint cmpg_float(float x, float y) 157e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden{ 158e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden int result; 159e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 160e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden if (x == y) 161e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden result = 0; 162e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden else if (x < y) 163e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden result = -1; 164e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden else /* (x > y) or NaN */ 165e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden result = 1; 166e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden return result; 167e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden} 168e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 169e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenint cmpl_double(double x, double y) 170e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden{ 171e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden int result; 172e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 173e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden if (x == y) 174e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden result = 0; 175e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden else if (x > y) 176e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden result = 1; 177e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden else /* (x < y) or NaN */ 178e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden result = -1; 179e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden return result; 180e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden} 181e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 182e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenint cmpg_double(double x, double y) 183e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden{ 184e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden int result; 185e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 186e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden if (x == y) 187e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden result = 0; 188e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden else if (x < y) 189e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden result = -1; 190e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden else /* (x > y) or NaN */ 191e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden result = 1; 192e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden return result; 193e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden} 194e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 195e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenint cmp_long(s8 x, s8 y) 196e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden{ 197e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden int result; 198e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 199e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden if (x == y) 200e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden result = 0; 201e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden else if (x < y) 202e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden result = -1; 203e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden else /* (x > y) */ 204e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden result = 1; 205e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden return result; 206e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden} 207e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 208e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden/* instruction decoding fragments */ 209e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenu1 unsignedAA(u2 x) { return x >> 8; } 210e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens1 signedAA(u2 x) { return (s4)(x << 16) >> 24; } 211e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddens2 signedBB(u2 x) { return (s2) x; } 212e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenu1 unsignedA(u2 x) { return (x >> 8) & 0x0f; } 213e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenu1 unsignedB(u2 x) { return x >> 12; } 214e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 215e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden/* some handy immediate constants when working with float/double */ 216e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenu4 const_43e00000(u4 highword) { return 0x43e00000; } 217e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenu4 const_c3e00000(u4 highword) { return 0xc3e00000; } 218e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenu4 const_ffc00000(u4 highword) { return 0xffc00000; } 219e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenu4 const_41dfffff(u4 highword) { return 0x41dfffff; } 220e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFaddenu4 const_c1e00000(u4 highword) { return 0xc1e00000; } 221e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden 222e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden/* 223e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * Test for some gcc-defined symbols. If you're frequently switching 224e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * between different cross-compiler architectures or CPU feature sets, 225e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden * this can help you keep track of which one you're compiling for. 226e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden */ 227e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden#ifdef __arm__ 228e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden# warning "found __arm__" 229e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden#endif 230e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden#ifdef __ARM_EABI__ 231e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden# warning "found __ARM_EABI__" 232e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden#endif 233e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden#ifdef __VFP_FP__ 234e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden# warning "found __VFP_FP__" /* VFP-format doubles used; may not have VFP */ 235e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden#endif 236e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden#if defined(__VFP_FP__) && !defined(__SOFTFP__) 237e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden# warning "VFP in use" 238e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden#endif 239e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden#ifdef __ARM_ARCH_5TE__ 240e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden# warning "found __ARM_ARCH_5TE__" 241e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden#endif 242e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden#ifdef __ARM_ARCH_7A__ 243e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden# warning "found __ARM_ARCH_7A__" 244e9f54e66fb6c27d571e63e8f56fbf59b21bc7becAndy McFadden#endif 245