MathExtras.h revision fd617d0143a158bc1c996445262d409280e7b0cc
1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer//===-- llvm/Support/MathExtras.h - Useful math functions -------*- C++ -*-===//
263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman//
3b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//                     The LLVM Compiler Infrastructure
4b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//
5b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell// This file was developed by the LLVM research group and is distributed under
6b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell// the University of Illinois Open Source 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
17551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/DataTypes.h"
18cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
19d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
20d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
2189bfcd34cbd2f4c6bb2cafff0a5c2bff147fae11Chris Lattner// 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
3549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// is?Type - these functions produce optimal testing for integer data types.
3649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerinline bool isInt8  (int64_t Value) {
37c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  return static_cast<int8_t>(Value) == Value;
3854cb98578ac2eff4d5986eff7d2b18c66561d683Reid Spencer}
3949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerinline bool isUInt8 (int64_t Value) {
40c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  return static_cast<uint8_t>(Value) == Value;
4154cb98578ac2eff4d5986eff7d2b18c66561d683Reid Spencer}
4249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerinline bool isInt16 (int64_t Value) {
43c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  return static_cast<int16_t>(Value) == Value;
4454cb98578ac2eff4d5986eff7d2b18c66561d683Reid Spencer}
4549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerinline bool isUInt16(int64_t Value) {
46c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  return static_cast<uint16_t>(Value) == Value;
4754cb98578ac2eff4d5986eff7d2b18c66561d683Reid Spencer}
4854cb98578ac2eff4d5986eff7d2b18c66561d683Reid Spencerinline bool isInt32 (int64_t Value) {
49c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  return static_cast<int32_t>(Value) == Value;
5054cb98578ac2eff4d5986eff7d2b18c66561d683Reid Spencer}
5154cb98578ac2eff4d5986eff7d2b18c66561d683Reid Spencerinline bool isUInt32(int64_t Value) {
52c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  return static_cast<uint32_t>(Value) == Value;
5354cb98578ac2eff4d5986eff7d2b18c66561d683Reid Spencer}
5488c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
5549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// isMask_32 - This function returns true if the argument is a sequence of ones
5649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// starting at the least significant bit with the remainder zero (32 bit
5749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// version).   Ex. isMask_32(0x0000FFFFU) == true.
5818a4c74136a9919dc3235d03c0e060f32d01f3b0Chris Lattnerinline bool isMask_32(uint32_t Value) {
5988c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Value && ((Value + 1) & Value) == 0;
6088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
6188c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
6249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// isMask_64 - This function returns true if the argument is a sequence of ones
6349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// starting at the least significant bit with the remainder zero (64 bit
6449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// version).
6518a4c74136a9919dc3235d03c0e060f32d01f3b0Chris Lattnerinline bool isMask_64(uint64_t Value) {
6688c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Value && ((Value + 1) & Value) == 0;
6788c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
6888c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
6949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// isShiftedMask_32 - This function returns true if the argument contains a
7049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// sequence of ones with the remainder zero (32 bit version.)
7149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Ex. isShiftedMask_32(0x0000FF00U) == true.
7218a4c74136a9919dc3235d03c0e060f32d01f3b0Chris Lattnerinline bool isShiftedMask_32(uint32_t Value) {
7388c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return isMask_32((Value - 1) | Value);
7488c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
7588c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
7649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// isShiftedMask_64 - This function returns true if the argument contains a
7749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// sequence of ones with the remainder zero (64 bit version.)
7818a4c74136a9919dc3235d03c0e060f32d01f3b0Chris Lattnerinline bool isShiftedMask_64(uint64_t Value) {
7988c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return isMask_64((Value - 1) | Value);
8088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
8188c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
8249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// isPowerOf2_32 - This function returns true if the argument is a power of
8349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// two > 0. Ex. isPowerOf2_32(0x00100000U) == true (32 bit edition.)
84c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline bool isPowerOf2_32(uint32_t Value) {
8588c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Value && !(Value & (Value - 1));
8688c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
8788c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
8849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// isPowerOf2_64 - This function returns true if the argument is a power of two
8949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// > 0 (64 bit edition.)
9088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattnerinline bool isPowerOf2_64(uint64_t Value) {
9119b7e0e0cabfa6dfc559c64e3d6ed053832c4047Reid Spencer  return Value && !(Value & (Value - int64_t(1L)));
9288c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
9388c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
9449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// ByteSwap_16 - This function returns a byte-swapped representation of the
9549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// 16-bit argument, Value.
96c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline uint16_t ByteSwap_16(uint16_t Value) {
97c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen#if defined(_MSC_VER) && !defined(_DEBUG)
98c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  // The DLL version of the runtime lacks these functions (bug!?), but in a
99c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  // release build they're replaced with BSWAP instructions anyway.
100c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  return _byteswap_ushort(Value);
101c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen#else
102c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  uint16_t Hi = Value << 8;
103c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  uint16_t Lo = Value >> 8;
1046fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman  return Hi | Lo;
105c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen#endif
1066fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman}
1076fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman
10849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// ByteSwap_32 - This function returns a byte-swapped representation of the
10949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// 32-bit argument, Value.
110c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline uint32_t ByteSwap_32(uint32_t Value) {
111c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
112bed2946a96ecb15b0b636fa74cb26ce61b1c648eAnton Korobeynikov  return __builtin_bswap32(Value);
113c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen#elif defined(_MSC_VER) && !defined(_DEBUG)
114c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  return _byteswap_ulong(Value);
115c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#else
116c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  uint32_t Byte0 = Value & 0x000000FF;
117c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  uint32_t Byte1 = Value & 0x0000FF00;
118c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  uint32_t Byte2 = Value & 0x00FF0000;
119c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  uint32_t Byte3 = Value & 0xFF000000;
1206fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman  return (Byte0 << 24) | (Byte1 << 8) | (Byte2 >> 8) | (Byte3 >> 24);
121c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#endif
1226fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman}
1236fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman
12449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// ByteSwap_64 - This function returns a byte-swapped representation of the
12549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// 64-bit argument, Value.
1266fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begemaninline uint64_t ByteSwap_64(uint64_t Value) {
127c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
128bed2946a96ecb15b0b636fa74cb26ce61b1c648eAnton Korobeynikov  return __builtin_bswap64(Value);
129c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen#elif defined(_MSC_VER) && !defined(_DEBUG)
130c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  return _byteswap_uint64(Value);
131c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#else
132c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  uint64_t Hi = ByteSwap_32(uint32_t(Value));
133c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  uint32_t Lo = ByteSwap_32(uint32_t(Value >> 32));
1346fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman  return (Hi << 32) | Lo;
135c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#endif
1366fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman}
1376fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman
13849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountLeadingZeros_32 - this function performs the platform optimal form of
13949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// counting the number of zeros from the most significant bit to the first one
14049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// bit.  Ex. CountLeadingZeros_32(0x00F000FF) == 8.
14149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Returns 32 if the word is zero.
142c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline unsigned CountLeadingZeros_32(uint32_t Value) {
14388c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  unsigned Count; // result
144e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#if __GNUC__ >= 4
145e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  // PowerPC is defined for __builtin_clz(0)
146e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#if !defined(__ppc__) && !defined(__ppc64__)
147e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  if (!Value) return 32;
148e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#endif
149e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  Count = __builtin_clz(Value);
150e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#else
151e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  if (!Value) return 32;
152e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  Count = 0;
153e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  // bisecton method for count leading zeros
154e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  for (unsigned Shift = 32 >> 1; Shift; Shift >>= 1) {
155c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen    uint32_t Tmp = Value >> Shift;
156e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner    if (Tmp) {
157e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner      Value = Tmp;
158e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner    } else {
159e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner      Count |= Shift;
16088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    }
161e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  }
162e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#endif
16388c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Count;
16488c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
165bb92f6fbf2c36b3530f33eb2e8d1842764ec9fddBrian Gaeke
16649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountLeadingZeros_64 - This function performs the platform optimal form
16749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// of counting the number of zeros from the most significant bit to the first
16849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// one bit (64 bit edition.)
16949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Returns 64 if the word is zero.
17088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattnerinline unsigned CountLeadingZeros_64(uint64_t Value) {
17188c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  unsigned Count; // result
172e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#if __GNUC__ >= 4
173e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  // PowerPC is defined for __builtin_clzll(0)
17489bfcd34cbd2f4c6bb2cafff0a5c2bff147fae11Chris Lattner#if !defined(__ppc__) && !defined(__ppc64__)
175e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  if (!Value) return 64;
176e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#endif
177e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner  Count = __builtin_clzll(Value);
178e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner#else
1793b65576527b7e0098a401289f9245eb5266fda31Chris Lattner  if (sizeof(long) == sizeof(int64_t)) {
18088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    if (!Value) return 64;
18188c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    Count = 0;
18288c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    // bisecton method for count leading zeros
183c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen    for (unsigned Shift = 64 >> 1; Shift; Shift >>= 1) {
18488c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner      uint64_t Tmp = Value >> Shift;
18588c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner      if (Tmp) {
18688c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner        Value = Tmp;
187e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner      } else {
188e6ec587059eb142467cc8a5915946a3b308cb9b7Chris Lattner        Count |= Shift;
18988c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner      }
1903b65576527b7e0098a401289f9245eb5266fda31Chris Lattner    }
1913b65576527b7e0098a401289f9245eb5266fda31Chris Lattner  } else {
19288c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    // get hi portion
193c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen    uint32_t Hi = Hi_32(Value);
194cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
19588c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    // if some bits in hi portion
19688c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    if (Hi) {
19788c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner        // leading zeros in hi portion plus all bits in lo portion
198865dc8f64f50b72dbc8acb7851e606357f9d81f1Chris Lattner        Count = CountLeadingZeros_32(Hi);
19988c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    } else {
20088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner        // get lo portion
201c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen        uint32_t Lo = Lo_32(Value);
20288c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner        // same as 32 bit value
203865dc8f64f50b72dbc8acb7851e606357f9d81f1Chris Lattner        Count = CountLeadingZeros_32(Lo)+32;
20488c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner    }
2053b65576527b7e0098a401289f9245eb5266fda31Chris Lattner  }
2063b65576527b7e0098a401289f9245eb5266fda31Chris Lattner#endif
20788c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Count;
208e265504e82310266271fa2329b6ef8115bbe8244Chris Lattner}
209e265504e82310266271fa2329b6ef8115bbe8244Chris Lattner
21049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountTrailingZeros_32 - this function performs the platform optimal form of
21149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// counting the number of zeros from the least significant bit to the first one
21249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// bit.  Ex. CountTrailingZeros_32(0xFF00FF00) == 8.
21349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Returns 32 if the word is zero.
214c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline unsigned CountTrailingZeros_32(uint32_t Value) {
215c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#if __GNUC__ >= 4
216c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson  return Value ? __builtin_ctz(Value) : 32;
217c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#else
21882a60eca8fb5761817960e75fd469246496f8dceChris Lattner  static const unsigned Mod37BitPosition[] = {
21982a60eca8fb5761817960e75fd469246496f8dceChris Lattner    32, 0, 1, 26, 2, 23, 27, 0, 3, 16, 24, 30, 28, 11, 0, 13,
22082a60eca8fb5761817960e75fd469246496f8dceChris Lattner    4, 7, 17, 0, 25, 22, 31, 15, 29, 10, 12, 6, 0, 21, 14, 9,
22182a60eca8fb5761817960e75fd469246496f8dceChris Lattner    5, 20, 8, 19, 18
22282a60eca8fb5761817960e75fd469246496f8dceChris Lattner  };
223e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  return Mod37BitPosition[(-Value & Value) % 37];
224c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#endif
22516d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman}
22616d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman
22749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountTrailingZeros_64 - This function performs the platform optimal form
22849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// of counting the number of zeros from the least significant bit to the first
22949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// one bit (64 bit edition.)
23049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Returns 64 if the word is zero.
23116d6ea526482e733fe3bc63929e94c9e88b6708dNate Begemaninline unsigned CountTrailingZeros_64(uint64_t Value) {
232c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#if __GNUC__ >= 4
233c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson  return Value ? __builtin_ctzll(Value) : 64;
234c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#else
23582a60eca8fb5761817960e75fd469246496f8dceChris Lattner  static const unsigned Mod67Position[] = {
23682a60eca8fb5761817960e75fd469246496f8dceChris Lattner    64, 0, 1, 39, 2, 15, 40, 23, 3, 12, 16, 59, 41, 19, 24, 54,
23782a60eca8fb5761817960e75fd469246496f8dceChris Lattner    4, 64, 13, 10, 17, 62, 60, 28, 42, 30, 20, 51, 25, 44, 55,
23882a60eca8fb5761817960e75fd469246496f8dceChris Lattner    47, 5, 32, 65, 38, 14, 22, 11, 58, 18, 53, 63, 9, 61, 27,
23982a60eca8fb5761817960e75fd469246496f8dceChris Lattner    29, 50, 43, 46, 31, 37, 21, 57, 52, 8, 26, 49, 45, 36, 56,
24082a60eca8fb5761817960e75fd469246496f8dceChris Lattner    7, 48, 35, 6, 34, 33, 0
24182a60eca8fb5761817960e75fd469246496f8dceChris Lattner  };
242e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  return Mod67Position[(-Value & Value) % 67];
243c100b96b1536ef92cadac28bd268da105a67d4a0Owen Anderson#endif
24416d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman}
24516d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman
24649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountPopulation_32 - this function counts the number of set bits in a value.
24749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Ex. CountPopulation(0xF000F000) = 8
24849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Returns 0 if the word is zero.
2492a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Andersoninline unsigned CountPopulation_32(uint32_t Value) {
2502a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#if __GNUC__ >= 4
2512a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson  return __builtin_popcount(Value);
2522a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#else
253e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  uint32_t v = Value - ((Value >> 1) & 0x55555555);
254e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
255e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  return ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;
2562a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#endif
25716d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman}
25816d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman
25949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// CountPopulation_64 - this function counts the number of set bits in a value,
26049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// (64 bit edition.)
26116d6ea526482e733fe3bc63929e94c9e88b6708dNate Begemaninline unsigned CountPopulation_64(uint64_t Value) {
2622a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#if __GNUC__ >= 4
2632a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson  return __builtin_popcountll(Value);
2642a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#else
265e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  uint64_t v = Value - ((Value >> 1) & 0x5555555555555555ULL);
266e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  v = (v & 0x3333333333333333ULL) + ((v >> 2) & 0x3333333333333333ULL);
267e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  v = (v + (v >> 4)) & 0x0F0F0F0F0F0F0F0FULL;
268ca5183d445954a9b2a570d6bbba1bc2b00ad6442Jeff Cohen  return unsigned((uint64_t)(v * 0x0101010101010101ULL) >> 56);
2692a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#endif
27016d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman}
27116d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman
27249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Log2_32 - This function returns the floor log base 2 of the specified value,
27349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// -1 if the value is zero. (32 bit edition.)
27449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Ex. Log2_32(32) == 5, Log2_32(1) == 0, Log2_32(0) == -1, Log2_32(6) == 2
275c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline unsigned Log2_32(uint32_t Value) {
276e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  return 31 - CountLeadingZeros_32(Value);
27716d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman}
27854ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner
27949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Log2_64 - This function returns the floor log base 2 of the specified value,
28049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// -1 if the value is zero. (64 bit edition.)
2812be12faabb3ce2d2d3979c73ac65d466fdea5ec5Chris Lattnerinline unsigned Log2_64(uint64_t Value) {
282e6efc859398498c3a08a3f36e82c63a706ae0d7eAnton Korobeynikov  return 63 - CountLeadingZeros_64(Value);
283cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}
284cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
28549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Log2_32_Ceil - This function returns the ceil log base 2 of the specified
28649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// value, 32 if the value is zero. (32 bit edition).
28749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Ex. Log2_32_Ceil(32) == 5, Log2_32_Ceil(1) == 0, Log2_32_Ceil(6) == 3
288c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline unsigned Log2_32_Ceil(uint32_t Value) {
2890683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner  return 32-CountLeadingZeros_32(Value-1);
2900683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner}
2910683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner
29249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Log2_64 - This function returns the ceil log base 2 of the specified value,
29349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// 64 if the value is zero. (64 bit edition.)
2940683c8cad920d241d44b126972d5cdd164dcc213Chris Lattnerinline unsigned Log2_64_Ceil(uint64_t Value) {
2950683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner  return 64-CountLeadingZeros_64(Value-1);
2960683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner}
2970683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner
29849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// GreatestCommonDivisor64 - Return the greatest common divisor of the two
29949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// values using Euclid's algorithm.
30049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerinline uint64_t GreatestCommonDivisor64(uint64_t A, uint64_t B) {
30149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner  while (B) {
30249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner    uint64_t T = B;
30349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner    B = A % B;
30449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner    A = T;
30549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner  }
30649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner  return A;
30749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner}
30849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner
30949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// BitsToDouble - This function takes a 64-bit integer and returns the bit
31049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// equivalent double.
31159b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskeyinline double BitsToDouble(uint64_t Bits) {
31259b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  union {
31359b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    uint64_t L;
31459b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    double D;
31559b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  } T;
31659b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  T.L = Bits;
31759b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  return T.D;
31859b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey}
31959b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey
32049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// BitsToFloat - This function takes a 32-bit integer and returns the bit
32149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// equivalent float.
322104338913500d007996056ad092e195009883a84Jim Laskeyinline float BitsToFloat(uint32_t Bits) {
32359b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  union {
324104338913500d007996056ad092e195009883a84Jim Laskey    uint32_t I;
32559b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    float F;
32659b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  } T;
32759b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  T.I = Bits;
32859b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  return T.F;
32959b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey}
33059b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey
33149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// DoubleToBits - This function takes a double and returns the bit
33249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// equivalent 64-bit integer.
33359b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskeyinline uint64_t DoubleToBits(double Double) {
33459b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  union {
33559b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    uint64_t L;
33659b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    double D;
33759b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  } T;
33859b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  T.D = Double;
33959b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  return T.L;
34059b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey}
34159b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey
34249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// FloatToBits - This function takes a float and returns the bit
34349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// equivalent 32-bit integer.
344104338913500d007996056ad092e195009883a84Jim Laskeyinline uint32_t FloatToBits(float Float) {
34559b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  union {
346104338913500d007996056ad092e195009883a84Jim Laskey    uint32_t I;
34759b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    float F;
34859b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  } T;
34959b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  T.F = Float;
35059b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  return T.I;
35159b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey}
35259b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey
35349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Platform-independent wrappers for the C99 isnan() function.
35449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerint IsNAN(float f);
35549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerint IsNAN(double d);
3567764f4b2e0e550dc23f3c536f236f9abf86879dcBrian Gaeke
35749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Platform-independent wrappers for the C99 isinf() function.
35849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerint IsInf(float f);
35949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerint IsInf(double d);
360a7d03b466a41e68e11480ae6ca275140fe4c4507Brian Gaeke
361fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands/// MinAlign - A and B are either alignments or offsets.  Return the minimum
362fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands/// alignment that may be assumed after adding the two together.
363fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sandsstatic inline unsigned MinAlign(unsigned A, unsigned B) {
364fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands  // The largest power of 2 that divides both A and B.
365fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands  return (A | B) & -(A | B);
366fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands}
367fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands
368d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
369d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
37054ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner#endif
371