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
19c8b909ae499e5b0d7e38ba5c54c35e98c936300bMichael J. Spencer#ifdef _MSC_VER
20c8b909ae499e5b0d7e38ba5c54c35e98c936300bMichael J. Spencer# include <intrin.h>
21c8b909ae499e5b0d7e38ba5c54c35e98c936300bMichael J. Spencer#endif
22c8b909ae499e5b0d7e38ba5c54c35e98c936300bMichael J. Spencer
23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
25fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman// NOTE: The following support functions use the _32/_64 extensions instead of
2689bfcd34cbd2f4c6bb2cafff0a5c2bff147fae11Chris Lattner// type overloading so that signed and unsigned integers can be used without
2789bfcd34cbd2f4c6bb2cafff0a5c2bff147fae11Chris Lattner// ambiguity.
2888c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
2949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Hi_32 - This function returns the high 32 bits of a 64 bit value.
30c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline uint32_t Hi_32(uint64_t Value) {
31c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  return static_cast<uint32_t>(Value >> 32);
3288c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
3388c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
3449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Lo_32 - This function returns the low 32 bits of a 64 bit value.
35c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline uint32_t Lo_32(uint64_t Value) {
36c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  return static_cast<uint32_t>(Value);
3788c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
3888c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
3934247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer/// isInt - Checks if an integer fits into the given bit width.
40d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesentemplate<unsigned N>
41d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Oleseninline bool isInt(int64_t x) {
42d4c00c0f558193b492aed9ab6aacf84bf1d3fb4eJakob Stoklund Olesen  return N >= 64 || (-(INT64_C(1)<<(N-1)) <= x && x < (INT64_C(1)<<(N-1)));
43d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesen}
4434247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer// Template specializations to get better code for common cases.
4534247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
4634247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isInt<8>(int64_t x) {
4734247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<int8_t>(x) == x;
4834247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
4934247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
5034247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isInt<16>(int64_t x) {
5134247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<int16_t>(x) == x;
5234247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
5334247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
5434247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isInt<32>(int64_t x) {
5534247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<int32_t>(x) == x;
5634247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
57d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesen
58b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum/// isShiftedInt<N,S> - Checks if a signed integer is an N bit number shifted
59b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum///                     left by S.
60b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumtemplate<unsigned N, unsigned S>
61b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicuminline bool isShiftedInt(int64_t x) {
62b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  return isInt<N+S>(x) && (x % (1<<S) == 0);
63b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum}
64b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
6534247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer/// isUInt - Checks if an unsigned integer fits into the given bit width.
66d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesentemplate<unsigned N>
6734247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isUInt(uint64_t x) {
6866f1f30725eb20760069823ec015234cce6b887cReid Kleckner  return N >= 64 || x < (UINT64_C(1)<<(N));
69d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesen}
7034247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer// Template specializations to get better code for common cases.
7134247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
7234247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isUInt<8>(uint64_t x) {
7334247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<uint8_t>(x) == x;
7434247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
7534247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
7634247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isUInt<16>(uint64_t x) {
7734247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<uint16_t>(x) == x;
7834247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
7934247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
8034247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isUInt<32>(uint64_t x) {
8134247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<uint32_t>(x) == x;
8234247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
83d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesen
84b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum/// isShiftedUInt<N,S> - Checks if a unsigned integer is an N bit number shifted
85b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum///                     left by S.
86b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumtemplate<unsigned N, unsigned S>
87b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicuminline bool isShiftedUInt(uint64_t x) {
88b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  return isUInt<N+S>(x) && (x % (1<<S) == 0);
89b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum}
90b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
915005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohman/// isUIntN - Checks if an unsigned integer fits into the given (dynamic)
925005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohman/// bit width.
935005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohmaninline bool isUIntN(unsigned N, uint64_t x) {
945005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohman  return x == (x & (~0ULL >> (64 - N)));
955005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohman}
965005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohman
97c42a7754bb6249c33c509e6fa6e8b3c9344e72d8Rafael Espindola/// isIntN - Checks if an signed integer fits into the given (dynamic)
98b35d56c2fe39064a33d0e4e7faf5464b6d8a7352Rafael Espindola/// bit width.
99b35d56c2fe39064a33d0e4e7faf5464b6d8a7352Rafael Espindolainline bool isIntN(unsigned N, int64_t x) {
100b35d56c2fe39064a33d0e4e7faf5464b6d8a7352Rafael Espindola  return N >= 64 || (-(INT64_C(1)<<(N-1)) <= x && x < (INT64_C(1)<<(N-1)));
101b35d56c2fe39064a33d0e4e7faf5464b6d8a7352Rafael Espindola}
102b35d56c2fe39064a33d0e4e7faf5464b6d8a7352Rafael Espindola
10349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// isMask_32 - This function returns true if the argument is a sequence of ones
10449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// starting at the least significant bit with the remainder zero (32 bit
10549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// version).   Ex. isMask_32(0x0000FFFFU) == true.
10618a4c74136a9919dc3235d03c0e060f32d01f3b0Chris Lattnerinline bool isMask_32(uint32_t Value) {
10788c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Value && ((Value + 1) & Value) == 0;
10888c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
10988c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
11049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// isMask_64 - This function returns true if the argument is a sequence of ones
11149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// starting at the least significant bit with the remainder zero (64 bit
11249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// version).
11318a4c74136a9919dc3235d03c0e060f32d01f3b0Chris Lattnerinline bool isMask_64(uint64_t Value) {
11488c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Value && ((Value + 1) & Value) == 0;
11588c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
11688c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
117fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// isShiftedMask_32 - This function returns true if the argument contains a
11849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// sequence of ones with the remainder zero (32 bit version.)
11949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Ex. isShiftedMask_32(0x0000FF00U) == true.
12018a4c74136a9919dc3235d03c0e060f32d01f3b0Chris Lattnerinline bool isShiftedMask_32(uint32_t Value) {
12188c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return isMask_32((Value - 1) | Value);
12288c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
12388c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
124fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// isShiftedMask_64 - This function returns true if the argument contains a
12549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// sequence of ones with the remainder zero (64 bit version.)
12618a4c74136a9919dc3235d03c0e060f32d01f3b0Chris Lattnerinline bool isShiftedMask_64(uint64_t Value) {
12788c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return isMask_64((Value - 1) | Value);
12888c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
12988c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
130fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// isPowerOf2_32 - This function returns true if the argument is a power of
13149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// two > 0. Ex. isPowerOf2_32(0x00100000U) == true (32 bit edition.)
132c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline bool isPowerOf2_32(uint32_t Value) {
13388c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Value && !(Value & (Value - 1));
13488c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
13588c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
13649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// isPowerOf2_64 - This function returns true if the argument is a power of two
13749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// > 0 (64 bit edition.)
13888c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattnerinline bool isPowerOf2_64(uint64_t Value) {
13919b7e0e0cabfa6dfc559c64e3d6ed053832c4047Reid Spencer  return Value && !(Value & (Value - int64_t(1L)));
14088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
14188c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
14249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// ByteSwap_16 - This function returns a byte-swapped representation of the
14349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// 16-bit argument, Value.
144c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline uint16_t ByteSwap_16(uint16_t Value) {
1453afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner  return sys::SwapByteOrder_16(Value);
1466fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman}
1476fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman
14849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// ByteSwap_32 - This function returns a byte-swapped representation of the
14949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// 32-bit argument, Value.
150c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline uint32_t ByteSwap_32(uint32_t Value) {
1513afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner  return sys::SwapByteOrder_32(Value);
1526fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman}
1536fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman
15449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// ByteSwap_64 - This function returns a byte-swapped representation of the
15549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// 64-bit argument, Value.
1566fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begemaninline uint64_t ByteSwap_64(uint64_t Value) {
1573afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner  return sys::SwapByteOrder_64(Value);
1586fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman}
1596fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman
16049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountLeadingZeros_32 - this function performs the platform optimal form of
16149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// counting the number of zeros from the most significant bit to the first one
16249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// bit.  Ex. CountLeadingZeros_32(0x00F000FF) == 8.
16349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Returns 32 if the word is zero.
164c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline unsigned CountLeadingZeros_32(uint32_t Value) {
16588c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  unsigned Count; // result
166e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#if __GNUC__ >= 4
167e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  // PowerPC is defined for __builtin_clz(0)
168e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#if !defined(__ppc__) && !defined(__ppc64__)
169e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  if (!Value) return 32;
170e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#endif
171e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  Count = __builtin_clz(Value);
172e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#else
173e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  if (!Value) return 32;
174e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  Count = 0;
175452394d812816b05f626d414ce6dbd3b87d45a73Duncan Sands  // bisection method for count leading zeros
176e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  for (unsigned Shift = 32 >> 1; Shift; Shift >>= 1) {
177c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen    uint32_t Tmp = Value >> Shift;
178e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner    if (Tmp) {
179e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner      Value = Tmp;
180e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner    } else {
181e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner      Count |= Shift;
18288c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    }
183e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  }
184e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#endif
18588c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Count;
18688c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
187bb92f6fbf2c36b3530f33eb2e8d1842764ec9fddBrian Gaeke
188ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// CountLeadingOnes_32 - this function performs the operation of
189ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// counting the number of ones from the most significant bit to the first zero
190ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// bit.  Ex. CountLeadingOnes_32(0xFF0FFF00) == 8.
191ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// Returns 32 if the word is all ones.
192ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohmaninline unsigned CountLeadingOnes_32(uint32_t Value) {
193ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman  return CountLeadingZeros_32(~Value);
194ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman}
195ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman
19649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountLeadingZeros_64 - This function performs the platform optimal form
197fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// of counting the number of zeros from the most significant bit to the first
19849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// one bit (64 bit edition.)
19949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Returns 64 if the word is zero.
20088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattnerinline unsigned CountLeadingZeros_64(uint64_t Value) {
20188c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  unsigned Count; // result
202e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#if __GNUC__ >= 4
203e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  // PowerPC is defined for __builtin_clzll(0)
20489bfcd34cbd2f4c6bb2cafff0a5c2bff147fae11Chris Lattner#if !defined(__ppc__) && !defined(__ppc64__)
205e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  if (!Value) return 64;
206e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#endif
207e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  Count = __builtin_clzll(Value);
208e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#else
2093b65576527b7e0098a401289f9245eb5266fda31Chris Lattner  if (sizeof(long) == sizeof(int64_t)) {
21088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    if (!Value) return 64;
21188c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    Count = 0;
212452394d812816b05f626d414ce6dbd3b87d45a73Duncan Sands    // bisection method for count leading zeros
213c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen    for (unsigned Shift = 64 >> 1; Shift; Shift >>= 1) {
21488c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner      uint64_t Tmp = Value >> Shift;
21588c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner      if (Tmp) {
21688c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner        Value = Tmp;
217e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner      } else {
218e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner        Count |= Shift;
21988c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner      }
2203b65576527b7e0098a401289f9245eb5266fda31Chris Lattner    }
2213b65576527b7e0098a401289f9245eb5266fda31Chris Lattner  } else {
22288c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    // get hi portion
223c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen    uint32_t Hi = Hi_32(Value);
224cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
22588c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    // if some bits in hi portion
22688c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    if (Hi) {
22788c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner        // leading zeros in hi portion plus all bits in lo portion
228865dc8f64f50b72dbc8acb7851e606357f9d81f1Chris Lattner        Count = CountLeadingZeros_32(Hi);
22988c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    } else {
23088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner        // get lo portion
231c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen        uint32_t Lo = Lo_32(Value);
23288c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner        // same as 32 bit value
233865dc8f64f50b72dbc8acb7851e606357f9d81f1Chris Lattner        Count = CountLeadingZeros_32(Lo)+32;
23488c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    }
2353b65576527b7e0098a401289f9245eb5266fda31Chris Lattner  }
2363b65576527b7e0098a401289f9245eb5266fda31Chris Lattner#endif
23788c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Count;
238e265504e82310266271fa2329b6ef8115bbe8244Chris Lattner}
239e265504e82310266271fa2329b6ef8115bbe8244Chris Lattner
240ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// CountLeadingOnes_64 - This function performs the operation
241fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// of counting the number of ones from the most significant bit to the first
242ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// zero bit (64 bit edition.)
243ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// Returns 64 if the word is all ones.
244ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohmaninline unsigned CountLeadingOnes_64(uint64_t Value) {
245ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman  return CountLeadingZeros_64(~Value);
246ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman}
247ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman
24849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountTrailingZeros_32 - this function performs the platform optimal form of
24949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// counting the number of zeros from the least significant bit to the first one
25049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// bit.  Ex. CountTrailingZeros_32(0xFF00FF00) == 8.
25149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Returns 32 if the word is zero.
252c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline unsigned CountTrailingZeros_32(uint32_t Value) {
253c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#if __GNUC__ >= 4
254c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson  return Value ? __builtin_ctz(Value) : 32;
255c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#else
25682a60eca8fb5761817960e75fd469246496f8dceChris Lattner  static const unsigned Mod37BitPosition[] = {
25782a60eca8fb5761817960e75fd469246496f8dceChris Lattner    32, 0, 1, 26, 2, 23, 27, 0, 3, 16, 24, 30, 28, 11, 0, 13,
25882a60eca8fb5761817960e75fd469246496f8dceChris Lattner    4, 7, 17, 0, 25, 22, 31, 15, 29, 10, 12, 6, 0, 21, 14, 9,
25982a60eca8fb5761817960e75fd469246496f8dceChris Lattner    5, 20, 8, 19, 18
26082a60eca8fb5761817960e75fd469246496f8dceChris Lattner  };
261b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  // Replace "-Value" by "1+~Value" in the following commented code to avoid
262b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  // MSVC warning C4146
263b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  //    return Mod37BitPosition[(-Value & Value) % 37];
264b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  return Mod37BitPosition[((1 + ~Value) & Value) % 37];
265c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#endif
26616d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman}
26716d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman
268ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// CountTrailingOnes_32 - this function performs the operation of
269ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// counting the number of ones from the least significant bit to the first zero
270ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// bit.  Ex. CountTrailingOnes_32(0x00FF00FF) == 8.
271ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// Returns 32 if the word is all ones.
272ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohmaninline unsigned CountTrailingOnes_32(uint32_t Value) {
273ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman  return CountTrailingZeros_32(~Value);
274ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman}
275ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman
27649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountTrailingZeros_64 - This function performs the platform optimal form
277fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// of counting the number of zeros from the least significant bit to the first
27849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// one bit (64 bit edition.)
27949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Returns 64 if the word is zero.
28016d6ea526482e733fe3bc63929e94c9e88b6708dNate Begemaninline unsigned CountTrailingZeros_64(uint64_t Value) {
281c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#if __GNUC__ >= 4
282c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson  return Value ? __builtin_ctzll(Value) : 64;
283c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#else
28482a60eca8fb5761817960e75fd469246496f8dceChris Lattner  static const unsigned Mod67Position[] = {
28582a60eca8fb5761817960e75fd469246496f8dceChris Lattner    64, 0, 1, 39, 2, 15, 40, 23, 3, 12, 16, 59, 41, 19, 24, 54,
28682a60eca8fb5761817960e75fd469246496f8dceChris Lattner    4, 64, 13, 10, 17, 62, 60, 28, 42, 30, 20, 51, 25, 44, 55,
28782a60eca8fb5761817960e75fd469246496f8dceChris Lattner    47, 5, 32, 65, 38, 14, 22, 11, 58, 18, 53, 63, 9, 61, 27,
28882a60eca8fb5761817960e75fd469246496f8dceChris Lattner    29, 50, 43, 46, 31, 37, 21, 57, 52, 8, 26, 49, 45, 36, 56,
28982a60eca8fb5761817960e75fd469246496f8dceChris Lattner    7, 48, 35, 6, 34, 33, 0
29082a60eca8fb5761817960e75fd469246496f8dceChris Lattner  };
291b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  // Replace "-Value" by "1+~Value" in the following commented code to avoid
292b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  // MSVC warning C4146
293b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  //    return Mod67Position[(-Value & Value) % 67];
294b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  return Mod67Position[((1 + ~Value) & Value) % 67];
295c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#endif
29616d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman}
29716d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman
298ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// CountTrailingOnes_64 - This function performs the operation
299fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// of counting the number of ones from the least significant bit to the first
300ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// zero bit (64 bit edition.)
301ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman/// Returns 64 if the word is all ones.
302ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohmaninline unsigned CountTrailingOnes_64(uint64_t Value) {
303ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman  return CountTrailingZeros_64(~Value);
304ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman}
305ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman
30649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountPopulation_32 - this function counts the number of set bits in a value.
30749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Ex. CountPopulation(0xF000F000) = 8
30849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Returns 0 if the word is zero.
3092a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Andersoninline unsigned CountPopulation_32(uint32_t Value) {
3102a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#if __GNUC__ >= 4
3112a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson  return __builtin_popcount(Value);
3122a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#else
313e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  uint32_t v = Value - ((Value >> 1) & 0x55555555);
314e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
315e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  return ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;
3162a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#endif
31716d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman}
31816d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman
31949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountPopulation_64 - this function counts the number of set bits in a value,
32049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// (64 bit edition.)
32116d6ea526482e733fe3bc63929e94c9e88b6708dNate Begemaninline unsigned CountPopulation_64(uint64_t Value) {
3222a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#if __GNUC__ >= 4
3232a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson  return __builtin_popcountll(Value);
3242a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#else
325e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  uint64_t v = Value - ((Value >> 1) & 0x5555555555555555ULL);
326e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  v = (v & 0x3333333333333333ULL) + ((v >> 2) & 0x3333333333333333ULL);
327e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  v = (v + (v >> 4)) & 0x0F0F0F0F0F0F0F0FULL;
328ca5183d445954a9b2a570d6bbba1bc2b00ad6442Jeff Cohen  return unsigned((uint64_t)(v * 0x0101010101010101ULL) >> 56);
3292a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#endif
33016d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman}
33116d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman
332fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// Log2_32 - This function returns the floor log base 2 of the specified value,
33349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// -1 if the value is zero. (32 bit edition.)
33449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Ex. Log2_32(32) == 5, Log2_32(1) == 0, Log2_32(0) == -1, Log2_32(6) == 2
335c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline unsigned Log2_32(uint32_t Value) {
336e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  return 31 - CountLeadingZeros_32(Value);
33716d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman}
33854ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner
339fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// Log2_64 - This function returns the floor log base 2 of the specified value,
34049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// -1 if the value is zero. (64 bit edition.)
3412be12faabb3ce2d2d3979c73ac65d466fdea5ec5Chris Lattnerinline unsigned Log2_64(uint64_t Value) {
342e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  return 63 - CountLeadingZeros_64(Value);
343cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}
344cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
34549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Log2_32_Ceil - This function returns the ceil log base 2 of the specified
34649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// value, 32 if the value is zero. (32 bit edition).
34749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Ex. Log2_32_Ceil(32) == 5, Log2_32_Ceil(1) == 0, Log2_32_Ceil(6) == 3
348c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline unsigned Log2_32_Ceil(uint32_t Value) {
3490683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner  return 32-CountLeadingZeros_32(Value-1);
3500683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner}
3510683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner
35255b42513e1548554bfacc72d48ec3483c73fddf9Dan Gohman/// Log2_64_Ceil - This function returns the ceil log base 2 of the specified
35355b42513e1548554bfacc72d48ec3483c73fddf9Dan Gohman/// value, 64 if the value is zero. (64 bit edition.)
3540683c8cad920d241d44b126972d5cdd164dcc213Chris Lattnerinline unsigned Log2_64_Ceil(uint64_t Value) {
3550683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner  return 64-CountLeadingZeros_64(Value-1);
3560683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner}
3570683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner
35849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// GreatestCommonDivisor64 - Return the greatest common divisor of the two
35949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// values using Euclid's algorithm.
36049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerinline uint64_t GreatestCommonDivisor64(uint64_t A, uint64_t B) {
36149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner  while (B) {
36249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner    uint64_t T = B;
36349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner    B = A % B;
36449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner    A = T;
36549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner  }
36649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner  return A;
36749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner}
368fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
36949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// BitsToDouble - This function takes a 64-bit integer and returns the bit
37049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// equivalent double.
37159b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskeyinline double BitsToDouble(uint64_t Bits) {
37259b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  union {
37359b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    uint64_t L;
37459b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    double D;
37559b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  } T;
37659b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  T.L = Bits;
37759b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  return T.D;
37859b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey}
37959b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey
38049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// BitsToFloat - This function takes a 32-bit integer and returns the bit
38149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// equivalent float.
382104338913500d007996056ad092e195009883a84Jim Laskeyinline float BitsToFloat(uint32_t Bits) {
38359b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  union {
384104338913500d007996056ad092e195009883a84Jim Laskey    uint32_t I;
38559b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    float F;
38659b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  } T;
38759b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  T.I = Bits;
38859b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  return T.F;
38959b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey}
39059b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey
39149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// DoubleToBits - This function takes a double and returns the bit
392541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// equivalent 64-bit integer.  Note that copying doubles around
393541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// changes the bits of NaNs on some hosts, notably x86, so this
394541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// routine cannot be used if these bits are needed.
39559b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskeyinline uint64_t DoubleToBits(double Double) {
39659b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  union {
39759b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    uint64_t L;
39859b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    double D;
39959b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  } T;
40059b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  T.D = Double;
40159b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  return T.L;
40259b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey}
40359b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey
40449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// FloatToBits - This function takes a float and returns the bit
405541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// equivalent 32-bit integer.  Note that copying floats around
406541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// changes the bits of NaNs on some hosts, notably x86, so this
407541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// routine cannot be used if these bits are needed.
408104338913500d007996056ad092e195009883a84Jim Laskeyinline uint32_t FloatToBits(float Float) {
40959b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  union {
410104338913500d007996056ad092e195009883a84Jim Laskey    uint32_t I;
41159b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    float F;
41259b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  } T;
41359b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  T.F = Float;
41459b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  return T.I;
41559b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey}
41659b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey
41749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Platform-independent wrappers for the C99 isnan() function.
41849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerint IsNAN(float f);
41949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerint IsNAN(double d);
4207764f4b2e0e550dc23f3c536f236f9abf86879dcBrian Gaeke
42149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Platform-independent wrappers for the C99 isinf() function.
42249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerint IsInf(float f);
42349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerint IsInf(double d);
424a7d03b466a41e68e11480ae6ca275140fe4c4507Brian Gaeke
425fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands/// MinAlign - A and B are either alignments or offsets.  Return the minimum
426fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands/// alignment that may be assumed after adding the two together.
427305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruthinline uint64_t MinAlign(uint64_t A, uint64_t B) {
428fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands  // The largest power of 2 that divides both A and B.
429b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  //
430b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  // Replace "-Value" by "1+~Value" in the following commented code to avoid
431b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  // MSVC warning C4146
432b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  //    return (A | B) & -(A | B);
433b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  return (A | B) & (1 + ~(A | B));
434fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands}
435d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson
436d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson/// NextPowerOf2 - Returns the next power of two (in 64-bits)
437d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson/// that is strictly greater than A.  Returns zero on overflow.
438305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruthinline uint64_t NextPowerOf2(uint64_t A) {
439d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 1);
440d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 2);
441d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 4);
442d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 8);
443d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 16);
444d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 32);
445d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  return A + 1;
446d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson}
447e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar
4482d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko/// Returns the next integer (mod 2**64) that is greater than or equal to
4492d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko/// \p Value and is a multiple of \p Align. \p Align must be non-zero.
450e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar///
451e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar/// Examples:
4522d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko/// \code
4532d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko///   RoundUpToAlignment(5, 8) = 8
4542d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko///   RoundUpToAlignment(17, 8) = 24
4552d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko///   RoundUpToAlignment(~0LL, 8) = 0
4562d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko/// \endcode
457e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbarinline uint64_t RoundUpToAlignment(uint64_t Value, uint64_t Align) {
458e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar  return ((Value + Align - 1) / Align) * Align;
459e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar}
460fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
4612d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko/// Returns the offset to the next integer (mod 2**64) that is greater than
4622d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko/// or equal to \p Value and is a multiple of \p Align. \p Align must be
4632d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko/// non-zero.
464eccf22528f8b4c21cdbd2f620cbe39dbb38ea6e1Daniel Dunbarinline uint64_t OffsetToAlignment(uint64_t Value, uint64_t Align) {
465eccf22528f8b4c21cdbd2f620cbe39dbb38ea6e1Daniel Dunbar  return RoundUpToAlignment(Value, Align) - Value;
466eccf22528f8b4c21cdbd2f620cbe39dbb38ea6e1Daniel Dunbar}
467eccf22528f8b4c21cdbd2f620cbe39dbb38ea6e1Daniel Dunbar
4687b9486ad4355a010d22e0737cee9cd7c7b747eceDale Johannesen/// abs64 - absolute value of a 64-bit int.  Not all environments support
4697b9486ad4355a010d22e0737cee9cd7c7b747eceDale Johannesen/// "abs" on whatever their name for the 64-bit int type is.  The absolute
4707b9486ad4355a010d22e0737cee9cd7c7b747eceDale Johannesen/// value of the largest negative number is undefined, as with "abs".
4717b9486ad4355a010d22e0737cee9cd7c7b747eceDale Johanneseninline int64_t abs64(int64_t x) {
4727b9486ad4355a010d22e0737cee9cd7c7b747eceDale Johannesen  return (x < 0) ? -x : x;
4737b9486ad4355a010d22e0737cee9cd7c7b747eceDale Johannesen}
4747b9486ad4355a010d22e0737cee9cd7c7b747eceDale Johannesen
475b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen/// SignExtend32 - Sign extend B-bit number x to 32-bit int.
476b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen/// Usage int32_t r = SignExtend32<5>(x);
477adc6e06ff0c5950abda86574c2da1fc6b863b75cJakob Stoklund Olesentemplate <unsigned B> inline int32_t SignExtend32(uint32_t x) {
478adc6e06ff0c5950abda86574c2da1fc6b863b75cJakob Stoklund Olesen  return int32_t(x << (32 - B)) >> (32 - B);
479b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen}
480b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
4811144af3c9b4da48cd581156e05b24261c8de366aRichard Smith/// \brief Sign extend number in the bottom B bits of X to a 32-bit int.
4821144af3c9b4da48cd581156e05b24261c8de366aRichard Smith/// Requires 0 < B <= 32.
4831144af3c9b4da48cd581156e05b24261c8de366aRichard Smithinline int32_t SignExtend32(uint32_t X, unsigned B) {
4841144af3c9b4da48cd581156e05b24261c8de366aRichard Smith  return int32_t(X << (32 - B)) >> (32 - B);
4851144af3c9b4da48cd581156e05b24261c8de366aRichard Smith}
4861144af3c9b4da48cd581156e05b24261c8de366aRichard Smith
487b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen/// SignExtend64 - Sign extend B-bit number x to 64-bit int.
488b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen/// Usage int64_t r = SignExtend64<5>(x);
489adc6e06ff0c5950abda86574c2da1fc6b863b75cJakob Stoklund Olesentemplate <unsigned B> inline int64_t SignExtend64(uint64_t x) {
490adc6e06ff0c5950abda86574c2da1fc6b863b75cJakob Stoklund Olesen  return int64_t(x << (64 - B)) >> (64 - B);
491b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen}
492b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
4931144af3c9b4da48cd581156e05b24261c8de366aRichard Smith/// \brief Sign extend number in the bottom B bits of X to a 64-bit int.
4941144af3c9b4da48cd581156e05b24261c8de366aRichard Smith/// Requires 0 < B <= 64.
4951144af3c9b4da48cd581156e05b24261c8de366aRichard Smithinline int64_t SignExtend64(uint64_t X, unsigned B) {
4961144af3c9b4da48cd581156e05b24261c8de366aRichard Smith  return int64_t(X << (64 - B)) >> (64 - B);
4971144af3c9b4da48cd581156e05b24261c8de366aRichard Smith}
4981144af3c9b4da48cd581156e05b24261c8de366aRichard Smith
499d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
500d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
50154ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner#endif
502