MathExtras.h revision 305b515c2787f47adecbe120e4b4bef55c5e5525
1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer//===-- llvm/Support/MathExtras.h - Useful math functions -------*- C++ -*-===//
263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman//
3b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//                     The LLVM Compiler Infrastructure
4b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman//
8b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//===----------------------------------------------------------------------===//
954ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner//
1054ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner// This file contains some functions that are useful for math stuff.
1154ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner//
1254ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner//===----------------------------------------------------------------------===//
13cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
14551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#ifndef LLVM_SUPPORT_MATHEXTRAS_H
15551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#define LLVM_SUPPORT_MATHEXTRAS_H
16cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
171f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/SwapByteOrder.h"
18cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
19d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
20d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
21fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman// NOTE: The following support functions use the _32/_64 extensions instead of
2289bfcd34cbd2f4c6bb2cafff0a5c2bff147fae11Chris Lattner// type overloading so that signed and unsigned integers can be used without
2389bfcd34cbd2f4c6bb2cafff0a5c2bff147fae11Chris Lattner// ambiguity.
2488c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
2549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Hi_32 - This function returns the high 32 bits of a 64 bit value.
26c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline uint32_t Hi_32(uint64_t Value) {
27c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  return static_cast<uint32_t>(Value >> 32);
2888c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
2988c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
3049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Lo_32 - This function returns the low 32 bits of a 64 bit value.
31c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline uint32_t Lo_32(uint64_t Value) {
32c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  return static_cast<uint32_t>(Value);
3388c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
3488c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
3534247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer/// isInt - Checks if an integer fits into the given bit width.
36d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesentemplate<unsigned N>
37d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Oleseninline bool isInt(int64_t x) {
38d4c00c0f558193b492aed9ab6aacf84bf1d3fb4eJakob Stoklund Olesen  return N >= 64 || (-(INT64_C(1)<<(N-1)) <= x && x < (INT64_C(1)<<(N-1)));
39d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesen}
4034247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer// Template specializations to get better code for common cases.
4134247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
4234247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isInt<8>(int64_t x) {
4334247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<int8_t>(x) == x;
4434247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
4534247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
4634247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isInt<16>(int64_t x) {
4734247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<int16_t>(x) == x;
4834247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
4934247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
5034247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isInt<32>(int64_t x) {
5134247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<int32_t>(x) == x;
5234247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
53d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesen
54b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum/// isShiftedInt<N,S> - Checks if a signed integer is an N bit number shifted
55b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum///                     left by S.
56b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumtemplate<unsigned N, unsigned S>
57b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicuminline bool isShiftedInt(int64_t x) {
58b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  return isInt<N+S>(x) && (x % (1<<S) == 0);
59b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum}
60b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
6134247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer/// isUInt - Checks if an unsigned integer fits into the given bit width.
62d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesentemplate<unsigned N>
6334247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isUInt(uint64_t x) {
64d4c00c0f558193b492aed9ab6aacf84bf1d3fb4eJakob Stoklund Olesen  return N >= 64 || x < (UINT64_C(1)<<N);
65d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesen}
6634247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer// Template specializations to get better code for common cases.
6734247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
6834247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isUInt<8>(uint64_t x) {
6934247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<uint8_t>(x) == x;
7034247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
7134247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
7234247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isUInt<16>(uint64_t x) {
7334247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<uint16_t>(x) == x;
7434247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
7534247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
7634247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isUInt<32>(uint64_t x) {
7734247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<uint32_t>(x) == x;
7834247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
79d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesen
80b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum/// isShiftedUInt<N,S> - Checks if a unsigned integer is an N bit number shifted
81b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum///                     left by S.
82b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumtemplate<unsigned N, unsigned S>
83b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicuminline bool isShiftedUInt(uint64_t x) {
84b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  return isUInt<N+S>(x) && (x % (1<<S) == 0);
85b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum}
86b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
875005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohman/// isUIntN - Checks if an unsigned integer fits into the given (dynamic)
885005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohman/// bit width.
895005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohmaninline bool isUIntN(unsigned N, uint64_t x) {
905005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohman  return x == (x & (~0ULL >> (64 - N)));
915005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohman}
925005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohman
93c42a7754bb6249c33c509e6fa6e8b3c9344e72d8Rafael Espindola/// isIntN - Checks if an signed integer fits into the given (dynamic)
94b35d56c2fe39064a33d0e4e7faf5464b6d8a7352Rafael Espindola/// bit width.
95b35d56c2fe39064a33d0e4e7faf5464b6d8a7352Rafael Espindolainline bool isIntN(unsigned N, int64_t x) {
96b35d56c2fe39064a33d0e4e7faf5464b6d8a7352Rafael Espindola  return N >= 64 || (-(INT64_C(1)<<(N-1)) <= x && x < (INT64_C(1)<<(N-1)));
97b35d56c2fe39064a33d0e4e7faf5464b6d8a7352Rafael Espindola}
98b35d56c2fe39064a33d0e4e7faf5464b6d8a7352Rafael Espindola
9949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// isMask_32 - This function returns true if the argument is a sequence of ones
10049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// starting at the least significant bit with the remainder zero (32 bit
10149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// version).   Ex. isMask_32(0x0000FFFFU) == true.
10218a4c74136a9919dc3235d03c0e060f32d01f3b0Chris Lattnerinline bool isMask_32(uint32_t Value) {
10388c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Value && ((Value + 1) & Value) == 0;
10488c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
10588c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
10649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// isMask_64 - This function returns true if the argument is a sequence of ones
10749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// starting at the least significant bit with the remainder zero (64 bit
10849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// version).
10918a4c74136a9919dc3235d03c0e060f32d01f3b0Chris Lattnerinline bool isMask_64(uint64_t Value) {
11088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Value && ((Value + 1) & Value) == 0;
11188c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
11288c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
113fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// isShiftedMask_32 - This function returns true if the argument contains a
11449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// sequence of ones with the remainder zero (32 bit version.)
11549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Ex. isShiftedMask_32(0x0000FF00U) == true.
11618a4c74136a9919dc3235d03c0e060f32d01f3b0Chris Lattnerinline bool isShiftedMask_32(uint32_t Value) {
11788c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return isMask_32((Value - 1) | Value);
11888c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
11988c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
120fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// isShiftedMask_64 - This function returns true if the argument contains a
12149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// sequence of ones with the remainder zero (64 bit version.)
12218a4c74136a9919dc3235d03c0e060f32d01f3b0Chris Lattnerinline bool isShiftedMask_64(uint64_t Value) {
12388c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return isMask_64((Value - 1) | Value);
12488c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
12588c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
126fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// isPowerOf2_32 - This function returns true if the argument is a power of
12749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// two > 0. Ex. isPowerOf2_32(0x00100000U) == true (32 bit edition.)
128c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline bool isPowerOf2_32(uint32_t Value) {
12988c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Value && !(Value & (Value - 1));
13088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
13188c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
13249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// isPowerOf2_64 - This function returns true if the argument is a power of two
13349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// > 0 (64 bit edition.)
13488c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattnerinline bool isPowerOf2_64(uint64_t Value) {
13519b7e0e0cabfa6dfc559c64e3d6ed053832c4047Reid Spencer  return Value && !(Value & (Value - int64_t(1L)));
13688c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
13788c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
13849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// ByteSwap_16 - This function returns a byte-swapped representation of the
13949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// 16-bit argument, Value.
140c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline uint16_t ByteSwap_16(uint16_t Value) {
1413afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner  return sys::SwapByteOrder_16(Value);
1426fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman}
1436fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman
14449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// ByteSwap_32 - This function returns a byte-swapped representation of the
14549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// 32-bit argument, Value.
146c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline uint32_t ByteSwap_32(uint32_t Value) {
1473afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner  return sys::SwapByteOrder_32(Value);
1486fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman}
1496fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman
15049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// ByteSwap_64 - This function returns a byte-swapped representation of the
15149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// 64-bit argument, Value.
1526fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begemaninline uint64_t ByteSwap_64(uint64_t Value) {
1533afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner  return sys::SwapByteOrder_64(Value);
1546fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman}
1556fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman
15649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountLeadingZeros_32 - this function performs the platform optimal form of
15749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// counting the number of zeros from the most significant bit to the first one
15849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// bit.  Ex. CountLeadingZeros_32(0x00F000FF) == 8.
15949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Returns 32 if the word is zero.
160c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline unsigned CountLeadingZeros_32(uint32_t Value) {
16188c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  unsigned Count; // result
162e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#if __GNUC__ >= 4
163e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  // PowerPC is defined for __builtin_clz(0)
164e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#if !defined(__ppc__) && !defined(__ppc64__)
165e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  if (!Value) return 32;
166e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#endif
167e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  Count = __builtin_clz(Value);
168e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#else
169e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  if (!Value) return 32;
170e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  Count = 0;
171452394d812816b05f626d414ce6dbd3b87d45a73Duncan Sands  // bisection method for count leading zeros
172e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  for (unsigned Shift = 32 >> 1; Shift; Shift >>= 1) {
173c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen    uint32_t Tmp = Value >> Shift;
174e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner    if (Tmp) {
175e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner      Value = Tmp;
176e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner    } else {
177e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner      Count |= Shift;
17888c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    }
179e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  }
180e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#endif
18188c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Count;
18288c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
183bb92f6fbf2c36b3530f33eb2e8d1842764ec9fddBrian Gaeke
184ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// CountLeadingOnes_32 - this function performs the operation of
185ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// counting the number of ones from the most significant bit to the first zero
186ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// bit.  Ex. CountLeadingOnes_32(0xFF0FFF00) == 8.
187ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// Returns 32 if the word is all ones.
188ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohmaninline unsigned CountLeadingOnes_32(uint32_t Value) {
189ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman  return CountLeadingZeros_32(~Value);
190ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman}
191ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman
19249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountLeadingZeros_64 - This function performs the platform optimal form
193fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// of counting the number of zeros from the most significant bit to the first
19449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// one bit (64 bit edition.)
19549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Returns 64 if the word is zero.
19688c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattnerinline unsigned CountLeadingZeros_64(uint64_t Value) {
19788c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  unsigned Count; // result
198e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#if __GNUC__ >= 4
199e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  // PowerPC is defined for __builtin_clzll(0)
20089bfcd34cbd2f4c6bb2cafff0a5c2bff147fae11Chris Lattner#if !defined(__ppc__) && !defined(__ppc64__)
201e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  if (!Value) return 64;
202e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#endif
203e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  Count = __builtin_clzll(Value);
204e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#else
2053b65576527b7e0098a401289f9245eb5266fda31Chris Lattner  if (sizeof(long) == sizeof(int64_t)) {
20688c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    if (!Value) return 64;
20788c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    Count = 0;
208452394d812816b05f626d414ce6dbd3b87d45a73Duncan Sands    // bisection method for count leading zeros
209c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen    for (unsigned Shift = 64 >> 1; Shift; Shift >>= 1) {
21088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner      uint64_t Tmp = Value >> Shift;
21188c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner      if (Tmp) {
21288c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner        Value = Tmp;
213e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner      } else {
214e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner        Count |= Shift;
21588c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner      }
2163b65576527b7e0098a401289f9245eb5266fda31Chris Lattner    }
2173b65576527b7e0098a401289f9245eb5266fda31Chris Lattner  } else {
21888c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    // get hi portion
219c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen    uint32_t Hi = Hi_32(Value);
220cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
22188c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    // if some bits in hi portion
22288c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    if (Hi) {
22388c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner        // leading zeros in hi portion plus all bits in lo portion
224865dc8f64f50b72dbc8acb7851e606357f9d81f1Chris Lattner        Count = CountLeadingZeros_32(Hi);
22588c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    } else {
22688c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner        // get lo portion
227c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen        uint32_t Lo = Lo_32(Value);
22888c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner        // same as 32 bit value
229865dc8f64f50b72dbc8acb7851e606357f9d81f1Chris Lattner        Count = CountLeadingZeros_32(Lo)+32;
23088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    }
2313b65576527b7e0098a401289f9245eb5266fda31Chris Lattner  }
2323b65576527b7e0098a401289f9245eb5266fda31Chris Lattner#endif
23388c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Count;
234e265504e82310266271fa2329b6ef8115bbe8244Chris Lattner}
235e265504e82310266271fa2329b6ef8115bbe8244Chris Lattner
236ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// CountLeadingOnes_64 - This function performs the operation
237fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// of counting the number of ones from the most significant bit to the first
238ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// zero bit (64 bit edition.)
239ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// Returns 64 if the word is all ones.
240ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohmaninline unsigned CountLeadingOnes_64(uint64_t Value) {
241ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman  return CountLeadingZeros_64(~Value);
242ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman}
243ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman
24449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountTrailingZeros_32 - this function performs the platform optimal form of
24549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// counting the number of zeros from the least significant bit to the first one
24649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// bit.  Ex. CountTrailingZeros_32(0xFF00FF00) == 8.
24749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Returns 32 if the word is zero.
248c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline unsigned CountTrailingZeros_32(uint32_t Value) {
249c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#if __GNUC__ >= 4
250c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson  return Value ? __builtin_ctz(Value) : 32;
251c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#else
25282a60eca8fb5761817960e75fd469246496f8dceChris Lattner  static const unsigned Mod37BitPosition[] = {
25382a60eca8fb5761817960e75fd469246496f8dceChris Lattner    32, 0, 1, 26, 2, 23, 27, 0, 3, 16, 24, 30, 28, 11, 0, 13,
25482a60eca8fb5761817960e75fd469246496f8dceChris Lattner    4, 7, 17, 0, 25, 22, 31, 15, 29, 10, 12, 6, 0, 21, 14, 9,
25582a60eca8fb5761817960e75fd469246496f8dceChris Lattner    5, 20, 8, 19, 18
25682a60eca8fb5761817960e75fd469246496f8dceChris Lattner  };
257e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  return Mod37BitPosition[(-Value & Value) % 37];
258c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#endif
25916d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman}
26016d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman
261ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// CountTrailingOnes_32 - this function performs the operation of
262ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// counting the number of ones from the least significant bit to the first zero
263ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// bit.  Ex. CountTrailingOnes_32(0x00FF00FF) == 8.
264ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// Returns 32 if the word is all ones.
265ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohmaninline unsigned CountTrailingOnes_32(uint32_t Value) {
266ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman  return CountTrailingZeros_32(~Value);
267ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman}
268ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman
26949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountTrailingZeros_64 - This function performs the platform optimal form
270fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// of counting the number of zeros from the least significant bit to the first
27149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// one bit (64 bit edition.)
27249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Returns 64 if the word is zero.
27316d6ea526482e733fe3bc63929e94c9e88b6708dNate Begemaninline unsigned CountTrailingZeros_64(uint64_t Value) {
274c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#if __GNUC__ >= 4
275c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson  return Value ? __builtin_ctzll(Value) : 64;
276c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#else
27782a60eca8fb5761817960e75fd469246496f8dceChris Lattner  static const unsigned Mod67Position[] = {
27882a60eca8fb5761817960e75fd469246496f8dceChris Lattner    64, 0, 1, 39, 2, 15, 40, 23, 3, 12, 16, 59, 41, 19, 24, 54,
27982a60eca8fb5761817960e75fd469246496f8dceChris Lattner    4, 64, 13, 10, 17, 62, 60, 28, 42, 30, 20, 51, 25, 44, 55,
28082a60eca8fb5761817960e75fd469246496f8dceChris Lattner    47, 5, 32, 65, 38, 14, 22, 11, 58, 18, 53, 63, 9, 61, 27,
28182a60eca8fb5761817960e75fd469246496f8dceChris Lattner    29, 50, 43, 46, 31, 37, 21, 57, 52, 8, 26, 49, 45, 36, 56,
28282a60eca8fb5761817960e75fd469246496f8dceChris Lattner    7, 48, 35, 6, 34, 33, 0
28382a60eca8fb5761817960e75fd469246496f8dceChris Lattner  };
284e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  return Mod67Position[(-Value & Value) % 67];
285c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#endif
28616d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman}
28716d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman
288ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// CountTrailingOnes_64 - This function performs the operation
289fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// of counting the number of ones from the least significant bit to the first
290ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// zero bit (64 bit edition.)
291ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// Returns 64 if the word is all ones.
292ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohmaninline unsigned CountTrailingOnes_64(uint64_t Value) {
293ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman  return CountTrailingZeros_64(~Value);
294ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman}
295ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman
29649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountPopulation_32 - this function counts the number of set bits in a value.
29749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Ex. CountPopulation(0xF000F000) = 8
29849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Returns 0 if the word is zero.
2992a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Andersoninline unsigned CountPopulation_32(uint32_t Value) {
3002a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#if __GNUC__ >= 4
3012a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson  return __builtin_popcount(Value);
3022a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#else
303e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  uint32_t v = Value - ((Value >> 1) & 0x55555555);
304e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
305e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  return ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;
3062a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#endif
30716d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman}
30816d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman
30949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountPopulation_64 - this function counts the number of set bits in a value,
31049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// (64 bit edition.)
31116d6ea526482e733fe3bc63929e94c9e88b6708dNate Begemaninline unsigned CountPopulation_64(uint64_t Value) {
3122a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#if __GNUC__ >= 4
3132a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson  return __builtin_popcountll(Value);
3142a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#else
315e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  uint64_t v = Value - ((Value >> 1) & 0x5555555555555555ULL);
316e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  v = (v & 0x3333333333333333ULL) + ((v >> 2) & 0x3333333333333333ULL);
317e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  v = (v + (v >> 4)) & 0x0F0F0F0F0F0F0F0FULL;
318ca5183d445954a9b2a570d6bbba1bc2b00ad6442Jeff Cohen  return unsigned((uint64_t)(v * 0x0101010101010101ULL) >> 56);
3192a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#endif
32016d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman}
32116d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman
322fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// Log2_32 - This function returns the floor log base 2 of the specified value,
32349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// -1 if the value is zero. (32 bit edition.)
32449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Ex. Log2_32(32) == 5, Log2_32(1) == 0, Log2_32(0) == -1, Log2_32(6) == 2
325c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline unsigned Log2_32(uint32_t Value) {
326e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  return 31 - CountLeadingZeros_32(Value);
32716d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman}
32854ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner
329fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// Log2_64 - This function returns the floor log base 2 of the specified value,
33049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// -1 if the value is zero. (64 bit edition.)
3312be12faabb3ce2d2d3979c73ac65d466fdea5ec5Chris Lattnerinline unsigned Log2_64(uint64_t Value) {
332e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  return 63 - CountLeadingZeros_64(Value);
333cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}
334cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
33549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Log2_32_Ceil - This function returns the ceil log base 2 of the specified
33649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// value, 32 if the value is zero. (32 bit edition).
33749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Ex. Log2_32_Ceil(32) == 5, Log2_32_Ceil(1) == 0, Log2_32_Ceil(6) == 3
338c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline unsigned Log2_32_Ceil(uint32_t Value) {
3390683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner  return 32-CountLeadingZeros_32(Value-1);
3400683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner}
3410683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner
34255b42513e1548554bfacc72d48ec3483c73fddf9Dan Gohman/// Log2_64_Ceil - This function returns the ceil log base 2 of the specified
34355b42513e1548554bfacc72d48ec3483c73fddf9Dan Gohman/// value, 64 if the value is zero. (64 bit edition.)
3440683c8cad920d241d44b126972d5cdd164dcc213Chris Lattnerinline unsigned Log2_64_Ceil(uint64_t Value) {
3450683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner  return 64-CountLeadingZeros_64(Value-1);
3460683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner}
3470683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner
34849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// GreatestCommonDivisor64 - Return the greatest common divisor of the two
34949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// values using Euclid's algorithm.
35049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerinline uint64_t GreatestCommonDivisor64(uint64_t A, uint64_t B) {
35149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner  while (B) {
35249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner    uint64_t T = B;
35349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner    B = A % B;
35449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner    A = T;
35549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner  }
35649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner  return A;
35749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner}
358fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
35949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// BitsToDouble - This function takes a 64-bit integer and returns the bit
36049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// equivalent double.
36159b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskeyinline double BitsToDouble(uint64_t Bits) {
36259b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  union {
36359b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    uint64_t L;
36459b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    double D;
36559b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  } T;
36659b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  T.L = Bits;
36759b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  return T.D;
36859b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey}
36959b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey
37049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// BitsToFloat - This function takes a 32-bit integer and returns the bit
37149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// equivalent float.
372104338913500d007996056ad092e195009883a84Jim Laskeyinline float BitsToFloat(uint32_t Bits) {
37359b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  union {
374104338913500d007996056ad092e195009883a84Jim Laskey    uint32_t I;
37559b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    float F;
37659b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  } T;
37759b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  T.I = Bits;
37859b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  return T.F;
37959b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey}
38059b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey
38149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// DoubleToBits - This function takes a double and returns the bit
382541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// equivalent 64-bit integer.  Note that copying doubles around
383541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// changes the bits of NaNs on some hosts, notably x86, so this
384541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// routine cannot be used if these bits are needed.
38559b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskeyinline uint64_t DoubleToBits(double Double) {
38659b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  union {
38759b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    uint64_t L;
38859b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    double D;
38959b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  } T;
39059b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  T.D = Double;
39159b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  return T.L;
39259b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey}
39359b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey
39449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// FloatToBits - This function takes a float and returns the bit
395541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// equivalent 32-bit integer.  Note that copying floats around
396541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// changes the bits of NaNs on some hosts, notably x86, so this
397541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// routine cannot be used if these bits are needed.
398104338913500d007996056ad092e195009883a84Jim Laskeyinline uint32_t FloatToBits(float Float) {
39959b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  union {
400104338913500d007996056ad092e195009883a84Jim Laskey    uint32_t I;
40159b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    float F;
40259b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  } T;
40359b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  T.F = Float;
40459b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  return T.I;
40559b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey}
40659b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey
40749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Platform-independent wrappers for the C99 isnan() function.
40849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerint IsNAN(float f);
40949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerint IsNAN(double d);
4107764f4b2e0e550dc23f3c536f236f9abf86879dcBrian Gaeke
41149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Platform-independent wrappers for the C99 isinf() function.
41249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerint IsInf(float f);
41349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerint IsInf(double d);
414a7d03b466a41e68e11480ae6ca275140fe4c4507Brian Gaeke
415fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands/// MinAlign - A and B are either alignments or offsets.  Return the minimum
416fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands/// alignment that may be assumed after adding the two together.
417305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruthinline uint64_t MinAlign(uint64_t A, uint64_t B) {
418fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands  // The largest power of 2 that divides both A and B.
419fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands  return (A | B) & -(A | B);
420fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands}
421d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson
422d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson/// NextPowerOf2 - Returns the next power of two (in 64-bits)
423d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson/// that is strictly greater than A.  Returns zero on overflow.
424305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruthinline uint64_t NextPowerOf2(uint64_t A) {
425d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 1);
426d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 2);
427d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 4);
428d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 8);
429d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 16);
430d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 32);
431d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  return A + 1;
432d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson}
433e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar
434e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar/// RoundUpToAlignment - Returns the next integer (mod 2**64) that is
435e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar/// greater than or equal to \arg Value and is a multiple of \arg
436e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar/// Align. Align must be non-zero.
437e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar///
438e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar/// Examples:
439e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar/// RoundUpToAlignment(5, 8) = 8
440e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar/// RoundUpToAlignment(17, 8) = 24
441e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar/// RoundUpToAlignment(~0LL, 8) = 0
442e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbarinline uint64_t RoundUpToAlignment(uint64_t Value, uint64_t Align) {
443e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar  return ((Value + Align - 1) / Align) * Align;
444e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar}
445fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
446eccf22528f8b4c21cdbd2f620cbe39dbb38ea6e1Daniel Dunbar/// OffsetToAlignment - Return the offset to the next integer (mod 2**64) that
447eccf22528f8b4c21cdbd2f620cbe39dbb38ea6e1Daniel Dunbar/// is greater than or equal to \arg Value and is a multiple of \arg
448eccf22528f8b4c21cdbd2f620cbe39dbb38ea6e1Daniel Dunbar/// Align. Align must be non-zero.
449eccf22528f8b4c21cdbd2f620cbe39dbb38ea6e1Daniel Dunbarinline uint64_t OffsetToAlignment(uint64_t Value, uint64_t Align) {
450eccf22528f8b4c21cdbd2f620cbe39dbb38ea6e1Daniel Dunbar  return RoundUpToAlignment(Value, Align) - Value;
451eccf22528f8b4c21cdbd2f620cbe39dbb38ea6e1Daniel Dunbar}
452eccf22528f8b4c21cdbd2f620cbe39dbb38ea6e1Daniel Dunbar
4537b9486ad4355a010d22e0737cee9cd7c7b747eceDale Johannesen/// abs64 - absolute value of a 64-bit int.  Not all environments support
4547b9486ad4355a010d22e0737cee9cd7c7b747eceDale Johannesen/// "abs" on whatever their name for the 64-bit int type is.  The absolute
4557b9486ad4355a010d22e0737cee9cd7c7b747eceDale Johannesen/// value of the largest negative number is undefined, as with "abs".
4567b9486ad4355a010d22e0737cee9cd7c7b747eceDale Johanneseninline int64_t abs64(int64_t x) {
4577b9486ad4355a010d22e0737cee9cd7c7b747eceDale Johannesen  return (x < 0) ? -x : x;
4587b9486ad4355a010d22e0737cee9cd7c7b747eceDale Johannesen}
4597b9486ad4355a010d22e0737cee9cd7c7b747eceDale Johannesen
460b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen/// SignExtend32 - Sign extend B-bit number x to 32-bit int.
461b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen/// Usage int32_t r = SignExtend32<5>(x);
462adc6e06ff0c5950abda86574c2da1fc6b863b75cJakob Stoklund Olesentemplate <unsigned B> inline int32_t SignExtend32(uint32_t x) {
463adc6e06ff0c5950abda86574c2da1fc6b863b75cJakob Stoklund Olesen  return int32_t(x << (32 - B)) >> (32 - B);
464b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen}
465b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
466b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen/// SignExtend64 - Sign extend B-bit number x to 64-bit int.
467b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen/// Usage int64_t r = SignExtend64<5>(x);
468adc6e06ff0c5950abda86574c2da1fc6b863b75cJakob Stoklund Olesentemplate <unsigned B> inline int64_t SignExtend64(uint64_t x) {
469adc6e06ff0c5950abda86574c2da1fc6b863b75cJakob Stoklund Olesen  return int64_t(x << (64 - B)) >> (64 - B);
470b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen}
471b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
472d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
473d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
47454ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner#endif
475