SASC
DVBSoftCAM

parallel_128_16char.h

Go to the documentation of this file.
00001 /* FFdecsa -- fast decsa algorithm
00002  *
00003  * Copyright (C) 2003-2004  fatih89r
00004  *
00005  * This program is free software; you can redistribute it and/or modify
00006  * it under the terms of the GNU General Public License as published by
00007  * the Free Software Foundation; either version 2 of the License, or
00008  * (at your option) any later version.
00009  *
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  * GNU General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public License
00016  * along with this program; if not, write to the Free Software
00017  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00018  */
00019 
00020 
00021 struct group_t{
00022   unsigned char s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16;
00023 };
00024 typedef struct group_t group;
00025 
00026 #define GROUP_PARALLELISM 128
00027 
00028 group static inline FF0(){
00029   group res;
00030   res.s1=0x0;
00031   res.s2=0x0;
00032   res.s3=0x0;
00033   res.s4=0x0;
00034   res.s5=0x0;
00035   res.s6=0x0;
00036   res.s7=0x0;
00037   res.s8=0x0;
00038   res.s9=0x0;
00039   res.s10=0x0;
00040   res.s11=0x0;
00041   res.s12=0x0;
00042   res.s13=0x0;
00043   res.s14=0x0;
00044   res.s15=0x0;
00045   res.s16=0x0;
00046   return res;
00047 }
00048 
00049 group static inline FF1(){
00050   group res;
00051   res.s1=0xff;
00052   res.s2=0xff;
00053   res.s3=0xff;
00054   res.s4=0xff;
00055   res.s5=0xff;
00056   res.s6=0xff;
00057   res.s7=0xff;
00058   res.s8=0xff;
00059   res.s9=0xff;
00060   res.s10=0xff;
00061   res.s11=0xff;
00062   res.s12=0xff;
00063   res.s13=0xff;
00064   res.s14=0xff;
00065   res.s15=0xff;
00066   res.s16=0xff;
00067   return res;
00068 }
00069 
00070 group static inline FFAND(group a,group b){
00071   group res;
00072   res.s1=a.s1&b.s1;
00073   res.s2=a.s2&b.s2;
00074   res.s3=a.s3&b.s3;
00075   res.s4=a.s4&b.s4;
00076   res.s5=a.s5&b.s5;
00077   res.s6=a.s6&b.s6;
00078   res.s7=a.s7&b.s7;
00079   res.s8=a.s8&b.s8;
00080   res.s9=a.s9&b.s9;
00081   res.s10=a.s10&b.s10;
00082   res.s11=a.s11&b.s11;
00083   res.s12=a.s12&b.s12;
00084   res.s13=a.s13&b.s13;
00085   res.s14=a.s14&b.s14;
00086   res.s15=a.s15&b.s15;
00087   res.s16=a.s16&b.s16;
00088   return res;
00089 }
00090 
00091 group static inline FFOR(group a,group b){
00092   group res;
00093   res.s1=a.s1|b.s1;
00094   res.s2=a.s2|b.s2;
00095   res.s3=a.s3|b.s3;
00096   res.s4=a.s4|b.s4;
00097   res.s5=a.s5|b.s5;
00098   res.s6=a.s6|b.s6;
00099   res.s7=a.s7|b.s7;
00100   res.s8=a.s8|b.s8;
00101   res.s9=a.s9|b.s9;
00102   res.s10=a.s10|b.s10;
00103   res.s11=a.s11|b.s11;
00104   res.s12=a.s12|b.s12;
00105   res.s13=a.s13|b.s13;
00106   res.s14=a.s14|b.s14;
00107   res.s15=a.s15|b.s15;
00108   res.s16=a.s16|b.s16;
00109   return res;
00110 }
00111 
00112 group static inline FFXOR(group a,group b){
00113   group res;
00114   res.s1=a.s1^b.s1;
00115   res.s2=a.s2^b.s2;
00116   res.s3=a.s3^b.s3;
00117   res.s4=a.s4^b.s4;
00118   res.s5=a.s5^b.s5;
00119   res.s6=a.s6^b.s6;
00120   res.s7=a.s7^b.s7;
00121   res.s8=a.s8^b.s8;
00122   res.s9=a.s9^b.s9;
00123   res.s10=a.s10^b.s10;
00124   res.s11=a.s11^b.s11;
00125   res.s12=a.s12^b.s12;
00126   res.s13=a.s13^b.s13;
00127   res.s14=a.s14^b.s14;
00128   res.s15=a.s15^b.s15;
00129   res.s16=a.s16^b.s16;
00130   return res;
00131 }
00132 
00133 group static inline FFNOT(group a){
00134   group res;
00135   res.s1=~a.s1;
00136   res.s2=~a.s2;
00137   res.s3=~a.s3;
00138   res.s4=~a.s4;
00139   res.s5=~a.s5;
00140   res.s6=~a.s6;
00141   res.s7=~a.s7;
00142   res.s8=~a.s8;
00143   res.s9=~a.s9;
00144   res.s10=~a.s10;
00145   res.s11=~a.s11;
00146   res.s12=~a.s12;
00147   res.s13=~a.s13;
00148   res.s14=~a.s14;
00149   res.s15=~a.s15;
00150   res.s16=~a.s16;
00151   return res;
00152 }
00153 
00154 
00155 /* 64 rows of 128 bits */
00156 
00157 void static inline FFTABLEIN(unsigned char *tab, int g, unsigned char *data){
00158   *(((int *)tab)+2*g)=*((int *)data);
00159   *(((int *)tab)+2*g+1)=*(((int *)data)+1);
00160 }
00161 
00162 void static inline FFTABLEOUT(unsigned char *data, unsigned char *tab, int g){
00163   *((int *)data)=*(((int *)tab)+2*g);
00164   *(((int *)data)+1)=*(((int *)tab)+2*g+1);
00165 }
00166 
00167 void static inline FFTABLEOUTXORNBY(int n, unsigned char *data, unsigned char *tab, int g){
00168   int j;
00169   for(j=0;j<n;j++){
00170     *(data+j)^=*(tab+8*g+j);
00171   }
00172 }
00173 
00174 
00175 struct batch_t{
00176   unsigned char s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16;
00177 };
00178 typedef struct batch_t batch;
00179 
00180 #define BYTES_PER_BATCH 16
00181 
00182 batch static inline B_FFAND(batch a,batch b){
00183   batch res;
00184   res.s1=a.s1&b.s1;
00185   res.s2=a.s2&b.s2;
00186   res.s3=a.s3&b.s3;
00187   res.s4=a.s4&b.s4;
00188   res.s5=a.s5&b.s5;
00189   res.s6=a.s6&b.s6;
00190   res.s7=a.s7&b.s7;
00191   res.s8=a.s8&b.s8;
00192   res.s9=a.s9&b.s9;
00193   res.s10=a.s10&b.s10;
00194   res.s11=a.s11&b.s11;
00195   res.s12=a.s12&b.s12;
00196   res.s13=a.s13&b.s13;
00197   res.s14=a.s14&b.s14;
00198   res.s15=a.s15&b.s15;
00199   res.s16=a.s16&b.s16;
00200   return res;
00201 }
00202 
00203 batch static inline B_FFOR(batch a,batch b){
00204   batch res;
00205   res.s1=a.s1|b.s1;
00206   res.s2=a.s2|b.s2;
00207   res.s3=a.s3|b.s3;
00208   res.s4=a.s4|b.s4;
00209   res.s5=a.s5|b.s5;
00210   res.s6=a.s6|b.s6;
00211   res.s7=a.s7|b.s7;
00212   res.s8=a.s8|b.s8;
00213   res.s9=a.s9|b.s9;
00214   res.s10=a.s10|b.s10;
00215   res.s11=a.s11|b.s11;
00216   res.s12=a.s12|b.s12;
00217   res.s13=a.s13|b.s13;
00218   res.s14=a.s14|b.s14;
00219   res.s15=a.s15|b.s15;
00220   res.s16=a.s16|b.s16;
00221   return res;
00222 }
00223 
00224 batch static inline B_FFXOR(batch a,batch b){
00225   batch res;
00226   res.s1=a.s1^b.s1;
00227   res.s2=a.s2^b.s2;
00228   res.s3=a.s3^b.s3;
00229   res.s4=a.s4^b.s4;
00230   res.s5=a.s5^b.s5;
00231   res.s6=a.s6^b.s6;
00232   res.s7=a.s7^b.s7;
00233   res.s8=a.s8^b.s8;
00234   res.s9=a.s9^b.s9;
00235   res.s10=a.s10^b.s10;
00236   res.s11=a.s11^b.s11;
00237   res.s12=a.s12^b.s12;
00238   res.s13=a.s13^b.s13;
00239   res.s14=a.s14^b.s14;
00240   res.s15=a.s15^b.s15;
00241   res.s16=a.s16^b.s16;
00242   return res;
00243 }
00244 
00245 
00246 batch static inline B_FFN_ALL_29(){
00247   batch res;
00248   res.s1=0x29;
00249   res.s2=0x29;
00250   res.s3=0x29;
00251   res.s4=0x29;
00252   res.s5=0x29;
00253   res.s6=0x29;
00254   res.s7=0x29;
00255   res.s8=0x29;
00256   res.s9=0x29;
00257   res.s10=0x29;
00258   res.s11=0x29;
00259   res.s12=0x29;
00260   res.s13=0x29;
00261   res.s14=0x29;
00262   res.s15=0x29;
00263   res.s16=0x29;
00264   return res;
00265 }
00266 batch static inline B_FFN_ALL_02(){
00267   batch res;
00268   res.s1=0x02;
00269   res.s2=0x02;
00270   res.s3=0x02;
00271   res.s4=0x02;
00272   res.s5=0x02;
00273   res.s6=0x02;
00274   res.s7=0x02;
00275   res.s8=0x02;
00276   res.s9=0x02;
00277   res.s10=0x02;
00278   res.s11=0x02;
00279   res.s12=0x02;
00280   res.s13=0x02;
00281   res.s14=0x02;
00282   res.s15=0x02;
00283   res.s16=0x02;
00284   return res;
00285 }
00286 batch static inline B_FFN_ALL_04(){
00287   batch res;
00288   res.s1=0x04;
00289   res.s2=0x04;
00290   res.s3=0x04;
00291   res.s4=0x04;
00292   res.s5=0x04;
00293   res.s6=0x04;
00294   res.s7=0x04;
00295   res.s8=0x04;
00296   res.s9=0x04;
00297   res.s10=0x04;
00298   res.s11=0x04;
00299   res.s12=0x04;
00300   res.s13=0x04;
00301   res.s14=0x04;
00302   res.s15=0x04;
00303   res.s16=0x04;
00304   return res;
00305 }
00306 batch static inline B_FFN_ALL_10(){
00307   batch res;
00308   res.s1=0x10;
00309   res.s2=0x10;
00310   res.s3=0x10;
00311   res.s4=0x10;
00312   res.s5=0x10;
00313   res.s6=0x10;
00314   res.s7=0x10;
00315   res.s8=0x10;
00316   res.s9=0x10;
00317   res.s10=0x10;
00318   res.s11=0x10;
00319   res.s12=0x10;
00320   res.s13=0x10;
00321   res.s14=0x10;
00322   res.s15=0x10;
00323   res.s16=0x10;
00324   return res;
00325 }
00326 batch static inline B_FFN_ALL_40(){
00327   batch res;
00328   res.s1=0x40;
00329   res.s2=0x40;
00330   res.s3=0x40;
00331   res.s4=0x40;
00332   res.s5=0x40;
00333   res.s6=0x40;
00334   res.s7=0x40;
00335   res.s8=0x40;
00336   res.s9=0x40;
00337   res.s10=0x40;
00338   res.s11=0x40;
00339   res.s12=0x40;
00340   res.s13=0x40;
00341   res.s14=0x40;
00342   res.s15=0x40;
00343   res.s16=0x40;
00344   return res;
00345 }
00346 batch static inline B_FFN_ALL_80(){
00347   batch res;
00348   res.s1=0x80;
00349   res.s2=0x80;
00350   res.s3=0x80;
00351   res.s4=0x80;
00352   res.s5=0x80;
00353   res.s6=0x80;
00354   res.s7=0x80;
00355   res.s8=0x80;
00356   res.s9=0x80;
00357   res.s10=0x80;
00358   res.s11=0x80;
00359   res.s12=0x80;
00360   res.s13=0x80;
00361   res.s14=0x80;
00362   res.s15=0x80;
00363   res.s16=0x80;
00364   return res;
00365 }
00366 
00367 batch static inline B_FFSH8L(batch a,int n){
00368   batch res;
00369   res.s1=a.s1<<n;
00370   res.s2=a.s2<<n;
00371   res.s3=a.s3<<n;
00372   res.s4=a.s4<<n;
00373   res.s5=a.s5<<n;
00374   res.s6=a.s6<<n;
00375   res.s7=a.s7<<n;
00376   res.s8=a.s8<<n;
00377   res.s9=a.s9<<n;
00378   res.s10=a.s10<<n;
00379   res.s11=a.s11<<n;
00380   res.s12=a.s12<<n;
00381   res.s13=a.s13<<n;
00382   res.s14=a.s14<<n;
00383   res.s15=a.s15<<n;
00384   res.s16=a.s16<<n;
00385   return res;
00386 }
00387 
00388 batch static inline B_FFSH8R(batch a,int n){
00389   batch res;
00390   res.s1=a.s1>>n;
00391   res.s2=a.s2>>n;
00392   res.s3=a.s3>>n;
00393   res.s4=a.s4>>n;
00394   res.s5=a.s5>>n;
00395   res.s6=a.s6>>n;
00396   res.s7=a.s7>>n;
00397   res.s8=a.s8>>n;
00398   res.s9=a.s9>>n;
00399   res.s10=a.s10>>n;
00400   res.s11=a.s11>>n;
00401   res.s12=a.s12>>n;
00402   res.s13=a.s13>>n;
00403   res.s14=a.s14>>n;
00404   res.s15=a.s15>>n;
00405   res.s16=a.s16>>n;
00406   return res;
00407 }
00408 
00409 
00410 void static inline M_EMPTY(void){
00411 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines