]> git.cryptolib.org Git - avr-crypto-lib.git/blob - skein/threefish_invmix_4c.S
optimizing norx32
[avr-crypto-lib.git] / skein / threefish_invmix_4c.S
1 /* threefish_invmix.S */
2 /*
3     This file is part of the AVR-Crypto-Lib.
4     Copyright (C) 2009  Daniel Otte (daniel.otte@rub.de)
5
6     This program is free software: you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation, either version 3 of the License, or
9     (at your option) any later version.
10
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19 /*
20  * \author  Daniel Otte
21  * \email   daniel.otte@rub.de
22  * \date    2009-03-21
23  * \license GPLv3 or later
24  */ 
25
26 #include "avr-asm-macros.S"
27
28 /*
29 #define X0 (((uint64_t*)data)[0])
30 #define X1 (((uint64_t*)data)[1])
31 void threefish_invmix(void *data, uint8_t rot){
32         uint64_t x;
33         x = X1;
34         x ^= X0;
35         X1 = ((x>>rot)|(x<<(64-rot)));
36         X0 -= X1;
37 }
38 */
39 A0 = 10
40 A1 = 11
41 A2 = 12
42 A3 = 13
43 A4 = 14
44 A5 = 15
45 A6 = 16
46 A7 = 17
47
48 B0 = 18
49 B1 = 19
50 B2 = 20
51 B3 = 21
52 B4 = 22
53 B5 = 23
54 B6 = 24
55 B7 = 25
56 vROT = 27
57 /*
58  * param data:  r24:r25
59  * param rot:   r22
60  */
61
62 .global threefish_invmix
63 threefish_invmix:
64         push_range 10, 17
65         push r28
66         push r29
67         movw r28, r24
68         mov vROT,r22
69         ldd A0, Y+ 0
70         ldd A1, Y+ 1
71         ldd A2, Y+ 2
72         ldd A3, Y+ 3
73         ldd A4, Y+ 4
74         ldd A5, Y+ 5
75         ldd A6, Y+ 6
76         ldd A7, Y+ 7
77         ldd B0, Y+ 8
78         ldd B1, Y+ 9
79         ldd B2, Y+10
80         ldd B3, Y+11
81         ldd B4, Y+12
82         ldd B5, Y+13
83         ldd B6, Y+14
84         ldd B7, Y+15
85         eor B0, A0
86         eor B1, A1
87         eor B2, A2
88         eor B3, A3
89         eor B4, A4
90         eor B5, A5
91         eor B6, A6
92         eor B7, A7
93
94         mov r26, vROT
95         swap r26
96         andi r26, 0x07
97         ldi r30, pm_lo8(byte_rot_jmptable)
98         ldi r31, pm_hi8(byte_rot_jmptable)
99         add r30, r26
100         adc r31, r1
101         ijmp
102 post_byterot:
103         bst vROT, 3
104         andi vROT, 0x07
105         brts 1f
106         rjmp bit_rotr
107 1:      rjmp bit_rotl
108 post_bitrot:    
109         sub A0, B0
110         sbc A1, B1
111         sbc A2, B2
112         sbc A3, B3
113         sbc A4, B4
114         sbc A5, B5
115         sbc A6, B6
116         sbc A7, B7
117
118         std Y+ 0, A0
119         std Y+ 1, A1
120         std Y+ 2, A2
121         std Y+ 3, A3
122         std Y+ 4, A4
123         std Y+ 5, A5
124         std Y+ 6, A6
125         std Y+ 7, A7
126         std Y+ 8, B0
127         std Y+ 9, B1
128         std Y+10, B2
129         std Y+11, B3
130         std Y+12, B4
131         std Y+13, B5
132         std Y+14, B6
133         std Y+15, B7
134 exit:
135         pop r29
136         pop r28
137         pop_range 10, 17
138         ret
139
140 byte_rot_jmptable:
141         rjmp  post_byterot;ret; rjmp  byte_rotr_0
142         rjmp  byte_rotr_1
143         rjmp  byte_rotr_2
144         rjmp  byte_rotr_3
145         rjmp  byte_rotr_4
146         rjmp  byte_rotr_5
147         rjmp  byte_rotr_6
148         rjmp  byte_rotr_7
149         rjmp  post_byterot;ret; rjmp  byte_rotr_0
150         
151
152         
153 ; 0 1 2 3 4 5 6 7
154 ; 1 2 3 4 5 6 7 0
155 ;.global byte_rotr_1
156 ;.global byte_rotr_0
157 byte_rotr_1: /* 10 words */
158         mov r0, B0
159         mov B0, B1
160         mov B1, B2
161         mov B2, B3
162         mov B3, B4
163         mov B4, B5
164         mov B5, B6
165         mov B6, B7
166         mov B7, r0
167 byte_rotr_0:    
168         rjmp post_byterot
169
170 ; 0 1 2 3 4 5 6 7       
171 ; 2 3 4 5 6 7 0 1
172 ;.global byte_rotr_2    
173 byte_rotr_2: /* 11 words */
174         mov r0, B0
175         mov B0, B2
176         mov B2, B4
177         mov B4, B6
178         mov B6, r0
179         mov r0, B1
180         mov B1, B3
181         mov B3, B5
182         mov B5, B7
183         mov B7, r0
184         rjmp post_byterot
185
186 ; 0 1 2 3 4 5 6 7
187 ; 3 4 5 6 7 0 1 2
188 ;.global byte_rotr_3
189 byte_rotr_3: /* 10 words */
190         mov r0, B0
191         mov B0, B3
192         mov B3, B6
193         mov B6, B1
194         mov B1, B4
195         mov B4, B7
196         mov B7, B2
197         mov B2, B5
198         mov B5, r0
199         rjmp post_byterot
200
201 ; 0 1 2 3 4 5 6 7
202 ; 4 5 6 7 0 1 2 3
203 ;.global byte_rotr_4
204 byte_rotr_4: /* 13 words */
205         mov r0, B0
206         mov B0, B4
207         mov B4, r0
208         
209         mov r0, B1
210         mov B1, B5
211         mov B5, r0
212         
213         mov r0, B2
214         mov B2, B6
215         mov B6, r0
216         
217         mov r0, B3
218         mov B3, B7
219         mov B7, r0
220         rjmp post_byterot
221
222 ; 0 1 2 3 4 5 6 7
223 ; 5 6 7 0 1 2 3 4
224 ;.global byte_rotr_5
225 byte_rotr_5: /* 10 words */
226         mov r0, B0
227         mov B0, B5
228         mov B5, B2
229         mov B2, B7
230         mov B7, B4
231         mov B4, B1
232         mov B1, B6
233         mov B6, B3
234         mov B3, r0
235         rjmp post_byterot
236         
237 ; 0 1 2 3 4 5 6 7
238 ; 6 7 0 1 2 3 4 5
239 ;.global byte_rotr_6
240 byte_rotr_6: /* 11 words */
241         mov r0, B0
242         mov B0, B6
243         mov B6, B4
244         mov B4, B2
245         mov B2, r0
246         
247         mov r0, B1
248         mov B1, B7
249         mov B7, B5
250         mov B5, B3
251         mov B3, r0
252         rjmp post_byterot
253
254 ; 0 1 2 3 4 5 6 7
255 ; 7 0 1 2 3 4 5 6
256 ;.global byte_rotr_7
257 byte_rotr_7: /* 10 words */
258         mov r0, B7
259         mov B7, B6
260         mov B6, B5
261         mov B5, B4
262         mov B4, B3
263         mov B3, B2
264         mov B2, B1
265         mov B1, B0
266         mov B0, r0
267         rjmp post_byterot
268
269 ;.global bit_rotl
270 bit_rotl:
271         tst vROT
272         brne 1f
273         rjmp post_bitrot
274 1:      mov r0, B7
275         rol r0
276         rol B0
277         rol B1
278         rol B2
279         rol B3
280         rol B4
281         rol B5
282         rol B6
283         rol B7
284         dec vROT
285         rjmp bit_rotl
286         
287 ;.global bit_rotr
288 bit_rotr:
289         tst vROT
290         brne 1f
291         rjmp post_bitrot
292 1:      mov r0, B0
293         ror r0
294         ror B7
295         ror B6
296         ror B5
297         ror B4
298         ror B3
299         ror B2
300         ror B1
301         ror B0
302         dec vROT
303         rjmp bit_rotr
304
305