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/armv4-mont.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 armv4-mont.pl. */
    3 #include "arm_arch.h"
    4 
    5 .text
    6 #if defined(__thumb2__)
    7 .syntax unified
    8 .thumb
    9 #else
   10 .code   32
   11 #endif
   12 
   13 #if __ARM_MAX_ARCH__>=7
   14 .align  5
   15 .LOPENSSL_armcap:
   16 .word   OPENSSL_armcap_P-.Lbn_mul_mont
   17 #endif
   18 
   19 .globl  bn_mul_mont
   20 .type   bn_mul_mont,%function
   21 
   22 .align  5
   23 bn_mul_mont:
   24 .Lbn_mul_mont:
   25         ldr     ip,[sp,#4]              @ load num
   26         stmdb   sp!,{r0,r2}             @ sp points at argument block
   27 #if __ARM_MAX_ARCH__>=7
   28         tst     ip,#7
   29         bne     .Lialu
   30         adr     r0,.Lbn_mul_mont
   31         ldr     r2,.LOPENSSL_armcap
   32         ldr     r0,[r0,r2]
   33 #ifdef  __APPLE__
   34         ldr     r0,[r0]
   35 #endif
   36         tst     r0,#ARMV7_NEON          @ NEON available?
   37         ldmia   sp, {r0,r2}
   38         beq     .Lialu
   39         add     sp,sp,#8
   40         b       bn_mul8x_mont_neon
   41 .align  4
   42 .Lialu:
   43 #endif
   44         cmp     ip,#2
   45         mov     r0,ip                   @ load num
   46 #ifdef  __thumb2__
   47         ittt    lt
   48 #endif
   49         movlt   r0,#0
   50         addlt   sp,sp,#2*4
   51         blt     .Labrt
   52 
   53         stmdb   sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}          @ save 10 registers
   54 
   55         mov     r0,r0,lsl#2             @ rescale r0 for byte count
   56         sub     sp,sp,r0                @ alloca(4*num)
   57         sub     sp,sp,#4                @ +extra dword
   58         sub     r0,r0,#4                @ "num=num-1"
   59         add     r4,r2,r0                @ &bp[num-1]
   60 
   61         add     r0,sp,r0                @ r0 to point at &tp[num-1]
   62         ldr     r8,[r0,#14*4]           @ &n0
   63         ldr     r2,[r2]         @ bp[0]
   64         ldr     r5,[r1],#4              @ ap[0],ap++
   65         ldr     r6,[r3],#4              @ np[0],np++
   66         ldr     r8,[r8]         @ *n0
   67         str     r4,[r0,#15*4]           @ save &bp[num]
   68 
   69         umull   r10,r11,r5,r2   @ ap[0]*bp[0]
   70         str     r8,[r0,#14*4]           @ save n0 value
   71         mul     r8,r10,r8               @ "tp[0]"*n0
   72         mov     r12,#0
   73         umlal   r10,r12,r6,r8   @ np[0]*n0+"t[0]"
   74         mov     r4,sp
   75 
   76 .L1st:
   77         ldr     r5,[r1],#4              @ ap[j],ap++
   78         mov     r10,r11
   79         ldr     r6,[r3],#4              @ np[j],np++
   80         mov     r11,#0
   81         umlal   r10,r11,r5,r2   @ ap[j]*bp[0]
   82         mov     r14,#0
   83         umlal   r12,r14,r6,r8   @ np[j]*n0
   84         adds    r12,r12,r10
   85         str     r12,[r4],#4             @ tp[j-1]=,tp++
   86         adc     r12,r14,#0
   87         cmp     r4,r0
   88         bne     .L1st
   89 
   90         adds    r12,r12,r11
   91         ldr     r4,[r0,#13*4]           @ restore bp
   92         mov     r14,#0
   93         ldr     r8,[r0,#14*4]           @ restore n0
   94         adc     r14,r14,#0
   95         str     r12,[r0]                @ tp[num-1]=
   96         mov     r7,sp
   97         str     r14,[r0,#4]             @ tp[num]=
   98 
   99 .Louter:
  100         sub     r7,r0,r7                @ "original" r0-1 value
  101         sub     r1,r1,r7                @ "rewind" ap to &ap[1]
  102         ldr     r2,[r4,#4]!             @ *(++bp)
  103         sub     r3,r3,r7                @ "rewind" np to &np[1]
  104         ldr     r5,[r1,#-4]             @ ap[0]
  105         ldr     r10,[sp]                @ tp[0]
  106         ldr     r6,[r3,#-4]             @ np[0]
  107         ldr     r7,[sp,#4]              @ tp[1]
  108 
  109         mov     r11,#0
  110         umlal   r10,r11,r5,r2   @ ap[0]*bp[i]+tp[0]
  111         str     r4,[r0,#13*4]           @ save bp
  112         mul     r8,r10,r8
  113         mov     r12,#0
  114         umlal   r10,r12,r6,r8   @ np[0]*n0+"tp[0]"
  115         mov     r4,sp
  116 
  117 .Linner:
  118         ldr     r5,[r1],#4              @ ap[j],ap++
  119         adds    r10,r11,r7              @ +=tp[j]
  120         ldr     r6,[r3],#4              @ np[j],np++
  121         mov     r11,#0
  122         umlal   r10,r11,r5,r2   @ ap[j]*bp[i]
  123         mov     r14,#0
  124         umlal   r12,r14,r6,r8   @ np[j]*n0
  125         adc     r11,r11,#0
  126         ldr     r7,[r4,#8]              @ tp[j+1]
  127         adds    r12,r12,r10
  128         str     r12,[r4],#4             @ tp[j-1]=,tp++
  129         adc     r12,r14,#0
  130         cmp     r4,r0
  131         bne     .Linner
  132 
  133         adds    r12,r12,r11
  134         mov     r14,#0
  135         ldr     r4,[r0,#13*4]           @ restore bp
  136         adc     r14,r14,#0
  137         ldr     r8,[r0,#14*4]           @ restore n0
  138         adds    r12,r12,r7
  139         ldr     r7,[r0,#15*4]           @ restore &bp[num]
  140         adc     r14,r14,#0
  141         str     r12,[r0]                @ tp[num-1]=
  142         str     r14,[r0,#4]             @ tp[num]=
  143 
  144         cmp     r4,r7
  145 #ifdef  __thumb2__
  146         itt     ne
  147 #endif
  148         movne   r7,sp
  149         bne     .Louter
  150 
  151         ldr     r2,[r0,#12*4]           @ pull rp
  152         mov     r5,sp
  153         add     r0,r0,#4                @ r0 to point at &tp[num]
  154         sub     r5,r0,r5                @ "original" num value
  155         mov     r4,sp                   @ "rewind" r4
  156         mov     r1,r4                   @ "borrow" r1
  157         sub     r3,r3,r5                @ "rewind" r3 to &np[0]
  158 
  159         subs    r7,r7,r7                @ "clear" carry flag
  160 .Lsub:  ldr     r7,[r4],#4
  161         ldr     r6,[r3],#4
  162         sbcs    r7,r7,r6                @ tp[j]-np[j]
  163         str     r7,[r2],#4              @ rp[j]=
  164         teq     r4,r0           @ preserve carry
  165         bne     .Lsub
  166         sbcs    r14,r14,#0              @ upmost carry
  167         mov     r4,sp                   @ "rewind" r4
  168         sub     r2,r2,r5                @ "rewind" r2
  169 
  170 .Lcopy: ldr     r7,[r4]         @ conditional copy
  171         ldr     r5,[r2]
  172         str     sp,[r4],#4              @ zap tp
  173 #ifdef  __thumb2__
  174         it      cc
  175 #endif
  176         movcc   r5,r7
  177         str     r5,[r2],#4
  178         teq     r4,r0           @ preserve carry
  179         bne     .Lcopy
  180 
  181         mov     sp,r0
  182         add     sp,sp,#4                @ skip over tp[num+1]
  183         ldmia   sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}          @ restore registers
  184         add     sp,sp,#2*4              @ skip over {r0,r2}
  185         mov     r0,#1
  186 .Labrt:
  187 #if __ARM_ARCH__>=5
  188         bx      lr                              @ bx lr
  189 #else
  190         tst     lr,#1
  191         moveq   pc,lr                   @ be binary compatible with V4, yet
  192 .word   0xe12fff1e                      @ interoperable with Thumb ISA:-)
  193 #endif
  194 .size   bn_mul_mont,.-bn_mul_mont
  195 #if __ARM_MAX_ARCH__>=7
  196 .arch   armv7-a
  197 .fpu    neon
  198 
  199 .type   bn_mul8x_mont_neon,%function
  200 .align  5
  201 bn_mul8x_mont_neon:
  202         mov     ip,sp
  203         stmdb   sp!,{r4,r5,r6,r7,r8,r9,r10,r11}
  204         vstmdb  sp!,{d8,d9,d10,d11,d12,d13,d14,d15}             @ ABI specification says so
  205         ldmia   ip,{r4,r5}              @ load rest of parameter block
  206         mov     ip,sp
  207 
  208         cmp     r5,#8
  209         bhi     .LNEON_8n
  210 
  211         @ special case for r5==8, everything is in register bank...
  212 
  213         vld1.32 {d28[0]}, [r2,:32]!
  214         veor    d8,d8,d8
  215         sub     r7,sp,r5,lsl#4
  216         vld1.32 {d0,d1,d2,d3},  [r1]!           @ can't specify :32 :-(
  217         and     r7,r7,#-64
  218         vld1.32 {d30[0]}, [r4,:32]
  219         mov     sp,r7                   @ alloca
  220         vzip.16 d28,d8
  221 
  222         vmull.u32       q6,d28,d0[0]
  223         vmull.u32       q7,d28,d0[1]
  224         vmull.u32       q8,d28,d1[0]
  225         vshl.i64        d29,d13,#16
  226         vmull.u32       q9,d28,d1[1]
  227 
  228         vadd.u64        d29,d29,d12
  229         veor    d8,d8,d8
  230         vmul.u32        d29,d29,d30
  231 
  232         vmull.u32       q10,d28,d2[0]
  233         vld1.32 {d4,d5,d6,d7}, [r3]!
  234         vmull.u32       q11,d28,d2[1]
  235         vmull.u32       q12,d28,d3[0]
  236         vzip.16 d29,d8
  237         vmull.u32       q13,d28,d3[1]
  238 
  239         vmlal.u32       q6,d29,d4[0]
  240         sub     r9,r5,#1
  241         vmlal.u32       q7,d29,d4[1]
  242         vmlal.u32       q8,d29,d5[0]
  243         vmlal.u32       q9,d29,d5[1]
  244 
  245         vmlal.u32       q10,d29,d6[0]
  246         vmov    q5,q6
  247         vmlal.u32       q11,d29,d6[1]
  248         vmov    q6,q7
  249         vmlal.u32       q12,d29,d7[0]
  250         vmov    q7,q8
  251         vmlal.u32       q13,d29,d7[1]
  252         vmov    q8,q9
  253         vmov    q9,q10
  254         vshr.u64        d10,d10,#16
  255         vmov    q10,q11
  256         vmov    q11,q12
  257         vadd.u64        d10,d10,d11
  258         vmov    q12,q13
  259         veor    q13,q13
  260         vshr.u64        d10,d10,#16
  261 
  262         b       .LNEON_outer8
  263 
  264 .align  4
  265 .LNEON_outer8:
  266         vld1.32 {d28[0]}, [r2,:32]!
  267         veor    d8,d8,d8
  268         vzip.16 d28,d8
  269         vadd.u64        d12,d12,d10
  270 
  271         vmlal.u32       q6,d28,d0[0]
  272         vmlal.u32       q7,d28,d0[1]
  273         vmlal.u32       q8,d28,d1[0]
  274         vshl.i64        d29,d13,#16
  275         vmlal.u32       q9,d28,d1[1]
  276 
  277         vadd.u64        d29,d29,d12
  278         veor    d8,d8,d8
  279         subs    r9,r9,#1
  280         vmul.u32        d29,d29,d30
  281 
  282         vmlal.u32       q10,d28,d2[0]
  283         vmlal.u32       q11,d28,d2[1]
  284         vmlal.u32       q12,d28,d3[0]
  285         vzip.16 d29,d8
  286         vmlal.u32       q13,d28,d3[1]
  287 
  288         vmlal.u32       q6,d29,d4[0]
  289         vmlal.u32       q7,d29,d4[1]
  290         vmlal.u32       q8,d29,d5[0]
  291         vmlal.u32       q9,d29,d5[1]
  292 
  293         vmlal.u32       q10,d29,d6[0]
  294         vmov    q5,q6
  295         vmlal.u32       q11,d29,d6[1]
  296         vmov    q6,q7
  297         vmlal.u32       q12,d29,d7[0]
  298         vmov    q7,q8
  299         vmlal.u32       q13,d29,d7[1]
  300         vmov    q8,q9
  301         vmov    q9,q10
  302         vshr.u64        d10,d10,#16
  303         vmov    q10,q11
  304         vmov    q11,q12
  305         vadd.u64        d10,d10,d11
  306         vmov    q12,q13
  307         veor    q13,q13
  308         vshr.u64        d10,d10,#16
  309 
  310         bne     .LNEON_outer8
  311 
  312         vadd.u64        d12,d12,d10
  313         mov     r7,sp
  314         vshr.u64        d10,d12,#16
  315         mov     r8,r5
  316         vadd.u64        d13,d13,d10
  317         add     r6,sp,#96
  318         vshr.u64        d10,d13,#16
  319         vzip.16 d12,d13
  320 
  321         b       .LNEON_tail_entry
  322 
  323 .align  4
  324 .LNEON_8n:
  325         veor    q6,q6,q6
  326         sub     r7,sp,#128
  327         veor    q7,q7,q7
  328         sub     r7,r7,r5,lsl#4
  329         veor    q8,q8,q8
  330         and     r7,r7,#-64
  331         veor    q9,q9,q9
  332         mov     sp,r7                   @ alloca
  333         veor    q10,q10,q10
  334         add     r7,r7,#256
  335         veor    q11,q11,q11
  336         sub     r8,r5,#8
  337         veor    q12,q12,q12
  338         veor    q13,q13,q13
  339 
  340 .LNEON_8n_init:
  341         vst1.64 {q6,q7},[r7,:256]!
  342         subs    r8,r8,#8
  343         vst1.64 {q8,q9},[r7,:256]!
  344         vst1.64 {q10,q11},[r7,:256]!
  345         vst1.64 {q12,q13},[r7,:256]!
  346         bne     .LNEON_8n_init
  347 
  348         add     r6,sp,#256
  349         vld1.32 {d0,d1,d2,d3},[r1]!
  350         add     r10,sp,#8
  351         vld1.32 {d30[0]},[r4,:32]
  352         mov     r9,r5
  353         b       .LNEON_8n_outer
  354 
  355 .align  4
  356 .LNEON_8n_outer:
  357         vld1.32 {d28[0]},[r2,:32]!      @ *b++
  358         veor    d8,d8,d8
  359         vzip.16 d28,d8
  360         add     r7,sp,#128
  361         vld1.32 {d4,d5,d6,d7},[r3]!
  362 
  363         vmlal.u32       q6,d28,d0[0]
  364         vmlal.u32       q7,d28,d0[1]
  365         veor    d8,d8,d8
  366         vmlal.u32       q8,d28,d1[0]
  367         vshl.i64        d29,d13,#16
  368         vmlal.u32       q9,d28,d1[1]
  369         vadd.u64        d29,d29,d12
  370         vmlal.u32       q10,d28,d2[0]
  371         vmul.u32        d29,d29,d30
  372         vmlal.u32       q11,d28,d2[1]
  373         vst1.32 {d28},[sp,:64]          @ put aside smashed b[8*i+0]
  374         vmlal.u32       q12,d28,d3[0]
  375         vzip.16 d29,d8
  376         vmlal.u32       q13,d28,d3[1]
  377         vld1.32 {d28[0]},[r2,:32]!      @ *b++
  378         vmlal.u32       q6,d29,d4[0]
  379         veor    d10,d10,d10
  380         vmlal.u32       q7,d29,d4[1]
  381         vzip.16 d28,d10
  382         vmlal.u32       q8,d29,d5[0]
  383         vshr.u64        d12,d12,#16
  384         vmlal.u32       q9,d29,d5[1]
  385         vmlal.u32       q10,d29,d6[0]
  386         vadd.u64        d12,d12,d13
  387         vmlal.u32       q11,d29,d6[1]
  388         vshr.u64        d12,d12,#16
  389         vmlal.u32       q12,d29,d7[0]
  390         vmlal.u32       q13,d29,d7[1]
  391         vadd.u64        d14,d14,d12
  392         vst1.32 {d29},[r10,:64]!        @ put aside smashed m[8*i+0]
  393         vmlal.u32       q7,d28,d0[0]
  394         vld1.64 {q6},[r6,:128]!
  395         vmlal.u32       q8,d28,d0[1]
  396         veor    d8,d8,d8
  397         vmlal.u32       q9,d28,d1[0]
  398         vshl.i64        d29,d15,#16
  399         vmlal.u32       q10,d28,d1[1]
  400         vadd.u64        d29,d29,d14
  401         vmlal.u32       q11,d28,d2[0]
  402         vmul.u32        d29,d29,d30
  403         vmlal.u32       q12,d28,d2[1]
  404         vst1.32 {d28},[r10,:64]!        @ put aside smashed b[8*i+1]
  405         vmlal.u32       q13,d28,d3[0]
  406         vzip.16 d29,d8
  407         vmlal.u32       q6,d28,d3[1]
  408         vld1.32 {d28[0]},[r2,:32]!      @ *b++
  409         vmlal.u32       q7,d29,d4[0]
  410         veor    d10,d10,d10
  411         vmlal.u32       q8,d29,d4[1]
  412         vzip.16 d28,d10
  413         vmlal.u32       q9,d29,d5[0]
  414         vshr.u64        d14,d14,#16
  415         vmlal.u32       q10,d29,d5[1]
  416         vmlal.u32       q11,d29,d6[0]
  417         vadd.u64        d14,d14,d15
  418         vmlal.u32       q12,d29,d6[1]
  419         vshr.u64        d14,d14,#16
  420         vmlal.u32       q13,d29,d7[0]
  421         vmlal.u32       q6,d29,d7[1]
  422         vadd.u64        d16,d16,d14
  423         vst1.32 {d29},[r10,:64]!        @ put aside smashed m[8*i+1]
  424         vmlal.u32       q8,d28,d0[0]
  425         vld1.64 {q7},[r6,:128]!
  426         vmlal.u32       q9,d28,d0[1]
  427         veor    d8,d8,d8
  428         vmlal.u32       q10,d28,d1[0]
  429         vshl.i64        d29,d17,#16
  430         vmlal.u32       q11,d28,d1[1]
  431         vadd.u64        d29,d29,d16
  432         vmlal.u32       q12,d28,d2[0]
  433         vmul.u32        d29,d29,d30
  434         vmlal.u32       q13,d28,d2[1]
  435         vst1.32 {d28},[r10,:64]!        @ put aside smashed b[8*i+2]
  436         vmlal.u32       q6,d28,d3[0]
  437         vzip.16 d29,d8
  438         vmlal.u32       q7,d28,d3[1]
  439         vld1.32 {d28[0]},[r2,:32]!      @ *b++
  440         vmlal.u32       q8,d29,d4[0]
  441         veor    d10,d10,d10
  442         vmlal.u32       q9,d29,d4[1]
  443         vzip.16 d28,d10
  444         vmlal.u32       q10,d29,d5[0]
  445         vshr.u64        d16,d16,#16
  446         vmlal.u32       q11,d29,d5[1]
  447         vmlal.u32       q12,d29,d6[0]
  448         vadd.u64        d16,d16,d17
  449         vmlal.u32       q13,d29,d6[1]
  450         vshr.u64        d16,d16,#16
  451         vmlal.u32       q6,d29,d7[0]
  452         vmlal.u32       q7,d29,d7[1]
  453         vadd.u64        d18,d18,d16
  454         vst1.32 {d29},[r10,:64]!        @ put aside smashed m[8*i+2]
  455         vmlal.u32       q9,d28,d0[0]
  456         vld1.64 {q8},[r6,:128]!
  457         vmlal.u32       q10,d28,d0[1]
  458         veor    d8,d8,d8
  459         vmlal.u32       q11,d28,d1[0]
  460         vshl.i64        d29,d19,#16
  461         vmlal.u32       q12,d28,d1[1]
  462         vadd.u64        d29,d29,d18
  463         vmlal.u32       q13,d28,d2[0]
  464         vmul.u32        d29,d29,d30
  465         vmlal.u32       q6,d28,d2[1]
  466         vst1.32 {d28},[r10,:64]!        @ put aside smashed b[8*i+3]
  467         vmlal.u32       q7,d28,d3[0]
  468         vzip.16 d29,d8
  469         vmlal.u32       q8,d28,d3[1]
  470         vld1.32 {d28[0]},[r2,:32]!      @ *b++
  471         vmlal.u32       q9,d29,d4[0]
  472         veor    d10,d10,d10
  473         vmlal.u32       q10,d29,d4[1]
  474         vzip.16 d28,d10
  475         vmlal.u32       q11,d29,d5[0]
  476         vshr.u64        d18,d18,#16
  477         vmlal.u32       q12,d29,d5[1]
  478         vmlal.u32       q13,d29,d6[0]
  479         vadd.u64        d18,d18,d19
  480         vmlal.u32       q6,d29,d6[1]
  481         vshr.u64        d18,d18,#16
  482         vmlal.u32       q7,d29,d7[0]
  483         vmlal.u32       q8,d29,d7[1]
  484         vadd.u64        d20,d20,d18
  485         vst1.32 {d29},[r10,:64]!        @ put aside smashed m[8*i+3]
  486         vmlal.u32       q10,d28,d0[0]
  487         vld1.64 {q9},[r6,:128]!
  488         vmlal.u32       q11,d28,d0[1]
  489         veor    d8,d8,d8
  490         vmlal.u32       q12,d28,d1[0]
  491         vshl.i64        d29,d21,#16
  492         vmlal.u32       q13,d28,d1[1]
  493         vadd.u64        d29,d29,d20
  494         vmlal.u32       q6,d28,d2[0]
  495         vmul.u32        d29,d29,d30
  496         vmlal.u32       q7,d28,d2[1]
  497         vst1.32 {d28},[r10,:64]!        @ put aside smashed b[8*i+4]
  498         vmlal.u32       q8,d28,d3[0]
  499         vzip.16 d29,d8
  500         vmlal.u32       q9,d28,d3[1]
  501         vld1.32 {d28[0]},[r2,:32]!      @ *b++
  502         vmlal.u32       q10,d29,d4[0]
  503         veor    d10,d10,d10
  504         vmlal.u32       q11,d29,d4[1]
  505         vzip.16 d28,d10
  506         vmlal.u32       q12,d29,d5[0]
  507         vshr.u64        d20,d20,#16
  508         vmlal.u32       q13,d29,d5[1]
  509         vmlal.u32       q6,d29,d6[0]
  510         vadd.u64        d20,d20,d21
  511         vmlal.u32       q7,d29,d6[1]
  512         vshr.u64        d20,d20,#16
  513         vmlal.u32       q8,d29,d7[0]
  514         vmlal.u32       q9,d29,d7[1]
  515         vadd.u64        d22,d22,d20
  516         vst1.32 {d29},[r10,:64]!        @ put aside smashed m[8*i+4]
  517         vmlal.u32       q11,d28,d0[0]
  518         vld1.64 {q10},[r6,:128]!
  519         vmlal.u32       q12,d28,d0[1]
  520         veor    d8,d8,d8
  521         vmlal.u32       q13,d28,d1[0]
  522         vshl.i64        d29,d23,#16
  523         vmlal.u32       q6,d28,d1[1]
  524         vadd.u64        d29,d29,d22
  525         vmlal.u32       q7,d28,d2[0]
  526         vmul.u32        d29,d29,d30
  527         vmlal.u32       q8,d28,d2[1]
  528         vst1.32 {d28},[r10,:64]!        @ put aside smashed b[8*i+5]
  529         vmlal.u32       q9,d28,d3[0]
  530         vzip.16 d29,d8
  531         vmlal.u32       q10,d28,d3[1]
  532         vld1.32 {d28[0]},[r2,:32]!      @ *b++
  533         vmlal.u32       q11,d29,d4[0]
  534         veor    d10,d10,d10
  535         vmlal.u32       q12,d29,d4[1]
  536         vzip.16 d28,d10
  537         vmlal.u32       q13,d29,d5[0]
  538         vshr.u64        d22,d22,#16
  539         vmlal.u32       q6,d29,d5[1]
  540         vmlal.u32       q7,d29,d6[0]
  541         vadd.u64        d22,d22,d23
  542         vmlal.u32       q8,d29,d6[1]
  543         vshr.u64        d22,d22,#16
  544         vmlal.u32       q9,d29,d7[0]
  545         vmlal.u32       q10,d29,d7[1]
  546         vadd.u64        d24,d24,d22
  547         vst1.32 {d29},[r10,:64]!        @ put aside smashed m[8*i+5]
  548         vmlal.u32       q12,d28,d0[0]
  549         vld1.64 {q11},[r6,:128]!
  550         vmlal.u32       q13,d28,d0[1]
  551         veor    d8,d8,d8
  552         vmlal.u32       q6,d28,d1[0]
  553         vshl.i64        d29,d25,#16
  554         vmlal.u32       q7,d28,d1[1]
  555         vadd.u64        d29,d29,d24
  556         vmlal.u32       q8,d28,d2[0]
  557         vmul.u32        d29,d29,d30
  558         vmlal.u32       q9,d28,d2[1]
  559         vst1.32 {d28},[r10,:64]!        @ put aside smashed b[8*i+6]
  560         vmlal.u32       q10,d28,d3[0]
  561         vzip.16 d29,d8
  562         vmlal.u32       q11,d28,d3[1]
  563         vld1.32 {d28[0]},[r2,:32]!      @ *b++
  564         vmlal.u32       q12,d29,d4[0]
  565         veor    d10,d10,d10
  566         vmlal.u32       q13,d29,d4[1]
  567         vzip.16 d28,d10
  568         vmlal.u32       q6,d29,d5[0]
  569         vshr.u64        d24,d24,#16
  570         vmlal.u32       q7,d29,d5[1]
  571         vmlal.u32       q8,d29,d6[0]
  572         vadd.u64        d24,d24,d25
  573         vmlal.u32       q9,d29,d6[1]
  574         vshr.u64        d24,d24,#16
  575         vmlal.u32       q10,d29,d7[0]
  576         vmlal.u32       q11,d29,d7[1]
  577         vadd.u64        d26,d26,d24
  578         vst1.32 {d29},[r10,:64]!        @ put aside smashed m[8*i+6]
  579         vmlal.u32       q13,d28,d0[0]
  580         vld1.64 {q12},[r6,:128]!
  581         vmlal.u32       q6,d28,d0[1]
  582         veor    d8,d8,d8
  583         vmlal.u32       q7,d28,d1[0]
  584         vshl.i64        d29,d27,#16
  585         vmlal.u32       q8,d28,d1[1]
  586         vadd.u64        d29,d29,d26
  587         vmlal.u32       q9,d28,d2[0]
  588         vmul.u32        d29,d29,d30
  589         vmlal.u32       q10,d28,d2[1]
  590         vst1.32 {d28},[r10,:64]!        @ put aside smashed b[8*i+7]
  591         vmlal.u32       q11,d28,d3[0]
  592         vzip.16 d29,d8
  593         vmlal.u32       q12,d28,d3[1]
  594         vld1.32 {d28},[sp,:64]          @ pull smashed b[8*i+0]
  595         vmlal.u32       q13,d29,d4[0]
  596         vld1.32 {d0,d1,d2,d3},[r1]!
  597         vmlal.u32       q6,d29,d4[1]
  598         vmlal.u32       q7,d29,d5[0]
  599         vshr.u64        d26,d26,#16
  600         vmlal.u32       q8,d29,d5[1]
  601         vmlal.u32       q9,d29,d6[0]
  602         vadd.u64        d26,d26,d27
  603         vmlal.u32       q10,d29,d6[1]
  604         vshr.u64        d26,d26,#16
  605         vmlal.u32       q11,d29,d7[0]
  606         vmlal.u32       q12,d29,d7[1]
  607         vadd.u64        d12,d12,d26
  608         vst1.32 {d29},[r10,:64] @ put aside smashed m[8*i+7]
  609         add     r10,sp,#8               @ rewind
  610         sub     r8,r5,#8
  611         b       .LNEON_8n_inner
  612 
  613 .align  4
  614 .LNEON_8n_inner:
  615         subs    r8,r8,#8
  616         vmlal.u32       q6,d28,d0[0]
  617         vld1.64 {q13},[r6,:128]
  618         vmlal.u32       q7,d28,d0[1]
  619         vld1.32 {d29},[r10,:64]!        @ pull smashed m[8*i+0]
  620         vmlal.u32       q8,d28,d1[0]
  621         vld1.32 {d4,d5,d6,d7},[r3]!
  622         vmlal.u32       q9,d28,d1[1]
  623         it      ne
  624         addne   r6,r6,#16       @ don't advance in last iteration
  625         vmlal.u32       q10,d28,d2[0]
  626         vmlal.u32       q11,d28,d2[1]
  627         vmlal.u32       q12,d28,d3[0]
  628         vmlal.u32       q13,d28,d3[1]
  629         vld1.32 {d28},[r10,:64]!        @ pull smashed b[8*i+1]
  630         vmlal.u32       q6,d29,d4[0]
  631         vmlal.u32       q7,d29,d4[1]
  632         vmlal.u32       q8,d29,d5[0]
  633         vmlal.u32       q9,d29,d5[1]
  634         vmlal.u32       q10,d29,d6[0]
  635         vmlal.u32       q11,d29,d6[1]
  636         vmlal.u32       q12,d29,d7[0]
  637         vmlal.u32       q13,d29,d7[1]
  638         vst1.64 {q6},[r7,:128]!
  639         vmlal.u32       q7,d28,d0[0]
  640         vld1.64 {q6},[r6,:128]
  641         vmlal.u32       q8,d28,d0[1]
  642         vld1.32 {d29},[r10,:64]!        @ pull smashed m[8*i+1]
  643         vmlal.u32       q9,d28,d1[0]
  644         it      ne
  645         addne   r6,r6,#16       @ don't advance in last iteration
  646         vmlal.u32       q10,d28,d1[1]
  647         vmlal.u32       q11,d28,d2[0]
  648         vmlal.u32       q12,d28,d2[1]
  649         vmlal.u32       q13,d28,d3[0]
  650         vmlal.u32       q6,d28,d3[1]
  651         vld1.32 {d28},[r10,:64]!        @ pull smashed b[8*i+2]
  652         vmlal.u32       q7,d29,d4[0]
  653         vmlal.u32       q8,d29,d4[1]
  654         vmlal.u32       q9,d29,d5[0]
  655         vmlal.u32       q10,d29,d5[1]
  656         vmlal.u32       q11,d29,d6[0]
  657         vmlal.u32       q12,d29,d6[1]
  658         vmlal.u32       q13,d29,d7[0]
  659         vmlal.u32       q6,d29,d7[1]
  660         vst1.64 {q7},[r7,:128]!
  661         vmlal.u32       q8,d28,d0[0]
  662         vld1.64 {q7},[r6,:128]
  663         vmlal.u32       q9,d28,d0[1]
  664         vld1.32 {d29},[r10,:64]!        @ pull smashed m[8*i+2]
  665         vmlal.u32       q10,d28,d1[0]
  666         it      ne
  667         addne   r6,r6,#16       @ don't advance in last iteration
  668         vmlal.u32       q11,d28,d1[1]
  669         vmlal.u32       q12,d28,d2[0]
  670         vmlal.u32       q13,d28,d2[1]
  671         vmlal.u32       q6,d28,d3[0]
  672         vmlal.u32       q7,d28,d3[1]
  673         vld1.32 {d28},[r10,:64]!        @ pull smashed b[8*i+3]
  674         vmlal.u32       q8,d29,d4[0]
  675         vmlal.u32       q9,d29,d4[1]
  676         vmlal.u32       q10,d29,d5[0]
  677         vmlal.u32       q11,d29,d5[1]
  678         vmlal.u32       q12,d29,d6[0]
  679         vmlal.u32       q13,d29,d6[1]
  680         vmlal.u32       q6,d29,d7[0]
  681         vmlal.u32       q7,d29,d7[1]
  682         vst1.64 {q8},[r7,:128]!
  683         vmlal.u32       q9,d28,d0[0]
  684         vld1.64 {q8},[r6,:128]
  685         vmlal.u32       q10,d28,d0[1]
  686         vld1.32 {d29},[r10,:64]!        @ pull smashed m[8*i+3]
  687         vmlal.u32       q11,d28,d1[0]
  688         it      ne
  689         addne   r6,r6,#16       @ don't advance in last iteration
  690         vmlal.u32       q12,d28,d1[1]
  691         vmlal.u32       q13,d28,d2[0]
  692         vmlal.u32       q6,d28,d2[1]
  693         vmlal.u32       q7,d28,d3[0]
  694         vmlal.u32       q8,d28,d3[1]
  695         vld1.32 {d28},[r10,:64]!        @ pull smashed b[8*i+4]
  696         vmlal.u32       q9,d29,d4[0]
  697         vmlal.u32       q10,d29,d4[1]
  698         vmlal.u32       q11,d29,d5[0]
  699         vmlal.u32       q12,d29,d5[1]
  700         vmlal.u32       q13,d29,d6[0]
  701         vmlal.u32       q6,d29,d6[1]
  702         vmlal.u32       q7,d29,d7[0]
  703         vmlal.u32       q8,d29,d7[1]
  704         vst1.64 {q9},[r7,:128]!
  705         vmlal.u32       q10,d28,d0[0]
  706         vld1.64 {q9},[r6,:128]
  707         vmlal.u32       q11,d28,d0[1]
  708         vld1.32 {d29},[r10,:64]!        @ pull smashed m[8*i+4]
  709         vmlal.u32       q12,d28,d1[0]
  710         it      ne
  711         addne   r6,r6,#16       @ don't advance in last iteration
  712         vmlal.u32       q13,d28,d1[1]
  713         vmlal.u32       q6,d28,d2[0]
  714         vmlal.u32       q7,d28,d2[1]
  715         vmlal.u32       q8,d28,d3[0]
  716         vmlal.u32       q9,d28,d3[1]
  717         vld1.32 {d28},[r10,:64]!        @ pull smashed b[8*i+5]
  718         vmlal.u32       q10,d29,d4[0]
  719         vmlal.u32       q11,d29,d4[1]
  720         vmlal.u32       q12,d29,d5[0]
  721         vmlal.u32       q13,d29,d5[1]
  722         vmlal.u32       q6,d29,d6[0]
  723         vmlal.u32       q7,d29,d6[1]
  724         vmlal.u32       q8,d29,d7[0]
  725         vmlal.u32       q9,d29,d7[1]
  726         vst1.64 {q10},[r7,:128]!
  727         vmlal.u32       q11,d28,d0[0]
  728         vld1.64 {q10},[r6,:128]
  729         vmlal.u32       q12,d28,d0[1]
  730         vld1.32 {d29},[r10,:64]!        @ pull smashed m[8*i+5]
  731         vmlal.u32       q13,d28,d1[0]
  732         it      ne
  733         addne   r6,r6,#16       @ don't advance in last iteration
  734         vmlal.u32       q6,d28,d1[1]
  735         vmlal.u32       q7,d28,d2[0]
  736         vmlal.u32       q8,d28,d2[1]
  737         vmlal.u32       q9,d28,d3[0]
  738         vmlal.u32       q10,d28,d3[1]
  739         vld1.32 {d28},[r10,:64]!        @ pull smashed b[8*i+6]
  740         vmlal.u32       q11,d29,d4[0]
  741         vmlal.u32       q12,d29,d4[1]
  742         vmlal.u32       q13,d29,d5[0]
  743         vmlal.u32       q6,d29,d5[1]
  744         vmlal.u32       q7,d29,d6[0]
  745         vmlal.u32       q8,d29,d6[1]
  746         vmlal.u32       q9,d29,d7[0]
  747         vmlal.u32       q10,d29,d7[1]
  748         vst1.64 {q11},[r7,:128]!
  749         vmlal.u32       q12,d28,d0[0]
  750         vld1.64 {q11},[r6,:128]
  751         vmlal.u32       q13,d28,d0[1]
  752         vld1.32 {d29},[r10,:64]!        @ pull smashed m[8*i+6]
  753         vmlal.u32       q6,d28,d1[0]
  754         it      ne
  755         addne   r6,r6,#16       @ don't advance in last iteration
  756         vmlal.u32       q7,d28,d1[1]
  757         vmlal.u32       q8,d28,d2[0]
  758         vmlal.u32       q9,d28,d2[1]
  759         vmlal.u32       q10,d28,d3[0]
  760         vmlal.u32       q11,d28,d3[1]
  761         vld1.32 {d28},[r10,:64]!        @ pull smashed b[8*i+7]
  762         vmlal.u32       q12,d29,d4[0]
  763         vmlal.u32       q13,d29,d4[1]
  764         vmlal.u32       q6,d29,d5[0]
  765         vmlal.u32       q7,d29,d5[1]
  766         vmlal.u32       q8,d29,d6[0]
  767         vmlal.u32       q9,d29,d6[1]
  768         vmlal.u32       q10,d29,d7[0]
  769         vmlal.u32       q11,d29,d7[1]
  770         vst1.64 {q12},[r7,:128]!
  771         vmlal.u32       q13,d28,d0[0]
  772         vld1.64 {q12},[r6,:128]
  773         vmlal.u32       q6,d28,d0[1]
  774         vld1.32 {d29},[r10,:64]!        @ pull smashed m[8*i+7]
  775         vmlal.u32       q7,d28,d1[0]
  776         it      ne
  777         addne   r6,r6,#16       @ don't advance in last iteration
  778         vmlal.u32       q8,d28,d1[1]
  779         vmlal.u32       q9,d28,d2[0]
  780         vmlal.u32       q10,d28,d2[1]
  781         vmlal.u32       q11,d28,d3[0]
  782         vmlal.u32       q12,d28,d3[1]
  783         it      eq
  784         subeq   r1,r1,r5,lsl#2  @ rewind
  785         vmlal.u32       q13,d29,d4[0]
  786         vld1.32 {d28},[sp,:64]          @ pull smashed b[8*i+0]
  787         vmlal.u32       q6,d29,d4[1]
  788         vld1.32 {d0,d1,d2,d3},[r1]!
  789         vmlal.u32       q7,d29,d5[0]
  790         add     r10,sp,#8               @ rewind
  791         vmlal.u32       q8,d29,d5[1]
  792         vmlal.u32       q9,d29,d6[0]
  793         vmlal.u32       q10,d29,d6[1]
  794         vmlal.u32       q11,d29,d7[0]
  795         vst1.64 {q13},[r7,:128]!
  796         vmlal.u32       q12,d29,d7[1]
  797 
  798         bne     .LNEON_8n_inner
  799         add     r6,sp,#128
  800         vst1.64 {q6,q7},[r7,:256]!
  801         veor    q2,q2,q2                @ d4-d5
  802         vst1.64 {q8,q9},[r7,:256]!
  803         veor    q3,q3,q3                @ d6-d7
  804         vst1.64 {q10,q11},[r7,:256]!
  805         vst1.64 {q12},[r7,:128]
  806 
  807         subs    r9,r9,#8
  808         vld1.64 {q6,q7},[r6,:256]!
  809         vld1.64 {q8,q9},[r6,:256]!
  810         vld1.64 {q10,q11},[r6,:256]!
  811         vld1.64 {q12,q13},[r6,:256]!
  812 
  813         itt     ne
  814         subne   r3,r3,r5,lsl#2  @ rewind
  815         bne     .LNEON_8n_outer
  816 
  817         add     r7,sp,#128
  818         vst1.64 {q2,q3}, [sp,:256]!     @ start wiping stack frame
  819         vshr.u64        d10,d12,#16
  820         vst1.64 {q2,q3},[sp,:256]!
  821         vadd.u64        d13,d13,d10
  822         vst1.64 {q2,q3}, [sp,:256]!
  823         vshr.u64        d10,d13,#16
  824         vst1.64 {q2,q3}, [sp,:256]!
  825         vzip.16 d12,d13
  826 
  827         mov     r8,r5
  828         b       .LNEON_tail_entry
  829 
  830 .align  4
  831 .LNEON_tail:
  832         vadd.u64        d12,d12,d10
  833         vshr.u64        d10,d12,#16
  834         vld1.64 {q8,q9}, [r6, :256]!
  835         vadd.u64        d13,d13,d10
  836         vld1.64 {q10,q11}, [r6, :256]!
  837         vshr.u64        d10,d13,#16
  838         vld1.64 {q12,q13}, [r6, :256]!
  839         vzip.16 d12,d13
  840 
  841 .LNEON_tail_entry:
  842         vadd.u64        d14,d14,d10
  843         vst1.32 {d12[0]}, [r7, :32]!
  844         vshr.u64        d10,d14,#16
  845         vadd.u64        d15,d15,d10
  846         vshr.u64        d10,d15,#16
  847         vzip.16 d14,d15
  848         vadd.u64        d16,d16,d10
  849         vst1.32 {d14[0]}, [r7, :32]!
  850         vshr.u64        d10,d16,#16
  851         vadd.u64        d17,d17,d10
  852         vshr.u64        d10,d17,#16
  853         vzip.16 d16,d17
  854         vadd.u64        d18,d18,d10
  855         vst1.32 {d16[0]}, [r7, :32]!
  856         vshr.u64        d10,d18,#16
  857         vadd.u64        d19,d19,d10
  858         vshr.u64        d10,d19,#16
  859         vzip.16 d18,d19
  860         vadd.u64        d20,d20,d10
  861         vst1.32 {d18[0]}, [r7, :32]!
  862         vshr.u64        d10,d20,#16
  863         vadd.u64        d21,d21,d10
  864         vshr.u64        d10,d21,#16
  865         vzip.16 d20,d21
  866         vadd.u64        d22,d22,d10
  867         vst1.32 {d20[0]}, [r7, :32]!
  868         vshr.u64        d10,d22,#16
  869         vadd.u64        d23,d23,d10
  870         vshr.u64        d10,d23,#16
  871         vzip.16 d22,d23
  872         vadd.u64        d24,d24,d10
  873         vst1.32 {d22[0]}, [r7, :32]!
  874         vshr.u64        d10,d24,#16
  875         vadd.u64        d25,d25,d10
  876         vshr.u64        d10,d25,#16
  877         vzip.16 d24,d25
  878         vadd.u64        d26,d26,d10
  879         vst1.32 {d24[0]}, [r7, :32]!
  880         vshr.u64        d10,d26,#16
  881         vadd.u64        d27,d27,d10
  882         vshr.u64        d10,d27,#16
  883         vzip.16 d26,d27
  884         vld1.64 {q6,q7}, [r6, :256]!
  885         subs    r8,r8,#8
  886         vst1.32 {d26[0]},   [r7, :32]!
  887         bne     .LNEON_tail
  888 
  889         vst1.32 {d10[0]}, [r7, :32]             @ top-most bit
  890         sub     r3,r3,r5,lsl#2                  @ rewind r3
  891         subs    r1,sp,#0                                @ clear carry flag
  892         add     r2,sp,r5,lsl#2
  893 
  894 .LNEON_sub:
  895         ldmia   r1!, {r4,r5,r6,r7}
  896         ldmia   r3!, {r8,r9,r10,r11}
  897         sbcs    r8, r4,r8
  898         sbcs    r9, r5,r9
  899         sbcs    r10,r6,r10
  900         sbcs    r11,r7,r11
  901         teq     r1,r2                           @ preserves carry
  902         stmia   r0!, {r8,r9,r10,r11}
  903         bne     .LNEON_sub
  904 
  905         ldr     r10, [r1]                               @ load top-most bit
  906         mov     r11,sp
  907         veor    q0,q0,q0
  908         sub     r11,r2,r11                              @ this is num*4
  909         veor    q1,q1,q1
  910         mov     r1,sp
  911         sub     r0,r0,r11                               @ rewind r0
  912         mov     r3,r2                           @ second 3/4th of frame
  913         sbcs    r10,r10,#0                              @ result is carry flag
  914 
  915 .LNEON_copy_n_zap:
  916         ldmia   r1!, {r4,r5,r6,r7}
  917         ldmia   r0,  {r8,r9,r10,r11}
  918         it      cc
  919         movcc   r8, r4
  920         vst1.64 {q0,q1}, [r3,:256]!                     @ wipe
  921         itt     cc
  922         movcc   r9, r5
  923         movcc   r10,r6
  924         vst1.64 {q0,q1}, [r3,:256]!                     @ wipe
  925         it      cc
  926         movcc   r11,r7
  927         ldmia   r1, {r4,r5,r6,r7}
  928         stmia   r0!, {r8,r9,r10,r11}
  929         sub     r1,r1,#16
  930         ldmia   r0, {r8,r9,r10,r11}
  931         it      cc
  932         movcc   r8, r4
  933         vst1.64 {q0,q1}, [r1,:256]!                     @ wipe
  934         itt     cc
  935         movcc   r9, r5
  936         movcc   r10,r6
  937         vst1.64 {q0,q1}, [r3,:256]!                     @ wipe
  938         it      cc
  939         movcc   r11,r7
  940         teq     r1,r2                           @ preserves carry
  941         stmia   r0!, {r8,r9,r10,r11}
  942         bne     .LNEON_copy_n_zap
  943 
  944         mov     sp,ip
  945         vldmia  sp!,{d8,d9,d10,d11,d12,d13,d14,d15}
  946         ldmia   sp!,{r4,r5,r6,r7,r8,r9,r10,r11}
  947         bx      lr                                              @ bx lr
  948 .size   bn_mul8x_mont_neon,.-bn_mul8x_mont_neon
  949 #endif
  950 .byte   77,111,110,116,103,111,109,101,114,121,32,109,117,108,116,105,112,108,105,99,97,116,105,111,110,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
  951 .align  2
  952 .align  2
  953 #if __ARM_MAX_ARCH__>=7
  954 .comm   OPENSSL_armcap_P,4,4
  955 #endif

Cache object: 13150377b93d6a1653d2553f78197f02


[ 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.