lib/include/CryptoPrimitives.h

Go to the documentation of this file.
00001 /*
00002   This file provides fast bit shift operations for ATMEL chip
00003 */
00004 
00012 /*                                                                      
00013  * "Copyright (c) 2000-2002 The Regents of the University  of California.  
00014  * All rights reserved.
00015  *
00016  * Permission to use, copy, modify, and distribute this software and its
00017  * documentation for any purpose, without fee, and without written agreement is
00018  * hereby granted, provided that the above copyright notice, the following
00019  * two paragraphs and the author appear in all copies of this software.
00020  * 
00021  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
00022  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
00023  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
00024  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00025  * 
00026  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
00027  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
00028  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
00029  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
00030  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
00031  *
00032  * Authors: Naveen Sastry
00033  * Date:    10/24/02
00034  */
00035 
00036 // Look at the movw instruction to shave a few more cycles.
00037 // [probably only for the atmel 128's]
00038 
00044 #define rol32(a, n) ({                                  \
00045         unsigned long num = (unsigned long)(a);         \
00046         unsigned char nsh = (unsigned char)(n);         \
00047         __asm__ __volatile__ (                          \
00048                 "dec %0" "\n\t"                         \
00049                 "brmi L_%=" "\n\t"                      \
00050         "L1_%=:" "\n\t"                                 \
00051                 "clc" "\n\t"                            \
00052                 "sbrc %D1, 7" "\n\t"                    \
00053                 "sec" "\n\t"                            \
00054                 "rol %A1" "\n\t"                        \
00055                 "rol %B1" "\n\t"                        \
00056                 "rol %C1" "\n\t"                        \
00057                 "rol %D1" "\n\t"                        \
00058                 "dec %0" "\n\t"                         \
00059                 "brpl L1_%=" "\n\t"                     \
00060         "L_%=:" "\n\t"                                  \
00061                 : "=r" (nsh), "=r" (num)                \
00062                 : "0" (nsh), "1" (num)                  \
00063         );                                              \
00064         a = num;                                        \
00065 })
00066 
00067                                                         
00073 #define ror32(a, n) ({                                  \
00074         unsigned long num = (unsigned long)(a);         \
00075         unsigned char nsh = (unsigned char)(n);         \
00076         __asm__ (                                       \
00077                 "dec %0" "\n\t"                         \
00078                 "brmi L_%=" "\n\t"                      \
00079         "L1_%=:" "\n\t"                                 \
00080                 "clc" "\n\t"                            \
00081                 "sbrc %A1, 0" "\n\t"                    \
00082                 "sec" "\n\t"                            \
00083                 "ror %D1" "\n\t"                        \
00084                 "ror %C1" "\n\t"                        \
00085                 "ror %B1" "\n\t"                        \
00086                 "ror %A1" "\n\t"                        \
00087                 "dec %0" "\n\t"                         \
00088                 "brpl L1_%=" "\n\t"                     \
00089         "L_%=:" "\n\t"                                  \
00090                 : "=r" (nsh), "=r" (num)                \
00091                 : "0" (nsh), "1" (num)                  \
00092         );                                              \
00093         a = num;                                        \
00094 })
00095 
00100 #define c2l(c,l) ({                                    \
00101   __asm__ (    "mov r30, %A1" "\n\t"                   \
00102                "mov r31, %B1" "\n\t"                   \
00103                "ld %A0, Z+" "\n\t"                     \
00104                "ld %B0, Z+" "\n\t"                     \
00105                "ld %C0, Z+" "\n\t"                     \
00106                "ld %D0, Z " "\n\t"                     \
00107                : "=r" (l)                              \
00108                : "r" (c)                               \
00109                : "r30", "r31");                        \
00110 });
00111 
00117 #define l2c(l,c) ({                                    \
00118   __asm__ volatile (    "mov r30, %A0" "\n\t"          \
00119                "mov r31, %B0" "\n\t"                   \
00120                "st Z+, %A1" "\n\t"                     \
00121                "st Z+, %B1" "\n\t"                     \
00122                "st Z+, %C1" "\n\t"                     \
00123                "st Z,  %D1" "\n\t"                     \
00124                :                                       \
00125                : "r" (c), "r" (l)                      \
00126                : "r30", "r31");                        \
00127 });
00128 
00134 #define brol1(a) ({                                    \
00135   uint8_t  brol1tmp;                                   \
00136   __asm__  (   "mov %1, %D0" "\n\t"                    \
00137                "mov %D0, %C0" "\n\t"                   \
00138                "mov %C0, %B0" "\n\t"                   \
00139                "mov %B0, %A0" "\n\t"                   \
00140                "mov %A0, %1" "\n\t"                    \
00141                : "=r"(a), "=r" (brol1tmp)              \
00142                : "0" (a)                               \
00143                );                                      \
00144 });
00145 
00151 #define brol2(a) ({                                    \
00152   uint8_t  brol2tmp;                                   \
00153   __asm__  (   "mov %1, %A0"   "\n\t"                  \
00154                "mov %A0, %C0"  "\n\t"                  \
00155                "mov %C0, %1"   "\n\t"                  \
00156                "mov %1, %B0"   "\n\t"                  \
00157                "mov %B0, %D0"  "\n\t"                  \
00158                "mov %D0, %1"   "\n\t"                  \
00159                : "=r"(a), "=r" (brol2tmp)              \
00160                : "0" (a)                               \
00161                );                                      \
00162 });
00163 
00169 #define brol3(a) ({                                    \
00170   uint8_t  brol3tmp;                                   \
00171   __asm__  (   "mov %1, %A0" "\n\t"                    \
00172                "mov %A0, %B0" "\n\t"                   \
00173                "mov %B0, %C0" "\n\t"                   \
00174                "mov %C0, %D0" "\n\t"                   \
00175                "mov %D0, %1" "\n\t"                    \
00176                : "=r"(a), "=r" (brol3tmp)              \
00177                : "0" (a)                               \
00178                );                                      \
00179 });
00180 
00181 #define bror1(a) (brol3(a))
00182 #define bror2(a) (brol2(a))
00183 #define bror3(a) (brol1(a))
00184 
00196 #define fastrol32(a, n) ({                                                 \
00197   switch ((n)) {                                                           \
00198   case 0: break;                                                           \
00199   case 1: case 2: case 3: case 4: case 5: rol32 (a, (n)); break;           \
00200   case 6: case 7: brol1(a); ror32(a, 8-(n)); break;                        \
00201   case 8: case 9: case 10: case 11: case 12:  brol1(a); rol32(a, (n)-8 );  \
00202           break;                                                           \
00203   case 13: case 14: case 15: case 16: brol2(a); ror32(a, 16-(n)); break;   \
00204   case 17: case 18: case 19: case 20: brol2(a); rol32(a, (n) -16); break;  \
00205   case 21: case 22: case 23: case 24: brol3(a); ror32(a, 24-(n)); break;   \
00206   case 25: case 26: case 27: case 28: brol3(a); rol32(a, (n) -24); break;  \
00207   case 29: case 30: case 31: ror32(a, 32 - (n));                           \
00208   }                                                                        \
00209 });
00210 
00212 #define fastror32(a,n) fastrol32(a, (32-n)) 
00213 
00214 
00219 #define c2sM(c, s)       (s = ((unsigned short)(*((c))))  <<8L ,             \
00220                           s|= ((unsigned short)(*((c+1)))))
00221 
00226 #define s2cM(s, c)      (*((c))   = (unsigned short)(((s) >> 8L)&0xff), \
00227                          *((c+1)) = (unsigned short)(((s)      ) &0xff))

Generated on Mon Nov 23 06:25:59 2009 for MANTIS by  doxygen 1.4.6