ecb6396ad7f254f147abaa44b062aaa8abb6e304
[platform/upstream/nettle.git] / x86_64 / umac-nh-n.asm
1 C x86_64/umac-nh-n.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 define(<OUT>, <%rdi>)
34 define(<ITERS>, <%rsi>)
35 define(<KEY>, <%rdx>)
36 define(<LENGTH>, <%rcx>)
37 define(<MSG>, <%r8>)
38
39 define(<XM0>, <%xmm0>)
40 define(<XM1>, <%xmm1>)
41 define(<XM2>, <%xmm2>)
42 define(<XM3>, <%xmm3>)
43 define(<XK0>, <%xmm4>)
44 define(<XK1>, <%xmm5>)
45 define(<XK2>, <%xmm6>)
46 define(<XK3>, <%xmm7>)
47 define(<XT0>, <%xmm8>)
48 define(<XT1>, <%xmm9>)
49 define(<XT2>, <%xmm10>)
50 define(<XT3>, <%xmm11>)
51 define(<XY0>, <%xmm12>)
52 define(<XY1>, <%xmm13>)
53
54 C Copy [0,1,2,3] to [1,1,3,3]
55 define(<HI2LO>, <pshufd <$>0xf5,>)
56
57 C FIXME: Would be nice if we could force the key array to be 16-byte
58 C aligned.
59
60         .file "umac-nh-n.asm"
61         
62         C umac_nh_n(uint64_t *out, unsigned n, const uint32_t *key,
63         C           unsigned length, const uint8_t *msg)
64         .text
65         ALIGN(16)
66 PROLOGUE(_nettle_umac_nh_n)
67         W64_ENTRY(5, 14)
68         pxor    XY0, XY0
69         cmp     $3, ITERS
70         jc      .Lnh2
71         je      .Lnh3
72
73 .Lnh4:
74         movups  (KEY), XK0
75         movups  16(KEY), XT2
76         movups  32(KEY), XK2    
77         lea     48(KEY), KEY
78         C Leave XK2 untouched, and put permuted keys in XK0, XK1, XT2, XT3
79         movaps  XK0, XT0
80         movaps  XK0, XK1
81         
82         punpcklqdq XT2, XK0     C [0,1,4,5]
83         punpckhqdq XT2, XK1     C [2,3,6,7]
84         movaps  XT2, XT3
85         punpcklqdq XK2, XT2     C [4,5, 8, 9]
86         punpckhqdq XK2, XT3     C [6,7,10,11]
87
88         movaps  XY0, XY1
89         
90 .Loop4:
91         movups  (MSG), XT0
92         movups  16(MSG), XT1
93
94         pshufd  $0xee, XT1, XM3 C [6,7,6,7]
95         pshufd  $0x44, XT1, XM2 C [4,5,4,5]
96         pshufd  $0xee, XT0, XM1 C [2,3,2,3]
97         pshufd  $0x44, XT0, XM0 C [0,1,0,1]
98
99         paddd   XM0, XK0
100         paddd   XM1, XK1
101         paddd   XM2, XT2
102         paddd   XM3, XT3
103
104         HI2LO   XK0, XT0
105         HI2LO   XT2, XT1
106         pmuludq XK0, XT2
107         pmuludq XT0, XT1
108         paddq   XT2, XY0
109         paddq   XT1, XY0
110
111         HI2LO   XK1, XT0
112         HI2LO   XT3, XT1
113         pmuludq XK1, XT3
114         pmuludq XT0, XT1
115         paddq   XT3, XY0
116         paddq   XT1, XY0
117
118         movaps  XK2, XK0
119         movaps  XK2, XK1
120         movups  (KEY), XT2
121         movups  16(KEY), XK2
122         punpcklqdq XT2, XK0     C [ 8, 9,12,13]
123         punpckhqdq XT2, XK1     C [10,11,14,15]
124         movaps  XT2, XT3
125
126         punpcklqdq XK2, XT2     C [12,13,16,17]
127         punpckhqdq XK2, XT3     C [14,15,18,19]
128
129         paddd   XK0, XM0
130         paddd   XK1, XM1
131         paddd   XT2, XM2
132         paddd   XT3, XM3
133
134         HI2LO   XM0, XT0
135         HI2LO   XM2, XT1
136         pmuludq XM0, XM2
137         pmuludq XT0, XT1
138         paddq   XM2, XY1
139         paddq   XT1, XY1
140
141         HI2LO   XM1, XT0
142         HI2LO   XM3, XT1
143         pmuludq XM1, XM3
144         pmuludq XT0, XT1
145         paddq   XM3, XY1
146         paddq   XT1, XY1
147
148         subl    $32, XREG(LENGTH)
149         lea     32(MSG), MSG
150         lea     32(KEY), KEY
151         ja      .Loop4
152
153         movups  XY0, (OUT)
154         movups  XY1, 16(OUT)
155
156         W64_EXIT(5, 14)
157         ret
158         
159 .Lnh3:
160         movups  (KEY), XK0
161         movups  16(KEY), XK1
162         movaps  XY0, XY1
163 .Loop3:
164         lea     32(KEY), KEY
165         movups  (MSG), XT0
166         movups  16(MSG), XT1
167         movups  (KEY), XK2
168         movups  16(KEY), XK3
169         pshufd  $0xee, XT1, XM3 C [6,7,6,7]
170         pshufd  $0x44, XT1, XM2 C [4,5,4,5]
171         pshufd  $0xee, XT0, XM1 C [2,3,2,3]
172         pshufd  $0x44, XT0, XM0 C [0,1,0,1]
173
174         C Iteration 2
175         paddd   XK2, XT0
176         paddd   XK3, XT1
177         HI2LO   XT0, XT2
178         HI2LO   XT1, XT3
179         pmuludq XT0, XT1
180         pmuludq XT2, XT3
181         paddq   XT1, XY1
182         paddq   XT3, XY1
183
184         C Iteration 0,1
185         movaps  XK0, XT0
186         punpcklqdq XK1, XK0     C [0,1,4,5]
187         punpckhqdq XK1, XT0     C [2,3,6,7]
188         paddd   XK0, XM0
189         paddd   XT0, XM1
190         movaps  XK2, XK0
191         movaps  XK1, XT0
192         punpcklqdq XK2, XK1     C [4,5,8,9]
193         punpckhqdq XK2, XT0     C [6,7,10,11]
194         paddd   XK1, XM2
195         paddd   XT0, XM3
196
197         HI2LO   XM0, XT0
198         HI2LO   XM2, XT1
199         pmuludq XM0, XM2
200         pmuludq XT0, XT1
201         paddq   XM2, XY0
202         paddq   XT1, XY0
203         
204         HI2LO   XM1, XT0
205         HI2LO   XM3, XT1
206         pmuludq XM1, XM3
207         pmuludq XT0, XT1
208         paddq   XM3, XY0
209         paddq   XT1, XY0
210         subl    $32, XREG(LENGTH)
211         lea     32(MSG), MSG
212         movaps  XK2, XK0
213         movaps  XK3, XK1
214
215         ja      .Loop3
216
217         pshufd  $0xe, XY1, XT0
218         paddq   XT0, XY1
219         movups  XY0, (OUT)
220         movlpd  XY1, 16(OUT)
221
222         W64_EXIT(5, 14)
223         ret
224         
225 .Lnh2:
226         C Explode message as [0,1,0,1] [2,3,2,3] [4,5,4,5] [6,7, 6, 7]
227         C Interleave keys as [0,1,4,5] [2,3,6,7] [4,5,8,9] [7,8,10,11]
228         movups  (KEY), XK0
229         lea     16(KEY), KEY
230 .Loop2:
231         movups  (MSG), XM0
232         movups  16(MSG), XM1
233         pshufd  $0xee, XM1, XM3 C [6,7,6,7]
234         pshufd  $0x44, XM1, XM2 C [4,5,4,5]
235         pshufd  $0xee, XM0, XM1 C [2,3,2,3]
236         pshufd  $0x44, XM0, XM0 C [0,1,0,1]
237
238         movups  (KEY), XK1
239         movups  16(KEY), XK2
240         movaps  XK0, XT0
241         punpcklqdq XK1, XK0     C [0,1,4,5]
242         punpckhqdq XK1, XT0     C [2,3,6,7]
243         paddd   XK0, XM0
244         paddd   XT0, XM1
245         movaps  XK2, XK0
246         movaps  XK1, XT0
247         punpcklqdq XK2, XK1     C [4,5,8,9]
248         punpckhqdq XK2, XT0     C [6,7,10,11]
249         paddd   XK1, XM2
250         paddd   XT0, XM3
251
252         HI2LO   XM0, XT0
253         HI2LO   XM2, XT1
254         pmuludq XM0, XM2
255         pmuludq XT0, XT1
256         paddq   XM2, XY0
257         paddq   XT1, XY0
258         
259         HI2LO   XM1, XT0
260         HI2LO   XM3, XT1
261         pmuludq XM1, XM3
262         pmuludq XT0, XT1
263         paddq   XM3, XY0
264         paddq   XT1, XY0
265         subl    $32, XREG(LENGTH)
266         lea     32(MSG), MSG
267         lea     32(KEY), KEY
268
269         ja      .Loop2
270
271         movups  XY0, (OUT)
272 .Lend:
273         W64_EXIT(5, 14)
274         ret
275 EPILOGUE(_nettle_umac_nh_n)