43a523f8a6c81851fbf29b356b44578ad4e24753
[platform/upstream/nettle.git] / arm / neon / sha3-permute.asm
1 C arm/neon/sha3-permute.asm
2
3 ifelse(<
4    Copyright (C) 2013 Niels Möller
5
6    This file is part of GNU Nettle.
7
8    GNU Nettle is free software: you can redistribute it and/or
9    modify it under the terms of either:
10
11      * the GNU Lesser General Public License as published by the Free
12        Software Foundation; either version 3 of the License, or (at your
13        option) any later version.
14
15    or
16
17      * the GNU General Public License as published by the Free
18        Software Foundation; either version 2 of the License, or (at your
19        option) any later version.
20
21    or both in parallel, as here.
22
23    GNU Nettle is distributed in the hope that it will be useful,
24    but WITHOUT ANY WARRANTY; without even the implied warranty of
25    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
26    General Public License for more details.
27
28    You should have received copies of the GNU General Public License and
29    the GNU Lesser General Public License along with this program.  If
30    not, see http://www.gnu.org/licenses/.
31 >) 
32
33         .file "sha3-permute.asm"
34         .fpu    neon
35
36 define(<CTX>, <r0>)
37 define(<COUNT>, <r1>)
38 define(<RC>, <r2>)
39 C First column
40 define(<A0>, <d0>)
41 define(<A5>, <d2>)
42 define(<A10>, <d3>)
43 define(<A15>, <d4>)
44 define(<A20>, <d5>)
45
46 define(<A1>, <d6>)
47 define(<A2>, <d7>)
48 define(<A3>, <d8>)
49 define(<A4>, <d9>)
50
51 define(<A6>, <d16>)
52 define(<A7>, <d17>)
53 define(<A8>, <d18>)
54 define(<A9>, <d19>)
55
56 define(<A11>, <d20>)
57 define(<A12>, <d21>)
58 define(<A13>, <d22>)
59 define(<A14>, <d23>)
60
61 define(<A16>, <d24>)
62 define(<A17>, <d25>)
63 define(<A18>, <d26>)
64 define(<A19>, <d27>)
65
66 define(<A21>, <d28>)
67 define(<A22>, <d29>)
68 define(<A23>, <d30>)
69 define(<A24>, <d31>)
70
71 define(<T0>, <d10>)
72 define(<T1>, <d11>)
73
74 define(<C0>, <d1>)
75 define(<C1>, <d12>)
76 define(<C2>, <d13>)
77 define(<C3>, <d14>)
78 define(<C4>, <d15>)
79
80
81 C ROL(DST, SRC, COUNT)
82 C Must have SRC != DST
83 define(<ROL>, <
84         vshr.u64        $1, $2, #eval(64-$3)
85         vsli.i64        $1, $2, #$3
86         >)
87 C sha3_permute(struct sha3_ctx *ctx)
88
89         .text
90         .align  3
91 .Lrc:
92         .quad   0x0000000000000001
93         .quad   0x0000000000008082
94         .quad   0x800000000000808A
95         .quad   0x8000000080008000
96         .quad   0x000000000000808B
97         .quad   0x0000000080000001
98         .quad   0x8000000080008081
99         .quad   0x8000000000008009
100         .quad   0x000000000000008A
101         .quad   0x0000000000000088
102         .quad   0x0000000080008009
103         .quad   0x000000008000000A
104         .quad   0x000000008000808B
105         .quad   0x800000000000008B
106         .quad   0x8000000000008089
107         .quad   0x8000000000008003
108         .quad   0x8000000000008002
109         .quad   0x8000000000000080
110         .quad   0x000000000000800A
111         .quad   0x800000008000000A
112         .quad   0x8000000080008081
113         .quad   0x8000000000008080
114         .quad   0x0000000080000001
115         .quad   0x8000000080008008
116         
117 PROLOGUE(nettle_sha3_permute)
118         vpush   {d8-d15}
119
120         vld1.64 {A0}, [CTX]!
121         vldm    CTX!, {A1,A2,A3,A4}
122         vld1.64 {A5}, [CTX]!
123         vldm    CTX!, {A6,A7,A8,A9}
124         vld1.64 {A10}, [CTX]!
125         vldm    CTX!, {A11,A12,A13,A14}
126         vld1.64 {A15}, [CTX]!
127         vldm    CTX!, {A16,A17,A18,A19}
128         vld1.64 {A20}, [CTX]!
129         vldm    CTX, {A21,A22,A23,A24}
130         sub     CTX, CTX, #168
131
132         mov     COUNT, #24
133         adr     RC, .Lrc
134
135         .align 3
136 .Loop:
137         veor    QREG(T0), QREG(A5), QREG(A15)
138         veor    C0, A0, T0
139         veor    C0, C0, T1
140         veor    QREG(C1), QREG(A1), QREG(A6)
141         veor    QREG(C1), QREG(C1), QREG(A11)
142         veor    QREG(C1), QREG(C1), QREG(A16)
143         veor    QREG(C1), QREG(C1), QREG(A21)
144
145         veor    QREG(C3), QREG(A3), QREG(A8)
146         veor    QREG(C3), QREG(C3), QREG(A13)
147         veor    QREG(C3), QREG(C3), QREG(A18)
148         veor    QREG(C3), QREG(C3), QREG(A23)
149
150         C       D0 = C4 ^ (C1 <<< 1)
151         C       NOTE: Using ROL macro (and vsli) is slightly slower.
152         vshl.i64        T0, C1, #1
153         vshr.u64        T1, C1, #63
154         veor    T0, T0, C4
155         veor    T0, T0, T1
156         vmov    T1, T0
157         veor    A0, A0, T0
158         veor    QREG(A5), QREG(A5), QREG(T0)
159         veor    QREG(A15), QREG(A15), QREG(T0)
160         
161         C       D1 = C0 ^ (C2 <<< 1)
162         C       D2 = C1 ^ (C3 <<< 1)
163         ROL(T0, C2, 1)
164         ROL(T1, C3, 1)
165         veor    T0, T0, C0
166         veor    T1, T1, C1
167         veor    QREG(A1), QREG(A1), QREG(T0)
168         veor    QREG(A6), QREG(A6), QREG(T0)
169         veor    QREG(A11), QREG(A11), QREG(T0)
170         veor    QREG(A16), QREG(A16), QREG(T0)
171         veor    QREG(A21), QREG(A21), QREG(T0)
172
173         C       D3 = C2 ^ (C4 <<< 1)
174         C       D4 = C3 ^ (C0 <<< 1)
175         ROL(T0, C4, 1)
176         ROL(T1, C0, 1)
177         veor    T0, T0, C2
178         veor    T1, T1, C3
179         veor    QREG(A3), QREG(A3), QREG(T0)
180         veor    QREG(A8), QREG(A8), QREG(T0)
181         veor    QREG(A13), QREG(A13), QREG(T0)
182         veor    QREG(A18), QREG(A18), QREG(T0)
183         veor    QREG(A23), QREG(A23), QREG(T0)
184
185         ROL( T0,  A1,  1)
186         ROL( A1,  A6, 44)
187         ROL( A6,  A9, 20)
188         ROL( A9, A22, 61)
189         ROL(A22, A14, 39)
190         ROL(A14, A20, 18)
191         ROL(A20,  A2, 62)
192         ROL( A2, A12, 43)
193         ROL(A12, A13, 25)
194         ROL(A13, A19,  8)
195         ROL(A19, A23, 56)
196         ROL(A23, A15, 41)
197         ROL(A15,  A4, 27)
198         ROL( A4, A24, 14)
199         ROL(A24, A21,  2)
200         ROL(A21,  A8, 55)
201         ROL( A8, A16, 45)
202         ROL(A16,  A5, 36)
203         ROL( A5,  A3, 28)
204         ROL( A3, A18, 21)
205         ROL(A18, A17, 15)
206         ROL(A17, A11, 10)
207         ROL(A11,  A7,  6)
208         ROL( A7, A10,  3)
209         C New A10 value left in T0
210
211         vbic    C0, A2, A1
212         vbic    C1, A3, A2
213         vbic    C2, A4, A3
214         vbic    C3, A0, A4
215         vbic    C4, A1, A0
216
217         veor    A0, A0, C0
218         vld1.64 {C0}, [RC :64]!
219         veor    QREG(A1), QREG(A1), QREG(C1)
220         veor    QREG(A3), QREG(A3), QREG(C3)
221         veor    A0, A0, C0
222
223         vbic    C0, A7, A6
224         vbic    C1, A8, A7
225         vbic    C2, A9, A8
226         vbic    C3, A5, A9
227         vbic    C4, A6, A5
228
229         veor    A5, A5, C0
230         veor    QREG(A6), QREG(A6), QREG(C1)
231         veor    QREG(A8), QREG(A8), QREG(C3)
232
233         vbic    C0, A12, A11
234         vbic    C1, A13, A12
235         vbic    C2, A14, A13
236         vbic    C3, T0, A14
237         vbic    C4, A11, T0
238
239         veor    A10, T0, C0
240         veor    QREG(A11), QREG(A11), QREG(C1)
241         veor    QREG(A13), QREG(A13), QREG(C3)
242
243         vbic    C0, A17, A16
244         vbic    C1, A18, A17
245         vbic    C2, A19, A18
246         vbic    C3, A15, A19
247         vbic    C4, A16, A15
248
249         veor    A15, A15, C0
250         veor    QREG(A16), QREG(A16), QREG(C1)
251         veor    QREG(A18), QREG(A18), QREG(C3)
252
253         vbic    C0, A22, A21
254         vbic    C1, A23, A22
255         vbic    C2, A24, A23
256         vbic    C3, A20, A24
257         vbic    C4, A21, A20
258
259         subs    COUNT, COUNT, #1
260         veor    A20, A20, C0
261         veor    QREG(A21), QREG(A21), QREG(C1)
262         veor    QREG(A23), QREG(A23), QREG(C3)
263
264         bne     .Loop
265
266         vst1.64 {A0}, [CTX]!
267         vstm    CTX!, {A1,A2,A3,A4}
268         vst1.64 {A5}, [CTX]!
269         vstm    CTX!, {A6,A7,A8,A9}
270         vst1.64 {A10}, [CTX]!
271         vstm    CTX!, {A11,A12,A13,A14}
272         vst1.64 {A15}, [CTX]!
273         vstm    CTX!, {A16,A17,A18,A19}
274         vst1.64 {A20}, [CTX]!
275         vstm    CTX, {A21,A22,A23,A24}
276         
277         vpop    {d8-d15}
278         bx      lr
279 EPILOGUE(nettle_sha3_permute)