Linux-libre 5.4-rc7-gnu
[librecmc/linux-libre.git] / arch / powerpc / crypto / md5-asm.S
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Fast MD5 implementation for PPC
4  *
5  * Copyright (c) 2015 Markus Stockhausen <stockhausen@collogia.de>
6  */
7 #include <asm/ppc_asm.h>
8 #include <asm/asm-offsets.h>
9 #include <asm/asm-compat.h>
10
11 #define rHP     r3
12 #define rWP     r4
13
14 #define rH0     r0
15 #define rH1     r6
16 #define rH2     r7
17 #define rH3     r5
18
19 #define rW00    r8
20 #define rW01    r9
21 #define rW02    r10
22 #define rW03    r11
23 #define rW04    r12
24 #define rW05    r14
25 #define rW06    r15
26 #define rW07    r16
27 #define rW08    r17
28 #define rW09    r18
29 #define rW10    r19
30 #define rW11    r20
31 #define rW12    r21
32 #define rW13    r22
33 #define rW14    r23
34 #define rW15    r24
35
36 #define rT0     r25
37 #define rT1     r26
38
39 #define INITIALIZE \
40         PPC_STLU r1,-INT_FRAME_SIZE(r1); \
41         SAVE_8GPRS(14, r1);             /* push registers onto stack    */ \
42         SAVE_4GPRS(22, r1);                                                \
43         SAVE_GPR(26, r1)
44
45 #define FINALIZE \
46         REST_8GPRS(14, r1);             /* pop registers from stack     */ \
47         REST_4GPRS(22, r1);                                                \
48         REST_GPR(26, r1);                                                  \
49         addi    r1,r1,INT_FRAME_SIZE;
50
51 #ifdef __BIG_ENDIAN__
52 #define LOAD_DATA(reg, off) \
53         lwbrx           reg,0,rWP;      /* load data                    */
54 #define INC_PTR \
55         addi            rWP,rWP,4;      /* increment per word           */
56 #define NEXT_BLOCK                      /* nothing to do                */
57 #else
58 #define LOAD_DATA(reg, off) \
59         lwz             reg,off(rWP);   /* load data                    */
60 #define INC_PTR                         /* nothing to do                */
61 #define NEXT_BLOCK \
62         addi            rWP,rWP,64;     /* increment per block          */
63 #endif
64
65 #define R_00_15(a, b, c, d, w0, w1, p, q, off, k0h, k0l, k1h, k1l) \
66         LOAD_DATA(w0, off)              /*    W                         */ \
67         and             rT0,b,c;        /* 1: f = b and c               */ \
68         INC_PTR                         /*    ptr++                     */ \
69         andc            rT1,d,b;        /* 1: f' = ~b and d             */ \
70         LOAD_DATA(w1, off+4)            /*    W                         */ \
71         or              rT0,rT0,rT1;    /* 1: f = f or f'               */ \
72         addi            w0,w0,k0l;      /* 1: wk = w + k                */ \
73         add             a,a,rT0;        /* 1: a = a + f                 */ \
74         addis           w0,w0,k0h;      /* 1: wk = w + k'               */ \
75         addis           w1,w1,k1h;      /* 2: wk = w + k                */ \
76         add             a,a,w0;         /* 1: a = a + wk                */ \
77         addi            w1,w1,k1l;      /* 2: wk = w + k'               */ \
78         rotrwi          a,a,p;          /* 1: a = a rotl x              */ \
79         add             d,d,w1;         /* 2: a = a + wk                */ \
80         add             a,a,b;          /* 1: a = a + b                 */ \
81         and             rT0,a,b;        /* 2: f = b and c               */ \
82         andc            rT1,c,a;        /* 2: f' = ~b and d             */ \
83         or              rT0,rT0,rT1;    /* 2: f = f or f'               */ \
84         add             d,d,rT0;        /* 2: a = a + f                 */ \
85         INC_PTR                         /*    ptr++                     */ \
86         rotrwi          d,d,q;          /* 2: a = a rotl x              */ \
87         add             d,d,a;          /* 2: a = a + b                 */
88
89 #define R_16_31(a, b, c, d, w0, w1, p, q, k0h, k0l, k1h, k1l) \
90         andc            rT0,c,d;        /* 1: f = c and ~d              */ \
91         and             rT1,b,d;        /* 1: f' = b and d              */ \
92         addi            w0,w0,k0l;      /* 1: wk = w + k                */ \
93         or              rT0,rT0,rT1;    /* 1: f = f or f'               */ \
94         addis           w0,w0,k0h;      /* 1: wk = w + k'               */ \
95         add             a,a,rT0;        /* 1: a = a + f                 */ \
96         addi            w1,w1,k1l;      /* 2: wk = w + k                */ \
97         add             a,a,w0;         /* 1: a = a + wk                */ \
98         addis           w1,w1,k1h;      /* 2: wk = w + k'               */ \
99         andc            rT0,b,c;        /* 2: f = c and ~d              */ \
100         rotrwi          a,a,p;          /* 1: a = a rotl x              */ \
101         add             a,a,b;          /* 1: a = a + b                 */ \
102         add             d,d,w1;         /* 2: a = a + wk                */ \
103         and             rT1,a,c;        /* 2: f' = b and d              */ \
104         or              rT0,rT0,rT1;    /* 2: f = f or f'               */ \
105         add             d,d,rT0;        /* 2: a = a + f                 */ \
106         rotrwi          d,d,q;          /* 2: a = a rotl x              */ \
107         add             d,d,a;          /* 2: a = a +b                  */
108
109 #define R_32_47(a, b, c, d, w0, w1, p, q, k0h, k0l, k1h, k1l) \
110         xor             rT0,b,c;        /* 1: f' = b xor c              */ \
111         addi            w0,w0,k0l;      /* 1: wk = w + k                */ \
112         xor             rT1,rT0,d;      /* 1: f = f xor f'              */ \
113         addis           w0,w0,k0h;      /* 1: wk = w + k'               */ \
114         add             a,a,rT1;        /* 1: a = a + f                 */ \
115         addi            w1,w1,k1l;      /* 2: wk = w + k                */ \
116         add             a,a,w0;         /* 1: a = a + wk                */ \
117         addis           w1,w1,k1h;      /* 2: wk = w + k'               */ \
118         rotrwi          a,a,p;          /* 1: a = a rotl x              */ \
119         add             d,d,w1;         /* 2: a = a + wk                */ \
120         add             a,a,b;          /* 1: a = a + b                 */ \
121         xor             rT1,rT0,a;      /* 2: f = b xor f'              */ \
122         add             d,d,rT1;        /* 2: a = a + f                 */ \
123         rotrwi          d,d,q;          /* 2: a = a rotl x              */ \
124         add             d,d,a;          /* 2: a = a + b                 */
125
126 #define R_48_63(a, b, c, d, w0, w1, p, q, k0h, k0l, k1h, k1l) \
127         addi            w0,w0,k0l;      /* 1: w = w + k                 */ \
128         orc             rT0,b,d;        /* 1: f = b or ~d               */ \
129         addis           w0,w0,k0h;      /* 1: w = w + k'                */ \
130         xor             rT0,rT0,c;      /* 1: f = f xor c               */ \
131         add             a,a,w0;         /* 1: a = a + wk                */ \
132         addi            w1,w1,k1l;      /* 2: w = w + k                 */ \
133         add             a,a,rT0;        /* 1: a = a + f                 */ \
134         addis           w1,w1,k1h;      /* 2: w = w + k'                */ \
135         rotrwi          a,a,p;          /* 1: a = a rotl x              */ \
136         add             a,a,b;          /* 1: a = a + b                 */ \
137         orc             rT0,a,c;        /* 2: f = b or ~d               */ \
138         add             d,d,w1;         /* 2: a = a + wk                */ \
139         xor             rT0,rT0,b;      /* 2: f = f xor c               */ \
140         add             d,d,rT0;        /* 2: a = a + f                 */ \
141         rotrwi          d,d,q;          /* 2: a = a rotl x              */ \
142         add             d,d,a;          /* 2: a = a + b                 */
143
144 _GLOBAL(ppc_md5_transform)
145         INITIALIZE
146
147         mtctr           r5
148         lwz             rH0,0(rHP)
149         lwz             rH1,4(rHP)
150         lwz             rH2,8(rHP)
151         lwz             rH3,12(rHP)
152
153 ppc_md5_main:
154         R_00_15(rH0, rH1, rH2, rH3, rW00, rW01, 25, 20, 0,
155                 0xd76b, -23432, 0xe8c8, -18602)
156         R_00_15(rH2, rH3, rH0, rH1, rW02, rW03, 15, 10, 8,
157                 0x2420, 0x70db, 0xc1be, -12562)
158         R_00_15(rH0, rH1, rH2, rH3, rW04, rW05, 25, 20, 16,
159                 0xf57c, 0x0faf, 0x4788, -14806)
160         R_00_15(rH2, rH3, rH0, rH1, rW06, rW07, 15, 10, 24,
161                 0xa830, 0x4613, 0xfd47, -27391)
162         R_00_15(rH0, rH1, rH2, rH3, rW08, rW09, 25, 20, 32,
163                 0x6981, -26408, 0x8b45,  -2129)
164         R_00_15(rH2, rH3, rH0, rH1, rW10, rW11, 15, 10, 40,
165                 0xffff, 0x5bb1, 0x895d, -10306)
166         R_00_15(rH0, rH1, rH2, rH3, rW12, rW13, 25, 20, 48,
167                 0x6b90, 0x1122, 0xfd98, 0x7193)
168         R_00_15(rH2, rH3, rH0, rH1, rW14, rW15, 15, 10, 56,
169                 0xa679, 0x438e, 0x49b4, 0x0821)
170
171         R_16_31(rH0, rH1, rH2, rH3, rW01, rW06, 27, 23,
172                 0x0d56, 0x6e0c, 0x1810, 0x6d2d)
173         R_16_31(rH2, rH3, rH0, rH1, rW11, rW00, 18, 12,
174                 0x9d02, -32109, 0x124c, 0x2332)
175         R_16_31(rH0, rH1, rH2, rH3, rW05, rW10, 27, 23,
176                 0x8ea7, 0x4a33, 0x0245, -18270)
177         R_16_31(rH2, rH3, rH0, rH1, rW15, rW04, 18, 12,
178                 0x8eee,  -8608, 0xf258,  -5095)
179         R_16_31(rH0, rH1, rH2, rH3, rW09, rW14, 27, 23,
180                 0x969d, -10697, 0x1cbe, -15288)
181         R_16_31(rH2, rH3, rH0, rH1, rW03, rW08, 18, 12,
182                 0x3317, 0x3e99, 0xdbd9, 0x7c15)
183         R_16_31(rH0, rH1, rH2, rH3, rW13, rW02, 27, 23,
184                 0xac4b, 0x7772, 0xd8cf, 0x331d)
185         R_16_31(rH2, rH3, rH0, rH1, rW07, rW12, 18, 12,
186                 0x6a28, 0x6dd8, 0x219a, 0x3b68)
187
188         R_32_47(rH0, rH1, rH2, rH3, rW05, rW08, 28, 21,
189                 0x29cb, 0x28e5, 0x4218,  -7788)
190         R_32_47(rH2, rH3, rH0, rH1, rW11, rW14, 16,  9,
191                 0x473f, 0x06d1, 0x3aae, 0x3036)
192         R_32_47(rH0, rH1, rH2, rH3, rW01, rW04, 28, 21,
193                 0xaea1, -15134, 0x640b, -11295)
194         R_32_47(rH2, rH3, rH0, rH1, rW07, rW10, 16,  9,
195                 0x8f4c, 0x4887, 0xbc7c, -22499)
196         R_32_47(rH0, rH1, rH2, rH3, rW13, rW00, 28, 21,
197                 0x7eb8, -27199, 0x00ea, 0x6050)
198         R_32_47(rH2, rH3, rH0, rH1, rW03, rW06, 16,  9,
199                 0xe01a, 0x22fe, 0x4447, 0x69c5)
200         R_32_47(rH0, rH1, rH2, rH3, rW09, rW12, 28, 21,
201                 0xb7f3, 0x0253, 0x59b1, 0x4d5b)
202         R_32_47(rH2, rH3, rH0, rH1, rW15, rW02, 16,  9,
203                 0x4701, -27017, 0xc7bd, -19859)
204
205         R_48_63(rH0, rH1, rH2, rH3, rW00, rW07, 26, 22,
206                 0x0988,  -1462, 0x4c70, -19401)
207         R_48_63(rH2, rH3, rH0, rH1, rW14, rW05, 17, 11,
208                 0xadaf,  -5221, 0xfc99, 0x66f7)
209         R_48_63(rH0, rH1, rH2, rH3, rW12, rW03, 26, 22,
210                 0x7e80, -16418, 0xba1e, -25587)
211         R_48_63(rH2, rH3, rH0, rH1, rW10, rW01, 17, 11,
212                 0x4130, 0x380d, 0xe0c5, 0x738d)
213         lwz             rW00,0(rHP)
214         R_48_63(rH0, rH1, rH2, rH3, rW08, rW15, 26, 22,
215                 0xe837, -30770, 0xde8a, 0x69e8)
216         lwz             rW14,4(rHP)
217         R_48_63(rH2, rH3, rH0, rH1, rW06, rW13, 17, 11,
218                 0x9e79, 0x260f, 0x256d, -27941)
219         lwz             rW12,8(rHP)
220         R_48_63(rH0, rH1, rH2, rH3, rW04, rW11, 26, 22,
221                 0xab75, -20775, 0x4f9e, -28397)
222         lwz             rW10,12(rHP)
223         R_48_63(rH2, rH3, rH0, rH1, rW02, rW09, 17, 11,
224                 0x662b, 0x7c56, 0x11b2, 0x0358)
225
226         add             rH0,rH0,rW00
227         stw             rH0,0(rHP)
228         add             rH1,rH1,rW14
229         stw             rH1,4(rHP)
230         add             rH2,rH2,rW12
231         stw             rH2,8(rHP)
232         add             rH3,rH3,rW10
233         stw             rH3,12(rHP)
234         NEXT_BLOCK
235
236         bdnz            ppc_md5_main
237
238         FINALIZE
239         blr