00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef INTU
00022 #define INTU
00023 #include <spuc.h>
00024 #include <math.h>
00025 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00026 namespace SPUC {
00029
00033 class int_u
00034 {
00035 typedef long natural;
00036
00037 public:
00038 natural q;
00039 natural mask;
00040 natural bits;
00041 natural bitpos;
00042 bool oveflow;
00043
00044
00045
00046 int_u() {
00047 q = 0;
00048 bits = 32;
00049 mask = 0;
00050 bitpos=0;
00051 }
00052 int_u(natural y) {
00053 q = y;
00054 bits = 32;
00055 mask = 0;
00056 bitpos=0;
00057 }
00058
00059 public:
00060 inline int_u operator =(const int_u& y) {
00061 q = ~mask & y.q;
00062 return *this;
00063 }
00064 inline int_u operator =(const natural& y) {
00065 q = ~mask & y;
00066 return *this;
00067 }
00068
00069 friend int_u operator %(int_u r, int_u l);
00070 friend int_u operator %(int_u r, natural l);
00071 friend int_u operator %(natural r, int_u l);
00072 friend int_u operator +(int_u r, int_u l);
00073 friend int_u operator +(int_u r, natural l);
00074 friend int_u operator +(natural r, int_u l);
00075 friend int_u operator -(int_u r, int_u l);
00076 friend int_u operator -(int_u r, natural l);
00077 friend int_u operator -(natural r, int_u l);
00078 friend int_u operator &(int_u r, int_u l);
00079 friend int_u operator &(int_u r, natural l);
00080 friend int_u operator &(natural r, int_u l);
00081 friend int_u operator ^(int_u r, int_u l);
00082 friend int_u operator ^(int_u r, natural l);
00083 friend int_u operator ^(natural r, int_u l);
00084 friend int_u operator |(int_u r, int_u l);
00085 friend int_u operator |(int_u r, natural l);
00086 friend int_u operator |(natural r, int_u l);
00087 friend int_u operator *(int_u r, int_u l);
00088 friend int_u operator *(int_u r, natural l);
00089 friend int_u operator *(natural r, int_u l);
00090 friend int_u operator /(int_u r, int_u l);
00091 friend int_u operator /(natural r, int_u l);
00092 friend int_u operator /(int_u r, natural l);
00093 friend int_u operator <<(int_u r, const natural shift) ;
00094 friend int_u operator >>(int_u r, const natural shift) ;
00095
00096 int_u operator ++() {
00097 q++;
00098 q &= ~mask;
00099 return *this;
00100 };
00101 int_u operator ++(int) {
00102 q++;
00103 q &= ~mask;
00104 return *this;
00105 };
00106 int_u operator --() {
00107 q--;
00108 q &= ~mask;
00109 return *this;
00110 };
00111 int_u operator --(int) {
00112 q--;
00113 q &= ~mask;
00114 return *this;
00115 };
00116 int_u operator +=(int_u r) {
00117 q += r.q;
00118 q &= ~mask;
00119 return *this;
00120 };
00121
00122 int_u operator -=(int_u r){
00123 q -= r.q;
00124 q &= ~mask;
00125
00126 return *this;
00127 };
00128 int_u operator *=(int_u r) {
00129 q *= r.q;
00130 q &= ~mask;
00131 return *this;
00132 };
00133 int_u operator /=(int_u r){
00134 if (r.q != 0) q = q/r.q;
00135 else q = 0;
00136 return *this;
00137 };
00138
00139 int_u operator <<=(const natural shift) {
00140 q = q << shift;
00141 q &= ~mask;
00142 return *this;
00143 };
00144 int_u operator >>=(const natural shift) {
00145 q = q >> shift;
00146 return *this;
00147 }
00148
00149 int_u operator ^=(int_u r) {
00150 q ^= r.q;
00151 q &= ~mask;
00152 return *this;
00153 };
00154 int_u operator &=(int_u r) {
00155 q &= r.q;
00156 q &= ~mask;
00157 return *this;
00158 };
00159 int_u operator |=(int_u r) {
00160 q |= r.q;
00161 q &= ~mask;
00162 return *this;
00163 };
00164
00165 inline natural operator ~() {return(~q);}
00166 inline bool operator !() {return(!q);}
00167 inline bool operator ==(int_u r) { return ((q == r.q)); };
00168 inline bool operator ==(natural r) { return ((q == r)); };
00169 inline bool operator !=(int_u r) { return ((q != r.q)); };
00170 inline bool operator !=(natural r) { return ((q != r)); };
00171 inline bool operator >(int_u r) { return ((q > r.q)); };
00172 inline bool operator >(natural r) { return ((q > r)); };
00173 inline bool operator <(int_u r) { return ((q < r.q)); };
00174 inline bool operator <(natural r) { return ((q < r)); };
00175 inline int_u magsq(int_u y) {
00176 int_u x;
00177 x.q = y.q*y.q;
00178 x.mask = -1 << (y.bits * 2);
00179 return(x);
00180 };
00181
00182 operator const natural () const { return(q); }
00183 operator const double () const { return((double)q); }
00185 int_u round(int_u in, natural rbits) {
00186 double scale = 1.0/(double)MASK_BIT(rbits);
00187 return(int_u((natural)floor((double)(scale*in.q)+0.5)));
00188 };
00189
00191 int_u saturate(int_u in, natural rbits) {
00192 int_u out;
00193 natural low_mask = MASK_LOW(rbits);
00194 if (in.q > low_mask) out.q = low_mask;
00195 else out.q = in.q;
00196 out.mask = ~low_mask;
00197 return(out);
00198 }
00200 int_u clip(int_u in, int_u min_clp, int_u max_clp) {
00201 int_u out = CLIP(in, max_clp, min_clp);
00202 return out;
00203 }
00205 inline bool bit(natural i) { return (q & MASK_BIT(i)) ? 1 : 0; }
00206
00207 bool or_bits(int_u r) {
00208 natural x=r.q;
00209 bool s=0;
00210 for (int i=0;i<bits;i++) {
00211 s |= x & 0x1;
00212 x >>= 1;
00213 }
00214 return(s);
00215 }
00216 };
00217 int_u operator %(int_u r, int_u l) {
00218 int_u x;
00219 x.q = r.q % l.q;
00220 return(x);
00221 }
00222 int_u operator %(int_u r, natural l) {
00223 int_u x;
00224 x.q = r.q % l;
00225 return(x);
00226 }
00227 int_u operator %(natural r, int_u l) {
00228 int_u x;
00229 x.q = r % l.q;
00230 return(x);
00231 }
00232 int_u operator +(int_u r, int_u l) {
00233 int_u x;
00234 x.q = r.q + l.q;
00235 return(x);
00236 }
00237 int_u operator +(int_u r, natural l) {
00238 int_u x;
00239 x.q = r.q + l;
00240 return(x);
00241 }
00242 int_u operator +(natural r, int_u l) {
00243 int_u x;
00244 x.q = r + l.q;
00245 return(x);
00246 }
00247 int_u operator -(int_u r, int_u l) {
00248 int_u x;
00249 x.q = r.q - l.q;
00250 return(x);
00251 }
00252 int_u operator -(int_u r, natural l) {
00253 int_u x;
00254 x.q = r.q - l;
00255 return(x);
00256 }
00257 int_u operator -(natural r, int_u l) {
00258 int_u x;
00259 x.q = r - l.q;
00260 return(x);
00261 }
00262 int_u operator &(int_u r, int_u l) {
00263 int_u x;
00264 x.q = r.q & l.q;
00265 return(x);
00266 }
00267 int_u operator &(int_u r, natural l) {
00268 int_u x;
00269 x.q = r.q & l;
00270 return(x);
00271 }
00272 int_u operator &(natural r, int_u l) {
00273 int_u x;
00274 x.q = r & l.q;
00275 return(x);
00276 }
00277 int_u operator ^(int_u r, int_u l) {
00278 int_u x;
00279 x.q = r.q ^ l.q;
00280 return(x);
00281 }
00282 int_u operator ^(int_u r, natural l) {
00283 int_u x;
00284 x.q = r.q ^ l;
00285 return(x);
00286 }
00287 int_u operator ^(natural r, int_u l) {
00288 int_u x;
00289 x.q = r ^ l.q;
00290 return(x);
00291 }
00292 int_u operator |(int_u r, int_u l) {
00293 int_u x;
00294 x.q = r.q | l.q;
00295 return(x);
00296 }
00297 int_u operator |(int_u r, natural l) {
00298 int_u x;
00299 x.q = r.q | l;
00300 return(x);
00301 }
00302 int_u operator |(natural r, int_u l) {
00303 int_u x;
00304 x.q = r | l.q;
00305 return(x);
00306 }
00307 int_u operator *(int_u r, int_u l) {
00308 int_u x;
00309 x.q = r.q*l.q;
00310 return(x);
00311 };
00312 int_u operator *(int_u r, natural l) {
00313 int_u x;
00314 x.q = r.q*l;
00315 return(x);
00316 };
00317 int_u operator *(natural r, int_u l) {
00318 int_u x;
00319 x.q = r*l.q;
00320 return(x);
00321 };
00322 int_u operator /(int_u r, int_u l) {
00323 int_u x;
00324 x.q = r.q/l.q;
00325 return(x);
00326 };
00327 int_u operator /(natural r, int_u l) {
00328 int_u x;
00329 x.q = r/l.q;
00330 return(x);
00331 };
00332 int_u operator /(int_u r, natural l) {
00333 int_u x;
00334 x.q = r.q/l;
00335 return(x);
00336 };
00337
00338 int_u operator <<(int_u r, const natural shift) {
00339 int_u x;
00340 x.q = r.q << shift;
00341 x.mask = r.mask << shift;
00342 x.bits = r.bits + shift;
00343 return(x);
00344 };
00345 int_u operator >>(int_u r, const natural shift) {
00346 int_u x;
00347 x.q = r.q >> shift;
00348 x.mask = r.mask >> shift;
00349 x.bits = r.bits - shift;
00350 return(x);
00351 };
00352 int_u operator ,(int_u r, int_u l) {
00353 int_u x;
00354 x.q = (r.q << l.bits) | l.q;
00355 return(x);
00356 }
00357 }
00358 #endif
00359 #endif