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.
15 * r1 same as r13 (assist with swapping r13 & r14)
24 * r3 temporary then 1792
28 * r8 key pointer (r9 in decrypt)
29 * r9 temporary (r8 in decrypt)
34 * r12 unused and not saved by caller
38 /* No need to save registers here since our caller has already done
79 mov.l @(r0,r6),r1 /* misaligned */
97 mov.l @(r0,r3),r1 /* misaligned */
155 mov.l @(r0,r3),r1 /* misaligned */
191 mov.l @(r0,r6),r1 /* misaligned */
213 mov.l @(r0,r3),r1 /* misaligned */
255 mov.l @(r0,r6),r1 /* misaligned */
279 mov.l @r8,r1 /* misaligned */
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.
292 /* No need to save registers here since our caller has already done
393 mov.l @(r0,r6),r1 /* misaligned */
451 mov.l @(r0,r6),r1 /* misaligned */
533 mov.l @(24,r9),r1 /* misaligned */
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
553 .type des_encrypt3,@function
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 */
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 */
567 mov.l @r4,r14 /* data[2] */
568 shlr2 r1 /* Perform the IP permutation */
569 mov.l cnst0x0f0f0f0f,r6
579 mov.l cnst0x0000ffff,r6
587 mov.l cnst0x33333333,r6
597 mov.l cnst0x00ff00ff,r6
605 mov.l cnst0x55555555,r6
617 mov.l @r15+,r5 /* recover key 2 */
621 mov.l @r15+,r5 /* recover key 3 */
631 mov r14,r1 /* Perform the FP permutation */
633 mov.l cnst0x55555555,r6
641 mov.l cnst0x00ff00ff,r6
649 mov.l cnst0x33333333,r6
657 mov.l cnst0x0000ffff,r6
665 mov.l cnst0x0f0f0f0f,r6
674 mov.l r14,@(4,r9) /* data[1] */
677 mov.l r13,@r9 /* data[0] */
687 .type des_decrypt3,@function
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 */
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] */
701 mov.l @r4,r14 /* data[0] */
703 shlr2 r1 /* Perform IP permutation */
705 mov.l cnst0x0f0f0f0f,r6
715 mov.l cnst0x0000ffff,r6
723 mov.l cnst0x33333333,r6
731 mov.l cnst0x00ff00ff,r6
739 mov.l cnst0x55555555,r6
753 mov.l @r15+,r5 /* Recover key2 */
757 mov.l @r15+,r5 /* Recover key1 */
766 mov r14,r1 /* Perform FP permutation */
767 mov.l cnst0x55555555,r6
775 mov.l cnst0x00ff00ff,r6
783 mov.l cnst0x33333333,r6
791 mov.l cnst0x0000ffff,r6
801 mov.l cnst0x0f0f0f0f,r6
809 mov.l r14,@(4,r9) /* data[1] */
812 mov.l r13,@r9 /* data[0] */
823 cnst0x0f0f0f0f: .long 252645135
824 cnst0x0000ffff: .long 65535
825 cnst0x33333333: .long 858993459
826 cnst0x00ff00ff: .long 16711935
827 cnst0x55555555: .long 1431655765