00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00028 #include "common.h"
00029 #include "integer.h"
00030 #include "avassert.h"
00031
00032 AVInteger av_add_i(AVInteger a, AVInteger b){
00033 int i, carry=0;
00034
00035 for(i=0; i<AV_INTEGER_SIZE; i++){
00036 carry= (carry>>16) + a.v[i] + b.v[i];
00037 a.v[i]= carry;
00038 }
00039 return a;
00040 }
00041
00042 AVInteger av_sub_i(AVInteger a, AVInteger b){
00043 int i, carry=0;
00044
00045 for(i=0; i<AV_INTEGER_SIZE; i++){
00046 carry= (carry>>16) + a.v[i] - b.v[i];
00047 a.v[i]= carry;
00048 }
00049 return a;
00050 }
00051
00052 int av_log2_i(AVInteger a){
00053 int i;
00054
00055 for(i=AV_INTEGER_SIZE-1; i>=0; i--){
00056 if(a.v[i])
00057 return av_log2_16bit(a.v[i]) + 16*i;
00058 }
00059 return -1;
00060 }
00061
00062 AVInteger av_mul_i(AVInteger a, AVInteger b){
00063 AVInteger out;
00064 int i, j;
00065 int na= (av_log2_i(a)+16) >> 4;
00066 int nb= (av_log2_i(b)+16) >> 4;
00067
00068 memset(&out, 0, sizeof(out));
00069
00070 for(i=0; i<na; i++){
00071 unsigned int carry=0;
00072
00073 if(a.v[i])
00074 for(j=i; j<AV_INTEGER_SIZE && j-i<=nb; j++){
00075 carry= (carry>>16) + out.v[j] + a.v[i]*b.v[j-i];
00076 out.v[j]= carry;
00077 }
00078 }
00079
00080 return out;
00081 }
00082
00083 int av_cmp_i(AVInteger a, AVInteger b){
00084 int i;
00085 int v= (int16_t)a.v[AV_INTEGER_SIZE-1] - (int16_t)b.v[AV_INTEGER_SIZE-1];
00086 if(v) return (v>>16)|1;
00087
00088 for(i=AV_INTEGER_SIZE-2; i>=0; i--){
00089 int v= a.v[i] - b.v[i];
00090 if(v) return (v>>16)|1;
00091 }
00092 return 0;
00093 }
00094
00095 AVInteger av_shr_i(AVInteger a, int s){
00096 AVInteger out;
00097 int i;
00098
00099 for(i=0; i<AV_INTEGER_SIZE; i++){
00100 unsigned int index= i + (s>>4);
00101 unsigned int v=0;
00102 if(index+1<AV_INTEGER_SIZE) v = a.v[index+1]<<16;
00103 if(index <AV_INTEGER_SIZE) v+= a.v[index ];
00104 out.v[i]= v >> (s&15);
00105 }
00106 return out;
00107 }
00108
00109 AVInteger av_mod_i(AVInteger *quot, AVInteger a, AVInteger b){
00110 int i= av_log2_i(a) - av_log2_i(b);
00111 AVInteger quot_temp;
00112 if(!quot) quot = "_temp;
00113
00114 av_assert2((int16_t)a.v[AV_INTEGER_SIZE-1] >= 0 && (int16_t)b.v[AV_INTEGER_SIZE-1] >= 0);
00115 av_assert2(av_log2_i(b)>=0);
00116
00117 if(i > 0)
00118 b= av_shr_i(b, -i);
00119
00120 memset(quot, 0, sizeof(AVInteger));
00121
00122 while(i-- >= 0){
00123 *quot= av_shr_i(*quot, -1);
00124 if(av_cmp_i(a, b) >= 0){
00125 a= av_sub_i(a, b);
00126 quot->v[0] += 1;
00127 }
00128 b= av_shr_i(b, 1);
00129 }
00130 return a;
00131 }
00132
00133 AVInteger av_div_i(AVInteger a, AVInteger b){
00134 AVInteger quot;
00135 av_mod_i(", a, b);
00136 return quot;
00137 }
00138
00139 AVInteger av_int2i(int64_t a){
00140 AVInteger out;
00141 int i;
00142
00143 for(i=0; i<AV_INTEGER_SIZE; i++){
00144 out.v[i]= a;
00145 a>>=16;
00146 }
00147 return out;
00148 }
00149
00150 int64_t av_i2int(AVInteger a){
00151 int i;
00152 int64_t out=(int8_t)a.v[AV_INTEGER_SIZE-1];
00153
00154 for(i= AV_INTEGER_SIZE-2; i>=0; i--){
00155 out = (out<<16) + a.v[i];
00156 }
00157 return out;
00158 }
00159
00160 #ifdef TEST
00161
00162 const uint8_t ff_log2_tab[256]={
00163 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,
00164 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,
00165 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,
00166 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,
00167 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,
00168 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,
00169 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,
00170 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
00171 };
00172
00173 int main(void){
00174 int64_t a,b;
00175
00176 for(a=7; a<256*256*256; a+=13215){
00177 for(b=3; b<256*256*256; b+=27118){
00178 AVInteger ai= av_int2i(a);
00179 AVInteger bi= av_int2i(b);
00180
00181 av_assert0(av_i2int(ai) == a);
00182 av_assert0(av_i2int(bi) == b);
00183 av_assert0(av_i2int(av_add_i(ai,bi)) == a+b);
00184 av_assert0(av_i2int(av_sub_i(ai,bi)) == a-b);
00185 av_assert0(av_i2int(av_mul_i(ai,bi)) == a*b);
00186 av_assert0(av_i2int(av_shr_i(ai, 9)) == a>>9);
00187 av_assert0(av_i2int(av_shr_i(ai,-9)) == a<<9);
00188 av_assert0(av_i2int(av_shr_i(ai, 17)) == a>>17);
00189 av_assert0(av_i2int(av_shr_i(ai,-17)) == a<<17);
00190 av_assert0(av_log2_i(ai) == av_log2(a));
00191 av_assert0(av_i2int(av_div_i(ai,bi)) == a/b);
00192 }
00193 }
00194 return 0;
00195 }
00196 #endif