2 * SHA-1 implementation for PowerPC.
4 * Copyright (C) 2005 Paul Mackerras <paulus@samba.org>
7 #include <asm/ppc_asm.h>
8 #include <asm/asm-offsets.h>
11 * We roll the registers for T, A, B, C, D, E around on each
12 * iteration; T on iteration t is A on iteration t+1, and so on.
13 * We use registers 7 - 12 for this.
15 #define RT(t) ((((t)+5)%6)+7)
16 #define RA(t) ((((t)+4)%6)+7)
17 #define RB(t) ((((t)+3)%6)+7)
18 #define RC(t) ((((t)+2)%6)+7)
19 #define RD(t) ((((t)+1)%6)+7)
20 #define RE(t) ((((t)+0)%6)+7)
22 /* We use registers 16 - 31 for the W values */
23 #define W(t) (((t)%16)+16)
28 #define STEPD0_LOAD(t) \
29 andc r0,RD(t),RB(t); \
31 rotlwi RT(t),RA(t),5; \
36 lwz W((t)+4),((t)+4)*4(r4); \
37 rotlwi RB(t),RB(t),30; \
40 #define STEPD0_UPDATE(t) \
42 andc r0,RD(t),RB(t); \
43 rotlwi RT(t),RA(t),5; \
44 rotlwi RB(t),RB(t),30; \
47 xor r5,W((t)+4-3),W((t)+4-8); \
49 xor W((t)+4),W((t)+4-16),W((t)+4-14); \
51 xor W((t)+4),W((t)+4),r5; \
53 rotlwi W((t)+4),W((t)+4),1
57 rotlwi RT(t),RA(t),5; \
58 rotlwi RB(t),RB(t),30; \
65 #define STEPD1_UPDATE(t) \
67 rotlwi RT(t),RA(t),5; \
68 rotlwi RB(t),RB(t),30; \
71 xor r5,W((t)+4-3),W((t)+4-8); \
73 xor W((t)+4),W((t)+4-16),W((t)+4-14); \
75 xor W((t)+4),W((t)+4),r5; \
77 rotlwi W((t)+4),W((t)+4),1
79 #define STEPD2_UPDATE(t) \
82 rotlwi RT(t),RA(t),5; \
84 rotlwi RB(t),RB(t),30; \
86 xor r5,W((t)+4-3),W((t)+4-8); \
88 xor W((t)+4),W((t)+4-16),W((t)+4-14); \
92 xor W((t)+4),W((t)+4),r5; \
94 rotlwi W((t)+4),W((t)+4),1
102 #define STEPUP4(t, fn) \
103 STEP##fn##_UPDATE(t); \
104 STEP##fn##_UPDATE((t)+1); \
105 STEP##fn##_UPDATE((t)+2); \
106 STEP##fn##_UPDATE((t)+3)
108 #define STEPUP20(t, fn) \
110 STEPUP4((t)+4, fn); \
111 STEPUP4((t)+8, fn); \
112 STEPUP4((t)+12, fn); \
115 _GLOBAL(powerpc_sha_transform)
116 PPC_STLU r1,-INT_FRAME_SIZE(r1)
121 lwz RA(0),0(r3) /* A */
122 lwz RB(0),4(r3) /* B */
123 lwz RC(0),8(r3) /* C */
124 lwz RD(0),12(r3) /* D */
125 lwz RE(0),16(r3) /* E */
132 lis r15,0x5a82 /* K0-19 */
140 lis r15,0x6ed9 /* K20-39 */
144 lis r15,0x8f1b /* K40-59 */
148 lis r15,0xca62 /* K60-79 */
178 addi r1,r1,INT_FRAME_SIZE