OSDN Git Service

2013.10.24
[uclinux-h8/uClinux-dist.git] / freeswan / libdes / asm / sh3.S
1         .little
2         .text
3         .align 2
4 /* Through this assembly, registers r13 and r14 hold the left and right
5  * half values (l & r).  Which value is assigned to which register varies
6  * as they are periodically swapped over.
7  *
8  * Input:
9  * r4   252
10  * r5   encryption key
11  * r13  l/r
12  * r14  r/l
13  *
14  * Output:
15  * r1   same as r13     (assist with swapping r13 & r14)
16  * r4   252
17  * r13  l/r
18  * r14  r/l
19  *
20  * Internally:
21  * r0   temporary
22  * r1   temporary
23  * r2   temporary
24  * r3   temporary then 1792
25  * r5   temporary
26  * r6   misc constants
27  * r7   loop index
28  * r8   key pointer     (r9 in decrypt)
29  * r9   temporary       (r8 in decrypt)
30  * r10  temporary
31  * r11  temporary
32  *
33  * Unused:
34  * r12  unused and not saved by caller
35  */
36
37 des_encrypt2:
38         /* No need to save registers here since our caller has already done
39          * this for us.
40          */
41         mov.l   @r5,r1
42         mov     r5,r8
43         mov     #0,r7
44         mov     r14,r11
45 enc2_loop:
46         xor     r1,r11
47         mov     r14,r10
48         mov.l   @(4,r8),r1
49         mov     r11,r3
50         xor     r1,r10
51         mov     r11,r1
52         shlr8   r3
53         and     r4,r1
54         mov.l   enc2_0,r0
55         and     r4,r3
56         mov.l   @(r0,r1),r2
57         shlr16  r11
58         mov.l   enc2_512,r0
59         rotr    r10
60         mov.l   @(r0,r3),r1
61         xor     r1,r2
62         mov.l   enc2_1024,r0
63         mov     r11,r1
64         shlr8   r11
65         and     r4,r1
66         mov.l   @(r0,r1),r1
67         and     r4,r11
68         mov.l   enc2_1536,r6
69         rotr    r10
70         mov     r11,r0
71         xor     r1,r2
72         mov.l   @(r0,r6),r1
73         rotr    r10
74         xor     r1,r2
75         rotr    r10
76         mov.l   enc2_256,r6
77         mov     r10,r0
78         and     r4,r0
79         mov.l   @(r0,r6),r1     /* misaligned */
80         mov     r10,r0
81         shlr8   r0
82         mov.l   enc2_768,r6
83         and     r4,r0
84         xor     r1,r2
85         shlr16  r10
86         mov.l   @(r0,r6),r1
87         mov     r10,r0
88         mov.l   enc2_1280,r6
89         xor     r1,r2
90         and     r4,r0
91         shlr8   r10
92         mov.l   @(r0,r6),r1
93         and     r4,r10
94         mov.l   enc2_1792,r3
95         xor     r1,r2
96         mov     r10,r0
97         mov.l   @(r0,r3),r1     /* misaligned */
98         xor     r1,r2
99         xor     r2,r13
100         mov.l   @(8,r8),r1
101         mov     r13,r11
102         xor     r1,r11
103         mov     r11,r9
104         mov.l   @(12,r8),r1
105         shlr8   r9
106         mov     r13,r10
107         mov     r9,r0
108         xor     r1,r10
109         and     r4,r0
110         mov     r11,r1
111         mov     r0,r5
112         and     r4,r1
113         shlr16  r11
114         mov.l   enc2_0,r0
115         rotr    r10
116         mov.l   @(r0,r1),r2
117         mov     r5,r0
118         mov.l   enc2_512,r9
119         rotr    r10
120         mov.l   @(r0,r9),r1
121         rotr    r10
122         xor     r1,r2
123         mov     r11,r1
124         mov.l   enc2_1024,r0
125         and     r4,r1
126         mov.l   @(r0,r1),r1
127         shlr8   r11
128         xor     r1,r2
129         and     r4,r11
130         mov.l   enc2_1536,r6
131         mov     r11,r0
132         mov.l   @(r0,r6),r1
133         rotr    r10
134         xor     r1,r2
135         mov     r10,r0
136         mov.l   enc2_256,r6
137         and     #252,r0
138         mov.l   @(r0,r6),r1
139         mov     r10,r0
140         mov.l   enc2_768,r6
141         shlr8   r0
142         xor     r1,r2
143         and     #252,r0
144         mov.l   @(r0,r6),r1
145         shlr16  r10
146         xor     r1,r2
147         mov     r10,r0
148         mov.l   enc2_1280,r6
149         and     #252,r0
150         shlr8   r10
151         and     r4,r10
152         mov.l   @(r0,r6),r1
153         mov     r10,r0
154         xor     r1,r2
155         mov.l   @(r0,r3),r1     /* misaligned */
156         xor     r1,r2
157         xor     r2,r14
158         mov.l   @(16,r8),r1
159         mov     r14,r11
160         xor     r1,r11
161         mov     r11,r9
162         mov.l   @(20,r8),r1
163         shlr8   r9
164         mov     r14,r10
165         mov     r9,r0
166         xor     r1,r10
167         and     r4,r0
168         mov     r11,r1
169         mov     r0,r5
170         mov.l   enc2_0,r0
171         and     r4,r1
172         mov.l   @(r0,r1),r2
173         mov     r5,r0
174         mov.l   enc2_512,r9
175         rotr    r10
176         mov.l   @(r0,r9),r1
177         shlr16  r11
178         rotr    r10
179         xor     r1,r2
180         mov     r11,r1
181         rotr    r10
182         mov.l   enc2_1024,r0
183         and     r4,r1
184         mov.l   @(r0,r1),r1
185         shlr8   r11
186         xor     r1,r2
187         and     r4,r11
188         mov.l   enc2_1536,r6
189         rotr    r10
190         mov     r11,r0
191         mov.l   @(r0,r6),r1     /* misaligned */
192         mov     r10,r0
193         xor     r1,r2
194         mov.l   enc2_256,r6
195         and     #252,r0
196         mov.l   @(r0,r6),r1
197         mov     r10,r0
198         mov.l   enc2_768,r6
199         shlr8   r0
200         xor     r1,r2
201         and     #252,r0
202         mov.l   @(r0,r6),r1
203         shlr16  r10
204         mov.l   enc2_1280,r6
205         mov     r10,r0
206         xor     r1,r2
207         and     #252,r0
208         mov.l   @(r0,r6),r1
209         shlr8   r10
210         xor     r1,r2
211         and     r4,r10
212         mov     r10,r0
213         mov.l   @(r0,r3),r1     /* misaligned */
214         xor     r1,r2
215         xor     r2,r13
216         mov.l   @(24,r8),r1
217         mov     r13,r11
218         xor     r1,r11
219         mov     r11,r9
220         mov.l   @(28,r8),r1
221         shlr8   r9
222         mov     r13,r10
223         mov     r9,r0
224         xor     r1,r10
225         and     r4,r0
226         mov     r11,r1
227         mov     r0,r5
228         mov.l   enc2_0,r0
229         and     r4,r1
230         mov.l   @(r0,r1),r2
231         shlr16  r11
232         mov     r5,r0
233         rotr    r10
234         mov.l   enc2_512,r9
235         rotr    r10
236         mov.l   @(r0,r9),r1
237         rotr    r10
238         xor     r1,r2
239         mov     r11,r1
240         mov.l   enc2_1024,r0
241         and     r4,r1
242         shlr8   r11
243         rotr    r10
244         mov.l   @(r0,r1),r1
245         and     r4,r11
246         mov.l   enc2_1536,r6
247         xor     r1,r2
248         mov     r11,r0
249         add     #8,r7
250         mov.l   @(r0,r6),r1
251         mov     r10,r0
252         mov.l   enc2_256,r6
253         and     #252,r0
254         xor     r1,r2
255         mov.l   @(r0,r6),r1     /* misaligned */
256         mov     r10,r0
257         shlr8   r0
258         mov.l   enc2_768,r6
259         and     #252,r0
260         xor     r1,r2
261         shlr16  r10
262         mov.l   @(r0,r6),r1
263         mov     r10,r0
264         mov.l   enc2_1280,r6
265         and     #252,r0
266         xor     r1,r2
267         shlr8   r10
268         mov.l   @(r0,r6),r1
269         and     r4,r10
270         xor     r1,r2
271         mov     r10,r0
272         mov.l   @(r0,r3),r1
273         mov     #31,r6
274         cmp/gt  r6,r7
275         xor     r1,r2
276         add     #32,r8
277         xor     r2,r14
278         bt      enc2_exit
279         mov.l   @r8,r1          /* misaligned */
280         bra     enc2_loop
281         mov     r14,r11
282 enc2_exit:
283         rts     
284         mov     r13,r1
285
286 /* This routine is the converse of the above.
287  * It expects the same arguments in the same registers as des_encrypt2
288  * and it produces the same output.  The only real difference is the
289  * order of the encryption.
290  */
291 des_decrypt2:
292         /* No need to save registers here since our caller has already done
293          * this for us.
294          */
295         add     #96,r5
296         mov     #30,r7
297         mov.l   @(24,r5),r1
298         mov     r14,r11
299         mov     r5,r9
300 dec2_loop:
301         xor     r1,r11
302         mov.l   @(28,r9),r1
303         mov     r14,r10
304         xor     r1,r10
305         mov     r11,r1
306         mov.l   enc2_0,r0
307         and     r4,r1
308         mov     r11,r3
309         shlr8   r3
310         mov.l   @(r0,r1),r2
311         and     r4,r3
312         mov.l   enc2_512,r0
313         shlr16  r11
314         mov.l   @(r0,r3),r1
315         xor     r1,r2
316         mov     r11,r1
317         and     r4,r1
318         mov.l   enc2_1024,r0
319         shlr8   r11
320         mov.l   @(r0,r1),r1
321         and     r4,r11
322         mov.l   enc2_1536,r6
323         rotr    r10
324         mov     r11,r0
325         rotr    r10
326         xor     r1,r2
327         rotr    r10
328         mov.l   @(r0,r6),r1
329         rotr    r10
330         mov.l   enc2_256,r6
331         mov     r10,r0
332         and     r4,r0
333         xor     r1,r2
334         mov.l   @(r0,r6),r1
335         mov     r10,r0
336         mov.l   enc2_768,r6
337         shlr8   r0
338         xor     r1,r2
339         and     r4,r0
340         mov.l   @(r0,r6),r1
341         shlr16  r10
342         mov.l   enc2_1280,r6
343         mov     r10,r0
344         xor     r1,r2
345         and     r4,r0
346         mov.l   @(r0,r6),r1
347         shlr8   r10
348         mov.l   enc2_1792,r3
349         and     r4,r10
350         xor     r1,r2
351         mov     r10,r0
352         mov.l   @(r0,r3),r1
353         xor     r1,r2
354         mov.l   @(16,r9),r1
355         xor     r2,r13
356         mov     r13,r11
357         xor     r1,r11
358         mov.l   @(20,r9),r1
359         mov     r11,r2
360         mov     r13,r10
361         shlr8   r2
362         xor     r1,r10
363         mov     r2,r0
364         mov     r11,r1
365         and     r4,r0
366         and     r4,r1
367         mov     r0,r5
368         mov.l   enc2_0,r0
369         rotr    r10
370         mov.l   @(r0,r1),r2
371         mov     r5,r0
372         mov.l   enc2_512,r8
373         rotr    r10
374         mov.l   @(r0,r8),r1
375         shlr16  r11
376         xor     r1,r2
377         mov     r11,r1
378         mov.l   enc2_1024,r0
379         shlr8   r11
380         and     r4,r1
381         rotr    r10
382         mov.l   @(r0,r1),r1
383         rotr    r10
384         xor     r1,r2
385         and     r4,r11
386         mov.l   enc2_1536,r6
387         mov     r11,r0
388         mov.l   @(r0,r6),r1
389         mov     r10,r0
390         mov.l   enc2_256,r6
391         xor     r1,r2
392         and     #252,r0
393         mov.l   @(r0,r6),r1     /* misaligned */
394         mov     r10,r0
395         shlr8   r0
396         mov.l   enc2_768,r6
397         and     #252,r0
398         xor     r1,r2
399         shlr16  r10
400         mov.l   @(r0,r6),r1
401         mov     r10,r0
402         mov.l   enc2_1280,r6
403         and     #252,r0
404         xor     r1,r2
405         shlr8   r10
406         mov.l   @(r0,r6),r1
407         and     r4,r10
408         xor     r1,r2
409         mov     r10,r0
410         mov.l   @(r0,r3),r1
411         xor     r1,r2
412         mov.l   @(8,r9),r1
413         xor     r2,r14
414         mov     r14,r11
415         xor     r1,r11
416         mov.l   @(12,r9),r1
417         mov     r11,r8
418         mov     r14,r10
419         shlr8   r8
420         xor     r1,r10
421         mov     r8,r0
422         mov     r11,r1
423         and     r4,r0
424         mov     r0,r5
425         and     r4,r1
426         mov.l   enc2_0,r0
427         shlr16  r11
428         mov.l   @(r0,r1),r2
429         mov     r5,r0
430         mov.l   enc2_512,r8
431         rotr    r10
432         mov.l   @(r0,r8),r1
433         rotr    r10
434         xor     r1,r2
435         mov     r11,r1
436         rotr    r10
437         and     r4,r1
438         mov.l   enc2_1024,r0
439         shlr8   r11
440         mov.l   @(r0,r1),r1
441         and     r4,r11
442         mov.l   enc2_1536,r6
443         xor     r1,r2
444         rotr    r10
445         mov     r11,r0
446         mov.l   @(r0,r6),r1
447         mov     r10,r0
448         mov.l   enc2_256,r6
449         and     #252,r0
450         xor     r1,r2
451         mov.l   @(r0,r6),r1     /* misaligned */
452         mov     r10,r0
453         xor     r1,r2
454         mov.l   enc2_768,r6
455         shlr8   r0
456         shlr16  r10
457         and     #252,r0
458         mov.l   @(r0,r6),r1
459         mov     r10,r0
460         mov.l   enc2_1280,r6
461         and     #252,r0
462         xor     r1,r2
463         shlr8   r10
464         mov.l   @(r0,r6),r1
465         and     r4,r10
466         xor     r1,r2
467         mov     r10,r0
468         mov.l   @(r0,r3),r1
469         xor     r1,r2
470         mov.l   @r9,r1
471         xor     r2,r13
472         mov     r13,r11
473         xor     r1,r11
474         mov     r11,r8
475         shlr8   r8
476         mov.l   @(4,r9),r1
477         mov     r8,r0
478         mov     r13,r10
479         and     r4,r0
480         xor     r1,r10
481         mov     r11,r1
482         mov     r0,r5
483         and     r4,r1
484         mov.l   enc2_0,r0
485         shlr16  r11
486         mov.l   @(r0,r1),r2
487         rotr    r10
488         mov.l   enc2_512,r8
489         mov     r5,r0
490         mov.l   @(r0,r8),r1
491         rotr    r10
492         xor     r1,r2
493         rotr    r10
494         mov.l   enc2_1024,r0
495         mov     r11,r1
496         and     r4,r1
497         shlr8   r11
498         mov.l   @(r0,r1),r1
499         and     r4,r11
500         mov.l   enc2_1536,r6
501         xor     r1,r2
502         mov     r11,r0
503         rotr    r10
504         mov.l   @(r0,r6),r1
505         mov     r10,r0
506         mov.l   enc2_256,r6
507         xor     r1,r2
508         and     #252,r0
509         add     #-32,r9
510         mov.l   @(r0,r6),r1
511         mov     r10,r0
512         mov.l   enc2_768,r6
513         shlr8   r0
514         and     #252,r0
515         xor     r1,r2
516         mov.l   @(r0,r6),r1
517         shlr16  r10
518         mov.l   enc2_1280,r6
519         mov     r10,r0
520         and     #252,r0
521         xor     r1,r2
522         shlr8   r10
523         and     r4,r10
524         mov.l   @(r0,r6),r1
525         mov     r10,r0
526         xor     r1,r2
527         add     #-8,r7
528         mov.l   @(r0,r3),r1
529         cmp/pl  r7
530         xor     r1,r2
531         xor     r2,r14
532         bf      dec2_exit
533         mov.l   @(24,r9),r1     /* misaligned */
534         bra     dec2_loop
535         mov     r14,r11
536 dec2_exit:
537         rts
538         mov     r13,r1  
539         
540         .align 2
541 enc2_0:         .long   des_SPtrans
542 enc2_512:       .long   des_SPtrans + 512
543 enc2_1024:      .long   des_SPtrans + 1024
544 enc2_1536:      .long   des_SPtrans + 1536
545 enc2_256:       .long   des_SPtrans + 256
546 enc2_768:       .long   des_SPtrans + 768
547 enc2_1280:      .long   des_SPtrans + 1280
548 enc2_1792:      .long   des_SPtrans + 1792
549         
550         
551         .align  2
552         .global des_encrypt3
553         .type   des_encrypt3,@function
554 des_encrypt3:
555         mov.l   r8,@-r15        /* Save all registers here to */
556         mov.l   r9,@-r15        /* avoid having the work routine */
557         mov.l   r10,@-r15       /* do it for each des invocation */
558         mov.l   r11,@-r15
559         mov.l   r13,@-r15
560         mov.l   r14,@-r15
561         sts.l   pr,@-r15        /* Return address */
562         mov.l   r4,@-r15        /* Save data pointer till end */
563         mov.l   r7,@-r15        /* Save Key 3 */
564         mov.l   @(4,r4),r13     /* data[1] */
565         mov.l   r6,@-r15        /* Save Key 2 */
566         mov     r13,r1
567         mov.l   @r4,r14         /* data[2] */
568         shlr2   r1              /* Perform the IP permutation */
569         mov.l   cnst0x0f0f0f0f,r6
570         mov     #4,r7
571         shlr2   r1
572         xor     r14,r1
573         and     r6,r1
574         xor     r1,r14
575         shld    r7,r1
576         xor     r1,r13
577         mov     r14,r1
578         shlr16  r1
579         mov.l   cnst0x0000ffff,r6
580         xor     r13,r1
581         mov.w   cnst252,r4
582         and     r6,r1
583         xor     r1,r13
584         shll16  r1
585         xor     r1,r14
586         mov     r13,r1
587         mov.l   cnst0x33333333,r6
588         shlr2   r1
589         xor     r14,r1
590         and     r6,r1
591         xor     r1,r14
592         shll2   r1
593         xor     r1,r13
594         mov     r14,r1
595         shlr8   r1
596         xor     r13,r1
597         mov.l   cnst0x00ff00ff,r6
598         and     r6,r1
599         xor     r1,r13
600         shll8   r1
601         xor     r1,r14
602         mov     r13,r1
603         shlr    r1
604         xor     r14,r1
605         mov.l   cnst0x55555555,r6
606         and     r6,r1
607         xor     r1,r14
608         add     r1,r1
609         xor     r1,r13
610         rotl    r14
611         rotl    r13
612         rotl    r14
613         rotl    r13
614         rotl    r14
615         bsr     des_encrypt2
616         rotl    r13
617         mov.l   @r15+,r5        /* recover key 2 */
618         mov     r14,r13
619         bsr     des_decrypt2
620         mov     r1,r14
621         mov.l   @r15+,r5        /* recover key 3 */
622         mov     r14,r13
623         bsr     des_encrypt2
624         mov     r1,r14
625         rotr    r14
626         rotr    r13
627         rotr    r14
628         rotr    r13
629         rotr    r14
630         rotr    r13
631         mov     r14,r1          /* Perform the FP permutation */
632         shlr    r1
633         mov.l   cnst0x55555555,r6
634         xor     r13,r1
635         and     r6,r1
636         xor     r1,r13
637         add     r1,r1
638         xor     r1,r14
639         mov     r13,r1
640         shlr8   r1
641         mov.l   cnst0x00ff00ff,r6
642         xor     r14,r1
643         and     r6,r1
644         xor     r1,r14
645         shll8   r1
646         xor     r1,r13
647         mov     r14,r1
648         shlr2   r1
649         mov.l   cnst0x33333333,r6
650         xor     r13,r1
651         and     r6,r1
652         xor     r1,r13
653         shll2   r1
654         xor     r1,r14
655         mov     r13,r1
656         shlr16  r1
657         mov.l   cnst0x0000ffff,r6
658         xor     r14,r1
659         and     r6,r1
660         xor     r1,r14
661         mov.l   @r15+,r9
662         shll16  r1
663         xor     r1,r13
664         mov     r14,r1
665         mov.l   cnst0x0f0f0f0f,r6
666         shlr2   r1
667         shlr2   r1
668         xor     r13,r1
669         mov     #4,r7
670         and     r6,r1
671         xor     r1,r13
672         shld    r7,r1
673         xor     r1,r14
674         mov.l   r14,@(4,r9)     /* data[1] */
675         lds.l   @r15+,pr
676         mov.l   @r15+,r14
677         mov.l   r13,@r9         /* data[0] */
678         mov.l   @r15+,r13
679         mov.l   @r15+,r11
680         mov.l   @r15+,r10
681         mov.l   @r15+,r9
682         rts     
683         mov.l   @r15+,r8
684
685         .align  2
686         .global des_decrypt3
687         .type   des_decrypt3,@function
688 des_decrypt3:
689         mov.l   r8,@-r15        /* Save all registers here to */
690         mov.l   r9,@-r15        /* avoid having the work routine */
691         mov.l   r10,@-r15       /* do it for each des invocation */
692         mov.l   r11,@-r15
693         mov.l   r13,@-r15
694         mov.l   r14,@-r15
695         sts.l   pr,@-r15        /* Return address */
696         mov.l   r4,@-r15        /* Save data pointer for end */
697         mov.l   r5,@-r15        /* Save Key 1 */
698         mov.l   r6,@-r15        /* Save Key 2 */
699         mov.l   @(4,r4),r13     /* data[1] */
700         mov     r13,r1
701         mov.l   @r4,r14         /* data[0] */
702         mov     r7,r5
703         shlr2   r1              /* Perform IP permutation */
704         shlr2   r1
705         mov.l   cnst0x0f0f0f0f,r6
706         xor     r14,r1
707         and     r6,r1
708         mov     #4,r6
709         xor     r1,r14
710         shld    r6,r1
711         mov.w   cnst252,r4
712         xor     r1,r13
713         mov     r14,r1
714         shlr16  r1
715         mov.l   cnst0x0000ffff,r6
716         xor     r13,r1
717         and     r6,r1
718         xor     r1,r13
719         shll16  r1
720         xor     r1,r14
721         mov     r13,r1
722         shlr2   r1
723         mov.l   cnst0x33333333,r6
724         xor     r14,r1
725         and     r6,r1
726         xor     r1,r14
727         shll2   r1
728         xor     r1,r13
729         mov     r14,r1
730         shlr8   r1
731         mov.l   cnst0x00ff00ff,r6
732         xor     r13,r1
733         and     r6,r1
734         xor     r1,r13
735         shll8   r1
736         xor     r1,r14
737         mov     r13,r1
738         shlr    r1
739         mov.l   cnst0x55555555,r6
740         xor     r14,r1
741         and     r6,r1
742         xor     r1,r14
743         add     r1,r1
744         xor     r1,r13
745         rotl    r14
746         rotl    r13
747         rotl    r14
748         rotl    r13
749         rotl    r14
750         bsr     des_decrypt2
751         rotl    r13
752         mov     r14,r13
753         mov.l   @r15+,r5        /* Recover key2 */
754         bsr     des_encrypt2
755         mov     r1,r14
756         mov     r14,r13
757         mov.l   @r15+,r5        /* Recover key1 */
758         bsr     des_decrypt2
759         mov     r1,r14
760         rotr    r14
761         rotr    r13
762         rotr    r14
763         rotr    r13
764         rotr    r14
765         rotr    r13
766         mov     r14,r1          /* Perform FP permutation */
767         mov.l   cnst0x55555555,r6
768         shlr    r1
769         xor     r13,r1
770         and     r6,r1
771         xor     r1,r13
772         add     r1,r1
773         xor     r1,r14
774         mov     r13,r1
775         mov.l   cnst0x00ff00ff,r6
776         shlr8   r1
777         xor     r14,r1
778         and     r6,r1
779         xor     r1,r14
780         shll8   r1
781         xor     r1,r13
782         mov     r14,r1
783         mov.l   cnst0x33333333,r6
784         shlr2   r1
785         xor     r13,r1
786         and     r6,r1
787         xor     r1,r13
788         shll2   r1
789         xor     r1,r14
790         mov     r13,r1
791         mov.l   cnst0x0000ffff,r6
792         shlr16  r1
793         xor     r14,r1
794         and     r6,r1
795         xor     r1,r14
796         mov.l   @r15+,r9
797         shll16  r1
798         xor     r1,r13
799         mov     r14,r1
800         shlr2   r1
801         mov.l   cnst0x0f0f0f0f,r6
802         shlr2   r1
803         xor     r13,r1
804         mov     #4,r7
805         and     r6,r1
806         xor     r1,r13
807         shld    r7,r1
808         xor     r1,r14
809         mov.l   r14,@(4,r9)     /* data[1] */
810         lds.l   @r15+,pr
811         mov.l   @r15+,r14
812         mov.l   r13,@r9         /* data[0] */
813         mov.l   @r15+,r13
814         mov.l   @r15+,r11
815         mov.l   @r15+,r10
816         mov.l   @r15+,r9
817         rts     
818         mov.l   @r15+,r8
819
820 cnst252:        .short  252
821
822                 .align 2
823 cnst0x0f0f0f0f: .long   252645135
824 cnst0x0000ffff: .long   65535
825 cnst0x33333333: .long   858993459
826 cnst0x00ff00ff: .long   16711935
827 cnst0x55555555: .long   1431655765
828