xref: /openbmc/linux/arch/powerpc/crypto/sha1-powerpc-asm.S (revision 27777890d0fae55d14ef18791fc7994faf1bc867)
1323a6bf1SMichael Ellerman/*
2323a6bf1SMichael Ellerman * SHA-1 implementation for PowerPC.
3323a6bf1SMichael Ellerman *
4323a6bf1SMichael Ellerman * Copyright (C) 2005 Paul Mackerras <paulus@samba.org>
5323a6bf1SMichael Ellerman */
6323a6bf1SMichael Ellerman
7323a6bf1SMichael Ellerman#include <asm/ppc_asm.h>
8323a6bf1SMichael Ellerman#include <asm/asm-offsets.h>
9323a6bf1SMichael Ellerman
10323a6bf1SMichael Ellerman/*
11323a6bf1SMichael Ellerman * We roll the registers for T, A, B, C, D, E around on each
12323a6bf1SMichael Ellerman * iteration; T on iteration t is A on iteration t+1, and so on.
13323a6bf1SMichael Ellerman * We use registers 7 - 12 for this.
14323a6bf1SMichael Ellerman */
15323a6bf1SMichael Ellerman#define RT(t)	((((t)+5)%6)+7)
16323a6bf1SMichael Ellerman#define RA(t)	((((t)+4)%6)+7)
17323a6bf1SMichael Ellerman#define RB(t)	((((t)+3)%6)+7)
18323a6bf1SMichael Ellerman#define RC(t)	((((t)+2)%6)+7)
19323a6bf1SMichael Ellerman#define RD(t)	((((t)+1)%6)+7)
20323a6bf1SMichael Ellerman#define RE(t)	((((t)+0)%6)+7)
21323a6bf1SMichael Ellerman
22323a6bf1SMichael Ellerman/* We use registers 16 - 31 for the W values */
23323a6bf1SMichael Ellerman#define W(t)	(((t)%16)+16)
24323a6bf1SMichael Ellerman
25323a6bf1SMichael Ellerman#define LOADW(t)				\
26323a6bf1SMichael Ellerman	lwz	W(t),(t)*4(r4)
27323a6bf1SMichael Ellerman
28323a6bf1SMichael Ellerman#define STEPD0_LOAD(t)				\
29323a6bf1SMichael Ellerman	andc	r0,RD(t),RB(t);		\
30323a6bf1SMichael Ellerman	and	r6,RB(t),RC(t);		\
31323a6bf1SMichael Ellerman	rotlwi	RT(t),RA(t),5;			\
32323a6bf1SMichael Ellerman	or	r6,r6,r0;			\
33323a6bf1SMichael Ellerman	add	r0,RE(t),r15;			\
34323a6bf1SMichael Ellerman	add	RT(t),RT(t),r6;		\
35323a6bf1SMichael Ellerman	add	r14,r0,W(t);			\
36323a6bf1SMichael Ellerman	lwz	W((t)+4),((t)+4)*4(r4);	\
37323a6bf1SMichael Ellerman	rotlwi	RB(t),RB(t),30;			\
38323a6bf1SMichael Ellerman	add	RT(t),RT(t),r14
39323a6bf1SMichael Ellerman
40323a6bf1SMichael Ellerman#define STEPD0_UPDATE(t)			\
41323a6bf1SMichael Ellerman	and	r6,RB(t),RC(t);		\
42323a6bf1SMichael Ellerman	andc	r0,RD(t),RB(t);		\
43323a6bf1SMichael Ellerman	rotlwi	RT(t),RA(t),5;			\
44323a6bf1SMichael Ellerman	rotlwi	RB(t),RB(t),30;			\
45323a6bf1SMichael Ellerman	or	r6,r6,r0;			\
46323a6bf1SMichael Ellerman	add	r0,RE(t),r15;			\
47323a6bf1SMichael Ellerman	xor	r5,W((t)+4-3),W((t)+4-8);		\
48323a6bf1SMichael Ellerman	add	RT(t),RT(t),r6;		\
49323a6bf1SMichael Ellerman	xor	W((t)+4),W((t)+4-16),W((t)+4-14);	\
50323a6bf1SMichael Ellerman	add	r0,r0,W(t);			\
51323a6bf1SMichael Ellerman	xor	W((t)+4),W((t)+4),r5;			\
52323a6bf1SMichael Ellerman	add	RT(t),RT(t),r0;		\
53323a6bf1SMichael Ellerman	rotlwi	W((t)+4),W((t)+4),1
54323a6bf1SMichael Ellerman
55323a6bf1SMichael Ellerman#define STEPD1(t)				\
56323a6bf1SMichael Ellerman	xor	r6,RB(t),RC(t);		\
57323a6bf1SMichael Ellerman	rotlwi	RT(t),RA(t),5;			\
58323a6bf1SMichael Ellerman	rotlwi	RB(t),RB(t),30;			\
59323a6bf1SMichael Ellerman	xor	r6,r6,RD(t);			\
60323a6bf1SMichael Ellerman	add	r0,RE(t),r15;			\
61323a6bf1SMichael Ellerman	add	RT(t),RT(t),r6;		\
62323a6bf1SMichael Ellerman	add	r0,r0,W(t);			\
63323a6bf1SMichael Ellerman	add	RT(t),RT(t),r0
64323a6bf1SMichael Ellerman
65323a6bf1SMichael Ellerman#define STEPD1_UPDATE(t)				\
66323a6bf1SMichael Ellerman	xor	r6,RB(t),RC(t);		\
67323a6bf1SMichael Ellerman	rotlwi	RT(t),RA(t),5;			\
68323a6bf1SMichael Ellerman	rotlwi	RB(t),RB(t),30;			\
69323a6bf1SMichael Ellerman	xor	r6,r6,RD(t);			\
70323a6bf1SMichael Ellerman	add	r0,RE(t),r15;			\
71323a6bf1SMichael Ellerman	xor	r5,W((t)+4-3),W((t)+4-8);		\
72323a6bf1SMichael Ellerman	add	RT(t),RT(t),r6;		\
73323a6bf1SMichael Ellerman	xor	W((t)+4),W((t)+4-16),W((t)+4-14);	\
74323a6bf1SMichael Ellerman	add	r0,r0,W(t);			\
75323a6bf1SMichael Ellerman	xor	W((t)+4),W((t)+4),r5;			\
76323a6bf1SMichael Ellerman	add	RT(t),RT(t),r0;		\
77323a6bf1SMichael Ellerman	rotlwi	W((t)+4),W((t)+4),1
78323a6bf1SMichael Ellerman
79323a6bf1SMichael Ellerman#define STEPD2_UPDATE(t)			\
80323a6bf1SMichael Ellerman	and	r6,RB(t),RC(t);		\
81323a6bf1SMichael Ellerman	and	r0,RB(t),RD(t);		\
82323a6bf1SMichael Ellerman	rotlwi	RT(t),RA(t),5;			\
83323a6bf1SMichael Ellerman	or	r6,r6,r0;			\
84323a6bf1SMichael Ellerman	rotlwi	RB(t),RB(t),30;			\
85323a6bf1SMichael Ellerman	and	r0,RC(t),RD(t);		\
86323a6bf1SMichael Ellerman	xor	r5,W((t)+4-3),W((t)+4-8);	\
87323a6bf1SMichael Ellerman	or	r6,r6,r0;			\
88323a6bf1SMichael Ellerman	xor	W((t)+4),W((t)+4-16),W((t)+4-14);	\
89323a6bf1SMichael Ellerman	add	r0,RE(t),r15;			\
90323a6bf1SMichael Ellerman	add	RT(t),RT(t),r6;		\
91323a6bf1SMichael Ellerman	add	r0,r0,W(t);			\
92323a6bf1SMichael Ellerman	xor	W((t)+4),W((t)+4),r5;		\
93323a6bf1SMichael Ellerman	add	RT(t),RT(t),r0;		\
94323a6bf1SMichael Ellerman	rotlwi	W((t)+4),W((t)+4),1
95323a6bf1SMichael Ellerman
96323a6bf1SMichael Ellerman#define STEP0LD4(t)				\
97323a6bf1SMichael Ellerman	STEPD0_LOAD(t);				\
98323a6bf1SMichael Ellerman	STEPD0_LOAD((t)+1);			\
99323a6bf1SMichael Ellerman	STEPD0_LOAD((t)+2);			\
100323a6bf1SMichael Ellerman	STEPD0_LOAD((t)+3)
101323a6bf1SMichael Ellerman
102323a6bf1SMichael Ellerman#define STEPUP4(t, fn)				\
103323a6bf1SMichael Ellerman	STEP##fn##_UPDATE(t);			\
104323a6bf1SMichael Ellerman	STEP##fn##_UPDATE((t)+1);		\
105323a6bf1SMichael Ellerman	STEP##fn##_UPDATE((t)+2);		\
106323a6bf1SMichael Ellerman	STEP##fn##_UPDATE((t)+3)
107323a6bf1SMichael Ellerman
108323a6bf1SMichael Ellerman#define STEPUP20(t, fn)				\
109323a6bf1SMichael Ellerman	STEPUP4(t, fn);				\
110323a6bf1SMichael Ellerman	STEPUP4((t)+4, fn);			\
111323a6bf1SMichael Ellerman	STEPUP4((t)+8, fn);			\
112323a6bf1SMichael Ellerman	STEPUP4((t)+12, fn);			\
113323a6bf1SMichael Ellerman	STEPUP4((t)+16, fn)
114323a6bf1SMichael Ellerman
115323a6bf1SMichael Ellerman_GLOBAL(powerpc_sha_transform)
116*27777890STony Breeds	PPC_STLU r1,-INT_FRAME_SIZE(r1)
117323a6bf1SMichael Ellerman	SAVE_8GPRS(14, r1)
118323a6bf1SMichael Ellerman	SAVE_10GPRS(22, r1)
119323a6bf1SMichael Ellerman
120323a6bf1SMichael Ellerman	/* Load up A - E */
121323a6bf1SMichael Ellerman	lwz	RA(0),0(r3)	/* A */
122323a6bf1SMichael Ellerman	lwz	RB(0),4(r3)	/* B */
123323a6bf1SMichael Ellerman	lwz	RC(0),8(r3)	/* C */
124323a6bf1SMichael Ellerman	lwz	RD(0),12(r3)	/* D */
125323a6bf1SMichael Ellerman	lwz	RE(0),16(r3)	/* E */
126323a6bf1SMichael Ellerman
127323a6bf1SMichael Ellerman	LOADW(0)
128323a6bf1SMichael Ellerman	LOADW(1)
129323a6bf1SMichael Ellerman	LOADW(2)
130323a6bf1SMichael Ellerman	LOADW(3)
131323a6bf1SMichael Ellerman
132323a6bf1SMichael Ellerman	lis	r15,0x5a82	/* K0-19 */
133323a6bf1SMichael Ellerman	ori	r15,r15,0x7999
134323a6bf1SMichael Ellerman	STEP0LD4(0)
135323a6bf1SMichael Ellerman	STEP0LD4(4)
136323a6bf1SMichael Ellerman	STEP0LD4(8)
137323a6bf1SMichael Ellerman	STEPUP4(12, D0)
138323a6bf1SMichael Ellerman	STEPUP4(16, D0)
139323a6bf1SMichael Ellerman
140323a6bf1SMichael Ellerman	lis	r15,0x6ed9	/* K20-39 */
141323a6bf1SMichael Ellerman	ori	r15,r15,0xeba1
142323a6bf1SMichael Ellerman	STEPUP20(20, D1)
143323a6bf1SMichael Ellerman
144323a6bf1SMichael Ellerman	lis	r15,0x8f1b	/* K40-59 */
145323a6bf1SMichael Ellerman	ori	r15,r15,0xbcdc
146323a6bf1SMichael Ellerman	STEPUP20(40, D2)
147323a6bf1SMichael Ellerman
148323a6bf1SMichael Ellerman	lis	r15,0xca62	/* K60-79 */
149323a6bf1SMichael Ellerman	ori	r15,r15,0xc1d6
150323a6bf1SMichael Ellerman	STEPUP4(60, D1)
151323a6bf1SMichael Ellerman	STEPUP4(64, D1)
152323a6bf1SMichael Ellerman	STEPUP4(68, D1)
153323a6bf1SMichael Ellerman	STEPUP4(72, D1)
154323a6bf1SMichael Ellerman	lwz	r20,16(r3)
155323a6bf1SMichael Ellerman	STEPD1(76)
156323a6bf1SMichael Ellerman	lwz	r19,12(r3)
157323a6bf1SMichael Ellerman	STEPD1(77)
158323a6bf1SMichael Ellerman	lwz	r18,8(r3)
159323a6bf1SMichael Ellerman	STEPD1(78)
160323a6bf1SMichael Ellerman	lwz	r17,4(r3)
161323a6bf1SMichael Ellerman	STEPD1(79)
162323a6bf1SMichael Ellerman
163323a6bf1SMichael Ellerman	lwz	r16,0(r3)
164323a6bf1SMichael Ellerman	add	r20,RE(80),r20
165323a6bf1SMichael Ellerman	add	RD(0),RD(80),r19
166323a6bf1SMichael Ellerman	add	RC(0),RC(80),r18
167323a6bf1SMichael Ellerman	add	RB(0),RB(80),r17
168323a6bf1SMichael Ellerman	add	RA(0),RA(80),r16
169323a6bf1SMichael Ellerman	mr	RE(0),r20
170323a6bf1SMichael Ellerman	stw	RA(0),0(r3)
171323a6bf1SMichael Ellerman	stw	RB(0),4(r3)
172323a6bf1SMichael Ellerman	stw	RC(0),8(r3)
173323a6bf1SMichael Ellerman	stw	RD(0),12(r3)
174323a6bf1SMichael Ellerman	stw	RE(0),16(r3)
175323a6bf1SMichael Ellerman
176323a6bf1SMichael Ellerman	REST_8GPRS(14, r1)
177323a6bf1SMichael Ellerman	REST_10GPRS(22, r1)
178*27777890STony Breeds	addi	r1,r1,INT_FRAME_SIZE
179323a6bf1SMichael Ellerman	blr
180