00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00027 #include "common.h"
00028 #include "integer.h"
00029
00030 AVInteger av_add_i(AVInteger a, AVInteger b){
00031 int i, carry=0;
00032
00033 for(i=0; i<AV_INTEGER_SIZE; i++){
00034 carry= (carry>>16) + a.v[i] + b.v[i];
00035 a.v[i]= carry;
00036 }
00037 return a;
00038 }
00039
00040 AVInteger av_sub_i(AVInteger a, AVInteger b){
00041 int i, carry=0;
00042
00043 for(i=0; i<AV_INTEGER_SIZE; i++){
00044 carry= (carry>>16) + a.v[i] - b.v[i];
00045 a.v[i]= carry;
00046 }
00047 return a;
00048 }
00049
00054 int av_log2_i(AVInteger a){
00055 int i;
00056
00057 for(i=AV_INTEGER_SIZE-1; i>=0; i--){
00058 if(a.v[i])
00059 return av_log2_16bit(a.v[i]) + 16*i;
00060 }
00061 return -1;
00062 }
00063
00064 AVInteger av_mul_i(AVInteger a, AVInteger b){
00065 AVInteger out;
00066 int i, j;
00067 int na= (av_log2_i(a)+16) >> 4;
00068 int nb= (av_log2_i(b)+16) >> 4;
00069
00070 memset(&out, 0, sizeof(out));
00071
00072 for(i=0; i<na; i++){
00073 unsigned int carry=0;
00074
00075 if(a.v[i])
00076 for(j=i; j<AV_INTEGER_SIZE && j-i<=nb; j++){
00077 carry= (carry>>16) + out.v[j] + a.v[i]*b.v[j-i];
00078 out.v[j]= carry;
00079 }
00080 }
00081
00082 return out;
00083 }
00084
00088 int av_cmp_i(AVInteger a, AVInteger b){
00089 int i;
00090 int v= (int16_t)a.v[AV_INTEGER_SIZE-1] - (int16_t)b.v[AV_INTEGER_SIZE-1];
00091 if(v) return (v>>16)|1;
00092
00093 for(i=AV_INTEGER_SIZE-2; i>=0; i--){
00094 int v= a.v[i] - b.v[i];
00095 if(v) return (v>>16)|1;
00096 }
00097 return 0;
00098 }
00099
00104 AVInteger av_shr_i(AVInteger a, int s){
00105 AVInteger out;
00106 int i;
00107
00108 for(i=0; i<AV_INTEGER_SIZE; i++){
00109 int index= i + (s>>4);
00110 unsigned int v=0;
00111 if(index+1<AV_INTEGER_SIZE && index+1>=0) v = a.v[index+1]<<16;
00112 if(index <AV_INTEGER_SIZE && index >=0) v+= a.v[index ];
00113 out.v[i]= v >> (s&15);
00114 }
00115 return out;
00116 }
00117
00122 AVInteger av_mod_i(AVInteger *quot, AVInteger a, AVInteger b){
00123 int i= av_log2_i(a) - av_log2_i(b);
00124 AVInteger quot_temp;
00125 if(!quot) quot = "_temp;
00126
00127 assert((int16_t)a[AV_INTEGER_SIZE-1] >= 0 && (int16_t)b[AV_INTEGER_SIZE-1] >= 0);
00128 assert(av_log2(b)>=0);
00129
00130 if(i > 0)
00131 b= av_shr_i(b, -i);
00132
00133 memset(quot, 0, sizeof(AVInteger));
00134
00135 while(i-- >= 0){
00136 *quot= av_shr_i(*quot, -1);
00137 if(av_cmp_i(a, b) >= 0){
00138 a= av_sub_i(a, b);
00139 quot->v[0] += 1;
00140 }
00141 b= av_shr_i(b, 1);
00142 }
00143 return a;
00144 }
00145
00149 AVInteger av_div_i(AVInteger a, AVInteger b){
00150 AVInteger quot;
00151 av_mod_i(", a, b);
00152 return quot;
00153 }
00154
00158 AVInteger av_int2i(int64_t a){
00159 AVInteger out;
00160 int i;
00161
00162 for(i=0; i<AV_INTEGER_SIZE; i++){
00163 out.v[i]= a;
00164 a>>=16;
00165 }
00166 return out;
00167 }
00168
00174 int64_t av_i2int(AVInteger a){
00175 int i;
00176 int64_t out=(int8_t)a.v[AV_INTEGER_SIZE-1];
00177
00178 for(i= AV_INTEGER_SIZE-2; i>=0; i--){
00179 out = (out<<16) + a.v[i];
00180 }
00181 return out;
00182 }
00183
00184 #if 0
00185 #undef NDEBUG
00186 #include <assert.h>
00187
00188 const uint8_t ff_log2_tab[256]={
00189 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
00190 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
00191 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
00192 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
00193 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00194 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00195 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00196 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
00197 };
00198
00199 main(){
00200 int64_t a,b;
00201
00202 for(a=7; a<256*256*256; a+=13215){
00203 for(b=3; b<256*256*256; b+=27118){
00204 AVInteger ai= av_int2i(a);
00205 AVInteger bi= av_int2i(b);
00206
00207 assert(av_i2int(ai) == a);
00208 assert(av_i2int(bi) == b);
00209 assert(av_i2int(av_add_i(ai,bi)) == a+b);
00210 assert(av_i2int(av_sub_i(ai,bi)) == a-b);
00211 assert(av_i2int(av_mul_i(ai,bi)) == a*b);
00212 assert(av_i2int(av_shr_i(ai, 9)) == a>>9);
00213 assert(av_i2int(av_shr_i(ai,-9)) == a<<9);
00214 assert(av_i2int(av_shr_i(ai, 17)) == a>>17);
00215 assert(av_i2int(av_shr_i(ai,-17)) == a<<17);
00216 assert(av_log2_i(ai) == av_log2(a));
00217 assert(av_i2int(av_div_i(ai,bi)) == a/b);
00218 }
00219 }
00220 }
00221 #endif