]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - secure/lib/libcrypto/aarch64/keccak1600-armv8.S
MFC: r352191
[FreeBSD/FreeBSD.git] / secure / lib / libcrypto / aarch64 / keccak1600-armv8.S
1 /* $FreeBSD$ */
2 /* Do not modify. This file is auto-generated from keccak1600-armv8.pl. */
3 .text
4
5 .align  8       // strategic alignment and padding that allows to use
6                 // address value as loop termination condition...
7 .quad   0,0,0,0,0,0,0,0
8 .type   iotas,%object
9 iotas:
10 .quad   0x0000000000000001
11 .quad   0x0000000000008082
12 .quad   0x800000000000808a
13 .quad   0x8000000080008000
14 .quad   0x000000000000808b
15 .quad   0x0000000080000001
16 .quad   0x8000000080008081
17 .quad   0x8000000000008009
18 .quad   0x000000000000008a
19 .quad   0x0000000000000088
20 .quad   0x0000000080008009
21 .quad   0x000000008000000a
22 .quad   0x000000008000808b
23 .quad   0x800000000000008b
24 .quad   0x8000000000008089
25 .quad   0x8000000000008003
26 .quad   0x8000000000008002
27 .quad   0x8000000000000080
28 .quad   0x000000000000800a
29 .quad   0x800000008000000a
30 .quad   0x8000000080008081
31 .quad   0x8000000000008080
32 .quad   0x0000000080000001
33 .quad   0x8000000080008008
34 .size   iotas,.-iotas
35 .type   KeccakF1600_int,%function
36 .align  5
37 KeccakF1600_int:
38         adr     x28,iotas
39 .inst   0xd503233f                      // paciasp
40         stp     x28,x30,[sp,#16]                // 32 bytes on top are mine
41         b       .Loop
42 .align  4
43 .Loop:
44         ////////////////////////////////////////// Theta
45         eor     x26,x0,x5
46         stp     x4,x9,[sp,#0]   // offload pair...
47         eor     x27,x1,x6
48         eor     x28,x2,x7
49         eor     x30,x3,x8
50         eor     x4,x4,x9
51         eor     x26,x26,x10
52         eor     x27,x27,x11
53         eor     x28,x28,x12
54         eor     x30,x30,x13
55         eor     x4,x4,x14
56         eor     x26,x26,x15
57         eor     x27,x27,x16
58         eor     x28,x28,x17
59         eor     x30,x30,x25
60         eor     x4,x4,x19
61         eor     x26,x26,x20
62         eor     x28,x28,x22
63         eor     x27,x27,x21
64         eor     x30,x30,x23
65         eor     x4,x4,x24
66
67         eor     x9,x26,x28,ror#63
68
69         eor     x1,x1,x9
70         eor     x6,x6,x9
71         eor     x11,x11,x9
72         eor     x16,x16,x9
73         eor     x21,x21,x9
74
75         eor     x9,x27,x30,ror#63
76         eor     x28,x28,x4,ror#63
77         eor     x30,x30,x26,ror#63
78         eor     x4,x4,x27,ror#63
79
80         eor     x27,   x2,x9            // mov  x27,x2
81         eor     x7,x7,x9
82         eor     x12,x12,x9
83         eor     x17,x17,x9
84         eor     x22,x22,x9
85
86         eor     x0,x0,x4
87         eor     x5,x5,x4
88         eor     x10,x10,x4
89         eor     x15,x15,x4
90         eor     x20,x20,x4
91         ldp     x4,x9,[sp,#0]   // re-load offloaded data
92         eor     x26,   x3,x28           // mov  x26,x3
93         eor     x8,x8,x28
94         eor     x13,x13,x28
95         eor     x25,x25,x28
96         eor     x23,x23,x28
97
98         eor     x28,   x4,x30           // mov  x28,x4
99         eor     x9,x9,x30
100         eor     x14,x14,x30
101         eor     x19,x19,x30
102         eor     x24,x24,x30
103
104         ////////////////////////////////////////// Rho+Pi
105         mov     x30,x1
106         ror     x1,x6,#64-44
107         //mov   x27,x2
108         ror     x2,x12,#64-43
109         //mov   x26,x3
110         ror     x3,x25,#64-21
111         //mov   x28,x4
112         ror     x4,x24,#64-14
113
114         ror     x6,x9,#64-20
115         ror     x12,x13,#64-25
116         ror     x25,x17,#64-15
117         ror     x24,x21,#64-2
118
119         ror     x9,x22,#64-61
120         ror     x13,x19,#64-8
121         ror     x17,x11,#64-10
122         ror     x21,x8,#64-55
123
124         ror     x22,x14,#64-39
125         ror     x19,x23,#64-56
126         ror     x11,x7,#64-6
127         ror     x8,x16,#64-45
128
129         ror     x14,x20,#64-18
130         ror     x23,x15,#64-41
131         ror     x7,x10,#64-3
132         ror     x16,x5,#64-36
133
134         ror     x5,x26,#64-28
135         ror     x10,x30,#64-1
136         ror     x15,x28,#64-27
137         ror     x20,x27,#64-62
138
139         ////////////////////////////////////////// Chi+Iota
140         bic     x26,x2,x1
141         bic     x27,x3,x2
142         bic     x28,x0,x4
143         bic     x30,x1,x0
144         eor     x0,x0,x26
145         bic     x26,x4,x3
146         eor     x1,x1,x27
147         ldr     x27,[sp,#16]
148         eor     x3,x3,x28
149         eor     x4,x4,x30
150         eor     x2,x2,x26
151         ldr     x30,[x27],#8            // Iota[i++]
152
153         bic     x26,x7,x6
154         tst     x27,#255                        // are we done?
155         str     x27,[sp,#16]
156         bic     x27,x8,x7
157         bic     x28,x5,x9
158         eor     x0,x0,x30               // A[0][0] ^= Iota
159         bic     x30,x6,x5
160         eor     x5,x5,x26
161         bic     x26,x9,x8
162         eor     x6,x6,x27
163         eor     x8,x8,x28
164         eor     x9,x9,x30
165         eor     x7,x7,x26
166
167         bic     x26,x12,x11
168         bic     x27,x13,x12
169         bic     x28,x10,x14
170         bic     x30,x11,x10
171         eor     x10,x10,x26
172         bic     x26,x14,x13
173         eor     x11,x11,x27
174         eor     x13,x13,x28
175         eor     x14,x14,x30
176         eor     x12,x12,x26
177
178         bic     x26,x17,x16
179         bic     x27,x25,x17
180         bic     x28,x15,x19
181         bic     x30,x16,x15
182         eor     x15,x15,x26
183         bic     x26,x19,x25
184         eor     x16,x16,x27
185         eor     x25,x25,x28
186         eor     x19,x19,x30
187         eor     x17,x17,x26
188
189         bic     x26,x22,x21
190         bic     x27,x23,x22
191         bic     x28,x20,x24
192         bic     x30,x21,x20
193         eor     x20,x20,x26
194         bic     x26,x24,x23
195         eor     x21,x21,x27
196         eor     x23,x23,x28
197         eor     x24,x24,x30
198         eor     x22,x22,x26
199
200         bne     .Loop
201
202         ldr     x30,[sp,#24]
203 .inst   0xd50323bf                      // autiasp
204         ret
205 .size   KeccakF1600_int,.-KeccakF1600_int
206
207 .type   KeccakF1600,%function
208 .align  5
209 KeccakF1600:
210 .inst   0xd503233f                      // paciasp
211         stp     x29,x30,[sp,#-128]!
212         add     x29,sp,#0
213         stp     x19,x20,[sp,#16]
214         stp     x21,x22,[sp,#32]
215         stp     x23,x24,[sp,#48]
216         stp     x25,x26,[sp,#64]
217         stp     x27,x28,[sp,#80]
218         sub     sp,sp,#48
219
220         str     x0,[sp,#32]                     // offload argument
221         mov     x26,x0
222         ldp     x0,x1,[x0,#16*0]
223         ldp     x2,x3,[x26,#16*1]
224         ldp     x4,x5,[x26,#16*2]
225         ldp     x6,x7,[x26,#16*3]
226         ldp     x8,x9,[x26,#16*4]
227         ldp     x10,x11,[x26,#16*5]
228         ldp     x12,x13,[x26,#16*6]
229         ldp     x14,x15,[x26,#16*7]
230         ldp     x16,x17,[x26,#16*8]
231         ldp     x25,x19,[x26,#16*9]
232         ldp     x20,x21,[x26,#16*10]
233         ldp     x22,x23,[x26,#16*11]
234         ldr     x24,[x26,#16*12]
235
236         bl      KeccakF1600_int
237
238         ldr     x26,[sp,#32]
239         stp     x0,x1,[x26,#16*0]
240         stp     x2,x3,[x26,#16*1]
241         stp     x4,x5,[x26,#16*2]
242         stp     x6,x7,[x26,#16*3]
243         stp     x8,x9,[x26,#16*4]
244         stp     x10,x11,[x26,#16*5]
245         stp     x12,x13,[x26,#16*6]
246         stp     x14,x15,[x26,#16*7]
247         stp     x16,x17,[x26,#16*8]
248         stp     x25,x19,[x26,#16*9]
249         stp     x20,x21,[x26,#16*10]
250         stp     x22,x23,[x26,#16*11]
251         str     x24,[x26,#16*12]
252
253         ldp     x19,x20,[x29,#16]
254         add     sp,sp,#48
255         ldp     x21,x22,[x29,#32]
256         ldp     x23,x24,[x29,#48]
257         ldp     x25,x26,[x29,#64]
258         ldp     x27,x28,[x29,#80]
259         ldp     x29,x30,[sp],#128
260 .inst   0xd50323bf                      // autiasp
261         ret
262 .size   KeccakF1600,.-KeccakF1600
263
264 .globl  SHA3_absorb
265 .type   SHA3_absorb,%function
266 .align  5
267 SHA3_absorb:
268 .inst   0xd503233f                      // paciasp
269         stp     x29,x30,[sp,#-128]!
270         add     x29,sp,#0
271         stp     x19,x20,[sp,#16]
272         stp     x21,x22,[sp,#32]
273         stp     x23,x24,[sp,#48]
274         stp     x25,x26,[sp,#64]
275         stp     x27,x28,[sp,#80]
276         sub     sp,sp,#64
277
278         stp     x0,x1,[sp,#32]                  // offload arguments
279         stp     x2,x3,[sp,#48]
280
281         mov     x26,x0                  // uint64_t A[5][5]
282         mov     x27,x1                  // const void *inp
283         mov     x28,x2                  // size_t len
284         mov     x30,x3                  // size_t bsz
285         ldp     x0,x1,[x26,#16*0]
286         ldp     x2,x3,[x26,#16*1]
287         ldp     x4,x5,[x26,#16*2]
288         ldp     x6,x7,[x26,#16*3]
289         ldp     x8,x9,[x26,#16*4]
290         ldp     x10,x11,[x26,#16*5]
291         ldp     x12,x13,[x26,#16*6]
292         ldp     x14,x15,[x26,#16*7]
293         ldp     x16,x17,[x26,#16*8]
294         ldp     x25,x19,[x26,#16*9]
295         ldp     x20,x21,[x26,#16*10]
296         ldp     x22,x23,[x26,#16*11]
297         ldr     x24,[x26,#16*12]
298         b       .Loop_absorb
299
300 .align  4
301 .Loop_absorb:
302         subs    x26,x28,x30             // len - bsz
303         blo     .Labsorbed
304
305         str     x26,[sp,#48]                    // save len - bsz
306         ldr     x26,[x27],#8            // *inp++
307 #ifdef  __AARCH64EB__
308         rev     x26,x26
309 #endif
310         eor     x0,x0,x26
311         cmp     x30,#8*(0+2)
312         blo     .Lprocess_block
313         ldr     x26,[x27],#8            // *inp++
314 #ifdef  __AARCH64EB__
315         rev     x26,x26
316 #endif
317         eor     x1,x1,x26
318         beq     .Lprocess_block
319         ldr     x26,[x27],#8            // *inp++
320 #ifdef  __AARCH64EB__
321         rev     x26,x26
322 #endif
323         eor     x2,x2,x26
324         cmp     x30,#8*(2+2)
325         blo     .Lprocess_block
326         ldr     x26,[x27],#8            // *inp++
327 #ifdef  __AARCH64EB__
328         rev     x26,x26
329 #endif
330         eor     x3,x3,x26
331         beq     .Lprocess_block
332         ldr     x26,[x27],#8            // *inp++
333 #ifdef  __AARCH64EB__
334         rev     x26,x26
335 #endif
336         eor     x4,x4,x26
337         cmp     x30,#8*(4+2)
338         blo     .Lprocess_block
339         ldr     x26,[x27],#8            // *inp++
340 #ifdef  __AARCH64EB__
341         rev     x26,x26
342 #endif
343         eor     x5,x5,x26
344         beq     .Lprocess_block
345         ldr     x26,[x27],#8            // *inp++
346 #ifdef  __AARCH64EB__
347         rev     x26,x26
348 #endif
349         eor     x6,x6,x26
350         cmp     x30,#8*(6+2)
351         blo     .Lprocess_block
352         ldr     x26,[x27],#8            // *inp++
353 #ifdef  __AARCH64EB__
354         rev     x26,x26
355 #endif
356         eor     x7,x7,x26
357         beq     .Lprocess_block
358         ldr     x26,[x27],#8            // *inp++
359 #ifdef  __AARCH64EB__
360         rev     x26,x26
361 #endif
362         eor     x8,x8,x26
363         cmp     x30,#8*(8+2)
364         blo     .Lprocess_block
365         ldr     x26,[x27],#8            // *inp++
366 #ifdef  __AARCH64EB__
367         rev     x26,x26
368 #endif
369         eor     x9,x9,x26
370         beq     .Lprocess_block
371         ldr     x26,[x27],#8            // *inp++
372 #ifdef  __AARCH64EB__
373         rev     x26,x26
374 #endif
375         eor     x10,x10,x26
376         cmp     x30,#8*(10+2)
377         blo     .Lprocess_block
378         ldr     x26,[x27],#8            // *inp++
379 #ifdef  __AARCH64EB__
380         rev     x26,x26
381 #endif
382         eor     x11,x11,x26
383         beq     .Lprocess_block
384         ldr     x26,[x27],#8            // *inp++
385 #ifdef  __AARCH64EB__
386         rev     x26,x26
387 #endif
388         eor     x12,x12,x26
389         cmp     x30,#8*(12+2)
390         blo     .Lprocess_block
391         ldr     x26,[x27],#8            // *inp++
392 #ifdef  __AARCH64EB__
393         rev     x26,x26
394 #endif
395         eor     x13,x13,x26
396         beq     .Lprocess_block
397         ldr     x26,[x27],#8            // *inp++
398 #ifdef  __AARCH64EB__
399         rev     x26,x26
400 #endif
401         eor     x14,x14,x26
402         cmp     x30,#8*(14+2)
403         blo     .Lprocess_block
404         ldr     x26,[x27],#8            // *inp++
405 #ifdef  __AARCH64EB__
406         rev     x26,x26
407 #endif
408         eor     x15,x15,x26
409         beq     .Lprocess_block
410         ldr     x26,[x27],#8            // *inp++
411 #ifdef  __AARCH64EB__
412         rev     x26,x26
413 #endif
414         eor     x16,x16,x26
415         cmp     x30,#8*(16+2)
416         blo     .Lprocess_block
417         ldr     x26,[x27],#8            // *inp++
418 #ifdef  __AARCH64EB__
419         rev     x26,x26
420 #endif
421         eor     x17,x17,x26
422         beq     .Lprocess_block
423         ldr     x26,[x27],#8            // *inp++
424 #ifdef  __AARCH64EB__
425         rev     x26,x26
426 #endif
427         eor     x25,x25,x26
428         cmp     x30,#8*(18+2)
429         blo     .Lprocess_block
430         ldr     x26,[x27],#8            // *inp++
431 #ifdef  __AARCH64EB__
432         rev     x26,x26
433 #endif
434         eor     x19,x19,x26
435         beq     .Lprocess_block
436         ldr     x26,[x27],#8            // *inp++
437 #ifdef  __AARCH64EB__
438         rev     x26,x26
439 #endif
440         eor     x20,x20,x26
441         cmp     x30,#8*(20+2)
442         blo     .Lprocess_block
443         ldr     x26,[x27],#8            // *inp++
444 #ifdef  __AARCH64EB__
445         rev     x26,x26
446 #endif
447         eor     x21,x21,x26
448         beq     .Lprocess_block
449         ldr     x26,[x27],#8            // *inp++
450 #ifdef  __AARCH64EB__
451         rev     x26,x26
452 #endif
453         eor     x22,x22,x26
454         cmp     x30,#8*(22+2)
455         blo     .Lprocess_block
456         ldr     x26,[x27],#8            // *inp++
457 #ifdef  __AARCH64EB__
458         rev     x26,x26
459 #endif
460         eor     x23,x23,x26
461         beq     .Lprocess_block
462         ldr     x26,[x27],#8            // *inp++
463 #ifdef  __AARCH64EB__
464         rev     x26,x26
465 #endif
466         eor     x24,x24,x26
467
468 .Lprocess_block:
469         str     x27,[sp,#40]                    // save inp
470
471         bl      KeccakF1600_int
472
473         ldr     x27,[sp,#40]                    // restore arguments
474         ldp     x28,x30,[sp,#48]
475         b       .Loop_absorb
476
477 .align  4
478 .Labsorbed:
479         ldr     x27,[sp,#32]
480         stp     x0,x1,[x27,#16*0]
481         stp     x2,x3,[x27,#16*1]
482         stp     x4,x5,[x27,#16*2]
483         stp     x6,x7,[x27,#16*3]
484         stp     x8,x9,[x27,#16*4]
485         stp     x10,x11,[x27,#16*5]
486         stp     x12,x13,[x27,#16*6]
487         stp     x14,x15,[x27,#16*7]
488         stp     x16,x17,[x27,#16*8]
489         stp     x25,x19,[x27,#16*9]
490         stp     x20,x21,[x27,#16*10]
491         stp     x22,x23,[x27,#16*11]
492         str     x24,[x27,#16*12]
493
494         mov     x0,x28                  // return value
495         ldp     x19,x20,[x29,#16]
496         add     sp,sp,#64
497         ldp     x21,x22,[x29,#32]
498         ldp     x23,x24,[x29,#48]
499         ldp     x25,x26,[x29,#64]
500         ldp     x27,x28,[x29,#80]
501         ldp     x29,x30,[sp],#128
502 .inst   0xd50323bf                      // autiasp
503         ret
504 .size   SHA3_absorb,.-SHA3_absorb
505 .globl  SHA3_squeeze
506 .type   SHA3_squeeze,%function
507 .align  5
508 SHA3_squeeze:
509 .inst   0xd503233f                      // paciasp
510         stp     x29,x30,[sp,#-48]!
511         add     x29,sp,#0
512         stp     x19,x20,[sp,#16]
513         stp     x21,x22,[sp,#32]
514
515         mov     x19,x0                  // put aside arguments
516         mov     x20,x1
517         mov     x21,x2
518         mov     x22,x3
519
520 .Loop_squeeze:
521         ldr     x4,[x0],#8
522         cmp     x21,#8
523         blo     .Lsqueeze_tail
524 #ifdef  __AARCH64EB__
525         rev     x4,x4
526 #endif
527         str     x4,[x20],#8
528         subs    x21,x21,#8
529         beq     .Lsqueeze_done
530
531         subs    x3,x3,#8
532         bhi     .Loop_squeeze
533
534         mov     x0,x19
535         bl      KeccakF1600
536         mov     x0,x19
537         mov     x3,x22
538         b       .Loop_squeeze
539
540 .align  4
541 .Lsqueeze_tail:
542         strb    w4,[x20],#1
543         lsr     x4,x4,#8
544         subs    x21,x21,#1
545         beq     .Lsqueeze_done
546         strb    w4,[x20],#1
547         lsr     x4,x4,#8
548         subs    x21,x21,#1
549         beq     .Lsqueeze_done
550         strb    w4,[x20],#1
551         lsr     x4,x4,#8
552         subs    x21,x21,#1
553         beq     .Lsqueeze_done
554         strb    w4,[x20],#1
555         lsr     x4,x4,#8
556         subs    x21,x21,#1
557         beq     .Lsqueeze_done
558         strb    w4,[x20],#1
559         lsr     x4,x4,#8
560         subs    x21,x21,#1
561         beq     .Lsqueeze_done
562         strb    w4,[x20],#1
563         lsr     x4,x4,#8
564         subs    x21,x21,#1
565         beq     .Lsqueeze_done
566         strb    w4,[x20],#1
567
568 .Lsqueeze_done:
569         ldp     x19,x20,[sp,#16]
570         ldp     x21,x22,[sp,#32]
571         ldp     x29,x30,[sp],#48
572 .inst   0xd50323bf                      // autiasp
573         ret
574 .size   SHA3_squeeze,.-SHA3_squeeze
575 .type   KeccakF1600_ce,%function
576 .align  5
577 KeccakF1600_ce:
578         mov     x9,#12
579         adr     x10,iotas
580         b       .Loop_ce
581 .align  4
582 .Loop_ce:
583         ////////////////////////////////////////////////// Theta
584 .inst   0xce052819      //eor3 v25.16b,v0.16b,v5.16b,v10.16b
585 .inst   0xce062c3a      //eor3 v26.16b,v1.16b,v6.16b,v11.16b
586 .inst   0xce07305b      //eor3 v27.16b,v2.16b,v7.16b,v12.16b
587 .inst   0xce08347c      //eor3 v28.16b,v3.16b,v8.16b,v13.16b
588 .inst   0xce09389d      //eor3 v29.16b,v4.16b,v9.16b,v14.16b
589 .inst   0xce0f5339      //eor3 v25.16b,v25.16b,   v15.16b,v20.16b
590 .inst   0xce10575a      //eor3 v26.16b,v26.16b,   v16.16b,v21.16b
591 .inst   0xce115b7b      //eor3 v27.16b,v27.16b,   v17.16b,v22.16b
592 .inst   0xce125f9c      //eor3 v28.16b,v28.16b,   v18.16b,v23.16b
593 .inst   0xce1363bd      //eor3 v29.16b,v29.16b,   v19.16b,v24.16b
594
595 .inst   0xce7b8f3e      //rax1 v30.16b,v25.16b,v27.16b                  // D[1]
596 .inst   0xce7c8f5f      //rax1 v31.16b,v26.16b,v28.16b                  // D[2]
597 .inst   0xce7d8f7b      //rax1 v27.16b,v27.16b,v29.16b                  // D[3]
598 .inst   0xce798f9c      //rax1 v28.16b,v28.16b,v25.16b                  // D[4]
599 .inst   0xce7a8fbd      //rax1 v29.16b,v29.16b,v26.16b                  // D[0]
600
601         ////////////////////////////////////////////////// Theta+Rho+Pi
602 .inst   0xce9e50d9      //xar v25.16b,   v6.16b,v30.16b,#64-44  // C[0]=A[0][1]
603 .inst   0xce9cb126      //xar v6.16b,v9.16b,v28.16b,#64-20
604 .inst   0xce9f0ec9      //xar v9.16b,v22.16b,v31.16b,#64-61
605 .inst   0xce9c65d6      //xar v22.16b,v14.16b,v28.16b,#64-39
606 .inst   0xce9dba8e      //xar v14.16b,v20.16b,v29.16b,#64-18
607
608 .inst   0xce9f0854      //xar v20.16b,v2.16b,v31.16b,#64-62
609
610 .inst   0xce9f5582      //xar v2.16b,v12.16b,v31.16b,#64-43
611 .inst   0xce9b9dac      //xar v12.16b,v13.16b,v27.16b,#64-25
612 .inst   0xce9ce26d      //xar v13.16b,v19.16b,v28.16b,#64-8
613 .inst   0xce9b22f3      //xar v19.16b,v23.16b,v27.16b,#64-56
614 .inst   0xce9d5df7      //xar v23.16b,v15.16b,v29.16b,#64-41
615
616 .inst   0xce9c948f      //xar v15.16b,v4.16b,v28.16b,#64-27
617
618         eor     v0.16b,v0.16b,v29.16b
619         ldr     x11,[x10],#8
620
621 .inst   0xce9bae5a      //xar v26.16b,   v18.16b,v27.16b,#64-21 // C[1]=A[0][3]
622 .inst   0xce9fc632      //xar v18.16b,v17.16b,v31.16b,#64-15
623 .inst   0xce9ed971      //xar v17.16b,v11.16b,v30.16b,#64-10
624 .inst   0xce9fe8eb      //xar v11.16b,v7.16b,v31.16b,#64-6
625 .inst   0xce9df547      //xar v7.16b,v10.16b,v29.16b,#64-3
626
627 .inst   0xce9efc2a      //xar v10.16b,v1.16b,v30.16b,#64-1      // *
628
629 .inst   0xce9ccb04      //xar v4.16b,v24.16b,v28.16b,#64-14
630 .inst   0xce9efab8      //xar v24.16b,v21.16b,v30.16b,#64-2
631 .inst   0xce9b2515      //xar v21.16b,v8.16b,v27.16b,#64-55
632 .inst   0xce9e4e08      //xar v8.16b,v16.16b,v30.16b,#64-45
633 .inst   0xce9d70b0      //xar v16.16b,v5.16b,v29.16b,#64-36
634
635 .inst   0xce9b907b      //xar v27.16b,   v3.16b,v27.16b,#64-28  // C[2]=A[1][0]
636
637         ////////////////////////////////////////////////// Chi+Iota
638         dup     v31.2d,x11                              // borrow C[6]
639 .inst   0xce22641c      //bcax v28.16b,   v0.16b,v2.16b,v25.16b // *
640 .inst   0xce3a0b21      //bcax v1.16b,v25.16b,   v26.16b,   v2.16b      // *
641 .inst   0xce246842      //bcax v2.16b,v2.16b,v4.16b,v26.16b
642 .inst   0xce201343      //bcax v3.16b,v26.16b,   v0.16b,v4.16b
643 .inst   0xce390084      //bcax v4.16b,v4.16b,v25.16b,   v0.16b
644
645 .inst   0xce271b65      //bcax v5.16b,v27.16b,   v7.16b,v6.16b  // *
646 .inst   0xce281cd9      //bcax v25.16b,   v6.16b,v8.16b,v7.16b  // *
647 .inst   0xce2920e7      //bcax v7.16b,v7.16b,v9.16b,v8.16b
648 .inst   0xce3b2508      //bcax v8.16b,v8.16b,v27.16b,   v9.16b
649 .inst   0xce266d29      //bcax v9.16b,v9.16b,v6.16b,v27.16b
650
651         eor     v0.16b,v28.16b,v31.16b                  // Iota
652
653 .inst   0xce2c2d5a      //bcax v26.16b,   v10.16b,v12.16b,v11.16b       // *
654 .inst   0xce2d317b      //bcax v27.16b,   v11.16b,v13.16b,v12.16b       // *
655 .inst   0xce2e358c      //bcax v12.16b,v12.16b,v14.16b,v13.16b
656 .inst   0xce2a39ad      //bcax v13.16b,v13.16b,v10.16b,v14.16b
657 .inst   0xce2b29ce      //bcax v14.16b,v14.16b,v11.16b,v10.16b
658
659 .inst   0xce3141fc      //bcax v28.16b,   v15.16b,v17.16b,v16.16b       // *
660 .inst   0xce32461d      //bcax v29.16b,   v16.16b,v18.16b,v17.16b       // *
661 .inst   0xce334a31      //bcax v17.16b,v17.16b,v19.16b,v18.16b
662 .inst   0xce2f4e52      //bcax v18.16b,v18.16b,v15.16b,v19.16b
663 .inst   0xce303e73      //bcax v19.16b,v19.16b,v16.16b,v15.16b
664
665 .inst   0xce36569e      //bcax v30.16b,   v20.16b,v22.16b,v21.16b       // *
666 .inst   0xce375abf      //bcax v31.16b,   v21.16b,v23.16b,v22.16b       // *
667 .inst   0xce385ed6      //bcax v22.16b,v22.16b,v24.16b,v23.16b
668 .inst   0xce3462f7      //bcax v23.16b,v23.16b,v20.16b,v24.16b
669 .inst   0xce355318      //bcax v24.16b,v24.16b,v21.16b,v20.16b
670         ////////////////////////////////////////////////// Theta
671 .inst   0xce056806      //eor3 v6.16b,v0.16b,v5.16b,v26.16b
672 .inst   0xce196c2a      //eor3 v10.16b,v1.16b,v25.16b,v27.16b
673 .inst   0xce07304b      //eor3 v11.16b,v2.16b,v7.16b,v12.16b
674 .inst   0xce08346f      //eor3 v15.16b,v3.16b,v8.16b,v13.16b
675 .inst   0xce093890      //eor3 v16.16b,v4.16b,v9.16b,v14.16b
676 .inst   0xce1c78c6      //eor3 v6.16b,v6.16b,   v28.16b,v30.16b
677 .inst   0xce1d7d4a      //eor3 v10.16b,v10.16b,   v29.16b,v31.16b
678 .inst   0xce11596b      //eor3 v11.16b,v11.16b,   v17.16b,v22.16b
679 .inst   0xce125def      //eor3 v15.16b,v15.16b,   v18.16b,v23.16b
680 .inst   0xce136210      //eor3 v16.16b,v16.16b,   v19.16b,v24.16b
681
682 .inst   0xce6b8cd4      //rax1 v20.16b,v6.16b,v11.16b                   // D[1]
683 .inst   0xce6f8d55      //rax1 v21.16b,v10.16b,v15.16b                  // D[2]
684 .inst   0xce708d6b      //rax1 v11.16b,v11.16b,v16.16b                  // D[3]
685 .inst   0xce668def      //rax1 v15.16b,v15.16b,v6.16b                   // D[4]
686 .inst   0xce6a8e10      //rax1 v16.16b,v16.16b,v10.16b                  // D[0]
687
688         ////////////////////////////////////////////////// Theta+Rho+Pi
689 .inst   0xce945326      //xar v6.16b,   v25.16b,v20.16b,#64-44  // C[0]=A[0][1]
690 .inst   0xce8fb139      //xar v25.16b,v9.16b,v15.16b,#64-20
691 .inst   0xce950ec9      //xar v9.16b,v22.16b,v21.16b,#64-61
692 .inst   0xce8f65d6      //xar v22.16b,v14.16b,v15.16b,#64-39
693 .inst   0xce90bbce      //xar v14.16b,v30.16b,v16.16b,#64-18
694
695 .inst   0xce95085e      //xar v30.16b,v2.16b,v21.16b,#64-62
696
697 .inst   0xce955582      //xar v2.16b,v12.16b,v21.16b,#64-43
698 .inst   0xce8b9dac      //xar v12.16b,v13.16b,v11.16b,#64-25
699 .inst   0xce8fe26d      //xar v13.16b,v19.16b,v15.16b,#64-8
700 .inst   0xce8b22f3      //xar v19.16b,v23.16b,v11.16b,#64-56
701 .inst   0xce905f97      //xar v23.16b,v28.16b,v16.16b,#64-41
702
703 .inst   0xce8f949c      //xar v28.16b,v4.16b,v15.16b,#64-27
704
705         eor     v0.16b,v0.16b,v16.16b
706         ldr     x11,[x10],#8
707
708 .inst   0xce8bae4a      //xar v10.16b,   v18.16b,v11.16b,#64-21 // C[1]=A[0][3]
709 .inst   0xce95c632      //xar v18.16b,v17.16b,v21.16b,#64-15
710 .inst   0xce94db71      //xar v17.16b,v27.16b,v20.16b,#64-10
711 .inst   0xce95e8fb      //xar v27.16b,v7.16b,v21.16b,#64-6
712 .inst   0xce90f747      //xar v7.16b,v26.16b,v16.16b,#64-3
713
714 .inst   0xce94fc3a      //xar v26.16b,v1.16b,v20.16b,#64-1      // *
715
716 .inst   0xce8fcb04      //xar v4.16b,v24.16b,v15.16b,#64-14
717 .inst   0xce94fbf8      //xar v24.16b,v31.16b,v20.16b,#64-2
718 .inst   0xce8b251f      //xar v31.16b,v8.16b,v11.16b,#64-55
719 .inst   0xce944fa8      //xar v8.16b,v29.16b,v20.16b,#64-45
720 .inst   0xce9070bd      //xar v29.16b,v5.16b,v16.16b,#64-36
721
722 .inst   0xce8b906b      //xar v11.16b,   v3.16b,v11.16b,#64-28  // C[2]=A[1][0]
723
724         ////////////////////////////////////////////////// Chi+Iota
725         dup     v21.2d,x11                              // borrow C[6]
726 .inst   0xce22180f      //bcax v15.16b,   v0.16b,v2.16b,v6.16b  // *
727 .inst   0xce2a08c1      //bcax v1.16b,v6.16b,   v10.16b,   v2.16b       // *
728 .inst   0xce242842      //bcax v2.16b,v2.16b,v4.16b,v10.16b
729 .inst   0xce201143      //bcax v3.16b,v10.16b,   v0.16b,v4.16b
730 .inst   0xce260084      //bcax v4.16b,v4.16b,v6.16b,   v0.16b
731
732 .inst   0xce276565      //bcax v5.16b,v11.16b,   v7.16b,v25.16b // *
733 .inst   0xce281f26      //bcax v6.16b,   v25.16b,v8.16b,v7.16b  // *
734 .inst   0xce2920e7      //bcax v7.16b,v7.16b,v9.16b,v8.16b
735 .inst   0xce2b2508      //bcax v8.16b,v8.16b,v11.16b,   v9.16b
736 .inst   0xce392d29      //bcax v9.16b,v9.16b,v25.16b,v11.16b
737
738         eor     v0.16b,v15.16b,v21.16b                  // Iota
739
740 .inst   0xce2c6f4a      //bcax v10.16b,   v26.16b,v12.16b,v27.16b       // *
741 .inst   0xce2d336b      //bcax v11.16b,   v27.16b,v13.16b,v12.16b       // *
742 .inst   0xce2e358c      //bcax v12.16b,v12.16b,v14.16b,v13.16b
743 .inst   0xce3a39ad      //bcax v13.16b,v13.16b,v26.16b,v14.16b
744 .inst   0xce3b69ce      //bcax v14.16b,v14.16b,v27.16b,v26.16b
745
746 .inst   0xce31778f      //bcax v15.16b,   v28.16b,v17.16b,v29.16b       // *
747 .inst   0xce3247b0      //bcax v16.16b,   v29.16b,v18.16b,v17.16b       // *
748 .inst   0xce334a31      //bcax v17.16b,v17.16b,v19.16b,v18.16b
749 .inst   0xce3c4e52      //bcax v18.16b,v18.16b,v28.16b,v19.16b
750 .inst   0xce3d7273      //bcax v19.16b,v19.16b,v29.16b,v28.16b
751
752 .inst   0xce367fd4      //bcax v20.16b,   v30.16b,v22.16b,v31.16b       // *
753 .inst   0xce375bf5      //bcax v21.16b,   v31.16b,v23.16b,v22.16b       // *
754 .inst   0xce385ed6      //bcax v22.16b,v22.16b,v24.16b,v23.16b
755 .inst   0xce3e62f7      //bcax v23.16b,v23.16b,v30.16b,v24.16b
756 .inst   0xce3f7b18      //bcax v24.16b,v24.16b,v31.16b,v30.16b
757         subs    x9,x9,#1
758         bne     .Loop_ce
759
760         ret
761 .size   KeccakF1600_ce,.-KeccakF1600_ce
762
763 .type   KeccakF1600_cext,%function
764 .align  5
765 KeccakF1600_cext:
766 .inst   0xd503233f              // paciasp
767         stp     x29,x30,[sp,#-80]!
768         add     x29,sp,#0
769         stp     d8,d9,[sp,#16]          // per ABI requirement
770         stp     d10,d11,[sp,#32]
771         stp     d12,d13,[sp,#48]
772         stp     d14,d15,[sp,#64]
773         ldp     d0,d1,[x0,#8*0]
774         ldp     d2,d3,[x0,#8*2]
775         ldp     d4,d5,[x0,#8*4]
776         ldp     d6,d7,[x0,#8*6]
777         ldp     d8,d9,[x0,#8*8]
778         ldp     d10,d11,[x0,#8*10]
779         ldp     d12,d13,[x0,#8*12]
780         ldp     d14,d15,[x0,#8*14]
781         ldp     d16,d17,[x0,#8*16]
782         ldp     d18,d19,[x0,#8*18]
783         ldp     d20,d21,[x0,#8*20]
784         ldp     d22,d23,[x0,#8*22]
785         ldr     d24,[x0,#8*24]
786         bl      KeccakF1600_ce
787         ldr     x30,[sp,#8]
788         stp     d0,d1,[x0,#8*0]
789         stp     d2,d3,[x0,#8*2]
790         stp     d4,d5,[x0,#8*4]
791         stp     d6,d7,[x0,#8*6]
792         stp     d8,d9,[x0,#8*8]
793         stp     d10,d11,[x0,#8*10]
794         stp     d12,d13,[x0,#8*12]
795         stp     d14,d15,[x0,#8*14]
796         stp     d16,d17,[x0,#8*16]
797         stp     d18,d19,[x0,#8*18]
798         stp     d20,d21,[x0,#8*20]
799         stp     d22,d23,[x0,#8*22]
800         str     d24,[x0,#8*24]
801
802         ldp     d8,d9,[sp,#16]
803         ldp     d10,d11,[sp,#32]
804         ldp     d12,d13,[sp,#48]
805         ldp     d14,d15,[sp,#64]
806         ldr     x29,[sp],#80
807 .inst   0xd50323bf              // autiasp
808         ret
809 .size   KeccakF1600_cext,.-KeccakF1600_cext
810 .globl  SHA3_absorb_cext
811 .type   SHA3_absorb_cext,%function
812 .align  5
813 SHA3_absorb_cext:
814 .inst   0xd503233f              // paciasp
815         stp     x29,x30,[sp,#-80]!
816         add     x29,sp,#0
817         stp     d8,d9,[sp,#16]          // per ABI requirement
818         stp     d10,d11,[sp,#32]
819         stp     d12,d13,[sp,#48]
820         stp     d14,d15,[sp,#64]
821         ldp     d0,d1,[x0,#8*0]
822         ldp     d2,d3,[x0,#8*2]
823         ldp     d4,d5,[x0,#8*4]
824         ldp     d6,d7,[x0,#8*6]
825         ldp     d8,d9,[x0,#8*8]
826         ldp     d10,d11,[x0,#8*10]
827         ldp     d12,d13,[x0,#8*12]
828         ldp     d14,d15,[x0,#8*14]
829         ldp     d16,d17,[x0,#8*16]
830         ldp     d18,d19,[x0,#8*18]
831         ldp     d20,d21,[x0,#8*20]
832         ldp     d22,d23,[x0,#8*22]
833         ldr     d24,[x0,#8*24]
834         b       .Loop_absorb_ce
835
836 .align  4
837 .Loop_absorb_ce:
838         subs    x2,x2,x3                // len - bsz
839         blo     .Labsorbed_ce
840         ldr     d31,[x1],#8             // *inp++
841 #ifdef  __AARCH64EB__
842         rev64   v31.16b,v31.16b
843 #endif
844         eor     v0.16b,v0.16b,v31.16b
845         cmp     x3,#8*(0+2)
846         blo     .Lprocess_block_ce
847         ldr     d31,[x1],#8             // *inp++
848 #ifdef  __AARCH64EB__
849         rev64   v31.16b,v31.16b
850 #endif
851         eor     v1.16b,v1.16b,v31.16b
852         beq     .Lprocess_block_ce
853         ldr     d31,[x1],#8             // *inp++
854 #ifdef  __AARCH64EB__
855         rev64   v31.16b,v31.16b
856 #endif
857         eor     v2.16b,v2.16b,v31.16b
858         cmp     x3,#8*(2+2)
859         blo     .Lprocess_block_ce
860         ldr     d31,[x1],#8             // *inp++
861 #ifdef  __AARCH64EB__
862         rev64   v31.16b,v31.16b
863 #endif
864         eor     v3.16b,v3.16b,v31.16b
865         beq     .Lprocess_block_ce
866         ldr     d31,[x1],#8             // *inp++
867 #ifdef  __AARCH64EB__
868         rev64   v31.16b,v31.16b
869 #endif
870         eor     v4.16b,v4.16b,v31.16b
871         cmp     x3,#8*(4+2)
872         blo     .Lprocess_block_ce
873         ldr     d31,[x1],#8             // *inp++
874 #ifdef  __AARCH64EB__
875         rev64   v31.16b,v31.16b
876 #endif
877         eor     v5.16b,v5.16b,v31.16b
878         beq     .Lprocess_block_ce
879         ldr     d31,[x1],#8             // *inp++
880 #ifdef  __AARCH64EB__
881         rev64   v31.16b,v31.16b
882 #endif
883         eor     v6.16b,v6.16b,v31.16b
884         cmp     x3,#8*(6+2)
885         blo     .Lprocess_block_ce
886         ldr     d31,[x1],#8             // *inp++
887 #ifdef  __AARCH64EB__
888         rev64   v31.16b,v31.16b
889 #endif
890         eor     v7.16b,v7.16b,v31.16b
891         beq     .Lprocess_block_ce
892         ldr     d31,[x1],#8             // *inp++
893 #ifdef  __AARCH64EB__
894         rev64   v31.16b,v31.16b
895 #endif
896         eor     v8.16b,v8.16b,v31.16b
897         cmp     x3,#8*(8+2)
898         blo     .Lprocess_block_ce
899         ldr     d31,[x1],#8             // *inp++
900 #ifdef  __AARCH64EB__
901         rev64   v31.16b,v31.16b
902 #endif
903         eor     v9.16b,v9.16b,v31.16b
904         beq     .Lprocess_block_ce
905         ldr     d31,[x1],#8             // *inp++
906 #ifdef  __AARCH64EB__
907         rev64   v31.16b,v31.16b
908 #endif
909         eor     v10.16b,v10.16b,v31.16b
910         cmp     x3,#8*(10+2)
911         blo     .Lprocess_block_ce
912         ldr     d31,[x1],#8             // *inp++
913 #ifdef  __AARCH64EB__
914         rev64   v31.16b,v31.16b
915 #endif
916         eor     v11.16b,v11.16b,v31.16b
917         beq     .Lprocess_block_ce
918         ldr     d31,[x1],#8             // *inp++
919 #ifdef  __AARCH64EB__
920         rev64   v31.16b,v31.16b
921 #endif
922         eor     v12.16b,v12.16b,v31.16b
923         cmp     x3,#8*(12+2)
924         blo     .Lprocess_block_ce
925         ldr     d31,[x1],#8             // *inp++
926 #ifdef  __AARCH64EB__
927         rev64   v31.16b,v31.16b
928 #endif
929         eor     v13.16b,v13.16b,v31.16b
930         beq     .Lprocess_block_ce
931         ldr     d31,[x1],#8             // *inp++
932 #ifdef  __AARCH64EB__
933         rev64   v31.16b,v31.16b
934 #endif
935         eor     v14.16b,v14.16b,v31.16b
936         cmp     x3,#8*(14+2)
937         blo     .Lprocess_block_ce
938         ldr     d31,[x1],#8             // *inp++
939 #ifdef  __AARCH64EB__
940         rev64   v31.16b,v31.16b
941 #endif
942         eor     v15.16b,v15.16b,v31.16b
943         beq     .Lprocess_block_ce
944         ldr     d31,[x1],#8             // *inp++
945 #ifdef  __AARCH64EB__
946         rev64   v31.16b,v31.16b
947 #endif
948         eor     v16.16b,v16.16b,v31.16b
949         cmp     x3,#8*(16+2)
950         blo     .Lprocess_block_ce
951         ldr     d31,[x1],#8             // *inp++
952 #ifdef  __AARCH64EB__
953         rev64   v31.16b,v31.16b
954 #endif
955         eor     v17.16b,v17.16b,v31.16b
956         beq     .Lprocess_block_ce
957         ldr     d31,[x1],#8             // *inp++
958 #ifdef  __AARCH64EB__
959         rev64   v31.16b,v31.16b
960 #endif
961         eor     v18.16b,v18.16b,v31.16b
962         cmp     x3,#8*(18+2)
963         blo     .Lprocess_block_ce
964         ldr     d31,[x1],#8             // *inp++
965 #ifdef  __AARCH64EB__
966         rev64   v31.16b,v31.16b
967 #endif
968         eor     v19.16b,v19.16b,v31.16b
969         beq     .Lprocess_block_ce
970         ldr     d31,[x1],#8             // *inp++
971 #ifdef  __AARCH64EB__
972         rev64   v31.16b,v31.16b
973 #endif
974         eor     v20.16b,v20.16b,v31.16b
975         cmp     x3,#8*(20+2)
976         blo     .Lprocess_block_ce
977         ldr     d31,[x1],#8             // *inp++
978 #ifdef  __AARCH64EB__
979         rev64   v31.16b,v31.16b
980 #endif
981         eor     v21.16b,v21.16b,v31.16b
982         beq     .Lprocess_block_ce
983         ldr     d31,[x1],#8             // *inp++
984 #ifdef  __AARCH64EB__
985         rev64   v31.16b,v31.16b
986 #endif
987         eor     v22.16b,v22.16b,v31.16b
988         cmp     x3,#8*(22+2)
989         blo     .Lprocess_block_ce
990         ldr     d31,[x1],#8             // *inp++
991 #ifdef  __AARCH64EB__
992         rev64   v31.16b,v31.16b
993 #endif
994         eor     v23.16b,v23.16b,v31.16b
995         beq     .Lprocess_block_ce
996         ldr     d31,[x1],#8             // *inp++
997 #ifdef  __AARCH64EB__
998         rev64   v31.16b,v31.16b
999 #endif
1000         eor     v24.16b,v24.16b,v31.16b
1001
1002 .Lprocess_block_ce:
1003
1004         bl      KeccakF1600_ce
1005
1006         b       .Loop_absorb_ce
1007
1008 .align  4
1009 .Labsorbed_ce:
1010         stp     d0,d1,[x0,#8*0]
1011         stp     d2,d3,[x0,#8*2]
1012         stp     d4,d5,[x0,#8*4]
1013         stp     d6,d7,[x0,#8*6]
1014         stp     d8,d9,[x0,#8*8]
1015         stp     d10,d11,[x0,#8*10]
1016         stp     d12,d13,[x0,#8*12]
1017         stp     d14,d15,[x0,#8*14]
1018         stp     d16,d17,[x0,#8*16]
1019         stp     d18,d19,[x0,#8*18]
1020         stp     d20,d21,[x0,#8*20]
1021         stp     d22,d23,[x0,#8*22]
1022         str     d24,[x0,#8*24]
1023         add     x0,x2,x3                // return value
1024
1025         ldp     d8,d9,[sp,#16]
1026         ldp     d10,d11,[sp,#32]
1027         ldp     d12,d13,[sp,#48]
1028         ldp     d14,d15,[sp,#64]
1029         ldp     x29,x30,[sp],#80
1030 .inst   0xd50323bf              // autiasp
1031         ret
1032 .size   SHA3_absorb_cext,.-SHA3_absorb_cext
1033 .globl  SHA3_squeeze_cext
1034 .type   SHA3_squeeze_cext,%function
1035 .align  5
1036 SHA3_squeeze_cext:
1037 .inst   0xd503233f              // paciasp
1038         stp     x29,x30,[sp,#-16]!
1039         add     x29,sp,#0
1040         mov     x9,x0
1041         mov     x10,x3
1042
1043 .Loop_squeeze_ce:
1044         ldr     x4,[x9],#8
1045         cmp     x2,#8
1046         blo     .Lsqueeze_tail_ce
1047 #ifdef  __AARCH64EB__
1048         rev     x4,x4
1049 #endif
1050         str     x4,[x1],#8
1051         beq     .Lsqueeze_done_ce
1052
1053         sub     x2,x2,#8
1054         subs    x10,x10,#8
1055         bhi     .Loop_squeeze_ce
1056
1057         bl      KeccakF1600_cext
1058         ldr     x30,[sp,#8]
1059         mov     x9,x0
1060         mov     x10,x3
1061         b       .Loop_squeeze_ce
1062
1063 .align  4
1064 .Lsqueeze_tail_ce:
1065         strb    w4,[x1],#1
1066         lsr     x4,x4,#8
1067         subs    x2,x2,#1
1068         beq     .Lsqueeze_done_ce
1069         strb    w4,[x1],#1
1070         lsr     x4,x4,#8
1071         subs    x2,x2,#1
1072         beq     .Lsqueeze_done_ce
1073         strb    w4,[x1],#1
1074         lsr     x4,x4,#8
1075         subs    x2,x2,#1
1076         beq     .Lsqueeze_done_ce
1077         strb    w4,[x1],#1
1078         lsr     x4,x4,#8
1079         subs    x2,x2,#1
1080         beq     .Lsqueeze_done_ce
1081         strb    w4,[x1],#1
1082         lsr     x4,x4,#8
1083         subs    x2,x2,#1
1084         beq     .Lsqueeze_done_ce
1085         strb    w4,[x1],#1
1086         lsr     x4,x4,#8
1087         subs    x2,x2,#1
1088         beq     .Lsqueeze_done_ce
1089         strb    w4,[x1],#1
1090
1091 .Lsqueeze_done_ce:
1092         ldr     x29,[sp],#16
1093 .inst   0xd50323bf              // autiasp
1094         ret
1095 .size   SHA3_squeeze_cext,.-SHA3_squeeze_cext
1096 .byte   75,101,99,99,97,107,45,49,54,48,48,32,97,98,115,111,114,98,32,97,110,100,32,115,113,117,101,101,122,101,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
1097 .align  2