IntEvaluation.h

Go to the documentation of this file.
00001 //===-- IntEvaluation.h -----------------------------------------*- C++ -*-===//
00002 //
00003 //                     The KLEE Symbolic Virtual Machine
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 
00010 #ifndef KLEE_UTIL_INTEVALUATION_H
00011 #define KLEE_UTIL_INTEVALUATION_H
00012 
00013 #include "klee/util/Bits.h"
00014 
00015 #define MAX_BITS (sizeof(uint64_t) * 8)
00016 
00017 // ASSUMPTION: invalid bits in each uint64_t are 0. the trade-off here is
00018 // between making trunc/zext/sext fast and making operations that depend
00019 // on the invalid bits being 0 fast. 
00020 
00021 namespace klee {
00022 namespace ints {
00023 
00024 // add of l and r
00025 inline uint64_t add(uint64_t l, uint64_t r, unsigned inWidth) {
00026   return bits64::truncateToNBits(l + r, inWidth);
00027 }
00028 
00029 // difference of l and r
00030 inline uint64_t sub(uint64_t l, uint64_t r, unsigned inWidth) {
00031   return bits64::truncateToNBits(l - r, inWidth);
00032 }
00033 
00034 // product of l and r
00035 inline uint64_t mul(uint64_t l, uint64_t r, unsigned inWidth) {
00036   return bits64::truncateToNBits(l * r, inWidth);
00037 }
00038 
00039 // truncation of l to outWidth bits
00040 inline uint64_t trunc(uint64_t l, unsigned outWidth, unsigned inWidth) {
00041   return bits64::truncateToNBits(l, outWidth);
00042 }
00043 
00044 // zero-extension of l from inWidth to outWidth bits
00045 inline uint64_t zext(uint64_t l, unsigned outWidth, unsigned inWidth) {
00046   return l;
00047 }
00048 
00049 // sign-extension of l from inWidth to outWidth bits
00050 inline uint64_t sext(uint64_t l, unsigned outWidth, unsigned inWidth) {
00051   uint32_t numInvalidBits = MAX_BITS - inWidth;
00052   return bits64::truncateToNBits(((int64_t)(l << numInvalidBits)) >> numInvalidBits, outWidth);
00053 }
00054 
00055 // unsigned divide of l by r
00056 inline uint64_t udiv(uint64_t l, uint64_t r, unsigned inWidth) {
00057   return bits64::truncateToNBits(l / r, inWidth);
00058 }
00059 
00060 // unsigned mod of l by r
00061 inline uint64_t urem(uint64_t l, uint64_t r, unsigned inWidth) {
00062   return bits64::truncateToNBits(l % r, inWidth);
00063 }
00064 
00065 // signed divide of l by r
00066 inline uint64_t sdiv(uint64_t l, uint64_t r, unsigned inWidth) {
00067   // sign extend operands so that signed operation on 64-bits works correctly
00068   int64_t sl = sext(l, MAX_BITS, inWidth);
00069   int64_t sr = sext(r, MAX_BITS, inWidth);
00070   return bits64::truncateToNBits(sl / sr, inWidth);
00071 }
00072 
00073 // signed mod of l by r
00074 inline uint64_t srem(uint64_t l, uint64_t r, unsigned inWidth) {
00075   // sign extend operands so that signed operation on 64-bits works correctly
00076   int64_t sl = sext(l, MAX_BITS, inWidth);
00077   int64_t sr = sext(r, MAX_BITS, inWidth);
00078   return bits64::truncateToNBits(sl % sr, inWidth);
00079 }
00080 
00081 // arithmetic shift right of l by r bits
00082 inline uint64_t ashr(uint64_t l, uint64_t shift, unsigned inWidth) {
00083   int64_t sl = sext(l, MAX_BITS, inWidth);
00084   return bits64::truncateToNBits(sl >> shift, inWidth);
00085 }
00086 
00087 // logical shift right of l by r bits
00088 inline uint64_t lshr(uint64_t l, uint64_t shift, unsigned inWidth) {
00089   return l >> shift;
00090 }
00091 
00092 // shift left of l by r bits
00093 inline uint64_t shl(uint64_t l, uint64_t shift, unsigned inWidth) {
00094   return bits64::truncateToNBits(l << shift, inWidth);
00095 }
00096 
00097 // logical AND of l and r
00098 inline uint64_t land(uint64_t l, uint64_t r, unsigned inWidth) {
00099   return l & r;
00100 }
00101 
00102 // logical OR of l and r
00103 inline uint64_t lor(uint64_t l, uint64_t r, unsigned inWidth) {
00104   return l | r;
00105 }
00106 
00107 // logical XOR of l and r
00108 inline uint64_t lxor(uint64_t l, uint64_t r, unsigned inWidth) {
00109   return l ^ r;
00110 }
00111 
00112 // comparison operations
00113 inline uint64_t eq(uint64_t l, uint64_t r, unsigned inWidth) {
00114   return l == r;
00115 }
00116 
00117 inline uint64_t ne(uint64_t l, uint64_t r, unsigned inWidth) {
00118   return l != r;
00119 }
00120 
00121 inline uint64_t ult(uint64_t l, uint64_t r, unsigned inWidth) {
00122   return l < r;
00123 }
00124 
00125 inline uint64_t ule(uint64_t l, uint64_t r, unsigned inWidth) {
00126   return l <= r;
00127 }
00128 
00129 inline uint64_t ugt(uint64_t l, uint64_t r, unsigned inWidth) {
00130   return l > r;
00131 }
00132 
00133 inline uint64_t uge(uint64_t l, uint64_t r, unsigned inWidth) {
00134   return l >= r;
00135 }
00136 
00137 inline uint64_t slt(uint64_t l, uint64_t r, unsigned inWidth) {
00138   int64_t sl = sext(l, MAX_BITS, inWidth);
00139   int64_t sr = sext(r, MAX_BITS, inWidth);
00140   return sl < sr;
00141 }
00142 
00143 inline uint64_t sle(uint64_t l, uint64_t r, unsigned inWidth) {
00144   int64_t sl = sext(l, MAX_BITS, inWidth);
00145   int64_t sr = sext(r, MAX_BITS, inWidth);
00146   return sl <= sr;
00147 }
00148 
00149 inline uint64_t sgt(uint64_t l, uint64_t r, unsigned inWidth) {
00150   int64_t sl = sext(l, MAX_BITS, inWidth);
00151   int64_t sr = sext(r, MAX_BITS, inWidth);
00152   return sl > sr;
00153 }
00154 
00155 inline uint64_t sge(uint64_t l, uint64_t r, unsigned inWidth) {
00156   int64_t sl = sext(l, MAX_BITS, inWidth);
00157   int64_t sr = sext(r, MAX_BITS, inWidth);
00158   return sl >= sr;
00159 }
00160 
00161 } // end namespace ints
00162 } // end namespace klee
00163 
00164 #endif 

Generated on Fri Jun 5 03:31:31 2009 for klee by  doxygen 1.5.8