security/nss/lib/freebl/mpi/mpi_arm.c

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 /* This inlined version is for 32-bit ARM platform only */
     7 #if !defined(__arm__)
     8 #error "This is for ARM only"
     9 #endif
    11 /* 16-bit thumb doesn't work inlined assember version */
    12 #if (!defined(__thumb__) || defined(__thumb2__)) && !defined(__ARM_ARCH_3__)
    14 #include "mpi-priv.h"
    16 #ifdef MP_ASSEMBLY_MULTIPLY
    17 void s_mpv_mul_d(const mp_digit *a, mp_size a_len, mp_digit b, mp_digit *c)
    18 {
    19   __asm__ __volatile__(
    20     "mov     r5, #0\n"
    21 #ifdef __thumb2__
    22     "cbz     %1, 2f\n"
    23 #else
    24     "cmp     %1, r5\n" /* r5 is 0 now */
    25     "beq     2f\n"
    26 #endif
    28     "1:\n"
    29     "mov     r4, #0\n"
    30     "ldr     r6, [%0], #4\n"
    31     "umlal   r5, r4, r6, %2\n"
    32     "str     r5, [%3], #4\n"
    33     "mov     r5, r4\n"
    35     "subs    %1, #1\n"
    36     "bne     1b\n"
    38     "2:\n"
    39     "str     r5, [%3]\n"
    40   :
    41   : "r"(a), "r"(a_len), "r"(b), "r"(c)
    42   : "memory", "cc", "%r4", "%r5", "%r6");
    43 }
    45 void s_mpv_mul_d_add(const mp_digit *a, mp_size a_len, mp_digit b, mp_digit *c)
    46 {
    47   __asm__ __volatile__(
    48     "mov     r5, #0\n"
    49 #ifdef __thumb2__
    50     "cbz     %1, 2f\n"
    51 #else
    52     "cmp     %1, r5\n" /* r5 is 0 now */
    53     "beq     2f\n"
    54 #endif
    56     "1:\n"
    57     "mov     r4, #0\n"
    58     "ldr     r6, [%3]\n"
    59     "adds    r5, r6\n"
    60     "adc     r4, r4, #0\n"
    62     "ldr     r6, [%0], #4\n"
    63     "umlal   r5, r4, r6, %2\n"
    64     "str     r5, [%3], #4\n"
    65     "mov     r5, r4\n"
    67     "subs    %1, #1\n"
    68     "bne     1b\n"
    70     "2:\n"
    71     "str     r5, [%3]\n"
    72     :
    73     : "r"(a), "r"(a_len), "r"(b), "r"(c)
    74     : "memory", "cc", "%r4", "%r5", "%r6");
    75 }
    77 void s_mpv_mul_d_add_prop(const mp_digit *a, mp_size a_len, mp_digit b, mp_digit *c)
    78 {
    79   if (!a_len)
    80     return;
    82   __asm__ __volatile__(
    83     "mov     r5, #0\n"
    85     "1:\n"
    86     "mov     r4, #0\n"
    87     "ldr     r6, [%3]\n"
    88     "adds    r5, r6\n"
    89     "adc     r4, r4, #0\n"
    90     "ldr     r6, [%0], #4\n"
    91     "umlal   r5, r4, r6, %2\n"
    92     "str     r5, [%3], #4\n"
    93     "mov     r5, r4\n"
    95     "subs    %1, #1\n"
    96     "bne     1b\n"
    98 #ifdef __thumb2__
    99     "cbz     r4, 3f\n"
   100 #else
   101     "cmp     r4, #0\n"
   102     "beq     3f\n"
   103 #endif
   105     "2:\n"
   106     "mov     r4, #0\n"
   107     "ldr     r6, [%3]\n"
   108     "adds    r5, r6\n"
   109     "adc     r4, r4, #0\n"
   110     "str     r5, [%3], #4\n"
   111     "movs    r5, r4\n"
   112     "bne     2b\n"
   114     "3:\n"
   115     :
   116     : "r"(a), "r"(a_len), "r"(b), "r"(c)
   117     : "memory", "cc", "%r4", "%r5", "%r6");
   118 }
   119 #endif
   121 #ifdef MP_ASSEMBLY_SQUARE
   122 void s_mpv_sqr_add_prop(const mp_digit *pa, mp_size a_len, mp_digit *ps)
   123 {
   124   if (!a_len)
   125     return;
   127   __asm__ __volatile__(
   128     "mov     r3, #0\n"
   130     "1:\n"
   131     "mov     r4, #0\n"
   132     "ldr     r6, [%0], #4\n"
   133     "ldr     r5, [%2]\n"
   134     "adds    r3, r5\n"
   135     "adc     r4, r4, #0\n"
   136     "umlal   r3, r4, r6, r6\n" /* w = r3:r4 */
   137     "str     r3, [%2], #4\n"
   139     "ldr     r5, [%2]\n"
   140     "adds    r3, r4, r5\n"
   141     "mov     r4, #0\n"
   142     "adc     r4, r4, #0\n"
   143     "str     r3, [%2], #4\n"
   144     "mov     r3, r4\n"
   146     "subs    %1, #1\n"
   147     "bne     1b\n"
   149 #ifdef __thumb2__
   150     "cbz     r3, 3f\n"
   151 #else
   152     "cmp     r3, #0\n"
   153     "beq     3f\n"
   154 #endif
   156     "2:\n"
   157     "mov     r4, #0\n"
   158     "ldr     r5, [%2]\n"
   159     "adds    r3, r5\n"
   160     "adc     r4, r4, #0\n"
   161     "str     r3, [%2], #4\n"
   162     "movs    r3, r4\n"
   163     "bne     2b\n"
   165     "3:"
   166     :
   167     : "r"(pa), "r"(a_len), "r"(ps)
   168     : "memory", "cc", "%r3", "%r4", "%r5", "%r6");
   169 }
   170 #endif
   171 #endif

mercurial