1 /* SPDX-License-Identifier: GPL-2.0 */
3 * SHA-1 implementation for PowerPC.
5 * Copyright (C) 2005 Paul Mackerras <paulus@samba.org>
8 #include <asm/ppc_asm.h>
9 #include <asm/asm-offsets.h>
12 #define LWZ(rt, d, ra) \
15 #define LWZ(rt, d, ra) \
21 * We roll the registers for T, A, B, C, D, E around on each
22 * iteration; T on iteration t is A on iteration t+1, and so on.
23 * We use registers 7 - 12 for this.
25 #define RT(t) ((((t)+5)%6)+7)
26 #define RA(t) ((((t)+4)%6)+7)
27 #define RB(t) ((((t)+3)%6)+7)
28 #define RC(t) ((((t)+2)%6)+7)
29 #define RD(t) ((((t)+1)%6)+7)
30 #define RE(t) ((((t)+0)%6)+7)
32 /* We use registers 16 - 31 for the W values */
33 #define W(t) (((t)%16)+16)
38 #define STEPD0_LOAD(t) \
39 andc r0,RD(t),RB(t); \
41 rotlwi RT(t),RA(t),5; \
46 LWZ(W((t)+4),((t)+4)*4,r4); \
47 rotlwi RB(t),RB(t),30; \
50 #define STEPD0_UPDATE(t) \
52 andc r0,RD(t),RB(t); \
53 rotlwi RT(t),RA(t),5; \
54 rotlwi RB(t),RB(t),30; \
57 xor r5,W((t)+4-3),W((t)+4-8); \
59 xor W((t)+4),W((t)+4-16),W((t)+4-14); \
61 xor W((t)+4),W((t)+4),r5; \
63 rotlwi W((t)+4),W((t)+4),1
67 rotlwi RT(t),RA(t),5; \
68 rotlwi RB(t),RB(t),30; \
75 #define STEPD1_UPDATE(t) \
77 rotlwi RT(t),RA(t),5; \
78 rotlwi RB(t),RB(t),30; \
81 xor r5,W((t)+4-3),W((t)+4-8); \
83 xor W((t)+4),W((t)+4-16),W((t)+4-14); \
85 xor W((t)+4),W((t)+4),r5; \
87 rotlwi W((t)+4),W((t)+4),1
89 #define STEPD2_UPDATE(t) \
92 rotlwi RT(t),RA(t),5; \
94 rotlwi RB(t),RB(t),30; \
96 xor r5,W((t)+4-3),W((t)+4-8); \
98 xor W((t)+4),W((t)+4-16),W((t)+4-14); \
100 add RT(t),RT(t),r6; \
102 xor W((t)+4),W((t)+4),r5; \
103 add RT(t),RT(t),r0; \
104 rotlwi W((t)+4),W((t)+4),1
106 #define STEP0LD4(t) \
108 STEPD0_LOAD((t)+1); \
109 STEPD0_LOAD((t)+2); \
112 #define STEPUP4(t, fn) \
113 STEP##fn##_UPDATE(t); \
114 STEP##fn##_UPDATE((t)+1); \
115 STEP##fn##_UPDATE((t)+2); \
116 STEP##fn##_UPDATE((t)+3)
118 #define STEPUP20(t, fn) \
120 STEPUP4((t)+4, fn); \
121 STEPUP4((t)+8, fn); \
122 STEPUP4((t)+12, fn); \
125 _GLOBAL(powerpc_sha_transform)
126 PPC_STLU r1,-INT_FRAME_SIZE(r1)
131 lwz RA(0),0(r3) /* A */
132 lwz RB(0),4(r3) /* B */
133 lwz RC(0),8(r3) /* C */
134 lwz RD(0),12(r3) /* D */
135 lwz RE(0),16(r3) /* E */
142 lis r15,0x5a82 /* K0-19 */
150 lis r15,0x6ed9 /* K20-39 */
154 lis r15,0x8f1b /* K40-59 */
158 lis r15,0xca62 /* K60-79 */
188 addi r1,r1,INT_FRAME_SIZE