MathExtras.h revision bb92f6fbf2c36b3530f33eb2e8d1842764ec9fdd
148486893f46d2e12e926682a3ecb908716bc66c4Chris Lattner//===-- Support/MathExtras.h - Useful math functions ------------*- C++ -*-===//
2b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//
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.
7b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//
8b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//===----------------------------------------------------------------------===//
954ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner//
1054ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner// This file contains some functions that are useful for math stuff.
1154ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner//
1254ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner//===----------------------------------------------------------------------===//
13cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
14a9f6e4ae0eaea69949755807b7207177f256eaceBrian Gaeke#ifndef SUPPORT_MATHEXTRAS_H
15a9f6e4ae0eaea69949755807b7207177f256eaceBrian Gaeke#define SUPPORT_MATHEXTRAS_H
16cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
174a63b72df95b5c0d4af064cef19377f811ba6060Chris Lattner#include "Support/DataTypes.h"
18cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
19d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
20d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
21bb92f6fbf2c36b3530f33eb2e8d1842764ec9fddBrian Gaeke#if defined(log2)
22bb92f6fbf2c36b3530f33eb2e8d1842764ec9fddBrian Gaeke# undef log2
23bb92f6fbf2c36b3530f33eb2e8d1842764ec9fddBrian Gaeke#endif
24bb92f6fbf2c36b3530f33eb2e8d1842764ec9fddBrian Gaeke
2554ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattnerinline unsigned log2(uint64_t C) {
26bcfa423e3d1a2a385b56e3ec0f03137f0c33efc7Vikram S. Adve  unsigned getPow;
2754ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner  for (getPow = 0; C > 1; ++getPow)
2854ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner    C >>= 1;
29bcfa423e3d1a2a385b56e3ec0f03137f0c33efc7Vikram S. Adve  return getPow;
30bcfa423e3d1a2a385b56e3ec0f03137f0c33efc7Vikram S. Adve}
31cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
3254ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattnerinline bool isPowerOf2(int64_t C, unsigned &getPow) {
3354ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner  if (C < 0) C = -C;
3454ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner  if (C > 0 && C == (C & ~(C - 1))) {
358b70b78ba489b090d9866e6a4084ab1e8613b527Chris Lattner    getPow = log2(static_cast<uint64_t>(C));
3654ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner    return true;
3754ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner  }
3854ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner
3954ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner  return false;
40cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}
41cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
42d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
43d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
4454ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner#endif
45