The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/crypto/openssl/arm/sha512-armv4.S

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /* $FreeBSD$ */
    2 /* Do not modify. This file is auto-generated from sha512-armv4.pl. */
    3 @ Copyright 2007-2020 The OpenSSL Project Authors. All Rights Reserved.
    4 @
    5 @ Licensed under the OpenSSL license (the "License").  You may not use
    6 @ this file except in compliance with the License.  You can obtain a copy
    7 @ in the file LICENSE in the source distribution or at
    8 @ https://www.openssl.org/source/license.html
    9 
   10 
   11 @ ====================================================================
   12 @ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
   13 @ project. The module is, however, dual licensed under OpenSSL and
   14 @ CRYPTOGAMS licenses depending on where you obtain it. For further
   15 @ details see http://www.openssl.org/~appro/cryptogams/.
   16 @
   17 @ Permission to use under GPL terms is granted.
   18 @ ====================================================================
   19 
   20 @ SHA512 block procedure for ARMv4. September 2007.
   21 
   22 @ This code is ~4.5 (four and a half) times faster than code generated
   23 @ by gcc 3.4 and it spends ~72 clock cycles per byte [on single-issue
   24 @ Xscale PXA250 core].
   25 @
   26 @ July 2010.
   27 @
   28 @ Rescheduling for dual-issue pipeline resulted in 6% improvement on
   29 @ Cortex A8 core and ~40 cycles per processed byte.
   30 
   31 @ February 2011.
   32 @
   33 @ Profiler-assisted and platform-specific optimization resulted in 7%
   34 @ improvement on Coxtex A8 core and ~38 cycles per byte.
   35 
   36 @ March 2011.
   37 @
   38 @ Add NEON implementation. On Cortex A8 it was measured to process
   39 @ one byte in 23.3 cycles or ~60% faster than integer-only code.
   40 
   41 @ August 2012.
   42 @
   43 @ Improve NEON performance by 12% on Snapdragon S4. In absolute
   44 @ terms it's 22.6 cycles per byte, which is disappointing result.
   45 @ Technical writers asserted that 3-way S4 pipeline can sustain
   46 @ multiple NEON instructions per cycle, but dual NEON issue could
   47 @ not be observed, see http://www.openssl.org/~appro/Snapdragon-S4.html
   48 @ for further details. On side note Cortex-A15 processes one byte in
   49 @ 16 cycles.
   50 
   51 @ Byte order [in]dependence. =========================================
   52 @
   53 @ Originally caller was expected to maintain specific *dword* order in
   54 @ h[0-7], namely with most significant dword at *lower* address, which
   55 @ was reflected in below two parameters as 0 and 4. Now caller is
   56 @ expected to maintain native byte order for whole 64-bit values.
   57 #ifndef __KERNEL__
   58 # include "arm_arch.h"
   59 # define VFP_ABI_PUSH   vstmdb  sp!,{d8-d15}
   60 # define VFP_ABI_POP    vldmia  sp!,{d8-d15}
   61 #else
   62 # define __ARM_ARCH__ __LINUX_ARM_ARCH__
   63 # define __ARM_MAX_ARCH__ 7
   64 # define VFP_ABI_PUSH
   65 # define VFP_ABI_POP
   66 #endif
   67 
   68 #ifdef __ARMEL__
   69 # define LO 0
   70 # define HI 4
   71 # define WORD64(hi0,lo0,hi1,lo1)        .word   lo0,hi0, lo1,hi1
   72 #else
   73 # define HI 0
   74 # define LO 4
   75 # define WORD64(hi0,lo0,hi1,lo1)        .word   hi0,lo0, hi1,lo1
   76 #endif
   77 
   78 .text
   79 #if defined(__thumb2__)
   80 .syntax unified
   81 .thumb
   82 # define adrl adr
   83 #else
   84 .code   32
   85 #endif
   86 
   87 .type   K512,%object
   88 .align  5
   89 K512:
   90         WORD64(0x428a2f98,0xd728ae22,   0x71374491,0x23ef65cd)
   91         WORD64(0xb5c0fbcf,0xec4d3b2f,   0xe9b5dba5,0x8189dbbc)
   92         WORD64(0x3956c25b,0xf348b538,   0x59f111f1,0xb605d019)
   93         WORD64(0x923f82a4,0xaf194f9b,   0xab1c5ed5,0xda6d8118)
   94         WORD64(0xd807aa98,0xa3030242,   0x12835b01,0x45706fbe)
   95         WORD64(0x243185be,0x4ee4b28c,   0x550c7dc3,0xd5ffb4e2)
   96         WORD64(0x72be5d74,0xf27b896f,   0x80deb1fe,0x3b1696b1)
   97         WORD64(0x9bdc06a7,0x25c71235,   0xc19bf174,0xcf692694)
   98         WORD64(0xe49b69c1,0x9ef14ad2,   0xefbe4786,0x384f25e3)
   99         WORD64(0x0fc19dc6,0x8b8cd5b5,   0x240ca1cc,0x77ac9c65)
  100         WORD64(0x2de92c6f,0x592b0275,   0x4a7484aa,0x6ea6e483)
  101         WORD64(0x5cb0a9dc,0xbd41fbd4,   0x76f988da,0x831153b5)
  102         WORD64(0x983e5152,0xee66dfab,   0xa831c66d,0x2db43210)
  103         WORD64(0xb00327c8,0x98fb213f,   0xbf597fc7,0xbeef0ee4)
  104         WORD64(0xc6e00bf3,0x3da88fc2,   0xd5a79147,0x930aa725)
  105         WORD64(0x06ca6351,0xe003826f,   0x14292967,0x0a0e6e70)
  106         WORD64(0x27b70a85,0x46d22ffc,   0x2e1b2138,0x5c26c926)
  107         WORD64(0x4d2c6dfc,0x5ac42aed,   0x53380d13,0x9d95b3df)
  108         WORD64(0x650a7354,0x8baf63de,   0x766a0abb,0x3c77b2a8)
  109         WORD64(0x81c2c92e,0x47edaee6,   0x92722c85,0x1482353b)
  110         WORD64(0xa2bfe8a1,0x4cf10364,   0xa81a664b,0xbc423001)
  111         WORD64(0xc24b8b70,0xd0f89791,   0xc76c51a3,0x0654be30)
  112         WORD64(0xd192e819,0xd6ef5218,   0xd6990624,0x5565a910)
  113         WORD64(0xf40e3585,0x5771202a,   0x106aa070,0x32bbd1b8)
  114         WORD64(0x19a4c116,0xb8d2d0c8,   0x1e376c08,0x5141ab53)
  115         WORD64(0x2748774c,0xdf8eeb99,   0x34b0bcb5,0xe19b48a8)
  116         WORD64(0x391c0cb3,0xc5c95a63,   0x4ed8aa4a,0xe3418acb)
  117         WORD64(0x5b9cca4f,0x7763e373,   0x682e6ff3,0xd6b2b8a3)
  118         WORD64(0x748f82ee,0x5defb2fc,   0x78a5636f,0x43172f60)
  119         WORD64(0x84c87814,0xa1f0ab72,   0x8cc70208,0x1a6439ec)
  120         WORD64(0x90befffa,0x23631e28,   0xa4506ceb,0xde82bde9)
  121         WORD64(0xbef9a3f7,0xb2c67915,   0xc67178f2,0xe372532b)
  122         WORD64(0xca273ece,0xea26619c,   0xd186b8c7,0x21c0c207)
  123         WORD64(0xeada7dd6,0xcde0eb1e,   0xf57d4f7f,0xee6ed178)
  124         WORD64(0x06f067aa,0x72176fba,   0x0a637dc5,0xa2c898a6)
  125         WORD64(0x113f9804,0xbef90dae,   0x1b710b35,0x131c471b)
  126         WORD64(0x28db77f5,0x23047d84,   0x32caab7b,0x40c72493)
  127         WORD64(0x3c9ebe0a,0x15c9bebc,   0x431d67c4,0x9c100d4c)
  128         WORD64(0x4cc5d4be,0xcb3e42b6,   0x597f299c,0xfc657e2a)
  129         WORD64(0x5fcb6fab,0x3ad6faec,   0x6c44198c,0x4a475817)
  130 .size   K512,.-K512
  131 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
  132 .LOPENSSL_armcap:
  133 .word   OPENSSL_armcap_P-.Lsha512_block_data_order
  134 .skip   32-4
  135 #else
  136 .skip   32
  137 #endif
  138 
  139 .globl  sha512_block_data_order
  140 .type   sha512_block_data_order,%function
  141 sha512_block_data_order:
  142 .Lsha512_block_data_order:
  143 #if __ARM_ARCH__<7 && !defined(__thumb2__)
  144         sub     r3,pc,#8                @ sha512_block_data_order
  145 #else
  146         adr     r3,.Lsha512_block_data_order
  147 #endif
  148 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
  149         ldr     r12,.LOPENSSL_armcap
  150         ldr     r12,[r3,r12]            @ OPENSSL_armcap_P
  151 #ifdef  __APPLE__
  152         ldr     r12,[r12]
  153 #endif
  154         tst     r12,#ARMV7_NEON
  155         bne     .LNEON
  156 #endif
  157         add     r2,r1,r2,lsl#7  @ len to point at the end of inp
  158         stmdb   sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
  159         sub     r14,r3,#672             @ K512
  160         sub     sp,sp,#9*8
  161 
  162         ldr     r7,[r0,#32+LO]
  163         ldr     r8,[r0,#32+HI]
  164         ldr     r9, [r0,#48+LO]
  165         ldr     r10, [r0,#48+HI]
  166         ldr     r11, [r0,#56+LO]
  167         ldr     r12, [r0,#56+HI]
  168 .Loop:
  169         str     r9, [sp,#48+0]
  170         str     r10, [sp,#48+4]
  171         str     r11, [sp,#56+0]
  172         str     r12, [sp,#56+4]
  173         ldr     r5,[r0,#0+LO]
  174         ldr     r6,[r0,#0+HI]
  175         ldr     r3,[r0,#8+LO]
  176         ldr     r4,[r0,#8+HI]
  177         ldr     r9, [r0,#16+LO]
  178         ldr     r10, [r0,#16+HI]
  179         ldr     r11, [r0,#24+LO]
  180         ldr     r12, [r0,#24+HI]
  181         str     r3,[sp,#8+0]
  182         str     r4,[sp,#8+4]
  183         str     r9, [sp,#16+0]
  184         str     r10, [sp,#16+4]
  185         str     r11, [sp,#24+0]
  186         str     r12, [sp,#24+4]
  187         ldr     r3,[r0,#40+LO]
  188         ldr     r4,[r0,#40+HI]
  189         str     r3,[sp,#40+0]
  190         str     r4,[sp,#40+4]
  191 
  192 .L00_15:
  193 #if __ARM_ARCH__<7
  194         ldrb    r3,[r1,#7]
  195         ldrb    r9, [r1,#6]
  196         ldrb    r10, [r1,#5]
  197         ldrb    r11, [r1,#4]
  198         ldrb    r4,[r1,#3]
  199         ldrb    r12, [r1,#2]
  200         orr     r3,r3,r9,lsl#8
  201         ldrb    r9, [r1,#1]
  202         orr     r3,r3,r10,lsl#16
  203         ldrb    r10, [r1],#8
  204         orr     r3,r3,r11,lsl#24
  205         orr     r4,r4,r12,lsl#8
  206         orr     r4,r4,r9,lsl#16
  207         orr     r4,r4,r10,lsl#24
  208 #else
  209         ldr     r3,[r1,#4]
  210         ldr     r4,[r1],#8
  211 #ifdef __ARMEL__
  212         rev     r3,r3
  213         rev     r4,r4
  214 #endif
  215 #endif
  216         @ Sigma1(x)     (ROTR((x),14) ^ ROTR((x),18)  ^ ROTR((x),41))
  217         @ LO            lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23
  218         @ HI            hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23
  219         mov     r9,r7,lsr#14
  220         str     r3,[sp,#64+0]
  221         mov     r10,r8,lsr#14
  222         str     r4,[sp,#64+4]
  223         eor     r9,r9,r8,lsl#18
  224         ldr     r11,[sp,#56+0]  @ h.lo
  225         eor     r10,r10,r7,lsl#18
  226         ldr     r12,[sp,#56+4]  @ h.hi
  227         eor     r9,r9,r7,lsr#18
  228         eor     r10,r10,r8,lsr#18
  229         eor     r9,r9,r8,lsl#14
  230         eor     r10,r10,r7,lsl#14
  231         eor     r9,r9,r8,lsr#9
  232         eor     r10,r10,r7,lsr#9
  233         eor     r9,r9,r7,lsl#23
  234         eor     r10,r10,r8,lsl#23       @ Sigma1(e)
  235         adds    r3,r3,r9
  236         ldr     r9,[sp,#40+0]   @ f.lo
  237         adc     r4,r4,r10               @ T += Sigma1(e)
  238         ldr     r10,[sp,#40+4]  @ f.hi
  239         adds    r3,r3,r11
  240         ldr     r11,[sp,#48+0]  @ g.lo
  241         adc     r4,r4,r12               @ T += h
  242         ldr     r12,[sp,#48+4]  @ g.hi
  243 
  244         eor     r9,r9,r11
  245         str     r7,[sp,#32+0]
  246         eor     r10,r10,r12
  247         str     r8,[sp,#32+4]
  248         and     r9,r9,r7
  249         str     r5,[sp,#0+0]
  250         and     r10,r10,r8
  251         str     r6,[sp,#0+4]
  252         eor     r9,r9,r11
  253         ldr     r11,[r14,#LO]   @ K[i].lo
  254         eor     r10,r10,r12             @ Ch(e,f,g)
  255         ldr     r12,[r14,#HI]   @ K[i].hi
  256 
  257         adds    r3,r3,r9
  258         ldr     r7,[sp,#24+0]   @ d.lo
  259         adc     r4,r4,r10               @ T += Ch(e,f,g)
  260         ldr     r8,[sp,#24+4]   @ d.hi
  261         adds    r3,r3,r11
  262         and     r9,r11,#0xff
  263         adc     r4,r4,r12               @ T += K[i]
  264         adds    r7,r7,r3
  265         ldr     r11,[sp,#8+0]   @ b.lo
  266         adc     r8,r8,r4                @ d += T
  267         teq     r9,#148
  268 
  269         ldr     r12,[sp,#16+0]  @ c.lo
  270 #ifdef  __thumb2__
  271         it      eq                      @ Thumb2 thing, sanity check in ARM
  272 #endif
  273         orreq   r14,r14,#1
  274         @ Sigma0(x)     (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39))
  275         @ LO            lo>>28^hi<<4  ^ hi>>2^lo<<30 ^ hi>>7^lo<<25
  276         @ HI            hi>>28^lo<<4  ^ lo>>2^hi<<30 ^ lo>>7^hi<<25
  277         mov     r9,r5,lsr#28
  278         mov     r10,r6,lsr#28
  279         eor     r9,r9,r6,lsl#4
  280         eor     r10,r10,r5,lsl#4
  281         eor     r9,r9,r6,lsr#2
  282         eor     r10,r10,r5,lsr#2
  283         eor     r9,r9,r5,lsl#30
  284         eor     r10,r10,r6,lsl#30
  285         eor     r9,r9,r6,lsr#7
  286         eor     r10,r10,r5,lsr#7
  287         eor     r9,r9,r5,lsl#25
  288         eor     r10,r10,r6,lsl#25       @ Sigma0(a)
  289         adds    r3,r3,r9
  290         and     r9,r5,r11
  291         adc     r4,r4,r10               @ T += Sigma0(a)
  292 
  293         ldr     r10,[sp,#8+4]   @ b.hi
  294         orr     r5,r5,r11
  295         ldr     r11,[sp,#16+4]  @ c.hi
  296         and     r5,r5,r12
  297         and     r12,r6,r10
  298         orr     r6,r6,r10
  299         orr     r5,r5,r9                @ Maj(a,b,c).lo
  300         and     r6,r6,r11
  301         adds    r5,r5,r3
  302         orr     r6,r6,r12               @ Maj(a,b,c).hi
  303         sub     sp,sp,#8
  304         adc     r6,r6,r4                @ h += T
  305         tst     r14,#1
  306         add     r14,r14,#8
  307         tst     r14,#1
  308         beq     .L00_15
  309         ldr     r9,[sp,#184+0]
  310         ldr     r10,[sp,#184+4]
  311         bic     r14,r14,#1
  312 .L16_79:
  313         @ sigma0(x)     (ROTR((x),1)  ^ ROTR((x),8)  ^ ((x)>>7))
  314         @ LO            lo>>1^hi<<31  ^ lo>>8^hi<<24 ^ lo>>7^hi<<25
  315         @ HI            hi>>1^lo<<31  ^ hi>>8^lo<<24 ^ hi>>7
  316         mov     r3,r9,lsr#1
  317         ldr     r11,[sp,#80+0]
  318         mov     r4,r10,lsr#1
  319         ldr     r12,[sp,#80+4]
  320         eor     r3,r3,r10,lsl#31
  321         eor     r4,r4,r9,lsl#31
  322         eor     r3,r3,r9,lsr#8
  323         eor     r4,r4,r10,lsr#8
  324         eor     r3,r3,r10,lsl#24
  325         eor     r4,r4,r9,lsl#24
  326         eor     r3,r3,r9,lsr#7
  327         eor     r4,r4,r10,lsr#7
  328         eor     r3,r3,r10,lsl#25
  329 
  330         @ sigma1(x)     (ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6))
  331         @ LO            lo>>19^hi<<13 ^ hi>>29^lo<<3 ^ lo>>6^hi<<26
  332         @ HI            hi>>19^lo<<13 ^ lo>>29^hi<<3 ^ hi>>6
  333         mov     r9,r11,lsr#19
  334         mov     r10,r12,lsr#19
  335         eor     r9,r9,r12,lsl#13
  336         eor     r10,r10,r11,lsl#13
  337         eor     r9,r9,r12,lsr#29
  338         eor     r10,r10,r11,lsr#29
  339         eor     r9,r9,r11,lsl#3
  340         eor     r10,r10,r12,lsl#3
  341         eor     r9,r9,r11,lsr#6
  342         eor     r10,r10,r12,lsr#6
  343         ldr     r11,[sp,#120+0]
  344         eor     r9,r9,r12,lsl#26
  345 
  346         ldr     r12,[sp,#120+4]
  347         adds    r3,r3,r9
  348         ldr     r9,[sp,#192+0]
  349         adc     r4,r4,r10
  350 
  351         ldr     r10,[sp,#192+4]
  352         adds    r3,r3,r11
  353         adc     r4,r4,r12
  354         adds    r3,r3,r9
  355         adc     r4,r4,r10
  356         @ Sigma1(x)     (ROTR((x),14) ^ ROTR((x),18)  ^ ROTR((x),41))
  357         @ LO            lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23
  358         @ HI            hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23
  359         mov     r9,r7,lsr#14
  360         str     r3,[sp,#64+0]
  361         mov     r10,r8,lsr#14
  362         str     r4,[sp,#64+4]
  363         eor     r9,r9,r8,lsl#18
  364         ldr     r11,[sp,#56+0]  @ h.lo
  365         eor     r10,r10,r7,lsl#18
  366         ldr     r12,[sp,#56+4]  @ h.hi
  367         eor     r9,r9,r7,lsr#18
  368         eor     r10,r10,r8,lsr#18
  369         eor     r9,r9,r8,lsl#14
  370         eor     r10,r10,r7,lsl#14
  371         eor     r9,r9,r8,lsr#9
  372         eor     r10,r10,r7,lsr#9
  373         eor     r9,r9,r7,lsl#23
  374         eor     r10,r10,r8,lsl#23       @ Sigma1(e)
  375         adds    r3,r3,r9
  376         ldr     r9,[sp,#40+0]   @ f.lo
  377         adc     r4,r4,r10               @ T += Sigma1(e)
  378         ldr     r10,[sp,#40+4]  @ f.hi
  379         adds    r3,r3,r11
  380         ldr     r11,[sp,#48+0]  @ g.lo
  381         adc     r4,r4,r12               @ T += h
  382         ldr     r12,[sp,#48+4]  @ g.hi
  383 
  384         eor     r9,r9,r11
  385         str     r7,[sp,#32+0]
  386         eor     r10,r10,r12
  387         str     r8,[sp,#32+4]
  388         and     r9,r9,r7
  389         str     r5,[sp,#0+0]
  390         and     r10,r10,r8
  391         str     r6,[sp,#0+4]
  392         eor     r9,r9,r11
  393         ldr     r11,[r14,#LO]   @ K[i].lo
  394         eor     r10,r10,r12             @ Ch(e,f,g)
  395         ldr     r12,[r14,#HI]   @ K[i].hi
  396 
  397         adds    r3,r3,r9
  398         ldr     r7,[sp,#24+0]   @ d.lo
  399         adc     r4,r4,r10               @ T += Ch(e,f,g)
  400         ldr     r8,[sp,#24+4]   @ d.hi
  401         adds    r3,r3,r11
  402         and     r9,r11,#0xff
  403         adc     r4,r4,r12               @ T += K[i]
  404         adds    r7,r7,r3
  405         ldr     r11,[sp,#8+0]   @ b.lo
  406         adc     r8,r8,r4                @ d += T
  407         teq     r9,#23
  408 
  409         ldr     r12,[sp,#16+0]  @ c.lo
  410 #ifdef  __thumb2__
  411         it      eq                      @ Thumb2 thing, sanity check in ARM
  412 #endif
  413         orreq   r14,r14,#1
  414         @ Sigma0(x)     (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39))
  415         @ LO            lo>>28^hi<<4  ^ hi>>2^lo<<30 ^ hi>>7^lo<<25
  416         @ HI            hi>>28^lo<<4  ^ lo>>2^hi<<30 ^ lo>>7^hi<<25
  417         mov     r9,r5,lsr#28
  418         mov     r10,r6,lsr#28
  419         eor     r9,r9,r6,lsl#4
  420         eor     r10,r10,r5,lsl#4
  421         eor     r9,r9,r6,lsr#2
  422         eor     r10,r10,r5,lsr#2
  423         eor     r9,r9,r5,lsl#30
  424         eor     r10,r10,r6,lsl#30
  425         eor     r9,r9,r6,lsr#7
  426         eor     r10,r10,r5,lsr#7
  427         eor     r9,r9,r5,lsl#25
  428         eor     r10,r10,r6,lsl#25       @ Sigma0(a)
  429         adds    r3,r3,r9
  430         and     r9,r5,r11
  431         adc     r4,r4,r10               @ T += Sigma0(a)
  432 
  433         ldr     r10,[sp,#8+4]   @ b.hi
  434         orr     r5,r5,r11
  435         ldr     r11,[sp,#16+4]  @ c.hi
  436         and     r5,r5,r12
  437         and     r12,r6,r10
  438         orr     r6,r6,r10
  439         orr     r5,r5,r9                @ Maj(a,b,c).lo
  440         and     r6,r6,r11
  441         adds    r5,r5,r3
  442         orr     r6,r6,r12               @ Maj(a,b,c).hi
  443         sub     sp,sp,#8
  444         adc     r6,r6,r4                @ h += T
  445         tst     r14,#1
  446         add     r14,r14,#8
  447 #ifdef  __thumb2__
  448         ittt    eq                      @ Thumb2 thing, sanity check in ARM
  449 #endif
  450         ldreq   r9,[sp,#184+0]
  451         ldreq   r10,[sp,#184+4]
  452         beq     .L16_79
  453         bic     r14,r14,#1
  454 
  455         ldr     r3,[sp,#8+0]
  456         ldr     r4,[sp,#8+4]
  457         ldr     r9, [r0,#0+LO]
  458         ldr     r10, [r0,#0+HI]
  459         ldr     r11, [r0,#8+LO]
  460         ldr     r12, [r0,#8+HI]
  461         adds    r9,r5,r9
  462         str     r9, [r0,#0+LO]
  463         adc     r10,r6,r10
  464         str     r10, [r0,#0+HI]
  465         adds    r11,r3,r11
  466         str     r11, [r0,#8+LO]
  467         adc     r12,r4,r12
  468         str     r12, [r0,#8+HI]
  469 
  470         ldr     r5,[sp,#16+0]
  471         ldr     r6,[sp,#16+4]
  472         ldr     r3,[sp,#24+0]
  473         ldr     r4,[sp,#24+4]
  474         ldr     r9, [r0,#16+LO]
  475         ldr     r10, [r0,#16+HI]
  476         ldr     r11, [r0,#24+LO]
  477         ldr     r12, [r0,#24+HI]
  478         adds    r9,r5,r9
  479         str     r9, [r0,#16+LO]
  480         adc     r10,r6,r10
  481         str     r10, [r0,#16+HI]
  482         adds    r11,r3,r11
  483         str     r11, [r0,#24+LO]
  484         adc     r12,r4,r12
  485         str     r12, [r0,#24+HI]
  486 
  487         ldr     r3,[sp,#40+0]
  488         ldr     r4,[sp,#40+4]
  489         ldr     r9, [r0,#32+LO]
  490         ldr     r10, [r0,#32+HI]
  491         ldr     r11, [r0,#40+LO]
  492         ldr     r12, [r0,#40+HI]
  493         adds    r7,r7,r9
  494         str     r7,[r0,#32+LO]
  495         adc     r8,r8,r10
  496         str     r8,[r0,#32+HI]
  497         adds    r11,r3,r11
  498         str     r11, [r0,#40+LO]
  499         adc     r12,r4,r12
  500         str     r12, [r0,#40+HI]
  501 
  502         ldr     r5,[sp,#48+0]
  503         ldr     r6,[sp,#48+4]
  504         ldr     r3,[sp,#56+0]
  505         ldr     r4,[sp,#56+4]
  506         ldr     r9, [r0,#48+LO]
  507         ldr     r10, [r0,#48+HI]
  508         ldr     r11, [r0,#56+LO]
  509         ldr     r12, [r0,#56+HI]
  510         adds    r9,r5,r9
  511         str     r9, [r0,#48+LO]
  512         adc     r10,r6,r10
  513         str     r10, [r0,#48+HI]
  514         adds    r11,r3,r11
  515         str     r11, [r0,#56+LO]
  516         adc     r12,r4,r12
  517         str     r12, [r0,#56+HI]
  518 
  519         add     sp,sp,#640
  520         sub     r14,r14,#640
  521 
  522         teq     r1,r2
  523         bne     .Loop
  524 
  525         add     sp,sp,#8*9              @ destroy frame
  526 #if __ARM_ARCH__>=5
  527         ldmia   sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc}
  528 #else
  529         ldmia   sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
  530         tst     lr,#1
  531         moveq   pc,lr                   @ be binary compatible with V4, yet
  532 .word   0xe12fff1e                      @ interoperable with Thumb ISA:-)
  533 #endif
  534 .size   sha512_block_data_order,.-sha512_block_data_order
  535 #if __ARM_MAX_ARCH__>=7
  536 .arch   armv7-a
  537 .fpu    neon
  538 
  539 .globl  sha512_block_data_order_neon
  540 .type   sha512_block_data_order_neon,%function
  541 .align  4
  542 sha512_block_data_order_neon:
  543 .LNEON:
  544         dmb     @ errata #451034 on early Cortex A8
  545         add     r2,r1,r2,lsl#7  @ len to point at the end of inp
  546         adr     r3,K512
  547         VFP_ABI_PUSH
  548         vldmia  r0,{d16,d17,d18,d19,d20,d21,d22,d23}            @ load context
  549 .Loop_neon:
  550         vshr.u64        d24,d20,#14     @ 0
  551 #if 0<16
  552         vld1.64 {d0},[r1]!      @ handles unaligned
  553 #endif
  554         vshr.u64        d25,d20,#18
  555 #if 0>0
  556         vadd.i64        d16,d30                 @ h+=Maj from the past
  557 #endif
  558         vshr.u64        d26,d20,#41
  559         vld1.64 {d28},[r3,:64]! @ K[i++]
  560         vsli.64 d24,d20,#50
  561         vsli.64 d25,d20,#46
  562         vmov    d29,d20
  563         vsli.64 d26,d20,#23
  564 #if 0<16 && defined(__ARMEL__)
  565         vrev64.8        d0,d0
  566 #endif
  567         veor    d25,d24
  568         vbsl    d29,d21,d22             @ Ch(e,f,g)
  569         vshr.u64        d24,d16,#28
  570         veor    d26,d25                 @ Sigma1(e)
  571         vadd.i64        d27,d29,d23
  572         vshr.u64        d25,d16,#34
  573         vsli.64 d24,d16,#36
  574         vadd.i64        d27,d26
  575         vshr.u64        d26,d16,#39
  576         vadd.i64        d28,d0
  577         vsli.64 d25,d16,#30
  578         veor    d30,d16,d17
  579         vsli.64 d26,d16,#25
  580         veor    d23,d24,d25
  581         vadd.i64        d27,d28
  582         vbsl    d30,d18,d17             @ Maj(a,b,c)
  583         veor    d23,d26                 @ Sigma0(a)
  584         vadd.i64        d19,d27
  585         vadd.i64        d30,d27
  586         @ vadd.i64      d23,d30
  587         vshr.u64        d24,d19,#14     @ 1
  588 #if 1<16
  589         vld1.64 {d1},[r1]!      @ handles unaligned
  590 #endif
  591         vshr.u64        d25,d19,#18
  592 #if 1>0
  593         vadd.i64        d23,d30                 @ h+=Maj from the past
  594 #endif
  595         vshr.u64        d26,d19,#41
  596         vld1.64 {d28},[r3,:64]! @ K[i++]
  597         vsli.64 d24,d19,#50
  598         vsli.64 d25,d19,#46
  599         vmov    d29,d19
  600         vsli.64 d26,d19,#23
  601 #if 1<16 && defined(__ARMEL__)
  602         vrev64.8        d1,d1
  603 #endif
  604         veor    d25,d24
  605         vbsl    d29,d20,d21             @ Ch(e,f,g)
  606         vshr.u64        d24,d23,#28
  607         veor    d26,d25                 @ Sigma1(e)
  608         vadd.i64        d27,d29,d22
  609         vshr.u64        d25,d23,#34
  610         vsli.64 d24,d23,#36
  611         vadd.i64        d27,d26
  612         vshr.u64        d26,d23,#39
  613         vadd.i64        d28,d1
  614         vsli.64 d25,d23,#30
  615         veor    d30,d23,d16
  616         vsli.64 d26,d23,#25
  617         veor    d22,d24,d25
  618         vadd.i64        d27,d28
  619         vbsl    d30,d17,d16             @ Maj(a,b,c)
  620         veor    d22,d26                 @ Sigma0(a)
  621         vadd.i64        d18,d27
  622         vadd.i64        d30,d27
  623         @ vadd.i64      d22,d30
  624         vshr.u64        d24,d18,#14     @ 2
  625 #if 2<16
  626         vld1.64 {d2},[r1]!      @ handles unaligned
  627 #endif
  628         vshr.u64        d25,d18,#18
  629 #if 2>0
  630         vadd.i64        d22,d30                 @ h+=Maj from the past
  631 #endif
  632         vshr.u64        d26,d18,#41
  633         vld1.64 {d28},[r3,:64]! @ K[i++]
  634         vsli.64 d24,d18,#50
  635         vsli.64 d25,d18,#46
  636         vmov    d29,d18
  637         vsli.64 d26,d18,#23
  638 #if 2<16 && defined(__ARMEL__)
  639         vrev64.8        d2,d2
  640 #endif
  641         veor    d25,d24
  642         vbsl    d29,d19,d20             @ Ch(e,f,g)
  643         vshr.u64        d24,d22,#28
  644         veor    d26,d25                 @ Sigma1(e)
  645         vadd.i64        d27,d29,d21
  646         vshr.u64        d25,d22,#34
  647         vsli.64 d24,d22,#36
  648         vadd.i64        d27,d26
  649         vshr.u64        d26,d22,#39
  650         vadd.i64        d28,d2
  651         vsli.64 d25,d22,#30
  652         veor    d30,d22,d23
  653         vsli.64 d26,d22,#25
  654         veor    d21,d24,d25
  655         vadd.i64        d27,d28
  656         vbsl    d30,d16,d23             @ Maj(a,b,c)
  657         veor    d21,d26                 @ Sigma0(a)
  658         vadd.i64        d17,d27
  659         vadd.i64        d30,d27
  660         @ vadd.i64      d21,d30
  661         vshr.u64        d24,d17,#14     @ 3
  662 #if 3<16
  663         vld1.64 {d3},[r1]!      @ handles unaligned
  664 #endif
  665         vshr.u64        d25,d17,#18
  666 #if 3>0
  667         vadd.i64        d21,d30                 @ h+=Maj from the past
  668 #endif
  669         vshr.u64        d26,d17,#41
  670         vld1.64 {d28},[r3,:64]! @ K[i++]
  671         vsli.64 d24,d17,#50
  672         vsli.64 d25,d17,#46
  673         vmov    d29,d17
  674         vsli.64 d26,d17,#23
  675 #if 3<16 && defined(__ARMEL__)
  676         vrev64.8        d3,d3
  677 #endif
  678         veor    d25,d24
  679         vbsl    d29,d18,d19             @ Ch(e,f,g)
  680         vshr.u64        d24,d21,#28
  681         veor    d26,d25                 @ Sigma1(e)
  682         vadd.i64        d27,d29,d20
  683         vshr.u64        d25,d21,#34
  684         vsli.64 d24,d21,#36
  685         vadd.i64        d27,d26
  686         vshr.u64        d26,d21,#39
  687         vadd.i64        d28,d3
  688         vsli.64 d25,d21,#30
  689         veor    d30,d21,d22
  690         vsli.64 d26,d21,#25
  691         veor    d20,d24,d25
  692         vadd.i64        d27,d28
  693         vbsl    d30,d23,d22             @ Maj(a,b,c)
  694         veor    d20,d26                 @ Sigma0(a)
  695         vadd.i64        d16,d27
  696         vadd.i64        d30,d27
  697         @ vadd.i64      d20,d30
  698         vshr.u64        d24,d16,#14     @ 4
  699 #if 4<16
  700         vld1.64 {d4},[r1]!      @ handles unaligned
  701 #endif
  702         vshr.u64        d25,d16,#18
  703 #if 4>0
  704         vadd.i64        d20,d30                 @ h+=Maj from the past
  705 #endif
  706         vshr.u64        d26,d16,#41
  707         vld1.64 {d28},[r3,:64]! @ K[i++]
  708         vsli.64 d24,d16,#50
  709         vsli.64 d25,d16,#46
  710         vmov    d29,d16
  711         vsli.64 d26,d16,#23
  712 #if 4<16 && defined(__ARMEL__)
  713         vrev64.8        d4,d4
  714 #endif
  715         veor    d25,d24
  716         vbsl    d29,d17,d18             @ Ch(e,f,g)
  717         vshr.u64        d24,d20,#28
  718         veor    d26,d25                 @ Sigma1(e)
  719         vadd.i64        d27,d29,d19
  720         vshr.u64        d25,d20,#34
  721         vsli.64 d24,d20,#36
  722         vadd.i64        d27,d26
  723         vshr.u64        d26,d20,#39
  724         vadd.i64        d28,d4
  725         vsli.64 d25,d20,#30
  726         veor    d30,d20,d21
  727         vsli.64 d26,d20,#25
  728         veor    d19,d24,d25
  729         vadd.i64        d27,d28
  730         vbsl    d30,d22,d21             @ Maj(a,b,c)
  731         veor    d19,d26                 @ Sigma0(a)
  732         vadd.i64        d23,d27
  733         vadd.i64        d30,d27
  734         @ vadd.i64      d19,d30
  735         vshr.u64        d24,d23,#14     @ 5
  736 #if 5<16
  737         vld1.64 {d5},[r1]!      @ handles unaligned
  738 #endif
  739         vshr.u64        d25,d23,#18
  740 #if 5>0
  741         vadd.i64        d19,d30                 @ h+=Maj from the past
  742 #endif
  743         vshr.u64        d26,d23,#41
  744         vld1.64 {d28},[r3,:64]! @ K[i++]
  745         vsli.64 d24,d23,#50
  746         vsli.64 d25,d23,#46
  747         vmov    d29,d23
  748         vsli.64 d26,d23,#23
  749 #if 5<16 && defined(__ARMEL__)
  750         vrev64.8        d5,d5
  751 #endif
  752         veor    d25,d24
  753         vbsl    d29,d16,d17             @ Ch(e,f,g)
  754         vshr.u64        d24,d19,#28
  755         veor    d26,d25                 @ Sigma1(e)
  756         vadd.i64        d27,d29,d18
  757         vshr.u64        d25,d19,#34
  758         vsli.64 d24,d19,#36
  759         vadd.i64        d27,d26
  760         vshr.u64        d26,d19,#39
  761         vadd.i64        d28,d5
  762         vsli.64 d25,d19,#30
  763         veor    d30,d19,d20
  764         vsli.64 d26,d19,#25
  765         veor    d18,d24,d25
  766         vadd.i64        d27,d28
  767         vbsl    d30,d21,d20             @ Maj(a,b,c)
  768         veor    d18,d26                 @ Sigma0(a)
  769         vadd.i64        d22,d27
  770         vadd.i64        d30,d27
  771         @ vadd.i64      d18,d30
  772         vshr.u64        d24,d22,#14     @ 6
  773 #if 6<16
  774         vld1.64 {d6},[r1]!      @ handles unaligned
  775 #endif
  776         vshr.u64        d25,d22,#18
  777 #if 6>0
  778         vadd.i64        d18,d30                 @ h+=Maj from the past
  779 #endif
  780         vshr.u64        d26,d22,#41
  781         vld1.64 {d28},[r3,:64]! @ K[i++]
  782         vsli.64 d24,d22,#50
  783         vsli.64 d25,d22,#46
  784         vmov    d29,d22
  785         vsli.64 d26,d22,#23
  786 #if 6<16 && defined(__ARMEL__)
  787         vrev64.8        d6,d6
  788 #endif
  789         veor    d25,d24
  790         vbsl    d29,d23,d16             @ Ch(e,f,g)
  791         vshr.u64        d24,d18,#28
  792         veor    d26,d25                 @ Sigma1(e)
  793         vadd.i64        d27,d29,d17
  794         vshr.u64        d25,d18,#34
  795         vsli.64 d24,d18,#36
  796         vadd.i64        d27,d26
  797         vshr.u64        d26,d18,#39
  798         vadd.i64        d28,d6
  799         vsli.64 d25,d18,#30
  800         veor    d30,d18,d19
  801         vsli.64 d26,d18,#25
  802         veor    d17,d24,d25
  803         vadd.i64        d27,d28
  804         vbsl    d30,d20,d19             @ Maj(a,b,c)
  805         veor    d17,d26                 @ Sigma0(a)
  806         vadd.i64        d21,d27
  807         vadd.i64        d30,d27
  808         @ vadd.i64      d17,d30
  809         vshr.u64        d24,d21,#14     @ 7
  810 #if 7<16
  811         vld1.64 {d7},[r1]!      @ handles unaligned
  812 #endif
  813         vshr.u64        d25,d21,#18
  814 #if 7>0
  815         vadd.i64        d17,d30                 @ h+=Maj from the past
  816 #endif
  817         vshr.u64        d26,d21,#41
  818         vld1.64 {d28},[r3,:64]! @ K[i++]
  819         vsli.64 d24,d21,#50
  820         vsli.64 d25,d21,#46
  821         vmov    d29,d21
  822         vsli.64 d26,d21,#23
  823 #if 7<16 && defined(__ARMEL__)
  824         vrev64.8        d7,d7
  825 #endif
  826         veor    d25,d24
  827         vbsl    d29,d22,d23             @ Ch(e,f,g)
  828         vshr.u64        d24,d17,#28
  829         veor    d26,d25                 @ Sigma1(e)
  830         vadd.i64        d27,d29,d16
  831         vshr.u64        d25,d17,#34
  832         vsli.64 d24,d17,#36
  833         vadd.i64        d27,d26
  834         vshr.u64        d26,d17,#39
  835         vadd.i64        d28,d7
  836         vsli.64 d25,d17,#30
  837         veor    d30,d17,d18
  838         vsli.64 d26,d17,#25
  839         veor    d16,d24,d25
  840         vadd.i64        d27,d28
  841         vbsl    d30,d19,d18             @ Maj(a,b,c)
  842         veor    d16,d26                 @ Sigma0(a)
  843         vadd.i64        d20,d27
  844         vadd.i64        d30,d27
  845         @ vadd.i64      d16,d30
  846         vshr.u64        d24,d20,#14     @ 8
  847 #if 8<16
  848         vld1.64 {d8},[r1]!      @ handles unaligned
  849 #endif
  850         vshr.u64        d25,d20,#18
  851 #if 8>0
  852         vadd.i64        d16,d30                 @ h+=Maj from the past
  853 #endif
  854         vshr.u64        d26,d20,#41
  855         vld1.64 {d28},[r3,:64]! @ K[i++]
  856         vsli.64 d24,d20,#50
  857         vsli.64 d25,d20,#46
  858         vmov    d29,d20
  859         vsli.64 d26,d20,#23
  860 #if 8<16 && defined(__ARMEL__)
  861         vrev64.8        d8,d8
  862 #endif
  863         veor    d25,d24
  864         vbsl    d29,d21,d22             @ Ch(e,f,g)
  865         vshr.u64        d24,d16,#28
  866         veor    d26,d25                 @ Sigma1(e)
  867         vadd.i64        d27,d29,d23
  868         vshr.u64        d25,d16,#34
  869         vsli.64 d24,d16,#36
  870         vadd.i64        d27,d26
  871         vshr.u64        d26,d16,#39
  872         vadd.i64        d28,d8
  873         vsli.64 d25,d16,#30
  874         veor    d30,d16,d17
  875         vsli.64 d26,d16,#25
  876         veor    d23,d24,d25
  877         vadd.i64        d27,d28
  878         vbsl    d30,d18,d17             @ Maj(a,b,c)
  879         veor    d23,d26                 @ Sigma0(a)
  880         vadd.i64        d19,d27
  881         vadd.i64        d30,d27
  882         @ vadd.i64      d23,d30
  883         vshr.u64        d24,d19,#14     @ 9
  884 #if 9<16
  885         vld1.64 {d9},[r1]!      @ handles unaligned
  886 #endif
  887         vshr.u64        d25,d19,#18
  888 #if 9>0
  889         vadd.i64        d23,d30                 @ h+=Maj from the past
  890 #endif
  891         vshr.u64        d26,d19,#41
  892         vld1.64 {d28},[r3,:64]! @ K[i++]
  893         vsli.64 d24,d19,#50
  894         vsli.64 d25,d19,#46
  895         vmov    d29,d19
  896         vsli.64 d26,d19,#23
  897 #if 9<16 && defined(__ARMEL__)
  898         vrev64.8        d9,d9
  899 #endif
  900         veor    d25,d24
  901         vbsl    d29,d20,d21             @ Ch(e,f,g)
  902         vshr.u64        d24,d23,#28
  903         veor    d26,d25                 @ Sigma1(e)
  904         vadd.i64        d27,d29,d22
  905         vshr.u64        d25,d23,#34
  906         vsli.64 d24,d23,#36
  907         vadd.i64        d27,d26
  908         vshr.u64        d26,d23,#39
  909         vadd.i64        d28,d9
  910         vsli.64 d25,d23,#30
  911         veor    d30,d23,d16
  912         vsli.64 d26,d23,#25
  913         veor    d22,d24,d25
  914         vadd.i64        d27,d28
  915         vbsl    d30,d17,d16             @ Maj(a,b,c)
  916         veor    d22,d26                 @ Sigma0(a)
  917         vadd.i64        d18,d27
  918         vadd.i64        d30,d27
  919         @ vadd.i64      d22,d30
  920         vshr.u64        d24,d18,#14     @ 10
  921 #if 10<16
  922         vld1.64 {d10},[r1]!     @ handles unaligned
  923 #endif
  924         vshr.u64        d25,d18,#18
  925 #if 10>0
  926         vadd.i64        d22,d30                 @ h+=Maj from the past
  927 #endif
  928         vshr.u64        d26,d18,#41
  929         vld1.64 {d28},[r3,:64]! @ K[i++]
  930         vsli.64 d24,d18,#50
  931         vsli.64 d25,d18,#46
  932         vmov    d29,d18
  933         vsli.64 d26,d18,#23
  934 #if 10<16 && defined(__ARMEL__)
  935         vrev64.8        d10,d10
  936 #endif
  937         veor    d25,d24
  938         vbsl    d29,d19,d20             @ Ch(e,f,g)
  939         vshr.u64        d24,d22,#28
  940         veor    d26,d25                 @ Sigma1(e)
  941         vadd.i64        d27,d29,d21
  942         vshr.u64        d25,d22,#34
  943         vsli.64 d24,d22,#36
  944         vadd.i64        d27,d26
  945         vshr.u64        d26,d22,#39
  946         vadd.i64        d28,d10
  947         vsli.64 d25,d22,#30
  948         veor    d30,d22,d23
  949         vsli.64 d26,d22,#25
  950         veor    d21,d24,d25
  951         vadd.i64        d27,d28
  952         vbsl    d30,d16,d23             @ Maj(a,b,c)
  953         veor    d21,d26                 @ Sigma0(a)
  954         vadd.i64        d17,d27
  955         vadd.i64        d30,d27
  956         @ vadd.i64      d21,d30
  957         vshr.u64        d24,d17,#14     @ 11
  958 #if 11<16
  959         vld1.64 {d11},[r1]!     @ handles unaligned
  960 #endif
  961         vshr.u64        d25,d17,#18
  962 #if 11>0
  963         vadd.i64        d21,d30                 @ h+=Maj from the past
  964 #endif
  965         vshr.u64        d26,d17,#41
  966         vld1.64 {d28},[r3,:64]! @ K[i++]
  967         vsli.64 d24,d17,#50
  968         vsli.64 d25,d17,#46
  969         vmov    d29,d17
  970         vsli.64 d26,d17,#23
  971 #if 11<16 && defined(__ARMEL__)
  972         vrev64.8        d11,d11
  973 #endif
  974         veor    d25,d24
  975         vbsl    d29,d18,d19             @ Ch(e,f,g)
  976         vshr.u64        d24,d21,#28
  977         veor    d26,d25                 @ Sigma1(e)
  978         vadd.i64        d27,d29,d20
  979         vshr.u64        d25,d21,#34
  980         vsli.64 d24,d21,#36
  981         vadd.i64        d27,d26
  982         vshr.u64        d26,d21,#39
  983         vadd.i64        d28,d11
  984         vsli.64 d25,d21,#30
  985         veor    d30,d21,d22
  986         vsli.64 d26,d21,#25
  987         veor    d20,d24,d25
  988         vadd.i64        d27,d28
  989         vbsl    d30,d23,d22             @ Maj(a,b,c)
  990         veor    d20,d26                 @ Sigma0(a)
  991         vadd.i64        d16,d27
  992         vadd.i64        d30,d27
  993         @ vadd.i64      d20,d30
  994         vshr.u64        d24,d16,#14     @ 12
  995 #if 12<16
  996         vld1.64 {d12},[r1]!     @ handles unaligned
  997 #endif
  998         vshr.u64        d25,d16,#18
  999 #if 12>0
 1000         vadd.i64        d20,d30                 @ h+=Maj from the past
 1001 #endif
 1002         vshr.u64        d26,d16,#41
 1003         vld1.64 {d28},[r3,:64]! @ K[i++]
 1004         vsli.64 d24,d16,#50
 1005         vsli.64 d25,d16,#46
 1006         vmov    d29,d16
 1007         vsli.64 d26,d16,#23
 1008 #if 12<16 && defined(__ARMEL__)
 1009         vrev64.8        d12,d12
 1010 #endif
 1011         veor    d25,d24
 1012         vbsl    d29,d17,d18             @ Ch(e,f,g)
 1013         vshr.u64        d24,d20,#28
 1014         veor    d26,d25                 @ Sigma1(e)
 1015         vadd.i64        d27,d29,d19
 1016         vshr.u64        d25,d20,#34
 1017         vsli.64 d24,d20,#36
 1018         vadd.i64        d27,d26
 1019         vshr.u64        d26,d20,#39
 1020         vadd.i64        d28,d12
 1021         vsli.64 d25,d20,#30
 1022         veor    d30,d20,d21
 1023         vsli.64 d26,d20,#25
 1024         veor    d19,d24,d25
 1025         vadd.i64        d27,d28
 1026         vbsl    d30,d22,d21             @ Maj(a,b,c)
 1027         veor    d19,d26                 @ Sigma0(a)
 1028         vadd.i64        d23,d27
 1029         vadd.i64        d30,d27
 1030         @ vadd.i64      d19,d30
 1031         vshr.u64        d24,d23,#14     @ 13
 1032 #if 13<16
 1033         vld1.64 {d13},[r1]!     @ handles unaligned
 1034 #endif
 1035         vshr.u64        d25,d23,#18
 1036 #if 13>0
 1037         vadd.i64        d19,d30                 @ h+=Maj from the past
 1038 #endif
 1039         vshr.u64        d26,d23,#41
 1040         vld1.64 {d28},[r3,:64]! @ K[i++]
 1041         vsli.64 d24,d23,#50
 1042         vsli.64 d25,d23,#46
 1043         vmov    d29,d23
 1044         vsli.64 d26,d23,#23
 1045 #if 13<16 && defined(__ARMEL__)
 1046         vrev64.8        d13,d13
 1047 #endif
 1048         veor    d25,d24
 1049         vbsl    d29,d16,d17             @ Ch(e,f,g)
 1050         vshr.u64        d24,d19,#28
 1051         veor    d26,d25                 @ Sigma1(e)
 1052         vadd.i64        d27,d29,d18
 1053         vshr.u64        d25,d19,#34
 1054         vsli.64 d24,d19,#36
 1055         vadd.i64        d27,d26
 1056         vshr.u64        d26,d19,#39
 1057         vadd.i64        d28,d13
 1058         vsli.64 d25,d19,#30
 1059         veor    d30,d19,d20
 1060         vsli.64 d26,d19,#25
 1061         veor    d18,d24,d25
 1062         vadd.i64        d27,d28
 1063         vbsl    d30,d21,d20             @ Maj(a,b,c)
 1064         veor    d18,d26                 @ Sigma0(a)
 1065         vadd.i64        d22,d27
 1066         vadd.i64        d30,d27
 1067         @ vadd.i64      d18,d30
 1068         vshr.u64        d24,d22,#14     @ 14
 1069 #if 14<16
 1070         vld1.64 {d14},[r1]!     @ handles unaligned
 1071 #endif
 1072         vshr.u64        d25,d22,#18
 1073 #if 14>0
 1074         vadd.i64        d18,d30                 @ h+=Maj from the past
 1075 #endif
 1076         vshr.u64        d26,d22,#41
 1077         vld1.64 {d28},[r3,:64]! @ K[i++]
 1078         vsli.64 d24,d22,#50
 1079         vsli.64 d25,d22,#46
 1080         vmov    d29,d22
 1081         vsli.64 d26,d22,#23
 1082 #if 14<16 && defined(__ARMEL__)
 1083         vrev64.8        d14,d14
 1084 #endif
 1085         veor    d25,d24
 1086         vbsl    d29,d23,d16             @ Ch(e,f,g)
 1087         vshr.u64        d24,d18,#28
 1088         veor    d26,d25                 @ Sigma1(e)
 1089         vadd.i64        d27,d29,d17
 1090         vshr.u64        d25,d18,#34
 1091         vsli.64 d24,d18,#36
 1092         vadd.i64        d27,d26
 1093         vshr.u64        d26,d18,#39
 1094         vadd.i64        d28,d14
 1095         vsli.64 d25,d18,#30
 1096         veor    d30,d18,d19
 1097         vsli.64 d26,d18,#25
 1098         veor    d17,d24,d25
 1099         vadd.i64        d27,d28
 1100         vbsl    d30,d20,d19             @ Maj(a,b,c)
 1101         veor    d17,d26                 @ Sigma0(a)
 1102         vadd.i64        d21,d27
 1103         vadd.i64        d30,d27
 1104         @ vadd.i64      d17,d30
 1105         vshr.u64        d24,d21,#14     @ 15
 1106 #if 15<16
 1107         vld1.64 {d15},[r1]!     @ handles unaligned
 1108 #endif
 1109         vshr.u64        d25,d21,#18
 1110 #if 15>0
 1111         vadd.i64        d17,d30                 @ h+=Maj from the past
 1112 #endif
 1113         vshr.u64        d26,d21,#41
 1114         vld1.64 {d28},[r3,:64]! @ K[i++]
 1115         vsli.64 d24,d21,#50
 1116         vsli.64 d25,d21,#46
 1117         vmov    d29,d21
 1118         vsli.64 d26,d21,#23
 1119 #if 15<16 && defined(__ARMEL__)
 1120         vrev64.8        d15,d15
 1121 #endif
 1122         veor    d25,d24
 1123         vbsl    d29,d22,d23             @ Ch(e,f,g)
 1124         vshr.u64        d24,d17,#28
 1125         veor    d26,d25                 @ Sigma1(e)
 1126         vadd.i64        d27,d29,d16
 1127         vshr.u64        d25,d17,#34
 1128         vsli.64 d24,d17,#36
 1129         vadd.i64        d27,d26
 1130         vshr.u64        d26,d17,#39
 1131         vadd.i64        d28,d15
 1132         vsli.64 d25,d17,#30
 1133         veor    d30,d17,d18
 1134         vsli.64 d26,d17,#25
 1135         veor    d16,d24,d25
 1136         vadd.i64        d27,d28
 1137         vbsl    d30,d19,d18             @ Maj(a,b,c)
 1138         veor    d16,d26                 @ Sigma0(a)
 1139         vadd.i64        d20,d27
 1140         vadd.i64        d30,d27
 1141         @ vadd.i64      d16,d30
 1142         mov     r12,#4
 1143 .L16_79_neon:
 1144         subs    r12,#1
 1145         vshr.u64        q12,q7,#19
 1146         vshr.u64        q13,q7,#61
 1147         vadd.i64        d16,d30                 @ h+=Maj from the past
 1148         vshr.u64        q15,q7,#6
 1149         vsli.64 q12,q7,#45
 1150         vext.8  q14,q0,q1,#8    @ X[i+1]
 1151         vsli.64 q13,q7,#3
 1152         veor    q15,q12
 1153         vshr.u64        q12,q14,#1
 1154         veor    q15,q13                         @ sigma1(X[i+14])
 1155         vshr.u64        q13,q14,#8
 1156         vadd.i64        q0,q15
 1157         vshr.u64        q15,q14,#7
 1158         vsli.64 q12,q14,#63
 1159         vsli.64 q13,q14,#56
 1160         vext.8  q14,q4,q5,#8    @ X[i+9]
 1161         veor    q15,q12
 1162         vshr.u64        d24,d20,#14             @ from NEON_00_15
 1163         vadd.i64        q0,q14
 1164         vshr.u64        d25,d20,#18             @ from NEON_00_15
 1165         veor    q15,q13                         @ sigma0(X[i+1])
 1166         vshr.u64        d26,d20,#41             @ from NEON_00_15
 1167         vadd.i64        q0,q15
 1168         vld1.64 {d28},[r3,:64]! @ K[i++]
 1169         vsli.64 d24,d20,#50
 1170         vsli.64 d25,d20,#46
 1171         vmov    d29,d20
 1172         vsli.64 d26,d20,#23
 1173 #if 16<16 && defined(__ARMEL__)
 1174         vrev64.8        ,
 1175 #endif
 1176         veor    d25,d24
 1177         vbsl    d29,d21,d22             @ Ch(e,f,g)
 1178         vshr.u64        d24,d16,#28
 1179         veor    d26,d25                 @ Sigma1(e)
 1180         vadd.i64        d27,d29,d23
 1181         vshr.u64        d25,d16,#34
 1182         vsli.64 d24,d16,#36
 1183         vadd.i64        d27,d26
 1184         vshr.u64        d26,d16,#39
 1185         vadd.i64        d28,d0
 1186         vsli.64 d25,d16,#30
 1187         veor    d30,d16,d17
 1188         vsli.64 d26,d16,#25
 1189         veor    d23,d24,d25
 1190         vadd.i64        d27,d28
 1191         vbsl    d30,d18,d17             @ Maj(a,b,c)
 1192         veor    d23,d26                 @ Sigma0(a)
 1193         vadd.i64        d19,d27
 1194         vadd.i64        d30,d27
 1195         @ vadd.i64      d23,d30
 1196         vshr.u64        d24,d19,#14     @ 17
 1197 #if 17<16
 1198         vld1.64 {d1},[r1]!      @ handles unaligned
 1199 #endif
 1200         vshr.u64        d25,d19,#18
 1201 #if 17>0
 1202         vadd.i64        d23,d30                 @ h+=Maj from the past
 1203 #endif
 1204         vshr.u64        d26,d19,#41
 1205         vld1.64 {d28},[r3,:64]! @ K[i++]
 1206         vsli.64 d24,d19,#50
 1207         vsli.64 d25,d19,#46
 1208         vmov    d29,d19
 1209         vsli.64 d26,d19,#23
 1210 #if 17<16 && defined(__ARMEL__)
 1211         vrev64.8        ,
 1212 #endif
 1213         veor    d25,d24
 1214         vbsl    d29,d20,d21             @ Ch(e,f,g)
 1215         vshr.u64        d24,d23,#28
 1216         veor    d26,d25                 @ Sigma1(e)
 1217         vadd.i64        d27,d29,d22
 1218         vshr.u64        d25,d23,#34
 1219         vsli.64 d24,d23,#36
 1220         vadd.i64        d27,d26
 1221         vshr.u64        d26,d23,#39
 1222         vadd.i64        d28,d1
 1223         vsli.64 d25,d23,#30
 1224         veor    d30,d23,d16
 1225         vsli.64 d26,d23,#25
 1226         veor    d22,d24,d25
 1227         vadd.i64        d27,d28
 1228         vbsl    d30,d17,d16             @ Maj(a,b,c)
 1229         veor    d22,d26                 @ Sigma0(a)
 1230         vadd.i64        d18,d27
 1231         vadd.i64        d30,d27
 1232         @ vadd.i64      d22,d30
 1233         vshr.u64        q12,q0,#19
 1234         vshr.u64        q13,q0,#61
 1235         vadd.i64        d22,d30                 @ h+=Maj from the past
 1236         vshr.u64        q15,q0,#6
 1237         vsli.64 q12,q0,#45
 1238         vext.8  q14,q1,q2,#8    @ X[i+1]
 1239         vsli.64 q13,q0,#3
 1240         veor    q15,q12
 1241         vshr.u64        q12,q14,#1
 1242         veor    q15,q13                         @ sigma1(X[i+14])
 1243         vshr.u64        q13,q14,#8
 1244         vadd.i64        q1,q15
 1245         vshr.u64        q15,q14,#7
 1246         vsli.64 q12,q14,#63
 1247         vsli.64 q13,q14,#56
 1248         vext.8  q14,q5,q6,#8    @ X[i+9]
 1249         veor    q15,q12
 1250         vshr.u64        d24,d18,#14             @ from NEON_00_15
 1251         vadd.i64        q1,q14
 1252         vshr.u64        d25,d18,#18             @ from NEON_00_15
 1253         veor    q15,q13                         @ sigma0(X[i+1])
 1254         vshr.u64        d26,d18,#41             @ from NEON_00_15
 1255         vadd.i64        q1,q15
 1256         vld1.64 {d28},[r3,:64]! @ K[i++]
 1257         vsli.64 d24,d18,#50
 1258         vsli.64 d25,d18,#46
 1259         vmov    d29,d18
 1260         vsli.64 d26,d18,#23
 1261 #if 18<16 && defined(__ARMEL__)
 1262         vrev64.8        ,
 1263 #endif
 1264         veor    d25,d24
 1265         vbsl    d29,d19,d20             @ Ch(e,f,g)
 1266         vshr.u64        d24,d22,#28
 1267         veor    d26,d25                 @ Sigma1(e)
 1268         vadd.i64        d27,d29,d21
 1269         vshr.u64        d25,d22,#34
 1270         vsli.64 d24,d22,#36
 1271         vadd.i64        d27,d26
 1272         vshr.u64        d26,d22,#39
 1273         vadd.i64        d28,d2
 1274         vsli.64 d25,d22,#30
 1275         veor    d30,d22,d23
 1276         vsli.64 d26,d22,#25
 1277         veor    d21,d24,d25
 1278         vadd.i64        d27,d28
 1279         vbsl    d30,d16,d23             @ Maj(a,b,c)
 1280         veor    d21,d26                 @ Sigma0(a)
 1281         vadd.i64        d17,d27
 1282         vadd.i64        d30,d27
 1283         @ vadd.i64      d21,d30
 1284         vshr.u64        d24,d17,#14     @ 19
 1285 #if 19<16
 1286         vld1.64 {d3},[r1]!      @ handles unaligned
 1287 #endif
 1288         vshr.u64        d25,d17,#18
 1289 #if 19>0
 1290         vadd.i64        d21,d30                 @ h+=Maj from the past
 1291 #endif
 1292         vshr.u64        d26,d17,#41
 1293         vld1.64 {d28},[r3,:64]! @ K[i++]
 1294         vsli.64 d24,d17,#50
 1295         vsli.64 d25,d17,#46
 1296         vmov    d29,d17
 1297         vsli.64 d26,d17,#23
 1298 #if 19<16 && defined(__ARMEL__)
 1299         vrev64.8        ,
 1300 #endif
 1301         veor    d25,d24
 1302         vbsl    d29,d18,d19             @ Ch(e,f,g)
 1303         vshr.u64        d24,d21,#28
 1304         veor    d26,d25                 @ Sigma1(e)
 1305         vadd.i64        d27,d29,d20
 1306         vshr.u64        d25,d21,#34
 1307         vsli.64 d24,d21,#36
 1308         vadd.i64        d27,d26
 1309         vshr.u64        d26,d21,#39
 1310         vadd.i64        d28,d3
 1311         vsli.64 d25,d21,#30
 1312         veor    d30,d21,d22
 1313         vsli.64 d26,d21,#25
 1314         veor    d20,d24,d25
 1315         vadd.i64        d27,d28
 1316         vbsl    d30,d23,d22             @ Maj(a,b,c)
 1317         veor    d20,d26                 @ Sigma0(a)
 1318         vadd.i64        d16,d27
 1319         vadd.i64        d30,d27
 1320         @ vadd.i64      d20,d30
 1321         vshr.u64        q12,q1,#19
 1322         vshr.u64        q13,q1,#61
 1323         vadd.i64        d20,d30                 @ h+=Maj from the past
 1324         vshr.u64        q15,q1,#6
 1325         vsli.64 q12,q1,#45
 1326         vext.8  q14,q2,q3,#8    @ X[i+1]
 1327         vsli.64 q13,q1,#3
 1328         veor    q15,q12
 1329         vshr.u64        q12,q14,#1
 1330         veor    q15,q13                         @ sigma1(X[i+14])
 1331         vshr.u64        q13,q14,#8
 1332         vadd.i64        q2,q15
 1333         vshr.u64        q15,q14,#7
 1334         vsli.64 q12,q14,#63
 1335         vsli.64 q13,q14,#56
 1336         vext.8  q14,q6,q7,#8    @ X[i+9]
 1337         veor    q15,q12
 1338         vshr.u64        d24,d16,#14             @ from NEON_00_15
 1339         vadd.i64        q2,q14
 1340         vshr.u64        d25,d16,#18             @ from NEON_00_15
 1341         veor    q15,q13                         @ sigma0(X[i+1])
 1342         vshr.u64        d26,d16,#41             @ from NEON_00_15
 1343         vadd.i64        q2,q15
 1344         vld1.64 {d28},[r3,:64]! @ K[i++]
 1345         vsli.64 d24,d16,#50
 1346         vsli.64 d25,d16,#46
 1347         vmov    d29,d16
 1348         vsli.64 d26,d16,#23
 1349 #if 20<16 && defined(__ARMEL__)
 1350         vrev64.8        ,
 1351 #endif
 1352         veor    d25,d24
 1353         vbsl    d29,d17,d18             @ Ch(e,f,g)
 1354         vshr.u64        d24,d20,#28
 1355         veor    d26,d25                 @ Sigma1(e)
 1356         vadd.i64        d27,d29,d19
 1357         vshr.u64        d25,d20,#34
 1358         vsli.64 d24,d20,#36
 1359         vadd.i64        d27,d26
 1360         vshr.u64        d26,d20,#39
 1361         vadd.i64        d28,d4
 1362         vsli.64 d25,d20,#30
 1363         veor    d30,d20,d21
 1364         vsli.64 d26,d20,#25
 1365         veor    d19,d24,d25
 1366         vadd.i64        d27,d28
 1367         vbsl    d30,d22,d21             @ Maj(a,b,c)
 1368         veor    d19,d26                 @ Sigma0(a)
 1369         vadd.i64        d23,d27
 1370         vadd.i64        d30,d27
 1371         @ vadd.i64      d19,d30
 1372         vshr.u64        d24,d23,#14     @ 21
 1373 #if 21<16
 1374         vld1.64 {d5},[r1]!      @ handles unaligned
 1375 #endif
 1376         vshr.u64        d25,d23,#18
 1377 #if 21>0
 1378         vadd.i64        d19,d30                 @ h+=Maj from the past
 1379 #endif
 1380         vshr.u64        d26,d23,#41
 1381         vld1.64 {d28},[r3,:64]! @ K[i++]
 1382         vsli.64 d24,d23,#50
 1383         vsli.64 d25,d23,#46
 1384         vmov    d29,d23
 1385         vsli.64 d26,d23,#23
 1386 #if 21<16 && defined(__ARMEL__)
 1387         vrev64.8        ,
 1388 #endif
 1389         veor    d25,d24
 1390         vbsl    d29,d16,d17             @ Ch(e,f,g)
 1391         vshr.u64        d24,d19,#28
 1392         veor    d26,d25                 @ Sigma1(e)
 1393         vadd.i64        d27,d29,d18
 1394         vshr.u64        d25,d19,#34
 1395         vsli.64 d24,d19,#36
 1396         vadd.i64        d27,d26
 1397         vshr.u64        d26,d19,#39
 1398         vadd.i64        d28,d5
 1399         vsli.64 d25,d19,#30
 1400         veor    d30,d19,d20
 1401         vsli.64 d26,d19,#25
 1402         veor    d18,d24,d25
 1403         vadd.i64        d27,d28
 1404         vbsl    d30,d21,d20             @ Maj(a,b,c)
 1405         veor    d18,d26                 @ Sigma0(a)
 1406         vadd.i64        d22,d27
 1407         vadd.i64        d30,d27
 1408         @ vadd.i64      d18,d30
 1409         vshr.u64        q12,q2,#19
 1410         vshr.u64        q13,q2,#61
 1411         vadd.i64        d18,d30                 @ h+=Maj from the past
 1412         vshr.u64        q15,q2,#6
 1413         vsli.64 q12,q2,#45
 1414         vext.8  q14,q3,q4,#8    @ X[i+1]
 1415         vsli.64 q13,q2,#3
 1416         veor    q15,q12
 1417         vshr.u64        q12,q14,#1
 1418         veor    q15,q13                         @ sigma1(X[i+14])
 1419         vshr.u64        q13,q14,#8
 1420         vadd.i64        q3,q15
 1421         vshr.u64        q15,q14,#7
 1422         vsli.64 q12,q14,#63
 1423         vsli.64 q13,q14,#56
 1424         vext.8  q14,q7,q0,#8    @ X[i+9]
 1425         veor    q15,q12
 1426         vshr.u64        d24,d22,#14             @ from NEON_00_15
 1427         vadd.i64        q3,q14
 1428         vshr.u64        d25,d22,#18             @ from NEON_00_15
 1429         veor    q15,q13                         @ sigma0(X[i+1])
 1430         vshr.u64        d26,d22,#41             @ from NEON_00_15
 1431         vadd.i64        q3,q15
 1432         vld1.64 {d28},[r3,:64]! @ K[i++]
 1433         vsli.64 d24,d22,#50
 1434         vsli.64 d25,d22,#46
 1435         vmov    d29,d22
 1436         vsli.64 d26,d22,#23
 1437 #if 22<16 && defined(__ARMEL__)
 1438         vrev64.8        ,
 1439 #endif
 1440         veor    d25,d24
 1441         vbsl    d29,d23,d16             @ Ch(e,f,g)
 1442         vshr.u64        d24,d18,#28
 1443         veor    d26,d25                 @ Sigma1(e)
 1444         vadd.i64        d27,d29,d17
 1445         vshr.u64        d25,d18,#34
 1446         vsli.64 d24,d18,#36
 1447         vadd.i64        d27,d26
 1448         vshr.u64        d26,d18,#39
 1449         vadd.i64        d28,d6
 1450         vsli.64 d25,d18,#30
 1451         veor    d30,d18,d19
 1452         vsli.64 d26,d18,#25
 1453         veor    d17,d24,d25
 1454         vadd.i64        d27,d28
 1455         vbsl    d30,d20,d19             @ Maj(a,b,c)
 1456         veor    d17,d26                 @ Sigma0(a)
 1457         vadd.i64        d21,d27
 1458         vadd.i64        d30,d27
 1459         @ vadd.i64      d17,d30
 1460         vshr.u64        d24,d21,#14     @ 23
 1461 #if 23<16
 1462         vld1.64 {d7},[r1]!      @ handles unaligned
 1463 #endif
 1464         vshr.u64        d25,d21,#18
 1465 #if 23>0
 1466         vadd.i64        d17,d30                 @ h+=Maj from the past
 1467 #endif
 1468         vshr.u64        d26,d21,#41
 1469         vld1.64 {d28},[r3,:64]! @ K[i++]
 1470         vsli.64 d24,d21,#50
 1471         vsli.64 d25,d21,#46
 1472         vmov    d29,d21
 1473         vsli.64 d26,d21,#23
 1474 #if 23<16 && defined(__ARMEL__)
 1475         vrev64.8        ,
 1476 #endif
 1477         veor    d25,d24
 1478         vbsl    d29,d22,d23             @ Ch(e,f,g)
 1479         vshr.u64        d24,d17,#28
 1480         veor    d26,d25                 @ Sigma1(e)
 1481         vadd.i64        d27,d29,d16
 1482         vshr.u64        d25,d17,#34
 1483         vsli.64 d24,d17,#36
 1484         vadd.i64        d27,d26
 1485         vshr.u64        d26,d17,#39
 1486         vadd.i64        d28,d7
 1487         vsli.64 d25,d17,#30
 1488         veor    d30,d17,d18
 1489         vsli.64 d26,d17,#25
 1490         veor    d16,d24,d25
 1491         vadd.i64        d27,d28
 1492         vbsl    d30,d19,d18             @ Maj(a,b,c)
 1493         veor    d16,d26                 @ Sigma0(a)
 1494         vadd.i64        d20,d27
 1495         vadd.i64        d30,d27
 1496         @ vadd.i64      d16,d30
 1497         vshr.u64        q12,q3,#19
 1498         vshr.u64        q13,q3,#61
 1499         vadd.i64        d16,d30                 @ h+=Maj from the past
 1500         vshr.u64        q15,q3,#6
 1501         vsli.64 q12,q3,#45
 1502         vext.8  q14,q4,q5,#8    @ X[i+1]
 1503         vsli.64 q13,q3,#3
 1504         veor    q15,q12
 1505         vshr.u64        q12,q14,#1
 1506         veor    q15,q13                         @ sigma1(X[i+14])
 1507         vshr.u64        q13,q14,#8
 1508         vadd.i64        q4,q15
 1509         vshr.u64        q15,q14,#7
 1510         vsli.64 q12,q14,#63
 1511         vsli.64 q13,q14,#56
 1512         vext.8  q14,q0,q1,#8    @ X[i+9]
 1513         veor    q15,q12
 1514         vshr.u64        d24,d20,#14             @ from NEON_00_15
 1515         vadd.i64        q4,q14
 1516         vshr.u64        d25,d20,#18             @ from NEON_00_15
 1517         veor    q15,q13                         @ sigma0(X[i+1])
 1518         vshr.u64        d26,d20,#41             @ from NEON_00_15
 1519         vadd.i64        q4,q15
 1520         vld1.64 {d28},[r3,:64]! @ K[i++]
 1521         vsli.64 d24,d20,#50
 1522         vsli.64 d25,d20,#46
 1523         vmov    d29,d20
 1524         vsli.64 d26,d20,#23
 1525 #if 24<16 && defined(__ARMEL__)
 1526         vrev64.8        ,
 1527 #endif
 1528         veor    d25,d24
 1529         vbsl    d29,d21,d22             @ Ch(e,f,g)
 1530         vshr.u64        d24,d16,#28
 1531         veor    d26,d25                 @ Sigma1(e)
 1532         vadd.i64        d27,d29,d23
 1533         vshr.u64        d25,d16,#34
 1534         vsli.64 d24,d16,#36
 1535         vadd.i64        d27,d26
 1536         vshr.u64        d26,d16,#39
 1537         vadd.i64        d28,d8
 1538         vsli.64 d25,d16,#30
 1539         veor    d30,d16,d17
 1540         vsli.64 d26,d16,#25
 1541         veor    d23,d24,d25
 1542         vadd.i64        d27,d28
 1543         vbsl    d30,d18,d17             @ Maj(a,b,c)
 1544         veor    d23,d26                 @ Sigma0(a)
 1545         vadd.i64        d19,d27
 1546         vadd.i64        d30,d27
 1547         @ vadd.i64      d23,d30
 1548         vshr.u64        d24,d19,#14     @ 25
 1549 #if 25<16
 1550         vld1.64 {d9},[r1]!      @ handles unaligned
 1551 #endif
 1552         vshr.u64        d25,d19,#18
 1553 #if 25>0
 1554         vadd.i64        d23,d30                 @ h+=Maj from the past
 1555 #endif
 1556         vshr.u64        d26,d19,#41
 1557         vld1.64 {d28},[r3,:64]! @ K[i++]
 1558         vsli.64 d24,d19,#50
 1559         vsli.64 d25,d19,#46
 1560         vmov    d29,d19
 1561         vsli.64 d26,d19,#23
 1562 #if 25<16 && defined(__ARMEL__)
 1563         vrev64.8        ,
 1564 #endif
 1565         veor    d25,d24
 1566         vbsl    d29,d20,d21             @ Ch(e,f,g)
 1567         vshr.u64        d24,d23,#28
 1568         veor    d26,d25                 @ Sigma1(e)
 1569         vadd.i64        d27,d29,d22
 1570         vshr.u64        d25,d23,#34
 1571         vsli.64 d24,d23,#36
 1572         vadd.i64        d27,d26
 1573         vshr.u64        d26,d23,#39
 1574         vadd.i64        d28,d9
 1575         vsli.64 d25,d23,#30
 1576         veor    d30,d23,d16
 1577         vsli.64 d26,d23,#25
 1578         veor    d22,d24,d25
 1579         vadd.i64        d27,d28
 1580         vbsl    d30,d17,d16             @ Maj(a,b,c)
 1581         veor    d22,d26                 @ Sigma0(a)
 1582         vadd.i64        d18,d27
 1583         vadd.i64        d30,d27
 1584         @ vadd.i64      d22,d30
 1585         vshr.u64        q12,q4,#19
 1586         vshr.u64        q13,q4,#61
 1587         vadd.i64        d22,d30                 @ h+=Maj from the past
 1588         vshr.u64        q15,q4,#6
 1589         vsli.64 q12,q4,#45
 1590         vext.8  q14,q5,q6,#8    @ X[i+1]
 1591         vsli.64 q13,q4,#3
 1592         veor    q15,q12
 1593         vshr.u64        q12,q14,#1
 1594         veor    q15,q13                         @ sigma1(X[i+14])
 1595         vshr.u64        q13,q14,#8
 1596         vadd.i64        q5,q15
 1597         vshr.u64        q15,q14,#7
 1598         vsli.64 q12,q14,#63
 1599         vsli.64 q13,q14,#56
 1600         vext.8  q14,q1,q2,#8    @ X[i+9]
 1601         veor    q15,q12
 1602         vshr.u64        d24,d18,#14             @ from NEON_00_15
 1603         vadd.i64        q5,q14
 1604         vshr.u64        d25,d18,#18             @ from NEON_00_15
 1605         veor    q15,q13                         @ sigma0(X[i+1])
 1606         vshr.u64        d26,d18,#41             @ from NEON_00_15
 1607         vadd.i64        q5,q15
 1608         vld1.64 {d28},[r3,:64]! @ K[i++]
 1609         vsli.64 d24,d18,#50
 1610         vsli.64 d25,d18,#46
 1611         vmov    d29,d18
 1612         vsli.64 d26,d18,#23
 1613 #if 26<16 && defined(__ARMEL__)
 1614         vrev64.8        ,
 1615 #endif
 1616         veor    d25,d24
 1617         vbsl    d29,d19,d20             @ Ch(e,f,g)
 1618         vshr.u64        d24,d22,#28
 1619         veor    d26,d25                 @ Sigma1(e)
 1620         vadd.i64        d27,d29,d21
 1621         vshr.u64        d25,d22,#34
 1622         vsli.64 d24,d22,#36
 1623         vadd.i64        d27,d26
 1624         vshr.u64        d26,d22,#39
 1625         vadd.i64        d28,d10
 1626         vsli.64 d25,d22,#30
 1627         veor    d30,d22,d23
 1628         vsli.64 d26,d22,#25
 1629         veor    d21,d24,d25
 1630         vadd.i64        d27,d28
 1631         vbsl    d30,d16,d23             @ Maj(a,b,c)
 1632         veor    d21,d26                 @ Sigma0(a)
 1633         vadd.i64        d17,d27
 1634         vadd.i64        d30,d27
 1635         @ vadd.i64      d21,d30
 1636         vshr.u64        d24,d17,#14     @ 27
 1637 #if 27<16
 1638         vld1.64 {d11},[r1]!     @ handles unaligned
 1639 #endif
 1640         vshr.u64        d25,d17,#18
 1641 #if 27>0
 1642         vadd.i64        d21,d30                 @ h+=Maj from the past
 1643 #endif
 1644         vshr.u64        d26,d17,#41
 1645         vld1.64 {d28},[r3,:64]! @ K[i++]
 1646         vsli.64 d24,d17,#50
 1647         vsli.64 d25,d17,#46
 1648         vmov    d29,d17
 1649         vsli.64 d26,d17,#23
 1650 #if 27<16 && defined(__ARMEL__)
 1651         vrev64.8        ,
 1652 #endif
 1653         veor    d25,d24
 1654         vbsl    d29,d18,d19             @ Ch(e,f,g)
 1655         vshr.u64        d24,d21,#28
 1656         veor    d26,d25                 @ Sigma1(e)
 1657         vadd.i64        d27,d29,d20
 1658         vshr.u64        d25,d21,#34
 1659         vsli.64 d24,d21,#36
 1660         vadd.i64        d27,d26
 1661         vshr.u64        d26,d21,#39
 1662         vadd.i64        d28,d11
 1663         vsli.64 d25,d21,#30
 1664         veor    d30,d21,d22
 1665         vsli.64 d26,d21,#25
 1666         veor    d20,d24,d25
 1667         vadd.i64        d27,d28
 1668         vbsl    d30,d23,d22             @ Maj(a,b,c)
 1669         veor    d20,d26                 @ Sigma0(a)
 1670         vadd.i64        d16,d27
 1671         vadd.i64        d30,d27
 1672         @ vadd.i64      d20,d30
 1673         vshr.u64        q12,q5,#19
 1674         vshr.u64        q13,q5,#61
 1675         vadd.i64        d20,d30                 @ h+=Maj from the past
 1676         vshr.u64        q15,q5,#6
 1677         vsli.64 q12,q5,#45
 1678         vext.8  q14,q6,q7,#8    @ X[i+1]
 1679         vsli.64 q13,q5,#3
 1680         veor    q15,q12
 1681         vshr.u64        q12,q14,#1
 1682         veor    q15,q13                         @ sigma1(X[i+14])
 1683         vshr.u64        q13,q14,#8
 1684         vadd.i64        q6,q15
 1685         vshr.u64        q15,q14,#7
 1686         vsli.64 q12,q14,#63
 1687         vsli.64 q13,q14,#56
 1688         vext.8  q14,q2,q3,#8    @ X[i+9]
 1689         veor    q15,q12
 1690         vshr.u64        d24,d16,#14             @ from NEON_00_15
 1691         vadd.i64        q6,q14
 1692         vshr.u64        d25,d16,#18             @ from NEON_00_15
 1693         veor    q15,q13                         @ sigma0(X[i+1])
 1694         vshr.u64        d26,d16,#41             @ from NEON_00_15
 1695         vadd.i64        q6,q15
 1696         vld1.64 {d28},[r3,:64]! @ K[i++]
 1697         vsli.64 d24,d16,#50
 1698         vsli.64 d25,d16,#46
 1699         vmov    d29,d16
 1700         vsli.64 d26,d16,#23
 1701 #if 28<16 && defined(__ARMEL__)
 1702         vrev64.8        ,
 1703 #endif
 1704         veor    d25,d24
 1705         vbsl    d29,d17,d18             @ Ch(e,f,g)
 1706         vshr.u64        d24,d20,#28
 1707         veor    d26,d25                 @ Sigma1(e)
 1708         vadd.i64        d27,d29,d19
 1709         vshr.u64        d25,d20,#34
 1710         vsli.64 d24,d20,#36
 1711         vadd.i64        d27,d26
 1712         vshr.u64        d26,d20,#39
 1713         vadd.i64        d28,d12
 1714         vsli.64 d25,d20,#30
 1715         veor    d30,d20,d21
 1716         vsli.64 d26,d20,#25
 1717         veor    d19,d24,d25
 1718         vadd.i64        d27,d28
 1719         vbsl    d30,d22,d21             @ Maj(a,b,c)
 1720         veor    d19,d26                 @ Sigma0(a)
 1721         vadd.i64        d23,d27
 1722         vadd.i64        d30,d27
 1723         @ vadd.i64      d19,d30
 1724         vshr.u64        d24,d23,#14     @ 29
 1725 #if 29<16
 1726         vld1.64 {d13},[r1]!     @ handles unaligned
 1727 #endif
 1728         vshr.u64        d25,d23,#18
 1729 #if 29>0
 1730         vadd.i64        d19,d30                 @ h+=Maj from the past
 1731 #endif
 1732         vshr.u64        d26,d23,#41
 1733         vld1.64 {d28},[r3,:64]! @ K[i++]
 1734         vsli.64 d24,d23,#50
 1735         vsli.64 d25,d23,#46
 1736         vmov    d29,d23
 1737         vsli.64 d26,d23,#23
 1738 #if 29<16 && defined(__ARMEL__)
 1739         vrev64.8        ,
 1740 #endif
 1741         veor    d25,d24
 1742         vbsl    d29,d16,d17             @ Ch(e,f,g)
 1743         vshr.u64        d24,d19,#28
 1744         veor    d26,d25                 @ Sigma1(e)
 1745         vadd.i64        d27,d29,d18
 1746         vshr.u64        d25,d19,#34
 1747         vsli.64 d24,d19,#36
 1748         vadd.i64        d27,d26
 1749         vshr.u64        d26,d19,#39
 1750         vadd.i64        d28,d13
 1751         vsli.64 d25,d19,#30
 1752         veor    d30,d19,d20
 1753         vsli.64 d26,d19,#25
 1754         veor    d18,d24,d25
 1755         vadd.i64        d27,d28
 1756         vbsl    d30,d21,d20             @ Maj(a,b,c)
 1757         veor    d18,d26                 @ Sigma0(a)
 1758         vadd.i64        d22,d27
 1759         vadd.i64        d30,d27
 1760         @ vadd.i64      d18,d30
 1761         vshr.u64        q12,q6,#19
 1762         vshr.u64        q13,q6,#61
 1763         vadd.i64        d18,d30                 @ h+=Maj from the past
 1764         vshr.u64        q15,q6,#6
 1765         vsli.64 q12,q6,#45
 1766         vext.8  q14,q7,q0,#8    @ X[i+1]
 1767         vsli.64 q13,q6,#3
 1768         veor    q15,q12
 1769         vshr.u64        q12,q14,#1
 1770         veor    q15,q13                         @ sigma1(X[i+14])
 1771         vshr.u64        q13,q14,#8
 1772         vadd.i64        q7,q15
 1773         vshr.u64        q15,q14,#7
 1774         vsli.64 q12,q14,#63
 1775         vsli.64 q13,q14,#56
 1776         vext.8  q14,q3,q4,#8    @ X[i+9]
 1777         veor    q15,q12
 1778         vshr.u64        d24,d22,#14             @ from NEON_00_15
 1779         vadd.i64        q7,q14
 1780         vshr.u64        d25,d22,#18             @ from NEON_00_15
 1781         veor    q15,q13                         @ sigma0(X[i+1])
 1782         vshr.u64        d26,d22,#41             @ from NEON_00_15
 1783         vadd.i64        q7,q15
 1784         vld1.64 {d28},[r3,:64]! @ K[i++]
 1785         vsli.64 d24,d22,#50
 1786         vsli.64 d25,d22,#46
 1787         vmov    d29,d22
 1788         vsli.64 d26,d22,#23
 1789 #if 30<16 && defined(__ARMEL__)
 1790         vrev64.8        ,
 1791 #endif
 1792         veor    d25,d24
 1793         vbsl    d29,d23,d16             @ Ch(e,f,g)
 1794         vshr.u64        d24,d18,#28
 1795         veor    d26,d25                 @ Sigma1(e)
 1796         vadd.i64        d27,d29,d17
 1797         vshr.u64        d25,d18,#34
 1798         vsli.64 d24,d18,#36
 1799         vadd.i64        d27,d26
 1800         vshr.u64        d26,d18,#39
 1801         vadd.i64        d28,d14
 1802         vsli.64 d25,d18,#30
 1803         veor    d30,d18,d19
 1804         vsli.64 d26,d18,#25
 1805         veor    d17,d24,d25
 1806         vadd.i64        d27,d28
 1807         vbsl    d30,d20,d19             @ Maj(a,b,c)
 1808         veor    d17,d26                 @ Sigma0(a)
 1809         vadd.i64        d21,d27
 1810         vadd.i64        d30,d27
 1811         @ vadd.i64      d17,d30
 1812         vshr.u64        d24,d21,#14     @ 31
 1813 #if 31<16
 1814         vld1.64 {d15},[r1]!     @ handles unaligned
 1815 #endif
 1816         vshr.u64        d25,d21,#18
 1817 #if 31>0
 1818         vadd.i64        d17,d30                 @ h+=Maj from the past
 1819 #endif
 1820         vshr.u64        d26,d21,#41
 1821         vld1.64 {d28},[r3,:64]! @ K[i++]
 1822         vsli.64 d24,d21,#50
 1823         vsli.64 d25,d21,#46
 1824         vmov    d29,d21
 1825         vsli.64 d26,d21,#23
 1826 #if 31<16 && defined(__ARMEL__)
 1827         vrev64.8        ,
 1828 #endif
 1829         veor    d25,d24
 1830         vbsl    d29,d22,d23             @ Ch(e,f,g)
 1831         vshr.u64        d24,d17,#28
 1832         veor    d26,d25                 @ Sigma1(e)
 1833         vadd.i64        d27,d29,d16
 1834         vshr.u64        d25,d17,#34
 1835         vsli.64 d24,d17,#36
 1836         vadd.i64        d27,d26
 1837         vshr.u64        d26,d17,#39
 1838         vadd.i64        d28,d15
 1839         vsli.64 d25,d17,#30
 1840         veor    d30,d17,d18
 1841         vsli.64 d26,d17,#25
 1842         veor    d16,d24,d25
 1843         vadd.i64        d27,d28
 1844         vbsl    d30,d19,d18             @ Maj(a,b,c)
 1845         veor    d16,d26                 @ Sigma0(a)
 1846         vadd.i64        d20,d27
 1847         vadd.i64        d30,d27
 1848         @ vadd.i64      d16,d30
 1849         bne     .L16_79_neon
 1850 
 1851         vadd.i64        d16,d30         @ h+=Maj from the past
 1852         vldmia  r0,{d24,d25,d26,d27,d28,d29,d30,d31}    @ load context to temp
 1853         vadd.i64        q8,q12          @ vectorized accumulate
 1854         vadd.i64        q9,q13
 1855         vadd.i64        q10,q14
 1856         vadd.i64        q11,q15
 1857         vstmia  r0,{d16,d17,d18,d19,d20,d21,d22,d23}    @ save context
 1858         teq     r1,r2
 1859         sub     r3,#640 @ rewind K512
 1860         bne     .Loop_neon
 1861 
 1862         VFP_ABI_POP
 1863         bx      lr                              @ .word 0xe12fff1e
 1864 .size   sha512_block_data_order_neon,.-sha512_block_data_order_neon
 1865 #endif
 1866 .byte   83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,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
 1867 .align  2
 1868 .align  2
 1869 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
 1870 .comm   OPENSSL_armcap_P,4,4
 1871 #endif

Cache object: 4c92ca0cd17a9400f9a1ae1c876eb48d


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.