00001
00002
00003
00004
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
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))