00001
00002
00003
00004
00005
00006
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
00018
00019
00020
00021 namespace klee {
00022 namespace ints {
00023
00024
00025 inline uint64_t add(uint64_t l, uint64_t r, unsigned inWidth) {
00026 return bits64::truncateToNBits(l + r, inWidth);
00027 }
00028
00029
00030 inline uint64_t sub(uint64_t l, uint64_t r, unsigned inWidth) {
00031 return bits64::truncateToNBits(l - r, inWidth);
00032 }
00033
00034
00035 inline uint64_t mul(uint64_t l, uint64_t r, unsigned inWidth) {
00036 return bits64::truncateToNBits(l * r, inWidth);
00037 }
00038
00039
00040 inline uint64_t trunc(uint64_t l, unsigned outWidth, unsigned inWidth) {
00041 return bits64::truncateToNBits(l, outWidth);
00042 }
00043
00044
00045 inline uint64_t zext(uint64_t l, unsigned outWidth, unsigned inWidth) {
00046 return l;
00047 }
00048
00049
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
00056 inline uint64_t udiv(uint64_t l, uint64_t r, unsigned inWidth) {
00057 return bits64::truncateToNBits(l / r, inWidth);
00058 }
00059
00060
00061 inline uint64_t urem(uint64_t l, uint64_t r, unsigned inWidth) {
00062 return bits64::truncateToNBits(l % r, inWidth);
00063 }
00064
00065
00066 inline uint64_t sdiv(uint64_t l, uint64_t r, unsigned inWidth) {
00067
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
00074 inline uint64_t srem(uint64_t l, uint64_t r, unsigned inWidth) {
00075
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
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
00088 inline uint64_t lshr(uint64_t l, uint64_t shift, unsigned inWidth) {
00089 return l >> shift;
00090 }
00091
00092
00093 inline uint64_t shl(uint64_t l, uint64_t shift, unsigned inWidth) {
00094 return bits64::truncateToNBits(l << shift, inWidth);
00095 }
00096
00097
00098 inline uint64_t land(uint64_t l, uint64_t r, unsigned inWidth) {
00099 return l & r;
00100 }
00101
00102
00103 inline uint64_t lor(uint64_t l, uint64_t r, unsigned inWidth) {
00104 return l | r;
00105 }
00106
00107
00108 inline uint64_t lxor(uint64_t l, uint64_t r, unsigned inWidth) {
00109 return l ^ r;
00110 }
00111
00112
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 }
00162 }
00163
00164 #endif