1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/nss/lib/freebl/mpi/mpi_arm.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,171 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +/* This inlined version is for 32-bit ARM platform only */ 1.9 + 1.10 +#if !defined(__arm__) 1.11 +#error "This is for ARM only" 1.12 +#endif 1.13 + 1.14 +/* 16-bit thumb doesn't work inlined assember version */ 1.15 +#if (!defined(__thumb__) || defined(__thumb2__)) && !defined(__ARM_ARCH_3__) 1.16 + 1.17 +#include "mpi-priv.h" 1.18 + 1.19 +#ifdef MP_ASSEMBLY_MULTIPLY 1.20 +void s_mpv_mul_d(const mp_digit *a, mp_size a_len, mp_digit b, mp_digit *c) 1.21 +{ 1.22 + __asm__ __volatile__( 1.23 + "mov r5, #0\n" 1.24 +#ifdef __thumb2__ 1.25 + "cbz %1, 2f\n" 1.26 +#else 1.27 + "cmp %1, r5\n" /* r5 is 0 now */ 1.28 + "beq 2f\n" 1.29 +#endif 1.30 + 1.31 + "1:\n" 1.32 + "mov r4, #0\n" 1.33 + "ldr r6, [%0], #4\n" 1.34 + "umlal r5, r4, r6, %2\n" 1.35 + "str r5, [%3], #4\n" 1.36 + "mov r5, r4\n" 1.37 + 1.38 + "subs %1, #1\n" 1.39 + "bne 1b\n" 1.40 + 1.41 + "2:\n" 1.42 + "str r5, [%3]\n" 1.43 + : 1.44 + : "r"(a), "r"(a_len), "r"(b), "r"(c) 1.45 + : "memory", "cc", "%r4", "%r5", "%r6"); 1.46 +} 1.47 + 1.48 +void s_mpv_mul_d_add(const mp_digit *a, mp_size a_len, mp_digit b, mp_digit *c) 1.49 +{ 1.50 + __asm__ __volatile__( 1.51 + "mov r5, #0\n" 1.52 +#ifdef __thumb2__ 1.53 + "cbz %1, 2f\n" 1.54 +#else 1.55 + "cmp %1, r5\n" /* r5 is 0 now */ 1.56 + "beq 2f\n" 1.57 +#endif 1.58 + 1.59 + "1:\n" 1.60 + "mov r4, #0\n" 1.61 + "ldr r6, [%3]\n" 1.62 + "adds r5, r6\n" 1.63 + "adc r4, r4, #0\n" 1.64 + 1.65 + "ldr r6, [%0], #4\n" 1.66 + "umlal r5, r4, r6, %2\n" 1.67 + "str r5, [%3], #4\n" 1.68 + "mov r5, r4\n" 1.69 + 1.70 + "subs %1, #1\n" 1.71 + "bne 1b\n" 1.72 + 1.73 + "2:\n" 1.74 + "str r5, [%3]\n" 1.75 + : 1.76 + : "r"(a), "r"(a_len), "r"(b), "r"(c) 1.77 + : "memory", "cc", "%r4", "%r5", "%r6"); 1.78 +} 1.79 + 1.80 +void s_mpv_mul_d_add_prop(const mp_digit *a, mp_size a_len, mp_digit b, mp_digit *c) 1.81 +{ 1.82 + if (!a_len) 1.83 + return; 1.84 + 1.85 + __asm__ __volatile__( 1.86 + "mov r5, #0\n" 1.87 + 1.88 + "1:\n" 1.89 + "mov r4, #0\n" 1.90 + "ldr r6, [%3]\n" 1.91 + "adds r5, r6\n" 1.92 + "adc r4, r4, #0\n" 1.93 + "ldr r6, [%0], #4\n" 1.94 + "umlal r5, r4, r6, %2\n" 1.95 + "str r5, [%3], #4\n" 1.96 + "mov r5, r4\n" 1.97 + 1.98 + "subs %1, #1\n" 1.99 + "bne 1b\n" 1.100 + 1.101 +#ifdef __thumb2__ 1.102 + "cbz r4, 3f\n" 1.103 +#else 1.104 + "cmp r4, #0\n" 1.105 + "beq 3f\n" 1.106 +#endif 1.107 + 1.108 + "2:\n" 1.109 + "mov r4, #0\n" 1.110 + "ldr r6, [%3]\n" 1.111 + "adds r5, r6\n" 1.112 + "adc r4, r4, #0\n" 1.113 + "str r5, [%3], #4\n" 1.114 + "movs r5, r4\n" 1.115 + "bne 2b\n" 1.116 + 1.117 + "3:\n" 1.118 + : 1.119 + : "r"(a), "r"(a_len), "r"(b), "r"(c) 1.120 + : "memory", "cc", "%r4", "%r5", "%r6"); 1.121 +} 1.122 +#endif 1.123 + 1.124 +#ifdef MP_ASSEMBLY_SQUARE 1.125 +void s_mpv_sqr_add_prop(const mp_digit *pa, mp_size a_len, mp_digit *ps) 1.126 +{ 1.127 + if (!a_len) 1.128 + return; 1.129 + 1.130 + __asm__ __volatile__( 1.131 + "mov r3, #0\n" 1.132 + 1.133 + "1:\n" 1.134 + "mov r4, #0\n" 1.135 + "ldr r6, [%0], #4\n" 1.136 + "ldr r5, [%2]\n" 1.137 + "adds r3, r5\n" 1.138 + "adc r4, r4, #0\n" 1.139 + "umlal r3, r4, r6, r6\n" /* w = r3:r4 */ 1.140 + "str r3, [%2], #4\n" 1.141 + 1.142 + "ldr r5, [%2]\n" 1.143 + "adds r3, r4, r5\n" 1.144 + "mov r4, #0\n" 1.145 + "adc r4, r4, #0\n" 1.146 + "str r3, [%2], #4\n" 1.147 + "mov r3, r4\n" 1.148 + 1.149 + "subs %1, #1\n" 1.150 + "bne 1b\n" 1.151 + 1.152 +#ifdef __thumb2__ 1.153 + "cbz r3, 3f\n" 1.154 +#else 1.155 + "cmp r3, #0\n" 1.156 + "beq 3f\n" 1.157 +#endif 1.158 + 1.159 + "2:\n" 1.160 + "mov r4, #0\n" 1.161 + "ldr r5, [%2]\n" 1.162 + "adds r3, r5\n" 1.163 + "adc r4, r4, #0\n" 1.164 + "str r3, [%2], #4\n" 1.165 + "movs r3, r4\n" 1.166 + "bne 2b\n" 1.167 + 1.168 + "3:" 1.169 + : 1.170 + : "r"(pa), "r"(a_len), "r"(ps) 1.171 + : "memory", "cc", "%r3", "%r4", "%r5", "%r6"); 1.172 +} 1.173 +#endif 1.174 +#endif