ssh lib

Dependents:   OS

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers sp_arm64.c Source File

sp_arm64.c

00001 /* sp.c
00002  *
00003  * Copyright (C) 2006-2018 wolfSSL Inc.
00004  *
00005  * This file is part of wolfSSL.
00006  *
00007  * wolfSSL is free software; you can redistribute it and/or modify
00008  * it under the terms of the GNU General Public License as published by
00009  * the Free Software Foundation; either version 2 of the License, or
00010  * (at your option) any later version.
00011  *
00012  * wolfSSL is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  * GNU General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU General Public License
00018  * along with this program; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
00020  */
00021 
00022 /* Implementation by Sean Parkinson. */
00023 
00024 #ifdef HAVE_CONFIG_H
00025     #include <config.h>
00026 #endif
00027 
00028 #include <wolfcrypt/settings.h>
00029 #include <wolfcrypt/error-crypt.h>
00030 #include <wolfcrypt/cpuid.h>
00031 #ifdef NO_INLINE
00032     #include <wolfcrypt/misc.h>
00033 #else
00034     #define WOLFSSL_MISC_INCLUDED
00035     #include <wolfcrypt/src/misc.c>
00036 #endif
00037 
00038 #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH) || \
00039                                     defined(WOLFSSL_HAVE_SP_ECC)
00040 
00041 #ifdef RSA_LOW_MEM
00042 #define SP_RSA_PRIVATE_EXP_D
00043 
00044 #ifndef WOLFSSL_SP_SMALL
00045 #define WOLFSSL_SP_SMALL
00046 #endif
00047 #endif
00048 
00049 #include <wolfcrypt/sp.h>
00050 
00051 #ifdef WOLFSSL_SP_ARM64_ASM
00052 #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH)
00053 #ifndef WOLFSSL_SP_NO_2048
00054 /* Read big endian unsigned byte aray into r.
00055  *
00056  * r  A single precision integer.
00057  * a  Byte array.
00058  * n  Number of bytes in array to read.
00059  */
00060 static void sp_2048_from_bin(sp_digit* r, int max, const byte* a, int n)
00061 {
00062     int i, j = 0, s = 0;
00063 
00064     r[0] = 0;
00065     for (i = n-1; i >= 0; i--) {
00066         r[j] |= ((sp_digit)a[i]) << s;
00067         if (s >= 56) {
00068             r[j] &= 0xffffffffffffffffl;
00069             s = 64 - s;
00070             if (j + 1 >= max)
00071                 break;
00072             r[++j] = a[i] >> s;
00073             s = 8 - s;
00074         }
00075         else
00076             s += 8;
00077     }
00078 
00079     for (j++; j < max; j++)
00080         r[j] = 0;
00081 }
00082 
00083 /* Convert an mp_int to an array of sp_digit.
00084  *
00085  * r  A single precision integer.
00086  * a  A multi-precision integer.
00087  */
00088 static void sp_2048_from_mp(sp_digit* r, int max, mp_int* a)
00089 {
00090 #if DIGIT_BIT == 64
00091     int j;
00092 
00093     XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
00094 
00095     for (j = a->used; j < max; j++)
00096         r[j] = 0;
00097 #elif DIGIT_BIT > 64
00098     int i, j = 0, s = 0;
00099 
00100     r[0] = 0;
00101     for (i = 0; i < a->used && j < max; i++) {
00102         r[j] |= a->dp[i] << s;
00103         r[j] &= 0xffffffffffffffffl;
00104         s = 64 - s;
00105         if (j + 1 >= max)
00106             break;
00107         r[++j] = a->dp[i] >> s;
00108         while (s + 64 <= DIGIT_BIT) {
00109             s += 64;
00110             r[j] &= 0xffffffffffffffffl;
00111             if (j + 1 >= max)
00112                 break;
00113             if (s < DIGIT_BIT)
00114                 r[++j] = a->dp[i] >> s;
00115             else
00116                 r[++j] = 0;
00117         }
00118         s = DIGIT_BIT - s;
00119     }
00120 
00121     for (j++; j < max; j++)
00122         r[j] = 0;
00123 #else
00124     int i, j = 0, s = 0;
00125 
00126     r[0] = 0;
00127     for (i = 0; i < a->used && j < max; i++) {
00128         r[j] |= ((sp_digit)a->dp[i]) << s;
00129         if (s + DIGIT_BIT >= 64) {
00130             r[j] &= 0xffffffffffffffffl;
00131             if (j + 1 >= max)
00132                 break;
00133             s = 64 - s;
00134             if (s == DIGIT_BIT) {
00135                 r[++j] = 0;
00136                 s = 0;
00137             }
00138             else {
00139                 r[++j] = a->dp[i] >> s;
00140                 s = DIGIT_BIT - s;
00141             }
00142         }
00143         else
00144             s += DIGIT_BIT;
00145     }
00146 
00147     for (j++; j < max; j++)
00148         r[j] = 0;
00149 #endif
00150 }
00151 
00152 /* Write r as big endian to byte aray.
00153  * Fixed length number of bytes written: 256
00154  *
00155  * r  A single precision integer.
00156  * a  Byte array.
00157  */
00158 static void sp_2048_to_bin(sp_digit* r, byte* a)
00159 {
00160     int i, j, s = 0, b;
00161 
00162     j = 2048 / 8 - 1;
00163     a[j] = 0;
00164     for (i=0; i<32 && j>=0; i++) {
00165         b = 0;
00166         a[j--] |= r[i] << s; b += 8 - s;
00167         if (j < 0)
00168             break;
00169         while (b < 64) {
00170             a[j--] = r[i] >> b; b += 8;
00171             if (j < 0)
00172                 break;
00173         }
00174         s = 8 - (b - 64);
00175         if (j >= 0)
00176             a[j] = 0;
00177         if (s != 0)
00178             j++;
00179     }
00180 }
00181 
00182 #ifndef WOLFSSL_SP_SMALL
00183 /* Multiply a and b into r. (r = a * b)
00184  *
00185  * r  A single precision integer.
00186  * a  A single precision integer.
00187  * b  A single precision integer.
00188  */
00189 static void sp_2048_mul_8(sp_digit* r, const sp_digit* a, const sp_digit* b)
00190 {
00191     sp_digit tmp[8];
00192 
00193     __asm__ __volatile__ (
00194         "ldp    x8, x9, [%[a], 0]\n\t"
00195         "ldp    x10, x11, [%[a], 16]\n\t"
00196         "ldp    x12, x13, [%[a], 32]\n\t"
00197         "ldp    x14, x15, [%[a], 48]\n\t"
00198         "ldp    x16, x17, [%[b], 0]\n\t"
00199         "ldp    x18, x19, [%[b], 16]\n\t"
00200         "ldp    x20, x21, [%[b], 32]\n\t"
00201         "ldp    x22, x23, [%[b], 48]\n\t"
00202         "#  A[0] * B[0]\n\t"
00203         "mul    x3, x8, x16\n\t"
00204         "umulh  x4, x8, x16\n\t"
00205         "str    x3, [%[tmp]]\n\t"
00206         "#  A[0] * B[1]\n\t"
00207         "mul    x6, x8, x17\n\t"
00208         "umulh  x7, x8, x17\n\t"
00209         "adds   x4, x4, x6\n\t"
00210         "adc    x5, xzr, x7\n\t"
00211         "#  A[1] * B[0]\n\t"
00212         "mul    x6, x9, x16\n\t"
00213         "umulh  x7, x9, x16\n\t"
00214         "adds   x4, x4, x6\n\t"
00215         "adcs   x5, x5, x7\n\t"
00216         "adc    x3, xzr, xzr\n\t"
00217         "str    x4, [%[tmp], 8]\n\t"
00218         "#  A[0] * B[2]\n\t"
00219         "mul    x6, x8, x18\n\t"
00220         "umulh  x7, x8, x18\n\t"
00221         "adds   x5, x5, x6\n\t"
00222         "adcs   x3, x3, x7\n\t"
00223         "adc    x4, xzr, xzr\n\t"
00224         "#  A[1] * B[1]\n\t"
00225         "mul    x6, x9, x17\n\t"
00226         "umulh  x7, x9, x17\n\t"
00227         "adds   x5, x5, x6\n\t"
00228         "adcs   x3, x3, x7\n\t"
00229         "adc    x4, x4, xzr\n\t"
00230         "#  A[2] * B[0]\n\t"
00231         "mul    x6, x10, x16\n\t"
00232         "umulh  x7, x10, x16\n\t"
00233         "adds   x5, x5, x6\n\t"
00234         "adcs   x3, x3, x7\n\t"
00235         "adc    x4, x4, xzr\n\t"
00236         "str    x5, [%[tmp], 16]\n\t"
00237         "#  A[0] * B[3]\n\t"
00238         "mul    x6, x8, x19\n\t"
00239         "umulh  x7, x8, x19\n\t"
00240         "adds   x3, x3, x6\n\t"
00241         "adcs   x4, x4, x7\n\t"
00242         "adc    x5, xzr, xzr\n\t"
00243         "#  A[1] * B[2]\n\t"
00244         "mul    x6, x9, x18\n\t"
00245         "umulh  x7, x9, x18\n\t"
00246         "adds   x3, x3, x6\n\t"
00247         "adcs   x4, x4, x7\n\t"
00248         "adc    x5, x5, xzr\n\t"
00249         "#  A[2] * B[1]\n\t"
00250         "mul    x6, x10, x17\n\t"
00251         "umulh  x7, x10, x17\n\t"
00252         "adds   x3, x3, x6\n\t"
00253         "adcs   x4, x4, x7\n\t"
00254         "adc    x5, x5, xzr\n\t"
00255         "#  A[3] * B[0]\n\t"
00256         "mul    x6, x11, x16\n\t"
00257         "umulh  x7, x11, x16\n\t"
00258         "adds   x3, x3, x6\n\t"
00259         "adcs   x4, x4, x7\n\t"
00260         "adc    x5, x5, xzr\n\t"
00261         "str    x3, [%[tmp], 24]\n\t"
00262         "#  A[0] * B[4]\n\t"
00263         "mul    x6, x8, x20\n\t"
00264         "umulh  x7, x8, x20\n\t"
00265         "adds   x4, x4, x6\n\t"
00266         "adcs   x5, x5, x7\n\t"
00267         "adc    x3, xzr, xzr\n\t"
00268         "#  A[1] * B[3]\n\t"
00269         "mul    x6, x9, x19\n\t"
00270         "umulh  x7, x9, x19\n\t"
00271         "adds   x4, x4, x6\n\t"
00272         "adcs   x5, x5, x7\n\t"
00273         "adc    x3, x3, xzr\n\t"
00274         "#  A[2] * B[2]\n\t"
00275         "mul    x6, x10, x18\n\t"
00276         "umulh  x7, x10, x18\n\t"
00277         "adds   x4, x4, x6\n\t"
00278         "adcs   x5, x5, x7\n\t"
00279         "adc    x3, x3, xzr\n\t"
00280         "#  A[3] * B[1]\n\t"
00281         "mul    x6, x11, x17\n\t"
00282         "umulh  x7, x11, x17\n\t"
00283         "adds   x4, x4, x6\n\t"
00284         "adcs   x5, x5, x7\n\t"
00285         "adc    x3, x3, xzr\n\t"
00286         "#  A[4] * B[0]\n\t"
00287         "mul    x6, x12, x16\n\t"
00288         "umulh  x7, x12, x16\n\t"
00289         "adds   x4, x4, x6\n\t"
00290         "adcs   x5, x5, x7\n\t"
00291         "adc    x3, x3, xzr\n\t"
00292         "str    x4, [%[tmp], 32]\n\t"
00293         "#  A[0] * B[5]\n\t"
00294         "mul    x6, x8, x21\n\t"
00295         "umulh  x7, x8, x21\n\t"
00296         "adds   x5, x5, x6\n\t"
00297         "adcs   x3, x3, x7\n\t"
00298         "adc    x4, xzr, xzr\n\t"
00299         "#  A[1] * B[4]\n\t"
00300         "mul    x6, x9, x20\n\t"
00301         "umulh  x7, x9, x20\n\t"
00302         "adds   x5, x5, x6\n\t"
00303         "adcs   x3, x3, x7\n\t"
00304         "adc    x4, x4, xzr\n\t"
00305         "#  A[2] * B[3]\n\t"
00306         "mul    x6, x10, x19\n\t"
00307         "umulh  x7, x10, x19\n\t"
00308         "adds   x5, x5, x6\n\t"
00309         "adcs   x3, x3, x7\n\t"
00310         "adc    x4, x4, xzr\n\t"
00311         "#  A[3] * B[2]\n\t"
00312         "mul    x6, x11, x18\n\t"
00313         "umulh  x7, x11, x18\n\t"
00314         "adds   x5, x5, x6\n\t"
00315         "adcs   x3, x3, x7\n\t"
00316         "adc    x4, x4, xzr\n\t"
00317         "#  A[4] * B[1]\n\t"
00318         "mul    x6, x12, x17\n\t"
00319         "umulh  x7, x12, x17\n\t"
00320         "adds   x5, x5, x6\n\t"
00321         "adcs   x3, x3, x7\n\t"
00322         "adc    x4, x4, xzr\n\t"
00323         "#  A[5] * B[0]\n\t"
00324         "mul    x6, x13, x16\n\t"
00325         "umulh  x7, x13, x16\n\t"
00326         "adds   x5, x5, x6\n\t"
00327         "adcs   x3, x3, x7\n\t"
00328         "adc    x4, x4, xzr\n\t"
00329         "str    x5, [%[tmp], 40]\n\t"
00330         "#  A[0] * B[6]\n\t"
00331         "mul    x6, x8, x22\n\t"
00332         "umulh  x7, x8, x22\n\t"
00333         "adds   x3, x3, x6\n\t"
00334         "adcs   x4, x4, x7\n\t"
00335         "adc    x5, xzr, xzr\n\t"
00336         "#  A[1] * B[5]\n\t"
00337         "mul    x6, x9, x21\n\t"
00338         "umulh  x7, x9, x21\n\t"
00339         "adds   x3, x3, x6\n\t"
00340         "adcs   x4, x4, x7\n\t"
00341         "adc    x5, x5, xzr\n\t"
00342         "#  A[2] * B[4]\n\t"
00343         "mul    x6, x10, x20\n\t"
00344         "umulh  x7, x10, x20\n\t"
00345         "adds   x3, x3, x6\n\t"
00346         "adcs   x4, x4, x7\n\t"
00347         "adc    x5, x5, xzr\n\t"
00348         "#  A[3] * B[3]\n\t"
00349         "mul    x6, x11, x19\n\t"
00350         "umulh  x7, x11, x19\n\t"
00351         "adds   x3, x3, x6\n\t"
00352         "adcs   x4, x4, x7\n\t"
00353         "adc    x5, x5, xzr\n\t"
00354         "#  A[4] * B[2]\n\t"
00355         "mul    x6, x12, x18\n\t"
00356         "umulh  x7, x12, x18\n\t"
00357         "adds   x3, x3, x6\n\t"
00358         "adcs   x4, x4, x7\n\t"
00359         "adc    x5, x5, xzr\n\t"
00360         "#  A[5] * B[1]\n\t"
00361         "mul    x6, x13, x17\n\t"
00362         "umulh  x7, x13, x17\n\t"
00363         "adds   x3, x3, x6\n\t"
00364         "adcs   x4, x4, x7\n\t"
00365         "adc    x5, x5, xzr\n\t"
00366         "#  A[6] * B[0]\n\t"
00367         "mul    x6, x14, x16\n\t"
00368         "umulh  x7, x14, x16\n\t"
00369         "adds   x3, x3, x6\n\t"
00370         "adcs   x4, x4, x7\n\t"
00371         "adc    x5, x5, xzr\n\t"
00372         "str    x3, [%[tmp], 48]\n\t"
00373         "#  A[0] * B[7]\n\t"
00374         "mul    x6, x8, x23\n\t"
00375         "umulh  x7, x8, x23\n\t"
00376         "adds   x4, x4, x6\n\t"
00377         "adcs   x5, x5, x7\n\t"
00378         "adc    x3, xzr, xzr\n\t"
00379         "#  A[1] * B[6]\n\t"
00380         "mul    x6, x9, x22\n\t"
00381         "umulh  x7, x9, x22\n\t"
00382         "adds   x4, x4, x6\n\t"
00383         "adcs   x5, x5, x7\n\t"
00384         "adc    x3, x3, xzr\n\t"
00385         "#  A[2] * B[5]\n\t"
00386         "mul    x6, x10, x21\n\t"
00387         "umulh  x7, x10, x21\n\t"
00388         "adds   x4, x4, x6\n\t"
00389         "adcs   x5, x5, x7\n\t"
00390         "adc    x3, x3, xzr\n\t"
00391         "#  A[3] * B[4]\n\t"
00392         "mul    x6, x11, x20\n\t"
00393         "umulh  x7, x11, x20\n\t"
00394         "adds   x4, x4, x6\n\t"
00395         "adcs   x5, x5, x7\n\t"
00396         "adc    x3, x3, xzr\n\t"
00397         "#  A[4] * B[3]\n\t"
00398         "mul    x6, x12, x19\n\t"
00399         "umulh  x7, x12, x19\n\t"
00400         "adds   x4, x4, x6\n\t"
00401         "adcs   x5, x5, x7\n\t"
00402         "adc    x3, x3, xzr\n\t"
00403         "#  A[5] * B[2]\n\t"
00404         "mul    x6, x13, x18\n\t"
00405         "umulh  x7, x13, x18\n\t"
00406         "adds   x4, x4, x6\n\t"
00407         "adcs   x5, x5, x7\n\t"
00408         "adc    x3, x3, xzr\n\t"
00409         "#  A[6] * B[1]\n\t"
00410         "mul    x6, x14, x17\n\t"
00411         "umulh  x7, x14, x17\n\t"
00412         "adds   x4, x4, x6\n\t"
00413         "adcs   x5, x5, x7\n\t"
00414         "adc    x3, x3, xzr\n\t"
00415         "#  A[7] * B[0]\n\t"
00416         "mul    x6, x15, x16\n\t"
00417         "umulh  x7, x15, x16\n\t"
00418         "adds   x4, x4, x6\n\t"
00419         "adcs   x5, x5, x7\n\t"
00420         "adc    x3, x3, xzr\n\t"
00421         "str    x4, [%[tmp], 56]\n\t"
00422         "#  A[1] * B[7]\n\t"
00423         "mul    x6, x9, x23\n\t"
00424         "umulh  x7, x9, x23\n\t"
00425         "adds   x5, x5, x6\n\t"
00426         "adcs   x3, x3, x7\n\t"
00427         "adc    x4, xzr, xzr\n\t"
00428         "#  A[2] * B[6]\n\t"
00429         "mul    x6, x10, x22\n\t"
00430         "umulh  x7, x10, x22\n\t"
00431         "adds   x5, x5, x6\n\t"
00432         "adcs   x3, x3, x7\n\t"
00433         "adc    x4, x4, xzr\n\t"
00434         "#  A[3] * B[5]\n\t"
00435         "mul    x6, x11, x21\n\t"
00436         "umulh  x7, x11, x21\n\t"
00437         "adds   x5, x5, x6\n\t"
00438         "adcs   x3, x3, x7\n\t"
00439         "adc    x4, x4, xzr\n\t"
00440         "#  A[4] * B[4]\n\t"
00441         "mul    x6, x12, x20\n\t"
00442         "umulh  x7, x12, x20\n\t"
00443         "adds   x5, x5, x6\n\t"
00444         "adcs   x3, x3, x7\n\t"
00445         "adc    x4, x4, xzr\n\t"
00446         "#  A[5] * B[3]\n\t"
00447         "mul    x6, x13, x19\n\t"
00448         "umulh  x7, x13, x19\n\t"
00449         "adds   x5, x5, x6\n\t"
00450         "adcs   x3, x3, x7\n\t"
00451         "adc    x4, x4, xzr\n\t"
00452         "#  A[6] * B[2]\n\t"
00453         "mul    x6, x14, x18\n\t"
00454         "umulh  x7, x14, x18\n\t"
00455         "adds   x5, x5, x6\n\t"
00456         "adcs   x3, x3, x7\n\t"
00457         "adc    x4, x4, xzr\n\t"
00458         "#  A[7] * B[1]\n\t"
00459         "mul    x6, x15, x17\n\t"
00460         "umulh  x7, x15, x17\n\t"
00461         "adds   x5, x5, x6\n\t"
00462         "adcs   x3, x3, x7\n\t"
00463         "adc    x4, x4, xzr\n\t"
00464         "str    x5, [%[r], 64]\n\t"
00465         "#  A[2] * B[7]\n\t"
00466         "mul    x6, x10, x23\n\t"
00467         "umulh  x7, x10, x23\n\t"
00468         "adds   x3, x3, x6\n\t"
00469         "adcs   x4, x4, x7\n\t"
00470         "adc    x5, xzr, xzr\n\t"
00471         "#  A[3] * B[6]\n\t"
00472         "mul    x6, x11, x22\n\t"
00473         "umulh  x7, x11, x22\n\t"
00474         "adds   x3, x3, x6\n\t"
00475         "adcs   x4, x4, x7\n\t"
00476         "adc    x5, x5, xzr\n\t"
00477         "#  A[4] * B[5]\n\t"
00478         "mul    x6, x12, x21\n\t"
00479         "umulh  x7, x12, x21\n\t"
00480         "adds   x3, x3, x6\n\t"
00481         "adcs   x4, x4, x7\n\t"
00482         "adc    x5, x5, xzr\n\t"
00483         "#  A[5] * B[4]\n\t"
00484         "mul    x6, x13, x20\n\t"
00485         "umulh  x7, x13, x20\n\t"
00486         "adds   x3, x3, x6\n\t"
00487         "adcs   x4, x4, x7\n\t"
00488         "adc    x5, x5, xzr\n\t"
00489         "#  A[6] * B[3]\n\t"
00490         "mul    x6, x14, x19\n\t"
00491         "umulh  x7, x14, x19\n\t"
00492         "adds   x3, x3, x6\n\t"
00493         "adcs   x4, x4, x7\n\t"
00494         "adc    x5, x5, xzr\n\t"
00495         "#  A[7] * B[2]\n\t"
00496         "mul    x6, x15, x18\n\t"
00497         "umulh  x7, x15, x18\n\t"
00498         "adds   x3, x3, x6\n\t"
00499         "adcs   x4, x4, x7\n\t"
00500         "adc    x5, x5, xzr\n\t"
00501         "str    x3, [%[r], 72]\n\t"
00502         "#  A[3] * B[7]\n\t"
00503         "mul    x6, x11, x23\n\t"
00504         "umulh  x7, x11, x23\n\t"
00505         "adds   x4, x4, x6\n\t"
00506         "adcs   x5, x5, x7\n\t"
00507         "adc    x3, xzr, xzr\n\t"
00508         "#  A[4] * B[6]\n\t"
00509         "mul    x6, x12, x22\n\t"
00510         "umulh  x7, x12, x22\n\t"
00511         "adds   x4, x4, x6\n\t"
00512         "adcs   x5, x5, x7\n\t"
00513         "adc    x3, x3, xzr\n\t"
00514         "#  A[5] * B[5]\n\t"
00515         "mul    x6, x13, x21\n\t"
00516         "umulh  x7, x13, x21\n\t"
00517         "adds   x4, x4, x6\n\t"
00518         "adcs   x5, x5, x7\n\t"
00519         "adc    x3, x3, xzr\n\t"
00520         "#  A[6] * B[4]\n\t"
00521         "mul    x6, x14, x20\n\t"
00522         "umulh  x7, x14, x20\n\t"
00523         "adds   x4, x4, x6\n\t"
00524         "adcs   x5, x5, x7\n\t"
00525         "adc    x3, x3, xzr\n\t"
00526         "#  A[7] * B[3]\n\t"
00527         "mul    x6, x15, x19\n\t"
00528         "umulh  x7, x15, x19\n\t"
00529         "adds   x4, x4, x6\n\t"
00530         "adcs   x5, x5, x7\n\t"
00531         "adc    x3, x3, xzr\n\t"
00532         "str    x4, [%[r], 80]\n\t"
00533         "#  A[4] * B[7]\n\t"
00534         "mul    x6, x12, x23\n\t"
00535         "umulh  x7, x12, x23\n\t"
00536         "adds   x5, x5, x6\n\t"
00537         "adcs   x3, x3, x7\n\t"
00538         "adc    x4, xzr, xzr\n\t"
00539         "#  A[5] * B[6]\n\t"
00540         "mul    x6, x13, x22\n\t"
00541         "umulh  x7, x13, x22\n\t"
00542         "adds   x5, x5, x6\n\t"
00543         "adcs   x3, x3, x7\n\t"
00544         "adc    x4, x4, xzr\n\t"
00545         "#  A[6] * B[5]\n\t"
00546         "mul    x6, x14, x21\n\t"
00547         "umulh  x7, x14, x21\n\t"
00548         "adds   x5, x5, x6\n\t"
00549         "adcs   x3, x3, x7\n\t"
00550         "adc    x4, x4, xzr\n\t"
00551         "#  A[7] * B[4]\n\t"
00552         "mul    x6, x15, x20\n\t"
00553         "umulh  x7, x15, x20\n\t"
00554         "adds   x5, x5, x6\n\t"
00555         "adcs   x3, x3, x7\n\t"
00556         "adc    x4, x4, xzr\n\t"
00557         "str    x5, [%[r], 88]\n\t"
00558         "#  A[5] * B[7]\n\t"
00559         "mul    x6, x13, x23\n\t"
00560         "umulh  x7, x13, x23\n\t"
00561         "adds   x3, x3, x6\n\t"
00562         "adcs   x4, x4, x7\n\t"
00563         "adc    x5, xzr, xzr\n\t"
00564         "#  A[6] * B[6]\n\t"
00565         "mul    x6, x14, x22\n\t"
00566         "umulh  x7, x14, x22\n\t"
00567         "adds   x3, x3, x6\n\t"
00568         "adcs   x4, x4, x7\n\t"
00569         "adc    x5, x5, xzr\n\t"
00570         "#  A[7] * B[5]\n\t"
00571         "mul    x6, x15, x21\n\t"
00572         "umulh  x7, x15, x21\n\t"
00573         "adds   x3, x3, x6\n\t"
00574         "adcs   x4, x4, x7\n\t"
00575         "adc    x5, x5, xzr\n\t"
00576         "str    x3, [%[r], 96]\n\t"
00577         "#  A[6] * B[7]\n\t"
00578         "mul    x6, x14, x23\n\t"
00579         "umulh  x7, x14, x23\n\t"
00580         "adds   x4, x4, x6\n\t"
00581         "adcs   x5, x5, x7\n\t"
00582         "adc    x3, xzr, xzr\n\t"
00583         "#  A[7] * B[6]\n\t"
00584         "mul    x6, x15, x22\n\t"
00585         "umulh  x7, x15, x22\n\t"
00586         "adds   x4, x4, x6\n\t"
00587         "adcs   x5, x5, x7\n\t"
00588         "adc    x3, x3, xzr\n\t"
00589         "str    x4, [%[r], 104]\n\t"
00590         "#  A[7] * B[7]\n\t"
00591         "mul    x6, x15, x23\n\t"
00592         "umulh  x7, x15, x23\n\t"
00593         "adds   x5, x5, x6\n\t"
00594         "adc    x3, x3, x7\n\t"
00595         "stp    x5, x3, [%[r], 112]\n\t"
00596         :
00597         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [tmp] "r" (tmp)
00598         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23"
00599     );
00600 
00601     XMEMCPY(r, tmp, sizeof(tmp));
00602 }
00603 
00604 /* Square a and put result in r. (r = a * a)
00605  *
00606  * r  A single precision integer.
00607  * a  A single precision integer.
00608  */
00609 static void sp_2048_sqr_8(sp_digit* r, const sp_digit* a)
00610 {
00611     sp_digit tmp[8];
00612 
00613     __asm__ __volatile__ (
00614         "ldp    x10, x11, [%[a], 0]\n\t"
00615         "ldp    x12, x13, [%[a], 16]\n\t"
00616         "ldp    x14, x15, [%[a], 32]\n\t"
00617         "ldp    x16, x17, [%[a], 48]\n\t"
00618         "#  A[0] * A[0]\n\t"
00619         "mul    x2, x10, x10\n\t"
00620         "umulh  x3, x10, x10\n\t"
00621         "str    x2, [%[tmp]]\n\t"
00622         "mov    x4, 0\n\t"
00623         "#  A[0] * A[1]\n\t"
00624         "mul    x8, x10, x11\n\t"
00625         "umulh  x9, x10, x11\n\t"
00626         "adds   x3, x3, x8\n\t"
00627         "adcs   x4, x4, x9\n\t"
00628         "adc    x2, xzr, xzr\n\t"
00629         "adds   x3, x3, x8\n\t"
00630         "adcs   x4, x4, x9\n\t"
00631         "adc    x2, x2, xzr\n\t"
00632         "str    x3, [%[tmp], 8]\n\t"
00633         "#  A[0] * A[2]\n\t"
00634         "mul    x8, x10, x12\n\t"
00635         "umulh  x9, x10, x12\n\t"
00636         "adds   x4, x4, x8\n\t"
00637         "adcs   x2, x2, x9\n\t"
00638         "adc    x3, xzr, xzr\n\t"
00639         "adds   x4, x4, x8\n\t"
00640         "adcs   x2, x2, x9\n\t"
00641         "adc    x3, x3, xzr\n\t"
00642         "#  A[1] * A[1]\n\t"
00643         "mul    x8, x11, x11\n\t"
00644         "umulh  x9, x11, x11\n\t"
00645         "adds   x4, x4, x8\n\t"
00646         "adcs   x2, x2, x9\n\t"
00647         "adc    x3, x3, xzr\n\t"
00648         "str    x4, [%[tmp], 16]\n\t"
00649         "#  A[0] * A[3]\n\t"
00650         "mul    x8, x10, x13\n\t"
00651         "umulh  x9, x10, x13\n\t"
00652         "adds   x2, x2, x8\n\t"
00653         "adcs   x3, x3, x9\n\t"
00654         "adc    x4, xzr, xzr\n\t"
00655         "adds   x2, x2, x8\n\t"
00656         "adcs   x3, x3, x9\n\t"
00657         "adc    x4, x4, xzr\n\t"
00658         "#  A[1] * A[2]\n\t"
00659         "mul    x8, x11, x12\n\t"
00660         "umulh  x9, x11, x12\n\t"
00661         "adds   x2, x2, x8\n\t"
00662         "adcs   x3, x3, x9\n\t"
00663         "adc    x4, x4, xzr\n\t"
00664         "adds   x2, x2, x8\n\t"
00665         "adcs   x3, x3, x9\n\t"
00666         "adc    x4, x4, xzr\n\t"
00667         "str    x2, [%[tmp], 24]\n\t"
00668         "#  A[0] * A[4]\n\t"
00669         "mul    x8, x10, x14\n\t"
00670         "umulh  x9, x10, x14\n\t"
00671         "adds   x3, x3, x8\n\t"
00672         "adcs   x4, x4, x9\n\t"
00673         "adc    x2, xzr, xzr\n\t"
00674         "adds   x3, x3, x8\n\t"
00675         "adcs   x4, x4, x9\n\t"
00676         "adc    x2, x2, xzr\n\t"
00677         "#  A[1] * A[3]\n\t"
00678         "mul    x8, x11, x13\n\t"
00679         "umulh  x9, x11, x13\n\t"
00680         "adds   x3, x3, x8\n\t"
00681         "adcs   x4, x4, x9\n\t"
00682         "adc    x2, x2, xzr\n\t"
00683         "adds   x3, x3, x8\n\t"
00684         "adcs   x4, x4, x9\n\t"
00685         "adc    x2, x2, xzr\n\t"
00686         "#  A[2] * A[2]\n\t"
00687         "mul    x8, x12, x12\n\t"
00688         "umulh  x9, x12, x12\n\t"
00689         "adds   x3, x3, x8\n\t"
00690         "adcs   x4, x4, x9\n\t"
00691         "adc    x2, x2, xzr\n\t"
00692         "str    x3, [%[tmp], 32]\n\t"
00693         "#  A[0] * A[5]\n\t"
00694         "mul    x5, x10, x15\n\t"
00695         "umulh  x6, x10, x15\n\t"
00696         "mov    x3, 0\n\t"
00697         "mov    x7, 0\n\t"
00698         "#  A[1] * A[4]\n\t"
00699         "mul    x8, x11, x14\n\t"
00700         "umulh  x9, x11, x14\n\t"
00701         "adds   x5, x5, x8\n\t"
00702         "adcs   x6, x6, x9\n\t"
00703         "adc    x7, x7, xzr\n\t"
00704         "#  A[2] * A[3]\n\t"
00705         "mul    x8, x12, x13\n\t"
00706         "umulh  x9, x12, x13\n\t"
00707         "adds   x5, x5, x8\n\t"
00708         "adcs   x6, x6, x9\n\t"
00709         "adc    x7, x7, xzr\n\t"
00710         "adds   x5, x5, x5\n\t"
00711         "adcs   x6, x6, x6\n\t"
00712         "adc    x7, x7, x7\n\t"
00713         "adds   x4, x4, x5\n\t"
00714         "adcs   x2, x2, x6\n\t"
00715         "adc    x3, x3, x7\n\t"
00716         "str    x4, [%[tmp], 40]\n\t"
00717         "#  A[0] * A[6]\n\t"
00718         "mul    x5, x10, x16\n\t"
00719         "umulh  x6, x10, x16\n\t"
00720         "mov    x4, 0\n\t"
00721         "mov    x7, 0\n\t"
00722         "#  A[1] * A[5]\n\t"
00723         "mul    x8, x11, x15\n\t"
00724         "umulh  x9, x11, x15\n\t"
00725         "adds   x5, x5, x8\n\t"
00726         "adcs   x6, x6, x9\n\t"
00727         "adc    x7, x7, xzr\n\t"
00728         "#  A[2] * A[4]\n\t"
00729         "mul    x8, x12, x14\n\t"
00730         "umulh  x9, x12, x14\n\t"
00731         "adds   x5, x5, x8\n\t"
00732         "adcs   x6, x6, x9\n\t"
00733         "adc    x7, x7, xzr\n\t"
00734         "#  A[3] * A[3]\n\t"
00735         "mul    x8, x13, x13\n\t"
00736         "umulh  x9, x13, x13\n\t"
00737         "adds   x5, x5, x5\n\t"
00738         "adcs   x6, x6, x6\n\t"
00739         "adc    x7, x7, x7\n\t"
00740         "adds   x5, x5, x8\n\t"
00741         "adcs   x6, x6, x9\n\t"
00742         "adc    x7, x7, xzr\n\t"
00743         "adds   x2, x2, x5\n\t"
00744         "adcs   x3, x3, x6\n\t"
00745         "adc    x4, x4, x7\n\t"
00746         "str    x2, [%[tmp], 48]\n\t"
00747         "#  A[0] * A[7]\n\t"
00748         "mul    x5, x10, x17\n\t"
00749         "umulh  x6, x10, x17\n\t"
00750         "mov    x2, 0\n\t"
00751         "mov    x7, 0\n\t"
00752         "#  A[1] * A[6]\n\t"
00753         "mul    x8, x11, x16\n\t"
00754         "umulh  x9, x11, x16\n\t"
00755         "adds   x5, x5, x8\n\t"
00756         "adcs   x6, x6, x9\n\t"
00757         "adc    x7, x7, xzr\n\t"
00758         "#  A[2] * A[5]\n\t"
00759         "mul    x8, x12, x15\n\t"
00760         "umulh  x9, x12, x15\n\t"
00761         "adds   x5, x5, x8\n\t"
00762         "adcs   x6, x6, x9\n\t"
00763         "adc    x7, x7, xzr\n\t"
00764         "#  A[3] * A[4]\n\t"
00765         "mul    x8, x13, x14\n\t"
00766         "umulh  x9, x13, x14\n\t"
00767         "adds   x5, x5, x8\n\t"
00768         "adcs   x6, x6, x9\n\t"
00769         "adc    x7, x7, xzr\n\t"
00770         "adds   x5, x5, x5\n\t"
00771         "adcs   x6, x6, x6\n\t"
00772         "adc    x7, x7, x7\n\t"
00773         "adds   x3, x3, x5\n\t"
00774         "adcs   x4, x4, x6\n\t"
00775         "adc    x2, x2, x7\n\t"
00776         "str    x3, [%[tmp], 56]\n\t"
00777         "#  A[1] * A[7]\n\t"
00778         "mul    x5, x11, x17\n\t"
00779         "umulh  x6, x11, x17\n\t"
00780         "mov    x3, 0\n\t"
00781         "mov    x7, 0\n\t"
00782         "#  A[2] * A[6]\n\t"
00783         "mul    x8, x12, x16\n\t"
00784         "umulh  x9, x12, x16\n\t"
00785         "adds   x5, x5, x8\n\t"
00786         "adcs   x6, x6, x9\n\t"
00787         "adc    x7, x7, xzr\n\t"
00788         "#  A[3] * A[5]\n\t"
00789         "mul    x8, x13, x15\n\t"
00790         "umulh  x9, x13, x15\n\t"
00791         "adds   x5, x5, x8\n\t"
00792         "adcs   x6, x6, x9\n\t"
00793         "adc    x7, x7, xzr\n\t"
00794         "#  A[4] * A[4]\n\t"
00795         "mul    x8, x14, x14\n\t"
00796         "umulh  x9, x14, x14\n\t"
00797         "adds   x5, x5, x5\n\t"
00798         "adcs   x6, x6, x6\n\t"
00799         "adc    x7, x7, x7\n\t"
00800         "adds   x5, x5, x8\n\t"
00801         "adcs   x6, x6, x9\n\t"
00802         "adc    x7, x7, xzr\n\t"
00803         "adds   x4, x4, x5\n\t"
00804         "adcs   x2, x2, x6\n\t"
00805         "adc    x3, x3, x7\n\t"
00806         "str    x4, [%[r], 64]\n\t"
00807         "#  A[2] * A[7]\n\t"
00808         "mul    x5, x12, x17\n\t"
00809         "umulh  x6, x12, x17\n\t"
00810         "mov    x4, 0\n\t"
00811         "mov    x7, 0\n\t"
00812         "#  A[3] * A[6]\n\t"
00813         "mul    x8, x13, x16\n\t"
00814         "umulh  x9, x13, x16\n\t"
00815         "adds   x5, x5, x8\n\t"
00816         "adcs   x6, x6, x9\n\t"
00817         "adc    x7, x7, xzr\n\t"
00818         "#  A[4] * A[5]\n\t"
00819         "mul    x8, x14, x15\n\t"
00820         "umulh  x9, x14, x15\n\t"
00821         "adds   x5, x5, x8\n\t"
00822         "adcs   x6, x6, x9\n\t"
00823         "adc    x7, x7, xzr\n\t"
00824         "adds   x5, x5, x5\n\t"
00825         "adcs   x6, x6, x6\n\t"
00826         "adc    x7, x7, x7\n\t"
00827         "adds   x2, x2, x5\n\t"
00828         "adcs   x3, x3, x6\n\t"
00829         "adc    x4, x4, x7\n\t"
00830         "str    x2, [%[r], 72]\n\t"
00831         "#  A[3] * A[7]\n\t"
00832         "mul    x8, x13, x17\n\t"
00833         "umulh  x9, x13, x17\n\t"
00834         "adds   x3, x3, x8\n\t"
00835         "adcs   x4, x4, x9\n\t"
00836         "adc    x2, xzr, xzr\n\t"
00837         "adds   x3, x3, x8\n\t"
00838         "adcs   x4, x4, x9\n\t"
00839         "adc    x2, x2, xzr\n\t"
00840         "#  A[4] * A[6]\n\t"
00841         "mul    x8, x14, x16\n\t"
00842         "umulh  x9, x14, x16\n\t"
00843         "adds   x3, x3, x8\n\t"
00844         "adcs   x4, x4, x9\n\t"
00845         "adc    x2, x2, xzr\n\t"
00846         "adds   x3, x3, x8\n\t"
00847         "adcs   x4, x4, x9\n\t"
00848         "adc    x2, x2, xzr\n\t"
00849         "#  A[5] * A[5]\n\t"
00850         "mul    x8, x15, x15\n\t"
00851         "umulh  x9, x15, x15\n\t"
00852         "adds   x3, x3, x8\n\t"
00853         "adcs   x4, x4, x9\n\t"
00854         "adc    x2, x2, xzr\n\t"
00855         "str    x3, [%[r], 80]\n\t"
00856         "#  A[4] * A[7]\n\t"
00857         "mul    x8, x14, x17\n\t"
00858         "umulh  x9, x14, x17\n\t"
00859         "adds   x4, x4, x8\n\t"
00860         "adcs   x2, x2, x9\n\t"
00861         "adc    x3, xzr, xzr\n\t"
00862         "adds   x4, x4, x8\n\t"
00863         "adcs   x2, x2, x9\n\t"
00864         "adc    x3, x3, xzr\n\t"
00865         "#  A[5] * A[6]\n\t"
00866         "mul    x8, x15, x16\n\t"
00867         "umulh  x9, x15, x16\n\t"
00868         "adds   x4, x4, x8\n\t"
00869         "adcs   x2, x2, x9\n\t"
00870         "adc    x3, x3, xzr\n\t"
00871         "adds   x4, x4, x8\n\t"
00872         "adcs   x2, x2, x9\n\t"
00873         "adc    x3, x3, xzr\n\t"
00874         "str    x4, [%[r], 88]\n\t"
00875         "#  A[5] * A[7]\n\t"
00876         "mul    x8, x15, x17\n\t"
00877         "umulh  x9, x15, x17\n\t"
00878         "adds   x2, x2, x8\n\t"
00879         "adcs   x3, x3, x9\n\t"
00880         "adc    x4, xzr, xzr\n\t"
00881         "adds   x2, x2, x8\n\t"
00882         "adcs   x3, x3, x9\n\t"
00883         "adc    x4, x4, xzr\n\t"
00884         "#  A[6] * A[6]\n\t"
00885         "mul    x8, x16, x16\n\t"
00886         "umulh  x9, x16, x16\n\t"
00887         "adds   x2, x2, x8\n\t"
00888         "adcs   x3, x3, x9\n\t"
00889         "adc    x4, x4, xzr\n\t"
00890         "str    x2, [%[r], 96]\n\t"
00891         "#  A[6] * A[7]\n\t"
00892         "mul    x8, x16, x17\n\t"
00893         "umulh  x9, x16, x17\n\t"
00894         "adds   x3, x3, x8\n\t"
00895         "adcs   x4, x4, x9\n\t"
00896         "adc    x2, xzr, xzr\n\t"
00897         "adds   x3, x3, x8\n\t"
00898         "adcs   x4, x4, x9\n\t"
00899         "adc    x2, x2, xzr\n\t"
00900         "str    x3, [%[r], 104]\n\t"
00901         "#  A[7] * A[7]\n\t"
00902         "mul    x8, x17, x17\n\t"
00903         "umulh  x9, x17, x17\n\t"
00904         "adds   x4, x4, x8\n\t"
00905         "adc    x2, x2, x9\n\t"
00906         "stp    x4, x2, [%[r], 112]\n\t"
00907         :
00908         : [r] "r" (r), [a] "r" (a), [tmp] "r" (tmp)
00909         : "memory", "x2", "x3", "x4", "x8", "x9", "x10", "x5", "x6", "x7", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17"
00910     );
00911 
00912     XMEMCPY(r, tmp, sizeof(tmp));
00913 }
00914 
00915 /* Add b to a into r. (r = a + b)
00916  *
00917  * r  A single precision integer.
00918  * a  A single precision integer.
00919  * b  A single precision integer.
00920  */
00921 static sp_digit sp_2048_add_8(sp_digit* r, const sp_digit* a,
00922         const sp_digit* b)
00923 {
00924     sp_digit c = 0;
00925 
00926     __asm__ __volatile__ (
00927         "ldp    x3, x4, [%[a], 0]\n\t"
00928         "ldp    x5, x6, [%[a], 16]\n\t"
00929         "ldp    x7, x8, [%[b], 0]\n\t"
00930         "ldp    x9, x10, [%[b], 16]\n\t"
00931         "adds   x3, x3, x7\n\t"
00932         "adcs   x4, x4, x8\n\t"
00933         "adcs   x5, x5, x9\n\t"
00934         "adcs   x6, x6, x10\n\t"
00935         "stp    x3, x4, [%[r], 0]\n\t"
00936         "stp    x5, x6, [%[r], 16]\n\t"
00937         "ldp    x3, x4, [%[a], 32]\n\t"
00938         "ldp    x5, x6, [%[a], 48]\n\t"
00939         "ldp    x7, x8, [%[b], 32]\n\t"
00940         "ldp    x9, x10, [%[b], 48]\n\t"
00941         "adcs   x3, x3, x7\n\t"
00942         "adcs   x4, x4, x8\n\t"
00943         "adcs   x5, x5, x9\n\t"
00944         "adcs   x6, x6, x10\n\t"
00945         "stp    x3, x4, [%[r], 32]\n\t"
00946         "stp    x5, x6, [%[r], 48]\n\t"
00947         "cset   %[c], cs\n\t"
00948         : [c] "+r" (c)
00949         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
00950         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
00951     );
00952 
00953     return c;
00954 }
00955 
00956 /* Sub b from a into a. (a -= b)
00957  *
00958  * a  A single precision integer and result.
00959  * b  A single precision integer.
00960  */
00961 static sp_digit sp_2048_sub_in_place_16(sp_digit* a, const sp_digit* b)
00962 {
00963     sp_digit c = 0;
00964 
00965     __asm__ __volatile__ (
00966         "ldp    x2, x3, [%[a], 0]\n\t"
00967         "ldp    x4, x5, [%[a], 16]\n\t"
00968         "ldp    x6, x7, [%[b], 0]\n\t"
00969         "ldp    x8, x9, [%[b], 16]\n\t"
00970         "subs   x2, x2, x6\n\t"
00971         "sbcs   x3, x3, x7\n\t"
00972         "sbcs   x4, x4, x8\n\t"
00973         "sbcs   x5, x5, x9\n\t"
00974         "stp    x2, x3, [%[a], 0]\n\t"
00975         "stp    x4, x5, [%[a], 16]\n\t"
00976         "ldp    x2, x3, [%[a], 32]\n\t"
00977         "ldp    x4, x5, [%[a], 48]\n\t"
00978         "ldp    x6, x7, [%[b], 32]\n\t"
00979         "ldp    x8, x9, [%[b], 48]\n\t"
00980         "sbcs   x2, x2, x6\n\t"
00981         "sbcs   x3, x3, x7\n\t"
00982         "sbcs   x4, x4, x8\n\t"
00983         "sbcs   x5, x5, x9\n\t"
00984         "stp    x2, x3, [%[a], 32]\n\t"
00985         "stp    x4, x5, [%[a], 48]\n\t"
00986         "ldp    x2, x3, [%[a], 64]\n\t"
00987         "ldp    x4, x5, [%[a], 80]\n\t"
00988         "ldp    x6, x7, [%[b], 64]\n\t"
00989         "ldp    x8, x9, [%[b], 80]\n\t"
00990         "sbcs   x2, x2, x6\n\t"
00991         "sbcs   x3, x3, x7\n\t"
00992         "sbcs   x4, x4, x8\n\t"
00993         "sbcs   x5, x5, x9\n\t"
00994         "stp    x2, x3, [%[a], 64]\n\t"
00995         "stp    x4, x5, [%[a], 80]\n\t"
00996         "ldp    x2, x3, [%[a], 96]\n\t"
00997         "ldp    x4, x5, [%[a], 112]\n\t"
00998         "ldp    x6, x7, [%[b], 96]\n\t"
00999         "ldp    x8, x9, [%[b], 112]\n\t"
01000         "sbcs   x2, x2, x6\n\t"
01001         "sbcs   x3, x3, x7\n\t"
01002         "sbcs   x4, x4, x8\n\t"
01003         "sbcs   x5, x5, x9\n\t"
01004         "stp    x2, x3, [%[a], 96]\n\t"
01005         "stp    x4, x5, [%[a], 112]\n\t"
01006         "csetm  %[c], cc\n\t"
01007         : [c] "+r" (c)
01008         : [a] "r" (a), [b] "r" (b)
01009         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
01010     );
01011 
01012     return c;
01013 }
01014 
01015 /* Add b to a into r. (r = a + b)
01016  *
01017  * r  A single precision integer.
01018  * a  A single precision integer.
01019  * b  A single precision integer.
01020  */
01021 static sp_digit sp_2048_add_16(sp_digit* r, const sp_digit* a,
01022         const sp_digit* b)
01023 {
01024     sp_digit c = 0;
01025 
01026     __asm__ __volatile__ (
01027         "ldp    x3, x4, [%[a], 0]\n\t"
01028         "ldp    x5, x6, [%[a], 16]\n\t"
01029         "ldp    x7, x8, [%[b], 0]\n\t"
01030         "ldp    x9, x10, [%[b], 16]\n\t"
01031         "adds   x3, x3, x7\n\t"
01032         "adcs   x4, x4, x8\n\t"
01033         "adcs   x5, x5, x9\n\t"
01034         "adcs   x6, x6, x10\n\t"
01035         "stp    x3, x4, [%[r], 0]\n\t"
01036         "stp    x5, x6, [%[r], 16]\n\t"
01037         "ldp    x3, x4, [%[a], 32]\n\t"
01038         "ldp    x5, x6, [%[a], 48]\n\t"
01039         "ldp    x7, x8, [%[b], 32]\n\t"
01040         "ldp    x9, x10, [%[b], 48]\n\t"
01041         "adcs   x3, x3, x7\n\t"
01042         "adcs   x4, x4, x8\n\t"
01043         "adcs   x5, x5, x9\n\t"
01044         "adcs   x6, x6, x10\n\t"
01045         "stp    x3, x4, [%[r], 32]\n\t"
01046         "stp    x5, x6, [%[r], 48]\n\t"
01047         "ldp    x3, x4, [%[a], 64]\n\t"
01048         "ldp    x5, x6, [%[a], 80]\n\t"
01049         "ldp    x7, x8, [%[b], 64]\n\t"
01050         "ldp    x9, x10, [%[b], 80]\n\t"
01051         "adcs   x3, x3, x7\n\t"
01052         "adcs   x4, x4, x8\n\t"
01053         "adcs   x5, x5, x9\n\t"
01054         "adcs   x6, x6, x10\n\t"
01055         "stp    x3, x4, [%[r], 64]\n\t"
01056         "stp    x5, x6, [%[r], 80]\n\t"
01057         "ldp    x3, x4, [%[a], 96]\n\t"
01058         "ldp    x5, x6, [%[a], 112]\n\t"
01059         "ldp    x7, x8, [%[b], 96]\n\t"
01060         "ldp    x9, x10, [%[b], 112]\n\t"
01061         "adcs   x3, x3, x7\n\t"
01062         "adcs   x4, x4, x8\n\t"
01063         "adcs   x5, x5, x9\n\t"
01064         "adcs   x6, x6, x10\n\t"
01065         "stp    x3, x4, [%[r], 96]\n\t"
01066         "stp    x5, x6, [%[r], 112]\n\t"
01067         "cset   %[c], cs\n\t"
01068         : [c] "+r" (c)
01069         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
01070         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
01071     );
01072 
01073     return c;
01074 }
01075 
01076 /* AND m into each word of a and store in r.
01077  *
01078  * r  A single precision integer.
01079  * a  A single precision integer.
01080  * m  Mask to AND against each digit.
01081  */
01082 static void sp_2048_mask_8(sp_digit* r, sp_digit* a, sp_digit m)
01083 {
01084 #ifdef WOLFSSL_SP_SMALL
01085     int i;
01086 
01087     for (i=0; i<8; i++)
01088         r[i] = a[i] & m;
01089 #else
01090     r[0] = a[0] & m;
01091     r[1] = a[1] & m;
01092     r[2] = a[2] & m;
01093     r[3] = a[3] & m;
01094     r[4] = a[4] & m;
01095     r[5] = a[5] & m;
01096     r[6] = a[6] & m;
01097     r[7] = a[7] & m;
01098 #endif
01099 }
01100 
01101 /* Multiply a and b into r. (r = a * b)
01102  *
01103  * r  A single precision integer.
01104  * a  A single precision integer.
01105  * b  A single precision integer.
01106  */
01107 static void sp_2048_mul_16(sp_digit* r, const sp_digit* a,
01108         const sp_digit* b)
01109 {
01110     sp_digit* z0 = r;
01111     sp_digit z1[16];
01112     sp_digit a1[8];
01113     sp_digit b1[8];
01114     sp_digit z2[16];
01115     sp_digit u, ca, cb;
01116 
01117     ca = sp_2048_add_8(a1, a, &a[8]);
01118     cb = sp_2048_add_8(b1, b, &b[8]);
01119     u  = ca & cb;
01120     sp_2048_mul_8(z1, a1, b1);
01121     sp_2048_mul_8(z2, &a[8], &b[8]);
01122     sp_2048_mul_8(z0, a, b);
01123     sp_2048_mask_8(r + 16, a1, 0 - cb);
01124     sp_2048_mask_8(b1, b1, 0 - ca);
01125     u += sp_2048_add_8(r + 16, r + 16, b1);
01126     u += sp_2048_sub_in_place_16(z1, z2);
01127     u += sp_2048_sub_in_place_16(z1, z0);
01128     u += sp_2048_add_16(r + 8, r + 8, z1);
01129     r[24] = u;
01130     XMEMSET(r + 24 + 1, 0, sizeof(sp_digit) * (8 - 1));
01131     sp_2048_add_16(r + 16, r + 16, z2);
01132 }
01133 
01134 /* Square a and put result in r. (r = a * a)
01135  *
01136  * r  A single precision integer.
01137  * a  A single precision integer.
01138  */
01139 static void sp_2048_sqr_16(sp_digit* r, const sp_digit* a)
01140 {
01141     sp_digit* z0 = r;
01142     sp_digit z2[16];
01143     sp_digit z1[16];
01144     sp_digit a1[8];
01145     sp_digit u;
01146 
01147     u = sp_2048_add_8(a1, a, &a[8]);
01148     sp_2048_sqr_8(z1, a1);
01149     sp_2048_sqr_8(z2, &a[8]);
01150     sp_2048_sqr_8(z0, a);
01151     sp_2048_mask_8(r + 16, a1, 0 - u);
01152     u += sp_2048_add_8(r + 16, r + 16, r + 16);
01153     u += sp_2048_sub_in_place_16(z1, z2);
01154     u += sp_2048_sub_in_place_16(z1, z0);
01155     u += sp_2048_add_16(r + 8, r + 8, z1);
01156     r[24] = u;
01157     XMEMSET(r + 24 + 1, 0, sizeof(sp_digit) * (8 - 1));
01158     sp_2048_add_16(r + 16, r + 16, z2);
01159 }
01160 
01161 /* Sub b from a into a. (a -= b)
01162  *
01163  * a  A single precision integer and result.
01164  * b  A single precision integer.
01165  */
01166 static sp_digit sp_2048_sub_in_place_32(sp_digit* a, const sp_digit* b)
01167 {
01168     sp_digit c = 0;
01169 
01170     __asm__ __volatile__ (
01171         "ldp    x2, x3, [%[a], 0]\n\t"
01172         "ldp    x4, x5, [%[a], 16]\n\t"
01173         "ldp    x6, x7, [%[b], 0]\n\t"
01174         "ldp    x8, x9, [%[b], 16]\n\t"
01175         "subs   x2, x2, x6\n\t"
01176         "sbcs   x3, x3, x7\n\t"
01177         "sbcs   x4, x4, x8\n\t"
01178         "sbcs   x5, x5, x9\n\t"
01179         "stp    x2, x3, [%[a], 0]\n\t"
01180         "stp    x4, x5, [%[a], 16]\n\t"
01181         "ldp    x2, x3, [%[a], 32]\n\t"
01182         "ldp    x4, x5, [%[a], 48]\n\t"
01183         "ldp    x6, x7, [%[b], 32]\n\t"
01184         "ldp    x8, x9, [%[b], 48]\n\t"
01185         "sbcs   x2, x2, x6\n\t"
01186         "sbcs   x3, x3, x7\n\t"
01187         "sbcs   x4, x4, x8\n\t"
01188         "sbcs   x5, x5, x9\n\t"
01189         "stp    x2, x3, [%[a], 32]\n\t"
01190         "stp    x4, x5, [%[a], 48]\n\t"
01191         "ldp    x2, x3, [%[a], 64]\n\t"
01192         "ldp    x4, x5, [%[a], 80]\n\t"
01193         "ldp    x6, x7, [%[b], 64]\n\t"
01194         "ldp    x8, x9, [%[b], 80]\n\t"
01195         "sbcs   x2, x2, x6\n\t"
01196         "sbcs   x3, x3, x7\n\t"
01197         "sbcs   x4, x4, x8\n\t"
01198         "sbcs   x5, x5, x9\n\t"
01199         "stp    x2, x3, [%[a], 64]\n\t"
01200         "stp    x4, x5, [%[a], 80]\n\t"
01201         "ldp    x2, x3, [%[a], 96]\n\t"
01202         "ldp    x4, x5, [%[a], 112]\n\t"
01203         "ldp    x6, x7, [%[b], 96]\n\t"
01204         "ldp    x8, x9, [%[b], 112]\n\t"
01205         "sbcs   x2, x2, x6\n\t"
01206         "sbcs   x3, x3, x7\n\t"
01207         "sbcs   x4, x4, x8\n\t"
01208         "sbcs   x5, x5, x9\n\t"
01209         "stp    x2, x3, [%[a], 96]\n\t"
01210         "stp    x4, x5, [%[a], 112]\n\t"
01211         "ldp    x2, x3, [%[a], 128]\n\t"
01212         "ldp    x4, x5, [%[a], 144]\n\t"
01213         "ldp    x6, x7, [%[b], 128]\n\t"
01214         "ldp    x8, x9, [%[b], 144]\n\t"
01215         "sbcs   x2, x2, x6\n\t"
01216         "sbcs   x3, x3, x7\n\t"
01217         "sbcs   x4, x4, x8\n\t"
01218         "sbcs   x5, x5, x9\n\t"
01219         "stp    x2, x3, [%[a], 128]\n\t"
01220         "stp    x4, x5, [%[a], 144]\n\t"
01221         "ldp    x2, x3, [%[a], 160]\n\t"
01222         "ldp    x4, x5, [%[a], 176]\n\t"
01223         "ldp    x6, x7, [%[b], 160]\n\t"
01224         "ldp    x8, x9, [%[b], 176]\n\t"
01225         "sbcs   x2, x2, x6\n\t"
01226         "sbcs   x3, x3, x7\n\t"
01227         "sbcs   x4, x4, x8\n\t"
01228         "sbcs   x5, x5, x9\n\t"
01229         "stp    x2, x3, [%[a], 160]\n\t"
01230         "stp    x4, x5, [%[a], 176]\n\t"
01231         "ldp    x2, x3, [%[a], 192]\n\t"
01232         "ldp    x4, x5, [%[a], 208]\n\t"
01233         "ldp    x6, x7, [%[b], 192]\n\t"
01234         "ldp    x8, x9, [%[b], 208]\n\t"
01235         "sbcs   x2, x2, x6\n\t"
01236         "sbcs   x3, x3, x7\n\t"
01237         "sbcs   x4, x4, x8\n\t"
01238         "sbcs   x5, x5, x9\n\t"
01239         "stp    x2, x3, [%[a], 192]\n\t"
01240         "stp    x4, x5, [%[a], 208]\n\t"
01241         "ldp    x2, x3, [%[a], 224]\n\t"
01242         "ldp    x4, x5, [%[a], 240]\n\t"
01243         "ldp    x6, x7, [%[b], 224]\n\t"
01244         "ldp    x8, x9, [%[b], 240]\n\t"
01245         "sbcs   x2, x2, x6\n\t"
01246         "sbcs   x3, x3, x7\n\t"
01247         "sbcs   x4, x4, x8\n\t"
01248         "sbcs   x5, x5, x9\n\t"
01249         "stp    x2, x3, [%[a], 224]\n\t"
01250         "stp    x4, x5, [%[a], 240]\n\t"
01251         "csetm  %[c], cc\n\t"
01252         : [c] "+r" (c)
01253         : [a] "r" (a), [b] "r" (b)
01254         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
01255     );
01256 
01257     return c;
01258 }
01259 
01260 /* Add b to a into r. (r = a + b)
01261  *
01262  * r  A single precision integer.
01263  * a  A single precision integer.
01264  * b  A single precision integer.
01265  */
01266 static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a,
01267         const sp_digit* b)
01268 {
01269     sp_digit c = 0;
01270 
01271     __asm__ __volatile__ (
01272         "ldp    x3, x4, [%[a], 0]\n\t"
01273         "ldp    x5, x6, [%[a], 16]\n\t"
01274         "ldp    x7, x8, [%[b], 0]\n\t"
01275         "ldp    x9, x10, [%[b], 16]\n\t"
01276         "adds   x3, x3, x7\n\t"
01277         "adcs   x4, x4, x8\n\t"
01278         "adcs   x5, x5, x9\n\t"
01279         "adcs   x6, x6, x10\n\t"
01280         "stp    x3, x4, [%[r], 0]\n\t"
01281         "stp    x5, x6, [%[r], 16]\n\t"
01282         "ldp    x3, x4, [%[a], 32]\n\t"
01283         "ldp    x5, x6, [%[a], 48]\n\t"
01284         "ldp    x7, x8, [%[b], 32]\n\t"
01285         "ldp    x9, x10, [%[b], 48]\n\t"
01286         "adcs   x3, x3, x7\n\t"
01287         "adcs   x4, x4, x8\n\t"
01288         "adcs   x5, x5, x9\n\t"
01289         "adcs   x6, x6, x10\n\t"
01290         "stp    x3, x4, [%[r], 32]\n\t"
01291         "stp    x5, x6, [%[r], 48]\n\t"
01292         "ldp    x3, x4, [%[a], 64]\n\t"
01293         "ldp    x5, x6, [%[a], 80]\n\t"
01294         "ldp    x7, x8, [%[b], 64]\n\t"
01295         "ldp    x9, x10, [%[b], 80]\n\t"
01296         "adcs   x3, x3, x7\n\t"
01297         "adcs   x4, x4, x8\n\t"
01298         "adcs   x5, x5, x9\n\t"
01299         "adcs   x6, x6, x10\n\t"
01300         "stp    x3, x4, [%[r], 64]\n\t"
01301         "stp    x5, x6, [%[r], 80]\n\t"
01302         "ldp    x3, x4, [%[a], 96]\n\t"
01303         "ldp    x5, x6, [%[a], 112]\n\t"
01304         "ldp    x7, x8, [%[b], 96]\n\t"
01305         "ldp    x9, x10, [%[b], 112]\n\t"
01306         "adcs   x3, x3, x7\n\t"
01307         "adcs   x4, x4, x8\n\t"
01308         "adcs   x5, x5, x9\n\t"
01309         "adcs   x6, x6, x10\n\t"
01310         "stp    x3, x4, [%[r], 96]\n\t"
01311         "stp    x5, x6, [%[r], 112]\n\t"
01312         "ldp    x3, x4, [%[a], 128]\n\t"
01313         "ldp    x5, x6, [%[a], 144]\n\t"
01314         "ldp    x7, x8, [%[b], 128]\n\t"
01315         "ldp    x9, x10, [%[b], 144]\n\t"
01316         "adcs   x3, x3, x7\n\t"
01317         "adcs   x4, x4, x8\n\t"
01318         "adcs   x5, x5, x9\n\t"
01319         "adcs   x6, x6, x10\n\t"
01320         "stp    x3, x4, [%[r], 128]\n\t"
01321         "stp    x5, x6, [%[r], 144]\n\t"
01322         "ldp    x3, x4, [%[a], 160]\n\t"
01323         "ldp    x5, x6, [%[a], 176]\n\t"
01324         "ldp    x7, x8, [%[b], 160]\n\t"
01325         "ldp    x9, x10, [%[b], 176]\n\t"
01326         "adcs   x3, x3, x7\n\t"
01327         "adcs   x4, x4, x8\n\t"
01328         "adcs   x5, x5, x9\n\t"
01329         "adcs   x6, x6, x10\n\t"
01330         "stp    x3, x4, [%[r], 160]\n\t"
01331         "stp    x5, x6, [%[r], 176]\n\t"
01332         "ldp    x3, x4, [%[a], 192]\n\t"
01333         "ldp    x5, x6, [%[a], 208]\n\t"
01334         "ldp    x7, x8, [%[b], 192]\n\t"
01335         "ldp    x9, x10, [%[b], 208]\n\t"
01336         "adcs   x3, x3, x7\n\t"
01337         "adcs   x4, x4, x8\n\t"
01338         "adcs   x5, x5, x9\n\t"
01339         "adcs   x6, x6, x10\n\t"
01340         "stp    x3, x4, [%[r], 192]\n\t"
01341         "stp    x5, x6, [%[r], 208]\n\t"
01342         "ldp    x3, x4, [%[a], 224]\n\t"
01343         "ldp    x5, x6, [%[a], 240]\n\t"
01344         "ldp    x7, x8, [%[b], 224]\n\t"
01345         "ldp    x9, x10, [%[b], 240]\n\t"
01346         "adcs   x3, x3, x7\n\t"
01347         "adcs   x4, x4, x8\n\t"
01348         "adcs   x5, x5, x9\n\t"
01349         "adcs   x6, x6, x10\n\t"
01350         "stp    x3, x4, [%[r], 224]\n\t"
01351         "stp    x5, x6, [%[r], 240]\n\t"
01352         "cset   %[c], cs\n\t"
01353         : [c] "+r" (c)
01354         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
01355         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
01356     );
01357 
01358     return c;
01359 }
01360 
01361 /* AND m into each word of a and store in r.
01362  *
01363  * r  A single precision integer.
01364  * a  A single precision integer.
01365  * m  Mask to AND against each digit.
01366  */
01367 static void sp_2048_mask_16(sp_digit* r, sp_digit* a, sp_digit m)
01368 {
01369 #ifdef WOLFSSL_SP_SMALL
01370     int i;
01371 
01372     for (i=0; i<16; i++)
01373         r[i] = a[i] & m;
01374 #else
01375     int i;
01376 
01377     for (i = 0; i < 16; i += 8) {
01378         r[i+0] = a[i+0] & m;
01379         r[i+1] = a[i+1] & m;
01380         r[i+2] = a[i+2] & m;
01381         r[i+3] = a[i+3] & m;
01382         r[i+4] = a[i+4] & m;
01383         r[i+5] = a[i+5] & m;
01384         r[i+6] = a[i+6] & m;
01385         r[i+7] = a[i+7] & m;
01386     }
01387 #endif
01388 }
01389 
01390 /* Multiply a and b into r. (r = a * b)
01391  *
01392  * r  A single precision integer.
01393  * a  A single precision integer.
01394  * b  A single precision integer.
01395  */
01396 static void sp_2048_mul_32(sp_digit* r, const sp_digit* a,
01397         const sp_digit* b)
01398 {
01399     sp_digit* z0 = r;
01400     sp_digit z1[32];
01401     sp_digit a1[16];
01402     sp_digit b1[16];
01403     sp_digit z2[32];
01404     sp_digit u, ca, cb;
01405 
01406     ca = sp_2048_add_16(a1, a, &a[16]);
01407     cb = sp_2048_add_16(b1, b, &b[16]);
01408     u  = ca & cb;
01409     sp_2048_mul_16(z1, a1, b1);
01410     sp_2048_mul_16(z2, &a[16], &b[16]);
01411     sp_2048_mul_16(z0, a, b);
01412     sp_2048_mask_16(r + 32, a1, 0 - cb);
01413     sp_2048_mask_16(b1, b1, 0 - ca);
01414     u += sp_2048_add_16(r + 32, r + 32, b1);
01415     u += sp_2048_sub_in_place_32(z1, z2);
01416     u += sp_2048_sub_in_place_32(z1, z0);
01417     u += sp_2048_add_32(r + 16, r + 16, z1);
01418     r[48] = u;
01419     XMEMSET(r + 48 + 1, 0, sizeof(sp_digit) * (16 - 1));
01420     sp_2048_add_32(r + 32, r + 32, z2);
01421 }
01422 
01423 /* Square a and put result in r. (r = a * a)
01424  *
01425  * r  A single precision integer.
01426  * a  A single precision integer.
01427  */
01428 static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a)
01429 {
01430     sp_digit* z0 = r;
01431     sp_digit z2[32];
01432     sp_digit z1[32];
01433     sp_digit a1[16];
01434     sp_digit u;
01435 
01436     u = sp_2048_add_16(a1, a, &a[16]);
01437     sp_2048_sqr_16(z1, a1);
01438     sp_2048_sqr_16(z2, &a[16]);
01439     sp_2048_sqr_16(z0, a);
01440     sp_2048_mask_16(r + 32, a1, 0 - u);
01441     u += sp_2048_add_16(r + 32, r + 32, r + 32);
01442     u += sp_2048_sub_in_place_32(z1, z2);
01443     u += sp_2048_sub_in_place_32(z1, z0);
01444     u += sp_2048_add_32(r + 16, r + 16, z1);
01445     r[48] = u;
01446     XMEMSET(r + 48 + 1, 0, sizeof(sp_digit) * (16 - 1));
01447     sp_2048_add_32(r + 32, r + 32, z2);
01448 }
01449 
01450 #endif /* WOLFSSL_SP_SMALL */
01451 #ifdef WOLFSSL_SP_SMALL
01452 /* Add b to a into r. (r = a + b)
01453  *
01454  * r  A single precision integer.
01455  * a  A single precision integer.
01456  * b  A single precision integer.
01457  */
01458 static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a,
01459         const sp_digit* b)
01460 {
01461     sp_digit c = 0;
01462 
01463     __asm__ __volatile__ (
01464         "add    x11, %[a], 256\n\t"
01465         "\n1:\n\t"
01466         "adds   %[c], %[c], #-1\n\t"
01467         "ldp    x3, x4, [%[a]], #16\n\t"
01468         "ldp    x5, x6, [%[a]], #16\n\t"
01469         "ldp    x7, x8, [%[b]], #16\n\t"
01470         "ldp    x9, x10, [%[b]], #16\n\t"
01471         "adcs   x3, x3, x7\n\t"
01472         "adcs   x4, x4, x8\n\t"
01473         "adcs   x5, x5, x9\n\t"
01474         "adcs   x6, x6, x10\n\t"
01475         "stp    x3, x4, [%[r]], #16\n\t"
01476         "stp    x5, x6, [%[r]], #16\n\t"
01477         "cset   %[c], cs\n\t"
01478         "cmp    %[a], x11\n\t"
01479         "b.ne   1b\n\t"
01480         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
01481         :
01482         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
01483     );
01484 
01485     return c;
01486 }
01487 
01488 #endif /* WOLFSSL_SP_SMALL */
01489 #ifdef WOLFSSL_SP_SMALL
01490 /* Sub b from a into a. (a -= b)
01491  *
01492  * a  A single precision integer.
01493  * b  A single precision integer.
01494  */
01495 static sp_digit sp_2048_sub_in_place_32(sp_digit* a, const sp_digit* b)
01496 {
01497     sp_digit c = 0;
01498 
01499     __asm__ __volatile__ (
01500         "add    x10, %[a], 256\n\t"
01501         "\n1:\n\t"
01502         "subs   %[c], xzr, %[c]\n\t"
01503         "ldp    x2, x3, [%[a]]\n\t"
01504         "ldp    x4, x5, [%[a], #16]\n\t"
01505         "ldp    x6, x7, [%[b]], #16\n\t"
01506         "ldp    x8, x9, [%[b]], #16\n\t"
01507         "sbcs   x2, x2, x6\n\t"
01508         "sbcs   x3, x3, x7\n\t"
01509         "sbcs   x4, x4, x8\n\t"
01510         "sbcs   x5, x5, x9\n\t"
01511         "stp    x2, x3, [%[a]], #16\n\t"
01512         "stp    x4, x5, [%[a]], #16\n\t"
01513         "csetm  %[c], cc\n\t"
01514         "cmp    %[a], x10\n\t"
01515         "b.ne   1b\n\t"
01516         : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b)
01517         :
01518         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
01519     );
01520 
01521     return c;
01522 }
01523 
01524 #endif /* WOLFSSL_SP_SMALL */
01525 #ifdef WOLFSSL_SP_SMALL
01526 /* Multiply a and b into r. (r = a * b)
01527  *
01528  * r  A single precision integer.
01529  * a  A single precision integer.
01530  * b  A single precision integer.
01531  */
01532 static void sp_2048_mul_32(sp_digit* r, const sp_digit* a, const sp_digit* b)
01533 {
01534     sp_digit tmp[64];
01535 
01536     __asm__ __volatile__ (
01537         "mov    x5, 0\n\t"
01538         "mov    x6, 0\n\t"
01539         "mov    x7, 0\n\t"
01540         "mov    x8, 0\n\t"
01541         "\n1:\n\t"
01542         "subs   x3, x5, 248\n\t"
01543         "csel   x3, xzr, x3, cc\n\t"
01544         "sub    x4, x5, x3\n\t"
01545         "\n2:\n\t"
01546         "ldr    x10, [%[a], x3]\n\t"
01547         "ldr    x11, [%[b], x4]\n\t"
01548         "mul    x9, x10, x11\n\t"
01549         "umulh  x10, x10, x11\n\t"
01550         "adds   x6, x6, x9\n\t"
01551         "adcs   x7, x7, x10\n\t"
01552         "adc    x8, x8, xzr\n\t"
01553         "add    x3, x3, #8\n\t"
01554         "sub    x4, x4, #8\n\t"
01555         "cmp    x3, 256\n\t"
01556         "b.eq   3f\n\t"
01557         "cmp    x3, x5\n\t"
01558         "b.le   2b\n\t"
01559         "\n3:\n\t"
01560         "str    x6, [%[r], x5]\n\t"
01561         "mov    x6, x7\n\t"
01562         "mov    x7, x8\n\t"
01563         "mov    x8, #0\n\t"
01564         "add    x5, x5, #8\n\t"
01565         "cmp    x5, 496\n\t"
01566         "b.le   1b\n\t"
01567         "str    x6, [%[r], x5]\n\t"
01568         :
01569         : [r] "r" (tmp), [a] "r" (a), [b] "r" (b)
01570         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
01571     );
01572 
01573     XMEMCPY(r, tmp, sizeof(tmp));
01574 }
01575 
01576 /* Square a and put result in r. (r = a * a)
01577  *
01578  * r  A single precision integer.
01579  * a  A single precision integer.
01580  */
01581 static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a)
01582 {
01583     sp_digit tmp[64];
01584 
01585     __asm__ __volatile__ (
01586         "mov    x6, 0\n\t"
01587         "mov    x7, 0\n\t"
01588         "mov    x8, 0\n\t"
01589         "mov    x5, 0\n\t"
01590         "\n1:\n\t"
01591         "subs   x3, x5, 248\n\t"
01592         "csel   x3, xzr, x3, cc\n\t"
01593         "sub    x4, x5, x3\n\t"
01594         "\n2:\n\t"
01595         "cmp    x4, x3\n\t"
01596         "b.eq   4f\n\t"
01597         "ldr    x10, [%[a], x3]\n\t"
01598         "ldr    x11, [%[a], x4]\n\t"
01599         "mul    x9, x10, x11\n\t"
01600         "umulh  x10, x10, x11\n\t"
01601         "adds   x6, x6, x9\n\t"
01602         "adcs   x7, x7, x10\n\t"
01603         "adc    x8, x8, xzr\n\t"
01604         "adds   x6, x6, x9\n\t"
01605         "adcs   x7, x7, x10\n\t"
01606         "adc    x8, x8, xzr\n\t"
01607         "b.al   5f\n\t"
01608         "\n4:\n\t"
01609         "ldr    x10, [%[a], x3]\n\t"
01610         "mul    x9, x10, x10\n\t"
01611         "umulh  x10, x10, x10\n\t"
01612         "adds   x6, x6, x9\n\t"
01613         "adcs   x7, x7, x10\n\t"
01614         "adc    x8, x8, xzr\n\t"
01615         "\n5:\n\t"
01616         "add    x3, x3, #8\n\t"
01617         "sub    x4, x4, #8\n\t"
01618         "cmp    x3, 256\n\t"
01619         "b.eq   3f\n\t"
01620         "cmp    x3, x4\n\t"
01621         "b.gt   3f\n\t"
01622         "cmp    x3, x5\n\t"
01623         "b.le   2b\n\t"
01624         "\n3:\n\t"
01625         "str    x6, [%[r], x5]\n\t"
01626         "mov    x6, x7\n\t"
01627         "mov    x7, x8\n\t"
01628         "mov    x8, #0\n\t"
01629         "add    x5, x5, #8\n\t"
01630         "cmp    x5, 496\n\t"
01631         "b.le   1b\n\t"
01632         "str    x6, [%[r], x5]\n\t"
01633         :
01634         : [r] "r" (tmp), [a] "r" (a)
01635         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
01636     );
01637 
01638     XMEMCPY(r, tmp, sizeof(tmp));
01639 }
01640 
01641 #endif /* WOLFSSL_SP_SMALL */
01642 #if !defined(SP_RSA_PRIVATE_EXP_D) && defined(WOLFSSL_HAVE_SP_RSA)
01643 #ifdef WOLFSSL_SP_SMALL
01644 /* AND m into each word of a and store in r.
01645  *
01646  * r  A single precision integer.
01647  * a  A single precision integer.
01648  * m  Mask to AND against each digit.
01649  */
01650 static void sp_2048_mask_16(sp_digit* r, sp_digit* a, sp_digit m)
01651 {
01652     int i;
01653 
01654     for (i=0; i<16; i++)
01655         r[i] = a[i] & m;
01656 }
01657 
01658 #endif /* WOLFSSL_SP_SMALL */
01659 #ifdef WOLFSSL_SP_SMALL
01660 /* Add b to a into r. (r = a + b)
01661  *
01662  * r  A single precision integer.
01663  * a  A single precision integer.
01664  * b  A single precision integer.
01665  */
01666 static sp_digit sp_2048_add_16(sp_digit* r, const sp_digit* a,
01667         const sp_digit* b)
01668 {
01669     sp_digit c = 0;
01670 
01671     __asm__ __volatile__ (
01672         "add    x11, %[a], 128\n\t"
01673         "\n1:\n\t"
01674         "adds   %[c], %[c], #-1\n\t"
01675         "ldp    x3, x4, [%[a]], #16\n\t"
01676         "ldp    x5, x6, [%[a]], #16\n\t"
01677         "ldp    x7, x8, [%[b]], #16\n\t"
01678         "ldp    x9, x10, [%[b]], #16\n\t"
01679         "adcs   x3, x3, x7\n\t"
01680         "adcs   x4, x4, x8\n\t"
01681         "adcs   x5, x5, x9\n\t"
01682         "adcs   x6, x6, x10\n\t"
01683         "stp    x3, x4, [%[r]], #16\n\t"
01684         "stp    x5, x6, [%[r]], #16\n\t"
01685         "cset   %[c], cs\n\t"
01686         "cmp    %[a], x11\n\t"
01687         "b.ne   1b\n\t"
01688         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
01689         :
01690         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
01691     );
01692 
01693     return c;
01694 }
01695 
01696 #endif /* WOLFSSL_SP_SMALL */
01697 #ifdef WOLFSSL_SP_SMALL
01698 /* Sub b from a into a. (a -= b)
01699  *
01700  * a  A single precision integer.
01701  * b  A single precision integer.
01702  */
01703 static sp_digit sp_2048_sub_in_place_16(sp_digit* a, const sp_digit* b)
01704 {
01705     sp_digit c = 0;
01706 
01707     __asm__ __volatile__ (
01708         "add    x10, %[a], 128\n\t"
01709         "\n1:\n\t"
01710         "subs   %[c], xzr, %[c]\n\t"
01711         "ldp    x2, x3, [%[a]]\n\t"
01712         "ldp    x4, x5, [%[a], #16]\n\t"
01713         "ldp    x6, x7, [%[b]], #16\n\t"
01714         "ldp    x8, x9, [%[b]], #16\n\t"
01715         "sbcs   x2, x2, x6\n\t"
01716         "sbcs   x3, x3, x7\n\t"
01717         "sbcs   x4, x4, x8\n\t"
01718         "sbcs   x5, x5, x9\n\t"
01719         "stp    x2, x3, [%[a]], #16\n\t"
01720         "stp    x4, x5, [%[a]], #16\n\t"
01721         "csetm  %[c], cc\n\t"
01722         "cmp    %[a], x10\n\t"
01723         "b.ne   1b\n\t"
01724         : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b)
01725         :
01726         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
01727     );
01728 
01729     return c;
01730 }
01731 
01732 #endif /* WOLFSSL_SP_SMALL */
01733 #ifdef WOLFSSL_SP_SMALL
01734 /* Multiply a and b into r. (r = a * b)
01735  *
01736  * r  A single precision integer.
01737  * a  A single precision integer.
01738  * b  A single precision integer.
01739  */
01740 static void sp_2048_mul_16(sp_digit* r, const sp_digit* a, const sp_digit* b)
01741 {
01742     sp_digit tmp[32];
01743 
01744     __asm__ __volatile__ (
01745         "mov    x5, 0\n\t"
01746         "mov    x6, 0\n\t"
01747         "mov    x7, 0\n\t"
01748         "mov    x8, 0\n\t"
01749         "\n1:\n\t"
01750         "subs   x3, x5, 120\n\t"
01751         "csel   x3, xzr, x3, cc\n\t"
01752         "sub    x4, x5, x3\n\t"
01753         "\n2:\n\t"
01754         "ldr    x10, [%[a], x3]\n\t"
01755         "ldr    x11, [%[b], x4]\n\t"
01756         "mul    x9, x10, x11\n\t"
01757         "umulh  x10, x10, x11\n\t"
01758         "adds   x6, x6, x9\n\t"
01759         "adcs   x7, x7, x10\n\t"
01760         "adc    x8, x8, xzr\n\t"
01761         "add    x3, x3, #8\n\t"
01762         "sub    x4, x4, #8\n\t"
01763         "cmp    x3, 128\n\t"
01764         "b.eq   3f\n\t"
01765         "cmp    x3, x5\n\t"
01766         "b.le   2b\n\t"
01767         "\n3:\n\t"
01768         "str    x6, [%[r], x5]\n\t"
01769         "mov    x6, x7\n\t"
01770         "mov    x7, x8\n\t"
01771         "mov    x8, #0\n\t"
01772         "add    x5, x5, #8\n\t"
01773         "cmp    x5, 240\n\t"
01774         "b.le   1b\n\t"
01775         "str    x6, [%[r], x5]\n\t"
01776         :
01777         : [r] "r" (tmp), [a] "r" (a), [b] "r" (b)
01778         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
01779     );
01780 
01781     XMEMCPY(r, tmp, sizeof(tmp));
01782 }
01783 
01784 /* Square a and put result in r. (r = a * a)
01785  *
01786  * r  A single precision integer.
01787  * a  A single precision integer.
01788  */
01789 static void sp_2048_sqr_16(sp_digit* r, const sp_digit* a)
01790 {
01791     sp_digit tmp[32];
01792 
01793     __asm__ __volatile__ (
01794         "mov    x6, 0\n\t"
01795         "mov    x7, 0\n\t"
01796         "mov    x8, 0\n\t"
01797         "mov    x5, 0\n\t"
01798         "\n1:\n\t"
01799         "subs   x3, x5, 120\n\t"
01800         "csel   x3, xzr, x3, cc\n\t"
01801         "sub    x4, x5, x3\n\t"
01802         "\n2:\n\t"
01803         "cmp    x4, x3\n\t"
01804         "b.eq   4f\n\t"
01805         "ldr    x10, [%[a], x3]\n\t"
01806         "ldr    x11, [%[a], x4]\n\t"
01807         "mul    x9, x10, x11\n\t"
01808         "umulh  x10, x10, x11\n\t"
01809         "adds   x6, x6, x9\n\t"
01810         "adcs   x7, x7, x10\n\t"
01811         "adc    x8, x8, xzr\n\t"
01812         "adds   x6, x6, x9\n\t"
01813         "adcs   x7, x7, x10\n\t"
01814         "adc    x8, x8, xzr\n\t"
01815         "b.al   5f\n\t"
01816         "\n4:\n\t"
01817         "ldr    x10, [%[a], x3]\n\t"
01818         "mul    x9, x10, x10\n\t"
01819         "umulh  x10, x10, x10\n\t"
01820         "adds   x6, x6, x9\n\t"
01821         "adcs   x7, x7, x10\n\t"
01822         "adc    x8, x8, xzr\n\t"
01823         "\n5:\n\t"
01824         "add    x3, x3, #8\n\t"
01825         "sub    x4, x4, #8\n\t"
01826         "cmp    x3, 128\n\t"
01827         "b.eq   3f\n\t"
01828         "cmp    x3, x4\n\t"
01829         "b.gt   3f\n\t"
01830         "cmp    x3, x5\n\t"
01831         "b.le   2b\n\t"
01832         "\n3:\n\t"
01833         "str    x6, [%[r], x5]\n\t"
01834         "mov    x6, x7\n\t"
01835         "mov    x7, x8\n\t"
01836         "mov    x8, #0\n\t"
01837         "add    x5, x5, #8\n\t"
01838         "cmp    x5, 240\n\t"
01839         "b.le   1b\n\t"
01840         "str    x6, [%[r], x5]\n\t"
01841         :
01842         : [r] "r" (tmp), [a] "r" (a)
01843         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
01844     );
01845 
01846     XMEMCPY(r, tmp, sizeof(tmp));
01847 }
01848 
01849 #endif /* WOLFSSL_SP_SMALL */
01850 #endif /* !SP_RSA_PRIVATE_EXP_D && WOLFSSL_HAVE_SP_RSA */
01851 
01852 /* Caclulate the bottom digit of -1/a mod 2^n.
01853  *
01854  * a    A single precision number.
01855  * rho  Bottom word of inverse.
01856  */
01857 static void sp_2048_mont_setup(sp_digit* a, sp_digit* rho)
01858 {
01859     sp_digit x, b;
01860 
01861     b = a[0];
01862     x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
01863     x *= 2 - b * x;               /* here x*a==1 mod 2**8 */
01864     x *= 2 - b * x;               /* here x*a==1 mod 2**16 */
01865     x *= 2 - b * x;               /* here x*a==1 mod 2**32 */
01866     x *= 2 - b * x;               /* here x*a==1 mod 2**64 */
01867 
01868     /* rho = -1/m mod b */
01869     *rho = -x;
01870 }
01871 
01872 #if !defined(SP_RSA_PRIVATE_EXP_D) && defined(WOLFSSL_HAVE_SP_RSA)
01873 /* r = 2^n mod m where n is the number of bits to reduce by.
01874  * Given m must be 2048 bits, just need to subtract.
01875  *
01876  * r  A single precision number.
01877  * m  A signle precision number.
01878  */
01879 static void sp_2048_mont_norm_16(sp_digit* r, sp_digit* m)
01880 {
01881     XMEMSET(r, 0, sizeof(sp_digit) * 16);
01882 
01883     /* r = 2^n mod m */
01884     sp_2048_sub_in_place_16(r, m);
01885 }
01886 
01887 /* Conditionally subtract b from a using the mask m.
01888  * m is -1 to subtract and 0 when not copying.
01889  *
01890  * r  A single precision number representing condition subtract result.
01891  * a  A single precision number to subtract from.
01892  * b  A single precision number to subtract.
01893  * m  Mask value to apply.
01894  */
01895 static sp_digit sp_2048_cond_sub_16(sp_digit* r, sp_digit* a, sp_digit* b,
01896         sp_digit m)
01897 {
01898     sp_digit c = 0;
01899 
01900 #ifdef WOLFSSL_SP_SMALL
01901     __asm__ __volatile__ (
01902         "mov    x8, #0\n\t"
01903         "1:\n\t"
01904         "subs   %[c], xzr, %[c]\n\t"
01905         "ldr    x4, [%[a], x8]\n\t"
01906         "ldr    x5, [%[b], x8]\n\t"
01907         "and    x5, x5, %[m]\n\t"
01908         "sbcs   x4, x4, x5\n\t"
01909         "csetm  %[c], cc\n\t"
01910         "str    x4, [%[r], x8]\n\t"
01911         "add    x8, x8, #8\n\t"
01912         "cmp    x8, 128\n\t"
01913         "b.lt   1b\n\t"
01914         : [c] "+r" (c)
01915         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
01916         : "memory", "x4", "x6", "x5", "x7", "x8"
01917     );
01918 #else
01919     __asm__ __volatile__ (
01920 
01921         "ldr        x4, [%[a], 0]\n\t"
01922         "ldr        x6, [%[a], 8]\n\t"
01923         "ldr        x5, [%[b], 0]\n\t"
01924         "ldr        x7, [%[b], 8]\n\t"
01925         "and        x5, x5, %[m]\n\t"
01926         "and        x7, x7, %[m]\n\t"
01927         "subs   x4, x4, x5\n\t"
01928         "sbcs   x6, x6, x7\n\t"
01929         "str        x4, [%[r], 0]\n\t"
01930         "str        x6, [%[r], 8]\n\t"
01931         "ldr        x4, [%[a], 16]\n\t"
01932         "ldr        x6, [%[a], 24]\n\t"
01933         "ldr        x5, [%[b], 16]\n\t"
01934         "ldr        x7, [%[b], 24]\n\t"
01935         "and        x5, x5, %[m]\n\t"
01936         "and        x7, x7, %[m]\n\t"
01937         "sbcs   x4, x4, x5\n\t"
01938         "sbcs   x6, x6, x7\n\t"
01939         "str        x4, [%[r], 16]\n\t"
01940         "str        x6, [%[r], 24]\n\t"
01941         "ldr        x4, [%[a], 32]\n\t"
01942         "ldr        x6, [%[a], 40]\n\t"
01943         "ldr        x5, [%[b], 32]\n\t"
01944         "ldr        x7, [%[b], 40]\n\t"
01945         "and        x5, x5, %[m]\n\t"
01946         "and        x7, x7, %[m]\n\t"
01947         "sbcs   x4, x4, x5\n\t"
01948         "sbcs   x6, x6, x7\n\t"
01949         "str        x4, [%[r], 32]\n\t"
01950         "str        x6, [%[r], 40]\n\t"
01951         "ldr        x4, [%[a], 48]\n\t"
01952         "ldr        x6, [%[a], 56]\n\t"
01953         "ldr        x5, [%[b], 48]\n\t"
01954         "ldr        x7, [%[b], 56]\n\t"
01955         "and        x5, x5, %[m]\n\t"
01956         "and        x7, x7, %[m]\n\t"
01957         "sbcs   x4, x4, x5\n\t"
01958         "sbcs   x6, x6, x7\n\t"
01959         "str        x4, [%[r], 48]\n\t"
01960         "str        x6, [%[r], 56]\n\t"
01961         "ldr        x4, [%[a], 64]\n\t"
01962         "ldr        x6, [%[a], 72]\n\t"
01963         "ldr        x5, [%[b], 64]\n\t"
01964         "ldr        x7, [%[b], 72]\n\t"
01965         "and        x5, x5, %[m]\n\t"
01966         "and        x7, x7, %[m]\n\t"
01967         "sbcs   x4, x4, x5\n\t"
01968         "sbcs   x6, x6, x7\n\t"
01969         "str        x4, [%[r], 64]\n\t"
01970         "str        x6, [%[r], 72]\n\t"
01971         "ldr        x4, [%[a], 80]\n\t"
01972         "ldr        x6, [%[a], 88]\n\t"
01973         "ldr        x5, [%[b], 80]\n\t"
01974         "ldr        x7, [%[b], 88]\n\t"
01975         "and        x5, x5, %[m]\n\t"
01976         "and        x7, x7, %[m]\n\t"
01977         "sbcs   x4, x4, x5\n\t"
01978         "sbcs   x6, x6, x7\n\t"
01979         "str        x4, [%[r], 80]\n\t"
01980         "str        x6, [%[r], 88]\n\t"
01981         "ldr        x4, [%[a], 96]\n\t"
01982         "ldr        x6, [%[a], 104]\n\t"
01983         "ldr        x5, [%[b], 96]\n\t"
01984         "ldr        x7, [%[b], 104]\n\t"
01985         "and        x5, x5, %[m]\n\t"
01986         "and        x7, x7, %[m]\n\t"
01987         "sbcs   x4, x4, x5\n\t"
01988         "sbcs   x6, x6, x7\n\t"
01989         "str        x4, [%[r], 96]\n\t"
01990         "str        x6, [%[r], 104]\n\t"
01991         "ldr        x4, [%[a], 112]\n\t"
01992         "ldr        x6, [%[a], 120]\n\t"
01993         "ldr        x5, [%[b], 112]\n\t"
01994         "ldr        x7, [%[b], 120]\n\t"
01995         "and        x5, x5, %[m]\n\t"
01996         "and        x7, x7, %[m]\n\t"
01997         "sbcs   x4, x4, x5\n\t"
01998         "sbcs   x6, x6, x7\n\t"
01999         "str        x4, [%[r], 112]\n\t"
02000         "str        x6, [%[r], 120]\n\t"
02001         "csetm  %[c], cc\n\t"
02002         : [c] "+r" (c)
02003         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
02004         : "memory", "x4", "x6", "x5", "x7", "x8"
02005     );
02006 #endif /* WOLFSSL_SP_SMALL */
02007 
02008     return c;
02009 }
02010 
02011 /* Reduce the number back to 2048 bits using Montgomery reduction.
02012  *
02013  * a   A single precision number to reduce in place.
02014  * m   The single precision number representing the modulus.
02015  * mp  The digit representing the negative inverse of m mod 2^n.
02016  */
02017 SP_NOINLINE static void sp_2048_mont_reduce_16(sp_digit* a, sp_digit* m,
02018         sp_digit mp)
02019 {
02020     sp_digit ca = 0;
02021 
02022     __asm__ __volatile__ (
02023         "ldp       x12, x13, [%[m], 0]\n\t"
02024         "ldp       x14, x15, [%[m], 16]\n\t"
02025         "ldp       x16, x17, [%[m], 32]\n\t"
02026         "ldp       x18, x19, [%[m], 48]\n\t"
02027         "ldp       x20, x21, [%[m], 64]\n\t"
02028         "ldp       x22, x23, [%[m], 80]\n\t"
02029         "ldp       x24, x25, [%[m], 96]\n\t"
02030         "ldp       x26, x27, [%[m], 112]\n\t"
02031         "# i = 0\n\t"
02032         "mov    x3, 0\n\t"
02033         "ldp    x10, x11, [%[a], 0]\n\t"
02034         "\n1:\n\t"
02035         "# mu = a[i] * mp\n\t"
02036         "mul    x8, %[mp], x10\n\t"
02037         "# a[i+0] += m[0] * mu\n\t"
02038         "ldr    x9, [%[a], 0]\n\t"
02039         "mul        x6, x12, x8\n\t"
02040         "umulh  x7, x12, x8\n\t"
02041         "adds   x10, x10, x6\n\t"
02042         "adc    x5, x7, xzr\n\t"
02043         "# a[i+1] += m[1] * mu\n\t"
02044         "ldr    x9, [%[a], 8]\n\t"
02045         "mul        x6, x13, x8\n\t"
02046         "umulh  x7, x13, x8\n\t"
02047         "adds   x10, x11, x6\n\t"
02048         "adc    x4, x7, xzr\n\t"
02049         "adds   x10, x10, x5\n\t"
02050         "adc    x4, x4, xzr\n\t"
02051         "# a[i+2] += m[2] * mu\n\t"
02052         "ldr    x11, [%[a], 16]\n\t"
02053         "mul        x6, x14, x8\n\t"
02054         "umulh  x7, x14, x8\n\t"
02055         "adds   x11, x11, x6\n\t"
02056         "adc    x5, x7, xzr\n\t"
02057         "adds   x11, x11, x4\n\t"
02058         "adc    x5, x5, xzr\n\t"
02059         "# a[i+3] += m[3] * mu\n\t"
02060         "ldr    x9, [%[a], 24]\n\t"
02061         "mul        x6, x15, x8\n\t"
02062         "umulh  x7, x15, x8\n\t"
02063         "adds   x9, x9, x6\n\t"
02064         "adc    x4, x7, xzr\n\t"
02065         "adds   x9, x9, x5\n\t"
02066         "str    x9, [%[a], 24]\n\t"
02067         "adc    x4, x4, xzr\n\t"
02068         "# a[i+4] += m[4] * mu\n\t"
02069         "ldr    x9, [%[a], 32]\n\t"
02070         "mul        x6, x16, x8\n\t"
02071         "umulh  x7, x16, x8\n\t"
02072         "adds   x9, x9, x6\n\t"
02073         "adc    x5, x7, xzr\n\t"
02074         "adds   x9, x9, x4\n\t"
02075         "str    x9, [%[a], 32]\n\t"
02076         "adc    x5, x5, xzr\n\t"
02077         "# a[i+5] += m[5] * mu\n\t"
02078         "ldr    x9, [%[a], 40]\n\t"
02079         "mul        x6, x17, x8\n\t"
02080         "umulh  x7, x17, x8\n\t"
02081         "adds   x9, x9, x6\n\t"
02082         "adc    x4, x7, xzr\n\t"
02083         "adds   x9, x9, x5\n\t"
02084         "str    x9, [%[a], 40]\n\t"
02085         "adc    x4, x4, xzr\n\t"
02086         "# a[i+6] += m[6] * mu\n\t"
02087         "ldr    x9, [%[a], 48]\n\t"
02088         "mul        x6, x18, x8\n\t"
02089         "umulh  x7, x18, x8\n\t"
02090         "adds   x9, x9, x6\n\t"
02091         "adc    x5, x7, xzr\n\t"
02092         "adds   x9, x9, x4\n\t"
02093         "str    x9, [%[a], 48]\n\t"
02094         "adc    x5, x5, xzr\n\t"
02095         "# a[i+7] += m[7] * mu\n\t"
02096         "ldr    x9, [%[a], 56]\n\t"
02097         "mul        x6, x19, x8\n\t"
02098         "umulh  x7, x19, x8\n\t"
02099         "adds   x9, x9, x6\n\t"
02100         "adc    x4, x7, xzr\n\t"
02101         "adds   x9, x9, x5\n\t"
02102         "str    x9, [%[a], 56]\n\t"
02103         "adc    x4, x4, xzr\n\t"
02104         "# a[i+8] += m[8] * mu\n\t"
02105         "ldr    x9, [%[a], 64]\n\t"
02106         "mul        x6, x20, x8\n\t"
02107         "umulh  x7, x20, x8\n\t"
02108         "adds   x9, x9, x6\n\t"
02109         "adc    x5, x7, xzr\n\t"
02110         "adds   x9, x9, x4\n\t"
02111         "str    x9, [%[a], 64]\n\t"
02112         "adc    x5, x5, xzr\n\t"
02113         "# a[i+9] += m[9] * mu\n\t"
02114         "ldr    x9, [%[a], 72]\n\t"
02115         "mul        x6, x21, x8\n\t"
02116         "umulh  x7, x21, x8\n\t"
02117         "adds   x9, x9, x6\n\t"
02118         "adc    x4, x7, xzr\n\t"
02119         "adds   x9, x9, x5\n\t"
02120         "str    x9, [%[a], 72]\n\t"
02121         "adc    x4, x4, xzr\n\t"
02122         "# a[i+10] += m[10] * mu\n\t"
02123         "ldr    x9, [%[a], 80]\n\t"
02124         "mul        x6, x22, x8\n\t"
02125         "umulh  x7, x22, x8\n\t"
02126         "adds   x9, x9, x6\n\t"
02127         "adc    x5, x7, xzr\n\t"
02128         "adds   x9, x9, x4\n\t"
02129         "str    x9, [%[a], 80]\n\t"
02130         "adc    x5, x5, xzr\n\t"
02131         "# a[i+11] += m[11] * mu\n\t"
02132         "ldr    x9, [%[a], 88]\n\t"
02133         "mul        x6, x23, x8\n\t"
02134         "umulh  x7, x23, x8\n\t"
02135         "adds   x9, x9, x6\n\t"
02136         "adc    x4, x7, xzr\n\t"
02137         "adds   x9, x9, x5\n\t"
02138         "str    x9, [%[a], 88]\n\t"
02139         "adc    x4, x4, xzr\n\t"
02140         "# a[i+12] += m[12] * mu\n\t"
02141         "ldr    x9, [%[a], 96]\n\t"
02142         "mul        x6, x24, x8\n\t"
02143         "umulh  x7, x24, x8\n\t"
02144         "adds   x9, x9, x6\n\t"
02145         "adc    x5, x7, xzr\n\t"
02146         "adds   x9, x9, x4\n\t"
02147         "str    x9, [%[a], 96]\n\t"
02148         "adc    x5, x5, xzr\n\t"
02149         "# a[i+13] += m[13] * mu\n\t"
02150         "ldr    x9, [%[a], 104]\n\t"
02151         "mul        x6, x25, x8\n\t"
02152         "umulh  x7, x25, x8\n\t"
02153         "adds   x9, x9, x6\n\t"
02154         "adc    x4, x7, xzr\n\t"
02155         "adds   x9, x9, x5\n\t"
02156         "str    x9, [%[a], 104]\n\t"
02157         "adc    x4, x4, xzr\n\t"
02158         "# a[i+14] += m[14] * mu\n\t"
02159         "ldr    x9, [%[a], 112]\n\t"
02160         "mul        x6, x26, x8\n\t"
02161         "umulh  x7, x26, x8\n\t"
02162         "adds   x9, x9, x6\n\t"
02163         "adc    x5, x7, xzr\n\t"
02164         "adds   x9, x9, x4\n\t"
02165         "str    x9, [%[a], 112]\n\t"
02166         "adc    x5, x5, xzr\n\t"
02167         "# a[i+15] += m[15] * mu\n\t"
02168         "ldr    x9, [%[a], 120]\n\t"
02169         "mul    x6, x27, x8\n\t"
02170         "umulh  x7, x27, x8\n\t"
02171         "adds   x5, x5, x6\n\t"
02172         "adcs   x7, x7, %[ca]\n\t"
02173         "cset  %[ca], cs\n\t"
02174         "adds   x9, x9, x5\n\t"
02175         "str    x9, [%[a], 120]\n\t"
02176         "ldr    x9, [%[a], 128]\n\t"
02177         "adcs   x9, x9, x7\n\t"
02178         "str    x9, [%[a], 128]\n\t"
02179         "adc    %[ca], %[ca], xzr\n\t"
02180         "# i += 1\n\t"
02181         "add    %[a], %[a], 8\n\t"
02182         "add    x3, x3, 8\n\t"
02183         "cmp    x3, 128\n\t"
02184         "blt    1b\n\t"
02185         "str    x10, [%[a], 0]\n\t"
02186         "str    x11, [%[a], 8]\n\t"
02187         : [ca] "+r" (ca), [a] "+r" (a)
02188         : [m] "r" (m), [mp] "r" (mp)
02189         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27"
02190     );
02191 
02192     sp_2048_cond_sub_16(a - 16, a, m, (sp_digit)0 - ca);
02193 }
02194 
02195 /* Multiply two Montogmery form numbers mod the modulus (prime).
02196  * (r = a * b mod m)
02197  *
02198  * r   Result of multiplication.
02199  * a   First number to multiply in Montogmery form.
02200  * b   Second number to multiply in Montogmery form.
02201  * m   Modulus (prime).
02202  * mp  Montogmery mulitplier.
02203  */
02204 static void sp_2048_mont_mul_16(sp_digit* r, sp_digit* a, sp_digit* b,
02205         sp_digit* m, sp_digit mp)
02206 {
02207     sp_2048_mul_16(r, a, b);
02208     sp_2048_mont_reduce_16(r, m, mp);
02209 }
02210 
02211 /* Square the Montgomery form number. (r = a * a mod m)
02212  *
02213  * r   Result of squaring.
02214  * a   Number to square in Montogmery form.
02215  * m   Modulus (prime).
02216  * mp  Montogmery mulitplier.
02217  */
02218 static void sp_2048_mont_sqr_16(sp_digit* r, sp_digit* a, sp_digit* m,
02219         sp_digit mp)
02220 {
02221     sp_2048_sqr_16(r, a);
02222     sp_2048_mont_reduce_16(r, m, mp);
02223 }
02224 
02225 /* Mul a by digit b into r. (r = a * b)
02226  *
02227  * r  A single precision integer.
02228  * a  A single precision integer.
02229  * b  A single precision digit.
02230  */
02231 static void sp_2048_mul_d_16(sp_digit* r, const sp_digit* a,
02232         const sp_digit b)
02233 {
02234 #ifdef WOLFSSL_SP_SMALL
02235     __asm__ __volatile__ (
02236         "# A[0] * B\n\t"
02237         "ldr    x8, [%[a]]\n\t"
02238         "mul    x5, %[b], x8\n\t"
02239         "umulh  x3, %[b], x8\n\t"
02240         "mov    x4, 0\n\t"
02241         "str    x5, [%[r]]\n\t"
02242         "mov    x5, 0\n\t"
02243         "mov    x9, #8\n\t"
02244         "1:\n\t"
02245         "ldr    x8, [%[a], x9]\n\t"
02246         "mul    x6, %[b], x8\n\t"
02247         "umulh  x7, %[b], x8\n\t"
02248         "adds   x3, x3, x6\n\t"
02249         "adcs   x4, x4, x7\n\t"
02250         "adc    x5, xzr, xzr\n\t"
02251         "str    x3, [%[r], x9]\n\t"
02252         "mov    x3, x4\n\t"
02253         "mov    x4, x5\n\t"
02254         "mov    x5, #0\n\t"
02255         "add    x9, x9, #8\n\t"
02256         "cmp    x9, 128\n\t"
02257         "b.lt   1b\n\t"
02258         "str    x3, [%[r], 128]\n\t"
02259         :
02260         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
02261         : "memory", "x3", "x4", "x5", "x6", "x7", "x8"
02262     );
02263 #else
02264     __asm__ __volatile__ (
02265         "# A[0] * B\n\t"
02266         "ldr    x8, [%[a]]\n\t"
02267         "mul    x3, %[b], x8\n\t"
02268         "umulh  x4, %[b], x8\n\t"
02269         "mov    x5, 0\n\t"
02270         "str    x3, [%[r]]\n\t"
02271         "# A[1] * B\n\t"
02272         "ldr        x8, [%[a], 8]\n\t"
02273         "mov        x3, 0\n\t"
02274         "mul        x6, %[b], x8\n\t"
02275         "umulh  x7, %[b], x8\n\t"
02276         "adds   x4, x4, x6\n\t"
02277         "adcs   x5, x5, x7\n\t"
02278         "adc        x3, xzr, xzr\n\t"
02279         "str        x4, [%[r], 8]\n\t"
02280         "# A[2] * B\n\t"
02281         "ldr        x8, [%[a], 16]\n\t"
02282         "mov        x4, 0\n\t"
02283         "mul        x6, %[b], x8\n\t"
02284         "umulh  x7, %[b], x8\n\t"
02285         "adds   x5, x5, x6\n\t"
02286         "adcs   x3, x3, x7\n\t"
02287         "adc        x4, xzr, xzr\n\t"
02288         "str        x5, [%[r], 16]\n\t"
02289         "# A[3] * B\n\t"
02290         "ldr        x8, [%[a], 24]\n\t"
02291         "mov        x5, 0\n\t"
02292         "mul        x6, %[b], x8\n\t"
02293         "umulh  x7, %[b], x8\n\t"
02294         "adds   x3, x3, x6\n\t"
02295         "adcs   x4, x4, x7\n\t"
02296         "adc        x5, xzr, xzr\n\t"
02297         "str        x3, [%[r], 24]\n\t"
02298         "# A[4] * B\n\t"
02299         "ldr        x8, [%[a], 32]\n\t"
02300         "mov        x3, 0\n\t"
02301         "mul        x6, %[b], x8\n\t"
02302         "umulh  x7, %[b], x8\n\t"
02303         "adds   x4, x4, x6\n\t"
02304         "adcs   x5, x5, x7\n\t"
02305         "adc        x3, xzr, xzr\n\t"
02306         "str        x4, [%[r], 32]\n\t"
02307         "# A[5] * B\n\t"
02308         "ldr        x8, [%[a], 40]\n\t"
02309         "mov        x4, 0\n\t"
02310         "mul        x6, %[b], x8\n\t"
02311         "umulh  x7, %[b], x8\n\t"
02312         "adds   x5, x5, x6\n\t"
02313         "adcs   x3, x3, x7\n\t"
02314         "adc        x4, xzr, xzr\n\t"
02315         "str        x5, [%[r], 40]\n\t"
02316         "# A[6] * B\n\t"
02317         "ldr        x8, [%[a], 48]\n\t"
02318         "mov        x5, 0\n\t"
02319         "mul        x6, %[b], x8\n\t"
02320         "umulh  x7, %[b], x8\n\t"
02321         "adds   x3, x3, x6\n\t"
02322         "adcs   x4, x4, x7\n\t"
02323         "adc        x5, xzr, xzr\n\t"
02324         "str        x3, [%[r], 48]\n\t"
02325         "# A[7] * B\n\t"
02326         "ldr        x8, [%[a], 56]\n\t"
02327         "mov        x3, 0\n\t"
02328         "mul        x6, %[b], x8\n\t"
02329         "umulh  x7, %[b], x8\n\t"
02330         "adds   x4, x4, x6\n\t"
02331         "adcs   x5, x5, x7\n\t"
02332         "adc        x3, xzr, xzr\n\t"
02333         "str        x4, [%[r], 56]\n\t"
02334         "# A[8] * B\n\t"
02335         "ldr        x8, [%[a], 64]\n\t"
02336         "mov        x4, 0\n\t"
02337         "mul        x6, %[b], x8\n\t"
02338         "umulh  x7, %[b], x8\n\t"
02339         "adds   x5, x5, x6\n\t"
02340         "adcs   x3, x3, x7\n\t"
02341         "adc        x4, xzr, xzr\n\t"
02342         "str        x5, [%[r], 64]\n\t"
02343         "# A[9] * B\n\t"
02344         "ldr        x8, [%[a], 72]\n\t"
02345         "mov        x5, 0\n\t"
02346         "mul        x6, %[b], x8\n\t"
02347         "umulh  x7, %[b], x8\n\t"
02348         "adds   x3, x3, x6\n\t"
02349         "adcs   x4, x4, x7\n\t"
02350         "adc        x5, xzr, xzr\n\t"
02351         "str        x3, [%[r], 72]\n\t"
02352         "# A[10] * B\n\t"
02353         "ldr        x8, [%[a], 80]\n\t"
02354         "mov        x3, 0\n\t"
02355         "mul        x6, %[b], x8\n\t"
02356         "umulh  x7, %[b], x8\n\t"
02357         "adds   x4, x4, x6\n\t"
02358         "adcs   x5, x5, x7\n\t"
02359         "adc        x3, xzr, xzr\n\t"
02360         "str        x4, [%[r], 80]\n\t"
02361         "# A[11] * B\n\t"
02362         "ldr        x8, [%[a], 88]\n\t"
02363         "mov        x4, 0\n\t"
02364         "mul        x6, %[b], x8\n\t"
02365         "umulh  x7, %[b], x8\n\t"
02366         "adds   x5, x5, x6\n\t"
02367         "adcs   x3, x3, x7\n\t"
02368         "adc        x4, xzr, xzr\n\t"
02369         "str        x5, [%[r], 88]\n\t"
02370         "# A[12] * B\n\t"
02371         "ldr        x8, [%[a], 96]\n\t"
02372         "mov        x5, 0\n\t"
02373         "mul        x6, %[b], x8\n\t"
02374         "umulh  x7, %[b], x8\n\t"
02375         "adds   x3, x3, x6\n\t"
02376         "adcs   x4, x4, x7\n\t"
02377         "adc        x5, xzr, xzr\n\t"
02378         "str        x3, [%[r], 96]\n\t"
02379         "# A[13] * B\n\t"
02380         "ldr        x8, [%[a], 104]\n\t"
02381         "mov        x3, 0\n\t"
02382         "mul        x6, %[b], x8\n\t"
02383         "umulh  x7, %[b], x8\n\t"
02384         "adds   x4, x4, x6\n\t"
02385         "adcs   x5, x5, x7\n\t"
02386         "adc        x3, xzr, xzr\n\t"
02387         "str        x4, [%[r], 104]\n\t"
02388         "# A[14] * B\n\t"
02389         "ldr        x8, [%[a], 112]\n\t"
02390         "mov        x4, 0\n\t"
02391         "mul        x6, %[b], x8\n\t"
02392         "umulh  x7, %[b], x8\n\t"
02393         "adds   x5, x5, x6\n\t"
02394         "adcs   x3, x3, x7\n\t"
02395         "adc        x4, xzr, xzr\n\t"
02396         "str        x5, [%[r], 112]\n\t"
02397         "# A[15] * B\n\t"
02398         "ldr    x8, [%[a], 120]\n\t"
02399         "mul    x6, %[b], x8\n\t"
02400         "umulh  x7, %[b], x8\n\t"
02401         "adds   x3, x3, x6\n\t"
02402         "adc    x4, x4, x7\n\t"
02403         "str    x3, [%[r], 120]\n\t"
02404         "str    x4, [%[r], 128]\n\t"
02405         :
02406         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
02407         : "memory", "x3", "x4", "x5", "x6", "x7", "x8"
02408     );
02409 #endif
02410 }
02411 
02412 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
02413  *
02414  * d1   The high order half of the number to divide.
02415  * d0   The low order half of the number to divide.
02416  * div  The dividend.
02417  * returns the result of the division.
02418  */
02419 static sp_digit div_2048_word_16(sp_digit d1, sp_digit d0, sp_digit div)
02420 {
02421     sp_digit r;
02422 
02423     __asm__ __volatile__ (
02424         "lsr    x5, %[div], 32\n\t"
02425         "add    x5, x5, 1\n\t"
02426 
02427         "udiv   x3, %[d1], x5\n\t"
02428         "lsl    x6, x3, 32\n\t"
02429         "mul    x4, %[div], x6\n\t"
02430         "umulh  x3, %[div], x6\n\t"
02431         "subs   %[d0], %[d0], x4\n\t"
02432         "sbc    %[d1], %[d1], x3\n\t"
02433 
02434         "udiv   x3, %[d1], x5\n\t"
02435         "lsl    x3, x3, 32\n\t"
02436         "add    x6, x6, x3\n\t"
02437         "mul    x4, %[div], x3\n\t"
02438         "umulh  x3, %[div], x3\n\t"
02439         "subs   %[d0], %[d0], x4\n\t"
02440         "sbc    %[d1], %[d1], x3\n\t"
02441 
02442         "lsl    x3, %[d1], 32\n\t"
02443         "orr    x3, x3, %[d0], lsr 32\n\t"
02444 
02445         "udiv   x3, x3, x5\n\t"
02446         "add    x6, x6, x3\n\t"
02447         "mul    x4, %[div], x3\n\t"
02448         "umulh  x3, %[div], x3\n\t"
02449         "subs   %[d0], %[d0], x4\n\t"
02450         "sbc    %[d1], %[d1], x3\n\t"
02451 
02452         "lsl    x3, %[d1], 32\n\t"
02453         "orr    x3, x3, %[d0], lsr 32\n\t"
02454 
02455         "udiv   x3, x3, x5\n\t"
02456         "add    x6, x6, x3\n\t"
02457         "mul    x4, %[div], x3\n\t"
02458         "umulh  x3, %[div], x3\n\t"
02459         "subs   %[d0], %[d0], x4\n\t"
02460         "sbc    %[d1], %[d1], x3\n\t"
02461 
02462         "udiv   x3, %[d0], %[div]\n\t"
02463         "add    x6, x6, x3\n\t"
02464         "mul    x3, %[div], x3\n\t"
02465         "sub    %[d0], %[d0], x3\n\t"
02466         "mov    %[r], x6\n\t"
02467 
02468         : [r] "=r" (r)
02469         : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div)
02470         : "x3", "x4", "x5", "x6"
02471     );
02472 
02473     return r;
02474 }
02475 
02476 /* Compare a with b in constant time.
02477  *
02478  * a  A single precision integer.
02479  * b  A single precision integer.
02480  * return -ve, 0 or +ve if a is less than, equal to or greater than b
02481  * respectively.
02482  */
02483 static int64_t sp_2048_cmp_16(sp_digit* a, sp_digit* b)
02484 {
02485     sp_digit r = -1;
02486     sp_digit one = 1;
02487 
02488 #ifdef WOLFSSL_SP_SMALL
02489     __asm__ __volatile__ (
02490         "mov    x3, -1\n\t"
02491         "mov    x6, 120\n\t"
02492         "1:\n\t"
02493         "ldr    x4, [%[a], x6]\n\t"
02494         "ldr    x5, [%[b], x6]\n\t"
02495         "and    x4, x4, x3\n\t"
02496         "and    x5, x5, x3\n\t"
02497         "subs   x4, x4, x5\n\t"
02498         "csel   %[r], %[one], %[r], hi\n\t"
02499         "csel   %[r], x3, %[r], lo\n\t"
02500         "csel   x3, x3, xzr, eq\n\t"
02501         "sub    x6, x6, #8\n\t"
02502         "b.cc   1b\n\t"
02503         "eor    %[r], %[r], x3\n\t"
02504         : [r] "+r" (r)
02505         : [a] "r" (a), [b] "r" (b), [one] "r" (one)
02506         : "x2", "x3", "x4", "x5", "x6"
02507     );
02508 #else
02509     __asm__ __volatile__ (
02510         "mov    x3, -1\n\t"
02511         "ldr        x4, [%[a], 120]\n\t"
02512         "ldr        x5, [%[b], 120]\n\t"
02513         "and        x4, x4, x3\n\t"
02514         "and        x5, x5, x3\n\t"
02515         "subs   x4, x4, x5\n\t"
02516         "csel   %[r], %[one], %[r], hi\n\t"
02517         "csel   %[r], x3, %[r], lo\n\t"
02518         "csel   x3, x3, xzr, eq\n\t"
02519         "ldr        x4, [%[a], 112]\n\t"
02520         "ldr        x5, [%[b], 112]\n\t"
02521         "and        x4, x4, x3\n\t"
02522         "and        x5, x5, x3\n\t"
02523         "subs   x4, x4, x5\n\t"
02524         "csel   %[r], %[one], %[r], hi\n\t"
02525         "csel   %[r], x3, %[r], lo\n\t"
02526         "csel   x3, x3, xzr, eq\n\t"
02527         "ldr        x4, [%[a], 104]\n\t"
02528         "ldr        x5, [%[b], 104]\n\t"
02529         "and        x4, x4, x3\n\t"
02530         "and        x5, x5, x3\n\t"
02531         "subs   x4, x4, x5\n\t"
02532         "csel   %[r], %[one], %[r], hi\n\t"
02533         "csel   %[r], x3, %[r], lo\n\t"
02534         "csel   x3, x3, xzr, eq\n\t"
02535         "ldr        x4, [%[a], 96]\n\t"
02536         "ldr        x5, [%[b], 96]\n\t"
02537         "and        x4, x4, x3\n\t"
02538         "and        x5, x5, x3\n\t"
02539         "subs   x4, x4, x5\n\t"
02540         "csel   %[r], %[one], %[r], hi\n\t"
02541         "csel   %[r], x3, %[r], lo\n\t"
02542         "csel   x3, x3, xzr, eq\n\t"
02543         "ldr        x4, [%[a], 88]\n\t"
02544         "ldr        x5, [%[b], 88]\n\t"
02545         "and        x4, x4, x3\n\t"
02546         "and        x5, x5, x3\n\t"
02547         "subs   x4, x4, x5\n\t"
02548         "csel   %[r], %[one], %[r], hi\n\t"
02549         "csel   %[r], x3, %[r], lo\n\t"
02550         "csel   x3, x3, xzr, eq\n\t"
02551         "ldr        x4, [%[a], 80]\n\t"
02552         "ldr        x5, [%[b], 80]\n\t"
02553         "and        x4, x4, x3\n\t"
02554         "and        x5, x5, x3\n\t"
02555         "subs   x4, x4, x5\n\t"
02556         "csel   %[r], %[one], %[r], hi\n\t"
02557         "csel   %[r], x3, %[r], lo\n\t"
02558         "csel   x3, x3, xzr, eq\n\t"
02559         "ldr        x4, [%[a], 72]\n\t"
02560         "ldr        x5, [%[b], 72]\n\t"
02561         "and        x4, x4, x3\n\t"
02562         "and        x5, x5, x3\n\t"
02563         "subs   x4, x4, x5\n\t"
02564         "csel   %[r], %[one], %[r], hi\n\t"
02565         "csel   %[r], x3, %[r], lo\n\t"
02566         "csel   x3, x3, xzr, eq\n\t"
02567         "ldr        x4, [%[a], 64]\n\t"
02568         "ldr        x5, [%[b], 64]\n\t"
02569         "and        x4, x4, x3\n\t"
02570         "and        x5, x5, x3\n\t"
02571         "subs   x4, x4, x5\n\t"
02572         "csel   %[r], %[one], %[r], hi\n\t"
02573         "csel   %[r], x3, %[r], lo\n\t"
02574         "csel   x3, x3, xzr, eq\n\t"
02575         "ldr        x4, [%[a], 56]\n\t"
02576         "ldr        x5, [%[b], 56]\n\t"
02577         "and        x4, x4, x3\n\t"
02578         "and        x5, x5, x3\n\t"
02579         "subs   x4, x4, x5\n\t"
02580         "csel   %[r], %[one], %[r], hi\n\t"
02581         "csel   %[r], x3, %[r], lo\n\t"
02582         "csel   x3, x3, xzr, eq\n\t"
02583         "ldr        x4, [%[a], 48]\n\t"
02584         "ldr        x5, [%[b], 48]\n\t"
02585         "and        x4, x4, x3\n\t"
02586         "and        x5, x5, x3\n\t"
02587         "subs   x4, x4, x5\n\t"
02588         "csel   %[r], %[one], %[r], hi\n\t"
02589         "csel   %[r], x3, %[r], lo\n\t"
02590         "csel   x3, x3, xzr, eq\n\t"
02591         "ldr        x4, [%[a], 40]\n\t"
02592         "ldr        x5, [%[b], 40]\n\t"
02593         "and        x4, x4, x3\n\t"
02594         "and        x5, x5, x3\n\t"
02595         "subs   x4, x4, x5\n\t"
02596         "csel   %[r], %[one], %[r], hi\n\t"
02597         "csel   %[r], x3, %[r], lo\n\t"
02598         "csel   x3, x3, xzr, eq\n\t"
02599         "ldr        x4, [%[a], 32]\n\t"
02600         "ldr        x5, [%[b], 32]\n\t"
02601         "and        x4, x4, x3\n\t"
02602         "and        x5, x5, x3\n\t"
02603         "subs   x4, x4, x5\n\t"
02604         "csel   %[r], %[one], %[r], hi\n\t"
02605         "csel   %[r], x3, %[r], lo\n\t"
02606         "csel   x3, x3, xzr, eq\n\t"
02607         "ldr        x4, [%[a], 24]\n\t"
02608         "ldr        x5, [%[b], 24]\n\t"
02609         "and        x4, x4, x3\n\t"
02610         "and        x5, x5, x3\n\t"
02611         "subs   x4, x4, x5\n\t"
02612         "csel   %[r], %[one], %[r], hi\n\t"
02613         "csel   %[r], x3, %[r], lo\n\t"
02614         "csel   x3, x3, xzr, eq\n\t"
02615         "ldr        x4, [%[a], 16]\n\t"
02616         "ldr        x5, [%[b], 16]\n\t"
02617         "and        x4, x4, x3\n\t"
02618         "and        x5, x5, x3\n\t"
02619         "subs   x4, x4, x5\n\t"
02620         "csel   %[r], %[one], %[r], hi\n\t"
02621         "csel   %[r], x3, %[r], lo\n\t"
02622         "csel   x3, x3, xzr, eq\n\t"
02623         "ldr        x4, [%[a], 8]\n\t"
02624         "ldr        x5, [%[b], 8]\n\t"
02625         "and        x4, x4, x3\n\t"
02626         "and        x5, x5, x3\n\t"
02627         "subs   x4, x4, x5\n\t"
02628         "csel   %[r], %[one], %[r], hi\n\t"
02629         "csel   %[r], x3, %[r], lo\n\t"
02630         "csel   x3, x3, xzr, eq\n\t"
02631         "ldr        x4, [%[a], 0]\n\t"
02632         "ldr        x5, [%[b], 0]\n\t"
02633         "and        x4, x4, x3\n\t"
02634         "and        x5, x5, x3\n\t"
02635         "subs   x4, x4, x5\n\t"
02636         "csel   %[r], %[one], %[r], hi\n\t"
02637         "csel   %[r], x3, %[r], lo\n\t"
02638         "csel   x3, x3, xzr, eq\n\t"
02639         "eor    %[r], %[r], x3\n\t"
02640         : [r] "+r" (r)
02641         : [a] "r" (a), [b] "r" (b), [one] "r" (one)
02642         : "x2", "x3", "x4", "x5", "x6"
02643     );
02644 #endif
02645 
02646     return r;
02647 }
02648 
02649 /* Divide d in a and put remainder into r (m*d + r = a)
02650  * m is not calculated as it is not needed at this time.
02651  *
02652  * a  Nmber to be divided.
02653  * d  Number to divide with.
02654  * m  Multiplier result.
02655  * r  Remainder from the division.
02656  * returns MP_OKAY indicating success.
02657  */
02658 static WC_INLINE int sp_2048_div_16(sp_digit* a, sp_digit* d, sp_digit* m,
02659         sp_digit* r)
02660 {
02661     sp_digit t1[32], t2[17];
02662     sp_digit div, r1;
02663     int i;
02664 
02665     (void)m;
02666 
02667     div = d[15];
02668     XMEMCPY(t1, a, sizeof(*t1) * 2 * 16);
02669     for (i=15; i>=0; i--) {
02670         r1 = div_2048_word_16(t1[16 + i], t1[16 + i - 1], div);
02671 
02672         sp_2048_mul_d_16(t2, d, r1);
02673         t1[16 + i] += sp_2048_sub_in_place_16(&t1[i], t2);
02674         t1[16 + i] -= t2[16];
02675         sp_2048_mask_16(t2, d, t1[16 + i]);
02676         t1[16 + i] += sp_2048_add_16(&t1[i], &t1[i], t2);
02677         sp_2048_mask_16(t2, d, t1[16 + i]);
02678         t1[16 + i] += sp_2048_add_16(&t1[i], &t1[i], t2);
02679     }
02680 
02681     r1 = sp_2048_cmp_16(t1, d) >= 0;
02682     sp_2048_cond_sub_16(r, t1, t2, (sp_digit)0 - r1);
02683 
02684     return MP_OKAY;
02685 }
02686 
02687 /* Reduce a modulo m into r. (r = a mod m)
02688  *
02689  * r  A single precision number that is the reduced result.
02690  * a  A single precision number that is to be reduced.
02691  * m  A single precision number that is the modulus to reduce with.
02692  * returns MP_OKAY indicating success.
02693  */
02694 static WC_INLINE int sp_2048_mod_16(sp_digit* r, sp_digit* a, sp_digit* m)
02695 {
02696     return sp_2048_div_16(a, m, NULL, r);
02697 }
02698 
02699 #ifdef WOLFSSL_SP_SMALL
02700 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
02701  *
02702  * r     A single precision number that is the result of the operation.
02703  * a     A single precision number being exponentiated.
02704  * e     A single precision number that is the exponent.
02705  * bits  The number of bits in the exponent.
02706  * m     A single precision number that is the modulus.
02707  * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
02708  */
02709 static int sp_2048_mod_exp_16(sp_digit* r, sp_digit* a, sp_digit* e,
02710         int bits, sp_digit* m, int reduceA)
02711 {
02712 #ifndef WOLFSSL_SMALL_STACK
02713     sp_digit t[16][32];
02714 #else
02715     sp_digit* t[16];
02716     sp_digit* td;
02717 #endif
02718     sp_digit* norm;
02719     sp_digit mp = 1;
02720     sp_digit n;
02721     sp_digit mask;
02722     int i;
02723     int c, y;
02724     int err = MP_OKAY;
02725 
02726 #ifdef WOLFSSL_SMALL_STACK
02727     td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 32, NULL,
02728                             DYNAMIC_TYPE_TMP_BUFFER);
02729     if (td == NULL)
02730         err = MEMORY_E;
02731 
02732     if (err == MP_OKAY) {
02733         for (i=0; i<16; i++)
02734             t[i] = td + i * 32;
02735         norm = t[0];
02736     }
02737 #else
02738     norm = t[0];
02739 #endif
02740 
02741     if (err == MP_OKAY) {
02742         sp_2048_mont_setup(m, &mp);
02743         sp_2048_mont_norm_16(norm, m);
02744 
02745         XMEMSET(t[1], 0, sizeof(sp_digit) * 16);
02746         if (reduceA) {
02747             err = sp_2048_mod_16(t[1] + 16, a, m);
02748             if (err == MP_OKAY)
02749                 err = sp_2048_mod_16(t[1], t[1], m);
02750         }
02751         else {
02752             XMEMCPY(t[1] + 16, a, sizeof(sp_digit) * 16);
02753             err = sp_2048_mod_16(t[1], t[1], m);
02754         }
02755     }
02756 
02757     if (err == MP_OKAY) {
02758         sp_2048_mont_sqr_16(t[ 2], t[ 1], m, mp);
02759         sp_2048_mont_mul_16(t[ 3], t[ 2], t[ 1], m, mp);
02760         sp_2048_mont_sqr_16(t[ 4], t[ 2], m, mp);
02761         sp_2048_mont_mul_16(t[ 5], t[ 3], t[ 2], m, mp);
02762         sp_2048_mont_sqr_16(t[ 6], t[ 3], m, mp);
02763         sp_2048_mont_mul_16(t[ 7], t[ 4], t[ 3], m, mp);
02764         sp_2048_mont_sqr_16(t[ 8], t[ 4], m, mp);
02765         sp_2048_mont_mul_16(t[ 9], t[ 5], t[ 4], m, mp);
02766         sp_2048_mont_sqr_16(t[10], t[ 5], m, mp);
02767         sp_2048_mont_mul_16(t[11], t[ 6], t[ 5], m, mp);
02768         sp_2048_mont_sqr_16(t[12], t[ 6], m, mp);
02769         sp_2048_mont_mul_16(t[13], t[ 7], t[ 6], m, mp);
02770         sp_2048_mont_sqr_16(t[14], t[ 7], m, mp);
02771         sp_2048_mont_mul_16(t[15], t[ 8], t[ 7], m, mp);
02772 
02773         i = (bits - 1) / 64;
02774         n = e[i--];
02775         y = n >> 60;
02776         n <<= 4;
02777         c = 60;
02778         XMEMCPY(r, t[y], sizeof(sp_digit) * 16);
02779         for (; i>=0 || c>=4; ) {
02780             if (c == 0) {
02781                 n = e[i--];
02782                 y = n >> 60;
02783                 n <<= 4;
02784                 c = 60;
02785             }
02786             else if (c < 4) {
02787                 y = n >> 60;
02788                 n = e[i--];
02789                 c = 4 - c;
02790                 y |= n >> (64 - c);
02791                 n <<= c;
02792                 c = 64 - c;
02793             }
02794             else {
02795                 y = (n >> 60) & 0xf;
02796                 n <<= 4;
02797                 c -= 4;
02798             }
02799 
02800             sp_2048_mont_sqr_16(r, r, m, mp);
02801             sp_2048_mont_sqr_16(r, r, m, mp);
02802             sp_2048_mont_sqr_16(r, r, m, mp);
02803             sp_2048_mont_sqr_16(r, r, m, mp);
02804 
02805             sp_2048_mont_mul_16(r, r, t[y], m, mp);
02806         }
02807 
02808         XMEMSET(&r[16], 0, sizeof(sp_digit) * 16);
02809         sp_2048_mont_reduce_16(r, m, mp);
02810 
02811         mask = 0 - (sp_2048_cmp_16(r, m) >= 0);
02812         sp_2048_cond_sub_16(r, r, m, mask);
02813     }
02814 
02815 #ifdef WOLFSSL_SMALL_STACK
02816     if (td != NULL)
02817         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
02818 #endif
02819 
02820     return err;
02821 }
02822 #else
02823 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
02824  *
02825  * r     A single precision number that is the result of the operation.
02826  * a     A single precision number being exponentiated.
02827  * e     A single precision number that is the exponent.
02828  * bits  The number of bits in the exponent.
02829  * m     A single precision number that is the modulus.
02830  * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
02831  */
02832 static int sp_2048_mod_exp_16(sp_digit* r, sp_digit* a, sp_digit* e,
02833         int bits, sp_digit* m, int reduceA)
02834 {
02835 #ifndef WOLFSSL_SMALL_STACK
02836     sp_digit t[32][32];
02837 #else
02838     sp_digit* t[32];
02839     sp_digit* td;
02840 #endif
02841     sp_digit* norm;
02842     sp_digit mp = 1;
02843     sp_digit n;
02844     sp_digit mask;
02845     int i;
02846     int c, y;
02847     int err = MP_OKAY;
02848 
02849 #ifdef WOLFSSL_SMALL_STACK
02850     td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 32, NULL,
02851                             DYNAMIC_TYPE_TMP_BUFFER);
02852     if (td == NULL)
02853         err = MEMORY_E;
02854 
02855     if (err == MP_OKAY) {
02856         for (i=0; i<32; i++)
02857             t[i] = td + i * 32;
02858         norm = t[0];
02859     }
02860 #else
02861     norm = t[0];
02862 #endif
02863 
02864     if (err == MP_OKAY) {
02865         sp_2048_mont_setup(m, &mp);
02866         sp_2048_mont_norm_16(norm, m);
02867 
02868         XMEMSET(t[1], 0, sizeof(sp_digit) * 16);
02869         if (reduceA) {
02870             err = sp_2048_mod_16(t[1] + 16, a, m);
02871             if (err == MP_OKAY)
02872                 err = sp_2048_mod_16(t[1], t[1], m);
02873         }
02874         else {
02875             XMEMCPY(t[1] + 16, a, sizeof(sp_digit) * 16);
02876             err = sp_2048_mod_16(t[1], t[1], m);
02877         }
02878     }
02879 
02880     if (err == MP_OKAY) {
02881         sp_2048_mont_sqr_16(t[ 2], t[ 1], m, mp);
02882         sp_2048_mont_mul_16(t[ 3], t[ 2], t[ 1], m, mp);
02883         sp_2048_mont_sqr_16(t[ 4], t[ 2], m, mp);
02884         sp_2048_mont_mul_16(t[ 5], t[ 3], t[ 2], m, mp);
02885         sp_2048_mont_sqr_16(t[ 6], t[ 3], m, mp);
02886         sp_2048_mont_mul_16(t[ 7], t[ 4], t[ 3], m, mp);
02887         sp_2048_mont_sqr_16(t[ 8], t[ 4], m, mp);
02888         sp_2048_mont_mul_16(t[ 9], t[ 5], t[ 4], m, mp);
02889         sp_2048_mont_sqr_16(t[10], t[ 5], m, mp);
02890         sp_2048_mont_mul_16(t[11], t[ 6], t[ 5], m, mp);
02891         sp_2048_mont_sqr_16(t[12], t[ 6], m, mp);
02892         sp_2048_mont_mul_16(t[13], t[ 7], t[ 6], m, mp);
02893         sp_2048_mont_sqr_16(t[14], t[ 7], m, mp);
02894         sp_2048_mont_mul_16(t[15], t[ 8], t[ 7], m, mp);
02895         sp_2048_mont_sqr_16(t[16], t[ 8], m, mp);
02896         sp_2048_mont_mul_16(t[17], t[ 9], t[ 8], m, mp);
02897         sp_2048_mont_sqr_16(t[18], t[ 9], m, mp);
02898         sp_2048_mont_mul_16(t[19], t[10], t[ 9], m, mp);
02899         sp_2048_mont_sqr_16(t[20], t[10], m, mp);
02900         sp_2048_mont_mul_16(t[21], t[11], t[10], m, mp);
02901         sp_2048_mont_sqr_16(t[22], t[11], m, mp);
02902         sp_2048_mont_mul_16(t[23], t[12], t[11], m, mp);
02903         sp_2048_mont_sqr_16(t[24], t[12], m, mp);
02904         sp_2048_mont_mul_16(t[25], t[13], t[12], m, mp);
02905         sp_2048_mont_sqr_16(t[26], t[13], m, mp);
02906         sp_2048_mont_mul_16(t[27], t[14], t[13], m, mp);
02907         sp_2048_mont_sqr_16(t[28], t[14], m, mp);
02908         sp_2048_mont_mul_16(t[29], t[15], t[14], m, mp);
02909         sp_2048_mont_sqr_16(t[30], t[15], m, mp);
02910         sp_2048_mont_mul_16(t[31], t[16], t[15], m, mp);
02911 
02912         i = (bits - 1) / 64;
02913         n = e[i--];
02914         y = n >> 59;
02915         n <<= 5;
02916         c = 59;
02917         XMEMCPY(r, t[y], sizeof(sp_digit) * 16);
02918         for (; i>=0 || c>=5; ) {
02919             if (c == 0) {
02920                 n = e[i--];
02921                 y = n >> 59;
02922                 n <<= 5;
02923                 c = 59;
02924             }
02925             else if (c < 5) {
02926                 y = n >> 59;
02927                 n = e[i--];
02928                 c = 5 - c;
02929                 y |= n >> (64 - c);
02930                 n <<= c;
02931                 c = 64 - c;
02932             }
02933             else {
02934                 y = (n >> 59) & 0x1f;
02935                 n <<= 5;
02936                 c -= 5;
02937             }
02938 
02939             sp_2048_mont_sqr_16(r, r, m, mp);
02940             sp_2048_mont_sqr_16(r, r, m, mp);
02941             sp_2048_mont_sqr_16(r, r, m, mp);
02942             sp_2048_mont_sqr_16(r, r, m, mp);
02943             sp_2048_mont_sqr_16(r, r, m, mp);
02944 
02945             sp_2048_mont_mul_16(r, r, t[y], m, mp);
02946         }
02947         y = e[0] & 0xf;
02948         sp_2048_mont_sqr_16(r, r, m, mp);
02949         sp_2048_mont_sqr_16(r, r, m, mp);
02950         sp_2048_mont_sqr_16(r, r, m, mp);
02951         sp_2048_mont_sqr_16(r, r, m, mp);
02952         sp_2048_mont_mul_16(r, r, t[y], m, mp);
02953 
02954         XMEMSET(&r[16], 0, sizeof(sp_digit) * 16);
02955         sp_2048_mont_reduce_16(r, m, mp);
02956 
02957         mask = 0 - (sp_2048_cmp_16(r, m) >= 0);
02958         sp_2048_cond_sub_16(r, r, m, mask);
02959     }
02960 
02961 #ifdef WOLFSSL_SMALL_STACK
02962     if (td != NULL)
02963         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
02964 #endif
02965 
02966     return err;
02967 }
02968 #endif /* WOLFSSL_SP_SMALL */
02969 
02970 #endif /* !SP_RSA_PRIVATE_EXP_D && WOLFSSL_HAVE_SP_RSA */
02971 
02972 /* r = 2^n mod m where n is the number of bits to reduce by.
02973  * Given m must be 2048 bits, just need to subtract.
02974  *
02975  * r  A single precision number.
02976  * m  A signle precision number.
02977  */
02978 static void sp_2048_mont_norm_32(sp_digit* r, sp_digit* m)
02979 {
02980     XMEMSET(r, 0, sizeof(sp_digit) * 32);
02981 
02982     /* r = 2^n mod m */
02983     sp_2048_sub_in_place_32(r, m);
02984 }
02985 
02986 /* Conditionally subtract b from a using the mask m.
02987  * m is -1 to subtract and 0 when not copying.
02988  *
02989  * r  A single precision number representing condition subtract result.
02990  * a  A single precision number to subtract from.
02991  * b  A single precision number to subtract.
02992  * m  Mask value to apply.
02993  */
02994 static sp_digit sp_2048_cond_sub_32(sp_digit* r, sp_digit* a, sp_digit* b,
02995         sp_digit m)
02996 {
02997     sp_digit c = 0;
02998 
02999 #ifdef WOLFSSL_SP_SMALL
03000     __asm__ __volatile__ (
03001         "mov    x8, #0\n\t"
03002         "1:\n\t"
03003         "subs   %[c], xzr, %[c]\n\t"
03004         "ldr    x4, [%[a], x8]\n\t"
03005         "ldr    x5, [%[b], x8]\n\t"
03006         "and    x5, x5, %[m]\n\t"
03007         "sbcs   x4, x4, x5\n\t"
03008         "csetm  %[c], cc\n\t"
03009         "str    x4, [%[r], x8]\n\t"
03010         "add    x8, x8, #8\n\t"
03011         "cmp    x8, 256\n\t"
03012         "b.lt   1b\n\t"
03013         : [c] "+r" (c)
03014         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
03015         : "memory", "x4", "x6", "x5", "x7", "x8"
03016     );
03017 #else
03018     __asm__ __volatile__ (
03019 
03020         "ldr        x4, [%[a], 0]\n\t"
03021         "ldr        x6, [%[a], 8]\n\t"
03022         "ldr        x5, [%[b], 0]\n\t"
03023         "ldr        x7, [%[b], 8]\n\t"
03024         "and        x5, x5, %[m]\n\t"
03025         "and        x7, x7, %[m]\n\t"
03026         "subs   x4, x4, x5\n\t"
03027         "sbcs   x6, x6, x7\n\t"
03028         "str        x4, [%[r], 0]\n\t"
03029         "str        x6, [%[r], 8]\n\t"
03030         "ldr        x4, [%[a], 16]\n\t"
03031         "ldr        x6, [%[a], 24]\n\t"
03032         "ldr        x5, [%[b], 16]\n\t"
03033         "ldr        x7, [%[b], 24]\n\t"
03034         "and        x5, x5, %[m]\n\t"
03035         "and        x7, x7, %[m]\n\t"
03036         "sbcs   x4, x4, x5\n\t"
03037         "sbcs   x6, x6, x7\n\t"
03038         "str        x4, [%[r], 16]\n\t"
03039         "str        x6, [%[r], 24]\n\t"
03040         "ldr        x4, [%[a], 32]\n\t"
03041         "ldr        x6, [%[a], 40]\n\t"
03042         "ldr        x5, [%[b], 32]\n\t"
03043         "ldr        x7, [%[b], 40]\n\t"
03044         "and        x5, x5, %[m]\n\t"
03045         "and        x7, x7, %[m]\n\t"
03046         "sbcs   x4, x4, x5\n\t"
03047         "sbcs   x6, x6, x7\n\t"
03048         "str        x4, [%[r], 32]\n\t"
03049         "str        x6, [%[r], 40]\n\t"
03050         "ldr        x4, [%[a], 48]\n\t"
03051         "ldr        x6, [%[a], 56]\n\t"
03052         "ldr        x5, [%[b], 48]\n\t"
03053         "ldr        x7, [%[b], 56]\n\t"
03054         "and        x5, x5, %[m]\n\t"
03055         "and        x7, x7, %[m]\n\t"
03056         "sbcs   x4, x4, x5\n\t"
03057         "sbcs   x6, x6, x7\n\t"
03058         "str        x4, [%[r], 48]\n\t"
03059         "str        x6, [%[r], 56]\n\t"
03060         "ldr        x4, [%[a], 64]\n\t"
03061         "ldr        x6, [%[a], 72]\n\t"
03062         "ldr        x5, [%[b], 64]\n\t"
03063         "ldr        x7, [%[b], 72]\n\t"
03064         "and        x5, x5, %[m]\n\t"
03065         "and        x7, x7, %[m]\n\t"
03066         "sbcs   x4, x4, x5\n\t"
03067         "sbcs   x6, x6, x7\n\t"
03068         "str        x4, [%[r], 64]\n\t"
03069         "str        x6, [%[r], 72]\n\t"
03070         "ldr        x4, [%[a], 80]\n\t"
03071         "ldr        x6, [%[a], 88]\n\t"
03072         "ldr        x5, [%[b], 80]\n\t"
03073         "ldr        x7, [%[b], 88]\n\t"
03074         "and        x5, x5, %[m]\n\t"
03075         "and        x7, x7, %[m]\n\t"
03076         "sbcs   x4, x4, x5\n\t"
03077         "sbcs   x6, x6, x7\n\t"
03078         "str        x4, [%[r], 80]\n\t"
03079         "str        x6, [%[r], 88]\n\t"
03080         "ldr        x4, [%[a], 96]\n\t"
03081         "ldr        x6, [%[a], 104]\n\t"
03082         "ldr        x5, [%[b], 96]\n\t"
03083         "ldr        x7, [%[b], 104]\n\t"
03084         "and        x5, x5, %[m]\n\t"
03085         "and        x7, x7, %[m]\n\t"
03086         "sbcs   x4, x4, x5\n\t"
03087         "sbcs   x6, x6, x7\n\t"
03088         "str        x4, [%[r], 96]\n\t"
03089         "str        x6, [%[r], 104]\n\t"
03090         "ldr        x4, [%[a], 112]\n\t"
03091         "ldr        x6, [%[a], 120]\n\t"
03092         "ldr        x5, [%[b], 112]\n\t"
03093         "ldr        x7, [%[b], 120]\n\t"
03094         "and        x5, x5, %[m]\n\t"
03095         "and        x7, x7, %[m]\n\t"
03096         "sbcs   x4, x4, x5\n\t"
03097         "sbcs   x6, x6, x7\n\t"
03098         "str        x4, [%[r], 112]\n\t"
03099         "str        x6, [%[r], 120]\n\t"
03100         "ldr        x4, [%[a], 128]\n\t"
03101         "ldr        x6, [%[a], 136]\n\t"
03102         "ldr        x5, [%[b], 128]\n\t"
03103         "ldr        x7, [%[b], 136]\n\t"
03104         "and        x5, x5, %[m]\n\t"
03105         "and        x7, x7, %[m]\n\t"
03106         "sbcs   x4, x4, x5\n\t"
03107         "sbcs   x6, x6, x7\n\t"
03108         "str        x4, [%[r], 128]\n\t"
03109         "str        x6, [%[r], 136]\n\t"
03110         "ldr        x4, [%[a], 144]\n\t"
03111         "ldr        x6, [%[a], 152]\n\t"
03112         "ldr        x5, [%[b], 144]\n\t"
03113         "ldr        x7, [%[b], 152]\n\t"
03114         "and        x5, x5, %[m]\n\t"
03115         "and        x7, x7, %[m]\n\t"
03116         "sbcs   x4, x4, x5\n\t"
03117         "sbcs   x6, x6, x7\n\t"
03118         "str        x4, [%[r], 144]\n\t"
03119         "str        x6, [%[r], 152]\n\t"
03120         "ldr        x4, [%[a], 160]\n\t"
03121         "ldr        x6, [%[a], 168]\n\t"
03122         "ldr        x5, [%[b], 160]\n\t"
03123         "ldr        x7, [%[b], 168]\n\t"
03124         "and        x5, x5, %[m]\n\t"
03125         "and        x7, x7, %[m]\n\t"
03126         "sbcs   x4, x4, x5\n\t"
03127         "sbcs   x6, x6, x7\n\t"
03128         "str        x4, [%[r], 160]\n\t"
03129         "str        x6, [%[r], 168]\n\t"
03130         "ldr        x4, [%[a], 176]\n\t"
03131         "ldr        x6, [%[a], 184]\n\t"
03132         "ldr        x5, [%[b], 176]\n\t"
03133         "ldr        x7, [%[b], 184]\n\t"
03134         "and        x5, x5, %[m]\n\t"
03135         "and        x7, x7, %[m]\n\t"
03136         "sbcs   x4, x4, x5\n\t"
03137         "sbcs   x6, x6, x7\n\t"
03138         "str        x4, [%[r], 176]\n\t"
03139         "str        x6, [%[r], 184]\n\t"
03140         "ldr        x4, [%[a], 192]\n\t"
03141         "ldr        x6, [%[a], 200]\n\t"
03142         "ldr        x5, [%[b], 192]\n\t"
03143         "ldr        x7, [%[b], 200]\n\t"
03144         "and        x5, x5, %[m]\n\t"
03145         "and        x7, x7, %[m]\n\t"
03146         "sbcs   x4, x4, x5\n\t"
03147         "sbcs   x6, x6, x7\n\t"
03148         "str        x4, [%[r], 192]\n\t"
03149         "str        x6, [%[r], 200]\n\t"
03150         "ldr        x4, [%[a], 208]\n\t"
03151         "ldr        x6, [%[a], 216]\n\t"
03152         "ldr        x5, [%[b], 208]\n\t"
03153         "ldr        x7, [%[b], 216]\n\t"
03154         "and        x5, x5, %[m]\n\t"
03155         "and        x7, x7, %[m]\n\t"
03156         "sbcs   x4, x4, x5\n\t"
03157         "sbcs   x6, x6, x7\n\t"
03158         "str        x4, [%[r], 208]\n\t"
03159         "str        x6, [%[r], 216]\n\t"
03160         "ldr        x4, [%[a], 224]\n\t"
03161         "ldr        x6, [%[a], 232]\n\t"
03162         "ldr        x5, [%[b], 224]\n\t"
03163         "ldr        x7, [%[b], 232]\n\t"
03164         "and        x5, x5, %[m]\n\t"
03165         "and        x7, x7, %[m]\n\t"
03166         "sbcs   x4, x4, x5\n\t"
03167         "sbcs   x6, x6, x7\n\t"
03168         "str        x4, [%[r], 224]\n\t"
03169         "str        x6, [%[r], 232]\n\t"
03170         "ldr        x4, [%[a], 240]\n\t"
03171         "ldr        x6, [%[a], 248]\n\t"
03172         "ldr        x5, [%[b], 240]\n\t"
03173         "ldr        x7, [%[b], 248]\n\t"
03174         "and        x5, x5, %[m]\n\t"
03175         "and        x7, x7, %[m]\n\t"
03176         "sbcs   x4, x4, x5\n\t"
03177         "sbcs   x6, x6, x7\n\t"
03178         "str        x4, [%[r], 240]\n\t"
03179         "str        x6, [%[r], 248]\n\t"
03180         "csetm  %[c], cc\n\t"
03181         : [c] "+r" (c)
03182         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
03183         : "memory", "x4", "x6", "x5", "x7", "x8"
03184     );
03185 #endif /* WOLFSSL_SP_SMALL */
03186 
03187     return c;
03188 }
03189 
03190 /* Reduce the number back to 2048 bits using Montgomery reduction.
03191  *
03192  * a   A single precision number to reduce in place.
03193  * m   The single precision number representing the modulus.
03194  * mp  The digit representing the negative inverse of m mod 2^n.
03195  */
03196 SP_NOINLINE static void sp_2048_mont_reduce_32(sp_digit* a, sp_digit* m,
03197         sp_digit mp)
03198 {
03199     sp_digit ca = 0;
03200 
03201     __asm__ __volatile__ (
03202         "ldp       x12, x13, [%[m], 0]\n\t"
03203         "ldp       x14, x15, [%[m], 16]\n\t"
03204         "ldp       x16, x17, [%[m], 32]\n\t"
03205         "ldp       x18, x19, [%[m], 48]\n\t"
03206         "ldp       x20, x21, [%[m], 64]\n\t"
03207         "ldp       x22, x23, [%[m], 80]\n\t"
03208         "ldp       x24, x25, [%[m], 96]\n\t"
03209         "ldp       x26, x27, [%[m], 112]\n\t"
03210         "# i = 0\n\t"
03211         "mov    x3, 0\n\t"
03212         "ldp    x10, x11, [%[a], 0]\n\t"
03213         "\n1:\n\t"
03214         "# mu = a[i] * mp\n\t"
03215         "mul    x8, %[mp], x10\n\t"
03216         "# a[i+0] += m[0] * mu\n\t"
03217         "ldr    x9, [%[a], 0]\n\t"
03218         "mul        x6, x12, x8\n\t"
03219         "umulh  x7, x12, x8\n\t"
03220         "adds   x10, x10, x6\n\t"
03221         "adc    x5, x7, xzr\n\t"
03222         "# a[i+1] += m[1] * mu\n\t"
03223         "ldr    x9, [%[a], 8]\n\t"
03224         "mul        x6, x13, x8\n\t"
03225         "umulh  x7, x13, x8\n\t"
03226         "adds   x10, x11, x6\n\t"
03227         "adc    x4, x7, xzr\n\t"
03228         "adds   x10, x10, x5\n\t"
03229         "adc    x4, x4, xzr\n\t"
03230         "# a[i+2] += m[2] * mu\n\t"
03231         "ldr    x11, [%[a], 16]\n\t"
03232         "mul        x6, x14, x8\n\t"
03233         "umulh  x7, x14, x8\n\t"
03234         "adds   x11, x11, x6\n\t"
03235         "adc    x5, x7, xzr\n\t"
03236         "adds   x11, x11, x4\n\t"
03237         "adc    x5, x5, xzr\n\t"
03238         "# a[i+3] += m[3] * mu\n\t"
03239         "ldr    x9, [%[a], 24]\n\t"
03240         "mul        x6, x15, x8\n\t"
03241         "umulh  x7, x15, x8\n\t"
03242         "adds   x9, x9, x6\n\t"
03243         "adc    x4, x7, xzr\n\t"
03244         "adds   x9, x9, x5\n\t"
03245         "str    x9, [%[a], 24]\n\t"
03246         "adc    x4, x4, xzr\n\t"
03247         "# a[i+4] += m[4] * mu\n\t"
03248         "ldr    x9, [%[a], 32]\n\t"
03249         "mul        x6, x16, x8\n\t"
03250         "umulh  x7, x16, x8\n\t"
03251         "adds   x9, x9, x6\n\t"
03252         "adc    x5, x7, xzr\n\t"
03253         "adds   x9, x9, x4\n\t"
03254         "str    x9, [%[a], 32]\n\t"
03255         "adc    x5, x5, xzr\n\t"
03256         "# a[i+5] += m[5] * mu\n\t"
03257         "ldr    x9, [%[a], 40]\n\t"
03258         "mul        x6, x17, x8\n\t"
03259         "umulh  x7, x17, x8\n\t"
03260         "adds   x9, x9, x6\n\t"
03261         "adc    x4, x7, xzr\n\t"
03262         "adds   x9, x9, x5\n\t"
03263         "str    x9, [%[a], 40]\n\t"
03264         "adc    x4, x4, xzr\n\t"
03265         "# a[i+6] += m[6] * mu\n\t"
03266         "ldr    x9, [%[a], 48]\n\t"
03267         "mul        x6, x18, x8\n\t"
03268         "umulh  x7, x18, x8\n\t"
03269         "adds   x9, x9, x6\n\t"
03270         "adc    x5, x7, xzr\n\t"
03271         "adds   x9, x9, x4\n\t"
03272         "str    x9, [%[a], 48]\n\t"
03273         "adc    x5, x5, xzr\n\t"
03274         "# a[i+7] += m[7] * mu\n\t"
03275         "ldr    x9, [%[a], 56]\n\t"
03276         "mul        x6, x19, x8\n\t"
03277         "umulh  x7, x19, x8\n\t"
03278         "adds   x9, x9, x6\n\t"
03279         "adc    x4, x7, xzr\n\t"
03280         "adds   x9, x9, x5\n\t"
03281         "str    x9, [%[a], 56]\n\t"
03282         "adc    x4, x4, xzr\n\t"
03283         "# a[i+8] += m[8] * mu\n\t"
03284         "ldr    x9, [%[a], 64]\n\t"
03285         "mul        x6, x20, x8\n\t"
03286         "umulh  x7, x20, x8\n\t"
03287         "adds   x9, x9, x6\n\t"
03288         "adc    x5, x7, xzr\n\t"
03289         "adds   x9, x9, x4\n\t"
03290         "str    x9, [%[a], 64]\n\t"
03291         "adc    x5, x5, xzr\n\t"
03292         "# a[i+9] += m[9] * mu\n\t"
03293         "ldr    x9, [%[a], 72]\n\t"
03294         "mul        x6, x21, x8\n\t"
03295         "umulh  x7, x21, x8\n\t"
03296         "adds   x9, x9, x6\n\t"
03297         "adc    x4, x7, xzr\n\t"
03298         "adds   x9, x9, x5\n\t"
03299         "str    x9, [%[a], 72]\n\t"
03300         "adc    x4, x4, xzr\n\t"
03301         "# a[i+10] += m[10] * mu\n\t"
03302         "ldr    x9, [%[a], 80]\n\t"
03303         "mul        x6, x22, x8\n\t"
03304         "umulh  x7, x22, x8\n\t"
03305         "adds   x9, x9, x6\n\t"
03306         "adc    x5, x7, xzr\n\t"
03307         "adds   x9, x9, x4\n\t"
03308         "str    x9, [%[a], 80]\n\t"
03309         "adc    x5, x5, xzr\n\t"
03310         "# a[i+11] += m[11] * mu\n\t"
03311         "ldr    x9, [%[a], 88]\n\t"
03312         "mul        x6, x23, x8\n\t"
03313         "umulh  x7, x23, x8\n\t"
03314         "adds   x9, x9, x6\n\t"
03315         "adc    x4, x7, xzr\n\t"
03316         "adds   x9, x9, x5\n\t"
03317         "str    x9, [%[a], 88]\n\t"
03318         "adc    x4, x4, xzr\n\t"
03319         "# a[i+12] += m[12] * mu\n\t"
03320         "ldr    x9, [%[a], 96]\n\t"
03321         "mul        x6, x24, x8\n\t"
03322         "umulh  x7, x24, x8\n\t"
03323         "adds   x9, x9, x6\n\t"
03324         "adc    x5, x7, xzr\n\t"
03325         "adds   x9, x9, x4\n\t"
03326         "str    x9, [%[a], 96]\n\t"
03327         "adc    x5, x5, xzr\n\t"
03328         "# a[i+13] += m[13] * mu\n\t"
03329         "ldr    x9, [%[a], 104]\n\t"
03330         "mul        x6, x25, x8\n\t"
03331         "umulh  x7, x25, x8\n\t"
03332         "adds   x9, x9, x6\n\t"
03333         "adc    x4, x7, xzr\n\t"
03334         "adds   x9, x9, x5\n\t"
03335         "str    x9, [%[a], 104]\n\t"
03336         "adc    x4, x4, xzr\n\t"
03337         "# a[i+14] += m[14] * mu\n\t"
03338         "ldr    x9, [%[a], 112]\n\t"
03339         "mul        x6, x26, x8\n\t"
03340         "umulh  x7, x26, x8\n\t"
03341         "adds   x9, x9, x6\n\t"
03342         "adc    x5, x7, xzr\n\t"
03343         "adds   x9, x9, x4\n\t"
03344         "str    x9, [%[a], 112]\n\t"
03345         "adc    x5, x5, xzr\n\t"
03346         "# a[i+15] += m[15] * mu\n\t"
03347         "ldr    x9, [%[a], 120]\n\t"
03348         "mul        x6, x27, x8\n\t"
03349         "umulh  x7, x27, x8\n\t"
03350         "adds   x9, x9, x6\n\t"
03351         "adc    x4, x7, xzr\n\t"
03352         "adds   x9, x9, x5\n\t"
03353         "str    x9, [%[a], 120]\n\t"
03354         "adc    x4, x4, xzr\n\t"
03355         "# a[i+16] += m[16] * mu\n\t"
03356         "ldr        x7, [%[m], 128]\n\t"
03357         "ldr    x9, [%[a], 128]\n\t"
03358         "mul        x6, x7, x8\n\t"
03359         "umulh  x7, x7, x8\n\t"
03360         "adds   x9, x9, x6\n\t"
03361         "adc    x5, x7, xzr\n\t"
03362         "adds   x9, x9, x4\n\t"
03363         "str    x9, [%[a], 128]\n\t"
03364         "adc    x5, x5, xzr\n\t"
03365         "# a[i+17] += m[17] * mu\n\t"
03366         "ldr        x7, [%[m], 136]\n\t"
03367         "ldr    x9, [%[a], 136]\n\t"
03368         "mul        x6, x7, x8\n\t"
03369         "umulh  x7, x7, x8\n\t"
03370         "adds   x9, x9, x6\n\t"
03371         "adc    x4, x7, xzr\n\t"
03372         "adds   x9, x9, x5\n\t"
03373         "str    x9, [%[a], 136]\n\t"
03374         "adc    x4, x4, xzr\n\t"
03375         "# a[i+18] += m[18] * mu\n\t"
03376         "ldr        x7, [%[m], 144]\n\t"
03377         "ldr    x9, [%[a], 144]\n\t"
03378         "mul        x6, x7, x8\n\t"
03379         "umulh  x7, x7, x8\n\t"
03380         "adds   x9, x9, x6\n\t"
03381         "adc    x5, x7, xzr\n\t"
03382         "adds   x9, x9, x4\n\t"
03383         "str    x9, [%[a], 144]\n\t"
03384         "adc    x5, x5, xzr\n\t"
03385         "# a[i+19] += m[19] * mu\n\t"
03386         "ldr        x7, [%[m], 152]\n\t"
03387         "ldr    x9, [%[a], 152]\n\t"
03388         "mul        x6, x7, x8\n\t"
03389         "umulh  x7, x7, x8\n\t"
03390         "adds   x9, x9, x6\n\t"
03391         "adc    x4, x7, xzr\n\t"
03392         "adds   x9, x9, x5\n\t"
03393         "str    x9, [%[a], 152]\n\t"
03394         "adc    x4, x4, xzr\n\t"
03395         "# a[i+20] += m[20] * mu\n\t"
03396         "ldr        x7, [%[m], 160]\n\t"
03397         "ldr    x9, [%[a], 160]\n\t"
03398         "mul        x6, x7, x8\n\t"
03399         "umulh  x7, x7, x8\n\t"
03400         "adds   x9, x9, x6\n\t"
03401         "adc    x5, x7, xzr\n\t"
03402         "adds   x9, x9, x4\n\t"
03403         "str    x9, [%[a], 160]\n\t"
03404         "adc    x5, x5, xzr\n\t"
03405         "# a[i+21] += m[21] * mu\n\t"
03406         "ldr        x7, [%[m], 168]\n\t"
03407         "ldr    x9, [%[a], 168]\n\t"
03408         "mul        x6, x7, x8\n\t"
03409         "umulh  x7, x7, x8\n\t"
03410         "adds   x9, x9, x6\n\t"
03411         "adc    x4, x7, xzr\n\t"
03412         "adds   x9, x9, x5\n\t"
03413         "str    x9, [%[a], 168]\n\t"
03414         "adc    x4, x4, xzr\n\t"
03415         "# a[i+22] += m[22] * mu\n\t"
03416         "ldr        x7, [%[m], 176]\n\t"
03417         "ldr    x9, [%[a], 176]\n\t"
03418         "mul        x6, x7, x8\n\t"
03419         "umulh  x7, x7, x8\n\t"
03420         "adds   x9, x9, x6\n\t"
03421         "adc    x5, x7, xzr\n\t"
03422         "adds   x9, x9, x4\n\t"
03423         "str    x9, [%[a], 176]\n\t"
03424         "adc    x5, x5, xzr\n\t"
03425         "# a[i+23] += m[23] * mu\n\t"
03426         "ldr        x7, [%[m], 184]\n\t"
03427         "ldr    x9, [%[a], 184]\n\t"
03428         "mul        x6, x7, x8\n\t"
03429         "umulh  x7, x7, x8\n\t"
03430         "adds   x9, x9, x6\n\t"
03431         "adc    x4, x7, xzr\n\t"
03432         "adds   x9, x9, x5\n\t"
03433         "str    x9, [%[a], 184]\n\t"
03434         "adc    x4, x4, xzr\n\t"
03435         "# a[i+24] += m[24] * mu\n\t"
03436         "ldr        x7, [%[m], 192]\n\t"
03437         "ldr    x9, [%[a], 192]\n\t"
03438         "mul        x6, x7, x8\n\t"
03439         "umulh  x7, x7, x8\n\t"
03440         "adds   x9, x9, x6\n\t"
03441         "adc    x5, x7, xzr\n\t"
03442         "adds   x9, x9, x4\n\t"
03443         "str    x9, [%[a], 192]\n\t"
03444         "adc    x5, x5, xzr\n\t"
03445         "# a[i+25] += m[25] * mu\n\t"
03446         "ldr        x7, [%[m], 200]\n\t"
03447         "ldr    x9, [%[a], 200]\n\t"
03448         "mul        x6, x7, x8\n\t"
03449         "umulh  x7, x7, x8\n\t"
03450         "adds   x9, x9, x6\n\t"
03451         "adc    x4, x7, xzr\n\t"
03452         "adds   x9, x9, x5\n\t"
03453         "str    x9, [%[a], 200]\n\t"
03454         "adc    x4, x4, xzr\n\t"
03455         "# a[i+26] += m[26] * mu\n\t"
03456         "ldr        x7, [%[m], 208]\n\t"
03457         "ldr    x9, [%[a], 208]\n\t"
03458         "mul        x6, x7, x8\n\t"
03459         "umulh  x7, x7, x8\n\t"
03460         "adds   x9, x9, x6\n\t"
03461         "adc    x5, x7, xzr\n\t"
03462         "adds   x9, x9, x4\n\t"
03463         "str    x9, [%[a], 208]\n\t"
03464         "adc    x5, x5, xzr\n\t"
03465         "# a[i+27] += m[27] * mu\n\t"
03466         "ldr        x7, [%[m], 216]\n\t"
03467         "ldr    x9, [%[a], 216]\n\t"
03468         "mul        x6, x7, x8\n\t"
03469         "umulh  x7, x7, x8\n\t"
03470         "adds   x9, x9, x6\n\t"
03471         "adc    x4, x7, xzr\n\t"
03472         "adds   x9, x9, x5\n\t"
03473         "str    x9, [%[a], 216]\n\t"
03474         "adc    x4, x4, xzr\n\t"
03475         "# a[i+28] += m[28] * mu\n\t"
03476         "ldr        x7, [%[m], 224]\n\t"
03477         "ldr    x9, [%[a], 224]\n\t"
03478         "mul        x6, x7, x8\n\t"
03479         "umulh  x7, x7, x8\n\t"
03480         "adds   x9, x9, x6\n\t"
03481         "adc    x5, x7, xzr\n\t"
03482         "adds   x9, x9, x4\n\t"
03483         "str    x9, [%[a], 224]\n\t"
03484         "adc    x5, x5, xzr\n\t"
03485         "# a[i+29] += m[29] * mu\n\t"
03486         "ldr        x7, [%[m], 232]\n\t"
03487         "ldr    x9, [%[a], 232]\n\t"
03488         "mul        x6, x7, x8\n\t"
03489         "umulh  x7, x7, x8\n\t"
03490         "adds   x9, x9, x6\n\t"
03491         "adc    x4, x7, xzr\n\t"
03492         "adds   x9, x9, x5\n\t"
03493         "str    x9, [%[a], 232]\n\t"
03494         "adc    x4, x4, xzr\n\t"
03495         "# a[i+30] += m[30] * mu\n\t"
03496         "ldr        x7, [%[m], 240]\n\t"
03497         "ldr    x9, [%[a], 240]\n\t"
03498         "mul        x6, x7, x8\n\t"
03499         "umulh  x7, x7, x8\n\t"
03500         "adds   x9, x9, x6\n\t"
03501         "adc    x5, x7, xzr\n\t"
03502         "adds   x9, x9, x4\n\t"
03503         "str    x9, [%[a], 240]\n\t"
03504         "adc    x5, x5, xzr\n\t"
03505         "# a[i+31] += m[31] * mu\n\t"
03506         "ldr    x7, [%[m], 248]\n\t"
03507         "ldr    x9, [%[a], 248]\n\t"
03508         "mul    x6, x7, x8\n\t"
03509         "umulh  x7, x7, x8\n\t"
03510         "adds   x5, x5, x6\n\t"
03511         "adcs   x7, x7, %[ca]\n\t"
03512         "cset  %[ca], cs\n\t"
03513         "adds   x9, x9, x5\n\t"
03514         "str    x9, [%[a], 248]\n\t"
03515         "ldr    x9, [%[a], 256]\n\t"
03516         "adcs   x9, x9, x7\n\t"
03517         "str    x9, [%[a], 256]\n\t"
03518         "adc    %[ca], %[ca], xzr\n\t"
03519         "# i += 1\n\t"
03520         "add    %[a], %[a], 8\n\t"
03521         "add    x3, x3, 8\n\t"
03522         "cmp    x3, 256\n\t"
03523         "blt    1b\n\t"
03524         "str    x10, [%[a], 0]\n\t"
03525         "str    x11, [%[a], 8]\n\t"
03526         : [ca] "+r" (ca), [a] "+r" (a)
03527         : [m] "r" (m), [mp] "r" (mp)
03528         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27"
03529     );
03530 
03531     sp_2048_cond_sub_32(a - 32, a, m, (sp_digit)0 - ca);
03532 }
03533 
03534 /* Multiply two Montogmery form numbers mod the modulus (prime).
03535  * (r = a * b mod m)
03536  *
03537  * r   Result of multiplication.
03538  * a   First number to multiply in Montogmery form.
03539  * b   Second number to multiply in Montogmery form.
03540  * m   Modulus (prime).
03541  * mp  Montogmery mulitplier.
03542  */
03543 static void sp_2048_mont_mul_32(sp_digit* r, sp_digit* a, sp_digit* b,
03544         sp_digit* m, sp_digit mp)
03545 {
03546     sp_2048_mul_32(r, a, b);
03547     sp_2048_mont_reduce_32(r, m, mp);
03548 }
03549 
03550 /* Square the Montgomery form number. (r = a * a mod m)
03551  *
03552  * r   Result of squaring.
03553  * a   Number to square in Montogmery form.
03554  * m   Modulus (prime).
03555  * mp  Montogmery mulitplier.
03556  */
03557 static void sp_2048_mont_sqr_32(sp_digit* r, sp_digit* a, sp_digit* m,
03558         sp_digit mp)
03559 {
03560     sp_2048_sqr_32(r, a);
03561     sp_2048_mont_reduce_32(r, m, mp);
03562 }
03563 
03564 /* Mul a by digit b into r. (r = a * b)
03565  *
03566  * r  A single precision integer.
03567  * a  A single precision integer.
03568  * b  A single precision digit.
03569  */
03570 static void sp_2048_mul_d_32(sp_digit* r, const sp_digit* a,
03571         const sp_digit b)
03572 {
03573 #ifdef WOLFSSL_SP_SMALL
03574     __asm__ __volatile__ (
03575         "# A[0] * B\n\t"
03576         "ldr    x8, [%[a]]\n\t"
03577         "mul    x5, %[b], x8\n\t"
03578         "umulh  x3, %[b], x8\n\t"
03579         "mov    x4, 0\n\t"
03580         "str    x5, [%[r]]\n\t"
03581         "mov    x5, 0\n\t"
03582         "mov    x9, #8\n\t"
03583         "1:\n\t"
03584         "ldr    x8, [%[a], x9]\n\t"
03585         "mul    x6, %[b], x8\n\t"
03586         "umulh  x7, %[b], x8\n\t"
03587         "adds   x3, x3, x6\n\t"
03588         "adcs   x4, x4, x7\n\t"
03589         "adc    x5, xzr, xzr\n\t"
03590         "str    x3, [%[r], x9]\n\t"
03591         "mov    x3, x4\n\t"
03592         "mov    x4, x5\n\t"
03593         "mov    x5, #0\n\t"
03594         "add    x9, x9, #8\n\t"
03595         "cmp    x9, 256\n\t"
03596         "b.lt   1b\n\t"
03597         "str    x3, [%[r], 256]\n\t"
03598         :
03599         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
03600         : "memory", "x3", "x4", "x5", "x6", "x7", "x8"
03601     );
03602 #else
03603     __asm__ __volatile__ (
03604         "# A[0] * B\n\t"
03605         "ldr    x8, [%[a]]\n\t"
03606         "mul    x3, %[b], x8\n\t"
03607         "umulh  x4, %[b], x8\n\t"
03608         "mov    x5, 0\n\t"
03609         "str    x3, [%[r]]\n\t"
03610         "# A[1] * B\n\t"
03611         "ldr        x8, [%[a], 8]\n\t"
03612         "mov        x3, 0\n\t"
03613         "mul        x6, %[b], x8\n\t"
03614         "umulh  x7, %[b], x8\n\t"
03615         "adds   x4, x4, x6\n\t"
03616         "adcs   x5, x5, x7\n\t"
03617         "adc        x3, xzr, xzr\n\t"
03618         "str        x4, [%[r], 8]\n\t"
03619         "# A[2] * B\n\t"
03620         "ldr        x8, [%[a], 16]\n\t"
03621         "mov        x4, 0\n\t"
03622         "mul        x6, %[b], x8\n\t"
03623         "umulh  x7, %[b], x8\n\t"
03624         "adds   x5, x5, x6\n\t"
03625         "adcs   x3, x3, x7\n\t"
03626         "adc        x4, xzr, xzr\n\t"
03627         "str        x5, [%[r], 16]\n\t"
03628         "# A[3] * B\n\t"
03629         "ldr        x8, [%[a], 24]\n\t"
03630         "mov        x5, 0\n\t"
03631         "mul        x6, %[b], x8\n\t"
03632         "umulh  x7, %[b], x8\n\t"
03633         "adds   x3, x3, x6\n\t"
03634         "adcs   x4, x4, x7\n\t"
03635         "adc        x5, xzr, xzr\n\t"
03636         "str        x3, [%[r], 24]\n\t"
03637         "# A[4] * B\n\t"
03638         "ldr        x8, [%[a], 32]\n\t"
03639         "mov        x3, 0\n\t"
03640         "mul        x6, %[b], x8\n\t"
03641         "umulh  x7, %[b], x8\n\t"
03642         "adds   x4, x4, x6\n\t"
03643         "adcs   x5, x5, x7\n\t"
03644         "adc        x3, xzr, xzr\n\t"
03645         "str        x4, [%[r], 32]\n\t"
03646         "# A[5] * B\n\t"
03647         "ldr        x8, [%[a], 40]\n\t"
03648         "mov        x4, 0\n\t"
03649         "mul        x6, %[b], x8\n\t"
03650         "umulh  x7, %[b], x8\n\t"
03651         "adds   x5, x5, x6\n\t"
03652         "adcs   x3, x3, x7\n\t"
03653         "adc        x4, xzr, xzr\n\t"
03654         "str        x5, [%[r], 40]\n\t"
03655         "# A[6] * B\n\t"
03656         "ldr        x8, [%[a], 48]\n\t"
03657         "mov        x5, 0\n\t"
03658         "mul        x6, %[b], x8\n\t"
03659         "umulh  x7, %[b], x8\n\t"
03660         "adds   x3, x3, x6\n\t"
03661         "adcs   x4, x4, x7\n\t"
03662         "adc        x5, xzr, xzr\n\t"
03663         "str        x3, [%[r], 48]\n\t"
03664         "# A[7] * B\n\t"
03665         "ldr        x8, [%[a], 56]\n\t"
03666         "mov        x3, 0\n\t"
03667         "mul        x6, %[b], x8\n\t"
03668         "umulh  x7, %[b], x8\n\t"
03669         "adds   x4, x4, x6\n\t"
03670         "adcs   x5, x5, x7\n\t"
03671         "adc        x3, xzr, xzr\n\t"
03672         "str        x4, [%[r], 56]\n\t"
03673         "# A[8] * B\n\t"
03674         "ldr        x8, [%[a], 64]\n\t"
03675         "mov        x4, 0\n\t"
03676         "mul        x6, %[b], x8\n\t"
03677         "umulh  x7, %[b], x8\n\t"
03678         "adds   x5, x5, x6\n\t"
03679         "adcs   x3, x3, x7\n\t"
03680         "adc        x4, xzr, xzr\n\t"
03681         "str        x5, [%[r], 64]\n\t"
03682         "# A[9] * B\n\t"
03683         "ldr        x8, [%[a], 72]\n\t"
03684         "mov        x5, 0\n\t"
03685         "mul        x6, %[b], x8\n\t"
03686         "umulh  x7, %[b], x8\n\t"
03687         "adds   x3, x3, x6\n\t"
03688         "adcs   x4, x4, x7\n\t"
03689         "adc        x5, xzr, xzr\n\t"
03690         "str        x3, [%[r], 72]\n\t"
03691         "# A[10] * B\n\t"
03692         "ldr        x8, [%[a], 80]\n\t"
03693         "mov        x3, 0\n\t"
03694         "mul        x6, %[b], x8\n\t"
03695         "umulh  x7, %[b], x8\n\t"
03696         "adds   x4, x4, x6\n\t"
03697         "adcs   x5, x5, x7\n\t"
03698         "adc        x3, xzr, xzr\n\t"
03699         "str        x4, [%[r], 80]\n\t"
03700         "# A[11] * B\n\t"
03701         "ldr        x8, [%[a], 88]\n\t"
03702         "mov        x4, 0\n\t"
03703         "mul        x6, %[b], x8\n\t"
03704         "umulh  x7, %[b], x8\n\t"
03705         "adds   x5, x5, x6\n\t"
03706         "adcs   x3, x3, x7\n\t"
03707         "adc        x4, xzr, xzr\n\t"
03708         "str        x5, [%[r], 88]\n\t"
03709         "# A[12] * B\n\t"
03710         "ldr        x8, [%[a], 96]\n\t"
03711         "mov        x5, 0\n\t"
03712         "mul        x6, %[b], x8\n\t"
03713         "umulh  x7, %[b], x8\n\t"
03714         "adds   x3, x3, x6\n\t"
03715         "adcs   x4, x4, x7\n\t"
03716         "adc        x5, xzr, xzr\n\t"
03717         "str        x3, [%[r], 96]\n\t"
03718         "# A[13] * B\n\t"
03719         "ldr        x8, [%[a], 104]\n\t"
03720         "mov        x3, 0\n\t"
03721         "mul        x6, %[b], x8\n\t"
03722         "umulh  x7, %[b], x8\n\t"
03723         "adds   x4, x4, x6\n\t"
03724         "adcs   x5, x5, x7\n\t"
03725         "adc        x3, xzr, xzr\n\t"
03726         "str        x4, [%[r], 104]\n\t"
03727         "# A[14] * B\n\t"
03728         "ldr        x8, [%[a], 112]\n\t"
03729         "mov        x4, 0\n\t"
03730         "mul        x6, %[b], x8\n\t"
03731         "umulh  x7, %[b], x8\n\t"
03732         "adds   x5, x5, x6\n\t"
03733         "adcs   x3, x3, x7\n\t"
03734         "adc        x4, xzr, xzr\n\t"
03735         "str        x5, [%[r], 112]\n\t"
03736         "# A[15] * B\n\t"
03737         "ldr        x8, [%[a], 120]\n\t"
03738         "mov        x5, 0\n\t"
03739         "mul        x6, %[b], x8\n\t"
03740         "umulh  x7, %[b], x8\n\t"
03741         "adds   x3, x3, x6\n\t"
03742         "adcs   x4, x4, x7\n\t"
03743         "adc        x5, xzr, xzr\n\t"
03744         "str        x3, [%[r], 120]\n\t"
03745         "# A[16] * B\n\t"
03746         "ldr        x8, [%[a], 128]\n\t"
03747         "mov        x3, 0\n\t"
03748         "mul        x6, %[b], x8\n\t"
03749         "umulh  x7, %[b], x8\n\t"
03750         "adds   x4, x4, x6\n\t"
03751         "adcs   x5, x5, x7\n\t"
03752         "adc        x3, xzr, xzr\n\t"
03753         "str        x4, [%[r], 128]\n\t"
03754         "# A[17] * B\n\t"
03755         "ldr        x8, [%[a], 136]\n\t"
03756         "mov        x4, 0\n\t"
03757         "mul        x6, %[b], x8\n\t"
03758         "umulh  x7, %[b], x8\n\t"
03759         "adds   x5, x5, x6\n\t"
03760         "adcs   x3, x3, x7\n\t"
03761         "adc        x4, xzr, xzr\n\t"
03762         "str        x5, [%[r], 136]\n\t"
03763         "# A[18] * B\n\t"
03764         "ldr        x8, [%[a], 144]\n\t"
03765         "mov        x5, 0\n\t"
03766         "mul        x6, %[b], x8\n\t"
03767         "umulh  x7, %[b], x8\n\t"
03768         "adds   x3, x3, x6\n\t"
03769         "adcs   x4, x4, x7\n\t"
03770         "adc        x5, xzr, xzr\n\t"
03771         "str        x3, [%[r], 144]\n\t"
03772         "# A[19] * B\n\t"
03773         "ldr        x8, [%[a], 152]\n\t"
03774         "mov        x3, 0\n\t"
03775         "mul        x6, %[b], x8\n\t"
03776         "umulh  x7, %[b], x8\n\t"
03777         "adds   x4, x4, x6\n\t"
03778         "adcs   x5, x5, x7\n\t"
03779         "adc        x3, xzr, xzr\n\t"
03780         "str        x4, [%[r], 152]\n\t"
03781         "# A[20] * B\n\t"
03782         "ldr        x8, [%[a], 160]\n\t"
03783         "mov        x4, 0\n\t"
03784         "mul        x6, %[b], x8\n\t"
03785         "umulh  x7, %[b], x8\n\t"
03786         "adds   x5, x5, x6\n\t"
03787         "adcs   x3, x3, x7\n\t"
03788         "adc        x4, xzr, xzr\n\t"
03789         "str        x5, [%[r], 160]\n\t"
03790         "# A[21] * B\n\t"
03791         "ldr        x8, [%[a], 168]\n\t"
03792         "mov        x5, 0\n\t"
03793         "mul        x6, %[b], x8\n\t"
03794         "umulh  x7, %[b], x8\n\t"
03795         "adds   x3, x3, x6\n\t"
03796         "adcs   x4, x4, x7\n\t"
03797         "adc        x5, xzr, xzr\n\t"
03798         "str        x3, [%[r], 168]\n\t"
03799         "# A[22] * B\n\t"
03800         "ldr        x8, [%[a], 176]\n\t"
03801         "mov        x3, 0\n\t"
03802         "mul        x6, %[b], x8\n\t"
03803         "umulh  x7, %[b], x8\n\t"
03804         "adds   x4, x4, x6\n\t"
03805         "adcs   x5, x5, x7\n\t"
03806         "adc        x3, xzr, xzr\n\t"
03807         "str        x4, [%[r], 176]\n\t"
03808         "# A[23] * B\n\t"
03809         "ldr        x8, [%[a], 184]\n\t"
03810         "mov        x4, 0\n\t"
03811         "mul        x6, %[b], x8\n\t"
03812         "umulh  x7, %[b], x8\n\t"
03813         "adds   x5, x5, x6\n\t"
03814         "adcs   x3, x3, x7\n\t"
03815         "adc        x4, xzr, xzr\n\t"
03816         "str        x5, [%[r], 184]\n\t"
03817         "# A[24] * B\n\t"
03818         "ldr        x8, [%[a], 192]\n\t"
03819         "mov        x5, 0\n\t"
03820         "mul        x6, %[b], x8\n\t"
03821         "umulh  x7, %[b], x8\n\t"
03822         "adds   x3, x3, x6\n\t"
03823         "adcs   x4, x4, x7\n\t"
03824         "adc        x5, xzr, xzr\n\t"
03825         "str        x3, [%[r], 192]\n\t"
03826         "# A[25] * B\n\t"
03827         "ldr        x8, [%[a], 200]\n\t"
03828         "mov        x3, 0\n\t"
03829         "mul        x6, %[b], x8\n\t"
03830         "umulh  x7, %[b], x8\n\t"
03831         "adds   x4, x4, x6\n\t"
03832         "adcs   x5, x5, x7\n\t"
03833         "adc        x3, xzr, xzr\n\t"
03834         "str        x4, [%[r], 200]\n\t"
03835         "# A[26] * B\n\t"
03836         "ldr        x8, [%[a], 208]\n\t"
03837         "mov        x4, 0\n\t"
03838         "mul        x6, %[b], x8\n\t"
03839         "umulh  x7, %[b], x8\n\t"
03840         "adds   x5, x5, x6\n\t"
03841         "adcs   x3, x3, x7\n\t"
03842         "adc        x4, xzr, xzr\n\t"
03843         "str        x5, [%[r], 208]\n\t"
03844         "# A[27] * B\n\t"
03845         "ldr        x8, [%[a], 216]\n\t"
03846         "mov        x5, 0\n\t"
03847         "mul        x6, %[b], x8\n\t"
03848         "umulh  x7, %[b], x8\n\t"
03849         "adds   x3, x3, x6\n\t"
03850         "adcs   x4, x4, x7\n\t"
03851         "adc        x5, xzr, xzr\n\t"
03852         "str        x3, [%[r], 216]\n\t"
03853         "# A[28] * B\n\t"
03854         "ldr        x8, [%[a], 224]\n\t"
03855         "mov        x3, 0\n\t"
03856         "mul        x6, %[b], x8\n\t"
03857         "umulh  x7, %[b], x8\n\t"
03858         "adds   x4, x4, x6\n\t"
03859         "adcs   x5, x5, x7\n\t"
03860         "adc        x3, xzr, xzr\n\t"
03861         "str        x4, [%[r], 224]\n\t"
03862         "# A[29] * B\n\t"
03863         "ldr        x8, [%[a], 232]\n\t"
03864         "mov        x4, 0\n\t"
03865         "mul        x6, %[b], x8\n\t"
03866         "umulh  x7, %[b], x8\n\t"
03867         "adds   x5, x5, x6\n\t"
03868         "adcs   x3, x3, x7\n\t"
03869         "adc        x4, xzr, xzr\n\t"
03870         "str        x5, [%[r], 232]\n\t"
03871         "# A[30] * B\n\t"
03872         "ldr        x8, [%[a], 240]\n\t"
03873         "mov        x5, 0\n\t"
03874         "mul        x6, %[b], x8\n\t"
03875         "umulh  x7, %[b], x8\n\t"
03876         "adds   x3, x3, x6\n\t"
03877         "adcs   x4, x4, x7\n\t"
03878         "adc        x5, xzr, xzr\n\t"
03879         "str        x3, [%[r], 240]\n\t"
03880         "# A[31] * B\n\t"
03881         "ldr    x8, [%[a], 248]\n\t"
03882         "mul    x6, %[b], x8\n\t"
03883         "umulh  x7, %[b], x8\n\t"
03884         "adds   x4, x4, x6\n\t"
03885         "adc    x5, x5, x7\n\t"
03886         "str    x4, [%[r], 248]\n\t"
03887         "str    x5, [%[r], 256]\n\t"
03888         :
03889         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
03890         : "memory", "x3", "x4", "x5", "x6", "x7", "x8"
03891     );
03892 #endif
03893 }
03894 
03895 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
03896  *
03897  * d1   The high order half of the number to divide.
03898  * d0   The low order half of the number to divide.
03899  * div  The dividend.
03900  * returns the result of the division.
03901  */
03902 static sp_digit div_2048_word_32(sp_digit d1, sp_digit d0, sp_digit div)
03903 {
03904     sp_digit r;
03905 
03906     __asm__ __volatile__ (
03907         "lsr    x5, %[div], 32\n\t"
03908         "add    x5, x5, 1\n\t"
03909 
03910         "udiv   x3, %[d1], x5\n\t"
03911         "lsl    x6, x3, 32\n\t"
03912         "mul    x4, %[div], x6\n\t"
03913         "umulh  x3, %[div], x6\n\t"
03914         "subs   %[d0], %[d0], x4\n\t"
03915         "sbc    %[d1], %[d1], x3\n\t"
03916 
03917         "udiv   x3, %[d1], x5\n\t"
03918         "lsl    x3, x3, 32\n\t"
03919         "add    x6, x6, x3\n\t"
03920         "mul    x4, %[div], x3\n\t"
03921         "umulh  x3, %[div], x3\n\t"
03922         "subs   %[d0], %[d0], x4\n\t"
03923         "sbc    %[d1], %[d1], x3\n\t"
03924 
03925         "lsl    x3, %[d1], 32\n\t"
03926         "orr    x3, x3, %[d0], lsr 32\n\t"
03927 
03928         "udiv   x3, x3, x5\n\t"
03929         "add    x6, x6, x3\n\t"
03930         "mul    x4, %[div], x3\n\t"
03931         "umulh  x3, %[div], x3\n\t"
03932         "subs   %[d0], %[d0], x4\n\t"
03933         "sbc    %[d1], %[d1], x3\n\t"
03934 
03935         "lsl    x3, %[d1], 32\n\t"
03936         "orr    x3, x3, %[d0], lsr 32\n\t"
03937 
03938         "udiv   x3, x3, x5\n\t"
03939         "add    x6, x6, x3\n\t"
03940         "mul    x4, %[div], x3\n\t"
03941         "umulh  x3, %[div], x3\n\t"
03942         "subs   %[d0], %[d0], x4\n\t"
03943         "sbc    %[d1], %[d1], x3\n\t"
03944 
03945         "udiv   x3, %[d0], %[div]\n\t"
03946         "add    x6, x6, x3\n\t"
03947         "mul    x3, %[div], x3\n\t"
03948         "sub    %[d0], %[d0], x3\n\t"
03949         "mov    %[r], x6\n\t"
03950 
03951         : [r] "=r" (r)
03952         : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div)
03953         : "x3", "x4", "x5", "x6"
03954     );
03955 
03956     return r;
03957 }
03958 
03959 /* AND m into each word of a and store in r.
03960  *
03961  * r  A single precision integer.
03962  * a  A single precision integer.
03963  * m  Mask to AND against each digit.
03964  */
03965 static void sp_2048_mask_32(sp_digit* r, sp_digit* a, sp_digit m)
03966 {
03967 #ifdef WOLFSSL_SP_SMALL
03968     int i;
03969 
03970     for (i=0; i<32; i++)
03971         r[i] = a[i] & m;
03972 #else
03973     int i;
03974 
03975     for (i = 0; i < 32; i += 8) {
03976         r[i+0] = a[i+0] & m;
03977         r[i+1] = a[i+1] & m;
03978         r[i+2] = a[i+2] & m;
03979         r[i+3] = a[i+3] & m;
03980         r[i+4] = a[i+4] & m;
03981         r[i+5] = a[i+5] & m;
03982         r[i+6] = a[i+6] & m;
03983         r[i+7] = a[i+7] & m;
03984     }
03985 #endif
03986 }
03987 
03988 /* Compare a with b in constant time.
03989  *
03990  * a  A single precision integer.
03991  * b  A single precision integer.
03992  * return -ve, 0 or +ve if a is less than, equal to or greater than b
03993  * respectively.
03994  */
03995 static int64_t sp_2048_cmp_32(sp_digit* a, sp_digit* b)
03996 {
03997     sp_digit r = -1;
03998     sp_digit one = 1;
03999 
04000 #ifdef WOLFSSL_SP_SMALL
04001     __asm__ __volatile__ (
04002         "mov    x3, -1\n\t"
04003         "mov    x6, 248\n\t"
04004         "1:\n\t"
04005         "ldr    x4, [%[a], x6]\n\t"
04006         "ldr    x5, [%[b], x6]\n\t"
04007         "and    x4, x4, x3\n\t"
04008         "and    x5, x5, x3\n\t"
04009         "subs   x4, x4, x5\n\t"
04010         "csel   %[r], %[one], %[r], hi\n\t"
04011         "csel   %[r], x3, %[r], lo\n\t"
04012         "csel   x3, x3, xzr, eq\n\t"
04013         "sub    x6, x6, #8\n\t"
04014         "b.cc   1b\n\t"
04015         "eor    %[r], %[r], x3\n\t"
04016         : [r] "+r" (r)
04017         : [a] "r" (a), [b] "r" (b), [one] "r" (one)
04018         : "x2", "x3", "x4", "x5", "x6"
04019     );
04020 #else
04021     __asm__ __volatile__ (
04022         "mov    x3, -1\n\t"
04023         "ldr        x4, [%[a], 248]\n\t"
04024         "ldr        x5, [%[b], 248]\n\t"
04025         "and        x4, x4, x3\n\t"
04026         "and        x5, x5, x3\n\t"
04027         "subs   x4, x4, x5\n\t"
04028         "csel   %[r], %[one], %[r], hi\n\t"
04029         "csel   %[r], x3, %[r], lo\n\t"
04030         "csel   x3, x3, xzr, eq\n\t"
04031         "ldr        x4, [%[a], 240]\n\t"
04032         "ldr        x5, [%[b], 240]\n\t"
04033         "and        x4, x4, x3\n\t"
04034         "and        x5, x5, x3\n\t"
04035         "subs   x4, x4, x5\n\t"
04036         "csel   %[r], %[one], %[r], hi\n\t"
04037         "csel   %[r], x3, %[r], lo\n\t"
04038         "csel   x3, x3, xzr, eq\n\t"
04039         "ldr        x4, [%[a], 232]\n\t"
04040         "ldr        x5, [%[b], 232]\n\t"
04041         "and        x4, x4, x3\n\t"
04042         "and        x5, x5, x3\n\t"
04043         "subs   x4, x4, x5\n\t"
04044         "csel   %[r], %[one], %[r], hi\n\t"
04045         "csel   %[r], x3, %[r], lo\n\t"
04046         "csel   x3, x3, xzr, eq\n\t"
04047         "ldr        x4, [%[a], 224]\n\t"
04048         "ldr        x5, [%[b], 224]\n\t"
04049         "and        x4, x4, x3\n\t"
04050         "and        x5, x5, x3\n\t"
04051         "subs   x4, x4, x5\n\t"
04052         "csel   %[r], %[one], %[r], hi\n\t"
04053         "csel   %[r], x3, %[r], lo\n\t"
04054         "csel   x3, x3, xzr, eq\n\t"
04055         "ldr        x4, [%[a], 216]\n\t"
04056         "ldr        x5, [%[b], 216]\n\t"
04057         "and        x4, x4, x3\n\t"
04058         "and        x5, x5, x3\n\t"
04059         "subs   x4, x4, x5\n\t"
04060         "csel   %[r], %[one], %[r], hi\n\t"
04061         "csel   %[r], x3, %[r], lo\n\t"
04062         "csel   x3, x3, xzr, eq\n\t"
04063         "ldr        x4, [%[a], 208]\n\t"
04064         "ldr        x5, [%[b], 208]\n\t"
04065         "and        x4, x4, x3\n\t"
04066         "and        x5, x5, x3\n\t"
04067         "subs   x4, x4, x5\n\t"
04068         "csel   %[r], %[one], %[r], hi\n\t"
04069         "csel   %[r], x3, %[r], lo\n\t"
04070         "csel   x3, x3, xzr, eq\n\t"
04071         "ldr        x4, [%[a], 200]\n\t"
04072         "ldr        x5, [%[b], 200]\n\t"
04073         "and        x4, x4, x3\n\t"
04074         "and        x5, x5, x3\n\t"
04075         "subs   x4, x4, x5\n\t"
04076         "csel   %[r], %[one], %[r], hi\n\t"
04077         "csel   %[r], x3, %[r], lo\n\t"
04078         "csel   x3, x3, xzr, eq\n\t"
04079         "ldr        x4, [%[a], 192]\n\t"
04080         "ldr        x5, [%[b], 192]\n\t"
04081         "and        x4, x4, x3\n\t"
04082         "and        x5, x5, x3\n\t"
04083         "subs   x4, x4, x5\n\t"
04084         "csel   %[r], %[one], %[r], hi\n\t"
04085         "csel   %[r], x3, %[r], lo\n\t"
04086         "csel   x3, x3, xzr, eq\n\t"
04087         "ldr        x4, [%[a], 184]\n\t"
04088         "ldr        x5, [%[b], 184]\n\t"
04089         "and        x4, x4, x3\n\t"
04090         "and        x5, x5, x3\n\t"
04091         "subs   x4, x4, x5\n\t"
04092         "csel   %[r], %[one], %[r], hi\n\t"
04093         "csel   %[r], x3, %[r], lo\n\t"
04094         "csel   x3, x3, xzr, eq\n\t"
04095         "ldr        x4, [%[a], 176]\n\t"
04096         "ldr        x5, [%[b], 176]\n\t"
04097         "and        x4, x4, x3\n\t"
04098         "and        x5, x5, x3\n\t"
04099         "subs   x4, x4, x5\n\t"
04100         "csel   %[r], %[one], %[r], hi\n\t"
04101         "csel   %[r], x3, %[r], lo\n\t"
04102         "csel   x3, x3, xzr, eq\n\t"
04103         "ldr        x4, [%[a], 168]\n\t"
04104         "ldr        x5, [%[b], 168]\n\t"
04105         "and        x4, x4, x3\n\t"
04106         "and        x5, x5, x3\n\t"
04107         "subs   x4, x4, x5\n\t"
04108         "csel   %[r], %[one], %[r], hi\n\t"
04109         "csel   %[r], x3, %[r], lo\n\t"
04110         "csel   x3, x3, xzr, eq\n\t"
04111         "ldr        x4, [%[a], 160]\n\t"
04112         "ldr        x5, [%[b], 160]\n\t"
04113         "and        x4, x4, x3\n\t"
04114         "and        x5, x5, x3\n\t"
04115         "subs   x4, x4, x5\n\t"
04116         "csel   %[r], %[one], %[r], hi\n\t"
04117         "csel   %[r], x3, %[r], lo\n\t"
04118         "csel   x3, x3, xzr, eq\n\t"
04119         "ldr        x4, [%[a], 152]\n\t"
04120         "ldr        x5, [%[b], 152]\n\t"
04121         "and        x4, x4, x3\n\t"
04122         "and        x5, x5, x3\n\t"
04123         "subs   x4, x4, x5\n\t"
04124         "csel   %[r], %[one], %[r], hi\n\t"
04125         "csel   %[r], x3, %[r], lo\n\t"
04126         "csel   x3, x3, xzr, eq\n\t"
04127         "ldr        x4, [%[a], 144]\n\t"
04128         "ldr        x5, [%[b], 144]\n\t"
04129         "and        x4, x4, x3\n\t"
04130         "and        x5, x5, x3\n\t"
04131         "subs   x4, x4, x5\n\t"
04132         "csel   %[r], %[one], %[r], hi\n\t"
04133         "csel   %[r], x3, %[r], lo\n\t"
04134         "csel   x3, x3, xzr, eq\n\t"
04135         "ldr        x4, [%[a], 136]\n\t"
04136         "ldr        x5, [%[b], 136]\n\t"
04137         "and        x4, x4, x3\n\t"
04138         "and        x5, x5, x3\n\t"
04139         "subs   x4, x4, x5\n\t"
04140         "csel   %[r], %[one], %[r], hi\n\t"
04141         "csel   %[r], x3, %[r], lo\n\t"
04142         "csel   x3, x3, xzr, eq\n\t"
04143         "ldr        x4, [%[a], 128]\n\t"
04144         "ldr        x5, [%[b], 128]\n\t"
04145         "and        x4, x4, x3\n\t"
04146         "and        x5, x5, x3\n\t"
04147         "subs   x4, x4, x5\n\t"
04148         "csel   %[r], %[one], %[r], hi\n\t"
04149         "csel   %[r], x3, %[r], lo\n\t"
04150         "csel   x3, x3, xzr, eq\n\t"
04151         "ldr        x4, [%[a], 120]\n\t"
04152         "ldr        x5, [%[b], 120]\n\t"
04153         "and        x4, x4, x3\n\t"
04154         "and        x5, x5, x3\n\t"
04155         "subs   x4, x4, x5\n\t"
04156         "csel   %[r], %[one], %[r], hi\n\t"
04157         "csel   %[r], x3, %[r], lo\n\t"
04158         "csel   x3, x3, xzr, eq\n\t"
04159         "ldr        x4, [%[a], 112]\n\t"
04160         "ldr        x5, [%[b], 112]\n\t"
04161         "and        x4, x4, x3\n\t"
04162         "and        x5, x5, x3\n\t"
04163         "subs   x4, x4, x5\n\t"
04164         "csel   %[r], %[one], %[r], hi\n\t"
04165         "csel   %[r], x3, %[r], lo\n\t"
04166         "csel   x3, x3, xzr, eq\n\t"
04167         "ldr        x4, [%[a], 104]\n\t"
04168         "ldr        x5, [%[b], 104]\n\t"
04169         "and        x4, x4, x3\n\t"
04170         "and        x5, x5, x3\n\t"
04171         "subs   x4, x4, x5\n\t"
04172         "csel   %[r], %[one], %[r], hi\n\t"
04173         "csel   %[r], x3, %[r], lo\n\t"
04174         "csel   x3, x3, xzr, eq\n\t"
04175         "ldr        x4, [%[a], 96]\n\t"
04176         "ldr        x5, [%[b], 96]\n\t"
04177         "and        x4, x4, x3\n\t"
04178         "and        x5, x5, x3\n\t"
04179         "subs   x4, x4, x5\n\t"
04180         "csel   %[r], %[one], %[r], hi\n\t"
04181         "csel   %[r], x3, %[r], lo\n\t"
04182         "csel   x3, x3, xzr, eq\n\t"
04183         "ldr        x4, [%[a], 88]\n\t"
04184         "ldr        x5, [%[b], 88]\n\t"
04185         "and        x4, x4, x3\n\t"
04186         "and        x5, x5, x3\n\t"
04187         "subs   x4, x4, x5\n\t"
04188         "csel   %[r], %[one], %[r], hi\n\t"
04189         "csel   %[r], x3, %[r], lo\n\t"
04190         "csel   x3, x3, xzr, eq\n\t"
04191         "ldr        x4, [%[a], 80]\n\t"
04192         "ldr        x5, [%[b], 80]\n\t"
04193         "and        x4, x4, x3\n\t"
04194         "and        x5, x5, x3\n\t"
04195         "subs   x4, x4, x5\n\t"
04196         "csel   %[r], %[one], %[r], hi\n\t"
04197         "csel   %[r], x3, %[r], lo\n\t"
04198         "csel   x3, x3, xzr, eq\n\t"
04199         "ldr        x4, [%[a], 72]\n\t"
04200         "ldr        x5, [%[b], 72]\n\t"
04201         "and        x4, x4, x3\n\t"
04202         "and        x5, x5, x3\n\t"
04203         "subs   x4, x4, x5\n\t"
04204         "csel   %[r], %[one], %[r], hi\n\t"
04205         "csel   %[r], x3, %[r], lo\n\t"
04206         "csel   x3, x3, xzr, eq\n\t"
04207         "ldr        x4, [%[a], 64]\n\t"
04208         "ldr        x5, [%[b], 64]\n\t"
04209         "and        x4, x4, x3\n\t"
04210         "and        x5, x5, x3\n\t"
04211         "subs   x4, x4, x5\n\t"
04212         "csel   %[r], %[one], %[r], hi\n\t"
04213         "csel   %[r], x3, %[r], lo\n\t"
04214         "csel   x3, x3, xzr, eq\n\t"
04215         "ldr        x4, [%[a], 56]\n\t"
04216         "ldr        x5, [%[b], 56]\n\t"
04217         "and        x4, x4, x3\n\t"
04218         "and        x5, x5, x3\n\t"
04219         "subs   x4, x4, x5\n\t"
04220         "csel   %[r], %[one], %[r], hi\n\t"
04221         "csel   %[r], x3, %[r], lo\n\t"
04222         "csel   x3, x3, xzr, eq\n\t"
04223         "ldr        x4, [%[a], 48]\n\t"
04224         "ldr        x5, [%[b], 48]\n\t"
04225         "and        x4, x4, x3\n\t"
04226         "and        x5, x5, x3\n\t"
04227         "subs   x4, x4, x5\n\t"
04228         "csel   %[r], %[one], %[r], hi\n\t"
04229         "csel   %[r], x3, %[r], lo\n\t"
04230         "csel   x3, x3, xzr, eq\n\t"
04231         "ldr        x4, [%[a], 40]\n\t"
04232         "ldr        x5, [%[b], 40]\n\t"
04233         "and        x4, x4, x3\n\t"
04234         "and        x5, x5, x3\n\t"
04235         "subs   x4, x4, x5\n\t"
04236         "csel   %[r], %[one], %[r], hi\n\t"
04237         "csel   %[r], x3, %[r], lo\n\t"
04238         "csel   x3, x3, xzr, eq\n\t"
04239         "ldr        x4, [%[a], 32]\n\t"
04240         "ldr        x5, [%[b], 32]\n\t"
04241         "and        x4, x4, x3\n\t"
04242         "and        x5, x5, x3\n\t"
04243         "subs   x4, x4, x5\n\t"
04244         "csel   %[r], %[one], %[r], hi\n\t"
04245         "csel   %[r], x3, %[r], lo\n\t"
04246         "csel   x3, x3, xzr, eq\n\t"
04247         "ldr        x4, [%[a], 24]\n\t"
04248         "ldr        x5, [%[b], 24]\n\t"
04249         "and        x4, x4, x3\n\t"
04250         "and        x5, x5, x3\n\t"
04251         "subs   x4, x4, x5\n\t"
04252         "csel   %[r], %[one], %[r], hi\n\t"
04253         "csel   %[r], x3, %[r], lo\n\t"
04254         "csel   x3, x3, xzr, eq\n\t"
04255         "ldr        x4, [%[a], 16]\n\t"
04256         "ldr        x5, [%[b], 16]\n\t"
04257         "and        x4, x4, x3\n\t"
04258         "and        x5, x5, x3\n\t"
04259         "subs   x4, x4, x5\n\t"
04260         "csel   %[r], %[one], %[r], hi\n\t"
04261         "csel   %[r], x3, %[r], lo\n\t"
04262         "csel   x3, x3, xzr, eq\n\t"
04263         "ldr        x4, [%[a], 8]\n\t"
04264         "ldr        x5, [%[b], 8]\n\t"
04265         "and        x4, x4, x3\n\t"
04266         "and        x5, x5, x3\n\t"
04267         "subs   x4, x4, x5\n\t"
04268         "csel   %[r], %[one], %[r], hi\n\t"
04269         "csel   %[r], x3, %[r], lo\n\t"
04270         "csel   x3, x3, xzr, eq\n\t"
04271         "ldr        x4, [%[a], 0]\n\t"
04272         "ldr        x5, [%[b], 0]\n\t"
04273         "and        x4, x4, x3\n\t"
04274         "and        x5, x5, x3\n\t"
04275         "subs   x4, x4, x5\n\t"
04276         "csel   %[r], %[one], %[r], hi\n\t"
04277         "csel   %[r], x3, %[r], lo\n\t"
04278         "csel   x3, x3, xzr, eq\n\t"
04279         "eor    %[r], %[r], x3\n\t"
04280         : [r] "+r" (r)
04281         : [a] "r" (a), [b] "r" (b), [one] "r" (one)
04282         : "x2", "x3", "x4", "x5", "x6"
04283     );
04284 #endif
04285 
04286     return r;
04287 }
04288 
04289 /* Divide d in a and put remainder into r (m*d + r = a)
04290  * m is not calculated as it is not needed at this time.
04291  *
04292  * a  Nmber to be divided.
04293  * d  Number to divide with.
04294  * m  Multiplier result.
04295  * r  Remainder from the division.
04296  * returns MP_OKAY indicating success.
04297  */
04298 static WC_INLINE int sp_2048_div_32(sp_digit* a, sp_digit* d, sp_digit* m,
04299         sp_digit* r)
04300 {
04301     sp_digit t1[64], t2[33];
04302     sp_digit div, r1;
04303     int i;
04304 
04305     (void)m;
04306 
04307     div = d[31];
04308     XMEMCPY(t1, a, sizeof(*t1) * 2 * 32);
04309     for (i=31; i>=0; i--) {
04310         r1 = div_2048_word_32(t1[32 + i], t1[32 + i - 1], div);
04311 
04312         sp_2048_mul_d_32(t2, d, r1);
04313         t1[32 + i] += sp_2048_sub_in_place_32(&t1[i], t2);
04314         t1[32 + i] -= t2[32];
04315         sp_2048_mask_32(t2, d, t1[32 + i]);
04316         t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2);
04317         sp_2048_mask_32(t2, d, t1[32 + i]);
04318         t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2);
04319     }
04320 
04321     r1 = sp_2048_cmp_32(t1, d) >= 0;
04322     sp_2048_cond_sub_32(r, t1, t2, (sp_digit)0 - r1);
04323 
04324     return MP_OKAY;
04325 }
04326 
04327 /* Reduce a modulo m into r. (r = a mod m)
04328  *
04329  * r  A single precision number that is the reduced result.
04330  * a  A single precision number that is to be reduced.
04331  * m  A single precision number that is the modulus to reduce with.
04332  * returns MP_OKAY indicating success.
04333  */
04334 static WC_INLINE int sp_2048_mod_32(sp_digit* r, sp_digit* a, sp_digit* m)
04335 {
04336     return sp_2048_div_32(a, m, NULL, r);
04337 }
04338 
04339 /* Divide d in a and put remainder into r (m*d + r = a)
04340  * m is not calculated as it is not needed at this time.
04341  *
04342  * a  Nmber to be divided.
04343  * d  Number to divide with.
04344  * m  Multiplier result.
04345  * r  Remainder from the division.
04346  * returns MP_OKAY indicating success.
04347  */
04348 static WC_INLINE int sp_2048_div_32_cond(sp_digit* a, sp_digit* d, sp_digit* m,
04349         sp_digit* r)
04350 {
04351     sp_digit t1[64], t2[33];
04352     sp_digit div, r1;
04353     int i;
04354 
04355     (void)m;
04356 
04357     div = d[31];
04358     XMEMCPY(t1, a, sizeof(*t1) * 2 * 32);
04359     for (i=31; i>=0; i--) {
04360         r1 = div_2048_word_32(t1[32 + i], t1[32 + i - 1], div);
04361 
04362         sp_2048_mul_d_32(t2, d, r1);
04363         t1[32 + i] += sp_2048_sub_in_place_32(&t1[i], t2);
04364         t1[32 + i] -= t2[32];
04365         if (t1[32 + i] != 0) {
04366             t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], d);
04367             if (t1[32 + i] != 0)
04368                 t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], d);
04369         }
04370     }
04371 
04372     r1 = sp_2048_cmp_32(t1, d) >= 0;
04373     sp_2048_cond_sub_32(r, t1, t2, (sp_digit)0 - r1);
04374 
04375     return MP_OKAY;
04376 }
04377 
04378 /* Reduce a modulo m into r. (r = a mod m)
04379  *
04380  * r  A single precision number that is the reduced result.
04381  * a  A single precision number that is to be reduced.
04382  * m  A single precision number that is the modulus to reduce with.
04383  * returns MP_OKAY indicating success.
04384  */
04385 static WC_INLINE int sp_2048_mod_32_cond(sp_digit* r, sp_digit* a, sp_digit* m)
04386 {
04387     return sp_2048_div_32_cond(a, m, NULL, r);
04388 }
04389 
04390 #if defined(SP_RSA_PRIVATE_EXP_D) || defined(WOLFSSL_HAVE_SP_DH)
04391 #ifdef WOLFSSL_SP_SMALL
04392 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
04393  *
04394  * r     A single precision number that is the result of the operation.
04395  * a     A single precision number being exponentiated.
04396  * e     A single precision number that is the exponent.
04397  * bits  The number of bits in the exponent.
04398  * m     A single precision number that is the modulus.
04399  * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
04400  */
04401 static int sp_2048_mod_exp_32(sp_digit* r, sp_digit* a, sp_digit* e,
04402         int bits, sp_digit* m, int reduceA)
04403 {
04404 #ifndef WOLFSSL_SMALL_STACK
04405     sp_digit t[16][64];
04406 #else
04407     sp_digit* t[16];
04408     sp_digit* td;
04409 #endif
04410     sp_digit* norm;
04411     sp_digit mp = 1;
04412     sp_digit n;
04413     sp_digit mask;
04414     int i;
04415     int c, y;
04416     int err = MP_OKAY;
04417 
04418 #ifdef WOLFSSL_SMALL_STACK
04419     td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 64, NULL,
04420                             DYNAMIC_TYPE_TMP_BUFFER);
04421     if (td == NULL)
04422         err = MEMORY_E;
04423 
04424     if (err == MP_OKAY) {
04425         for (i=0; i<16; i++)
04426             t[i] = td + i * 64;
04427         norm = t[0];
04428     }
04429 #else
04430     norm = t[0];
04431 #endif
04432 
04433     if (err == MP_OKAY) {
04434         sp_2048_mont_setup(m, &mp);
04435         sp_2048_mont_norm_32(norm, m);
04436 
04437         XMEMSET(t[1], 0, sizeof(sp_digit) * 32);
04438         if (reduceA) {
04439             err = sp_2048_mod_32(t[1] + 32, a, m);
04440             if (err == MP_OKAY)
04441                 err = sp_2048_mod_32(t[1], t[1], m);
04442         }
04443         else {
04444             XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32);
04445             err = sp_2048_mod_32(t[1], t[1], m);
04446         }
04447     }
04448 
04449     if (err == MP_OKAY) {
04450         sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp);
04451         sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp);
04452         sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp);
04453         sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp);
04454         sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp);
04455         sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp);
04456         sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp);
04457         sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp);
04458         sp_2048_mont_sqr_32(t[10], t[ 5], m, mp);
04459         sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp);
04460         sp_2048_mont_sqr_32(t[12], t[ 6], m, mp);
04461         sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp);
04462         sp_2048_mont_sqr_32(t[14], t[ 7], m, mp);
04463         sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp);
04464 
04465         i = (bits - 1) / 64;
04466         n = e[i--];
04467         y = n >> 60;
04468         n <<= 4;
04469         c = 60;
04470         XMEMCPY(r, t[y], sizeof(sp_digit) * 32);
04471         for (; i>=0 || c>=4; ) {
04472             if (c == 0) {
04473                 n = e[i--];
04474                 y = n >> 60;
04475                 n <<= 4;
04476                 c = 60;
04477             }
04478             else if (c < 4) {
04479                 y = n >> 60;
04480                 n = e[i--];
04481                 c = 4 - c;
04482                 y |= n >> (64 - c);
04483                 n <<= c;
04484                 c = 64 - c;
04485             }
04486             else {
04487                 y = (n >> 60) & 0xf;
04488                 n <<= 4;
04489                 c -= 4;
04490             }
04491 
04492             sp_2048_mont_sqr_32(r, r, m, mp);
04493             sp_2048_mont_sqr_32(r, r, m, mp);
04494             sp_2048_mont_sqr_32(r, r, m, mp);
04495             sp_2048_mont_sqr_32(r, r, m, mp);
04496 
04497             sp_2048_mont_mul_32(r, r, t[y], m, mp);
04498         }
04499 
04500         XMEMSET(&r[32], 0, sizeof(sp_digit) * 32);
04501         sp_2048_mont_reduce_32(r, m, mp);
04502 
04503         mask = 0 - (sp_2048_cmp_32(r, m) >= 0);
04504         sp_2048_cond_sub_32(r, r, m, mask);
04505     }
04506 
04507 #ifdef WOLFSSL_SMALL_STACK
04508     if (td != NULL)
04509         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
04510 #endif
04511 
04512     return err;
04513 }
04514 #else
04515 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
04516  *
04517  * r     A single precision number that is the result of the operation.
04518  * a     A single precision number being exponentiated.
04519  * e     A single precision number that is the exponent.
04520  * bits  The number of bits in the exponent.
04521  * m     A single precision number that is the modulus.
04522  * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
04523  */
04524 static int sp_2048_mod_exp_32(sp_digit* r, sp_digit* a, sp_digit* e,
04525         int bits, sp_digit* m, int reduceA)
04526 {
04527 #ifndef WOLFSSL_SMALL_STACK
04528     sp_digit t[32][64];
04529 #else
04530     sp_digit* t[32];
04531     sp_digit* td;
04532 #endif
04533     sp_digit* norm;
04534     sp_digit mp = 1;
04535     sp_digit n;
04536     sp_digit mask;
04537     int i;
04538     int c, y;
04539     int err = MP_OKAY;
04540 
04541 #ifdef WOLFSSL_SMALL_STACK
04542     td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 64, NULL,
04543                             DYNAMIC_TYPE_TMP_BUFFER);
04544     if (td == NULL)
04545         err = MEMORY_E;
04546 
04547     if (err == MP_OKAY) {
04548         for (i=0; i<32; i++)
04549             t[i] = td + i * 64;
04550         norm = t[0];
04551     }
04552 #else
04553     norm = t[0];
04554 #endif
04555 
04556     if (err == MP_OKAY) {
04557         sp_2048_mont_setup(m, &mp);
04558         sp_2048_mont_norm_32(norm, m);
04559 
04560         XMEMSET(t[1], 0, sizeof(sp_digit) * 32);
04561         if (reduceA) {
04562             err = sp_2048_mod_32(t[1] + 32, a, m);
04563             if (err == MP_OKAY)
04564                 err = sp_2048_mod_32(t[1], t[1], m);
04565         }
04566         else {
04567             XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32);
04568             err = sp_2048_mod_32(t[1], t[1], m);
04569         }
04570     }
04571 
04572     if (err == MP_OKAY) {
04573         sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp);
04574         sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp);
04575         sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp);
04576         sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp);
04577         sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp);
04578         sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp);
04579         sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp);
04580         sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp);
04581         sp_2048_mont_sqr_32(t[10], t[ 5], m, mp);
04582         sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp);
04583         sp_2048_mont_sqr_32(t[12], t[ 6], m, mp);
04584         sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp);
04585         sp_2048_mont_sqr_32(t[14], t[ 7], m, mp);
04586         sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp);
04587         sp_2048_mont_sqr_32(t[16], t[ 8], m, mp);
04588         sp_2048_mont_mul_32(t[17], t[ 9], t[ 8], m, mp);
04589         sp_2048_mont_sqr_32(t[18], t[ 9], m, mp);
04590         sp_2048_mont_mul_32(t[19], t[10], t[ 9], m, mp);
04591         sp_2048_mont_sqr_32(t[20], t[10], m, mp);
04592         sp_2048_mont_mul_32(t[21], t[11], t[10], m, mp);
04593         sp_2048_mont_sqr_32(t[22], t[11], m, mp);
04594         sp_2048_mont_mul_32(t[23], t[12], t[11], m, mp);
04595         sp_2048_mont_sqr_32(t[24], t[12], m, mp);
04596         sp_2048_mont_mul_32(t[25], t[13], t[12], m, mp);
04597         sp_2048_mont_sqr_32(t[26], t[13], m, mp);
04598         sp_2048_mont_mul_32(t[27], t[14], t[13], m, mp);
04599         sp_2048_mont_sqr_32(t[28], t[14], m, mp);
04600         sp_2048_mont_mul_32(t[29], t[15], t[14], m, mp);
04601         sp_2048_mont_sqr_32(t[30], t[15], m, mp);
04602         sp_2048_mont_mul_32(t[31], t[16], t[15], m, mp);
04603 
04604         i = (bits - 1) / 64;
04605         n = e[i--];
04606         y = n >> 59;
04607         n <<= 5;
04608         c = 59;
04609         XMEMCPY(r, t[y], sizeof(sp_digit) * 32);
04610         for (; i>=0 || c>=5; ) {
04611             if (c == 0) {
04612                 n = e[i--];
04613                 y = n >> 59;
04614                 n <<= 5;
04615                 c = 59;
04616             }
04617             else if (c < 5) {
04618                 y = n >> 59;
04619                 n = e[i--];
04620                 c = 5 - c;
04621                 y |= n >> (64 - c);
04622                 n <<= c;
04623                 c = 64 - c;
04624             }
04625             else {
04626                 y = (n >> 59) & 0x1f;
04627                 n <<= 5;
04628                 c -= 5;
04629             }
04630 
04631             sp_2048_mont_sqr_32(r, r, m, mp);
04632             sp_2048_mont_sqr_32(r, r, m, mp);
04633             sp_2048_mont_sqr_32(r, r, m, mp);
04634             sp_2048_mont_sqr_32(r, r, m, mp);
04635             sp_2048_mont_sqr_32(r, r, m, mp);
04636 
04637             sp_2048_mont_mul_32(r, r, t[y], m, mp);
04638         }
04639         y = e[0] & 0x7;
04640         sp_2048_mont_sqr_32(r, r, m, mp);
04641         sp_2048_mont_sqr_32(r, r, m, mp);
04642         sp_2048_mont_sqr_32(r, r, m, mp);
04643         sp_2048_mont_mul_32(r, r, t[y], m, mp);
04644 
04645         XMEMSET(&r[32], 0, sizeof(sp_digit) * 32);
04646         sp_2048_mont_reduce_32(r, m, mp);
04647 
04648         mask = 0 - (sp_2048_cmp_32(r, m) >= 0);
04649         sp_2048_cond_sub_32(r, r, m, mask);
04650     }
04651 
04652 #ifdef WOLFSSL_SMALL_STACK
04653     if (td != NULL)
04654         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
04655 #endif
04656 
04657     return err;
04658 }
04659 #endif /* WOLFSSL_SP_SMALL */
04660 #endif /* SP_RSA_PRIVATE_EXP_D || WOLFSSL_HAVE_SP_DH */
04661 
04662 #ifdef WOLFSSL_HAVE_SP_RSA
04663 /* RSA public key operation.
04664  *
04665  * in      Array of bytes representing the number to exponentiate, base.
04666  * inLen   Number of bytes in base.
04667  * em      Public exponent.
04668  * mm      Modulus.
04669  * out     Buffer to hold big-endian bytes of exponentiation result.
04670  *         Must be at least 256 bytes long.
04671  * outLen  Number of bytes in result.
04672  * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
04673  * an array is too long and MEMORY_E when dynamic memory allocation fails.
04674  */
04675 int sp_RsaPublic_2048(const byte* in, word32 inLen, mp_int* em, mp_int* mm,
04676     byte* out, word32* outLen)
04677 {
04678 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
04679     sp_digit ad[64], md[32], rd[64];
04680 #else
04681     sp_digit* d = NULL;
04682 #endif
04683     sp_digit* a;
04684     sp_digit *ah;
04685     sp_digit* m;
04686     sp_digit* r;
04687     sp_digit e[1];
04688     int err = MP_OKAY;
04689 
04690     if (*outLen < 256)
04691         err = MP_TO_E;
04692     if (err == MP_OKAY && (mp_count_bits(em) > 64 || inLen > 256 ||
04693                                                      mp_count_bits(mm) != 2048))
04694         err = MP_READ_E;
04695 
04696 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
04697     if (err == MP_OKAY) {
04698         d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 5, NULL,
04699                                DYNAMIC_TYPE_TMP_BUFFER);
04700         if (d == NULL)
04701             err = MEMORY_E;
04702     }
04703 
04704     if (err == MP_OKAY) {
04705         a = d;
04706         r = a + 32 * 2;
04707         m = r + 32 * 2;
04708         ah = a + 32;
04709     }
04710 #else
04711     a = ad;
04712     m = md;
04713     r = rd;
04714     ah = a + 32;
04715 #endif
04716 
04717     if (err == MP_OKAY) {
04718         sp_2048_from_bin(ah, 32, in, inLen);
04719 #if DIGIT_BIT >= 64
04720         e[0] = em->dp[0];
04721 #else
04722         e[0] = em->dp[0];
04723         if (em->used > 1)
04724             e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
04725 #endif
04726         if (e[0] == 0)
04727             err = MP_EXPTMOD_E;
04728     }
04729     if (err == MP_OKAY) {
04730         sp_2048_from_mp(m, 32, mm);
04731 
04732         if (e[0] == 0x3) {
04733             if (err == MP_OKAY) {
04734                 sp_2048_sqr_32(r, ah);
04735                 err = sp_2048_mod_32_cond(r, r, m);
04736             }
04737             if (err == MP_OKAY) {
04738                 sp_2048_mul_32(r, ah, r);
04739                 err = sp_2048_mod_32_cond(r, r, m);
04740             }
04741         }
04742         else {
04743             int i;
04744             sp_digit mp;
04745 
04746             sp_2048_mont_setup(m, &mp);
04747 
04748             /* Convert to Montgomery form. */
04749             XMEMSET(a, 0, sizeof(sp_digit) * 32);
04750             err = sp_2048_mod_32_cond(a, a, m);
04751 
04752             if (err == MP_OKAY) {
04753                 for (i=63; i>=0; i--)
04754                     if (e[0] >> i)
04755                         break;
04756 
04757                 XMEMCPY(r, a, sizeof(sp_digit) * 32);
04758                 for (i--; i>=0; i--) {
04759                     sp_2048_mont_sqr_32(r, r, m, mp);
04760                     if (((e[0] >> i) & 1) == 1)
04761                         sp_2048_mont_mul_32(r, r, a, m, mp);
04762                 }
04763                 XMEMSET(&r[32], 0, sizeof(sp_digit) * 32);
04764                 sp_2048_mont_reduce_32(r, m, mp);
04765 
04766                 for (i = 31; i > 0; i--) {
04767                     if (r[i] != m[i])
04768                         break;
04769                 }
04770                 if (r[i] >= m[i])
04771                     sp_2048_sub_in_place_32(r, m);
04772             }
04773         }
04774     }
04775 
04776     if (err == MP_OKAY) {
04777         sp_2048_to_bin(r, out);
04778         *outLen = 256;
04779     }
04780 
04781 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
04782     if (d != NULL)
04783         XFREE(d, NULL, DYNAMIC_TYPE_TMP_BUFFER);
04784 #endif
04785 
04786     return err;
04787 }
04788 
04789 /* RSA private key operation.
04790  *
04791  * in      Array of bytes representing the number to exponentiate, base.
04792  * inLen   Number of bytes in base.
04793  * dm      Private exponent.
04794  * pm      First prime.
04795  * qm      Second prime.
04796  * dpm     First prime's CRT exponent.
04797  * dqm     Second prime's CRT exponent.
04798  * qim     Inverse of second prime mod p.
04799  * mm      Modulus.
04800  * out     Buffer to hold big-endian bytes of exponentiation result.
04801  *         Must be at least 256 bytes long.
04802  * outLen  Number of bytes in result.
04803  * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
04804  * an array is too long and MEMORY_E when dynamic memory allocation fails.
04805  */
04806 int sp_RsaPrivate_2048(const byte* in, word32 inLen, mp_int* dm,
04807     mp_int* pm, mp_int* qm, mp_int* dpm, mp_int* dqm, mp_int* qim, mp_int* mm,
04808     byte* out, word32* outLen)
04809 {
04810 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
04811     sp_digit ad[32 * 2];
04812     sp_digit pd[16], qd[16], dpd[16];
04813     sp_digit tmpad[32], tmpbd[32];
04814 #else
04815     sp_digit* t = NULL;
04816 #endif
04817     sp_digit* a;
04818     sp_digit* p;
04819     sp_digit* q;
04820     sp_digit* dp;
04821     sp_digit* dq;
04822     sp_digit* qi;
04823     sp_digit* tmp;
04824     sp_digit* tmpa;
04825     sp_digit* tmpb;
04826     sp_digit* r;
04827     sp_digit c;
04828     int err = MP_OKAY;
04829 
04830     (void)dm;
04831     (void)mm;
04832 
04833     if (*outLen < 256)
04834         err = MP_TO_E;
04835     if (err == MP_OKAY && (inLen > 256 || mp_count_bits(mm) != 2048))
04836         err = MP_READ_E;
04837 
04838 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
04839     if (err == MP_OKAY) {
04840         t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 11, NULL,
04841                                DYNAMIC_TYPE_TMP_BUFFER);
04842         if (t == NULL)
04843             err = MEMORY_E;
04844     }
04845     if (err == MP_OKAY) {
04846         a = t;
04847         p = a + 32 * 2;
04848         q = p + 16;
04849         qi = dq = dp = q + 16;
04850         tmpa = qi + 16;
04851         tmpb = tmpa + 32;
04852 
04853         tmp = t;
04854         r = tmp + 32;
04855     }
04856 #else
04857     r = a = ad;
04858     p = pd;
04859     q = qd;
04860     qi = dq = dp = dpd;
04861     tmpa = tmpad;
04862     tmpb = tmpbd;
04863     tmp = a + 32;
04864 #endif
04865 
04866     if (err == MP_OKAY) {
04867         sp_2048_from_bin(a, 32, in, inLen);
04868         sp_2048_from_mp(p, 16, pm);
04869         sp_2048_from_mp(q, 16, qm);
04870         sp_2048_from_mp(dp, 16, dpm);
04871 
04872         err = sp_2048_mod_exp_16(tmpa, a, dp, 1024, p, 1);
04873     }
04874     if (err == MP_OKAY) {
04875         sp_2048_from_mp(dq, 16, dqm);
04876         err = sp_2048_mod_exp_16(tmpb, a, dq, 1024, q, 1);
04877     }
04878 
04879     if (err == MP_OKAY) {
04880         c = sp_2048_sub_in_place_16(tmpa, tmpb);
04881         sp_2048_mask_16(tmp, p, c);
04882         sp_2048_add_16(tmpa, tmpa, tmp);
04883 
04884         sp_2048_from_mp(qi, 16, qim);
04885         sp_2048_mul_16(tmpa, tmpa, qi);
04886         err = sp_2048_mod_16(tmpa, tmpa, p);
04887     }
04888 
04889     if (err == MP_OKAY) {
04890         sp_2048_mul_16(tmpa, q, tmpa);
04891         XMEMSET(&tmpb[16], 0, sizeof(sp_digit) * 16);
04892         sp_2048_add_32(r, tmpb, tmpa);
04893 
04894         sp_2048_to_bin(r, out);
04895         *outLen = 256;
04896     }
04897 
04898 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
04899     if (t != NULL) {
04900         XMEMSET(t, 0, sizeof(sp_digit) * 16 * 11);
04901         XFREE(t, NULL, DYNAMIC_TYPE_TMP_BUFFER);
04902     }
04903 #else
04904     XMEMSET(tmpad, 0, sizeof(tmpad));
04905     XMEMSET(tmpbd, 0, sizeof(tmpbd));
04906     XMEMSET(pd, 0, sizeof(pd));
04907     XMEMSET(qd, 0, sizeof(qd));
04908     XMEMSET(dpd, 0, sizeof(dpd));
04909 #endif
04910 
04911     return err;
04912 }
04913 #endif /* WOLFSSL_HAVE_SP_RSA */
04914 #ifdef WOLFSSL_HAVE_SP_DH
04915 /* Convert an array of sp_digit to an mp_int.
04916  *
04917  * a  A single precision integer.
04918  * r  A multi-precision integer.
04919  */
04920 static int sp_2048_to_mp(sp_digit* a, mp_int* r)
04921 {
04922     int err;
04923 
04924     err = mp_grow(r, (2048 + DIGIT_BIT - 1) / DIGIT_BIT);
04925     if (err == MP_OKAY) {
04926 #if DIGIT_BIT == 64
04927         XMEMCPY(r->dp, a, sizeof(sp_digit) * 32);
04928         r->used = 32;
04929         mp_clamp(r);
04930 #elif DIGIT_BIT < 64
04931         int i, j = 0, s = 0;
04932 
04933         r->dp[0] = 0;
04934         for (i = 0; i < 32; i++) {
04935             r->dp[j] |= a[i] << s;
04936             r->dp[j] &= (1l << DIGIT_BIT) - 1;
04937             s = DIGIT_BIT - s;
04938             r->dp[++j] = a[i] >> s;
04939             while (s + DIGIT_BIT <= 64) {
04940                 s += DIGIT_BIT;
04941                 r->dp[j] &= (1l << DIGIT_BIT) - 1;
04942                 r->dp[++j] = a[i] >> s;
04943             }
04944             s = 64 - s;
04945         }
04946         r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
04947         mp_clamp(r);
04948 #else
04949         int i, j = 0, s = 0;
04950 
04951         r->dp[0] = 0;
04952         for (i = 0; i < 32; i++) {
04953             r->dp[j] |= ((mp_digit)a[i]) << s;
04954             if (s + 64 >= DIGIT_BIT) {
04955     #if DIGIT_BIT < 64
04956                 r->dp[j] &= (1l << DIGIT_BIT) - 1;
04957     #endif
04958                 s = DIGIT_BIT - s;
04959                 r->dp[++j] = a[i] >> s;
04960                 s = 64 - s;
04961             }
04962             else
04963                 s += 64;
04964         }
04965         r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
04966         mp_clamp(r);
04967 #endif
04968     }
04969 
04970     return err;
04971 }
04972 
04973 /* Perform the modular exponentiation for Diffie-Hellman.
04974  *
04975  * base  Base. MP integer.
04976  * exp   Exponent. MP integer.
04977  * mod   Modulus. MP integer.
04978  * res   Result. MP integer.
04979  * returs 0 on success, MP_READ_E if there are too many bytes in an array
04980  * and MEMORY_E if memory allocation fails.
04981  */
04982 int sp_ModExp_2048(mp_int* base, mp_int* exp, mp_int* mod, mp_int* res)
04983 {
04984     int err = MP_OKAY;
04985     sp_digit b[64], e[32], m[32];
04986     sp_digit* r = b;
04987     int expBits = mp_count_bits(exp);
04988 
04989     if (mp_count_bits(base) > 2048 || expBits > 2048 ||
04990                                                    mp_count_bits(mod) != 2048) {
04991         err = MP_READ_E;
04992     }
04993 
04994     if (err == MP_OKAY) {
04995         sp_2048_from_mp(b, 32, base);
04996         sp_2048_from_mp(e, 32, exp);
04997         sp_2048_from_mp(m, 32, mod);
04998 
04999         err = sp_2048_mod_exp_32(r, b, e, expBits, m, 0);
05000     }
05001 
05002     if (err == MP_OKAY) {
05003         err = sp_2048_to_mp(r, res);
05004     }
05005 
05006     XMEMSET(e, 0, sizeof(e));
05007 
05008     return err;
05009 }
05010 
05011 /* Perform the modular exponentiation for Diffie-Hellman.
05012  *
05013  * base     Base.
05014  * exp      Array of bytes that is the exponent.
05015  * expLen   Length of data, in bytes, in exponent.
05016  * mod      Modulus.
05017  * out      Buffer to hold big-endian bytes of exponentiation result.
05018  *          Must be at least 256 bytes long.
05019  * outLen   Length, in bytes, of exponentiation result.
05020  * returs 0 on success, MP_READ_E if there are too many bytes in an array
05021  * and MEMORY_E if memory allocation fails.
05022  */
05023 int sp_DhExp_2048(mp_int* base, const byte* exp, word32 expLen,
05024     mp_int* mod, byte* out, word32* outLen)
05025 {
05026     int err = MP_OKAY;
05027     sp_digit b[64], e[32], m[32];
05028     sp_digit* r = b;
05029     word32 i;
05030 
05031     if (mp_count_bits(base) > 2048 || expLen > 256 ||
05032                                                    mp_count_bits(mod) != 2048) {
05033         err = MP_READ_E;
05034     }
05035 
05036     if (err == MP_OKAY) {
05037         sp_2048_from_mp(b, 32, base);
05038         sp_2048_from_bin(e, 32, exp, expLen);
05039         sp_2048_from_mp(m, 32, mod);
05040 
05041         err = sp_2048_mod_exp_32(r, b, e, expLen * 8, m, 0);
05042     }
05043 
05044     if (err == MP_OKAY) {
05045         sp_2048_to_bin(r, out);
05046         *outLen = 256;
05047         for (i=0; i<256 && out[i] == 0; i++) {
05048         }
05049         *outLen -= i;
05050         XMEMMOVE(out, out + i, *outLen);
05051 
05052     }
05053 
05054     XMEMSET(e, 0, sizeof(e));
05055 
05056     return err;
05057 }
05058 
05059 #endif /* WOLFSSL_HAVE_SP_DH */
05060 
05061 #endif /* WOLFSSL_SP_NO_2048 */
05062 
05063 #ifndef WOLFSSL_SP_NO_3072
05064 /* Read big endian unsigned byte aray into r.
05065  *
05066  * r  A single precision integer.
05067  * a  Byte array.
05068  * n  Number of bytes in array to read.
05069  */
05070 static void sp_3072_from_bin(sp_digit* r, int max, const byte* a, int n)
05071 {
05072     int i, j = 0, s = 0;
05073 
05074     r[0] = 0;
05075     for (i = n-1; i >= 0; i--) {
05076         r[j] |= ((sp_digit)a[i]) << s;
05077         if (s >= 56) {
05078             r[j] &= 0xffffffffffffffffl;
05079             s = 64 - s;
05080             if (j + 1 >= max)
05081                 break;
05082             r[++j] = a[i] >> s;
05083             s = 8 - s;
05084         }
05085         else
05086             s += 8;
05087     }
05088 
05089     for (j++; j < max; j++)
05090         r[j] = 0;
05091 }
05092 
05093 /* Convert an mp_int to an array of sp_digit.
05094  *
05095  * r  A single precision integer.
05096  * a  A multi-precision integer.
05097  */
05098 static void sp_3072_from_mp(sp_digit* r, int max, mp_int* a)
05099 {
05100 #if DIGIT_BIT == 64
05101     int j;
05102 
05103     XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
05104 
05105     for (j = a->used; j < max; j++)
05106         r[j] = 0;
05107 #elif DIGIT_BIT > 64
05108     int i, j = 0, s = 0;
05109 
05110     r[0] = 0;
05111     for (i = 0; i < a->used && j < max; i++) {
05112         r[j] |= a->dp[i] << s;
05113         r[j] &= 0xffffffffffffffffl;
05114         s = 64 - s;
05115         if (j + 1 >= max)
05116             break;
05117         r[++j] = a->dp[i] >> s;
05118         while (s + 64 <= DIGIT_BIT) {
05119             s += 64;
05120             r[j] &= 0xffffffffffffffffl;
05121             if (j + 1 >= max)
05122                 break;
05123             if (s < DIGIT_BIT)
05124                 r[++j] = a->dp[i] >> s;
05125             else
05126                 r[++j] = 0;
05127         }
05128         s = DIGIT_BIT - s;
05129     }
05130 
05131     for (j++; j < max; j++)
05132         r[j] = 0;
05133 #else
05134     int i, j = 0, s = 0;
05135 
05136     r[0] = 0;
05137     for (i = 0; i < a->used && j < max; i++) {
05138         r[j] |= ((sp_digit)a->dp[i]) << s;
05139         if (s + DIGIT_BIT >= 64) {
05140             r[j] &= 0xffffffffffffffffl;
05141             if (j + 1 >= max)
05142                 break;
05143             s = 64 - s;
05144             if (s == DIGIT_BIT) {
05145                 r[++j] = 0;
05146                 s = 0;
05147             }
05148             else {
05149                 r[++j] = a->dp[i] >> s;
05150                 s = DIGIT_BIT - s;
05151             }
05152         }
05153         else
05154             s += DIGIT_BIT;
05155     }
05156 
05157     for (j++; j < max; j++)
05158         r[j] = 0;
05159 #endif
05160 }
05161 
05162 /* Write r as big endian to byte aray.
05163  * Fixed length number of bytes written: 384
05164  *
05165  * r  A single precision integer.
05166  * a  Byte array.
05167  */
05168 static void sp_3072_to_bin(sp_digit* r, byte* a)
05169 {
05170     int i, j, s = 0, b;
05171 
05172     j = 3072 / 8 - 1;
05173     a[j] = 0;
05174     for (i=0; i<48 && j>=0; i++) {
05175         b = 0;
05176         a[j--] |= r[i] << s; b += 8 - s;
05177         if (j < 0)
05178             break;
05179         while (b < 64) {
05180             a[j--] = r[i] >> b; b += 8;
05181             if (j < 0)
05182                 break;
05183         }
05184         s = 8 - (b - 64);
05185         if (j >= 0)
05186             a[j] = 0;
05187         if (s != 0)
05188             j++;
05189     }
05190 }
05191 
05192 #ifndef WOLFSSL_SP_SMALL
05193 /* Multiply a and b into r. (r = a * b)
05194  *
05195  * r  A single precision integer.
05196  * a  A single precision integer.
05197  * b  A single precision integer.
05198  */
05199 static void sp_3072_mul_12(sp_digit* r, const sp_digit* a, const sp_digit* b)
05200 {
05201     sp_digit tmp[12];
05202 
05203     __asm__ __volatile__ (
05204         "#  A[0] * B[0]\n\t"
05205         "ldr    x7, [%[a], 0]\n\t"
05206         "ldr    x8, [%[b], 0]\n\t"
05207         "mul    x3, x7, x8\n\t"
05208         "umulh  x4, x7, x8\n\t"
05209         "mov    x5, 0\n\t"
05210         "str    x3, [%[tmp]]\n\t"
05211         "#  A[0] * B[1]\n\t"
05212         "ldr    x7, [%[a], 0]\n\t"
05213         "ldr    x8, [%[b], 8]\n\t"
05214         "mul    x6, x7, x8\n\t"
05215         "umulh  x7, x7, x8\n\t"
05216         "adds   x4, x4, x6\n\t"
05217         "adcs   x5, x5, x7\n\t"
05218         "adc    x3, xzr, xzr\n\t"
05219         "#  A[1] * B[0]\n\t"
05220         "ldr    x7, [%[a], 8]\n\t"
05221         "ldr    x8, [%[b], 0]\n\t"
05222         "mul    x6, x7, x8\n\t"
05223         "umulh  x7, x7, x8\n\t"
05224         "adds   x4, x4, x6\n\t"
05225         "adcs   x5, x5, x7\n\t"
05226         "adc    x3, x3, xzr\n\t"
05227         "str    x4, [%[tmp], 8]\n\t"
05228         "#  A[0] * B[2]\n\t"
05229         "ldr    x7, [%[a], 0]\n\t"
05230         "ldr    x8, [%[b], 16]\n\t"
05231         "mul    x6, x7, x8\n\t"
05232         "umulh  x7, x7, x8\n\t"
05233         "adds   x5, x5, x6\n\t"
05234         "adcs   x3, x3, x7\n\t"
05235         "adc    x4, xzr, xzr\n\t"
05236         "#  A[1] * B[1]\n\t"
05237         "ldr    x7, [%[a], 8]\n\t"
05238         "ldr    x8, [%[b], 8]\n\t"
05239         "mul    x6, x7, x8\n\t"
05240         "umulh  x7, x7, x8\n\t"
05241         "adds   x5, x5, x6\n\t"
05242         "adcs   x3, x3, x7\n\t"
05243         "adc    x4, x4, xzr\n\t"
05244         "#  A[2] * B[0]\n\t"
05245         "ldr    x7, [%[a], 16]\n\t"
05246         "ldr    x8, [%[b], 0]\n\t"
05247         "mul    x6, x7, x8\n\t"
05248         "umulh  x7, x7, x8\n\t"
05249         "adds   x5, x5, x6\n\t"
05250         "adcs   x3, x3, x7\n\t"
05251         "adc    x4, x4, xzr\n\t"
05252         "str    x5, [%[tmp], 16]\n\t"
05253         "#  A[0] * B[3]\n\t"
05254         "ldr    x7, [%[a], 0]\n\t"
05255         "ldr    x8, [%[b], 24]\n\t"
05256         "mul    x6, x7, x8\n\t"
05257         "umulh  x7, x7, x8\n\t"
05258         "adds   x3, x3, x6\n\t"
05259         "adcs   x4, x4, x7\n\t"
05260         "adc    x5, xzr, xzr\n\t"
05261         "#  A[1] * B[2]\n\t"
05262         "ldr    x7, [%[a], 8]\n\t"
05263         "ldr    x8, [%[b], 16]\n\t"
05264         "mul    x6, x7, x8\n\t"
05265         "umulh  x7, x7, x8\n\t"
05266         "adds   x3, x3, x6\n\t"
05267         "adcs   x4, x4, x7\n\t"
05268         "adc    x5, x5, xzr\n\t"
05269         "#  A[2] * B[1]\n\t"
05270         "ldr    x7, [%[a], 16]\n\t"
05271         "ldr    x8, [%[b], 8]\n\t"
05272         "mul    x6, x7, x8\n\t"
05273         "umulh  x7, x7, x8\n\t"
05274         "adds   x3, x3, x6\n\t"
05275         "adcs   x4, x4, x7\n\t"
05276         "adc    x5, x5, xzr\n\t"
05277         "#  A[3] * B[0]\n\t"
05278         "ldr    x7, [%[a], 24]\n\t"
05279         "ldr    x8, [%[b], 0]\n\t"
05280         "mul    x6, x7, x8\n\t"
05281         "umulh  x7, x7, x8\n\t"
05282         "adds   x3, x3, x6\n\t"
05283         "adcs   x4, x4, x7\n\t"
05284         "adc    x5, x5, xzr\n\t"
05285         "str    x3, [%[tmp], 24]\n\t"
05286         "#  A[0] * B[4]\n\t"
05287         "ldr    x7, [%[a], 0]\n\t"
05288         "ldr    x8, [%[b], 32]\n\t"
05289         "mul    x6, x7, x8\n\t"
05290         "umulh  x7, x7, x8\n\t"
05291         "adds   x4, x4, x6\n\t"
05292         "adcs   x5, x5, x7\n\t"
05293         "adc    x3, xzr, xzr\n\t"
05294         "#  A[1] * B[3]\n\t"
05295         "ldr    x7, [%[a], 8]\n\t"
05296         "ldr    x8, [%[b], 24]\n\t"
05297         "mul    x6, x7, x8\n\t"
05298         "umulh  x7, x7, x8\n\t"
05299         "adds   x4, x4, x6\n\t"
05300         "adcs   x5, x5, x7\n\t"
05301         "adc    x3, x3, xzr\n\t"
05302         "#  A[2] * B[2]\n\t"
05303         "ldr    x7, [%[a], 16]\n\t"
05304         "ldr    x8, [%[b], 16]\n\t"
05305         "mul    x6, x7, x8\n\t"
05306         "umulh  x7, x7, x8\n\t"
05307         "adds   x4, x4, x6\n\t"
05308         "adcs   x5, x5, x7\n\t"
05309         "adc    x3, x3, xzr\n\t"
05310         "#  A[3] * B[1]\n\t"
05311         "ldr    x7, [%[a], 24]\n\t"
05312         "ldr    x8, [%[b], 8]\n\t"
05313         "mul    x6, x7, x8\n\t"
05314         "umulh  x7, x7, x8\n\t"
05315         "adds   x4, x4, x6\n\t"
05316         "adcs   x5, x5, x7\n\t"
05317         "adc    x3, x3, xzr\n\t"
05318         "#  A[4] * B[0]\n\t"
05319         "ldr    x7, [%[a], 32]\n\t"
05320         "ldr    x8, [%[b], 0]\n\t"
05321         "mul    x6, x7, x8\n\t"
05322         "umulh  x7, x7, x8\n\t"
05323         "adds   x4, x4, x6\n\t"
05324         "adcs   x5, x5, x7\n\t"
05325         "adc    x3, x3, xzr\n\t"
05326         "str    x4, [%[tmp], 32]\n\t"
05327         "#  A[0] * B[5]\n\t"
05328         "ldr    x7, [%[a], 0]\n\t"
05329         "ldr    x8, [%[b], 40]\n\t"
05330         "mul    x6, x7, x8\n\t"
05331         "umulh  x7, x7, x8\n\t"
05332         "adds   x5, x5, x6\n\t"
05333         "adcs   x3, x3, x7\n\t"
05334         "adc    x4, xzr, xzr\n\t"
05335         "#  A[1] * B[4]\n\t"
05336         "ldr    x7, [%[a], 8]\n\t"
05337         "ldr    x8, [%[b], 32]\n\t"
05338         "mul    x6, x7, x8\n\t"
05339         "umulh  x7, x7, x8\n\t"
05340         "adds   x5, x5, x6\n\t"
05341         "adcs   x3, x3, x7\n\t"
05342         "adc    x4, x4, xzr\n\t"
05343         "#  A[2] * B[3]\n\t"
05344         "ldr    x7, [%[a], 16]\n\t"
05345         "ldr    x8, [%[b], 24]\n\t"
05346         "mul    x6, x7, x8\n\t"
05347         "umulh  x7, x7, x8\n\t"
05348         "adds   x5, x5, x6\n\t"
05349         "adcs   x3, x3, x7\n\t"
05350         "adc    x4, x4, xzr\n\t"
05351         "#  A[3] * B[2]\n\t"
05352         "ldr    x7, [%[a], 24]\n\t"
05353         "ldr    x8, [%[b], 16]\n\t"
05354         "mul    x6, x7, x8\n\t"
05355         "umulh  x7, x7, x8\n\t"
05356         "adds   x5, x5, x6\n\t"
05357         "adcs   x3, x3, x7\n\t"
05358         "adc    x4, x4, xzr\n\t"
05359         "#  A[4] * B[1]\n\t"
05360         "ldr    x7, [%[a], 32]\n\t"
05361         "ldr    x8, [%[b], 8]\n\t"
05362         "mul    x6, x7, x8\n\t"
05363         "umulh  x7, x7, x8\n\t"
05364         "adds   x5, x5, x6\n\t"
05365         "adcs   x3, x3, x7\n\t"
05366         "adc    x4, x4, xzr\n\t"
05367         "#  A[5] * B[0]\n\t"
05368         "ldr    x7, [%[a], 40]\n\t"
05369         "ldr    x8, [%[b], 0]\n\t"
05370         "mul    x6, x7, x8\n\t"
05371         "umulh  x7, x7, x8\n\t"
05372         "adds   x5, x5, x6\n\t"
05373         "adcs   x3, x3, x7\n\t"
05374         "adc    x4, x4, xzr\n\t"
05375         "str    x5, [%[tmp], 40]\n\t"
05376         "#  A[0] * B[6]\n\t"
05377         "ldr    x7, [%[a], 0]\n\t"
05378         "ldr    x8, [%[b], 48]\n\t"
05379         "mul    x6, x7, x8\n\t"
05380         "umulh  x7, x7, x8\n\t"
05381         "adds   x3, x3, x6\n\t"
05382         "adcs   x4, x4, x7\n\t"
05383         "adc    x5, xzr, xzr\n\t"
05384         "#  A[1] * B[5]\n\t"
05385         "ldr    x7, [%[a], 8]\n\t"
05386         "ldr    x8, [%[b], 40]\n\t"
05387         "mul    x6, x7, x8\n\t"
05388         "umulh  x7, x7, x8\n\t"
05389         "adds   x3, x3, x6\n\t"
05390         "adcs   x4, x4, x7\n\t"
05391         "adc    x5, x5, xzr\n\t"
05392         "#  A[2] * B[4]\n\t"
05393         "ldr    x7, [%[a], 16]\n\t"
05394         "ldr    x8, [%[b], 32]\n\t"
05395         "mul    x6, x7, x8\n\t"
05396         "umulh  x7, x7, x8\n\t"
05397         "adds   x3, x3, x6\n\t"
05398         "adcs   x4, x4, x7\n\t"
05399         "adc    x5, x5, xzr\n\t"
05400         "#  A[3] * B[3]\n\t"
05401         "ldr    x7, [%[a], 24]\n\t"
05402         "ldr    x8, [%[b], 24]\n\t"
05403         "mul    x6, x7, x8\n\t"
05404         "umulh  x7, x7, x8\n\t"
05405         "adds   x3, x3, x6\n\t"
05406         "adcs   x4, x4, x7\n\t"
05407         "adc    x5, x5, xzr\n\t"
05408         "#  A[4] * B[2]\n\t"
05409         "ldr    x7, [%[a], 32]\n\t"
05410         "ldr    x8, [%[b], 16]\n\t"
05411         "mul    x6, x7, x8\n\t"
05412         "umulh  x7, x7, x8\n\t"
05413         "adds   x3, x3, x6\n\t"
05414         "adcs   x4, x4, x7\n\t"
05415         "adc    x5, x5, xzr\n\t"
05416         "#  A[5] * B[1]\n\t"
05417         "ldr    x7, [%[a], 40]\n\t"
05418         "ldr    x8, [%[b], 8]\n\t"
05419         "mul    x6, x7, x8\n\t"
05420         "umulh  x7, x7, x8\n\t"
05421         "adds   x3, x3, x6\n\t"
05422         "adcs   x4, x4, x7\n\t"
05423         "adc    x5, x5, xzr\n\t"
05424         "#  A[6] * B[0]\n\t"
05425         "ldr    x7, [%[a], 48]\n\t"
05426         "ldr    x8, [%[b], 0]\n\t"
05427         "mul    x6, x7, x8\n\t"
05428         "umulh  x7, x7, x8\n\t"
05429         "adds   x3, x3, x6\n\t"
05430         "adcs   x4, x4, x7\n\t"
05431         "adc    x5, x5, xzr\n\t"
05432         "str    x3, [%[tmp], 48]\n\t"
05433         "#  A[0] * B[7]\n\t"
05434         "ldr    x7, [%[a], 0]\n\t"
05435         "ldr    x8, [%[b], 56]\n\t"
05436         "mul    x6, x7, x8\n\t"
05437         "umulh  x7, x7, x8\n\t"
05438         "adds   x4, x4, x6\n\t"
05439         "adcs   x5, x5, x7\n\t"
05440         "adc    x3, xzr, xzr\n\t"
05441         "#  A[1] * B[6]\n\t"
05442         "ldr    x7, [%[a], 8]\n\t"
05443         "ldr    x8, [%[b], 48]\n\t"
05444         "mul    x6, x7, x8\n\t"
05445         "umulh  x7, x7, x8\n\t"
05446         "adds   x4, x4, x6\n\t"
05447         "adcs   x5, x5, x7\n\t"
05448         "adc    x3, x3, xzr\n\t"
05449         "#  A[2] * B[5]\n\t"
05450         "ldr    x7, [%[a], 16]\n\t"
05451         "ldr    x8, [%[b], 40]\n\t"
05452         "mul    x6, x7, x8\n\t"
05453         "umulh  x7, x7, x8\n\t"
05454         "adds   x4, x4, x6\n\t"
05455         "adcs   x5, x5, x7\n\t"
05456         "adc    x3, x3, xzr\n\t"
05457         "#  A[3] * B[4]\n\t"
05458         "ldr    x7, [%[a], 24]\n\t"
05459         "ldr    x8, [%[b], 32]\n\t"
05460         "mul    x6, x7, x8\n\t"
05461         "umulh  x7, x7, x8\n\t"
05462         "adds   x4, x4, x6\n\t"
05463         "adcs   x5, x5, x7\n\t"
05464         "adc    x3, x3, xzr\n\t"
05465         "#  A[4] * B[3]\n\t"
05466         "ldr    x7, [%[a], 32]\n\t"
05467         "ldr    x8, [%[b], 24]\n\t"
05468         "mul    x6, x7, x8\n\t"
05469         "umulh  x7, x7, x8\n\t"
05470         "adds   x4, x4, x6\n\t"
05471         "adcs   x5, x5, x7\n\t"
05472         "adc    x3, x3, xzr\n\t"
05473         "#  A[5] * B[2]\n\t"
05474         "ldr    x7, [%[a], 40]\n\t"
05475         "ldr    x8, [%[b], 16]\n\t"
05476         "mul    x6, x7, x8\n\t"
05477         "umulh  x7, x7, x8\n\t"
05478         "adds   x4, x4, x6\n\t"
05479         "adcs   x5, x5, x7\n\t"
05480         "adc    x3, x3, xzr\n\t"
05481         "#  A[6] * B[1]\n\t"
05482         "ldr    x7, [%[a], 48]\n\t"
05483         "ldr    x8, [%[b], 8]\n\t"
05484         "mul    x6, x7, x8\n\t"
05485         "umulh  x7, x7, x8\n\t"
05486         "adds   x4, x4, x6\n\t"
05487         "adcs   x5, x5, x7\n\t"
05488         "adc    x3, x3, xzr\n\t"
05489         "#  A[7] * B[0]\n\t"
05490         "ldr    x7, [%[a], 56]\n\t"
05491         "ldr    x8, [%[b], 0]\n\t"
05492         "mul    x6, x7, x8\n\t"
05493         "umulh  x7, x7, x8\n\t"
05494         "adds   x4, x4, x6\n\t"
05495         "adcs   x5, x5, x7\n\t"
05496         "adc    x3, x3, xzr\n\t"
05497         "str    x4, [%[tmp], 56]\n\t"
05498         "#  A[0] * B[8]\n\t"
05499         "ldr    x7, [%[a], 0]\n\t"
05500         "ldr    x8, [%[b], 64]\n\t"
05501         "mul    x6, x7, x8\n\t"
05502         "umulh  x7, x7, x8\n\t"
05503         "adds   x5, x5, x6\n\t"
05504         "adcs   x3, x3, x7\n\t"
05505         "adc    x4, xzr, xzr\n\t"
05506         "#  A[1] * B[7]\n\t"
05507         "ldr    x7, [%[a], 8]\n\t"
05508         "ldr    x8, [%[b], 56]\n\t"
05509         "mul    x6, x7, x8\n\t"
05510         "umulh  x7, x7, x8\n\t"
05511         "adds   x5, x5, x6\n\t"
05512         "adcs   x3, x3, x7\n\t"
05513         "adc    x4, x4, xzr\n\t"
05514         "#  A[2] * B[6]\n\t"
05515         "ldr    x7, [%[a], 16]\n\t"
05516         "ldr    x8, [%[b], 48]\n\t"
05517         "mul    x6, x7, x8\n\t"
05518         "umulh  x7, x7, x8\n\t"
05519         "adds   x5, x5, x6\n\t"
05520         "adcs   x3, x3, x7\n\t"
05521         "adc    x4, x4, xzr\n\t"
05522         "#  A[3] * B[5]\n\t"
05523         "ldr    x7, [%[a], 24]\n\t"
05524         "ldr    x8, [%[b], 40]\n\t"
05525         "mul    x6, x7, x8\n\t"
05526         "umulh  x7, x7, x8\n\t"
05527         "adds   x5, x5, x6\n\t"
05528         "adcs   x3, x3, x7\n\t"
05529         "adc    x4, x4, xzr\n\t"
05530         "#  A[4] * B[4]\n\t"
05531         "ldr    x7, [%[a], 32]\n\t"
05532         "ldr    x8, [%[b], 32]\n\t"
05533         "mul    x6, x7, x8\n\t"
05534         "umulh  x7, x7, x8\n\t"
05535         "adds   x5, x5, x6\n\t"
05536         "adcs   x3, x3, x7\n\t"
05537         "adc    x4, x4, xzr\n\t"
05538         "#  A[5] * B[3]\n\t"
05539         "ldr    x7, [%[a], 40]\n\t"
05540         "ldr    x8, [%[b], 24]\n\t"
05541         "mul    x6, x7, x8\n\t"
05542         "umulh  x7, x7, x8\n\t"
05543         "adds   x5, x5, x6\n\t"
05544         "adcs   x3, x3, x7\n\t"
05545         "adc    x4, x4, xzr\n\t"
05546         "#  A[6] * B[2]\n\t"
05547         "ldr    x7, [%[a], 48]\n\t"
05548         "ldr    x8, [%[b], 16]\n\t"
05549         "mul    x6, x7, x8\n\t"
05550         "umulh  x7, x7, x8\n\t"
05551         "adds   x5, x5, x6\n\t"
05552         "adcs   x3, x3, x7\n\t"
05553         "adc    x4, x4, xzr\n\t"
05554         "#  A[7] * B[1]\n\t"
05555         "ldr    x7, [%[a], 56]\n\t"
05556         "ldr    x8, [%[b], 8]\n\t"
05557         "mul    x6, x7, x8\n\t"
05558         "umulh  x7, x7, x8\n\t"
05559         "adds   x5, x5, x6\n\t"
05560         "adcs   x3, x3, x7\n\t"
05561         "adc    x4, x4, xzr\n\t"
05562         "#  A[8] * B[0]\n\t"
05563         "ldr    x7, [%[a], 64]\n\t"
05564         "ldr    x8, [%[b], 0]\n\t"
05565         "mul    x6, x7, x8\n\t"
05566         "umulh  x7, x7, x8\n\t"
05567         "adds   x5, x5, x6\n\t"
05568         "adcs   x3, x3, x7\n\t"
05569         "adc    x4, x4, xzr\n\t"
05570         "str    x5, [%[tmp], 64]\n\t"
05571         "#  A[0] * B[9]\n\t"
05572         "ldr    x7, [%[a], 0]\n\t"
05573         "ldr    x8, [%[b], 72]\n\t"
05574         "mul    x6, x7, x8\n\t"
05575         "umulh  x7, x7, x8\n\t"
05576         "adds   x3, x3, x6\n\t"
05577         "adcs   x4, x4, x7\n\t"
05578         "adc    x5, xzr, xzr\n\t"
05579         "#  A[1] * B[8]\n\t"
05580         "ldr    x7, [%[a], 8]\n\t"
05581         "ldr    x8, [%[b], 64]\n\t"
05582         "mul    x6, x7, x8\n\t"
05583         "umulh  x7, x7, x8\n\t"
05584         "adds   x3, x3, x6\n\t"
05585         "adcs   x4, x4, x7\n\t"
05586         "adc    x5, x5, xzr\n\t"
05587         "#  A[2] * B[7]\n\t"
05588         "ldr    x7, [%[a], 16]\n\t"
05589         "ldr    x8, [%[b], 56]\n\t"
05590         "mul    x6, x7, x8\n\t"
05591         "umulh  x7, x7, x8\n\t"
05592         "adds   x3, x3, x6\n\t"
05593         "adcs   x4, x4, x7\n\t"
05594         "adc    x5, x5, xzr\n\t"
05595         "#  A[3] * B[6]\n\t"
05596         "ldr    x7, [%[a], 24]\n\t"
05597         "ldr    x8, [%[b], 48]\n\t"
05598         "mul    x6, x7, x8\n\t"
05599         "umulh  x7, x7, x8\n\t"
05600         "adds   x3, x3, x6\n\t"
05601         "adcs   x4, x4, x7\n\t"
05602         "adc    x5, x5, xzr\n\t"
05603         "#  A[4] * B[5]\n\t"
05604         "ldr    x7, [%[a], 32]\n\t"
05605         "ldr    x8, [%[b], 40]\n\t"
05606         "mul    x6, x7, x8\n\t"
05607         "umulh  x7, x7, x8\n\t"
05608         "adds   x3, x3, x6\n\t"
05609         "adcs   x4, x4, x7\n\t"
05610         "adc    x5, x5, xzr\n\t"
05611         "#  A[5] * B[4]\n\t"
05612         "ldr    x7, [%[a], 40]\n\t"
05613         "ldr    x8, [%[b], 32]\n\t"
05614         "mul    x6, x7, x8\n\t"
05615         "umulh  x7, x7, x8\n\t"
05616         "adds   x3, x3, x6\n\t"
05617         "adcs   x4, x4, x7\n\t"
05618         "adc    x5, x5, xzr\n\t"
05619         "#  A[6] * B[3]\n\t"
05620         "ldr    x7, [%[a], 48]\n\t"
05621         "ldr    x8, [%[b], 24]\n\t"
05622         "mul    x6, x7, x8\n\t"
05623         "umulh  x7, x7, x8\n\t"
05624         "adds   x3, x3, x6\n\t"
05625         "adcs   x4, x4, x7\n\t"
05626         "adc    x5, x5, xzr\n\t"
05627         "#  A[7] * B[2]\n\t"
05628         "ldr    x7, [%[a], 56]\n\t"
05629         "ldr    x8, [%[b], 16]\n\t"
05630         "mul    x6, x7, x8\n\t"
05631         "umulh  x7, x7, x8\n\t"
05632         "adds   x3, x3, x6\n\t"
05633         "adcs   x4, x4, x7\n\t"
05634         "adc    x5, x5, xzr\n\t"
05635         "#  A[8] * B[1]\n\t"
05636         "ldr    x7, [%[a], 64]\n\t"
05637         "ldr    x8, [%[b], 8]\n\t"
05638         "mul    x6, x7, x8\n\t"
05639         "umulh  x7, x7, x8\n\t"
05640         "adds   x3, x3, x6\n\t"
05641         "adcs   x4, x4, x7\n\t"
05642         "adc    x5, x5, xzr\n\t"
05643         "#  A[9] * B[0]\n\t"
05644         "ldr    x7, [%[a], 72]\n\t"
05645         "ldr    x8, [%[b], 0]\n\t"
05646         "mul    x6, x7, x8\n\t"
05647         "umulh  x7, x7, x8\n\t"
05648         "adds   x3, x3, x6\n\t"
05649         "adcs   x4, x4, x7\n\t"
05650         "adc    x5, x5, xzr\n\t"
05651         "str    x3, [%[tmp], 72]\n\t"
05652         "#  A[0] * B[10]\n\t"
05653         "ldr    x7, [%[a], 0]\n\t"
05654         "ldr    x8, [%[b], 80]\n\t"
05655         "mul    x6, x7, x8\n\t"
05656         "umulh  x7, x7, x8\n\t"
05657         "adds   x4, x4, x6\n\t"
05658         "adcs   x5, x5, x7\n\t"
05659         "adc    x3, xzr, xzr\n\t"
05660         "#  A[1] * B[9]\n\t"
05661         "ldr    x7, [%[a], 8]\n\t"
05662         "ldr    x8, [%[b], 72]\n\t"
05663         "mul    x6, x7, x8\n\t"
05664         "umulh  x7, x7, x8\n\t"
05665         "adds   x4, x4, x6\n\t"
05666         "adcs   x5, x5, x7\n\t"
05667         "adc    x3, x3, xzr\n\t"
05668         "#  A[2] * B[8]\n\t"
05669         "ldr    x7, [%[a], 16]\n\t"
05670         "ldr    x8, [%[b], 64]\n\t"
05671         "mul    x6, x7, x8\n\t"
05672         "umulh  x7, x7, x8\n\t"
05673         "adds   x4, x4, x6\n\t"
05674         "adcs   x5, x5, x7\n\t"
05675         "adc    x3, x3, xzr\n\t"
05676         "#  A[3] * B[7]\n\t"
05677         "ldr    x7, [%[a], 24]\n\t"
05678         "ldr    x8, [%[b], 56]\n\t"
05679         "mul    x6, x7, x8\n\t"
05680         "umulh  x7, x7, x8\n\t"
05681         "adds   x4, x4, x6\n\t"
05682         "adcs   x5, x5, x7\n\t"
05683         "adc    x3, x3, xzr\n\t"
05684         "#  A[4] * B[6]\n\t"
05685         "ldr    x7, [%[a], 32]\n\t"
05686         "ldr    x8, [%[b], 48]\n\t"
05687         "mul    x6, x7, x8\n\t"
05688         "umulh  x7, x7, x8\n\t"
05689         "adds   x4, x4, x6\n\t"
05690         "adcs   x5, x5, x7\n\t"
05691         "adc    x3, x3, xzr\n\t"
05692         "#  A[5] * B[5]\n\t"
05693         "ldr    x7, [%[a], 40]\n\t"
05694         "ldr    x8, [%[b], 40]\n\t"
05695         "mul    x6, x7, x8\n\t"
05696         "umulh  x7, x7, x8\n\t"
05697         "adds   x4, x4, x6\n\t"
05698         "adcs   x5, x5, x7\n\t"
05699         "adc    x3, x3, xzr\n\t"
05700         "#  A[6] * B[4]\n\t"
05701         "ldr    x7, [%[a], 48]\n\t"
05702         "ldr    x8, [%[b], 32]\n\t"
05703         "mul    x6, x7, x8\n\t"
05704         "umulh  x7, x7, x8\n\t"
05705         "adds   x4, x4, x6\n\t"
05706         "adcs   x5, x5, x7\n\t"
05707         "adc    x3, x3, xzr\n\t"
05708         "#  A[7] * B[3]\n\t"
05709         "ldr    x7, [%[a], 56]\n\t"
05710         "ldr    x8, [%[b], 24]\n\t"
05711         "mul    x6, x7, x8\n\t"
05712         "umulh  x7, x7, x8\n\t"
05713         "adds   x4, x4, x6\n\t"
05714         "adcs   x5, x5, x7\n\t"
05715         "adc    x3, x3, xzr\n\t"
05716         "#  A[8] * B[2]\n\t"
05717         "ldr    x7, [%[a], 64]\n\t"
05718         "ldr    x8, [%[b], 16]\n\t"
05719         "mul    x6, x7, x8\n\t"
05720         "umulh  x7, x7, x8\n\t"
05721         "adds   x4, x4, x6\n\t"
05722         "adcs   x5, x5, x7\n\t"
05723         "adc    x3, x3, xzr\n\t"
05724         "#  A[9] * B[1]\n\t"
05725         "ldr    x7, [%[a], 72]\n\t"
05726         "ldr    x8, [%[b], 8]\n\t"
05727         "mul    x6, x7, x8\n\t"
05728         "umulh  x7, x7, x8\n\t"
05729         "adds   x4, x4, x6\n\t"
05730         "adcs   x5, x5, x7\n\t"
05731         "adc    x3, x3, xzr\n\t"
05732         "#  A[10] * B[0]\n\t"
05733         "ldr    x7, [%[a], 80]\n\t"
05734         "ldr    x8, [%[b], 0]\n\t"
05735         "mul    x6, x7, x8\n\t"
05736         "umulh  x7, x7, x8\n\t"
05737         "adds   x4, x4, x6\n\t"
05738         "adcs   x5, x5, x7\n\t"
05739         "adc    x3, x3, xzr\n\t"
05740         "str    x4, [%[tmp], 80]\n\t"
05741         "#  A[0] * B[11]\n\t"
05742         "ldr    x7, [%[a], 0]\n\t"
05743         "ldr    x8, [%[b], 88]\n\t"
05744         "mul    x6, x7, x8\n\t"
05745         "umulh  x7, x7, x8\n\t"
05746         "adds   x5, x5, x6\n\t"
05747         "adcs   x3, x3, x7\n\t"
05748         "adc    x4, xzr, xzr\n\t"
05749         "#  A[1] * B[10]\n\t"
05750         "ldr    x7, [%[a], 8]\n\t"
05751         "ldr    x8, [%[b], 80]\n\t"
05752         "mul    x6, x7, x8\n\t"
05753         "umulh  x7, x7, x8\n\t"
05754         "adds   x5, x5, x6\n\t"
05755         "adcs   x3, x3, x7\n\t"
05756         "adc    x4, x4, xzr\n\t"
05757         "#  A[2] * B[9]\n\t"
05758         "ldr    x7, [%[a], 16]\n\t"
05759         "ldr    x8, [%[b], 72]\n\t"
05760         "mul    x6, x7, x8\n\t"
05761         "umulh  x7, x7, x8\n\t"
05762         "adds   x5, x5, x6\n\t"
05763         "adcs   x3, x3, x7\n\t"
05764         "adc    x4, x4, xzr\n\t"
05765         "#  A[3] * B[8]\n\t"
05766         "ldr    x7, [%[a], 24]\n\t"
05767         "ldr    x8, [%[b], 64]\n\t"
05768         "mul    x6, x7, x8\n\t"
05769         "umulh  x7, x7, x8\n\t"
05770         "adds   x5, x5, x6\n\t"
05771         "adcs   x3, x3, x7\n\t"
05772         "adc    x4, x4, xzr\n\t"
05773         "#  A[4] * B[7]\n\t"
05774         "ldr    x7, [%[a], 32]\n\t"
05775         "ldr    x8, [%[b], 56]\n\t"
05776         "mul    x6, x7, x8\n\t"
05777         "umulh  x7, x7, x8\n\t"
05778         "adds   x5, x5, x6\n\t"
05779         "adcs   x3, x3, x7\n\t"
05780         "adc    x4, x4, xzr\n\t"
05781         "#  A[5] * B[6]\n\t"
05782         "ldr    x7, [%[a], 40]\n\t"
05783         "ldr    x8, [%[b], 48]\n\t"
05784         "mul    x6, x7, x8\n\t"
05785         "umulh  x7, x7, x8\n\t"
05786         "adds   x5, x5, x6\n\t"
05787         "adcs   x3, x3, x7\n\t"
05788         "adc    x4, x4, xzr\n\t"
05789         "#  A[6] * B[5]\n\t"
05790         "ldr    x7, [%[a], 48]\n\t"
05791         "ldr    x8, [%[b], 40]\n\t"
05792         "mul    x6, x7, x8\n\t"
05793         "umulh  x7, x7, x8\n\t"
05794         "adds   x5, x5, x6\n\t"
05795         "adcs   x3, x3, x7\n\t"
05796         "adc    x4, x4, xzr\n\t"
05797         "#  A[7] * B[4]\n\t"
05798         "ldr    x7, [%[a], 56]\n\t"
05799         "ldr    x8, [%[b], 32]\n\t"
05800         "mul    x6, x7, x8\n\t"
05801         "umulh  x7, x7, x8\n\t"
05802         "adds   x5, x5, x6\n\t"
05803         "adcs   x3, x3, x7\n\t"
05804         "adc    x4, x4, xzr\n\t"
05805         "#  A[8] * B[3]\n\t"
05806         "ldr    x7, [%[a], 64]\n\t"
05807         "ldr    x8, [%[b], 24]\n\t"
05808         "mul    x6, x7, x8\n\t"
05809         "umulh  x7, x7, x8\n\t"
05810         "adds   x5, x5, x6\n\t"
05811         "adcs   x3, x3, x7\n\t"
05812         "adc    x4, x4, xzr\n\t"
05813         "#  A[9] * B[2]\n\t"
05814         "ldr    x7, [%[a], 72]\n\t"
05815         "ldr    x8, [%[b], 16]\n\t"
05816         "mul    x6, x7, x8\n\t"
05817         "umulh  x7, x7, x8\n\t"
05818         "adds   x5, x5, x6\n\t"
05819         "adcs   x3, x3, x7\n\t"
05820         "adc    x4, x4, xzr\n\t"
05821         "#  A[10] * B[1]\n\t"
05822         "ldr    x7, [%[a], 80]\n\t"
05823         "ldr    x8, [%[b], 8]\n\t"
05824         "mul    x6, x7, x8\n\t"
05825         "umulh  x7, x7, x8\n\t"
05826         "adds   x5, x5, x6\n\t"
05827         "adcs   x3, x3, x7\n\t"
05828         "adc    x4, x4, xzr\n\t"
05829         "#  A[11] * B[0]\n\t"
05830         "ldr    x7, [%[a], 88]\n\t"
05831         "ldr    x8, [%[b], 0]\n\t"
05832         "mul    x6, x7, x8\n\t"
05833         "umulh  x7, x7, x8\n\t"
05834         "adds   x5, x5, x6\n\t"
05835         "adcs   x3, x3, x7\n\t"
05836         "adc    x4, x4, xzr\n\t"
05837         "str    x5, [%[tmp], 88]\n\t"
05838         "#  A[1] * B[11]\n\t"
05839         "ldr    x7, [%[a], 8]\n\t"
05840         "ldr    x8, [%[b], 88]\n\t"
05841         "mul    x6, x7, x8\n\t"
05842         "umulh  x7, x7, x8\n\t"
05843         "adds   x3, x3, x6\n\t"
05844         "adcs   x4, x4, x7\n\t"
05845         "adc    x5, xzr, xzr\n\t"
05846         "#  A[2] * B[10]\n\t"
05847         "ldr    x7, [%[a], 16]\n\t"
05848         "ldr    x8, [%[b], 80]\n\t"
05849         "mul    x6, x7, x8\n\t"
05850         "umulh  x7, x7, x8\n\t"
05851         "adds   x3, x3, x6\n\t"
05852         "adcs   x4, x4, x7\n\t"
05853         "adc    x5, x5, xzr\n\t"
05854         "#  A[3] * B[9]\n\t"
05855         "ldr    x7, [%[a], 24]\n\t"
05856         "ldr    x8, [%[b], 72]\n\t"
05857         "mul    x6, x7, x8\n\t"
05858         "umulh  x7, x7, x8\n\t"
05859         "adds   x3, x3, x6\n\t"
05860         "adcs   x4, x4, x7\n\t"
05861         "adc    x5, x5, xzr\n\t"
05862         "#  A[4] * B[8]\n\t"
05863         "ldr    x7, [%[a], 32]\n\t"
05864         "ldr    x8, [%[b], 64]\n\t"
05865         "mul    x6, x7, x8\n\t"
05866         "umulh  x7, x7, x8\n\t"
05867         "adds   x3, x3, x6\n\t"
05868         "adcs   x4, x4, x7\n\t"
05869         "adc    x5, x5, xzr\n\t"
05870         "#  A[5] * B[7]\n\t"
05871         "ldr    x7, [%[a], 40]\n\t"
05872         "ldr    x8, [%[b], 56]\n\t"
05873         "mul    x6, x7, x8\n\t"
05874         "umulh  x7, x7, x8\n\t"
05875         "adds   x3, x3, x6\n\t"
05876         "adcs   x4, x4, x7\n\t"
05877         "adc    x5, x5, xzr\n\t"
05878         "#  A[6] * B[6]\n\t"
05879         "ldr    x7, [%[a], 48]\n\t"
05880         "ldr    x8, [%[b], 48]\n\t"
05881         "mul    x6, x7, x8\n\t"
05882         "umulh  x7, x7, x8\n\t"
05883         "adds   x3, x3, x6\n\t"
05884         "adcs   x4, x4, x7\n\t"
05885         "adc    x5, x5, xzr\n\t"
05886         "#  A[7] * B[5]\n\t"
05887         "ldr    x7, [%[a], 56]\n\t"
05888         "ldr    x8, [%[b], 40]\n\t"
05889         "mul    x6, x7, x8\n\t"
05890         "umulh  x7, x7, x8\n\t"
05891         "adds   x3, x3, x6\n\t"
05892         "adcs   x4, x4, x7\n\t"
05893         "adc    x5, x5, xzr\n\t"
05894         "#  A[8] * B[4]\n\t"
05895         "ldr    x7, [%[a], 64]\n\t"
05896         "ldr    x8, [%[b], 32]\n\t"
05897         "mul    x6, x7, x8\n\t"
05898         "umulh  x7, x7, x8\n\t"
05899         "adds   x3, x3, x6\n\t"
05900         "adcs   x4, x4, x7\n\t"
05901         "adc    x5, x5, xzr\n\t"
05902         "#  A[9] * B[3]\n\t"
05903         "ldr    x7, [%[a], 72]\n\t"
05904         "ldr    x8, [%[b], 24]\n\t"
05905         "mul    x6, x7, x8\n\t"
05906         "umulh  x7, x7, x8\n\t"
05907         "adds   x3, x3, x6\n\t"
05908         "adcs   x4, x4, x7\n\t"
05909         "adc    x5, x5, xzr\n\t"
05910         "#  A[10] * B[2]\n\t"
05911         "ldr    x7, [%[a], 80]\n\t"
05912         "ldr    x8, [%[b], 16]\n\t"
05913         "mul    x6, x7, x8\n\t"
05914         "umulh  x7, x7, x8\n\t"
05915         "adds   x3, x3, x6\n\t"
05916         "adcs   x4, x4, x7\n\t"
05917         "adc    x5, x5, xzr\n\t"
05918         "#  A[11] * B[1]\n\t"
05919         "ldr    x7, [%[a], 88]\n\t"
05920         "ldr    x8, [%[b], 8]\n\t"
05921         "mul    x6, x7, x8\n\t"
05922         "umulh  x7, x7, x8\n\t"
05923         "adds   x3, x3, x6\n\t"
05924         "adcs   x4, x4, x7\n\t"
05925         "adc    x5, x5, xzr\n\t"
05926         "str    x3, [%[r], 96]\n\t"
05927         "#  A[2] * B[11]\n\t"
05928         "ldr    x7, [%[a], 16]\n\t"
05929         "ldr    x8, [%[b], 88]\n\t"
05930         "mul    x6, x7, x8\n\t"
05931         "umulh  x7, x7, x8\n\t"
05932         "adds   x4, x4, x6\n\t"
05933         "adcs   x5, x5, x7\n\t"
05934         "adc    x3, xzr, xzr\n\t"
05935         "#  A[3] * B[10]\n\t"
05936         "ldr    x7, [%[a], 24]\n\t"
05937         "ldr    x8, [%[b], 80]\n\t"
05938         "mul    x6, x7, x8\n\t"
05939         "umulh  x7, x7, x8\n\t"
05940         "adds   x4, x4, x6\n\t"
05941         "adcs   x5, x5, x7\n\t"
05942         "adc    x3, x3, xzr\n\t"
05943         "#  A[4] * B[9]\n\t"
05944         "ldr    x7, [%[a], 32]\n\t"
05945         "ldr    x8, [%[b], 72]\n\t"
05946         "mul    x6, x7, x8\n\t"
05947         "umulh  x7, x7, x8\n\t"
05948         "adds   x4, x4, x6\n\t"
05949         "adcs   x5, x5, x7\n\t"
05950         "adc    x3, x3, xzr\n\t"
05951         "#  A[5] * B[8]\n\t"
05952         "ldr    x7, [%[a], 40]\n\t"
05953         "ldr    x8, [%[b], 64]\n\t"
05954         "mul    x6, x7, x8\n\t"
05955         "umulh  x7, x7, x8\n\t"
05956         "adds   x4, x4, x6\n\t"
05957         "adcs   x5, x5, x7\n\t"
05958         "adc    x3, x3, xzr\n\t"
05959         "#  A[6] * B[7]\n\t"
05960         "ldr    x7, [%[a], 48]\n\t"
05961         "ldr    x8, [%[b], 56]\n\t"
05962         "mul    x6, x7, x8\n\t"
05963         "umulh  x7, x7, x8\n\t"
05964         "adds   x4, x4, x6\n\t"
05965         "adcs   x5, x5, x7\n\t"
05966         "adc    x3, x3, xzr\n\t"
05967         "#  A[7] * B[6]\n\t"
05968         "ldr    x7, [%[a], 56]\n\t"
05969         "ldr    x8, [%[b], 48]\n\t"
05970         "mul    x6, x7, x8\n\t"
05971         "umulh  x7, x7, x8\n\t"
05972         "adds   x4, x4, x6\n\t"
05973         "adcs   x5, x5, x7\n\t"
05974         "adc    x3, x3, xzr\n\t"
05975         "#  A[8] * B[5]\n\t"
05976         "ldr    x7, [%[a], 64]\n\t"
05977         "ldr    x8, [%[b], 40]\n\t"
05978         "mul    x6, x7, x8\n\t"
05979         "umulh  x7, x7, x8\n\t"
05980         "adds   x4, x4, x6\n\t"
05981         "adcs   x5, x5, x7\n\t"
05982         "adc    x3, x3, xzr\n\t"
05983         "#  A[9] * B[4]\n\t"
05984         "ldr    x7, [%[a], 72]\n\t"
05985         "ldr    x8, [%[b], 32]\n\t"
05986         "mul    x6, x7, x8\n\t"
05987         "umulh  x7, x7, x8\n\t"
05988         "adds   x4, x4, x6\n\t"
05989         "adcs   x5, x5, x7\n\t"
05990         "adc    x3, x3, xzr\n\t"
05991         "#  A[10] * B[3]\n\t"
05992         "ldr    x7, [%[a], 80]\n\t"
05993         "ldr    x8, [%[b], 24]\n\t"
05994         "mul    x6, x7, x8\n\t"
05995         "umulh  x7, x7, x8\n\t"
05996         "adds   x4, x4, x6\n\t"
05997         "adcs   x5, x5, x7\n\t"
05998         "adc    x3, x3, xzr\n\t"
05999         "#  A[11] * B[2]\n\t"
06000         "ldr    x7, [%[a], 88]\n\t"
06001         "ldr    x8, [%[b], 16]\n\t"
06002         "mul    x6, x7, x8\n\t"
06003         "umulh  x7, x7, x8\n\t"
06004         "adds   x4, x4, x6\n\t"
06005         "adcs   x5, x5, x7\n\t"
06006         "adc    x3, x3, xzr\n\t"
06007         "str    x4, [%[r], 104]\n\t"
06008         "#  A[3] * B[11]\n\t"
06009         "ldr    x7, [%[a], 24]\n\t"
06010         "ldr    x8, [%[b], 88]\n\t"
06011         "mul    x6, x7, x8\n\t"
06012         "umulh  x7, x7, x8\n\t"
06013         "adds   x5, x5, x6\n\t"
06014         "adcs   x3, x3, x7\n\t"
06015         "adc    x4, xzr, xzr\n\t"
06016         "#  A[4] * B[10]\n\t"
06017         "ldr    x7, [%[a], 32]\n\t"
06018         "ldr    x8, [%[b], 80]\n\t"
06019         "mul    x6, x7, x8\n\t"
06020         "umulh  x7, x7, x8\n\t"
06021         "adds   x5, x5, x6\n\t"
06022         "adcs   x3, x3, x7\n\t"
06023         "adc    x4, x4, xzr\n\t"
06024         "#  A[5] * B[9]\n\t"
06025         "ldr    x7, [%[a], 40]\n\t"
06026         "ldr    x8, [%[b], 72]\n\t"
06027         "mul    x6, x7, x8\n\t"
06028         "umulh  x7, x7, x8\n\t"
06029         "adds   x5, x5, x6\n\t"
06030         "adcs   x3, x3, x7\n\t"
06031         "adc    x4, x4, xzr\n\t"
06032         "#  A[6] * B[8]\n\t"
06033         "ldr    x7, [%[a], 48]\n\t"
06034         "ldr    x8, [%[b], 64]\n\t"
06035         "mul    x6, x7, x8\n\t"
06036         "umulh  x7, x7, x8\n\t"
06037         "adds   x5, x5, x6\n\t"
06038         "adcs   x3, x3, x7\n\t"
06039         "adc    x4, x4, xzr\n\t"
06040         "#  A[7] * B[7]\n\t"
06041         "ldr    x7, [%[a], 56]\n\t"
06042         "ldr    x8, [%[b], 56]\n\t"
06043         "mul    x6, x7, x8\n\t"
06044         "umulh  x7, x7, x8\n\t"
06045         "adds   x5, x5, x6\n\t"
06046         "adcs   x3, x3, x7\n\t"
06047         "adc    x4, x4, xzr\n\t"
06048         "#  A[8] * B[6]\n\t"
06049         "ldr    x7, [%[a], 64]\n\t"
06050         "ldr    x8, [%[b], 48]\n\t"
06051         "mul    x6, x7, x8\n\t"
06052         "umulh  x7, x7, x8\n\t"
06053         "adds   x5, x5, x6\n\t"
06054         "adcs   x3, x3, x7\n\t"
06055         "adc    x4, x4, xzr\n\t"
06056         "#  A[9] * B[5]\n\t"
06057         "ldr    x7, [%[a], 72]\n\t"
06058         "ldr    x8, [%[b], 40]\n\t"
06059         "mul    x6, x7, x8\n\t"
06060         "umulh  x7, x7, x8\n\t"
06061         "adds   x5, x5, x6\n\t"
06062         "adcs   x3, x3, x7\n\t"
06063         "adc    x4, x4, xzr\n\t"
06064         "#  A[10] * B[4]\n\t"
06065         "ldr    x7, [%[a], 80]\n\t"
06066         "ldr    x8, [%[b], 32]\n\t"
06067         "mul    x6, x7, x8\n\t"
06068         "umulh  x7, x7, x8\n\t"
06069         "adds   x5, x5, x6\n\t"
06070         "adcs   x3, x3, x7\n\t"
06071         "adc    x4, x4, xzr\n\t"
06072         "#  A[11] * B[3]\n\t"
06073         "ldr    x7, [%[a], 88]\n\t"
06074         "ldr    x8, [%[b], 24]\n\t"
06075         "mul    x6, x7, x8\n\t"
06076         "umulh  x7, x7, x8\n\t"
06077         "adds   x5, x5, x6\n\t"
06078         "adcs   x3, x3, x7\n\t"
06079         "adc    x4, x4, xzr\n\t"
06080         "str    x5, [%[r], 112]\n\t"
06081         "#  A[4] * B[11]\n\t"
06082         "ldr    x7, [%[a], 32]\n\t"
06083         "ldr    x8, [%[b], 88]\n\t"
06084         "mul    x6, x7, x8\n\t"
06085         "umulh  x7, x7, x8\n\t"
06086         "adds   x3, x3, x6\n\t"
06087         "adcs   x4, x4, x7\n\t"
06088         "adc    x5, xzr, xzr\n\t"
06089         "#  A[5] * B[10]\n\t"
06090         "ldr    x7, [%[a], 40]\n\t"
06091         "ldr    x8, [%[b], 80]\n\t"
06092         "mul    x6, x7, x8\n\t"
06093         "umulh  x7, x7, x8\n\t"
06094         "adds   x3, x3, x6\n\t"
06095         "adcs   x4, x4, x7\n\t"
06096         "adc    x5, x5, xzr\n\t"
06097         "#  A[6] * B[9]\n\t"
06098         "ldr    x7, [%[a], 48]\n\t"
06099         "ldr    x8, [%[b], 72]\n\t"
06100         "mul    x6, x7, x8\n\t"
06101         "umulh  x7, x7, x8\n\t"
06102         "adds   x3, x3, x6\n\t"
06103         "adcs   x4, x4, x7\n\t"
06104         "adc    x5, x5, xzr\n\t"
06105         "#  A[7] * B[8]\n\t"
06106         "ldr    x7, [%[a], 56]\n\t"
06107         "ldr    x8, [%[b], 64]\n\t"
06108         "mul    x6, x7, x8\n\t"
06109         "umulh  x7, x7, x8\n\t"
06110         "adds   x3, x3, x6\n\t"
06111         "adcs   x4, x4, x7\n\t"
06112         "adc    x5, x5, xzr\n\t"
06113         "#  A[8] * B[7]\n\t"
06114         "ldr    x7, [%[a], 64]\n\t"
06115         "ldr    x8, [%[b], 56]\n\t"
06116         "mul    x6, x7, x8\n\t"
06117         "umulh  x7, x7, x8\n\t"
06118         "adds   x3, x3, x6\n\t"
06119         "adcs   x4, x4, x7\n\t"
06120         "adc    x5, x5, xzr\n\t"
06121         "#  A[9] * B[6]\n\t"
06122         "ldr    x7, [%[a], 72]\n\t"
06123         "ldr    x8, [%[b], 48]\n\t"
06124         "mul    x6, x7, x8\n\t"
06125         "umulh  x7, x7, x8\n\t"
06126         "adds   x3, x3, x6\n\t"
06127         "adcs   x4, x4, x7\n\t"
06128         "adc    x5, x5, xzr\n\t"
06129         "#  A[10] * B[5]\n\t"
06130         "ldr    x7, [%[a], 80]\n\t"
06131         "ldr    x8, [%[b], 40]\n\t"
06132         "mul    x6, x7, x8\n\t"
06133         "umulh  x7, x7, x8\n\t"
06134         "adds   x3, x3, x6\n\t"
06135         "adcs   x4, x4, x7\n\t"
06136         "adc    x5, x5, xzr\n\t"
06137         "#  A[11] * B[4]\n\t"
06138         "ldr    x7, [%[a], 88]\n\t"
06139         "ldr    x8, [%[b], 32]\n\t"
06140         "mul    x6, x7, x8\n\t"
06141         "umulh  x7, x7, x8\n\t"
06142         "adds   x3, x3, x6\n\t"
06143         "adcs   x4, x4, x7\n\t"
06144         "adc    x5, x5, xzr\n\t"
06145         "str    x3, [%[r], 120]\n\t"
06146         "#  A[5] * B[11]\n\t"
06147         "ldr    x7, [%[a], 40]\n\t"
06148         "ldr    x8, [%[b], 88]\n\t"
06149         "mul    x6, x7, x8\n\t"
06150         "umulh  x7, x7, x8\n\t"
06151         "adds   x4, x4, x6\n\t"
06152         "adcs   x5, x5, x7\n\t"
06153         "adc    x3, xzr, xzr\n\t"
06154         "#  A[6] * B[10]\n\t"
06155         "ldr    x7, [%[a], 48]\n\t"
06156         "ldr    x8, [%[b], 80]\n\t"
06157         "mul    x6, x7, x8\n\t"
06158         "umulh  x7, x7, x8\n\t"
06159         "adds   x4, x4, x6\n\t"
06160         "adcs   x5, x5, x7\n\t"
06161         "adc    x3, x3, xzr\n\t"
06162         "#  A[7] * B[9]\n\t"
06163         "ldr    x7, [%[a], 56]\n\t"
06164         "ldr    x8, [%[b], 72]\n\t"
06165         "mul    x6, x7, x8\n\t"
06166         "umulh  x7, x7, x8\n\t"
06167         "adds   x4, x4, x6\n\t"
06168         "adcs   x5, x5, x7\n\t"
06169         "adc    x3, x3, xzr\n\t"
06170         "#  A[8] * B[8]\n\t"
06171         "ldr    x7, [%[a], 64]\n\t"
06172         "ldr    x8, [%[b], 64]\n\t"
06173         "mul    x6, x7, x8\n\t"
06174         "umulh  x7, x7, x8\n\t"
06175         "adds   x4, x4, x6\n\t"
06176         "adcs   x5, x5, x7\n\t"
06177         "adc    x3, x3, xzr\n\t"
06178         "#  A[9] * B[7]\n\t"
06179         "ldr    x7, [%[a], 72]\n\t"
06180         "ldr    x8, [%[b], 56]\n\t"
06181         "mul    x6, x7, x8\n\t"
06182         "umulh  x7, x7, x8\n\t"
06183         "adds   x4, x4, x6\n\t"
06184         "adcs   x5, x5, x7\n\t"
06185         "adc    x3, x3, xzr\n\t"
06186         "#  A[10] * B[6]\n\t"
06187         "ldr    x7, [%[a], 80]\n\t"
06188         "ldr    x8, [%[b], 48]\n\t"
06189         "mul    x6, x7, x8\n\t"
06190         "umulh  x7, x7, x8\n\t"
06191         "adds   x4, x4, x6\n\t"
06192         "adcs   x5, x5, x7\n\t"
06193         "adc    x3, x3, xzr\n\t"
06194         "#  A[11] * B[5]\n\t"
06195         "ldr    x7, [%[a], 88]\n\t"
06196         "ldr    x8, [%[b], 40]\n\t"
06197         "mul    x6, x7, x8\n\t"
06198         "umulh  x7, x7, x8\n\t"
06199         "adds   x4, x4, x6\n\t"
06200         "adcs   x5, x5, x7\n\t"
06201         "adc    x3, x3, xzr\n\t"
06202         "str    x4, [%[r], 128]\n\t"
06203         "#  A[6] * B[11]\n\t"
06204         "ldr    x7, [%[a], 48]\n\t"
06205         "ldr    x8, [%[b], 88]\n\t"
06206         "mul    x6, x7, x8\n\t"
06207         "umulh  x7, x7, x8\n\t"
06208         "adds   x5, x5, x6\n\t"
06209         "adcs   x3, x3, x7\n\t"
06210         "adc    x4, xzr, xzr\n\t"
06211         "#  A[7] * B[10]\n\t"
06212         "ldr    x7, [%[a], 56]\n\t"
06213         "ldr    x8, [%[b], 80]\n\t"
06214         "mul    x6, x7, x8\n\t"
06215         "umulh  x7, x7, x8\n\t"
06216         "adds   x5, x5, x6\n\t"
06217         "adcs   x3, x3, x7\n\t"
06218         "adc    x4, x4, xzr\n\t"
06219         "#  A[8] * B[9]\n\t"
06220         "ldr    x7, [%[a], 64]\n\t"
06221         "ldr    x8, [%[b], 72]\n\t"
06222         "mul    x6, x7, x8\n\t"
06223         "umulh  x7, x7, x8\n\t"
06224         "adds   x5, x5, x6\n\t"
06225         "adcs   x3, x3, x7\n\t"
06226         "adc    x4, x4, xzr\n\t"
06227         "#  A[9] * B[8]\n\t"
06228         "ldr    x7, [%[a], 72]\n\t"
06229         "ldr    x8, [%[b], 64]\n\t"
06230         "mul    x6, x7, x8\n\t"
06231         "umulh  x7, x7, x8\n\t"
06232         "adds   x5, x5, x6\n\t"
06233         "adcs   x3, x3, x7\n\t"
06234         "adc    x4, x4, xzr\n\t"
06235         "#  A[10] * B[7]\n\t"
06236         "ldr    x7, [%[a], 80]\n\t"
06237         "ldr    x8, [%[b], 56]\n\t"
06238         "mul    x6, x7, x8\n\t"
06239         "umulh  x7, x7, x8\n\t"
06240         "adds   x5, x5, x6\n\t"
06241         "adcs   x3, x3, x7\n\t"
06242         "adc    x4, x4, xzr\n\t"
06243         "#  A[11] * B[6]\n\t"
06244         "ldr    x7, [%[a], 88]\n\t"
06245         "ldr    x8, [%[b], 48]\n\t"
06246         "mul    x6, x7, x8\n\t"
06247         "umulh  x7, x7, x8\n\t"
06248         "adds   x5, x5, x6\n\t"
06249         "adcs   x3, x3, x7\n\t"
06250         "adc    x4, x4, xzr\n\t"
06251         "str    x5, [%[r], 136]\n\t"
06252         "#  A[7] * B[11]\n\t"
06253         "ldr    x7, [%[a], 56]\n\t"
06254         "ldr    x8, [%[b], 88]\n\t"
06255         "mul    x6, x7, x8\n\t"
06256         "umulh  x7, x7, x8\n\t"
06257         "adds   x3, x3, x6\n\t"
06258         "adcs   x4, x4, x7\n\t"
06259         "adc    x5, xzr, xzr\n\t"
06260         "#  A[8] * B[10]\n\t"
06261         "ldr    x7, [%[a], 64]\n\t"
06262         "ldr    x8, [%[b], 80]\n\t"
06263         "mul    x6, x7, x8\n\t"
06264         "umulh  x7, x7, x8\n\t"
06265         "adds   x3, x3, x6\n\t"
06266         "adcs   x4, x4, x7\n\t"
06267         "adc    x5, x5, xzr\n\t"
06268         "#  A[9] * B[9]\n\t"
06269         "ldr    x7, [%[a], 72]\n\t"
06270         "ldr    x8, [%[b], 72]\n\t"
06271         "mul    x6, x7, x8\n\t"
06272         "umulh  x7, x7, x8\n\t"
06273         "adds   x3, x3, x6\n\t"
06274         "adcs   x4, x4, x7\n\t"
06275         "adc    x5, x5, xzr\n\t"
06276         "#  A[10] * B[8]\n\t"
06277         "ldr    x7, [%[a], 80]\n\t"
06278         "ldr    x8, [%[b], 64]\n\t"
06279         "mul    x6, x7, x8\n\t"
06280         "umulh  x7, x7, x8\n\t"
06281         "adds   x3, x3, x6\n\t"
06282         "adcs   x4, x4, x7\n\t"
06283         "adc    x5, x5, xzr\n\t"
06284         "#  A[11] * B[7]\n\t"
06285         "ldr    x7, [%[a], 88]\n\t"
06286         "ldr    x8, [%[b], 56]\n\t"
06287         "mul    x6, x7, x8\n\t"
06288         "umulh  x7, x7, x8\n\t"
06289         "adds   x3, x3, x6\n\t"
06290         "adcs   x4, x4, x7\n\t"
06291         "adc    x5, x5, xzr\n\t"
06292         "str    x3, [%[r], 144]\n\t"
06293         "#  A[8] * B[11]\n\t"
06294         "ldr    x7, [%[a], 64]\n\t"
06295         "ldr    x8, [%[b], 88]\n\t"
06296         "mul    x6, x7, x8\n\t"
06297         "umulh  x7, x7, x8\n\t"
06298         "adds   x4, x4, x6\n\t"
06299         "adcs   x5, x5, x7\n\t"
06300         "adc    x3, xzr, xzr\n\t"
06301         "#  A[9] * B[10]\n\t"
06302         "ldr    x7, [%[a], 72]\n\t"
06303         "ldr    x8, [%[b], 80]\n\t"
06304         "mul    x6, x7, x8\n\t"
06305         "umulh  x7, x7, x8\n\t"
06306         "adds   x4, x4, x6\n\t"
06307         "adcs   x5, x5, x7\n\t"
06308         "adc    x3, x3, xzr\n\t"
06309         "#  A[10] * B[9]\n\t"
06310         "ldr    x7, [%[a], 80]\n\t"
06311         "ldr    x8, [%[b], 72]\n\t"
06312         "mul    x6, x7, x8\n\t"
06313         "umulh  x7, x7, x8\n\t"
06314         "adds   x4, x4, x6\n\t"
06315         "adcs   x5, x5, x7\n\t"
06316         "adc    x3, x3, xzr\n\t"
06317         "#  A[11] * B[8]\n\t"
06318         "ldr    x7, [%[a], 88]\n\t"
06319         "ldr    x8, [%[b], 64]\n\t"
06320         "mul    x6, x7, x8\n\t"
06321         "umulh  x7, x7, x8\n\t"
06322         "adds   x4, x4, x6\n\t"
06323         "adcs   x5, x5, x7\n\t"
06324         "adc    x3, x3, xzr\n\t"
06325         "str    x4, [%[r], 152]\n\t"
06326         "#  A[9] * B[11]\n\t"
06327         "ldr    x7, [%[a], 72]\n\t"
06328         "ldr    x8, [%[b], 88]\n\t"
06329         "mul    x6, x7, x8\n\t"
06330         "umulh  x7, x7, x8\n\t"
06331         "adds   x5, x5, x6\n\t"
06332         "adcs   x3, x3, x7\n\t"
06333         "adc    x4, xzr, xzr\n\t"
06334         "#  A[10] * B[10]\n\t"
06335         "ldr    x7, [%[a], 80]\n\t"
06336         "ldr    x8, [%[b], 80]\n\t"
06337         "mul    x6, x7, x8\n\t"
06338         "umulh  x7, x7, x8\n\t"
06339         "adds   x5, x5, x6\n\t"
06340         "adcs   x3, x3, x7\n\t"
06341         "adc    x4, x4, xzr\n\t"
06342         "#  A[11] * B[9]\n\t"
06343         "ldr    x7, [%[a], 88]\n\t"
06344         "ldr    x8, [%[b], 72]\n\t"
06345         "mul    x6, x7, x8\n\t"
06346         "umulh  x7, x7, x8\n\t"
06347         "adds   x5, x5, x6\n\t"
06348         "adcs   x3, x3, x7\n\t"
06349         "adc    x4, x4, xzr\n\t"
06350         "str    x5, [%[r], 160]\n\t"
06351         "#  A[10] * B[11]\n\t"
06352         "ldr    x7, [%[a], 80]\n\t"
06353         "ldr    x8, [%[b], 88]\n\t"
06354         "mul    x6, x7, x8\n\t"
06355         "umulh  x7, x7, x8\n\t"
06356         "adds   x3, x3, x6\n\t"
06357         "adcs   x4, x4, x7\n\t"
06358         "adc    x5, xzr, xzr\n\t"
06359         "#  A[11] * B[10]\n\t"
06360         "ldr    x7, [%[a], 88]\n\t"
06361         "ldr    x8, [%[b], 80]\n\t"
06362         "mul    x6, x7, x8\n\t"
06363         "umulh  x7, x7, x8\n\t"
06364         "adds   x3, x3, x6\n\t"
06365         "adcs   x4, x4, x7\n\t"
06366         "adc    x5, x5, xzr\n\t"
06367         "str    x3, [%[r], 168]\n\t"
06368         "#  A[11] * B[11]\n\t"
06369         "ldr    x7, [%[a], 88]\n\t"
06370         "ldr    x8, [%[b], 88]\n\t"
06371         "mul    x6, x7, x8\n\t"
06372         "umulh  x7, x7, x8\n\t"
06373         "adds   x4, x4, x6\n\t"
06374         "adc    x5, x5, x7\n\t"
06375         "stp    x4, x5, [%[r], 176]\n\t"
06376         :
06377         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [tmp] "r" (tmp)
06378         : "memory", "x3", "x4", "x5", "x6", "x7", "x8"
06379     );
06380 
06381     XMEMCPY(r, tmp, sizeof(tmp));
06382 }
06383 
06384 /* Square a and put result in r. (r = a * a)
06385  *
06386  * r  A single precision integer.
06387  * a  A single precision integer.
06388  */
06389 static void sp_3072_sqr_12(sp_digit* r, const sp_digit* a)
06390 {
06391     sp_digit tmp[12];
06392 
06393     __asm__ __volatile__ (
06394         "ldp    x10, x11, [%[a], 0]\n\t"
06395         "ldp    x12, x13, [%[a], 16]\n\t"
06396         "ldp    x14, x15, [%[a], 32]\n\t"
06397         "ldp    x16, x17, [%[a], 48]\n\t"
06398         "ldp    x18, x19, [%[a], 64]\n\t"
06399         "ldp    x20, x21, [%[a], 80]\n\t"
06400         "#  A[0] * A[0]\n\t"
06401         "mul    x2, x10, x10\n\t"
06402         "umulh  x3, x10, x10\n\t"
06403         "str    x2, [%[tmp]]\n\t"
06404         "mov    x4, 0\n\t"
06405         "#  A[0] * A[1]\n\t"
06406         "mul    x8, x10, x11\n\t"
06407         "umulh  x9, x10, x11\n\t"
06408         "adds   x3, x3, x8\n\t"
06409         "adcs   x4, x4, x9\n\t"
06410         "adc    x2, xzr, xzr\n\t"
06411         "adds   x3, x3, x8\n\t"
06412         "adcs   x4, x4, x9\n\t"
06413         "adc    x2, x2, xzr\n\t"
06414         "str    x3, [%[tmp], 8]\n\t"
06415         "#  A[0] * A[2]\n\t"
06416         "mul    x8, x10, x12\n\t"
06417         "umulh  x9, x10, x12\n\t"
06418         "adds   x4, x4, x8\n\t"
06419         "adcs   x2, x2, x9\n\t"
06420         "adc    x3, xzr, xzr\n\t"
06421         "adds   x4, x4, x8\n\t"
06422         "adcs   x2, x2, x9\n\t"
06423         "adc    x3, x3, xzr\n\t"
06424         "#  A[1] * A[1]\n\t"
06425         "mul    x8, x11, x11\n\t"
06426         "umulh  x9, x11, x11\n\t"
06427         "adds   x4, x4, x8\n\t"
06428         "adcs   x2, x2, x9\n\t"
06429         "adc    x3, x3, xzr\n\t"
06430         "str    x4, [%[tmp], 16]\n\t"
06431         "#  A[0] * A[3]\n\t"
06432         "mul    x8, x10, x13\n\t"
06433         "umulh  x9, x10, x13\n\t"
06434         "adds   x2, x2, x8\n\t"
06435         "adcs   x3, x3, x9\n\t"
06436         "adc    x4, xzr, xzr\n\t"
06437         "adds   x2, x2, x8\n\t"
06438         "adcs   x3, x3, x9\n\t"
06439         "adc    x4, x4, xzr\n\t"
06440         "#  A[1] * A[2]\n\t"
06441         "mul    x8, x11, x12\n\t"
06442         "umulh  x9, x11, x12\n\t"
06443         "adds   x2, x2, x8\n\t"
06444         "adcs   x3, x3, x9\n\t"
06445         "adc    x4, x4, xzr\n\t"
06446         "adds   x2, x2, x8\n\t"
06447         "adcs   x3, x3, x9\n\t"
06448         "adc    x4, x4, xzr\n\t"
06449         "str    x2, [%[tmp], 24]\n\t"
06450         "#  A[0] * A[4]\n\t"
06451         "mul    x8, x10, x14\n\t"
06452         "umulh  x9, x10, x14\n\t"
06453         "adds   x3, x3, x8\n\t"
06454         "adcs   x4, x4, x9\n\t"
06455         "adc    x2, xzr, xzr\n\t"
06456         "adds   x3, x3, x8\n\t"
06457         "adcs   x4, x4, x9\n\t"
06458         "adc    x2, x2, xzr\n\t"
06459         "#  A[1] * A[3]\n\t"
06460         "mul    x8, x11, x13\n\t"
06461         "umulh  x9, x11, x13\n\t"
06462         "adds   x3, x3, x8\n\t"
06463         "adcs   x4, x4, x9\n\t"
06464         "adc    x2, x2, xzr\n\t"
06465         "adds   x3, x3, x8\n\t"
06466         "adcs   x4, x4, x9\n\t"
06467         "adc    x2, x2, xzr\n\t"
06468         "#  A[2] * A[2]\n\t"
06469         "mul    x8, x12, x12\n\t"
06470         "umulh  x9, x12, x12\n\t"
06471         "adds   x3, x3, x8\n\t"
06472         "adcs   x4, x4, x9\n\t"
06473         "adc    x2, x2, xzr\n\t"
06474         "str    x3, [%[tmp], 32]\n\t"
06475         "#  A[0] * A[5]\n\t"
06476         "mul    x5, x10, x15\n\t"
06477         "umulh  x6, x10, x15\n\t"
06478         "mov    x3, 0\n\t"
06479         "mov    x7, 0\n\t"
06480         "#  A[1] * A[4]\n\t"
06481         "mul    x8, x11, x14\n\t"
06482         "umulh  x9, x11, x14\n\t"
06483         "adds   x5, x5, x8\n\t"
06484         "adcs   x6, x6, x9\n\t"
06485         "adc    x7, x7, xzr\n\t"
06486         "#  A[2] * A[3]\n\t"
06487         "mul    x8, x12, x13\n\t"
06488         "umulh  x9, x12, x13\n\t"
06489         "adds   x5, x5, x8\n\t"
06490         "adcs   x6, x6, x9\n\t"
06491         "adc    x7, x7, xzr\n\t"
06492         "adds   x5, x5, x5\n\t"
06493         "adcs   x6, x6, x6\n\t"
06494         "adc    x7, x7, x7\n\t"
06495         "adds   x4, x4, x5\n\t"
06496         "adcs   x2, x2, x6\n\t"
06497         "adc    x3, x3, x7\n\t"
06498         "str    x4, [%[tmp], 40]\n\t"
06499         "#  A[0] * A[6]\n\t"
06500         "mul    x5, x10, x16\n\t"
06501         "umulh  x6, x10, x16\n\t"
06502         "mov    x4, 0\n\t"
06503         "mov    x7, 0\n\t"
06504         "#  A[1] * A[5]\n\t"
06505         "mul    x8, x11, x15\n\t"
06506         "umulh  x9, x11, x15\n\t"
06507         "adds   x5, x5, x8\n\t"
06508         "adcs   x6, x6, x9\n\t"
06509         "adc    x7, x7, xzr\n\t"
06510         "#  A[2] * A[4]\n\t"
06511         "mul    x8, x12, x14\n\t"
06512         "umulh  x9, x12, x14\n\t"
06513         "adds   x5, x5, x8\n\t"
06514         "adcs   x6, x6, x9\n\t"
06515         "adc    x7, x7, xzr\n\t"
06516         "#  A[3] * A[3]\n\t"
06517         "mul    x8, x13, x13\n\t"
06518         "umulh  x9, x13, x13\n\t"
06519         "adds   x5, x5, x5\n\t"
06520         "adcs   x6, x6, x6\n\t"
06521         "adc    x7, x7, x7\n\t"
06522         "adds   x5, x5, x8\n\t"
06523         "adcs   x6, x6, x9\n\t"
06524         "adc    x7, x7, xzr\n\t"
06525         "adds   x2, x2, x5\n\t"
06526         "adcs   x3, x3, x6\n\t"
06527         "adc    x4, x4, x7\n\t"
06528         "str    x2, [%[tmp], 48]\n\t"
06529         "#  A[0] * A[7]\n\t"
06530         "mul    x5, x10, x17\n\t"
06531         "umulh  x6, x10, x17\n\t"
06532         "mov    x2, 0\n\t"
06533         "mov    x7, 0\n\t"
06534         "#  A[1] * A[6]\n\t"
06535         "mul    x8, x11, x16\n\t"
06536         "umulh  x9, x11, x16\n\t"
06537         "adds   x5, x5, x8\n\t"
06538         "adcs   x6, x6, x9\n\t"
06539         "adc    x7, x7, xzr\n\t"
06540         "#  A[2] * A[5]\n\t"
06541         "mul    x8, x12, x15\n\t"
06542         "umulh  x9, x12, x15\n\t"
06543         "adds   x5, x5, x8\n\t"
06544         "adcs   x6, x6, x9\n\t"
06545         "adc    x7, x7, xzr\n\t"
06546         "#  A[3] * A[4]\n\t"
06547         "mul    x8, x13, x14\n\t"
06548         "umulh  x9, x13, x14\n\t"
06549         "adds   x5, x5, x8\n\t"
06550         "adcs   x6, x6, x9\n\t"
06551         "adc    x7, x7, xzr\n\t"
06552         "adds   x5, x5, x5\n\t"
06553         "adcs   x6, x6, x6\n\t"
06554         "adc    x7, x7, x7\n\t"
06555         "adds   x3, x3, x5\n\t"
06556         "adcs   x4, x4, x6\n\t"
06557         "adc    x2, x2, x7\n\t"
06558         "str    x3, [%[tmp], 56]\n\t"
06559         "#  A[0] * A[8]\n\t"
06560         "mul    x5, x10, x18\n\t"
06561         "umulh  x6, x10, x18\n\t"
06562         "mov    x3, 0\n\t"
06563         "mov    x7, 0\n\t"
06564         "#  A[1] * A[7]\n\t"
06565         "mul    x8, x11, x17\n\t"
06566         "umulh  x9, x11, x17\n\t"
06567         "adds   x5, x5, x8\n\t"
06568         "adcs   x6, x6, x9\n\t"
06569         "adc    x7, x7, xzr\n\t"
06570         "#  A[2] * A[6]\n\t"
06571         "mul    x8, x12, x16\n\t"
06572         "umulh  x9, x12, x16\n\t"
06573         "adds   x5, x5, x8\n\t"
06574         "adcs   x6, x6, x9\n\t"
06575         "adc    x7, x7, xzr\n\t"
06576         "#  A[3] * A[5]\n\t"
06577         "mul    x8, x13, x15\n\t"
06578         "umulh  x9, x13, x15\n\t"
06579         "adds   x5, x5, x8\n\t"
06580         "adcs   x6, x6, x9\n\t"
06581         "adc    x7, x7, xzr\n\t"
06582         "#  A[4] * A[4]\n\t"
06583         "mul    x8, x14, x14\n\t"
06584         "umulh  x9, x14, x14\n\t"
06585         "adds   x5, x5, x5\n\t"
06586         "adcs   x6, x6, x6\n\t"
06587         "adc    x7, x7, x7\n\t"
06588         "adds   x5, x5, x8\n\t"
06589         "adcs   x6, x6, x9\n\t"
06590         "adc    x7, x7, xzr\n\t"
06591         "adds   x4, x4, x5\n\t"
06592         "adcs   x2, x2, x6\n\t"
06593         "adc    x3, x3, x7\n\t"
06594         "str    x4, [%[tmp], 64]\n\t"
06595         "#  A[0] * A[9]\n\t"
06596         "mul    x5, x10, x19\n\t"
06597         "umulh  x6, x10, x19\n\t"
06598         "mov    x4, 0\n\t"
06599         "mov    x7, 0\n\t"
06600         "#  A[1] * A[8]\n\t"
06601         "mul    x8, x11, x18\n\t"
06602         "umulh  x9, x11, x18\n\t"
06603         "adds   x5, x5, x8\n\t"
06604         "adcs   x6, x6, x9\n\t"
06605         "adc    x7, x7, xzr\n\t"
06606         "#  A[2] * A[7]\n\t"
06607         "mul    x8, x12, x17\n\t"
06608         "umulh  x9, x12, x17\n\t"
06609         "adds   x5, x5, x8\n\t"
06610         "adcs   x6, x6, x9\n\t"
06611         "adc    x7, x7, xzr\n\t"
06612         "#  A[3] * A[6]\n\t"
06613         "mul    x8, x13, x16\n\t"
06614         "umulh  x9, x13, x16\n\t"
06615         "adds   x5, x5, x8\n\t"
06616         "adcs   x6, x6, x9\n\t"
06617         "adc    x7, x7, xzr\n\t"
06618         "#  A[4] * A[5]\n\t"
06619         "mul    x8, x14, x15\n\t"
06620         "umulh  x9, x14, x15\n\t"
06621         "adds   x5, x5, x8\n\t"
06622         "adcs   x6, x6, x9\n\t"
06623         "adc    x7, x7, xzr\n\t"
06624         "adds   x5, x5, x5\n\t"
06625         "adcs   x6, x6, x6\n\t"
06626         "adc    x7, x7, x7\n\t"
06627         "adds   x2, x2, x5\n\t"
06628         "adcs   x3, x3, x6\n\t"
06629         "adc    x4, x4, x7\n\t"
06630         "str    x2, [%[tmp], 72]\n\t"
06631         "#  A[0] * A[10]\n\t"
06632         "mul    x5, x10, x20\n\t"
06633         "umulh  x6, x10, x20\n\t"
06634         "mov    x2, 0\n\t"
06635         "mov    x7, 0\n\t"
06636         "#  A[1] * A[9]\n\t"
06637         "mul    x8, x11, x19\n\t"
06638         "umulh  x9, x11, x19\n\t"
06639         "adds   x5, x5, x8\n\t"
06640         "adcs   x6, x6, x9\n\t"
06641         "adc    x7, x7, xzr\n\t"
06642         "#  A[2] * A[8]\n\t"
06643         "mul    x8, x12, x18\n\t"
06644         "umulh  x9, x12, x18\n\t"
06645         "adds   x5, x5, x8\n\t"
06646         "adcs   x6, x6, x9\n\t"
06647         "adc    x7, x7, xzr\n\t"
06648         "#  A[3] * A[7]\n\t"
06649         "mul    x8, x13, x17\n\t"
06650         "umulh  x9, x13, x17\n\t"
06651         "adds   x5, x5, x8\n\t"
06652         "adcs   x6, x6, x9\n\t"
06653         "adc    x7, x7, xzr\n\t"
06654         "#  A[4] * A[6]\n\t"
06655         "mul    x8, x14, x16\n\t"
06656         "umulh  x9, x14, x16\n\t"
06657         "adds   x5, x5, x8\n\t"
06658         "adcs   x6, x6, x9\n\t"
06659         "adc    x7, x7, xzr\n\t"
06660         "#  A[5] * A[5]\n\t"
06661         "mul    x8, x15, x15\n\t"
06662         "umulh  x9, x15, x15\n\t"
06663         "adds   x5, x5, x5\n\t"
06664         "adcs   x6, x6, x6\n\t"
06665         "adc    x7, x7, x7\n\t"
06666         "adds   x5, x5, x8\n\t"
06667         "adcs   x6, x6, x9\n\t"
06668         "adc    x7, x7, xzr\n\t"
06669         "adds   x3, x3, x5\n\t"
06670         "adcs   x4, x4, x6\n\t"
06671         "adc    x2, x2, x7\n\t"
06672         "str    x3, [%[tmp], 80]\n\t"
06673         "#  A[0] * A[11]\n\t"
06674         "mul    x5, x10, x21\n\t"
06675         "umulh  x6, x10, x21\n\t"
06676         "mov    x3, 0\n\t"
06677         "mov    x7, 0\n\t"
06678         "#  A[1] * A[10]\n\t"
06679         "mul    x8, x11, x20\n\t"
06680         "umulh  x9, x11, x20\n\t"
06681         "adds   x5, x5, x8\n\t"
06682         "adcs   x6, x6, x9\n\t"
06683         "adc    x7, x7, xzr\n\t"
06684         "#  A[2] * A[9]\n\t"
06685         "mul    x8, x12, x19\n\t"
06686         "umulh  x9, x12, x19\n\t"
06687         "adds   x5, x5, x8\n\t"
06688         "adcs   x6, x6, x9\n\t"
06689         "adc    x7, x7, xzr\n\t"
06690         "#  A[3] * A[8]\n\t"
06691         "mul    x8, x13, x18\n\t"
06692         "umulh  x9, x13, x18\n\t"
06693         "adds   x5, x5, x8\n\t"
06694         "adcs   x6, x6, x9\n\t"
06695         "adc    x7, x7, xzr\n\t"
06696         "#  A[4] * A[7]\n\t"
06697         "mul    x8, x14, x17\n\t"
06698         "umulh  x9, x14, x17\n\t"
06699         "adds   x5, x5, x8\n\t"
06700         "adcs   x6, x6, x9\n\t"
06701         "adc    x7, x7, xzr\n\t"
06702         "#  A[5] * A[6]\n\t"
06703         "mul    x8, x15, x16\n\t"
06704         "umulh  x9, x15, x16\n\t"
06705         "adds   x5, x5, x8\n\t"
06706         "adcs   x6, x6, x9\n\t"
06707         "adc    x7, x7, xzr\n\t"
06708         "adds   x5, x5, x5\n\t"
06709         "adcs   x6, x6, x6\n\t"
06710         "adc    x7, x7, x7\n\t"
06711         "adds   x4, x4, x5\n\t"
06712         "adcs   x2, x2, x6\n\t"
06713         "adc    x3, x3, x7\n\t"
06714         "str    x4, [%[tmp], 88]\n\t"
06715         "#  A[1] * A[11]\n\t"
06716         "mul    x5, x11, x21\n\t"
06717         "umulh  x6, x11, x21\n\t"
06718         "mov    x4, 0\n\t"
06719         "mov    x7, 0\n\t"
06720         "#  A[2] * A[10]\n\t"
06721         "mul    x8, x12, x20\n\t"
06722         "umulh  x9, x12, x20\n\t"
06723         "adds   x5, x5, x8\n\t"
06724         "adcs   x6, x6, x9\n\t"
06725         "adc    x7, x7, xzr\n\t"
06726         "#  A[3] * A[9]\n\t"
06727         "mul    x8, x13, x19\n\t"
06728         "umulh  x9, x13, x19\n\t"
06729         "adds   x5, x5, x8\n\t"
06730         "adcs   x6, x6, x9\n\t"
06731         "adc    x7, x7, xzr\n\t"
06732         "#  A[4] * A[8]\n\t"
06733         "mul    x8, x14, x18\n\t"
06734         "umulh  x9, x14, x18\n\t"
06735         "adds   x5, x5, x8\n\t"
06736         "adcs   x6, x6, x9\n\t"
06737         "adc    x7, x7, xzr\n\t"
06738         "#  A[5] * A[7]\n\t"
06739         "mul    x8, x15, x17\n\t"
06740         "umulh  x9, x15, x17\n\t"
06741         "adds   x5, x5, x8\n\t"
06742         "adcs   x6, x6, x9\n\t"
06743         "adc    x7, x7, xzr\n\t"
06744         "#  A[6] * A[6]\n\t"
06745         "mul    x8, x16, x16\n\t"
06746         "umulh  x9, x16, x16\n\t"
06747         "adds   x5, x5, x5\n\t"
06748         "adcs   x6, x6, x6\n\t"
06749         "adc    x7, x7, x7\n\t"
06750         "adds   x5, x5, x8\n\t"
06751         "adcs   x6, x6, x9\n\t"
06752         "adc    x7, x7, xzr\n\t"
06753         "adds   x2, x2, x5\n\t"
06754         "adcs   x3, x3, x6\n\t"
06755         "adc    x4, x4, x7\n\t"
06756         "str    x2, [%[r], 96]\n\t"
06757         "#  A[2] * A[11]\n\t"
06758         "mul    x5, x12, x21\n\t"
06759         "umulh  x6, x12, x21\n\t"
06760         "mov    x2, 0\n\t"
06761         "mov    x7, 0\n\t"
06762         "#  A[3] * A[10]\n\t"
06763         "mul    x8, x13, x20\n\t"
06764         "umulh  x9, x13, x20\n\t"
06765         "adds   x5, x5, x8\n\t"
06766         "adcs   x6, x6, x9\n\t"
06767         "adc    x7, x7, xzr\n\t"
06768         "#  A[4] * A[9]\n\t"
06769         "mul    x8, x14, x19\n\t"
06770         "umulh  x9, x14, x19\n\t"
06771         "adds   x5, x5, x8\n\t"
06772         "adcs   x6, x6, x9\n\t"
06773         "adc    x7, x7, xzr\n\t"
06774         "#  A[5] * A[8]\n\t"
06775         "mul    x8, x15, x18\n\t"
06776         "umulh  x9, x15, x18\n\t"
06777         "adds   x5, x5, x8\n\t"
06778         "adcs   x6, x6, x9\n\t"
06779         "adc    x7, x7, xzr\n\t"
06780         "#  A[6] * A[7]\n\t"
06781         "mul    x8, x16, x17\n\t"
06782         "umulh  x9, x16, x17\n\t"
06783         "adds   x5, x5, x8\n\t"
06784         "adcs   x6, x6, x9\n\t"
06785         "adc    x7, x7, xzr\n\t"
06786         "adds   x5, x5, x5\n\t"
06787         "adcs   x6, x6, x6\n\t"
06788         "adc    x7, x7, x7\n\t"
06789         "adds   x3, x3, x5\n\t"
06790         "adcs   x4, x4, x6\n\t"
06791         "adc    x2, x2, x7\n\t"
06792         "str    x3, [%[r], 104]\n\t"
06793         "#  A[3] * A[11]\n\t"
06794         "mul    x5, x13, x21\n\t"
06795         "umulh  x6, x13, x21\n\t"
06796         "mov    x3, 0\n\t"
06797         "mov    x7, 0\n\t"
06798         "#  A[4] * A[10]\n\t"
06799         "mul    x8, x14, x20\n\t"
06800         "umulh  x9, x14, x20\n\t"
06801         "adds   x5, x5, x8\n\t"
06802         "adcs   x6, x6, x9\n\t"
06803         "adc    x7, x7, xzr\n\t"
06804         "#  A[5] * A[9]\n\t"
06805         "mul    x8, x15, x19\n\t"
06806         "umulh  x9, x15, x19\n\t"
06807         "adds   x5, x5, x8\n\t"
06808         "adcs   x6, x6, x9\n\t"
06809         "adc    x7, x7, xzr\n\t"
06810         "#  A[6] * A[8]\n\t"
06811         "mul    x8, x16, x18\n\t"
06812         "umulh  x9, x16, x18\n\t"
06813         "adds   x5, x5, x8\n\t"
06814         "adcs   x6, x6, x9\n\t"
06815         "adc    x7, x7, xzr\n\t"
06816         "#  A[7] * A[7]\n\t"
06817         "mul    x8, x17, x17\n\t"
06818         "umulh  x9, x17, x17\n\t"
06819         "adds   x5, x5, x5\n\t"
06820         "adcs   x6, x6, x6\n\t"
06821         "adc    x7, x7, x7\n\t"
06822         "adds   x5, x5, x8\n\t"
06823         "adcs   x6, x6, x9\n\t"
06824         "adc    x7, x7, xzr\n\t"
06825         "adds   x4, x4, x5\n\t"
06826         "adcs   x2, x2, x6\n\t"
06827         "adc    x3, x3, x7\n\t"
06828         "str    x4, [%[r], 112]\n\t"
06829         "#  A[4] * A[11]\n\t"
06830         "mul    x5, x14, x21\n\t"
06831         "umulh  x6, x14, x21\n\t"
06832         "mov    x4, 0\n\t"
06833         "mov    x7, 0\n\t"
06834         "#  A[5] * A[10]\n\t"
06835         "mul    x8, x15, x20\n\t"
06836         "umulh  x9, x15, x20\n\t"
06837         "adds   x5, x5, x8\n\t"
06838         "adcs   x6, x6, x9\n\t"
06839         "adc    x7, x7, xzr\n\t"
06840         "#  A[6] * A[9]\n\t"
06841         "mul    x8, x16, x19\n\t"
06842         "umulh  x9, x16, x19\n\t"
06843         "adds   x5, x5, x8\n\t"
06844         "adcs   x6, x6, x9\n\t"
06845         "adc    x7, x7, xzr\n\t"
06846         "#  A[7] * A[8]\n\t"
06847         "mul    x8, x17, x18\n\t"
06848         "umulh  x9, x17, x18\n\t"
06849         "adds   x5, x5, x8\n\t"
06850         "adcs   x6, x6, x9\n\t"
06851         "adc    x7, x7, xzr\n\t"
06852         "adds   x5, x5, x5\n\t"
06853         "adcs   x6, x6, x6\n\t"
06854         "adc    x7, x7, x7\n\t"
06855         "adds   x2, x2, x5\n\t"
06856         "adcs   x3, x3, x6\n\t"
06857         "adc    x4, x4, x7\n\t"
06858         "str    x2, [%[r], 120]\n\t"
06859         "#  A[5] * A[11]\n\t"
06860         "mul    x5, x15, x21\n\t"
06861         "umulh  x6, x15, x21\n\t"
06862         "mov    x2, 0\n\t"
06863         "mov    x7, 0\n\t"
06864         "#  A[6] * A[10]\n\t"
06865         "mul    x8, x16, x20\n\t"
06866         "umulh  x9, x16, x20\n\t"
06867         "adds   x5, x5, x8\n\t"
06868         "adcs   x6, x6, x9\n\t"
06869         "adc    x7, x7, xzr\n\t"
06870         "#  A[7] * A[9]\n\t"
06871         "mul    x8, x17, x19\n\t"
06872         "umulh  x9, x17, x19\n\t"
06873         "adds   x5, x5, x8\n\t"
06874         "adcs   x6, x6, x9\n\t"
06875         "adc    x7, x7, xzr\n\t"
06876         "#  A[8] * A[8]\n\t"
06877         "mul    x8, x18, x18\n\t"
06878         "umulh  x9, x18, x18\n\t"
06879         "adds   x5, x5, x5\n\t"
06880         "adcs   x6, x6, x6\n\t"
06881         "adc    x7, x7, x7\n\t"
06882         "adds   x5, x5, x8\n\t"
06883         "adcs   x6, x6, x9\n\t"
06884         "adc    x7, x7, xzr\n\t"
06885         "adds   x3, x3, x5\n\t"
06886         "adcs   x4, x4, x6\n\t"
06887         "adc    x2, x2, x7\n\t"
06888         "str    x3, [%[r], 128]\n\t"
06889         "#  A[6] * A[11]\n\t"
06890         "mul    x5, x16, x21\n\t"
06891         "umulh  x6, x16, x21\n\t"
06892         "mov    x3, 0\n\t"
06893         "mov    x7, 0\n\t"
06894         "#  A[7] * A[10]\n\t"
06895         "mul    x8, x17, x20\n\t"
06896         "umulh  x9, x17, x20\n\t"
06897         "adds   x5, x5, x8\n\t"
06898         "adcs   x6, x6, x9\n\t"
06899         "adc    x7, x7, xzr\n\t"
06900         "#  A[8] * A[9]\n\t"
06901         "mul    x8, x18, x19\n\t"
06902         "umulh  x9, x18, x19\n\t"
06903         "adds   x5, x5, x8\n\t"
06904         "adcs   x6, x6, x9\n\t"
06905         "adc    x7, x7, xzr\n\t"
06906         "adds   x5, x5, x5\n\t"
06907         "adcs   x6, x6, x6\n\t"
06908         "adc    x7, x7, x7\n\t"
06909         "adds   x4, x4, x5\n\t"
06910         "adcs   x2, x2, x6\n\t"
06911         "adc    x3, x3, x7\n\t"
06912         "str    x4, [%[r], 136]\n\t"
06913         "#  A[7] * A[11]\n\t"
06914         "mul    x8, x17, x21\n\t"
06915         "umulh  x9, x17, x21\n\t"
06916         "adds   x2, x2, x8\n\t"
06917         "adcs   x3, x3, x9\n\t"
06918         "adc    x4, xzr, xzr\n\t"
06919         "adds   x2, x2, x8\n\t"
06920         "adcs   x3, x3, x9\n\t"
06921         "adc    x4, x4, xzr\n\t"
06922         "#  A[8] * A[10]\n\t"
06923         "mul    x8, x18, x20\n\t"
06924         "umulh  x9, x18, x20\n\t"
06925         "adds   x2, x2, x8\n\t"
06926         "adcs   x3, x3, x9\n\t"
06927         "adc    x4, x4, xzr\n\t"
06928         "adds   x2, x2, x8\n\t"
06929         "adcs   x3, x3, x9\n\t"
06930         "adc    x4, x4, xzr\n\t"
06931         "#  A[9] * A[9]\n\t"
06932         "mul    x8, x19, x19\n\t"
06933         "umulh  x9, x19, x19\n\t"
06934         "adds   x2, x2, x8\n\t"
06935         "adcs   x3, x3, x9\n\t"
06936         "adc    x4, x4, xzr\n\t"
06937         "str    x2, [%[r], 144]\n\t"
06938         "#  A[8] * A[11]\n\t"
06939         "mul    x8, x18, x21\n\t"
06940         "umulh  x9, x18, x21\n\t"
06941         "adds   x3, x3, x8\n\t"
06942         "adcs   x4, x4, x9\n\t"
06943         "adc    x2, xzr, xzr\n\t"
06944         "adds   x3, x3, x8\n\t"
06945         "adcs   x4, x4, x9\n\t"
06946         "adc    x2, x2, xzr\n\t"
06947         "#  A[9] * A[10]\n\t"
06948         "mul    x8, x19, x20\n\t"
06949         "umulh  x9, x19, x20\n\t"
06950         "adds   x3, x3, x8\n\t"
06951         "adcs   x4, x4, x9\n\t"
06952         "adc    x2, x2, xzr\n\t"
06953         "adds   x3, x3, x8\n\t"
06954         "adcs   x4, x4, x9\n\t"
06955         "adc    x2, x2, xzr\n\t"
06956         "str    x3, [%[r], 152]\n\t"
06957         "#  A[9] * A[11]\n\t"
06958         "mul    x8, x19, x21\n\t"
06959         "umulh  x9, x19, x21\n\t"
06960         "adds   x4, x4, x8\n\t"
06961         "adcs   x2, x2, x9\n\t"
06962         "adc    x3, xzr, xzr\n\t"
06963         "adds   x4, x4, x8\n\t"
06964         "adcs   x2, x2, x9\n\t"
06965         "adc    x3, x3, xzr\n\t"
06966         "#  A[10] * A[10]\n\t"
06967         "mul    x8, x20, x20\n\t"
06968         "umulh  x9, x20, x20\n\t"
06969         "adds   x4, x4, x8\n\t"
06970         "adcs   x2, x2, x9\n\t"
06971         "adc    x3, x3, xzr\n\t"
06972         "str    x4, [%[r], 160]\n\t"
06973         "#  A[10] * A[11]\n\t"
06974         "mul    x8, x20, x21\n\t"
06975         "umulh  x9, x20, x21\n\t"
06976         "adds   x2, x2, x8\n\t"
06977         "adcs   x3, x3, x9\n\t"
06978         "adc    x4, xzr, xzr\n\t"
06979         "adds   x2, x2, x8\n\t"
06980         "adcs   x3, x3, x9\n\t"
06981         "adc    x4, x4, xzr\n\t"
06982         "str    x2, [%[r], 168]\n\t"
06983         "#  A[11] * A[11]\n\t"
06984         "mul    x8, x21, x21\n\t"
06985         "umulh  x9, x21, x21\n\t"
06986         "adds   x3, x3, x8\n\t"
06987         "adc    x4, x4, x9\n\t"
06988         "stp    x3, x4, [%[r], 176]\n\t"
06989         :
06990         : [r] "r" (r), [a] "r" (a), [tmp] "r" (tmp)
06991         : "memory", "x2", "x3", "x4", "x8", "x9", "x10", "x5", "x6", "x7", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21"
06992     );
06993 
06994     XMEMCPY(r, tmp, sizeof(tmp));
06995 }
06996 
06997 /* Add b to a into r. (r = a + b)
06998  *
06999  * r  A single precision integer.
07000  * a  A single precision integer.
07001  * b  A single precision integer.
07002  */
07003 static sp_digit sp_3072_add_12(sp_digit* r, const sp_digit* a,
07004         const sp_digit* b)
07005 {
07006     sp_digit c = 0;
07007 
07008     __asm__ __volatile__ (
07009         "ldp    x3, x4, [%[a], 0]\n\t"
07010         "ldp    x5, x6, [%[a], 16]\n\t"
07011         "ldp    x7, x8, [%[b], 0]\n\t"
07012         "ldp    x9, x10, [%[b], 16]\n\t"
07013         "adds   x3, x3, x7\n\t"
07014         "adcs   x4, x4, x8\n\t"
07015         "adcs   x5, x5, x9\n\t"
07016         "adcs   x6, x6, x10\n\t"
07017         "stp    x3, x4, [%[r], 0]\n\t"
07018         "stp    x5, x6, [%[r], 16]\n\t"
07019         "ldp    x3, x4, [%[a], 32]\n\t"
07020         "ldp    x5, x6, [%[a], 48]\n\t"
07021         "ldp    x7, x8, [%[b], 32]\n\t"
07022         "ldp    x9, x10, [%[b], 48]\n\t"
07023         "adcs   x3, x3, x7\n\t"
07024         "adcs   x4, x4, x8\n\t"
07025         "adcs   x5, x5, x9\n\t"
07026         "adcs   x6, x6, x10\n\t"
07027         "stp    x3, x4, [%[r], 32]\n\t"
07028         "stp    x5, x6, [%[r], 48]\n\t"
07029         "ldp    x3, x4, [%[a], 64]\n\t"
07030         "ldp    x5, x6, [%[a], 80]\n\t"
07031         "ldp    x7, x8, [%[b], 64]\n\t"
07032         "ldp    x9, x10, [%[b], 80]\n\t"
07033         "adcs   x3, x3, x7\n\t"
07034         "adcs   x4, x4, x8\n\t"
07035         "adcs   x5, x5, x9\n\t"
07036         "adcs   x6, x6, x10\n\t"
07037         "stp    x3, x4, [%[r], 64]\n\t"
07038         "stp    x5, x6, [%[r], 80]\n\t"
07039         "cset   %[c], cs\n\t"
07040         : [c] "+r" (c)
07041         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
07042         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
07043     );
07044 
07045     return c;
07046 }
07047 
07048 /* Sub b from a into a. (a -= b)
07049  *
07050  * a  A single precision integer and result.
07051  * b  A single precision integer.
07052  */
07053 static sp_digit sp_3072_sub_in_place_24(sp_digit* a, const sp_digit* b)
07054 {
07055     sp_digit c = 0;
07056 
07057     __asm__ __volatile__ (
07058         "ldp    x2, x3, [%[a], 0]\n\t"
07059         "ldp    x4, x5, [%[a], 16]\n\t"
07060         "ldp    x6, x7, [%[b], 0]\n\t"
07061         "ldp    x8, x9, [%[b], 16]\n\t"
07062         "subs   x2, x2, x6\n\t"
07063         "sbcs   x3, x3, x7\n\t"
07064         "sbcs   x4, x4, x8\n\t"
07065         "sbcs   x5, x5, x9\n\t"
07066         "stp    x2, x3, [%[a], 0]\n\t"
07067         "stp    x4, x5, [%[a], 16]\n\t"
07068         "ldp    x2, x3, [%[a], 32]\n\t"
07069         "ldp    x4, x5, [%[a], 48]\n\t"
07070         "ldp    x6, x7, [%[b], 32]\n\t"
07071         "ldp    x8, x9, [%[b], 48]\n\t"
07072         "sbcs   x2, x2, x6\n\t"
07073         "sbcs   x3, x3, x7\n\t"
07074         "sbcs   x4, x4, x8\n\t"
07075         "sbcs   x5, x5, x9\n\t"
07076         "stp    x2, x3, [%[a], 32]\n\t"
07077         "stp    x4, x5, [%[a], 48]\n\t"
07078         "ldp    x2, x3, [%[a], 64]\n\t"
07079         "ldp    x4, x5, [%[a], 80]\n\t"
07080         "ldp    x6, x7, [%[b], 64]\n\t"
07081         "ldp    x8, x9, [%[b], 80]\n\t"
07082         "sbcs   x2, x2, x6\n\t"
07083         "sbcs   x3, x3, x7\n\t"
07084         "sbcs   x4, x4, x8\n\t"
07085         "sbcs   x5, x5, x9\n\t"
07086         "stp    x2, x3, [%[a], 64]\n\t"
07087         "stp    x4, x5, [%[a], 80]\n\t"
07088         "ldp    x2, x3, [%[a], 96]\n\t"
07089         "ldp    x4, x5, [%[a], 112]\n\t"
07090         "ldp    x6, x7, [%[b], 96]\n\t"
07091         "ldp    x8, x9, [%[b], 112]\n\t"
07092         "sbcs   x2, x2, x6\n\t"
07093         "sbcs   x3, x3, x7\n\t"
07094         "sbcs   x4, x4, x8\n\t"
07095         "sbcs   x5, x5, x9\n\t"
07096         "stp    x2, x3, [%[a], 96]\n\t"
07097         "stp    x4, x5, [%[a], 112]\n\t"
07098         "ldp    x2, x3, [%[a], 128]\n\t"
07099         "ldp    x4, x5, [%[a], 144]\n\t"
07100         "ldp    x6, x7, [%[b], 128]\n\t"
07101         "ldp    x8, x9, [%[b], 144]\n\t"
07102         "sbcs   x2, x2, x6\n\t"
07103         "sbcs   x3, x3, x7\n\t"
07104         "sbcs   x4, x4, x8\n\t"
07105         "sbcs   x5, x5, x9\n\t"
07106         "stp    x2, x3, [%[a], 128]\n\t"
07107         "stp    x4, x5, [%[a], 144]\n\t"
07108         "ldp    x2, x3, [%[a], 160]\n\t"
07109         "ldp    x4, x5, [%[a], 176]\n\t"
07110         "ldp    x6, x7, [%[b], 160]\n\t"
07111         "ldp    x8, x9, [%[b], 176]\n\t"
07112         "sbcs   x2, x2, x6\n\t"
07113         "sbcs   x3, x3, x7\n\t"
07114         "sbcs   x4, x4, x8\n\t"
07115         "sbcs   x5, x5, x9\n\t"
07116         "stp    x2, x3, [%[a], 160]\n\t"
07117         "stp    x4, x5, [%[a], 176]\n\t"
07118         "csetm  %[c], cc\n\t"
07119         : [c] "+r" (c)
07120         : [a] "r" (a), [b] "r" (b)
07121         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
07122     );
07123 
07124     return c;
07125 }
07126 
07127 /* Add b to a into r. (r = a + b)
07128  *
07129  * r  A single precision integer.
07130  * a  A single precision integer.
07131  * b  A single precision integer.
07132  */
07133 static sp_digit sp_3072_add_24(sp_digit* r, const sp_digit* a,
07134         const sp_digit* b)
07135 {
07136     sp_digit c = 0;
07137 
07138     __asm__ __volatile__ (
07139         "ldp    x3, x4, [%[a], 0]\n\t"
07140         "ldp    x5, x6, [%[a], 16]\n\t"
07141         "ldp    x7, x8, [%[b], 0]\n\t"
07142         "ldp    x9, x10, [%[b], 16]\n\t"
07143         "adds   x3, x3, x7\n\t"
07144         "adcs   x4, x4, x8\n\t"
07145         "adcs   x5, x5, x9\n\t"
07146         "adcs   x6, x6, x10\n\t"
07147         "stp    x3, x4, [%[r], 0]\n\t"
07148         "stp    x5, x6, [%[r], 16]\n\t"
07149         "ldp    x3, x4, [%[a], 32]\n\t"
07150         "ldp    x5, x6, [%[a], 48]\n\t"
07151         "ldp    x7, x8, [%[b], 32]\n\t"
07152         "ldp    x9, x10, [%[b], 48]\n\t"
07153         "adcs   x3, x3, x7\n\t"
07154         "adcs   x4, x4, x8\n\t"
07155         "adcs   x5, x5, x9\n\t"
07156         "adcs   x6, x6, x10\n\t"
07157         "stp    x3, x4, [%[r], 32]\n\t"
07158         "stp    x5, x6, [%[r], 48]\n\t"
07159         "ldp    x3, x4, [%[a], 64]\n\t"
07160         "ldp    x5, x6, [%[a], 80]\n\t"
07161         "ldp    x7, x8, [%[b], 64]\n\t"
07162         "ldp    x9, x10, [%[b], 80]\n\t"
07163         "adcs   x3, x3, x7\n\t"
07164         "adcs   x4, x4, x8\n\t"
07165         "adcs   x5, x5, x9\n\t"
07166         "adcs   x6, x6, x10\n\t"
07167         "stp    x3, x4, [%[r], 64]\n\t"
07168         "stp    x5, x6, [%[r], 80]\n\t"
07169         "ldp    x3, x4, [%[a], 96]\n\t"
07170         "ldp    x5, x6, [%[a], 112]\n\t"
07171         "ldp    x7, x8, [%[b], 96]\n\t"
07172         "ldp    x9, x10, [%[b], 112]\n\t"
07173         "adcs   x3, x3, x7\n\t"
07174         "adcs   x4, x4, x8\n\t"
07175         "adcs   x5, x5, x9\n\t"
07176         "adcs   x6, x6, x10\n\t"
07177         "stp    x3, x4, [%[r], 96]\n\t"
07178         "stp    x5, x6, [%[r], 112]\n\t"
07179         "ldp    x3, x4, [%[a], 128]\n\t"
07180         "ldp    x5, x6, [%[a], 144]\n\t"
07181         "ldp    x7, x8, [%[b], 128]\n\t"
07182         "ldp    x9, x10, [%[b], 144]\n\t"
07183         "adcs   x3, x3, x7\n\t"
07184         "adcs   x4, x4, x8\n\t"
07185         "adcs   x5, x5, x9\n\t"
07186         "adcs   x6, x6, x10\n\t"
07187         "stp    x3, x4, [%[r], 128]\n\t"
07188         "stp    x5, x6, [%[r], 144]\n\t"
07189         "ldp    x3, x4, [%[a], 160]\n\t"
07190         "ldp    x5, x6, [%[a], 176]\n\t"
07191         "ldp    x7, x8, [%[b], 160]\n\t"
07192         "ldp    x9, x10, [%[b], 176]\n\t"
07193         "adcs   x3, x3, x7\n\t"
07194         "adcs   x4, x4, x8\n\t"
07195         "adcs   x5, x5, x9\n\t"
07196         "adcs   x6, x6, x10\n\t"
07197         "stp    x3, x4, [%[r], 160]\n\t"
07198         "stp    x5, x6, [%[r], 176]\n\t"
07199         "cset   %[c], cs\n\t"
07200         : [c] "+r" (c)
07201         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
07202         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
07203     );
07204 
07205     return c;
07206 }
07207 
07208 /* AND m into each word of a and store in r.
07209  *
07210  * r  A single precision integer.
07211  * a  A single precision integer.
07212  * m  Mask to AND against each digit.
07213  */
07214 static void sp_3072_mask_12(sp_digit* r, sp_digit* a, sp_digit m)
07215 {
07216 #ifdef WOLFSSL_SP_SMALL
07217     int i;
07218 
07219     for (i=0; i<12; i++)
07220         r[i] = a[i] & m;
07221 #else
07222     r[0] = a[0] & m;
07223     r[1] = a[1] & m;
07224     r[2] = a[2] & m;
07225     r[3] = a[3] & m;
07226     r[4] = a[4] & m;
07227     r[5] = a[5] & m;
07228     r[6] = a[6] & m;
07229     r[7] = a[7] & m;
07230     r[8] = a[8] & m;
07231     r[9] = a[9] & m;
07232     r[10] = a[10] & m;
07233     r[11] = a[11] & m;
07234 #endif
07235 }
07236 
07237 /* Multiply a and b into r. (r = a * b)
07238  *
07239  * r  A single precision integer.
07240  * a  A single precision integer.
07241  * b  A single precision integer.
07242  */
07243 static void sp_3072_mul_24(sp_digit* r, const sp_digit* a,
07244         const sp_digit* b)
07245 {
07246     sp_digit* z0 = r;
07247     sp_digit z1[24];
07248     sp_digit a1[12];
07249     sp_digit b1[12];
07250     sp_digit z2[24];
07251     sp_digit u, ca, cb;
07252 
07253     ca = sp_3072_add_12(a1, a, &a[12]);
07254     cb = sp_3072_add_12(b1, b, &b[12]);
07255     u  = ca & cb;
07256     sp_3072_mul_12(z1, a1, b1);
07257     sp_3072_mul_12(z2, &a[12], &b[12]);
07258     sp_3072_mul_12(z0, a, b);
07259     sp_3072_mask_12(r + 24, a1, 0 - cb);
07260     sp_3072_mask_12(b1, b1, 0 - ca);
07261     u += sp_3072_add_12(r + 24, r + 24, b1);
07262     u += sp_3072_sub_in_place_24(z1, z2);
07263     u += sp_3072_sub_in_place_24(z1, z0);
07264     u += sp_3072_add_24(r + 12, r + 12, z1);
07265     r[36] = u;
07266     XMEMSET(r + 36 + 1, 0, sizeof(sp_digit) * (12 - 1));
07267     sp_3072_add_24(r + 24, r + 24, z2);
07268 }
07269 
07270 /* Square a and put result in r. (r = a * a)
07271  *
07272  * r  A single precision integer.
07273  * a  A single precision integer.
07274  */
07275 static void sp_3072_sqr_24(sp_digit* r, const sp_digit* a)
07276 {
07277     sp_digit* z0 = r;
07278     sp_digit z2[24];
07279     sp_digit z1[24];
07280     sp_digit a1[12];
07281     sp_digit u;
07282 
07283     u = sp_3072_add_12(a1, a, &a[12]);
07284     sp_3072_sqr_12(z1, a1);
07285     sp_3072_sqr_12(z2, &a[12]);
07286     sp_3072_sqr_12(z0, a);
07287     sp_3072_mask_12(r + 24, a1, 0 - u);
07288     u += sp_3072_add_12(r + 24, r + 24, r + 24);
07289     u += sp_3072_sub_in_place_24(z1, z2);
07290     u += sp_3072_sub_in_place_24(z1, z0);
07291     u += sp_3072_add_24(r + 12, r + 12, z1);
07292     r[36] = u;
07293     XMEMSET(r + 36 + 1, 0, sizeof(sp_digit) * (12 - 1));
07294     sp_3072_add_24(r + 24, r + 24, z2);
07295 }
07296 
07297 /* Sub b from a into a. (a -= b)
07298  *
07299  * a  A single precision integer and result.
07300  * b  A single precision integer.
07301  */
07302 static sp_digit sp_3072_sub_in_place_48(sp_digit* a, const sp_digit* b)
07303 {
07304     sp_digit c = 0;
07305 
07306     __asm__ __volatile__ (
07307         "ldp    x2, x3, [%[a], 0]\n\t"
07308         "ldp    x4, x5, [%[a], 16]\n\t"
07309         "ldp    x6, x7, [%[b], 0]\n\t"
07310         "ldp    x8, x9, [%[b], 16]\n\t"
07311         "subs   x2, x2, x6\n\t"
07312         "sbcs   x3, x3, x7\n\t"
07313         "sbcs   x4, x4, x8\n\t"
07314         "sbcs   x5, x5, x9\n\t"
07315         "stp    x2, x3, [%[a], 0]\n\t"
07316         "stp    x4, x5, [%[a], 16]\n\t"
07317         "ldp    x2, x3, [%[a], 32]\n\t"
07318         "ldp    x4, x5, [%[a], 48]\n\t"
07319         "ldp    x6, x7, [%[b], 32]\n\t"
07320         "ldp    x8, x9, [%[b], 48]\n\t"
07321         "sbcs   x2, x2, x6\n\t"
07322         "sbcs   x3, x3, x7\n\t"
07323         "sbcs   x4, x4, x8\n\t"
07324         "sbcs   x5, x5, x9\n\t"
07325         "stp    x2, x3, [%[a], 32]\n\t"
07326         "stp    x4, x5, [%[a], 48]\n\t"
07327         "ldp    x2, x3, [%[a], 64]\n\t"
07328         "ldp    x4, x5, [%[a], 80]\n\t"
07329         "ldp    x6, x7, [%[b], 64]\n\t"
07330         "ldp    x8, x9, [%[b], 80]\n\t"
07331         "sbcs   x2, x2, x6\n\t"
07332         "sbcs   x3, x3, x7\n\t"
07333         "sbcs   x4, x4, x8\n\t"
07334         "sbcs   x5, x5, x9\n\t"
07335         "stp    x2, x3, [%[a], 64]\n\t"
07336         "stp    x4, x5, [%[a], 80]\n\t"
07337         "ldp    x2, x3, [%[a], 96]\n\t"
07338         "ldp    x4, x5, [%[a], 112]\n\t"
07339         "ldp    x6, x7, [%[b], 96]\n\t"
07340         "ldp    x8, x9, [%[b], 112]\n\t"
07341         "sbcs   x2, x2, x6\n\t"
07342         "sbcs   x3, x3, x7\n\t"
07343         "sbcs   x4, x4, x8\n\t"
07344         "sbcs   x5, x5, x9\n\t"
07345         "stp    x2, x3, [%[a], 96]\n\t"
07346         "stp    x4, x5, [%[a], 112]\n\t"
07347         "ldp    x2, x3, [%[a], 128]\n\t"
07348         "ldp    x4, x5, [%[a], 144]\n\t"
07349         "ldp    x6, x7, [%[b], 128]\n\t"
07350         "ldp    x8, x9, [%[b], 144]\n\t"
07351         "sbcs   x2, x2, x6\n\t"
07352         "sbcs   x3, x3, x7\n\t"
07353         "sbcs   x4, x4, x8\n\t"
07354         "sbcs   x5, x5, x9\n\t"
07355         "stp    x2, x3, [%[a], 128]\n\t"
07356         "stp    x4, x5, [%[a], 144]\n\t"
07357         "ldp    x2, x3, [%[a], 160]\n\t"
07358         "ldp    x4, x5, [%[a], 176]\n\t"
07359         "ldp    x6, x7, [%[b], 160]\n\t"
07360         "ldp    x8, x9, [%[b], 176]\n\t"
07361         "sbcs   x2, x2, x6\n\t"
07362         "sbcs   x3, x3, x7\n\t"
07363         "sbcs   x4, x4, x8\n\t"
07364         "sbcs   x5, x5, x9\n\t"
07365         "stp    x2, x3, [%[a], 160]\n\t"
07366         "stp    x4, x5, [%[a], 176]\n\t"
07367         "ldp    x2, x3, [%[a], 192]\n\t"
07368         "ldp    x4, x5, [%[a], 208]\n\t"
07369         "ldp    x6, x7, [%[b], 192]\n\t"
07370         "ldp    x8, x9, [%[b], 208]\n\t"
07371         "sbcs   x2, x2, x6\n\t"
07372         "sbcs   x3, x3, x7\n\t"
07373         "sbcs   x4, x4, x8\n\t"
07374         "sbcs   x5, x5, x9\n\t"
07375         "stp    x2, x3, [%[a], 192]\n\t"
07376         "stp    x4, x5, [%[a], 208]\n\t"
07377         "ldp    x2, x3, [%[a], 224]\n\t"
07378         "ldp    x4, x5, [%[a], 240]\n\t"
07379         "ldp    x6, x7, [%[b], 224]\n\t"
07380         "ldp    x8, x9, [%[b], 240]\n\t"
07381         "sbcs   x2, x2, x6\n\t"
07382         "sbcs   x3, x3, x7\n\t"
07383         "sbcs   x4, x4, x8\n\t"
07384         "sbcs   x5, x5, x9\n\t"
07385         "stp    x2, x3, [%[a], 224]\n\t"
07386         "stp    x4, x5, [%[a], 240]\n\t"
07387         "ldp    x2, x3, [%[a], 256]\n\t"
07388         "ldp    x4, x5, [%[a], 272]\n\t"
07389         "ldp    x6, x7, [%[b], 256]\n\t"
07390         "ldp    x8, x9, [%[b], 272]\n\t"
07391         "sbcs   x2, x2, x6\n\t"
07392         "sbcs   x3, x3, x7\n\t"
07393         "sbcs   x4, x4, x8\n\t"
07394         "sbcs   x5, x5, x9\n\t"
07395         "stp    x2, x3, [%[a], 256]\n\t"
07396         "stp    x4, x5, [%[a], 272]\n\t"
07397         "ldp    x2, x3, [%[a], 288]\n\t"
07398         "ldp    x4, x5, [%[a], 304]\n\t"
07399         "ldp    x6, x7, [%[b], 288]\n\t"
07400         "ldp    x8, x9, [%[b], 304]\n\t"
07401         "sbcs   x2, x2, x6\n\t"
07402         "sbcs   x3, x3, x7\n\t"
07403         "sbcs   x4, x4, x8\n\t"
07404         "sbcs   x5, x5, x9\n\t"
07405         "stp    x2, x3, [%[a], 288]\n\t"
07406         "stp    x4, x5, [%[a], 304]\n\t"
07407         "ldp    x2, x3, [%[a], 320]\n\t"
07408         "ldp    x4, x5, [%[a], 336]\n\t"
07409         "ldp    x6, x7, [%[b], 320]\n\t"
07410         "ldp    x8, x9, [%[b], 336]\n\t"
07411         "sbcs   x2, x2, x6\n\t"
07412         "sbcs   x3, x3, x7\n\t"
07413         "sbcs   x4, x4, x8\n\t"
07414         "sbcs   x5, x5, x9\n\t"
07415         "stp    x2, x3, [%[a], 320]\n\t"
07416         "stp    x4, x5, [%[a], 336]\n\t"
07417         "ldp    x2, x3, [%[a], 352]\n\t"
07418         "ldp    x4, x5, [%[a], 368]\n\t"
07419         "ldp    x6, x7, [%[b], 352]\n\t"
07420         "ldp    x8, x9, [%[b], 368]\n\t"
07421         "sbcs   x2, x2, x6\n\t"
07422         "sbcs   x3, x3, x7\n\t"
07423         "sbcs   x4, x4, x8\n\t"
07424         "sbcs   x5, x5, x9\n\t"
07425         "stp    x2, x3, [%[a], 352]\n\t"
07426         "stp    x4, x5, [%[a], 368]\n\t"
07427         "csetm  %[c], cc\n\t"
07428         : [c] "+r" (c)
07429         : [a] "r" (a), [b] "r" (b)
07430         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
07431     );
07432 
07433     return c;
07434 }
07435 
07436 /* Add b to a into r. (r = a + b)
07437  *
07438  * r  A single precision integer.
07439  * a  A single precision integer.
07440  * b  A single precision integer.
07441  */
07442 static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a,
07443         const sp_digit* b)
07444 {
07445     sp_digit c = 0;
07446 
07447     __asm__ __volatile__ (
07448         "ldp    x3, x4, [%[a], 0]\n\t"
07449         "ldp    x5, x6, [%[a], 16]\n\t"
07450         "ldp    x7, x8, [%[b], 0]\n\t"
07451         "ldp    x9, x10, [%[b], 16]\n\t"
07452         "adds   x3, x3, x7\n\t"
07453         "adcs   x4, x4, x8\n\t"
07454         "adcs   x5, x5, x9\n\t"
07455         "adcs   x6, x6, x10\n\t"
07456         "stp    x3, x4, [%[r], 0]\n\t"
07457         "stp    x5, x6, [%[r], 16]\n\t"
07458         "ldp    x3, x4, [%[a], 32]\n\t"
07459         "ldp    x5, x6, [%[a], 48]\n\t"
07460         "ldp    x7, x8, [%[b], 32]\n\t"
07461         "ldp    x9, x10, [%[b], 48]\n\t"
07462         "adcs   x3, x3, x7\n\t"
07463         "adcs   x4, x4, x8\n\t"
07464         "adcs   x5, x5, x9\n\t"
07465         "adcs   x6, x6, x10\n\t"
07466         "stp    x3, x4, [%[r], 32]\n\t"
07467         "stp    x5, x6, [%[r], 48]\n\t"
07468         "ldp    x3, x4, [%[a], 64]\n\t"
07469         "ldp    x5, x6, [%[a], 80]\n\t"
07470         "ldp    x7, x8, [%[b], 64]\n\t"
07471         "ldp    x9, x10, [%[b], 80]\n\t"
07472         "adcs   x3, x3, x7\n\t"
07473         "adcs   x4, x4, x8\n\t"
07474         "adcs   x5, x5, x9\n\t"
07475         "adcs   x6, x6, x10\n\t"
07476         "stp    x3, x4, [%[r], 64]\n\t"
07477         "stp    x5, x6, [%[r], 80]\n\t"
07478         "ldp    x3, x4, [%[a], 96]\n\t"
07479         "ldp    x5, x6, [%[a], 112]\n\t"
07480         "ldp    x7, x8, [%[b], 96]\n\t"
07481         "ldp    x9, x10, [%[b], 112]\n\t"
07482         "adcs   x3, x3, x7\n\t"
07483         "adcs   x4, x4, x8\n\t"
07484         "adcs   x5, x5, x9\n\t"
07485         "adcs   x6, x6, x10\n\t"
07486         "stp    x3, x4, [%[r], 96]\n\t"
07487         "stp    x5, x6, [%[r], 112]\n\t"
07488         "ldp    x3, x4, [%[a], 128]\n\t"
07489         "ldp    x5, x6, [%[a], 144]\n\t"
07490         "ldp    x7, x8, [%[b], 128]\n\t"
07491         "ldp    x9, x10, [%[b], 144]\n\t"
07492         "adcs   x3, x3, x7\n\t"
07493         "adcs   x4, x4, x8\n\t"
07494         "adcs   x5, x5, x9\n\t"
07495         "adcs   x6, x6, x10\n\t"
07496         "stp    x3, x4, [%[r], 128]\n\t"
07497         "stp    x5, x6, [%[r], 144]\n\t"
07498         "ldp    x3, x4, [%[a], 160]\n\t"
07499         "ldp    x5, x6, [%[a], 176]\n\t"
07500         "ldp    x7, x8, [%[b], 160]\n\t"
07501         "ldp    x9, x10, [%[b], 176]\n\t"
07502         "adcs   x3, x3, x7\n\t"
07503         "adcs   x4, x4, x8\n\t"
07504         "adcs   x5, x5, x9\n\t"
07505         "adcs   x6, x6, x10\n\t"
07506         "stp    x3, x4, [%[r], 160]\n\t"
07507         "stp    x5, x6, [%[r], 176]\n\t"
07508         "ldp    x3, x4, [%[a], 192]\n\t"
07509         "ldp    x5, x6, [%[a], 208]\n\t"
07510         "ldp    x7, x8, [%[b], 192]\n\t"
07511         "ldp    x9, x10, [%[b], 208]\n\t"
07512         "adcs   x3, x3, x7\n\t"
07513         "adcs   x4, x4, x8\n\t"
07514         "adcs   x5, x5, x9\n\t"
07515         "adcs   x6, x6, x10\n\t"
07516         "stp    x3, x4, [%[r], 192]\n\t"
07517         "stp    x5, x6, [%[r], 208]\n\t"
07518         "ldp    x3, x4, [%[a], 224]\n\t"
07519         "ldp    x5, x6, [%[a], 240]\n\t"
07520         "ldp    x7, x8, [%[b], 224]\n\t"
07521         "ldp    x9, x10, [%[b], 240]\n\t"
07522         "adcs   x3, x3, x7\n\t"
07523         "adcs   x4, x4, x8\n\t"
07524         "adcs   x5, x5, x9\n\t"
07525         "adcs   x6, x6, x10\n\t"
07526         "stp    x3, x4, [%[r], 224]\n\t"
07527         "stp    x5, x6, [%[r], 240]\n\t"
07528         "ldp    x3, x4, [%[a], 256]\n\t"
07529         "ldp    x5, x6, [%[a], 272]\n\t"
07530         "ldp    x7, x8, [%[b], 256]\n\t"
07531         "ldp    x9, x10, [%[b], 272]\n\t"
07532         "adcs   x3, x3, x7\n\t"
07533         "adcs   x4, x4, x8\n\t"
07534         "adcs   x5, x5, x9\n\t"
07535         "adcs   x6, x6, x10\n\t"
07536         "stp    x3, x4, [%[r], 256]\n\t"
07537         "stp    x5, x6, [%[r], 272]\n\t"
07538         "ldp    x3, x4, [%[a], 288]\n\t"
07539         "ldp    x5, x6, [%[a], 304]\n\t"
07540         "ldp    x7, x8, [%[b], 288]\n\t"
07541         "ldp    x9, x10, [%[b], 304]\n\t"
07542         "adcs   x3, x3, x7\n\t"
07543         "adcs   x4, x4, x8\n\t"
07544         "adcs   x5, x5, x9\n\t"
07545         "adcs   x6, x6, x10\n\t"
07546         "stp    x3, x4, [%[r], 288]\n\t"
07547         "stp    x5, x6, [%[r], 304]\n\t"
07548         "ldp    x3, x4, [%[a], 320]\n\t"
07549         "ldp    x5, x6, [%[a], 336]\n\t"
07550         "ldp    x7, x8, [%[b], 320]\n\t"
07551         "ldp    x9, x10, [%[b], 336]\n\t"
07552         "adcs   x3, x3, x7\n\t"
07553         "adcs   x4, x4, x8\n\t"
07554         "adcs   x5, x5, x9\n\t"
07555         "adcs   x6, x6, x10\n\t"
07556         "stp    x3, x4, [%[r], 320]\n\t"
07557         "stp    x5, x6, [%[r], 336]\n\t"
07558         "ldp    x3, x4, [%[a], 352]\n\t"
07559         "ldp    x5, x6, [%[a], 368]\n\t"
07560         "ldp    x7, x8, [%[b], 352]\n\t"
07561         "ldp    x9, x10, [%[b], 368]\n\t"
07562         "adcs   x3, x3, x7\n\t"
07563         "adcs   x4, x4, x8\n\t"
07564         "adcs   x5, x5, x9\n\t"
07565         "adcs   x6, x6, x10\n\t"
07566         "stp    x3, x4, [%[r], 352]\n\t"
07567         "stp    x5, x6, [%[r], 368]\n\t"
07568         "cset   %[c], cs\n\t"
07569         : [c] "+r" (c)
07570         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
07571         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
07572     );
07573 
07574     return c;
07575 }
07576 
07577 /* AND m into each word of a and store in r.
07578  *
07579  * r  A single precision integer.
07580  * a  A single precision integer.
07581  * m  Mask to AND against each digit.
07582  */
07583 static void sp_3072_mask_24(sp_digit* r, sp_digit* a, sp_digit m)
07584 {
07585 #ifdef WOLFSSL_SP_SMALL
07586     int i;
07587 
07588     for (i=0; i<24; i++)
07589         r[i] = a[i] & m;
07590 #else
07591     int i;
07592 
07593     for (i = 0; i < 24; i += 8) {
07594         r[i+0] = a[i+0] & m;
07595         r[i+1] = a[i+1] & m;
07596         r[i+2] = a[i+2] & m;
07597         r[i+3] = a[i+3] & m;
07598         r[i+4] = a[i+4] & m;
07599         r[i+5] = a[i+5] & m;
07600         r[i+6] = a[i+6] & m;
07601         r[i+7] = a[i+7] & m;
07602     }
07603 #endif
07604 }
07605 
07606 /* Multiply a and b into r. (r = a * b)
07607  *
07608  * r  A single precision integer.
07609  * a  A single precision integer.
07610  * b  A single precision integer.
07611  */
07612 static void sp_3072_mul_48(sp_digit* r, const sp_digit* a,
07613         const sp_digit* b)
07614 {
07615     sp_digit* z0 = r;
07616     sp_digit z1[48];
07617     sp_digit a1[24];
07618     sp_digit b1[24];
07619     sp_digit z2[48];
07620     sp_digit u, ca, cb;
07621 
07622     ca = sp_3072_add_24(a1, a, &a[24]);
07623     cb = sp_3072_add_24(b1, b, &b[24]);
07624     u  = ca & cb;
07625     sp_3072_mul_24(z1, a1, b1);
07626     sp_3072_mul_24(z2, &a[24], &b[24]);
07627     sp_3072_mul_24(z0, a, b);
07628     sp_3072_mask_24(r + 48, a1, 0 - cb);
07629     sp_3072_mask_24(b1, b1, 0 - ca);
07630     u += sp_3072_add_24(r + 48, r + 48, b1);
07631     u += sp_3072_sub_in_place_48(z1, z2);
07632     u += sp_3072_sub_in_place_48(z1, z0);
07633     u += sp_3072_add_48(r + 24, r + 24, z1);
07634     r[72] = u;
07635     XMEMSET(r + 72 + 1, 0, sizeof(sp_digit) * (24 - 1));
07636     sp_3072_add_48(r + 48, r + 48, z2);
07637 }
07638 
07639 /* Square a and put result in r. (r = a * a)
07640  *
07641  * r  A single precision integer.
07642  * a  A single precision integer.
07643  */
07644 static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a)
07645 {
07646     sp_digit* z0 = r;
07647     sp_digit z2[48];
07648     sp_digit z1[48];
07649     sp_digit a1[24];
07650     sp_digit u;
07651 
07652     u = sp_3072_add_24(a1, a, &a[24]);
07653     sp_3072_sqr_24(z1, a1);
07654     sp_3072_sqr_24(z2, &a[24]);
07655     sp_3072_sqr_24(z0, a);
07656     sp_3072_mask_24(r + 48, a1, 0 - u);
07657     u += sp_3072_add_24(r + 48, r + 48, r + 48);
07658     u += sp_3072_sub_in_place_48(z1, z2);
07659     u += sp_3072_sub_in_place_48(z1, z0);
07660     u += sp_3072_add_48(r + 24, r + 24, z1);
07661     r[72] = u;
07662     XMEMSET(r + 72 + 1, 0, sizeof(sp_digit) * (24 - 1));
07663     sp_3072_add_48(r + 48, r + 48, z2);
07664 }
07665 
07666 #endif /* WOLFSSL_SP_SMALL */
07667 #ifdef WOLFSSL_SP_SMALL
07668 /* Add b to a into r. (r = a + b)
07669  *
07670  * r  A single precision integer.
07671  * a  A single precision integer.
07672  * b  A single precision integer.
07673  */
07674 static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a,
07675         const sp_digit* b)
07676 {
07677     sp_digit c = 0;
07678 
07679     __asm__ __volatile__ (
07680         "add    x11, %[a], 384\n\t"
07681         "\n1:\n\t"
07682         "adds   %[c], %[c], #-1\n\t"
07683         "ldp    x3, x4, [%[a]], #16\n\t"
07684         "ldp    x5, x6, [%[a]], #16\n\t"
07685         "ldp    x7, x8, [%[b]], #16\n\t"
07686         "ldp    x9, x10, [%[b]], #16\n\t"
07687         "adcs   x3, x3, x7\n\t"
07688         "adcs   x4, x4, x8\n\t"
07689         "adcs   x5, x5, x9\n\t"
07690         "adcs   x6, x6, x10\n\t"
07691         "stp    x3, x4, [%[r]], #16\n\t"
07692         "stp    x5, x6, [%[r]], #16\n\t"
07693         "cset   %[c], cs\n\t"
07694         "cmp    %[a], x11\n\t"
07695         "b.ne   1b\n\t"
07696         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
07697         :
07698         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
07699     );
07700 
07701     return c;
07702 }
07703 
07704 #endif /* WOLFSSL_SP_SMALL */
07705 #ifdef WOLFSSL_SP_SMALL
07706 /* Sub b from a into a. (a -= b)
07707  *
07708  * a  A single precision integer.
07709  * b  A single precision integer.
07710  */
07711 static sp_digit sp_3072_sub_in_place_48(sp_digit* a, const sp_digit* b)
07712 {
07713     sp_digit c = 0;
07714 
07715     __asm__ __volatile__ (
07716         "add    x10, %[a], 384\n\t"
07717         "\n1:\n\t"
07718         "subs   %[c], xzr, %[c]\n\t"
07719         "ldp    x2, x3, [%[a]]\n\t"
07720         "ldp    x4, x5, [%[a], #16]\n\t"
07721         "ldp    x6, x7, [%[b]], #16\n\t"
07722         "ldp    x8, x9, [%[b]], #16\n\t"
07723         "sbcs   x2, x2, x6\n\t"
07724         "sbcs   x3, x3, x7\n\t"
07725         "sbcs   x4, x4, x8\n\t"
07726         "sbcs   x5, x5, x9\n\t"
07727         "stp    x2, x3, [%[a]], #16\n\t"
07728         "stp    x4, x5, [%[a]], #16\n\t"
07729         "csetm  %[c], cc\n\t"
07730         "cmp    %[a], x10\n\t"
07731         "b.ne   1b\n\t"
07732         : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b)
07733         :
07734         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
07735     );
07736 
07737     return c;
07738 }
07739 
07740 #endif /* WOLFSSL_SP_SMALL */
07741 #ifdef WOLFSSL_SP_SMALL
07742 /* Multiply a and b into r. (r = a * b)
07743  *
07744  * r  A single precision integer.
07745  * a  A single precision integer.
07746  * b  A single precision integer.
07747  */
07748 static void sp_3072_mul_48(sp_digit* r, const sp_digit* a, const sp_digit* b)
07749 {
07750     sp_digit tmp[96];
07751 
07752     __asm__ __volatile__ (
07753         "mov    x5, 0\n\t"
07754         "mov    x6, 0\n\t"
07755         "mov    x7, 0\n\t"
07756         "mov    x8, 0\n\t"
07757         "\n1:\n\t"
07758         "subs   x3, x5, 376\n\t"
07759         "csel   x3, xzr, x3, cc\n\t"
07760         "sub    x4, x5, x3\n\t"
07761         "\n2:\n\t"
07762         "ldr    x10, [%[a], x3]\n\t"
07763         "ldr    x11, [%[b], x4]\n\t"
07764         "mul    x9, x10, x11\n\t"
07765         "umulh  x10, x10, x11\n\t"
07766         "adds   x6, x6, x9\n\t"
07767         "adcs   x7, x7, x10\n\t"
07768         "adc    x8, x8, xzr\n\t"
07769         "add    x3, x3, #8\n\t"
07770         "sub    x4, x4, #8\n\t"
07771         "cmp    x3, 384\n\t"
07772         "b.eq   3f\n\t"
07773         "cmp    x3, x5\n\t"
07774         "b.le   2b\n\t"
07775         "\n3:\n\t"
07776         "str    x6, [%[r], x5]\n\t"
07777         "mov    x6, x7\n\t"
07778         "mov    x7, x8\n\t"
07779         "mov    x8, #0\n\t"
07780         "add    x5, x5, #8\n\t"
07781         "cmp    x5, 752\n\t"
07782         "b.le   1b\n\t"
07783         "str    x6, [%[r], x5]\n\t"
07784         :
07785         : [r] "r" (tmp), [a] "r" (a), [b] "r" (b)
07786         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
07787     );
07788 
07789     XMEMCPY(r, tmp, sizeof(tmp));
07790 }
07791 
07792 /* Square a and put result in r. (r = a * a)
07793  *
07794  * r  A single precision integer.
07795  * a  A single precision integer.
07796  */
07797 static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a)
07798 {
07799     sp_digit tmp[96];
07800 
07801     __asm__ __volatile__ (
07802         "mov    x6, 0\n\t"
07803         "mov    x7, 0\n\t"
07804         "mov    x8, 0\n\t"
07805         "mov    x5, 0\n\t"
07806         "\n1:\n\t"
07807         "subs   x3, x5, 376\n\t"
07808         "csel   x3, xzr, x3, cc\n\t"
07809         "sub    x4, x5, x3\n\t"
07810         "\n2:\n\t"
07811         "cmp    x4, x3\n\t"
07812         "b.eq   4f\n\t"
07813         "ldr    x10, [%[a], x3]\n\t"
07814         "ldr    x11, [%[a], x4]\n\t"
07815         "mul    x9, x10, x11\n\t"
07816         "umulh  x10, x10, x11\n\t"
07817         "adds   x6, x6, x9\n\t"
07818         "adcs   x7, x7, x10\n\t"
07819         "adc    x8, x8, xzr\n\t"
07820         "adds   x6, x6, x9\n\t"
07821         "adcs   x7, x7, x10\n\t"
07822         "adc    x8, x8, xzr\n\t"
07823         "b.al   5f\n\t"
07824         "\n4:\n\t"
07825         "ldr    x10, [%[a], x3]\n\t"
07826         "mul    x9, x10, x10\n\t"
07827         "umulh  x10, x10, x10\n\t"
07828         "adds   x6, x6, x9\n\t"
07829         "adcs   x7, x7, x10\n\t"
07830         "adc    x8, x8, xzr\n\t"
07831         "\n5:\n\t"
07832         "add    x3, x3, #8\n\t"
07833         "sub    x4, x4, #8\n\t"
07834         "cmp    x3, 384\n\t"
07835         "b.eq   3f\n\t"
07836         "cmp    x3, x4\n\t"
07837         "b.gt   3f\n\t"
07838         "cmp    x3, x5\n\t"
07839         "b.le   2b\n\t"
07840         "\n3:\n\t"
07841         "str    x6, [%[r], x5]\n\t"
07842         "mov    x6, x7\n\t"
07843         "mov    x7, x8\n\t"
07844         "mov    x8, #0\n\t"
07845         "add    x5, x5, #8\n\t"
07846         "cmp    x5, 752\n\t"
07847         "b.le   1b\n\t"
07848         "str    x6, [%[r], x5]\n\t"
07849         :
07850         : [r] "r" (tmp), [a] "r" (a)
07851         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
07852     );
07853 
07854     XMEMCPY(r, tmp, sizeof(tmp));
07855 }
07856 
07857 #endif /* WOLFSSL_SP_SMALL */
07858 #if !defined(SP_RSA_PRIVATE_EXP_D) && defined(WOLFSSL_HAVE_SP_RSA)
07859 #ifdef WOLFSSL_SP_SMALL
07860 /* AND m into each word of a and store in r.
07861  *
07862  * r  A single precision integer.
07863  * a  A single precision integer.
07864  * m  Mask to AND against each digit.
07865  */
07866 static void sp_3072_mask_24(sp_digit* r, sp_digit* a, sp_digit m)
07867 {
07868     int i;
07869 
07870     for (i=0; i<24; i++)
07871         r[i] = a[i] & m;
07872 }
07873 
07874 #endif /* WOLFSSL_SP_SMALL */
07875 #ifdef WOLFSSL_SP_SMALL
07876 /* Add b to a into r. (r = a + b)
07877  *
07878  * r  A single precision integer.
07879  * a  A single precision integer.
07880  * b  A single precision integer.
07881  */
07882 static sp_digit sp_3072_add_24(sp_digit* r, const sp_digit* a,
07883         const sp_digit* b)
07884 {
07885     sp_digit c = 0;
07886 
07887     __asm__ __volatile__ (
07888         "add    x11, %[a], 192\n\t"
07889         "\n1:\n\t"
07890         "adds   %[c], %[c], #-1\n\t"
07891         "ldp    x3, x4, [%[a]], #16\n\t"
07892         "ldp    x5, x6, [%[a]], #16\n\t"
07893         "ldp    x7, x8, [%[b]], #16\n\t"
07894         "ldp    x9, x10, [%[b]], #16\n\t"
07895         "adcs   x3, x3, x7\n\t"
07896         "adcs   x4, x4, x8\n\t"
07897         "adcs   x5, x5, x9\n\t"
07898         "adcs   x6, x6, x10\n\t"
07899         "stp    x3, x4, [%[r]], #16\n\t"
07900         "stp    x5, x6, [%[r]], #16\n\t"
07901         "cset   %[c], cs\n\t"
07902         "cmp    %[a], x11\n\t"
07903         "b.ne   1b\n\t"
07904         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
07905         :
07906         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
07907     );
07908 
07909     return c;
07910 }
07911 
07912 #endif /* WOLFSSL_SP_SMALL */
07913 #ifdef WOLFSSL_SP_SMALL
07914 /* Sub b from a into a. (a -= b)
07915  *
07916  * a  A single precision integer.
07917  * b  A single precision integer.
07918  */
07919 static sp_digit sp_3072_sub_in_place_24(sp_digit* a, const sp_digit* b)
07920 {
07921     sp_digit c = 0;
07922 
07923     __asm__ __volatile__ (
07924         "add    x10, %[a], 192\n\t"
07925         "\n1:\n\t"
07926         "subs   %[c], xzr, %[c]\n\t"
07927         "ldp    x2, x3, [%[a]]\n\t"
07928         "ldp    x4, x5, [%[a], #16]\n\t"
07929         "ldp    x6, x7, [%[b]], #16\n\t"
07930         "ldp    x8, x9, [%[b]], #16\n\t"
07931         "sbcs   x2, x2, x6\n\t"
07932         "sbcs   x3, x3, x7\n\t"
07933         "sbcs   x4, x4, x8\n\t"
07934         "sbcs   x5, x5, x9\n\t"
07935         "stp    x2, x3, [%[a]], #16\n\t"
07936         "stp    x4, x5, [%[a]], #16\n\t"
07937         "csetm  %[c], cc\n\t"
07938         "cmp    %[a], x10\n\t"
07939         "b.ne   1b\n\t"
07940         : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b)
07941         :
07942         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
07943     );
07944 
07945     return c;
07946 }
07947 
07948 #endif /* WOLFSSL_SP_SMALL */
07949 #ifdef WOLFSSL_SP_SMALL
07950 /* Multiply a and b into r. (r = a * b)
07951  *
07952  * r  A single precision integer.
07953  * a  A single precision integer.
07954  * b  A single precision integer.
07955  */
07956 static void sp_3072_mul_24(sp_digit* r, const sp_digit* a, const sp_digit* b)
07957 {
07958     sp_digit tmp[48];
07959 
07960     __asm__ __volatile__ (
07961         "mov    x5, 0\n\t"
07962         "mov    x6, 0\n\t"
07963         "mov    x7, 0\n\t"
07964         "mov    x8, 0\n\t"
07965         "\n1:\n\t"
07966         "subs   x3, x5, 184\n\t"
07967         "csel   x3, xzr, x3, cc\n\t"
07968         "sub    x4, x5, x3\n\t"
07969         "\n2:\n\t"
07970         "ldr    x10, [%[a], x3]\n\t"
07971         "ldr    x11, [%[b], x4]\n\t"
07972         "mul    x9, x10, x11\n\t"
07973         "umulh  x10, x10, x11\n\t"
07974         "adds   x6, x6, x9\n\t"
07975         "adcs   x7, x7, x10\n\t"
07976         "adc    x8, x8, xzr\n\t"
07977         "add    x3, x3, #8\n\t"
07978         "sub    x4, x4, #8\n\t"
07979         "cmp    x3, 192\n\t"
07980         "b.eq   3f\n\t"
07981         "cmp    x3, x5\n\t"
07982         "b.le   2b\n\t"
07983         "\n3:\n\t"
07984         "str    x6, [%[r], x5]\n\t"
07985         "mov    x6, x7\n\t"
07986         "mov    x7, x8\n\t"
07987         "mov    x8, #0\n\t"
07988         "add    x5, x5, #8\n\t"
07989         "cmp    x5, 368\n\t"
07990         "b.le   1b\n\t"
07991         "str    x6, [%[r], x5]\n\t"
07992         :
07993         : [r] "r" (tmp), [a] "r" (a), [b] "r" (b)
07994         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
07995     );
07996 
07997     XMEMCPY(r, tmp, sizeof(tmp));
07998 }
07999 
08000 /* Square a and put result in r. (r = a * a)
08001  *
08002  * r  A single precision integer.
08003  * a  A single precision integer.
08004  */
08005 static void sp_3072_sqr_24(sp_digit* r, const sp_digit* a)
08006 {
08007     sp_digit tmp[48];
08008 
08009     __asm__ __volatile__ (
08010         "mov    x6, 0\n\t"
08011         "mov    x7, 0\n\t"
08012         "mov    x8, 0\n\t"
08013         "mov    x5, 0\n\t"
08014         "\n1:\n\t"
08015         "subs   x3, x5, 184\n\t"
08016         "csel   x3, xzr, x3, cc\n\t"
08017         "sub    x4, x5, x3\n\t"
08018         "\n2:\n\t"
08019         "cmp    x4, x3\n\t"
08020         "b.eq   4f\n\t"
08021         "ldr    x10, [%[a], x3]\n\t"
08022         "ldr    x11, [%[a], x4]\n\t"
08023         "mul    x9, x10, x11\n\t"
08024         "umulh  x10, x10, x11\n\t"
08025         "adds   x6, x6, x9\n\t"
08026         "adcs   x7, x7, x10\n\t"
08027         "adc    x8, x8, xzr\n\t"
08028         "adds   x6, x6, x9\n\t"
08029         "adcs   x7, x7, x10\n\t"
08030         "adc    x8, x8, xzr\n\t"
08031         "b.al   5f\n\t"
08032         "\n4:\n\t"
08033         "ldr    x10, [%[a], x3]\n\t"
08034         "mul    x9, x10, x10\n\t"
08035         "umulh  x10, x10, x10\n\t"
08036         "adds   x6, x6, x9\n\t"
08037         "adcs   x7, x7, x10\n\t"
08038         "adc    x8, x8, xzr\n\t"
08039         "\n5:\n\t"
08040         "add    x3, x3, #8\n\t"
08041         "sub    x4, x4, #8\n\t"
08042         "cmp    x3, 192\n\t"
08043         "b.eq   3f\n\t"
08044         "cmp    x3, x4\n\t"
08045         "b.gt   3f\n\t"
08046         "cmp    x3, x5\n\t"
08047         "b.le   2b\n\t"
08048         "\n3:\n\t"
08049         "str    x6, [%[r], x5]\n\t"
08050         "mov    x6, x7\n\t"
08051         "mov    x7, x8\n\t"
08052         "mov    x8, #0\n\t"
08053         "add    x5, x5, #8\n\t"
08054         "cmp    x5, 368\n\t"
08055         "b.le   1b\n\t"
08056         "str    x6, [%[r], x5]\n\t"
08057         :
08058         : [r] "r" (tmp), [a] "r" (a)
08059         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
08060     );
08061 
08062     XMEMCPY(r, tmp, sizeof(tmp));
08063 }
08064 
08065 #endif /* WOLFSSL_SP_SMALL */
08066 #endif /* !SP_RSA_PRIVATE_EXP_D && WOLFSSL_HAVE_SP_RSA */
08067 
08068 /* Caclulate the bottom digit of -1/a mod 2^n.
08069  *
08070  * a    A single precision number.
08071  * rho  Bottom word of inverse.
08072  */
08073 static void sp_3072_mont_setup(sp_digit* a, sp_digit* rho)
08074 {
08075     sp_digit x, b;
08076 
08077     b = a[0];
08078     x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
08079     x *= 2 - b * x;               /* here x*a==1 mod 2**8 */
08080     x *= 2 - b * x;               /* here x*a==1 mod 2**16 */
08081     x *= 2 - b * x;               /* here x*a==1 mod 2**32 */
08082     x *= 2 - b * x;               /* here x*a==1 mod 2**64 */
08083 
08084     /* rho = -1/m mod b */
08085     *rho = -x;
08086 }
08087 
08088 #if !defined(SP_RSA_PRIVATE_EXP_D) && defined(WOLFSSL_HAVE_SP_RSA)
08089 /* r = 2^n mod m where n is the number of bits to reduce by.
08090  * Given m must be 3072 bits, just need to subtract.
08091  *
08092  * r  A single precision number.
08093  * m  A signle precision number.
08094  */
08095 static void sp_3072_mont_norm_24(sp_digit* r, sp_digit* m)
08096 {
08097     XMEMSET(r, 0, sizeof(sp_digit) * 24);
08098 
08099     /* r = 2^n mod m */
08100     sp_3072_sub_in_place_24(r, m);
08101 }
08102 
08103 /* Conditionally subtract b from a using the mask m.
08104  * m is -1 to subtract and 0 when not copying.
08105  *
08106  * r  A single precision number representing condition subtract result.
08107  * a  A single precision number to subtract from.
08108  * b  A single precision number to subtract.
08109  * m  Mask value to apply.
08110  */
08111 static sp_digit sp_3072_cond_sub_24(sp_digit* r, sp_digit* a, sp_digit* b,
08112         sp_digit m)
08113 {
08114     sp_digit c = 0;
08115 
08116 #ifdef WOLFSSL_SP_SMALL
08117     __asm__ __volatile__ (
08118         "mov    x8, #0\n\t"
08119         "1:\n\t"
08120         "subs   %[c], xzr, %[c]\n\t"
08121         "ldr    x4, [%[a], x8]\n\t"
08122         "ldr    x5, [%[b], x8]\n\t"
08123         "and    x5, x5, %[m]\n\t"
08124         "sbcs   x4, x4, x5\n\t"
08125         "csetm  %[c], cc\n\t"
08126         "str    x4, [%[r], x8]\n\t"
08127         "add    x8, x8, #8\n\t"
08128         "cmp    x8, 192\n\t"
08129         "b.lt   1b\n\t"
08130         : [c] "+r" (c)
08131         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
08132         : "memory", "x4", "x6", "x5", "x7", "x8"
08133     );
08134 #else
08135     __asm__ __volatile__ (
08136 
08137         "ldr        x4, [%[a], 0]\n\t"
08138         "ldr        x6, [%[a], 8]\n\t"
08139         "ldr        x5, [%[b], 0]\n\t"
08140         "ldr        x7, [%[b], 8]\n\t"
08141         "and        x5, x5, %[m]\n\t"
08142         "and        x7, x7, %[m]\n\t"
08143         "subs   x4, x4, x5\n\t"
08144         "sbcs   x6, x6, x7\n\t"
08145         "str        x4, [%[r], 0]\n\t"
08146         "str        x6, [%[r], 8]\n\t"
08147         "ldr        x4, [%[a], 16]\n\t"
08148         "ldr        x6, [%[a], 24]\n\t"
08149         "ldr        x5, [%[b], 16]\n\t"
08150         "ldr        x7, [%[b], 24]\n\t"
08151         "and        x5, x5, %[m]\n\t"
08152         "and        x7, x7, %[m]\n\t"
08153         "sbcs   x4, x4, x5\n\t"
08154         "sbcs   x6, x6, x7\n\t"
08155         "str        x4, [%[r], 16]\n\t"
08156         "str        x6, [%[r], 24]\n\t"
08157         "ldr        x4, [%[a], 32]\n\t"
08158         "ldr        x6, [%[a], 40]\n\t"
08159         "ldr        x5, [%[b], 32]\n\t"
08160         "ldr        x7, [%[b], 40]\n\t"
08161         "and        x5, x5, %[m]\n\t"
08162         "and        x7, x7, %[m]\n\t"
08163         "sbcs   x4, x4, x5\n\t"
08164         "sbcs   x6, x6, x7\n\t"
08165         "str        x4, [%[r], 32]\n\t"
08166         "str        x6, [%[r], 40]\n\t"
08167         "ldr        x4, [%[a], 48]\n\t"
08168         "ldr        x6, [%[a], 56]\n\t"
08169         "ldr        x5, [%[b], 48]\n\t"
08170         "ldr        x7, [%[b], 56]\n\t"
08171         "and        x5, x5, %[m]\n\t"
08172         "and        x7, x7, %[m]\n\t"
08173         "sbcs   x4, x4, x5\n\t"
08174         "sbcs   x6, x6, x7\n\t"
08175         "str        x4, [%[r], 48]\n\t"
08176         "str        x6, [%[r], 56]\n\t"
08177         "ldr        x4, [%[a], 64]\n\t"
08178         "ldr        x6, [%[a], 72]\n\t"
08179         "ldr        x5, [%[b], 64]\n\t"
08180         "ldr        x7, [%[b], 72]\n\t"
08181         "and        x5, x5, %[m]\n\t"
08182         "and        x7, x7, %[m]\n\t"
08183         "sbcs   x4, x4, x5\n\t"
08184         "sbcs   x6, x6, x7\n\t"
08185         "str        x4, [%[r], 64]\n\t"
08186         "str        x6, [%[r], 72]\n\t"
08187         "ldr        x4, [%[a], 80]\n\t"
08188         "ldr        x6, [%[a], 88]\n\t"
08189         "ldr        x5, [%[b], 80]\n\t"
08190         "ldr        x7, [%[b], 88]\n\t"
08191         "and        x5, x5, %[m]\n\t"
08192         "and        x7, x7, %[m]\n\t"
08193         "sbcs   x4, x4, x5\n\t"
08194         "sbcs   x6, x6, x7\n\t"
08195         "str        x4, [%[r], 80]\n\t"
08196         "str        x6, [%[r], 88]\n\t"
08197         "ldr        x4, [%[a], 96]\n\t"
08198         "ldr        x6, [%[a], 104]\n\t"
08199         "ldr        x5, [%[b], 96]\n\t"
08200         "ldr        x7, [%[b], 104]\n\t"
08201         "and        x5, x5, %[m]\n\t"
08202         "and        x7, x7, %[m]\n\t"
08203         "sbcs   x4, x4, x5\n\t"
08204         "sbcs   x6, x6, x7\n\t"
08205         "str        x4, [%[r], 96]\n\t"
08206         "str        x6, [%[r], 104]\n\t"
08207         "ldr        x4, [%[a], 112]\n\t"
08208         "ldr        x6, [%[a], 120]\n\t"
08209         "ldr        x5, [%[b], 112]\n\t"
08210         "ldr        x7, [%[b], 120]\n\t"
08211         "and        x5, x5, %[m]\n\t"
08212         "and        x7, x7, %[m]\n\t"
08213         "sbcs   x4, x4, x5\n\t"
08214         "sbcs   x6, x6, x7\n\t"
08215         "str        x4, [%[r], 112]\n\t"
08216         "str        x6, [%[r], 120]\n\t"
08217         "ldr        x4, [%[a], 128]\n\t"
08218         "ldr        x6, [%[a], 136]\n\t"
08219         "ldr        x5, [%[b], 128]\n\t"
08220         "ldr        x7, [%[b], 136]\n\t"
08221         "and        x5, x5, %[m]\n\t"
08222         "and        x7, x7, %[m]\n\t"
08223         "sbcs   x4, x4, x5\n\t"
08224         "sbcs   x6, x6, x7\n\t"
08225         "str        x4, [%[r], 128]\n\t"
08226         "str        x6, [%[r], 136]\n\t"
08227         "ldr        x4, [%[a], 144]\n\t"
08228         "ldr        x6, [%[a], 152]\n\t"
08229         "ldr        x5, [%[b], 144]\n\t"
08230         "ldr        x7, [%[b], 152]\n\t"
08231         "and        x5, x5, %[m]\n\t"
08232         "and        x7, x7, %[m]\n\t"
08233         "sbcs   x4, x4, x5\n\t"
08234         "sbcs   x6, x6, x7\n\t"
08235         "str        x4, [%[r], 144]\n\t"
08236         "str        x6, [%[r], 152]\n\t"
08237         "ldr        x4, [%[a], 160]\n\t"
08238         "ldr        x6, [%[a], 168]\n\t"
08239         "ldr        x5, [%[b], 160]\n\t"
08240         "ldr        x7, [%[b], 168]\n\t"
08241         "and        x5, x5, %[m]\n\t"
08242         "and        x7, x7, %[m]\n\t"
08243         "sbcs   x4, x4, x5\n\t"
08244         "sbcs   x6, x6, x7\n\t"
08245         "str        x4, [%[r], 160]\n\t"
08246         "str        x6, [%[r], 168]\n\t"
08247         "ldr        x4, [%[a], 176]\n\t"
08248         "ldr        x6, [%[a], 184]\n\t"
08249         "ldr        x5, [%[b], 176]\n\t"
08250         "ldr        x7, [%[b], 184]\n\t"
08251         "and        x5, x5, %[m]\n\t"
08252         "and        x7, x7, %[m]\n\t"
08253         "sbcs   x4, x4, x5\n\t"
08254         "sbcs   x6, x6, x7\n\t"
08255         "str        x4, [%[r], 176]\n\t"
08256         "str        x6, [%[r], 184]\n\t"
08257         "csetm  %[c], cc\n\t"
08258         : [c] "+r" (c)
08259         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
08260         : "memory", "x4", "x6", "x5", "x7", "x8"
08261     );
08262 #endif /* WOLFSSL_SP_SMALL */
08263 
08264     return c;
08265 }
08266 
08267 /* Reduce the number back to 3072 bits using Montgomery reduction.
08268  *
08269  * a   A single precision number to reduce in place.
08270  * m   The single precision number representing the modulus.
08271  * mp  The digit representing the negative inverse of m mod 2^n.
08272  */
08273 SP_NOINLINE static void sp_3072_mont_reduce_24(sp_digit* a, sp_digit* m,
08274         sp_digit mp)
08275 {
08276     sp_digit ca = 0;
08277 
08278     __asm__ __volatile__ (
08279         "ldp       x12, x13, [%[m], 0]\n\t"
08280         "ldp       x14, x15, [%[m], 16]\n\t"
08281         "ldp       x16, x17, [%[m], 32]\n\t"
08282         "ldp       x18, x19, [%[m], 48]\n\t"
08283         "ldp       x20, x21, [%[m], 64]\n\t"
08284         "ldp       x22, x23, [%[m], 80]\n\t"
08285         "ldp       x24, x25, [%[m], 96]\n\t"
08286         "ldp       x26, x27, [%[m], 112]\n\t"
08287         "# i = 0\n\t"
08288         "mov    x3, 0\n\t"
08289         "ldp    x10, x11, [%[a], 0]\n\t"
08290         "\n1:\n\t"
08291         "# mu = a[i] * mp\n\t"
08292         "mul    x8, %[mp], x10\n\t"
08293         "# a[i+0] += m[0] * mu\n\t"
08294         "ldr    x9, [%[a], 0]\n\t"
08295         "mul        x6, x12, x8\n\t"
08296         "umulh  x7, x12, x8\n\t"
08297         "adds   x10, x10, x6\n\t"
08298         "adc    x5, x7, xzr\n\t"
08299         "# a[i+1] += m[1] * mu\n\t"
08300         "ldr    x9, [%[a], 8]\n\t"
08301         "mul        x6, x13, x8\n\t"
08302         "umulh  x7, x13, x8\n\t"
08303         "adds   x10, x11, x6\n\t"
08304         "adc    x4, x7, xzr\n\t"
08305         "adds   x10, x10, x5\n\t"
08306         "adc    x4, x4, xzr\n\t"
08307         "# a[i+2] += m[2] * mu\n\t"
08308         "ldr    x11, [%[a], 16]\n\t"
08309         "mul        x6, x14, x8\n\t"
08310         "umulh  x7, x14, x8\n\t"
08311         "adds   x11, x11, x6\n\t"
08312         "adc    x5, x7, xzr\n\t"
08313         "adds   x11, x11, x4\n\t"
08314         "adc    x5, x5, xzr\n\t"
08315         "# a[i+3] += m[3] * mu\n\t"
08316         "ldr    x9, [%[a], 24]\n\t"
08317         "mul        x6, x15, x8\n\t"
08318         "umulh  x7, x15, x8\n\t"
08319         "adds   x9, x9, x6\n\t"
08320         "adc    x4, x7, xzr\n\t"
08321         "adds   x9, x9, x5\n\t"
08322         "str    x9, [%[a], 24]\n\t"
08323         "adc    x4, x4, xzr\n\t"
08324         "# a[i+4] += m[4] * mu\n\t"
08325         "ldr    x9, [%[a], 32]\n\t"
08326         "mul        x6, x16, x8\n\t"
08327         "umulh  x7, x16, x8\n\t"
08328         "adds   x9, x9, x6\n\t"
08329         "adc    x5, x7, xzr\n\t"
08330         "adds   x9, x9, x4\n\t"
08331         "str    x9, [%[a], 32]\n\t"
08332         "adc    x5, x5, xzr\n\t"
08333         "# a[i+5] += m[5] * mu\n\t"
08334         "ldr    x9, [%[a], 40]\n\t"
08335         "mul        x6, x17, x8\n\t"
08336         "umulh  x7, x17, x8\n\t"
08337         "adds   x9, x9, x6\n\t"
08338         "adc    x4, x7, xzr\n\t"
08339         "adds   x9, x9, x5\n\t"
08340         "str    x9, [%[a], 40]\n\t"
08341         "adc    x4, x4, xzr\n\t"
08342         "# a[i+6] += m[6] * mu\n\t"
08343         "ldr    x9, [%[a], 48]\n\t"
08344         "mul        x6, x18, x8\n\t"
08345         "umulh  x7, x18, x8\n\t"
08346         "adds   x9, x9, x6\n\t"
08347         "adc    x5, x7, xzr\n\t"
08348         "adds   x9, x9, x4\n\t"
08349         "str    x9, [%[a], 48]\n\t"
08350         "adc    x5, x5, xzr\n\t"
08351         "# a[i+7] += m[7] * mu\n\t"
08352         "ldr    x9, [%[a], 56]\n\t"
08353         "mul        x6, x19, x8\n\t"
08354         "umulh  x7, x19, x8\n\t"
08355         "adds   x9, x9, x6\n\t"
08356         "adc    x4, x7, xzr\n\t"
08357         "adds   x9, x9, x5\n\t"
08358         "str    x9, [%[a], 56]\n\t"
08359         "adc    x4, x4, xzr\n\t"
08360         "# a[i+8] += m[8] * mu\n\t"
08361         "ldr    x9, [%[a], 64]\n\t"
08362         "mul        x6, x20, x8\n\t"
08363         "umulh  x7, x20, x8\n\t"
08364         "adds   x9, x9, x6\n\t"
08365         "adc    x5, x7, xzr\n\t"
08366         "adds   x9, x9, x4\n\t"
08367         "str    x9, [%[a], 64]\n\t"
08368         "adc    x5, x5, xzr\n\t"
08369         "# a[i+9] += m[9] * mu\n\t"
08370         "ldr    x9, [%[a], 72]\n\t"
08371         "mul        x6, x21, x8\n\t"
08372         "umulh  x7, x21, x8\n\t"
08373         "adds   x9, x9, x6\n\t"
08374         "adc    x4, x7, xzr\n\t"
08375         "adds   x9, x9, x5\n\t"
08376         "str    x9, [%[a], 72]\n\t"
08377         "adc    x4, x4, xzr\n\t"
08378         "# a[i+10] += m[10] * mu\n\t"
08379         "ldr    x9, [%[a], 80]\n\t"
08380         "mul        x6, x22, x8\n\t"
08381         "umulh  x7, x22, x8\n\t"
08382         "adds   x9, x9, x6\n\t"
08383         "adc    x5, x7, xzr\n\t"
08384         "adds   x9, x9, x4\n\t"
08385         "str    x9, [%[a], 80]\n\t"
08386         "adc    x5, x5, xzr\n\t"
08387         "# a[i+11] += m[11] * mu\n\t"
08388         "ldr    x9, [%[a], 88]\n\t"
08389         "mul        x6, x23, x8\n\t"
08390         "umulh  x7, x23, x8\n\t"
08391         "adds   x9, x9, x6\n\t"
08392         "adc    x4, x7, xzr\n\t"
08393         "adds   x9, x9, x5\n\t"
08394         "str    x9, [%[a], 88]\n\t"
08395         "adc    x4, x4, xzr\n\t"
08396         "# a[i+12] += m[12] * mu\n\t"
08397         "ldr    x9, [%[a], 96]\n\t"
08398         "mul        x6, x24, x8\n\t"
08399         "umulh  x7, x24, x8\n\t"
08400         "adds   x9, x9, x6\n\t"
08401         "adc    x5, x7, xzr\n\t"
08402         "adds   x9, x9, x4\n\t"
08403         "str    x9, [%[a], 96]\n\t"
08404         "adc    x5, x5, xzr\n\t"
08405         "# a[i+13] += m[13] * mu\n\t"
08406         "ldr    x9, [%[a], 104]\n\t"
08407         "mul        x6, x25, x8\n\t"
08408         "umulh  x7, x25, x8\n\t"
08409         "adds   x9, x9, x6\n\t"
08410         "adc    x4, x7, xzr\n\t"
08411         "adds   x9, x9, x5\n\t"
08412         "str    x9, [%[a], 104]\n\t"
08413         "adc    x4, x4, xzr\n\t"
08414         "# a[i+14] += m[14] * mu\n\t"
08415         "ldr    x9, [%[a], 112]\n\t"
08416         "mul        x6, x26, x8\n\t"
08417         "umulh  x7, x26, x8\n\t"
08418         "adds   x9, x9, x6\n\t"
08419         "adc    x5, x7, xzr\n\t"
08420         "adds   x9, x9, x4\n\t"
08421         "str    x9, [%[a], 112]\n\t"
08422         "adc    x5, x5, xzr\n\t"
08423         "# a[i+15] += m[15] * mu\n\t"
08424         "ldr    x9, [%[a], 120]\n\t"
08425         "mul        x6, x27, x8\n\t"
08426         "umulh  x7, x27, x8\n\t"
08427         "adds   x9, x9, x6\n\t"
08428         "adc    x4, x7, xzr\n\t"
08429         "adds   x9, x9, x5\n\t"
08430         "str    x9, [%[a], 120]\n\t"
08431         "adc    x4, x4, xzr\n\t"
08432         "# a[i+16] += m[16] * mu\n\t"
08433         "ldr        x7, [%[m], 128]\n\t"
08434         "ldr    x9, [%[a], 128]\n\t"
08435         "mul        x6, x7, x8\n\t"
08436         "umulh  x7, x7, x8\n\t"
08437         "adds   x9, x9, x6\n\t"
08438         "adc    x5, x7, xzr\n\t"
08439         "adds   x9, x9, x4\n\t"
08440         "str    x9, [%[a], 128]\n\t"
08441         "adc    x5, x5, xzr\n\t"
08442         "# a[i+17] += m[17] * mu\n\t"
08443         "ldr        x7, [%[m], 136]\n\t"
08444         "ldr    x9, [%[a], 136]\n\t"
08445         "mul        x6, x7, x8\n\t"
08446         "umulh  x7, x7, x8\n\t"
08447         "adds   x9, x9, x6\n\t"
08448         "adc    x4, x7, xzr\n\t"
08449         "adds   x9, x9, x5\n\t"
08450         "str    x9, [%[a], 136]\n\t"
08451         "adc    x4, x4, xzr\n\t"
08452         "# a[i+18] += m[18] * mu\n\t"
08453         "ldr        x7, [%[m], 144]\n\t"
08454         "ldr    x9, [%[a], 144]\n\t"
08455         "mul        x6, x7, x8\n\t"
08456         "umulh  x7, x7, x8\n\t"
08457         "adds   x9, x9, x6\n\t"
08458         "adc    x5, x7, xzr\n\t"
08459         "adds   x9, x9, x4\n\t"
08460         "str    x9, [%[a], 144]\n\t"
08461         "adc    x5, x5, xzr\n\t"
08462         "# a[i+19] += m[19] * mu\n\t"
08463         "ldr        x7, [%[m], 152]\n\t"
08464         "ldr    x9, [%[a], 152]\n\t"
08465         "mul        x6, x7, x8\n\t"
08466         "umulh  x7, x7, x8\n\t"
08467         "adds   x9, x9, x6\n\t"
08468         "adc    x4, x7, xzr\n\t"
08469         "adds   x9, x9, x5\n\t"
08470         "str    x9, [%[a], 152]\n\t"
08471         "adc    x4, x4, xzr\n\t"
08472         "# a[i+20] += m[20] * mu\n\t"
08473         "ldr        x7, [%[m], 160]\n\t"
08474         "ldr    x9, [%[a], 160]\n\t"
08475         "mul        x6, x7, x8\n\t"
08476         "umulh  x7, x7, x8\n\t"
08477         "adds   x9, x9, x6\n\t"
08478         "adc    x5, x7, xzr\n\t"
08479         "adds   x9, x9, x4\n\t"
08480         "str    x9, [%[a], 160]\n\t"
08481         "adc    x5, x5, xzr\n\t"
08482         "# a[i+21] += m[21] * mu\n\t"
08483         "ldr        x7, [%[m], 168]\n\t"
08484         "ldr    x9, [%[a], 168]\n\t"
08485         "mul        x6, x7, x8\n\t"
08486         "umulh  x7, x7, x8\n\t"
08487         "adds   x9, x9, x6\n\t"
08488         "adc    x4, x7, xzr\n\t"
08489         "adds   x9, x9, x5\n\t"
08490         "str    x9, [%[a], 168]\n\t"
08491         "adc    x4, x4, xzr\n\t"
08492         "# a[i+22] += m[22] * mu\n\t"
08493         "ldr        x7, [%[m], 176]\n\t"
08494         "ldr    x9, [%[a], 176]\n\t"
08495         "mul        x6, x7, x8\n\t"
08496         "umulh  x7, x7, x8\n\t"
08497         "adds   x9, x9, x6\n\t"
08498         "adc    x5, x7, xzr\n\t"
08499         "adds   x9, x9, x4\n\t"
08500         "str    x9, [%[a], 176]\n\t"
08501         "adc    x5, x5, xzr\n\t"
08502         "# a[i+23] += m[23] * mu\n\t"
08503         "ldr    x7, [%[m], 184]\n\t"
08504         "ldr    x9, [%[a], 184]\n\t"
08505         "mul    x6, x7, x8\n\t"
08506         "umulh  x7, x7, x8\n\t"
08507         "adds   x5, x5, x6\n\t"
08508         "adcs   x7, x7, %[ca]\n\t"
08509         "cset  %[ca], cs\n\t"
08510         "adds   x9, x9, x5\n\t"
08511         "str    x9, [%[a], 184]\n\t"
08512         "ldr    x9, [%[a], 192]\n\t"
08513         "adcs   x9, x9, x7\n\t"
08514         "str    x9, [%[a], 192]\n\t"
08515         "adc    %[ca], %[ca], xzr\n\t"
08516         "# i += 1\n\t"
08517         "add    %[a], %[a], 8\n\t"
08518         "add    x3, x3, 8\n\t"
08519         "cmp    x3, 192\n\t"
08520         "blt    1b\n\t"
08521         "str    x10, [%[a], 0]\n\t"
08522         "str    x11, [%[a], 8]\n\t"
08523         : [ca] "+r" (ca), [a] "+r" (a)
08524         : [m] "r" (m), [mp] "r" (mp)
08525         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27"
08526     );
08527 
08528     sp_3072_cond_sub_24(a - 24, a, m, (sp_digit)0 - ca);
08529 }
08530 
08531 /* Multiply two Montogmery form numbers mod the modulus (prime).
08532  * (r = a * b mod m)
08533  *
08534  * r   Result of multiplication.
08535  * a   First number to multiply in Montogmery form.
08536  * b   Second number to multiply in Montogmery form.
08537  * m   Modulus (prime).
08538  * mp  Montogmery mulitplier.
08539  */
08540 static void sp_3072_mont_mul_24(sp_digit* r, sp_digit* a, sp_digit* b,
08541         sp_digit* m, sp_digit mp)
08542 {
08543     sp_3072_mul_24(r, a, b);
08544     sp_3072_mont_reduce_24(r, m, mp);
08545 }
08546 
08547 /* Square the Montgomery form number. (r = a * a mod m)
08548  *
08549  * r   Result of squaring.
08550  * a   Number to square in Montogmery form.
08551  * m   Modulus (prime).
08552  * mp  Montogmery mulitplier.
08553  */
08554 static void sp_3072_mont_sqr_24(sp_digit* r, sp_digit* a, sp_digit* m,
08555         sp_digit mp)
08556 {
08557     sp_3072_sqr_24(r, a);
08558     sp_3072_mont_reduce_24(r, m, mp);
08559 }
08560 
08561 /* Mul a by digit b into r. (r = a * b)
08562  *
08563  * r  A single precision integer.
08564  * a  A single precision integer.
08565  * b  A single precision digit.
08566  */
08567 static void sp_3072_mul_d_24(sp_digit* r, const sp_digit* a,
08568         const sp_digit b)
08569 {
08570 #ifdef WOLFSSL_SP_SMALL
08571     __asm__ __volatile__ (
08572         "# A[0] * B\n\t"
08573         "ldr    x8, [%[a]]\n\t"
08574         "mul    x5, %[b], x8\n\t"
08575         "umulh  x3, %[b], x8\n\t"
08576         "mov    x4, 0\n\t"
08577         "str    x5, [%[r]]\n\t"
08578         "mov    x5, 0\n\t"
08579         "mov    x9, #8\n\t"
08580         "1:\n\t"
08581         "ldr    x8, [%[a], x9]\n\t"
08582         "mul    x6, %[b], x8\n\t"
08583         "umulh  x7, %[b], x8\n\t"
08584         "adds   x3, x3, x6\n\t"
08585         "adcs   x4, x4, x7\n\t"
08586         "adc    x5, xzr, xzr\n\t"
08587         "str    x3, [%[r], x9]\n\t"
08588         "mov    x3, x4\n\t"
08589         "mov    x4, x5\n\t"
08590         "mov    x5, #0\n\t"
08591         "add    x9, x9, #8\n\t"
08592         "cmp    x9, 192\n\t"
08593         "b.lt   1b\n\t"
08594         "str    x3, [%[r], 192]\n\t"
08595         :
08596         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
08597         : "memory", "x3", "x4", "x5", "x6", "x7", "x8"
08598     );
08599 #else
08600     __asm__ __volatile__ (
08601         "# A[0] * B\n\t"
08602         "ldr    x8, [%[a]]\n\t"
08603         "mul    x3, %[b], x8\n\t"
08604         "umulh  x4, %[b], x8\n\t"
08605         "mov    x5, 0\n\t"
08606         "str    x3, [%[r]]\n\t"
08607         "# A[1] * B\n\t"
08608         "ldr        x8, [%[a], 8]\n\t"
08609         "mov        x3, 0\n\t"
08610         "mul        x6, %[b], x8\n\t"
08611         "umulh  x7, %[b], x8\n\t"
08612         "adds   x4, x4, x6\n\t"
08613         "adcs   x5, x5, x7\n\t"
08614         "adc        x3, xzr, xzr\n\t"
08615         "str        x4, [%[r], 8]\n\t"
08616         "# A[2] * B\n\t"
08617         "ldr        x8, [%[a], 16]\n\t"
08618         "mov        x4, 0\n\t"
08619         "mul        x6, %[b], x8\n\t"
08620         "umulh  x7, %[b], x8\n\t"
08621         "adds   x5, x5, x6\n\t"
08622         "adcs   x3, x3, x7\n\t"
08623         "adc        x4, xzr, xzr\n\t"
08624         "str        x5, [%[r], 16]\n\t"
08625         "# A[3] * B\n\t"
08626         "ldr        x8, [%[a], 24]\n\t"
08627         "mov        x5, 0\n\t"
08628         "mul        x6, %[b], x8\n\t"
08629         "umulh  x7, %[b], x8\n\t"
08630         "adds   x3, x3, x6\n\t"
08631         "adcs   x4, x4, x7\n\t"
08632         "adc        x5, xzr, xzr\n\t"
08633         "str        x3, [%[r], 24]\n\t"
08634         "# A[4] * B\n\t"
08635         "ldr        x8, [%[a], 32]\n\t"
08636         "mov        x3, 0\n\t"
08637         "mul        x6, %[b], x8\n\t"
08638         "umulh  x7, %[b], x8\n\t"
08639         "adds   x4, x4, x6\n\t"
08640         "adcs   x5, x5, x7\n\t"
08641         "adc        x3, xzr, xzr\n\t"
08642         "str        x4, [%[r], 32]\n\t"
08643         "# A[5] * B\n\t"
08644         "ldr        x8, [%[a], 40]\n\t"
08645         "mov        x4, 0\n\t"
08646         "mul        x6, %[b], x8\n\t"
08647         "umulh  x7, %[b], x8\n\t"
08648         "adds   x5, x5, x6\n\t"
08649         "adcs   x3, x3, x7\n\t"
08650         "adc        x4, xzr, xzr\n\t"
08651         "str        x5, [%[r], 40]\n\t"
08652         "# A[6] * B\n\t"
08653         "ldr        x8, [%[a], 48]\n\t"
08654         "mov        x5, 0\n\t"
08655         "mul        x6, %[b], x8\n\t"
08656         "umulh  x7, %[b], x8\n\t"
08657         "adds   x3, x3, x6\n\t"
08658         "adcs   x4, x4, x7\n\t"
08659         "adc        x5, xzr, xzr\n\t"
08660         "str        x3, [%[r], 48]\n\t"
08661         "# A[7] * B\n\t"
08662         "ldr        x8, [%[a], 56]\n\t"
08663         "mov        x3, 0\n\t"
08664         "mul        x6, %[b], x8\n\t"
08665         "umulh  x7, %[b], x8\n\t"
08666         "adds   x4, x4, x6\n\t"
08667         "adcs   x5, x5, x7\n\t"
08668         "adc        x3, xzr, xzr\n\t"
08669         "str        x4, [%[r], 56]\n\t"
08670         "# A[8] * B\n\t"
08671         "ldr        x8, [%[a], 64]\n\t"
08672         "mov        x4, 0\n\t"
08673         "mul        x6, %[b], x8\n\t"
08674         "umulh  x7, %[b], x8\n\t"
08675         "adds   x5, x5, x6\n\t"
08676         "adcs   x3, x3, x7\n\t"
08677         "adc        x4, xzr, xzr\n\t"
08678         "str        x5, [%[r], 64]\n\t"
08679         "# A[9] * B\n\t"
08680         "ldr        x8, [%[a], 72]\n\t"
08681         "mov        x5, 0\n\t"
08682         "mul        x6, %[b], x8\n\t"
08683         "umulh  x7, %[b], x8\n\t"
08684         "adds   x3, x3, x6\n\t"
08685         "adcs   x4, x4, x7\n\t"
08686         "adc        x5, xzr, xzr\n\t"
08687         "str        x3, [%[r], 72]\n\t"
08688         "# A[10] * B\n\t"
08689         "ldr        x8, [%[a], 80]\n\t"
08690         "mov        x3, 0\n\t"
08691         "mul        x6, %[b], x8\n\t"
08692         "umulh  x7, %[b], x8\n\t"
08693         "adds   x4, x4, x6\n\t"
08694         "adcs   x5, x5, x7\n\t"
08695         "adc        x3, xzr, xzr\n\t"
08696         "str        x4, [%[r], 80]\n\t"
08697         "# A[11] * B\n\t"
08698         "ldr        x8, [%[a], 88]\n\t"
08699         "mov        x4, 0\n\t"
08700         "mul        x6, %[b], x8\n\t"
08701         "umulh  x7, %[b], x8\n\t"
08702         "adds   x5, x5, x6\n\t"
08703         "adcs   x3, x3, x7\n\t"
08704         "adc        x4, xzr, xzr\n\t"
08705         "str        x5, [%[r], 88]\n\t"
08706         "# A[12] * B\n\t"
08707         "ldr        x8, [%[a], 96]\n\t"
08708         "mov        x5, 0\n\t"
08709         "mul        x6, %[b], x8\n\t"
08710         "umulh  x7, %[b], x8\n\t"
08711         "adds   x3, x3, x6\n\t"
08712         "adcs   x4, x4, x7\n\t"
08713         "adc        x5, xzr, xzr\n\t"
08714         "str        x3, [%[r], 96]\n\t"
08715         "# A[13] * B\n\t"
08716         "ldr        x8, [%[a], 104]\n\t"
08717         "mov        x3, 0\n\t"
08718         "mul        x6, %[b], x8\n\t"
08719         "umulh  x7, %[b], x8\n\t"
08720         "adds   x4, x4, x6\n\t"
08721         "adcs   x5, x5, x7\n\t"
08722         "adc        x3, xzr, xzr\n\t"
08723         "str        x4, [%[r], 104]\n\t"
08724         "# A[14] * B\n\t"
08725         "ldr        x8, [%[a], 112]\n\t"
08726         "mov        x4, 0\n\t"
08727         "mul        x6, %[b], x8\n\t"
08728         "umulh  x7, %[b], x8\n\t"
08729         "adds   x5, x5, x6\n\t"
08730         "adcs   x3, x3, x7\n\t"
08731         "adc        x4, xzr, xzr\n\t"
08732         "str        x5, [%[r], 112]\n\t"
08733         "# A[15] * B\n\t"
08734         "ldr        x8, [%[a], 120]\n\t"
08735         "mov        x5, 0\n\t"
08736         "mul        x6, %[b], x8\n\t"
08737         "umulh  x7, %[b], x8\n\t"
08738         "adds   x3, x3, x6\n\t"
08739         "adcs   x4, x4, x7\n\t"
08740         "adc        x5, xzr, xzr\n\t"
08741         "str        x3, [%[r], 120]\n\t"
08742         "# A[16] * B\n\t"
08743         "ldr        x8, [%[a], 128]\n\t"
08744         "mov        x3, 0\n\t"
08745         "mul        x6, %[b], x8\n\t"
08746         "umulh  x7, %[b], x8\n\t"
08747         "adds   x4, x4, x6\n\t"
08748         "adcs   x5, x5, x7\n\t"
08749         "adc        x3, xzr, xzr\n\t"
08750         "str        x4, [%[r], 128]\n\t"
08751         "# A[17] * B\n\t"
08752         "ldr        x8, [%[a], 136]\n\t"
08753         "mov        x4, 0\n\t"
08754         "mul        x6, %[b], x8\n\t"
08755         "umulh  x7, %[b], x8\n\t"
08756         "adds   x5, x5, x6\n\t"
08757         "adcs   x3, x3, x7\n\t"
08758         "adc        x4, xzr, xzr\n\t"
08759         "str        x5, [%[r], 136]\n\t"
08760         "# A[18] * B\n\t"
08761         "ldr        x8, [%[a], 144]\n\t"
08762         "mov        x5, 0\n\t"
08763         "mul        x6, %[b], x8\n\t"
08764         "umulh  x7, %[b], x8\n\t"
08765         "adds   x3, x3, x6\n\t"
08766         "adcs   x4, x4, x7\n\t"
08767         "adc        x5, xzr, xzr\n\t"
08768         "str        x3, [%[r], 144]\n\t"
08769         "# A[19] * B\n\t"
08770         "ldr        x8, [%[a], 152]\n\t"
08771         "mov        x3, 0\n\t"
08772         "mul        x6, %[b], x8\n\t"
08773         "umulh  x7, %[b], x8\n\t"
08774         "adds   x4, x4, x6\n\t"
08775         "adcs   x5, x5, x7\n\t"
08776         "adc        x3, xzr, xzr\n\t"
08777         "str        x4, [%[r], 152]\n\t"
08778         "# A[20] * B\n\t"
08779         "ldr        x8, [%[a], 160]\n\t"
08780         "mov        x4, 0\n\t"
08781         "mul        x6, %[b], x8\n\t"
08782         "umulh  x7, %[b], x8\n\t"
08783         "adds   x5, x5, x6\n\t"
08784         "adcs   x3, x3, x7\n\t"
08785         "adc        x4, xzr, xzr\n\t"
08786         "str        x5, [%[r], 160]\n\t"
08787         "# A[21] * B\n\t"
08788         "ldr        x8, [%[a], 168]\n\t"
08789         "mov        x5, 0\n\t"
08790         "mul        x6, %[b], x8\n\t"
08791         "umulh  x7, %[b], x8\n\t"
08792         "adds   x3, x3, x6\n\t"
08793         "adcs   x4, x4, x7\n\t"
08794         "adc        x5, xzr, xzr\n\t"
08795         "str        x3, [%[r], 168]\n\t"
08796         "# A[22] * B\n\t"
08797         "ldr        x8, [%[a], 176]\n\t"
08798         "mov        x3, 0\n\t"
08799         "mul        x6, %[b], x8\n\t"
08800         "umulh  x7, %[b], x8\n\t"
08801         "adds   x4, x4, x6\n\t"
08802         "adcs   x5, x5, x7\n\t"
08803         "adc        x3, xzr, xzr\n\t"
08804         "str        x4, [%[r], 176]\n\t"
08805         "# A[23] * B\n\t"
08806         "ldr    x8, [%[a], 184]\n\t"
08807         "mul    x6, %[b], x8\n\t"
08808         "umulh  x7, %[b], x8\n\t"
08809         "adds   x5, x5, x6\n\t"
08810         "adc    x3, x3, x7\n\t"
08811         "str    x5, [%[r], 184]\n\t"
08812         "str    x3, [%[r], 192]\n\t"
08813         :
08814         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
08815         : "memory", "x3", "x4", "x5", "x6", "x7", "x8"
08816     );
08817 #endif
08818 }
08819 
08820 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
08821  *
08822  * d1   The high order half of the number to divide.
08823  * d0   The low order half of the number to divide.
08824  * div  The dividend.
08825  * returns the result of the division.
08826  */
08827 static sp_digit div_3072_word_24(sp_digit d1, sp_digit d0, sp_digit div)
08828 {
08829     sp_digit r;
08830 
08831     __asm__ __volatile__ (
08832         "lsr    x5, %[div], 32\n\t"
08833         "add    x5, x5, 1\n\t"
08834 
08835         "udiv   x3, %[d1], x5\n\t"
08836         "lsl    x6, x3, 32\n\t"
08837         "mul    x4, %[div], x6\n\t"
08838         "umulh  x3, %[div], x6\n\t"
08839         "subs   %[d0], %[d0], x4\n\t"
08840         "sbc    %[d1], %[d1], x3\n\t"
08841 
08842         "udiv   x3, %[d1], x5\n\t"
08843         "lsl    x3, x3, 32\n\t"
08844         "add    x6, x6, x3\n\t"
08845         "mul    x4, %[div], x3\n\t"
08846         "umulh  x3, %[div], x3\n\t"
08847         "subs   %[d0], %[d0], x4\n\t"
08848         "sbc    %[d1], %[d1], x3\n\t"
08849 
08850         "lsl    x3, %[d1], 32\n\t"
08851         "orr    x3, x3, %[d0], lsr 32\n\t"
08852 
08853         "udiv   x3, x3, x5\n\t"
08854         "add    x6, x6, x3\n\t"
08855         "mul    x4, %[div], x3\n\t"
08856         "umulh  x3, %[div], x3\n\t"
08857         "subs   %[d0], %[d0], x4\n\t"
08858         "sbc    %[d1], %[d1], x3\n\t"
08859 
08860         "lsl    x3, %[d1], 32\n\t"
08861         "orr    x3, x3, %[d0], lsr 32\n\t"
08862 
08863         "udiv   x3, x3, x5\n\t"
08864         "add    x6, x6, x3\n\t"
08865         "mul    x4, %[div], x3\n\t"
08866         "umulh  x3, %[div], x3\n\t"
08867         "subs   %[d0], %[d0], x4\n\t"
08868         "sbc    %[d1], %[d1], x3\n\t"
08869 
08870         "udiv   x3, %[d0], %[div]\n\t"
08871         "add    x6, x6, x3\n\t"
08872         "mul    x3, %[div], x3\n\t"
08873         "sub    %[d0], %[d0], x3\n\t"
08874         "mov    %[r], x6\n\t"
08875 
08876         : [r] "=r" (r)
08877         : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div)
08878         : "x3", "x4", "x5", "x6"
08879     );
08880 
08881     return r;
08882 }
08883 
08884 /* Compare a with b in constant time.
08885  *
08886  * a  A single precision integer.
08887  * b  A single precision integer.
08888  * return -ve, 0 or +ve if a is less than, equal to or greater than b
08889  * respectively.
08890  */
08891 static int64_t sp_3072_cmp_24(sp_digit* a, sp_digit* b)
08892 {
08893     sp_digit r = -1;
08894     sp_digit one = 1;
08895 
08896 #ifdef WOLFSSL_SP_SMALL
08897     __asm__ __volatile__ (
08898         "mov    x3, -1\n\t"
08899         "mov    x6, 184\n\t"
08900         "1:\n\t"
08901         "ldr    x4, [%[a], x6]\n\t"
08902         "ldr    x5, [%[b], x6]\n\t"
08903         "and    x4, x4, x3\n\t"
08904         "and    x5, x5, x3\n\t"
08905         "subs   x4, x4, x5\n\t"
08906         "csel   %[r], %[one], %[r], hi\n\t"
08907         "csel   %[r], x3, %[r], lo\n\t"
08908         "csel   x3, x3, xzr, eq\n\t"
08909         "sub    x6, x6, #8\n\t"
08910         "b.cc   1b\n\t"
08911         "eor    %[r], %[r], x3\n\t"
08912         : [r] "+r" (r)
08913         : [a] "r" (a), [b] "r" (b), [one] "r" (one)
08914         : "x2", "x3", "x4", "x5", "x6"
08915     );
08916 #else
08917     __asm__ __volatile__ (
08918         "mov    x3, -1\n\t"
08919         "ldr        x4, [%[a], 184]\n\t"
08920         "ldr        x5, [%[b], 184]\n\t"
08921         "and        x4, x4, x3\n\t"
08922         "and        x5, x5, x3\n\t"
08923         "subs   x4, x4, x5\n\t"
08924         "csel   %[r], %[one], %[r], hi\n\t"
08925         "csel   %[r], x3, %[r], lo\n\t"
08926         "csel   x3, x3, xzr, eq\n\t"
08927         "ldr        x4, [%[a], 176]\n\t"
08928         "ldr        x5, [%[b], 176]\n\t"
08929         "and        x4, x4, x3\n\t"
08930         "and        x5, x5, x3\n\t"
08931         "subs   x4, x4, x5\n\t"
08932         "csel   %[r], %[one], %[r], hi\n\t"
08933         "csel   %[r], x3, %[r], lo\n\t"
08934         "csel   x3, x3, xzr, eq\n\t"
08935         "ldr        x4, [%[a], 168]\n\t"
08936         "ldr        x5, [%[b], 168]\n\t"
08937         "and        x4, x4, x3\n\t"
08938         "and        x5, x5, x3\n\t"
08939         "subs   x4, x4, x5\n\t"
08940         "csel   %[r], %[one], %[r], hi\n\t"
08941         "csel   %[r], x3, %[r], lo\n\t"
08942         "csel   x3, x3, xzr, eq\n\t"
08943         "ldr        x4, [%[a], 160]\n\t"
08944         "ldr        x5, [%[b], 160]\n\t"
08945         "and        x4, x4, x3\n\t"
08946         "and        x5, x5, x3\n\t"
08947         "subs   x4, x4, x5\n\t"
08948         "csel   %[r], %[one], %[r], hi\n\t"
08949         "csel   %[r], x3, %[r], lo\n\t"
08950         "csel   x3, x3, xzr, eq\n\t"
08951         "ldr        x4, [%[a], 152]\n\t"
08952         "ldr        x5, [%[b], 152]\n\t"
08953         "and        x4, x4, x3\n\t"
08954         "and        x5, x5, x3\n\t"
08955         "subs   x4, x4, x5\n\t"
08956         "csel   %[r], %[one], %[r], hi\n\t"
08957         "csel   %[r], x3, %[r], lo\n\t"
08958         "csel   x3, x3, xzr, eq\n\t"
08959         "ldr        x4, [%[a], 144]\n\t"
08960         "ldr        x5, [%[b], 144]\n\t"
08961         "and        x4, x4, x3\n\t"
08962         "and        x5, x5, x3\n\t"
08963         "subs   x4, x4, x5\n\t"
08964         "csel   %[r], %[one], %[r], hi\n\t"
08965         "csel   %[r], x3, %[r], lo\n\t"
08966         "csel   x3, x3, xzr, eq\n\t"
08967         "ldr        x4, [%[a], 136]\n\t"
08968         "ldr        x5, [%[b], 136]\n\t"
08969         "and        x4, x4, x3\n\t"
08970         "and        x5, x5, x3\n\t"
08971         "subs   x4, x4, x5\n\t"
08972         "csel   %[r], %[one], %[r], hi\n\t"
08973         "csel   %[r], x3, %[r], lo\n\t"
08974         "csel   x3, x3, xzr, eq\n\t"
08975         "ldr        x4, [%[a], 128]\n\t"
08976         "ldr        x5, [%[b], 128]\n\t"
08977         "and        x4, x4, x3\n\t"
08978         "and        x5, x5, x3\n\t"
08979         "subs   x4, x4, x5\n\t"
08980         "csel   %[r], %[one], %[r], hi\n\t"
08981         "csel   %[r], x3, %[r], lo\n\t"
08982         "csel   x3, x3, xzr, eq\n\t"
08983         "ldr        x4, [%[a], 120]\n\t"
08984         "ldr        x5, [%[b], 120]\n\t"
08985         "and        x4, x4, x3\n\t"
08986         "and        x5, x5, x3\n\t"
08987         "subs   x4, x4, x5\n\t"
08988         "csel   %[r], %[one], %[r], hi\n\t"
08989         "csel   %[r], x3, %[r], lo\n\t"
08990         "csel   x3, x3, xzr, eq\n\t"
08991         "ldr        x4, [%[a], 112]\n\t"
08992         "ldr        x5, [%[b], 112]\n\t"
08993         "and        x4, x4, x3\n\t"
08994         "and        x5, x5, x3\n\t"
08995         "subs   x4, x4, x5\n\t"
08996         "csel   %[r], %[one], %[r], hi\n\t"
08997         "csel   %[r], x3, %[r], lo\n\t"
08998         "csel   x3, x3, xzr, eq\n\t"
08999         "ldr        x4, [%[a], 104]\n\t"
09000         "ldr        x5, [%[b], 104]\n\t"
09001         "and        x4, x4, x3\n\t"
09002         "and        x5, x5, x3\n\t"
09003         "subs   x4, x4, x5\n\t"
09004         "csel   %[r], %[one], %[r], hi\n\t"
09005         "csel   %[r], x3, %[r], lo\n\t"
09006         "csel   x3, x3, xzr, eq\n\t"
09007         "ldr        x4, [%[a], 96]\n\t"
09008         "ldr        x5, [%[b], 96]\n\t"
09009         "and        x4, x4, x3\n\t"
09010         "and        x5, x5, x3\n\t"
09011         "subs   x4, x4, x5\n\t"
09012         "csel   %[r], %[one], %[r], hi\n\t"
09013         "csel   %[r], x3, %[r], lo\n\t"
09014         "csel   x3, x3, xzr, eq\n\t"
09015         "ldr        x4, [%[a], 88]\n\t"
09016         "ldr        x5, [%[b], 88]\n\t"
09017         "and        x4, x4, x3\n\t"
09018         "and        x5, x5, x3\n\t"
09019         "subs   x4, x4, x5\n\t"
09020         "csel   %[r], %[one], %[r], hi\n\t"
09021         "csel   %[r], x3, %[r], lo\n\t"
09022         "csel   x3, x3, xzr, eq\n\t"
09023         "ldr        x4, [%[a], 80]\n\t"
09024         "ldr        x5, [%[b], 80]\n\t"
09025         "and        x4, x4, x3\n\t"
09026         "and        x5, x5, x3\n\t"
09027         "subs   x4, x4, x5\n\t"
09028         "csel   %[r], %[one], %[r], hi\n\t"
09029         "csel   %[r], x3, %[r], lo\n\t"
09030         "csel   x3, x3, xzr, eq\n\t"
09031         "ldr        x4, [%[a], 72]\n\t"
09032         "ldr        x5, [%[b], 72]\n\t"
09033         "and        x4, x4, x3\n\t"
09034         "and        x5, x5, x3\n\t"
09035         "subs   x4, x4, x5\n\t"
09036         "csel   %[r], %[one], %[r], hi\n\t"
09037         "csel   %[r], x3, %[r], lo\n\t"
09038         "csel   x3, x3, xzr, eq\n\t"
09039         "ldr        x4, [%[a], 64]\n\t"
09040         "ldr        x5, [%[b], 64]\n\t"
09041         "and        x4, x4, x3\n\t"
09042         "and        x5, x5, x3\n\t"
09043         "subs   x4, x4, x5\n\t"
09044         "csel   %[r], %[one], %[r], hi\n\t"
09045         "csel   %[r], x3, %[r], lo\n\t"
09046         "csel   x3, x3, xzr, eq\n\t"
09047         "ldr        x4, [%[a], 56]\n\t"
09048         "ldr        x5, [%[b], 56]\n\t"
09049         "and        x4, x4, x3\n\t"
09050         "and        x5, x5, x3\n\t"
09051         "subs   x4, x4, x5\n\t"
09052         "csel   %[r], %[one], %[r], hi\n\t"
09053         "csel   %[r], x3, %[r], lo\n\t"
09054         "csel   x3, x3, xzr, eq\n\t"
09055         "ldr        x4, [%[a], 48]\n\t"
09056         "ldr        x5, [%[b], 48]\n\t"
09057         "and        x4, x4, x3\n\t"
09058         "and        x5, x5, x3\n\t"
09059         "subs   x4, x4, x5\n\t"
09060         "csel   %[r], %[one], %[r], hi\n\t"
09061         "csel   %[r], x3, %[r], lo\n\t"
09062         "csel   x3, x3, xzr, eq\n\t"
09063         "ldr        x4, [%[a], 40]\n\t"
09064         "ldr        x5, [%[b], 40]\n\t"
09065         "and        x4, x4, x3\n\t"
09066         "and        x5, x5, x3\n\t"
09067         "subs   x4, x4, x5\n\t"
09068         "csel   %[r], %[one], %[r], hi\n\t"
09069         "csel   %[r], x3, %[r], lo\n\t"
09070         "csel   x3, x3, xzr, eq\n\t"
09071         "ldr        x4, [%[a], 32]\n\t"
09072         "ldr        x5, [%[b], 32]\n\t"
09073         "and        x4, x4, x3\n\t"
09074         "and        x5, x5, x3\n\t"
09075         "subs   x4, x4, x5\n\t"
09076         "csel   %[r], %[one], %[r], hi\n\t"
09077         "csel   %[r], x3, %[r], lo\n\t"
09078         "csel   x3, x3, xzr, eq\n\t"
09079         "ldr        x4, [%[a], 24]\n\t"
09080         "ldr        x5, [%[b], 24]\n\t"
09081         "and        x4, x4, x3\n\t"
09082         "and        x5, x5, x3\n\t"
09083         "subs   x4, x4, x5\n\t"
09084         "csel   %[r], %[one], %[r], hi\n\t"
09085         "csel   %[r], x3, %[r], lo\n\t"
09086         "csel   x3, x3, xzr, eq\n\t"
09087         "ldr        x4, [%[a], 16]\n\t"
09088         "ldr        x5, [%[b], 16]\n\t"
09089         "and        x4, x4, x3\n\t"
09090         "and        x5, x5, x3\n\t"
09091         "subs   x4, x4, x5\n\t"
09092         "csel   %[r], %[one], %[r], hi\n\t"
09093         "csel   %[r], x3, %[r], lo\n\t"
09094         "csel   x3, x3, xzr, eq\n\t"
09095         "ldr        x4, [%[a], 8]\n\t"
09096         "ldr        x5, [%[b], 8]\n\t"
09097         "and        x4, x4, x3\n\t"
09098         "and        x5, x5, x3\n\t"
09099         "subs   x4, x4, x5\n\t"
09100         "csel   %[r], %[one], %[r], hi\n\t"
09101         "csel   %[r], x3, %[r], lo\n\t"
09102         "csel   x3, x3, xzr, eq\n\t"
09103         "ldr        x4, [%[a], 0]\n\t"
09104         "ldr        x5, [%[b], 0]\n\t"
09105         "and        x4, x4, x3\n\t"
09106         "and        x5, x5, x3\n\t"
09107         "subs   x4, x4, x5\n\t"
09108         "csel   %[r], %[one], %[r], hi\n\t"
09109         "csel   %[r], x3, %[r], lo\n\t"
09110         "csel   x3, x3, xzr, eq\n\t"
09111         "eor    %[r], %[r], x3\n\t"
09112         : [r] "+r" (r)
09113         : [a] "r" (a), [b] "r" (b), [one] "r" (one)
09114         : "x2", "x3", "x4", "x5", "x6"
09115     );
09116 #endif
09117 
09118     return r;
09119 }
09120 
09121 /* Divide d in a and put remainder into r (m*d + r = a)
09122  * m is not calculated as it is not needed at this time.
09123  *
09124  * a  Nmber to be divided.
09125  * d  Number to divide with.
09126  * m  Multiplier result.
09127  * r  Remainder from the division.
09128  * returns MP_OKAY indicating success.
09129  */
09130 static WC_INLINE int sp_3072_div_24(sp_digit* a, sp_digit* d, sp_digit* m,
09131         sp_digit* r)
09132 {
09133     sp_digit t1[48], t2[25];
09134     sp_digit div, r1;
09135     int i;
09136 
09137     (void)m;
09138 
09139     div = d[23];
09140     XMEMCPY(t1, a, sizeof(*t1) * 2 * 24);
09141     for (i=23; i>=0; i--) {
09142         r1 = div_3072_word_24(t1[24 + i], t1[24 + i - 1], div);
09143 
09144         sp_3072_mul_d_24(t2, d, r1);
09145         t1[24 + i] += sp_3072_sub_in_place_24(&t1[i], t2);
09146         t1[24 + i] -= t2[24];
09147         sp_3072_mask_24(t2, d, t1[24 + i]);
09148         t1[24 + i] += sp_3072_add_24(&t1[i], &t1[i], t2);
09149         sp_3072_mask_24(t2, d, t1[24 + i]);
09150         t1[24 + i] += sp_3072_add_24(&t1[i], &t1[i], t2);
09151     }
09152 
09153     r1 = sp_3072_cmp_24(t1, d) >= 0;
09154     sp_3072_cond_sub_24(r, t1, t2, (sp_digit)0 - r1);
09155 
09156     return MP_OKAY;
09157 }
09158 
09159 /* Reduce a modulo m into r. (r = a mod m)
09160  *
09161  * r  A single precision number that is the reduced result.
09162  * a  A single precision number that is to be reduced.
09163  * m  A single precision number that is the modulus to reduce with.
09164  * returns MP_OKAY indicating success.
09165  */
09166 static WC_INLINE int sp_3072_mod_24(sp_digit* r, sp_digit* a, sp_digit* m)
09167 {
09168     return sp_3072_div_24(a, m, NULL, r);
09169 }
09170 
09171 #ifdef WOLFSSL_SP_SMALL
09172 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
09173  *
09174  * r     A single precision number that is the result of the operation.
09175  * a     A single precision number being exponentiated.
09176  * e     A single precision number that is the exponent.
09177  * bits  The number of bits in the exponent.
09178  * m     A single precision number that is the modulus.
09179  * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
09180  */
09181 static int sp_3072_mod_exp_24(sp_digit* r, sp_digit* a, sp_digit* e,
09182         int bits, sp_digit* m, int reduceA)
09183 {
09184 #ifndef WOLFSSL_SMALL_STACK
09185     sp_digit t[16][48];
09186 #else
09187     sp_digit* t[16];
09188     sp_digit* td;
09189 #endif
09190     sp_digit* norm;
09191     sp_digit mp = 1;
09192     sp_digit n;
09193     sp_digit mask;
09194     int i;
09195     int c, y;
09196     int err = MP_OKAY;
09197 
09198 #ifdef WOLFSSL_SMALL_STACK
09199     td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 48, NULL,
09200                             DYNAMIC_TYPE_TMP_BUFFER);
09201     if (td == NULL)
09202         err = MEMORY_E;
09203 
09204     if (err == MP_OKAY) {
09205         for (i=0; i<16; i++)
09206             t[i] = td + i * 48;
09207         norm = t[0];
09208     }
09209 #else
09210     norm = t[0];
09211 #endif
09212 
09213     if (err == MP_OKAY) {
09214         sp_3072_mont_setup(m, &mp);
09215         sp_3072_mont_norm_24(norm, m);
09216 
09217         XMEMSET(t[1], 0, sizeof(sp_digit) * 24);
09218         if (reduceA) {
09219             err = sp_3072_mod_24(t[1] + 24, a, m);
09220             if (err == MP_OKAY)
09221                 err = sp_3072_mod_24(t[1], t[1], m);
09222         }
09223         else {
09224             XMEMCPY(t[1] + 24, a, sizeof(sp_digit) * 24);
09225             err = sp_3072_mod_24(t[1], t[1], m);
09226         }
09227     }
09228 
09229     if (err == MP_OKAY) {
09230         sp_3072_mont_sqr_24(t[ 2], t[ 1], m, mp);
09231         sp_3072_mont_mul_24(t[ 3], t[ 2], t[ 1], m, mp);
09232         sp_3072_mont_sqr_24(t[ 4], t[ 2], m, mp);
09233         sp_3072_mont_mul_24(t[ 5], t[ 3], t[ 2], m, mp);
09234         sp_3072_mont_sqr_24(t[ 6], t[ 3], m, mp);
09235         sp_3072_mont_mul_24(t[ 7], t[ 4], t[ 3], m, mp);
09236         sp_3072_mont_sqr_24(t[ 8], t[ 4], m, mp);
09237         sp_3072_mont_mul_24(t[ 9], t[ 5], t[ 4], m, mp);
09238         sp_3072_mont_sqr_24(t[10], t[ 5], m, mp);
09239         sp_3072_mont_mul_24(t[11], t[ 6], t[ 5], m, mp);
09240         sp_3072_mont_sqr_24(t[12], t[ 6], m, mp);
09241         sp_3072_mont_mul_24(t[13], t[ 7], t[ 6], m, mp);
09242         sp_3072_mont_sqr_24(t[14], t[ 7], m, mp);
09243         sp_3072_mont_mul_24(t[15], t[ 8], t[ 7], m, mp);
09244 
09245         i = (bits - 1) / 64;
09246         n = e[i--];
09247         y = n >> 60;
09248         n <<= 4;
09249         c = 60;
09250         XMEMCPY(r, t[y], sizeof(sp_digit) * 24);
09251         for (; i>=0 || c>=4; ) {
09252             if (c == 0) {
09253                 n = e[i--];
09254                 y = n >> 60;
09255                 n <<= 4;
09256                 c = 60;
09257             }
09258             else if (c < 4) {
09259                 y = n >> 60;
09260                 n = e[i--];
09261                 c = 4 - c;
09262                 y |= n >> (64 - c);
09263                 n <<= c;
09264                 c = 64 - c;
09265             }
09266             else {
09267                 y = (n >> 60) & 0xf;
09268                 n <<= 4;
09269                 c -= 4;
09270             }
09271 
09272             sp_3072_mont_sqr_24(r, r, m, mp);
09273             sp_3072_mont_sqr_24(r, r, m, mp);
09274             sp_3072_mont_sqr_24(r, r, m, mp);
09275             sp_3072_mont_sqr_24(r, r, m, mp);
09276 
09277             sp_3072_mont_mul_24(r, r, t[y], m, mp);
09278         }
09279 
09280         XMEMSET(&r[24], 0, sizeof(sp_digit) * 24);
09281         sp_3072_mont_reduce_24(r, m, mp);
09282 
09283         mask = 0 - (sp_3072_cmp_24(r, m) >= 0);
09284         sp_3072_cond_sub_24(r, r, m, mask);
09285     }
09286 
09287 #ifdef WOLFSSL_SMALL_STACK
09288     if (td != NULL)
09289         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
09290 #endif
09291 
09292     return err;
09293 }
09294 #else
09295 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
09296  *
09297  * r     A single precision number that is the result of the operation.
09298  * a     A single precision number being exponentiated.
09299  * e     A single precision number that is the exponent.
09300  * bits  The number of bits in the exponent.
09301  * m     A single precision number that is the modulus.
09302  * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
09303  */
09304 static int sp_3072_mod_exp_24(sp_digit* r, sp_digit* a, sp_digit* e,
09305         int bits, sp_digit* m, int reduceA)
09306 {
09307 #ifndef WOLFSSL_SMALL_STACK
09308     sp_digit t[32][48];
09309 #else
09310     sp_digit* t[32];
09311     sp_digit* td;
09312 #endif
09313     sp_digit* norm;
09314     sp_digit mp = 1;
09315     sp_digit n;
09316     sp_digit mask;
09317     int i;
09318     int c, y;
09319     int err = MP_OKAY;
09320 
09321 #ifdef WOLFSSL_SMALL_STACK
09322     td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 48, NULL,
09323                             DYNAMIC_TYPE_TMP_BUFFER);
09324     if (td == NULL)
09325         err = MEMORY_E;
09326 
09327     if (err == MP_OKAY) {
09328         for (i=0; i<32; i++)
09329             t[i] = td + i * 48;
09330         norm = t[0];
09331     }
09332 #else
09333     norm = t[0];
09334 #endif
09335 
09336     if (err == MP_OKAY) {
09337         sp_3072_mont_setup(m, &mp);
09338         sp_3072_mont_norm_24(norm, m);
09339 
09340         XMEMSET(t[1], 0, sizeof(sp_digit) * 24);
09341         if (reduceA) {
09342             err = sp_3072_mod_24(t[1] + 24, a, m);
09343             if (err == MP_OKAY)
09344                 err = sp_3072_mod_24(t[1], t[1], m);
09345         }
09346         else {
09347             XMEMCPY(t[1] + 24, a, sizeof(sp_digit) * 24);
09348             err = sp_3072_mod_24(t[1], t[1], m);
09349         }
09350     }
09351 
09352     if (err == MP_OKAY) {
09353         sp_3072_mont_sqr_24(t[ 2], t[ 1], m, mp);
09354         sp_3072_mont_mul_24(t[ 3], t[ 2], t[ 1], m, mp);
09355         sp_3072_mont_sqr_24(t[ 4], t[ 2], m, mp);
09356         sp_3072_mont_mul_24(t[ 5], t[ 3], t[ 2], m, mp);
09357         sp_3072_mont_sqr_24(t[ 6], t[ 3], m, mp);
09358         sp_3072_mont_mul_24(t[ 7], t[ 4], t[ 3], m, mp);
09359         sp_3072_mont_sqr_24(t[ 8], t[ 4], m, mp);
09360         sp_3072_mont_mul_24(t[ 9], t[ 5], t[ 4], m, mp);
09361         sp_3072_mont_sqr_24(t[10], t[ 5], m, mp);
09362         sp_3072_mont_mul_24(t[11], t[ 6], t[ 5], m, mp);
09363         sp_3072_mont_sqr_24(t[12], t[ 6], m, mp);
09364         sp_3072_mont_mul_24(t[13], t[ 7], t[ 6], m, mp);
09365         sp_3072_mont_sqr_24(t[14], t[ 7], m, mp);
09366         sp_3072_mont_mul_24(t[15], t[ 8], t[ 7], m, mp);
09367         sp_3072_mont_sqr_24(t[16], t[ 8], m, mp);
09368         sp_3072_mont_mul_24(t[17], t[ 9], t[ 8], m, mp);
09369         sp_3072_mont_sqr_24(t[18], t[ 9], m, mp);
09370         sp_3072_mont_mul_24(t[19], t[10], t[ 9], m, mp);
09371         sp_3072_mont_sqr_24(t[20], t[10], m, mp);
09372         sp_3072_mont_mul_24(t[21], t[11], t[10], m, mp);
09373         sp_3072_mont_sqr_24(t[22], t[11], m, mp);
09374         sp_3072_mont_mul_24(t[23], t[12], t[11], m, mp);
09375         sp_3072_mont_sqr_24(t[24], t[12], m, mp);
09376         sp_3072_mont_mul_24(t[25], t[13], t[12], m, mp);
09377         sp_3072_mont_sqr_24(t[26], t[13], m, mp);
09378         sp_3072_mont_mul_24(t[27], t[14], t[13], m, mp);
09379         sp_3072_mont_sqr_24(t[28], t[14], m, mp);
09380         sp_3072_mont_mul_24(t[29], t[15], t[14], m, mp);
09381         sp_3072_mont_sqr_24(t[30], t[15], m, mp);
09382         sp_3072_mont_mul_24(t[31], t[16], t[15], m, mp);
09383 
09384         i = (bits - 1) / 64;
09385         n = e[i--];
09386         y = n >> 59;
09387         n <<= 5;
09388         c = 59;
09389         XMEMCPY(r, t[y], sizeof(sp_digit) * 24);
09390         for (; i>=0 || c>=5; ) {
09391             if (c == 0) {
09392                 n = e[i--];
09393                 y = n >> 59;
09394                 n <<= 5;
09395                 c = 59;
09396             }
09397             else if (c < 5) {
09398                 y = n >> 59;
09399                 n = e[i--];
09400                 c = 5 - c;
09401                 y |= n >> (64 - c);
09402                 n <<= c;
09403                 c = 64 - c;
09404             }
09405             else {
09406                 y = (n >> 59) & 0x1f;
09407                 n <<= 5;
09408                 c -= 5;
09409             }
09410 
09411             sp_3072_mont_sqr_24(r, r, m, mp);
09412             sp_3072_mont_sqr_24(r, r, m, mp);
09413             sp_3072_mont_sqr_24(r, r, m, mp);
09414             sp_3072_mont_sqr_24(r, r, m, mp);
09415             sp_3072_mont_sqr_24(r, r, m, mp);
09416 
09417             sp_3072_mont_mul_24(r, r, t[y], m, mp);
09418         }
09419         y = e[0] & 0x1;
09420         sp_3072_mont_sqr_24(r, r, m, mp);
09421         sp_3072_mont_mul_24(r, r, t[y], m, mp);
09422 
09423         XMEMSET(&r[24], 0, sizeof(sp_digit) * 24);
09424         sp_3072_mont_reduce_24(r, m, mp);
09425 
09426         mask = 0 - (sp_3072_cmp_24(r, m) >= 0);
09427         sp_3072_cond_sub_24(r, r, m, mask);
09428     }
09429 
09430 #ifdef WOLFSSL_SMALL_STACK
09431     if (td != NULL)
09432         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
09433 #endif
09434 
09435     return err;
09436 }
09437 #endif /* WOLFSSL_SP_SMALL */
09438 
09439 #endif /* !SP_RSA_PRIVATE_EXP_D && WOLFSSL_HAVE_SP_RSA */
09440 
09441 /* r = 2^n mod m where n is the number of bits to reduce by.
09442  * Given m must be 3072 bits, just need to subtract.
09443  *
09444  * r  A single precision number.
09445  * m  A signle precision number.
09446  */
09447 static void sp_3072_mont_norm_48(sp_digit* r, sp_digit* m)
09448 {
09449     XMEMSET(r, 0, sizeof(sp_digit) * 48);
09450 
09451     /* r = 2^n mod m */
09452     sp_3072_sub_in_place_48(r, m);
09453 }
09454 
09455 /* Conditionally subtract b from a using the mask m.
09456  * m is -1 to subtract and 0 when not copying.
09457  *
09458  * r  A single precision number representing condition subtract result.
09459  * a  A single precision number to subtract from.
09460  * b  A single precision number to subtract.
09461  * m  Mask value to apply.
09462  */
09463 static sp_digit sp_3072_cond_sub_48(sp_digit* r, sp_digit* a, sp_digit* b,
09464         sp_digit m)
09465 {
09466     sp_digit c = 0;
09467 
09468 #ifdef WOLFSSL_SP_SMALL
09469     __asm__ __volatile__ (
09470         "mov    x8, #0\n\t"
09471         "1:\n\t"
09472         "subs   %[c], xzr, %[c]\n\t"
09473         "ldr    x4, [%[a], x8]\n\t"
09474         "ldr    x5, [%[b], x8]\n\t"
09475         "and    x5, x5, %[m]\n\t"
09476         "sbcs   x4, x4, x5\n\t"
09477         "csetm  %[c], cc\n\t"
09478         "str    x4, [%[r], x8]\n\t"
09479         "add    x8, x8, #8\n\t"
09480         "cmp    x8, 384\n\t"
09481         "b.lt   1b\n\t"
09482         : [c] "+r" (c)
09483         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
09484         : "memory", "x4", "x6", "x5", "x7", "x8"
09485     );
09486 #else
09487     __asm__ __volatile__ (
09488 
09489         "ldr        x4, [%[a], 0]\n\t"
09490         "ldr        x6, [%[a], 8]\n\t"
09491         "ldr        x5, [%[b], 0]\n\t"
09492         "ldr        x7, [%[b], 8]\n\t"
09493         "and        x5, x5, %[m]\n\t"
09494         "and        x7, x7, %[m]\n\t"
09495         "subs   x4, x4, x5\n\t"
09496         "sbcs   x6, x6, x7\n\t"
09497         "str        x4, [%[r], 0]\n\t"
09498         "str        x6, [%[r], 8]\n\t"
09499         "ldr        x4, [%[a], 16]\n\t"
09500         "ldr        x6, [%[a], 24]\n\t"
09501         "ldr        x5, [%[b], 16]\n\t"
09502         "ldr        x7, [%[b], 24]\n\t"
09503         "and        x5, x5, %[m]\n\t"
09504         "and        x7, x7, %[m]\n\t"
09505         "sbcs   x4, x4, x5\n\t"
09506         "sbcs   x6, x6, x7\n\t"
09507         "str        x4, [%[r], 16]\n\t"
09508         "str        x6, [%[r], 24]\n\t"
09509         "ldr        x4, [%[a], 32]\n\t"
09510         "ldr        x6, [%[a], 40]\n\t"
09511         "ldr        x5, [%[b], 32]\n\t"
09512         "ldr        x7, [%[b], 40]\n\t"
09513         "and        x5, x5, %[m]\n\t"
09514         "and        x7, x7, %[m]\n\t"
09515         "sbcs   x4, x4, x5\n\t"
09516         "sbcs   x6, x6, x7\n\t"
09517         "str        x4, [%[r], 32]\n\t"
09518         "str        x6, [%[r], 40]\n\t"
09519         "ldr        x4, [%[a], 48]\n\t"
09520         "ldr        x6, [%[a], 56]\n\t"
09521         "ldr        x5, [%[b], 48]\n\t"
09522         "ldr        x7, [%[b], 56]\n\t"
09523         "and        x5, x5, %[m]\n\t"
09524         "and        x7, x7, %[m]\n\t"
09525         "sbcs   x4, x4, x5\n\t"
09526         "sbcs   x6, x6, x7\n\t"
09527         "str        x4, [%[r], 48]\n\t"
09528         "str        x6, [%[r], 56]\n\t"
09529         "ldr        x4, [%[a], 64]\n\t"
09530         "ldr        x6, [%[a], 72]\n\t"
09531         "ldr        x5, [%[b], 64]\n\t"
09532         "ldr        x7, [%[b], 72]\n\t"
09533         "and        x5, x5, %[m]\n\t"
09534         "and        x7, x7, %[m]\n\t"
09535         "sbcs   x4, x4, x5\n\t"
09536         "sbcs   x6, x6, x7\n\t"
09537         "str        x4, [%[r], 64]\n\t"
09538         "str        x6, [%[r], 72]\n\t"
09539         "ldr        x4, [%[a], 80]\n\t"
09540         "ldr        x6, [%[a], 88]\n\t"
09541         "ldr        x5, [%[b], 80]\n\t"
09542         "ldr        x7, [%[b], 88]\n\t"
09543         "and        x5, x5, %[m]\n\t"
09544         "and        x7, x7, %[m]\n\t"
09545         "sbcs   x4, x4, x5\n\t"
09546         "sbcs   x6, x6, x7\n\t"
09547         "str        x4, [%[r], 80]\n\t"
09548         "str        x6, [%[r], 88]\n\t"
09549         "ldr        x4, [%[a], 96]\n\t"
09550         "ldr        x6, [%[a], 104]\n\t"
09551         "ldr        x5, [%[b], 96]\n\t"
09552         "ldr        x7, [%[b], 104]\n\t"
09553         "and        x5, x5, %[m]\n\t"
09554         "and        x7, x7, %[m]\n\t"
09555         "sbcs   x4, x4, x5\n\t"
09556         "sbcs   x6, x6, x7\n\t"
09557         "str        x4, [%[r], 96]\n\t"
09558         "str        x6, [%[r], 104]\n\t"
09559         "ldr        x4, [%[a], 112]\n\t"
09560         "ldr        x6, [%[a], 120]\n\t"
09561         "ldr        x5, [%[b], 112]\n\t"
09562         "ldr        x7, [%[b], 120]\n\t"
09563         "and        x5, x5, %[m]\n\t"
09564         "and        x7, x7, %[m]\n\t"
09565         "sbcs   x4, x4, x5\n\t"
09566         "sbcs   x6, x6, x7\n\t"
09567         "str        x4, [%[r], 112]\n\t"
09568         "str        x6, [%[r], 120]\n\t"
09569         "ldr        x4, [%[a], 128]\n\t"
09570         "ldr        x6, [%[a], 136]\n\t"
09571         "ldr        x5, [%[b], 128]\n\t"
09572         "ldr        x7, [%[b], 136]\n\t"
09573         "and        x5, x5, %[m]\n\t"
09574         "and        x7, x7, %[m]\n\t"
09575         "sbcs   x4, x4, x5\n\t"
09576         "sbcs   x6, x6, x7\n\t"
09577         "str        x4, [%[r], 128]\n\t"
09578         "str        x6, [%[r], 136]\n\t"
09579         "ldr        x4, [%[a], 144]\n\t"
09580         "ldr        x6, [%[a], 152]\n\t"
09581         "ldr        x5, [%[b], 144]\n\t"
09582         "ldr        x7, [%[b], 152]\n\t"
09583         "and        x5, x5, %[m]\n\t"
09584         "and        x7, x7, %[m]\n\t"
09585         "sbcs   x4, x4, x5\n\t"
09586         "sbcs   x6, x6, x7\n\t"
09587         "str        x4, [%[r], 144]\n\t"
09588         "str        x6, [%[r], 152]\n\t"
09589         "ldr        x4, [%[a], 160]\n\t"
09590         "ldr        x6, [%[a], 168]\n\t"
09591         "ldr        x5, [%[b], 160]\n\t"
09592         "ldr        x7, [%[b], 168]\n\t"
09593         "and        x5, x5, %[m]\n\t"
09594         "and        x7, x7, %[m]\n\t"
09595         "sbcs   x4, x4, x5\n\t"
09596         "sbcs   x6, x6, x7\n\t"
09597         "str        x4, [%[r], 160]\n\t"
09598         "str        x6, [%[r], 168]\n\t"
09599         "ldr        x4, [%[a], 176]\n\t"
09600         "ldr        x6, [%[a], 184]\n\t"
09601         "ldr        x5, [%[b], 176]\n\t"
09602         "ldr        x7, [%[b], 184]\n\t"
09603         "and        x5, x5, %[m]\n\t"
09604         "and        x7, x7, %[m]\n\t"
09605         "sbcs   x4, x4, x5\n\t"
09606         "sbcs   x6, x6, x7\n\t"
09607         "str        x4, [%[r], 176]\n\t"
09608         "str        x6, [%[r], 184]\n\t"
09609         "ldr        x4, [%[a], 192]\n\t"
09610         "ldr        x6, [%[a], 200]\n\t"
09611         "ldr        x5, [%[b], 192]\n\t"
09612         "ldr        x7, [%[b], 200]\n\t"
09613         "and        x5, x5, %[m]\n\t"
09614         "and        x7, x7, %[m]\n\t"
09615         "sbcs   x4, x4, x5\n\t"
09616         "sbcs   x6, x6, x7\n\t"
09617         "str        x4, [%[r], 192]\n\t"
09618         "str        x6, [%[r], 200]\n\t"
09619         "ldr        x4, [%[a], 208]\n\t"
09620         "ldr        x6, [%[a], 216]\n\t"
09621         "ldr        x5, [%[b], 208]\n\t"
09622         "ldr        x7, [%[b], 216]\n\t"
09623         "and        x5, x5, %[m]\n\t"
09624         "and        x7, x7, %[m]\n\t"
09625         "sbcs   x4, x4, x5\n\t"
09626         "sbcs   x6, x6, x7\n\t"
09627         "str        x4, [%[r], 208]\n\t"
09628         "str        x6, [%[r], 216]\n\t"
09629         "ldr        x4, [%[a], 224]\n\t"
09630         "ldr        x6, [%[a], 232]\n\t"
09631         "ldr        x5, [%[b], 224]\n\t"
09632         "ldr        x7, [%[b], 232]\n\t"
09633         "and        x5, x5, %[m]\n\t"
09634         "and        x7, x7, %[m]\n\t"
09635         "sbcs   x4, x4, x5\n\t"
09636         "sbcs   x6, x6, x7\n\t"
09637         "str        x4, [%[r], 224]\n\t"
09638         "str        x6, [%[r], 232]\n\t"
09639         "ldr        x4, [%[a], 240]\n\t"
09640         "ldr        x6, [%[a], 248]\n\t"
09641         "ldr        x5, [%[b], 240]\n\t"
09642         "ldr        x7, [%[b], 248]\n\t"
09643         "and        x5, x5, %[m]\n\t"
09644         "and        x7, x7, %[m]\n\t"
09645         "sbcs   x4, x4, x5\n\t"
09646         "sbcs   x6, x6, x7\n\t"
09647         "str        x4, [%[r], 240]\n\t"
09648         "str        x6, [%[r], 248]\n\t"
09649         "ldr        x4, [%[a], 256]\n\t"
09650         "ldr        x6, [%[a], 264]\n\t"
09651         "ldr        x5, [%[b], 256]\n\t"
09652         "ldr        x7, [%[b], 264]\n\t"
09653         "and        x5, x5, %[m]\n\t"
09654         "and        x7, x7, %[m]\n\t"
09655         "sbcs   x4, x4, x5\n\t"
09656         "sbcs   x6, x6, x7\n\t"
09657         "str        x4, [%[r], 256]\n\t"
09658         "str        x6, [%[r], 264]\n\t"
09659         "ldr        x4, [%[a], 272]\n\t"
09660         "ldr        x6, [%[a], 280]\n\t"
09661         "ldr        x5, [%[b], 272]\n\t"
09662         "ldr        x7, [%[b], 280]\n\t"
09663         "and        x5, x5, %[m]\n\t"
09664         "and        x7, x7, %[m]\n\t"
09665         "sbcs   x4, x4, x5\n\t"
09666         "sbcs   x6, x6, x7\n\t"
09667         "str        x4, [%[r], 272]\n\t"
09668         "str        x6, [%[r], 280]\n\t"
09669         "ldr        x4, [%[a], 288]\n\t"
09670         "ldr        x6, [%[a], 296]\n\t"
09671         "ldr        x5, [%[b], 288]\n\t"
09672         "ldr        x7, [%[b], 296]\n\t"
09673         "and        x5, x5, %[m]\n\t"
09674         "and        x7, x7, %[m]\n\t"
09675         "sbcs   x4, x4, x5\n\t"
09676         "sbcs   x6, x6, x7\n\t"
09677         "str        x4, [%[r], 288]\n\t"
09678         "str        x6, [%[r], 296]\n\t"
09679         "ldr        x4, [%[a], 304]\n\t"
09680         "ldr        x6, [%[a], 312]\n\t"
09681         "ldr        x5, [%[b], 304]\n\t"
09682         "ldr        x7, [%[b], 312]\n\t"
09683         "and        x5, x5, %[m]\n\t"
09684         "and        x7, x7, %[m]\n\t"
09685         "sbcs   x4, x4, x5\n\t"
09686         "sbcs   x6, x6, x7\n\t"
09687         "str        x4, [%[r], 304]\n\t"
09688         "str        x6, [%[r], 312]\n\t"
09689         "ldr        x4, [%[a], 320]\n\t"
09690         "ldr        x6, [%[a], 328]\n\t"
09691         "ldr        x5, [%[b], 320]\n\t"
09692         "ldr        x7, [%[b], 328]\n\t"
09693         "and        x5, x5, %[m]\n\t"
09694         "and        x7, x7, %[m]\n\t"
09695         "sbcs   x4, x4, x5\n\t"
09696         "sbcs   x6, x6, x7\n\t"
09697         "str        x4, [%[r], 320]\n\t"
09698         "str        x6, [%[r], 328]\n\t"
09699         "ldr        x4, [%[a], 336]\n\t"
09700         "ldr        x6, [%[a], 344]\n\t"
09701         "ldr        x5, [%[b], 336]\n\t"
09702         "ldr        x7, [%[b], 344]\n\t"
09703         "and        x5, x5, %[m]\n\t"
09704         "and        x7, x7, %[m]\n\t"
09705         "sbcs   x4, x4, x5\n\t"
09706         "sbcs   x6, x6, x7\n\t"
09707         "str        x4, [%[r], 336]\n\t"
09708         "str        x6, [%[r], 344]\n\t"
09709         "ldr        x4, [%[a], 352]\n\t"
09710         "ldr        x6, [%[a], 360]\n\t"
09711         "ldr        x5, [%[b], 352]\n\t"
09712         "ldr        x7, [%[b], 360]\n\t"
09713         "and        x5, x5, %[m]\n\t"
09714         "and        x7, x7, %[m]\n\t"
09715         "sbcs   x4, x4, x5\n\t"
09716         "sbcs   x6, x6, x7\n\t"
09717         "str        x4, [%[r], 352]\n\t"
09718         "str        x6, [%[r], 360]\n\t"
09719         "ldr        x4, [%[a], 368]\n\t"
09720         "ldr        x6, [%[a], 376]\n\t"
09721         "ldr        x5, [%[b], 368]\n\t"
09722         "ldr        x7, [%[b], 376]\n\t"
09723         "and        x5, x5, %[m]\n\t"
09724         "and        x7, x7, %[m]\n\t"
09725         "sbcs   x4, x4, x5\n\t"
09726         "sbcs   x6, x6, x7\n\t"
09727         "str        x4, [%[r], 368]\n\t"
09728         "str        x6, [%[r], 376]\n\t"
09729         "csetm  %[c], cc\n\t"
09730         : [c] "+r" (c)
09731         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
09732         : "memory", "x4", "x6", "x5", "x7", "x8"
09733     );
09734 #endif /* WOLFSSL_SP_SMALL */
09735 
09736     return c;
09737 }
09738 
09739 /* Reduce the number back to 3072 bits using Montgomery reduction.
09740  *
09741  * a   A single precision number to reduce in place.
09742  * m   The single precision number representing the modulus.
09743  * mp  The digit representing the negative inverse of m mod 2^n.
09744  */
09745 SP_NOINLINE static void sp_3072_mont_reduce_48(sp_digit* a, sp_digit* m,
09746         sp_digit mp)
09747 {
09748     sp_digit ca = 0;
09749 
09750     __asm__ __volatile__ (
09751         "ldp       x12, x13, [%[m], 0]\n\t"
09752         "ldp       x14, x15, [%[m], 16]\n\t"
09753         "ldp       x16, x17, [%[m], 32]\n\t"
09754         "ldp       x18, x19, [%[m], 48]\n\t"
09755         "ldp       x20, x21, [%[m], 64]\n\t"
09756         "ldp       x22, x23, [%[m], 80]\n\t"
09757         "ldp       x24, x25, [%[m], 96]\n\t"
09758         "ldp       x26, x27, [%[m], 112]\n\t"
09759         "# i = 0\n\t"
09760         "mov    x3, 0\n\t"
09761         "ldp    x10, x11, [%[a], 0]\n\t"
09762         "\n1:\n\t"
09763         "# mu = a[i] * mp\n\t"
09764         "mul    x8, %[mp], x10\n\t"
09765         "# a[i+0] += m[0] * mu\n\t"
09766         "ldr    x9, [%[a], 0]\n\t"
09767         "mul        x6, x12, x8\n\t"
09768         "umulh  x7, x12, x8\n\t"
09769         "adds   x10, x10, x6\n\t"
09770         "adc    x5, x7, xzr\n\t"
09771         "# a[i+1] += m[1] * mu\n\t"
09772         "ldr    x9, [%[a], 8]\n\t"
09773         "mul        x6, x13, x8\n\t"
09774         "umulh  x7, x13, x8\n\t"
09775         "adds   x10, x11, x6\n\t"
09776         "adc    x4, x7, xzr\n\t"
09777         "adds   x10, x10, x5\n\t"
09778         "adc    x4, x4, xzr\n\t"
09779         "# a[i+2] += m[2] * mu\n\t"
09780         "ldr    x11, [%[a], 16]\n\t"
09781         "mul        x6, x14, x8\n\t"
09782         "umulh  x7, x14, x8\n\t"
09783         "adds   x11, x11, x6\n\t"
09784         "adc    x5, x7, xzr\n\t"
09785         "adds   x11, x11, x4\n\t"
09786         "adc    x5, x5, xzr\n\t"
09787         "# a[i+3] += m[3] * mu\n\t"
09788         "ldr    x9, [%[a], 24]\n\t"
09789         "mul        x6, x15, x8\n\t"
09790         "umulh  x7, x15, x8\n\t"
09791         "adds   x9, x9, x6\n\t"
09792         "adc    x4, x7, xzr\n\t"
09793         "adds   x9, x9, x5\n\t"
09794         "str    x9, [%[a], 24]\n\t"
09795         "adc    x4, x4, xzr\n\t"
09796         "# a[i+4] += m[4] * mu\n\t"
09797         "ldr    x9, [%[a], 32]\n\t"
09798         "mul        x6, x16, x8\n\t"
09799         "umulh  x7, x16, x8\n\t"
09800         "adds   x9, x9, x6\n\t"
09801         "adc    x5, x7, xzr\n\t"
09802         "adds   x9, x9, x4\n\t"
09803         "str    x9, [%[a], 32]\n\t"
09804         "adc    x5, x5, xzr\n\t"
09805         "# a[i+5] += m[5] * mu\n\t"
09806         "ldr    x9, [%[a], 40]\n\t"
09807         "mul        x6, x17, x8\n\t"
09808         "umulh  x7, x17, x8\n\t"
09809         "adds   x9, x9, x6\n\t"
09810         "adc    x4, x7, xzr\n\t"
09811         "adds   x9, x9, x5\n\t"
09812         "str    x9, [%[a], 40]\n\t"
09813         "adc    x4, x4, xzr\n\t"
09814         "# a[i+6] += m[6] * mu\n\t"
09815         "ldr    x9, [%[a], 48]\n\t"
09816         "mul        x6, x18, x8\n\t"
09817         "umulh  x7, x18, x8\n\t"
09818         "adds   x9, x9, x6\n\t"
09819         "adc    x5, x7, xzr\n\t"
09820         "adds   x9, x9, x4\n\t"
09821         "str    x9, [%[a], 48]\n\t"
09822         "adc    x5, x5, xzr\n\t"
09823         "# a[i+7] += m[7] * mu\n\t"
09824         "ldr    x9, [%[a], 56]\n\t"
09825         "mul        x6, x19, x8\n\t"
09826         "umulh  x7, x19, x8\n\t"
09827         "adds   x9, x9, x6\n\t"
09828         "adc    x4, x7, xzr\n\t"
09829         "adds   x9, x9, x5\n\t"
09830         "str    x9, [%[a], 56]\n\t"
09831         "adc    x4, x4, xzr\n\t"
09832         "# a[i+8] += m[8] * mu\n\t"
09833         "ldr    x9, [%[a], 64]\n\t"
09834         "mul        x6, x20, x8\n\t"
09835         "umulh  x7, x20, x8\n\t"
09836         "adds   x9, x9, x6\n\t"
09837         "adc    x5, x7, xzr\n\t"
09838         "adds   x9, x9, x4\n\t"
09839         "str    x9, [%[a], 64]\n\t"
09840         "adc    x5, x5, xzr\n\t"
09841         "# a[i+9] += m[9] * mu\n\t"
09842         "ldr    x9, [%[a], 72]\n\t"
09843         "mul        x6, x21, x8\n\t"
09844         "umulh  x7, x21, x8\n\t"
09845         "adds   x9, x9, x6\n\t"
09846         "adc    x4, x7, xzr\n\t"
09847         "adds   x9, x9, x5\n\t"
09848         "str    x9, [%[a], 72]\n\t"
09849         "adc    x4, x4, xzr\n\t"
09850         "# a[i+10] += m[10] * mu\n\t"
09851         "ldr    x9, [%[a], 80]\n\t"
09852         "mul        x6, x22, x8\n\t"
09853         "umulh  x7, x22, x8\n\t"
09854         "adds   x9, x9, x6\n\t"
09855         "adc    x5, x7, xzr\n\t"
09856         "adds   x9, x9, x4\n\t"
09857         "str    x9, [%[a], 80]\n\t"
09858         "adc    x5, x5, xzr\n\t"
09859         "# a[i+11] += m[11] * mu\n\t"
09860         "ldr    x9, [%[a], 88]\n\t"
09861         "mul        x6, x23, x8\n\t"
09862         "umulh  x7, x23, x8\n\t"
09863         "adds   x9, x9, x6\n\t"
09864         "adc    x4, x7, xzr\n\t"
09865         "adds   x9, x9, x5\n\t"
09866         "str    x9, [%[a], 88]\n\t"
09867         "adc    x4, x4, xzr\n\t"
09868         "# a[i+12] += m[12] * mu\n\t"
09869         "ldr    x9, [%[a], 96]\n\t"
09870         "mul        x6, x24, x8\n\t"
09871         "umulh  x7, x24, x8\n\t"
09872         "adds   x9, x9, x6\n\t"
09873         "adc    x5, x7, xzr\n\t"
09874         "adds   x9, x9, x4\n\t"
09875         "str    x9, [%[a], 96]\n\t"
09876         "adc    x5, x5, xzr\n\t"
09877         "# a[i+13] += m[13] * mu\n\t"
09878         "ldr    x9, [%[a], 104]\n\t"
09879         "mul        x6, x25, x8\n\t"
09880         "umulh  x7, x25, x8\n\t"
09881         "adds   x9, x9, x6\n\t"
09882         "adc    x4, x7, xzr\n\t"
09883         "adds   x9, x9, x5\n\t"
09884         "str    x9, [%[a], 104]\n\t"
09885         "adc    x4, x4, xzr\n\t"
09886         "# a[i+14] += m[14] * mu\n\t"
09887         "ldr    x9, [%[a], 112]\n\t"
09888         "mul        x6, x26, x8\n\t"
09889         "umulh  x7, x26, x8\n\t"
09890         "adds   x9, x9, x6\n\t"
09891         "adc    x5, x7, xzr\n\t"
09892         "adds   x9, x9, x4\n\t"
09893         "str    x9, [%[a], 112]\n\t"
09894         "adc    x5, x5, xzr\n\t"
09895         "# a[i+15] += m[15] * mu\n\t"
09896         "ldr    x9, [%[a], 120]\n\t"
09897         "mul        x6, x27, x8\n\t"
09898         "umulh  x7, x27, x8\n\t"
09899         "adds   x9, x9, x6\n\t"
09900         "adc    x4, x7, xzr\n\t"
09901         "adds   x9, x9, x5\n\t"
09902         "str    x9, [%[a], 120]\n\t"
09903         "adc    x4, x4, xzr\n\t"
09904         "# a[i+16] += m[16] * mu\n\t"
09905         "ldr        x7, [%[m], 128]\n\t"
09906         "ldr    x9, [%[a], 128]\n\t"
09907         "mul        x6, x7, x8\n\t"
09908         "umulh  x7, x7, x8\n\t"
09909         "adds   x9, x9, x6\n\t"
09910         "adc    x5, x7, xzr\n\t"
09911         "adds   x9, x9, x4\n\t"
09912         "str    x9, [%[a], 128]\n\t"
09913         "adc    x5, x5, xzr\n\t"
09914         "# a[i+17] += m[17] * mu\n\t"
09915         "ldr        x7, [%[m], 136]\n\t"
09916         "ldr    x9, [%[a], 136]\n\t"
09917         "mul        x6, x7, x8\n\t"
09918         "umulh  x7, x7, x8\n\t"
09919         "adds   x9, x9, x6\n\t"
09920         "adc    x4, x7, xzr\n\t"
09921         "adds   x9, x9, x5\n\t"
09922         "str    x9, [%[a], 136]\n\t"
09923         "adc    x4, x4, xzr\n\t"
09924         "# a[i+18] += m[18] * mu\n\t"
09925         "ldr        x7, [%[m], 144]\n\t"
09926         "ldr    x9, [%[a], 144]\n\t"
09927         "mul        x6, x7, x8\n\t"
09928         "umulh  x7, x7, x8\n\t"
09929         "adds   x9, x9, x6\n\t"
09930         "adc    x5, x7, xzr\n\t"
09931         "adds   x9, x9, x4\n\t"
09932         "str    x9, [%[a], 144]\n\t"
09933         "adc    x5, x5, xzr\n\t"
09934         "# a[i+19] += m[19] * mu\n\t"
09935         "ldr        x7, [%[m], 152]\n\t"
09936         "ldr    x9, [%[a], 152]\n\t"
09937         "mul        x6, x7, x8\n\t"
09938         "umulh  x7, x7, x8\n\t"
09939         "adds   x9, x9, x6\n\t"
09940         "adc    x4, x7, xzr\n\t"
09941         "adds   x9, x9, x5\n\t"
09942         "str    x9, [%[a], 152]\n\t"
09943         "adc    x4, x4, xzr\n\t"
09944         "# a[i+20] += m[20] * mu\n\t"
09945         "ldr        x7, [%[m], 160]\n\t"
09946         "ldr    x9, [%[a], 160]\n\t"
09947         "mul        x6, x7, x8\n\t"
09948         "umulh  x7, x7, x8\n\t"
09949         "adds   x9, x9, x6\n\t"
09950         "adc    x5, x7, xzr\n\t"
09951         "adds   x9, x9, x4\n\t"
09952         "str    x9, [%[a], 160]\n\t"
09953         "adc    x5, x5, xzr\n\t"
09954         "# a[i+21] += m[21] * mu\n\t"
09955         "ldr        x7, [%[m], 168]\n\t"
09956         "ldr    x9, [%[a], 168]\n\t"
09957         "mul        x6, x7, x8\n\t"
09958         "umulh  x7, x7, x8\n\t"
09959         "adds   x9, x9, x6\n\t"
09960         "adc    x4, x7, xzr\n\t"
09961         "adds   x9, x9, x5\n\t"
09962         "str    x9, [%[a], 168]\n\t"
09963         "adc    x4, x4, xzr\n\t"
09964         "# a[i+22] += m[22] * mu\n\t"
09965         "ldr        x7, [%[m], 176]\n\t"
09966         "ldr    x9, [%[a], 176]\n\t"
09967         "mul        x6, x7, x8\n\t"
09968         "umulh  x7, x7, x8\n\t"
09969         "adds   x9, x9, x6\n\t"
09970         "adc    x5, x7, xzr\n\t"
09971         "adds   x9, x9, x4\n\t"
09972         "str    x9, [%[a], 176]\n\t"
09973         "adc    x5, x5, xzr\n\t"
09974         "# a[i+23] += m[23] * mu\n\t"
09975         "ldr        x7, [%[m], 184]\n\t"
09976         "ldr    x9, [%[a], 184]\n\t"
09977         "mul        x6, x7, x8\n\t"
09978         "umulh  x7, x7, x8\n\t"
09979         "adds   x9, x9, x6\n\t"
09980         "adc    x4, x7, xzr\n\t"
09981         "adds   x9, x9, x5\n\t"
09982         "str    x9, [%[a], 184]\n\t"
09983         "adc    x4, x4, xzr\n\t"
09984         "# a[i+24] += m[24] * mu\n\t"
09985         "ldr        x7, [%[m], 192]\n\t"
09986         "ldr    x9, [%[a], 192]\n\t"
09987         "mul        x6, x7, x8\n\t"
09988         "umulh  x7, x7, x8\n\t"
09989         "adds   x9, x9, x6\n\t"
09990         "adc    x5, x7, xzr\n\t"
09991         "adds   x9, x9, x4\n\t"
09992         "str    x9, [%[a], 192]\n\t"
09993         "adc    x5, x5, xzr\n\t"
09994         "# a[i+25] += m[25] * mu\n\t"
09995         "ldr        x7, [%[m], 200]\n\t"
09996         "ldr    x9, [%[a], 200]\n\t"
09997         "mul        x6, x7, x8\n\t"
09998         "umulh  x7, x7, x8\n\t"
09999         "adds   x9, x9, x6\n\t"
10000         "adc    x4, x7, xzr\n\t"
10001         "adds   x9, x9, x5\n\t"
10002         "str    x9, [%[a], 200]\n\t"
10003         "adc    x4, x4, xzr\n\t"
10004         "# a[i+26] += m[26] * mu\n\t"
10005         "ldr        x7, [%[m], 208]\n\t"
10006         "ldr    x9, [%[a], 208]\n\t"
10007         "mul        x6, x7, x8\n\t"
10008         "umulh  x7, x7, x8\n\t"
10009         "adds   x9, x9, x6\n\t"
10010         "adc    x5, x7, xzr\n\t"
10011         "adds   x9, x9, x4\n\t"
10012         "str    x9, [%[a], 208]\n\t"
10013         "adc    x5, x5, xzr\n\t"
10014         "# a[i+27] += m[27] * mu\n\t"
10015         "ldr        x7, [%[m], 216]\n\t"
10016         "ldr    x9, [%[a], 216]\n\t"
10017         "mul        x6, x7, x8\n\t"
10018         "umulh  x7, x7, x8\n\t"
10019         "adds   x9, x9, x6\n\t"
10020         "adc    x4, x7, xzr\n\t"
10021         "adds   x9, x9, x5\n\t"
10022         "str    x9, [%[a], 216]\n\t"
10023         "adc    x4, x4, xzr\n\t"
10024         "# a[i+28] += m[28] * mu\n\t"
10025         "ldr        x7, [%[m], 224]\n\t"
10026         "ldr    x9, [%[a], 224]\n\t"
10027         "mul        x6, x7, x8\n\t"
10028         "umulh  x7, x7, x8\n\t"
10029         "adds   x9, x9, x6\n\t"
10030         "adc    x5, x7, xzr\n\t"
10031         "adds   x9, x9, x4\n\t"
10032         "str    x9, [%[a], 224]\n\t"
10033         "adc    x5, x5, xzr\n\t"
10034         "# a[i+29] += m[29] * mu\n\t"
10035         "ldr        x7, [%[m], 232]\n\t"
10036         "ldr    x9, [%[a], 232]\n\t"
10037         "mul        x6, x7, x8\n\t"
10038         "umulh  x7, x7, x8\n\t"
10039         "adds   x9, x9, x6\n\t"
10040         "adc    x4, x7, xzr\n\t"
10041         "adds   x9, x9, x5\n\t"
10042         "str    x9, [%[a], 232]\n\t"
10043         "adc    x4, x4, xzr\n\t"
10044         "# a[i+30] += m[30] * mu\n\t"
10045         "ldr        x7, [%[m], 240]\n\t"
10046         "ldr    x9, [%[a], 240]\n\t"
10047         "mul        x6, x7, x8\n\t"
10048         "umulh  x7, x7, x8\n\t"
10049         "adds   x9, x9, x6\n\t"
10050         "adc    x5, x7, xzr\n\t"
10051         "adds   x9, x9, x4\n\t"
10052         "str    x9, [%[a], 240]\n\t"
10053         "adc    x5, x5, xzr\n\t"
10054         "# a[i+31] += m[31] * mu\n\t"
10055         "ldr        x7, [%[m], 248]\n\t"
10056         "ldr    x9, [%[a], 248]\n\t"
10057         "mul        x6, x7, x8\n\t"
10058         "umulh  x7, x7, x8\n\t"
10059         "adds   x9, x9, x6\n\t"
10060         "adc    x4, x7, xzr\n\t"
10061         "adds   x9, x9, x5\n\t"
10062         "str    x9, [%[a], 248]\n\t"
10063         "adc    x4, x4, xzr\n\t"
10064         "# a[i+32] += m[32] * mu\n\t"
10065         "ldr        x7, [%[m], 256]\n\t"
10066         "ldr    x9, [%[a], 256]\n\t"
10067         "mul        x6, x7, x8\n\t"
10068         "umulh  x7, x7, x8\n\t"
10069         "adds   x9, x9, x6\n\t"
10070         "adc    x5, x7, xzr\n\t"
10071         "adds   x9, x9, x4\n\t"
10072         "str    x9, [%[a], 256]\n\t"
10073         "adc    x5, x5, xzr\n\t"
10074         "# a[i+33] += m[33] * mu\n\t"
10075         "ldr        x7, [%[m], 264]\n\t"
10076         "ldr    x9, [%[a], 264]\n\t"
10077         "mul        x6, x7, x8\n\t"
10078         "umulh  x7, x7, x8\n\t"
10079         "adds   x9, x9, x6\n\t"
10080         "adc    x4, x7, xzr\n\t"
10081         "adds   x9, x9, x5\n\t"
10082         "str    x9, [%[a], 264]\n\t"
10083         "adc    x4, x4, xzr\n\t"
10084         "# a[i+34] += m[34] * mu\n\t"
10085         "ldr        x7, [%[m], 272]\n\t"
10086         "ldr    x9, [%[a], 272]\n\t"
10087         "mul        x6, x7, x8\n\t"
10088         "umulh  x7, x7, x8\n\t"
10089         "adds   x9, x9, x6\n\t"
10090         "adc    x5, x7, xzr\n\t"
10091         "adds   x9, x9, x4\n\t"
10092         "str    x9, [%[a], 272]\n\t"
10093         "adc    x5, x5, xzr\n\t"
10094         "# a[i+35] += m[35] * mu\n\t"
10095         "ldr        x7, [%[m], 280]\n\t"
10096         "ldr    x9, [%[a], 280]\n\t"
10097         "mul        x6, x7, x8\n\t"
10098         "umulh  x7, x7, x8\n\t"
10099         "adds   x9, x9, x6\n\t"
10100         "adc    x4, x7, xzr\n\t"
10101         "adds   x9, x9, x5\n\t"
10102         "str    x9, [%[a], 280]\n\t"
10103         "adc    x4, x4, xzr\n\t"
10104         "# a[i+36] += m[36] * mu\n\t"
10105         "ldr        x7, [%[m], 288]\n\t"
10106         "ldr    x9, [%[a], 288]\n\t"
10107         "mul        x6, x7, x8\n\t"
10108         "umulh  x7, x7, x8\n\t"
10109         "adds   x9, x9, x6\n\t"
10110         "adc    x5, x7, xzr\n\t"
10111         "adds   x9, x9, x4\n\t"
10112         "str    x9, [%[a], 288]\n\t"
10113         "adc    x5, x5, xzr\n\t"
10114         "# a[i+37] += m[37] * mu\n\t"
10115         "ldr        x7, [%[m], 296]\n\t"
10116         "ldr    x9, [%[a], 296]\n\t"
10117         "mul        x6, x7, x8\n\t"
10118         "umulh  x7, x7, x8\n\t"
10119         "adds   x9, x9, x6\n\t"
10120         "adc    x4, x7, xzr\n\t"
10121         "adds   x9, x9, x5\n\t"
10122         "str    x9, [%[a], 296]\n\t"
10123         "adc    x4, x4, xzr\n\t"
10124         "# a[i+38] += m[38] * mu\n\t"
10125         "ldr        x7, [%[m], 304]\n\t"
10126         "ldr    x9, [%[a], 304]\n\t"
10127         "mul        x6, x7, x8\n\t"
10128         "umulh  x7, x7, x8\n\t"
10129         "adds   x9, x9, x6\n\t"
10130         "adc    x5, x7, xzr\n\t"
10131         "adds   x9, x9, x4\n\t"
10132         "str    x9, [%[a], 304]\n\t"
10133         "adc    x5, x5, xzr\n\t"
10134         "# a[i+39] += m[39] * mu\n\t"
10135         "ldr        x7, [%[m], 312]\n\t"
10136         "ldr    x9, [%[a], 312]\n\t"
10137         "mul        x6, x7, x8\n\t"
10138         "umulh  x7, x7, x8\n\t"
10139         "adds   x9, x9, x6\n\t"
10140         "adc    x4, x7, xzr\n\t"
10141         "adds   x9, x9, x5\n\t"
10142         "str    x9, [%[a], 312]\n\t"
10143         "adc    x4, x4, xzr\n\t"
10144         "# a[i+40] += m[40] * mu\n\t"
10145         "ldr        x7, [%[m], 320]\n\t"
10146         "ldr    x9, [%[a], 320]\n\t"
10147         "mul        x6, x7, x8\n\t"
10148         "umulh  x7, x7, x8\n\t"
10149         "adds   x9, x9, x6\n\t"
10150         "adc    x5, x7, xzr\n\t"
10151         "adds   x9, x9, x4\n\t"
10152         "str    x9, [%[a], 320]\n\t"
10153         "adc    x5, x5, xzr\n\t"
10154         "# a[i+41] += m[41] * mu\n\t"
10155         "ldr        x7, [%[m], 328]\n\t"
10156         "ldr    x9, [%[a], 328]\n\t"
10157         "mul        x6, x7, x8\n\t"
10158         "umulh  x7, x7, x8\n\t"
10159         "adds   x9, x9, x6\n\t"
10160         "adc    x4, x7, xzr\n\t"
10161         "adds   x9, x9, x5\n\t"
10162         "str    x9, [%[a], 328]\n\t"
10163         "adc    x4, x4, xzr\n\t"
10164         "# a[i+42] += m[42] * mu\n\t"
10165         "ldr        x7, [%[m], 336]\n\t"
10166         "ldr    x9, [%[a], 336]\n\t"
10167         "mul        x6, x7, x8\n\t"
10168         "umulh  x7, x7, x8\n\t"
10169         "adds   x9, x9, x6\n\t"
10170         "adc    x5, x7, xzr\n\t"
10171         "adds   x9, x9, x4\n\t"
10172         "str    x9, [%[a], 336]\n\t"
10173         "adc    x5, x5, xzr\n\t"
10174         "# a[i+43] += m[43] * mu\n\t"
10175         "ldr        x7, [%[m], 344]\n\t"
10176         "ldr    x9, [%[a], 344]\n\t"
10177         "mul        x6, x7, x8\n\t"
10178         "umulh  x7, x7, x8\n\t"
10179         "adds   x9, x9, x6\n\t"
10180         "adc    x4, x7, xzr\n\t"
10181         "adds   x9, x9, x5\n\t"
10182         "str    x9, [%[a], 344]\n\t"
10183         "adc    x4, x4, xzr\n\t"
10184         "# a[i+44] += m[44] * mu\n\t"
10185         "ldr        x7, [%[m], 352]\n\t"
10186         "ldr    x9, [%[a], 352]\n\t"
10187         "mul        x6, x7, x8\n\t"
10188         "umulh  x7, x7, x8\n\t"
10189         "adds   x9, x9, x6\n\t"
10190         "adc    x5, x7, xzr\n\t"
10191         "adds   x9, x9, x4\n\t"
10192         "str    x9, [%[a], 352]\n\t"
10193         "adc    x5, x5, xzr\n\t"
10194         "# a[i+45] += m[45] * mu\n\t"
10195         "ldr        x7, [%[m], 360]\n\t"
10196         "ldr    x9, [%[a], 360]\n\t"
10197         "mul        x6, x7, x8\n\t"
10198         "umulh  x7, x7, x8\n\t"
10199         "adds   x9, x9, x6\n\t"
10200         "adc    x4, x7, xzr\n\t"
10201         "adds   x9, x9, x5\n\t"
10202         "str    x9, [%[a], 360]\n\t"
10203         "adc    x4, x4, xzr\n\t"
10204         "# a[i+46] += m[46] * mu\n\t"
10205         "ldr        x7, [%[m], 368]\n\t"
10206         "ldr    x9, [%[a], 368]\n\t"
10207         "mul        x6, x7, x8\n\t"
10208         "umulh  x7, x7, x8\n\t"
10209         "adds   x9, x9, x6\n\t"
10210         "adc    x5, x7, xzr\n\t"
10211         "adds   x9, x9, x4\n\t"
10212         "str    x9, [%[a], 368]\n\t"
10213         "adc    x5, x5, xzr\n\t"
10214         "# a[i+47] += m[47] * mu\n\t"
10215         "ldr    x7, [%[m], 376]\n\t"
10216         "ldr    x9, [%[a], 376]\n\t"
10217         "mul    x6, x7, x8\n\t"
10218         "umulh  x7, x7, x8\n\t"
10219         "adds   x5, x5, x6\n\t"
10220         "adcs   x7, x7, %[ca]\n\t"
10221         "cset  %[ca], cs\n\t"
10222         "adds   x9, x9, x5\n\t"
10223         "str    x9, [%[a], 376]\n\t"
10224         "ldr    x9, [%[a], 384]\n\t"
10225         "adcs   x9, x9, x7\n\t"
10226         "str    x9, [%[a], 384]\n\t"
10227         "adc    %[ca], %[ca], xzr\n\t"
10228         "# i += 1\n\t"
10229         "add    %[a], %[a], 8\n\t"
10230         "add    x3, x3, 8\n\t"
10231         "cmp    x3, 384\n\t"
10232         "blt    1b\n\t"
10233         "str    x10, [%[a], 0]\n\t"
10234         "str    x11, [%[a], 8]\n\t"
10235         : [ca] "+r" (ca), [a] "+r" (a)
10236         : [m] "r" (m), [mp] "r" (mp)
10237         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27"
10238     );
10239 
10240     sp_3072_cond_sub_48(a - 48, a, m, (sp_digit)0 - ca);
10241 }
10242 
10243 /* Multiply two Montogmery form numbers mod the modulus (prime).
10244  * (r = a * b mod m)
10245  *
10246  * r   Result of multiplication.
10247  * a   First number to multiply in Montogmery form.
10248  * b   Second number to multiply in Montogmery form.
10249  * m   Modulus (prime).
10250  * mp  Montogmery mulitplier.
10251  */
10252 static void sp_3072_mont_mul_48(sp_digit* r, sp_digit* a, sp_digit* b,
10253         sp_digit* m, sp_digit mp)
10254 {
10255     sp_3072_mul_48(r, a, b);
10256     sp_3072_mont_reduce_48(r, m, mp);
10257 }
10258 
10259 /* Square the Montgomery form number. (r = a * a mod m)
10260  *
10261  * r   Result of squaring.
10262  * a   Number to square in Montogmery form.
10263  * m   Modulus (prime).
10264  * mp  Montogmery mulitplier.
10265  */
10266 static void sp_3072_mont_sqr_48(sp_digit* r, sp_digit* a, sp_digit* m,
10267         sp_digit mp)
10268 {
10269     sp_3072_sqr_48(r, a);
10270     sp_3072_mont_reduce_48(r, m, mp);
10271 }
10272 
10273 /* Mul a by digit b into r. (r = a * b)
10274  *
10275  * r  A single precision integer.
10276  * a  A single precision integer.
10277  * b  A single precision digit.
10278  */
10279 static void sp_3072_mul_d_48(sp_digit* r, const sp_digit* a,
10280         const sp_digit b)
10281 {
10282 #ifdef WOLFSSL_SP_SMALL
10283     __asm__ __volatile__ (
10284         "# A[0] * B\n\t"
10285         "ldr    x8, [%[a]]\n\t"
10286         "mul    x5, %[b], x8\n\t"
10287         "umulh  x3, %[b], x8\n\t"
10288         "mov    x4, 0\n\t"
10289         "str    x5, [%[r]]\n\t"
10290         "mov    x5, 0\n\t"
10291         "mov    x9, #8\n\t"
10292         "1:\n\t"
10293         "ldr    x8, [%[a], x9]\n\t"
10294         "mul    x6, %[b], x8\n\t"
10295         "umulh  x7, %[b], x8\n\t"
10296         "adds   x3, x3, x6\n\t"
10297         "adcs   x4, x4, x7\n\t"
10298         "adc    x5, xzr, xzr\n\t"
10299         "str    x3, [%[r], x9]\n\t"
10300         "mov    x3, x4\n\t"
10301         "mov    x4, x5\n\t"
10302         "mov    x5, #0\n\t"
10303         "add    x9, x9, #8\n\t"
10304         "cmp    x9, 384\n\t"
10305         "b.lt   1b\n\t"
10306         "str    x3, [%[r], 384]\n\t"
10307         :
10308         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
10309         : "memory", "x3", "x4", "x5", "x6", "x7", "x8"
10310     );
10311 #else
10312     __asm__ __volatile__ (
10313         "# A[0] * B\n\t"
10314         "ldr    x8, [%[a]]\n\t"
10315         "mul    x3, %[b], x8\n\t"
10316         "umulh  x4, %[b], x8\n\t"
10317         "mov    x5, 0\n\t"
10318         "str    x3, [%[r]]\n\t"
10319         "# A[1] * B\n\t"
10320         "ldr        x8, [%[a], 8]\n\t"
10321         "mov        x3, 0\n\t"
10322         "mul        x6, %[b], x8\n\t"
10323         "umulh  x7, %[b], x8\n\t"
10324         "adds   x4, x4, x6\n\t"
10325         "adcs   x5, x5, x7\n\t"
10326         "adc        x3, xzr, xzr\n\t"
10327         "str        x4, [%[r], 8]\n\t"
10328         "# A[2] * B\n\t"
10329         "ldr        x8, [%[a], 16]\n\t"
10330         "mov        x4, 0\n\t"
10331         "mul        x6, %[b], x8\n\t"
10332         "umulh  x7, %[b], x8\n\t"
10333         "adds   x5, x5, x6\n\t"
10334         "adcs   x3, x3, x7\n\t"
10335         "adc        x4, xzr, xzr\n\t"
10336         "str        x5, [%[r], 16]\n\t"
10337         "# A[3] * B\n\t"
10338         "ldr        x8, [%[a], 24]\n\t"
10339         "mov        x5, 0\n\t"
10340         "mul        x6, %[b], x8\n\t"
10341         "umulh  x7, %[b], x8\n\t"
10342         "adds   x3, x3, x6\n\t"
10343         "adcs   x4, x4, x7\n\t"
10344         "adc        x5, xzr, xzr\n\t"
10345         "str        x3, [%[r], 24]\n\t"
10346         "# A[4] * B\n\t"
10347         "ldr        x8, [%[a], 32]\n\t"
10348         "mov        x3, 0\n\t"
10349         "mul        x6, %[b], x8\n\t"
10350         "umulh  x7, %[b], x8\n\t"
10351         "adds   x4, x4, x6\n\t"
10352         "adcs   x5, x5, x7\n\t"
10353         "adc        x3, xzr, xzr\n\t"
10354         "str        x4, [%[r], 32]\n\t"
10355         "# A[5] * B\n\t"
10356         "ldr        x8, [%[a], 40]\n\t"
10357         "mov        x4, 0\n\t"
10358         "mul        x6, %[b], x8\n\t"
10359         "umulh  x7, %[b], x8\n\t"
10360         "adds   x5, x5, x6\n\t"
10361         "adcs   x3, x3, x7\n\t"
10362         "adc        x4, xzr, xzr\n\t"
10363         "str        x5, [%[r], 40]\n\t"
10364         "# A[6] * B\n\t"
10365         "ldr        x8, [%[a], 48]\n\t"
10366         "mov        x5, 0\n\t"
10367         "mul        x6, %[b], x8\n\t"
10368         "umulh  x7, %[b], x8\n\t"
10369         "adds   x3, x3, x6\n\t"
10370         "adcs   x4, x4, x7\n\t"
10371         "adc        x5, xzr, xzr\n\t"
10372         "str        x3, [%[r], 48]\n\t"
10373         "# A[7] * B\n\t"
10374         "ldr        x8, [%[a], 56]\n\t"
10375         "mov        x3, 0\n\t"
10376         "mul        x6, %[b], x8\n\t"
10377         "umulh  x7, %[b], x8\n\t"
10378         "adds   x4, x4, x6\n\t"
10379         "adcs   x5, x5, x7\n\t"
10380         "adc        x3, xzr, xzr\n\t"
10381         "str        x4, [%[r], 56]\n\t"
10382         "# A[8] * B\n\t"
10383         "ldr        x8, [%[a], 64]\n\t"
10384         "mov        x4, 0\n\t"
10385         "mul        x6, %[b], x8\n\t"
10386         "umulh  x7, %[b], x8\n\t"
10387         "adds   x5, x5, x6\n\t"
10388         "adcs   x3, x3, x7\n\t"
10389         "adc        x4, xzr, xzr\n\t"
10390         "str        x5, [%[r], 64]\n\t"
10391         "# A[9] * B\n\t"
10392         "ldr        x8, [%[a], 72]\n\t"
10393         "mov        x5, 0\n\t"
10394         "mul        x6, %[b], x8\n\t"
10395         "umulh  x7, %[b], x8\n\t"
10396         "adds   x3, x3, x6\n\t"
10397         "adcs   x4, x4, x7\n\t"
10398         "adc        x5, xzr, xzr\n\t"
10399         "str        x3, [%[r], 72]\n\t"
10400         "# A[10] * B\n\t"
10401         "ldr        x8, [%[a], 80]\n\t"
10402         "mov        x3, 0\n\t"
10403         "mul        x6, %[b], x8\n\t"
10404         "umulh  x7, %[b], x8\n\t"
10405         "adds   x4, x4, x6\n\t"
10406         "adcs   x5, x5, x7\n\t"
10407         "adc        x3, xzr, xzr\n\t"
10408         "str        x4, [%[r], 80]\n\t"
10409         "# A[11] * B\n\t"
10410         "ldr        x8, [%[a], 88]\n\t"
10411         "mov        x4, 0\n\t"
10412         "mul        x6, %[b], x8\n\t"
10413         "umulh  x7, %[b], x8\n\t"
10414         "adds   x5, x5, x6\n\t"
10415         "adcs   x3, x3, x7\n\t"
10416         "adc        x4, xzr, xzr\n\t"
10417         "str        x5, [%[r], 88]\n\t"
10418         "# A[12] * B\n\t"
10419         "ldr        x8, [%[a], 96]\n\t"
10420         "mov        x5, 0\n\t"
10421         "mul        x6, %[b], x8\n\t"
10422         "umulh  x7, %[b], x8\n\t"
10423         "adds   x3, x3, x6\n\t"
10424         "adcs   x4, x4, x7\n\t"
10425         "adc        x5, xzr, xzr\n\t"
10426         "str        x3, [%[r], 96]\n\t"
10427         "# A[13] * B\n\t"
10428         "ldr        x8, [%[a], 104]\n\t"
10429         "mov        x3, 0\n\t"
10430         "mul        x6, %[b], x8\n\t"
10431         "umulh  x7, %[b], x8\n\t"
10432         "adds   x4, x4, x6\n\t"
10433         "adcs   x5, x5, x7\n\t"
10434         "adc        x3, xzr, xzr\n\t"
10435         "str        x4, [%[r], 104]\n\t"
10436         "# A[14] * B\n\t"
10437         "ldr        x8, [%[a], 112]\n\t"
10438         "mov        x4, 0\n\t"
10439         "mul        x6, %[b], x8\n\t"
10440         "umulh  x7, %[b], x8\n\t"
10441         "adds   x5, x5, x6\n\t"
10442         "adcs   x3, x3, x7\n\t"
10443         "adc        x4, xzr, xzr\n\t"
10444         "str        x5, [%[r], 112]\n\t"
10445         "# A[15] * B\n\t"
10446         "ldr        x8, [%[a], 120]\n\t"
10447         "mov        x5, 0\n\t"
10448         "mul        x6, %[b], x8\n\t"
10449         "umulh  x7, %[b], x8\n\t"
10450         "adds   x3, x3, x6\n\t"
10451         "adcs   x4, x4, x7\n\t"
10452         "adc        x5, xzr, xzr\n\t"
10453         "str        x3, [%[r], 120]\n\t"
10454         "# A[16] * B\n\t"
10455         "ldr        x8, [%[a], 128]\n\t"
10456         "mov        x3, 0\n\t"
10457         "mul        x6, %[b], x8\n\t"
10458         "umulh  x7, %[b], x8\n\t"
10459         "adds   x4, x4, x6\n\t"
10460         "adcs   x5, x5, x7\n\t"
10461         "adc        x3, xzr, xzr\n\t"
10462         "str        x4, [%[r], 128]\n\t"
10463         "# A[17] * B\n\t"
10464         "ldr        x8, [%[a], 136]\n\t"
10465         "mov        x4, 0\n\t"
10466         "mul        x6, %[b], x8\n\t"
10467         "umulh  x7, %[b], x8\n\t"
10468         "adds   x5, x5, x6\n\t"
10469         "adcs   x3, x3, x7\n\t"
10470         "adc        x4, xzr, xzr\n\t"
10471         "str        x5, [%[r], 136]\n\t"
10472         "# A[18] * B\n\t"
10473         "ldr        x8, [%[a], 144]\n\t"
10474         "mov        x5, 0\n\t"
10475         "mul        x6, %[b], x8\n\t"
10476         "umulh  x7, %[b], x8\n\t"
10477         "adds   x3, x3, x6\n\t"
10478         "adcs   x4, x4, x7\n\t"
10479         "adc        x5, xzr, xzr\n\t"
10480         "str        x3, [%[r], 144]\n\t"
10481         "# A[19] * B\n\t"
10482         "ldr        x8, [%[a], 152]\n\t"
10483         "mov        x3, 0\n\t"
10484         "mul        x6, %[b], x8\n\t"
10485         "umulh  x7, %[b], x8\n\t"
10486         "adds   x4, x4, x6\n\t"
10487         "adcs   x5, x5, x7\n\t"
10488         "adc        x3, xzr, xzr\n\t"
10489         "str        x4, [%[r], 152]\n\t"
10490         "# A[20] * B\n\t"
10491         "ldr        x8, [%[a], 160]\n\t"
10492         "mov        x4, 0\n\t"
10493         "mul        x6, %[b], x8\n\t"
10494         "umulh  x7, %[b], x8\n\t"
10495         "adds   x5, x5, x6\n\t"
10496         "adcs   x3, x3, x7\n\t"
10497         "adc        x4, xzr, xzr\n\t"
10498         "str        x5, [%[r], 160]\n\t"
10499         "# A[21] * B\n\t"
10500         "ldr        x8, [%[a], 168]\n\t"
10501         "mov        x5, 0\n\t"
10502         "mul        x6, %[b], x8\n\t"
10503         "umulh  x7, %[b], x8\n\t"
10504         "adds   x3, x3, x6\n\t"
10505         "adcs   x4, x4, x7\n\t"
10506         "adc        x5, xzr, xzr\n\t"
10507         "str        x3, [%[r], 168]\n\t"
10508         "# A[22] * B\n\t"
10509         "ldr        x8, [%[a], 176]\n\t"
10510         "mov        x3, 0\n\t"
10511         "mul        x6, %[b], x8\n\t"
10512         "umulh  x7, %[b], x8\n\t"
10513         "adds   x4, x4, x6\n\t"
10514         "adcs   x5, x5, x7\n\t"
10515         "adc        x3, xzr, xzr\n\t"
10516         "str        x4, [%[r], 176]\n\t"
10517         "# A[23] * B\n\t"
10518         "ldr        x8, [%[a], 184]\n\t"
10519         "mov        x4, 0\n\t"
10520         "mul        x6, %[b], x8\n\t"
10521         "umulh  x7, %[b], x8\n\t"
10522         "adds   x5, x5, x6\n\t"
10523         "adcs   x3, x3, x7\n\t"
10524         "adc        x4, xzr, xzr\n\t"
10525         "str        x5, [%[r], 184]\n\t"
10526         "# A[24] * B\n\t"
10527         "ldr        x8, [%[a], 192]\n\t"
10528         "mov        x5, 0\n\t"
10529         "mul        x6, %[b], x8\n\t"
10530         "umulh  x7, %[b], x8\n\t"
10531         "adds   x3, x3, x6\n\t"
10532         "adcs   x4, x4, x7\n\t"
10533         "adc        x5, xzr, xzr\n\t"
10534         "str        x3, [%[r], 192]\n\t"
10535         "# A[25] * B\n\t"
10536         "ldr        x8, [%[a], 200]\n\t"
10537         "mov        x3, 0\n\t"
10538         "mul        x6, %[b], x8\n\t"
10539         "umulh  x7, %[b], x8\n\t"
10540         "adds   x4, x4, x6\n\t"
10541         "adcs   x5, x5, x7\n\t"
10542         "adc        x3, xzr, xzr\n\t"
10543         "str        x4, [%[r], 200]\n\t"
10544         "# A[26] * B\n\t"
10545         "ldr        x8, [%[a], 208]\n\t"
10546         "mov        x4, 0\n\t"
10547         "mul        x6, %[b], x8\n\t"
10548         "umulh  x7, %[b], x8\n\t"
10549         "adds   x5, x5, x6\n\t"
10550         "adcs   x3, x3, x7\n\t"
10551         "adc        x4, xzr, xzr\n\t"
10552         "str        x5, [%[r], 208]\n\t"
10553         "# A[27] * B\n\t"
10554         "ldr        x8, [%[a], 216]\n\t"
10555         "mov        x5, 0\n\t"
10556         "mul        x6, %[b], x8\n\t"
10557         "umulh  x7, %[b], x8\n\t"
10558         "adds   x3, x3, x6\n\t"
10559         "adcs   x4, x4, x7\n\t"
10560         "adc        x5, xzr, xzr\n\t"
10561         "str        x3, [%[r], 216]\n\t"
10562         "# A[28] * B\n\t"
10563         "ldr        x8, [%[a], 224]\n\t"
10564         "mov        x3, 0\n\t"
10565         "mul        x6, %[b], x8\n\t"
10566         "umulh  x7, %[b], x8\n\t"
10567         "adds   x4, x4, x6\n\t"
10568         "adcs   x5, x5, x7\n\t"
10569         "adc        x3, xzr, xzr\n\t"
10570         "str        x4, [%[r], 224]\n\t"
10571         "# A[29] * B\n\t"
10572         "ldr        x8, [%[a], 232]\n\t"
10573         "mov        x4, 0\n\t"
10574         "mul        x6, %[b], x8\n\t"
10575         "umulh  x7, %[b], x8\n\t"
10576         "adds   x5, x5, x6\n\t"
10577         "adcs   x3, x3, x7\n\t"
10578         "adc        x4, xzr, xzr\n\t"
10579         "str        x5, [%[r], 232]\n\t"
10580         "# A[30] * B\n\t"
10581         "ldr        x8, [%[a], 240]\n\t"
10582         "mov        x5, 0\n\t"
10583         "mul        x6, %[b], x8\n\t"
10584         "umulh  x7, %[b], x8\n\t"
10585         "adds   x3, x3, x6\n\t"
10586         "adcs   x4, x4, x7\n\t"
10587         "adc        x5, xzr, xzr\n\t"
10588         "str        x3, [%[r], 240]\n\t"
10589         "# A[31] * B\n\t"
10590         "ldr        x8, [%[a], 248]\n\t"
10591         "mov        x3, 0\n\t"
10592         "mul        x6, %[b], x8\n\t"
10593         "umulh  x7, %[b], x8\n\t"
10594         "adds   x4, x4, x6\n\t"
10595         "adcs   x5, x5, x7\n\t"
10596         "adc        x3, xzr, xzr\n\t"
10597         "str        x4, [%[r], 248]\n\t"
10598         "# A[32] * B\n\t"
10599         "ldr        x8, [%[a], 256]\n\t"
10600         "mov        x4, 0\n\t"
10601         "mul        x6, %[b], x8\n\t"
10602         "umulh  x7, %[b], x8\n\t"
10603         "adds   x5, x5, x6\n\t"
10604         "adcs   x3, x3, x7\n\t"
10605         "adc        x4, xzr, xzr\n\t"
10606         "str        x5, [%[r], 256]\n\t"
10607         "# A[33] * B\n\t"
10608         "ldr        x8, [%[a], 264]\n\t"
10609         "mov        x5, 0\n\t"
10610         "mul        x6, %[b], x8\n\t"
10611         "umulh  x7, %[b], x8\n\t"
10612         "adds   x3, x3, x6\n\t"
10613         "adcs   x4, x4, x7\n\t"
10614         "adc        x5, xzr, xzr\n\t"
10615         "str        x3, [%[r], 264]\n\t"
10616         "# A[34] * B\n\t"
10617         "ldr        x8, [%[a], 272]\n\t"
10618         "mov        x3, 0\n\t"
10619         "mul        x6, %[b], x8\n\t"
10620         "umulh  x7, %[b], x8\n\t"
10621         "adds   x4, x4, x6\n\t"
10622         "adcs   x5, x5, x7\n\t"
10623         "adc        x3, xzr, xzr\n\t"
10624         "str        x4, [%[r], 272]\n\t"
10625         "# A[35] * B\n\t"
10626         "ldr        x8, [%[a], 280]\n\t"
10627         "mov        x4, 0\n\t"
10628         "mul        x6, %[b], x8\n\t"
10629         "umulh  x7, %[b], x8\n\t"
10630         "adds   x5, x5, x6\n\t"
10631         "adcs   x3, x3, x7\n\t"
10632         "adc        x4, xzr, xzr\n\t"
10633         "str        x5, [%[r], 280]\n\t"
10634         "# A[36] * B\n\t"
10635         "ldr        x8, [%[a], 288]\n\t"
10636         "mov        x5, 0\n\t"
10637         "mul        x6, %[b], x8\n\t"
10638         "umulh  x7, %[b], x8\n\t"
10639         "adds   x3, x3, x6\n\t"
10640         "adcs   x4, x4, x7\n\t"
10641         "adc        x5, xzr, xzr\n\t"
10642         "str        x3, [%[r], 288]\n\t"
10643         "# A[37] * B\n\t"
10644         "ldr        x8, [%[a], 296]\n\t"
10645         "mov        x3, 0\n\t"
10646         "mul        x6, %[b], x8\n\t"
10647         "umulh  x7, %[b], x8\n\t"
10648         "adds   x4, x4, x6\n\t"
10649         "adcs   x5, x5, x7\n\t"
10650         "adc        x3, xzr, xzr\n\t"
10651         "str        x4, [%[r], 296]\n\t"
10652         "# A[38] * B\n\t"
10653         "ldr        x8, [%[a], 304]\n\t"
10654         "mov        x4, 0\n\t"
10655         "mul        x6, %[b], x8\n\t"
10656         "umulh  x7, %[b], x8\n\t"
10657         "adds   x5, x5, x6\n\t"
10658         "adcs   x3, x3, x7\n\t"
10659         "adc        x4, xzr, xzr\n\t"
10660         "str        x5, [%[r], 304]\n\t"
10661         "# A[39] * B\n\t"
10662         "ldr        x8, [%[a], 312]\n\t"
10663         "mov        x5, 0\n\t"
10664         "mul        x6, %[b], x8\n\t"
10665         "umulh  x7, %[b], x8\n\t"
10666         "adds   x3, x3, x6\n\t"
10667         "adcs   x4, x4, x7\n\t"
10668         "adc        x5, xzr, xzr\n\t"
10669         "str        x3, [%[r], 312]\n\t"
10670         "# A[40] * B\n\t"
10671         "ldr        x8, [%[a], 320]\n\t"
10672         "mov        x3, 0\n\t"
10673         "mul        x6, %[b], x8\n\t"
10674         "umulh  x7, %[b], x8\n\t"
10675         "adds   x4, x4, x6\n\t"
10676         "adcs   x5, x5, x7\n\t"
10677         "adc        x3, xzr, xzr\n\t"
10678         "str        x4, [%[r], 320]\n\t"
10679         "# A[41] * B\n\t"
10680         "ldr        x8, [%[a], 328]\n\t"
10681         "mov        x4, 0\n\t"
10682         "mul        x6, %[b], x8\n\t"
10683         "umulh  x7, %[b], x8\n\t"
10684         "adds   x5, x5, x6\n\t"
10685         "adcs   x3, x3, x7\n\t"
10686         "adc        x4, xzr, xzr\n\t"
10687         "str        x5, [%[r], 328]\n\t"
10688         "# A[42] * B\n\t"
10689         "ldr        x8, [%[a], 336]\n\t"
10690         "mov        x5, 0\n\t"
10691         "mul        x6, %[b], x8\n\t"
10692         "umulh  x7, %[b], x8\n\t"
10693         "adds   x3, x3, x6\n\t"
10694         "adcs   x4, x4, x7\n\t"
10695         "adc        x5, xzr, xzr\n\t"
10696         "str        x3, [%[r], 336]\n\t"
10697         "# A[43] * B\n\t"
10698         "ldr        x8, [%[a], 344]\n\t"
10699         "mov        x3, 0\n\t"
10700         "mul        x6, %[b], x8\n\t"
10701         "umulh  x7, %[b], x8\n\t"
10702         "adds   x4, x4, x6\n\t"
10703         "adcs   x5, x5, x7\n\t"
10704         "adc        x3, xzr, xzr\n\t"
10705         "str        x4, [%[r], 344]\n\t"
10706         "# A[44] * B\n\t"
10707         "ldr        x8, [%[a], 352]\n\t"
10708         "mov        x4, 0\n\t"
10709         "mul        x6, %[b], x8\n\t"
10710         "umulh  x7, %[b], x8\n\t"
10711         "adds   x5, x5, x6\n\t"
10712         "adcs   x3, x3, x7\n\t"
10713         "adc        x4, xzr, xzr\n\t"
10714         "str        x5, [%[r], 352]\n\t"
10715         "# A[45] * B\n\t"
10716         "ldr        x8, [%[a], 360]\n\t"
10717         "mov        x5, 0\n\t"
10718         "mul        x6, %[b], x8\n\t"
10719         "umulh  x7, %[b], x8\n\t"
10720         "adds   x3, x3, x6\n\t"
10721         "adcs   x4, x4, x7\n\t"
10722         "adc        x5, xzr, xzr\n\t"
10723         "str        x3, [%[r], 360]\n\t"
10724         "# A[46] * B\n\t"
10725         "ldr        x8, [%[a], 368]\n\t"
10726         "mov        x3, 0\n\t"
10727         "mul        x6, %[b], x8\n\t"
10728         "umulh  x7, %[b], x8\n\t"
10729         "adds   x4, x4, x6\n\t"
10730         "adcs   x5, x5, x7\n\t"
10731         "adc        x3, xzr, xzr\n\t"
10732         "str        x4, [%[r], 368]\n\t"
10733         "# A[47] * B\n\t"
10734         "ldr    x8, [%[a], 376]\n\t"
10735         "mul    x6, %[b], x8\n\t"
10736         "umulh  x7, %[b], x8\n\t"
10737         "adds   x5, x5, x6\n\t"
10738         "adc    x3, x3, x7\n\t"
10739         "str    x5, [%[r], 376]\n\t"
10740         "str    x3, [%[r], 384]\n\t"
10741         :
10742         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
10743         : "memory", "x3", "x4", "x5", "x6", "x7", "x8"
10744     );
10745 #endif
10746 }
10747 
10748 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
10749  *
10750  * d1   The high order half of the number to divide.
10751  * d0   The low order half of the number to divide.
10752  * div  The dividend.
10753  * returns the result of the division.
10754  */
10755 static sp_digit div_3072_word_48(sp_digit d1, sp_digit d0, sp_digit div)
10756 {
10757     sp_digit r;
10758 
10759     __asm__ __volatile__ (
10760         "lsr    x5, %[div], 32\n\t"
10761         "add    x5, x5, 1\n\t"
10762 
10763         "udiv   x3, %[d1], x5\n\t"
10764         "lsl    x6, x3, 32\n\t"
10765         "mul    x4, %[div], x6\n\t"
10766         "umulh  x3, %[div], x6\n\t"
10767         "subs   %[d0], %[d0], x4\n\t"
10768         "sbc    %[d1], %[d1], x3\n\t"
10769 
10770         "udiv   x3, %[d1], x5\n\t"
10771         "lsl    x3, x3, 32\n\t"
10772         "add    x6, x6, x3\n\t"
10773         "mul    x4, %[div], x3\n\t"
10774         "umulh  x3, %[div], x3\n\t"
10775         "subs   %[d0], %[d0], x4\n\t"
10776         "sbc    %[d1], %[d1], x3\n\t"
10777 
10778         "lsl    x3, %[d1], 32\n\t"
10779         "orr    x3, x3, %[d0], lsr 32\n\t"
10780 
10781         "udiv   x3, x3, x5\n\t"
10782         "add    x6, x6, x3\n\t"
10783         "mul    x4, %[div], x3\n\t"
10784         "umulh  x3, %[div], x3\n\t"
10785         "subs   %[d0], %[d0], x4\n\t"
10786         "sbc    %[d1], %[d1], x3\n\t"
10787 
10788         "lsl    x3, %[d1], 32\n\t"
10789         "orr    x3, x3, %[d0], lsr 32\n\t"
10790 
10791         "udiv   x3, x3, x5\n\t"
10792         "add    x6, x6, x3\n\t"
10793         "mul    x4, %[div], x3\n\t"
10794         "umulh  x3, %[div], x3\n\t"
10795         "subs   %[d0], %[d0], x4\n\t"
10796         "sbc    %[d1], %[d1], x3\n\t"
10797 
10798         "udiv   x3, %[d0], %[div]\n\t"
10799         "add    x6, x6, x3\n\t"
10800         "mul    x3, %[div], x3\n\t"
10801         "sub    %[d0], %[d0], x3\n\t"
10802         "mov    %[r], x6\n\t"
10803 
10804         : [r] "=r" (r)
10805         : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div)
10806         : "x3", "x4", "x5", "x6"
10807     );
10808 
10809     return r;
10810 }
10811 
10812 /* AND m into each word of a and store in r.
10813  *
10814  * r  A single precision integer.
10815  * a  A single precision integer.
10816  * m  Mask to AND against each digit.
10817  */
10818 static void sp_3072_mask_48(sp_digit* r, sp_digit* a, sp_digit m)
10819 {
10820 #ifdef WOLFSSL_SP_SMALL
10821     int i;
10822 
10823     for (i=0; i<48; i++)
10824         r[i] = a[i] & m;
10825 #else
10826     int i;
10827 
10828     for (i = 0; i < 48; i += 8) {
10829         r[i+0] = a[i+0] & m;
10830         r[i+1] = a[i+1] & m;
10831         r[i+2] = a[i+2] & m;
10832         r[i+3] = a[i+3] & m;
10833         r[i+4] = a[i+4] & m;
10834         r[i+5] = a[i+5] & m;
10835         r[i+6] = a[i+6] & m;
10836         r[i+7] = a[i+7] & m;
10837     }
10838 #endif
10839 }
10840 
10841 /* Compare a with b in constant time.
10842  *
10843  * a  A single precision integer.
10844  * b  A single precision integer.
10845  * return -ve, 0 or +ve if a is less than, equal to or greater than b
10846  * respectively.
10847  */
10848 static int64_t sp_3072_cmp_48(sp_digit* a, sp_digit* b)
10849 {
10850     sp_digit r = -1;
10851     sp_digit one = 1;
10852 
10853 #ifdef WOLFSSL_SP_SMALL
10854     __asm__ __volatile__ (
10855         "mov    x3, -1\n\t"
10856         "mov    x6, 376\n\t"
10857         "1:\n\t"
10858         "ldr    x4, [%[a], x6]\n\t"
10859         "ldr    x5, [%[b], x6]\n\t"
10860         "and    x4, x4, x3\n\t"
10861         "and    x5, x5, x3\n\t"
10862         "subs   x4, x4, x5\n\t"
10863         "csel   %[r], %[one], %[r], hi\n\t"
10864         "csel   %[r], x3, %[r], lo\n\t"
10865         "csel   x3, x3, xzr, eq\n\t"
10866         "sub    x6, x6, #8\n\t"
10867         "b.cc   1b\n\t"
10868         "eor    %[r], %[r], x3\n\t"
10869         : [r] "+r" (r)
10870         : [a] "r" (a), [b] "r" (b), [one] "r" (one)
10871         : "x2", "x3", "x4", "x5", "x6"
10872     );
10873 #else
10874     __asm__ __volatile__ (
10875         "mov    x3, -1\n\t"
10876         "ldr        x4, [%[a], 376]\n\t"
10877         "ldr        x5, [%[b], 376]\n\t"
10878         "and        x4, x4, x3\n\t"
10879         "and        x5, x5, x3\n\t"
10880         "subs   x4, x4, x5\n\t"
10881         "csel   %[r], %[one], %[r], hi\n\t"
10882         "csel   %[r], x3, %[r], lo\n\t"
10883         "csel   x3, x3, xzr, eq\n\t"
10884         "ldr        x4, [%[a], 368]\n\t"
10885         "ldr        x5, [%[b], 368]\n\t"
10886         "and        x4, x4, x3\n\t"
10887         "and        x5, x5, x3\n\t"
10888         "subs   x4, x4, x5\n\t"
10889         "csel   %[r], %[one], %[r], hi\n\t"
10890         "csel   %[r], x3, %[r], lo\n\t"
10891         "csel   x3, x3, xzr, eq\n\t"
10892         "ldr        x4, [%[a], 360]\n\t"
10893         "ldr        x5, [%[b], 360]\n\t"
10894         "and        x4, x4, x3\n\t"
10895         "and        x5, x5, x3\n\t"
10896         "subs   x4, x4, x5\n\t"
10897         "csel   %[r], %[one], %[r], hi\n\t"
10898         "csel   %[r], x3, %[r], lo\n\t"
10899         "csel   x3, x3, xzr, eq\n\t"
10900         "ldr        x4, [%[a], 352]\n\t"
10901         "ldr        x5, [%[b], 352]\n\t"
10902         "and        x4, x4, x3\n\t"
10903         "and        x5, x5, x3\n\t"
10904         "subs   x4, x4, x5\n\t"
10905         "csel   %[r], %[one], %[r], hi\n\t"
10906         "csel   %[r], x3, %[r], lo\n\t"
10907         "csel   x3, x3, xzr, eq\n\t"
10908         "ldr        x4, [%[a], 344]\n\t"
10909         "ldr        x5, [%[b], 344]\n\t"
10910         "and        x4, x4, x3\n\t"
10911         "and        x5, x5, x3\n\t"
10912         "subs   x4, x4, x5\n\t"
10913         "csel   %[r], %[one], %[r], hi\n\t"
10914         "csel   %[r], x3, %[r], lo\n\t"
10915         "csel   x3, x3, xzr, eq\n\t"
10916         "ldr        x4, [%[a], 336]\n\t"
10917         "ldr        x5, [%[b], 336]\n\t"
10918         "and        x4, x4, x3\n\t"
10919         "and        x5, x5, x3\n\t"
10920         "subs   x4, x4, x5\n\t"
10921         "csel   %[r], %[one], %[r], hi\n\t"
10922         "csel   %[r], x3, %[r], lo\n\t"
10923         "csel   x3, x3, xzr, eq\n\t"
10924         "ldr        x4, [%[a], 328]\n\t"
10925         "ldr        x5, [%[b], 328]\n\t"
10926         "and        x4, x4, x3\n\t"
10927         "and        x5, x5, x3\n\t"
10928         "subs   x4, x4, x5\n\t"
10929         "csel   %[r], %[one], %[r], hi\n\t"
10930         "csel   %[r], x3, %[r], lo\n\t"
10931         "csel   x3, x3, xzr, eq\n\t"
10932         "ldr        x4, [%[a], 320]\n\t"
10933         "ldr        x5, [%[b], 320]\n\t"
10934         "and        x4, x4, x3\n\t"
10935         "and        x5, x5, x3\n\t"
10936         "subs   x4, x4, x5\n\t"
10937         "csel   %[r], %[one], %[r], hi\n\t"
10938         "csel   %[r], x3, %[r], lo\n\t"
10939         "csel   x3, x3, xzr, eq\n\t"
10940         "ldr        x4, [%[a], 312]\n\t"
10941         "ldr        x5, [%[b], 312]\n\t"
10942         "and        x4, x4, x3\n\t"
10943         "and        x5, x5, x3\n\t"
10944         "subs   x4, x4, x5\n\t"
10945         "csel   %[r], %[one], %[r], hi\n\t"
10946         "csel   %[r], x3, %[r], lo\n\t"
10947         "csel   x3, x3, xzr, eq\n\t"
10948         "ldr        x4, [%[a], 304]\n\t"
10949         "ldr        x5, [%[b], 304]\n\t"
10950         "and        x4, x4, x3\n\t"
10951         "and        x5, x5, x3\n\t"
10952         "subs   x4, x4, x5\n\t"
10953         "csel   %[r], %[one], %[r], hi\n\t"
10954         "csel   %[r], x3, %[r], lo\n\t"
10955         "csel   x3, x3, xzr, eq\n\t"
10956         "ldr        x4, [%[a], 296]\n\t"
10957         "ldr        x5, [%[b], 296]\n\t"
10958         "and        x4, x4, x3\n\t"
10959         "and        x5, x5, x3\n\t"
10960         "subs   x4, x4, x5\n\t"
10961         "csel   %[r], %[one], %[r], hi\n\t"
10962         "csel   %[r], x3, %[r], lo\n\t"
10963         "csel   x3, x3, xzr, eq\n\t"
10964         "ldr        x4, [%[a], 288]\n\t"
10965         "ldr        x5, [%[b], 288]\n\t"
10966         "and        x4, x4, x3\n\t"
10967         "and        x5, x5, x3\n\t"
10968         "subs   x4, x4, x5\n\t"
10969         "csel   %[r], %[one], %[r], hi\n\t"
10970         "csel   %[r], x3, %[r], lo\n\t"
10971         "csel   x3, x3, xzr, eq\n\t"
10972         "ldr        x4, [%[a], 280]\n\t"
10973         "ldr        x5, [%[b], 280]\n\t"
10974         "and        x4, x4, x3\n\t"
10975         "and        x5, x5, x3\n\t"
10976         "subs   x4, x4, x5\n\t"
10977         "csel   %[r], %[one], %[r], hi\n\t"
10978         "csel   %[r], x3, %[r], lo\n\t"
10979         "csel   x3, x3, xzr, eq\n\t"
10980         "ldr        x4, [%[a], 272]\n\t"
10981         "ldr        x5, [%[b], 272]\n\t"
10982         "and        x4, x4, x3\n\t"
10983         "and        x5, x5, x3\n\t"
10984         "subs   x4, x4, x5\n\t"
10985         "csel   %[r], %[one], %[r], hi\n\t"
10986         "csel   %[r], x3, %[r], lo\n\t"
10987         "csel   x3, x3, xzr, eq\n\t"
10988         "ldr        x4, [%[a], 264]\n\t"
10989         "ldr        x5, [%[b], 264]\n\t"
10990         "and        x4, x4, x3\n\t"
10991         "and        x5, x5, x3\n\t"
10992         "subs   x4, x4, x5\n\t"
10993         "csel   %[r], %[one], %[r], hi\n\t"
10994         "csel   %[r], x3, %[r], lo\n\t"
10995         "csel   x3, x3, xzr, eq\n\t"
10996         "ldr        x4, [%[a], 256]\n\t"
10997         "ldr        x5, [%[b], 256]\n\t"
10998         "and        x4, x4, x3\n\t"
10999         "and        x5, x5, x3\n\t"
11000         "subs   x4, x4, x5\n\t"
11001         "csel   %[r], %[one], %[r], hi\n\t"
11002         "csel   %[r], x3, %[r], lo\n\t"
11003         "csel   x3, x3, xzr, eq\n\t"
11004         "ldr        x4, [%[a], 248]\n\t"
11005         "ldr        x5, [%[b], 248]\n\t"
11006         "and        x4, x4, x3\n\t"
11007         "and        x5, x5, x3\n\t"
11008         "subs   x4, x4, x5\n\t"
11009         "csel   %[r], %[one], %[r], hi\n\t"
11010         "csel   %[r], x3, %[r], lo\n\t"
11011         "csel   x3, x3, xzr, eq\n\t"
11012         "ldr        x4, [%[a], 240]\n\t"
11013         "ldr        x5, [%[b], 240]\n\t"
11014         "and        x4, x4, x3\n\t"
11015         "and        x5, x5, x3\n\t"
11016         "subs   x4, x4, x5\n\t"
11017         "csel   %[r], %[one], %[r], hi\n\t"
11018         "csel   %[r], x3, %[r], lo\n\t"
11019         "csel   x3, x3, xzr, eq\n\t"
11020         "ldr        x4, [%[a], 232]\n\t"
11021         "ldr        x5, [%[b], 232]\n\t"
11022         "and        x4, x4, x3\n\t"
11023         "and        x5, x5, x3\n\t"
11024         "subs   x4, x4, x5\n\t"
11025         "csel   %[r], %[one], %[r], hi\n\t"
11026         "csel   %[r], x3, %[r], lo\n\t"
11027         "csel   x3, x3, xzr, eq\n\t"
11028         "ldr        x4, [%[a], 224]\n\t"
11029         "ldr        x5, [%[b], 224]\n\t"
11030         "and        x4, x4, x3\n\t"
11031         "and        x5, x5, x3\n\t"
11032         "subs   x4, x4, x5\n\t"
11033         "csel   %[r], %[one], %[r], hi\n\t"
11034         "csel   %[r], x3, %[r], lo\n\t"
11035         "csel   x3, x3, xzr, eq\n\t"
11036         "ldr        x4, [%[a], 216]\n\t"
11037         "ldr        x5, [%[b], 216]\n\t"
11038         "and        x4, x4, x3\n\t"
11039         "and        x5, x5, x3\n\t"
11040         "subs   x4, x4, x5\n\t"
11041         "csel   %[r], %[one], %[r], hi\n\t"
11042         "csel   %[r], x3, %[r], lo\n\t"
11043         "csel   x3, x3, xzr, eq\n\t"
11044         "ldr        x4, [%[a], 208]\n\t"
11045         "ldr        x5, [%[b], 208]\n\t"
11046         "and        x4, x4, x3\n\t"
11047         "and        x5, x5, x3\n\t"
11048         "subs   x4, x4, x5\n\t"
11049         "csel   %[r], %[one], %[r], hi\n\t"
11050         "csel   %[r], x3, %[r], lo\n\t"
11051         "csel   x3, x3, xzr, eq\n\t"
11052         "ldr        x4, [%[a], 200]\n\t"
11053         "ldr        x5, [%[b], 200]\n\t"
11054         "and        x4, x4, x3\n\t"
11055         "and        x5, x5, x3\n\t"
11056         "subs   x4, x4, x5\n\t"
11057         "csel   %[r], %[one], %[r], hi\n\t"
11058         "csel   %[r], x3, %[r], lo\n\t"
11059         "csel   x3, x3, xzr, eq\n\t"
11060         "ldr        x4, [%[a], 192]\n\t"
11061         "ldr        x5, [%[b], 192]\n\t"
11062         "and        x4, x4, x3\n\t"
11063         "and        x5, x5, x3\n\t"
11064         "subs   x4, x4, x5\n\t"
11065         "csel   %[r], %[one], %[r], hi\n\t"
11066         "csel   %[r], x3, %[r], lo\n\t"
11067         "csel   x3, x3, xzr, eq\n\t"
11068         "ldr        x4, [%[a], 184]\n\t"
11069         "ldr        x5, [%[b], 184]\n\t"
11070         "and        x4, x4, x3\n\t"
11071         "and        x5, x5, x3\n\t"
11072         "subs   x4, x4, x5\n\t"
11073         "csel   %[r], %[one], %[r], hi\n\t"
11074         "csel   %[r], x3, %[r], lo\n\t"
11075         "csel   x3, x3, xzr, eq\n\t"
11076         "ldr        x4, [%[a], 176]\n\t"
11077         "ldr        x5, [%[b], 176]\n\t"
11078         "and        x4, x4, x3\n\t"
11079         "and        x5, x5, x3\n\t"
11080         "subs   x4, x4, x5\n\t"
11081         "csel   %[r], %[one], %[r], hi\n\t"
11082         "csel   %[r], x3, %[r], lo\n\t"
11083         "csel   x3, x3, xzr, eq\n\t"
11084         "ldr        x4, [%[a], 168]\n\t"
11085         "ldr        x5, [%[b], 168]\n\t"
11086         "and        x4, x4, x3\n\t"
11087         "and        x5, x5, x3\n\t"
11088         "subs   x4, x4, x5\n\t"
11089         "csel   %[r], %[one], %[r], hi\n\t"
11090         "csel   %[r], x3, %[r], lo\n\t"
11091         "csel   x3, x3, xzr, eq\n\t"
11092         "ldr        x4, [%[a], 160]\n\t"
11093         "ldr        x5, [%[b], 160]\n\t"
11094         "and        x4, x4, x3\n\t"
11095         "and        x5, x5, x3\n\t"
11096         "subs   x4, x4, x5\n\t"
11097         "csel   %[r], %[one], %[r], hi\n\t"
11098         "csel   %[r], x3, %[r], lo\n\t"
11099         "csel   x3, x3, xzr, eq\n\t"
11100         "ldr        x4, [%[a], 152]\n\t"
11101         "ldr        x5, [%[b], 152]\n\t"
11102         "and        x4, x4, x3\n\t"
11103         "and        x5, x5, x3\n\t"
11104         "subs   x4, x4, x5\n\t"
11105         "csel   %[r], %[one], %[r], hi\n\t"
11106         "csel   %[r], x3, %[r], lo\n\t"
11107         "csel   x3, x3, xzr, eq\n\t"
11108         "ldr        x4, [%[a], 144]\n\t"
11109         "ldr        x5, [%[b], 144]\n\t"
11110         "and        x4, x4, x3\n\t"
11111         "and        x5, x5, x3\n\t"
11112         "subs   x4, x4, x5\n\t"
11113         "csel   %[r], %[one], %[r], hi\n\t"
11114         "csel   %[r], x3, %[r], lo\n\t"
11115         "csel   x3, x3, xzr, eq\n\t"
11116         "ldr        x4, [%[a], 136]\n\t"
11117         "ldr        x5, [%[b], 136]\n\t"
11118         "and        x4, x4, x3\n\t"
11119         "and        x5, x5, x3\n\t"
11120         "subs   x4, x4, x5\n\t"
11121         "csel   %[r], %[one], %[r], hi\n\t"
11122         "csel   %[r], x3, %[r], lo\n\t"
11123         "csel   x3, x3, xzr, eq\n\t"
11124         "ldr        x4, [%[a], 128]\n\t"
11125         "ldr        x5, [%[b], 128]\n\t"
11126         "and        x4, x4, x3\n\t"
11127         "and        x5, x5, x3\n\t"
11128         "subs   x4, x4, x5\n\t"
11129         "csel   %[r], %[one], %[r], hi\n\t"
11130         "csel   %[r], x3, %[r], lo\n\t"
11131         "csel   x3, x3, xzr, eq\n\t"
11132         "ldr        x4, [%[a], 120]\n\t"
11133         "ldr        x5, [%[b], 120]\n\t"
11134         "and        x4, x4, x3\n\t"
11135         "and        x5, x5, x3\n\t"
11136         "subs   x4, x4, x5\n\t"
11137         "csel   %[r], %[one], %[r], hi\n\t"
11138         "csel   %[r], x3, %[r], lo\n\t"
11139         "csel   x3, x3, xzr, eq\n\t"
11140         "ldr        x4, [%[a], 112]\n\t"
11141         "ldr        x5, [%[b], 112]\n\t"
11142         "and        x4, x4, x3\n\t"
11143         "and        x5, x5, x3\n\t"
11144         "subs   x4, x4, x5\n\t"
11145         "csel   %[r], %[one], %[r], hi\n\t"
11146         "csel   %[r], x3, %[r], lo\n\t"
11147         "csel   x3, x3, xzr, eq\n\t"
11148         "ldr        x4, [%[a], 104]\n\t"
11149         "ldr        x5, [%[b], 104]\n\t"
11150         "and        x4, x4, x3\n\t"
11151         "and        x5, x5, x3\n\t"
11152         "subs   x4, x4, x5\n\t"
11153         "csel   %[r], %[one], %[r], hi\n\t"
11154         "csel   %[r], x3, %[r], lo\n\t"
11155         "csel   x3, x3, xzr, eq\n\t"
11156         "ldr        x4, [%[a], 96]\n\t"
11157         "ldr        x5, [%[b], 96]\n\t"
11158         "and        x4, x4, x3\n\t"
11159         "and        x5, x5, x3\n\t"
11160         "subs   x4, x4, x5\n\t"
11161         "csel   %[r], %[one], %[r], hi\n\t"
11162         "csel   %[r], x3, %[r], lo\n\t"
11163         "csel   x3, x3, xzr, eq\n\t"
11164         "ldr        x4, [%[a], 88]\n\t"
11165         "ldr        x5, [%[b], 88]\n\t"
11166         "and        x4, x4, x3\n\t"
11167         "and        x5, x5, x3\n\t"
11168         "subs   x4, x4, x5\n\t"
11169         "csel   %[r], %[one], %[r], hi\n\t"
11170         "csel   %[r], x3, %[r], lo\n\t"
11171         "csel   x3, x3, xzr, eq\n\t"
11172         "ldr        x4, [%[a], 80]\n\t"
11173         "ldr        x5, [%[b], 80]\n\t"
11174         "and        x4, x4, x3\n\t"
11175         "and        x5, x5, x3\n\t"
11176         "subs   x4, x4, x5\n\t"
11177         "csel   %[r], %[one], %[r], hi\n\t"
11178         "csel   %[r], x3, %[r], lo\n\t"
11179         "csel   x3, x3, xzr, eq\n\t"
11180         "ldr        x4, [%[a], 72]\n\t"
11181         "ldr        x5, [%[b], 72]\n\t"
11182         "and        x4, x4, x3\n\t"
11183         "and        x5, x5, x3\n\t"
11184         "subs   x4, x4, x5\n\t"
11185         "csel   %[r], %[one], %[r], hi\n\t"
11186         "csel   %[r], x3, %[r], lo\n\t"
11187         "csel   x3, x3, xzr, eq\n\t"
11188         "ldr        x4, [%[a], 64]\n\t"
11189         "ldr        x5, [%[b], 64]\n\t"
11190         "and        x4, x4, x3\n\t"
11191         "and        x5, x5, x3\n\t"
11192         "subs   x4, x4, x5\n\t"
11193         "csel   %[r], %[one], %[r], hi\n\t"
11194         "csel   %[r], x3, %[r], lo\n\t"
11195         "csel   x3, x3, xzr, eq\n\t"
11196         "ldr        x4, [%[a], 56]\n\t"
11197         "ldr        x5, [%[b], 56]\n\t"
11198         "and        x4, x4, x3\n\t"
11199         "and        x5, x5, x3\n\t"
11200         "subs   x4, x4, x5\n\t"
11201         "csel   %[r], %[one], %[r], hi\n\t"
11202         "csel   %[r], x3, %[r], lo\n\t"
11203         "csel   x3, x3, xzr, eq\n\t"
11204         "ldr        x4, [%[a], 48]\n\t"
11205         "ldr        x5, [%[b], 48]\n\t"
11206         "and        x4, x4, x3\n\t"
11207         "and        x5, x5, x3\n\t"
11208         "subs   x4, x4, x5\n\t"
11209         "csel   %[r], %[one], %[r], hi\n\t"
11210         "csel   %[r], x3, %[r], lo\n\t"
11211         "csel   x3, x3, xzr, eq\n\t"
11212         "ldr        x4, [%[a], 40]\n\t"
11213         "ldr        x5, [%[b], 40]\n\t"
11214         "and        x4, x4, x3\n\t"
11215         "and        x5, x5, x3\n\t"
11216         "subs   x4, x4, x5\n\t"
11217         "csel   %[r], %[one], %[r], hi\n\t"
11218         "csel   %[r], x3, %[r], lo\n\t"
11219         "csel   x3, x3, xzr, eq\n\t"
11220         "ldr        x4, [%[a], 32]\n\t"
11221         "ldr        x5, [%[b], 32]\n\t"
11222         "and        x4, x4, x3\n\t"
11223         "and        x5, x5, x3\n\t"
11224         "subs   x4, x4, x5\n\t"
11225         "csel   %[r], %[one], %[r], hi\n\t"
11226         "csel   %[r], x3, %[r], lo\n\t"
11227         "csel   x3, x3, xzr, eq\n\t"
11228         "ldr        x4, [%[a], 24]\n\t"
11229         "ldr        x5, [%[b], 24]\n\t"
11230         "and        x4, x4, x3\n\t"
11231         "and        x5, x5, x3\n\t"
11232         "subs   x4, x4, x5\n\t"
11233         "csel   %[r], %[one], %[r], hi\n\t"
11234         "csel   %[r], x3, %[r], lo\n\t"
11235         "csel   x3, x3, xzr, eq\n\t"
11236         "ldr        x4, [%[a], 16]\n\t"
11237         "ldr        x5, [%[b], 16]\n\t"
11238         "and        x4, x4, x3\n\t"
11239         "and        x5, x5, x3\n\t"
11240         "subs   x4, x4, x5\n\t"
11241         "csel   %[r], %[one], %[r], hi\n\t"
11242         "csel   %[r], x3, %[r], lo\n\t"
11243         "csel   x3, x3, xzr, eq\n\t"
11244         "ldr        x4, [%[a], 8]\n\t"
11245         "ldr        x5, [%[b], 8]\n\t"
11246         "and        x4, x4, x3\n\t"
11247         "and        x5, x5, x3\n\t"
11248         "subs   x4, x4, x5\n\t"
11249         "csel   %[r], %[one], %[r], hi\n\t"
11250         "csel   %[r], x3, %[r], lo\n\t"
11251         "csel   x3, x3, xzr, eq\n\t"
11252         "ldr        x4, [%[a], 0]\n\t"
11253         "ldr        x5, [%[b], 0]\n\t"
11254         "and        x4, x4, x3\n\t"
11255         "and        x5, x5, x3\n\t"
11256         "subs   x4, x4, x5\n\t"
11257         "csel   %[r], %[one], %[r], hi\n\t"
11258         "csel   %[r], x3, %[r], lo\n\t"
11259         "csel   x3, x3, xzr, eq\n\t"
11260         "eor    %[r], %[r], x3\n\t"
11261         : [r] "+r" (r)
11262         : [a] "r" (a), [b] "r" (b), [one] "r" (one)
11263         : "x2", "x3", "x4", "x5", "x6"
11264     );
11265 #endif
11266 
11267     return r;
11268 }
11269 
11270 /* Divide d in a and put remainder into r (m*d + r = a)
11271  * m is not calculated as it is not needed at this time.
11272  *
11273  * a  Nmber to be divided.
11274  * d  Number to divide with.
11275  * m  Multiplier result.
11276  * r  Remainder from the division.
11277  * returns MP_OKAY indicating success.
11278  */
11279 static WC_INLINE int sp_3072_div_48(sp_digit* a, sp_digit* d, sp_digit* m,
11280         sp_digit* r)
11281 {
11282     sp_digit t1[96], t2[49];
11283     sp_digit div, r1;
11284     int i;
11285 
11286     (void)m;
11287 
11288     div = d[47];
11289     XMEMCPY(t1, a, sizeof(*t1) * 2 * 48);
11290     for (i=47; i>=0; i--) {
11291         r1 = div_3072_word_48(t1[48 + i], t1[48 + i - 1], div);
11292 
11293         sp_3072_mul_d_48(t2, d, r1);
11294         t1[48 + i] += sp_3072_sub_in_place_48(&t1[i], t2);
11295         t1[48 + i] -= t2[48];
11296         sp_3072_mask_48(t2, d, t1[48 + i]);
11297         t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
11298         sp_3072_mask_48(t2, d, t1[48 + i]);
11299         t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
11300     }
11301 
11302     r1 = sp_3072_cmp_48(t1, d) >= 0;
11303     sp_3072_cond_sub_48(r, t1, t2, (sp_digit)0 - r1);
11304 
11305     return MP_OKAY;
11306 }
11307 
11308 /* Reduce a modulo m into r. (r = a mod m)
11309  *
11310  * r  A single precision number that is the reduced result.
11311  * a  A single precision number that is to be reduced.
11312  * m  A single precision number that is the modulus to reduce with.
11313  * returns MP_OKAY indicating success.
11314  */
11315 static WC_INLINE int sp_3072_mod_48(sp_digit* r, sp_digit* a, sp_digit* m)
11316 {
11317     return sp_3072_div_48(a, m, NULL, r);
11318 }
11319 
11320 /* Divide d in a and put remainder into r (m*d + r = a)
11321  * m is not calculated as it is not needed at this time.
11322  *
11323  * a  Nmber to be divided.
11324  * d  Number to divide with.
11325  * m  Multiplier result.
11326  * r  Remainder from the division.
11327  * returns MP_OKAY indicating success.
11328  */
11329 static WC_INLINE int sp_3072_div_48_cond(sp_digit* a, sp_digit* d, sp_digit* m,
11330         sp_digit* r)
11331 {
11332     sp_digit t1[96], t2[49];
11333     sp_digit div, r1;
11334     int i;
11335 
11336     (void)m;
11337 
11338     div = d[47];
11339     XMEMCPY(t1, a, sizeof(*t1) * 2 * 48);
11340     for (i=47; i>=0; i--) {
11341         r1 = div_3072_word_48(t1[48 + i], t1[48 + i - 1], div);
11342 
11343         sp_3072_mul_d_48(t2, d, r1);
11344         t1[48 + i] += sp_3072_sub_in_place_48(&t1[i], t2);
11345         t1[48 + i] -= t2[48];
11346         if (t1[48 + i] != 0) {
11347             t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], d);
11348             if (t1[48 + i] != 0)
11349                 t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], d);
11350         }
11351     }
11352 
11353     r1 = sp_3072_cmp_48(t1, d) >= 0;
11354     sp_3072_cond_sub_48(r, t1, t2, (sp_digit)0 - r1);
11355 
11356     return MP_OKAY;
11357 }
11358 
11359 /* Reduce a modulo m into r. (r = a mod m)
11360  *
11361  * r  A single precision number that is the reduced result.
11362  * a  A single precision number that is to be reduced.
11363  * m  A single precision number that is the modulus to reduce with.
11364  * returns MP_OKAY indicating success.
11365  */
11366 static WC_INLINE int sp_3072_mod_48_cond(sp_digit* r, sp_digit* a, sp_digit* m)
11367 {
11368     return sp_3072_div_48_cond(a, m, NULL, r);
11369 }
11370 
11371 #if defined(SP_RSA_PRIVATE_EXP_D) || defined(WOLFSSL_HAVE_SP_DH)
11372 #ifdef WOLFSSL_SP_SMALL
11373 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
11374  *
11375  * r     A single precision number that is the result of the operation.
11376  * a     A single precision number being exponentiated.
11377  * e     A single precision number that is the exponent.
11378  * bits  The number of bits in the exponent.
11379  * m     A single precision number that is the modulus.
11380  * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
11381  */
11382 static int sp_3072_mod_exp_48(sp_digit* r, sp_digit* a, sp_digit* e,
11383         int bits, sp_digit* m, int reduceA)
11384 {
11385 #ifndef WOLFSSL_SMALL_STACK
11386     sp_digit t[16][96];
11387 #else
11388     sp_digit* t[16];
11389     sp_digit* td;
11390 #endif
11391     sp_digit* norm;
11392     sp_digit mp = 1;
11393     sp_digit n;
11394     sp_digit mask;
11395     int i;
11396     int c, y;
11397     int err = MP_OKAY;
11398 
11399 #ifdef WOLFSSL_SMALL_STACK
11400     td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 96, NULL,
11401                             DYNAMIC_TYPE_TMP_BUFFER);
11402     if (td == NULL)
11403         err = MEMORY_E;
11404 
11405     if (err == MP_OKAY) {
11406         for (i=0; i<16; i++)
11407             t[i] = td + i * 96;
11408         norm = t[0];
11409     }
11410 #else
11411     norm = t[0];
11412 #endif
11413 
11414     if (err == MP_OKAY) {
11415         sp_3072_mont_setup(m, &mp);
11416         sp_3072_mont_norm_48(norm, m);
11417 
11418         XMEMSET(t[1], 0, sizeof(sp_digit) * 48);
11419         if (reduceA) {
11420             err = sp_3072_mod_48(t[1] + 48, a, m);
11421             if (err == MP_OKAY)
11422                 err = sp_3072_mod_48(t[1], t[1], m);
11423         }
11424         else {
11425             XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
11426             err = sp_3072_mod_48(t[1], t[1], m);
11427         }
11428     }
11429 
11430     if (err == MP_OKAY) {
11431         sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
11432         sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
11433         sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
11434         sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
11435         sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
11436         sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
11437         sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp);
11438         sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp);
11439         sp_3072_mont_sqr_48(t[10], t[ 5], m, mp);
11440         sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp);
11441         sp_3072_mont_sqr_48(t[12], t[ 6], m, mp);
11442         sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp);
11443         sp_3072_mont_sqr_48(t[14], t[ 7], m, mp);
11444         sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp);
11445 
11446         i = (bits - 1) / 64;
11447         n = e[i--];
11448         y = n >> 60;
11449         n <<= 4;
11450         c = 60;
11451         XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
11452         for (; i>=0 || c>=4; ) {
11453             if (c == 0) {
11454                 n = e[i--];
11455                 y = n >> 60;
11456                 n <<= 4;
11457                 c = 60;
11458             }
11459             else if (c < 4) {
11460                 y = n >> 60;
11461                 n = e[i--];
11462                 c = 4 - c;
11463                 y |= n >> (64 - c);
11464                 n <<= c;
11465                 c = 64 - c;
11466             }
11467             else {
11468                 y = (n >> 60) & 0xf;
11469                 n <<= 4;
11470                 c -= 4;
11471             }
11472 
11473             sp_3072_mont_sqr_48(r, r, m, mp);
11474             sp_3072_mont_sqr_48(r, r, m, mp);
11475             sp_3072_mont_sqr_48(r, r, m, mp);
11476             sp_3072_mont_sqr_48(r, r, m, mp);
11477 
11478             sp_3072_mont_mul_48(r, r, t[y], m, mp);
11479         }
11480 
11481         XMEMSET(&r[48], 0, sizeof(sp_digit) * 48);
11482         sp_3072_mont_reduce_48(r, m, mp);
11483 
11484         mask = 0 - (sp_3072_cmp_48(r, m) >= 0);
11485         sp_3072_cond_sub_48(r, r, m, mask);
11486     }
11487 
11488 #ifdef WOLFSSL_SMALL_STACK
11489     if (td != NULL)
11490         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
11491 #endif
11492 
11493     return err;
11494 }
11495 #else
11496 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
11497  *
11498  * r     A single precision number that is the result of the operation.
11499  * a     A single precision number being exponentiated.
11500  * e     A single precision number that is the exponent.
11501  * bits  The number of bits in the exponent.
11502  * m     A single precision number that is the modulus.
11503  * returns 0 on success and MEMORY_E on dynamic memory allocation failure.
11504  */
11505 static int sp_3072_mod_exp_48(sp_digit* r, sp_digit* a, sp_digit* e,
11506         int bits, sp_digit* m, int reduceA)
11507 {
11508 #ifndef WOLFSSL_SMALL_STACK
11509     sp_digit t[32][96];
11510 #else
11511     sp_digit* t[32];
11512     sp_digit* td;
11513 #endif
11514     sp_digit* norm;
11515     sp_digit mp = 1;
11516     sp_digit n;
11517     sp_digit mask;
11518     int i;
11519     int c, y;
11520     int err = MP_OKAY;
11521 
11522 #ifdef WOLFSSL_SMALL_STACK
11523     td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 96, NULL,
11524                             DYNAMIC_TYPE_TMP_BUFFER);
11525     if (td == NULL)
11526         err = MEMORY_E;
11527 
11528     if (err == MP_OKAY) {
11529         for (i=0; i<32; i++)
11530             t[i] = td + i * 96;
11531         norm = t[0];
11532     }
11533 #else
11534     norm = t[0];
11535 #endif
11536 
11537     if (err == MP_OKAY) {
11538         sp_3072_mont_setup(m, &mp);
11539         sp_3072_mont_norm_48(norm, m);
11540 
11541         XMEMSET(t[1], 0, sizeof(sp_digit) * 48);
11542         if (reduceA) {
11543             err = sp_3072_mod_48(t[1] + 48, a, m);
11544             if (err == MP_OKAY)
11545                 err = sp_3072_mod_48(t[1], t[1], m);
11546         }
11547         else {
11548             XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
11549             err = sp_3072_mod_48(t[1], t[1], m);
11550         }
11551     }
11552 
11553     if (err == MP_OKAY) {
11554         sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
11555         sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
11556         sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
11557         sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
11558         sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
11559         sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
11560         sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp);
11561         sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp);
11562         sp_3072_mont_sqr_48(t[10], t[ 5], m, mp);
11563         sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp);
11564         sp_3072_mont_sqr_48(t[12], t[ 6], m, mp);
11565         sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp);
11566         sp_3072_mont_sqr_48(t[14], t[ 7], m, mp);
11567         sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp);
11568         sp_3072_mont_sqr_48(t[16], t[ 8], m, mp);
11569         sp_3072_mont_mul_48(t[17], t[ 9], t[ 8], m, mp);
11570         sp_3072_mont_sqr_48(t[18], t[ 9], m, mp);
11571         sp_3072_mont_mul_48(t[19], t[10], t[ 9], m, mp);
11572         sp_3072_mont_sqr_48(t[20], t[10], m, mp);
11573         sp_3072_mont_mul_48(t[21], t[11], t[10], m, mp);
11574         sp_3072_mont_sqr_48(t[22], t[11], m, mp);
11575         sp_3072_mont_mul_48(t[23], t[12], t[11], m, mp);
11576         sp_3072_mont_sqr_48(t[24], t[12], m, mp);
11577         sp_3072_mont_mul_48(t[25], t[13], t[12], m, mp);
11578         sp_3072_mont_sqr_48(t[26], t[13], m, mp);
11579         sp_3072_mont_mul_48(t[27], t[14], t[13], m, mp);
11580         sp_3072_mont_sqr_48(t[28], t[14], m, mp);
11581         sp_3072_mont_mul_48(t[29], t[15], t[14], m, mp);
11582         sp_3072_mont_sqr_48(t[30], t[15], m, mp);
11583         sp_3072_mont_mul_48(t[31], t[16], t[15], m, mp);
11584 
11585         i = (bits - 1) / 64;
11586         n = e[i--];
11587         y = n >> 59;
11588         n <<= 5;
11589         c = 59;
11590         XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
11591         for (; i>=0 || c>=5; ) {
11592             if (c == 0) {
11593                 n = e[i--];
11594                 y = n >> 59;
11595                 n <<= 5;
11596                 c = 59;
11597             }
11598             else if (c < 5) {
11599                 y = n >> 59;
11600                 n = e[i--];
11601                 c = 5 - c;
11602                 y |= n >> (64 - c);
11603                 n <<= c;
11604                 c = 64 - c;
11605             }
11606             else {
11607                 y = (n >> 59) & 0x1f;
11608                 n <<= 5;
11609                 c -= 5;
11610             }
11611 
11612             sp_3072_mont_sqr_48(r, r, m, mp);
11613             sp_3072_mont_sqr_48(r, r, m, mp);
11614             sp_3072_mont_sqr_48(r, r, m, mp);
11615             sp_3072_mont_sqr_48(r, r, m, mp);
11616             sp_3072_mont_sqr_48(r, r, m, mp);
11617 
11618             sp_3072_mont_mul_48(r, r, t[y], m, mp);
11619         }
11620         y = e[0] & 0x3;
11621         sp_3072_mont_sqr_48(r, r, m, mp);
11622         sp_3072_mont_sqr_48(r, r, m, mp);
11623         sp_3072_mont_mul_48(r, r, t[y], m, mp);
11624 
11625         XMEMSET(&r[48], 0, sizeof(sp_digit) * 48);
11626         sp_3072_mont_reduce_48(r, m, mp);
11627 
11628         mask = 0 - (sp_3072_cmp_48(r, m) >= 0);
11629         sp_3072_cond_sub_48(r, r, m, mask);
11630     }
11631 
11632 #ifdef WOLFSSL_SMALL_STACK
11633     if (td != NULL)
11634         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
11635 #endif
11636 
11637     return err;
11638 }
11639 #endif /* WOLFSSL_SP_SMALL */
11640 #endif /* SP_RSA_PRIVATE_EXP_D || WOLFSSL_HAVE_SP_DH */
11641 
11642 #ifdef WOLFSSL_HAVE_SP_RSA
11643 /* RSA public key operation.
11644  *
11645  * in      Array of bytes representing the number to exponentiate, base.
11646  * inLen   Number of bytes in base.
11647  * em      Public exponent.
11648  * mm      Modulus.
11649  * out     Buffer to hold big-endian bytes of exponentiation result.
11650  *         Must be at least 384 bytes long.
11651  * outLen  Number of bytes in result.
11652  * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
11653  * an array is too long and MEMORY_E when dynamic memory allocation fails.
11654  */
11655 int sp_RsaPublic_3072(const byte* in, word32 inLen, mp_int* em, mp_int* mm,
11656     byte* out, word32* outLen)
11657 {
11658 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
11659     sp_digit ad[96], md[48], rd[96];
11660 #else
11661     sp_digit* d = NULL;
11662 #endif
11663     sp_digit* a;
11664     sp_digit *ah;
11665     sp_digit* m;
11666     sp_digit* r;
11667     sp_digit e[1];
11668     int err = MP_OKAY;
11669 
11670     if (*outLen < 384)
11671         err = MP_TO_E;
11672     if (err == MP_OKAY && (mp_count_bits(em) > 64 || inLen > 384 ||
11673                                                      mp_count_bits(mm) != 3072))
11674         err = MP_READ_E;
11675 
11676 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
11677     if (err == MP_OKAY) {
11678         d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 48 * 5, NULL,
11679                                DYNAMIC_TYPE_TMP_BUFFER);
11680         if (d == NULL)
11681             err = MEMORY_E;
11682     }
11683 
11684     if (err == MP_OKAY) {
11685         a = d;
11686         r = a + 48 * 2;
11687         m = r + 48 * 2;
11688         ah = a + 48;
11689     }
11690 #else
11691     a = ad;
11692     m = md;
11693     r = rd;
11694     ah = a + 48;
11695 #endif
11696 
11697     if (err == MP_OKAY) {
11698         sp_3072_from_bin(ah, 48, in, inLen);
11699 #if DIGIT_BIT >= 64
11700         e[0] = em->dp[0];
11701 #else
11702         e[0] = em->dp[0];
11703         if (em->used > 1)
11704             e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
11705 #endif
11706         if (e[0] == 0)
11707             err = MP_EXPTMOD_E;
11708     }
11709     if (err == MP_OKAY) {
11710         sp_3072_from_mp(m, 48, mm);
11711 
11712         if (e[0] == 0x3) {
11713             if (err == MP_OKAY) {
11714                 sp_3072_sqr_48(r, ah);
11715                 err = sp_3072_mod_48_cond(r, r, m);
11716             }
11717             if (err == MP_OKAY) {
11718                 sp_3072_mul_48(r, ah, r);
11719                 err = sp_3072_mod_48_cond(r, r, m);
11720             }
11721         }
11722         else {
11723             int i;
11724             sp_digit mp;
11725 
11726             sp_3072_mont_setup(m, &mp);
11727 
11728             /* Convert to Montgomery form. */
11729             XMEMSET(a, 0, sizeof(sp_digit) * 48);
11730             err = sp_3072_mod_48_cond(a, a, m);
11731 
11732             if (err == MP_OKAY) {
11733                 for (i=63; i>=0; i--)
11734                     if (e[0] >> i)
11735                         break;
11736 
11737                 XMEMCPY(r, a, sizeof(sp_digit) * 48);
11738                 for (i--; i>=0; i--) {
11739                     sp_3072_mont_sqr_48(r, r, m, mp);
11740                     if (((e[0] >> i) & 1) == 1)
11741                         sp_3072_mont_mul_48(r, r, a, m, mp);
11742                 }
11743                 XMEMSET(&r[48], 0, sizeof(sp_digit) * 48);
11744                 sp_3072_mont_reduce_48(r, m, mp);
11745 
11746                 for (i = 47; i > 0; i--) {
11747                     if (r[i] != m[i])
11748                         break;
11749                 }
11750                 if (r[i] >= m[i])
11751                     sp_3072_sub_in_place_48(r, m);
11752             }
11753         }
11754     }
11755 
11756     if (err == MP_OKAY) {
11757         sp_3072_to_bin(r, out);
11758         *outLen = 384;
11759     }
11760 
11761 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
11762     if (d != NULL)
11763         XFREE(d, NULL, DYNAMIC_TYPE_TMP_BUFFER);
11764 #endif
11765 
11766     return err;
11767 }
11768 
11769 /* RSA private key operation.
11770  *
11771  * in      Array of bytes representing the number to exponentiate, base.
11772  * inLen   Number of bytes in base.
11773  * dm      Private exponent.
11774  * pm      First prime.
11775  * qm      Second prime.
11776  * dpm     First prime's CRT exponent.
11777  * dqm     Second prime's CRT exponent.
11778  * qim     Inverse of second prime mod p.
11779  * mm      Modulus.
11780  * out     Buffer to hold big-endian bytes of exponentiation result.
11781  *         Must be at least 384 bytes long.
11782  * outLen  Number of bytes in result.
11783  * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
11784  * an array is too long and MEMORY_E when dynamic memory allocation fails.
11785  */
11786 int sp_RsaPrivate_3072(const byte* in, word32 inLen, mp_int* dm,
11787     mp_int* pm, mp_int* qm, mp_int* dpm, mp_int* dqm, mp_int* qim, mp_int* mm,
11788     byte* out, word32* outLen)
11789 {
11790 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
11791     sp_digit ad[48 * 2];
11792     sp_digit pd[24], qd[24], dpd[24];
11793     sp_digit tmpad[48], tmpbd[48];
11794 #else
11795     sp_digit* t = NULL;
11796 #endif
11797     sp_digit* a;
11798     sp_digit* p;
11799     sp_digit* q;
11800     sp_digit* dp;
11801     sp_digit* dq;
11802     sp_digit* qi;
11803     sp_digit* tmp;
11804     sp_digit* tmpa;
11805     sp_digit* tmpb;
11806     sp_digit* r;
11807     sp_digit c;
11808     int err = MP_OKAY;
11809 
11810     (void)dm;
11811     (void)mm;
11812 
11813     if (*outLen < 384)
11814         err = MP_TO_E;
11815     if (err == MP_OKAY && (inLen > 384 || mp_count_bits(mm) != 3072))
11816         err = MP_READ_E;
11817 
11818 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
11819     if (err == MP_OKAY) {
11820         t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 24 * 11, NULL,
11821                                DYNAMIC_TYPE_TMP_BUFFER);
11822         if (t == NULL)
11823             err = MEMORY_E;
11824     }
11825     if (err == MP_OKAY) {
11826         a = t;
11827         p = a + 48 * 2;
11828         q = p + 24;
11829         qi = dq = dp = q + 24;
11830         tmpa = qi + 24;
11831         tmpb = tmpa + 48;
11832 
11833         tmp = t;
11834         r = tmp + 48;
11835     }
11836 #else
11837     r = a = ad;
11838     p = pd;
11839     q = qd;
11840     qi = dq = dp = dpd;
11841     tmpa = tmpad;
11842     tmpb = tmpbd;
11843     tmp = a + 48;
11844 #endif
11845 
11846     if (err == MP_OKAY) {
11847         sp_3072_from_bin(a, 48, in, inLen);
11848         sp_3072_from_mp(p, 24, pm);
11849         sp_3072_from_mp(q, 24, qm);
11850         sp_3072_from_mp(dp, 24, dpm);
11851 
11852         err = sp_3072_mod_exp_24(tmpa, a, dp, 1536, p, 1);
11853     }
11854     if (err == MP_OKAY) {
11855         sp_3072_from_mp(dq, 24, dqm);
11856         err = sp_3072_mod_exp_24(tmpb, a, dq, 1536, q, 1);
11857     }
11858 
11859     if (err == MP_OKAY) {
11860         c = sp_3072_sub_in_place_24(tmpa, tmpb);
11861         sp_3072_mask_24(tmp, p, c);
11862         sp_3072_add_24(tmpa, tmpa, tmp);
11863 
11864         sp_3072_from_mp(qi, 24, qim);
11865         sp_3072_mul_24(tmpa, tmpa, qi);
11866         err = sp_3072_mod_24(tmpa, tmpa, p);
11867     }
11868 
11869     if (err == MP_OKAY) {
11870         sp_3072_mul_24(tmpa, q, tmpa);
11871         XMEMSET(&tmpb[24], 0, sizeof(sp_digit) * 24);
11872         sp_3072_add_48(r, tmpb, tmpa);
11873 
11874         sp_3072_to_bin(r, out);
11875         *outLen = 384;
11876     }
11877 
11878 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
11879     if (t != NULL) {
11880         XMEMSET(t, 0, sizeof(sp_digit) * 24 * 11);
11881         XFREE(t, NULL, DYNAMIC_TYPE_TMP_BUFFER);
11882     }
11883 #else
11884     XMEMSET(tmpad, 0, sizeof(tmpad));
11885     XMEMSET(tmpbd, 0, sizeof(tmpbd));
11886     XMEMSET(pd, 0, sizeof(pd));
11887     XMEMSET(qd, 0, sizeof(qd));
11888     XMEMSET(dpd, 0, sizeof(dpd));
11889 #endif
11890 
11891     return err;
11892 }
11893 #endif /* WOLFSSL_HAVE_SP_RSA */
11894 #ifdef WOLFSSL_HAVE_SP_DH
11895 /* Convert an array of sp_digit to an mp_int.
11896  *
11897  * a  A single precision integer.
11898  * r  A multi-precision integer.
11899  */
11900 static int sp_3072_to_mp(sp_digit* a, mp_int* r)
11901 {
11902     int err;
11903 
11904     err = mp_grow(r, (3072 + DIGIT_BIT - 1) / DIGIT_BIT);
11905     if (err == MP_OKAY) {
11906 #if DIGIT_BIT == 64
11907         XMEMCPY(r->dp, a, sizeof(sp_digit) * 48);
11908         r->used = 48;
11909         mp_clamp(r);
11910 #elif DIGIT_BIT < 64
11911         int i, j = 0, s = 0;
11912 
11913         r->dp[0] = 0;
11914         for (i = 0; i < 48; i++) {
11915             r->dp[j] |= a[i] << s;
11916             r->dp[j] &= (1l << DIGIT_BIT) - 1;
11917             s = DIGIT_BIT - s;
11918             r->dp[++j] = a[i] >> s;
11919             while (s + DIGIT_BIT <= 64) {
11920                 s += DIGIT_BIT;
11921                 r->dp[j] &= (1l << DIGIT_BIT) - 1;
11922                 r->dp[++j] = a[i] >> s;
11923             }
11924             s = 64 - s;
11925         }
11926         r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
11927         mp_clamp(r);
11928 #else
11929         int i, j = 0, s = 0;
11930 
11931         r->dp[0] = 0;
11932         for (i = 0; i < 48; i++) {
11933             r->dp[j] |= ((mp_digit)a[i]) << s;
11934             if (s + 64 >= DIGIT_BIT) {
11935     #if DIGIT_BIT < 64
11936                 r->dp[j] &= (1l << DIGIT_BIT) - 1;
11937     #endif
11938                 s = DIGIT_BIT - s;
11939                 r->dp[++j] = a[i] >> s;
11940                 s = 64 - s;
11941             }
11942             else
11943                 s += 64;
11944         }
11945         r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
11946         mp_clamp(r);
11947 #endif
11948     }
11949 
11950     return err;
11951 }
11952 
11953 /* Perform the modular exponentiation for Diffie-Hellman.
11954  *
11955  * base  Base. MP integer.
11956  * exp   Exponent. MP integer.
11957  * mod   Modulus. MP integer.
11958  * res   Result. MP integer.
11959  * returs 0 on success, MP_READ_E if there are too many bytes in an array
11960  * and MEMORY_E if memory allocation fails.
11961  */
11962 int sp_ModExp_3072(mp_int* base, mp_int* exp, mp_int* mod, mp_int* res)
11963 {
11964     int err = MP_OKAY;
11965     sp_digit b[96], e[48], m[48];
11966     sp_digit* r = b;
11967     int expBits = mp_count_bits(exp);
11968 
11969     if (mp_count_bits(base) > 3072 || expBits > 3072 ||
11970                                                    mp_count_bits(mod) != 3072) {
11971         err = MP_READ_E;
11972     }
11973 
11974     if (err == MP_OKAY) {
11975         sp_3072_from_mp(b, 48, base);
11976         sp_3072_from_mp(e, 48, exp);
11977         sp_3072_from_mp(m, 48, mod);
11978 
11979         err = sp_3072_mod_exp_48(r, b, e, expBits, m, 0);
11980     }
11981 
11982     if (err == MP_OKAY) {
11983         err = sp_3072_to_mp(r, res);
11984     }
11985 
11986     XMEMSET(e, 0, sizeof(e));
11987 
11988     return err;
11989 }
11990 
11991 /* Perform the modular exponentiation for Diffie-Hellman.
11992  *
11993  * base     Base.
11994  * exp      Array of bytes that is the exponent.
11995  * expLen   Length of data, in bytes, in exponent.
11996  * mod      Modulus.
11997  * out      Buffer to hold big-endian bytes of exponentiation result.
11998  *          Must be at least 384 bytes long.
11999  * outLen   Length, in bytes, of exponentiation result.
12000  * returs 0 on success, MP_READ_E if there are too many bytes in an array
12001  * and MEMORY_E if memory allocation fails.
12002  */
12003 int sp_DhExp_3072(mp_int* base, const byte* exp, word32 expLen,
12004     mp_int* mod, byte* out, word32* outLen)
12005 {
12006     int err = MP_OKAY;
12007     sp_digit b[96], e[48], m[48];
12008     sp_digit* r = b;
12009     word32 i;
12010 
12011     if (mp_count_bits(base) > 3072 || expLen > 384 ||
12012                                                    mp_count_bits(mod) != 3072) {
12013         err = MP_READ_E;
12014     }
12015 
12016     if (err == MP_OKAY) {
12017         sp_3072_from_mp(b, 48, base);
12018         sp_3072_from_bin(e, 48, exp, expLen);
12019         sp_3072_from_mp(m, 48, mod);
12020 
12021         err = sp_3072_mod_exp_48(r, b, e, expLen * 8, m, 0);
12022     }
12023 
12024     if (err == MP_OKAY) {
12025         sp_3072_to_bin(r, out);
12026         *outLen = 384;
12027         for (i=0; i<384 && out[i] == 0; i++) {
12028         }
12029         *outLen -= i;
12030         XMEMMOVE(out, out + i, *outLen);
12031 
12032     }
12033 
12034     XMEMSET(e, 0, sizeof(e));
12035 
12036     return err;
12037 }
12038 
12039 #endif /* WOLFSSL_HAVE_SP_DH */
12040 
12041 #endif /* WOLFSSL_SP_NO_3072 */
12042 
12043 #endif /* WOLFSSL_HAVE_SP_RSA || WOLFSSL_HAVE_SP_DH */
12044 #ifdef WOLFSSL_HAVE_SP_ECC
12045 #ifndef WOLFSSL_SP_NO_256
12046 
12047 /* Point structure to use. */
12048 typedef struct sp_point {
12049     sp_digit x[2 * 4];
12050     sp_digit y[2 * 4];
12051     sp_digit z[2 * 4];
12052     int infinity;
12053 } sp_point;
12054 
12055 /* The modulus (prime) of the curve P256. */
12056 static sp_digit p256_mod[4] = {
12057     0xffffffffffffffffl,0x00000000ffffffffl,0x0000000000000000l,
12058     0xffffffff00000001l
12059 };
12060 /* The Montogmery normalizer for modulus of the curve P256. */
12061 static sp_digit p256_norm_mod[4] = {
12062     0x0000000000000001l,0xffffffff00000000l,0xffffffffffffffffl,
12063     0x00000000fffffffel
12064 };
12065 /* The Montogmery multiplier for modulus of the curve P256. */
12066 static sp_digit p256_mp_mod = 0x0000000000000001;
12067 #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
12068                                             defined(HAVE_ECC_VERIFY)
12069 /* The order of the curve P256. */
12070 static sp_digit p256_order[4] = {
12071     0xf3b9cac2fc632551l,0xbce6faada7179e84l,0xffffffffffffffffl,
12072     0xffffffff00000000l
12073 };
12074 #endif
12075 /* The order of the curve P256 minus 2. */
12076 static sp_digit p256_order2[4] = {
12077     0xf3b9cac2fc63254fl,0xbce6faada7179e84l,0xffffffffffffffffl,
12078     0xffffffff00000000l
12079 };
12080 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
12081 /* The Montogmery normalizer for order of the curve P256. */
12082 static sp_digit p256_norm_order[4] = {
12083     0x0c46353d039cdaafl,0x4319055258e8617bl,0x0000000000000000l,
12084     0x00000000ffffffffl
12085 };
12086 #endif
12087 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
12088 /* The Montogmery multiplier for order of the curve P256. */
12089 static sp_digit p256_mp_order = 0xccd1c8aaee00bc4fl;
12090 #endif
12091 #ifdef WOLFSSL_SP_SMALL
12092 /* The base point of curve P256. */
12093 static sp_point p256_base = {
12094     /* X ordinate */
12095     {
12096         0xf4a13945d898c296l,0x77037d812deb33a0l,0xf8bce6e563a440f2l,
12097         0x6b17d1f2e12c4247l
12098     },
12099     /* Y ordinate */
12100     {
12101         0xcbb6406837bf51f5l,0x2bce33576b315ecel,0x8ee7eb4a7c0f9e16l,
12102         0x4fe342e2fe1a7f9bl
12103     },
12104     /* Z ordinate */
12105     {
12106         0x0000000000000001l,0x0000000000000000l,0x0000000000000000l,
12107         0x0000000000000000l
12108     },
12109     /* infinity */
12110     0
12111 };
12112 #endif /* WOLFSSL_SP_SMALL */
12113 #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
12114 static sp_digit p256_b[4] = {
12115     0x3bce3c3e27d2604bl,0x651d06b0cc53b0f6l,0xb3ebbd55769886bcl,
12116     0x5ac635d8aa3a93e7l
12117 };
12118 #endif
12119 
12120 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
12121 /* Allocate memory for point and return error. */
12122 #define sp_ecc_point_new(heap, sp, p)                                   \
12123     ((p = XMALLOC(sizeof(sp_point), heap, DYNAMIC_TYPE_ECC)) == NULL) ? \
12124         MEMORY_E : MP_OKAY
12125 #else
12126 /* Set pointer to data and return no error. */
12127 #define sp_ecc_point_new(heap, sp, p)   ((p = &sp) == NULL) ? MEMORY_E : MP_OKAY
12128 #endif
12129 
12130 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
12131 /* If valid pointer then clear point data if requested and free data. */
12132 #define sp_ecc_point_free(p, clear, heap)     \
12133     do {                                      \
12134         if (p != NULL) {                      \
12135             if (clear)                        \
12136                 XMEMSET(p, 0, sizeof(*p));    \
12137             XFREE(p, heap, DYNAMIC_TYPE_ECC); \
12138         }                                     \
12139     }                                         \
12140     while (0)
12141 #else
12142 /* Clear point data if requested. */
12143 #define sp_ecc_point_free(p, clear, heap) \
12144     do {                                  \
12145         if (clear)                        \
12146             XMEMSET(p, 0, sizeof(*p));    \
12147     }                                     \
12148     while (0)
12149 #endif
12150 
12151 /* Multiply a number by Montogmery normalizer mod modulus (prime).
12152  *
12153  * r  The resulting Montgomery form number.
12154  * a  The number to convert.
12155  * m  The modulus (prime).
12156  */
12157 static int sp_256_mod_mul_norm_4(sp_digit* r, sp_digit* a, sp_digit* m)
12158 {
12159     int64_t t[8];
12160     int64_t a32[8];
12161     int64_t o;
12162 
12163     (void)m;
12164 
12165     a32[0] = a[0] & 0xffffffff;
12166     a32[1] = a[0] >> 32;
12167     a32[2] = a[1] & 0xffffffff;
12168     a32[3] = a[1] >> 32;
12169     a32[4] = a[2] & 0xffffffff;
12170     a32[5] = a[2] >> 32;
12171     a32[6] = a[3] & 0xffffffff;
12172     a32[7] = a[3] >> 32;
12173 
12174     /*  1  1  0 -1 -1 -1 -1  0 */
12175     t[0] = 0 + a32[0] + a32[1] - a32[3] - a32[4] - a32[5] - a32[6];
12176     /*  0  1  1  0 -1 -1 -1 -1 */
12177     t[1] = 0 + a32[1] + a32[2] - a32[4] - a32[5] - a32[6] - a32[7];
12178     /*  0  0  1  1  0 -1 -1 -1 */
12179     t[2] = 0 + a32[2] + a32[3] - a32[5] - a32[6] - a32[7];
12180     /* -1 -1  0  2  2  1  0 -1 */
12181     t[3] = 0 - a32[0] - a32[1] + 2 * a32[3] + 2 * a32[4] + a32[5] - a32[7];
12182     /*  0 -1 -1  0  2  2  1  0 */
12183     t[4] = 0 - a32[1] - a32[2] + 2 * a32[4] + 2 * a32[5] + a32[6];
12184     /*  0  0 -1 -1  0  2  2  1 */
12185     t[5] = 0 - a32[2] - a32[3] + 2 * a32[5] + 2 * a32[6] + a32[7];
12186     /* -1 -1  0  0  0  1  3  2 */
12187     t[6] = 0 - a32[0] - a32[1] + a32[5] + 3 * a32[6] + 2 * a32[7];
12188     /*  1  0 -1 -1 -1 -1  0  3 */
12189     t[7] = 0 + a32[0] - a32[2] - a32[3] - a32[4] - a32[5] + 3 * a32[7];
12190 
12191     t[1] += t[0] >> 32; t[0] &= 0xffffffff;
12192     t[2] += t[1] >> 32; t[1] &= 0xffffffff;
12193     t[3] += t[2] >> 32; t[2] &= 0xffffffff;
12194     t[4] += t[3] >> 32; t[3] &= 0xffffffff;
12195     t[5] += t[4] >> 32; t[4] &= 0xffffffff;
12196     t[6] += t[5] >> 32; t[5] &= 0xffffffff;
12197     t[7] += t[6] >> 32; t[6] &= 0xffffffff;
12198     o     = t[7] >> 32; t[7] &= 0xffffffff;
12199     t[0] += o;
12200     t[3] -= o;
12201     t[6] -= o;
12202     t[7] += o;
12203     t[1] += t[0] >> 32; t[0] &= 0xffffffff;
12204     t[2] += t[1] >> 32; t[1] &= 0xffffffff;
12205     t[3] += t[2] >> 32; t[2] &= 0xffffffff;
12206     t[4] += t[3] >> 32; t[3] &= 0xffffffff;
12207     t[5] += t[4] >> 32; t[4] &= 0xffffffff;
12208     t[6] += t[5] >> 32; t[5] &= 0xffffffff;
12209     t[7] += t[6] >> 32; t[6] &= 0xffffffff;
12210     r[0] = (t[1] << 32) | t[0];
12211     r[1] = (t[3] << 32) | t[2];
12212     r[2] = (t[5] << 32) | t[4];
12213     r[3] = (t[7] << 32) | t[6];
12214 
12215     return MP_OKAY;
12216 }
12217 
12218 /* Convert an mp_int to an array of sp_digit.
12219  *
12220  * r  A single precision integer.
12221  * a  A multi-precision integer.
12222  */
12223 static void sp_256_from_mp(sp_digit* r, int max, mp_int* a)
12224 {
12225 #if DIGIT_BIT == 64
12226     int j;
12227 
12228     XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
12229 
12230     for (j = a->used; j < max; j++)
12231         r[j] = 0;
12232 #elif DIGIT_BIT > 64
12233     int i, j = 0, s = 0;
12234 
12235     r[0] = 0;
12236     for (i = 0; i < a->used && j < max; i++) {
12237         r[j] |= a->dp[i] << s;
12238         r[j] &= 0xffffffffffffffffl;
12239         s = 64 - s;
12240         if (j + 1 >= max)
12241             break;
12242         r[++j] = a->dp[i] >> s;
12243         while (s + 64 <= DIGIT_BIT) {
12244             s += 64;
12245             r[j] &= 0xffffffffffffffffl;
12246             if (j + 1 >= max)
12247                 break;
12248             if (s < DIGIT_BIT)
12249                 r[++j] = a->dp[i] >> s;
12250             else
12251                 r[++j] = 0;
12252         }
12253         s = DIGIT_BIT - s;
12254     }
12255 
12256     for (j++; j < max; j++)
12257         r[j] = 0;
12258 #else
12259     int i, j = 0, s = 0;
12260 
12261     r[0] = 0;
12262     for (i = 0; i < a->used && j < max; i++) {
12263         r[j] |= ((sp_digit)a->dp[i]) << s;
12264         if (s + DIGIT_BIT >= 64) {
12265             r[j] &= 0xffffffffffffffffl;
12266             if (j + 1 >= max)
12267                 break;
12268             s = 64 - s;
12269             if (s == DIGIT_BIT) {
12270                 r[++j] = 0;
12271                 s = 0;
12272             }
12273             else {
12274                 r[++j] = a->dp[i] >> s;
12275                 s = DIGIT_BIT - s;
12276             }
12277         }
12278         else
12279             s += DIGIT_BIT;
12280     }
12281 
12282     for (j++; j < max; j++)
12283         r[j] = 0;
12284 #endif
12285 }
12286 
12287 /* Convert a point of type ecc_point to type sp_point.
12288  *
12289  * p   Point of type sp_point (result).
12290  * pm  Point of type ecc_point.
12291  */
12292 static void sp_256_point_from_ecc_point_4(sp_point* p, ecc_point* pm)
12293 {
12294     XMEMSET(p->x, 0, sizeof(p->x));
12295     XMEMSET(p->y, 0, sizeof(p->y));
12296     XMEMSET(p->z, 0, sizeof(p->z));
12297     sp_256_from_mp(p->x, 4, pm->x);
12298     sp_256_from_mp(p->y, 4, pm->y);
12299     sp_256_from_mp(p->z, 4, pm->z);
12300     p->infinity = 0;
12301 }
12302 
12303 /* Convert an array of sp_digit to an mp_int.
12304  *
12305  * a  A single precision integer.
12306  * r  A multi-precision integer.
12307  */
12308 static int sp_256_to_mp(sp_digit* a, mp_int* r)
12309 {
12310     int err;
12311 
12312     err = mp_grow(r, (256 + DIGIT_BIT - 1) / DIGIT_BIT);
12313     if (err == MP_OKAY) {
12314 #if DIGIT_BIT == 64
12315         XMEMCPY(r->dp, a, sizeof(sp_digit) * 4);
12316         r->used = 4;
12317         mp_clamp(r);
12318 #elif DIGIT_BIT < 64
12319         int i, j = 0, s = 0;
12320 
12321         r->dp[0] = 0;
12322         for (i = 0; i < 4; i++) {
12323             r->dp[j] |= a[i] << s;
12324             r->dp[j] &= (1l << DIGIT_BIT) - 1;
12325             s = DIGIT_BIT - s;
12326             r->dp[++j] = a[i] >> s;
12327             while (s + DIGIT_BIT <= 64) {
12328                 s += DIGIT_BIT;
12329                 r->dp[j] &= (1l << DIGIT_BIT) - 1;
12330                 r->dp[++j] = a[i] >> s;
12331             }
12332             s = 64 - s;
12333         }
12334         r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
12335         mp_clamp(r);
12336 #else
12337         int i, j = 0, s = 0;
12338 
12339         r->dp[0] = 0;
12340         for (i = 0; i < 4; i++) {
12341             r->dp[j] |= ((mp_digit)a[i]) << s;
12342             if (s + 64 >= DIGIT_BIT) {
12343     #if DIGIT_BIT < 64
12344                 r->dp[j] &= (1l << DIGIT_BIT) - 1;
12345     #endif
12346                 s = DIGIT_BIT - s;
12347                 r->dp[++j] = a[i] >> s;
12348                 s = 64 - s;
12349             }
12350             else
12351                 s += 64;
12352         }
12353         r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
12354         mp_clamp(r);
12355 #endif
12356     }
12357 
12358     return err;
12359 }
12360 
12361 /* Convert a point of type sp_point to type ecc_point.
12362  *
12363  * p   Point of type sp_point.
12364  * pm  Point of type ecc_point (result).
12365  * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
12366  * MP_OKAY.
12367  */
12368 static int sp_256_point_to_ecc_point_4(sp_point* p, ecc_point* pm)
12369 {
12370     int err;
12371 
12372     err = sp_256_to_mp(p->x, pm->x);
12373     if (err == MP_OKAY)
12374         err = sp_256_to_mp(p->y, pm->y);
12375     if (err == MP_OKAY)
12376         err = sp_256_to_mp(p->z, pm->z);
12377 
12378     return err;
12379 }
12380 
12381 /* Conditionally copy a into r using the mask m.
12382  * m is -1 to copy and 0 when not.
12383  *
12384  * r  A single precision number to copy over.
12385  * a  A single precision number to copy.
12386  * m  Mask value to apply.
12387  */
12388 static void sp_256_cond_copy_4(sp_digit* r, const sp_digit* a, const sp_digit m)
12389 {
12390     __asm__ __volatile__ (
12391         "ldp    x3, x4, [%[r], 0]\n\t"
12392         "ldp    x5, x6, [%[r], 16]\n\t"
12393         "ldp    x7, x8, [%[a], 0]\n\t"
12394         "ldp    x9, x10, [%[a], 16]\n\t"
12395         "eor    x7, x7, x3\n\t"
12396         "eor    x8, x8, x4\n\t"
12397         "eor    x9, x9, x5\n\t"
12398         "eor    x10, x10, x6\n\t"
12399         "and    x7, x7, %[m]\n\t"
12400         "and    x8, x8, %[m]\n\t"
12401         "and    x9, x9, %[m]\n\t"
12402         "and    x10, x10, %[m]\n\t"
12403         "eor    x3, x3, x7\n\t"
12404         "eor    x4, x4, x8\n\t"
12405         "eor    x5, x5, x9\n\t"
12406         "eor    x6, x6, x10\n\t"
12407         "stp    x3, x4, [%[r], 0]\n\t"
12408         "stp    x5, x6, [%[r], 16]\n\t"
12409         :
12410         : [r] "r" (r), [a] "r" (a), [m] "r" (m)
12411         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
12412     );
12413 }
12414 
12415 /* Compare a with b in constant time.
12416  *
12417  * a  A single precision integer.
12418  * b  A single precision integer.
12419  * return -ve, 0 or +ve if a is less than, equal to or greater than b
12420  * respectively.
12421  */
12422 static int64_t sp_256_cmp_4(sp_digit* a, sp_digit* b)
12423 {
12424     sp_digit r = -1;
12425     sp_digit one = 1;
12426 
12427 #ifdef WOLFSSL_SP_SMALL
12428     __asm__ __volatile__ (
12429         "mov    x3, -1\n\t"
12430         "mov    x6, 24\n\t"
12431         "1:\n\t"
12432         "ldr    x4, [%[a], x6]\n\t"
12433         "ldr    x5, [%[b], x6]\n\t"
12434         "and    x4, x4, x3\n\t"
12435         "and    x5, x5, x3\n\t"
12436         "subs   x4, x4, x5\n\t"
12437         "csel   %[r], %[one], %[r], hi\n\t"
12438         "csel   %[r], x3, %[r], lo\n\t"
12439         "csel   x3, x3, xzr, eq\n\t"
12440         "sub    x6, x6, #8\n\t"
12441         "b.cc   1b\n\t"
12442         "eor    %[r], %[r], x3\n\t"
12443         : [r] "+r" (r)
12444         : [a] "r" (a), [b] "r" (b), [one] "r" (one)
12445         : "x2", "x3", "x4", "x5", "x6"
12446     );
12447 #else
12448     __asm__ __volatile__ (
12449         "mov    x3, -1\n\t"
12450         "ldr        x4, [%[a], 24]\n\t"
12451         "ldr        x5, [%[b], 24]\n\t"
12452         "and        x4, x4, x3\n\t"
12453         "and        x5, x5, x3\n\t"
12454         "subs   x4, x4, x5\n\t"
12455         "csel   %[r], %[one], %[r], hi\n\t"
12456         "csel   %[r], x3, %[r], lo\n\t"
12457         "csel   x3, x3, xzr, eq\n\t"
12458         "ldr        x4, [%[a], 16]\n\t"
12459         "ldr        x5, [%[b], 16]\n\t"
12460         "and        x4, x4, x3\n\t"
12461         "and        x5, x5, x3\n\t"
12462         "subs   x4, x4, x5\n\t"
12463         "csel   %[r], %[one], %[r], hi\n\t"
12464         "csel   %[r], x3, %[r], lo\n\t"
12465         "csel   x3, x3, xzr, eq\n\t"
12466         "ldr        x4, [%[a], 8]\n\t"
12467         "ldr        x5, [%[b], 8]\n\t"
12468         "and        x4, x4, x3\n\t"
12469         "and        x5, x5, x3\n\t"
12470         "subs   x4, x4, x5\n\t"
12471         "csel   %[r], %[one], %[r], hi\n\t"
12472         "csel   %[r], x3, %[r], lo\n\t"
12473         "csel   x3, x3, xzr, eq\n\t"
12474         "ldr        x4, [%[a], 0]\n\t"
12475         "ldr        x5, [%[b], 0]\n\t"
12476         "and        x4, x4, x3\n\t"
12477         "and        x5, x5, x3\n\t"
12478         "subs   x4, x4, x5\n\t"
12479         "csel   %[r], %[one], %[r], hi\n\t"
12480         "csel   %[r], x3, %[r], lo\n\t"
12481         "csel   x3, x3, xzr, eq\n\t"
12482         "eor    %[r], %[r], x3\n\t"
12483         : [r] "+r" (r)
12484         : [a] "r" (a), [b] "r" (b), [one] "r" (one)
12485         : "x2", "x3", "x4", "x5", "x6"
12486     );
12487 #endif
12488 
12489     return r;
12490 }
12491 
12492 /* Normalize the values in each word to 64.
12493  *
12494  * a  Array of sp_digit to normalize.
12495  */
12496 #define sp_256_norm_4(a)
12497 
12498 /* Conditionally subtract b from a using the mask m.
12499  * m is -1 to subtract and 0 when not copying.
12500  *
12501  * r  A single precision number representing condition subtract result.
12502  * a  A single precision number to subtract from.
12503  * b  A single precision number to subtract.
12504  * m  Mask value to apply.
12505  */
12506 static sp_digit sp_256_cond_sub_4(sp_digit* r, sp_digit* a, sp_digit* b,
12507         sp_digit m)
12508 {
12509     sp_digit c = 0;
12510 
12511     __asm__ __volatile__ (
12512 
12513         "ldr        x4, [%[a], 0]\n\t"
12514         "ldr        x6, [%[a], 8]\n\t"
12515         "ldr        x5, [%[b], 0]\n\t"
12516         "ldr        x7, [%[b], 8]\n\t"
12517         "and        x5, x5, %[m]\n\t"
12518         "and        x7, x7, %[m]\n\t"
12519         "subs   x4, x4, x5\n\t"
12520         "sbcs   x6, x6, x7\n\t"
12521         "str        x4, [%[r], 0]\n\t"
12522         "str        x6, [%[r], 8]\n\t"
12523         "ldr        x4, [%[a], 16]\n\t"
12524         "ldr        x6, [%[a], 24]\n\t"
12525         "ldr        x5, [%[b], 16]\n\t"
12526         "ldr        x7, [%[b], 24]\n\t"
12527         "and        x5, x5, %[m]\n\t"
12528         "and        x7, x7, %[m]\n\t"
12529         "sbcs   x4, x4, x5\n\t"
12530         "sbcs   x6, x6, x7\n\t"
12531         "str        x4, [%[r], 16]\n\t"
12532         "str        x6, [%[r], 24]\n\t"
12533         "csetm  %[c], cc\n\t"
12534         : [c] "+r" (c)
12535         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
12536         : "memory", "x4", "x6", "x5", "x7", "x8"
12537     );
12538 
12539     return c;
12540 }
12541 
12542 /* Sub b from a into r. (r = a - b)
12543  *
12544  * r  A single precision integer.
12545  * a  A single precision integer.
12546  * b  A single precision integer.
12547  */
12548 static sp_digit sp_256_sub_4(sp_digit* r, const sp_digit* a,
12549         const sp_digit* b)
12550 {
12551     sp_digit c = 0;
12552 
12553     __asm__ __volatile__ (
12554         "ldp    x3, x4, [%[a], 0]\n\t"
12555         "ldp    x5, x6, [%[a], 16]\n\t"
12556         "ldp    x7, x8, [%[b], 0]\n\t"
12557         "ldp    x9, x10, [%[b], 16]\n\t"
12558         "subs   x3, x3, x7\n\t"
12559         "sbcs   x4, x4, x8\n\t"
12560         "sbcs   x5, x5, x9\n\t"
12561         "sbcs   x6, x6, x10\n\t"
12562         "stp    x3, x4, [%[r], 0]\n\t"
12563         "stp    x5, x6, [%[r], 16]\n\t"
12564         "csetm  %[c], cc\n\t"
12565         : [c] "+r" (c)
12566         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
12567         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
12568     );
12569 
12570     return c;
12571 }
12572 
12573 /* Reduce the number back to 256 bits using Montgomery reduction.
12574  *
12575  * a   A single precision number to reduce in place.
12576  * m   The single precision number representing the modulus.
12577  * mp  The digit representing the negative inverse of m mod 2^n.
12578  */
12579 SP_NOINLINE static void sp_256_mont_reduce_4(sp_digit* a, sp_digit* m,
12580         sp_digit mp)
12581 {
12582     __asm__ __volatile__ (
12583         "# i = 0\n\t"
12584         "mov    x9, xzr\n\t"
12585         "mov    x8, xzr\n\t"
12586         "mov    x6, %[a]\n\t"
12587         "\n1:\n\t"
12588         "# mu = a[i] * mp\n\t"
12589         "ldr    x5, [x6, 0]\n\t"
12590         "mov    x7, x5\n\t"
12591         "mul    x5, %[mp], x5\n\t"
12592         "# a[i+0] += m[0] * mu\n\t"
12593         "ldr    x4, [%[m], 0]\n\t"
12594         "ldr    x11, [%[m], 8]\n\t"
12595         "mul    x3, x4, x5\n\t"
12596         "umulh  x10, x4, x5\n\t"
12597         "adds   x7, x7, x3\n\t"
12598         "str    x7, [x6, 0]\n\t"
12599         "adc    x10, x10, xzr\n\t"
12600         "# a[i+1] += m[1] * mu\n\t"
12601         "mul    x3, x11, x5\n\t"
12602         "umulh  x12, x11, x5\n\t"
12603         "ldr    x11, [%[m], 16]\n\t"
12604         "ldr    x7, [x6, 8]\n\t"
12605         "adds   x3, x3, x10\n\t"
12606         "adc    x12, x12, xzr\n\t"
12607         "adds   x7, x7, x3\n\t"
12608         "str    x7, [x6, 8]\n\t"
12609         "adc    x12, x12, xzr\n\t"
12610         "# a[i+2] += m[2] * mu\n\t"
12611         "mul    x3, x11, x5\n\t"
12612         "umulh  x10, x11, x5\n\t"
12613         "ldr    x11, [%[m], 24]\n\t"
12614         "ldr    x7, [x6, 16]\n\t"
12615         "adds   x3, x3, x12\n\t"
12616         "adc    x10, x10, xzr\n\t"
12617         "adds   x7, x7, x3\n\t"
12618         "str    x7, [x6, 16]\n\t"
12619         "adc    x10, x10, xzr\n\t"
12620         "# a[i+3] += m[3] * mu\n\t"
12621         "mul    x3, x11, x5\n\t"
12622         "umulh  x4, x11, x5\n\t"
12623         "ldr    x7, [x6, 24]\n\t"
12624         "ldr    x12, [x6, 32]\n\t"
12625         "adds   x3, x3, x10\n\t"
12626         "adcs   x4, x4, x9\n\t"
12627         "cset   x9, cs\n\t"
12628         "adds   x7, x7, x3\n\t"
12629         "str    x7, [x6, 24]\n\t"
12630         "adcs   x12, x12, x4\n\t"
12631         "str    x12, [x6, 32]\n\t"
12632         "adc    x9, x9, xzr\n\t"
12633         "# i += 1\n\t"
12634         "add    x6, x6, 8\n\t"
12635         "add    x8, x8, 8\n\t"
12636         "cmp    x8, 32\n\t"
12637         "b.lt   1b\n\t"
12638         "ldr    x5, [%[a], 32]\n\t"
12639         "ldr    x6, [%[a], 40]\n\t"
12640         "ldr    x7, [%[a], 48]\n\t"
12641         "ldr    x8, [%[a], 56]\n\t"
12642         "sub    x3, xzr, x9\n\t"
12643         "ldr    x9, [%[m], 0]\n\t"
12644         "ldr    x10, [%[m], 8]\n\t"
12645         "ldr    x11, [%[m], 16]\n\t"
12646         "ldr    x12, [%[m], 24]\n\t"
12647         "and    x9, x9, x3\n\t"
12648         "and    x10, x10, x3\n\t"
12649         "and    x11, x11, x3\n\t"
12650         "and    x12, x12, x3\n\t"
12651         "subs   x5, x5, x9\n\t"
12652         "sbcs   x6, x6, x10\n\t"
12653         "sbcs   x7, x7, x11\n\t"
12654         "sbc    x8, x8, x12\n\t"
12655         "str    x5, [%[a], 0]\n\t"
12656         "str    x6, [%[a], 8]\n\t"
12657         "str    x7, [%[a], 16]\n\t"
12658         "str    x8, [%[a], 24]\n\t"
12659         :
12660         : [a] "r" (a), [m] "r" (m), [mp] "r" (mp)
12661         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11",
12662           "x12"
12663     );
12664 }
12665 
12666 /* Multiply two Montogmery form numbers mod the modulus (prime).
12667  * (r = a * b mod m)
12668  *
12669  * r   Result of multiplication.
12670  * a   First number to multiply in Montogmery form.
12671  * b   Second number to multiply in Montogmery form.
12672  * m   Modulus (prime).
12673  * mp  Montogmery mulitplier.
12674  */
12675 SP_NOINLINE static void sp_256_mont_mul_4(sp_digit* r, sp_digit* a, sp_digit* b,
12676         sp_digit* m, sp_digit mp)
12677 {
12678     (void)mp;
12679 
12680     __asm__ __volatile__ (
12681         "ldr    x18, [%[a], 0]\n\t"
12682         "ldr    x19, [%[a], 8]\n\t"
12683         "ldr    x20, [%[a], 16]\n\t"
12684         "ldr    x21, [%[a], 24]\n\t"
12685         "ldr    x22, [%[b], 0]\n\t"
12686         "ldr    x23, [%[b], 8]\n\t"
12687         "ldr    x24, [%[b], 16]\n\t"
12688         "ldr    x25, [%[b], 24]\n\t"
12689         "#  A[0] * B[0]\n\t"
12690         "mul    x10, x18, x22\n\t"
12691         "umulh  x11, x18, x22\n\t"
12692         "#  A[0] * B[1]\n\t"
12693         "mul    x5, x18, x23\n\t"
12694         "umulh  x6, x18, x23\n\t"
12695         "adds   x11, x11, x5\n\t"
12696         "adc    x12, xzr, x6\n\t"
12697         "#  A[1] * B[0]\n\t"
12698         "mul    x5, x19, x22\n\t"
12699         "umulh  x6, x19, x22\n\t"
12700         "adds   x11, x11, x5\n\t"
12701         "adcs   x12, x12, x6\n\t"
12702         "adc    x13, xzr, xzr\n\t"
12703         "#  A[0] * B[2]\n\t"
12704         "mul    x5, x18, x24\n\t"
12705         "umulh  x6, x18, x24\n\t"
12706         "adds   x12, x12, x5\n\t"
12707         "adc    x13, x13, x6\n\t"
12708         "#  A[1] * B[1]\n\t"
12709         "mul    x5, x19, x23\n\t"
12710         "umulh  x6, x19, x23\n\t"
12711         "adds   x12, x12, x5\n\t"
12712         "adcs   x13, x13, x6\n\t"
12713         "adc    x14, xzr, xzr\n\t"
12714         "#  A[2] * B[0]\n\t"
12715         "mul    x5, x20, x22\n\t"
12716         "umulh  x6, x20, x22\n\t"
12717         "adds   x12, x12, x5\n\t"
12718         "adcs   x13, x13, x6\n\t"
12719         "adc    x14, x14, xzr\n\t"
12720         "#  A[0] * B[3]\n\t"
12721         "mul    x5, x18, x25\n\t"
12722         "umulh  x6, x18, x25\n\t"
12723         "adds   x13, x13, x5\n\t"
12724         "adcs   x14, x14, x6\n\t"
12725         "adc    x15, xzr, xzr\n\t"
12726         "#  A[1] * B[2]\n\t"
12727         "mul    x5, x19, x24\n\t"
12728         "umulh  x6, x19, x24\n\t"
12729         "adds   x13, x13, x5\n\t"
12730         "adcs   x14, x14, x6\n\t"
12731         "adc    x15, x15, xzr\n\t"
12732         "#  A[2] * B[1]\n\t"
12733         "mul    x5, x20, x23\n\t"
12734         "umulh  x6, x20, x23\n\t"
12735         "adds   x13, x13, x5\n\t"
12736         "adcs   x14, x14, x6\n\t"
12737         "adc    x15, x15, xzr\n\t"
12738         "#  A[3] * B[0]\n\t"
12739         "mul    x5, x21, x22\n\t"
12740         "umulh  x6, x21, x22\n\t"
12741         "adds   x13, x13, x5\n\t"
12742         "adcs   x14, x14, x6\n\t"
12743         "adc    x15, x15, xzr\n\t"
12744         "#  A[1] * B[3]\n\t"
12745         "mul    x5, x19, x25\n\t"
12746         "umulh  x6, x19, x25\n\t"
12747         "adds   x14, x14, x5\n\t"
12748         "adcs   x15, x15, x6\n\t"
12749         "adc    x16, xzr, xzr\n\t"
12750         "#  A[2] * B[2]\n\t"
12751         "mul    x5, x20, x24\n\t"
12752         "umulh  x6, x20, x24\n\t"
12753         "adds   x14, x14, x5\n\t"
12754         "adcs   x15, x15, x6\n\t"
12755         "adc    x16, x16, xzr\n\t"
12756         "#  A[3] * B[1]\n\t"
12757         "mul    x5, x21, x23\n\t"
12758         "umulh  x6, x21, x23\n\t"
12759         "adds   x14, x14, x5\n\t"
12760         "adcs   x15, x15, x6\n\t"
12761         "adc    x16, x16, xzr\n\t"
12762         "#  A[2] * B[3]\n\t"
12763         "mul    x5, x20, x25\n\t"
12764         "umulh  x6, x20, x25\n\t"
12765         "adds   x15, x15, x5\n\t"
12766         "adcs   x16, x16, x6\n\t"
12767         "adc    x17, xzr, xzr\n\t"
12768         "#  A[3] * B[2]\n\t"
12769         "mul    x5, x21, x24\n\t"
12770         "umulh  x6, x21, x24\n\t"
12771         "adds   x15, x15, x5\n\t"
12772         "adcs   x16, x16, x6\n\t"
12773         "adc    x17, x17, xzr\n\t"
12774         "#  A[3] * B[3]\n\t"
12775         "mul    x5, x21, x25\n\t"
12776         "umulh  x6, x21, x25\n\t"
12777         "adds   x16, x16, x5\n\t"
12778         "adc    x17, x17, x6\n\t"
12779         "# Start Reduction\n\t"
12780         "mov    x5, x10\n\t"
12781         "mov    x6, x11\n\t"
12782         "mov    x7, x12\n\t"
12783         "mov    x8, x13\n\t"
12784         "# mu = a[0]-a[3] + a[0]-a[2] << 32 << 64 + (a[0] * 2) << 192\n\t"
12785         "#    - a[0] << 32 << 192\n\t"
12786         "#   + (a[0] * 2) << 192\n\t"
12787         "add    x8, x8, x10\n\t"
12788         "add    x8, x8, x10\n\t"
12789         "#   a[0]-a[2] << 32\n\t"
12790         "lsl    x10, x10, 32\n\t"
12791         "lsr    x18, x5, 32\n\t"
12792         "lsl    x11, x6, 32\n\t"
12793         "lsr    x19, x6, 32\n\t"
12794         "lsl    x12, x7, 32\n\t"
12795         "eor    x11, x11, x18\n\t"
12796         "eor    x12, x12, x19\n\t"
12797         "#   - a[0] << 32 << 192\n\t"
12798         "sub    x8, x8, x10\n\t"
12799         "#   + a[0]-a[2] << 32 << 64\n\t"
12800         "adds   x6, x6, x10\n\t"
12801         "adcs   x7, x7, x11\n\t"
12802         "adc    x8, x8, x12\n\t"
12803         "# a += (mu << 256) - (mu << 224) + (mu << 192) + (mu << 96) - mu\n\t"
12804         "#   a += mu << 256\n\t"
12805         "adds   x14, x14, x5\n\t"
12806         "adcs   x15, x15, x6\n\t"
12807         "adcs   x16, x16, x7\n\t"
12808         "adcs   x17, x17, x8\n\t"
12809         "csetm  x10, cs\n\t"
12810         "#   a += mu << 192\n\t"
12811         "adds   x13, x13, x5\n\t"
12812         "adcs   x14, x14, x6\n\t"
12813         "adcs   x15, x15, x7\n\t"
12814         "adcs   x16, x16, x8\n\t"
12815         "adcs   x17, x17, xzr\n\t"
12816         "csetm  x20, cs\n\t"
12817         "add    x10, x10, x20\n\t"
12818         "# mu <<= 32\n\t"
12819         "lsr    x9, x8, 32\n\t"
12820         "lsr    x18, x5, 32\n\t"
12821         "lsl    x5, x5, 32\n\t"
12822         "lsr    x19, x6, 32\n\t"
12823         "lsl    x6, x6, 32\n\t"
12824         "lsr    x20, x7, 32\n\t"
12825         "lsl    x7, x7, 32\n\t"
12826         "lsl    x8, x8, 32\n\t"
12827         "eor    x6, x6, x18\n\t"
12828         "eor    x7, x7, x19\n\t"
12829         "eor    x8, x8, x20\n\t"
12830         "#   a += (mu << 32) << 64\n\t"
12831         "adds   x13, x13, x7\n\t"
12832         "adcs   x14, x14, x8\n\t"
12833         "adcs   x15, x15, x9\n\t"
12834         "adcs   x16, x16, xzr\n\t"
12835         "adcs   x17, x17, xzr\n\t"
12836         "csetm  x20, cs\n\t"
12837         "add    x10, x10, x20\n\t"
12838         "#   a -= (mu << 32) << 192\n\t"
12839         "subs   x13, x13, x5\n\t"
12840         "mov    x18, 0xffffffff\n\t"
12841         "sbcs   x14, x14, x6\n\t"
12842         "mov    x19, 0xffffffff00000001\n\t"
12843         "sbcs   x15, x15, x7\n\t"
12844         "sbcs   x16, x16, x8\n\t"
12845         "sbcs   x17, x17, x9\n\t"
12846         "cset   x20, cc\n\t"
12847         "add    x10, x10, x20\n\t"
12848         "# mask m and sub from result if overflow\n\t"
12849         "#  m[0] = -1 & mask = mask\n\t"
12850         "and    x18, x18, x10\n\t"
12851         "#  m[2] =  0 & mask = 0\n\t"
12852         "and    x19, x19, x10\n\t"
12853         "subs   x14, x14, x10\n\t"
12854         "sbcs   x15, x15, x18\n\t"
12855         "sbcs   x16, x16, xzr\n\t"
12856         "sbc    x17, x17, x19\n\t"
12857         "str    x14, [%[r], 0]\n\t"
12858         "str    x15, [%[r], 8]\n\t"
12859         "str    x16, [%[r], 16]\n\t"
12860         "str    x17, [%[r], 24]\n\t"
12861         : [m] "+r" (m), [a] "+r" (a), [b] "+r" (b)
12862         : [r] "r" (r)
12863         : "memory", "x5", "x6", "x7", "x8", "x9",
12864           "x18", "x19", "x20", "x21",
12865           "x22", "x23", "x24", "x25",
12866           "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17"
12867     );
12868 }
12869 
12870 /* Square the Montgomery form number mod the modulus (prime). (r = a * a mod m)
12871  *
12872  * r   Result of squaring.
12873  * a   Number to square in Montogmery form.
12874  * m   Modulus (prime).
12875  * mp  Montogmery mulitplier.
12876  */
12877 SP_NOINLINE static void sp_256_mont_sqr_4(sp_digit* r, sp_digit* a, sp_digit* m,
12878         sp_digit mp)
12879 {
12880     __asm__ __volatile__ (
12881         "ldr    x18, [%[a], 0]\n\t"
12882         "ldr    x19, [%[a], 8]\n\t"
12883         "ldr    x20, [%[a], 16]\n\t"
12884         "ldr    x21, [%[a], 24]\n\t"
12885         "#  A[0] * A[1]\n\t"
12886         "mul    x11, x18, x19\n\t"
12887         "umulh  x12, x18, x19\n\t"
12888         "#  A[0] * A[2]\n\t"
12889         "mul    x5, x18, x20\n\t"
12890         "umulh  x6, x18, x20\n\t"
12891         "adds   x12, x12, x5\n\t"
12892         "adc    x13, xzr, x6\n\t"
12893         "#  A[0] * A[3]\n\t"
12894         "mul    x5, x18, x21\n\t"
12895         "umulh  x6, x18, x21\n\t"
12896         "adds   x13, x13, x5\n\t"
12897         "adc    x14, xzr, x6\n\t"
12898         "#  A[1] * A[2]\n\t"
12899         "mul    x5, x19, x20\n\t"
12900         "umulh  x6, x19, x20\n\t"
12901         "adds   x13, x13, x5\n\t"
12902         "adcs   x14, x14, x6\n\t"
12903         "adc    x15, xzr, xzr\n\t"
12904         "#  A[1] * A[3]\n\t"
12905         "mul    x5, x19, x21\n\t"
12906         "umulh  x6, x19, x21\n\t"
12907         "adds   x14, x14, x5\n\t"
12908         "adc    x15, x15, x6\n\t"
12909         "#  A[2] * A[3]\n\t"
12910         "mul    x5, x20, x21\n\t"
12911         "umulh  x6, x20, x21\n\t"
12912         "adds   x15, x15, x5\n\t"
12913         "adc    x16, xzr, x6\n\t"
12914         "# Double\n\t"
12915         "adds   x11, x11, x11\n\t"
12916         "adcs   x12, x12, x12\n\t"
12917         "adcs   x13, x13, x13\n\t"
12918         "adcs   x14, x14, x14\n\t"
12919         "adcs   x15, x15, x15\n\t"
12920         "adcs   x16, x16, x16\n\t"
12921         "cset   x17, cs\n\t"
12922         "#  A[0] * A[0]\n\t"
12923         "mul    x10, x18, x18\n\t"
12924         "umulh  x4, x18, x18\n\t"
12925         "#  A[1] * A[1]\n\t"
12926         "mul    x5, x19, x19\n\t"
12927         "umulh  x6, x19, x19\n\t"
12928         "#  A[2] * A[2]\n\t"
12929         "mul    x7, x20, x20\n\t"
12930         "umulh  x8, x20, x20\n\t"
12931         "#  A[3] * A[3]\n\t"
12932         "mul    x9, x21, x21\n\t"
12933         "umulh  x18, x21, x21\n\t"
12934         "adds   x11, x11, x4\n\t"
12935         "adcs   x12, x12, x5\n\t"
12936         "adcs   x13, x13, x6\n\t"
12937         "adcs   x14, x14, x7\n\t"
12938         "adcs   x15, x15, x8\n\t"
12939         "adcs   x16, x16, x9\n\t"
12940         "adc    x17, x17, x18\n\t"
12941         "# Start Reduction\n\t"
12942         "mov    x5, x10\n\t"
12943         "mov    x6, x11\n\t"
12944         "mov    x7, x12\n\t"
12945         "mov    x8, x13\n\t"
12946         "# mu = a[0]-a[3] + a[0]-a[2] << 32 << 64 + (a[0] * 2) << 192\n\t"
12947         "#    - a[0] << 32 << 192\n\t"
12948         "#   + (a[0] * 2) << 192\n\t"
12949         "add    x8, x8, x10\n\t"
12950         "add    x8, x8, x10\n\t"
12951         "#   a[0]-a[2] << 32\n\t"
12952         "lsl    x10, x10, 32\n\t"
12953         "lsr    x18, x5, 32\n\t"
12954         "lsl    x11, x6, 32\n\t"
12955         "lsr    x19, x6, 32\n\t"
12956         "lsl    x12, x7, 32\n\t"
12957         "eor    x11, x11, x18\n\t"
12958         "eor    x12, x12, x19\n\t"
12959         "#   - a[0] << 32 << 192\n\t"
12960         "sub    x8, x8, x10\n\t"
12961         "#   + a[0]-a[2] << 32 << 64\n\t"
12962         "adds   x6, x6, x10\n\t"
12963         "adcs   x7, x7, x11\n\t"
12964         "adc    x8, x8, x12\n\t"
12965         "# a += (mu << 256) - (mu << 224) + (mu << 192) + (mu << 96) - mu\n\t"
12966         "#   a += mu << 256\n\t"
12967         "adds   x14, x14, x5\n\t"
12968         "adcs   x15, x15, x6\n\t"
12969         "adcs   x16, x16, x7\n\t"
12970         "adcs   x17, x17, x8\n\t"
12971         "csetm  x10, cs\n\t"
12972         "#   a += mu << 192\n\t"
12973         "adds   x13, x13, x5\n\t"
12974         "adcs   x14, x14, x6\n\t"
12975         "adcs   x15, x15, x7\n\t"
12976         "adcs   x16, x16, x8\n\t"
12977         "adcs   x17, x17, xzr\n\t"
12978         "csetm  x20, cs\n\t"
12979         "add    x10, x10, x20\n\t"
12980         "# mu <<= 32\n\t"
12981         "lsr    x9, x8, 32\n\t"
12982         "lsr    x18, x5, 32\n\t"
12983         "lsl    x5, x5, 32\n\t"
12984         "lsr    x19, x6, 32\n\t"
12985         "lsl    x6, x6, 32\n\t"
12986         "lsr    x20, x7, 32\n\t"
12987         "lsl    x7, x7, 32\n\t"
12988         "lsl    x8, x8, 32\n\t"
12989         "eor    x6, x6, x18\n\t"
12990         "eor    x7, x7, x19\n\t"
12991         "eor    x8, x8, x20\n\t"
12992         "#   a += (mu << 32) << 64\n\t"
12993         "adds   x13, x13, x7\n\t"
12994         "adcs   x14, x14, x8\n\t"
12995         "adcs   x15, x15, x9\n\t"
12996         "adcs   x16, x16, xzr\n\t"
12997         "adcs   x17, x17, xzr\n\t"
12998         "csetm  x20, cs\n\t"
12999         "add    x10, x10, x20\n\t"
13000         "#   a -= (mu << 32) << 192\n\t"
13001         "subs   x13, x13, x5\n\t"
13002         "mov    x18, 0xffffffff\n\t"
13003         "sbcs   x14, x14, x6\n\t"
13004         "mov    x19, 0xffffffff00000001\n\t"
13005         "sbcs   x15, x15, x7\n\t"
13006         "sbcs   x16, x16, x8\n\t"
13007         "sbcs   x17, x17, x9\n\t"
13008         "cset   x20, cc\n\t"
13009         "add    x10, x10, x20\n\t"
13010         "# mask m and sub from result if overflow\n\t"
13011         "#  m[0] = -1 & mask = mask\n\t"
13012         "and    x18, x18, x10\n\t"
13013         "#  m[2] =  0 & mask = 0\n\t"
13014         "and    x19, x19, x10\n\t"
13015         "subs   x14, x14, x10\n\t"
13016         "sbcs   x15, x15, x18\n\t"
13017         "sbcs   x16, x16, xzr\n\t"
13018         "sbc    x17, x17, x19\n\t"
13019         "str    x14, [%[r], 0]\n\t"
13020         "str    x15, [%[r], 8]\n\t"
13021         "str    x16, [%[r], 16]\n\t"
13022         "str    x17, [%[r], 24]\n\t"
13023         : [m] "+r" (m), [a] "+r" (a), [mp] "+r" (mp)
13024         : [r] "r" (r)
13025         : "memory", "x4", "x5", "x6", "x7", "x8", "x9",
13026           "x18", "x19", "x20", "x21",
13027           "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17"
13028     );
13029 }
13030 
13031 #ifndef WOLFSSL_SP_SMALL
13032 /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
13033  *
13034  * r   Result of squaring.
13035  * a   Number to square in Montogmery form.
13036  * n   Number of times to square.
13037  * m   Modulus (prime).
13038  * mp  Montogmery mulitplier.
13039  */
13040 static void sp_256_mont_sqr_n_4(sp_digit* r, sp_digit* a, int n,
13041         sp_digit* m, sp_digit mp)
13042 {
13043     sp_256_mont_sqr_4(r, a, m, mp);
13044     for (; n > 1; n--)
13045         sp_256_mont_sqr_4(r, r, m, mp);
13046 }
13047 
13048 #else
13049 /* Mod-2 for the P256 curve. */
13050 static const uint64_t p256_mod_2[4] = {
13051     0xfffffffffffffffd,0x00000000ffffffff,0x0000000000000000,
13052     0xffffffff00000001
13053 };
13054 #endif /* !WOLFSSL_SP_SMALL */
13055 
13056 /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
13057  * P256 curve. (r = 1 / a mod m)
13058  *
13059  * r   Inverse result.
13060  * a   Number to invert.
13061  * td  Temporary data.
13062  */
13063 static void sp_256_mont_inv_4(sp_digit* r, sp_digit* a, sp_digit* td)
13064 {
13065 #ifdef WOLFSSL_SP_SMALL
13066     sp_digit* t = td;
13067     int i;
13068 
13069     XMEMCPY(t, a, sizeof(sp_digit) * 4);
13070     for (i=254; i>=0; i--) {
13071         sp_256_mont_sqr_4(t, t, p256_mod, p256_mp_mod);
13072         if (p256_mod_2[i / 64] & ((sp_digit)1 << (i % 64)))
13073             sp_256_mont_mul_4(t, t, a, p256_mod, p256_mp_mod);
13074     }
13075     XMEMCPY(r, t, sizeof(sp_digit) * 4);
13076 #else
13077     sp_digit* t = td;
13078     sp_digit* t2 = td + 2 * 4;
13079     sp_digit* t3 = td + 4 * 4;
13080 
13081     /* t = a^2 */
13082     sp_256_mont_sqr_4(t, a, p256_mod, p256_mp_mod);
13083     /* t = a^3 = t * a */
13084     sp_256_mont_mul_4(t, t, a, p256_mod, p256_mp_mod);
13085     /* t2= a^c = t ^ 2 ^ 2 */
13086     sp_256_mont_sqr_n_4(t2, t, 2, p256_mod, p256_mp_mod);
13087     /* t3= a^d = t2 * a */
13088     sp_256_mont_mul_4(t3, t2, a, p256_mod, p256_mp_mod);
13089     /* t = a^f = t2 * t */
13090     sp_256_mont_mul_4(t, t2, t, p256_mod, p256_mp_mod);
13091     /* t2= a^f0 = t ^ 2 ^ 4 */
13092     sp_256_mont_sqr_n_4(t2, t, 4, p256_mod, p256_mp_mod);
13093     /* t3= a^fd = t2 * t3 */
13094     sp_256_mont_mul_4(t3, t2, t3, p256_mod, p256_mp_mod);
13095     /* t = a^ff = t2 * t */
13096     sp_256_mont_mul_4(t, t2, t, p256_mod, p256_mp_mod);
13097     /* t2= a^ff00 = t ^ 2 ^ 8 */
13098     sp_256_mont_sqr_n_4(t2, t, 8, p256_mod, p256_mp_mod);
13099     /* t3= a^fffd = t2 * t3 */
13100     sp_256_mont_mul_4(t3, t2, t3, p256_mod, p256_mp_mod);
13101     /* t = a^ffff = t2 * t */
13102     sp_256_mont_mul_4(t, t2, t, p256_mod, p256_mp_mod);
13103     /* t2= a^ffff0000 = t ^ 2 ^ 16 */
13104     sp_256_mont_sqr_n_4(t2, t, 16, p256_mod, p256_mp_mod);
13105     /* t3= a^fffffffd = t2 * t3 */
13106     sp_256_mont_mul_4(t3, t2, t3, p256_mod, p256_mp_mod);
13107     /* t = a^ffffffff = t2 * t */
13108     sp_256_mont_mul_4(t, t2, t, p256_mod, p256_mp_mod);
13109     /* t = a^ffffffff00000000 = t ^ 2 ^ 32  */
13110     sp_256_mont_sqr_n_4(t2, t, 32, p256_mod, p256_mp_mod);
13111     /* t2= a^ffffffffffffffff = t2 * t */
13112     sp_256_mont_mul_4(t, t2, t, p256_mod, p256_mp_mod);
13113     /* t2= a^ffffffff00000001 = t2 * a */
13114     sp_256_mont_mul_4(t2, t2, a, p256_mod, p256_mp_mod);
13115     /* t2= a^ffffffff000000010000000000000000000000000000000000000000
13116      *   = t2 ^ 2 ^ 160 */
13117     sp_256_mont_sqr_n_4(t2, t2, 160, p256_mod, p256_mp_mod);
13118     /* t2= a^ffffffff00000001000000000000000000000000ffffffffffffffff
13119      *   = t2 * t */
13120     sp_256_mont_mul_4(t2, t2, t, p256_mod, p256_mp_mod);
13121     /* t2= a^ffffffff00000001000000000000000000000000ffffffffffffffff00000000
13122      *   = t2 ^ 2 ^ 32 */
13123     sp_256_mont_sqr_n_4(t2, t2, 32, p256_mod, p256_mp_mod);
13124     /* r = a^ffffffff00000001000000000000000000000000fffffffffffffffffffffffd
13125      *   = t2 * t3 */
13126     sp_256_mont_mul_4(r, t2, t3, p256_mod, p256_mp_mod);
13127 #endif /* WOLFSSL_SP_SMALL */
13128 }
13129 
13130 /* Map the Montgomery form projective co-ordinate point to an affine point.
13131  *
13132  * r  Resulting affine co-ordinate point.
13133  * p  Montgomery form projective co-ordinate point.
13134  * t  Temporary ordinate data.
13135  */
13136 static void sp_256_map_4(sp_point* r, sp_point* p, sp_digit* t)
13137 {
13138     sp_digit* t1 = t;
13139     sp_digit* t2 = t + 2*4;
13140     int64_t n;
13141 
13142     sp_256_mont_inv_4(t1, p->z, t + 2*4);
13143 
13144     sp_256_mont_sqr_4(t2, t1, p256_mod, p256_mp_mod);
13145     sp_256_mont_mul_4(t1, t2, t1, p256_mod, p256_mp_mod);
13146 
13147     /* x /= z^2 */
13148     sp_256_mont_mul_4(r->x, p->x, t2, p256_mod, p256_mp_mod);
13149     XMEMSET(r->x + 4, 0, sizeof(r->x) / 2);
13150     sp_256_mont_reduce_4(r->x, p256_mod, p256_mp_mod);
13151     /* Reduce x to less than modulus */
13152     n = sp_256_cmp_4(r->x, p256_mod);
13153     sp_256_cond_sub_4(r->x, r->x, p256_mod, 0 - (n >= 0));
13154     sp_256_norm_4(r->x);
13155 
13156     /* y /= z^3 */
13157     sp_256_mont_mul_4(r->y, p->y, t1, p256_mod, p256_mp_mod);
13158     XMEMSET(r->y + 4, 0, sizeof(r->y) / 2);
13159     sp_256_mont_reduce_4(r->y, p256_mod, p256_mp_mod);
13160     /* Reduce y to less than modulus */
13161     n = sp_256_cmp_4(r->y, p256_mod);
13162     sp_256_cond_sub_4(r->y, r->y, p256_mod, 0 - (n >= 0));
13163     sp_256_norm_4(r->y);
13164 
13165     XMEMSET(r->z, 0, sizeof(r->z));
13166     r->z[0] = 1;
13167 
13168 }
13169 
13170 /* Add two Montgomery form numbers (r = a + b % m).
13171  *
13172  * r   Result of addition.
13173  * a   First number to add in Montogmery form.
13174  * b   Second number to add in Montogmery form.
13175  * m   Modulus (prime).
13176  */
13177 static void sp_256_mont_add_4(sp_digit* r, sp_digit* a, sp_digit* b,
13178         sp_digit* m)
13179 {
13180     __asm__ __volatile__ (
13181         "ldr    x4, [%[a],0]\n\t"
13182         "ldr    x5, [%[a],8]\n\t"
13183         "ldr    x6, [%[a],16]\n\t"
13184         "ldr    x7, [%[a],24]\n\t"
13185         "ldr    x8, [%[b],0]\n\t"
13186         "ldr    x9, [%[b],8]\n\t"
13187         "ldr    x10, [%[b],16]\n\t"
13188         "ldr    x11, [%[b],24]\n\t"
13189         "adds   x4, x4, x8\n\t"
13190         "adcs   x5, x5, x9\n\t"
13191         "mov    x12, 0xffffffff\n\t"
13192         "adcs   x6, x6, x10\n\t"
13193         "adcs   x7, x7, x11\n\t"
13194         "mov    x13, 0xffffffff00000001\n\t"
13195         "csetm  x14, cs\n\t"
13196         "and    x12, x12, x14\n\t"
13197         "and    x13, x13, x14\n\t"
13198         "subs   x4, x4, x14\n\t"
13199         "sbcs   x5, x5, x12\n\t"
13200         "str    x4, [%[r],0]\n\t"
13201         "sbcs   x6, x6, xzr\n\t"
13202         "str    x5, [%[r],8]\n\t"
13203         "sbc    x7, x7, x13\n\t"
13204         "str    x6, [%[r],16]\n\t"
13205         "str    x7, [%[r],24]\n\t"
13206         :
13207         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
13208         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14"
13209     );
13210 }
13211 
13212 /* Double a Montgomery form number (r = a + a % m).
13213  *
13214  * r   Result of doubling.
13215  * a   Number to double in Montogmery form.
13216  * m   Modulus (prime).
13217  */
13218 static void sp_256_mont_dbl_4(sp_digit* r, sp_digit* a, sp_digit* m)
13219 {
13220     __asm__ __volatile__ (
13221         "ldr    x3, [%[a]]\n\t"
13222         "ldr    x4, [%[a],8]\n\t"
13223         "ldr    x5, [%[a],16]\n\t"
13224         "ldr    x6, [%[a],24]\n\t"
13225         "adds   x3, x3, x3\n\t"
13226         "adcs   x4, x4, x4\n\t"
13227         "mov    x7, 0xffffffff\n\t"
13228         "adcs   x5, x5, x5\n\t"
13229         "mov    x8, 0xffffffff00000001\n\t"
13230         "adcs   x6, x6, x6\n\t"
13231         "csetm  x9, cs\n\t"
13232         "and    x7, x7, x9\n\t"
13233         "and    x8, x8, x9\n\t"
13234         "subs   x3, x3, x9\n\t"
13235         "sbcs   x4, x4, x7\n\t"
13236         "str    x3, [%[r],0]\n\t"
13237         "sbcs   x5, x5, xzr\n\t"
13238         "str    x4, [%[r],8]\n\t"
13239         "sbc    x6, x6, x8\n\t"
13240         "str    x5, [%[r],16]\n\t"
13241         "str    x6, [%[r],24]\n\t"
13242         :
13243         : [r] "r" (r), [a] "r" (a)
13244         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
13245     );
13246 
13247     (void)m;
13248 }
13249 
13250 /* Triple a Montgomery form number (r = a + a + a % m).
13251  *
13252  * r   Result of Tripling.
13253  * a   Number to triple in Montogmery form.
13254  * m   Modulus (prime).
13255  */
13256 static void sp_256_mont_tpl_4(sp_digit* r, sp_digit* a, sp_digit* m)
13257 {
13258     __asm__ __volatile__ (
13259         "ldr    x10, [%[a]]\n\t"
13260         "ldr    x11, [%[a],8]\n\t"
13261         "ldr    x12, [%[a],16]\n\t"
13262         "ldr    x13, [%[a],24]\n\t"
13263         "adds   x3, x10, x10\n\t"
13264         "adcs   x4, x11, x11\n\t"
13265         "mov    x7, 0xffffffff\n\t"
13266         "adcs   x5, x12, x12\n\t"
13267         "mov    x8, 0xffffffff00000001\n\t"
13268         "adcs   x6, x13, x13\n\t"
13269         "csetm  x9, cs\n\t"
13270         "and    x7, x7, x9\n\t"
13271         "and    x8, x8, x9\n\t"
13272         "subs   x3, x3, x9\n\t"
13273         "sbcs   x4, x4, x7\n\t"
13274         "sbcs   x5, x5, xzr\n\t"
13275         "sbc    x6, x6, x8\n\t"
13276         "adds   x3, x3, x10\n\t"
13277         "adcs   x4, x4, x11\n\t"
13278         "mov    x7, 0xffffffff\n\t"
13279         "adcs   x5, x5, x12\n\t"
13280         "mov    x8, 0xffffffff00000001\n\t"
13281         "adcs   x6, x6, x13\n\t"
13282         "csetm  x9, cs\n\t"
13283         "and    x7, x7, x9\n\t"
13284         "and    x8, x8, x9\n\t"
13285         "subs   x3, x3, x9\n\t"
13286         "sbcs   x4, x4, x7\n\t"
13287         "sbcs   x5, x5, xzr\n\t"
13288         "sbc    x6, x6, x8\n\t"
13289         "str    x3, [%[r], 0]\n\t"
13290         "str    x4, [%[r], 8]\n\t"
13291         "str    x5, [%[r], 16]\n\t"
13292         "str    x6, [%[r], 24]\n\t"
13293         :
13294         : [r] "r" (r), [a] "r" (a)
13295         : "memory", "x10", "x11", "x12", "x13", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
13296     );
13297 
13298     (void)m;
13299 }
13300 
13301 /* Subtract two Montgomery form numbers (r = a - b % m).
13302  *
13303  * r   Result of subtration.
13304  * a   Number to subtract from in Montogmery form.
13305  * b   Number to subtract with in Montogmery form.
13306  * m   Modulus (prime).
13307  */
13308 static void sp_256_mont_sub_4(sp_digit* r, sp_digit* a, sp_digit* b,
13309         sp_digit* m)
13310 {
13311     __asm__ __volatile__ (
13312         "ldr    x4, [%[a],0]\n\t"
13313         "ldr    x5, [%[a],8]\n\t"
13314         "ldr    x6, [%[a],16]\n\t"
13315         "ldr    x7, [%[a],24]\n\t"
13316         "ldr    x8, [%[b],0]\n\t"
13317         "ldr    x9, [%[b],8]\n\t"
13318         "ldr    x10, [%[b],16]\n\t"
13319         "ldr    x11, [%[b],24]\n\t"
13320         "subs   x4, x4, x8\n\t"
13321         "sbcs   x5, x5, x9\n\t"
13322         "mov    x12, 0xffffffff\n\t"
13323         "sbcs   x6, x6, x10\n\t"
13324         "sbcs   x7, x7, x11\n\t"
13325         "mov    x13, 0xffffffff00000001\n\t"
13326         "csetm  x14, cc\n\t"
13327         "and    x12, x12, x14\n\t"
13328         "and    x13, x13, x14\n\t"
13329         "adds   x4, x4, x14\n\t"
13330         "adcs   x5, x5, x12\n\t"
13331         "str    x4, [%[r],0]\n\t"
13332         "adcs   x6, x6, xzr\n\t"
13333         "str    x5, [%[r],8]\n\t"
13334         "adc    x7, x7, x13\n\t"
13335         "str    x6, [%[r],16]\n\t"
13336         "str    x7, [%[r],24]\n\t"
13337         :
13338         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
13339         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14"
13340     );
13341 }
13342 
13343 /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
13344  *
13345  * r  Result of division by 2.
13346  * a  Number to divide.
13347  * m  Modulus (prime).
13348  */
13349 static void sp_256_div2_4(sp_digit* r, sp_digit* a, sp_digit* m)
13350 {
13351     __asm__ __volatile__ (
13352         "ldr    x3, [%[a], 0]\n\t"
13353         "ldr    x4, [%[a], 8]\n\t"
13354         "ldr    x5, [%[a], 16]\n\t"
13355         "ldr    x6, [%[a], 24]\n\t"
13356         "and    x9, x3, 1\n\t"
13357         "sub    x10, xzr, x9\n\t"
13358         "and    x7, x10, 0xffffffff\n\t"
13359         "and    x8, x10, 0xffffffff00000001\n\t"
13360         "adds   x3, x3, x10\n\t"
13361         "adcs   x4, x4, x7\n\t"
13362         "adcs   x5, x5, xzr\n\t"
13363         "adcs   x6, x6, x8\n\t"
13364         "cset   x9, cs\n\t"
13365         "lsr    x3, x3, 1\n\t"
13366         "lsr    x7, x4, 1\n\t"
13367         "lsr    x8, x5, 1\n\t"
13368         "lsr    x10, x6, 1\n\t"
13369         "orr    x3, x3, x4, lsl 63\n\t"
13370         "orr    x4, x7, x5, lsl 63\n\t"
13371         "orr    x5, x8, x6, lsl 63\n\t"
13372         "orr    x6, x10, x9, lsl 63\n\t"
13373         "str    x3, [%[r], 0]\n\t"
13374         "str    x4, [%[r], 8]\n\t"
13375         "str    x5, [%[r], 16]\n\t"
13376         "str    x6, [%[r], 24]\n\t"
13377         :
13378         : [r] "r" (r), [a] "r" (a), [m] "r" (m)
13379         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
13380     );
13381 
13382 }
13383 
13384 /* Double the Montgomery form projective point p.
13385  *
13386  * r  Result of doubling point.
13387  * p  Point to double.
13388  * t  Temporary ordinate data.
13389  */
13390 static void sp_256_proj_point_dbl_4(sp_point* r, sp_point* p, sp_digit* t)
13391 {
13392     sp_point *rp[2];
13393     sp_point tp;
13394     sp_digit* t1 = t;
13395     sp_digit* t2 = t + 2*4;
13396     sp_digit* x;
13397     sp_digit* y;
13398     sp_digit* z;
13399     int i;
13400 
13401     /* When infinity don't double point passed in - constant time. */
13402     rp[0] = r;
13403     rp[1] = &tp;
13404     x = rp[p->infinity]->x;
13405     y = rp[p->infinity]->y;
13406     z = rp[p->infinity]->z;
13407     /* Put point to double into result - good for infinty. */
13408     if (r != p) {
13409         for (i=0; i<4; i++)
13410             r->x[i] = p->x[i];
13411         for (i=0; i<4; i++)
13412             r->y[i] = p->y[i];
13413         for (i=0; i<4; i++)
13414             r->z[i] = p->z[i];
13415         r->infinity = p->infinity;
13416     }
13417 
13418     /* T1 = Z * Z */
13419     sp_256_mont_sqr_4(t1, z, p256_mod, p256_mp_mod);
13420     /* Z = Y * Z */
13421     sp_256_mont_mul_4(z, y, z, p256_mod, p256_mp_mod);
13422     /* Z = 2Z */
13423     sp_256_mont_dbl_4(z, z, p256_mod);
13424     /* T2 = X - T1 */
13425     sp_256_mont_sub_4(t2, x, t1, p256_mod);
13426     /* T1 = X + T1 */
13427     sp_256_mont_add_4(t1, x, t1, p256_mod);
13428     /* T2 = T1 * T2 */
13429     sp_256_mont_mul_4(t2, t1, t2, p256_mod, p256_mp_mod);
13430     /* T1 = 3T2 */
13431     sp_256_mont_tpl_4(t1, t2, p256_mod);
13432     /* Y = 2Y */
13433     sp_256_mont_dbl_4(y, y, p256_mod);
13434     /* Y = Y * Y */
13435     sp_256_mont_sqr_4(y, y, p256_mod, p256_mp_mod);
13436     /* T2 = Y * Y */
13437     sp_256_mont_sqr_4(t2, y, p256_mod, p256_mp_mod);
13438     /* T2 = T2/2 */
13439     sp_256_div2_4(t2, t2, p256_mod);
13440     /* Y = Y * X */
13441     sp_256_mont_mul_4(y, y, x, p256_mod, p256_mp_mod);
13442     /* X = T1 * T1 */
13443     sp_256_mont_mul_4(x, t1, t1, p256_mod, p256_mp_mod);
13444     /* X = X - Y */
13445     sp_256_mont_sub_4(x, x, y, p256_mod);
13446     /* X = X - Y */
13447     sp_256_mont_sub_4(x, x, y, p256_mod);
13448     /* Y = Y - X */
13449     sp_256_mont_sub_4(y, y, x, p256_mod);
13450     /* Y = Y * T1 */
13451     sp_256_mont_mul_4(y, y, t1, p256_mod, p256_mp_mod);
13452     /* Y = Y - T2 */
13453     sp_256_mont_sub_4(y, y, t2, p256_mod);
13454 
13455 }
13456 
13457 /* Double the Montgomery form projective point p a number of times.
13458  *
13459  * r  Result of repeated doubling of point.
13460  * p  Point to double.
13461  * n  Number of times to double
13462  * t  Temporary ordinate data.
13463  */
13464 static void sp_256_proj_point_dbl_n_4(sp_point* r, sp_point* p, int n,
13465         sp_digit* t)
13466 {
13467     sp_point *rp[2];
13468     sp_point tp;
13469     sp_digit* w = t;
13470     sp_digit* a = t + 2*4;
13471     sp_digit* b = t + 4*4;
13472     sp_digit* t1 = t + 6*4;
13473     sp_digit* t2 = t + 8*4;
13474     sp_digit* x;
13475     sp_digit* y;
13476     sp_digit* z;
13477     int i;
13478 
13479     rp[0] = r;
13480     rp[1] = &tp;
13481     x = rp[p->infinity]->x;
13482     y = rp[p->infinity]->y;
13483     z = rp[p->infinity]->z;
13484     if (r != p) {
13485         for (i=0; i<4; i++)
13486             r->x[i] = p->x[i];
13487         for (i=0; i<4; i++)
13488             r->y[i] = p->y[i];
13489         for (i=0; i<4; i++)
13490             r->z[i] = p->z[i];
13491         r->infinity = p->infinity;
13492     }
13493 
13494     /* Y = 2*Y */
13495     sp_256_mont_dbl_4(y, y, p256_mod);
13496     /* W = Z^4 */
13497     sp_256_mont_sqr_4(w, z, p256_mod, p256_mp_mod);
13498     sp_256_mont_sqr_4(w, w, p256_mod, p256_mp_mod);
13499     while (n--) {
13500         /* A = 3*(X^2 - W) */
13501         sp_256_mont_sqr_4(t1, x, p256_mod, p256_mp_mod);
13502         sp_256_mont_sub_4(t1, t1, w, p256_mod);
13503         sp_256_mont_tpl_4(a, t1, p256_mod);
13504         /* B = X*Y^2 */
13505         sp_256_mont_sqr_4(t2, y, p256_mod, p256_mp_mod);
13506         sp_256_mont_mul_4(b, t2, x, p256_mod, p256_mp_mod);
13507         /* X = A^2 - 2B */
13508         sp_256_mont_sqr_4(x, a, p256_mod, p256_mp_mod);
13509         sp_256_mont_dbl_4(t1, b, p256_mod);
13510         sp_256_mont_sub_4(x, x, t1, p256_mod);
13511         /* Z = Z*Y */
13512         sp_256_mont_mul_4(z, z, y, p256_mod, p256_mp_mod);
13513         /* t2 = Y^4 */
13514         sp_256_mont_sqr_4(t2, t2, p256_mod, p256_mp_mod);
13515         if (n) {
13516             /* W = W*Y^4 */
13517             sp_256_mont_mul_4(w, w, t2, p256_mod, p256_mp_mod);
13518         }
13519         /* y = 2*A*(B - X) - Y^4 */
13520         sp_256_mont_sub_4(y, b, x, p256_mod);
13521         sp_256_mont_mul_4(y, y, a, p256_mod, p256_mp_mod);
13522         sp_256_mont_dbl_4(y, y, p256_mod);
13523         sp_256_mont_sub_4(y, y, t2, p256_mod);
13524     }
13525     /* Y = Y/2 */
13526     sp_256_div2_4(y, y, p256_mod);
13527 }
13528 
13529 /* Compare two numbers to determine if they are equal.
13530  * Constant time implementation.
13531  *
13532  * a  First number to compare.
13533  * b  Second number to compare.
13534  * returns 1 when equal and 0 otherwise.
13535  */
13536 static int sp_256_cmp_equal_4(const sp_digit* a, const sp_digit* b)
13537 {
13538     return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) | (a[3] ^ b[3])) == 0;
13539 }
13540 
13541 /* Add two Montgomery form projective points.
13542  *
13543  * r  Result of addition.
13544  * p  Frist point to add.
13545  * q  Second point to add.
13546  * t  Temporary ordinate data.
13547  */
13548 static void sp_256_proj_point_add_4(sp_point* r, sp_point* p, sp_point* q,
13549         sp_digit* t)
13550 {
13551     sp_point *ap[2];
13552     sp_point *rp[2];
13553     sp_point tp;
13554     sp_digit* t1 = t;
13555     sp_digit* t2 = t + 2*4;
13556     sp_digit* t3 = t + 4*4;
13557     sp_digit* t4 = t + 6*4;
13558     sp_digit* t5 = t + 8*4;
13559     sp_digit* x;
13560     sp_digit* y;
13561     sp_digit* z;
13562     int i;
13563 
13564     /* Ensure only the first point is the same as the result. */
13565     if (q == r) {
13566         sp_point* a = p;
13567         p = q;
13568         q = a;
13569     }
13570 
13571     /* Check double */
13572     sp_256_sub_4(t1, p256_mod, q->y);
13573     sp_256_norm_4(t1);
13574     if (sp_256_cmp_equal_4(p->x, q->x) & sp_256_cmp_equal_4(p->z, q->z) &
13575         (sp_256_cmp_equal_4(p->y, q->y) | sp_256_cmp_equal_4(p->y, t1))) {
13576         sp_256_proj_point_dbl_4(r, p, t);
13577     }
13578     else {
13579         rp[0] = r;
13580         rp[1] = &tp;
13581         XMEMSET(&tp, 0, sizeof(tp));
13582         x = rp[p->infinity | q->infinity]->x;
13583         y = rp[p->infinity | q->infinity]->y;
13584         z = rp[p->infinity | q->infinity]->z;
13585 
13586         ap[0] = p;
13587         ap[1] = q;
13588         for (i=0; i<4; i++)
13589             r->x[i] = ap[p->infinity]->x[i];
13590         for (i=0; i<4; i++)
13591             r->y[i] = ap[p->infinity]->y[i];
13592         for (i=0; i<4; i++)
13593             r->z[i] = ap[p->infinity]->z[i];
13594         r->infinity = ap[p->infinity]->infinity;
13595 
13596         /* U1 = X1*Z2^2 */
13597         sp_256_mont_sqr_4(t1, q->z, p256_mod, p256_mp_mod);
13598         sp_256_mont_mul_4(t3, t1, q->z, p256_mod, p256_mp_mod);
13599         sp_256_mont_mul_4(t1, t1, x, p256_mod, p256_mp_mod);
13600         /* U2 = X2*Z1^2 */
13601         sp_256_mont_sqr_4(t2, z, p256_mod, p256_mp_mod);
13602         sp_256_mont_mul_4(t4, t2, z, p256_mod, p256_mp_mod);
13603         sp_256_mont_mul_4(t2, t2, q->x, p256_mod, p256_mp_mod);
13604         /* S1 = Y1*Z2^3 */
13605         sp_256_mont_mul_4(t3, t3, y, p256_mod, p256_mp_mod);
13606         /* S2 = Y2*Z1^3 */
13607         sp_256_mont_mul_4(t4, t4, q->y, p256_mod, p256_mp_mod);
13608         /* H = U2 - U1 */
13609         sp_256_mont_sub_4(t2, t2, t1, p256_mod);
13610         /* R = S2 - S1 */
13611         sp_256_mont_sub_4(t4, t4, t3, p256_mod);
13612         /* Z3 = H*Z1*Z2 */
13613         sp_256_mont_mul_4(z, z, q->z, p256_mod, p256_mp_mod);
13614         sp_256_mont_mul_4(z, z, t2, p256_mod, p256_mp_mod);
13615         /* X3 = R^2 - H^3 - 2*U1*H^2 */
13616         sp_256_mont_sqr_4(x, t4, p256_mod, p256_mp_mod);
13617         sp_256_mont_sqr_4(t5, t2, p256_mod, p256_mp_mod);
13618         sp_256_mont_mul_4(y, t1, t5, p256_mod, p256_mp_mod);
13619         sp_256_mont_mul_4(t5, t5, t2, p256_mod, p256_mp_mod);
13620         sp_256_mont_sub_4(x, x, t5, p256_mod);
13621         sp_256_mont_dbl_4(t1, y, p256_mod);
13622         sp_256_mont_sub_4(x, x, t1, p256_mod);
13623         /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
13624         sp_256_mont_sub_4(y, y, x, p256_mod);
13625         sp_256_mont_mul_4(y, y, t4, p256_mod, p256_mp_mod);
13626         sp_256_mont_mul_4(t5, t5, t3, p256_mod, p256_mp_mod);
13627         sp_256_mont_sub_4(y, y, t5, p256_mod);
13628     }
13629 }
13630 
13631 /* Double the Montgomery form projective point p a number of times.
13632  *
13633  * r  Result of repeated doubling of point.
13634  * p  Point to double.
13635  * n  Number of times to double
13636  * t  Temporary ordinate data.
13637  */
13638 static void sp_256_proj_point_dbl_n_store_4(sp_point* r, sp_point* p,
13639         int n, int m, sp_digit* t)
13640 {
13641     sp_digit* w = t;
13642     sp_digit* a = t + 2*4;
13643     sp_digit* b = t + 4*4;
13644     sp_digit* t1 = t + 6*4;
13645     sp_digit* t2 = t + 8*4;
13646     sp_digit* x = r[2*m].x;
13647     sp_digit* y = r[(1<<n)*m].y;
13648     sp_digit* z = r[2*m].z;
13649     int i;
13650 
13651     for (i=0; i<4; i++)
13652         x[i] = p->x[i];
13653     for (i=0; i<4; i++)
13654         y[i] = p->y[i];
13655     for (i=0; i<4; i++)
13656         z[i] = p->z[i];
13657 
13658     /* Y = 2*Y */
13659     sp_256_mont_dbl_4(y, y, p256_mod);
13660     /* W = Z^4 */
13661     sp_256_mont_sqr_4(w, z, p256_mod, p256_mp_mod);
13662     sp_256_mont_sqr_4(w, w, p256_mod, p256_mp_mod);
13663     for (i=1; i<=n; i++) {
13664         /* A = 3*(X^2 - W) */
13665         sp_256_mont_sqr_4(t1, x, p256_mod, p256_mp_mod);
13666         sp_256_mont_sub_4(t1, t1, w, p256_mod);
13667         sp_256_mont_tpl_4(a, t1, p256_mod);
13668         /* B = X*Y^2 */
13669         sp_256_mont_sqr_4(t2, y, p256_mod, p256_mp_mod);
13670         sp_256_mont_mul_4(b, t2, x, p256_mod, p256_mp_mod);
13671         x = r[(1<<i)*m].x;
13672         /* X = A^2 - 2B */
13673         sp_256_mont_sqr_4(x, a, p256_mod, p256_mp_mod);
13674         sp_256_mont_dbl_4(t1, b, p256_mod);
13675         sp_256_mont_sub_4(x, x, t1, p256_mod);
13676         /* Z = Z*Y */
13677         sp_256_mont_mul_4(r[(1<<i)*m].z, z, y, p256_mod, p256_mp_mod);
13678         z = r[(1<<i)*m].z;
13679         /* t2 = Y^4 */
13680         sp_256_mont_sqr_4(t2, t2, p256_mod, p256_mp_mod);
13681         if (i != n) {
13682             /* W = W*Y^4 */
13683             sp_256_mont_mul_4(w, w, t2, p256_mod, p256_mp_mod);
13684         }
13685         /* y = 2*A*(B - X) - Y^4 */
13686         sp_256_mont_sub_4(y, b, x, p256_mod);
13687         sp_256_mont_mul_4(y, y, a, p256_mod, p256_mp_mod);
13688         sp_256_mont_dbl_4(y, y, p256_mod);
13689         sp_256_mont_sub_4(y, y, t2, p256_mod);
13690 
13691         /* Y = Y/2 */
13692         sp_256_div2_4(r[(1<<i)*m].y, y, p256_mod);
13693         r[(1<<i)*m].infinity = 0;
13694     }
13695 }
13696 
13697 /* Add two Montgomery form projective points.
13698  *
13699  * ra  Result of addition.
13700  * rs  Result of subtraction.
13701  * p   Frist point to add.
13702  * q   Second point to add.
13703  * t   Temporary ordinate data.
13704  */
13705 static void sp_256_proj_point_add_sub_4(sp_point* ra, sp_point* rs,
13706         sp_point* p, sp_point* q, sp_digit* t)
13707 {
13708     sp_digit* t1 = t;
13709     sp_digit* t2 = t + 2*4;
13710     sp_digit* t3 = t + 4*4;
13711     sp_digit* t4 = t + 6*4;
13712     sp_digit* t5 = t + 8*4;
13713     sp_digit* t6 = t + 10*4;
13714     sp_digit* x = ra->x;
13715     sp_digit* y = ra->y;
13716     sp_digit* z = ra->z;
13717     sp_digit* xs = rs->x;
13718     sp_digit* ys = rs->y;
13719     sp_digit* zs = rs->z;
13720 
13721 
13722     XMEMCPY(x, p->x, sizeof(p->x) / 2);
13723     XMEMCPY(y, p->y, sizeof(p->y) / 2);
13724     XMEMCPY(z, p->z, sizeof(p->z) / 2);
13725     ra->infinity = 0;
13726     rs->infinity = 0;
13727 
13728     /* U1 = X1*Z2^2 */
13729     sp_256_mont_sqr_4(t1, q->z, p256_mod, p256_mp_mod);
13730     sp_256_mont_mul_4(t3, t1, q->z, p256_mod, p256_mp_mod);
13731     sp_256_mont_mul_4(t1, t1, x, p256_mod, p256_mp_mod);
13732     /* U2 = X2*Z1^2 */
13733     sp_256_mont_sqr_4(t2, z, p256_mod, p256_mp_mod);
13734     sp_256_mont_mul_4(t4, t2, z, p256_mod, p256_mp_mod);
13735     sp_256_mont_mul_4(t2, t2, q->x, p256_mod, p256_mp_mod);
13736     /* S1 = Y1*Z2^3 */
13737     sp_256_mont_mul_4(t3, t3, y, p256_mod, p256_mp_mod);
13738     /* S2 = Y2*Z1^3 */
13739     sp_256_mont_mul_4(t4, t4, q->y, p256_mod, p256_mp_mod);
13740     /* H = U2 - U1 */
13741     sp_256_mont_sub_4(t2, t2, t1, p256_mod);
13742     /* RS = S2 + S1 */
13743     sp_256_mont_add_4(t6, t4, t3, p256_mod);
13744     /* R = S2 - S1 */
13745     sp_256_mont_sub_4(t4, t4, t3, p256_mod);
13746     /* Z3 = H*Z1*Z2 */
13747     /* ZS = H*Z1*Z2 */
13748     sp_256_mont_mul_4(z, z, q->z, p256_mod, p256_mp_mod);
13749     sp_256_mont_mul_4(z, z, t2, p256_mod, p256_mp_mod);
13750     XMEMCPY(zs, z, sizeof(p->z)/2);
13751     /* X3 = R^2 - H^3 - 2*U1*H^2 */
13752     /* XS = RS^2 - H^3 - 2*U1*H^2 */
13753     sp_256_mont_sqr_4(x, t4, p256_mod, p256_mp_mod);
13754     sp_256_mont_sqr_4(xs, t6, p256_mod, p256_mp_mod);
13755     sp_256_mont_sqr_4(t5, t2, p256_mod, p256_mp_mod);
13756     sp_256_mont_mul_4(y, t1, t5, p256_mod, p256_mp_mod);
13757     sp_256_mont_mul_4(t5, t5, t2, p256_mod, p256_mp_mod);
13758     sp_256_mont_sub_4(x, x, t5, p256_mod);
13759     sp_256_mont_sub_4(xs, xs, t5, p256_mod);
13760     sp_256_mont_dbl_4(t1, y, p256_mod);
13761     sp_256_mont_sub_4(x, x, t1, p256_mod);
13762     sp_256_mont_sub_4(xs, xs, t1, p256_mod);
13763     /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
13764     /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */
13765     sp_256_mont_sub_4(ys, y, xs, p256_mod);
13766     sp_256_mont_sub_4(y, y, x, p256_mod);
13767     sp_256_mont_mul_4(y, y, t4, p256_mod, p256_mp_mod);
13768     sp_256_sub_4(t6, p256_mod, t6);
13769     sp_256_mont_mul_4(ys, ys, t6, p256_mod, p256_mp_mod);
13770     sp_256_mont_mul_4(t5, t5, t3, p256_mod, p256_mp_mod);
13771     sp_256_mont_sub_4(y, y, t5, p256_mod);
13772     sp_256_mont_sub_4(ys, ys, t5, p256_mod);
13773 }
13774 
13775 /* Structure used to describe recoding of scalar multiplication. */
13776 typedef struct ecc_recode {
13777     /* Index into pre-computation table. */
13778     uint8_t i;
13779     /* Use the negative of the point. */
13780     uint8_t neg;
13781 } ecc_recode;
13782 
13783 /* The index into pre-computation table to use. */
13784 static uint8_t recode_index_4_6[66] = {
13785      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
13786     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
13787     32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17,
13788     16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,
13789      0,  1,
13790 };
13791 
13792 /* Whether to negate y-ordinate. */
13793 static uint8_t recode_neg_4_6[66] = {
13794      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
13795      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
13796      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
13797      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
13798      0,  0,
13799 };
13800 
13801 /* Recode the scalar for multiplication using pre-computed values and
13802  * subtraction.
13803  *
13804  * k  Scalar to multiply by.
13805  * v  Vector of operations to peform.
13806  */
13807 static void sp_256_ecc_recode_6_4(sp_digit* k, ecc_recode* v)
13808 {
13809     int i, j;
13810     uint8_t y;
13811     int carry = 0;
13812     int o;
13813     sp_digit n;
13814 
13815     j = 0;
13816     n = k[j];
13817     o = 0;
13818     for (i=0; i<43; i++) {
13819         y = n;
13820         if (o + 6 < 64) {
13821             y &= 0x3f;
13822             n >>= 6;
13823             o += 6;
13824         }
13825         else if (o + 6 == 64) {
13826             n >>= 6;
13827             if (++j < 4)
13828                 n = k[j];
13829             o = 0;
13830         }
13831         else if (++j < 4) {
13832             n = k[j];
13833             y |= (n << (64 - o)) & 0x3f;
13834             o -= 58;
13835             n >>= o;
13836         }
13837 
13838         y += carry;
13839         v[i].i = recode_index_4_6[y];
13840         v[i].neg = recode_neg_4_6[y];
13841         carry = (y >> 6) + v[i].neg;
13842     }
13843 }
13844 
13845 /* Multiply the point by the scalar and return the result.
13846  * If map is true then convert result to affine co-ordinates.
13847  *
13848  * r     Resulting point.
13849  * g     Point to multiply.
13850  * k     Scalar to multiply by.
13851  * map   Indicates whether to convert result to affine.
13852  * heap  Heap to use for allocation.
13853  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
13854  */
13855 static int sp_256_ecc_mulmod_win_add_sub_4(sp_point* r, sp_point* g,
13856         sp_digit* k, int map, void* heap)
13857 {
13858 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
13859     sp_point td[33];
13860     sp_point rtd, pd;
13861     sp_digit tmpd[2 * 4 * 6];
13862 #endif
13863     sp_point* t;
13864     sp_point* rt;
13865     sp_point* p = NULL;
13866     sp_digit* tmp;
13867     sp_digit* negy;
13868     int i;
13869     ecc_recode v[43];
13870     int err;
13871 
13872     (void)heap;
13873 
13874     err = sp_ecc_point_new(heap, rtd, rt);
13875     if (err == MP_OKAY)
13876         err = sp_ecc_point_new(heap, pd, p);
13877 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
13878     t = (sp_point*)XMALLOC(sizeof(sp_point) * 33, heap, DYNAMIC_TYPE_ECC);
13879     if (t == NULL)
13880         err = MEMORY_E;
13881     tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 6, heap,
13882                              DYNAMIC_TYPE_ECC);
13883     if (tmp == NULL)
13884         err = MEMORY_E;
13885 #else
13886     t = td;
13887     tmp = tmpd;
13888 #endif
13889 
13890 
13891     if (err == MP_OKAY) {
13892         /* t[0] = {0, 0, 1} * norm */
13893         XMEMSET(&t[0], 0, sizeof(t[0]));
13894         t[0].infinity = 1;
13895         /* t[1] = {g->x, g->y, g->z} * norm */
13896         err = sp_256_mod_mul_norm_4(t[1].x, g->x, p256_mod);
13897     }
13898     if (err == MP_OKAY)
13899         err = sp_256_mod_mul_norm_4(t[1].y, g->y, p256_mod);
13900     if (err == MP_OKAY)
13901         err = sp_256_mod_mul_norm_4(t[1].z, g->z, p256_mod);
13902 
13903     if (err == MP_OKAY) {
13904         t[1].infinity = 0;
13905         /* t[2] ... t[32]  */
13906     sp_256_proj_point_dbl_n_store_4(t, &t[ 1], 5, 1, tmp);
13907     sp_256_proj_point_add_4(&t[ 3], &t[ 2], &t[ 1], tmp);
13908     sp_256_proj_point_dbl_4(&t[ 6], &t[ 3], tmp);
13909     sp_256_proj_point_add_sub_4(&t[ 7], &t[ 5], &t[ 6], &t[ 1], tmp);
13910     sp_256_proj_point_dbl_4(&t[10], &t[ 5], tmp);
13911     sp_256_proj_point_add_sub_4(&t[11], &t[ 9], &t[10], &t[ 1], tmp);
13912     sp_256_proj_point_dbl_4(&t[12], &t[ 6], tmp);
13913     sp_256_proj_point_dbl_4(&t[14], &t[ 7], tmp);
13914     sp_256_proj_point_add_sub_4(&t[15], &t[13], &t[14], &t[ 1], tmp);
13915     sp_256_proj_point_dbl_4(&t[18], &t[ 9], tmp);
13916     sp_256_proj_point_add_sub_4(&t[19], &t[17], &t[18], &t[ 1], tmp);
13917     sp_256_proj_point_dbl_4(&t[20], &t[10], tmp);
13918     sp_256_proj_point_dbl_4(&t[22], &t[11], tmp);
13919     sp_256_proj_point_add_sub_4(&t[23], &t[21], &t[22], &t[ 1], tmp);
13920     sp_256_proj_point_dbl_4(&t[24], &t[12], tmp);
13921     sp_256_proj_point_dbl_4(&t[26], &t[13], tmp);
13922     sp_256_proj_point_add_sub_4(&t[27], &t[25], &t[26], &t[ 1], tmp);
13923     sp_256_proj_point_dbl_4(&t[28], &t[14], tmp);
13924     sp_256_proj_point_dbl_4(&t[30], &t[15], tmp);
13925     sp_256_proj_point_add_sub_4(&t[31], &t[29], &t[30], &t[ 1], tmp);
13926 
13927         negy = t[0].y;
13928 
13929         sp_256_ecc_recode_6_4(k, v);
13930 
13931         i = 42;
13932         XMEMCPY(rt, &t[v[i].i], sizeof(sp_point));
13933         for (--i; i>=0; i--) {
13934             sp_256_proj_point_dbl_n_4(rt, rt, 6, tmp);
13935 
13936             XMEMCPY(p, &t[v[i].i], sizeof(sp_point));
13937             sp_256_sub_4(negy, p256_mod, p->y);
13938             sp_256_cond_copy_4(p->y, negy, (sp_digit)0 - v[i].neg);
13939             sp_256_proj_point_add_4(rt, rt, p, tmp);
13940         }
13941 
13942         if (map)
13943             sp_256_map_4(r, rt, tmp);
13944         else
13945             XMEMCPY(r, rt, sizeof(sp_point));
13946     }
13947 
13948 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
13949     if (t != NULL)
13950         XFREE(t, heap, DYNAMIC_TYPE_ECC);
13951     if (tmp != NULL)
13952         XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
13953 #endif
13954     sp_ecc_point_free(p, 0, heap);
13955     sp_ecc_point_free(rt, 0, heap);
13956 
13957     return err;
13958 }
13959 
13960 /* A table entry for pre-computed points. */
13961 typedef struct sp_table_entry {
13962     sp_digit x[4];
13963     sp_digit y[4];
13964     byte infinity;
13965 } sp_table_entry;
13966 
13967 #if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL)
13968 #endif /* FP_ECC || WOLFSSL_SP_SMALL */
13969 /* Add two Montgomery form projective points. The second point has a q value of
13970  * one.
13971  * Only the first point can be the same pointer as the result point.
13972  *
13973  * r  Result of addition.
13974  * p  Frist point to add.
13975  * q  Second point to add.
13976  * t  Temporary ordinate data.
13977  */
13978 static void sp_256_proj_point_add_qz1_4(sp_point* r, sp_point* p,
13979         sp_point* q, sp_digit* t)
13980 {
13981     sp_point *ap[2];
13982     sp_point *rp[2];
13983     sp_point tp;
13984     sp_digit* t1 = t;
13985     sp_digit* t2 = t + 2*4;
13986     sp_digit* t3 = t + 4*4;
13987     sp_digit* t4 = t + 6*4;
13988     sp_digit* t5 = t + 8*4;
13989     sp_digit* x;
13990     sp_digit* y;
13991     sp_digit* z;
13992     int i;
13993 
13994     /* Check double */
13995     sp_256_sub_4(t1, p256_mod, q->y);
13996     sp_256_norm_4(t1);
13997     if (sp_256_cmp_equal_4(p->x, q->x) & sp_256_cmp_equal_4(p->z, q->z) &
13998         (sp_256_cmp_equal_4(p->y, q->y) | sp_256_cmp_equal_4(p->y, t1))) {
13999         sp_256_proj_point_dbl_4(r, p, t);
14000     }
14001     else {
14002         rp[0] = r;
14003         rp[1] = &tp;
14004         XMEMSET(&tp, 0, sizeof(tp));
14005         x = rp[p->infinity | q->infinity]->x;
14006         y = rp[p->infinity | q->infinity]->y;
14007         z = rp[p->infinity | q->infinity]->z;
14008 
14009         ap[0] = p;
14010         ap[1] = q;
14011         for (i=0; i<4; i++)
14012             r->x[i] = ap[p->infinity]->x[i];
14013         for (i=0; i<4; i++)
14014             r->y[i] = ap[p->infinity]->y[i];
14015         for (i=0; i<4; i++)
14016             r->z[i] = ap[p->infinity]->z[i];
14017         r->infinity = ap[p->infinity]->infinity;
14018 
14019         /* U2 = X2*Z1^2 */
14020         sp_256_mont_sqr_4(t2, z, p256_mod, p256_mp_mod);
14021         sp_256_mont_mul_4(t4, t2, z, p256_mod, p256_mp_mod);
14022         sp_256_mont_mul_4(t2, t2, q->x, p256_mod, p256_mp_mod);
14023         /* S2 = Y2*Z1^3 */
14024         sp_256_mont_mul_4(t4, t4, q->y, p256_mod, p256_mp_mod);
14025         /* H = U2 - X1 */
14026         sp_256_mont_sub_4(t2, t2, x, p256_mod);
14027         /* R = S2 - Y1 */
14028         sp_256_mont_sub_4(t4, t4, y, p256_mod);
14029         /* Z3 = H*Z1 */
14030         sp_256_mont_mul_4(z, z, t2, p256_mod, p256_mp_mod);
14031         /* X3 = R^2 - H^3 - 2*X1*H^2 */
14032         sp_256_mont_sqr_4(t1, t4, p256_mod, p256_mp_mod);
14033         sp_256_mont_sqr_4(t5, t2, p256_mod, p256_mp_mod);
14034         sp_256_mont_mul_4(t3, x, t5, p256_mod, p256_mp_mod);
14035         sp_256_mont_mul_4(t5, t5, t2, p256_mod, p256_mp_mod);
14036         sp_256_mont_sub_4(x, t1, t5, p256_mod);
14037         sp_256_mont_dbl_4(t1, t3, p256_mod);
14038         sp_256_mont_sub_4(x, x, t1, p256_mod);
14039         /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
14040         sp_256_mont_sub_4(t3, t3, x, p256_mod);
14041         sp_256_mont_mul_4(t3, t3, t4, p256_mod, p256_mp_mod);
14042         sp_256_mont_mul_4(t5, t5, y, p256_mod, p256_mp_mod);
14043         sp_256_mont_sub_4(y, t3, t5, p256_mod);
14044     }
14045 }
14046 
14047 #ifdef FP_ECC
14048 /* Convert the projective point to affine.
14049  * Ordinates are in Montgomery form.
14050  *
14051  * a  Point to convert.
14052  * t  Temprorary data.
14053  */
14054 static void sp_256_proj_to_affine_4(sp_point* a, sp_digit* t)
14055 {
14056     sp_digit* t1 = t;
14057     sp_digit* t2 = t + 2 * 4;
14058     sp_digit* tmp = t + 4 * 4;
14059 
14060     sp_256_mont_inv_4(t1, a->z, tmp);
14061 
14062     sp_256_mont_sqr_4(t2, t1, p256_mod, p256_mp_mod);
14063     sp_256_mont_mul_4(t1, t2, t1, p256_mod, p256_mp_mod);
14064 
14065     sp_256_mont_mul_4(a->x, a->x, t2, p256_mod, p256_mp_mod);
14066     sp_256_mont_mul_4(a->y, a->y, t1, p256_mod, p256_mp_mod);
14067     XMEMCPY(a->z, p256_norm_mod, sizeof(p256_norm_mod));
14068 }
14069 
14070 /* Generate the pre-computed table of points for the base point.
14071  *
14072  * a      The base point.
14073  * table  Place to store generated point data.
14074  * tmp    Temprorary data.
14075  * heap  Heap to use for allocation.
14076  */
14077 static int sp_256_gen_stripe_table_4(sp_point* a,
14078         sp_table_entry* table, sp_digit* tmp, void* heap)
14079 {
14080 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
14081     sp_point td, s1d, s2d;
14082 #endif
14083     sp_point* t;
14084     sp_point* s1 = NULL;
14085     sp_point* s2 = NULL;
14086     int i, j;
14087     int err;
14088 
14089     (void)heap;
14090 
14091     err = sp_ecc_point_new(heap, td, t);
14092     if (err == MP_OKAY)
14093         err = sp_ecc_point_new(heap, s1d, s1);
14094     if (err == MP_OKAY)
14095         err = sp_ecc_point_new(heap, s2d, s2);
14096 
14097     if (err == MP_OKAY)
14098         err = sp_256_mod_mul_norm_4(t->x, a->x, p256_mod);
14099     if (err == MP_OKAY)
14100         err = sp_256_mod_mul_norm_4(t->y, a->y, p256_mod);
14101     if (err == MP_OKAY)
14102         err = sp_256_mod_mul_norm_4(t->z, a->z, p256_mod);
14103     if (err == MP_OKAY) {
14104         t->infinity = 0;
14105         sp_256_proj_to_affine_4(t, tmp);
14106 
14107         XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
14108         s1->infinity = 0;
14109         XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
14110         s2->infinity = 0;
14111 
14112         /* table[0] = {0, 0, infinity} */
14113         XMEMSET(&table[0], 0, sizeof(sp_table_entry));
14114         table[0].infinity = 1;
14115         /* table[1] = Affine version of 'a' in Montgomery form */
14116         XMEMCPY(table[1].x, t->x, sizeof(table->x));
14117         XMEMCPY(table[1].y, t->y, sizeof(table->y));
14118         table[1].infinity = 0;
14119 
14120         for (i=1; i<8; i++) {
14121             sp_256_proj_point_dbl_n_4(t, t, 32, tmp);
14122             sp_256_proj_to_affine_4(t, tmp);
14123             XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
14124             XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
14125             table[1<<i].infinity = 0;
14126         }
14127 
14128         for (i=1; i<8; i++) {
14129             XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
14130             XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
14131             for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
14132                 XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
14133                 XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
14134                 sp_256_proj_point_add_qz1_4(t, s1, s2, tmp);
14135                 sp_256_proj_to_affine_4(t, tmp);
14136                 XMEMCPY(table[j].x, t->x, sizeof(table->x));
14137                 XMEMCPY(table[j].y, t->y, sizeof(table->y));
14138                 table[j].infinity = 0;
14139             }
14140         }
14141     }
14142 
14143     sp_ecc_point_free(s2, 0, heap);
14144     sp_ecc_point_free(s1, 0, heap);
14145     sp_ecc_point_free( t, 0, heap);
14146 
14147     return err;
14148 }
14149 
14150 #endif /* FP_ECC */
14151 #if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL)
14152 /* Multiply the point by the scalar and return the result.
14153  * If map is true then convert result to affine co-ordinates.
14154  *
14155  * r     Resulting point.
14156  * k     Scalar to multiply by.
14157  * map   Indicates whether to convert result to affine.
14158  * heap  Heap to use for allocation.
14159  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
14160  */
14161 static int sp_256_ecc_mulmod_stripe_4(sp_point* r, sp_point* g,
14162         sp_table_entry* table, sp_digit* k, int map, void* heap)
14163 {
14164 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
14165     sp_point rtd;
14166     sp_point pd;
14167     sp_digit td[2 * 4 * 5];
14168 #endif
14169     sp_point* rt;
14170     sp_point* p = NULL;
14171     sp_digit* t;
14172     int i, j;
14173     int y, x;
14174     int err;
14175 
14176     (void)g;
14177     (void)heap;
14178 
14179     err = sp_ecc_point_new(heap, rtd, rt);
14180     if (err == MP_OKAY)
14181         err = sp_ecc_point_new(heap, pd, p);
14182 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
14183     t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap,
14184                            DYNAMIC_TYPE_ECC);
14185     if (t == NULL)
14186         err = MEMORY_E;
14187 #else
14188     t = td;
14189 #endif
14190 
14191     if (err == MP_OKAY) {
14192         XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
14193         XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
14194 
14195         y = 0;
14196         for (j=0,x=31; j<8; j++,x+=32)
14197             y |= ((k[x / 64] >> (x % 64)) & 1) << j;
14198         XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
14199         XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
14200         rt->infinity = table[y].infinity;
14201         for (i=30; i>=0; i--) {
14202             y = 0;
14203             for (j=0,x=i; j<8; j++,x+=32)
14204                 y |= ((k[x / 64] >> (x % 64)) & 1) << j;
14205 
14206             sp_256_proj_point_dbl_4(rt, rt, t);
14207             XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
14208             XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
14209             p->infinity = table[y].infinity;
14210             sp_256_proj_point_add_qz1_4(rt, rt, p, t);
14211         }
14212 
14213         if (map)
14214             sp_256_map_4(r, rt, t);
14215         else
14216             XMEMCPY(r, rt, sizeof(sp_point));
14217     }
14218 
14219 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
14220     if (t != NULL)
14221         XFREE(t, heap, DYNAMIC_TYPE_ECC);
14222 #endif
14223     sp_ecc_point_free(p, 0, heap);
14224     sp_ecc_point_free(rt, 0, heap);
14225 
14226     return err;
14227 }
14228 
14229 #endif /* FP_ECC || WOLFSSL_SP_SMALL */
14230 #ifdef FP_ECC
14231 #ifndef FP_ENTRIES
14232     #define FP_ENTRIES 16
14233 #endif
14234 
14235 typedef struct sp_cache_t {
14236     sp_digit x[4];
14237     sp_digit y[4];
14238     sp_table_entry table[256];
14239     uint32_t cnt;
14240     int set;
14241 } sp_cache_t;
14242 
14243 static THREAD_LS_T sp_cache_t sp_cache[FP_ENTRIES];
14244 static THREAD_LS_T int sp_cache_last = -1;
14245 static THREAD_LS_T int sp_cache_inited = 0;
14246 
14247 #ifndef HAVE_THREAD_LS
14248     static volatile int initCacheMutex = 0;
14249     static wolfSSL_Mutex sp_cache_lock;
14250 #endif
14251 
14252 static void sp_ecc_get_cache(sp_point* g, sp_cache_t** cache)
14253 {
14254     int i, j;
14255     uint32_t least;
14256 
14257     if (sp_cache_inited == 0) {
14258         for (i=0; i<FP_ENTRIES; i++) {
14259             sp_cache[i].set = 0;
14260         }
14261         sp_cache_inited = 1;
14262     }
14263 
14264     /* Compare point with those in cache. */
14265     for (i=0; i<FP_ENTRIES; i++) {
14266         if (!sp_cache[i].set)
14267             continue;
14268 
14269         if (sp_256_cmp_equal_4(g->x, sp_cache[i].x) & 
14270                            sp_256_cmp_equal_4(g->y, sp_cache[i].y)) {
14271             sp_cache[i].cnt++;
14272             break;
14273         }
14274     }
14275 
14276     /* No match. */
14277     if (i == FP_ENTRIES) {
14278         /* Find empty entry. */
14279         i = (sp_cache_last + 1) % FP_ENTRIES;
14280         for (; i != sp_cache_last; i=(i+1)%FP_ENTRIES) {
14281             if (!sp_cache[i].set) {
14282                 break;
14283             }
14284         }
14285 
14286         /* Evict least used. */
14287         if (i == sp_cache_last) {
14288             least = sp_cache[0].cnt;
14289             for (j=1; j<FP_ENTRIES; j++) {
14290                 if (sp_cache[j].cnt < least) {
14291                     i = j;
14292                     least = sp_cache[i].cnt;
14293                 }
14294             }
14295         }
14296 
14297         XMEMCPY(sp_cache[i].x, g->x, sizeof(sp_cache[i].x));
14298         XMEMCPY(sp_cache[i].y, g->y, sizeof(sp_cache[i].y));
14299         sp_cache[i].set = 1;
14300         sp_cache[i].cnt = 1;
14301     }
14302 
14303     *cache = &sp_cache[i];
14304     sp_cache_last = i;
14305 }
14306 #endif /* FP_ECC */
14307 
14308 /* Multiply the base point of P256 by the scalar and return the result.
14309  * If map is true then convert result to affine co-ordinates.
14310  *
14311  * r     Resulting point.
14312  * g     Point to multiply.
14313  * k     Scalar to multiply by.
14314  * map   Indicates whether to convert result to affine.
14315  * heap  Heap to use for allocation.
14316  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
14317  */
14318 static int sp_256_ecc_mulmod_4(sp_point* r, sp_point* g, sp_digit* k,
14319         int map, void* heap)
14320 {
14321 #ifndef FP_ECC
14322     return sp_256_ecc_mulmod_win_add_sub_4(r, g, k, map, heap);
14323 #else
14324     sp_digit tmp[2 * 4 * 5];
14325     sp_cache_t* cache;
14326     int err = MP_OKAY;
14327 
14328 #ifndef HAVE_THREAD_LS
14329     if (initCacheMutex == 0) {
14330          wc_InitMutex(&sp_cache_lock);
14331          initCacheMutex = 1;
14332     }
14333     if (wc_LockMutex(&sp_cache_lock) != 0)
14334        err = BAD_MUTEX_E;
14335 #endif /* HAVE_THREAD_LS */
14336 
14337     if (err == MP_OKAY) {
14338         sp_ecc_get_cache(g, &cache);
14339         if (cache->cnt == 2)
14340             sp_256_gen_stripe_table_4(g, cache->table, tmp, heap);
14341 
14342 #ifndef HAVE_THREAD_LS
14343         wc_UnLockMutex(&sp_cache_lock);
14344 #endif /* HAVE_THREAD_LS */
14345 
14346         if (cache->cnt < 2) {
14347             err = sp_256_ecc_mulmod_win_add_sub_4(r, g, k, map, heap);
14348         }
14349         else {
14350             err = sp_256_ecc_mulmod_stripe_4(r, g, cache->table, k,
14351                     map, heap);
14352         }
14353     }
14354 
14355     return err;
14356 #endif
14357 }
14358 
14359 /* Multiply the point by the scalar and return the result.
14360  * If map is true then convert result to affine co-ordinates.
14361  *
14362  * km    Scalar to multiply by.
14363  * p     Point to multiply.
14364  * r     Resulting point.
14365  * map   Indicates whether to convert result to affine.
14366  * heap  Heap to use for allocation.
14367  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
14368  */
14369 int sp_ecc_mulmod_256(mp_int* km, ecc_point* gm, ecc_point* r, int map,
14370         void* heap)
14371 {
14372 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
14373     sp_point p;
14374     sp_digit kd[4];
14375 #endif
14376     sp_point* point;
14377     sp_digit* k = NULL;
14378     int err = MP_OKAY;
14379 #ifdef HAVE_INTEL_AVX2
14380     word32 cpuid_flags = cpuid_get_flags();
14381 #endif
14382 
14383     err = sp_ecc_point_new(heap, p, point);
14384 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
14385     if (err == MP_OKAY) {
14386         k = XMALLOC(sizeof(sp_digit) * 4, heap, DYNAMIC_TYPE_ECC);
14387         if (k == NULL)
14388             err = MEMORY_E;
14389     }
14390 #else
14391     k = kd;
14392 #endif
14393     if (err == MP_OKAY) {
14394         sp_256_from_mp(k, 4, km);
14395         sp_256_point_from_ecc_point_4(point, gm);
14396 
14397 #ifdef HAVE_INTEL_AVX2
14398         if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags))
14399             err = sp_256_ecc_mulmod_avx2_4(point, point, k, map, heap);
14400         else
14401 #endif
14402             err = sp_256_ecc_mulmod_4(point, point, k, map, heap);
14403     }
14404     if (err == MP_OKAY)
14405         err = sp_256_point_to_ecc_point_4(point, r);
14406 
14407 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
14408     if (k != NULL)
14409         XFREE(k, heap, DYNAMIC_TYPE_ECC);
14410 #endif
14411     sp_ecc_point_free(point, 0, heap);
14412 
14413     return err;
14414 }
14415 
14416 #ifdef WOLFSSL_SP_SMALL
14417 static sp_table_entry p256_table[256] = {
14418     /* 0 */
14419     { { 0x00, 0x00, 0x00, 0x00 },
14420       { 0x00, 0x00, 0x00, 0x00 },
14421       1 },
14422     /* 1 */
14423     { { 0x79e730d418a9143cl,0x75ba95fc5fedb601l,0x79fb732b77622510l,
14424         0x18905f76a53755c6l },
14425       { 0xddf25357ce95560al,0x8b4ab8e4ba19e45cl,0xd2e88688dd21f325l,
14426         0x8571ff1825885d85l },
14427       0 },
14428     /* 2 */
14429     { { 0x202886024147519al,0xd0981eac26b372f0l,0xa9d4a7caa785ebc8l,
14430         0xd953c50ddbdf58e9l },
14431       { 0x9d6361ccfd590f8fl,0x72e9626b44e6c917l,0x7fd9611022eb64cfl,
14432         0x863ebb7e9eb288f3l },
14433       0 },
14434     /* 3 */
14435     { { 0x7856b6235cdb6485l,0x808f0ea22f0a2f97l,0x3e68d9544f7e300bl,
14436         0x00076055b5ff80a0l },
14437       { 0x7634eb9b838d2010l,0x54014fbb3243708al,0xe0e47d39842a6606l,
14438         0x8308776134373ee0l },
14439       0 },
14440     /* 4 */
14441     { { 0x4f922fc516a0d2bbl,0x0d5cc16c1a623499l,0x9241cf3a57c62c8bl,
14442         0x2f5e6961fd1b667fl },
14443       { 0x5c15c70bf5a01797l,0x3d20b44d60956192l,0x04911b37071fdb52l,
14444         0xf648f9168d6f0f7bl },
14445       0 },
14446     /* 5 */
14447     { { 0x9e566847e137bbbcl,0xe434469e8a6a0becl,0xb1c4276179d73463l,
14448         0x5abe0285133d0015l },
14449       { 0x92aa837cc04c7dabl,0x573d9f4c43260c07l,0x0c93156278e6cc37l,
14450         0x94bb725b6b6f7383l },
14451       0 },
14452     /* 6 */
14453     { { 0xbbf9b48f720f141cl,0x6199b3cd2df5bc74l,0xdc3f6129411045c4l,
14454         0xcdd6bbcb2f7dc4efl },
14455       { 0xcca6700beaf436fdl,0x6f647f6db99326bel,0x0c0fa792014f2522l,
14456         0xa361bebd4bdae5f6l },
14457       0 },
14458     /* 7 */
14459     { { 0x28aa2558597c13c7l,0xc38d635f50b7c3e1l,0x07039aecf3c09d1dl,
14460         0xba12ca09c4b5292cl },
14461       { 0x9e408fa459f91dfdl,0x3af43b66ceea07fbl,0x1eceb0899d780b29l,
14462         0x53ebb99d701fef4bl },
14463       0 },
14464     /* 8 */
14465     { { 0x4fe7ee31b0e63d34l,0xf4600572a9e54fabl,0xc0493334d5e7b5a4l,
14466         0x8589fb9206d54831l },
14467       { 0xaa70f5cc6583553al,0x0879094ae25649e5l,0xcc90450710044652l,
14468         0xebb0696d02541c4fl },
14469       0 },
14470     /* 9 */
14471     { { 0x4616ca15ac1647c5l,0xb8127d47c4cf5799l,0xdc666aa3764dfbacl,
14472         0xeb2820cbd1b27da3l },
14473       { 0x9406f8d86a87e008l,0xd87dfa9d922378f3l,0x56ed2e4280ccecb2l,
14474         0x1f28289b55a7da1dl },
14475       0 },
14476     /* 10 */
14477     { { 0xabbaa0c03b89da99l,0xa6f2d79eb8284022l,0x27847862b81c05e8l,
14478         0x337a4b5905e54d63l },
14479       { 0x3c67500d21f7794al,0x207005b77d6d7f61l,0x0a5a378104cfd6e8l,
14480         0x0d65e0d5f4c2fbd6l },
14481       0 },
14482     /* 11 */
14483     { { 0xd9d09bbeb5275d38l,0x4268a7450be0a358l,0xf0762ff4973eb265l,
14484         0xc23da24252f4a232l },
14485       { 0x5da1b84f0b94520cl,0x09666763b05bd78el,0x3a4dcb8694d29ea1l,
14486         0x19de3b8cc790cff1l },
14487       0 },
14488     /* 12 */
14489     { { 0x183a716c26c5fe04l,0x3b28de0b3bba1bdbl,0x7432c586a4cb712cl,
14490         0xe34dcbd491fccbfdl },
14491       { 0xb408d46baaa58403l,0x9a69748682e97a53l,0x9e39012736aaa8afl,
14492         0xe7641f447b4e0f7fl },
14493       0 },
14494     /* 13 */
14495     { { 0x7d753941df64ba59l,0xd33f10ec0b0242fcl,0x4f06dfc6a1581859l,
14496         0x4a12df57052a57bfl },
14497       { 0xbfa6338f9439dbd0l,0xd3c24bd4bde53e1fl,0xfd5e4ffa21f1b314l,
14498         0x6af5aa93bb5bea46l },
14499       0 },
14500     /* 14 */
14501     { { 0xda10b69910c91999l,0x0a24b4402a580491l,0x3e0094b4b8cc2090l,
14502         0x5fe3475a66a44013l },
14503       { 0xb0f8cabdf93e7b4bl,0x292b501a7c23f91al,0x42e889aecd1e6263l,
14504         0xb544e308ecfea916l },
14505       0 },
14506     /* 15 */
14507     { { 0x6478c6e916ddfdcel,0x2c329166f89179e6l,0x4e8d6e764d4e67e1l,
14508         0xe0b6b2bda6b0c20bl },
14509       { 0x0d312df2bb7efb57l,0x1aac0dde790c4007l,0xf90336ad679bc944l,
14510         0x71c023de25a63774l },
14511       0 },
14512     /* 16 */
14513     { { 0x62a8c244bfe20925l,0x91c19ac38fdce867l,0x5a96a5d5dd387063l,
14514         0x61d587d421d324f6l },
14515       { 0xe87673a2a37173eal,0x2384800853778b65l,0x10f8441e05bab43el,
14516         0xfa11fe124621efbel },
14517       0 },
14518     /* 17 */
14519     { { 0x1c891f2b2cb19ffdl,0x01ba8d5bb1923c23l,0xb6d03d678ac5ca8el,
14520         0x586eb04c1f13bedcl },
14521       { 0x0c35c6e527e8ed09l,0x1e81a33c1819ede2l,0x278fd6c056c652fal,
14522         0x19d5ac0870864f11l },
14523       0 },
14524     /* 18 */
14525     { { 0x1e99f581309a4e1fl,0xab7de71be9270074l,0x26a5ef0befd28d20l,
14526         0xe7c0073f7f9c563fl },
14527       { 0x1f6d663a0ef59f76l,0x669b3b5420fcb050l,0xc08c1f7a7a6602d4l,
14528         0xe08504fec65b3c0al },
14529       0 },
14530     /* 19 */
14531     { { 0xf098f68da031b3cal,0x6d1cab9ee6da6d66l,0x5bfd81fa94f246e8l,
14532         0x78f018825b0996b4l },
14533       { 0xb7eefde43a25787fl,0x8016f80d1dccac9bl,0x0cea4877b35bfc36l,
14534         0x43a773b87e94747al },
14535       0 },
14536     /* 20 */
14537     { { 0x62577734d2b533d5l,0x673b8af6a1bdddc0l,0x577e7c9aa79ec293l,
14538         0xbb6de651c3b266b1l },
14539       { 0xe7e9303ab65259b3l,0xd6a0afd3d03a7480l,0xc5ac83d19b3cfc27l,
14540         0x60b4619a5d18b99bl },
14541       0 },
14542     /* 21 */
14543     { { 0xbd6a38e11ae5aa1cl,0xb8b7652b49e73658l,0x0b130014ee5f87edl,
14544         0x9d0f27b2aeebffcdl },
14545       { 0xca9246317a730a55l,0x9c955b2fddbbc83al,0x07c1dfe0ac019a71l,
14546         0x244a566d356ec48dl },
14547       0 },
14548     /* 22 */
14549     { { 0x6db0394aeacf1f96l,0x9f2122a9024c271cl,0x2626ac1b82cbd3b9l,
14550         0x45e58c873581ef69l },
14551       { 0xd3ff479da38f9dbcl,0xa8aaf146e888a040l,0x945adfb246e0bed7l,
14552         0xc040e21cc1e4b7a4l },
14553       0 },
14554     /* 23 */
14555     { { 0x847af0006f8117b6l,0x651969ff73a35433l,0x482b35761d9475ebl,
14556         0x1cdf5c97682c6ec7l },
14557       { 0x7db775b411f04839l,0x7dbeacf448de1698l,0xb2921dd1b70b3219l,
14558         0x046755f8a92dff3dl },
14559       0 },
14560     /* 24 */
14561     { { 0xcc8ac5d2bce8ffcdl,0x0d53c48b2fe61a82l,0xf6f161727202d6c7l,
14562         0x046e5e113b83a5f3l },
14563       { 0xe7b8ff64d8007f01l,0x7fb1ef125af43183l,0x045c5ea635e1a03cl,
14564         0x6e0106c3303d005bl },
14565       0 },
14566     /* 25 */
14567     { { 0x48c7358488dd73b1l,0x7670708f995ed0d9l,0x38385ea8c56a2ab7l,
14568         0x442594ede901cf1fl },
14569       { 0xf8faa2c912d4b65bl,0x94c2343b96c90c37l,0xd326e4a15e978d1fl,
14570         0xa796fa514c2ee68el },
14571       0 },
14572     /* 26 */
14573     { { 0x359fb604823addd7l,0x9e2a6183e56693b3l,0xf885b78e3cbf3c80l,
14574         0xe4ad2da9c69766e9l },
14575       { 0x357f7f428e048a61l,0x082d198cc092d9a0l,0xfc3a1af4c03ed8efl,
14576         0xc5e94046c37b5143l },
14577       0 },
14578     /* 27 */
14579     { { 0x476a538c2be75f9el,0x6fd1a9e8cb123a78l,0xd85e4df0b109c04bl,
14580         0x63283dafdb464747l },
14581       { 0xce728cf7baf2df15l,0xe592c4550ad9a7f4l,0xfab226ade834bcc3l,
14582         0x68bd19ab1981a938l },
14583       0 },
14584     /* 28 */
14585     { { 0xc08ead511887d659l,0x3374d5f4b359305al,0x96986981cfe74fe3l,
14586         0x495292f53c6fdfd6l },
14587       { 0x4a878c9e1acec896l,0xd964b210ec5b4484l,0x6696f7e2664d60a7l,
14588         0x0ec7530d26036837l },
14589       0 },
14590     /* 29 */
14591     { { 0x2da13a05ad2687bbl,0xa1f83b6af32e21fal,0x390f5ef51dd4607bl,
14592         0x0f6207a664863f0bl },
14593       { 0xbd67e3bb0f138233l,0xdd66b96c272aa718l,0x8ed0040726ec88ael,
14594         0xff0db07208ed6dcfl },
14595       0 },
14596     /* 30 */
14597     { { 0x749fa1014c95d553l,0xa44052fd5d680a8al,0x183b4317ff3b566fl,
14598         0x313b513c88740ea3l },
14599       { 0xb402e2ac08d11549l,0x071ee10bb4dee21cl,0x26b987dd47f2320el,
14600         0x2d3abcf986f19f81l },
14601       0 },
14602     /* 31 */
14603     { { 0x4c288501815581a2l,0x9a0a6d56632211afl,0x19ba7a0f0cab2e99l,
14604         0xc036fa10ded98cdfl },
14605       { 0x29ae08bac1fbd009l,0x0b68b19006d15816l,0xc2eb32779b9e0d8fl,
14606         0xa6b2a2c4b6d40194l },
14607       0 },
14608     /* 32 */
14609     { { 0xd433e50f6d3549cfl,0x6f33696ffacd665el,0x695bfdacce11fcb4l,
14610         0x810ee252af7c9860l },
14611       { 0x65450fe17159bb2cl,0xf7dfbebe758b357bl,0x2b057e74d69fea72l,
14612         0xd485717a92731745l },
14613       0 },
14614     /* 33 */
14615     { { 0x11741a8af0cb5a98l,0xd3da8f931f3110bfl,0x1994e2cbab382adfl,
14616         0x6a6045a72f9a604el },
14617       { 0x170c0d3fa2b2411dl,0xbe0eb83e510e96e0l,0x3bcc9f738865b3ccl,
14618         0xd3e45cfaf9e15790l },
14619       0 },
14620     /* 34 */
14621     { { 0xce1f69bbe83f7669l,0x09f8ae8272877d6bl,0x9548ae543244278dl,
14622         0x207755dee3c2c19cl },
14623       { 0x87bd61d96fef1945l,0x18813cefb12d28c3l,0x9fbcd1d672df64aal,
14624         0x48dc5ee57154b00dl },
14625       0 },
14626     /* 35 */
14627     { { 0x123790bff7e5a199l,0xe0efb8cf989ccbb7l,0xc27a2bfe0a519c79l,
14628         0xf2fb0aeddff6f445l },
14629       { 0x41c09575f0b5025fl,0x550543d740fa9f22l,0x8fa3c8ad380bfbd0l,
14630         0xa13e9015db28d525l },
14631       0 },
14632     /* 36 */
14633     { { 0xf9f7a350a2b65cbcl,0x0b04b9722a464226l,0x265ce241e23f07a1l,
14634         0x2bf0d6b01497526fl },
14635       { 0xd3d4dd3f4b216fb7l,0xf7d7b867fbdda26al,0xaeb7b83f6708505cl,
14636         0x42a94a5a162fe89fl },
14637       0 },
14638     /* 37 */
14639     { { 0x5846ad0beaadf191l,0x0f8a489025a268d7l,0xe8603050494dc1f6l,
14640         0x2c2dd969c65ede3dl },
14641       { 0x6d02171d93849c17l,0x460488ba1da250ddl,0x4810c7063c3a5485l,
14642         0xf437fa1f42c56dbcl },
14643       0 },
14644     /* 38 */
14645     { { 0x6aa0d7144a0f7dabl,0x0f0497931776e9acl,0x52c0a050f5f39786l,
14646         0xaaf45b3354707aa8l },
14647       { 0x85e37c33c18d364al,0xd40b9b063e497165l,0xf417168115ec5444l,
14648         0xcdf6310df4f272bcl },
14649       0 },
14650     /* 39 */
14651     { { 0x7473c6238ea8b7efl,0x08e9351885bc2287l,0x419567722bda8e34l,
14652         0xf0d008bada9e2ff2l },
14653       { 0x2912671d2414d3b1l,0xb3754985b019ea76l,0x5c61b96d453bcbdbl,
14654         0x5bd5c2f5ca887b8bl },
14655       0 },
14656     /* 40 */
14657     { { 0xef0f469ef49a3154l,0x3e85a5956e2b2e9al,0x45aaec1eaa924a9cl,
14658         0xaa12dfc8a09e4719l },
14659       { 0x26f272274df69f1dl,0xe0e4c82ca2ff5e73l,0xb9d8ce73b7a9dd44l,
14660         0x6c036e73e48ca901l },
14661       0 },
14662     /* 41 */
14663     { { 0x5cfae12a0f6e3138l,0x6966ef0025ad345al,0x8993c64b45672bc5l,
14664         0x292ff65896afbe24l },
14665       { 0xd5250d445e213402l,0xf6580e274392c9fel,0x097b397fda1c72e8l,
14666         0x644e0c90311b7276l },
14667       0 },
14668     /* 42 */
14669     { { 0xe1e421e1a47153f0l,0xb86c3b79920418c9l,0x93bdce87705d7672l,
14670         0xf25ae793cab79a77l },
14671       { 0x1f3194a36d869d0cl,0x9d55c8824986c264l,0x49fb5ea3096e945el,
14672         0x39b8e65313db0a3el },
14673       0 },
14674     /* 43 */
14675     { { 0x37754200b6fd2e59l,0x35e2c0669255c98fl,0xd9dab21a0e2a5739l,
14676         0x39122f2f0f19db06l },
14677       { 0xcfbce1e003cad53cl,0x225b2c0fe65c17e3l,0x72baf1d29aa13877l,
14678         0x8de80af8ce80ff8dl },
14679       0 },
14680     /* 44 */
14681     { { 0xafbea8d9207bbb76l,0x921c7e7c21782758l,0xdfa2b74b1c0436b1l,
14682         0x871949062e368c04l },
14683       { 0xb5f928bba3993df5l,0x639d75b5f3b3d26al,0x011aa78a85b55050l,
14684         0xfc315e6a5b74fde1l },
14685       0 },
14686     /* 45 */
14687     { { 0x561fd41ae8d6ecfal,0x5f8c44f61aec7f86l,0x98452a7b4924741dl,
14688         0xe6d4a7adee389088l },
14689       { 0x60552ed14593c75dl,0x70a70da4dd271162l,0xd2aede937ba2c7dbl,
14690         0x35dfaf9a9be2ae57l },
14691       0 },
14692     /* 46 */
14693     { { 0x6b956fcdaa736636l,0x09f51d97ae2cab7el,0xfb10bf410f349966l,
14694         0x1da5c7d71c830d2bl },
14695       { 0x5c41e4833cce6825l,0x15ad118ff9573c3bl,0xa28552c7f23036b8l,
14696         0x7077c0fddbf4b9d6l },
14697       0 },
14698     /* 47 */
14699     { { 0xbf63ff8d46b9661cl,0xa1dfd36b0d2cfd71l,0x0373e140a847f8f7l,
14700         0x53a8632ee50efe44l },
14701       { 0x0976ff68696d8051l,0xdaec0c95c74f468al,0x62994dc35e4e26bdl,
14702         0x028ca76d34e1fcc1l },
14703       0 },
14704     /* 48 */
14705     { { 0xd11d47dcfc9877eel,0xc8b36210801d0002l,0xd002c11754c260b6l,
14706         0x04c17cd86962f046l },
14707       { 0x6d9bd094b0daddf5l,0xbea2357524ce55c0l,0x663356e672da03b5l,
14708         0xf7ba4de9fed97474l },
14709       0 },
14710     /* 49 */
14711     { { 0xd0dbfa34ebe1263fl,0x5576373571ae7ce6l,0xd244055382a6f523l,
14712         0xe31f960052131c41l },
14713       { 0xd1bb9216ea6b6ec6l,0x37a1d12e73c2fc44l,0xc10e7eac89d0a294l,
14714         0xaa3a6259ce34d47bl },
14715       0 },
14716     /* 50 */
14717     { { 0xfbcf9df536f3dcd3l,0x6ceded50d2bf7360l,0x491710fadf504f5bl,
14718         0x2398dd627e79daeel },
14719       { 0xcf4705a36d09569el,0xea0619bb5149f769l,0xff9c037735f6034cl,
14720         0x5717f5b21c046210l },
14721       0 },
14722     /* 51 */
14723     { { 0x9fe229c921dd895el,0x8e51850040c28451l,0xfa13d2391d637ecdl,
14724         0x660a2c560e3c28del },
14725       { 0x9cca88aed67fcbd0l,0xc84724780ea9f096l,0x32b2f48172e92b4dl,
14726         0x624ee54c4f522453l },
14727       0 },
14728     /* 52 */
14729     { { 0x09549ce4d897ecccl,0x4d49d1d93f9880aal,0x723c2423043a7c20l,
14730         0x4f392afb92bdfbc0l },
14731       { 0x6969f8fa7de44fd9l,0xb66cfbe457b32156l,0xdb2fa803368ebc3cl,
14732         0x8a3e7977ccdb399cl },
14733       0 },
14734     /* 53 */
14735     { { 0xdde1881f06c4b125l,0xae34e300f6e3ca8cl,0xef6999de5c7a13e9l,
14736         0x3888d02370c24404l },
14737       { 0x7628035644f91081l,0x3d9fcf615f015504l,0x1827edc8632cd36el,
14738         0xa5e62e4718102336l },
14739       0 },
14740     /* 54 */
14741     { { 0x1a825ee32facd6c8l,0x699c635454bcbc66l,0x0ce3edf798df9931l,
14742         0x2c4768e6466a5adcl },
14743       { 0xb346ff8c90a64bc9l,0x630a6020e4779f5cl,0xd949d064bc05e884l,
14744         0x7b5e6441f9e652a0l },
14745       0 },
14746     /* 55 */
14747     { { 0x2169422c1d28444al,0xe996c5d8be136a39l,0x2387afe5fb0c7fcel,
14748         0xb8af73cb0c8d744al },
14749       { 0x5fde83aa338b86fdl,0xfee3f158a58a5cffl,0xc9ee8f6f20ac9433l,
14750         0xa036395f7f3f0895l },
14751       0 },
14752     /* 56 */
14753     { { 0x8c73c6bba10f7770l,0xa6f16d81a12a0e24l,0x100df68251bc2b9fl,
14754         0x4be36b01875fb533l },
14755       { 0x9226086e9fb56dbbl,0x306fef8b07e7a4f8l,0xeeaccc0566d52f20l,
14756         0x8cbc9a871bdc00c0l },
14757       0 },
14758     /* 57 */
14759     { { 0xe131895cc0dac4abl,0xa874a440712ff112l,0x6332ae7c6a1cee57l,
14760         0x44e7553e0c0835f8l },
14761       { 0x6d503fff7734002dl,0x9d35cb8b0b34425cl,0x95f702760e8738b5l,
14762         0x470a683a5eb8fc18l },
14763       0 },
14764     /* 58 */
14765     { { 0x81b761dc90513482l,0x0287202a01e9276al,0xcda441ee0ce73083l,
14766         0x16410690c63dc6efl },
14767       { 0xf5034a066d06a2edl,0xdd4d7745189b100bl,0xd914ae72ab8218c9l,
14768         0xd73479fd7abcbb4fl },
14769       0 },
14770     /* 59 */
14771     { { 0x7edefb165ad4c6e5l,0x262cf08f5b06d04dl,0x12ed5bb18575cb14l,
14772         0x816469e30771666bl },
14773       { 0xd7ab9d79561e291el,0xeb9daf22c1de1661l,0xf49827eb135e0513l,
14774         0x0a36dd23f0dd3f9cl },
14775       0 },
14776     /* 60 */
14777     { { 0x098d32c741d5533cl,0x7c5f5a9e8684628fl,0x39a228ade349bd11l,
14778         0xe331dfd6fdbab118l },
14779       { 0x5100ab686bcc6ed8l,0x7160c3bdef7a260el,0x9063d9a7bce850d7l,
14780         0xd3b4782a492e3389l },
14781       0 },
14782     /* 61 */
14783     { { 0xa149b6e8f3821f90l,0x92edd9ed66eb7aadl,0x0bb669531a013116l,
14784         0x7281275a4c86a5bdl },
14785       { 0x503858f7d3ff47e5l,0x5e1616bc61016441l,0x62b0f11a7dfd9bb1l,
14786         0x2c062e7ece145059l },
14787       0 },
14788     /* 62 */
14789     { { 0xa76f996f0159ac2el,0x281e7736cbdb2713l,0x2ad6d28808e46047l,
14790         0x282a35f92c4e7ef1l },
14791       { 0x9c354b1ec0ce5cd2l,0xcf99efc91379c229l,0x992caf383e82c11el,
14792         0xc71cd513554d2abdl },
14793       0 },
14794     /* 63 */
14795     { { 0x4885de9c09b578f4l,0x1884e258e3affa7al,0x8f76b1b759182f1fl,
14796         0xc50f6740cf47f3a3l },
14797       { 0xa9c4adf3374b68eal,0xa406f32369965fe2l,0x2f86a22285a53050l,
14798         0xb9ecb3a7212958dcl },
14799       0 },
14800     /* 64 */
14801     { { 0x56f8410ef4f8b16al,0x97241afec47b266al,0x0a406b8e6d9c87c1l,
14802         0x803f3e02cd42ab1bl },
14803       { 0x7f0309a804dbec69l,0xa83b85f73bbad05fl,0xc6097273ad8e197fl,
14804         0xc097440e5067adc1l },
14805       0 },
14806     /* 65 */
14807     { { 0x846a56f2c379ab34l,0xa8ee068b841df8d1l,0x20314459176c68efl,
14808         0xf1af32d5915f1f30l },
14809       { 0x99c375315d75bd50l,0x837cffbaf72f67bcl,0x0613a41848d7723fl,
14810         0x23d0f130e2d41c8bl },
14811       0 },
14812     /* 66 */
14813     { { 0x857ab6edf41500d9l,0x0d890ae5fcbeada8l,0x52fe864889725951l,
14814         0xb0288dd6c0a3faddl },
14815       { 0x85320f30650bcb08l,0x71af6313695d6e16l,0x31f520a7b989aa76l,
14816         0xffd3724ff408c8d2l },
14817       0 },
14818     /* 67 */
14819     { { 0x53968e64b458e6cbl,0x992dad20317a5d28l,0x3814ae0b7aa75f56l,
14820         0xf5590f4ad78c26dfl },
14821       { 0x0fc24bd3cf0ba55al,0x0fc4724a0c778bael,0x1ce9864f683b674al,
14822         0x18d6da54f6f74a20l },
14823       0 },
14824     /* 68 */
14825     { { 0xed93e225d5be5a2bl,0x6fe799835934f3c6l,0x4314092622626ffcl,
14826         0x50bbb4d97990216al },
14827       { 0x378191c6e57ec63el,0x65422c40181dcdb2l,0x41a8099b0236e0f6l,
14828         0x2b10011801fe49c3l },
14829       0 },
14830     /* 69 */
14831     { { 0xfc68b5c59b391593l,0xc385f5a2598270fcl,0x7144f3aad19adcbbl,
14832         0xdd55899983fbae0cl },
14833       { 0x93b88b8e74b82ff4l,0xd2e03c4071e734c9l,0x9a7a9eaf43c0322al,
14834         0xe6e4c551149d6041l },
14835       0 },
14836     /* 70 */
14837     { { 0x55f655bb1e9af288l,0x647e1a64f7ada931l,0x43697e4bcb2820e5l,
14838         0x51e00db107ed56ffl },
14839       { 0x43d169b8771c327el,0x29cdb20b4a96c2adl,0xc07d51f53deb4779l,
14840         0xe22f424149829177l },
14841       0 },
14842     /* 71 */
14843     { { 0xcd45e8f4635f1abbl,0x7edc0cb568538874l,0xc9472c1fb5a8034dl,
14844         0xf709373d52dc48c9l },
14845       { 0x401966bba8af30d6l,0x95bf5f4af137b69cl,0x3966162a9361c47el,
14846         0xbd52d288e7275b11l },
14847       0 },
14848     /* 72 */
14849     { { 0xab155c7a9c5fa877l,0x17dad6727d3a3d48l,0x43f43f9e73d189d8l,
14850         0xa0d0f8e4c8aa77a6l },
14851       { 0x0bbeafd8cc94f92dl,0xd818c8be0c4ddb3al,0x22cc65f8b82eba14l,
14852         0xa56c78c7946d6a00l },
14853       0 },
14854     /* 73 */
14855     { { 0x2962391b0dd09529l,0x803e0ea63daddfcfl,0x2c77351f5b5bf481l,
14856         0xd8befdf8731a367al },
14857       { 0xab919d42fc0157f4l,0xf51caed7fec8e650l,0xcdf9cb4002d48b0al,
14858         0x854a68a5ce9f6478l },
14859       0 },
14860     /* 74 */
14861     { { 0xdc35f67b63506ea5l,0x9286c489a4fe0d66l,0x3f101d3bfe95cd4dl,
14862         0x5cacea0b98846a95l },
14863       { 0xa90df60c9ceac44dl,0x3db29af4354d1c3al,0x08dd3de8ad5dbabel,
14864         0xe4982d1235e4efa9l },
14865       0 },
14866     /* 75 */
14867     { { 0x23104a22c34cd55el,0x58695bb32680d132l,0xfb345afa1fa1d943l,
14868         0x8046b7f616b20499l },
14869       { 0xb533581e38e7d098l,0xd7f61e8df46f0b70l,0x30dea9ea44cb78c4l,
14870         0xeb17ca7b9082af55l },
14871       0 },
14872     /* 76 */
14873     { { 0x1751b59876a145b9l,0xa5cf6b0fc1bc71ecl,0xd3e03565392715bbl,
14874         0x097b00bafab5e131l },
14875       { 0xaa66c8e9565f69e1l,0x77e8f75ab5be5199l,0x6033ba11da4fd984l,
14876         0xf95c747bafdbcc9el },
14877       0 },
14878     /* 77 */
14879     { { 0x558f01d3bebae45el,0xa8ebe9f0c4bc6955l,0xaeb705b1dbc64fc6l,
14880         0x3512601e566ed837l },
14881       { 0x9336f1e1fa1161cdl,0x328ab8d54c65ef87l,0x4757eee2724f21e5l,
14882         0x0ef971236068ab6bl },
14883       0 },
14884     /* 78 */
14885     { { 0x02598cf754ca4226l,0x5eede138f8642c8el,0x48963f74468e1790l,
14886         0xfc16d9333b4fbc95l },
14887       { 0xbe96fb31e7c800cal,0x138063312678adaal,0x3d6244976ff3e8b5l,
14888         0x14ca4af1b95d7a17l },
14889       0 },
14890     /* 79 */
14891     { { 0x7a4771babd2f81d5l,0x1a5f9d6901f7d196l,0xd898bef7cad9c907l,
14892         0x4057b063f59c231dl },
14893       { 0xbffd82fe89c05c0al,0xe4911c6f1dc0df85l,0x3befccaea35a16dbl,
14894         0x1c3b5d64f1330b13l },
14895       0 },
14896     /* 80 */
14897     { { 0x5fe14bfe80ec21fel,0xf6ce116ac255be82l,0x98bc5a072f4a5d67l,
14898         0xfad27148db7e63afl },
14899       { 0x90c0b6ac29ab05b3l,0x37a9a83c4e251ae6l,0x0a7dc875c2aade7dl,
14900         0x77387de39f0e1a84l },
14901       0 },
14902     /* 81 */
14903     { { 0x1e9ecc49a56c0dd7l,0xa5cffcd846086c74l,0x8f7a1408f505aecel,
14904         0xb37b85c0bef0c47el },
14905       { 0x3596b6e4cc0e6a8fl,0xfd6d4bbf6b388f23l,0xaba453fac39cef4el,
14906         0x9c135ac8f9f628d5l },
14907       0 },
14908     /* 82 */
14909     { { 0x32aa320284e35743l,0x320d6ab185a3cdefl,0xb821b1761df19819l,
14910         0x5721361fc433851fl },
14911       { 0x1f0db36a71fc9168l,0x5f98ba735e5c403cl,0xf64ca87e37bcd8f5l,
14912         0xdcbac3c9e6bb11bdl },
14913       0 },
14914     /* 83 */
14915     { { 0xf01d99684518cbe2l,0xd242fc189c9eb04el,0x727663c7e47feebfl,
14916         0xb8c1c89e2d626862l },
14917       { 0x51a58bddc8e1d569l,0x563809c8b7d88cd0l,0x26c27fd9f11f31ebl,
14918         0x5d23bbda2f9422d4l },
14919       0 },
14920     /* 84 */
14921     { { 0x0a1c729495c8f8bel,0x2961c4803bf362bfl,0x9e418403df63d4acl,
14922         0xc109f9cb91ece900l },
14923       { 0xc2d095d058945705l,0xb9083d96ddeb85c0l,0x84692b8d7a40449bl,
14924         0x9bc3344f2eee1ee1l },
14925       0 },
14926     /* 85 */
14927     { { 0x0d5ae35642913074l,0x55491b2748a542b1l,0x469ca665b310732al,
14928         0x29591d525f1a4cc1l },
14929       { 0xe76f5b6bb84f983fl,0xbe7eef419f5f84e1l,0x1200d49680baa189l,
14930         0x6376551f18ef332cl },
14931       0 },
14932     /* 86 */
14933     { { 0xbda5f14e562976ccl,0x22bca3e60ef12c38l,0xbbfa30646cca9852l,
14934         0xbdb79dc808e2987al },
14935       { 0xfd2cb5c9cb06a772l,0x38f475aafe536dcel,0xc2a3e0227c2b5db8l,
14936         0x8ee86001add3c14al },
14937       0 },
14938     /* 87 */
14939     { { 0xcbe96981a4ade873l,0x7ee9aa4dc4fba48cl,0x2cee28995a054ba5l,
14940         0x92e51d7a6f77aa4bl },
14941       { 0x948bafa87190a34dl,0xd698f75bf6bd1ed1l,0xd00ee6e30caf1144l,
14942         0x5182f86f0a56aaaal },
14943       0 },
14944     /* 88 */
14945     { { 0xfba6212c7a4cc99cl,0xff609b683e6d9ca1l,0x5dbb27cb5ac98c5al,
14946         0x91dcab5d4073a6f2l },
14947       { 0x01b6cc3d5f575a70l,0x0cb361396f8d87fal,0x165d4e8c89981736l,
14948         0x17a0cedb97974f2bl },
14949       0 },
14950     /* 89 */
14951     { { 0x38861e2a076c8d3al,0x701aad39210f924bl,0x94d0eae413a835d9l,
14952         0x2e8ce36c7f4cdf41l },
14953       { 0x91273dab037a862bl,0x01ba9bb760e4c8fal,0xf964538833baf2ddl,
14954         0xf4ccc6cb34f668f3l },
14955       0 },
14956     /* 90 */
14957     { { 0x44ef525cf1f79687l,0x7c59549592efa815l,0xe1231741a5c78d29l,
14958         0xac0db4889a0df3c9l },
14959       { 0x86bfc711df01747fl,0x592b9358ef17df13l,0xe5880e4f5ccb6bb5l,
14960         0x95a64a6194c974a2l },
14961       0 },
14962     /* 91 */
14963     { { 0x72c1efdac15a4c93l,0x40269b7382585141l,0x6a8dfb1c16cb0badl,
14964         0x231e54ba29210677l },
14965       { 0xa70df9178ae6d2dcl,0x4d6aa63f39112918l,0xf627726b5e5b7223l,
14966         0xab0be032d8a731e1l },
14967       0 },
14968     /* 92 */
14969     { { 0x097ad0e98d131f2dl,0x637f09e33b04f101l,0x1ac86196d5e9a748l,
14970         0xf1bcc8802cf6a679l },
14971       { 0x25c69140e8daacb4l,0x3c4e405560f65009l,0x591cc8fc477937a6l,
14972         0x851694695aebb271l },
14973       0 },
14974     /* 93 */
14975     { { 0xde35c143f1dcf593l,0x78202b29b018be3bl,0xe9cdadc29bdd9d3dl,
14976         0x8f67d9d2daad55d8l },
14977       { 0x841116567481ea5fl,0xe7d2dde9e34c590cl,0xffdd43f405053fa8l,
14978         0xf84572b9c0728b5dl },
14979       0 },
14980     /* 94 */
14981     { { 0x5e1a7a7197af71c9l,0xa14494447a736565l,0xa1b4ae070e1d5063l,
14982         0xedee2710616b2c19l },
14983       { 0xb2f034f511734121l,0x1cac6e554a25e9f0l,0x8dc148f3a40c2ecfl,
14984         0x9fd27e9b44ebd7f4l },
14985       0 },
14986     /* 95 */
14987     { { 0x3cc7658af6e2cb16l,0xe3eb7d2cfe5919b6l,0x5a8c5816168d5583l,
14988         0xa40c2fb6958ff387l },
14989       { 0x8c9ec560fedcc158l,0x7ad804c655f23056l,0xd93967049a307e12l,
14990         0x99bc9bb87dc6decfl },
14991       0 },
14992     /* 96 */
14993     { { 0x84a9521d927dafc6l,0x52c1fb695c09cd19l,0x9d9581a0f9366ddel,
14994         0x9abe210ba16d7e64l },
14995       { 0x480af84a48915220l,0xfa73176a4dd816c6l,0xc7d539871681ca5al,
14996         0x7881c25787f344b0l },
14997       0 },
14998     /* 97 */
14999     { { 0x93399b51e0bcf3ffl,0x0d02cbc5127f74f6l,0x8fb465a2dd01d968l,
15000         0x15e6e319a30e8940l },
15001       { 0x646d6e0d3e0e05f4l,0xfad7bddc43588404l,0xbe61c7d1c4f850d3l,
15002         0x0e55facf191172cel },
15003       0 },
15004     /* 98 */
15005     { { 0x7e9d9806f8787564l,0x1a33172131e85ce6l,0x6b0158cab819e8d6l,
15006         0xd73d09766fe96577l },
15007       { 0x424834251eb7206el,0xa519290fc618bb42l,0x5dcbb8595e30a520l,
15008         0x9250a3748f15a50bl },
15009       0 },
15010     /* 99 */
15011     { { 0xcaff08f8be577410l,0xfd408a035077a8c6l,0xf1f63289ec0a63a4l,
15012         0x77414082c1cc8c0bl },
15013       { 0x05a40fa6eb0991cdl,0xc1ca086649fdc296l,0x3a68a3c7b324fd40l,
15014         0x8cb04f4d12eb20b9l },
15015       0 },
15016     /* 100 */
15017     { { 0xb1c2d0556906171cl,0x9073e9cdb0240c3fl,0xdb8e6b4fd8906841l,
15018         0xe4e429ef47123b51l },
15019       { 0x0b8dd53c38ec36f4l,0xf9d2dc01ff4b6a27l,0x5d066e07879a9a48l,
15020         0x37bca2ff3c6e6552l },
15021       0 },
15022     /* 101 */
15023     { { 0x4cd2e3c7df562470l,0x44f272a2c0964ac9l,0x7c6d5df980c793bel,
15024         0x59913edc3002b22al },
15025       { 0x7a139a835750592al,0x99e01d80e783de02l,0xcf8c0375ea05d64fl,
15026         0x43786e4ab013e226l },
15027       0 },
15028     /* 102 */
15029     { { 0xff32b0ed9e56b5a6l,0x0750d9a6d9fc68f9l,0xec15e845597846a7l,
15030         0x8638ca98b7e79e7al },
15031       { 0x2f5ae0960afc24b2l,0x05398eaf4dace8f2l,0x3b765dd0aecba78fl,
15032         0x1ecdd36a7b3aa6f0l },
15033       0 },
15034     /* 103 */
15035     { { 0x5d3acd626c5ff2f3l,0xa2d516c02873a978l,0xad94c9fad2110d54l,
15036         0xd85d0f85d459f32dl },
15037       { 0x9f700b8d10b11da3l,0xd2c22c30a78318c4l,0x556988f49208decdl,
15038         0xa04f19c3b4ed3c62l },
15039       0 },
15040     /* 104 */
15041     { { 0x087924c8ed7f93bdl,0xcb64ac5d392f51f6l,0x7cae330a821b71afl,
15042         0x92b2eeea5c0950b0l },
15043       { 0x85ac4c9485b6e235l,0xab2ca4a92936c0f0l,0x80faa6b3e0508891l,
15044         0x1ee782215834276cl },
15045       0 },
15046     /* 105 */
15047     { { 0xa60a2e00e63e79f7l,0xf590e7b2f399d906l,0x9021054a6607c09dl,
15048         0xf3f2ced857a6e150l },
15049       { 0x200510f3f10d9b55l,0x9d2fcfacd8642648l,0xe5631aa7e8bd0e7cl,
15050         0x0f56a4543da3e210l },
15051       0 },
15052     /* 106 */
15053     { { 0x5b21bffa1043e0dfl,0x6c74b6cc9c007e6dl,0x1a656ec0d4a8517al,
15054         0xbd8f17411969e263l },
15055       { 0x8a9bbb86beb7494al,0x1567d46f45f3b838l,0xdf7a12a7a4e5a79al,
15056         0x2d1a1c3530ccfa09l },
15057       0 },
15058     /* 107 */
15059     { { 0x192e3813506508dal,0x336180c4a1d795a7l,0xcddb59497a9944b3l,
15060         0xa107a65eb91fba46l },
15061       { 0xe6d1d1c50f94d639l,0x8b4af3758a58b7d7l,0x1a7c5584bd37ca1cl,
15062         0x183d760af87a9af2l },
15063       0 },
15064     /* 108 */
15065     { { 0x29d697110dde59a4l,0xf1ad8d070e8bef87l,0x229b49634f2ebe78l,
15066         0x1d44179dc269d754l },
15067       { 0xb32dc0cf8390d30el,0x0a3b27530de8110cl,0x31af1dc52bc0339al,
15068         0x771f9cc29606d262l },
15069       0 },
15070     /* 109 */
15071     { { 0x99993e7785040739l,0x44539db98026a939l,0xcf40f6f2f5f8fc26l,
15072         0x64427a310362718el },
15073       { 0x4f4f2d8785428aa8l,0x7b7adc3febfb49a8l,0x201b2c6df23d01acl,
15074         0x49d9b7496ae90d6dl },
15075       0 },
15076     /* 110 */
15077     { { 0xcc78d8bc435d1099l,0x2adbcd4e8e8d1a08l,0x02c2e2a02cb68a41l,
15078         0x9037d81b3f605445l },
15079       { 0x7cdbac27074c7b61l,0xfe2031ab57bfd72el,0x61ccec96596d5352l,
15080         0x08c3de6a7cc0639cl },
15081       0 },
15082     /* 111 */
15083     { { 0x20fdd020f6d552abl,0x56baff9805cd81f1l,0x06fb7c3e91351291l,
15084         0xc690944245796b2fl },
15085       { 0x17b3ae9c41231bd1l,0x1eac6e875cc58205l,0x208837abf9d6a122l,
15086         0x3fa3db02cafe3ac0l },
15087       0 },
15088     /* 112 */
15089     { { 0xd75a3e6505058880l,0x7da365ef643943f2l,0x4147861cfab24925l,
15090         0xc5c4bdb0fdb808ffl },
15091       { 0x73513e34b272b56bl,0xc8327e9511b9043al,0xfd8ce37df8844969l,
15092         0x2d56db9446c2b6b5l },
15093       0 },
15094     /* 113 */
15095     { { 0x2461782fff46ac6bl,0xd19f792607a2e425l,0xfafea3c409a48de1l,
15096         0x0f56bd9de503ba42l },
15097       { 0x137d4ed1345cda49l,0x821158fc816f299dl,0xe7c6a54aaeb43402l,
15098         0x4003bb9d1173b5f1l },
15099       0 },
15100     /* 114 */
15101     { { 0x3b8e8189a0803387l,0xece115f539cbd404l,0x4297208dd2877f21l,
15102         0x53765522a07f2f9el },
15103       { 0xa4980a21a8a4182dl,0xa2bbd07a3219df79l,0x674d0a2e1a19a2d4l,
15104         0x7a056f586c5d4549l },
15105       0 },
15106     /* 115 */
15107     { { 0x646b25589d8a2a47l,0x5b582948c3df2773l,0x51ec000eabf0d539l,
15108         0x77d482f17a1a2675l },
15109       { 0xb8a1bd9587853948l,0xa6f817bd6cfbffeel,0xab6ec05780681e47l,
15110         0x4115012b2b38b0e4l },
15111       0 },
15112     /* 116 */
15113     { { 0x3c73f0f46de28cedl,0x1d5da7609b13ec47l,0x61b8ce9e6e5c6392l,
15114         0xcdf04572fbea0946l },
15115       { 0x1cb3c58b6c53c3b0l,0x97fe3c10447b843cl,0xfb2b8ae12cb9780el,
15116         0xee703dda97383109l },
15117       0 },
15118     /* 117 */
15119     { { 0x34515140ff57e43al,0xd44660d3b1b811b8l,0x2b3b5dff8f42b986l,
15120         0x2a0ad89da162ce21l },
15121       { 0x64e4a6946bc277bal,0xc788c954c141c276l,0x141aa64ccabf6274l,
15122         0xd62d0b67ac2b4659l },
15123       0 },
15124     /* 118 */
15125     { { 0x39c5d87b2c054ac4l,0x57005859f27df788l,0xedf7cbf3b18128d6l,
15126         0xb39a23f2991c2426l },
15127       { 0x95284a15f0b16ae5l,0x0c6a05b1a136f51bl,0x1d63c137f2700783l,
15128         0x04ed0092c0674cc5l },
15129       0 },
15130     /* 119 */
15131     { { 0x1f4185d19ae90393l,0x3047b4294a3d64e6l,0xae0001a69854fc14l,
15132         0xa0a91fc10177c387l },
15133       { 0xff0a3f01ae2c831el,0xbb76ae822b727e16l,0x8f12c8a15a3075b4l,
15134         0x084cf9889ed20c41l },
15135       0 },
15136     /* 120 */
15137     { { 0xd98509defca6becfl,0x2fceae807dffb328l,0x5d8a15c44778e8b9l,
15138         0xd57955b273abf77el },
15139       { 0x210da79e31b5d4f1l,0xaa52f04b3cfa7a1cl,0xd4d12089dc27c20bl,
15140         0x8e14ea4202d141f1l },
15141       0 },
15142     /* 121 */
15143     { { 0xeed50345f2897042l,0x8d05331f43402c4al,0xc8d9c194c8bdfb21l,
15144         0x597e1a372aa4d158l },
15145       { 0x0327ec1acf0bd68cl,0x6d4be0dcab024945l,0x5b9c8d7ac9fe3e84l,
15146         0xca3f0236199b4deal },
15147       0 },
15148     /* 122 */
15149     { { 0x592a10b56170bd20l,0x0ea897f16d3f5de7l,0xa3363ff144b2ade2l,
15150         0xbde7fd7e309c07e4l },
15151       { 0x516bb6d2b8f5432cl,0x210dc1cbe043444bl,0x3db01e6ff8f95b5al,
15152         0xb623ad0e0a7dd198l },
15153       0 },
15154     /* 123 */
15155     { { 0xa75bd67560c7b65bl,0xab8c559023a4a289l,0xf8220fd0d7b26795l,
15156         0xd6aa2e4658ec137bl },
15157       { 0x10abc00b5138bb85l,0x8c31d121d833a95cl,0xb24ff00b1702a32el,
15158         0x111662e02dcc513al },
15159       0 },
15160     /* 124 */
15161     { { 0x78114015efb42b87l,0xbd9f5d701b6c4dffl,0x66ecccd7a7d7c129l,
15162         0xdb3ee1cb94b750f8l },
15163       { 0xb26f3db0f34837cfl,0xe7eed18bb9578d4fl,0x5d2cdf937c56657dl,
15164         0x886a644252206a59l },
15165       0 },
15166     /* 125 */
15167     { { 0x3c234cfb65b569eal,0x20011141f72119c1l,0x8badc85da15a619el,
15168         0xa70cf4eb018a17bcl },
15169       { 0x224f97ae8c4a6a65l,0x36e5cf270134378fl,0xbe3a609e4f7e0960l,
15170         0xaa4772abd1747b77l },
15171       0 },
15172     /* 126 */
15173     { { 0x676761317aa60cc0l,0xc79163610368115fl,0xded98bb4bbc1bb5al,
15174         0x611a6ddc30faf974l },
15175       { 0x30e78cbcc15ee47al,0x2e8962824e0d96a5l,0x36f35adf3dd9ed88l,
15176         0x5cfffaf816429c88l },
15177       0 },
15178     /* 127 */
15179     { { 0xc0d54cff9b7a99cdl,0x7bf3b99d843c45a1l,0x038a908f62c739e1l,
15180         0x6e5a6b237dc1994cl },
15181       { 0xef8b454e0ba5db77l,0xb7b8807facf60d63l,0xe591c0c676608378l,
15182         0x481a238d242dabccl },
15183       0 },
15184     /* 128 */
15185     { { 0xe3417bc035d0b34al,0x440b386b8327c0a7l,0x8fb7262dac0362d1l,
15186         0x2c41114ce0cdf943l },
15187       { 0x2ba5cef1ad95a0b1l,0xc09b37a867d54362l,0x26d6cdd201e486c9l,
15188         0x20477abf42ff9297l },
15189       0 },
15190     /* 129 */
15191     { { 0x2f75173c18d65dbfl,0x77bf940e339edad8l,0x7022d26bdcf1001cl,
15192         0xac66409ac77396b6l },
15193       { 0x8b0bb36fc6261cc3l,0x213f7bc9190e7e90l,0x6541cebaa45e6c10l,
15194         0xce8e6975cc122f85l },
15195       0 },
15196     /* 130 */
15197     { { 0x0f121b41bc0a67d2l,0x62d4760a444d248al,0x0e044f1d659b4737l,
15198         0x08fde365250bb4a8l },
15199       { 0xaceec3da848bf287l,0xc2a62182d3369d6el,0x3582dfdc92449482l,
15200         0x2f7e2fd2565d6cd7l },
15201       0 },
15202     /* 131 */
15203     { { 0xae4b92dbc3770fa7l,0x095e8d5c379043f9l,0x54f34e9d17761171l,
15204         0xc65be92e907702ael },
15205       { 0x2758a303f6fd0a40l,0xe7d822e3bcce784bl,0x7ae4f5854f9767bfl,
15206         0x4bff8e47d1193b3al },
15207       0 },
15208     /* 132 */
15209     { { 0xcd41d21f00ff1480l,0x2ab8fb7d0754db16l,0xac81d2efbbe0f3eal,
15210         0x3e4e4ae65772967dl },
15211       { 0x7e18f36d3c5303e6l,0x3bd9994b92262397l,0x9ed70e261324c3c0l,
15212         0x5388aefd58ec6028l },
15213       0 },
15214     /* 133 */
15215     { { 0xad1317eb5e5d7713l,0x09b985ee75de49dal,0x32f5bc4fc74fb261l,
15216         0x5cf908d14f75be0el },
15217       { 0x760435108e657b12l,0xbfd421a5b96ed9e6l,0x0e29f51f8970ccc2l,
15218         0xa698ba4060f00ce2l },
15219       0 },
15220     /* 134 */
15221     { { 0x73db1686ef748fecl,0xe6e755a27e9d2cf9l,0x630b6544ce265effl,
15222         0xb142ef8a7aebad8dl },
15223       { 0xad31af9f17d5770al,0x66af3b672cb3412fl,0x6bd60d1bdf3359del,
15224         0xd1896a9658515075l },
15225       0 },
15226     /* 135 */
15227     { { 0xec5957ab33c41c08l,0x87de94ac5468e2e1l,0x18816b73ac472f6cl,
15228         0x267b0e0b7981da39l },
15229       { 0x6e554e5d8e62b988l,0xd8ddc755116d21e7l,0x4610faf03d2a6f99l,
15230         0xb54e287aa1119393l },
15231       0 },
15232     /* 136 */
15233     { { 0x0a0122b5178a876bl,0x51ff96ff085104b4l,0x050b31ab14f29f76l,
15234         0x84abb28b5f87d4e6l },
15235       { 0xd5ed439f8270790al,0x2d6cb59d85e3f46bl,0x75f55c1b6c1e2212l,
15236         0xe5436f6717655640l },
15237       0 },
15238     /* 137 */
15239     { { 0x53f9025e2286e8d5l,0x353c95b4864453bel,0xd832f5bde408e3a0l,
15240         0x0404f68b5b9ce99el },
15241       { 0xcad33bdea781e8e5l,0x3cdf5018163c2f5bl,0x575769600119caa3l,
15242         0x3a4263df0ac1c701l },
15243       0 },
15244     /* 138 */
15245     { { 0xc2965ecc9aeb596dl,0x01ea03e7023c92b4l,0x4704b4b62e013961l,
15246         0x0ca8fd3f905ea367l },
15247       { 0x92523a42551b2b61l,0x1eb7a89c390fcd06l,0xe7f1d2be0392a63el,
15248         0x96dca2644ddb0c33l },
15249       0 },
15250     /* 139 */
15251     { { 0x203bb43a387510afl,0x846feaa8a9a36a01l,0xd23a57702f950378l,
15252         0x4363e2123aad59dcl },
15253       { 0xca43a1c740246a47l,0xb362b8d2e55dd24dl,0xf9b086045d8faf96l,
15254         0x840e115cd8bb98c4l },
15255       0 },
15256     /* 140 */
15257     { { 0xf12205e21023e8a7l,0xc808a8cdd8dc7a0bl,0xe292a272163a5ddfl,
15258         0x5e0d6abd30ded6d4l },
15259       { 0x07a721c27cfc0f64l,0x42eec01d0e55ed88l,0x26a7bef91d1f9db2l,
15260         0x7dea48f42945a25al },
15261       0 },
15262     /* 141 */
15263     { { 0xabdf6f1ce5060a81l,0xe79f9c72f8f95615l,0xcfd36c5406ac268bl,
15264         0xabc2a2beebfd16d1l },
15265       { 0x8ac66f91d3e2eac7l,0x6f10ba63d2dd0466l,0x6790e3770282d31bl,
15266         0x4ea353946c7eefc1l },
15267       0 },
15268     /* 142 */
15269     { { 0xed8a2f8d5266309dl,0x0a51c6c081945a3el,0xcecaf45a578c5dc1l,
15270         0x3a76e6891c94ffc3l },
15271       { 0x9aace8a47d7b0d0fl,0x963ace968f584a5fl,0x51a30c724e697fbel,
15272         0x8212a10a465e6464l },
15273       0 },
15274     /* 143 */
15275     { { 0xef7c61c3cfab8caal,0x18eb8e840e142390l,0xcd1dff677e9733cal,
15276         0xaa7cab71599cb164l },
15277       { 0x02fc9273bc837bd1l,0xc06407d0c36af5d7l,0x17621292f423da49l,
15278         0x40e38073fe0617c3l },
15279       0 },
15280     /* 144 */
15281     { { 0xf4f80824a7bf9b7cl,0x365d23203fbe30d0l,0xbfbe532097cf9ce3l,
15282         0xe3604700b3055526l },
15283       { 0x4dcb99116cc6c2c7l,0x72683708ba4cbee6l,0xdcded434637ad9ecl,
15284         0x6542d677a3dee15fl },
15285       0 },
15286     /* 145 */
15287     { { 0x3f32b6d07b6c377al,0x6cb03847903448bel,0xd6fdd3a820da8af7l,
15288         0xa6534aee09bb6f21l },
15289       { 0x30a1780d1035facfl,0x35e55a339dcb47e6l,0x6ea50fe1c447f393l,
15290         0xf3cb672fdc9aef22l },
15291       0 },
15292     /* 146 */
15293     { { 0xeb3719fe3b55fd83l,0xe0d7a46c875ddd10l,0x33ac9fa905cea784l,
15294         0x7cafaa2eaae870e7l },
15295       { 0x9b814d041d53b338l,0xe0acc0a0ef87e6c6l,0xfb93d10811672b0fl,
15296         0x0aab13c1b9bd522el },
15297       0 },
15298     /* 147 */
15299     { { 0xddcce278d2681297l,0xcb350eb1b509546al,0x2dc431737661aaf2l,
15300         0x4b91a602847012e9l },
15301       { 0xdcff109572f8ddcfl,0x08ebf61e9a911af4l,0x48f4360ac372430el,
15302         0x49534c5372321cabl },
15303       0 },
15304     /* 148 */
15305     { { 0x83df7d71f07b7e9dl,0xa478efa313cd516fl,0x78ef264b6c047ee3l,
15306         0xcaf46c4fd65ac5eel },
15307       { 0xa04d0c7792aa8266l,0xedf45466913684bbl,0x56e65168ae4b16b0l,
15308         0x14ce9e5704c6770fl },
15309       0 },
15310     /* 149 */
15311     { { 0x99445e3e965e8f91l,0xd3aca1bacb0f2492l,0xd31cc70f90c8a0a0l,
15312         0x1bb708a53e4c9a71l },
15313       { 0xd5ca9e69558bdd7al,0x734a0508018a26b1l,0xb093aa714c9cf1ecl,
15314         0xf9d126f2da300102l },
15315       0 },
15316     /* 150 */
15317     { { 0x749bca7aaff9563el,0xdd077afeb49914a0l,0xe27a0311bf5f1671l,
15318         0x807afcb9729ecc69l },
15319       { 0x7f8a9337c9b08b77l,0x86c3a785443c7e38l,0x85fafa59476fd8bal,
15320         0x751adcd16568cd8cl },
15321       0 },
15322     /* 151 */
15323     { { 0x8aea38b410715c0dl,0xd113ea718f7697f7l,0x665eab1493fbf06dl,
15324         0x29ec44682537743fl },
15325       { 0x3d94719cb50bebbcl,0x399ee5bfe4505422l,0x90cd5b3a8d2dedb1l,
15326         0xff9370e392a4077dl },
15327       0 },
15328     /* 152 */
15329     { { 0x59a2d69bc6b75b65l,0x4188f8d5266651c5l,0x28a9f33e3de9d7d2l,
15330         0x9776478ba2a9d01al },
15331       { 0x8852622d929af2c7l,0x334f5d6d4e690923l,0xce6cc7e5a89a51e9l,
15332         0x74a6313fac2f82fal },
15333       0 },
15334     /* 153 */
15335     { { 0xb2f4dfddb75f079cl,0x85b07c9518e36fbbl,0x1b6cfcf0e7cd36ddl,
15336         0xab75be150ff4863dl },
15337       { 0x81b367c0173fc9b7l,0xb90a7420d2594fd0l,0x15fdbf03c4091236l,
15338         0x4ebeac2e0b4459f6l },
15339       0 },
15340     /* 154 */
15341     { { 0xeb6c5fe75c9f2c53l,0xd25220118eae9411l,0xc8887633f95ac5d8l,
15342         0xdf99887b2c1baffcl },
15343       { 0xbb78eed2850aaecbl,0x9d49181b01d6a272l,0x978dd511b1cdbcacl,
15344         0x27b040a7779f4058l },
15345       0 },
15346     /* 155 */
15347     { { 0x90405db7f73b2eb2l,0xe0df85088e1b2118l,0x501b71525962327el,
15348         0xb393dd37e4cfa3f5l },
15349       { 0xa1230e7b3fd75165l,0xd66344c2bcd33554l,0x6c36f1be0f7b5022l,
15350         0x09588c12d0463419l },
15351       0 },
15352     /* 156 */
15353     { { 0xe086093f02601c3bl,0xfb0252f8cf5c335fl,0x955cf280894aff28l,
15354         0x81c879a9db9f648bl },
15355       { 0x040e687cc6f56c51l,0xfed471693f17618cl,0x44f88a419059353bl,
15356         0xfa0d48f55fc11bc4l },
15357       0 },
15358     /* 157 */
15359     { { 0xbc6e1c9de1608e4dl,0x010dda113582822cl,0xf6b7ddc1157ec2d7l,
15360         0x8ea0e156b6a367d6l },
15361       { 0xa354e02f2383b3b4l,0x69966b943f01f53cl,0x4ff6632b2de03ca5l,
15362         0x3f5ab924fa00b5acl },
15363       0 },
15364     /* 158 */
15365     { { 0x337bb0d959739efbl,0xc751b0f4e7ebec0dl,0x2da52dd6411a67d1l,
15366         0x8bc768872b74256el },
15367       { 0xa5be3b7282d3d253l,0xa9f679a1f58d779fl,0xa1cac168e16767bbl,
15368         0xb386f19060fcf34fl },
15369       0 },
15370     /* 159 */
15371     { { 0x31f3c1352fedcfc2l,0x5396bf6262f8af0dl,0x9a02b4eae57288c2l,
15372         0x4cb460f71b069c4dl },
15373       { 0xae67b4d35b8095eal,0x92bbf8596fc07603l,0xe1475f66b614a165l,
15374         0x52c0d50895ef5223l },
15375       0 },
15376     /* 160 */
15377     { { 0x231c210e15339848l,0xe87a28e870778c8dl,0x9d1de6616956e170l,
15378         0x4ac3c9382bb09c0bl },
15379       { 0x19be05516998987dl,0x8b2376c4ae09f4d6l,0x1de0b7651a3f933dl,
15380         0x380d94c7e39705f4l },
15381       0 },
15382     /* 161 */
15383     { { 0x01a355aa81542e75l,0x96c724a1ee01b9b7l,0x6b3a2977624d7087l,
15384         0x2ce3e171de2637afl },
15385       { 0xcfefeb49f5d5bc1al,0xa655607e2777e2b5l,0x4feaac2f9513756cl,
15386         0x2e6cd8520b624e4dl },
15387       0 },
15388     /* 162 */
15389     { { 0x3685954b8c31c31dl,0x68533d005bf21a0cl,0x0bd7626e75c79ec9l,
15390         0xca17754742c69d54l },
15391       { 0xcc6edafff6d2dbb2l,0xfd0d8cbd174a9d18l,0x875e8793aa4578e8l,
15392         0xa976a7139cab2ce6l },
15393       0 },
15394     /* 163 */
15395     { { 0x0a651f1b93fb353dl,0xd75cab8b57fcfa72l,0xaa88cfa731b15281l,
15396         0x8720a7170a1f4999l },
15397       { 0x8c3e8d37693e1b90l,0xd345dc0b16f6dfc3l,0x8ea8d00ab52a8742l,
15398         0x9719ef29c769893cl },
15399       0 },
15400     /* 164 */
15401     { { 0x820eed8d58e35909l,0x9366d8dc33ddc116l,0xd7f999d06e205026l,
15402         0xa5072976e15704c1l },
15403       { 0x002a37eac4e70b2el,0x84dcf6576890aa8al,0xcd71bf18645b2a5cl,
15404         0x99389c9df7b77725l },
15405       0 },
15406     /* 165 */
15407     { { 0x238c08f27ada7a4bl,0x3abe9d03fd389366l,0x6b672e89766f512cl,
15408         0xa88806aa202c82e4l },
15409       { 0x6602044ad380184el,0xa8cb78c4126a8b85l,0x79d670c0ad844f17l,
15410         0x0043bffb4738dcfel },
15411       0 },
15412     /* 166 */
15413     { { 0x8d59b5dc36d5192el,0xacf885d34590b2afl,0x83566d0a11601781l,
15414         0x52f3ef01ba6c4866l },
15415       { 0x3986732a0edcb64dl,0x0a482c238068379fl,0x16cbe5fa7040f309l,
15416         0x3296bd899ef27e75l },
15417       0 },
15418     /* 167 */
15419     { { 0x476aba89454d81d7l,0x9eade7ef51eb9b3cl,0x619a21cd81c57986l,
15420         0x3b90febfaee571e9l },
15421       { 0x9393023e5496f7cbl,0x55be41d87fb51bc4l,0x03f1dd4899beb5cel,
15422         0x6e88069d9f810b18l },
15423       0 },
15424     /* 168 */
15425     { { 0xce37ab11b43ea1dbl,0x0a7ff1a95259d292l,0x851b02218f84f186l,
15426         0xa7222beadefaad13l },
15427       { 0xa2ac78ec2b0a9144l,0x5a024051f2fa59c5l,0x91d1eca56147ce38l,
15428         0xbe94d523bc2ac690l },
15429       0 },
15430     /* 169 */
15431     { { 0x72f4945e0b226ce7l,0xb8afd747967e8b70l,0xedea46f185a6c63el,
15432         0x7782defe9be8c766l },
15433       { 0x760d2aa43db38626l,0x460ae78776f67ad1l,0x341b86fc54499cdbl,
15434         0x03838567a2892e4bl },
15435       0 },
15436     /* 170 */
15437     { { 0x2d8daefd79ec1a0fl,0x3bbcd6fdceb39c97l,0xf5575ffc58f61a95l,
15438         0xdbd986c4adf7b420l },
15439       { 0x81aa881415f39eb7l,0x6ee2fcf5b98d976cl,0x5465475dcf2f717dl,
15440         0x8e24d3c46860bbd0l },
15441       0 },
15442     /* 171 */
15443     { { 0x749d8e549a587390l,0x12bb194f0cbec588l,0x46e07da4b25983c6l,
15444         0x541a99c4407bafc8l },
15445       { 0xdb241692624c8842l,0x6044c12ad86c05ffl,0xc59d14b44f7fcf62l,
15446         0xc0092c49f57d35d1l },
15447       0 },
15448     /* 172 */
15449     { { 0xd3cc75c3df2e61efl,0x7e8841c82e1b35cal,0xc62d30d1909f29f4l,
15450         0x75e406347286944dl },
15451       { 0xe7d41fc5bbc237d0l,0xc9537bf0ec4f01c9l,0x91c51a16282bd534l,
15452         0x5b7cb658c7848586l },
15453       0 },
15454     /* 173 */
15455     { { 0x964a70848a28ead1l,0x802dc508fd3b47f6l,0x9ae4bfd1767e5b39l,
15456         0x7ae13eba8df097a1l },
15457       { 0xfd216ef8eadd384el,0x0361a2d9b6b2ff06l,0x204b98784bcdb5f3l,
15458         0x787d8074e2a8e3fdl },
15459       0 },
15460     /* 174 */
15461     { { 0xc5e25d6b757fbb1cl,0xe47bddb2ca201debl,0x4a55e9a36d2233ffl,
15462         0x5c2228199ef28484l },
15463       { 0x773d4a8588315250l,0x21b21a2b827097c1l,0xab7c4ea1def5d33fl,
15464         0xe45d37abbaf0f2b0l },
15465       0 },
15466     /* 175 */
15467     { { 0xd2df1e3428511c8al,0xebb229c8bdca6cd3l,0x578a71a7627c39a7l,
15468         0xed7bc12284dfb9d3l },
15469       { 0xcf22a6df93dea561l,0x5443f18dd48f0ed1l,0xd8b861405bad23e8l,
15470         0xaac97cc945ca6d27l },
15471       0 },
15472     /* 176 */
15473     { { 0xeb54ea74a16bd00al,0xd839e9adf5c0bcc1l,0x092bb7f11f9bfc06l,
15474         0x318f97b31163dc4el },
15475       { 0xecc0c5bec30d7138l,0x44e8df23abc30220l,0x2bb7972fb0223606l,
15476         0xfa41faa19a84ff4dl },
15477       0 },
15478     /* 177 */
15479     { { 0x4402d974a6642269l,0xc81814ce9bb783bdl,0x398d38e47941e60bl,
15480         0x38bb6b2c1d26e9e2l },
15481       { 0xc64e4a256a577f87l,0x8b52d253dc11fe1cl,0xff336abf62280728l,
15482         0x94dd0905ce7601a5l },
15483       0 },
15484     /* 178 */
15485     { { 0x156cf7dcde93f92al,0xa01333cb89b5f315l,0x02404df9c995e750l,
15486         0x92077867d25c2ae9l },
15487       { 0xe2471e010bf39d44l,0x5f2c902096bb53d7l,0x4c44b7b35c9c3d8fl,
15488         0x81e8428bd29beb51l },
15489       0 },
15490     /* 179 */
15491     { { 0x6dd9c2bac477199fl,0x8cb8eeee6b5ecdd9l,0x8af7db3fee40fd0el,
15492         0x1b94ab62dbbfa4b1l },
15493       { 0x44f0d8b3ce47f143l,0x51e623fc63f46163l,0xf18f270fcc599383l,
15494         0x06a38e28055590eel },
15495       0 },
15496     /* 180 */
15497     { { 0x2e5b0139b3355b49l,0x20e26560b4ebf99bl,0xc08ffa6bd269f3dcl,
15498         0xa7b36c2083d9d4f8l },
15499       { 0x64d15c3a1b3e8830l,0xd5fceae1a89f9c0bl,0xcfeee4a2e2d16930l,
15500         0xbe54c6b4a2822a20l },
15501       0 },
15502     /* 181 */
15503     { { 0xd6cdb3df8d91167cl,0x517c3f79e7a6625el,0x7105648f346ac7f4l,
15504         0xbf30a5abeae022bbl },
15505       { 0x8e7785be93828a68l,0x5161c3327f3ef036l,0xe11b5feb592146b2l,
15506         0xd1c820de2732d13al },
15507       0 },
15508     /* 182 */
15509     { { 0x043e13479038b363l,0x58c11f546b05e519l,0x4fe57abe6026cad1l,
15510         0xb7d17bed68a18da3l },
15511       { 0x44ca5891e29c2559l,0x4f7a03765bfffd84l,0x498de4af74e46948l,
15512         0x3997fd5e6412cc64l },
15513       0 },
15514     /* 183 */
15515     { { 0xf20746828bd61507l,0x29e132d534a64d2al,0xffeddfb08a8a15e3l,
15516         0x0eeb89293c6c13e8l },
15517       { 0xe9b69a3ea7e259f8l,0xce1db7e6d13e7e67l,0x277318f6ad1fa685l,
15518         0x228916f8c922b6efl },
15519       0 },
15520     /* 184 */
15521     { { 0x959ae25b0a12ab5bl,0xcc11171f957bc136l,0x8058429ed16e2b0cl,
15522         0xec05ad1d6e93097el },
15523       { 0x157ba5beac3f3708l,0x31baf93530b59d77l,0x47b55237118234e5l,
15524         0x7d3141567ff11b37l },
15525       0 },
15526     /* 185 */
15527     { { 0x7bd9c05cf6dfefabl,0xbe2f2268dcb37707l,0xe53ead973a38bb95l,
15528         0xe9ce66fc9bc1d7a3l },
15529       { 0x75aa15766f6a02a1l,0x38c087df60e600edl,0xf8947f3468cdc1b9l,
15530         0xd9650b0172280651l },
15531       0 },
15532     /* 186 */
15533     { { 0x504b4c4a5a057e60l,0xcbccc3be8def25e4l,0xa635320817c1ccbdl,
15534         0x14d6699a804eb7a2l },
15535       { 0x2c8a8415db1f411al,0x09fbaf0bf80d769cl,0xb4deef901c2f77adl,
15536         0x6f4c68410d43598al },
15537       0 },
15538     /* 187 */
15539     { { 0x8726df4e96c24a96l,0x534dbc85fcbd99a3l,0x3c466ef28b2ae30al,
15540         0x4c4350fd61189abbl },
15541       { 0x2967f716f855b8dal,0x41a42394463c38a1l,0xc37e1413eae93343l,
15542         0xa726d2425a3118b5l },
15543       0 },
15544     /* 188 */
15545     { { 0xdae6b3ee948c1086l,0xf1de503dcbd3a2e1l,0x3f35ed3f03d022f3l,
15546         0x13639e82cc6cf392l },
15547       { 0x9ac938fbcdafaa86l,0xf45bc5fb2654a258l,0x1963b26e45051329l,
15548         0xca9365e1c1a335a3l },
15549       0 },
15550     /* 189 */
15551     { { 0x3615ac754c3b2d20l,0x742a5417904e241bl,0xb08521c4cc9d071dl,
15552         0x9ce29c34970b72a5l },
15553       { 0x8cc81f736d3e0ad6l,0x8060da9ef2f8434cl,0x35ed1d1a6ce862d9l,
15554         0x48c4abd7ab42af98l },
15555       0 },
15556     /* 190 */
15557     { { 0xd221b0cc40c7485al,0xead455bbe5274dbfl,0x493c76989263d2e8l,
15558         0x78017c32f67b33cbl },
15559       { 0xb9d35769930cb5eel,0xc0d14e940c408ed2l,0xf8b7bf55272f1a4dl,
15560         0x53cd0454de5c1c04l },
15561       0 },
15562     /* 191 */
15563     { { 0xbcd585fa5d28ccacl,0x5f823e56005b746el,0x7c79f0a1cd0123aal,
15564         0xeea465c1d3d7fa8fl },
15565       { 0x7810659f0551803bl,0x6c0b599f7ce6af70l,0x4195a77029288e70l,
15566         0x1b6e42a47ae69193l },
15567       0 },
15568     /* 192 */
15569     { { 0x2e80937cf67d04c3l,0x1e312be289eeb811l,0x56b5d88792594d60l,
15570         0x0224da14187fbd3dl },
15571       { 0x87abb8630c5fe36fl,0x580f3c604ef51f5fl,0x964fb1bfb3b429ecl,
15572         0x60838ef042bfff33l },
15573       0 },
15574     /* 193 */
15575     { { 0x432cb2f27e0bbe99l,0x7bda44f304aa39eel,0x5f497c7a9fa93903l,
15576         0x636eb2022d331643l },
15577       { 0xfcfd0e6193ae00aal,0x875a00fe31ae6d2fl,0xf43658a29f93901cl,
15578         0x8844eeb639218bacl },
15579       0 },
15580     /* 194 */
15581     { { 0x114171d26b3bae58l,0x7db3df7117e39f3el,0xcd37bc7f81a8eadal,
15582         0x27ba83dc51fb789el },
15583       { 0xa7df439ffbf54de5l,0x7277030bb5fe1a71l,0x42ee8e35db297a48l,
15584         0xadb62d3487f3a4abl },
15585       0 },
15586     /* 195 */
15587     { { 0x9b1168a2a175df2al,0x082aa04f618c32e9l,0xc9e4f2e7146b0916l,
15588         0xb990fd7675e7c8b2l },
15589       { 0x0829d96b4df37313l,0x1c205579d0b40789l,0x66c9ae4a78087711l,
15590         0x81707ef94d10d18dl },
15591       0 },
15592     /* 196 */
15593     { { 0x97d7cab203d6ff96l,0x5b851bfc0d843360l,0x268823c4d042db4bl,
15594         0x3792daead5a8aa5cl },
15595       { 0x52818865941afa0bl,0xf3e9e74142d83671l,0x17c825275be4e0a7l,
15596         0x5abd635e94b001bal },
15597       0 },
15598     /* 197 */
15599     { { 0x727fa84e0ac4927cl,0xe3886035a7c8cf23l,0xa4bcd5ea4adca0dfl,
15600         0x5995bf21846ab610l },
15601       { 0xe90f860b829dfa33l,0xcaafe2ae958fc18bl,0x9b3baf4478630366l,
15602         0x44c32ca2d483411el },
15603       0 },
15604     /* 198 */
15605     { { 0xa74a97f1e40ed80cl,0x5f938cb131d2ca82l,0x53f2124b7c2d6ad9l,
15606         0x1f2162fb8082a54cl },
15607       { 0x7e467cc5720b173el,0x40e8a666085f12f9l,0x8cebc20e4c9d65dcl,
15608         0x8f1d402bc3e907c9l },
15609       0 },
15610     /* 199 */
15611     { { 0x4f592f9cfbc4058al,0xb15e14b6292f5670l,0xc55cfe37bc1d8c57l,
15612         0xb1980f43926edbf9l },
15613       { 0x98c33e0932c76b09l,0x1df5279d33b07f78l,0x6f08ead4863bb461l,
15614         0x2828ad9b37448e45l },
15615       0 },
15616     /* 200 */
15617     { { 0x696722c4c4cf4ac5l,0xf5ac1a3fdde64afbl,0x0551baa2e0890832l,
15618         0x4973f1275a14b390l },
15619       { 0xe59d8335322eac5dl,0x5e07eef50bd9b568l,0xab36720fa2588393l,
15620         0x6dac8ed0db168ac7l },
15621       0 },
15622     /* 201 */
15623     { { 0xf7b545aeeda835efl,0x4aa113d21d10ed51l,0x035a65e013741b09l,
15624         0x4b23ef5920b9de4cl },
15625       { 0xe82bb6803c4c7341l,0xd457706d3f58bc37l,0x73527863a51e3ee8l,
15626         0x4dd71534ddf49a4el },
15627       0 },
15628     /* 202 */
15629     { { 0xbf94467295476cd9l,0x648d072fe31a725bl,0x1441c8b8fc4b67e0l,
15630         0xfd3170002f4a4dbbl },
15631       { 0x1cb43ff48995d0e1l,0x76e695d10ef729aal,0xe0d5f97641798982l,
15632         0x14fac58c9569f365l },
15633       0 },
15634     /* 203 */
15635     { { 0xad9a0065f312ae18l,0x51958dc0fcc93fc9l,0xd9a142408a7d2846l,
15636         0xed7c765136abda50l },
15637       { 0x46270f1a25d4abbcl,0x9b5dd8f3f1a113eal,0xc609b0755b51952fl,
15638         0xfefcb7f74d2e9f53l },
15639       0 },
15640     /* 204 */
15641     { { 0xbd09497aba119185l,0xd54e8c30aac45ba4l,0x492479deaa521179l,
15642         0x1801a57e87e0d80bl },
15643       { 0x073d3f8dfcafffb0l,0x6cf33c0bae255240l,0x781d763b5b5fdfbcl,
15644         0x9f8fc11e1ead1064l },
15645       0 },
15646     /* 205 */
15647     { { 0x1583a1715e69544cl,0x0eaf8567f04b7813l,0x1e22a8fd278a4c32l,
15648         0xa9d3809d3d3a69a9l },
15649       { 0x936c2c2c59a2da3bl,0x38ccbcf61895c847l,0x5e65244e63d50869l,
15650         0x3006b9aee1178ef7l },
15651       0 },
15652     /* 206 */
15653     { { 0x0bb1f2b0c9eead28l,0x7eef635d89f4dfbcl,0x074757fdb2ce8939l,
15654         0x0ab85fd745f8f761l },
15655       { 0xecda7c933e5b4549l,0x4be2bb5c97922f21l,0x261a1274b43b8040l,
15656         0xb122d67511e942c2l },
15657       0 },
15658     /* 207 */
15659     { { 0x3be607be66a5ae7al,0x01e703fa76adcbe3l,0xaf9043014eb6e5c5l,
15660         0x9f599dc1097dbaecl },
15661       { 0x6d75b7180ff250edl,0x8eb91574349a20dcl,0x425605a410b227a3l,
15662         0x7d5528e08a294b78l },
15663       0 },
15664     /* 208 */
15665     { { 0xf0f58f6620c26defl,0x025585ea582b2d1el,0xfbe7d79b01ce3881l,
15666         0x28ccea01303f1730l },
15667       { 0xd1dabcd179644ba5l,0x1fc643e806fff0b8l,0xa60a76fc66b3e17bl,
15668         0xc18baf48a1d013bfl },
15669       0 },
15670     /* 209 */
15671     { { 0x34e638c85dc4216dl,0x00c01067206142acl,0xd453a17195f5064al,
15672         0x9def809db7a9596bl },
15673       { 0x41e8642e67ab8d2cl,0xb42404336237a2b6l,0x7d506a6d64c4218bl,
15674         0x0357f8b068808ce5l },
15675       0 },
15676     /* 210 */
15677     { { 0x8e9dbe644cd2cc88l,0xcc61c28df0b8f39dl,0x4a309874cd30a0c8l,
15678         0xe4a01add1b489887l },
15679       { 0x2ed1eeacf57cd8f9l,0x1b767d3ebd594c48l,0xa7295c717bd2f787l,
15680         0x466d7d79ce10cc30l },
15681       0 },
15682     /* 211 */
15683     { { 0x47d318929dada2c7l,0x4fa0a6c38f9aa27dl,0x90e4fd28820a59e1l,
15684         0xc672a522451ead1al },
15685       { 0x30607cc85d86b655l,0xf0235d3bf9ad4af1l,0x99a08680571172a6l,
15686         0x5e3d64faf2a67513l },
15687       0 },
15688     /* 212 */
15689     { { 0xaa6410c79b3b4416l,0xcd8fcf85eab26d99l,0x5ebff74adb656a74l,
15690         0x6c8a7a95eb8e42fcl },
15691       { 0x10c60ba7b02a63bdl,0x6b2f23038b8f0047l,0x8c6c3738312d90b0l,
15692         0x348ae422ad82ca91l },
15693       0 },
15694     /* 213 */
15695     { { 0x7f4746635ccda2fbl,0x22accaa18e0726d2l,0x85adf782492b1f20l,
15696         0xc1074de0d9ef2d2el },
15697       { 0xfcf3ce44ae9a65b3l,0xfd71e4ac05d7151bl,0xd4711f50ce6a9788l,
15698         0xfbadfbdbc9e54ffcl },
15699       0 },
15700     /* 214 */
15701     { { 0x1713f1cd20a99363l,0xb915658f6cf22775l,0x968175cd24d359b2l,
15702         0xb7f976b483716fcdl },
15703       { 0x5758e24d5d6dbf74l,0x8d23bafd71c3af36l,0x48f477600243dfe3l,
15704         0xf4d41b2ecafcc805l },
15705       0 },
15706     /* 215 */
15707     { { 0x51f1cf28fdabd48dl,0xce81be3632c078a4l,0x6ace2974117146e9l,
15708         0x180824eae0160f10l },
15709       { 0x0387698b66e58358l,0x63568752ce6ca358l,0x82380e345e41e6c5l,
15710         0x67e5f63983cf6d25l },
15711       0 },
15712     /* 216 */
15713     { { 0xf89ccb8dcf4899efl,0x949015f09ebb44c0l,0x546f9276b2598ec9l,
15714         0x9fef789a04c11fc6l },
15715       { 0x6d367ecf53d2a071l,0xb10e1a7fa4519b09l,0xca6b3fb0611e2eefl,
15716         0xbc80c181a99c4e20l },
15717       0 },
15718     /* 217 */
15719     { { 0x972536f8e5eb82e6l,0x1a484fc7f56cb920l,0xc78e217150b5da5el,
15720         0x49270e629f8cdf10l },
15721       { 0x1a39b7bbea6b50adl,0x9a0284c1a2388ffcl,0x5403eb178107197bl,
15722         0xd2ee52f961372f7fl },
15723       0 },
15724     /* 218 */
15725     { { 0xd37cd28588e0362al,0x442fa8a78fa5d94dl,0xaff836e5a434a526l,
15726         0xdfb478bee5abb733l },
15727       { 0xa91f1ce7673eede6l,0xa5390ad42b5b2f04l,0x5e66f7bf5530da2fl,
15728         0xd9a140b408df473al },
15729       0 },
15730     /* 219 */
15731     { { 0x0e0221b56e8ea498l,0x623478293563ee09l,0xe06b8391335d2adel,
15732         0x760c058d623f4b1al },
15733       { 0x0b89b58cc198aa79l,0xf74890d2f07aba7fl,0x4e204110fde2556al,
15734         0x7141982d8f190409l },
15735       0 },
15736     /* 220 */
15737     { { 0x6f0a0e334d4b0f45l,0xd9280b38392a94e1l,0x3af324c6b3c61d5el,
15738         0x3af9d1ce89d54e47l },
15739       { 0xfd8f798120930371l,0xeda2664c21c17097l,0x0e9545dcdc42309bl,
15740         0xb1f815c373957dd6l },
15741       0 },
15742     /* 221 */
15743     { { 0x84faa78e89fec44al,0xc8c2ae473caa4cafl,0x691c807dc1b6a624l,
15744         0xa41aed141543f052l },
15745       { 0x424353997d5ffe04l,0x8bacb2df625b6e20l,0x85d660be87817775l,
15746         0xd6e9c1dd86fb60efl },
15747       0 },
15748     /* 222 */
15749     { { 0x3aa2e97ec6853264l,0x771533b7e2304a0bl,0x1b912bb7b8eae9bel,
15750         0x9c9c6e10ae9bf8c2l },
15751       { 0xa2309a59e030b74cl,0x4ed7494d6a631e90l,0x89f44b23a49b79f2l,
15752         0x566bd59640fa61b6l },
15753       0 },
15754     /* 223 */
15755     { { 0x066c0118c18061f3l,0x190b25d37c83fc70l,0xf05fc8e027273245l,
15756         0xcf2c7390f525345el },
15757       { 0xa09bceb410eb30cfl,0xcfd2ebba0d77703al,0xe842c43a150ff255l,
15758         0x02f517558aa20979l },
15759       0 },
15760     /* 224 */
15761     { { 0x396ef794addb7d07l,0x0b4fc74224455500l,0xfaff8eacc78aa3cel,
15762         0x14e9ada5e8d4d97dl },
15763       { 0xdaa480a12f7079e2l,0x45baa3cde4b0800el,0x01765e2d7838157dl,
15764         0xa0ad4fab8e9d9ae8l },
15765       0 },
15766     /* 225 */
15767     { { 0x0bfb76214a653618l,0x1872813c31eaaa5fl,0x1553e73744949d5el,
15768         0xbcd530b86e56ed1el },
15769       { 0x169be85332e9c47bl,0xdc2776feb50059abl,0xcdba9761192bfbb4l,
15770         0x909283cf6979341dl },
15771       0 },
15772     /* 226 */
15773     { { 0x67b0032476e81a13l,0x9bee1a9962171239l,0x08ed361bd32e19d6l,
15774         0x35eeb7c9ace1549al },
15775       { 0x1280ae5a7e4e5bdcl,0x2dcd2cd3b6ceec6el,0x52e4224c6e266bc1l,
15776         0x9a8b2cf4448ae864l },
15777       0 },
15778     /* 227 */
15779     { { 0xf6471bf209d03b59l,0xc90e62a3b65af2abl,0xff7ff168ebd5eec9l,
15780         0x6bdb60f4d4491379l },
15781       { 0xdadafebc8a55bc30l,0xc79ead1610097fe0l,0x42e197414c1e3bddl,
15782         0x01ec3cfd94ba08a9l },
15783       0 },
15784     /* 228 */
15785     { { 0xba6277ebdc9485c2l,0x48cc9a7922fb10c7l,0x4f61d60f70a28d8al,
15786         0xd1acb1c0475464f6l },
15787       { 0xd26902b126f36612l,0x59c3a44ee0618d8bl,0x4df8a813308357eel,
15788         0x7dcd079d405626c2l },
15789       0 },
15790     /* 229 */
15791     { { 0x5ce7d4d3f05a4b48l,0xadcd295237230772l,0xd18f7971812a915al,
15792         0x0bf53589377d19b8l },
15793       { 0x35ecd95a6c68ea73l,0xc7f3bbca823a584dl,0x9fb674c6f473a723l,
15794         0xd28be4d9e16686fcl },
15795       0 },
15796     /* 230 */
15797     { { 0x5d2b990638fa8e4bl,0x559f186e893fd8fcl,0x3a6de2aa436fb6fcl,
15798         0xd76007aa510f88cel },
15799       { 0x2d10aab6523a4988l,0xb455cf4474dd0273l,0x7f467082a3407278l,
15800         0xf2b52f68b303bb01l },
15801       0 },
15802     /* 231 */
15803     { { 0x0d57eafa9835b4cal,0x2d2232fcbb669cbcl,0x8eeeb680c6643198l,
15804         0xd8dbe98ecc5aed3al },
15805       { 0xcba9be3fc5a02709l,0x30be68e5f5ba1fa8l,0xfebd43cdf10ea852l,
15806         0xe01593a3ee559705l },
15807       0 },
15808     /* 232 */
15809     { { 0xd3e5af50ea75a0a6l,0x512226ac57858033l,0x6fe6d50fd0176406l,
15810         0xafec07b1aeb8ef06l },
15811       { 0x7fb9956780bb0a31l,0x6f1af3cc37309aael,0x9153a15a01abf389l,
15812         0xa71b93546e2dbfddl },
15813       0 },
15814     /* 233 */
15815     { { 0xbf8e12e018f593d2l,0xd1a90428a078122bl,0x150505db0ba4f2adl,
15816         0x53a2005c628523d9l },
15817       { 0x07c8b639e7f2b935l,0x2bff975ac182961al,0x86bceea77518ca2cl,
15818         0xbf47d19b3d588e3dl },
15819       0 },
15820     /* 234 */
15821     { { 0x672967a7dd7665d5l,0x4e3030572f2f4de5l,0x144005ae80d4903fl,
15822         0x001c2c7f39c9a1b6l },
15823       { 0x143a801469efc6d6l,0xc810bdaa7bc7a724l,0x5f65670ba78150a4l,
15824         0xfdadf8e786ffb99bl },
15825       0 },
15826     /* 235 */
15827     { { 0xfd38cb88ffc00785l,0x77fa75913b48eb67l,0x0454d055bf368fbcl,
15828         0x3a838e4d5aa43c94l },
15829       { 0x561663293e97bb9al,0x9eb93363441d94d9l,0x515591a60adb2a83l,
15830         0x3cdb8257873e1da3l },
15831       0 },
15832     /* 236 */
15833     { { 0x137140a97de77eabl,0xf7e1c50d41648109l,0x762dcad2ceb1d0dfl,
15834         0x5a60cc89f1f57fbal },
15835       { 0x80b3638240d45673l,0x1b82be195913c655l,0x057284b8dd64b741l,
15836         0x922ff56fdbfd8fc0l },
15837       0 },
15838     /* 237 */
15839     { { 0x1b265deec9a129a1l,0xa5b1ce57cc284e04l,0x04380c46cebfbe3cl,
15840         0x72919a7df6c5cd62l },
15841       { 0x298f453a8fb90f9al,0xd719c00b88e4031bl,0xe32c0e77796f1856l,
15842         0x5e7917803624089al },
15843       0 },
15844     /* 238 */
15845     { { 0x5c16ec557f63cdfbl,0x8e6a3571f1cae4fdl,0xfce26bea560597cal,
15846         0x4e0a5371e24c2fabl },
15847       { 0x276a40d3a5765357l,0x3c89af440d73a2b4l,0xb8f370ae41d11a32l,
15848         0xf5ff7818d56604eel },
15849       0 },
15850     /* 239 */
15851     { { 0xfbf3e3fe1a09df21l,0x26d5d28ee66e8e47l,0x2096bd0a29c89015l,
15852         0xe41df0e9533f5e64l },
15853       { 0x305fda40b3ba9e3fl,0xf2340ceb2604d895l,0x0866e1927f0367c7l,
15854         0x8edd7d6eac4f155fl },
15855       0 },
15856     /* 240 */
15857     { { 0xc9a1dc0e0bfc8ff3l,0x14efd82be936f42fl,0x67016f7ccca381efl,
15858         0x1432c1caed8aee96l },
15859       { 0xec68482970b23c26l,0xa64fe8730735b273l,0xe389f6e5eaef0f5al,
15860         0xcaef480b5ac8d2c6l },
15861       0 },
15862     /* 241 */
15863     { { 0x5245c97875315922l,0xd82951713063cca5l,0xf3ce60d0b64ef2cbl,
15864         0xd0ba177e8efae236l },
15865       { 0x53a9ae8fb1b3af60l,0x1a796ae53d2da20el,0x01d63605df9eef28l,
15866         0xf31c957c1c54ae16l },
15867       0 },
15868     /* 242 */
15869     { { 0xc0f58d5249cc4597l,0xdc5015b0bae0a028l,0xefc5fc55734a814al,
15870         0x013404cb96e17c3al },
15871       { 0xb29e2585c9a824bfl,0xd593185e001eaed7l,0x8d6ee68261ef68acl,
15872         0x6f377c4b91933e6cl },
15873       0 },
15874     /* 243 */
15875     { { 0x9f93bad1a8333fd2l,0xa89302025a2a95b8l,0x211e5037eaf75acel,
15876         0x6dba3e4ed2d09506l },
15877       { 0xa48ef98cd04399cdl,0x1811c66ee6b73adel,0x72f60752c17ecaf3l,
15878         0xf13cf3423becf4a7l },
15879       0 },
15880     /* 244 */
15881     { { 0xceeb9ec0a919e2ebl,0x83a9a195f62c0f68l,0xcfba3bb67aba2299l,
15882         0xc83fa9a9274bbad3l },
15883       { 0x0d7d1b0b62fa1ce0l,0xe58b60f53418efbfl,0xbfa8ef9e52706f04l,
15884         0xb49d70f45d702683l },
15885       0 },
15886     /* 245 */
15887     { { 0x914c7510fad5513bl,0x05f32eecb1751e2dl,0x6d850418d9fb9d59l,
15888         0x59cfadbb0c30f1cfl },
15889       { 0xe167ac2355cb7fd6l,0x249367b8820426a3l,0xeaeec58c90a78864l,
15890         0x5babf362354a4b67l },
15891       0 },
15892     /* 246 */
15893     { { 0x37c981d1ee424865l,0x8b002878f2e5577fl,0x702970f1b9e0c058l,
15894         0x6188c6a79026c8f0l },
15895       { 0x06f9a19bd0f244dal,0x1ecced5cfb080873l,0x35470f9b9f213637l,
15896         0x993fe475df50b9d9l },
15897       0 },
15898     /* 247 */
15899     { { 0x68e31cdf9b2c3609l,0x84eb19c02c46d4eal,0x7ac9ec1a9a775101l,
15900         0x81f764664c80616bl },
15901       { 0x1d7c2a5a75fbe978l,0x6743fed3f183b356l,0x838d1f04501dd2bfl,
15902         0x564a812a5fe9060dl },
15903       0 },
15904     /* 248 */
15905     { { 0x7a5a64f4fa817d1dl,0x55f96844bea82e0fl,0xb5ff5a0fcd57f9aal,
15906         0x226bf3cf00e51d6cl },
15907       { 0xd6d1a9f92f2833cfl,0x20a0a35a4f4f89a8l,0x11536c498f3f7f77l,
15908         0x68779f47ff257836l },
15909       0 },
15910     /* 249 */
15911     { { 0x79b0c1c173043d08l,0xa54467741fc020fal,0xd3767e289a6d26d0l,
15912         0x97bcb0d1eb092e0bl },
15913       { 0x2ab6eaa8f32ed3c3l,0xc8a4f151b281bc48l,0x4d1bf4f3bfa178f3l,
15914         0xa872ffe80a784655l },
15915       0 },
15916     /* 250 */
15917     { { 0xb1ab7935a32b2086l,0xe1eb710e8160f486l,0x9bd0cd913b6ae6bel,
15918         0x02812bfcb732a36al },
15919       { 0xa63fd7cacf605318l,0x646e5d50fdfd6d1dl,0xa1d683982102d619l,
15920         0x07391cc9fe5396afl },
15921       0 },
15922     /* 251 */
15923     { { 0xc50157f08b80d02bl,0x6b8333d162877f7fl,0x7aca1af878d542ael,
15924         0x355d2adc7e6d2a08l },
15925       { 0xb41f335a287386e1l,0xfd272a94f8e43275l,0x286ca2cde79989eal,
15926         0x3dc2b1e37c2a3a79l },
15927       0 },
15928     /* 252 */
15929     { { 0xd689d21c04581352l,0x0a00c825376782bel,0x203bd5909fed701fl,
15930         0xc47869103ccd846bl },
15931       { 0x5dba770824c768edl,0x72feea026841f657l,0x73313ed56accce0el,
15932         0xccc42968d5bb4d32l },
15933       0 },
15934     /* 253 */
15935     { { 0x94e50de13d7620b9l,0xd89a5c8a5992a56al,0xdc007640675487c9l,
15936         0xe147eb42aa4871cfl },
15937       { 0x274ab4eeacf3ae46l,0xfd4936fb50350fbel,0xdf2afe4748c840eal,
15938         0x239ac047080e96e3l },
15939       0 },
15940     /* 254 */
15941     { { 0x481d1f352bfee8d4l,0xce80b5cffa7b0fecl,0x105c4c9e2ce9af3cl,
15942         0xc55fa1a3f5f7e59dl },
15943       { 0x3186f14e8257c227l,0xc5b1653f342be00bl,0x09afc998aa904fb2l,
15944         0x094cd99cd4f4b699l },
15945       0 },
15946     /* 255 */
15947     { { 0x8a981c84d703bebal,0x8631d15032ceb291l,0xa445f2c9e3bd49ecl,
15948         0xb90a30b642abad33l },
15949       { 0xb465404fb4a5abf9l,0x004750c375db7603l,0x6f9a42ccca35d89fl,
15950         0x019f8b9a1b7924f7l },
15951       0 },
15952 };
15953 
15954 /* Multiply the base point of P256 by the scalar and return the result.
15955  * If map is true then convert result to affine co-ordinates.
15956  *
15957  * r     Resulting point.
15958  * k     Scalar to multiply by.
15959  * map   Indicates whether to convert result to affine.
15960  * heap  Heap to use for allocation.
15961  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
15962  */
15963 static int sp_256_ecc_mulmod_base_4(sp_point* r, sp_digit* k,
15964         int map, void* heap)
15965 {
15966     return sp_256_ecc_mulmod_stripe_4(r, &p256_base, p256_table,
15967                                       k, map, heap);
15968 }
15969 
15970 #else
15971 /* A table entry for pre-computed points. */
15972 typedef struct sp_table_entry_sum {
15973     sp_digit x[4];
15974     sp_digit y[4];
15975     byte infinity;
15976 } sp_table_entry_sum;
15977 
15978 /* Table of pre-computed values for P256 with 3 multiples and width of 8 bits.
15979  */
15980 static sp_table_entry_sum p256_table[33][58] = {
15981     {
15982         /* 0 << 0 */
15983         { { 0x00, 0x00, 0x00, 0x00 },
15984           { 0x00, 0x00, 0x00, 0x00 },
15985           1 },
15986         /* 1 << 0 */
15987         { { 0x79e730d418a9143cl,0x75ba95fc5fedb601l,0x79fb732b77622510l,
15988             0x18905f76a53755c6l },
15989           { 0xddf25357ce95560al,0x8b4ab8e4ba19e45cl,0xd2e88688dd21f325l,
15990             0x8571ff1825885d85l },
15991           0 },
15992         /* 3 << 0 */
15993         { { 0xffac3f904eebc127l,0xb027f84a087d81fbl,0x66ad77dd87cbbc98l,
15994             0x26936a3fb6ff747el },
15995           { 0xb04c5c1fc983a7ebl,0x583e47ad0861fe1al,0x788208311a2ee98el,
15996             0xd5f06a29e587cc07l },
15997           0 },
15998         /* 4 << 0 */
15999         { { 0x74b0b50d46918dccl,0x4650a6edc623c173l,0x0cdaacace8100af2l,
16000             0x577362f541b0176bl },
16001           { 0x2d96f24ce4cbaba6l,0x17628471fad6f447l,0x6b6c36dee5ddd22el,
16002             0x84b14c394c5ab863l },
16003           0 },
16004         /* 5 << 0 */
16005         { { 0xbe1b8aaec45c61f5l,0x90ec649a94b9537dl,0x941cb5aad076c20cl,
16006             0xc9079605890523c8l },
16007           { 0xeb309b4ae7ba4f10l,0x73c568efe5eb882bl,0x3540a9877e7a1f68l,
16008             0x73a076bb2dd1e916l },
16009           0 },
16010         /* 7 << 0 */
16011         { { 0x0746354ea0173b4fl,0x2bd20213d23c00f7l,0xf43eaab50c23bb08l,
16012             0x13ba5119c3123e03l },
16013           { 0x2847d0303f5b9d4dl,0x6742f2f25da67bddl,0xef933bdc77c94195l,
16014             0xeaedd9156e240867l },
16015           0 },
16016         /* 9 << 0 */
16017         { { 0x75c96e8f264e20e8l,0xabe6bfed59a7a841l,0x2cc09c0444c8eb00l,
16018             0xe05b3080f0c4e16bl },
16019           { 0x1eb7777aa45f3314l,0x56af7bedce5d45e3l,0x2b6e019a88b12f1al,
16020             0x086659cdfd835f9bl },
16021           0 },
16022         /* 10 << 0 */
16023         { { 0x2c18dbd19dc21ec8l,0x98f9868a0fcf8139l,0x737d2cd648250b49l,
16024             0xcc61c94724b3428fl },
16025           { 0x0c2b407880dd9e76l,0xc43a8991383fbe08l,0x5f7d2d65779be5d2l,
16026             0x78719a54eb3b4ab5l },
16027           0 },
16028         /* 11 << 0 */
16029         { { 0xea7d260a6245e404l,0x9de407956e7fdfe0l,0x1ff3a4158dac1ab5l,
16030             0x3e7090f1649c9073l },
16031           { 0x1a7685612b944e88l,0x250f939ee57f61c8l,0x0c0daa891ead643dl,
16032             0x68930023e125b88el },
16033           0 },
16034         /* 13 << 0 */
16035         { { 0xccc425634b2ed709l,0x0e356769856fd30dl,0xbcbcd43f559e9811l,
16036             0x738477ac5395b759l },
16037           { 0x35752b90c00ee17fl,0x68748390742ed2e3l,0x7cd06422bd1f5bc1l,
16038             0xfbc08769c9e7b797l },
16039           0 },
16040         /* 15 << 0 */
16041         { { 0x72bcd8b7bc60055bl,0x03cc23ee56e27e4bl,0xee337424e4819370l,
16042             0xe2aa0e430ad3da09l },
16043           { 0x40b8524f6383c45dl,0xd766355442a41b25l,0x64efa6de778a4797l,
16044             0x2042170a7079adf4l },
16045           0 },
16046         /* 16 << 0 */
16047         { { 0x808b0b650bc6fb80l,0x5882e0753ffe2e6bl,0xd5ef2f7c2c83f549l,
16048             0x54d63c809103b723l },
16049           { 0xf2f11bd652a23f9bl,0x3670c3194b0b6587l,0x55c4623bb1580e9el,
16050             0x64edf7b201efe220l },
16051           0 },
16052         /* 17 << 0 */
16053         { { 0x97091dcbd53c5c9dl,0xf17624b6ac0a177bl,0xb0f139752cfe2dffl,
16054             0xc1a35c0a6c7a574el },
16055           { 0x227d314693e79987l,0x0575bf30e89cb80el,0x2f4e247f0d1883bbl,
16056             0xebd512263274c3d0l },
16057           0 },
16058         /* 19 << 0 */
16059         { { 0xfea912baa5659ae8l,0x68363aba25e1a16el,0xb8842277752c41acl,
16060             0xfe545c282897c3fcl },
16061           { 0x2d36e9e7dc4c696bl,0x5806244afba977c5l,0x85665e9be39508c1l,
16062             0xf720ee256d12597bl },
16063           0 },
16064         /* 21 << 0 */
16065         { { 0x562e4cecc135b208l,0x74e1b2654783f47dl,0x6d2a506c5a3f3b30l,
16066             0xecead9f4c16762fcl },
16067           { 0xf29dd4b2e286e5b9l,0x1b0fadc083bb3c61l,0x7a75023e7fac29a4l,
16068             0xc086d5f1c9477fa3l },
16069           0 },
16070         /* 23 << 0 */
16071         { { 0xf4f876532de45068l,0x37c7a7e89e2e1f6el,0xd0825fa2a3584069l,
16072             0xaf2cea7c1727bf42l },
16073           { 0x0360a4fb9e4785a9l,0xe5fda49c27299f4al,0x48068e1371ac2f71l,
16074             0x83d0687b9077666fl },
16075           0 },
16076         /* 25 << 0 */
16077         { { 0xa4a319acd837879fl,0x6fc1b49eed6b67b0l,0xe395993332f1f3afl,
16078             0x966742eb65432a2el },
16079           { 0x4b8dc9feb4966228l,0x96cc631243f43950l,0x12068859c9b731eel,
16080             0x7b948dc356f79968l },
16081           0 },
16082         /* 27 << 0 */
16083         { { 0x042c2af497e2feb4l,0xd36a42d7aebf7313l,0x49d2c9eb084ffdd7l,
16084             0x9f8aa54b2ef7c76al },
16085           { 0x9200b7ba09895e70l,0x3bd0c66fddb7fb58l,0x2d97d10878eb4cbbl,
16086             0x2d431068d84bde31l },
16087           0 },
16088         /* 28 << 0 */
16089         { { 0x4b523eb7172ccd1fl,0x7323cb2830a6a892l,0x97082ec0cfe153ebl,
16090             0xe97f6b6af2aadb97l },
16091           { 0x1d3d393ed1a83da1l,0xa6a7f9c7804b2a68l,0x4a688b482d0cb71el,
16092             0xa9b4cc5f40585278l },
16093           0 },
16094         /* 29 << 0 */
16095         { { 0x5e5db46acb66e132l,0xf1be963a0d925880l,0x944a70270317b9e2l,
16096             0xe266f95948603d48l },
16097           { 0x98db66735c208899l,0x90472447a2fb18a3l,0x8a966939777c619fl,
16098             0x3798142a2a3be21bl },
16099           0 },
16100         /* 31 << 0 */
16101         { { 0xe2f73c696755ff89l,0xdd3cf7e7473017e6l,0x8ef5689d3cf7600dl,
16102             0x948dc4f8b1fc87b4l },
16103           { 0xd9e9fe814ea53299l,0x2d921ca298eb6028l,0xfaecedfd0c9803fcl,
16104             0xf38ae8914d7b4745l },
16105           0 },
16106         /* 33 << 0 */
16107         { { 0x871514560f664534l,0x85ceae7c4b68f103l,0xac09c4ae65578ab9l,
16108             0x33ec6868f044b10cl },
16109           { 0x6ac4832b3a8ec1f1l,0x5509d1285847d5efl,0xf909604f763f1574l,
16110             0xb16c4303c32f63c4l },
16111           0 },
16112         /* 34 << 0 */
16113         { { 0xb6ab20147ca23cd3l,0xcaa7a5c6a391849dl,0x5b0673a375678d94l,
16114             0xc982ddd4dd303e64l },
16115           { 0xfd7b000b5db6f971l,0xbba2cb1f6f876f92l,0xc77332a33c569426l,
16116             0xa159100c570d74f8l },
16117           0 },
16118         /* 35 << 0 */
16119         { { 0xfd16847fdec67ef5l,0x742ee464233e76b7l,0x0b8e4134efc2b4c8l,
16120             0xca640b8642a3e521l },
16121           { 0x653a01908ceb6aa9l,0x313c300c547852d5l,0x24e4ab126b237af7l,
16122             0x2ba901628bb47af8l },
16123           0 },
16124         /* 36 << 0 */
16125         { { 0x3d5e58d6a8219bb7l,0xc691d0bd1b06c57fl,0x0ae4cb10d257576el,
16126             0x3569656cd54a3dc3l },
16127           { 0xe5ebaebd94cda03al,0x934e82d3162bfe13l,0x450ac0bae251a0c6l,
16128             0x480b9e11dd6da526l },
16129           0 },
16130         /* 37 << 0 */
16131         { { 0x00467bc58cce08b5l,0xb636458c7f178d55l,0xc5748baea677d806l,
16132             0x2763a387dfa394ebl },
16133           { 0xa12b448a7d3cebb6l,0xe7adda3e6f20d850l,0xf63ebce51558462cl,
16134             0x58b36143620088a8l },
16135           0 },
16136         /* 39 << 0 */
16137         { { 0xa9d89488a059c142l,0x6f5ae714ff0b9346l,0x068f237d16fb3664l,
16138             0x5853e4c4363186acl },
16139           { 0xe2d87d2363c52f98l,0x2ec4a76681828876l,0x47b864fae14e7b1cl,
16140             0x0c0bc0e569192408l },
16141           0 },
16142         /* 40 << 0 */
16143         { { 0xe4d7681db82e9f3el,0x83200f0bdf25e13cl,0x8909984c66f27280l,
16144             0x462d7b0075f73227l },
16145           { 0xd90ba188f2651798l,0x74c6e18c36ab1c34l,0xab256ea35ef54359l,
16146             0x03466612d1aa702fl },
16147           0 },
16148         /* 41 << 0 */
16149         { { 0x624d60492ed22e91l,0x6fdfe0b56f072822l,0xeeca111539ce2271l,
16150             0x98100a4fdb01614fl },
16151           { 0xb6b0daa2a35c628fl,0xb6f94d2ec87e9a47l,0xc67732591d57d9cel,
16152             0xf70bfeec03884a7bl },
16153           0 },
16154         /* 43 << 0 */
16155         { { 0x4ff23ffd248a7d06l,0x80c5bfb4878873fal,0xb7d9ad9005745981l,
16156             0x179c85db3db01994l },
16157           { 0xba41b06261a6966cl,0x4d82d052eadce5a8l,0x9e91cd3ba5e6a318l,
16158             0x47795f4f95b2dda0l },
16159           0 },
16160         /* 44 << 0 */
16161         { { 0xecfd7c1fd55a897cl,0x009194abb29110fbl,0x5f0e2046e381d3b0l,
16162             0x5f3425f6a98dd291l },
16163           { 0xbfa06687730d50dal,0x0423446c4b083b7fl,0x397a247dd69d3417l,
16164             0xeb629f90387ba42al },
16165           0 },
16166         /* 45 << 0 */
16167         { { 0x1ee426ccd5cd79bfl,0x0032940b946c6e18l,0x1b1e8ae057477f58l,
16168             0xe94f7d346d823278l },
16169           { 0xc747cb96782ba21al,0xc5254469f72b33a5l,0x772ef6dec7f80c81l,
16170             0xd73acbfe2cd9e6b5l },
16171           0 },
16172         /* 46 << 0 */
16173         { { 0x4075b5b149ee90d9l,0x785c339aa06e9ebal,0xa1030d5babf825e0l,
16174             0xcec684c3a42931dcl },
16175           { 0x42ab62c9c1586e63l,0x45431d665ab43f2bl,0x57c8b2c055f7835dl,
16176             0x033da338c1b7f865l },
16177           0 },
16178         /* 47 << 0 */
16179         { { 0x283c7513caa76097l,0x0a624fa936c83906l,0x6b20afec715af2c7l,
16180             0x4b969974eba78bfdl },
16181           { 0x220755ccd921d60el,0x9b944e107baeca13l,0x04819d515ded93d4l,
16182             0x9bbff86e6dddfd27l },
16183           0 },
16184         /* 48 << 0 */
16185         { { 0x6b34413077adc612l,0xa7496529bbd803a0l,0x1a1baaa76d8805bdl,
16186             0xc8403902470343adl },
16187           { 0x39f59f66175adff1l,0x0b26d7fbb7d8c5b7l,0xa875f5ce529d75e3l,
16188             0x85efc7e941325cc2l },
16189           0 },
16190         /* 49 << 0 */
16191         { { 0x21950b421ff6acd3l,0xffe7048453dc6909l,0xff4cd0b228766127l,
16192             0xabdbe6084fb7db2bl },
16193           { 0x837c92285e1109e8l,0x26147d27f4645b5al,0x4d78f592f7818ed8l,
16194             0xd394077ef247fa36l },
16195           0 },
16196         /* 51 << 0 */
16197         { { 0x508cec1c3b3f64c9l,0xe20bc0ba1e5edf3fl,0xda1deb852f4318d4l,
16198             0xd20ebe0d5c3fa443l },
16199           { 0x370b4ea773241ea3l,0x61f1511c5e1a5f65l,0x99a5e23d82681c62l,
16200             0xd731e383a2f54c2dl },
16201           0 },
16202         /* 52 << 0 */
16203         { { 0x2692f36e83445904l,0x2e0ec469af45f9c0l,0x905a3201c67528b7l,
16204             0x88f77f34d0e5e542l },
16205           { 0xf67a8d295864687cl,0x23b92eae22df3562l,0x5c27014b9bbec39el,
16206             0x7ef2f2269c0f0f8dl },
16207           0 },
16208         /* 53 << 0 */
16209         { { 0x97359638546c4d8dl,0x5f9c3fc492f24679l,0x912e8beda8c8acd9l,
16210             0xec3a318d306634b0l },
16211           { 0x80167f41c31cb264l,0x3db82f6f522113f2l,0xb155bcd2dcafe197l,
16212             0xfba1da5943465283l },
16213           0 },
16214         /* 55 << 0 */
16215         { { 0x258bbbf9e7305683l,0x31eea5bf07ef5be6l,0x0deb0e4a46c814c1l,
16216             0x5cee8449a7b730ddl },
16217           { 0xeab495c5a0182bdel,0xee759f879e27a6b4l,0xc2cf6a6880e518cal,
16218             0x25e8013ff14cf3f4l },
16219           0 },
16220         /* 57 << 0 */
16221         { { 0x3ec832e77acaca28l,0x1bfeea57c7385b29l,0x068212e3fd1eaf38l,
16222             0xc13298306acf8cccl },
16223           { 0xb909f2db2aac9e59l,0x5748060db661782al,0xc5ab2632c79b7a01l,
16224             0xda44c6c600017626l },
16225           0 },
16226         /* 59 << 0 */
16227         { { 0x69d44ed65c46aa8el,0x2100d5d3a8d063d1l,0xcb9727eaa2d17c36l,
16228             0x4c2bab1b8add53b7l },
16229           { 0xa084e90c15426704l,0x778afcd3a837ebeal,0x6651f7017ce477f8l,
16230             0xa062499846fb7a8bl },
16231           0 },
16232         /* 60 << 0 */
16233         { { 0xdc1e6828ed8a6e19l,0x33fc23364189d9c7l,0x026f8fe2671c39bcl,
16234             0xd40c4ccdbc6f9915l },
16235           { 0xafa135bbf80e75cal,0x12c651a022adff2cl,0xc40a04bd4f51ad96l,
16236             0x04820109bbe4e832l },
16237           0 },
16238         /* 61 << 0 */
16239         { { 0x3667eb1a7f4c04ccl,0x59556621a9404f84l,0x71cdf6537eceb50al,
16240             0x994a44a69b8335fal },
16241           { 0xd7faf819dbeb9b69l,0x473c5680eed4350dl,0xb6658466da44bba2l,
16242             0x0d1bc780872bdbf3l },
16243           0 },
16244         /* 63 << 0 */
16245         { { 0xb8d3d9319ff91fe5l,0x039c4800f0518eedl,0x95c376329182cb26l,
16246             0x0763a43482fc568dl },
16247           { 0x707c04d5383e76bal,0xac98b930824e8197l,0x92bf7c8f91230de0l,
16248             0x90876a0140959b70l },
16249           0 },
16250         /* 64 << 0 */
16251         { { 0xdb6d96f305968b80l,0x380a0913089f73b9l,0x7da70b83c2c61e01l,
16252             0x95fb8394569b38c7l },
16253           { 0x9a3c651280edfe2fl,0x8f726bb98faeaf82l,0x8010a4a078424bf8l,
16254             0x296720440e844970l },
16255           0 },
16256         /* 65 << 0 */
16257         { { 0xdc2306ebfcdbb2b2l,0x79527db7ba66f4b9l,0xbf639ed67765765el,
16258             0x01628c4706b6090al },
16259           { 0x66eb62f1b957b4a1l,0x33cb7691ba659f46l,0x2c90d98cf3e055d6l,
16260             0x7d096ac42f174750l },
16261           0 },
16262         /* 71 << 0 */
16263         { { 0xf19f382e92aa7864l,0x49c7cb94fc05804bl,0xf94aa89b40750d01l,
16264             0xdd421b5d4a210364l },
16265           { 0x56cd001e39df3672l,0x030a119fdd4af1ecl,0x11f947e696cd0572l,
16266             0x574cc7b293786791l },
16267           0 },
16268         /* 77 << 0 */
16269         { { 0x0a2193bfc266f85cl,0x719a87be5a0ec9cel,0x9c30c6422b2f9c49l,
16270             0xdb15e4963d5baeb1l },
16271           { 0x83c3139be0d37321l,0x4788522b2e9fdbb2l,0x2b4f0c7877eb94eal,
16272             0x854dc9d595105f9el },
16273           0 },
16274         /* 83 << 0 */
16275         { { 0x2c9ee62dc3363a22l,0x125d4714ec67199al,0xf87abebf2ab80485l,
16276             0xcf3086e87a243ca4l },
16277           { 0x5c52b051c64e09ddl,0x5e9b16125625aad7l,0x0536a39db19c6126l,
16278             0x97f0013247b64be5l },
16279           0 },
16280         /* 89 << 0 */
16281         { { 0xc1ee6264a7eabe67l,0x62d51e29fd54487dl,0x3ea123446310eb5al,
16282             0xbd88aca74765b805l },
16283           { 0xb7b284be14fb691al,0x640388f83b9fffefl,0x7ab49dd209f98f9al,
16284             0x7150f87e7211e445l },
16285           0 },
16286         /* 95 << 0 */
16287         { { 0x263e039bb308cc40l,0x6684ad762b346fd2l,0x9a127f2bcaa12d0dl,
16288             0x76a8f9fea974291fl },
16289           { 0xc802049b68aa19e4l,0x65499c990c5dbba0l,0xee1b1cb5344455a1l,
16290             0x3f293fda2cd6f439l },
16291           0 },
16292         /* 101 << 0 */
16293         { { 0xb7a96e0a4ea6fdf7l,0xbbe914d3b99cd026l,0x6a610374c569a602l,
16294             0xe9b1c23914da499el },
16295           { 0xb5f6f0feadc19a99l,0x731251826f21687cl,0x5a8a14644be77793l,
16296             0x94ce9e0adba8bfc7l },
16297           0 },
16298         /* 107 << 0 */
16299         { { 0x2ca0ba9c3796f4c7l,0x3571e4d1592ce334l,0x28f9cdebe9f6e877l,
16300             0xee206023efce1a70l },
16301           { 0xb2159e08b76369dcl,0x2754e4260a7f687cl,0xe008039e02de2ff1l,
16302             0xccd7e9418ea700c1l },
16303           0 },
16304         /* 113 << 0 */
16305         { { 0xa125e6c1b7ebcb88l,0x3289e86e10ec0d40l,0xcc3a5ecb98353869l,
16306             0x734e0d078a2b0d3al },
16307           { 0xe0d92e9a51933360l,0xfa6bcdb1786076b9l,0xd13cca90747f19ecl,
16308             0x61d8209d49f3a53dl },
16309           0 },
16310         /* 116 << 0 */
16311         { { 0x87f9793bc9826344l,0x4b3de89bb2f5f79cl,0xc9f08a5659cb1b6el,
16312             0xd8f1fc5f6a92b9aal },
16313           { 0x86357f9eb412595el,0x53c30bbe65b80f16l,0xf06c2c8c70549a57l,
16314             0xa9c8a4b42b9157dal },
16315           0 },
16316         /* 119 << 0 */
16317         { { 0x87af199e6cc47305l,0x062afb7c1e314ddel,0x2be22ba0f3a49fb4l,
16318             0x6ed0b988157b7f56l },
16319           { 0x8162cf502d653fd9l,0x17d29c64877b7497l,0xd7e814380f67b514l,
16320             0xfedf1014fe6ee703l },
16321           0 },
16322         /* 125 << 0 */
16323         { { 0xaab54cfc93740130l,0xf72dab6d225733fal,0x04b76d2d1ed32559l,
16324             0xa9fe2396bb85b9cbl },
16325           { 0x128b0d24bf2219f0l,0x2292393b579f3ce2l,0x51dc5fac145ff0d5l,
16326             0xb16d6af8c3febbc1l },
16327           0 },
16328     },
16329     {
16330         /* 0 << 8 */
16331         { { 0x00, 0x00, 0x00, 0x00 },
16332           { 0x00, 0x00, 0x00, 0x00 },
16333           1 },
16334         /* 1 << 8 */
16335         { { 0x486d8ffa696946fcl,0x50fbc6d8b9cba56dl,0x7e3d423e90f35a15l,
16336             0x7c3da195c0dd962cl },
16337           { 0xe673fdb03cfd5d8bl,0x0704b7c2889dfca5l,0xf6ce581ff52305aal,
16338             0x399d49eb914d5e53l },
16339           0 },
16340         /* 3 << 8 */
16341         { { 0x35d6a53eed4c3717l,0x9f8240cf3d0ed2a3l,0x8c0d4d05e5543aa5l,
16342             0x45d5bbfbdd33b4b4l },
16343           { 0xfa04cc73137fd28el,0x862ac6efc73b3ffdl,0x403ff9f531f51ef2l,
16344             0x34d5e0fcbc73f5a2l },
16345           0 },
16346         /* 4 << 8 */
16347         { { 0x4f7081e144cc3addl,0xd5ffa1d687be82cfl,0x89890b6c0edd6472l,
16348             0xada26e1a3ed17863l },
16349           { 0x276f271563483caal,0xe6924cd92f6077fdl,0x05a7fe980a466e3cl,
16350             0xf1c794b0b1902d1fl },
16351           0 },
16352         /* 5 << 8 */
16353         { { 0x33b2385c08369a90l,0x2990c59b190eb4f8l,0x819a6145c68eac80l,
16354             0x7a786d622ec4a014l },
16355           { 0x33faadbe20ac3a8dl,0x31a217815aba2d30l,0x209d2742dba4f565l,
16356             0xdb2ce9e355aa0fbbl },
16357           0 },
16358         /* 7 << 8 */
16359         { { 0x0c4a58d474a86108l,0xf8048a8fee4c5d90l,0xe3c7c924e86d4c80l,
16360             0x28c889de056a1e60l },
16361           { 0x57e2662eb214a040l,0xe8c48e9837e10347l,0x8774286280ac748al,
16362             0xf1c24022186b06f2l },
16363           0 },
16364         /* 9 << 8 */
16365         { { 0xe8cbf1e5d5923359l,0xdb0cea9d539b9fb0l,0x0c5b34cf49859b98l,
16366             0x5e583c56a4403cc6l },
16367           { 0x11fc1a2dd48185b7l,0xc93fbc7e6e521787l,0x47e7a05805105b8bl,
16368             0x7b4d4d58db8260c8l },
16369           0 },
16370         /* 10 << 8 */
16371         { { 0xb31bd6136339c083l,0x39ff8155dfb64701l,0x7c3388d2e29604abl,
16372             0x1e19084ba6b10442l },
16373           { 0x17cf54c0eccd47efl,0x896933854a5dfb30l,0x69d023fb47daf9f6l,
16374             0x9222840b7d91d959l },
16375           0 },
16376         /* 11 << 8 */
16377         { { 0xc510610939842194l,0xb7e2353e49d05295l,0xfc8c1d5cefb42ee0l,
16378             0xe04884eb08ce811cl },
16379           { 0xf1f75d817419f40el,0x5b0ac162a995c241l,0x120921bbc4c55646l,
16380             0x713520c28d33cf97l },
16381           0 },
16382         /* 13 << 8 */
16383         { { 0x41d04ee21726931al,0x0bbbb2c83660ecfdl,0xa6ef6de524818e18l,
16384             0xe421cc51e7d57887l },
16385           { 0xf127d208bea87be6l,0x16a475d3b1cdd682l,0x9db1b684439b63f7l,
16386             0x5359b3dbf0f113b6l },
16387           0 },
16388         /* 15 << 8 */
16389         { { 0x3a5c752edcc18770l,0x4baf1f2f8825c3a5l,0xebd63f7421b153edl,
16390             0xa2383e47b2f64723l },
16391           { 0xe7bf620a2646d19al,0x56cb44ec03c83ffdl,0xaf7267c94f6be9f1l,
16392             0x8b2dfd7bc06bb5e9l },
16393           0 },
16394         /* 16 << 8 */
16395         { { 0x6772b0e5ab4b35a2l,0x1d8b6001f5eeaacfl,0x728f7ce4795b9580l,
16396             0x4a20ed2a41fb81dal },
16397           { 0x9f685cd44fec01e6l,0x3ed7ddcca7ff50adl,0x460fd2640c2d97fdl,
16398             0x3a241426eb82f4f9l },
16399           0 },
16400         /* 17 << 8 */
16401         { { 0xc503cd33bccd9617l,0x365dede4ba7730a3l,0x798c63555ddb0786l,
16402             0xa6c3200efc9cd3bcl },
16403           { 0x060ffb2ce5e35efdl,0x99a4e25b5555a1c1l,0x11d95375f70b3751l,
16404             0x0a57354a160e1bf6l },
16405           0 },
16406         /* 19 << 8 */
16407         { { 0xc033bdc719803511l,0xa9f97b3b8888c3bel,0x3d68aebc85c6d05el,
16408             0xc3b88a9d193919ebl },
16409           { 0x2d300748c48b0ee3l,0x7506bc7c07a746c1l,0xfc48437c6e6d57f3l,
16410             0x5bd71587cfeaa91al },
16411           0 },
16412         /* 21 << 8 */
16413         { { 0xe40736d3df61bc76l,0x13a619c03f778cdbl,0x6dd921a4c56ea28fl,
16414             0x76a524332fa647b4l },
16415           { 0x23591891ac5bdc5dl,0xff4a1a72bac7dc01l,0x9905e26162df8453l,
16416             0x3ac045dfe63b265fl },
16417           0 },
16418         /* 23 << 8 */
16419         { { 0x8435bd6994b03ed1l,0xd9ad1de3634cc546l,0x2cf423fc00e420cal,
16420             0xeed26d80a03096ddl },
16421           { 0xd7f60be7a4db09d2l,0xf47f569d960622f7l,0xe5925fd77296c729l,
16422             0xeff2db2626ca2715l },
16423           0 },
16424         /* 25 << 8 */
16425         { { 0x5dfee80f83774bddl,0x6313160285734485l,0xa1b524ae914a69a9l,
16426             0xebc2ffafd4e300d7l },
16427           { 0x52c93db77cfa46a5l,0x71e6161f21653b50l,0x3574fc57a4bc580al,
16428             0xc09015dde1bc1253l },
16429           0 },
16430         /* 27 << 8 */
16431         { { 0x9c38ddcceb5b76c1l,0x746f528526fc0ab4l,0x52a63a50d62c269fl,
16432             0x60049c5599458621l },
16433           { 0xe7f48f823c2f7c9el,0x6bd99043917d5cf3l,0xeb1317a88701f469l,
16434             0xbd3fe2ed9a449fe0l },
16435           0 },
16436         /* 28 << 8 */
16437         { { 0xe652533b3cef0d7dl,0xd94f7b182bbb4381l,0x838752be0e80f500l,
16438             0x8e6e24889e9c9bfbl },
16439           { 0xc975169716caca6al,0x866c49d838531ad9l,0xc917e2397151ade1l,
16440             0x2d016ec16037c407l },
16441           0 },
16442         /* 29 << 8 */
16443         { { 0x202f6a9c31c71f7bl,0x01f95aa3296ffe5cl,0x5fc0601453cec3a3l,
16444             0xeb9912375f498a45l },
16445           { 0xae9a935e5d91ba87l,0xc6ac62810b564a19l,0x8a8fe81c3bd44e69l,
16446             0x7c8b467f9dd11d45l },
16447           0 },
16448         /* 31 << 8 */
16449         { { 0x21d3634d39eedbbal,0x35cd2e680455a46dl,0xc8cafe65f9d7eb0cl,
16450             0xbda3ce9e00cefb3el },
16451           { 0xddc17a602c9cf7a4l,0x01572ee47bcb8773l,0xa92b2b018c7548dfl,
16452             0x732fd309a84600e3l },
16453           0 },
16454         /* 33 << 8 */
16455         { { 0x65cf89a2e0600afal,0xcf51482f753c5ceal,0x4f2b2d25a5c2bfc5l,
16456             0x9381f57187098256l },
16457           { 0x89210f676e976e4bl,0xe2cf12f489f47a7bl,0xc21a1658e8484050l,
16458             0xa224dbf82f0fff01l },
16459           0 },
16460         /* 34 << 8 */
16461         { { 0xc28961087282513dl,0x9a78c4296a3f8fb8l,0xddfa56f9a31e24b7l,
16462             0xb1e14f84fb72611fl },
16463           { 0x1d0f70ab45078d65l,0xb247aef3819924d8l,0x8d519f9dbb9877c1l,
16464             0x495c2ece8368c7c9l },
16465           0 },
16466         /* 35 << 8 */
16467         { { 0xca9129a0bdb69d12l,0xbe3e319978f39adfl,0xa88506df5fe49438l,
16468             0x17ddb7a7aafe894cl },
16469           { 0x28d1456f6d1d742fl,0xeec09651917d1268l,0xdecb1c700fd5b4c0l,
16470             0x32d14f6acf2861dbl },
16471           0 },
16472         /* 36 << 8 */
16473         { { 0x903f6e3960e913afl,0xb2b58bee98bf140dl,0x9deff025354890b8l,
16474             0x155810068d2e924el },
16475           { 0xb5755db493c95e5bl,0x3fac42f0dae20eb8l,0x9377c8c109b6d8e0l,
16476             0xa43e2b46ab47ceffl },
16477           0 },
16478         /* 37 << 8 */
16479         { { 0x6c3f5a51cb61e7e7l,0x264aebc80d9c73b2l,0xc404b2114a0d9288l,
16480             0x5178d3cf8b3a79e9l },
16481           { 0x4080be5372a420d7l,0xa39396adef026429l,0x22fbb92e8dde4728l,
16482             0x19e42d8874d949fcl },
16483           0 },
16484         /* 39 << 8 */
16485         { { 0xde352d78387f5557l,0x6770149969367413l,0x255bb8c00b0cc102l,
16486             0x63cad1be1f4d262el },
16487           { 0xf34f9a8a3f8f4fb6l,0x32bc13aae03a969fl,0xb29d4336218371cdl,
16488             0x799d76ab285bd210l },
16489           0 },
16490         /* 40 << 8 */
16491         { { 0x5f57b2fbfacfa459l,0x874b1498c1b5aa6bl,0xb9e89acac4db2092l,
16492             0x1362bf8ddf4381dal },
16493           { 0x25d76830b76328a0l,0x38188b7098572ae4l,0xb43e941429132f7dl,
16494             0x7895a29f22dd42c9l },
16495           0 },
16496         /* 41 << 8 */
16497         { { 0x85bded619e808c05l,0x6e0fc2bcc7ef83bbl,0xed70e0b499bedf77l,
16498             0x300e777dc1aaffc0l },
16499           { 0xe2da2359c43e6d2cl,0xacf6d60a275226e0l,0x18ca38f7f82558bdl,
16500             0xd7b017d475ae2591l },
16501           0 },
16502         /* 43 << 8 */
16503         { { 0xed299e2d7cd92ee2l,0x2c08eb37ad847153l,0x7b372aa712acfd81l,
16504             0x574d27f5fabda29cl },
16505           { 0xbd8247f0f2ee6ebcl,0x8bf76710d06be261l,0x26e95b4bcb186d4cl,
16506             0x4fa3ac1d1ebb4a46l },
16507           0 },
16508         /* 44 << 8 */
16509         { { 0xcbde78dd5e22cbb2l,0xf449c85b76bb4391l,0x4289f357b6a4273bl,
16510             0x9fce23fd48e84a19l },
16511           { 0xcfc32730939eb3b4l,0x8b3d982c16c32280l,0x5ac234bad5f1346cl,
16512             0x781954b470769fc9l },
16513           0 },
16514         /* 45 << 8 */
16515         { { 0xff0d4d30062c7dbdl,0x2c483081e6f9fcf0l,0x22f96316d67e070fl,
16516             0xdd9be459c0e68c44l },
16517           { 0xb9c1edffce2edd4dl,0x1a54782021fc538cl,0x93849be49979aee1l,
16518             0x3f313629a590949el },
16519           0 },
16520         /* 46 << 8 */
16521         { { 0x160b836b266be332l,0x49de38215f340575l,0x782e8f6701edce66l,
16522             0x83ae008b5df1a93el },
16523           { 0x85d33a263ed9ffebl,0xae2f9f961e79db97l,0xf64f209b95ae9e34l,
16524             0x2b6b03455e957d49l },
16525           0 },
16526         /* 47 << 8 */
16527         { { 0x7a24a21a331d6bdal,0xfdba302f6328f742l,0x37a36dd47744dca4l,
16528             0xda2832ce6fef500fl },
16529           { 0x23da304a7b49d73al,0xeede2cebc6ad834fl,0xf21a81248dec3c78l,
16530             0x4bc9469b19b721e3l },
16531           0 },
16532         /* 48 << 8 */
16533         { { 0x6faf68feaae6ee70l,0x78f4cc155602b0c9l,0x7e3321a86e94052al,
16534             0x2fb3a0d6734d5d80l },
16535           { 0xf3b98f3bb25a43bal,0x30bf803119ee2951l,0x7ffee43321b0612al,
16536             0x12f775e42eb821d0l },
16537           0 },
16538         /* 49 << 8 */
16539         { { 0x31cc342913e5c1d6l,0x05deaa3cee54e334l,0x21ea2b61cd5087d8l,
16540             0x73a1841e70d1b8bcl },
16541           { 0xd44e2b41b078bf14l,0xc295732fcea2a30el,0x30cdab42954939f7l,
16542             0xc1b4e43a2dba0b7cl },
16543           0 },
16544         /* 51 << 8 */
16545         { { 0x5f33f618b6a20132l,0xc8d73e3cfbbf3022l,0xf3b9844d47ed4320l,
16546             0xab5868aa927f00cal },
16547           { 0x06cb1113077f6e1cl,0x1417b43a5c94faaal,0x7666cb90cf4cd1e9l,
16548             0x99e009f210900566l },
16549           0 },
16550         /* 52 << 8 */
16551         { { 0x4fdff805f57209b5l,0x9bd65ac3f952ac8dl,0x02a3abd3c7969a6fl,
16552             0x1359927ef523775fl },
16553           { 0xe09b463f88d2e861l,0x661d2199623287c3l,0x821e64495a70eb7al,
16554             0x0afbbb1dd67dc684l },
16555           0 },
16556         /* 53 << 8 */
16557         { { 0x2c5a2b2d55750eb2l,0x54d756c29dc28d9fl,0x798c8d113af97f71l,
16558             0x54e21ee21f6d1853l },
16559           { 0x34e0c8bceffc3f8al,0xed3cc4dda96f193fl,0x86436a84fad97110l,
16560             0x8530ca522c97205el },
16561           0 },
16562         /* 55 << 8 */
16563         { { 0x9b6c8452f7236867l,0x21cf260c777b44fdl,0x659fc99dceb00c52l,
16564             0xda97098e2439e8dbl },
16565           { 0x647efe510ed6e14fl,0x37c8ca122a6600f3l,0x53e89b0badf6f4a7l,
16566             0xd9fc8c716645618al },
16567           0 },
16568         /* 57 << 8 */
16569         { { 0x9cecfb8eee6ebd31l,0x4603994b1ff25529l,0x707bc80af4b141c4l,
16570             0x3a83d56c07524d3al },
16571           { 0x7035c746613a3020l,0x7aa766b286626a1cl,0x3af656095ac76c78l,
16572             0x4039c655171e47d6l },
16573           0 },
16574         /* 59 << 8 */
16575         { { 0x79cb147f0ce33b63l,0xa1328a622d160c61l,0xf99538f3cf7eb87el,
16576             0x0334d4958e2241d5l },
16577           { 0x3ad97e02f3e49e48l,0xdcfcc754037c3679l,0x76078ba61a8ff67cl,
16578             0x8054aa55c2a64964l },
16579           0 },
16580         /* 60 << 8 */
16581         { { 0x5852104b87453b28l,0x073e8128b387344dl,0x300e78e4817cfc08l,
16582             0x3a82ed4799362088l },
16583           { 0xe222304c88de46a4l,0x666c94fd57fadf4al,0x40b2d08ea0c8e108l,
16584             0x4b2955b909e050fal },
16585           0 },
16586         /* 61 << 8 */
16587         { { 0x656078565f814881l,0x0fc3d1ce58466117l,0x0ae377d3c6c1e68al,
16588             0xe3dd8d5cba566c48l },
16589           { 0x9404849ec4b63be6l,0x1e22b03ba5be9c92l,0x08145122a8b03e63l,
16590             0x71248243771fe153l },
16591           0 },
16592         /* 63 << 8 */
16593         { { 0xa80a0e83b41ac541l,0xa77570ea533e5f9bl,0x416a14c0216dc452l,
16594             0x2a8d728a19f7ee59l },
16595           { 0x58494c8cd6552eaal,0x4d635acd60145722l,0xa8e9b127327b1cbcl,
16596             0xb429a62e9f8235f0l },
16597           0 },
16598         /* 64 << 8 */
16599         { { 0xf8d112e76e6485b3l,0x4d3e24db771c52f8l,0x48e3ee41684a2f6dl,
16600             0x7161957d21d95551l },
16601           { 0x19631283cdb12a6cl,0xbf3fa8822e50e164l,0xf6254b633166cc73l,
16602             0x3aefa7aeaee8cc38l },
16603           0 },
16604         /* 65 << 8 */
16605         { { 0xd52d2cb746ef1c7el,0xebd4f7c4d8fb6e07l,0x16f77a48cf6dd2b4l,
16606             0x6e8f0431e77e4d51l },
16607           { 0x59d94cc4e9177bf2l,0xb58a578f7a7181a1l,0xeefbc4cde8f6d330l,
16608             0xa66c85560fe05490l },
16609           0 },
16610         /* 71 << 8 */
16611         { { 0x0e6db7a35d9649dal,0x4d2f25193be3d362l,0xcd891fd5a6b137b5l,
16612             0xa4b7e4ddacd377a9l },
16613           { 0x20ccd6f24355f258l,0x842c08673aafb413l,0xdd55db99d6873b88l,
16614             0x04d15f4fea5a2a55l },
16615           0 },
16616         /* 77 << 8 */
16617         { { 0x679cd93dfae289c2l,0x84cadd61ff92ba1bl,0x548b5a6f2cd734aal,
16618             0x1827507db8267082l },
16619           { 0xa903a6010c6d5b4cl,0xde0d96befdfb952bl,0x2fc9419c6a2e24f9l,
16620             0x27333e3936bb3203l },
16621           0 },
16622         /* 83 << 8 */
16623         { { 0x3eb7f062dde4aa6al,0x40effae07f354cc0l,0xe9a14bc2a066c05el,
16624             0x7817b11356afc543l },
16625           { 0x5f0ed1f28bdda262l,0x001e23d2e007ec13l,0x435878a59c57de6al,
16626             0x84d0e20895ac263cl },
16627           0 },
16628         /* 89 << 8 */
16629         { { 0xedf24aec97a66678l,0xd1f93cf8ccf55671l,0x4ed2ce8a9379a49dl,
16630             0x64991862c39b0ac9l },
16631           { 0xc15b24e31ff67e04l,0x4ee8fc76c3c084fel,0x262012b4f64bcd46l,
16632             0x3b5086732425c622l },
16633           0 },
16634         /* 95 << 8 */
16635         { { 0xaa3e451fe65002f7l,0xf5ff2617eb46d253l,0x918d146e572afca2l,
16636             0x0a9333b7e56a8553l },
16637           { 0x9b7e232d94127dc0l,0xcd0687d6831014e6l,0x725ce5baf08e1c71l,
16638             0x56e26f48cde0e4edl },
16639           0 },
16640         /* 101 << 8 */
16641         { { 0xae78dde8db833460l,0xaf1736fe762cb78al,0x5cd85742eae5ac60l,
16642             0x7b6c52fe955e981al },
16643           { 0x9f823e8555599f97l,0xb9ce70d21a4b46b3l,0xb6076175d7d09829l,
16644             0x21e77d22abf390a4l },
16645           0 },
16646         /* 107 << 8 */
16647         { { 0xf704f09da142ad7el,0xb60ec2e1bab9f5d2l,0x4180314681e54d0dl,
16648             0x0de50506309335e6l },
16649           { 0x4135374e05aec64fl,0xb5d31041b556808al,0x0092eb86049033a8l,
16650             0x5b7a2fa0bde0d737l },
16651           0 },
16652         /* 113 << 8 */
16653         { { 0xc0dfa6bbefb40cfal,0x86a6fe279c5037f3l,0xf153cd37f71155f4l,
16654             0xf16d6029767664f9l },
16655           { 0x7441aa54c635aa57l,0x547f82e9e8186b2el,0x330b464bfbf7c7fel,
16656             0xb5556770a1f6fddel },
16657           0 },
16658         /* 116 << 8 */
16659         { { 0xa0a9c5d1e8f9edf1l,0x9814c26b6946cea3l,0xcbb47a37d8e6a08dl,
16660             0x517a3d9b2cba11b1l },
16661           { 0x94edc73dab43c540l,0x4fd0b82a753e552cl,0x419aab8bd14ae853l,
16662             0x94955f9ca68abad8l },
16663           0 },
16664         /* 119 << 8 */
16665         { { 0x3a162e06ed169150l,0x8c9683a6ba1194a8l,0x53fead66ccc28d04l,
16666             0xdbb2a85bef09809al },
16667           { 0x58e677439d3ab018l,0xff9a2046b6e56bd0l,0xf4b8215eb28061e9l,
16668             0xcf16d9f7b10e358fl },
16669           0 },
16670         /* 125 << 8 */
16671         { { 0x265ceae9a55abe39l,0x9e3783f796a98f84l,0xb799628af0757d99l,
16672             0xebb5f12665472fb3l },
16673           { 0xd83619f52ba517d8l,0x5672105f50382bdfl,0x32c5681c4a12ee9fl,
16674             0x31e6f60d834a9fedl },
16675           0 },
16676     },
16677     {
16678         /* 0 << 16 */
16679         { { 0x00, 0x00, 0x00, 0x00 },
16680           { 0x00, 0x00, 0x00, 0x00 },
16681           1 },
16682         /* 1 << 16 */
16683         { { 0x0f0165fce3779ee3l,0xe00e7f9dbd495d9el,0x1fa4efa220284e7al,
16684             0x4564bade47ac6219l },
16685           { 0x90e6312ac4708e8el,0x4f5725fba71e9adfl,0xe95f55ae3d684b9fl,
16686             0x47f7ccb11e94b415l },
16687           0 },
16688         /* 3 << 16 */
16689         { { 0xbd9b8b1dbe7a2af3l,0xec51caa94fb74a72l,0xb9937a4b63879697l,
16690             0x7c9a9d20ec2687d5l },
16691           { 0x1773e44f6ef5f014l,0x8abcf412e90c6900l,0x387bd0228142161el,
16692             0x50393755fcb6ff2al },
16693           0 },
16694         /* 4 << 16 */
16695         { { 0xfabf770977f7195al,0x8ec86167adeb838fl,0xea1285a8bb4f012dl,
16696             0xd68835039a3eab3fl },
16697           { 0xee5d24f8309004c2l,0xa96e4b7613ffe95el,0x0cdffe12bd223ea4l,
16698             0x8f5c2ee5b6739a53l },
16699           0 },
16700         /* 5 << 16 */
16701         { { 0x3d61333959145a65l,0xcd9bc368fa406337l,0x82d11be32d8a52a0l,
16702             0xf6877b2797a1c590l },
16703           { 0x837a819bf5cbdb25l,0x2a4fd1d8de090249l,0x622a7de774990e5fl,
16704             0x840fa5a07945511bl },
16705           0 },
16706         /* 7 << 16 */
16707         { { 0x26e08c07e3533d77l,0xd7222e6a2e341c99l,0x9d60ec3d8d2dc4edl,
16708             0xbdfe0d8f7c476cf8l },
16709           { 0x1fe59ab61d056605l,0xa9ea9df686a8551fl,0x8489941e47fb8d8cl,
16710             0xfeb874eb4a7f1b10l },
16711           0 },
16712         /* 9 << 16 */
16713         { { 0x9164088d977eab40l,0x51f4c5b62760b390l,0xd238238f340dd553l,
16714             0x358566c3db1d31c9l },
16715           { 0x3a5ad69e5068f5ffl,0xf31435fcdaff6b06l,0xae549a5bd6debff0l,
16716             0x59e5f0b775e01331l },
16717           0 },
16718         /* 10 << 16 */
16719         { { 0x2cc5226138634818l,0x501814f4b44c2e0bl,0xf7e181aa54dfdba3l,
16720             0xcfd58ff0e759718cl },
16721           { 0xf90cdb14d3b507a8l,0x57bd478ec50bdad8l,0x29c197e250e5f9aal,
16722             0x4db6eef8e40bc855l },
16723           0 },
16724         /* 11 << 16 */
16725         { { 0xd5d5cdd35958cd79l,0x3580a1b51d373114l,0xa36e4c91fa935726l,
16726             0xa38c534def20d760l },
16727           { 0x7088e40a2ff5845bl,0xe5bb40bdbd78177fl,0x4f06a7a8857f9920l,
16728             0xe3cc3e50e968f05dl },
16729           0 },
16730         /* 13 << 16 */
16731         { { 0x10595b5696a71cbal,0x944938b2fdcadeb7l,0xa282da4cfccd8471l,
16732             0x98ec05f30d37bfe1l },
16733           { 0xe171ce1b0698304al,0x2d69144421bdf79bl,0xd0cd3b741b21dec1l,
16734             0x712ecd8b16a15f71l },
16735           0 },
16736         /* 15 << 16 */
16737         { { 0xe89f48c85963a46el,0x658ab875a99e61c7l,0x6e296f874b8517b4l,
16738             0x36c4fcdcfc1bc656l },
16739           { 0xde5227a1a3906defl,0x9fe95f5762418945l,0x20c91e81fdd96cdel,
16740             0x5adbe47eda4480del },
16741           0 },
16742         /* 16 << 16 */
16743         { { 0xa7a8746a584c5e20l,0x267e4ea1b9dc7035l,0x593a15cfb9548c9bl,
16744             0x5e6e21354bd012f3l },
16745           { 0xdf31cc6a8c8f936el,0x8af84d04b5c241dcl,0x63990a6f345efb86l,
16746             0x6fef4e61b9b962cbl },
16747           0 },
16748         /* 17 << 16 */
16749         { { 0xaa35809ddfe6e2a0l,0xebb4d7d4356a2222l,0x7d500a6a319f33b7l,
16750             0x4895a47d4ac99011l },
16751           { 0x300ab40bdf3812b2l,0xd0764ec88aec8b9fl,0x86b61d95e591b2a7l,
16752             0xc1b2a0b72ed74603l },
16753           0 },
16754         /* 19 << 16 */
16755         { { 0x6001bf5d3849c680l,0xd7a1a4e4c1d3faccl,0xa0f2776418c5e351l,
16756             0x0849c0736c29c623l },
16757           { 0x3317e143ac751c0cl,0x9bcb1f3eda06200bl,0x40a63a75541419b5l,
16758             0x8fad9c983f62c513l },
16759           0 },
16760         /* 21 << 16 */
16761         { { 0xacff0828d03b2242l,0x5a9375c43abb7389l,0x41b1a318d0192baal,
16762             0x105bd3100458e97bl },
16763           { 0x71582dc7ed496315l,0x8ab2884a4d4bda18l,0xb8b638b494bc5bb8l,
16764             0xb42ed1309500bb04l },
16765           0 },
16766         /* 23 << 16 */
16767         { { 0x73e04f02ad1ed952l,0x680051cadfa5bdb7l,0xbe0bef3c0c7437b9l,
16768             0x45d6f3a40e65e627l },
16769           { 0x5295e060c9436a75l,0xbe84ba78d289ba9el,0x350887fd69c09364l,
16770             0xf27bfd17671c64a7l },
16771           0 },
16772         /* 25 << 16 */
16773         { { 0xc8afbdc3adf6ffc5l,0x4a4fb35876385891l,0xc7fa86424d41453fl,
16774             0x19490b7672eedd06l },
16775           { 0xc883e45337d22d6al,0x8e6e38e4a9009f96l,0x44e2811eb1c560c6l,
16776             0x8a0021bf4439cfcfl },
16777           0 },
16778         /* 27 << 16 */
16779         { { 0xba768f8b7615a327l,0x6c8b320d7b15bbe7l,0x5d8d5bcbaaa9ca64l,
16780             0x19a2b99f3d13cdfdl },
16781           { 0x858288a26f172e10l,0x2412a4da37a00f94l,0xfc67fd2edaa7f6c6l,
16782             0x4aea0eadafa2a5c5l },
16783           0 },
16784         /* 28 << 16 */
16785         { { 0x5c80ccef6cd77b30l,0x49978299ec99b6d0l,0x6bf4485eb939d335l,
16786             0xc53e61ab86d7c147l },
16787           { 0xdd948052fb601dddl,0x34c5eb393511dd48l,0x91f5c67600e6f61cl,
16788             0x33f1b525b1e71f34l },
16789           0 },
16790         /* 29 << 16 */
16791         { { 0xb4cb4a151d2dad36l,0x709a61631e60b60dl,0x2f18f3bd932ece4fl,
16792             0x70f495a8e92368bel },
16793           { 0x6e88be2bb7aeaa6fl,0x4efebd9ae1bf1d6el,0x49925e6e44e94993l,
16794             0x33b7aba0ef0517dcl },
16795           0 },
16796         /* 31 << 16 */
16797         { { 0x69ce1f207afe6c37l,0xe1148ba984f68db5l,0x32668bdc2c594a8al,
16798             0x2cb60d3063ac4fb3l },
16799           { 0x5e6efe1dd9e036f8l,0x917cb2a27db4739fl,0x70ea601ded4e0b5el,
16800             0x5928f068ae7ac8a6l },
16801           0 },
16802         /* 33 << 16 */
16803         { { 0x9e4ad0073f2d96abl,0x51a9697f2d058c03l,0xcd5c0a7522d1e795l,
16804             0xaa1a121c2ac4f019l },
16805           { 0xa837c14c3e3631f4l,0x6a997381236a5576l,0xb305e7db2753782bl,
16806             0xae561b0237243afbl },
16807           0 },
16808         /* 34 << 16 */
16809         { { 0x20176baca787897bl,0x057b8b979a9f67d9l,0xe7d5c4f761e14e09l,
16810             0x8e4856901e6cd6d0l },
16811           { 0x3eeffbba9b925d52l,0xe651a5383046927bl,0x02326d1fe92d4352l,
16812             0xad2d6493d697369fl },
16813           0 },
16814         /* 35 << 16 */
16815         { { 0xe9de299c548c4ca5l,0x66f64ef54be3bde3l,0xcf6d39ebf2d5ebc9l,
16816             0x665ca727898953e1l },
16817           { 0x521ec435e33ac1b4l,0x8418fa7534ab2b82l,0x94d6c0c4771a3a87l,
16818             0x21feb6054859ee22l },
16819           0 },
16820         /* 36 << 16 */
16821         { { 0xde7153f8eed9dd1dl,0xba09ad1152ebcb2el,0xaa41b015e1843fb6l,
16822             0xf933a2abdd4ce6f0l },
16823           { 0x777f834313f6b83fl,0x28df7da4db113a75l,0x6d7d1b3c72a5d143l,
16824             0x6f789698966c6ddfl },
16825           0 },
16826         /* 37 << 16 */
16827         { { 0x57d11ed7a95e704el,0x7d5ac6dc380ad582l,0xb175421d5ab6e377l,
16828             0x4e383b0ba760dd4dl },
16829           { 0xde07b81a352b6cb3l,0x342abe825c2e1704l,0x90988de20dd48537l,
16830             0x4a7fec0544821591l },
16831           0 },
16832         /* 39 << 16 */
16833         { { 0xb0e4d17c90a94eb7l,0x27555067aceb0176l,0x587576e15c38c4e2l,
16834             0xe647d9dd445f2880l },
16835           { 0x00beb2f5ca502f83l,0x4e89e638c44767c7l,0xbef361da154a5757l,
16836             0x2dc632a2dc0675f2l },
16837           0 },
16838         /* 40 << 16 */
16839         { { 0xed439a33a72ba054l,0xa3170a15ead265bal,0xcf7eb903fe99a58el,
16840             0xcf6db0c633d80c26l },
16841           { 0xd031255ef613e71al,0x12ccbe5718ca255cl,0xdd21d0537808c40dl,
16842             0xf5488ebc3af2be6bl },
16843           0 },
16844         /* 41 << 16 */
16845         { { 0x589a125ac10f8157l,0x3c8a15bde1353e49l,0x7d9bbd0c22ce2dd0l,
16846             0xdfcd019211ac7bb1l },
16847           { 0x0e1d67151193c5b1l,0xd4de115ab0e8c285l,0x0b3e94c2272c29fel,
16848             0xea640843c8213581l },
16849           0 },
16850         /* 43 << 16 */
16851         { { 0x7a01aeed6aca2231l,0x8135cf2ace80abbel,0xdc1a41b2ae5fdec9l,
16852             0xde34ea4da0174364l },
16853           { 0xa5104e453cf8b845l,0x4b6fd986675ba557l,0x4bc750af29c8cb4al,
16854             0x8bebb266583f9391l },
16855           0 },
16856         /* 44 << 16 */
16857         { { 0x47110d7c1be3f9c5l,0x12b9e4485eadb4ddl,0x6e8c09870b713d41l,
16858             0xe1e20356733d56ael },
16859           { 0xe68d6bab445ea727l,0x9ef4f6eac934a1a4l,0xe0155547f8cef1c3l,
16860             0xdb5c3909159bdcbfl },
16861           0 },
16862         /* 45 << 16 */
16863         { { 0xef0449cb32fa8a37l,0x95071f5dcd246405l,0x1c56ad776c598891l,
16864             0x981781de0fa9cd42l },
16865           { 0x0f93d456d29c0500l,0x43aa7bc1483f52c4l,0xd7c8736666c8abadl,
16866             0x47552530ea5050efl },
16867           0 },
16868         /* 46 << 16 */
16869         { { 0x40dd9ca9fa9b8d3dl,0xf27b7bc056da41d9l,0x87967f4b66db8845l,
16870             0xf6918c9444de6bc7l },
16871           { 0x4d76d51135568d4dl,0x7ab18f9a40e7fa5al,0x069a44bba5bbbdc6l,
16872             0x19e6c04bb4c8f808l },
16873           0 },
16874         /* 47 << 16 */
16875         { { 0x5fd2501108b2b6c7l,0xcce85a3ec41cad21l,0x90857daffdd70387l,
16876             0x7a679062c63789f4l },
16877           { 0x9c462134ef8666e2l,0xcb7dba108c8505bdl,0x7c4a7e2fc610f2e7l,
16878             0x22906f65d68315f9l },
16879           0 },
16880         /* 48 << 16 */
16881         { { 0xf2efe23d442a8ad1l,0xc3816a7d06b9c164l,0xa9df2d8bdc0aa5e5l,
16882             0x191ae46f120a8e65l },
16883           { 0x83667f8700611c5bl,0x83171ed7ff109948l,0x33a2ecf8ca695952l,
16884             0xfa4a73eef48d1a13l },
16885           0 },
16886         /* 49 << 16 */
16887         { { 0x41dd38c1118de9a0l,0x3485cb3be2d8f6f5l,0xd4bac751b1dcc577l,
16888             0x2148d93fed12ea6bl },
16889           { 0xde3504729da8cb18l,0x6046daf89eb85925l,0xddbc357b942b1044l,
16890             0x248e7afe815b8b7cl },
16891           0 },
16892         /* 51 << 16 */
16893         { { 0xd4bb77b3acb21004l,0xe9f236cf83392035l,0xa9894c5c52133743l,
16894             0x4d6112749a7b054al },
16895           { 0xa61675ea4ba2a553l,0x59c199681da6aa78l,0x3988c36590f474del,
16896             0x73e751bbd001be43l },
16897           0 },
16898         /* 52 << 16 */
16899         { { 0x97cacf846604007dl,0x1e92b4b22d47a9f1l,0x858ae0d6374ed165l,
16900             0x4c973e6f307aefb8l },
16901           { 0x6f524a238a10eb72l,0x7b4a92a9eb2849d6l,0x3678bda42fe91eddl,
16902             0x56092acd7c0fc35cl },
16903           0 },
16904         /* 53 << 16 */
16905         { { 0x93bea99b1b9b43c4l,0x2f6af6f3e145fda2l,0x862f0607278adf0dl,
16906             0x647be08398456ccal },
16907           { 0xce79ba1487250c28l,0x1c1c4fc8efedab42l,0x966f612af90caa8dl,
16908             0xb1a2cf6e72c440f8l },
16909           0 },
16910         /* 55 << 16 */
16911         { { 0x2fca1be45b3b7dd5l,0x453c19853c211bcal,0x313cb21969a46484l,
16912             0x66082837414bd5dfl },
16913           { 0xab7a97bf2ac1cdf7l,0x45cd1792676d778fl,0x42fb6c4f6a5b560al,
16914             0x45747fe30b8f17e9l },
16915           0 },
16916         /* 57 << 16 */
16917         { { 0x38b6db6235db6218l,0xa10cdfe1bb54bacal,0x56fd4a1d610f7f6bl,
16918             0xc4bea78b76d183d7l },
16919           { 0xc0e6ca9fbf730d26l,0x1b1e271aed6cf535l,0x6fef275faadbe375l,
16920             0xfa2e8da903e489bal },
16921           0 },
16922         /* 59 << 16 */
16923         { { 0x6f79d25c7c4626ecl,0xfe27690232d55d6cl,0x3f5c5768afa19ce3l,
16924             0xa1373777f8834739l },
16925           { 0x761d67a8a4ce960al,0xb34de1ea459e656al,0x8725b0f09db6f269l,
16926             0x75316f250dbfe22el },
16927           0 },
16928         /* 60 << 16 */
16929         { { 0x091d5b631a093b40l,0xb85c1c075862f24al,0xc5d74eb53e8f85bfl,
16930             0xf51c7746cab22456l },
16931           { 0xc25cb8d9e761da89l,0x2670ec2fc0f028b5l,0x873fd30d2db9af5cl,
16932             0x3d0f1ea18262565el },
16933           0 },
16934         /* 61 << 16 */
16935         { { 0x8f9492c261c23b3cl,0xd366baeb631688a4l,0x55e759e78093bb07l,
16936             0xf6d0eaf47218f765l },
16937           { 0xb8a174ff54ca583bl,0x790f10e0b23d14cel,0xfebe7333be83cbbal,
16938             0xfeb6dcc5eed67536l },
16939           0 },
16940         /* 63 << 16 */
16941         { { 0x175b3bacce027e5bl,0xe0728a99c48252c4l,0x0be25d4507a39c7cl,
16942             0xcb9c2d3aba8e8c72l },
16943           { 0x6185a48d1abd459al,0x27207feadff9a27bl,0xfd92e8231d34393fl,
16944             0x738511534351d965l },
16945           0 },
16946         /* 64 << 16 */
16947         { { 0xfcde7cc8f43a730fl,0xe89b6f3c33ab590el,0xc823f529ad03240bl,
16948             0x82b79afe98bea5dbl },
16949           { 0x568f2856962fe5del,0x0c590adb60c591f3l,0x1fc74a144a28a858l,
16950             0x3b662498b3203f4cl },
16951           0 },
16952         /* 65 << 16 */
16953         { { 0x8ede0fcdc11682eel,0x41e3faa1b2ab5664l,0x58b2a7dc26a35ff5l,
16954             0x939bcd6b701b89e9l },
16955           { 0x55f66fd188e0838fl,0x99d1a77b4ff1f975l,0x103abbf72e060cc5l,
16956             0x91c77beb6bc4bdbbl },
16957           0 },
16958         /* 71 << 16 */
16959         { { 0xcd048abca380cc72l,0x91cab1bbd0e13662l,0x68115b18686de4cel,
16960             0x484724e63deccbf5l },
16961           { 0xf164ba54f176137el,0x5189793662ab2728l,0x6afdecf9b60a5458l,
16962             0xca40472d0aabafd2l },
16963           0 },
16964         /* 77 << 16 */
16965         { { 0x7a9439183b98d725l,0x1c1763e8ece1ea3cl,0x45c44ef639840476l,
16966             0x689271e69c009133l },
16967           { 0xa017405f56a51fe1l,0xd54cc7253e0d0970l,0x212ad075cfe09e8bl,
16968             0x999f21c37af7bf30l },
16969           0 },
16970         /* 83 << 16 */
16971         { { 0xdc2a2af12bf95f73l,0xb88b4ca76de82cbel,0xa31a21aaecb8e84el,
16972             0x86d19a601b74f5bel },
16973           { 0xc68bf64406008019l,0xe52ab50e9431c694l,0x6375463d627ab11cl,
16974             0xdd3eeaa03c0ef241l },
16975           0 },
16976         /* 89 << 16 */
16977         { { 0x608d9cb323f1caf8l,0x95069450b1700741l,0xe3132bd2bc2fa7aal,
16978             0xc4f363e7f64e4f06l },
16979           { 0xb059c4191ca888c2l,0x1004cb1f8d17bf5dl,0x6b6ba6f934ea5711l,
16980             0x071d94abd79b2c8al },
16981           0 },
16982         /* 95 << 16 */
16983         { { 0xc7ef9b42d147a39dl,0x36dd5d770a10cd5bl,0x3bf6cc77d0eea34bl,
16984             0x60c84591197479c7l },
16985           { 0xf95860ac50ba50edl,0xe1c94a8dc4cdc8fal,0x780818d685e24a23l,
16986             0x1950e3c0c8abbd27l },
16987           0 },
16988         /* 101 << 16 */
16989         { { 0x9908c694ae04778el,0x2e37a6790a0d36ffl,0x212a340f52b067bdl,
16990             0xec89c9fad080b914l },
16991           { 0x920dc2f005ab8a23l,0xecff5c78655e8984l,0x80eedd34f66211acl,
16992             0xa7a56366ef58d4d8l },
16993           0 },
16994         /* 107 << 16 */
16995         { { 0x4f95debe2bca42f0l,0xf0346307844334d2l,0x7003a60521d600aal,
16996             0x1eb98c6365c5248al },
16997           { 0x6757b3822fa202cal,0x32765d399fb12f36l,0xe851b476d7b44c9al,
16998             0x27cd7d1b4e0bab4cl },
16999           0 },
17000         /* 113 << 16 */
17001         { { 0xd0c1f7c9c43ea1a3l,0x73d944f49f42907dl,0xd113f34619352c92l,
17002             0x86a1ad53b149cdc1l },
17003           { 0x32c34e8f848d1be4l,0xba8afda7c3d9360bl,0x17e8bc32eea8bf96l,
17004             0x3174cae499c87febl },
17005           0 },
17006         /* 116 << 16 */
17007         { { 0x4b215f016671b47el,0xb67633ca4a8dae2al,0x2915120f79fd3cdbl,
17008             0xc1f8a06fb064e6del },
17009           { 0xf4d5368cc1d57420l,0x6ada51a8e18de475l,0xa0f0d47cc749d4b0l,
17010             0xabfa2c0074526aa5l },
17011           0 },
17012         /* 119 << 16 */
17013         { { 0xf752f6659e5ce44fl,0x7b97ebfa189d35ecl,0x9540cbb90fc609abl,
17014             0x19c1dc6999632cc8l },
17015           { 0x0a957700e08ca9a8l,0xb0cd0ab7a3246a4el,0xca687cfcc8d6a544l,
17016             0xb6281f0035f82a77l },
17017           0 },
17018         /* 125 << 16 */
17019         { { 0x547027012b818036l,0xf72315f729c8f14cl,0x95f1bc15230e74bel,
17020             0x2e7c492f1abe20d4l },
17021           { 0xe1ea8b1cd7e78ab1l,0xc3f6ba59043585adl,0xac404ea9477ac053l,
17022             0xaa6872914ec6d0e3l },
17023           0 },
17024     },
17025     {
17026         /* 0 << 24 */
17027         { { 0x00, 0x00, 0x00, 0x00 },
17028           { 0x00, 0x00, 0x00, 0x00 },
17029           1 },
17030         /* 1 << 24 */
17031         { { 0xd9d0c8c4868af75dl,0xd7325cff45c8c7eal,0xab471996cc81ecb0l,
17032             0xff5d55f3611824edl },
17033           { 0xbe3145411977a0eel,0x5085c4c5722038c6l,0x2d5335bff94bb495l,
17034             0x894ad8a6c8e2a082l },
17035           0 },
17036         /* 3 << 24 */
17037         { { 0xd1e059b21994ef20l,0x2a653b69638ae318l,0x70d5eb582f699010l,
17038             0x279739f709f5f84al },
17039           { 0x5da4663c8b799336l,0xfdfdf14d203c37ebl,0x32d8a9dca1dbfb2dl,
17040             0xab40cff077d48f9bl },
17041           0 },
17042         /* 4 << 24 */
17043         { { 0xf2369f0b879fbbedl,0x0ff0ae86da9d1869l,0x5251d75956766f45l,
17044             0x4984d8c02be8d0fcl },
17045           { 0x7ecc95a6d21008f0l,0x29bd54a03a1a1c49l,0xab9828c5d26c50f3l,
17046             0x32c0087c51d0d251l },
17047           0 },
17048         /* 5 << 24 */
17049         { { 0xf61790abfbaf50a5l,0xdf55e76b684e0750l,0xec516da7f176b005l,
17050             0x575553bb7a2dddc7l },
17051           { 0x37c87ca3553afa73l,0x315f3ffc4d55c251l,0xe846442aaf3e5d35l,
17052             0x61b911496495ff28l },
17053           0 },
17054         /* 7 << 24 */
17055         { { 0x4bdf3a4956f90823l,0xba0f5080741d777bl,0x091d71c3f38bf760l,
17056             0x9633d50f9b625b02l },
17057           { 0x03ecb743b8c9de61l,0xb47512545de74720l,0x9f9defc974ce1cb2l,
17058             0x774a4f6a00bd32efl },
17059           0 },
17060         /* 9 << 24 */
17061         { { 0x327bc002b0131e5bl,0x1739e6d5cb2514d9l,0xc8cbdafe55a81543l,
17062             0x5bb1a36ce1137243l },
17063           { 0x205da3c517325327l,0xc35c1a36515a057el,0xf00f64c942925f9bl,
17064             0xbd14633cb7d59f7al },
17065           0 },
17066         /* 10 << 24 */
17067         { { 0xae2ad171656e8c3al,0xc0e2a4631acd0705l,0x006f6a8aa0b6055cl,
17068             0xaf4513d72b65a26el },
17069           { 0x3f549e14d616d5bcl,0x64ee395571253b1fl,0xe8b10bc1b8ce243al,
17070             0xbcbeace5913a4e77l },
17071           0 },
17072         /* 11 << 24 */
17073         { { 0x47c1004341f37dbdl,0x96eccae36168ecf6l,0x65bde59d1ca46aa3l,
17074             0x38a7027ab8698ffal },
17075           { 0xa2b89dc86dc34437l,0x5a0a118d43a4153fl,0x9e330a861ce22fd8l,
17076             0x28382af6b3bbd3bcl },
17077           0 },
17078         /* 13 << 24 */
17079         { { 0x0b2e27c0d81e0271l,0xa67a7596117a317cl,0x17f08928a6723d99l,
17080             0x71a75681485310a3l },
17081           { 0x90465462afb66ca9l,0x185e97ccfbbe229dl,0x6a1a606addad8fc2l,
17082             0x2431f316b3c797cfl },
17083           0 },
17084         /* 15 << 24 */
17085         { { 0x4703401193529432l,0x1f106bdd30743462l,0xabfb9964cd66d8cal,
17086             0x934d9d5ae9bdadd5l },
17087           { 0x5976d815908e3d22l,0x344a362f28e057bdl,0xf92cdadc5443dfb3l,
17088             0x001297adf089603bl },
17089           0 },
17090         /* 16 << 24 */
17091         { { 0x7f99824f20151427l,0x206828b692430206l,0xaa9097d7e1112357l,
17092             0xacf9a2f209e414ecl },
17093           { 0xdbdac9da27915356l,0x7e0734b7001efee3l,0x54fab5bbd2b288e2l,
17094             0x4c630fc4f62dd09cl },
17095           0 },
17096         /* 17 << 24 */
17097         { { 0x4a2fce605044066bl,0x904a019cfa3a47f4l,0xba81ea9c0c5c0a60l,
17098             0xd7e4ea0d96c098bdl },
17099           { 0xefe700419cd50a02l,0xc0c839d42d7f048cl,0xe2daf264e09b561fl,
17100             0x0cbc13185034b18bl },
17101           0 },
17102         /* 19 << 24 */
17103         { { 0x11e5f2e388323f7al,0xe07a74c2927584cdl,0x1e774b3495613d2dl,
17104             0x9c9b52c52c787488l },
17105           { 0x3cdd3c3ebe421f08l,0x5ff7819e223e3d5fl,0xba8739b2c1da09b9l,
17106             0x6b7263164e8b491bl },
17107           0 },
17108         /* 21 << 24 */
17109         { { 0xb5afd13ca0943befl,0xd651772957abb1ccl,0x9d5a52dc9b61b5bcl,
17110             0x85cefaa6806e31cdl },
17111           { 0xab84257a720a1deal,0x6a60261bced70d35l,0xc023f94db9d6da61l,
17112             0x947f7eec54a0ae0el },
17113           0 },
17114         /* 23 << 24 */
17115         { { 0xc3b787569f83b787l,0xd6d249263694ddd7l,0x58d248945d70a02el,
17116             0xac16670e8c278c6al },
17117           { 0x71a94d58e370b6e6l,0xe4d763840253db05l,0x99b1c98814b32cfel,
17118             0x4e6bd870cc78cc95l },
17119           0 },
17120         /* 25 << 24 */
17121         { { 0xf5f7ca79c8b63614l,0xf3bfb2158af4903cl,0x2bdb9f5496d47bd3l,
17122             0xd6e715300e8a63bal },
17123           { 0x67e90a497a93bec4l,0x8613478b8c1e63eel,0xe36bd9c8f2dde561l,
17124             0x681486518a768689l },
17125           0 },
17126         /* 27 << 24 */
17127         { { 0xef617a9494aa531cl,0x9ac35e2fd6f4ad87l,0xbcd2a047122468fbl,
17128             0xbd7a423fef7c5ca6l },
17129           { 0xab58cb52064c8040l,0x93ef4ed54a644716l,0xf7d17097c32cd48dl,
17130             0xb249a173d17fcf42l },
17131           0 },
17132         /* 28 << 24 */
17133         { { 0x66fe0fffe298cdf5l,0x3f61bea47b2e51b6l,0x7d372117bad3afa4l,
17134             0x6521a09cef656e2fl },
17135           { 0xb3b8c966e8a58fe7l,0x25203a115a47ebc7l,0xfe81588d5c4be573l,
17136             0x6132e2f31f49a03cl },
17137           0 },
17138         /* 29 << 24 */
17139         { { 0xbbe5c108b7a7ecc4l,0x62a5a78ebfd22e4cl,0xb7974033df188bd2l,
17140             0xcf11deea4df7d1ael },
17141           { 0x99cc774a53ace3eal,0xe0373a71105cc1f6l,0xd751987f133d7a20l,
17142             0xab86ee04ae215871l },
17143           0 },
17144         /* 31 << 24 */
17145         { { 0x2094f9a280cd10e6l,0x045232aa7b8a0da7l,0x969a81b69c03244el,
17146             0x1293b4ca7e98d955l },
17147           { 0x1631421dd68f3ab0l,0xa0106422c3738c82l,0xc5f43845f82c4ff9l,
17148             0xb479acbe1aa0f58fl },
17149           0 },
17150         /* 33 << 24 */
17151         { { 0xf1db0267f67683cfl,0xa6b13c9e44ce009dl,0x04b4eed505884a69l,
17152             0xf2ff9c16d9087a0bl },
17153           { 0x2c53699b3e35b4a6l,0x5020c0142369afb8l,0xf83bfe0095be37f1l,
17154             0xd300d8c553b29d80l },
17155           0 },
17156         /* 34 << 24 */
17157         { { 0x16893055811cf4bbl,0x580dd1e55aeb5027l,0xcaf47fba5ae3c71cl,
17158             0xde79698129ebbb07l },
17159           { 0xbed1db33d262cdd3l,0x78315e3748c7313bl,0xfc9561f02fe1368dl,
17160             0xe0209698ccacacc7l },
17161           0 },
17162         /* 35 << 24 */
17163         { { 0xd61af89a781ece24l,0xf3b90626008f41e9l,0xd715dbf7c5693191l,
17164             0x8d6c05de6f299edel },
17165           { 0xf18d62637ca50aacl,0x7987bf5cb0dd5fdcl,0x424136bd2cfa702bl,
17166             0xaa7e237ded859db2l },
17167           0 },
17168         /* 36 << 24 */
17169         { { 0xde7169e4e5d41796l,0x6700333e33c0a380l,0xe20b95780343a994l,
17170             0xa745455e1fb3a1c3l },
17171           { 0x97e0ff88ce029a7fl,0x3b3481c976e384bcl,0x028b339dddad5951l,
17172             0xa1fdcdbae4b95cfcl },
17173           0 },
17174         /* 37 << 24 */
17175         { { 0xcc9221baed20c6adl,0xf2619a51fa9c73aal,0xfc2cff847d7f55a5l,
17176             0xd56c23d65f01d4dal },
17177           { 0x6d20f88cb3d84d5fl,0x048825f75dcc615dl,0x73634d3f85631a6el,
17178             0xa57a02e3ad7b2e2dl },
17179           0 },
17180         /* 39 << 24 */
17181         { { 0x067a8dcf08aa81ffl,0x62948258c23f3d16l,0xb61bd04316f2fe7bl,
17182             0xf250f769b6a766b1l },
17183           { 0x32df97246d0b241el,0xb736e4bb714e5f88l,0x50da15022c1d40d7l,
17184             0x013e0edebdd285a4l },
17185           0 },
17186         /* 40 << 24 */
17187         { { 0x1b92c3a0181a5d8fl,0x6429531d9adb77c7l,0x629152b53af710eel,
17188             0x4e3f27370bd5647el },
17189           { 0xfb7c392b77553c7dl,0xa930abacefe78c87l,0xf80c8cd6a05a6991l,
17190             0x751469b71be5f6f5l },
17191           0 },
17192         /* 41 << 24 */
17193         { { 0xf89f2b0b3e2f2af0l,0x52f634099eefc39al,0x505005c679906cb6l,
17194             0x820c2216b2de0b1el },
17195           { 0x96f0f2831f20ad7al,0xcd33125c718ffcb0l,0xf6130ef278f0c578l,
17196             0x4cda2471d0b76b95l },
17197           0 },
17198         /* 43 << 24 */
17199         { { 0x611dd83f39485581l,0x96c47051803e1b20l,0xefacc736830f44c7l,
17200             0x5588d8ce688b12bal },
17201           { 0x44f4edf3eee70fadl,0x1026dfd8869539f7l,0xa4c146ee8ddb0e00l,
17202             0x9f4f55816efb41c8l },
17203           0 },
17204         /* 44 << 24 */
17205         { { 0x6036ed0236cbace7l,0x5a70e4abada837ddl,0xf06918aff10b2fefl,
17206             0x08a8a9f69fd31590l },
17207           { 0x6c4a1ba6916af88dl,0x4868bc1466016037l,0x06d345af164228a9l,
17208             0x2c1961d19b550dd9l },
17209           0 },
17210         /* 45 << 24 */
17211         { { 0x8b72775c6851f0acl,0x7827242bd70f5975l,0x2de91f1e34db4a6fl,
17212             0x586bf3d58538f5eel },
17213           { 0xf0a15aed25d9a09bl,0x43018e56f74deb46l,0xc2af1ad0f50e0e67l,
17214             0x49cc9528b10cff6fl },
17215           0 },
17216         /* 46 << 24 */
17217         { { 0x05eb146c9d55c425l,0xe2b557ccbc62261fl,0x2a716301bd077089l,
17218             0x83a63c81e0527d02l },
17219           { 0x055ff7f8a0d9203bl,0x05d09f0525bf5a04l,0x2e44545fb3eb0b30l,
17220             0xed7c57c4d279a1adl },
17221           0 },
17222         /* 47 << 24 */
17223         { { 0x6928f6e45e0ebdd5l,0xd7e44ddf092d233bl,0xe7148066d1b7026fl,
17224             0xf645a2e53d5f25c3l },
17225           { 0x6eeb25ee58ff9eb4l,0x60f1fcf737f87ebfl,0x9eaaf1e5c4679c70l,
17226             0x4609fb13b7b7dc7el },
17227           0 },
17228         /* 48 << 24 */
17229         { { 0xae915f5d5fa067d1l,0x4134b57f9668960cl,0xbd3656d6a48edaacl,
17230             0xdac1e3e4fc1d7436l },
17231           { 0x674ff869d81fbb26l,0x449ed3ecb26c33d4l,0x85138705d94203e8l,
17232             0xccde538bbeeb6f4al },
17233           0 },
17234         /* 49 << 24 */
17235         { { 0x27f317af2b33987fl,0xd2d3cf5d51e59588l,0x333999bd031f27c9l,
17236             0x6ddfa3f22e0a3306l },
17237           { 0x23e0e651990041b0l,0xf028aba1585837acl,0x1c6ad72b25226f53l,
17238             0xf243c991d1fca64al },
17239           0 },
17240         /* 51 << 24 */
17241         { { 0x72b8a13272cbae1fl,0xfe0b1c4fbfdbd64al,0x98bc7876c5e76921l,
17242             0x51c726bfdb1f5af7l },
17243           { 0x97e88a842c186e8bl,0x9ed99516ed8eb7b4l,0x3e54a17dafc818ebl,
17244             0xfcfbf25a1e8f77d8l },
17245           0 },
17246         /* 52 << 24 */
17247         { { 0x7780d7d68f7d5c6el,0x6725b49a454101e6l,0xceddc26586b0770cl,
17248             0xc26624615666f504l },
17249           { 0x16b77477ce040f75l,0x13f9113c293f8b45l,0xff0cfa07e2dcc91el,
17250             0x1948d8bd41c202f5l },
17251           0 },
17252         /* 53 << 24 */
17253         { { 0x4c6ae39a1dfbe13al,0xafb1e5c46be9c200l,0x39e728d168bb08c3l,
17254             0xc794b905acc9166fl },
17255           { 0x1cb0dec2d9c7c3e4l,0xc4c3053289f14d65l,0x4af80801a6a9d609l,
17256             0x79d7e82de0d6ab24l },
17257           0 },
17258         /* 55 << 24 */
17259         { { 0xb905c6af8ad4cf6el,0x785590b0f6d1be13l,0x78f402c2a0ef76bel,
17260             0x739b22ea5c19a40bl },
17261           { 0xd4d3262553d596b6l,0x01598eb4d571666bl,0xf8dc150b8173486al,
17262             0xd8aa43af15e94f09l },
17263           0 },
17264         /* 57 << 24 */
17265         { { 0xcfa387cd984393b5l,0x1645659e21a1bf92l,0xb4ab3966dd46c7eel,
17266             0xcf8c296d89482623l },
17267           { 0x72e4d01cf976b4c0l,0x44ad07e8fa0fa5ebl,0xd6c82681b486fdd2l,
17268             0x2d9074f89b8845b4l },
17269           0 },
17270         /* 59 << 24 */
17271         { { 0x96e4fc08d96862dbl,0xf9e29bb6c50c14b2l,0xfedaad64f8f9be75l,
17272             0xab6b2d79ae9e1274l },
17273           { 0x033e3eb58d84dec0l,0xc136904ccbd113e7l,0xb82b0aed6061f289l,
17274             0x3476d9247b699e25l },
17275           0 },
17276         /* 60 << 24 */
17277         { { 0x8fb5ceeb969231dcl,0xaed13be1686ff6cdl,0x71d7c67bdd69db87l,
17278             0x49613e08fb53f33al },
17279           { 0x2899729ead8e802fl,0x83bfde49d1982a1dl,0x675c45ea878239d2l,
17280             0xb7bf59cd0d8240d3l },
17281           0 },
17282         /* 61 << 24 */
17283         { { 0x853d8cd1baf53b8bl,0x9c73d04cff95fc18l,0xae8a94412d1d6aacl,
17284             0xd8a15ce901500b70l },
17285           { 0xaef813499aacba59l,0x2cd2ba0ac493cd8dl,0x01c37ee1f398f034l,
17286             0xed72d51d0f7299fcl },
17287           0 },
17288         /* 63 << 24 */
17289         { { 0x2c204940e7592fb1l,0xcc1bb19b49366f08l,0x31855e8a7c927935l,
17290             0x16f7e9a2c590b81dl },
17291           { 0xa5fbb7c1ed8df240l,0x7b5204122de2d7f5l,0x7eb1eb989a637588l,
17292             0x5ef4eca89540d2e8l },
17293           0 },
17294         /* 64 << 24 */
17295         { { 0x55d5c68da61a76fal,0x598b441dca1554dcl,0xd39923b9773b279cl,
17296             0x33331d3c36bf9efcl },
17297           { 0x2d4c848e298de399l,0xcfdb8e77a1a27f56l,0x94c855ea57b8ab70l,
17298             0xdcdb9dae6f7879bal },
17299           0 },
17300         /* 65 << 24 */
17301         { { 0x811e14dd9594afb8l,0xaf6c1b10d349124al,0x8488021b6528a642l,
17302             0xecf6834341cf1447l },
17303           { 0x7a40acb756924446l,0xd9c11bbed98ec4cfl,0x0cef00bfb2bff163l,
17304             0xfaaad8015432803bl },
17305           0 },
17306         /* 71 << 24 */
17307         { { 0x5a217d5e6b075cbel,0x7ef88d1dc89b513bl,0xb6d015da0531c93bl,
17308             0x477b502a6333834al },
17309           { 0x4655e48b2fb458d5l,0x93f21a7cb7674ca8l,0xa0616786502d1f3al,
17310             0x82d16d17f26bb6ccl },
17311           0 },
17312         /* 77 << 24 */
17313         { { 0x3d995aa9183c1688l,0xa125906c3766d2e8l,0x23ed7871c5f10d5bl,
17314             0xdfe1e1cc6df80368l },
17315           { 0x8bfcb54271eaae2cl,0xe94e6f910945a7bbl,0xd543ef90862f650al,
17316             0x0dc043b803eed66bl },
17317           0 },
17318         /* 83 << 24 */
17319         { { 0x0c6a5620060d2ccdl,0xcd8200e37a8a03a4l,0x6018d304793867e6l,
17320             0xad23dd61a74d054dl },
17321           { 0x5a856faeebc21eb4l,0x66be16714b5cd7dbl,0xe0d0441ec75f8c9dl,
17322             0xb80ca9ecf90dbc6dl },
17323           0 },
17324         /* 89 << 24 */
17325         { { 0xbd6902ccd24692cbl,0xbcce6bbc21920408l,0x40f120ca55dec4c5l,
17326             0xd9f1f5ef5361c8b3l },
17327           { 0x535d368226935dffl,0x9635447b01a9998al,0x8c4ec40d99e36d12l,
17328             0xbaeef8912b793369l },
17329           0 },
17330         /* 95 << 24 */
17331         { { 0xded3a51c1cd887ebl,0xd43225568376515cl,0xdaf3a2271ca7c097l,
17332             0x089156fdecd4d90cl },
17333           { 0x2b354810ca0727c9l,0xb7257c1966c19d8cl,0x5e68a379432d5072l,
17334             0x75c04c2443e585c7l },
17335           0 },
17336         /* 101 << 24 */
17337         { { 0xb5ba2a8fe5e0952fl,0x2c2d086811040b4el,0x27448bd5f818e253l,
17338             0x720f677987a92c85l },
17339           { 0x2c9b2367b9d035fal,0xf18ad8ce16c15ab9l,0xd65a360841bd57eel,
17340             0xeb4b07c9ff6ae897l },
17341           0 },
17342         /* 107 << 24 */
17343         { { 0xcffb6d71d38589acl,0x812372920fa509d3l,0x94db5ba6e54725e8l,
17344             0x1ad2b4206cfbb825l },
17345           { 0x8592c1f238cfb9f2l,0xbe8e917e0eec6a27l,0x53921bfe9d93d42fl,
17346             0x1aa95e6269454a35l },
17347           0 },
17348         /* 113 << 24 */
17349         { { 0xc25e8934d898049dl,0xeeaf4e6d3bb3d459l,0xc3ac44447d29ad10l,
17350             0xccdf9fcbcef8fa04l },
17351           { 0x1d995a3fb9679cb9l,0x3d6c5eab46fabc14l,0xd3849ff066385d4dl,
17352             0xc0eb21bacff08be2l },
17353           0 },
17354         /* 116 << 24 */
17355         { { 0x8213c71e90d13fd6l,0x114321149bb6b733l,0xaaf8037880ac4902l,
17356             0xb24e046b555f7557l },
17357           { 0x5f6ed2881db79832l,0xd493a758ac760e5dl,0xbc30a2a7a1c0f570l,
17358             0xa5009807161174e3l },
17359           0 },
17360         /* 119 << 24 */
17361         { { 0x9e9b864a6889e952l,0xee908932f352f31al,0xe421f2423166b932l,
17362             0x6dd4aa3b7ddbdb35l },
17363           { 0x553cc5639e8b88a4l,0x05457f171f04704dl,0x1dcc3004c9554e6bl,
17364             0x3a4a3a253f1b61e7l },
17365           0 },
17366         /* 125 << 24 */
17367         { { 0x7ac0a5e7c56e303al,0x7c7bab64037b0a19l,0x11f103fcc8d29a2bl,
17368             0x7d99dc46cf0b1340l },
17369           { 0x0481588ceffba92el,0x8a817356b04e77bcl,0x19edf4dbce1b708dl,
17370             0xa2a1f7a6e6f9d52cl },
17371           0 },
17372     },
17373     {
17374         /* 0 << 32 */
17375         { { 0x00, 0x00, 0x00, 0x00 },
17376           { 0x00, 0x00, 0x00, 0x00 },
17377           1 },
17378         /* 1 << 32 */
17379         { { 0x202886024147519al,0xd0981eac26b372f0l,0xa9d4a7caa785ebc8l,
17380             0xd953c50ddbdf58e9l },
17381           { 0x9d6361ccfd590f8fl,0x72e9626b44e6c917l,0x7fd9611022eb64cfl,
17382             0x863ebb7e9eb288f3l },
17383           0 },
17384         /* 3 << 32 */
17385         { { 0xa18f07e0e90fb21el,0x00fd2b80bba7fca1l,0x20387f2795cd67b5l,
17386             0x5b89a4e7d39707f7l },
17387           { 0x8f83ad3f894407cel,0xa0025b946c226132l,0xc79563c7f906c13bl,
17388             0x5f548f314e7bb025l },
17389           0 },
17390         /* 4 << 32 */
17391         { { 0x0ee6d3a7c35d8794l,0x042e65580356bae5l,0x9f59698d643322fdl,
17392             0x9379ae1550a61967l },
17393           { 0x64b9ae62fcc9981el,0xaed3d6316d2934c6l,0x2454b3025e4e65ebl,
17394             0xab09f647f9950428l },
17395           0 },
17396         /* 5 << 32 */
17397         { { 0xc1b3d3d331b85f09l,0x0f45354aa88ae64al,0xa8b626d32fec50fdl,
17398             0x1bdcfbd4e828834fl },
17399           { 0xe45a2866cd522539l,0xfa9d4732810f7ab3l,0xd8c1d6b4c905f293l,
17400             0x10ac80473461b597l },
17401           0 },
17402         /* 7 << 32 */
17403         { { 0xbbb175146fc627e2l,0xa0569bc591573a51l,0xa7016d9e358243d5l,
17404             0x0dac0c56ac1d6692l },
17405           { 0x993833b5da590d5fl,0xa8067803de817491l,0x65b4f2124dbf75d0l,
17406             0xcc960232ccf80cfbl },
17407           0 },
17408         /* 9 << 32 */
17409         { { 0x35d742806cf3d65bl,0x4b7c790678b28dd9l,0xc4fcdd2f95e1f85fl,
17410             0xcf6fb7ba591350b6l },
17411           { 0x9f8e3287edfc26afl,0xe2dd9e73c2d0ed9al,0xeab5d67f24cbb703l,
17412             0x60c293999a759a5al },
17413           0 },
17414         /* 10 << 32 */
17415         { { 0xcf8625d7708f97cdl,0xfb6c5119ea419de4l,0xe8cb234dc03f9b06l,
17416             0x5a7822c335e23972l },
17417           { 0x9b876319a284ff10l,0xefcc49977093fdcel,0xdddfd62a878fe39al,
17418             0x44bfbe53910aa059l },
17419           0 },
17420         /* 11 << 32 */
17421         { { 0xfb93ca3d7ca53d5fl,0x432649f004379cbfl,0xf506113acba2ff75l,
17422             0x4594ae2103718b35l },
17423           { 0x1aa6cee50d044627l,0xc0e0d2b7f5c94aa2l,0x0bf33d3dee4dd3f5l,
17424             0xaca96e288477c97al },
17425           0 },
17426         /* 13 << 32 */
17427         { { 0x995c068e6861a713l,0xa9ba339463de88dcl,0xab954344689a964fl,
17428             0x58195aec0f5a0d6cl },
17429           { 0xc5f207d5c98f8b50l,0x6600cd280c98ccf6l,0x1a680fe339c3e6c2l,
17430             0xa23f3931660e87c0l },
17431           0 },
17432         /* 15 << 32 */
17433         { { 0x43bc1b42c78440a1l,0x9a07e22632ac6c3fl,0xaf3d7ba10f4bcd15l,
17434             0x3ad43c9da36814c6l },
17435           { 0xca11f742a0c9c162l,0xd3e06fc6c90b96ecl,0xeace6e766bf2d03fl,
17436             0x8bcd98e8f8032795l },
17437           0 },
17438         /* 16 << 32 */
17439         { { 0xe27a6dbe305406ddl,0x8eb7dc7fdd5d1957l,0xf54a6876387d4d8fl,
17440             0x9c479409c7762de4l },
17441           { 0xbe4d5b5d99b30778l,0x25380c566e793682l,0x602d37f3dac740e3l,
17442             0x140deabe1566e4ael },
17443           0 },
17444         /* 17 << 32 */
17445         { { 0x7be3ddb77099ae96l,0x83d6157306e0da6al,0x31bcac5f74bf9870l,
17446             0x7f7aa3b422b256f1l },
17447           { 0xff84d63caa212e20l,0x7d636556decdc8b5l,0x8fed824dbf909d62l,
17448             0x62d70186e5fb1445l },
17449           0 },
17450         /* 19 << 32 */
17451         { { 0x8796989f67d8ab8al,0xa46282253700b772l,0xa353cadf05f799abl,
17452             0x7a8be2741eeb06bbl },
17453           { 0xf74a367e4653b134l,0x4e43449660c70340l,0xc99b6d6b72e10b18l,
17454             0xcf1adf0f1ba636e1l },
17455           0 },
17456         /* 21 << 32 */
17457         { { 0xb0260fb57c6a0958l,0xae791b9c2fc2731el,0xb339f2bf8ce6e575l,
17458             0x769214a816e2639fl },
17459           { 0xbaf422e1346da10el,0xc7805fdf7a56f463l,0xf47b6b766f845428l,
17460             0x8f21369e38492948l },
17461           0 },
17462         /* 23 << 32 */
17463         { { 0x2bac716a17931a90l,0x42a5e27cc8267236l,0xfd4b367c0bafeb78l,
17464             0x5856e69c6173db02l },
17465           { 0xfaac7358973d73c4l,0xbfbffcc36768d285l,0x05444ff2be3eb243l,
17466             0x9f8d3692f3c323fel },
17467           0 },
17468         /* 25 << 32 */
17469         { { 0xac296863221c31a9l,0x46f3a24ef1ca99a9l,0xd927648a7535a864l,
17470             0xd7e3c47d5848e497l },
17471           { 0xc19595b782a98ac7l,0x9a9bf627273ff554l,0xe29aa48fb62298a1l,
17472             0xed3f068ee797e9e3l },
17473           0 },
17474         /* 27 << 32 */
17475         { { 0x8d16a1660eb9227bl,0xe04c6bc58c37c74bl,0xd1be9585cc1ef78cl,
17476             0xa5cfe1962e929d9bl },
17477           { 0xc9b0ea21417c1cc6l,0x316352d345b79599l,0xc1502c4dc2d54af7l,
17478             0xe7f4412990f83445l },
17479           0 },
17480         /* 28 << 32 */
17481         { { 0x0f6704abd95917e8l,0x168dafaeaec6e899l,0xd2833e8cde710027l,
17482             0x34ea277e68ee3c59l },
17483           { 0x3689e2350054d4e5l,0x6f3a568d11013943l,0xb5ce1ff69bc2b144l,
17484             0x705bfe7e72b33a59l },
17485           0 },
17486         /* 29 << 32 */
17487         { { 0x1baa4f02c8e93284l,0xec6b93ea3c97d3e8l,0xb656c149034f8b32l,
17488             0x3cab9063cd4cc69fl },
17489           { 0xd8de5989d61031ccl,0xcf85329fc1b1de1dl,0xf18b78b323d8cb9al,
17490             0x6dc04bc61a6b69eal },
17491           0 },
17492         /* 31 << 32 */
17493         { { 0x79cf86314a1d4f8fl,0xda5ba331aa47394el,0x36f9c0be8ff20527l,
17494             0xccdc719bbc7097f6l },
17495           { 0x2304a3ba5cb052bbl,0xab80cdea392f0ab5l,0x0ac1858bf38de03bl,
17496             0xd6e2119878a8f55dl },
17497           0 },
17498         /* 33 << 32 */
17499         { { 0x6bdebc26584bc618l,0x499f0f1894591499l,0xd35ed50bf4a573dal,
17500             0x5a622e73ff2792d0l },
17501           { 0x8510cbce68d41a3bl,0x6610f43c94e919afl,0x4527373dc163c8a1l,
17502             0x50afb46f280a8a7dl },
17503           0 },
17504         /* 34 << 32 */
17505         { { 0x33e779cd8de7707al,0xf94bbd94438f535bl,0x61159864be144878l,
17506             0xb6623235f098ce4al },
17507           { 0x6813b71ba65568d8l,0x6603dd4c2f796451l,0x9a97d88c8b9ee5b2l,
17508             0xaaa4593549d5926cl },
17509           0 },
17510         /* 35 << 32 */
17511         { { 0x2e01fc75ebe75bf2l,0x8270318d6cbdd09cl,0x534e4f21d3f1a196l,
17512             0x6c9eaeca9459173el },
17513           { 0xda454fe0b642a1d4l,0xe45b69bfc4664c4al,0x4724bd423e078dc8l,
17514             0x39ac8fe603336b81l },
17515           0 },
17516         /* 36 << 32 */
17517         { { 0x0a2e53dd302e9485l,0x75882a19deaa9ff4l,0xe283242eac8de4ddl,
17518             0x2742105cc678dba7l },
17519           { 0x9f6f0a88cdb3a8a2l,0x5c9d3338f722e894l,0xf1fa3143c38c31c1l,
17520             0x22137e2db18c77acl },
17521           0 },
17522         /* 37 << 32 */
17523         { { 0xd821665e368d7835l,0x3300c012b596c6ecl,0xb60da7353557b2ddl,
17524             0x6c3d9db6fb8cf9ael },
17525           { 0x092d8b0b8b4b0d34l,0x900a0bf4b3d4107dl,0x75371a245e813ec3l,
17526             0x91125a17f2ad56d5l },
17527           0 },
17528         /* 39 << 32 */
17529         { { 0x5e6594e2fe0073e6l,0x908a93778be13cb7l,0xa2c3d5c8ac26617cl,
17530             0xa0bab085c317c6b9l },
17531           { 0x0bdc183b83664109l,0x6bbba2b468f9dcd9l,0x697a50785814be41l,
17532             0x12a59b183a5e5f98l },
17533           0 },
17534         /* 40 << 32 */
17535         { { 0xbd9802e6c30fa92bl,0x5a70d96d9a552784l,0x9085c4ea3f83169bl,
17536             0xfa9423bb06908228l },
17537           { 0x2ffebe12fe97a5b9l,0x85da604971b99118l,0x9cbc2f7f63178846l,
17538             0xfd96bc709153218el },
17539           0 },
17540         /* 41 << 32 */
17541         { { 0xb5a85c61bfa70ca6l,0x4edc7f2d4c1f745fl,0x05aea9aa3ded1eb5l,
17542             0x750385efb82e5918l },
17543           { 0xdcbc53221fdc5164l,0x32a5721f6794184el,0x5c5b2269ff09c90bl,
17544             0x96d009115323ca42l },
17545           0 },
17546         /* 43 << 32 */
17547         { { 0x12c73403f43f1440l,0xc94813eb66cc1f50l,0x04d5957b9b035151l,
17548             0x76011bca4bfaafa8l },
17549           { 0x56806c13574f1f0al,0x98f63a4697652a62l,0x17c63ef4a3178de9l,
17550             0xf7ce961a65009a52l },
17551           0 },
17552         /* 44 << 32 */
17553         { { 0x58f92aebe4173516l,0xdc37d99275e42d44l,0x76dcec5b4d48e1bal,
17554             0x07e0608e25676448l },
17555           { 0xa1877bcd1d4af36al,0x38b62b3c5a8ccf0cl,0x60522e88aeab7f75l,
17556             0xbef213ed5e03547al },
17557           0 },
17558         /* 45 << 32 */
17559         { { 0x8acd5ba4e6ed0282l,0x792328f06a04531dl,0xe95de8aa80297e50l,
17560             0x79d33ce07d60e05cl },
17561           { 0xcb84646dd827d602l,0xd3421521302a608cl,0x867970a4524f9751l,
17562             0x05e2f7e347a75734l },
17563           0 },
17564         /* 46 << 32 */
17565         { { 0x64e4de4a01c66263l,0xbcfe16a4d0033d4cl,0x359e23d4817de1dcl,
17566             0xb01e812ec259449cl },
17567           { 0x90c9ade2df53499fl,0xabbeaa27288c6862l,0x5a655db4cd1b896fl,
17568             0x416f10a5a022a3d6l },
17569           0 },
17570         /* 47 << 32 */
17571         { { 0x0d17e1ef98601fd5l,0x9a3f85e0eab76a6fl,0x0b9eaed1510b80a1l,
17572             0x3282fd747ec30422l },
17573           { 0xaca5815a70a4a402l,0xfad3121cf2439cb2l,0xba251af81fccabd6l,
17574             0xb382843fa5c127d5l },
17575           0 },
17576         /* 48 << 32 */
17577         { { 0x958381db1782269bl,0xae34bf792597e550l,0xbb5c60645f385153l,
17578             0x6f0e96afe3088048l },
17579           { 0xbf6a021577884456l,0xb3b5688c69310ea7l,0x17c9429504fad2del,
17580             0xe020f0e517896d4dl },
17581           0 },
17582         /* 49 << 32 */
17583         { { 0x442fdfe920cd1ebel,0xa8317dfa6a250d62l,0x5214576d082d5a2dl,
17584             0xc1a5d31930803c33l },
17585           { 0x33eee5b25e4a2cd0l,0x7df181b3b4db8011l,0x249285145b5c6b0bl,
17586             0x464c1c5828bf8837l },
17587           0 },
17588         /* 51 << 32 */
17589         { { 0x5464da65d55babd1l,0x50eaad2a0048d80fl,0x782ca3dd2b9bce90l,
17590             0x41107164ab526844l },
17591           { 0xad3f0602d56e0a5fl,0xc1f0248018455114l,0xe05d8dcab1527931l,
17592             0x87818cf5bb1295d7l },
17593           0 },
17594         /* 52 << 32 */
17595         { { 0x95aeb5bd483e333al,0x003af31effeaededl,0xfc5532e87efb1e4fl,
17596             0xb37e0fb52dfa24a5l },
17597           { 0x485d4cecdc140b08l,0xb81a0d23983bd787l,0xd19928dae8d489fdl,
17598             0x3fa0312c177b9dbdl },
17599           0 },
17600         /* 53 << 32 */
17601         { { 0xade391470c6d7e88l,0x4fd1e8cd47072c45l,0x145760fed5a65c56l,
17602             0x198960c7be4887del },
17603           { 0xfe7974a82640257al,0xf838a19b774febefl,0xb2aecad11b6e988el,
17604             0x643f44fa448e4a8fl },
17605           0 },
17606         /* 55 << 32 */
17607         { { 0xc35ceffdee756e71l,0x2c1364d88ea932c4l,0xbd594d8d837d2d9fl,
17608             0x5b334bdac9d74d48l },
17609           { 0x72dc3e03b8fac08bl,0x38f01de006fdf70fl,0x4bde74b31d298ba4l,
17610             0x2598d183ad5f42a9l },
17611           0 },
17612         /* 57 << 32 */
17613         { { 0x02c6ba15f62befa2l,0x6399ceb55c8ccee9l,0x3638bd6e08d3473el,
17614             0xb8f1f13d2f8f4a9cl },
17615           { 0x50d7560655827a74l,0x8d6e65f33fb4f32cl,0x40a5d21189ee621al,
17616             0x6d3f9e11c4474716l },
17617           0 },
17618         /* 59 << 32 */
17619         { { 0xcb633a4ce9b2bb8fl,0x0475703f8c529253l,0x61e007b5a8878873l,
17620             0x342d77ba14504159l },
17621           { 0x2925175c313578dfl,0x4e631897b6b097f1l,0xe64d138929350e41l,
17622             0x2fb20608ec7adccdl },
17623           0 },
17624         /* 60 << 32 */
17625         { { 0xa560c234d5c0f5d1l,0x74f84bf62bdef0efl,0x61ed00005cbd3d0bl,
17626             0xc74262d087fb408bl },
17627           { 0xad30a6496cc64128l,0x708e3a31a4a8b154l,0xaf21ce2637f82074l,
17628             0x31d33b38204c9a74l },
17629           0 },
17630         /* 61 << 32 */
17631         { { 0x8f609fe04cc2f575l,0xe44f9784b35488c4l,0x0d464bb6180fa375l,
17632             0x4f44d5d2de2247b8l },
17633           { 0xf538eb38141ef077l,0x781f8f6e8fa456a4l,0x67e9a46429b4f39dl,
17634             0x245d21e8b704c3e9l },
17635           0 },
17636         /* 63 << 32 */
17637         { { 0x45a94ee858ffa7cdl,0x4d38bc6818053549l,0x0b4bc65a499d79f3l,
17638             0xa81e3ab09159cab7l },
17639           { 0xf13716efb47898cel,0xb7ee597c2e2d9044l,0x09396b90e6158276l,
17640             0x5c644dc36a533fcel },
17641           0 },
17642         /* 64 << 32 */
17643         { { 0xcca4428dbbe5a1a9l,0x8187fd5f3126bd67l,0x0036973a48105826l,
17644             0xa39b6663b8bd61a0l },
17645           { 0x6d42deef2d65a808l,0x4969044f94636b19l,0xf611ee47dd5d564cl,
17646             0x7b2f3a49d2873077l },
17647           0 },
17648         /* 65 << 32 */
17649         { { 0xbe4c16c3bf429668l,0xd32f56f0ef35db3bl,0xae8355de9ea4e3f1l,
17650             0x8f66c4a2a450944el },
17651           { 0xafab94c8b798fbe2l,0x18c57baff7f3d5cfl,0x692d191c5cfa5c7dl,
17652             0xc0c25f69a689daebl },
17653           0 },
17654         /* 71 << 32 */
17655         { { 0x15fb3ae398340d4cl,0xa8b9233a7de82134l,0x44971a545fc0dbc6l,
17656             0xb2b4f0f3a1d3f094l },
17657           { 0x8d9eaba1b6242bd4l,0xd8aad777787cc557l,0xb1ab8b7870d1a2bbl,
17658             0x5d20f48cead3bfe3l },
17659           0 },
17660         /* 77 << 32 */
17661         { { 0x4dacbf09a2bf9772l,0x969a4c4357aa8457l,0xadbe673b273ebfc5l,
17662             0xb85582bb927778c9l },
17663           { 0x748371855c03752cl,0xc337bc6bc2f60d11l,0x2c3838e4ad456a09l,
17664             0xaf479c897e381842l },
17665           0 },
17666         /* 83 << 32 */
17667         { { 0x8530ae751b1aea77l,0xf43b923ba8310cb9l,0x9c1a60c6bf4dd6c5l,
17668             0x11885b863e3aaaa5l },
17669           { 0x594a8fa90f69821el,0x1eece3d66bc37998l,0x1fd718f518df32bfl,
17670             0x1c00c7d461d84082l },
17671           0 },
17672         /* 89 << 32 */
17673         { { 0xd67ee3a4c763c3cfl,0x760b128305969234l,0x1a5ff331ec17f2d1l,
17674             0x25f0392a84fecfefl },
17675           { 0xb1bc004a3a80d47el,0xf450bf08182fee3bl,0xf11117681e19751el,
17676             0x5b4127dae28ed23fl },
17677           0 },
17678         /* 95 << 32 */
17679         { { 0x91e00defdaf08f09l,0x7ef41724f4738a07l,0x990fbbceaf1263fcl,
17680             0x779121e3e6eeb5aal },
17681           { 0x3e162c7a5a3ecf52l,0x73ae568a51be5faal,0x8bea1bfa451be8a9l,
17682             0x3e8cd5db90e11097l },
17683           0 },
17684         /* 101 << 32 */
17685         { { 0x90390f7224d27159l,0x685c139efd07e5d4l,0x4e21e44a3bc234a8l,
17686             0x61b50f34eeb14dacl },
17687           { 0x7beb0aa087555d58l,0x781326bcc806f0d2l,0xc289537a1eb7199fl,
17688             0x44a31a037b42766el },
17689           0 },
17690         /* 107 << 32 */
17691         { { 0x7d778206edde4b40l,0x34539fa18eb92fcdl,0x5a0bdd79bf52a552l,
17692             0x066d3672fdcca75el },
17693           { 0xd73fa893e28b5a5bl,0xb495135876c38698l,0x44469b0114ae16cfl,
17694             0xb428c763691d6618l },
17695           0 },
17696         /* 113 << 32 */
17697         { { 0x9022db8b69196353l,0x152ebb7dd7a4afd0l,0xea36fae57fcf1765l,
17698             0xa8fc00ba0decea8al },
17699           { 0x1047206a0c0b0414l,0x6607d8ade076df28l,0xf343e19966b8aba1l,
17700             0x7f03c1ad311e208dl },
17701           0 },
17702         /* 116 << 32 */
17703         { { 0xe6b4c96e888f3870l,0xa21bb618fe544042l,0x7122ee88bd817699l,
17704             0xcb38ecebfa66e173l },
17705           { 0x6ed5b3482c9cc05fl,0x591affc84ae0fd9el,0x7cf325ac6e7aaac0l,
17706             0x2397c053d05e5be0l },
17707           0 },
17708         /* 119 << 32 */
17709         { { 0x95363f61eaa96552l,0xe03bc6b38fb15b73l,0xa5c5808f2c389053l,
17710             0xcd021e6c11b2030cl },
17711           { 0x349ca9bdc038e30al,0x0a3368d4165afa2cl,0x043630debbfa1cc6l,
17712             0xb8c4456ba7cdbf69l },
17713           0 },
17714         /* 125 << 32 */
17715         { { 0x63aa3315fd7d2983l,0xaf4c96afa6a04bedl,0x3a5c0b5410814a74l,
17716             0x9906f5e30f9b0770l },
17717           { 0x622be6523676986fl,0x09ac5bc0173e7cb5l,0x1c40e56a502c8b3cl,
17718             0xabb9a0f7253ce8f6l },
17719           0 },
17720     },
17721     {
17722         /* 0 << 40 */
17723         { { 0x00, 0x00, 0x00, 0x00 },
17724           { 0x00, 0x00, 0x00, 0x00 },
17725           1 },
17726         /* 1 << 40 */
17727         { { 0x889f6d65533ef217l,0x7158c7e4c3ca2e87l,0xfb670dfbdc2b4167l,
17728             0x75910a01844c257fl },
17729           { 0xf336bf07cf88577dl,0x22245250e45e2acel,0x2ed92e8d7ca23d85l,
17730             0x29f8be4c2b812f58l },
17731           0 },
17732         /* 3 << 40 */
17733         { { 0xc51e414351facc61l,0xbaf2647de68a25bcl,0x8f5271a00ff872edl,
17734             0x8f32ef993d2d9659l },
17735           { 0xca12488c7593cbd4l,0xed266c5d02b82fabl,0x0a2f78ad14eb3f16l,
17736             0xc34049484d47afe3l },
17737           0 },
17738         /* 4 << 40 */
17739         { { 0xa6f3d574c005979dl,0xc2072b426a40e350l,0xfca5c1568de2ecf9l,
17740             0xa8c8bf5ba515344el },
17741           { 0x97aee555114df14al,0xd4374a4dfdc5ec6bl,0x754cc28f2ca85418l,
17742             0x71cb9e27d3c41f78l },
17743           0 },
17744         /* 5 << 40 */
17745         { { 0x09c1670209470496l,0xa489a5edebd23815l,0xc4dde4648edd4398l,
17746             0x3ca7b94a80111696l },
17747           { 0x3c385d682ad636a4l,0x6702702508dc5f1el,0x0c1965deafa21943l,
17748             0x18666e16610be69el },
17749           0 },
17750         /* 7 << 40 */
17751         { { 0x45beb4ca2a604b3bl,0x56f651843a616762l,0xf52f5a70978b806el,
17752             0x7aa3978711dc4480l },
17753           { 0xe13fac2a0e01fabcl,0x7c6ee8a5237d99f9l,0x251384ee05211ffel,
17754             0x4ff6976d1bc9d3ebl },
17755           0 },
17756         /* 9 << 40 */
17757         { { 0xdde0492316e043a2l,0x98a452611dd3d209l,0xeaf9f61bd431ebe8l,
17758             0x00919f4dbaf56abdl },
17759           { 0xe42417db6d8774b1l,0x5fc5279c58e0e309l,0x64aa40613adf81eal,
17760             0xef419edabc627c7fl },
17761           0 },
17762         /* 10 << 40 */
17763         { { 0x3919759239ef620fl,0x9d47284074fa29c4l,0x4e428fa39d416d83l,
17764             0xd1a7c25129f30269l },
17765           { 0x46076e1cd746218fl,0xf3ad6ee8110d967el,0xfbb5f434a00ae61fl,
17766             0x3cd2c01980d4c929l },
17767           0 },
17768         /* 11 << 40 */
17769         { { 0xfa24d0537a4af00fl,0x3f938926ca294614l,0x0d700c183982182el,
17770             0x801334434cc59947l },
17771           { 0xf0397106ec87c925l,0x62bd59fc0ed6665cl,0xe8414348c7cca8b5l,
17772             0x574c76209f9f0a30l },
17773           0 },
17774         /* 13 << 40 */
17775         { { 0x95be42e2bb8b6a07l,0x64be74eeca23f86al,0xa73d74fd154ce470l,
17776             0x1c2d2857d8dc076al },
17777           { 0xb1fa1c575a887868l,0x38df8e0b3de64818l,0xd88e52f9c34e8967l,
17778             0x274b4f018b4cc76cl },
17779           0 },
17780         /* 15 << 40 */
17781         { { 0x3f5c05b4f8b7559dl,0x0be4c7acfae29200l,0xdd6d3ef756532accl,
17782             0xf6c3ed87eea7a285l },
17783           { 0xe463b0a8f46ec59bl,0x531d9b14ecea6c83l,0x3d6bdbafc2dc836bl,
17784             0x3ee501e92ab27f0bl },
17785           0 },
17786         /* 16 << 40 */
17787         { { 0x8df275455922ac1cl,0xa7b3ef5ca52b3f63l,0x8e77b21471de57c4l,
17788             0x31682c10834c008bl },
17789           { 0xc76824f04bd55d31l,0xb6d1c08617b61c71l,0x31db0903c2a5089dl,
17790             0x9c092172184e5d3fl },
17791           0 },
17792         /* 17 << 40 */
17793         { { 0x7b1a921ea6b3340bl,0x6d7c4d7d7438a53el,0x2b9ef73c5bf71d8fl,
17794             0xb5f6e0182b167a7cl },
17795           { 0x5ada98ab0ce536a3l,0xee0f16f9e1fea850l,0xf6424e9d74f1c0c5l,
17796             0x4d00de0cd3d10b41l },
17797           0 },
17798         /* 19 << 40 */
17799         { { 0xd542f522a6533610l,0xfdde15a734ec439al,0x696560fedc87dd0dl,
17800             0x69eab421e01fd05fl },
17801           { 0xca4febdc95cc5988l,0x839be396c44d92fbl,0x7bedff6daffe543bl,
17802             0xd2bb97296f6da43al },
17803           0 },
17804         /* 21 << 40 */
17805         { { 0x5bc6dea80b8d0077l,0xb2adf5d1ea9c49efl,0x7104c20eaafe8659l,
17806             0x1e3604f37866ee7el },
17807           { 0x0cfc7e7b3075c8c5l,0x5281d9bb639c5a2bl,0xcbdf42494bc44ee3l,
17808             0x835ab066655e9209l },
17809           0 },
17810         /* 23 << 40 */
17811         { { 0x78fbda4b90b94ffal,0x447e52eb7beb993cl,0x920011bc92620d15l,
17812             0x7bad6ecf481fd396l },
17813           { 0xad3bd28ba989a09el,0x20491784a3e62b78l,0xcdcd7096b07bd9efl,
17814             0x9bf5bb7337d780adl },
17815           0 },
17816         /* 25 << 40 */
17817         { { 0xbe911a71a976c8d4l,0xba0346743fdd778el,0x2359e7434cf87ea1l,
17818             0x8dccf65f07ebb691l },
17819           { 0x6c2c18eb09746d87l,0x6a19945fd2ecc8fal,0xc67121ff2ffa0339l,
17820             0x408c95ba9bd9fc31l },
17821           0 },
17822         /* 27 << 40 */
17823         { { 0xa317204bcaa5da39l,0xd390df7468bf53d7l,0x56de18b2dbd71c0dl,
17824             0xcb4d3bee75184779l },
17825           { 0x815a219499d920a5l,0x9e10fb4ecf3d3a64l,0x7fd4901dfe92e1eel,
17826             0x5d86d10d3ab87b2el },
17827           0 },
17828         /* 28 << 40 */
17829         { { 0x24f2a692840bb336l,0x7c353bdca669fa7bl,0xda20d6fcdec9c300l,
17830             0x625fbe2fa13a4f17l },
17831           { 0xa2b1b61adbc17328l,0x008965bfa9515621l,0x49690939c620ff46l,
17832             0x182dd27d8717e91cl },
17833           0 },
17834         /* 29 << 40 */
17835         { { 0x98e9136c878303e4l,0x2769e74fd1e65efdl,0x6154c545809da56el,
17836             0x8c5d50a04301638cl },
17837           { 0x10f3d2068214b763l,0x2da9a2fc44df0644l,0xca912bab588a6fcdl,
17838             0xe9e82d9b227e1932l },
17839           0 },
17840         /* 31 << 40 */
17841         { { 0xcbdc4d66d080e55bl,0xad3f11e5b8f98d6bl,0x31bea68e18a32480l,
17842             0xdf1c6fd52c1bcf6el },
17843           { 0xadcda7ee118a3f39l,0xbd02f857ac060d5fl,0xd2d0265d86631997l,
17844             0xb866a7d33818f2d4l },
17845           0 },
17846         /* 33 << 40 */
17847         { { 0xfbcce2d31892d98dl,0x2e34bc9507de73dcl,0x3a48d1a94891eec1l,
17848             0xe64499c24d31060bl },
17849           { 0xe9674b7149745520l,0xf126ccaca6594a2cl,0x33e5c1a079945342l,
17850             0x02aa0629066e061fl },
17851           0 },
17852         /* 34 << 40 */
17853         { { 0xdfd7c0ae7af3191el,0x923ec111d68c70d9l,0xb6f1380bb675f013l,
17854             0x9192a224f23d45bal },
17855           { 0xbe7890f9524891e3l,0x45b24c47eba996bbl,0x59331e48320447e9l,
17856             0x0e4d8753ac9afad4l },
17857           0 },
17858         /* 35 << 40 */
17859         { { 0x49e49c38c9f5a6c3l,0x3f5eea44d8ee2a65l,0x02bf3e761c74bbb4l,
17860             0x50d291cdef565571l },
17861           { 0xf4edc290a36dd5fal,0x3015df9556dd6b85l,0x4494926aa5549a16l,
17862             0x5de6c59390399e4al },
17863           0 },
17864         /* 36 << 40 */
17865         { { 0x29be11c6ce800998l,0x72bb1752b90360d9l,0x2c1931975a4ad590l,
17866             0x2ba2f5489fc1dbc0l },
17867           { 0x7fe4eebbe490ebe0l,0x12a0a4cd7fae11c0l,0x7197cf81e903ba37l,
17868             0xcf7d4aa8de1c6dd8l },
17869           0 },
17870         /* 37 << 40 */
17871         { { 0x961fa6317e249e7bl,0x5c4f707796caed50l,0x6b176e62d7e50885l,
17872             0x4dd5de72f390cbecl },
17873           { 0x91fa29954b2bd762l,0x80427e6395b8dadel,0xd565bf1de2c34743l,
17874             0x911da39d16e6c841l },
17875           0 },
17876         /* 39 << 40 */
17877         { { 0x48365465802ff016l,0x6d2a561f71beece6l,0xdd299ce6f9707052l,
17878             0x62a32698a23407bbl },
17879           { 0x1d55bdb147004afbl,0xfadec124369b1084l,0x1ce78adf291c89f7l,
17880             0x9f2eaf03278bc529l },
17881           0 },
17882         /* 40 << 40 */
17883         { { 0x92af6bf43fd5684cl,0x2b26eecf80360aa1l,0xbd960f3000546a82l,
17884             0x407b3c43f59ad8fel },
17885           { 0x86cae5fe249c82bal,0x9e0faec72463744cl,0x87f551e894916272l,
17886             0x033f93446ceb0615l },
17887           0 },
17888         /* 41 << 40 */
17889         { { 0x04658ad212dba0cel,0x9e600624068822f0l,0x84661f11b26d368bl,
17890             0xbca867d894ebb87al },
17891           { 0x79506dc42f1bad89l,0x1a8322d3ebcbe7a1l,0xb4f1e102ac197178l,
17892             0x29a950b779f7198cl },
17893           0 },
17894         /* 43 << 40 */
17895         { { 0x19a6fb0984a3d1d5l,0x6c75c3a2ba5f5307l,0x7983485bf9698447l,
17896             0x689f41b88b1cdc1el },
17897           { 0x18f6fbd74c1979d0l,0x3e6be9a27a0b6708l,0x06acb615f63d5a8al,
17898             0x8a817c098d0f64b1l },
17899           0 },
17900         /* 44 << 40 */
17901         { { 0x1e5eb0d18be82e84l,0x89967f0e7a582fefl,0xbcf687d5a6e921fal,
17902             0xdfee4cf3d37a09bal },
17903           { 0x94f06965b493c465l,0x638b9a1c7635c030l,0x7666786466f05e9fl,
17904             0xccaf6808c04da725l },
17905           0 },
17906         /* 45 << 40 */
17907         { { 0xa9b3479b1b53a173l,0xc041eda3392eddc0l,0xdb8f804755edd7eel,
17908             0xaf1f7a37ab60683cl },
17909           { 0x9318603a72c0accbl,0xab1bb9fe401cbf3cl,0xc40e991e88afe245l,
17910             0x9298a4580d06ac35l },
17911           0 },
17912         /* 46 << 40 */
17913         { { 0x58e127d5036c2fe7l,0x5fe5020555b93361l,0xc1373d850f74a045l,
17914             0x28cd79dbe8228e4bl },
17915           { 0x0ae82320c2018d9al,0xf6d0049c78f8016al,0x381b6fe2149b31fbl,
17916             0x33a0e8adec3cfbcfl },
17917           0 },
17918         /* 47 << 40 */
17919         { { 0x23a6612e9eab5da7l,0xb645fe29d94d6431l,0xe3d74594ca1210c4l,
17920             0xdc1376bceeca0674l },
17921           { 0xfd40dfef657f0154l,0x7952a548d52cbac5l,0x0ee189583685ad28l,
17922             0xd13639409ba9ca46l },
17923           0 },
17924         /* 48 << 40 */
17925         { { 0xca2eb690768fccfcl,0xf402d37db835b362l,0x0efac0d0e2fdfccel,
17926             0xefc9cdefb638d990l },
17927           { 0x2af12b72d1669a8bl,0x33c536bc5774ccbdl,0x30b21909fb34870el,
17928             0xc38fa2f77df25acal },
17929           0 },
17930         /* 49 << 40 */
17931         { { 0x1337902f1c982cd6l,0x222e08fe14ec53eal,0x6c8abd0d330ef3e5l,
17932             0xeb59e01531f6fd9dl },
17933           { 0xd74ae554a8532df4l,0xbc010db1ab44c83el,0xe98016561b8f9285l,
17934             0x65a9612783acc546l },
17935           0 },
17936         /* 51 << 40 */
17937         { { 0x36a8b0a76770cfb1l,0x3338d52f9bb578fcl,0x5136c785f5ed12a4l,
17938             0x652d47ed87bf129el },
17939           { 0x9c6c827e6067c2d0l,0x61fc2f410345533al,0x2d7fb182130cea19l,
17940             0x71a0186330b3ef85l },
17941           0 },
17942         /* 52 << 40 */
17943         { { 0x74c5f02bbf81f3f5l,0x0525a5aeaf7e4581l,0x88d2aaba433c54ael,
17944             0xed9775db806a56c5l },
17945           { 0xd320738ac0edb37dl,0x25fdb6ee66cc1f51l,0xac661d1710600d76l,
17946             0x931ec1f3bdd1ed76l },
17947           0 },
17948         /* 53 << 40 */
17949         { { 0xb81e239161faa569l,0xb379f759bb40eebfl,0x9f2fd1b2a2c54549l,
17950             0x0a968f4b0d6ba0ael },
17951           { 0xaa869e6eedfe8c75l,0x0e36b298645ab173l,0x5a76282b0bcdefd7l,
17952             0x9e949331d05293f2l },
17953           0 },
17954         /* 55 << 40 */
17955         { { 0xc1cfa9a1c59fac6el,0x2648bffcb72747cel,0x5f8a39805f2e2637l,
17956             0x8bd3a8eb73e65758l },
17957           { 0xd9c43f1df14381a7l,0xecc1c3b0d6a86c10l,0xffcf4fa8a4a6dc74l,
17958             0x7304fa834cea0a46l },
17959           0 },
17960         /* 57 << 40 */
17961         { { 0x4460760c34dca952l,0xeac9cf2444c70444l,0xb879297b8493c87el,
17962             0x295941a54b2dccb7l },
17963           { 0x1e5cecede58721cdl,0xc8b58db74ca0d12bl,0x1927965c6da1d034l,
17964             0x7220b02839ed1369l },
17965           0 },
17966         /* 59 << 40 */
17967         { { 0xc38746c83c2e34b6l,0x9f27362e38a51042l,0x26febec02067afebl,
17968             0xd9c4e15544e7371fl },
17969           { 0x6035f469f92930d1l,0xe6ed7c08b4431b8bl,0xa25bf5903e16410dl,
17970             0x147d83368adf4c18l },
17971           0 },
17972         /* 60 << 40 */
17973         { { 0x7f01c9ecaa80ba59l,0x3083411a68538e51l,0x970370f1e88128afl,
17974             0x625cc3db91dec14bl },
17975           { 0xfef9666c01ac3107l,0xb2a8d577d5057ac3l,0xb0f2629992be5df7l,
17976             0xf579c8e500353924l },
17977           0 },
17978         /* 61 << 40 */
17979         { { 0xbd9398d6ca02669fl,0x896e053bf9ad11a1l,0xe024b699a3556f9fl,
17980             0x23b4b96ad53cbca3l },
17981           { 0x549d2d6c89733dd6l,0x3dae193f394f3179l,0x8bf7ec1cdfeda825l,
17982             0xf6a1db7a8a4844b4l },
17983           0 },
17984         /* 63 << 40 */
17985         { { 0x3b5403d56437a027l,0xda32bbd233ed30aal,0xd2ad3baa906de0cal,
17986             0x3b6df514533f736el },
17987           { 0x986f1cab5df9b9c4l,0x41cd2088970d330el,0xaae7c2238c20a923l,
17988             0x52760a6e1e951dc0l },
17989           0 },
17990         /* 64 << 40 */
17991         { { 0xb8fa3d931341ed7al,0x4223272ca7b59d49l,0x3dcb194783b8c4a4l,
17992             0x4e413c01ed1302e4l },
17993           { 0x6d999127e17e44cel,0xee86bf7533b3adfbl,0xf6902fe625aa96cal,
17994             0xb73540e4e5aae47dl },
17995           0 },
17996         /* 65 << 40 */
17997         { { 0x55318a525e34036cl,0xc3acafaaf9884e3fl,0xe5ba15cea042ba04l,
17998             0x56a1d8960ada550el },
17999           { 0xa5198cae87b76764l,0xd079d1f0b6fd84fbl,0xb22b637bcbe363edl,
18000             0xbe8ab7d64499deaal },
18001           0 },
18002         /* 71 << 40 */
18003         { { 0xbe8eba5eb4925f25l,0x00f8bf582e3159d6l,0xb1aa24fa18856070l,
18004             0x22ea8b74e4c30b22l },
18005           { 0x512f633e55bbe4e8l,0x82ba62318678aee9l,0xea05da90fdf72b7el,
18006             0x616b9bc7a4fc65eel },
18007           0 },
18008         /* 77 << 40 */
18009         { { 0xe31ee3b3b7c221e7l,0x10353824e353fa43l,0x9d2f3df69dd2a86fl,
18010             0x8a12ab9322ccffecl },
18011           { 0x25c8e326d666f9e5l,0x33ea98a0598da7fbl,0x2fc1de0917f74e17l,
18012             0x0d0b6c7a35efb211l },
18013           0 },
18014         /* 83 << 40 */
18015         { { 0x22a82c6c804e6ecel,0x824a170b1d8fce9el,0x621802becee65ed0l,
18016             0x4a4e9e7895ec4285l },
18017           { 0x8da0988fa8940b7al,0xaff89c5b86445aa5l,0x386fdbdad689cde9l,
18018             0x3aeaae7d9f5caaccl },
18019           0 },
18020         /* 89 << 40 */
18021         { { 0xe9cb9e68a7b62f4cl,0x515cae0ec3b7092el,0xb8abec354b491f52l,
18022             0x672673fd01eeabc1l },
18023           { 0x65e5739f7ad6e8a1l,0xc2da8e003d91b2f9l,0xcc43229cced84319l,
18024             0x0f8cbf9574ccf2d1l },
18025           0 },
18026         /* 95 << 40 */
18027         { { 0xb03d1cfb1b2f872al,0x88aef4670872b6f7l,0xaafe55e48ea9170cl,
18028             0xd5cc4875f24aa689l },
18029           { 0x7e5732908458ce84l,0xef4e143d58bfc16dl,0xc58626efaa222836l,
18030             0x01c60ec0ca5e0cb8l },
18031           0 },
18032         /* 101 << 40 */
18033         { { 0x123901aa36337c09l,0x1697acadd2f5e675l,0xc0a1ddd022fe2bael,
18034             0xf68ea88cff0210ddl },
18035           { 0x665d11e014168709l,0x912a575f45f25321l,0x7e7ed38070c78934l,
18036             0x663d692cb0a46322l },
18037           0 },
18038         /* 107 << 40 */
18039         { { 0x912ab8bd8642cba4l,0x97fab1a3b6b50b73l,0x76666b3cb86ef354l,
18040             0x16d41330fa5ecce9l },
18041           { 0x77c7c138c7da404bl,0xc6508cb78c983fb0l,0xe5881733f9004984l,
18042             0x76dea7794182c7abl },
18043           0 },
18044         /* 113 << 40 */
18045         { { 0x16db18583556b765l,0x39c18c200263755al,0x7b6691f591c15201l,
18046             0x4e4c17b168514ea9l },
18047           { 0xacbe449e06f5f20al,0xeb9119d2541ddfb6l,0x2f6e687bf2eac86fl,
18048             0xb161471ec14ac508l },
18049           0 },
18050         /* 116 << 40 */
18051         { { 0x58846d32c4744733l,0x40517c71379f9e34l,0x2f65655f130ef6cal,
18052             0x526e4488f1f3503fl },
18053           { 0x8467bd177ee4a976l,0x1d9dc913921363d1l,0xd8d24c33b069e041l,
18054             0x5eb5da0a2cdf7f51l },
18055           0 },
18056         /* 119 << 40 */
18057         { { 0x81c2cc32951ab3e7l,0xc86d9a109b0c7e87l,0x0b7a18bd606ef408l,
18058             0x099b5bbfe6c2251el },
18059           { 0x46d627d0bfce880fl,0xbfaddcbbe1c6865al,0xa9ab6183d2bb9a00l,
18060             0x23cb9a2720ad9789l },
18061           0 },
18062         /* 125 << 40 */
18063         { { 0x1592d0630c25fbebl,0x13869ec24995a3fal,0x6413f494861d0a73l,
18064             0xa3b782342f9f1b89l },
18065           { 0x113689e2b6cad351l,0x53be2014a873dcc1l,0xccf405e0c6bb1be7l,
18066             0x4fff7b4ca9061ca9l },
18067           0 },
18068     },
18069     {
18070         /* 0 << 48 */
18071         { { 0x00, 0x00, 0x00, 0x00 },
18072           { 0x00, 0x00, 0x00, 0x00 },
18073           1 },
18074         /* 1 << 48 */
18075         { { 0xcc7a64880a750c0fl,0x39bacfe34e548e83l,0x3d418c760c110f05l,
18076             0x3e4daa4cb1f11588l },
18077           { 0x2733e7b55ffc69ffl,0x46f147bc92053127l,0x885b2434d722df94l,
18078             0x6a444f65e6fc6b7cl },
18079           0 },
18080         /* 3 << 48 */
18081         { { 0x6d0b16f4bdaedfbdl,0x23fd326086746cedl,0x8bfb1d2fff4b3e17l,
18082             0xc7f2ec2d019c14c8l },
18083           { 0x3e0832f245104b0dl,0x5f00dafbadea2b7el,0x29e5cf6699fbfb0fl,
18084             0x264f972361827cdal },
18085           0 },
18086         /* 4 << 48 */
18087         { { 0x97b14f7ea90567e6l,0x513257b7b6ae5cb7l,0x85454a3c9f10903dl,
18088             0xd8d2c9ad69bc3724l },
18089           { 0x38da93246b29cb44l,0xb540a21d77c8cbacl,0x9bbfe43501918e42l,
18090             0xfffa707a56c3614el },
18091           0 },
18092         /* 5 << 48 */
18093         { { 0x6eb1a2f3e30bc27fl,0xe5f0c05ab0836511l,0x4d741bbf4965ab0el,
18094             0xfeec41ca83464bbdl },
18095           { 0x1aca705f99d0b09fl,0xc5d6cc56f42da5fal,0x49964eddcc52b931l,
18096             0x8ae59615c884d8d8l },
18097           0 },
18098         /* 7 << 48 */
18099         { { 0xf634b57b39f8868al,0xe27f4fd475cc69afl,0xa47e58cbd0d5496el,
18100             0x8a26793fd323e07fl },
18101           { 0xc61a9b72fa30f349l,0x94c9d9c9b696d134l,0x792beca85880a6d1l,
18102             0xbdcc4645af039995l },
18103           0 },
18104         /* 9 << 48 */
18105         { { 0xce7ef8e58c796c3cl,0x9adaae84dd66e57al,0x784ae13e45227f33l,
18106             0xb046c5b82a85e757l },
18107           { 0xb7aa50aeec37631fl,0xbedc4fca3b300758l,0x0f82567e0ac9700bl,
18108             0x1071d9d44ff5f8d2l },
18109           0 },
18110         /* 10 << 48 */
18111         { { 0x61360ee99e240d18l,0x057cdcacb4b94466l,0xe7667cd12fe5325cl,
18112             0x1fa297b521974e3bl },
18113           { 0xfa4081e7db083d76l,0x31993be6f206bd15l,0x8949269b14c19f8cl,
18114             0x21468d72a9d92357l },
18115           0 },
18116         /* 11 << 48 */
18117         { { 0xd09ef6c4e51a2811l,0x39f6862bb8fb66b9l,0x64e77f8d22dfaa99l,
18118             0x7b10504461b08aacl },
18119           { 0x71704e4c4a7df332l,0xd09734342ffe015bl,0xab0eaf4408d3020el,
18120             0x28b1909eed63b97al },
18121           0 },
18122         /* 13 << 48 */
18123         { { 0x2f3fa882cdadcd4fl,0xa4ef68595f631995l,0xe52ca2f9e531766fl,
18124             0x20af5c3057e2c1d3l },
18125           { 0x1e4828f6e51e94b8l,0xf900a1751a2f5d4fl,0xe831adb3392c58a0l,
18126             0x4c5a90ca1b6e5866l },
18127           0 },
18128         /* 15 << 48 */
18129         { { 0x5f3dcba86182827cl,0xd1a448ddbd7e7252l,0x2d8f96fcf493b815l,
18130             0xba0a4c263b0aa95fl },
18131           { 0x88a1514063a0007fl,0x9564c25e6a9c5846l,0x5a4d7b0fdc0fcbcal,
18132             0x2275daa33f8a740el },
18133           0 },
18134         /* 16 << 48 */
18135         { { 0x83f49167ceca9754l,0x426d2cf64b7939a0l,0x2555e355723fd0bfl,
18136             0xa96e6d06c4f144e2l },
18137           { 0x4768a8dd87880e61l,0x15543815e508e4d5l,0x09d7e772b1b65e15l,
18138             0x63439dd6ac302fa0l },
18139           0 },
18140         /* 17 << 48 */
18141         { { 0x159591cc0461086bl,0xb695aa9495e66e51l,0x2d4c946779ded531l,
18142             0xbd2482ba89c2be79l },
18143           { 0x8ee2658aa20bbf19l,0xc000528a32247917l,0xd924be4affeae845l,
18144             0x51312bebed992c8bl },
18145           0 },
18146         /* 19 << 48 */
18147         { { 0x3a01b958dc752bd9l,0x2babdbc20c215d45l,0xe689d79a131641c1l,
18148             0x48e8f0da80e05ed4l },
18149           { 0x4b505feb77bb70c4l,0xefbd3e2bb6057ef7l,0x7583e22dce603ca5l,
18150             0xfbe3b1f22c5c70c7l },
18151           0 },
18152         /* 21 << 48 */
18153         { { 0x8ec1ecf029e5e35al,0x2f3168e58645c2b3l,0xe9297362c7f94cb2l,
18154             0x4fbf1466d1c90b39l },
18155           { 0x3e4f7656920bae2al,0x805d04b9f1beb172l,0x729a7208dbdbd4b4l,
18156             0x1aade45687aeca53l },
18157           0 },
18158         /* 23 << 48 */
18159         { { 0xb0ff1f541934a508l,0x19e1397604bbf31al,0xb2a8e6033717a6b4l,
18160             0xd601e45d0ef12cb9l },
18161           { 0x563f0af5b515e98el,0x9b129db633984f9bl,0xe34aba2fa47e4a65l,
18162             0xb56f82d19e3f9d82l },
18163           0 },
18164         /* 25 << 48 */
18165         { { 0x0203effdb1209b86l,0x21f063edb19d6cbfl,0x59f53476980f275bl,
18166             0x202456d7b7ac5e80l },
18167           { 0xe5a8c05f4900edc9l,0x04c08eb470f01e86l,0xf74ac2241dcd98cel,
18168             0x7e77cc0ce2e830dbl },
18169           0 },
18170         /* 27 << 48 */
18171         { { 0x74e37234a9747edel,0x4fc9fbb1361b1013l,0xe7b533733cf357efl,
18172             0x6aa2dd2c991c4193l },
18173           { 0x7887e4d2a770917al,0xdd1809b4c20d24cbl,0x004cd7c38e9c2d3el,
18174             0xc77c5baba9970abel },
18175           0 },
18176         /* 28 << 48 */
18177         { { 0x20ac0351d598d710l,0x272c4166cb3a4da4l,0xdb82fe1aca71de1fl,
18178             0x746e79f2d8f54b0fl },
18179           { 0x6e7fc7364b573e9bl,0x75d03f46fd4b5040l,0x5c1cc36d0b98d87bl,
18180             0x513ba3f11f472da1l },
18181           0 },
18182         /* 29 << 48 */
18183         { { 0x52927eaac3af237fl,0xfaa06065d7398767l,0x042e72b497c6ce0bl,
18184             0xdaed0cc40a9f2361l },
18185           { 0xddc2e11c2fc1bb4al,0x631da5770c1a9ef8l,0x8a4cfe44680272bfl,
18186             0xc76b9f7262fb5cc3l },
18187           0 },
18188         /* 31 << 48 */
18189         { { 0x248f814538b3aae3l,0xb5345864bc204334l,0x66d6b5bc1d127524l,
18190             0xe312080d14f572d3l },
18191           { 0x13ed15a716abafebl,0x6f18ce27dba967bel,0x96c9e826ef08552dl,
18192             0x2c191b06be2b63e0l },
18193           0 },
18194         /* 33 << 48 */
18195         { { 0xde4be45dc115ca51l,0xa028cafe934dabd6l,0x7e875663d1c0f8c5l,
18196             0xa8e32ab063d17473l },
18197           { 0x33f55bd5543199aal,0x79d2c937a2071d6el,0xa6a6758ceff16f28l,
18198             0x9c5f93ef87d85201l },
18199           0 },
18200         /* 34 << 48 */
18201         { { 0x7f2e440381e9ede3l,0x243c3894caf6df0al,0x7c605bb11c073b11l,
18202             0xcd06a541ba6a4a62l },
18203           { 0x2916894949d4e2e5l,0x33649d074af66880l,0xbfc0c885e9a85035l,
18204             0xb4e52113fc410f4bl },
18205           0 },
18206         /* 35 << 48 */
18207         { { 0xe86f21bc3ad4c81el,0x53b408403a37dcebl,0xaa606087383402cdl,
18208             0xc248caf185452b1dl },
18209           { 0x38853772576b57cdl,0xe2798e5441b7a6edl,0x7c2f1eed95ef4a33l,
18210             0xccd7e776adb1873cl },
18211           0 },
18212         /* 36 << 48 */
18213         { { 0xdca3b70678a6513bl,0x92ea4a2a9edb1943l,0x02642216db6e2dd8l,
18214             0x9b45d0b49fd57894l },
18215           { 0x114e70dbc69d11ael,0x1477dd194c57595fl,0xbc2208b4ec77c272l,
18216             0x95c5b4d7db68f59cl },
18217           0 },
18218         /* 37 << 48 */
18219         { { 0xd978bb791c61030al,0xa47325d2218222f3l,0x65ad4d4832e67d97l,
18220             0x31e4ed632e0d162al },
18221           { 0x7308ea317f76da37l,0xcfdffe87d93f35d8l,0xf4b2d60ee6f96cc4l,
18222             0x8028f3bd0117c421l },
18223           0 },
18224         /* 39 << 48 */
18225         { { 0x7df80cbb9543edb6l,0xa07a54df40b0b3bcl,0xacbd067cc1888488l,
18226             0x61ad61318a00c721l },
18227           { 0x67e7599ebe2e6fe6l,0x8349d568f7270e06l,0x5630aabc307bc0c7l,
18228             0x97210b3f71af442fl },
18229           0 },
18230         /* 40 << 48 */
18231         { { 0xfe541fa47ea67c77l,0x952bd2afe3ea810cl,0x791fef568d01d374l,
18232             0xa3a1c6210f11336el },
18233           { 0x5ad0d5a9c7ec6d79l,0xff7038af3225c342l,0x003c6689bc69601bl,
18234             0x25059bc745e8747dl },
18235           0 },
18236         /* 41 << 48 */
18237         { { 0x58bdabb7ef701b5fl,0x64f987aee00c3a96l,0x533b391e2d585679l,
18238             0x30ad79d97a862e03l },
18239           { 0xd941471e8177b261l,0x33f65cb856a9018el,0x985ce9f607759fc4l,
18240             0x9b085f33aefdbd9el },
18241           0 },
18242         /* 43 << 48 */
18243         { { 0xab2fa51a9c43ee15l,0x457f338263f30575l,0xce8dcd863e75a6e0l,
18244             0x67a03ab86e70421al },
18245           { 0xe72c37893e174230l,0x45ffff6c066f4816l,0x3a3dd84879a2d4a7l,
18246             0xefa4b7e68b76c24cl },
18247           0 },
18248         /* 44 << 48 */
18249         { { 0x9a75c80676cb2566l,0x8f76acb1b24892d9l,0x7ae7b9cc1f08fe45l,
18250             0x19ef73296a4907d8l },
18251           { 0x2db4ab715f228bf0l,0xf3cdea39817032d7l,0x0b1f482edcabe3c0l,
18252             0x3baf76b4bb86325cl },
18253           0 },
18254         /* 45 << 48 */
18255         { { 0xd6be8f00e39e056al,0xb58f87a6232fa3bcl,0xd5cb09dc6b18c772l,
18256             0x3177256da8e7e17bl },
18257           { 0x1877fd34230bf92cl,0x6f9031175a36f632l,0x526a288728e2c9d9l,
18258             0xc373fc94415ec45cl },
18259           0 },
18260         /* 46 << 48 */
18261         { { 0xd49065e010089465l,0x3bab5d298e77c596l,0x7636c3a6193dbd95l,
18262             0xdef5d294b246e499l },
18263           { 0xb22c58b9286b2475l,0xa0b93939cd80862bl,0x3002c83af0992388l,
18264             0x6de01f9beacbe14cl },
18265           0 },
18266         /* 47 << 48 */
18267         { { 0x70fa6e2a2bf5e373l,0x501691739271694cl,0xd6ebb98c5d2ed9f1l,
18268             0x11fd0b3f225bf92dl },
18269           { 0x51ffbcea1e3d5520l,0xa7c549875513ad47l,0xe9689750b431d46dl,
18270             0x6e69fecbb620cb9al },
18271           0 },
18272         /* 48 << 48 */
18273         { { 0x6aac688eadd70482l,0x708de92a7b4a4e8al,0x75b6dd73758a6eefl,
18274             0xea4bf352725b3c43l },
18275           { 0x10041f2c87912868l,0xb1b1be95ef09297al,0x19ae23c5a9f3860al,
18276             0xc4f0f839515dcf4bl },
18277           0 },
18278         /* 49 << 48 */
18279         { { 0xf3c22398e04b5734l,0x4fba59b275f2579dl,0xbf95182d691901b3l,
18280             0x4c139534eb599496l },
18281           { 0xf3f821de33b77e8bl,0x66e580743785d42fl,0xe3ba3d5abdc89c2dl,
18282             0x7ee988bdd19f37b9l },
18283           0 },
18284         /* 51 << 48 */
18285         { { 0xe9ba62ca2ee53eb0l,0x64295ae23401d7dal,0x70ed8be24e493580l,
18286             0x702caa624502732fl },
18287           { 0xb1f4e21278d0cedfl,0x130b114bdc97057bl,0x9c5d0bd3c38c77b5l,
18288             0xd9d641e18bad68e7l },
18289           0 },
18290         /* 52 << 48 */
18291         { { 0xc71e27bf8538a5c6l,0x195c63dd89abff17l,0xfd3152851b71e3dal,
18292             0x9cbdfda7fa680fa0l },
18293           { 0x9db876ca849d7eabl,0xebe2764b3c273271l,0x663357e3f208dceal,
18294             0x8c5bd833565b1b70l },
18295           0 },
18296         /* 53 << 48 */
18297         { { 0x7c2dea1d122aebd4l,0x090bee4a138c1e4dl,0x94a9ffe59e4aca6cl,
18298             0x8f3212ba5d405c7fl },
18299           { 0x6618185f180b5e85l,0x76298d46f455ab9fl,0x0c804076476b2d88l,
18300             0x45ea9d03d5a40b39l },
18301           0 },
18302         /* 55 << 48 */
18303         { { 0xdf325ac76a2ed772l,0x35da47ccb0da2765l,0x94ce6f460bc9b166l,
18304             0xe0fc82fb5f7f3628l },
18305           { 0x2b26d588c055f576l,0xb9d37c97ec2bae98l,0xffbbead856908806l,
18306             0xa8c2df87437f4c84l },
18307           0 },
18308         /* 57 << 48 */
18309         { { 0x47d11c3528430994l,0x0183df71cf13d9d3l,0x98604c89aa138fe5l,
18310             0xb1432e1c32c09aa1l },
18311           { 0xf19bc45d99bd5e34l,0xb198be72108e9b89l,0xee500ae9dacde648l,
18312             0x5936cf98746870a9l },
18313           0 },
18314         /* 59 << 48 */
18315         { { 0x6d8efb98ed1d5a9bl,0x2e0b08e697f778fal,0xda728454dc5e0835l,
18316             0x2c28a45f8e3651c4l },
18317           { 0x667fab6f7ee77088l,0xd94429c8f29a94b4l,0xd83d594d9deea5b2l,
18318             0x2dc08ccbbea58080l },
18319           0 },
18320         /* 60 << 48 */
18321         { { 0xba5514df3fd165e8l,0x499fd6a9061f8811l,0x72cd1fe0bfef9f00l,
18322             0x120a4bb979ad7e8al },
18323           { 0xf2ffd0955f4a5ac5l,0xcfd174f195a7a2f0l,0xd42301ba9d17baf1l,
18324             0xd2fa487a77f22089l },
18325           0 },
18326         /* 61 << 48 */
18327         { { 0xfb5f53ba20a9a01el,0x3adb174fd20d6a9cl,0x6db8bb6d80e0f64fl,
18328             0x596e428df6a26f76l },
18329           { 0xbab1f846e6a4e362l,0x8bdb22af9b1becbdl,0x62b48335f31352adl,
18330             0xd72c26409634f727l },
18331           0 },
18332         /* 63 << 48 */
18333         { { 0xaaa61cb22b1ec1c3l,0x3b5156722cb6f00el,0x67d1be0a8bf83f60l,
18334             0x88f1627aa4b804bcl },
18335           { 0xc52b11a7cdade2abl,0xa6a8b71a606a4e9dl,0x04e0e6697b900551l,
18336             0x35cfa33c8d5ad0d2l },
18337           0 },
18338         /* 64 << 48 */
18339         { { 0xb93452381d531696l,0x57201c0088cdde69l,0xdde922519a86afc7l,
18340             0xe3043895bd35cea8l },
18341           { 0x7608c1e18555970dl,0x8267dfa92535935el,0xd4c60a57322ea38bl,
18342             0xe0bf7977804ef8b5l },
18343           0 },
18344         /* 65 << 48 */
18345         { { 0x375ca189b60f0d5al,0xc9458cf949a78362l,0x61c1c5024262c03al,
18346             0x299353db4363d5bel },
18347           { 0xe3565124dac407fel,0x16ea66cd5b93c532l,0xe5c6aec2749df8e3l,
18348             0x59181317ce3ee4bfl },
18349           0 },
18350         /* 71 << 48 */
18351         { { 0xd46ea34af41c2a3cl,0x9936184916545c98l,0xd7cb800ccf2498b4l,
18352             0xe71d088d9353fe87l },
18353           { 0x43443cbeae2e172cl,0x77131656ca905cb3l,0x76471fd1dce63594l,
18354             0x346b1d1738f5e264l },
18355           0 },
18356         /* 77 << 48 */
18357         { { 0x22b1e639f6d0a419l,0x8bbb1fad7cea278cl,0xf07f6c01370cc86al,
18358             0x661bd027d39b837fl },
18359           { 0x042c7a69de606098l,0x93433b154e44eb12l,0x20f44ada88d8bfe8l,
18360             0xb44f66e64ccbfab6l },
18361           0 },
18362         /* 83 << 48 */
18363         { { 0x1cc32158583d9745l,0x9306223cad1c2201l,0x76aa8d0995748039l,
18364             0x29425391707e9b59l },
18365           { 0x8501c0d4487cdf9el,0xbe08e89c205c5611l,0xa950400b04ccc48bl,
18366             0xb614b69b637e966bl },
18367           0 },
18368         /* 89 << 48 */
18369         { { 0xd9c3c1238ffa5c4bl,0xc65765f7f3593988l,0x9a7e5d2728242119l,
18370             0x0ad27b5097ad7620l },
18371           { 0x154cc5eb413a8b23l,0xae93d8de7afa8254l,0x9ce5116cab9907b5l,
18372             0x9a163d78063103b9l },
18373           0 },
18374         /* 95 << 48 */
18375         { { 0x5c4c299291086d2al,0x42c6ca9de8e2d951l,0xe67ecf93dd353f30l,
18376             0xba54557fe7167c2el },
18377           { 0x04a7eb2db734c779l,0x8f345605e300711al,0x4811c1ad67b27de6l,
18378             0xb7ac8e842731d5f0l },
18379           0 },
18380         /* 101 << 48 */
18381         { { 0xee33a1d8e449ac46l,0x2500ba0aaaebfa2dl,0x8fb914ebc424eff4l,
18382             0x3a36545d3989255el },
18383           { 0xd24f2484761235e6l,0x2fc5d5ddd9b2c04bl,0x73660f86070ab0dbl,
18384             0x2e266d0479d20c7bl },
18385           0 },
18386         /* 107 << 48 */
18387         { { 0x143752d5316d19a3l,0x56a55e01915497b8l,0x44ba4b2609a5fd15l,
18388             0xe4fc3e7fd9bee4eel },
18389           { 0x6f9d8609878a9f26l,0xdf36b5bd2ede7a20l,0x8e03e712a9a3e435l,
18390             0x4ced555b56546d33l },
18391           0 },
18392         /* 113 << 48 */
18393         { { 0x89a6aaab0882717el,0x56a9736b43fa5153l,0xdb07dcc9d0e1fb1al,
18394             0xe7c986d34145e227l },
18395           { 0x57be66abb10dad51l,0xa47b964e4aa01ea7l,0xd851d9f36bb837cbl,
18396             0x9851ab3d652e13f7l },
18397           0 },
18398         /* 116 << 48 */
18399         { { 0x22b88a805616ee30l,0xfb09548fe7ab1083l,0x8ad6ab0d511270cdl,
18400             0x61f6c57a6924d9abl },
18401           { 0xa0f7bf7290aecb08l,0x849f87c90df784a4l,0x27c79c15cfaf1d03l,
18402             0xbbf9f675c463facel },
18403           0 },
18404         /* 119 << 48 */
18405         { { 0x65512fb716dd6ce1l,0xfa76ebc960d53b35l,0x31e5322e19ada3bel,
18406             0x7e259b75d0ccc3cdl },
18407           { 0xd36d03f0e025fd69l,0xbefab782eea9e5f3l,0x1569969dd09ce6a7l,
18408             0x2df5396178c385b0l },
18409           0 },
18410         /* 125 << 48 */
18411         { { 0x4201652fce0ccac7l,0x12f8e93df1d29d2dl,0x6c2ac9b2220f00c1l,
18412             0x4ee6a685a850baa9l },
18413           { 0x2c2371f163ee8829l,0xddff16488f464433l,0xeab6cd8869a2c413l,
18414             0xcae34beb85e4c2a8l },
18415           0 },
18416     },
18417     {
18418         /* 0 << 56 */
18419         { { 0x00, 0x00, 0x00, 0x00 },
18420           { 0x00, 0x00, 0x00, 0x00 },
18421           1 },
18422         /* 1 << 56 */
18423         { { 0xc7913e91991724f3l,0x5eda799c39cbd686l,0xddb595c763d4fc1el,
18424             0x6b63b80bac4fed54l },
18425           { 0x6ea0fc697e5fb516l,0x737708bad0f1c964l,0x9628745f11a92ca5l,
18426             0x61f379589a86967al },
18427           0 },
18428         /* 3 << 56 */
18429         { { 0x46a8c4180d738dedl,0x6f1a5bb0e0de5729l,0xf10230b98ba81675l,
18430             0x32c6f30c112b33d4l },
18431           { 0x7559129dd8fffb62l,0x6a281b47b459bf05l,0x77c1bd3afa3b6776l,
18432             0x0709b3807829973al },
18433           0 },
18434         /* 4 << 56 */
18435         { { 0x8c26b232a3326505l,0x38d69272ee1d41bfl,0x0459453effe32afal,
18436             0xce8143ad7cb3ea87l },
18437           { 0x932ec1fa7e6ab666l,0x6cd2d23022286264l,0x459a46fe6736f8edl,
18438             0x50bf0d009eca85bbl },
18439           0 },
18440         /* 5 << 56 */
18441         { { 0x0b825852877a21ecl,0x300414a70f537a94l,0x3f1cba4021a9a6a2l,
18442             0x50824eee76943c00l },
18443           { 0xa0dbfcecf83cba5dl,0xf953814893b4f3c0l,0x6174416248f24dd7l,
18444             0x5322d64de4fb09ddl },
18445           0 },
18446         /* 7 << 56 */
18447         { { 0xa337c447f1f0ced1l,0x800cc7939492dd2bl,0x4b93151dbea08efal,
18448             0x820cf3f8de0a741el },
18449           { 0xff1982dc1c0f7d13l,0xef92196084dde6cal,0x1ad7d97245f96ee3l,
18450             0x319c8dbe29dea0c7l },
18451           0 },
18452         /* 9 << 56 */
18453         { { 0x0ae1d63b0eb919b0l,0xd74ee51da74b9620l,0x395458d0a674290cl,
18454             0x324c930f4620a510l },
18455           { 0x2d1f4d19fbac27d4l,0x4086e8ca9bedeeacl,0x0cdd211b9b679ab8l,
18456             0x5970167d7090fec4l },
18457           0 },
18458         /* 10 << 56 */
18459         { { 0x3420f2c9faf1fc63l,0x616d333a328c8bb4l,0x7d65364c57f1fe4al,
18460             0x9343e87755e5c73al },
18461           { 0x5795176be970e78cl,0xa36ccebf60533627l,0xfc7c738009cdfc1bl,
18462             0xb39a2afeb3fec326l },
18463           0 },
18464         /* 11 << 56 */
18465         { { 0xb7ff1ba16224408al,0xcc856e92247cfc5el,0x01f102e7c18bc493l,
18466             0x4613ab742091c727l },
18467           { 0xaa25e89cc420bf2bl,0x00a5317690337ec2l,0xd2be9f437d025fc7l,
18468             0x3316fb856e6fe3dcl },
18469           0 },
18470         /* 13 << 56 */
18471         { { 0x67332cfc2064cfd1l,0x339c31deb0651934l,0x719b28d52a3bcbeal,
18472             0xee74c82b9d6ae5c6l },
18473           { 0x0927d05ebaf28ee6l,0x82cecf2c9d719028l,0x0b0d353eddb30289l,
18474             0xfe4bb977fddb2e29l },
18475           0 },
18476         /* 15 << 56 */
18477         { { 0xe10b2ab817a91cael,0xb89aab6508e27f63l,0x7b3074a7dba3ddf9l,
18478             0x1c20ce09330c2972l },
18479           { 0x6b9917b45fcf7e33l,0xe6793743945ceb42l,0x18fc22155c633d19l,
18480             0xad1adb3cc7485474l },
18481           0 },
18482         /* 16 << 56 */
18483         { { 0x646f96796424c49bl,0xf888dfe867c241c9l,0xe12d4b9324f68b49l,
18484             0x9a6b62d8a571df20l },
18485           { 0x81b4b26d179483cbl,0x666f96329511fae2l,0xd281b3e4d53aa51fl,
18486             0x7f96a7657f3dbd16l },
18487           0 },
18488         /* 17 << 56 */
18489         { { 0xa7f8b5bf074a30cel,0xd7f52107005a32e6l,0x6f9e090750237ed4l,
18490             0x2f21da478096fa2bl },
18491           { 0xf3e19cb4eec863a0l,0xd18f77fd9527620al,0x9505c81c407c1cf8l,
18492             0x9998db4e1b6ec284l },
18493           0 },
18494         /* 19 << 56 */
18495         { { 0x794e2d5984ac066cl,0xf5954a92e68c69a0l,0x28c524584fd99dccl,
18496             0x60e639fcb1012517l },
18497           { 0xc2e601257de79248l,0xe9ef6404f12fc6d7l,0x4c4f28082a3b5d32l,
18498             0x865ad32ec768eb8al },
18499           0 },
18500         /* 21 << 56 */
18501         { { 0x4f4ddf91b2f1ac7al,0xf99eaabb760fee27l,0x57f4008a49c228e5l,
18502             0x090be4401cf713bbl },
18503           { 0xac91fbe45004f022l,0xd838c2c2569e1af6l,0xd6c7d20b0f1daaa5l,
18504             0xaa063ac11bbb02c0l },
18505           0 },
18506         /* 23 << 56 */
18507         { { 0x54935fcb81d73c9el,0x6d07e9790a5e97abl,0x4dc7b30acf3a6babl,
18508             0x147ab1f3170bee11l },
18509           { 0x0aaf8e3d9fafdee4l,0xfab3dbcb538a8b95l,0x405df4b36ef13871l,
18510             0xf1f4e9cb088d5a49l },
18511           0 },
18512         /* 25 << 56 */
18513         { { 0x43c01b87459afccdl,0x6bd45143b7432652l,0x8473453055b5d78el,
18514             0x81088fdb1554ba7dl },
18515           { 0xada0a52c1e269375l,0xf9f037c42dc5ec10l,0xc066060794bfbc11l,
18516             0xc0a630bbc9c40d2fl },
18517           0 },
18518         /* 27 << 56 */
18519         { { 0x9a730ed44763eb50l,0x24a0e221c1ab0d66l,0x643b6393648748f3l,
18520             0x1982daa16d3c6291l },
18521           { 0x6f00a9f78bbc5549l,0x7a1783e17f36384el,0xe8346323de977f50l,
18522             0x91ab688db245502al },
18523           0 },
18524         /* 28 << 56 */
18525         { { 0x331ab6b56d0bdd66l,0x0a6ef32e64b71229l,0x1028150efe7c352fl,
18526             0x27e04350ce7b39d3l },
18527           { 0x2a3c8acdc1070c82l,0xfb2034d380c9feefl,0x2d729621709f3729l,
18528             0x8df290bf62cb4549l },
18529           0 },
18530         /* 29 << 56 */
18531         { { 0x02f99f33fc2e4326l,0x3b30076d5eddf032l,0xbb21f8cf0c652fb5l,
18532             0x314fb49eed91cf7bl },
18533           { 0xa013eca52f700750l,0x2b9e3c23712a4575l,0xe5355557af30fbb0l,
18534             0x1ada35167c77e771l },
18535           0 },
18536         /* 31 << 56 */
18537         { { 0xdc9f46fc609e4a74l,0x2a44a143ba667f91l,0xbc3d8b95b4d83436l,
18538             0xa01e4bd0c7bd2958l },
18539           { 0x7b18293273483c90l,0xa79c6aa1a7c7b598l,0xbf3983c6eaaac07el,
18540             0x8f18181e96e0d4e6l },
18541           0 },
18542         /* 33 << 56 */
18543         { { 0x0bfc27eeacee5043l,0xae419e732eb10f02l,0x19c028d18943fb05l,
18544             0x71f01cf7ff13aa2al },
18545           { 0x7790737e8887a132l,0x6751330966318410l,0x9819e8a37ddb795el,
18546             0xfecb8ef5dad100b2l },
18547           0 },
18548         /* 34 << 56 */
18549         { { 0x59f74a223021926al,0xb7c28a496f9b4c1cl,0xed1a733f912ad0abl,
18550             0x42a910af01a5659cl },
18551           { 0x3842c6e07bd68cabl,0x2b57fa3876d70ac8l,0x8a6707a83c53aaebl,
18552             0x62c1c51065b4db18l },
18553           0 },
18554         /* 35 << 56 */
18555         { { 0x8de2c1fbb2d09dc7l,0xc3dfed12266bd23bl,0x927d039bd5b27db6l,
18556             0x2fb2f0f1103243dal },
18557           { 0xf855a07b80be7399l,0xed9327ce1f9f27a8l,0xa0bd99c7729bdef7l,
18558             0x2b67125e28250d88l },
18559           0 },
18560         /* 36 << 56 */
18561         { { 0x784b26e88670ced7l,0xe3dfe41fc31bd3b4l,0x9e353a06bcc85cbcl,
18562             0x302e290960178a9dl },
18563           { 0x860abf11a6eac16el,0x76447000aa2b3aacl,0x46ff9d19850afdabl,
18564             0x35bdd6a5fdb2d4c1l },
18565           0 },
18566         /* 37 << 56 */
18567         { { 0xe82594b07e5c9ce9l,0x0f379e5320af346el,0x608b31e3bc65ad4al,
18568             0x710c6b12267c4826l },
18569           { 0x51c966f971954cf1l,0xb1cec7930d0aa215l,0x1f15598986bd23a8l,
18570             0xae2ff99cf9452e86l },
18571           0 },
18572         /* 39 << 56 */
18573         { { 0xb5a741a76b2515cfl,0x71c416019585c749l,0x78350d4fe683de97l,
18574             0x31d6152463d0b5f5l },
18575           { 0x7a0cc5e1fbce090bl,0xaac927edfbcb2a5bl,0xe920de4920d84c35l,
18576             0x8c06a0b622b4de26l },
18577           0 },
18578         /* 40 << 56 */
18579         { { 0xd34dd58bafe7ddf3l,0x55851fedc1e6e55bl,0xd1395616960696e7l,
18580             0x940304b25f22705fl },
18581           { 0x6f43f861b0a2a860l,0xcf1212820e7cc981l,0x121862120ab64a96l,
18582             0x09215b9ab789383cl },
18583           0 },
18584         /* 41 << 56 */
18585         { { 0x311eb30537387c09l,0xc5832fcef03ee760l,0x30358f5832f7ea19l,
18586             0xe01d3c3491d53551l },
18587           { 0x1ca5ee41da48ea80l,0x34e71e8ecf4fa4c1l,0x312abd257af1e1c7l,
18588             0xe3afcdeb2153f4a5l },
18589           0 },
18590         /* 43 << 56 */
18591         { { 0x2a17747fa6d74081l,0x60ea4c0555a26214l,0x53514bb41f88c5fel,
18592             0xedd645677e83426cl },
18593           { 0xd5d6cbec96460b25l,0xa12fd0ce68dc115el,0xc5bc3ed2697840eal,
18594             0x969876a8a6331e31l },
18595           0 },
18596         /* 44 << 56 */
18597         { { 0x60c36217472ff580l,0xf42297054ad41393l,0x4bd99ef0a03b8b92l,
18598             0x501c7317c144f4f6l },
18599           { 0x159009b318464945l,0x6d5e594c74c5c6bel,0x2d587011321a3660l,
18600             0xd1e184b13898d022l },
18601           0 },
18602         /* 45 << 56 */
18603         { { 0x5ba047524c6a7e04l,0x47fa1e2b45550b65l,0x9419daf048c0a9a5l,
18604             0x663629537c243236l },
18605           { 0xcd0744b15cb12a88l,0x561b6f9a2b646188l,0x599415a566c2c0c0l,
18606             0xbe3f08590f83f09al },
18607           0 },
18608         /* 46 << 56 */
18609         { { 0x9141c5beb92041b8l,0x01ae38c726477d0dl,0xca8b71f3d12c7a94l,
18610             0xfab5b31f765c70dbl },
18611           { 0x76ae7492487443e9l,0x8595a310990d1349l,0xf8dbeda87d460a37l,
18612             0x7f7ad0821e45a38fl },
18613           0 },
18614         /* 47 << 56 */
18615         { { 0xed1d4db61059705al,0xa3dd492ae6b9c697l,0x4b92ee3a6eb38bd5l,
18616             0xbab2609d67cc0bb7l },
18617           { 0x7fc4fe896e70ee82l,0xeff2c56e13e6b7e3l,0x9b18959e34d26fcal,
18618             0x2517ab66889d6b45l },
18619           0 },
18620         /* 48 << 56 */
18621         { { 0xf167b4e0bdefdd4fl,0x69958465f366e401l,0x5aa368aba73bbec0l,
18622             0x121487097b240c21l },
18623           { 0x378c323318969006l,0xcb4d73cee1fe53d1l,0x5f50a80e130c4361l,
18624             0xd67f59517ef5212bl },
18625           0 },
18626         /* 49 << 56 */
18627         { { 0xf145e21e9e70c72el,0xb2e52e295566d2fbl,0x44eaba4a032397f5l,
18628             0x5e56937b7e31a7del },
18629           { 0x68dcf517456c61e1l,0xbc2e954aa8b0a388l,0xe3552fa760a8b755l,
18630             0x03442dae73ad0cdel },
18631           0 },
18632         /* 51 << 56 */
18633         { { 0x3fcbdbce478e2135l,0x7547b5cfbda35342l,0xa97e81f18a677af6l,
18634             0xc8c2bf8328817987l },
18635           { 0xdf07eaaf45580985l,0xc68d1f05c93b45cbl,0x106aa2fec77b4cacl,
18636             0x4c1d8afc04a7ae86l },
18637           0 },
18638         /* 52 << 56 */
18639         { { 0xdb41c3fd9eb45ab2l,0x5b234b5bd4b22e74l,0xda253decf215958al,
18640             0x67e0606ea04edfa0l },
18641           { 0xabbbf070ef751b11l,0xf352f175f6f06dcel,0xdfc4b6af6839f6b4l,
18642             0x53ddf9a89959848el },
18643           0 },
18644         /* 53 << 56 */
18645         { { 0xda49c379c21520b0l,0x90864ff0dbd5d1b6l,0x2f055d235f49c7f7l,
18646             0xe51e4e6aa796b2d8l },
18647           { 0xc361a67f5c9dc340l,0x5ad53c37bca7c620l,0xda1d658832c756d0l,
18648             0xad60d9118bb67e13l },
18649           0 },
18650         /* 55 << 56 */
18651         { { 0xd1183316fd6f7140l,0xf9fadb5bbd8e81f7l,0x701d5e0c5a02d962l,
18652             0xfdee4dbf1b601324l },
18653           { 0xbed1740735d7620el,0x04e3c2c3f48c0012l,0x9ee29da73455449al,
18654             0x562cdef491a836c4l },
18655           0 },
18656         /* 57 << 56 */
18657         { { 0x147ebf01fad097a5l,0x49883ea8610e815dl,0xe44d60ba8a11de56l,
18658             0xa970de6e827a7a6dl },
18659           { 0x2be414245e17fc19l,0xd833c65701214057l,0x1375813b363e723fl,
18660             0x6820bb88e6a52e9bl },
18661           0 },
18662         /* 59 << 56 */
18663         { { 0xe1b6f60c08191224l,0xc4126ebbde4ec091l,0xe1dff4dc4ae38d84l,
18664             0xde3f57db4f2ef985l },
18665           { 0x34964337d446a1ddl,0x7bf217a0859e77f6l,0x8ff105278e1d13f5l,
18666             0xa304ef0374eeae27l },
18667           0 },
18668         /* 60 << 56 */
18669         { { 0xfc6f5e47d19dfa5al,0xdb007de37fad982bl,0x28205ad1613715f5l,
18670             0x251e67297889529el },
18671           { 0x727051841ae98e78l,0xf818537d271cac32l,0xc8a15b7eb7f410f5l,
18672             0xc474356f81f62393l },
18673           0 },
18674         /* 61 << 56 */
18675         { { 0x92dbdc5ac242316bl,0xabe060acdbf4aff5l,0x6e8c38fe909a8ec6l,
18676             0x43e514e56116cb94l },
18677           { 0x2078fa3807d784f9l,0x1161a880f4b5b357l,0x5283ce7913adea3dl,
18678             0x0756c3e6cc6a910bl },
18679           0 },
18680         /* 63 << 56 */
18681         { { 0xa573a4966d17fbc7l,0x0cd1a70a73d2b24el,0x34e2c5cab2676937l,
18682             0xe7050b06bf669f21l },
18683           { 0xfbe948b61ede9046l,0xa053005197662659l,0x58cbd4edf10124c5l,
18684             0xde2646e4dd6c06c8l },
18685           0 },
18686         /* 64 << 56 */
18687         { { 0x332f81088cad38c0l,0x471b7e906bd68ae2l,0x56ac3fb20d8e27a3l,
18688             0xb54660db136b4b0dl },
18689           { 0x123a1e11a6fd8de4l,0x44dbffeaa37799efl,0x4540b977ce6ac17cl,
18690             0x495173a8af60acefl },
18691           0 },
18692         /* 65 << 56 */
18693         { { 0xc48b1478db447d0bl,0xe1b85f5d46104fbbl,0x4ab31e7d991c60b9l,
18694             0xaa674a9258a0cfd0l },
18695           { 0x179fc2cd316f4297l,0x90c18642dcccbc82l,0x65d4309e56a4c163l,
18696             0xf211a9c7145a33ecl },
18697           0 },
18698         /* 71 << 56 */
18699         { { 0x9669170cdc32717fl,0x52d69b5138133e34l,0xaed24e5fb079c3b2l,
18700             0xaba44a91a21ea3d2l },
18701           { 0xd6814f1938d40105l,0x38289fe463462e7al,0x1793eefa3a80cbf5l,
18702             0x05816a0795f29bacl },
18703           0 },
18704         /* 77 << 56 */
18705         { { 0xdca88ad98f850641l,0x8c1152c447999b0dl,0x509f654e654aff33l,
18706             0x2228550f08a12f14l },
18707           { 0x60fe99dbb6a0ccdbl,0x80d6829bfc2cddccl,0x190f454dd5617aa4l,
18708             0x0aea05fe36295d2dl },
18709           0 },
18710         /* 83 << 56 */
18711         { { 0x1de06c8af9bef9a5l,0xe24d85d3fb2d3164l,0x3dbe455e8d203d3el,
18712             0x439bee4735ea47a9l },
18713           { 0xcc143432784893d7l,0x9b71073bd9bebd00l,0x6c106b343aa2fe88l,
18714             0x9df2a42734746f7al },
18715           0 },
18716         /* 89 << 56 */
18717         { { 0x1ad0b3725a8c2168l,0x64e52d6d143f0402l,0xd933c783e320f31fl,
18718             0x1ccf90a80ff14f52l },
18719           { 0xd3a3133ee1e6d0c0l,0xfd75a2d5b4acc8cal,0x62659b8e5559d171l,
18720             0x5087d6e9f13ad52al },
18721           0 },
18722         /* 95 << 56 */
18723         { { 0xb4d647a5deef31a4l,0x95bf4ab180975ea9l,0x2f92d15adf57b03el,
18724             0x5ee808ab746b26d6l },
18725           { 0x4341597c1082f261l,0x027795eb40c45e95l,0xcb77744b3b690c30l,
18726             0xdd87c084af3f88d1l },
18727           0 },
18728         /* 101 << 56 */
18729         { { 0x469f177572109785l,0xf365e55123f84d6cl,0x8006a9c28a046dbbl,
18730             0x1b9fbe892fa09f52l },
18731           { 0xac18a88016075e9el,0x4a3069bc1e3fd628l,0x20c61eaa60c61c14l,
18732             0x315b59daf61f004bl },
18733           0 },
18734         /* 107 << 56 */
18735         { { 0x0a94387f26d04857l,0x952a4ebc43d6de95l,0xb422e15cf14abdfal,
18736             0x5b7a0153324ef90cl },
18737           { 0x6aefa20e9826ec5bl,0x0e529886ad2fe161l,0xb710a74ec0d416e8l,
18738             0x6cf4b0a5fb6c90bcl },
18739           0 },
18740         /* 113 << 56 */
18741         { { 0x822aea4031979d3bl,0xb504eafde215a109l,0xa8761ead84bf2377l,
18742             0xb55c1e55efb3d942l },
18743           { 0xd01f9b0212b7f17bl,0x41b62c2a891bfbbfl,0x50800e6b08938149l,
18744             0x527b50a9b0a55d82l },
18745           0 },
18746         /* 116 << 56 */
18747         { { 0x6bc84d8d1d9ce3c4l,0x53b465072a308df0l,0x6c3da9bfca79c88al,
18748             0x9636ad9c36372acfl },
18749           { 0x8840e92c425ef14cl,0x863191f96af3225bl,0xd56d82d0d369b857l,
18750             0x2053a2527a4c41f9l },
18751           0 },
18752         /* 119 << 56 */
18753         { { 0x20aecd6609ca8805l,0x945d9b31dc818ee6l,0x1424647c2119b44bl,
18754             0xbe934d7e5a6641f9l },
18755           { 0xe91d53184559e55el,0xc2fb8e0b4dfbc3d4l,0x9e92e20676cb937fl,
18756             0x0f5582e4f2932429l },
18757           0 },
18758         /* 125 << 56 */
18759         { { 0xb5fc22a42d31809fl,0x6d582d2b0e35b7b4l,0x5fac415158c5f576l,
18760             0xdff239371e4cd7c9l },
18761           { 0x0f62b329ed4d1925l,0x00994a2e6010fb16l,0xb4b91076bd754837l,
18762             0xfde219463345103al },
18763           0 },
18764     },
18765     {
18766         /* 0 << 64 */
18767         { { 0x00, 0x00, 0x00, 0x00 },
18768           { 0x00, 0x00, 0x00, 0x00 },
18769           1 },
18770         /* 1 << 64 */
18771         { { 0x4f922fc516a0d2bbl,0x0d5cc16c1a623499l,0x9241cf3a57c62c8bl,
18772             0x2f5e6961fd1b667fl },
18773           { 0x5c15c70bf5a01797l,0x3d20b44d60956192l,0x04911b37071fdb52l,
18774             0xf648f9168d6f0f7bl },
18775           0 },
18776         /* 3 << 64 */
18777         { { 0x4090914bb5def996l,0x1cb69c83233dd1e7l,0xc1e9c1d39b3d5e76l,
18778             0x1f3338edfccf6012l },
18779           { 0xb1e95d0d2f5378a8l,0xacf4c2c72f00cd21l,0x6e984240eb5fe290l,
18780             0xd66c038d248088ael },
18781           0 },
18782         /* 4 << 64 */
18783         { { 0x9ad5462bb4d8bc50l,0x181c0b16a9195770l,0xebd4fe1c78412a68l,
18784             0xae0341bcc0dff48cl },
18785           { 0xb6bc45cf7003e866l,0xf11a6dea8a24a41bl,0x5407151ad04c24c2l,
18786             0x62c9d27dda5b7b68l },
18787           0 },
18788         /* 5 << 64 */
18789         { { 0xd4992b30614c0900l,0xda98d121bd00c24bl,0x7f534dc87ec4bfa1l,
18790             0x4a5ff67437dc34bcl },
18791           { 0x68c196b81d7ea1d7l,0x38cf289380a6d208l,0xfd56cd09e3cbbd6el,
18792             0xec72e27e4205a5b6l },
18793           0 },
18794         /* 7 << 64 */
18795         { { 0xe8b97932b88756ddl,0xed4e8652f17e3e61l,0xc2dd14993ee1c4a4l,
18796             0xc0aaee17597f8c0el },
18797           { 0x15c4edb96c168af3l,0x6563c7bfb39ae875l,0xadfadb6f20adb436l,
18798             0xad55e8c99a042ac0l },
18799           0 },
18800         /* 9 << 64 */
18801         { { 0x65c29219909523c8l,0xa62f648fa3a1c741l,0x88598d4f60c9e55al,
18802             0xbce9141b0e4f347al },
18803           { 0x9af97d8435f9b988l,0x0210da62320475b6l,0x3c076e229191476cl,
18804             0x7520dbd944fc7834l },
18805           0 },
18806         /* 10 << 64 */
18807         { { 0x87a7ebd1e0a1b12al,0x1e4ef88d770ba95fl,0x8c33345cdc2ae9cbl,
18808             0xcecf127601cc8403l },
18809           { 0x687c012e1b39b80fl,0xfd90d0ad35c33ba4l,0xa3ef5a675c9661c2l,
18810             0x368fc88ee017429el },
18811           0 },
18812         /* 11 << 64 */
18813         { { 0x664300b07850ec06l,0xac5a38b97d3a10cfl,0x9233188de34ab39dl,
18814             0xe77057e45072cbb9l },
18815           { 0xbcf0c042b59e78dfl,0x4cfc91e81d97de52l,0x4661a26c3ee0ca4al,
18816             0x5620a4c1fb8507bcl },
18817           0 },
18818         /* 13 << 64 */
18819         { { 0x84b9ca1504b6c5a0l,0x35216f3918f0e3a3l,0x3ec2d2bcbd986c00l,
18820             0x8bf546d9d19228fel },
18821           { 0xd1c655a44cd623c3l,0x366ce718502b8e5al,0x2cfc84b4eea0bfe7l,
18822             0xe01d5ceecf443e8el },
18823           0 },
18824         /* 15 << 64 */
18825         { { 0xa75feacabe063f64l,0x9b392f43bce47a09l,0xd42415091ad07acal,
18826             0x4b0c591b8d26cd0fl },
18827           { 0x2d42ddfd92f1169al,0x63aeb1ac4cbf2392l,0x1de9e8770691a2afl,
18828             0xebe79af7d98021dal },
18829           0 },
18830         /* 16 << 64 */
18831         { { 0x58af2010f5b343bcl,0x0f2e400af2f142fel,0x3483bfdea85f4bdfl,
18832             0xf0b1d09303bfeaa9l },
18833           { 0x2ea01b95c7081603l,0xe943e4c93dba1097l,0x47be92adb438f3a6l,
18834             0x00bb7742e5bf6636l },
18835           0 },
18836         /* 17 << 64 */
18837         { { 0x66917ce63b5f1cc4l,0x37ae52eace872e62l,0xbb087b722905f244l,
18838             0x120770861e6af74fl },
18839           { 0x4b644e491058edeal,0x827510e3b638ca1dl,0x8cf2b7046038591cl,
18840             0xffc8b47afe635063l },
18841           0 },
18842         /* 19 << 64 */
18843         { { 0x7677408d6dfafed3l,0x33a0165339661588l,0x3c9c15ec0b726fa0l,
18844             0x090cfd936c9b56dal },
18845           { 0xe34f4baea3c40af5l,0x3469eadbd21129f1l,0xcc51674a1e207ce8l,
18846             0x1e293b24c83b1ef9l },
18847           0 },
18848         /* 21 << 64 */
18849         { { 0x796d3a85825808bdl,0x51dc3cb73fd6e902l,0x643c768a916219d1l,
18850             0x36cd7685a2ad7d32l },
18851           { 0xe3db9d05b22922a4l,0x6494c87edba29660l,0xf0ac91dfbcd2ebc7l,
18852             0x4deb57a045107f8dl },
18853           0 },
18854         /* 23 << 64 */
18855         { { 0xb6c69ac82094cec3l,0x9976fb88403b770cl,0x1dea026c4859590dl,
18856             0xb6acbb468562d1fdl },
18857           { 0x7cd6c46144569d85l,0xc3190a3697f0891dl,0xc6f5319548d5a17dl,
18858             0x7d919966d749abc8l },
18859           0 },
18860         /* 25 << 64 */
18861         { { 0xb53b7de561906373l,0x858dbadeeb999595l,0x8cbb47b2a59e5c36l,
18862             0x660318b3dcf4e842l },
18863           { 0xbd161ccd12ba4b7al,0xf399daabf8c8282al,0x1587633aeeb2130dl,
18864             0xa465311ada38dd7dl },
18865           0 },
18866         /* 27 << 64 */
18867         { { 0x2dae9082be7cf3a6l,0xcc86ba92bc967274l,0xf28a2ce8aea0a8a9l,
18868             0x404ca6d96ee988b3l },
18869           { 0xfd7e9c5d005921b8l,0xf56297f144e79bf9l,0xa163b4600d75ddc2l,
18870             0x30b23616a1f2be87l },
18871           0 },
18872         /* 28 << 64 */
18873         { { 0x19e6125dec3f1decl,0x07b1f040911178dal,0xd93ededa904a6738l,
18874             0x55187a5a0bebedcdl },
18875           { 0xf7d04722eb329d41l,0xf449099ef170b391l,0xfd317a69ca99f828l,
18876             0x50c3db2b34a4976dl },
18877           0 },
18878         /* 29 << 64 */
18879         { { 0x0064d8585499fb32l,0x7b67bad977a8aeb7l,0x1d3eb9772d08eec5l,
18880             0x5fc047a6cbabae1dl },
18881           { 0x0577d159e54a64bbl,0x8862201bc43497e4l,0xad6b4e282ce0608dl,
18882             0x8b687b7d0b167aacl },
18883           0 },
18884         /* 31 << 64 */
18885         { { 0xe9f9669cda94951el,0x4b6af58d66b8d418l,0xfa32107417d426a4l,
18886             0xc78e66a99dde6027l },
18887           { 0x0516c0834a53b964l,0xfc659d38ff602330l,0x0ab55e5c58c5c897l,
18888             0x985099b2838bc5dfl },
18889           0 },
18890         /* 33 << 64 */
18891         { { 0xe7a935fa1684cb3bl,0x571650b5a7d7e69dl,0x6ba9ffa40328c168l,
18892             0xac43f6bc7e46f358l },
18893           { 0x54f75e567cb6a779l,0x4e4e2cc8c61320del,0xb94258bc2b8903d0l,
18894             0xc7f32d57ceecabe0l },
18895           0 },
18896         /* 34 << 64 */
18897         { { 0x34739f16cd7d9d89l,0x6daab4267ca080b5l,0x772086ff40e19f45l,
18898             0x43caa56118c61b42l },
18899           { 0x0ba3d4a8dbf365f1l,0xa0db435ee760ad97l,0xfd6f30d56916c59bl,
18900             0xab34cb5dafe12f5dl },
18901           0 },
18902         /* 35 << 64 */
18903         { { 0x445b86ea02a3260al,0x8c51d6428d689babl,0x183334d65588904cl,
18904             0xf8a3b84d479d6422l },
18905           { 0x581acfa0f0833d00l,0xc50827bc3b567d2dl,0x2c935e6daddcf73el,
18906             0x2a645f7704dd19f2l },
18907           0 },
18908         /* 36 << 64 */
18909         { { 0x78d2e8dfcb564473l,0x4349a97357d5621al,0x9d835d89218f8b24l,
18910             0x01fe7bc5079b6ee2l },
18911           { 0xe57f2a2b5b3b5dcel,0x5a8637b75fe55565l,0x83ff34aea41dbae7l,
18912             0xfce1199c950a7a8fl },
18913           0 },
18914         /* 37 << 64 */
18915         { { 0x0ca5d25bf8e71ce2l,0x204edc4a062685dal,0x06fe407d87678ec2l,
18916             0xd16936a07defa39al },
18917           { 0x3b108d84af3d16d0l,0xf2e9616d0305cad0l,0xbc9537e6f27bed97l,
18918             0x71c2d699ebc9f45cl },
18919           0 },
18920         /* 39 << 64 */
18921         { { 0x203bdd84cdcd3a85l,0x1107b901ade3ccfal,0xa7da89e95533159dl,
18922             0x8d834005860e8c64l },
18923           { 0x914bc0eb2a7638f7l,0xc66ce0a6620e8606l,0x11ef98c2e6c12dc0l,
18924             0x25666b1d7780fc0el },
18925           0 },
18926         /* 40 << 64 */
18927         { { 0x374f541f3e707706l,0x9a4d3638a831d0cfl,0x4ab4f4831518ca04l,
18928             0x54e3ee5dfe38c318l },
18929           { 0x383ae36403c8819bl,0xa9d1daa12e17864cl,0x245a97b350eeaa5bl,
18930             0x5362d00999bf4e83l },
18931           0 },
18932         /* 41 << 64 */
18933         { { 0x6667e89f4ded8a4fl,0xa59161abc36a7795l,0x1c96f6f9331ccf94l,
18934             0xf2727e879a686d49l },
18935           { 0x0f94894bb841295fl,0xb0fe8f744a0503d1l,0x60c581c7ef407926l,
18936             0x1980c8e13edb7e1cl },
18937           0 },
18938         /* 43 << 64 */
18939         { { 0x47948c84c5de1a41l,0xd595d14a48959688l,0x3bfca4be86ff21c9l,
18940             0xb5ff59b86a4191cal },
18941           { 0xced1dd1d65094c86l,0xd57b86559dc9d001l,0xbcac6fa3486e51d7l,
18942             0x8e97e2637b774c1bl },
18943           0 },
18944         /* 44 << 64 */
18945         { { 0xfc0313c29bd43980l,0x9c954b70f172db29l,0x679bdcb7f954a21al,
18946             0x6b48170954e2e4fcl },
18947           { 0x318af5f530baf1d0l,0x26ea8a3ccbf92060l,0xc3c69d7ccd5ae258l,
18948             0xa73ba0470ead07c9l },
18949           0 },
18950         /* 45 << 64 */
18951         { { 0xe82eb003e35dca85l,0xfd0000fa31e39180l,0xbca90f746735f378l,
18952             0xe6aa783158c943edl },
18953           { 0x0e94ecd5b6a438d7l,0xc02b60faf9a5f114l,0x4063568b8b1611ebl,
18954             0x1398bdc1272509ecl },
18955           0 },
18956         /* 46 << 64 */
18957         { { 0xc2ef6a01be3e92d1l,0x1bce9c27282bd5ddl,0xf7e488f3adda0568l,
18958             0xd4f15fdb1af9bb8bl },
18959           { 0x8c490ade4da846efl,0x76229da17f0b825el,0xc8b812082a6711c6l,
18960             0x511f5e23b4c523aal },
18961           0 },
18962         /* 47 << 64 */
18963         { { 0xbdf4e7049970f46el,0x70e220288dadbd1al,0x2b86c97fb1223d26l,
18964             0x042ad22ecf62f51al },
18965           { 0x72944339ba2ed2e9l,0x0ba0d10ef94fa61dl,0x3f86164194e68f15l,
18966             0x1312a74acb86c545l },
18967           0 },
18968         /* 48 << 64 */
18969         { { 0x3a63c39731815e69l,0x6df9cbd6dcdd2802l,0x4c47ed4a15b4f6afl,
18970             0x62009d826ac0f978l },
18971           { 0x664d80d28b898fc7l,0x72f1eeda2c17c91fl,0x9e84d3bc7aae6609l,
18972             0x58c7c19528376895l },
18973           0 },
18974         /* 49 << 64 */
18975         { { 0x640ebf5d5b8d354al,0xa5f3a8fdb396ff64l,0xd53f041d8378ed81l,
18976             0x1969d61bc1234ad2l },
18977           { 0x16d7acffeb68bde2l,0x63767a68f23e9368l,0x937a533c38928d95l,
18978             0xee2190bbbeb0f1f2l },
18979           0 },
18980         /* 51 << 64 */
18981         { { 0xb6860c9a73a4aafbl,0xb2f996290488870dl,0x16ef6232572d9e25l,
18982             0x5b9eb1bad1383389l },
18983           { 0xabf713a7ed8d77f8l,0xd2b4a2e9e2b69e64l,0xa1a22cfd6d6f17c2l,
18984             0x4bfd6f992d604511l },
18985           0 },
18986         /* 52 << 64 */
18987         { { 0xdcff7630d9294f07l,0x89b765d68dba8fd0l,0x553e55de8dbcaccdl,
18988             0x9b4a009eed702bf8l },
18989           { 0xf6e534dd27b8ca0dl,0xc4496b346177fd52l,0x378ce6f6c87bb7b7l,
18990             0x68633d4844cc19f0l },
18991           0 },
18992         /* 53 << 64 */
18993         { { 0xfe550021bc84c625l,0x8d7169986d45e4a3l,0xa09c6ded4c0c66b7l,
18994             0xe32313aeb9e1d547l },
18995           { 0x8ce775b4d1e8e0b9l,0xa899f9102654dd15l,0x7c38aa066cc8b2a9l,
18996             0xe6ebb291d6ce6cc0l },
18997           0 },
18998         /* 55 << 64 */
18999         { { 0x5963df62a6991216l,0x4c17f72246996010l,0x131dc2b840477722l,
19000             0x78bf50b0d1765a75l },
19001           { 0x360afd587ceaca12l,0xebc55dbb139cd470l,0x9083e27e4c05541cl,
19002             0xc10057a3b873d757l },
19003           0 },
19004         /* 57 << 64 */
19005         { { 0x440009c3deed7769l,0xde2fa58a14fd8a44l,0x509e7df35b627596l,
19006             0x3d76a87cc3bb07a7l },
19007           { 0x8018fee5b8ef000al,0x71ce33e9823fd4b6l,0x3a1cac37469c0bb1l,
19008             0x92fe7aeaf3eec8eel },
19009           0 },
19010         /* 59 << 64 */
19011         { { 0x37ad0eb8de64e568l,0x4ac669bca1e3e20el,0x240d0ac22ce944edl,
19012             0xd532039a3c1b28fbl },
19013           { 0xa2bb899a23acba6cl,0xd472af671af937e1l,0x04478f7b8851e753l,
19014             0x74030eef5ea05307l },
19015           0 },
19016         /* 60 << 64 */
19017         { { 0x3559e7b67dc17874l,0xd0caf0ef8195cc2al,0x07c067880cd24dd9l,
19018             0x01a99ea002857c41l },
19019           { 0xd86579e490f82f63l,0xb1e0658ae41c9237l,0x075ffafd93fd1e79l,
19020             0x6e70403547f60b8fl },
19021           0 },
19022         /* 61 << 64 */
19023         { { 0x2246ad76c1d68c31l,0x9126202b0d5c4677l,0x5f40de81638882dcl,
19024             0xb131988ca3253a7fl },
19025           { 0x766f1897ba9ae0a8l,0xf0e01dd41d8b5fefl,0x03e28ce3ed7b12c8l,
19026             0x44b3a2be1fd20e1el },
19027           0 },
19028         /* 63 << 64 */
19029         { { 0xd4c8e8e5f2a5f247l,0x42ffd816c2c7c979l,0x89e1485211093d1al,
19030             0x98f44a4613871ebbl },
19031           { 0x374849964b032e2dl,0x28a430f445995a61l,0xf2f9acbad5be16b6l,
19032             0xac98a5402d8e02aal },
19033           0 },
19034         /* 64 << 64 */
19035         { { 0x0d53f5c7a3e6fcedl,0xe8cbbdd5f45fbdebl,0xf85c01df13339a70l,
19036             0x0ff71880142ceb81l },
19037           { 0x4c4e8774bd70437al,0x5fb32891ba0bda6al,0x1cdbebd2f18bd26el,
19038             0x2f9526f103a9d522l },
19039           0 },
19040         /* 65 << 64 */
19041         { { 0x48334fdcc20b8d30l,0x25f887d749414fddl,0x9ccd513311a2cf0dl,
19042             0x7e7799e4d08975a4l },
19043           { 0xb5993a53729b951cl,0x0cf14a5a62dbc6a8l,0xb39ed36efe4d16eel,
19044             0xb75f3fb681bda63al },
19045           0 },
19046         /* 71 << 64 */
19047         { { 0xac7db8706d4f68b5l,0x819a13c7be49b3a4l,0x646ae2b1418bf1e9l,
19048             0x25b53a5f69b3a5ccl },
19049           { 0xd23d94d37de26578l,0x8bb581caecdd138al,0x9e053f67f857b0dal,
19050             0xe679cc7a255ff474l },
19051           0 },
19052         /* 77 << 64 */
19053         { { 0x4a4b8d990df097f9l,0x0ae1227a0b4173cal,0x0d401778adb72178l,
19054             0xd29848b43f421e0cl },
19055           { 0xc5eec6096eb0722dl,0x527d72877e12c028l,0xed12a9e71b5dcc0cl,
19056             0x26b27344dcf4b4dal },
19057           0 },
19058         /* 83 << 64 */
19059         { { 0x695c502565e4408al,0x2d23768fcbce94e6l,0x1505fa1e5080b88dl,
19060             0x5c8fbab6855f7cc1l },
19061           { 0x70d876f275fb125dl,0x456421330a252007l,0xfe99249a8ee05be1l,
19062             0x0893b620f4bf5490l },
19063           0 },
19064         /* 89 << 64 */
19065         { { 0x2a59df1ed9fe6bdfl,0x96a9c791785e057fl,0x4b0d795f86a1d751l,
19066             0x196c8e0aec642886l },
19067           { 0x6df67899bc0e055cl,0x4173204a63007433l,0xb5ee4efec21c9245l,
19068             0x2f7d4c75c1451bael },
19069           0 },
19070         /* 95 << 64 */
19071         { { 0x2ad7f836b1047b7fl,0x368d431a71f6bfe1l,0xfcd933b103db4667l,
19072             0xfff77ed3ecb81330l },
19073           { 0x3677935b44958bd4l,0xa6cfcda8a1d5a9e7l,0xb2b73bc699ff9fael,
19074             0x1c2cd628f866d3c4l },
19075           0 },
19076         /* 101 << 64 */
19077         { { 0x2756873495031ceel,0xebed373d51091c1bl,0x398fef0819aa2f27l,
19078             0x2f26174e2c0a9feal },
19079           { 0xedca72b6b219be3fl,0x001a8fdc80503df8l,0x9a2fadbb6b93f643l,
19080             0xd48e552cd44cebc3l },
19081           0 },
19082         /* 107 << 64 */
19083         { { 0x6c0dbb68667a7ab6l,0x00490ce757630e91l,0x04976cd57eb2f382l,
19084             0x9ee486b655dda4a3l },
19085           { 0x4ea5c9c9cca0d01cl,0xa6e054b639f69c6dl,0xb3b7ac992ecab239l,
19086             0x80c9f6d17597512el },
19087           0 },
19088         /* 113 << 64 */
19089         { { 0x64dfdd68b942fad9l,0xe7d8e88da5eb3d14l,0xb7281dc2382f6301l,
19090             0xcfa2ee6dbfe00a7fl },
19091           { 0x6e617657dc7be39fl,0x22d58dd6591c6e3al,0xd3a4003918318c13l,
19092             0xcac6c830981b6b72l },
19093           0 },
19094         /* 116 << 64 */
19095         { { 0x009690ffb4fbfaa0l,0x8bbbdab73619c6dbl,0xc6d44273728356e8l,
19096             0xfd76f0d8e453ec35l },
19097           { 0x775c2554aac28a29l,0x28f7af9d5c55e4f0l,0xbacf54a688e8ad4dl,
19098             0x85b018e80aa76ddfl },
19099           0 },
19100         /* 119 << 64 */
19101         { { 0x27893f7983ce88e4l,0x9556c9977785f13dl,0x83d3c38d3a35831el,
19102             0x3856c829d12f0a1dl },
19103           { 0xb308d84c93259c1al,0x4ef87ab4691ffd28l,0x76a18d5321a88c58l,
19104             0xf13cd5d53503cb4dl },
19105           0 },
19106         /* 125 << 64 */
19107         { { 0x669d93dba8cc0db3l,0x403cb9200dfcfcf4l,0x5def4a03e77c3979l,
19108             0x2a05c9423e2e2522l },
19109           { 0xd86dca52b5f48bf0l,0x174766de5828a135l,0x116290b40d3a96d0l,
19110             0xe1999457aeea1193l },
19111           0 },
19112     },
19113     {
19114         /* 0 << 72 */
19115         { { 0x00, 0x00, 0x00, 0x00 },
19116           { 0x00, 0x00, 0x00, 0x00 },
19117           1 },
19118         /* 1 << 72 */
19119         { { 0x0db2fb5ed005832al,0x5f5efd3b91042e4fl,0x8c4ffdc6ed70f8cal,
19120             0xe4645d0bb52da9ccl },
19121           { 0x9596f58bc9001d1fl,0x52c8f0bc4e117205l,0xfd4aa0d2e398a084l,
19122             0x815bfe3a104f49del },
19123           0 },
19124         /* 3 << 72 */
19125         { { 0x524d226ad7ab9a2dl,0x9c00090d7dfae958l,0x0ba5f5398751d8c2l,
19126             0x8afcbcdd3ab8262dl },
19127           { 0x57392729e99d043bl,0xef51263baebc943al,0x9feace9320862935l,
19128             0x639efc03b06c817bl },
19129           0 },
19130         /* 4 << 72 */
19131         { { 0xe839be7d341d81dcl,0xcddb688932148379l,0xda6211a1f7026eadl,
19132             0xf3b2575ff4d1cc5el },
19133           { 0x40cfc8f6a7a73ae6l,0x83879a5e61d5b483l,0xc5acb1ed41a50ebcl,
19134             0x59a60cc83c07d8fal },
19135           0 },
19136         /* 5 << 72 */
19137         { { 0xdec98d4ac3b81990l,0x1cb837229e0cc8fel,0xfe0b0491d2b427b9l,
19138             0x0f2386ace983a66cl },
19139           { 0x930c4d1eb3291213l,0xa2f82b2e59a62ae4l,0x77233853f93e89e3l,
19140             0x7f8063ac11777c7fl },
19141           0 },
19142         /* 7 << 72 */
19143         { { 0x36e607cf02ff6072l,0xa47d2ca98ad98cdcl,0xbf471d1ef5f56609l,
19144             0xbcf86623f264ada0l },
19145           { 0xb70c0687aa9e5cb6l,0xc98124f217401c6cl,0x8189635fd4a61435l,
19146             0xd28fb8afa9d98ea6l },
19147           0 },
19148         /* 9 << 72 */
19149         { { 0x3d4da8c3017025f3l,0xefcf628cfb9579b4l,0x5c4d00161f3716ecl,
19150             0x9c27ebc46801116el },
19151           { 0x5eba0ea11da1767el,0xfe15145247004c57l,0x3ace6df68c2373b7l,
19152             0x75c3dffe5dbc37acl },
19153           0 },
19154         /* 10 << 72 */
19155         { { 0xa2a147dba28a0749l,0x246c20d6ee519165l,0x5068d1b1d3810715l,
19156             0xb1e7018c748160b9l },
19157           { 0x03f5b1faf380ff62l,0xef7fb1ddf3cb2c1el,0xeab539a8fc91a7dal,
19158             0x83ddb707f3f9b561l },
19159           0 },
19160         /* 11 << 72 */
19161         { { 0xb57276d980101b98l,0x760883fdb82f0f66l,0x89d7de754bc3eff3l,
19162             0x03b606435dc2ab40l },
19163           { 0xcd6e53dfe05beeacl,0xf2f1e862bc3325cdl,0xdd0f7921774f03c3l,
19164             0x97ca72214552cc1bl },
19165           0 },
19166         /* 13 << 72 */
19167         { { 0x760cb3b5e224c5d7l,0xfa3baf8c68616919l,0x9fbca1138d142552l,
19168             0x1ab18bf17669ebf5l },
19169           { 0x55e6f53e9bdf25ddl,0x04cc0bf3cb6cd154l,0x595bef4995e89080l,
19170             0xfe9459a8104a9ac1l },
19171           0 },
19172         /* 15 << 72 */
19173         { { 0x694b64c5abb020e8l,0x3d18c18419c4eec7l,0x9c4673ef1c4793e5l,
19174             0xc7b8aeb5056092e6l },
19175           { 0x3aa1ca43f0f8c16bl,0x224ed5ecd679b2f6l,0x0d56eeaf55a205c9l,
19176             0xbfe115ba4b8e028bl },
19177           0 },
19178         /* 16 << 72 */
19179         { { 0x3e22a7b397acf4ecl,0x0426c4005ea8b640l,0x5e3295a64e969285l,
19180             0x22aabc59a6a45670l },
19181           { 0xb929714c5f5942bcl,0x9a6168bdfa3182edl,0x2216a665104152bal,
19182             0x46908d03b6926368l },
19183           0 },
19184         /* 17 << 72 */
19185         { { 0x9b8be0247fcba850l,0x81eb5797820a181el,0xa0f2812230a01211l,
19186             0x7e9cdc3cae7b8821l },
19187           { 0x202332cc72ce15e7l,0xcd3cb2bbcb8238d7l,0xe4ab63dfc6e82c43l,
19188             0x58bd00283183d717l },
19189           0 },
19190         /* 19 << 72 */
19191         { { 0x02d57b7e717ed7b5l,0xd22e5b244dbce1a2l,0x174bd7712a4cdcf5l,
19192             0xa6fdb801408205bbl },
19193           { 0x67b4b0695e1387e9l,0x332b19a10591a442l,0x24edd916ccacf366l,
19194             0xbe34cc4534958a50l },
19195           0 },
19196         /* 21 << 72 */
19197         { { 0xa3f46e1e3e66d391l,0xb4a732cd7d6369b2l,0x99c3b85d402c1022l,
19198             0x7dccfcbe2b54932el },
19199           { 0xa6ddaa7b56b1dfe2l,0x31dc78a5e34a82c9l,0x8abeb3da704f3941l,
19200             0xdf11a36cca55fa98l },
19201           0 },
19202         /* 23 << 72 */
19203         { { 0x6c01f77a16e00c1bl,0x82515490839eaaacl,0x62f3a4ef3470d334l,
19204             0x5a29a6491c1dcd6cl },
19205           { 0x46b6782ece997a25l,0x9978fb35d3579953l,0x98f5a9df0960e0cel,
19206             0x547dc8391f527a4cl },
19207           0 },
19208         /* 25 << 72 */
19209         { { 0x395b15835d9dc24fl,0xa4256932c73ae680l,0x0542960efaa2c8e9l,
19210             0x2bb3adee71068c6al },
19211           { 0xa706099b570b4554l,0x85d12bb5f4e278d6l,0xd78af6f664296843l,
19212             0xc7d3b3888428c633l },
19213           0 },
19214         /* 27 << 72 */
19215         { { 0x34d44f9343b7e597l,0xdde440a7c2530f42l,0x7270a0817856bdb9l,
19216             0x86a945eb5353032fl },
19217           { 0x6c2f8e9966d39810l,0x0642a31b9b8b4b6bl,0x51679e62d1509d82l,
19218             0x0120001c90f8ff16l },
19219           0 },
19220         /* 28 << 72 */
19221         { { 0x50a1c1062e36e34al,0x74e8f58ce024ed1al,0x3f0f1dfa1300d726l,
19222             0x6680df267b4a2d18l },
19223           { 0x12b5979d8235b3b7l,0x1d2fafcb8a611493l,0x73ebda968848ece5l,
19224             0xe996c275a413e399l },
19225           0 },
19226         /* 29 << 72 */
19227         { { 0x46b7d7c7495ff000l,0xe60ed097baed95d1l,0xaa8804ac6e38f9c0l,
19228             0x92990c0645c6f9bbl },
19229           { 0xcae6a439c0919851l,0x713dff151bf5e1f2l,0x5d262c302eb38cdbl,
19230             0xb73d505190df31dfl },
19231           0 },
19232         /* 31 << 72 */
19233         { { 0x921e7b1c32d9268cl,0x34db2b964276fad4l,0x0ec56d34cc44e730l,
19234             0x59be3a46096545b7l },
19235           { 0xe9fdbc9766cf3a6al,0x7b2f83edd04e9b53l,0x6d99b3cc8fbae3e7l,
19236             0x8eb5646c7ada3a40l },
19237           0 },
19238         /* 33 << 72 */
19239         { { 0xa69ab906fc3302bfl,0x49ae6ba7d0872e90l,0xc9e2d6d1f3a1bfc3l,
19240             0x11dfe85f1a033500l },
19241           { 0x45189c2998666dbdl,0xba6aab88bbfd13cel,0xcf9c8b43dbd38cd4l,
19242             0xa0cb581b68009236l },
19243           0 },
19244         /* 34 << 72 */
19245         { { 0xff18c42a16288a7al,0x6363ace430699163l,0x8546d6332a2ce353l,
19246             0x5e0379ef7b6b3418l },
19247           { 0x2df2bb463e941bb2l,0xae7c091888e1aacel,0x6bc0982d83f5a37al,
19248             0x8521bd02676d09e0l },
19249           0 },
19250         /* 35 << 72 */
19251         { { 0x6531dff33d361aacl,0x59b954477c8cac2el,0xcc104df6c5cb7363l,
19252             0x68b571c519364acdl },
19253           { 0x7521e962979c3bc0l,0xbe0544c9c4aa1f92l,0x59127fe92a31eabbl,
19254             0x760ac28593d8b55bl },
19255           0 },
19256         /* 36 << 72 */
19257         { { 0x62ed534c6115164bl,0xaebe9e4cdce84ceal,0xd81c91a1c83f64c3l,
19258             0x325a8ca8ecacd09al },
19259           { 0x7ea57ad968b45df1l,0xa555636fd530c5d2l,0x23aff510591cfe32l,
19260             0x46ff147637bedab9l },
19261           0 },
19262         /* 37 << 72 */
19263         { { 0xa5a7e81ecb2edb3bl,0x9b0dc5f4f8fbe238l,0xc6f258087c66dd34l,
19264             0xb4a57503a3f8f38al },
19265           { 0x195b433513571b5bl,0xa32840763ccbc30bl,0x64ae1ffccf99ddd5l,
19266             0x0dfc8772aa844e76l },
19267           0 },
19268         /* 39 << 72 */
19269         { { 0x8b471afbfb22341dl,0xbf448b43397afdd2l,0x4cb08409682c37edl,
19270             0xc3acfae6a948f1f6l },
19271           { 0xf58462549e634707l,0x50161a78bd949f52l,0xf0529e752fe73566l,
19272             0xe7e3fdef6fda53e0l },
19273           0 },
19274         /* 40 << 72 */
19275         { { 0x56dab1c8321a518cl,0xfd4439a68bce226fl,0xe0b30d194facb9fal,
19276             0xb5052f307583571bl },
19277           { 0x1442641012afd476l,0xd02e417203fe624al,0xfc394f65531c92e6l,
19278             0x16d4bf5ad4bc0b52l },
19279           0 },
19280         /* 41 << 72 */
19281         { { 0xa38ac25eb4ec4f0fl,0x5399c024de72b27dl,0x08318aafd81a3d65l,
19282             0x1af227a70c20e5d9l },
19283           { 0x6389cc9a26c54e25l,0x438298bba47dc27fl,0x75386cca1a63fa0el,
19284             0xc941e84cdf7bc1b0l },
19285           0 },
19286         /* 43 << 72 */
19287         { { 0x81cad748fdfe3faal,0x752107b453ff1988l,0x8d8bb7001a8fd829l,
19288             0x69838e15ca821d8el },
19289           { 0x24371ede3b9f6b34l,0x19b4bb24d91e1495l,0x90899ca1e598ded1l,
19290             0xbbb78b167c14e9e3l },
19291           0 },
19292         /* 44 << 72 */
19293         { { 0xa577e84cbef239aal,0x656d2b6f8904b4d4l,0x2f6defe6ca4007edl,
19294             0xca6e517737770796l },
19295           { 0x4c62fcba298b6448l,0x046849660f62e00dl,0x806c2f0390b07d82l,
19296             0x730855795e8d1e60l },
19297           0 },
19298         /* 45 << 72 */
19299         { { 0x24488802f4703b78l,0x6c9323bee9eaa1e0l,0x242990e2aa94c170l,
19300             0x3292bc42a15b5886l },
19301           { 0x60ccb5bc908af203l,0x8fd63583713b09bdl,0x40791ecad693fa28l,
19302             0xea80abf2941af8a1l },
19303           0 },
19304         /* 46 << 72 */
19305         { { 0xf9c0315071145fe3l,0x80a71b55d7873a7dl,0xd134244b5e10bac7l,
19306             0x303f7e12ded3a4b4l },
19307           { 0x58e6f17e803b7a3bl,0xcd6f64130b1ca6b4l,0x25e744ce2ce65aa2l,
19308             0xf2bbc66b952efa51l },
19309           0 },
19310         /* 47 << 72 */
19311         { { 0xc8b212e75913e1f3l,0xf018ab208d416886l,0x28249e15b617cac4l,
19312             0x837fcba1693ed09al },
19313           { 0x9c457e511c15a1bcl,0x9354758756c7f3f1l,0x1afd80348be18306l,
19314             0xa43d56982256ab14l },
19315           0 },
19316         /* 48 << 72 */
19317         { { 0xce06b88210395755l,0x117ce6345ec1df80l,0xfefae513eff55e96l,
19318             0xcf36cba6fd7fed1el },
19319           { 0x7340eca9a40ebf88l,0xe6ec1bcfb3d37e12l,0xca51b64e86bbf9ffl,
19320             0x4e0dbb588b40e05el },
19321           0 },
19322         /* 49 << 72 */
19323         { { 0xf9c063f62f2be34bl,0x9ca32fa99c20f16bl,0xe02e350d0125a01al,
19324             0x62d66c54e6516c25l },
19325           { 0x21b154ad5120bedbl,0xb1077f4e8d6ff9d8l,0xd01a46c300bb4941l,
19326             0x9d381847d1460588l },
19327           0 },
19328         /* 51 << 72 */
19329         { { 0xf3a9b311581cb57bl,0x65fb3fb649727d13l,0xb8496e3d35131142l,
19330             0xf7642f554d0cdab9l },
19331           { 0xe2f66f0e9f6d7e45l,0xbae14cedaa22fcd4l,0x1f769f0e49b2e05al,
19332             0x08c4d7784ac5191el },
19333           0 },
19334         /* 52 << 72 */
19335         { { 0x86f9108ece4aa825l,0xbe5b2f317e5a5fbfl,0x2772c1b49254bb78l,
19336             0xae6cdf5f4ff8ac5cl },
19337           { 0x106cd94bf6b7a12el,0xbe0915d6d1c7a1a5l,0x8bf6bc8d3b40ac5el,
19338             0xbb89180423ee3acal },
19339           0 },
19340         /* 53 << 72 */
19341         { { 0x76f15eaa618b5ea1l,0xec1ea62e6d4ad0c8l,0x301b60c8168d57fal,
19342             0x454d5f771edbfb05l },
19343           { 0xea888e29a936031al,0x01303d3f0174dd17l,0x8b5e06b4244254e7l,
19344             0x00ebf03509724acfl },
19345           0 },
19346         /* 55 << 72 */
19347         { { 0x66ce3ded8e66d509l,0x368e38d05a488586l,0x7b9ae220c7eedf5el,
19348             0x67e9ea52bfbf9d62l },
19349           { 0xe9cbf53d99b7ecb3l,0xfde3e8c0908bf072l,0x288400ab1107e21fl,
19350             0x24c8856256532667l },
19351           0 },
19352         /* 57 << 72 */
19353         { { 0x0d5f9955ca9d3ad1l,0x545feba13a1daec0l,0xd22972016cb30f23l,
19354             0x9660175ccef6cf6el },
19355           { 0xbf3e341a395738dcl,0x74a5efbc80f7cca4l,0xc4f9a07bbebc6a60l,
19356             0x2f1e3dad4b1f915al },
19357           0 },
19358         /* 59 << 72 */
19359         { { 0xada4423f0d5e2e34l,0x2d31f4920b372358l,0xd7f469370e2d6a8cl,
19360             0xf5e7ccfe0028e4ael },
19361           { 0x20fcb1f3928854b2l,0x2a8973c507271bf6l,0xe87de33e5fa88fe1l,
19362             0xe9af2dce7bd3c2a6l },
19363           0 },
19364         /* 60 << 72 */
19365         { { 0x185a19d959d097b2l,0xb1c72a3a0dea2875l,0x3b371628f9021f08l,
19366             0x45f1255bfa9d6ac1l },
19367           { 0x9ff36a90cfd72c0dl,0x8c7315db24fe2376l,0x9aebcde04b34d42cl,
19368             0x2129ab16923025f3l },
19369           0 },
19370         /* 61 << 72 */
19371         { { 0x341b9dd714b4cf50l,0x7c6e4634d619d00el,0x571d6e2fdf2165ael,
19372             0xdedf9cd18dbe9db5l },
19373           { 0x52a152777c5f3dc3l,0x7d27c97ef2901cf7l,0x5e098b54d02a85dfl,
19374             0x6fce3e13088e3640l },
19375           0 },
19376         /* 63 << 72 */
19377         { { 0xfa95be147a939904l,0xdfcf5b9bb56365ccl,0xdbb546bdd2d66922l,
19378             0xf26a8b9cda03ca7fl },
19379           { 0x96a8042d16821c0cl,0xe6729970e88ede60l,0xd028130d1285e303l,
19380             0x1678b01688b7de75l },
19381           0 },
19382         /* 64 << 72 */
19383         { { 0x96649933aed1d1f7l,0x566eaff350563090l,0x345057f0ad2e39cfl,
19384             0x148ff65b1f832124l },
19385           { 0x042e89d4cf94cf0dl,0x319bec84520c58b3l,0x2a2676265361aa0dl,
19386             0xc86fa3028fbc87adl },
19387           0 },
19388         /* 65 << 72 */
19389         { { 0x5db4884124627d04l,0xf92740766f7e3febl,0xd09eb11773496240l,
19390             0xd48e51419a6b9ec9l },
19391           { 0xcbb2ac97b7336e27l,0xe794fb760640bf6cl,0xc0b7f78dc7c7fa3fl,
19392             0x1355d071fd2edbb9l },
19393           0 },
19394         /* 71 << 72 */
19395         { { 0x575d9724e84e25a3l,0x068690a13d4d8708l,0x8a7b1c6c54dd62d0l,
19396             0x8c45e1b37f88e231l },
19397           { 0x38c665466d85afe2l,0x65231642e1d69f1bl,0xb71c53a090687ec1l,
19398             0xdf8469d777fb5981l },
19399           0 },
19400         /* 77 << 72 */
19401         { { 0xb920b503144fe6bcl,0x54b0f0593914c130l,0x63188d5a8269b650l,
19402             0x8d7780962fc7064dl },
19403           { 0xbf7b0eec5e50839al,0xaf8a7ddbe242cd06l,0x93df850809cecdb9l,
19404             0x4db58a72410659e9l },
19405           0 },
19406         /* 83 << 72 */
19407         { { 0x460d9b383baba3cdl,0x52386e4d2cf860b8l,0xd224fe5da3924b9al,
19408             0xe4a4be7bcf14d813l },
19409           { 0xb0759e82ed3774fdl,0x57c064b38d9b6c59l,0x301ab902aee183d0l,
19410             0xf1c873495ba207c3l },
19411           0 },
19412         /* 89 << 72 */
19413         { { 0xe8245b0a6dd58696l,0x0714eedb61091043l,0x7d9874459101129bl,
19414             0x4a7f1f03a0b27a21l },
19415           { 0x282e5cff71ee2045l,0x25c694a3da5c6b41l,0xb3d8e21f5542ca55l,
19416             0x57d64170e3601af0l },
19417           0 },
19418         /* 95 << 72 */
19419         { { 0x9c8e86c6c6c4fee6l,0x70194db5a596119bl,0xfc6271d30e06050cl,
19420             0x17d94c89b15f18d2l },
19421           { 0x76c9e9bd49817224l,0x42621638b989c5bcl,0x1e9c4cbeb769d70cl,
19422             0x85e227c3b87f2783l },
19423           0 },
19424         /* 101 << 72 */
19425         { { 0x146185d2117e73c5l,0xbf6214696dc38116l,0x9af9d9b5459e72cbl,
19426             0x7512882fb3930b85l },
19427           { 0xfe935379d36583b8l,0xb83ad35e7c7fdcdel,0x093ca0ab2658ae4bl,
19428             0xc9b16d60a756681bl },
19429           0 },
19430         /* 107 << 72 */
19431         { { 0x12c24d9195d3519bl,0x1fc6db1bdb43fd06l,0x1ae49fed25bbde51l,
19432             0x27072e0b76d2827bl },
19433           { 0xdcb92e05aeb8c47fl,0x601d414056145f67l,0xcb7002652a39e8f7l,
19434             0x6ce9facc35620d8cl },
19435           0 },
19436         /* 113 << 72 */
19437         { { 0x5c428a5ebd702c22l,0xcb6863291616129dl,0xe6278994eabcb9a1l,
19438             0xb409a10b9327e540l },
19439           { 0x6899f7cb66cf96aal,0xa9225f051c64b545l,0x00c5522ee3feec21l,
19440             0x35503728e083315cl },
19441           0 },
19442         /* 116 << 72 */
19443         { { 0x1916d88cf1600077l,0x1ac9c238e3a58b2bl,0x3080df8535f3508dl,
19444             0x86cc18712744912bl },
19445           { 0x56aec9d5ccd15044l,0x8dd9061a5db0ab17l,0x84d6bc4e2c84171dl,
19446             0xd569c7d70989a5bdl },
19447           0 },
19448         /* 119 << 72 */
19449         { { 0x24446b2702af35abl,0x071710478eea4565l,0xba4989db728306e6l,
19450             0x2cd692a85954a558l },
19451           { 0x644e02763576b32el,0x7efdb65c1f9fe65dl,0x04b2828e8796c048l,
19452             0xcfd22481187b979bl },
19453           0 },
19454         /* 125 << 72 */
19455         { { 0xa10d104084ea9701l,0x27dd0dcb415e187dl,0xf667c5e939bfe45cl,
19456             0x3995e4ae55b67506l },
19457           { 0xb25117d9b5a14801l,0xeee58525fe142e92l,0x100b856a6dbae9f1l,
19458             0xada7057629586658l },
19459           0 },
19460     },
19461     {
19462         /* 0 << 80 */
19463         { { 0x00, 0x00, 0x00, 0x00 },
19464           { 0x00, 0x00, 0x00, 0x00 },
19465           1 },
19466         /* 1 << 80 */
19467         { { 0xe4050f1cf1c367cal,0x9bc85a9bc90fbc7dl,0xa373c4a2e1a11032l,
19468             0xb64232b7ad0393a9l },
19469           { 0xf5577eb0167dad29l,0x1604f30194b78ab2l,0x0baa94afe829348bl,
19470             0x77fbd8dd41654342l },
19471           0 },
19472         /* 3 << 80 */
19473         { { 0xa2f7932c68af43eel,0x5502468e703d00bdl,0xe5dc978f2fb061f5l,
19474             0xc9a1904a28c815adl },
19475           { 0xd3af538d470c56a4l,0x159abc5f193d8cedl,0x2a37245f20108ef3l,
19476             0xfa17081e223f7178l },
19477           0 },
19478         /* 4 << 80 */
19479         { { 0x1fe2a9b2b4b4b67cl,0xc1d10df0e8020604l,0x9d64abfcbc8058d8l,
19480             0x8943b9b2712a0fbbl },
19481           { 0x90eed9143b3def04l,0x85ab3aa24ce775ffl,0x605fd4ca7bbc9040l,
19482             0x8b34a564e2c75dfbl },
19483           0 },
19484         /* 5 << 80 */
19485         { { 0x5c18acf88e2f7d90l,0xfdbf33d777be32cdl,0x0a085cd7d2eb5ee9l,
19486             0x2d702cfbb3201115l },
19487           { 0xb6e0ebdb85c88ce8l,0x23a3ce3c1e01d617l,0x3041618e567333acl,
19488             0x9dd0fd8f157edb6bl },
19489           0 },
19490         /* 7 << 80 */
19491         { { 0x516ff3a36fa6110cl,0x74fb1eb1fb93561fl,0x6c0c90478457522bl,
19492             0xcfd321046bb8bdc6l },
19493           { 0x2d6884a2cc80ad57l,0x7c27fc3586a9b637l,0x3461baedadf4e8cdl,
19494             0x1d56251a617242f0l },
19495           0 },
19496         /* 9 << 80 */
19497         { { 0x892c81a321175ec1l,0x9159a505ee018109l,0xc70130532d8be316l,
19498             0x76060c21426fa2e5l },
19499           { 0x074d2dfc6b6f0f22l,0x9725fc64ca01a671l,0x3f6679b92770bd8el,
19500             0x8fe6604fd7c9b3fel },
19501           0 },
19502         /* 10 << 80 */
19503         { { 0xce711154b6e00a84l,0xd9fe7e4224890e60l,0xd10bc6c34560988fl,
19504             0xbdc2ef526859b004l },
19505           { 0xdcf0d868d5c890eel,0x893115e6119c47dcl,0xe97966fbee714567l,
19506             0x117813355c85aa53l },
19507           0 },
19508         /* 11 << 80 */
19509         { { 0x71d530cc73204349l,0xc9df473d94a0679cl,0xc572f0014261e031l,
19510             0x9786b71f22f135fel },
19511           { 0xed6505fa6b64e56fl,0xe2fb48e905219c46l,0x0dbec45bedf53d71l,
19512             0xd7d782f2c589f406l },
19513           0 },
19514         /* 13 << 80 */
19515         { { 0x06513c8a446cd7f4l,0x158c423b906d52a6l,0x71503261c423866cl,
19516             0x4b96f57093c148eel },
19517           { 0x5daf9cc7239a8523l,0x611b597695ac4b8bl,0xde3981db724bf7f6l,
19518             0x7e7d0f7867afc443l },
19519           0 },
19520         /* 15 << 80 */
19521         { { 0x3d1ab80c8ce59954l,0x742c5a9478222ac0l,0x3ddacbf894f878ddl,
19522             0xfc085117e7d54a99l },
19523           { 0xfb0f1dfa21e38ec2l,0x1c7b59cb16f4ff7fl,0x988752397ea888fel,
19524             0x705d270cb10dc889l },
19525           0 },
19526         /* 16 << 80 */
19527         { { 0xe5aa692a87dec0e1l,0x010ded8df7b39d00l,0x7b1b80c854cfa0b5l,
19528             0x66beb876a0f8ea28l },
19529           { 0x50d7f5313476cd0el,0xa63d0e65b08d3949l,0x1a09eea953479fc6l,
19530             0x82ae9891f499e742l },
19531           0 },
19532         /* 17 << 80 */
19533         { { 0xd7c89ba1e7d1cefdl,0xcb33553a9a91e03dl,0xa01caaff59f01e54l,
19534             0x4a71c141de07def7l },
19535           { 0xe1616a4034d467d1l,0x6f395ab2e8ba8817l,0xf781ea64e45869abl,
19536             0x8b9513bb7134f484l },
19537           0 },
19538         /* 19 << 80 */
19539         { { 0x0b0ec9035948c135l,0xaee219539a990127l,0x9d15ba0eb185dda1l,
19540             0xd87bc2fb2c7d6802l },
19541           { 0x05a480307a82d7f8l,0x7b591ce4e7e11ec3l,0x14d4cc22a0e15fdbl,
19542             0xf2d4213576def955l },
19543           0 },
19544         /* 21 << 80 */
19545         { { 0xd56d69e4117a5f59l,0xcae6008a01286e97l,0x716a0a282dab13b0l,
19546             0xc821da99b3a8d2d0l },
19547           { 0x6898b66239c305e6l,0xe42d3394c8b61142l,0x54c1d2b253b16712l,
19548             0x3cec3953a01f4be6l },
19549           0 },
19550         /* 23 << 80 */
19551         { { 0x5bd1e3036951b85el,0x1a73f1fb164d79a4l,0x6e77abd39fb22bc3l,
19552             0x8ae4c181b3d18dfdl },
19553           { 0xdd4226f5a6a14ed1l,0x620e111feb4e1d92l,0xffce6e59edca4fe8l,
19554             0x39f5fc053d0a717dl },
19555           0 },
19556         /* 25 << 80 */
19557         { { 0xef8fa78cd91aff44l,0x6f3f9749bdc03be7l,0x171545f8b8596075l,
19558             0xbe31a73e2af132cel },
19559           { 0x5b4e174123884e1dl,0x4373357ea9fa75f0l,0x8dba2731bc06f49el,
19560             0xa09aebc877fa6de8l },
19561           0 },
19562         /* 27 << 80 */
19563         { { 0xd4974e518293e18cl,0x1e4cfc5331ec0e8fl,0x80b4258325d40b1el,
19564             0x5cfb73a2a85f7588l },
19565           { 0xe553efd204c0e00bl,0xdaa6750e9a48ac39l,0xf20936b00abda06al,
19566             0xbfd3c7e4bf85771cl },
19567           0 },
19568         /* 28 << 80 */
19569         { { 0x72669c3c7292495cl,0xa627e2dd82786572l,0xbdbfce5cd39c3e3dl,
19570             0xba6164927feed3d6l },
19571           { 0x4eb5f513e77b7318l,0x133f2e834337c2e0l,0xdea20f07f408bec6l,
19572             0x848a8396e3c87655l },
19573           0 },
19574         /* 29 << 80 */
19575         { { 0x3086643551138f2bl,0x1176d8e6108a36bal,0xd78b3b400d4d4b66l,
19576             0x99ddd9bd956dbff1l },
19577           { 0x91dfe72822f08e5fl,0x7fd8cfe6a081ac4el,0x8ebb278ed75285c2l,
19578             0x2335fe00ef457ac0l },
19579           0 },
19580         /* 31 << 80 */
19581         { { 0xe9d79c50f058191al,0x6749c3b05d3183f8l,0x5edc2708dbfeb1ecl,
19582             0x2c18f93621275986l },
19583           { 0x3a093e1f0703389fl,0xdf065e4a3ef60f44l,0x6860e4df87e7c458l,
19584             0xdb22d96e8bfe4c7dl },
19585           0 },
19586         /* 33 << 80 */
19587         { { 0xb7193811b48dad42l,0x23b9dca320ad0f0cl,0x55511ffb54efb61bl,
19588             0xac8ed94626f9ce42l },
19589           { 0xa42b4bc73fc4cbd9l,0x2a4670905c6f8e39l,0xb50040f87eb592del,
19590             0x6633f81bdc2541f3l },
19591           0 },
19592         /* 34 << 80 */
19593         { { 0xc104e02ed2d6d9c2l,0xa4876e870302517al,0x0263c9b2912f5005l,
19594             0x902f364a3d89d268l },
19595           { 0x76070565bb20a5a8l,0xa3a8977452109e98l,0x51fbffec463aa476l,
19596             0xfa8519625daa1503l },
19597           0 },
19598         /* 35 << 80 */
19599         { { 0xe449dd8f82a9a4f3l,0xa1a2f405797e6b36l,0x76913537787785e8l,
19600             0x0315a3cfe064481el },
19601           { 0xc02291ee83df11e2l,0x5b59a0e9bcd178f0l,0xd5e8d10ce6b4c63al,
19602             0x9eee599f3fc60a82l },
19603           0 },
19604         /* 36 << 80 */
19605         { { 0x051e589759621468l,0xb92c06327293621el,0xee17ea647762e4f2l,
19606             0x412107a771abd28cl },
19607           { 0xa083d87bf02d65ebl,0xbd4a3f165594395el,0x1d5694337c8882f3l,
19608             0xc5eb10c55f9c63cfl },
19609           0 },
19610         /* 37 << 80 */
19611         { { 0x4b196728c8e62c4el,0x03dbd04cb74a757cl,0xe960a65b8520f044l,
19612             0x9eda0f33f7937337l },
19613           { 0x06ff0b86b6dc7dfbl,0x3bd276c11fc1ac35l,0x0e67055b1b255c27l,
19614             0xe43ae552eff899f8l },
19615           0 },
19616         /* 39 << 80 */
19617         { { 0xc64c914d3b156d76l,0x784c1f61d794345dl,0xcda0c77c365d7a50l,
19618             0xcc5a1e205b32dbd0l },
19619           { 0x2f4e78bff90b6ac0l,0xbead62f9a2d4862dl,0xa8f67e7dcc346b53l,
19620             0xa38d7ae947e59dbdl },
19621           0 },
19622         /* 40 << 80 */
19623         { { 0x7dc1605d480aca4dl,0x08c37750ef263aabl,0xd5c6b7c93f166725l,
19624             0xf99982f30ff2853bl },
19625           { 0xc61b9583a8ecb64al,0x041211a91b771741l,0x50ba64154e156f97l,
19626             0xb6595ea871b8954el },
19627           0 },
19628         /* 41 << 80 */
19629         { { 0x4ae760845eb3b4eel,0xcafefdc6c62ed274l,0x4eabeacf113f790bl,
19630             0x10c2cc88a5ff64c9l },
19631           { 0xe7b59f8a49965d80l,0xd04884b50df07712l,0x6316ac5ba5f7bab1l,
19632             0x388111d99e78a075l },
19633           0 },
19634         /* 43 << 80 */
19635         { { 0x8d437128f24804efl,0x12a687dd7b71dd53l,0x8b8f71d96139a60el,
19636             0xb047fed42a095ec7l },
19637           { 0xef238041fba59ee8l,0x61b17fac64045514l,0x45b1cf4857afa184l,
19638             0x8592c50a4bff5fc5l },
19639           0 },
19640         /* 44 << 80 */
19641         { { 0x2830592394b745dcl,0x53e9ec16b09cb993l,0x59d0b57f9a134ed1l,
19642             0x89d7b439c56ee0ebl },
19643           { 0xc3656539991e22a2l,0xd27a89372a345043l,0x55dd5341064038eel,
19644             0xc9ee3f0348cb42efl },
19645           0 },
19646         /* 45 << 80 */
19647         { { 0x08518c631d56c1cbl,0x5650f79f31235521l,0x33fc08d648911017l,
19648             0xbb8b58538a0a33c8l },
19649           { 0xb54554f2f869a62al,0x67f8cf48222457e5l,0x46e13911f276cc0dl,
19650             0x4b3a2ad6943b389el },
19651           0 },
19652         /* 46 << 80 */
19653         { { 0x0e72b816b11a4c9dl,0x919b2738e9028fa4l,0xab80e1117698a5d6l,
19654             0xcd7950f56cd49adal },
19655           { 0x0db75c908dfb13a5l,0x2178578770f12cebl,0xfab72d5243486ff6l,
19656             0x66d55d726a0673ebl },
19657           0 },
19658         /* 47 << 80 */
19659         { { 0xe98014b922667519l,0x7fcab2b3a95da9c0l,0x9bdbccd8438d5060l,
19660             0xa72fff5455a726b6l },
19661           { 0x7ae032943a5e769bl,0xf7291e9b559a0734l,0x18ae4f182ce18eeel,
19662             0x88e49f7328b7b4f0l },
19663           0 },
19664         /* 48 << 80 */
19665         { { 0x90fe7a1d214aeb18l,0x1506af3c741432f7l,0xbb5565f9e591a0c4l,
19666             0x10d41a77b44f1bc3l },
19667           { 0xa09d65e4a84bde96l,0x42f060d8f20a6a1cl,0x652a3bfdf27f9ce7l,
19668             0xb6bdb65c3b3d739fl },
19669           0 },
19670         /* 49 << 80 */
19671         { { 0xc6a2923e60ef9d87l,0xac66cdd8c3a64f1cl,0x069292d26e0bb0ccl,
19672             0x9e491414451e52a0l },
19673           { 0x2e76cedf0e0d35b3l,0x311b7ae9af682b84l,0xaa1017a02f90b176l,
19674             0xac0b43a794feb6e8l },
19675           0 },
19676         /* 51 << 80 */
19677         { { 0x7ddb42f9214e82f5l,0x91c88566f67269d7l,0x1763ed8cdd0ff422l,
19678             0x045dd690ad284ddfl },
19679           { 0x5713bbb141e48fe7l,0xdc5bef28f8eb580fl,0x4bd0b288ed2992c2l,
19680             0x436587faaf5ef2b3l },
19681           0 },
19682         /* 52 << 80 */
19683         { { 0xbbc1a48d6e5822c4l,0x16c3135daacebd02l,0xd0c6c543b56157dfl,
19684             0xae249a0ef49f44a1l },
19685           { 0x1f2c23ce72c47341l,0x8f52dc2a25974313l,0x2c99bc0a958e0e6bl,
19686             0xe57eab6b950cd492l },
19687           0 },
19688         /* 53 << 80 */
19689         { { 0xea66db638934efc0l,0x7bfe479193c6f7c7l,0x78438d535ef90d99l,
19690             0xe63b87c9c665736dl },
19691           { 0x6de32d82db49e1bbl,0xbfa877dcd0ad1648l,0xdb2e85de1197806dl,
19692             0x74e9dbd3cfee7854l },
19693           0 },
19694         /* 55 << 80 */
19695         { { 0xd2c26e2edb6d7e0al,0x9103119a531009cdl,0xb5dc49869a8b9d54l,
19696             0x4781b83bb408b427l },
19697           { 0x70d98b2ccb4ba2f7l,0x112ed5d7fa8a36b8l,0x97257bc6fdde1675l,
19698             0xd2a9c711db211cb7l },
19699           0 },
19700         /* 57 << 80 */
19701         { { 0xe4aa6a06ee79fe8cl,0x06e210233dff8a54l,0x63e11ac5bf50731al,
19702             0xb8b9944f544125b8l },
19703           { 0xcba92c41d359aeb0l,0xd201c893249bca36l,0xfe79bd77cb501216l,
19704             0x694b21488d525ba4l },
19705           0 },
19706         /* 59 << 80 */
19707         { { 0x60c90e11ee3dde2al,0x7df08e17bb36c4a2l,0xb6c3210dcc5b3c17l,
19708             0xa814180955cec91cl },
19709           { 0xf4ecbc05a8193dffl,0xf43cdef8da5744fal,0x4895a6c6f12f8a2el,
19710             0x44282692eb7b910al },
19711           0 },
19712         /* 60 << 80 */
19713         { { 0x1a405e1886d6e13al,0x6a18c91827a7c67cl,0xc34877ebe127bfd7l,
19714             0x3c9fab08c098e692l },
19715           { 0xfe2dc65bc2066586l,0xb107603a8f68a0a9l,0x74ef0ef8127cd340l,
19716             0xfe577b5b86788d87l },
19717           0 },
19718         /* 61 << 80 */
19719         { { 0xdc7ff83c71234c81l,0xee48d9c6d868c82fl,0xb80bac5e37e4f365l,
19720             0x2bfbe94efcb951c2l },
19721           { 0x55829049a374d0b0l,0x2a502cada87a5fb4l,0x0742ac9d9ee840bal,
19722             0x7689bf53eecd05b1l },
19723           0 },
19724         /* 63 << 80 */
19725         { { 0x0e7f459320059c22l,0x47c273e0e49368a2l,0x5ccb960ac6946ee2l,
19726             0xd8209ec48b3271b6l },
19727           { 0x7fd5142cdfb9e947l,0x46a89c83ff737ab1l,0xa45f6b0282d875ecl,
19728             0x19a16e0e34c296d6l },
19729           0 },
19730         /* 64 << 80 */
19731         { { 0xeb5ddcb6ec7fae9fl,0x995f2714efb66e5al,0xdee95d8e69445d52l,
19732             0x1b6c2d4609e27620l },
19733           { 0x32621c318129d716l,0xb03909f10958c1aal,0x8c468ef91af4af63l,
19734             0x162c429ffba5cdf6l },
19735           0 },
19736         /* 65 << 80 */
19737         { { 0x65c93be33607927bl,0x86feaaecdae5411dl,0x4a1686c6dd2e2c3dl,
19738             0xf78200068acdf51dl },
19739           { 0xf82c4d0239ed3e50l,0x5ac04047b4c3a4a4l,0xbdd14d7ec34b07a7l,
19740             0x9911d7027cc12db5l },
19741           0 },
19742         /* 71 << 80 */
19743         { { 0x4ed5dbbd1751abc9l,0xaf374229a23cc54al,0x9b5fa66ea4ed3f9al,
19744             0xc56dd9613d380643l },
19745           { 0x7d77897144b38021l,0xdf4712d0d3584508l,0x0018e2eecd7ab168l,
19746             0xc8a3a166293d29a7l },
19747           0 },
19748         /* 77 << 80 */
19749         { { 0x34681bdb3a5a0214l,0xe188d6f1f718797el,0xaa751de7db761c5fl,
19750             0x347c50324959a5cel },
19751           { 0x108705fc338be49cl,0x1dc5eada95abf7a8l,0xb863808f0fc3f0b7l,
19752             0x529c27c1a05c4d43l },
19753           0 },
19754         /* 83 << 80 */
19755         { { 0xa75f90677f699f79l,0xd01cf9c866356f99l,0xf90f9b73fdfbaae7l,
19756             0xe0b5f4412c304d2fl },
19757           { 0x17cbfb11807f3f57l,0xe902d542af8a9eb4l,0x3335285461f89b4al,
19758             0x3a51c54d3628c0ael },
19759           0 },
19760         /* 89 << 80 */
19761         { { 0xae5fd487c704212dl,0x82dd07a565e2e32cl,0x46d4c9646c19c199l,
19762             0xe7f428593778eedcl },
19763           { 0x084a4e9b6dcc5ec9l,0x757e04ba2d0538b7l,0x4ec0a573a3fba4cdl,
19764             0x2432a4e5c627c2fcl },
19765           0 },
19766         /* 95 << 80 */
19767         { { 0xfde00b3094c8a424l,0x20a57d8cd224c232l,0xd6ace1a170019992l,
19768             0x1a648d40697e67a3l },
19769           { 0xed1fb10691338d84l,0x828004a08372bfc8l,0xb93030fefad3bfedl,
19770             0x883dea23f27369ecl },
19771           0 },
19772         /* 101 << 80 */
19773         { { 0xfbbf36a62a710d73l,0x8db834024b3cc6bbl,0xa60c47cf16d7b1fcl,
19774             0xf9778fa6cd16ce8fl },
19775           { 0xd77023086d14a1a6l,0x01f139cb06e8247cl,0xd89af2979770b9c1l,
19776             0x94bf1ca97d9fb550l },
19777           0 },
19778         /* 107 << 80 */
19779         { { 0xe17e2e6dc2d45f34l,0x5969d8ee26efc6cbl,0x6f175231b9219cfbl,
19780             0x027f333c189f1175l },
19781           { 0x5bc60fad54f6da49l,0xc52e09af8ae5c3f3l,0x6c0e3927ed07f46dl,
19782             0xbfd9e598f39cf16bl },
19783           0 },
19784         /* 113 << 80 */
19785         { { 0x9dffd95b090aefb9l,0x26db7b73637224fel,0xb78a679e92e2aa0cl,
19786             0xfc7c824ffc8f895dl },
19787           { 0xdc8287e8e636b3a8l,0x6b3ccc0f28b7a639l,0x38e6e2cc653de56al,
19788             0x998cf6985392c3cal },
19789           0 },
19790         /* 116 << 80 */
19791         { { 0xe68de79e57f0d6fal,0xe707b252ff9c06f7l,0x5613698a4a061697l,
19792             0xd83d6453b5390352l },
19793           { 0x59b007599867c708l,0xcfe24fd7b41ea7adl,0x4692abf3da5b7de6l,
19794             0xd99a6f3bf0c54e8fl },
19795           0 },
19796         /* 119 << 80 */
19797         { { 0xe8ee870dea4addc3l,0x0d1fb29559841f3el,0xdc05b5581dba2f14l,
19798             0xb8bf38324e3f4600l },
19799           { 0x1a909e66fd57c48al,0xb65ca4c24e2d76dfl,0x0b27755ae7c60d89l,
19800             0x9fcfa75acb9003f6l },
19801           0 },
19802         /* 125 << 80 */
19803         { { 0xbbbdf4c49e5325aal,0x6879fe11d0d1f281l,0x7a400f890633002el,
19804             0xc3633c779bb79ac9l },
19805           { 0x15a4cfae93ab9bc3l,0x379bbdea42594603l,0x7c61dfa257d2af3fl,
19806             0x20190537b51bfb62l },
19807           0 },
19808     },
19809     {
19810         /* 0 << 88 */
19811         { { 0x00, 0x00, 0x00, 0x00 },
19812           { 0x00, 0x00, 0x00, 0x00 },
19813           1 },
19814         /* 1 << 88 */
19815         { { 0xa80d1db6f79588c0l,0xfa52fc69b55768ccl,0x0b4df1ae7f54438al,
19816             0x0cadd1a7f9b46a4fl },
19817           { 0xb40ea6b31803dd6fl,0x488e4fa555eaae35l,0x9f047d55382e4e16l,
19818             0xc9b5b7e02f6e0c98l },
19819           0 },
19820         /* 3 << 88 */
19821         { { 0x4b7d0e0683a7337bl,0x1e3416d4ffecf249l,0x24840eff66a2b71fl,
19822             0xd0d9a50ab37cc26dl },
19823           { 0xe21981506fe28ef7l,0x3cc5ef1623324c7fl,0x220f3455769b5263l,
19824             0xe2ade2f1a10bf475l },
19825           0 },
19826         /* 4 << 88 */
19827         { { 0x9894344f3a29467al,0xde81e949c51eba6dl,0xdaea066ba5e5c2f2l,
19828             0x3fc8a61408c8c7b3l },
19829           { 0x7adff88f06d0de9fl,0xbbc11cf53b75ce0al,0x9fbb7accfbbc87d5l,
19830             0xa1458e267badfde2l },
19831           0 },
19832         /* 5 << 88 */
19833         { { 0x03b6c8c7dacddb7dl,0x92ed50047e1edcadl,0xa0e46c2f54080633l,
19834             0xcd37663d46dec1cel },
19835           { 0x396984c5f365b7ccl,0x294e3a2ae79bb95dl,0x9aa17d7727b1d3c1l,
19836             0x3ffd3cfae49440f5l },
19837           0 },
19838         /* 7 << 88 */
19839         { { 0x26679d11399f9cf3l,0x78e7a48e1e3c4394l,0x08722dea0d98daf1l,
19840             0x37e7ed5880030ea3l },
19841           { 0xf3731ad43c8aae72l,0x7878be95ac729695l,0x6a643affbbc28352l,
19842             0xef8b801b78759b61l },
19843           0 },
19844         /* 9 << 88 */
19845         { { 0xdcdd3709b63afe75l,0xad9d7f0b3f1af8ffl,0xdd6a8045194f4beel,
19846             0x867724cc2f7d998cl },
19847           { 0xd51d0aa5837751bel,0x21d6754a959a0658l,0xd2212611695f7e58l,
19848             0xec4b93c2297363efl },
19849           0 },
19850         /* 10 << 88 */
19851         { { 0x0ac1c5fab6ef26cfl,0xcd8ba0c5a39de8eel,0x11ba7537dd7796e0l,
19852             0x1215933476d58d6dl },
19853           { 0xf51eb76f529fda4cl,0x2fd9209ddedaa8a3l,0x555a675615efac65l,
19854             0xb784c9ca7fd42fe9l },
19855           0 },
19856         /* 11 << 88 */
19857         { { 0x8165ec11b9d1a70fl,0x01347efc384f6cael,0xe95c01a0ab7aeca9l,
19858             0x459ba1c5c6c99530l },
19859           { 0x38967a635cf3416bl,0x5c3761fd1e5457e2l,0x43e6077af03e9df6l,
19860             0xb15d34628bd1c7f6l },
19861           0 },
19862         /* 13 << 88 */
19863         { { 0xad87d3db35a75c49l,0xc69d800961af03c5l,0x31aef61a3a6a6c4cl,
19864             0xb3292640aa10a993l },
19865           { 0x959aae80aaee340fl,0xf900528e7f381a3bl,0x44ecf76e853691a3l,
19866             0xa081663ce749e68el },
19867           0 },
19868         /* 15 << 88 */
19869         { { 0x4f2782136283e34al,0x6f9fcf60fbfa315fl,0x224a2ab99b701364l,
19870             0xb4b1b418f9fecadcl },
19871           { 0xbf7280fe50ba1b9al,0x7e68259c33f36db9l,0x8ccb754e154c9fb0l,
19872             0xf281adb1db2328f1l },
19873           0 },
19874         /* 16 << 88 */
19875         { { 0xf92dda31be24319al,0x03f7d28be095a8e7l,0xa52fe84098782185l,
19876             0x276ddafe29c24dbcl },
19877           { 0x80cd54961d7a64ebl,0xe43608897f1dbe42l,0x2f81a8778438d2d5l,
19878             0x7e4d52a885169036l },
19879           0 },
19880         /* 17 << 88 */
19881         { { 0xc2a950ad2d6608bel,0xab415e2a51c3c2b6l,0xffbd2a65f5c803e7l,
19882             0x3f81dc3eca908532l },
19883           { 0x0ec47397c28c04f4l,0xf6c632e8153f58e8l,0xccac35f8efb4a6d8l,
19884             0x22a1b677ee6d7407l },
19885           0 },
19886         /* 19 << 88 */
19887         { { 0x276662435243c119l,0x79cb8580e707363el,0x5bf5ebf4d01682d6l,
19888             0x8a980173762811e0l },
19889           { 0xe2f2be1fc7547d77l,0x21a50fffb925fec6l,0x5e6cf2ef40115509l,
19890             0xb69beae18faa0fc0l },
19891           0 },
19892         /* 21 << 88 */
19893         { { 0xfa147da8cec36e75l,0xba184e5a42860484l,0xe8ec25df222fb1e6l,
19894             0xce91dcb18ff8403cl },
19895           { 0xf1b0e27ead7faa32l,0x097d881d42a3a205l,0xa8865dd43f8f56d4l,
19896             0x624d7a451aef929dl },
19897           0 },
19898         /* 23 << 88 */
19899         { { 0x3db0238ad01698e8l,0xbb7186dc00306082l,0x542f4377250f830el,
19900             0x34b8a67dae438c50l },
19901           { 0xada528a0858d8048l,0x561aa3336b57afc1l,0x8d9188e0fda35f7al,
19902             0x5838d1211dcad0c5l },
19903           0 },
19904         /* 25 << 88 */
19905         { { 0x4f97d1529f17511dl,0x8b9f012776fdb9ebl,0x53a0a72d4056e6a7l,
19906             0x5ff937d64e262eeel },
19907           { 0xaa64a8dc489fbe6dl,0xc19947dfea02bc69l,0x76f0bbb91492c9bel,
19908             0xe53881098d89cd01l },
19909           0 },
19910         /* 27 << 88 */
19911         { { 0x16083309456057b7l,0x2810c08040a331f6l,0x0561656c3c166929l,
19912             0x16f0d8d6ed1c3999l },
19913           { 0x37b6da7294697927l,0xd821c2cc23ca6c9cl,0x42ef1bdb8ca4351cl,
19914             0x7ca32bad5edfa682l },
19915           0 },
19916         /* 28 << 88 */
19917         { { 0xdc1de17d98119f10l,0x74353c5d488c36a6l,0x14aaf33a3d8e23dfl,
19918             0x31e075c078baf593l },
19919           { 0x0f7ca03a46d1ca3cl,0x99c5e3ac47b660c7l,0x70d0241388fe2e59l,
19920             0x2e9a6be12a7ec005l },
19921           0 },
19922         /* 29 << 88 */
19923         { { 0x4d1f087f184252b1l,0xfd3ace273f5b49c6l,0x6e874447bbb04da2l,
19924             0x2347e3a1b3767ff0l },
19925           { 0x990d4010f868966al,0x35320090dd658b5el,0x1105bfb974fe972al,
19926             0x3961f7dc8e7ad2c6l },
19927           0 },
19928         /* 31 << 88 */
19929         { { 0x100d8b54741e3286l,0x65d9108ef3abc7afl,0x172b450620ef8fbcl,
19930             0x11bd7db2d81b8a2el },
19931           { 0xf89210e1e8e41de5l,0x910613f3d98a868bl,0xbfc85241849aa909l,
19932             0x68a43e21c7d3a7cal },
19933           0 },
19934         /* 33 << 88 */
19935         { { 0x68f891479a4f8293l,0x48262328a5eb9101l,0x7eca2a178fe218b5l,
19936             0xde6c22dbc733f768l },
19937           { 0xde7171d108d6084dl,0xd153827a0f0f8092l,0xc7b52d8f85a9252fl,
19938             0xfa29ca3a5708b31fl },
19939           0 },
19940         /* 34 << 88 */
19941         { { 0x20518ddf9e0ad7e7l,0x33d5d079e8d28b9bl,0x1149b393d13058b0l,
19942             0x708cc65586d4651dl },
19943           { 0xd7fefaa694207435l,0xce882c0d96312f8fl,0x2fd5cb2059d091a7l,
19944             0x4533a88a0e1ece94l },
19945           0 },
19946         /* 35 << 88 */
19947         { { 0xceddd9b5a59c28bcl,0xaa4808f9572e2a5dl,0x38bc191999014a1el,
19948             0x1aacefdaa6d85686l },
19949           { 0xa59283d42a573fddl,0x84359db29c387594l,0x79994773dca3acc8l,
19950             0xe4323e7654cf7653l },
19951           0 },
19952         /* 36 << 88 */
19953         { { 0xac449695241fbd6fl,0x67c9b170081c1223l,0x16868f21b56aac6fl,
19954             0x34bd8fa3f8bcb721l },
19955           { 0x06b6bd33b6691c76l,0x6c924766381a7973l,0x6a12444ca54078dbl,
19956             0xd02e91a96d1051ccl },
19957           0 },
19958         /* 37 << 88 */
19959         { { 0x512f5fb35f30b344l,0xb13ade169d516885l,0x18812e9b2b468802l,
19960             0xf15d730e6b28979al },
19961           { 0x5015616f6889348bl,0xe0b02a0a96af0401l,0x3b02007b61204c89l,
19962             0x9ece2aa7432742a4l },
19963           0 },
19964         /* 39 << 88 */
19965         { { 0xd5f7e09c7c1cc4a1l,0x313ac04218b2d854l,0xbc4fe2a04c253b10l,
19966             0x25a696a3c7080b5cl },
19967           { 0x6de3cb6aef811877l,0x4d242fecd15f9644l,0xb9bfa2480ee6a136l,
19968             0x8122679e9c8d181el },
19969           0 },
19970         /* 40 << 88 */
19971         { { 0x37e5684744ddfa35l,0x9ccfc5c5dab3f747l,0x9ac1df3f1ee96cf4l,
19972             0x0c0571a13b480b8fl },
19973           { 0x2fbeb3d54b3a7b3cl,0x35c036695dcdbb99l,0x52a0f5dcb2415b3al,
19974             0xd57759b44413ed9al },
19975           0 },
19976         /* 41 << 88 */
19977         { { 0xc2c7daec96a8d727l,0x8a11631a17f3abf9l,0x06aba65c0ae8940al,
19978             0xfca280c7873d3635l },
19979           { 0x57496889ddb72b87l,0xaa9a3359320793d4l,0x11b6864d43120741l,
19980             0x1877cd4e51527639l },
19981           0 },
19982         /* 43 << 88 */
19983         { { 0x8b35ce4e6f43dfc6l,0x4114b2fe9a19f3bfl,0x8c4af8024ffa45cal,
19984             0xa3ab5f869328b847l },
19985           { 0x0986de3e555f30f0l,0xaae6e3eac8cb84c4l,0x2a7dcdbaa4ba01f7l,
19986             0xfa32efa729f5dc6cl },
19987           0 },
19988         /* 44 << 88 */
19989         { { 0x077379c00b33d3f8l,0x421883c67064e409l,0x2d0873d76c29c8f6l,
19990             0xbfa433a3d274c0c8l },
19991           { 0x56dc778f23a5891el,0xd663bf6535e2de04l,0x488fdb485db517cel,
19992             0x00bba55e19b226c2l },
19993           0 },
19994         /* 45 << 88 */
19995         { { 0x879b30ead7260d78l,0x04954ba2eac5201fl,0x3210c0e3ff2529d1l,
19996             0x0743823488b470b3l },
19997           { 0x8b618de48854cc0dl,0x98270d5e35b795eel,0x0e47d651aa33ca37l,
19998             0x77d75fda1e87d0cfl },
19999           0 },
20000         /* 46 << 88 */
20001         { { 0x789dbe987803fbf9l,0x940589aa17ede316l,0x032902bd85a1988cl,
20002             0x43cbc0031c47f7f0l },
20003           { 0xc6ff73714709148fl,0x769957122d9b8a5el,0xb4520e462597b70el,
20004             0x00d19f39f67ff3b8l },
20005           0 },
20006         /* 47 << 88 */
20007         { { 0xe2dfcef9b159f403l,0xe8e9e8d8855644afl,0x2796247163fa1068l,
20008             0x400e992a968a5400l },
20009           { 0xe2b9d29f56e563c1l,0xed66759c2885fabfl,0x788b6263750abdffl,
20010             0x30adb00d6cbbdcacl },
20011           0 },
20012         /* 48 << 88 */
20013         { { 0x1fe647d83d30a2c5l,0x0857f77ef78a81dcl,0x11d5a334131a4a9bl,
20014             0xc0a94af929d393f5l },
20015           { 0xbc3a5c0bdaa6ec1al,0xba9fe49388d2d7edl,0xbb4335b4bb614797l,
20016             0x991c4d6872f83533l },
20017           0 },
20018         /* 49 << 88 */
20019         { { 0x5548d3423fa17b28l,0x38587952823ee731l,0x8ee9b90a0a28bcd1l,
20020             0xcfc029bf6676917el },
20021           { 0x7e08306d2a212358l,0x66a9488dc88a66bcl,0x7a09db327d7c9e65l,
20022             0x20eaf4e72cbc1790l },
20023           0 },
20024         /* 51 << 88 */
20025         { { 0xb3095b491f2a9605l,0x7cfc4205f72691c7l,0x1544bf964d889b90l,
20026             0xdc44d20ba0bbae7al },
20027           { 0xee369b670b1f0b23l,0xf3ec25e818a7bdcbl,0xf614ab5df47ecf65l,
20028             0x4869762f80a4a09dl },
20029           0 },
20030         /* 52 << 88 */
20031         { { 0xedbbeee78a058fb6l,0xb9d19ddcfb09121al,0xa41bb45bd34dddcel,
20032             0x2dbc80b900964bc4l },
20033           { 0x4ed9137d1d6cb654l,0x1b9016db483d01c5l,0x5fc501bc6528e22el,
20034             0xb2d2f8816cad646bl },
20035           0 },
20036         /* 53 << 88 */
20037         { { 0xb57aa72a89043e56l,0x8fbca2435c5319fdl,0xe66aef43b13ce900l,
20038             0x2c7c3927c3382934l },
20039           { 0x434d9104a835fdf5l,0x419470b81b3b85bel,0xeaec374abeb4d448l,
20040             0x26a53b51f33cda51l },
20041           0 },
20042         /* 55 << 88 */
20043         { { 0x421f1725bb1db793l,0x20214d4f558c94a9l,0x3371233b7696092cl,
20044             0x774d3fcb1902ab0el },
20045           { 0x4ce223ded149aecel,0x174b260e33057bc7l,0xdf70cfa3f6effee4l,
20046             0x3d8cd01f80880678l },
20047           0 },
20048         /* 57 << 88 */
20049         { { 0x32db21862e59985cl,0x448865abaa1b39e1l,0x250ce79cd89fe98dl,
20050             0x962710e763e3fb10l },
20051           { 0xa8fc70561ac10e3el,0x9eed208fa3b132fbl,0xf499d638937051f5l,
20052             0x27acf7ec21a9f78fl },
20053           0 },
20054         /* 59 << 88 */
20055         { { 0x148e572a4c7b445el,0xdc10a0214dc95a4fl,0xe60e9c2e02237869l,
20056             0xbfdfcb3aa393c3a4l },
20057           { 0x8b799db211a64cf0l,0x1ca865ea2e16f59fl,0x865441fbd3a17e46l,
20058             0x23315b9753409692l },
20059           0 },
20060         /* 60 << 88 */
20061         { { 0x5e76fb2f286bad39l,0xbad9efe39dcad1e2l,0x60e75190edc7e904l,
20062             0x6a6f063e0fecb5a5l },
20063           { 0x5150ed85aed8acc3l,0xb56ccfbc6d20af6cl,0x7e0d1e982c69dbfal,
20064             0xabf5628a7c7e10a9l },
20065           0 },
20066         /* 61 << 88 */
20067         { { 0xb84af2c00df6d61fl,0x02c651c52acbaf4bl,0xfb605754afaaa0bfl,
20068             0xa03f5257dff61017l },
20069           { 0x9e3ffb1672762093l,0x4f9a5da0c4f40bd3l,0x37dce5220d26f8e1l,
20070             0x260f736fc06a1a07l },
20071           0 },
20072         /* 63 << 88 */
20073         { { 0xb92aba79b1077d55l,0xc52f81081a42f5f5l,0x9913f04f86e5aa99l,
20074             0x6814b0b1f3c7f504l },
20075           { 0xb7d61fd34d354bdal,0xf27926e39581d25el,0x97724001c2dc21adl,
20076             0x835778231d5c4788l },
20077           0 },
20078         /* 64 << 88 */
20079         { { 0x77b868cee978a1d3l,0xe3a68b337ab92d04l,0x5102979487a5b862l,
20080             0x5f0606c33a61d41dl },
20081           { 0x2814be276f9326f1l,0x2f521c14c6fe3c2el,0x17464d7dacdf7351l,
20082             0x10f5f9d3777f7e44l },
20083           0 },
20084         /* 65 << 88 */
20085         { { 0x53857462ff9727a2l,0xe6870e7dc68488e7l,0x276da72808c79656l,
20086             0x1308eb61d86c24ebl },
20087           { 0x34c43a84db0a3e56l,0x03961b5525335a59l,0xf9bc2d5805689d86l,
20088             0xfa4d3c01eb29d6d6l },
20089           0 },
20090         /* 71 << 88 */
20091         { { 0xd07dac3037d10ffal,0xb2b0a0fd8bef0a79l,0xa2e804510ec02505l,
20092             0xf256c18962f55f5fl },
20093           { 0x0ca3f9b10b39f4f0l,0x7bf4e1cf3bb7c8e9l,0x7a8a43f8ee11f227l,
20094             0x2ad8431a3e4056ebl },
20095           0 },
20096         /* 77 << 88 */
20097         { { 0xb8cf71ed031c1871l,0x702431806f703102l,0x9a87e1c24ec6f1b0l,
20098             0xf7e6e5b4664f275dl },
20099           { 0xc70a8b4e8c76b505l,0x6ba69bf2a002e9cfl,0x33ed74f7a0d8c9bfl,
20100             0x17f5f4b18d9989del },
20101           0 },
20102         /* 83 << 88 */
20103         { { 0xcd116dcb1b13a4a1l,0x591adb831c369877l,0x697be1aca6b8e80bl,
20104             0xb2d4baa1b975d781l },
20105           { 0xd4a9a496b16b48e7l,0x64de2d7af293997dl,0x039ae039af09a492l,
20106             0x66e31a2665f3a485l },
20107           0 },
20108         /* 89 << 88 */
20109         { { 0x110a8a42fec01a53l,0x1f5fcc1b38affab8l,0x757310ca9941a19el,
20110             0x11ef95f76c29d6cbl },
20111           { 0x0756bdb22dd427bal,0x8de8d44af3e16c33l,0xf9d28355e25aec52l,
20112             0xeb761efc02f36465l },
20113           0 },
20114         /* 95 << 88 */
20115         { { 0xfc83bf7454bfcd7al,0x51d861794837b6bel,0x8165b3f9801a324dl,
20116             0x3a5972bc634cfd61l },
20117           { 0xeecfe6d825258ed6l,0x51d968df1451ced0l,0x3010cdb8316aa0ael,
20118             0xc295b8522900eaf2l },
20119           0 },
20120         /* 101 << 88 */
20121         { { 0x5ad434a3890cc798l,0x4c17ff5e1531bce4l,0x825b5b5a5ea8e26fl,
20122             0xacca9d5dd66fd7b3l },
20123           { 0xb647dbde37ae6f92l,0xa5594868f3600416l,0x7b90ac53ab0c5d63l,
20124             0x4b66ad7ceb43e1d0l },
20125           0 },
20126         /* 107 << 88 */
20127         { { 0x04a211fac09ccbffl,0x9c96ad9ee873d898l,0x9eb1deb69c481f86l,
20128             0xb3616ce8b2d70298l },
20129           { 0x67a6fe9b9073726dl,0x5b8aa37d4c9bf744l,0xf558603ebb6aa0efl,
20130             0x72767f5103d304fbl },
20131           0 },
20132         /* 113 << 88 */
20133         { { 0x787cb8b8d6e9b7e3l,0x8bb30222e079fc68l,0x651a2ea6e3145a0bl,
20134             0x0254c5da9ab18fa8l },
20135           { 0x83722ffc12e1611fl,0xb0ddf1ffa7cc61bel,0x7c9c7e10ac0ac8d7l,
20136             0x8241a8191da12218l },
20137           0 },
20138         /* 116 << 88 */
20139         { { 0x70bb7719bc407e6el,0x231328efd84ceb41l,0x8bca6a1fc104bb20l,
20140             0xd6f4e425280b9071l },
20141           { 0xb41b95a292896a82l,0x735cf435fa34df67l,0xbc331a08d9d6d769l,
20142             0x579786052682747el },
20143           0 },
20144         /* 119 << 88 */
20145         { { 0x048ba499eb3af9a9l,0x43a8c367d50b82cel,0xedf9e2b21e0724d9l,
20146             0x3098aab3d607140bl },
20147           { 0xd1f18f1e5ed49eb9l,0xf9c6bb6ae0bb02a2l,0x204f96aa0cd245ddl,
20148             0xdaadaf4afb011ed5l },
20149           0 },
20150         /* 125 << 88 */
20151         { { 0xb298ce2de50404b1l,0x04dd38c45bf9b581l,0x229deabdfada51e8l,
20152             0x74bd233f8788a132l },
20153           { 0x951ba5ecf03e6c30l,0x9da2f5aa45bf1a41l,0x6bec7fea7e52b860l,
20154             0x76e3778964b0a9ddl },
20155           0 },
20156     },
20157     {
20158         /* 0 << 96 */
20159         { { 0x00, 0x00, 0x00, 0x00 },
20160           { 0x00, 0x00, 0x00, 0x00 },
20161           1 },
20162         /* 1 << 96 */
20163         { { 0x4fe7ee31b0e63d34l,0xf4600572a9e54fabl,0xc0493334d5e7b5a4l,
20164             0x8589fb9206d54831l },
20165           { 0xaa70f5cc6583553al,0x0879094ae25649e5l,0xcc90450710044652l,
20166             0xebb0696d02541c4fl },
20167           0 },
20168         /* 3 << 96 */
20169         { { 0xb99f0e0399375235l,0x7614c847b9917970l,0xfec93ce9524ec067l,
20170             0xe40e7bf89b122520l },
20171           { 0xb5670631ee4c4774l,0x6f03847a3b04914cl,0xc96e9429dc9dd226l,
20172             0x43489b6c8c57c1f8l },
20173           0 },
20174         /* 4 << 96 */
20175         { { 0x0e299d23fe67ba66l,0x9145076093cf2f34l,0xf45b5ea997fcf913l,
20176             0x5be008438bd7dddal },
20177           { 0x358c3e05d53ff04dl,0xbf7ccdc35de91ef7l,0xad684dbfb69ec1a0l,
20178             0x367e7cf2801fd997l },
20179           0 },
20180         /* 5 << 96 */
20181         { { 0x46ffd227cc2338fbl,0x89ff6fa990e26153l,0xbe570779331a0076l,
20182             0x43d241c506e1f3afl },
20183           { 0xfdcdb97dde9b62a3l,0x6a06e984a0ae30eal,0xc9bf16804fbddf7dl,
20184             0x170471a2d36163c4l },
20185           0 },
20186         /* 7 << 96 */
20187         { { 0x361619e455950cc3l,0xc71d665c56b66bb8l,0xea034b34afac6d84l,
20188             0xa987f832e5e4c7e3l },
20189           { 0xa07427727a79a6a7l,0x56e5d017e26d6c23l,0x7e50b97638167e10l,
20190             0xaa6c81efe88aa84el },
20191           0 },
20192         /* 9 << 96 */
20193         { { 0x473959d74d325bbfl,0x2a61beec8d6114b9l,0x25672a94924be2eel,
20194             0xa48595dbf2c23d0cl },
20195           { 0xe476848b6a221838l,0xe743e69a35c1b673l,0x2ab42499d8468503l,
20196             0x62aa0054e9e90ba7l },
20197           0 },
20198         /* 10 << 96 */
20199         { { 0x358d13f1bc482911l,0x685d1971b7fa7f26l,0x3e67a51d2be1aee4l,
20200             0xe041850998d114a9l },
20201           { 0x59639f604e052561l,0x32075c49155d0818l,0x2aa2343b67b64b1cl,
20202             0x1b445e2967f53e6al },
20203           0 },
20204         /* 11 << 96 */
20205         { { 0xbdfb271773a904e0l,0x7ce1e40b28888d73l,0x2e7e35f6eaa97d1bl,
20206             0xd061772aa9afa097l },
20207           { 0x434ac7c47a1f7c59l,0x6e21124ae79b7b9al,0x055acff3bb22ecc7l,
20208             0x8bfd7ac984c858d3l },
20209           0 },
20210         /* 13 << 96 */
20211         { { 0x2fd57df59f1f68adl,0x5ddcc6dbb06470c8l,0x801b6451a9b47307l,
20212             0x6b51c8e376551bf4l },
20213           { 0xef0bd1f7d44e1da9l,0x714bcb1d4d4e600cl,0xc57bb9e40c6540c7l,
20214             0x71bd1ec2327cc644l },
20215           0 },
20216         /* 15 << 96 */
20217         { { 0x9a52cf7e7f4dd81fl,0xa0132be15e69c05el,0x90dab7472a0f4d72l,
20218             0xc142f911312d6706l },
20219           { 0xe8d3631f8261998bl,0xf0f42fae615c1c94l,0x2f4e948caec3fa5dl,
20220             0x242ae7a8a374101el },
20221           0 },
20222         /* 16 << 96 */
20223         { { 0x0f893a5dc8de610bl,0xe8c515fb67e223cel,0x7774bfa64ead6dc5l,
20224             0x89d20f95925c728fl },
20225           { 0x7a1e0966098583cel,0xa2eedb9493f2a7d7l,0x1b2820974c304d4al,
20226             0x0842e3dac077282dl },
20227           0 },
20228         /* 17 << 96 */
20229         { { 0x1fa878cad088be52l,0x89c2cb07a9e1e656l,0x385bc5c3219d62dbl,
20230             0xd82b676b5fda2752l },
20231           { 0x2449dc9ee304eafcl,0x1e9e7991632f4ea2l,0x3036e061cdd5e0b9l,
20232             0x75a6f6ff830825bcl },
20233           0 },
20234         /* 19 << 96 */
20235         { { 0xb10fcddc449dedb4l,0x2c890042d1244acfl,0x9b3072cac7fc7017l,
20236             0x1acda6859ce8063fl },
20237           { 0xd243313c7f51e2f5l,0x52a3f1a4d73d9578l,0xda785b7a64f0ce6el,
20238             0x2e766315442a4c2dl },
20239           0 },
20240         /* 21 << 96 */
20241         { { 0x94f9b004151f111al,0xc7a5035b07dbc5fal,0x53958ea7609e49d7l,
20242             0x0526b4d79013f4c0l },
20243           { 0x66de5ebb593e2fbdl,0x6e7cf8b44c2e0c37l,0x6f72fc8b8c983e78l,
20244             0x6fab9b632348f9d7l },
20245           0 },
20246         /* 23 << 96 */
20247         { { 0xc748a3526a3d8468l,0x3fab479927e38032l,0x91ad3629fa430ce7l,
20248             0xc5af0b2c71614c44l },
20249           { 0xcede3fa50c211611l,0x6e6889ba02338083l,0xee0a195977f0fe32l,
20250             0x01ea905d0f4bbc5al },
20251           0 },
20252         /* 25 << 96 */
20253         { { 0x12cfb25e8193db48l,0xddb4ae633bea708cl,0xdaae102ef181f821l,
20254             0x9d9d923024a089d9l },
20255           { 0x71c4122da0876aeal,0x1a63ea3bbbe19c09l,0x3b898076016f8d0cl,
20256             0xa5cccc5daea6b713l },
20257           0 },
20258         /* 27 << 96 */
20259         { { 0xc3f22baf4a8e2f61l,0x77d29ede176da6a6l,0x40a55f211607da63l,
20260             0x858b38561452e391l },
20261           { 0x0dd3c267fe1b3c56l,0x66c04bdd7d55227al,0xfbd2fe55e6404e09l,
20262             0x5981cf49ea9cfcbcl },
20263           0 },
20264         /* 28 << 96 */
20265         { { 0xe549237f78890732l,0xc443bef953fcb4d9l,0x9884d8a6eb3480d6l,
20266             0x8a35b6a13048b186l },
20267           { 0xb4e4471665e9a90al,0x45bf380d653006c0l,0x8f3f820d4fe9ae3bl,
20268             0x244a35a0979a3b71l },
20269           0 },
20270         /* 29 << 96 */
20271         { { 0xae46a902aea870afl,0xa9b9fcf57cbedc99l,0x74f2ca3f79b7e793l,
20272             0xadb8f2231dbeeb28l },
20273           { 0x6302060e6764df85l,0x363320d257ebd554l,0xd9fd573e798d22e1l,
20274             0x285f85f5ebb67dedl },
20275           0 },
20276         /* 31 << 96 */
20277         { { 0xd86b329211caa2b5l,0x2a26258e39337bd1l,0x4dc5a9b579c8c291l,
20278             0x16443d87741942e6l },
20279           { 0x6bc9a2f8f811400cl,0x819c69359eeb4e0el,0xe1be7273ce0c214bl,
20280             0x429afb8184b61581l },
20281           0 },
20282         /* 33 << 96 */
20283         { { 0xb37e188756af5812l,0xd662bdb485aff83el,0xc89742d07bc63de7l,
20284             0xea103f9d0279f487l },
20285           { 0x4d26916a3a6cc639l,0x4eea3a3c7c743b94l,0x6a3e0dc7007376d9l,
20286             0xdb6ef3cf573f904el },
20287           0 },
20288         /* 34 << 96 */
20289         { { 0x9b1058ecb0b0fb53l,0x8955f5f75f8a9a9fl,0xf5f92e7f9f6f9e6dl,
20290             0x03f5df6c50ec198bl },
20291           { 0x6c8741f2b8aedbcel,0x8f4e60cfed8018f7l,0x6ca5297c9fa01f89l,
20292             0x8591cf7a864995dbl },
20293           0 },
20294         /* 35 << 96 */
20295         { { 0xa126147eb0a11b9bl,0xeedcc9e198900232l,0x15d94f8c2bead119l,
20296             0x042423cfefc38691l },
20297           { 0x6ce86fbe77165d91l,0xa07732126b3fd565l,0x8cdc409150b1f9c7l,
20298             0x7f5ad1af064595acl },
20299           0 },
20300         /* 36 << 96 */
20301         { { 0xed374a6658926dddl,0x138b2d49908015b8l,0x886c6579de1f7ab8l,
20302             0x888b9aa0c3020b7al },
20303           { 0xd3ec034e3a96e355l,0xba65b0b8f30fbe9al,0x064c8e50ff21367al,
20304             0x1f508ea40b04b46el },
20305           0 },
20306         /* 37 << 96 */
20307         { { 0x73644c158f8402a0l,0x0d9b5354f4730eb9l,0x78542af4e94cc278l,
20308             0xf4dbede3e395f33al },
20309           { 0x8fe8cbc590c70b00l,0x9c35bb2d7db197f6l,0x229b4973e6599746l,
20310             0x0817d04e1a84b986l },
20311           0 },
20312         /* 39 << 96 */
20313         { { 0x8ffe34e95ecd09b3l,0x6a7c3de4153b7cael,0xf02713e4a81044b7l,
20314             0x85ca6158c70545c8l },
20315           { 0xd3ff392845d88bffl,0x3a251a07f0bafe89l,0x61290e1287cea7f4l,
20316             0xa360a17efa4808adl },
20317           0 },
20318         /* 40 << 96 */
20319         { { 0x98561a49747c866cl,0xbbb1e5fe0518a062l,0x20ff4e8becdc3608l,
20320             0x7f55cded20184027l },
20321           { 0x8d73ec95f38c85f0l,0x5b589fdf8bc3b8c3l,0xbe95dd980f12b66fl,
20322             0xf5bd1a090e338e01l },
20323           0 },
20324         /* 41 << 96 */
20325         { { 0x2d1751083edf4e2bl,0x30e6e90fa29c10d0l,0xfee1eb14c9c6ccd2l,
20326             0x244670c756a81453l },
20327           { 0x90b33eefc5185c22l,0xd77ae4b63db82d28l,0xce5ee034f228f940l,
20328             0x5d7660847bb47be5l },
20329           0 },
20330         /* 43 << 96 */
20331         { { 0x88b7eec499b9a8c6l,0x56048d9e14e8ef0cl,0xa18f93215c89cf78l,
20332             0xbd2087616d327e66l },
20333           { 0x5b187225d9e53e27l,0xa57ca6c7bf4d0317l,0x187731d2e9557736l,
20334             0xd4ce2f78a874982el },
20335           0 },
20336         /* 44 << 96 */
20337         { { 0x65163ae55e915918l,0x6158d6d986f8a46bl,0x8466b538eeebf99cl,
20338             0xca8761f6bca477efl },
20339           { 0xaf3449c29ebbc601l,0xef3b0f41e0c3ae2fl,0xaa6c577d5de63752l,
20340             0xe916660164682a51l },
20341           0 },
20342         /* 45 << 96 */
20343         { { 0xf5b602bb29f47deal,0x42853c9659ddd679l,0x5c25be4041d7c001l,
20344             0x8e069399d4a3b307l },
20345           { 0x1782152e736ce467l,0x2e264109c9cb4f08l,0xf900cb11ab124698l,
20346             0x1bbed1d02d6e05b1l },
20347           0 },
20348         /* 46 << 96 */
20349         { { 0x9cc3fedc7da08b1fl,0x0f44949361d5ed38l,0xc8cbc4209b991b6bl,
20350             0xee62a342891c42e1l },
20351           { 0x11c496bb1a179139l,0x94ece2892eac4d8el,0x35f303a5a98d5570l,
20352             0x69d4340514a31552l },
20353           0 },
20354         /* 47 << 96 */
20355         { { 0x29d45e50892dfcbal,0x653e613e5c30cee3l,0x7b8c1ae61868a348l,
20356             0x40ab51654f2c612al },
20357           { 0x56e977f9891cdc8cl,0xee1ca12a34ca7cd1l,0xa4e283ee17b5ddf8l,
20358             0x4e36f2fb6f536205l },
20359           0 },
20360         /* 48 << 96 */
20361         { { 0x5a3097befc15aa1el,0x40d12548b54b0745l,0x5bad4706519a5f12l,
20362             0xed03f717a439dee6l },
20363           { 0x0794bb6c4a02c499l,0xf725083dcffe71d2l,0x2cad75190f3adcafl,
20364             0x7f68ea1c43729310l },
20365           0 },
20366         /* 49 << 96 */
20367         { { 0xa3834d85e89ea13fl,0x2ca00f942db803bbl,0x0f378681400ed3dal,
20368             0x1028af6b54854da3l },
20369           { 0x3928c2da06400c7fl,0x21119785d82aac92l,0x06618c17724e4af0l,
20370             0x22b42b161470736bl },
20371           0 },
20372         /* 51 << 96 */
20373         { { 0x7d0cfd48f7f2ac65l,0x46e1ac705f641b60l,0x0ab9566a0fcf0137l,
20374             0xbd4380e0db460fb8l },
20375           { 0x4550efbf6db99b55l,0x33846e669764b744l,0xacffa0cae34ca007l,
20376             0xce642d6a077e646cl },
20377           0 },
20378         /* 52 << 96 */
20379         { { 0xe747c8c7b7ffd977l,0xec104c3580761a22l,0x8395ebaf5a3ffb83l,
20380             0xfb3261f4e4b63db7l },
20381           { 0x53544960d883e544l,0x13520d708cc2eeb8l,0x08f6337bd3d65f99l,
20382             0x83997db2781cf95bl },
20383           0 },
20384         /* 53 << 96 */
20385         { { 0xd89112c47d8037a3l,0xcba48ad3464c2025l,0x3afea8399814a09dl,
20386             0x69e52260269030b5l },
20387           { 0x5b7067365c674805l,0x8c3fd33d87343f56l,0xc572c858b1c61edfl,
20388             0x43d8f4ded06749cbl },
20389           0 },
20390         /* 55 << 96 */
20391         { { 0x04da1f06b4066003l,0xf7d4e52f372749e8l,0x56cd667114b38747l,
20392             0x1943a22a22eb6d9el },
20393           { 0xc2c5391990714b0al,0xb6e3abb7d13cf3ael,0xfcd8d671676115cbl,
20394             0x178ce1a0c06a0d3al },
20395           0 },
20396         /* 57 << 96 */
20397         { { 0x94485b36913508f8l,0x92f87fe36de83b42l,0xedd476f0ed77e666l,
20398             0xee90fbc68da2cf53l },
20399           { 0x6f4afc53fc6cf3d9l,0x231bceb9f21f6ecfl,0x6504a11d494c6e9cl,
20400             0xd3728f032c211461l },
20401           0 },
20402         /* 59 << 96 */
20403         { { 0x09a9b93799562ca2l,0xb7d5c5cf6a5a5aa8l,0x52f5d7b9987b219dl,
20404             0x33849f9ec38014d4l },
20405           { 0x299adaf628f23880l,0x738ecc8874875588l,0x39d707adca2af665l,
20406             0xc8c11f688f4c5f73l },
20407           0 },
20408         /* 60 << 96 */
20409         { { 0x68e4f15e9afdfb3cl,0x49a561435bdfb6dfl,0xa9bc1bd45f823d97l,
20410             0xbceb5970ea111c2al },
20411           { 0x366b455fb269bbc4l,0x7cd85e1ee9bc5d62l,0xc743c41c4f18b086l,
20412             0xa4b4099095294fb9l },
20413           0 },
20414         /* 61 << 96 */
20415         { { 0x2ae046d66aa34757l,0x34db1addaa6d7e9dl,0x2b4b7e017ccf432bl,
20416             0xfbe0bfa590d319c6l },
20417           { 0xfb2981687ec7a7f2l,0x346cc46004f5132el,0x782b2e53b40aceddl,
20418             0x402e1d64e3f0b8b9l },
20419           0 },
20420         /* 63 << 96 */
20421         { { 0x2aa3b21d25a56088l,0xae6ee57543d08962l,0x669e42bff1e22297l,
20422             0x7b4c635732e3a47al },
20423           { 0x22b16260ea464a25l,0xad8ca59072d5cd7al,0x7c244266104eb96al,
20424             0x1def95e28e7c11d2l },
20425           0 },
20426         /* 64 << 96 */
20427         { { 0x9c7c581d26ee8382l,0xcf17dcc5359d638el,0xee8273abb728ae3dl,
20428             0x1d112926f821f047l },
20429           { 0x1149847750491a74l,0x687fa761fde0dfb9l,0x2c2580227ea435abl,
20430             0x6b8bdb9491ce7e3fl },
20431           0 },
20432         /* 65 << 96 */
20433         { { 0x1f04524cdc27e1f7l,0xa0c74f61572eab14l,0xdd5d0cfced272074l,
20434             0x95533c1d5bfe4f65l },
20435           { 0x3039d57ecce817cal,0x029967d73b822082l,0x9fca43866c4a10d3l,
20436             0xf8b2a7f0bb4968ebl },
20437           0 },
20438         /* 71 << 96 */
20439         { { 0x933cd6dcbfbf6407l,0xd08f21504be673f8l,0x0e1c4d0db1140a2el,
20440             0x0502a092431b270al },
20441           { 0x5d99f9508768c00al,0xda3ce5079b3ff3c7l,0x1c648b75031c11abl,
20442             0x5e3de47bf2776305l },
20443           0 },
20444         /* 77 << 96 */
20445         { { 0xe22af9274d2b9de4l,0xf3690f55a69609ecl,0x20260a6e453fbe18l,
20446             0x8edcb46b42d0b085l },
20447           { 0xd4ef250b7d9c7f58l,0x5e8578dfc83c3433l,0x9751d9b9e46e320al,
20448             0xb02bd03cf3c58af6l },
20449           0 },
20450         /* 83 << 96 */
20451         { { 0x0ab299ede1b4d1ccl,0x22e7301cec4d18d2l,0xf2380f2a7b86d4ffl,
20452             0xca19ef9e40753713l },
20453           { 0x52bb0d24678c38a1l,0xcc9d6fd499001c02l,0xa2dd6b00bc5876e4l,
20454             0xfe04b402409fe2b3l },
20455           0 },
20456         /* 89 << 96 */
20457         { { 0x7db986b1ff69f8d3l,0x648865e59d6266b9l,0x7ccfe96183f7dae5l,
20458             0x0f59a8bd6828379bl },
20459           { 0xad97e5ef0ac7c4e8l,0xa75914be784e9c18l,0x053e015bb18c1bb8l,
20460             0x18f6cefcb347043el },
20461           0 },
20462         /* 95 << 96 */
20463         { { 0xb4d641bdf257c38al,0xadcea4d0c1372574l,0x7f8d20be71c8f0d0l,
20464             0x14a1d24c41dc6344l },
20465           { 0xe446054e41f35526l,0x4664213823c952ddl,0xfbde483401f6b0acl,
20466             0xc89eee66d75b6318l },
20467           0 },
20468         /* 101 << 96 */
20469         { { 0x700242937a087392l,0xd42bd3aad5da04del,0xee64cb5b1f803414l,
20470             0xd6341ecbbab52988l },
20471           { 0x7ad522f343170a74l,0x5fba22536d61d9del,0x230304c1e845a6e5l,
20472             0xd69feabfbc9e326bl },
20473           0 },
20474         /* 107 << 96 */
20475         { { 0xef7e49412e8a11d7l,0x4cb8963662c8bae1l,0xecc741198aad5816l,
20476             0x13490782c7af5175l },
20477           { 0x10c701f73e91a604l,0xcb8c6c7124cc30c1l,0xce0d479c071eb382l,
20478             0xa3dc71fb058087d4l },
20479           0 },
20480         /* 113 << 96 */
20481         { { 0xec368492541eb6d1l,0x567735d6e09a94abl,0xb8039ec172350329l,
20482             0x3bd83a8f4894ddafl },
20483           { 0x740ef2a39c07063dl,0xba25e72277da7b59l,0xb09e248e3bf42e82l,
20484             0x7ff36da0b017d037l },
20485           0 },
20486         /* 116 << 96 */
20487         { { 0xca80416651b8d9a3l,0x42531bc90ffb0db1l,0x72ce4718aa82e7cel,
20488             0x6e199913df574741l },
20489           { 0xd5f1b13dd5d36946l,0x8255dc65f68f0194l,0xdc9df4cd8710d230l,
20490             0x3453c20f138c1988l },
20491           0 },
20492         /* 119 << 96 */
20493         { { 0x913f23b9ed08ac04l,0x18e336643590d098l,0xd3f72934e67536dcl,
20494             0xf949a757ec7ecde9l },
20495           { 0x37fc6583cf9cbd37l,0xcbe62cc043b1228el,0x777124948a743274l,
20496             0x3ea3668c716ce6f1l },
20497           0 },
20498         /* 125 << 96 */
20499         { { 0xc89ce010a90d375bl,0x39ac669340503fe3l,0x9036f782d33ecb0el,
20500             0x5190656841fdc7d1l },
20501           { 0xbefd136e917d94cdl,0x05fea2f22a511b24l,0x80e62d76f9076e0cl,
20502             0x8c57635e418ba653l },
20503           0 },
20504     },
20505     {
20506         /* 0 << 104 */
20507         { { 0x00, 0x00, 0x00, 0x00 },
20508           { 0x00, 0x00, 0x00, 0x00 },
20509           1 },
20510         /* 1 << 104 */
20511         { { 0x20d3c982cf7d62d2l,0x1f36e29d23ba8150l,0x48ae0bf092763f9el,
20512             0x7a527e6b1d3a7007l },
20513           { 0xb4a89097581a85e3l,0x1f1a520fdc158be5l,0xf98db37d167d726el,
20514             0x8802786e1113e862l },
20515           0 },
20516         /* 3 << 104 */
20517         { { 0xf6e894d1f4c6b6ecl,0x526b082718b3cd9bl,0x73f952a812117fbfl,
20518             0x2be864b011945bf5l },
20519           { 0x86f18ea542099b64l,0x2770b28a07548ce2l,0x97390f28295c1c9cl,
20520             0x672e6a43cb5206c3l },
20521           0 },
20522         /* 4 << 104 */
20523         { { 0xc37c7dd0c55c4496l,0xa6a9635725bbabd2l,0x5b7e63f2add7f363l,
20524             0x9dce37822e73f1dfl },
20525           { 0xe1e5a16ab2b91f71l,0xe44898235ba0163cl,0xf2759c32f6e515adl,
20526             0xa5e2f1f88615eecfl },
20527           0 },
20528         /* 5 << 104 */
20529         { { 0xcacce2c847c64367l,0x6a496b9f45af4ec0l,0x2a0836f36034042cl,
20530             0x14a1f3900b6c62eal },
20531           { 0xe7fa93633ef1f540l,0xd323b30a72a76d93l,0xffeec8b50feae451l,
20532             0x4eafc172bd04ef87l },
20533           0 },
20534         /* 7 << 104 */
20535         { { 0xe4435a51b3e59b89l,0x136139554133a1c9l,0x87f46973440bee59l,
20536             0x714710f800c401e4l },
20537           { 0xc0cf4bced6c446c9l,0xe0aa7fd66c4d5368l,0xde5d811afc68fc37l,
20538             0x61febd72b7c2a057l },
20539           0 },
20540         /* 9 << 104 */
20541         { { 0x27375fe665f837e2l,0x93f8c68bd882179fl,0x584feadc59b16187l,
20542             0xe5b50be9483bc162l },
20543           { 0x7ad9d6f1a2776625l,0xe9d1008004ff457bl,0x5b56d322677618a6l,
20544             0x036694eae3e68673l },
20545           0 },
20546         /* 10 << 104 */
20547         { { 0x6ca4f87e822e37bel,0x73f237b4253bda4el,0xf747f3a241190aebl,
20548             0xf06fa36f804cf284l },
20549           { 0x0a6bbb6efc621c12l,0x5d624b6440b80ec6l,0x4b0724257ba556f3l,
20550             0x7fa0c3543e2d20a8l },
20551           0 },
20552         /* 11 << 104 */
20553         { { 0x6feaffc51d8a4fd1l,0x59663b205f1ad208l,0xefc93cef24acb46al,
20554             0x54929de05967118cl },
20555           { 0x885708009acffb1cl,0x492bbf2b145639ecl,0x71f495a638f0018el,
20556             0xe24365dbc2792847l },
20557           0 },
20558         /* 13 << 104 */
20559         { { 0x4bedae86a6f29002l,0x7abedb56e034457al,0x8bf3eec6179bff2al,
20560             0x9d626d57390f4e6bl },
20561           { 0x653fe0e914dd6ea3l,0x7483715989bd6d08l,0x85fb05b4ebd9b03dl,
20562             0x7dc3f2214a768bbcl },
20563           0 },
20564         /* 15 << 104 */
20565         { { 0xaacc63f132b0ed8fl,0x041237242bafefd2l,0x0df9a7987e2d2a13l,
20566             0x09bd13cf9c27591fl },
20567           { 0xaa5f5e476e1afb50l,0xcd146a42b66eb646l,0x3f07561d1442ec3cl,
20568             0x7e5471738ae8ec47l },
20569           0 },
20570         /* 16 << 104 */
20571         { { 0x8de2b7bc453cadd6l,0x203900a7bc0bc1f8l,0xbcd86e47a6abd3afl,
20572             0x911cac128502effbl },
20573           { 0x2d550242ec965469l,0x0e9f769229e0017el,0x633f078f65979885l,
20574             0xfb87d4494cf751efl },
20575           0 },
20576         /* 17 << 104 */
20577         { { 0x2c3e61196c0c6cd5l,0x5e01a49a99f4aac8l,0xfa518fc92ef1565el,
20578             0xf64ff8714f772366l },
20579           { 0x52fcbc2b726420d0l,0x30fbf6eb76cfa9eel,0x0bd17139fa618268l,
20580             0x23ed6e122087535dl },
20581           0 },
20582         /* 19 << 104 */
20583         { { 0x76098e38bb4ccb2cl,0x44e88aeeafbad6d1l,0x5c4d286771928778l,
20584             0xb1df868138534c94l },
20585           { 0x67eb8f4d77ce9debl,0x2a86d0461a77c55dl,0xc327181e46a6a3e7l,
20586             0x68fd611b8710e206l },
20587           0 },
20588         /* 21 << 104 */
20589         { { 0xc093f3fc0c82bdf1l,0x21db25894f76c4a6l,0xf3dcb22ee410a7ael,
20590             0x1db37114f3c22ffel },
20591           { 0x9bd0a1fb58f6801dl,0x2cab103bd1b55cc8l,0x2ae1a7f5077ba4b2l,
20592             0x82b46642ce5ab2b3l },
20593           0 },
20594         /* 23 << 104 */
20595         { { 0xc8477ec52546684cl,0xe3f9387702ff02b5l,0xefb72133ae5d04cdl,
20596             0x644905c339f10d02l },
20597           { 0x1750c87c13d8d356l,0x0e9b8063b41e7640l,0xc7ece04f5647b05bl,
20598             0x89a43da7ca9df9c4l },
20599           0 },
20600         /* 25 << 104 */
20601         { { 0x02610ef1920eb7d9l,0x34bd2fc2e1ea1dc0l,0xcb89da255170b890l,
20602             0xaaa2796461cff827l },
20603           { 0xc308c9d37103ed6al,0xe82d63d5a467564al,0x94c897c4a0fa7732l,
20604             0x75eb52fa64c7aa5fl },
20605           0 },
20606         /* 27 << 104 */
20607         { { 0x52582f9cb985fcb6l,0xaaef8d9f8508a691l,0x494c2c346e505131l,
20608             0x6d062362d55f30f6l },
20609           { 0x70059e9122e1e32fl,0x1507c3fe9e51abb0l,0xd8aba31b2b7bda72l,
20610             0x5acbc5f77b753f13l },
20611           0 },
20612         /* 28 << 104 */
20613         { { 0x15bfb8bf5116f937l,0x7c64a586c1268943l,0x71e25cc38419a2c8l,
20614             0x9fd6b0c48335f463l },
20615           { 0x4bf0ba3ce8ee0e0el,0x6f6fba60298c21fal,0x57d57b39ae66bee0l,
20616             0x292d513022672544l },
20617           0 },
20618         /* 29 << 104 */
20619         { { 0x075dc81953952ff6l,0xd4d9eeda20b7384dl,0x8a81c1bfd2d6c6a5l,
20620             0x319368a0db050f3bl },
20621           { 0x91f476de31f1cee2l,0x1b38604500d0e17fl,0xed2081889a820384l,
20622             0x8d00c411a0f1a637l },
20623           0 },
20624         /* 31 << 104 */
20625         { { 0xb029b687a47fd8f0l,0xa531360696371a05l,0x7b84e88c5ab09140l,
20626             0x87dad7c85eeb1d14l },
20627           { 0xef0749b9d0edf6f3l,0x29fc7310e2ef198bl,0x01e05df5069ed399l,
20628             0x121db4ecdf4e2fcal },
20629           0 },
20630         /* 33 << 104 */
20631         { { 0xe730f3f62826bee0l,0xb9bdbe3fce332a8fl,0x1ecad11766ec00aal,
20632             0x7503d835617a62d1l },
20633           { 0x9f34e161b862b139l,0xde42194cf30f6a67l,0x5037a953c1e879fel,
20634             0x62f321f89bda45dbl },
20635           0 },
20636         /* 34 << 104 */
20637         { { 0xe87771d8033f2876l,0xb0186ec67d5cc3dbl,0x58e8bb803bc9bc1dl,
20638             0x4d1395cc6f6ef60el },
20639           { 0xa73c62d6186244a0l,0x918e5f23110a5b53l,0xed4878ca741b7eabl,
20640             0x3038d71adbe03e51l },
20641           0 },
20642         /* 35 << 104 */
20643         { { 0xcbdba27c40234d55l,0x24352b6cb3eb56c9l,0xae681b85a8e9295al,
20644             0x2a6cfba1f1171664l },
20645           { 0x49f045838ca40c3cl,0xe56da25c6eb0f8eal,0x8e62f86fc4341a4el,
20646             0x7f68bdc64c3f947fl },
20647           0 },
20648         /* 36 << 104 */
20649         { { 0x840204b7a93c3246l,0x21ab6069a0b9b4cdl,0xf5fa6e2bb1d64218l,
20650             0x1de6ad0ef3d56191l },
20651           { 0x570aaa88ff1929c7l,0xc6df4c6b640e87b5l,0xde8a74f2c65f0cccl,
20652             0x8b972fd5e6f6cc01l },
20653           0 },
20654         /* 37 << 104 */
20655         { { 0x862013c00bf22173l,0xfd004c834acd8e23l,0x50e422ca310b1649l,
20656             0xe6d04de65bbe1854l },
20657           { 0x651f646385761ef3l,0x3b17d38652cf85c9l,0xbdce284a5f54ecc7l,
20658             0x72efcd3ec7c2106cl },
20659           0 },
20660         /* 39 << 104 */
20661         { { 0x34324b182ff07e3el,0x29938f38f50bcb71l,0xd0e3d7b977e2bcc3l,
20662             0x8e78f007c0a3292bl },
20663           { 0xfa28c530005c2c00l,0x6f9c21d51faa0c5al,0x3df01abd7b9c78f3l,
20664             0x0e5618c1ccaaeb7el },
20665           0 },
20666         /* 40 << 104 */
20667         { { 0xaa6778fce7560b90l,0xb4073e61a7e824cel,0xff0d693cd642eba8l,
20668             0x7ce2e57a5dccef38l },
20669           { 0x89c2c7891df1ad46l,0x83a06922098346fdl,0x2d715d72da2fc177l,
20670             0x7b6dd71d85b6cf1dl },
20671           0 },
20672         /* 41 << 104 */
20673         { { 0x4601a6a492ad3889l,0xdc8e3364d9a0709fl,0x0c687f2b2c260327l,
20674             0xe882af62e1a79573l },
20675           { 0x0cfd00ab945d9017l,0xe6df7505d0e3c188l,0xb389a66dbde825a2l,
20676             0x126d77b6bcd8e14fl },
20677           0 },
20678         /* 43 << 104 */
20679         { { 0xc800acc7db18ec73l,0x0ebecc78d86e99efl,0x675796cdbd05bc5fl,
20680             0x254498126afd7c7fl },
20681           { 0x96293b695969b165l,0xd8514d83c162c8dal,0xe174f8b674a15a5cl,
20682             0x880d687389a2f73cl },
20683           0 },
20684         /* 44 << 104 */
20685         { { 0x53703a328300129fl,0x1f63766268c43bfdl,0xbcbd191300e54051l,
20686             0x812fcc627bf5a8c5l },
20687           { 0x3f969d5f29fb85dal,0x72f4e00a694759e8l,0x426b6e52790726b7l,
20688             0x617bbc873bdbb209l },
20689           0 },
20690         /* 45 << 104 */
20691         { { 0xf536f07cad1deb2el,0x2a13a11ea87a710el,0x0ce2ccab64f4dc96l,
20692             0x16178694f5a55464l },
20693           { 0x1496168da2cb3986l,0xb079a5b9d56a93a9l,0x97005e99092893d3l,
20694             0x55df5ed6e8fcc6c3l },
20695           0 },
20696         /* 46 << 104 */
20697         { { 0x511f8bb997aee317l,0x812a4096e81536a8l,0x137dfe593ac09b9bl,
20698             0x0682238fba8c9a7al },
20699           { 0x7072ead6aeccb4bdl,0x6a34e9aa692ba633l,0xc82eaec26fff9d33l,
20700             0xfb7535121d4d2b62l },
20701           0 },
20702         /* 47 << 104 */
20703         { { 0x821dca8bbf328b1cl,0x24596ddd5a3d6830l,0x061c4c15635b5b4cl,
20704             0x0e2b3bef4fa3560al },
20705           { 0xffced37498906c43l,0x10ebd174e26b3784l,0x7cd068c470039bb5l,
20706             0xc47dda0f88404e59l },
20707           0 },
20708         /* 48 << 104 */
20709         { { 0x1a0445ff1d7aadabl,0x65d38260d5f6a67cl,0x6e62fb0891cfb26fl,
20710             0xef1e0fa55c7d91d6l },
20711           { 0x47e7c7ba33db72cdl,0x017cbc09fa7c74b2l,0x3c931590f50a503cl,
20712             0xcac54f60616baa42l },
20713           0 },
20714         /* 49 << 104 */
20715         { { 0x7ad7d13569185235l,0x19771949fb69e030l,0xd4de9717bc45fb4fl,
20716             0x5657b076167e5739l },
20717           { 0x9503a71fdd27449el,0xfa2fabf73cc01347l,0xf8ecef24c83fb301l,
20718             0x527012bd5a8d5078l },
20719           0 },
20720         /* 51 << 104 */
20721         { { 0x70a550d7e6fc3a32l,0x8e5875841951fe57l,0x5e6d43eaaab9788bl,
20722             0x1e406fed80599794l },
20723           { 0xd8164ace9ed2557cl,0xf9648f30ff593e10l,0x53af2fd80c2ff879l,
20724             0x6705993cc9409bf4l },
20725           0 },
20726         /* 52 << 104 */
20727         { { 0x04b005b6c6458293l,0x36bb5276e8d10af7l,0xacf2dc138ee617b8l,
20728             0x470d2d35b004b3d4l },
20729           { 0x06790832feeb1b77l,0x2bb75c3985657f9cl,0xd70bd4edc0f60004l,
20730             0xfe797ecc219b018bl },
20731           0 },
20732         /* 53 << 104 */
20733         { { 0xeca02ebf0ef19ceel,0xac691fbe2de090a4l,0x1f3866641b374547l,
20734             0xbd8018c6a12ee85fl },
20735           { 0x3e851318ee63e0f1l,0x45b0c37a161987d3l,0x67fe36056eb567c4l,
20736             0x07c291b563200c5bl },
20737           0 },
20738         /* 55 << 104 */
20739         { { 0xc85535ac1a956a8al,0x7bf4d70bc0ade321l,0xaf2efc48237bc56fl,
20740             0xf9bfe13e31ba97e7l },
20741           { 0x2ca5fac4cf7c6c65l,0xc23b14ff03ec3e35l,0xc5109923217bcfd2l,
20742             0xf02f96a1c58f32f3l },
20743           0 },
20744         /* 57 << 104 */
20745         { { 0x3b1f715b0d0aeff4l,0xbe406d62f0d44536l,0xe413843d567bcb38l,
20746             0x75b7fb43791e705al },
20747           { 0x5b831d4b224f85e5l,0x3fea6659d9a35eael,0xd6f8bd097c85480bl,
20748             0x2a9561a34a959267l },
20749           0 },
20750         /* 59 << 104 */
20751         { { 0x4a96a3535a303c10l,0x9aa3ad71c37c8d7el,0x4e2d077fde52014fl,
20752             0x4d8bec5df8e3964dl },
20753           { 0xda88ab94e865e142l,0x52df506d10a88091l,0x9aebff0092fc38a2l,
20754             0xdfc034395608b0a2l },
20755           0 },
20756         /* 60 << 104 */
20757         { { 0xee23fa819966e7eel,0x64ec4aa805b7920dl,0x2d44462d2d90aad4l,
20758             0xf44dd195df277ad5l },
20759           { 0x8d6471f1bb46b6a1l,0x1e65d313fd885090l,0x33a800f513a977b4l,
20760             0xaca9d7210797e1efl },
20761           0 },
20762         /* 61 << 104 */
20763         { { 0xb1557be2a4ea787el,0x59324973019f667fl,0x262ceced5595367cl,
20764             0x8a676897ec598640l },
20765           { 0x2df6cebfc7f06f4fl,0xb255723138078f9al,0xad553c46524a0dd1l,
20766             0xe20bb20a5a68d62al },
20767           0 },
20768         /* 63 << 104 */
20769         { { 0x6f47e3779589e263l,0x7cb83e3d35106bb8l,0x2642d87bcc632fc2l,
20770             0x4d18f34d8b77eb36l },
20771           { 0x7de6bf6d19ca4d1cl,0x438e8f02f7e926aal,0xb539021250ac930al,
20772             0xe34ddfc15b219a9fl },
20773           0 },
20774         /* 64 << 104 */
20775         { { 0x98857ceb1bf4581cl,0xe635e186aca7b166l,0x278ddd22659722acl,
20776             0xa0903c4c1db68007l },
20777           { 0x366e458948f21402l,0x31b49c14b96abda2l,0x329c4b09e0403190l,
20778             0x97197ca3d29f43fel },
20779           0 },
20780         /* 65 << 104 */
20781         { { 0xfe4de13781479db4l,0x307331f012f08ea5l,0x7f59a64758c04c13l,
20782             0x6b41189abdc9b3c9l },
20783           { 0xb10f11e5a6f8c5edl,0x757fb7a3f5b0579el,0x456d0a873c90d027l,
20784             0x7e8bb6bf32361796l },
20785           0 },
20786         /* 71 << 104 */
20787         { { 0x6aa1dc6c9e689d8dl,0xaa5fa015479cdd09l,0x7eb4dbb582fc000al,
20788             0x4a57b689eff4e701l },
20789           { 0x7bfe8d2a8e15cd8cl,0xab109b1cc9074e1al,0x5716715fee1619a5l,
20790             0xf29a51eccdcb40bcl },
20791           0 },
20792         /* 77 << 104 */
20793         { { 0x14c76234ddf03c6el,0xdfb5d388baeb2eddl,0x4bd85da26d413d2dl,
20794             0x5b0dd9be3ae38469l },
20795           { 0xe4d8a9d89ab3ae61l,0xb9e37b880ee63951l,0x17f08e9b21a7f30fl,
20796             0x173db1e8119af788l },
20797           0 },
20798         /* 83 << 104 */
20799         { { 0x2352ad4a170d43f6l,0x098d74f65a0ae4b0l,0x290f5236c3a46c2al,
20800             0xea9266102dd87e7fl },
20801           { 0xd7ee90f6848e6911l,0xebe8f4cce0d8886fl,0xa2038320558ff6a0l,
20802             0x1f716534f37c38cfl },
20803           0 },
20804         /* 89 << 104 */
20805         { { 0x9754209439a4a159l,0xe6135412fed24278l,0xbba62254d70e2cabl,
20806             0x4ac6a8ac85895130l },
20807           { 0xc01614fee1a45363l,0x720ad3f8b67294f2l,0x724ea95cb420ea51l,
20808             0x1f40ab2d712b856cl },
20809           0 },
20810         /* 95 << 104 */
20811         { { 0x708e1c7975f3d30cl,0x423f1535e2172da3l,0x7a29be342a06a0b1l,
20812             0x9de5c9eb32c68ba2l },
20813           { 0x70217b0232d48793l,0x3cf3855bac1471cfl,0x6762d03f8321e179l,
20814             0x06ee12ea236fa7cfl },
20815           0 },
20816         /* 101 << 104 */
20817         { { 0x1718e7428779109bl,0x6188008d0aca350bl,0xbbe227e00594bc15l,
20818             0x4a7b6423ddbdea35l },
20819           { 0x06ad632dfa44e1bfl,0xaf9c163d1e97b409l,0x64dafec3c61f2b2fl,
20820             0xc6759d905525c0c9l },
20821           0 },
20822         /* 107 << 104 */
20823         { { 0x76d6294787517149l,0x2bda339baa77d325l,0x04b1bec067ad1fd1l,
20824             0x49f63fcc0aec7c73l },
20825           { 0x005cb459ec1bf494l,0x8fa99c1b1ec6f8bbl,0x70a4e6d78b59dd43l,
20826             0xfd70bcb313d6594dl },
20827           0 },
20828         /* 113 << 104 */
20829         { { 0x2987a7cb13966c11l,0x74ad0a26a783f283l,0xf011200ae54d27f0l,
20830             0xbd8632963fb38396l },
20831           { 0x7ec7fe8c9b86d059l,0xfa94ca76d0cd33a7l,0xf6ad741cdc646993l,
20832             0x83054a427ebc34e9l },
20833           0 },
20834         /* 116 << 104 */
20835         { { 0xadef8c5a192ef710l,0x88afbd4b3b7431f9l,0x7e1f740764250c9el,
20836             0x6e31318db58bec07l },
20837           { 0xfd4fc4b824f89b4el,0x65a5dd8848c36a2al,0x4f1eccfff024baa7l,
20838             0x22a21cf2cba94650l },
20839           0 },
20840         /* 119 << 104 */
20841         { { 0x7b45865478f39754l,0xcbb8b96c4564e003l,0xb492d2bf69b35752l,
20842             0x4e6287e065ee5ad3l },
20843           { 0x07906c14eb1ffe62l,0xf350390c681fcdf8l,0xc351386f6be3eec3l,
20844             0x8480d00ee5df919dl },
20845           0 },
20846         /* 125 << 104 */
20847         { { 0x399861ecf8a2d5aal,0xb179adeb046f78cbl,0x056a6cd88792f647l,
20848             0xd3dfc91c3d411820l },
20849           { 0x4ccf92d179693be1l,0x12ecd9a3f65cb250l,0x58e5d2102538b9e7l,
20850             0x4e655882ff977ccal },
20851           0 },
20852     },
20853     {
20854         /* 0 << 112 */
20855         { { 0x00, 0x00, 0x00, 0x00 },
20856           { 0x00, 0x00, 0x00, 0x00 },
20857           1 },
20858         /* 1 << 112 */
20859         { { 0x8ce9b6bfc360e25al,0xe6425195075a1a78l,0x9dc756a8481732f4l,
20860             0x83c0440f5432b57al },
20861           { 0xc670b3f1d720281fl,0x2205910ed135e051l,0xded14b0edb052be7l,
20862             0x697b3d27c568ea39l },
20863           0 },
20864         /* 3 << 112 */
20865         { { 0x0b89de9314092ebbl,0xf17256bd428e240cl,0xcf89a7f393d2f064l,
20866             0x4f57841ee1ed3b14l },
20867           { 0x4ee14405e708d855l,0x856aae7203f1c3d0l,0xc8e5424fbdd7eed5l,
20868             0x3333e4ef73ab4270l },
20869           0 },
20870         /* 4 << 112 */
20871         { { 0x3bc77adedda492f8l,0xc11a3aea78297205l,0x5e89a3e734931b4cl,
20872             0x17512e2e9f5694bbl },
20873           { 0x5dc349f3177bf8b6l,0x232ea4ba08c7ff3el,0x9c4f9d16f511145dl,
20874             0xccf109a333b379c3l },
20875           0 },
20876         /* 5 << 112 */
20877         { { 0xe75e7a88a1f25897l,0x7ac6961fa1b5d4d8l,0xe3e1077308f3ed5cl,
20878             0x208a54ec0a892dfbl },
20879           { 0xbe826e1978660710l,0x0cf70a97237df2c8l,0x418a7340ed704da5l,
20880             0xa3eeb9a908ca33fdl },
20881           0 },
20882         /* 7 << 112 */
20883         { { 0xb4323d588434a920l,0xc0af8e93622103c5l,0x667518ef938dbf9al,
20884             0xa184307383a9cdf2l },
20885           { 0x350a94aa5447ab80l,0xe5e5a325c75a3d61l,0x74ba507f68411a9el,
20886             0x10581fc1594f70c5l },
20887           0 },
20888         /* 9 << 112 */
20889         { { 0x5aaa98a7cb0c9c8cl,0x75105f3081c4375cl,0xceee50575ef1c90fl,
20890             0xb31e065fc23a17bfl },
20891           { 0x5364d275d4b6d45al,0xd363f3ad62ec8996l,0xb5d212394391c65bl,
20892             0x84564765ebb41b47l },
20893           0 },
20894         /* 10 << 112 */
20895         { { 0x20d18ecc37107c78l,0xacff3b6b570c2a66l,0x22f975d99bd0d845l,
20896             0xef0a0c46ba178fa0l },
20897           { 0x1a41965176b6028el,0xc49ec674248612d4l,0x5b6ac4f27338af55l,
20898             0x06145e627bee5a36l },
20899           0 },
20900         /* 11 << 112 */
20901         { { 0x33e95d07e75746b5l,0x1c1e1f6dc40c78bel,0x967833ef222ff8e2l,
20902             0x4bedcf6ab49180adl },
20903           { 0x6b37e9c13d7a4c8al,0x2748887c6ddfe760l,0xf7055123aa3a5bbcl,
20904             0x954ff2257bbb8e74l },
20905           0 },
20906         /* 13 << 112 */
20907         { { 0x4e23ca446d3fea55l,0xb4ae9c86f4810568l,0x47bfb91b2a62f27dl,
20908             0x60deb4c9d9bac28cl },
20909           { 0xa892d8947de6c34cl,0x4ee682594494587dl,0x914ee14e1a3f8a5bl,
20910             0xbb113eaa28700385l },
20911           0 },
20912         /* 15 << 112 */
20913         { { 0xef9dc899a7b56eafl,0x00c0e52c34ef7316l,0x5b1e4e24fe818a86l,
20914             0x9d31e20dc538be47l },
20915           { 0x22eb932d3ed68974l,0xe44bbc087c4e87c4l,0x4121086e0dde9aefl,
20916             0x8e6b9cff134f4345l },
20917           0 },
20918         /* 16 << 112 */
20919         { { 0x96892c1f711b0eb9l,0xb905f2c8780ab954l,0xace26309a20792dbl,
20920             0xec8ac9b30684e126l },
20921           { 0x486ad8b6b40a2447l,0x60121fc19fe3fb24l,0x5626fccf1a8e3b3fl,
20922             0x4e5686226ad1f394l },
20923           0 },
20924         /* 17 << 112 */
20925         { { 0xda7aae0d196aa5a1l,0xe0df8c771041b5fbl,0x451465d926b318b7l,
20926             0xc29b6e557ab136e9l },
20927           { 0x2c2ab48b71148463l,0xb5738de364454a76l,0x54ccf9a05a03abe4l,
20928             0x377c02960427d58el },
20929           0 },
20930         /* 19 << 112 */
20931         { { 0x90e4f7c92d7d1413l,0x67e2d6b59834f597l,0x4fd4f4f9a808c3e8l,
20932             0xaf8237e0d5281ec1l },
20933           { 0x25ab5fdc84687ceel,0xc5ded6b1a5b26c09l,0x8e4a5aecc8ea7650l,
20934             0x23b73e5c14cc417fl },
20935           0 },
20936         /* 21 << 112 */
20937         { { 0xb4293fdcf50225f9l,0xc52e175cb0e12b03l,0xf649c3bad0a8bf64l,
20938             0x745a8fefeb8ae3c6l },
20939           { 0x30d7e5a358321bc3l,0xb1732be70bc4df48l,0x1f217993e9ea5058l,
20940             0xf7a71cde3e4fd745l },
20941           0 },
20942         /* 23 << 112 */
20943         { { 0xa188b2502d0f39aal,0x622118bb15a85947l,0x2ebf520ffde0f4fal,
20944             0xa40e9f294860e539l },
20945           { 0x7b6a51eb22b57f0fl,0x849a33b97e80644al,0x50e5d16f1cf095fel,
20946             0xd754b54eec55f002l },
20947           0 },
20948         /* 25 << 112 */
20949         { { 0xcd821dfb988baf01l,0xe6331a7ddbb16647l,0x1eb8ad33094cb960l,
20950             0x593cca38c91bbca5l },
20951           { 0x384aac8d26567456l,0x40fa0309c04b6490l,0x97834cd6dab6c8f6l,
20952             0x68a7318d3f91e55fl },
20953           0 },
20954         /* 27 << 112 */
20955         { { 0xc7bfd486605daaa6l,0x46fd72b7bb9a6c9el,0xe4847fb1a124fb89l,
20956             0x75959cbda2d8ffbcl },
20957           { 0x42579f65c8a588eel,0x368c92e6b80b499dl,0xea4ef6cd999a5df1l,
20958             0xaa73bb7f936fe604l },
20959           0 },
20960         /* 28 << 112 */
20961         { { 0xf347a70d6457d188l,0x86eda86b8b7a388bl,0xb7cdff060ccd6013l,
20962             0xbeb1b6c7d0053fb2l },
20963           { 0x0b02238799240a9fl,0x1bbb384f776189b2l,0x8695e71e9066193al,
20964             0x2eb5009706ffac7el },
20965           0 },
20966         /* 29 << 112 */
20967         { { 0x0654a9c04a7d2caal,0x6f3fb3d1a5aaa290l,0x835db041ff476e8fl,
20968             0x540b8b0bc42295e4l },
20969           { 0xa5c73ac905e214f5l,0x9a74075a56a0b638l,0x2e4b1090ce9e680bl,
20970             0x57a5b4796b8d9afal },
20971           0 },
20972         /* 31 << 112 */
20973         { { 0x2a2bfa7f650006f0l,0xdfd7dad350c0fbb2l,0x92452495ccf9ad96l,
20974             0x183bf494d95635f9l },
20975           { 0x02d5df434a7bd989l,0x505385cca5431095l,0xdd98e67dfd43f53el,
20976             0xd61e1a6c500c34a9l },
20977           0 },
20978         /* 33 << 112 */
20979         { { 0x41d85ea1ef74c45bl,0x2cfbfa66ae328506l,0x98b078f53ada7da9l,
20980             0xd985fe37ec752fbbl },
20981           { 0xeece68fe5a0148b4l,0x6f9a55c72d78136dl,0x232dccc4d2b729cel,
20982             0xa27e0dfd90aafbc4l },
20983           0 },
20984         /* 34 << 112 */
20985         { { 0x9647445212b4603el,0xa876c5516b706d14l,0xdf145fcf69a9d412l,
20986             0xe2ab75b72d479c34l },
20987           { 0x12df9a761a23ff97l,0xc61389925d359d10l,0x6e51c7aefa835f22l,
20988             0x69a79cb1c0fcc4d9l },
20989           0 },
20990         /* 35 << 112 */
20991         { { 0xf57f350d594cc7e1l,0x3079ca633350ab79l,0x226fb6149aff594al,
20992             0x35afec026d59a62bl },
20993           { 0x9bee46f406ed2c6el,0x58da17357d939a57l,0x44c504028fd1797el,
20994             0xd8853e7c5ccea6cal },
20995           0 },
20996         /* 36 << 112 */
20997         { { 0x4065508da35fcd5fl,0x8965df8c495ccaebl,0x0f2da85012e1a962l,
20998             0xee471b94c1cf1cc4l },
20999           { 0xcef19bc80a08fb75l,0x704958f581de3591l,0x2867f8b23aef4f88l,
21000             0x8d749384ea9f9a5fl },
21001           0 },
21002         /* 37 << 112 */
21003         { { 0x1b3855378c9049f4l,0x5be948f37b92d8b6l,0xd96f725db6e2bd6bl,
21004             0x37a222bc958c454dl },
21005           { 0xe7c61abb8809bf61l,0x46f07fbc1346f18dl,0xfb567a7ae87c0d1cl,
21006             0x84a461c87ef3d07al },
21007           0 },
21008         /* 39 << 112 */
21009         { { 0x3ab3d5afbd76e195l,0x478dd1ad6938a810l,0x6ffab3936ee3d5cbl,
21010             0xdfb693db22b361e4l },
21011           { 0xf969449651dbf1a7l,0xcab4b4ef08a2e762l,0xe8c92f25d39bba9al,
21012             0x850e61bcf1464d96l },
21013           0 },
21014         /* 40 << 112 */
21015         { { 0xb7e830e3dc09508bl,0xfaf6d2cf74317655l,0x72606cebdf690355l,
21016             0x48bb92b3d0c3ded6l },
21017           { 0x65b754845c7cf892l,0xf6cd7ac9d5d5f01fl,0xc2c30a5996401d69l,
21018             0x91268650ed921878l },
21019           0 },
21020         /* 41 << 112 */
21021         { { 0x380bf913b78c558fl,0x43c0baebc8afdaa9l,0x377f61d554f169d3l,
21022             0xf8da07e3ae5ff20bl },
21023           { 0xb676c49da8a90ea8l,0x81c1ff2b83a29b21l,0x383297ac2ad8d276l,
21024             0x3001122fba89f982l },
21025           0 },
21026         /* 43 << 112 */
21027         { { 0xbbe1e6a6c93f72d6l,0xd5f75d12cad800eal,0xfa40a09fe7acf117l,
21028             0x32c8cdd57581a355l },
21029           { 0x742219927023c499l,0xa8afe5d738ec3901l,0x5691afcba90e83f0l,
21030             0x41bcaa030b8f8eacl },
21031           0 },
21032         /* 44 << 112 */
21033         { { 0xe38b5ff98d2668d5l,0x0715281a7ad81965l,0x1bc8fc7c03c6ce11l,
21034             0xcbbee6e28b650436l },
21035           { 0x06b00fe80cdb9808l,0x17d6e066fe3ed315l,0x2e9d38c64d0b5018l,
21036             0xab8bfd56844dcaefl },
21037           0 },
21038         /* 45 << 112 */
21039         { { 0x42894a59513aed8bl,0xf77f3b6d314bd07al,0xbbdecb8f8e42b582l,
21040             0xf10e2fa8d2390fe6l },
21041           { 0xefb9502262a2f201l,0x4d59ea5050ee32b0l,0xd87f77286da789a8l,
21042             0xcf98a2cff79492c4l },
21043           0 },
21044         /* 46 << 112 */
21045         { { 0xf9577239720943c2l,0xba044cf53990b9d0l,0x5aa8e82395f2884al,
21046             0x834de6ed0278a0afl },
21047           { 0xc8e1ee9a5f25bd12l,0x9259ceaa6f7ab271l,0x7e6d97a277d00b76l,
21048             0x5c0c6eeaa437832al },
21049           0 },
21050         /* 47 << 112 */
21051         { { 0x5232c20f5606b81dl,0xabd7b3750d991ee5l,0x4d2bfe358632d951l,
21052             0x78f8514698ed9364l },
21053           { 0x951873f0f30c3282l,0x0da8ac80a789230bl,0x3ac7789c5398967fl,
21054             0xa69b8f7fbdda0fb5l },
21055           0 },
21056         /* 48 << 112 */
21057         { { 0xe5db77176add8545l,0x1b71cb6672c49b66l,0xd856073968421d77l,
21058             0x03840fe883e3afeal },
21059           { 0xb391dad51ec69977l,0xae243fb9307f6726l,0xc88ac87be8ca160cl,
21060             0x5174cced4ce355f4l },
21061           0 },
21062         /* 49 << 112 */
21063         { { 0x98a35966e58ba37dl,0xfdcc8da27817335dl,0x5b75283083fbc7bfl,
21064             0x68e419d4d9c96984l },
21065           { 0x409a39f402a40380l,0x88940faf1fe977bcl,0xc640a94b8f8edea6l,
21066             0x1e22cd17ed11547dl },
21067           0 },
21068         /* 51 << 112 */
21069         { { 0x17ba93b1a20ef103l,0xad8591306ba6577bl,0x65c91cf66fa214a0l,
21070             0xd7d49c6c27990da5l },
21071           { 0xecd9ec8d20bb569dl,0xbd4b2502eeffbc33l,0x2056ca5a6bed0467l,
21072             0x7916a1f75b63728cl },
21073           0 },
21074         /* 52 << 112 */
21075         { { 0xd4f9497d53a4f566l,0x8973466497b56810l,0xf8e1da740494a621l,
21076             0x82546a938d011c68l },
21077           { 0x1f3acb19c61ac162l,0x52f8fa9cabad0d3el,0x15356523b4b7ea43l,
21078             0x5a16ad61ae608125l },
21079           0 },
21080         /* 53 << 112 */
21081         { { 0xb0bcb87f4faed184l,0x5f236b1d5029f45fl,0xd42c76070bc6b1fcl,
21082             0xc644324e68aefce3l },
21083           { 0x8e191d595c5d8446l,0xc020807713ae1979l,0xadcaee553ba59cc7l,
21084             0x20ed6d6ba2cb81bal },
21085           0 },
21086         /* 55 << 112 */
21087         { { 0x7392b41a530ccbbdl,0x87c82146ea823525l,0xa52f984c05d98d0cl,
21088             0x2ae57d735ef6974cl },
21089           { 0x9377f7bf3042a6ddl,0xb1a007c019647a64l,0xfaa9079a0cca9767l,
21090             0x3d81a25bf68f72d5l },
21091           0 },
21092         /* 57 << 112 */
21093         { { 0xc110d830b0f2ac95l,0x48d0995aab20e64el,0x0f3e00e17729cd9al,
21094             0x2a570c20dd556946l },
21095           { 0x912dbcfd4e86214dl,0x2d014ee2cf615498l,0x55e2b1e63530d76el,
21096             0xc5135ae4fd0fd6d1l },
21097           0 },
21098         /* 59 << 112 */
21099         { { 0x1854daa5061f1658l,0xc0016df1df0cd2b3l,0xc2a3f23e833d50del,
21100             0x73b681d2bbbd3017l },
21101           { 0x2f046dc43ac343c0l,0x9c847e7d85716421l,0xe1e13c910917eed4l,
21102             0x3fc9eebd63a1b9c6l },
21103           0 },
21104         /* 60 << 112 */
21105         { { 0x0f816a727fe02299l,0x6335ccc2294f3319l,0x3820179f4745c5bel,
21106             0xe647b782922f066el },
21107           { 0xc22e49de02cafb8al,0x299bc2fffcc2ecccl,0x9a8feea26e0e8282l,
21108             0xa627278bfe893205l },
21109           0 },
21110         /* 61 << 112 */
21111         { { 0xa7e197337933e47bl,0xf4ff6b132e766402l,0xa4d8be0a98440d9fl,
21112             0x658f5c2f38938808l },
21113           { 0x90b75677c95b3b3el,0xfa0442693137b6ffl,0x077b039b43c47c29l,
21114             0xcca95dd38a6445b2l },
21115           0 },
21116         /* 63 << 112 */
21117         { { 0x583f3703f9374ab6l,0x864f91956e564145l,0x33bc3f4822526d50l,
21118             0x9f323c801262a496l },
21119           { 0xaa97a7ae3f046a9al,0x70da183edf8a039al,0x5b68f71c52aa0ba6l,
21120             0x9be0fe5121459c2dl },
21121           0 },
21122         /* 64 << 112 */
21123         { { 0xc1e17eb6cbc613e5l,0x33131d55497ea61cl,0x2f69d39eaf7eded5l,
21124             0x73c2f434de6af11bl },
21125           { 0x4ca52493a4a375fal,0x5f06787cb833c5c2l,0x814e091f3e6e71cfl,
21126             0x76451f578b746666l },
21127           0 },
21128         /* 65 << 112 */
21129         { { 0xa700767eabd0cc76l,0xa14ae98015889273l,0x5acf2cc466ea6380l,
21130             0xb942cc40d08d18b9l },
21131           { 0x9b5daa763ae45782l,0x61a25e0fb72f0ce0l,0xf94c0e80435fefe3l,
21132             0x73d552cf1620e1c9l },
21133           0 },
21134         /* 71 << 112 */
21135         { { 0x57130582727185c1l,0x8f2b8ebc163897ecl,0x4a059cc7a04e4a6bl,
21136             0x4b1de9fe0908a366l },
21137           { 0xa4f7738688d0fef0l,0x55e3bb1d9ebfc138l,0x9022bbef005ae362l,
21138             0xf5669edc8741d349l },
21139           0 },
21140         /* 77 << 112 */
21141         { { 0xf192c0f7ede937a4l,0xd2e91d62810c1b1el,0xf2b40b64dcc39c69l,
21142             0xe125fbd028f03b0el },
21143           { 0x52966dd78da708f9l,0x92d400a3cc0e7f32l,0x4e35aae36b0842b8l,
21144             0x0b4fe66ded3ad3cfl },
21145           0 },
21146         /* 83 << 112 */
21147         { { 0x14b81d951f1ff6b5l,0x1d82f132ed9b03b8l,0x52f6f029b4fa4047l,
21148             0xea653682601e5913l },
21149           { 0x4e900375edeee046l,0xd22ed267f9428714l,0xb004fb3b1753e873l,
21150             0xfef061ba245b2c09l },
21151           0 },
21152         /* 89 << 112 */
21153         { { 0x5e2376eaf9deba2bl,0x1ed1e9e5269a18cfl,0x8dffd66dcb1cada8l,
21154             0xb13239f068369c77l },
21155           { 0x2fede3a67f25426fl,0xc885cf0c6f90a2a6l,0xd950162d4eeac543l,
21156             0x53011aa09abc201bl },
21157           0 },
21158         /* 95 << 112 */
21159         { { 0x7a63925d432b798al,0x92e762cfc9bd6da9l,0xf22fb9706a190382l,
21160             0x19919b847b18a9b3l },
21161           { 0x16793b803adfde86l,0xf9ce15ace8b1d44cl,0x4bf74144c0a140b8l,
21162             0x680468616f853f6cl },
21163           0 },
21164         /* 101 << 112 */
21165         { { 0xd4e0d8460db84ba2l,0x9a162a3a360b68bbl,0x7297f3939233146cl,
21166             0xbc93c2f4ec77412dl },
21167           { 0x13ddf0a7e07e1065l,0x000a8d45fb5e5131l,0xb4373078cf61d467l,
21168             0xa4a1fd67bf3bb6f9l },
21169           0 },
21170         /* 107 << 112 */
21171         { { 0x6f2473f9d7585098l,0x45a29448d4f23c1al,0x47fe40f1c22bdc25l,
21172             0x4e46ed1f31347673l },
21173           { 0x5e43a8624148898cl,0x4a02ededa993954el,0x83d830b52f8a1847l,
21174             0x007e3156a7f6a378l },
21175           0 },
21176         /* 113 << 112 */
21177         { { 0x01a39fe7e847ca18l,0xaf2722418fed2772l,0x3104ef891fbb1748l,
21178             0x5b55331b2b9dd5ffl },
21179           { 0xe7806e31cec6a787l,0x9f49ed881e9c0af2l,0xf5a66373a3905b36l,
21180             0x77b5bca9efab75f3l },
21181           0 },
21182         /* 116 << 112 */
21183         { { 0xd4d75f4bf0831932l,0x5e770ac477fe8cc9l,0x52b5e748862e72a2l,
21184             0xe9a45482501d35fel },
21185           { 0x8a93e7424a9ab187l,0x5a72506de88ca017l,0xe680dcb201eb2defl,
21186             0xdc5aa4e6ba68209dl },
21187           0 },
21188         /* 119 << 112 */
21189         { { 0x2defa3dc3d01a344l,0x11fd939b162e459al,0x928453b97313d720l,
21190             0x08696dc053184a65l },
21191           { 0xd9f8a69c721f7415l,0x304eb0e079539019l,0xc9b0ca6dbb0c6313l,
21192             0xa10133eba93dc74el },
21193           0 },
21194         /* 125 << 112 */
21195         { { 0xee0b164004393f1el,0x511547dfe1301979l,0xc00dfc3516d26d87l,
21196             0x06227c8aab847494l },
21197           { 0x178ca86748b2fdc7l,0xb51296f01a8ba1dcl,0xf252787731e1dd14l,
21198             0x7ecb5456c0ba2a1fl },
21199           0 },
21200     },
21201     {
21202         /* 0 << 120 */
21203         { { 0x00, 0x00, 0x00, 0x00 },
21204           { 0x00, 0x00, 0x00, 0x00 },
21205           1 },
21206         /* 1 << 120 */
21207         { { 0x3e0e5c9dd111f8ecl,0xbcc33f8db7c4e760l,0x702f9a91bd392a51l,
21208             0x7da4a795c132e92dl },
21209           { 0x1a0b0ae30bb1151bl,0x54febac802e32251l,0xea3a5082694e9e78l,
21210             0xe58ffec1e4fe40b8l },
21211           0 },
21212         /* 3 << 120 */
21213         { { 0x7b23c513516e19e4l,0x56e2e847c5c4d593l,0x9f727d735ce71ef6l,
21214             0x5b6304a6f79a44c5l },
21215           { 0x6638a7363ab7e433l,0x1adea470fe742f83l,0xe054b8545b7fc19fl,
21216             0xf935381aba1d0698l },
21217           0 },
21218         /* 4 << 120 */
21219         { { 0xb5504f9d918e4936l,0x65035ef6b2513982l,0x0553a0c26f4d9cb9l,
21220             0x6cb10d56bea85509l },
21221           { 0x48d957b7a242da11l,0x16a4d3dd672b7268l,0x3d7e637c8502a96bl,
21222             0x27c7032b730d463bl },
21223           0 },
21224         /* 5 << 120 */
21225         { { 0x55366b7d5846426fl,0xe7d09e89247d441dl,0x510b404d736fbf48l,
21226             0x7fa003d0e784bd7dl },
21227           { 0x25f7614f17fd9596l,0x49e0e0a135cb98dbl,0x2c65957b2e83a76al,
21228             0x5d40da8dcddbe0f8l },
21229           0 },
21230         /* 7 << 120 */
21231         { { 0x9fb3bba354530bb2l,0xbde3ef77cb0869eal,0x89bc90460b431163l,
21232             0x4d03d7d2e4819a35l },
21233           { 0x33ae4f9e43b6a782l,0x216db3079c88a686l,0x91dd88e000ffedd9l,
21234             0xb280da9f12bd4840l },
21235           0 },
21236         /* 9 << 120 */
21237         { { 0xa37f3573f37f5937l,0xeb0f6c7dd1e4fca5l,0x2965a554ac8ab0fcl,
21238             0x17fbf56c274676acl },
21239           { 0x2e2f6bd9acf7d720l,0x41fc8f8810224766l,0x517a14b385d53befl,
21240             0xdae327a57d76a7d1l },
21241           0 },
21242         /* 10 << 120 */
21243         { { 0x515d5c891f5f82dcl,0x9a7f67d76361079el,0xa8da81e311a35330l,
21244             0xe44990c44b18be1bl },
21245           { 0xc7d5ed95af103e59l,0xece8aba78dac9261l,0xbe82b0999394b8d3l,
21246             0x6830f09a16adfe83l },
21247           0 },
21248         /* 11 << 120 */
21249         { { 0x43c41ac194d7d9b1l,0x5bafdd82c82e7f17l,0xdf0614c15fda0fcal,
21250             0x74b043a7a8ae37adl },
21251           { 0x3ba6afa19e71734cl,0x15d5437e9c450f2el,0x4a5883fe67e242b1l,
21252             0x5143bdc22c1953c2l },
21253           0 },
21254         /* 13 << 120 */
21255         { { 0xc676d7f2b1f3390bl,0x9f7a1b8ca5b61272l,0x4ebebfc9c2e127a9l,
21256             0x4602500c5dd997bfl },
21257           { 0x7f09771c4711230fl,0x058eb37c020f09c1l,0xab693d4bfee5e38bl,
21258             0x9289eb1f4653cbc0l },
21259           0 },
21260         /* 15 << 120 */
21261         { { 0x54da9dc7ab952578l,0xb5423df226e84d0bl,0xa8b64eeb9b872042l,
21262             0xac2057825990f6dfl },
21263           { 0x4ff696eb21f4c77al,0x1a79c3e4aab273afl,0x29bc922e9436b3f1l,
21264             0xff807ef8d6d9a27al },
21265           0 },
21266         /* 16 << 120 */
21267         { { 0xc7f3a8f833f6746cl,0x21e46f65fea990cal,0x915fd5c5caddb0a9l,
21268             0xbd41f01678614555l },
21269           { 0x346f4434426ffb58l,0x8055943614dbc204l,0xf3dd20fe5a969b7fl,
21270             0x9d59e956e899a39al },
21271           0 },
21272         /* 17 << 120 */
21273         { { 0xe4ca688fd06f56c0l,0xa48af70ddf027972l,0x691f0f045e9a609dl,
21274             0xa9dd82cdee61270el },
21275           { 0x8903ca63a0ef18d3l,0x9fb7ee353d6ca3bdl,0xa7b4a09cabf47d03l,
21276             0x4cdada011c67de8el },
21277           0 },
21278         /* 19 << 120 */
21279         { { 0xac127dc1e038a675l,0x729deff38c5c6320l,0xb7df8fd4a90d2c53l,
21280             0x9b74b0ec681e7cd3l },
21281           { 0x5cb5a623dab407e5l,0xcdbd361576b340c6l,0xa184415a7d28392cl,
21282             0xc184c1d8e96f7830l },
21283           0 },
21284         /* 21 << 120 */
21285         { { 0x86a9303b2f7e85c3l,0x5fce462171988f9bl,0x5b935bf6c138acb5l,
21286             0x30ea7d6725661212l },
21287           { 0xef1eb5f4e51ab9a2l,0x0587c98aae067c78l,0xb3ce1b3c77ca9ca6l,
21288             0x2a553d4d54b5f057l },
21289           0 },
21290         /* 23 << 120 */
21291         { { 0x2c7156e10b1894a0l,0x92034001d81c68c0l,0xed225d00c8b115b5l,
21292             0x237f9c2283b907f2l },
21293           { 0x0ea2f32f4470e2c0l,0xb725f7c158be4e95l,0x0f1dcafab1ae5463l,
21294             0x59ed51871ba2fc04l },
21295           0 },
21296         /* 25 << 120 */
21297         { { 0xd1b0ccdec9520711l,0x55a9e4ed3c8b84bfl,0x9426bd39a1fef314l,
21298             0x4f5f638e6eb93f2bl },
21299           { 0xba2a1ed32bf9341bl,0xd63c13214d42d5a9l,0xd2964a89316dc7c5l,
21300             0xd1759606ca511851l },
21301           0 },
21302         /* 27 << 120 */
21303         { { 0xedf69feaf8c51187l,0x05bb67ec741e4da7l,0x47df0f3208114345l,
21304             0x56facb07bb9792b1l },
21305           { 0xf3e007e98f6229e4l,0x62d103f4526fba0fl,0x4f33bef7b0339d79l,
21306             0x9841357bb59bfec1l },
21307           0 },
21308         /* 28 << 120 */
21309         { { 0xae1e0b67e28ef5bal,0x2c9a4699cb18e169l,0x0ecd0e331e6bbd20l,
21310             0x571b360eaf5e81d2l },
21311           { 0xcd9fea58101c1d45l,0x6651788e18880452l,0xa99726351f8dd446l,
21312             0x44bed022e37281d0l },
21313           0 },
21314         /* 29 << 120 */
21315         { { 0x830e6eea60dbac1fl,0x23d8c484da06a2f7l,0x896714b050ca535bl,
21316             0xdc8d3644ebd97a9bl },
21317           { 0x106ef9fab12177b4l,0xf79bf464534d5d9cl,0x2537a349a6ab360bl,
21318             0xc7c54253a00c744fl },
21319           0 },
21320         /* 31 << 120 */
21321         { { 0x24d661d168754ab0l,0x801fce1d6f429a76l,0xc068a85fa58ce769l,
21322             0xedc35c545d5eca2bl },
21323           { 0xea31276fa3f660d1l,0xa0184ebeb8fc7167l,0x0f20f21a1d8db0ael,
21324             0xd96d095f56c35e12l },
21325           0 },
21326         /* 33 << 120 */
21327         { { 0x57d2046b59da06ebl,0x3c076d5fa49f6d74l,0x6b4c96e616f82ea0l,
21328             0xaf7b0f1f90536c0bl },
21329           { 0x7999f86d204a9b2dl,0x7e420264126c9f87l,0x4c967a1f262ac4e5l,
21330             0xe8174a09900e79adl },
21331           0 },
21332         /* 34 << 120 */
21333         { { 0xd51687f2cb82516bl,0x8a440cfc040e4670l,0xeafd2bcfe7738d32l,
21334             0x7071e9162a1e911al },
21335           { 0xbd3abd44cfea57bbl,0x9c3add16085b19e2l,0xb194c01d6baa5aa6l,
21336             0x6f3d3faf92f85c64l },
21337           0 },
21338         /* 35 << 120 */
21339         { { 0xe23e0769488a280el,0x8e55a728e63a5904l,0x01690716ab84cccfl,
21340             0xfe796130b78b3c98l },
21341           { 0x15cc475b9117f211l,0xbdc178761d1b9d56l,0x8df5594a3e37b9b9l,
21342             0x97747e341e37e494l },
21343           0 },
21344         /* 36 << 120 */
21345         { { 0xf2a6370ed2f896e1l,0x27100e63802987afl,0xb4db1cff4678ebc7l,
21346             0x6e5f28d937b4b263l },
21347           { 0xd29030009711ebc4l,0xf14dcb9ff8712484l,0x7a46ec3eea449146l,
21348             0x200155e9c1c51179l },
21349           0 },
21350         /* 37 << 120 */
21351         { { 0x8130f007f1968d55l,0x18823e7097ed9803l,0xdc9fec559402762dl,
21352             0x9e0bd57e278f5abbl },
21353           { 0xaa41b913c9ebf303l,0x1105ec43a76b9353l,0xf8e4ee4cf4e6c6b5l,
21354             0x3a630972bd7be696l },
21355           0 },
21356         /* 39 << 120 */
21357         { { 0x5c7da7e16356b3eel,0x951bfe458ccf9b48l,0x6f2c6e91d0555d0cl,
21358             0x47d7f7b58efd38eel },
21359           { 0x957256c8af6fd630l,0xa690c65bdc01774cl,0xad52b27c7c8dafdal,
21360             0x81fbc16af44a145fl },
21361           0 },
21362         /* 40 << 120 */
21363         { { 0x497c3a3481b0493al,0x2b3ab20d71bc8408l,0x0c60226aa03769d1l,
21364             0x4ac89c7ad10708b0l },
21365           { 0x62398ea5092f7e6al,0x7f408f54de96d526l,0x025bde6f85bf102cl,
21366             0xcc2f85120a4aa72el },
21367           0 },
21368         /* 41 << 120 */
21369         { { 0x8a65e0386884a9c3l,0xd2e6ac047bf8c794l,0xc9c5d3d3f7bcdfb9l,
21370             0x0000ce42a33f2c12l },
21371           { 0xea1c0a9a7dd13b2bl,0xbfd97d7f0c35c3b1l,0x0ba75cf3347fcefel,
21372             0xc3c5f28f1333460dl },
21373           0 },
21374         /* 43 << 120 */
21375         { { 0x7810ebf575baa708l,0xe7fa7a0dd7440549l,0x25b813baf0667e4al,
21376             0x30a46740d15838a8l },
21377           { 0x13207b1ad04b22f7l,0x09e601ffd1419699l,0xb1038fc77f687b27l,
21378             0xa4547dc9a127f95bl },
21379           0 },
21380         /* 44 << 120 */
21381         { { 0x83b2e3b3056ecd2cl,0xd17dcdaaf03dfd36l,0xee24a5f81dcef956l,
21382             0xb6746cd0b7239f16l },
21383           { 0xed6cb311c8458c48l,0xe8c0fc9805d27da4l,0x4610e9a0a1bf0970l,
21384             0x1947f01d9906c19el },
21385           0 },
21386         /* 45 << 120 */
21387         { { 0x8b979126217c7cd7l,0x65c57a378050067el,0x6a50c6383f34838cl,
21388             0x3de617c29b7bc81fl },
21389           { 0x58488d24253a0ac7l,0x3fe53ec75520ba0bl,0x9156dca763f0607el,
21390             0xdd08c5705d1fe134l },
21391           0 },
21392         /* 46 << 120 */
21393         { { 0xbfb1d9e1e33ba77fl,0x0985311ccaef6c01l,0xc8b59e9accca8948l,
21394             0x1256280945416f25l },
21395           { 0xc90edbc257f53218l,0xcaa08c05125d8fb5l,0x33ea3fd49a1aad3bl,
21396             0x2aa8bd83d005e8bel },
21397           0 },
21398         /* 47 << 120 */
21399         { { 0xcbd2f1a3c2b22963l,0x0f7bd29c0c8ac2b3l,0xddb932432d405bfdl,
21400             0xeabd4805328413b5l },
21401           { 0xcc79d31748ebb6b9l,0x09604f831f521aael,0xd3487fdf4c7d188cl,
21402             0xd219c318d1552ea9l },
21403           0 },
21404         /* 48 << 120 */
21405         { { 0xef4f115c775d6ecel,0x69d2e3bbe8c0e78dl,0xb0264ef1145cfc81l,
21406             0x0a41e9fa1b69788bl },
21407           { 0x0d9233be909a1f0bl,0x150a84520ae76b30l,0xea3375370632bb69l,
21408             0x15f7b3cfaa25584al },
21409           0 },
21410         /* 49 << 120 */
21411         { { 0xfc4c623e321f7b11l,0xd36c1066f9cbc693l,0x8165235835dc0c0al,
21412             0xa3ce2e18c824e97el },
21413           { 0x59ea7cbcc6ff405el,0xced5a94a1e56a1e2l,0x88d744c53ab64b39l,
21414             0x8963d029073a36e7l },
21415           0 },
21416         /* 51 << 120 */
21417         { { 0x97aa902cb19f3edbl,0x8e605ff9bbf2975bl,0x0536fa8ba6eb299bl,
21418             0xfd96da4f7cd03ac0l },
21419           { 0x29c5b5b578f9a265l,0x1f025a6d5fd0bc1bl,0x440486ee58e0f8e1l,
21420             0x8f191f7d593e49e9l },
21421           0 },
21422         /* 52 << 120 */
21423         { { 0xbddf656baea9c13fl,0x083c5d514c678b37l,0x975431b630878ed4l,
21424             0x6de13d4608d9cf1cl },
21425           { 0xfbb639cc02427c45l,0x6190ca0c5a6cd989l,0x35a6aa26c53f11b7l,
21426             0x73f9e17dddfd86f6l },
21427           0 },
21428         /* 53 << 120 */
21429         { { 0xd30478a317be7689l,0x6fc3f634e358f7a7l,0x4057ece515688d9fl,
21430             0xb5397495d3d91eefl },
21431           { 0x62fac49e2f49bde4l,0xeb4a3e1860125c73l,0x15f38be8dabdac55l,
21432             0x18bf29f7d334d52al },
21433           0 },
21434         /* 55 << 120 */
21435         { { 0xf684162b68777538l,0x3e2a770bbb3381f4l,0x1b7562c1b374577cl,
21436             0x9eec22dc5cf21688l },
21437           { 0xc35014b1d472be2cl,0xafe2317035f086fbl,0xb9c9c4c9a1491ce1l,
21438             0x2df1e669b56792ddl },
21439           0 },
21440         /* 57 << 120 */
21441         { { 0xcf7d36fe1830f624l,0x176c3c12ed0474bdl,0x25b802c8f82b493dl,
21442             0x683c2a744c78147el },
21443           { 0x0db99444f8f3e446l,0x437bcac6800a56c7l,0xb4e592264d08b25fl,
21444             0xcaf1b4142e691ca7l },
21445           0 },
21446         /* 59 << 120 */
21447         { { 0x378bd47b9d231cafl,0xde3aa2f01f4db832l,0xf609d16ab29bd7d5l,
21448             0x13feab54bdfb54dfl },
21449           { 0x274abbbc22fc1a12l,0x267febb47d30ef1bl,0xeffa996d80717cd8l,
21450             0x065a86d1118d0812l },
21451           0 },
21452         /* 60 << 120 */
21453         { { 0xc681a8656a3cb3afl,0x528f25a981751414l,0x6669f07cc7eac946l,
21454             0x9fb3a53f3cc6cc6bl },
21455           { 0x2919d92a11ae224al,0xa59141110b170a19l,0xdc16c611e2042f16l,
21456             0x58ace12decd4180bl },
21457           0 },
21458         /* 61 << 120 */
21459         { { 0x689bb1ec107bb59fl,0x8129702adad2b385l,0x10bd3baeb1630603l,
21460             0xaadec5d15f23e7cfl },
21461           { 0x572f234f4586f7fbl,0x13abdec95ec11b32l,0xa462a7ec6191c26al,
21462             0x4a7d92a06685c8d3l },
21463           0 },
21464         /* 63 << 120 */
21465         { { 0xdd4e2b63b16628eal,0xdf0c8fc8eefa5e86l,0xb0ec710205662720l,
21466             0x3f4c6956fe81e9dal },
21467           { 0x5732ad8f52e356f7l,0x045a103968a658f0l,0x9c40b0b6506ba33al,
21468             0x0a426010cb54258dl },
21469           0 },
21470         /* 64 << 120 */
21471         { { 0x09891641d4c5105fl,0x1ae80f8e6d7fbd65l,0x9d67225fbee6bdb0l,
21472             0x3b433b597fc4d860l },
21473           { 0x44e66db693e85638l,0xf7b59252e3e9862fl,0xdb785157665c32ecl,
21474             0x702fefd7ae362f50l },
21475           0 },
21476         /* 65 << 120 */
21477         { { 0x3902ab14c3254641l,0xa63cfd9fd8c001c8l,0x597d155c52d0af3cl,
21478             0xc5a2cbc4a0dbe688l },
21479           { 0xac8a841b249195aal,0xc98f01aaed14426fl,0xeb4a8ce8353905f1l,
21480             0x4d6668171ecee1b7l },
21481           0 },
21482         /* 71 << 120 */
21483         { { 0xbd66e7d9a94da8cdl,0x7bc04735801ef314l,0x90f3eba1c5cc2904l,
21484             0x3c7dfed6f71bb36dl },
21485           { 0x89a50c8da75e3086l,0x88b8b4746f8e3418l,0x26fe17f4a44a5dbdl,
21486             0x98bf74c16a1e24fel },
21487           0 },
21488         /* 77 << 120 */
21489         { { 0xca7b470679e0db85l,0x7f46c7716fc897fdl,0x9537e7918edfc0f3l,
21490             0xa46d4b4405e91ddfl },
21491           { 0x97d21061ee5575e7l,0x1f4f32da59650429l,0x2d1d6af878995129l,
21492             0x41d6fc228a0e4260l },
21493           0 },
21494         /* 83 << 120 */
21495         { { 0xb30a1a89107d2282l,0x5433d7673a5e1323l,0xb9eeab822abdfeafl,
21496             0x9579cb46df3e0dbfl },
21497           { 0x6fc3ff2c7e088e79l,0x94b32360d7314326l,0xd2e82b59e5ad82e4l,
21498             0x7372dc4a55bc24e3l },
21499           0 },
21500         /* 89 << 120 */
21501         { { 0x355697215f3c03cbl,0x4150adf2a146edcdl,0x16ec1a421a252e1cl,
21502             0xdf4d0f94424984eal },
21503           { 0x15142b5f5fabe961l,0xe6a73c29567ec13al,0xe6d370795d12070al,
21504             0x437743d0206fd7c6l },
21505           0 },
21506         /* 95 << 120 */
21507         { { 0x483b7a95d66bc594l,0xf6a7064e8a6113bbl,0x373ce20f4ed34f72l,
21508             0x6aa876ab24f429b2l },
21509           { 0x378d5c25412c3102l,0xe4219a97b493199cl,0x01c7cafaa0b37332l,
21510             0x9305cc85f7633f7dl },
21511           0 },
21512         /* 101 << 120 */
21513         { { 0x0259b43aaadf2273l,0x869c5bd3cf9dc1c2l,0x4f18a6e4068d6628l,
21514             0xd110637fec2d4547l },
21515           { 0x1ae88a791e94aaddl,0xe8b4be39de64f5f9l,0x85cbd9b24dc6b2bbl,
21516             0xb65091fa1bc352b2l },
21517           0 },
21518         /* 107 << 120 */
21519         { { 0x7c5cea5d20f6a354l,0xe936ff1582f3ed39l,0x54e7a775b779368el,
21520             0x8ca8a46e3cb17c9el },
21521           { 0x753ca1fa0138974dl,0x9ce311eba72902ffl,0xcb727e56973f72b6l,
21522             0xde72538d91685710l },
21523           0 },
21524         /* 113 << 120 */
21525         { { 0xf423569f1bec8f85l,0x23376da5ca844ac4l,0xce7b407a111523f4l,
21526             0x736fb92dde7aa46dl },
21527           { 0xd9139edcc7662640l,0x520fbf0656a85e24l,0x14e3b5857e5284b5l,
21528             0xcbae4e8321d56ef3l },
21529           0 },
21530         /* 116 << 120 */
21531         { { 0x69830a05564470a1l,0x1a1e26cf5b702e8el,0xe5fdf7d9d8fae645l,
21532             0xe4774f74a9950c66l },
21533           { 0x18bdda7cd1466825l,0xe6ab4ce6d115218al,0xfcb8c50064528629l,
21534             0xd705f429e70deed9l },
21535           0 },
21536         /* 119 << 120 */
21537         { { 0x3f992d7ba99df096l,0x08993b4125e78725l,0x79eaad13117c4cafl,
21538             0x7230594c9fa87285l },
21539           { 0xac23d7edf2673e27l,0xc9d76fb53b9eb111l,0x7a0a036a9e9db78al,
21540             0x7c6ec39df9565cffl },
21541           0 },
21542         /* 125 << 120 */
21543         { { 0x956ad1441fd4f7a1l,0x6c511ffecb7546cal,0x11becdaef5ae6ddbl,
21544             0x67587741946168b2l },
21545           { 0x99cd45edf54379a7l,0x687f8462e2748decl,0x2b2be1e1837bd066l,
21546             0x3862659c0c45a5a9l },
21547           0 },
21548     },
21549     {
21550         /* 0 << 128 */
21551         { { 0x00, 0x00, 0x00, 0x00 },
21552           { 0x00, 0x00, 0x00, 0x00 },
21553           1 },
21554         /* 1 << 128 */
21555         { { 0x62a8c244bfe20925l,0x91c19ac38fdce867l,0x5a96a5d5dd387063l,
21556             0x61d587d421d324f6l },
21557           { 0xe87673a2a37173eal,0x2384800853778b65l,0x10f8441e05bab43el,
21558             0xfa11fe124621efbel },
21559           0 },
21560         /* 3 << 128 */
21561         { { 0xc0f734a3b2335834l,0x9526205a90ef6860l,0xcb8be71704e2bb0dl,
21562             0x2418871e02f383fal },
21563           { 0xd71776814082c157l,0xcc914ad029c20073l,0xf186c1ebe587e728l,
21564             0x6fdb3c2261bcd5fdl },
21565           0 },
21566         /* 4 << 128 */
21567         { { 0xb4480f0441c23fa3l,0xb4712eb0c1989a2el,0x3ccbba0f93a29ca7l,
21568             0x6e205c14d619428cl },
21569           { 0x90db7957b3641686l,0x0432691d45ac8b4el,0x07a759acf64e0350l,
21570             0x0514d89c9c972517l },
21571           0 },
21572         /* 5 << 128 */
21573         { { 0xcc7c4c1c2cf9d7c1l,0x1320886aee95e5abl,0xbb7b9056beae170cl,
21574             0xc8a5b250dbc0d662l },
21575           { 0x4ed81432c11d2303l,0x7da669121f03769fl,0x3ac7a5fd84539828l,
21576             0x14dada943bccdd02l },
21577           0 },
21578         /* 7 << 128 */
21579         { { 0x51b90651cbae2f70l,0xefc4bc0593aaa8ebl,0x8ecd8689dd1df499l,
21580             0x1aee99a822f367a5l },
21581           { 0x95d485b9ae8274c5l,0x6c14d4457d30b39cl,0xbafea90bbcc1ef81l,
21582             0x7c5f317aa459a2edl },
21583           0 },
21584         /* 9 << 128 */
21585         { { 0x410dc6a90deeaf52l,0xb003fb024c641c15l,0x1384978c5bc504c4l,
21586             0x37640487864a6a77l },
21587           { 0x05991bc6222a77dal,0x62260a575e47eb11l,0xc7af6613f21b432cl,
21588             0x22f3acc9ab4953e9l },
21589           0 },
21590         /* 10 << 128 */
21591         { { 0x27c8919240be34e8l,0xc7162b3791907f35l,0x90188ec1a956702bl,
21592             0xca132f7ddf93769cl },
21593           { 0x3ece44f90e2025b4l,0x67aaec690c62f14cl,0xad74141822e3cc11l,
21594             0xcf9b75c37ff9a50el },
21595           0 },
21596         /* 11 << 128 */
21597         { { 0x0d0942770c24efc8l,0x0349fd04bef737a4l,0x6d1c9dd2514cdd28l,
21598             0x29c135ff30da9521l },
21599           { 0xea6e4508f78b0b6fl,0x176f5dd2678c143cl,0x081484184be21e65l,
21600             0x27f7525ce7df38c4l },
21601           0 },
21602         /* 13 << 128 */
21603         { { 0x9faaccf5e4652f1dl,0xbd6fdd2ad56157b2l,0xa4f4fb1f6261ec50l,
21604             0x244e55ad476bcd52l },
21605           { 0x881c9305047d320bl,0x1ca983d56181263fl,0x354e9a44278fb8eel,
21606             0xad2dbc0f396e4964l },
21607           0 },
21608         /* 15 << 128 */
21609         { { 0xfce0176788a2ffe4l,0xdc506a3528e169a5l,0x0ea108617af9c93al,
21610             0x1ed2436103fa0e08l },
21611           { 0x96eaaa92a3d694e7l,0xc0f43b4def50bc74l,0xce6aa58c64114db4l,
21612             0x8218e8ea7c000fd4l },
21613           0 },
21614         /* 16 << 128 */
21615         { { 0x6a7091c2e48fb889l,0x26882c137b8a9d06l,0xa24986631b82a0e2l,
21616             0x844ed7363518152dl },
21617           { 0x282f476fd86e27c7l,0xa04edaca04afefdcl,0x8b256ebc6119e34dl,
21618             0x56a413e90787d78bl },
21619           0 },
21620         /* 17 << 128 */
21621         { { 0xd1ffd160deb58b9bl,0x78492428c007273cl,0x47c908048ef06073l,
21622             0x746cd0dfe48c659el },
21623           { 0xbd7e8e109d47055bl,0xe070967e39711c04l,0x3d8869c99c9444f6l,
21624             0x6c67ccc834ac85fcl },
21625           0 },
21626         /* 19 << 128 */
21627         { { 0x8a42d8b087b05be1l,0xef00df8d3e4e1456l,0x148cc8e8fbfc8cd2l,
21628             0x0288ae4c4878804fl },
21629           { 0x44e669a73b4f6872l,0xa4a8dbd4aab53c5bl,0x843fa963c9660052l,
21630             0x128e2d2571c05dd2l },
21631           0 },
21632         /* 21 << 128 */
21633         { { 0x3ea86174a9f1b59bl,0xc747ea076a9a8845l,0x733710b5ab242123l,
21634             0x6381b546d386a60cl },
21635           { 0xba0e286366a44904l,0x770f618de9db556cl,0x39e567f828fb198dl,
21636             0xb5f1bef040147ee8l },
21637           0 },
21638         /* 23 << 128 */
21639         { { 0x1adee1d516391617l,0x962d9184a3315fd9l,0x91c229750c805d59l,
21640             0x4575eaf2cd9a1877l },
21641           { 0x83fef163451831b9l,0x829d6bdd6f09e30fl,0x9379272dcc6b4e6al,
21642             0xd7a049bd95fbee4al },
21643           0 },
21644         /* 25 << 128 */
21645         { { 0x695f70da44ae09c6l,0x79793892bb99de1dl,0xde269352f696b429l,
21646             0xe37ea97f8104c825l },
21647           { 0x3166cac6b0e72e63l,0xa82e633ca03ba670l,0x1106e3843e505667l,
21648             0xc2994f3dffb788b6l },
21649           0 },
21650         /* 27 << 128 */
21651         { { 0xd36a5ab37c53073bl,0xc44a9940ebdc7e35l,0x7dd86c8bf3ded136l,
21652             0x9fe9879fd5a0eb14l },
21653           { 0xa210726c9b99bf9cl,0x3faf4456861036afl,0x1661f1c9615d091al,
21654             0x2c63f630911551bcl },
21655           0 },
21656         /* 28 << 128 */
21657         { { 0x1554d46da670ff1dl,0x24833d88cb97a1ccl,0x8fa6ab3cded97493l,
21658             0x215e037189926498l },
21659           { 0x549bd592e56d74ffl,0x58a8caf543b5e1ecl,0x3c6087a323e93cb9l,
21660             0x8b0549875648b83cl },
21661           0 },
21662         /* 29 << 128 */
21663         { { 0x232974230554f94fl,0x4f445a380f3a7618l,0xb9fb40bee4abefd6l,
21664             0xfbf3eaf9c15eb07cl },
21665           { 0xed469c23aca0c8b3l,0xc5209f68846e3f8fl,0x33d51d13d75da468l,
21666             0x9406e10a3d5c6e29l },
21667           0 },
21668         /* 31 << 128 */
21669         { { 0xb9a44b1f5c6cad21l,0xaa9947751ee60a83l,0xc89af3858c390401l,
21670             0xef1e450b8dd51056l },
21671           { 0x5f5f069879ac84d1l,0x68d82982ef57b1afl,0x31f1d90f50849555l,
21672             0xff9577e57d9fc8f6l },
21673           0 },
21674         /* 33 << 128 */
21675         { { 0xaeebc5c0b430d6a1l,0x39b87a13dc3a9c04l,0xf0c445252db4a631l,
21676             0xe32d95482c66fcf6l },
21677           { 0x16f11bafb17849c4l,0xdd1c76615eca71f7l,0x4389ad2e32e6c944l,
21678             0x727c11a5889a06bbl },
21679           0 },
21680         /* 34 << 128 */
21681         { { 0x38dd1ac021e5781al,0x578318dbfd019ee2l,0x096b677d5f88e574l,
21682             0xdbec82b216ad9f4fl },
21683           { 0x348debe23260e8d9l,0x9334126064dfcda1l,0xdc5fb34cefc8faael,
21684             0x5fa048beb4a6fc25l },
21685           0 },
21686         /* 35 << 128 */
21687         { { 0xe18806fd60b3258cl,0xb7d2926b1364df47l,0xe208300fa107ce99l,
21688             0x8d2f29fe7918df0el },
21689           { 0x0b012d77a1244f4cl,0xf01076f4213a11cfl,0x8e623223181c559dl,
21690             0x9df196ee995a281dl },
21691           0 },
21692         /* 36 << 128 */
21693         { { 0xc431a238013ff83bl,0x7c0018b2fad69d08l,0x99aeb52a4c9589eal,
21694             0x121f41ab9b1cf19fl },
21695           { 0x0cfbbcbaef0f5958l,0x8deb3aeb7be8fbdcl,0x12b954081f15aa31l,
21696             0x5acc09b34c0c06fdl },
21697           0 },
21698         /* 37 << 128 */
21699         { { 0xfaa821383a721940l,0xdd70f54dd0008b83l,0x00decb507d32a52dl,
21700             0x04563529cdd87deal },
21701           { 0xb0e7e2a2db81643dl,0x445f4c383a6fef50l,0x5c0ef211df694ae1l,
21702             0xa5a8fead923d0f1cl },
21703           0 },
21704         /* 39 << 128 */
21705         { { 0xbc0e08b0325b2601l,0xae9e4c6105815b7al,0x07f664faf944a4a1l,
21706             0x0ad19d29288f83b3l },
21707           { 0x8615cd677232c458l,0x98edff6e9038e7d1l,0x082e0c4395a4dfccl,
21708             0x336267afeceee00el },
21709           0 },
21710         /* 40 << 128 */
21711         { { 0x775cbfa86d518ffbl,0xdecee1f6930f124bl,0x9a402804f5e81d0fl,
21712             0x0e8225c52a0eeb2fl },
21713           { 0x884a5d39fee9e867l,0x9540428ffb505454l,0xb2bf2e20107a70d1l,
21714             0xd9917c3ba010b2aal },
21715           0 },
21716         /* 41 << 128 */
21717         { { 0xc88ad4452a29bfdel,0x3072ebfa998368b7l,0xa754cbf7f5384692l,
21718             0x85f7e16906b13146l },
21719           { 0x42a7095f6a549fbel,0xef44edf91f7f1f42l,0xbea2989737b0c863l,
21720             0x13b096d87a1e7fc3l },
21721           0 },
21722         /* 43 << 128 */
21723         { { 0x51add77ce2a3a251l,0x840ca1384d8476adl,0x08d01d26f6096478l,
21724             0x10d501a532f1662bl },
21725           { 0xc8d63f811165a955l,0x587aa2e34095046al,0x759506c617af9000l,
21726             0xd6201fe4a32ab8d2l },
21727           0 },
21728         /* 44 << 128 */
21729         { { 0xa98f42fa3d843d53l,0x33777cc613ef927al,0xc440cdbecb84ca74l,
21730             0x8c22f9631dc7c5ddl },
21731           { 0x4bc82b70c8d94708l,0x7e0b43fcc814364fl,0x286d4e2486f59b7el,
21732             0x1abc895e4d6bf4c4l },
21733           0 },
21734         /* 45 << 128 */
21735         { { 0x7c52500cfc8c9bbdl,0x635563381534d9f7l,0xf55f38cbfd52c990l,
21736             0xc585ae85058f52e7l },
21737           { 0xb710a28bf9f19a01l,0x891861bdf0273ca4l,0x38a7aa2b034b0b7cl,
21738             0xa2ecead52a809fb1l },
21739           0 },
21740         /* 46 << 128 */
21741         { { 0x3df614f1ec3ca8eal,0x6bb24e9f9505bc08l,0x23ba1afbf37ace22l,
21742             0x2e51b03b3463c261l },
21743           { 0x59a0fca9c39e6558l,0x819f271ca342ccd9l,0x0c913d54df7ac033l,
21744             0xba0f83de573257d3l },
21745           0 },
21746         /* 47 << 128 */
21747         { { 0xdf62817ab3b32fbcl,0x616d74b0964670d4l,0xa37bc6270e26020bl,
21748             0xda46d655b7d40bdal },
21749           { 0x2840f155b5773f84l,0xbb633777897774b6l,0x59ff1df79a1ed3fal,
21750             0xf7011ee2bac571f9l },
21751           0 },
21752         /* 48 << 128 */
21753         { { 0x38151e274d559d96l,0x4f18c0d3b8db6c01l,0x49a3aa836f9921afl,
21754             0xdbeab27b8c046029l },
21755           { 0x242b9eaa7040bf3bl,0x39c479e51614b091l,0x338ede2b0e4baf5dl,
21756             0x5bb192b7f0a53945l },
21757           0 },
21758         /* 49 << 128 */
21759         { { 0xd612951861535bb0l,0xbf14364016f6a954l,0x3e0931eedde18024l,
21760             0x79d791c8139441c0l },
21761           { 0xba4fe7ecb67b8269l,0x7f30d848224b96c1l,0xa7e0a6abf0341068l,
21762             0x78db42c37198ea2dl },
21763           0 },
21764         /* 51 << 128 */
21765         { { 0x13354044185ce776l,0x109a6e059ff0100cl,0xafa3b61b03144cb1l,
21766             0x4e4c814585265586l },
21767           { 0xa8dafd33edb35364l,0x6691781bfd2606bel,0x2e06a9786182f5ccl,
21768             0x588784ebe77faeecl },
21769           0 },
21770         /* 52 << 128 */
21771         { { 0x896d572337e440d7l,0x685c5fd9ade23f68l,0xb5b1a26dc2c64918l,
21772             0xb9390e30dad6580cl },
21773           { 0x87911c4e7dee5b9bl,0xb90c5053deb04f6el,0x37b942a18f065aa6l,
21774             0x34acdf2a1ca0928dl },
21775           0 },
21776         /* 53 << 128 */
21777         { { 0xc773f525606f8f04l,0x75ae4a4b41b0a5bbl,0xb2aa058eaf7df93cl,
21778             0xf15bea4feafed676l },
21779           { 0xd2967b236a3c4fd7l,0xa698628090e30e7fl,0xf1b5166d316418bdl,
21780             0x5748682e1c13cb29l },
21781           0 },
21782         /* 55 << 128 */
21783         { { 0xe7b11babfff3605bl,0xdbce1b74cbac080fl,0xa0be39bd6535f082l,
21784             0x2b6501805f826684l },
21785           { 0xf90cea2400f5244fl,0xe279f2fadd244a1cl,0xd3fca77c9421c3ael,
21786             0xe66bc7ee81a5210al },
21787           0 },
21788         /* 57 << 128 */
21789         { { 0x114085dac40c6461l,0xaf78cb47f47d41b8l,0x7a9ae851755b0adbl,
21790             0x8d2e8c66a0600b6dl },
21791           { 0x5fb19045389758c0l,0xfa6e2cdabe7c91b2l,0x6472a432663983a2l,
21792             0xc9370829e0e19363l },
21793           0 },
21794         /* 59 << 128 */
21795         { { 0xd335856ec50bf2ffl,0x89b42295dfa708c2l,0x5dfb42241b201b4el,
21796             0x6c94d6b94eecbf9cl },
21797           { 0xabe5a47a7a634097l,0xf3d53b1643febecfl,0xff18619faca9846el,
21798             0x80ad8629a4066177l },
21799           0 },
21800         /* 60 << 128 */
21801         { { 0x7872e34b3390ff23l,0x968ce4abde7d18efl,0x9b4a745e627fe7b1l,
21802             0x9607b0a0caff3e2al },
21803           { 0x1b05818eeb40e3a5l,0x6ac62204c0fa8d7al,0xb5b9058571ed4809l,
21804             0xb2432ef0f7cb65f2l },
21805           0 },
21806         /* 61 << 128 */
21807         { { 0xc1203418f8a144b7l,0xb3413f808378f901l,0xf6badea161857095l,
21808             0xcd2816c2b2e93efel },
21809           { 0x6a8303ea174a0ee6l,0x98b62f29150b28b6l,0x68071bbc9c2a05b6l,
21810             0xcfcf41a39f00e36el },
21811           0 },
21812         /* 63 << 128 */
21813         { { 0xcaf564f234d6bc29l,0x9e9a6507f3c8edb0l,0x2fb889edd4e5502el,
21814             0xb70d4ceb6cc9d8edl },
21815           { 0x0de25356b020f740l,0xa68d9263d11fe5e6l,0xe86400679d85dd77l,
21816             0xa95dfa7dec2c8c8dl },
21817           0 },
21818         /* 64 << 128 */
21819         { { 0x715c9f973112795fl,0xe8244437984e6ee1l,0x55cb4858ecb66bcdl,
21820             0x7c136735abaffbeel },
21821           { 0x546615955dbec38el,0x51c0782c388ad153l,0x9ba4c53ac6e0952fl,
21822             0x27e6782a1b21dfa8l },
21823           0 },
21824         /* 65 << 128 */
21825         { { 0x3f9bc63ece59397dl,0x3f0f98a93eaa6104l,0x2f82c37c002d9271l,
21826             0x6ac0495d4985353cl },
21827           { 0xbde52f629191527bl,0xa3a13fce475aa640l,0x1d71ae17ce673f89l,
21828             0x2b5cc61529120ec1l },
21829           0 },
21830         /* 71 << 128 */
21831         { { 0xa0ab0f9924318c1cl,0x0cc5ca7da80ca60bl,0x24e27598abb965bal,
21832             0xc4863198b44d1351l },
21833           { 0x4d913783a28f04bel,0x404e78088cce8960l,0x2973b4e46286873el,
21834             0x7b6e0f3219f42b50l },
21835           0 },
21836         /* 77 << 128 */
21837         { { 0x0091a786306a6349l,0x4640ceab2098622dl,0x9928022be8182233l,
21838             0xf261bee4514d0bedl },
21839           { 0x70cdcc44c5f64fedl,0x4e19fec4f9eb2dfel,0xd05bdc09058b0b69l,
21840             0x16f3007ed3bc6190l },
21841           0 },
21842         /* 83 << 128 */
21843         { { 0x8f7f16957f136df1l,0x6d7547019b4f4215l,0xfb22d55eb4cc46a6l,
21844             0x0b53ef53a8563034l },
21845           { 0x8b105acc42bc9353l,0xe44c0a396079d59dl,0x78441fee35ee38ddl,
21846             0x87ad93e43dcc0119l },
21847           0 },
21848         /* 89 << 128 */
21849         { { 0x98a1c55358d9f73al,0xaa0843f0540e2b91l,0x701f8831d0647459l,
21850             0xc4ae9d0484673005l },
21851           { 0x9c37bc9f30b3ea20l,0x24cb4e2dbcbfb2b2l,0x8513e6f313cbf070l,
21852             0x0c4db4334e76c79el },
21853           0 },
21854         /* 95 << 128 */
21855         { { 0x882a2b9cbc8320b8l,0x16e9c11e3ad9e222l,0x24399ac19b23cb1dl,
21856             0x334c5496799a89c7l },
21857           { 0x72b6f9b8df3d774cl,0x42955bcbb11b6704l,0x3c4d6021ad2d4eafl,
21858             0x5416b309afe2b671l },
21859           0 },
21860         /* 101 << 128 */
21861         { { 0x1bbe9e662bf7c2a6l,0x22a3a10ca4acfddbl,0x2424eaab46bae581l,
21862             0xebec1bbf40d6bdadl },
21863           { 0xd7e3fa1a5b012aedl,0xc0f82c23f1dc6204l,0x42787c82e319477dl,
21864             0xca1ae7a14cf57573l },
21865           0 },
21866         /* 107 << 128 */
21867         { { 0x44b7d589d51bbde9l,0x15de755fd6a4cc98l,0x9b6ea8e582fb8e2el,
21868             0x9d9294f04332bc22l },
21869           { 0x53c6b2b7d1fa239al,0x286bf536693ca4f1l,0xc3fa754603c00f65l,
21870             0xc046713af49cdb48l },
21871           0 },
21872         /* 113 << 128 */
21873         { { 0xe356f5f11d82d5d6l,0xa0346a73d035ca0cl,0x14c76adee1884448l,
21874             0xd8369bdd1c23dde9l },
21875           { 0x13017862fe025eafl,0x6b5ac5e9a76be1d7l,0x52d621a94933bb6el,
21876             0xb045b53baa8c1d3fl },
21877           0 },
21878         /* 116 << 128 */
21879         { { 0x242da39e4e40466al,0xc03cb184ac322b07l,0x776b744f9aaa10bfl,
21880             0xb80d9f14fe7d4beal },
21881           { 0x75cd14308f9c4908l,0xa4e59ce9087b3d7al,0x3bbdce598cdca614l,
21882             0x58c57113bc1a5df1l },
21883           0 },
21884         /* 119 << 128 */
21885         { { 0x2a70af1abd79d467l,0x68dc4f23f63e2b73l,0x4345572f1f67b23dl,
21886             0xc012b08f3a340718l },
21887           { 0x9458585cc963dbe2l,0x21d84032223a495cl,0x0d54a4ea0dc28159l,
21888             0xd9549e2c9b927dafl },
21889           0 },
21890         /* 125 << 128 */
21891         { { 0xcd54ebd2d43c8cd2l,0x5ff4ded6a817b9f9l,0x6f59bc31245386d3l,
21892             0x65b67cb0a2077821l },
21893           { 0x36407956405ffa07l,0x723e0252d589f27al,0x052004b888e1239el,
21894             0x8e6d188d69fdf94dl },
21895           0 },
21896     },
21897     {
21898         /* 0 << 136 */
21899         { { 0x00, 0x00, 0x00, 0x00 },
21900           { 0x00, 0x00, 0x00, 0x00 },
21901           1 },
21902         /* 1 << 136 */
21903         { { 0xc16c236e846e364fl,0x7f33527cdea50ca0l,0xc48107750926b86dl,
21904             0x6c2a36090598e70cl },
21905           { 0xa6755e52f024e924l,0xe0fa07a49db4afcal,0x15c3ce7d66831790l,
21906             0x5b4ef350a6cbb0d6l },
21907           0 },
21908         /* 3 << 136 */
21909         { { 0xe2a37598a9d82abfl,0x5f188ccbe6c170f5l,0x816822005066b087l,
21910             0xda22c212c7155adal },
21911           { 0x151e5d3afbddb479l,0x4b606b846d715b99l,0x4a73b54bf997cb2el,
21912             0x9a1bfe433ecd8b66l },
21913           0 },
21914         /* 4 << 136 */
21915         { { 0xe13122f3dbfb894el,0xbe9b79f6ce274b18l,0x85a49de5ca58aadfl,
21916             0x2495775811487351l },
21917           { 0x111def61bb939099l,0x1d6a974a26d13694l,0x4474b4ced3fc253bl,
21918             0x3a1485e64c5db15el },
21919           0 },
21920         /* 5 << 136 */
21921         { { 0x5afddab61430c9abl,0x0bdd41d32238e997l,0xf0947430418042ael,
21922             0x71f9addacdddc4cbl },
21923           { 0x7090c016c52dd907l,0xd9bdf44d29e2047fl,0xe6f1fe801b1011a6l,
21924             0xb63accbcd9acdc78l },
21925           0 },
21926         /* 7 << 136 */
21927         { { 0x0ad7337ac0b7eff3l,0x8552225ec5e48b3cl,0xe6f78b0c73f13a5fl,
21928             0x5e70062e82349cbel },
21929           { 0x6b8d5048e7073969l,0x392d2a29c33cb3d2l,0xee4f727c4ecaa20fl,
21930             0xa068c99e2ccde707l },
21931           0 },
21932         /* 9 << 136 */
21933         { { 0x5b826fcb1b3ec67bl,0xece1b4b041356616l,0x7d5ce77e56a3ab4fl,
21934             0xf6087f13aa212da0l },
21935           { 0xe63015054db92129l,0xb8ae4c9940407d11l,0x2b6de222dfab8385l,
21936             0x9b323022b7d6c3b4l },
21937           0 },
21938         /* 10 << 136 */
21939         { { 0x057ef17a5ae6ad84l,0x9feae00b293a6ae0l,0xd18bb6c154266408l,
21940             0xd3d3e1209c8e8e48l },
21941           { 0xba8d4ca80e94fc8fl,0x80262ffc8a8ea0fel,0xac5b2855f71655fdl,
21942             0xa348f8fae9aced89l },
21943           0 },
21944         /* 11 << 136 */
21945         { { 0x60684b69a5660af3l,0x69aad23b9066d14bl,0x4d9f9b49fa4d020al,
21946             0xafb54ec1b5cd6a4al },
21947           { 0x2b25fe1832fd864dl,0xee6945062b6b64d0l,0x954a2a515001d8aal,
21948             0x5e1008557082b5b3l },
21949           0 },
21950         /* 13 << 136 */
21951         { { 0x20ecf71cbc90eb1bl,0x4234facf651c1df4l,0xc720fce9e681f678l,
21952             0x680becdda7c007f4l },
21953           { 0x7c08dc063181afeal,0x75c1b050a34eca91l,0x7d3479d54b9e2333l,
21954             0xed16640af3951aa3l },
21955           0 },
21956         /* 15 << 136 */
21957         { { 0x911b596264723e54l,0x34384f8c004b327cl,0x06ca5c61b85435f2l,
21958             0x12e0cd25e2c1075cl },
21959           { 0xa4b84cb8ac727394l,0x50bd720492b352c1l,0xe85524a49cbd0fb4l,
21960             0x10b9274be7876024l },
21961           0 },
21962         /* 16 << 136 */
21963         { { 0xef0a3fecfa181e69l,0x9ea02f8130d69a98l,0xb2e9cf8e66eab95dl,
21964             0x520f2beb24720021l },
21965           { 0x621c540a1df84361l,0x1203772171fa6d5dl,0x6e3c7b510ff5f6ffl,
21966             0x817a069babb2bef3l },
21967           0 },
21968         /* 17 << 136 */
21969         { { 0xb7cf93c3aace2c6al,0x017a96e658ff1bbfl,0x3b401301624a8250l,
21970             0xf5ef158529266518l },
21971           { 0x3c968bef7585838dl,0x8e97d023853191abl,0x175022e4f6823389l,
21972             0xb6a3bfc2f6a9b4c1l },
21973           0 },
21974         /* 19 << 136 */
21975         { { 0x515acf174591d77el,0xb393c89e3c3b25b6l,0x291e068e9c95abd7l,
21976             0x256b72c046c02544l },
21977           { 0x8172af03915ea92fl,0xc1b324ae4fcd0f03l,0x8abc779215108993l,
21978             0xe05fe6867ab815ael },
21979           0 },
21980         /* 21 << 136 */
21981         { { 0xca08d4095bc42740l,0xdd2c19d3e26e2e60l,0x27afdeded7c091fal,
21982             0x3b943b0faf25cb22l },
21983           { 0x400af8be026047e9l,0x3149b35f772b8ff9l,0x3ddb2c06f17229d9l,
21984             0xcd604aeadac152fcl },
21985           0 },
21986         /* 23 << 136 */
21987         { { 0xea2275311c0f6803l,0x9ae82d5ea394cc08l,0xc107a2cfbe32080cl,
21988             0x550f35a76429f6d7l },
21989           { 0x483c94dacfb70c0cl,0xf26f8e5d90190c94l,0x8574b3cf86bf2620l,
21990             0xe7258e45df9f482fl },
21991           0 },
21992         /* 25 << 136 */
21993         { { 0x8f8dc582da46f1cfl,0x61d76cf91e1e7427l,0x8aceb48b306c84aal,
21994             0xecaa142f28ebff98l },
21995           { 0xac5bd940401d80fel,0x0caacb8fe800cf9el,0x99068da9b3359af5l,
21996             0x92fdd5795225b8c0l },
21997           0 },
21998         /* 27 << 136 */
21999         { { 0x5a29d1c5ab56a3fbl,0x4e46ffc0a9aab4afl,0xa210472624d83080l,
22000             0xb5820998007f08b6l },
22001           { 0x9ce1188e4bc07b3el,0xbf6d0dbe32a19898l,0x5d5c68ea5b2350bal,
22002             0xd6c794eb3aa20b45l },
22003           0 },
22004         /* 28 << 136 */
22005         { { 0x3de605ba9ec598cfl,0x1933d3ae4d3029ael,0x6bf2fabd9b140516l,
22006             0x712dfc5559a7d01cl },
22007           { 0xff3eaae0d2576366l,0x36e407f948701cf8l,0xede21d89b41f4bd4l,
22008             0xc5292f5c666eefa9l },
22009           0 },
22010         /* 29 << 136 */
22011         { { 0x30045782c3ebcd77l,0xaa0cf3c73fdbe72el,0x719ec58ef8f43b39l,
22012             0x9716fb9972574d3al },
22013           { 0x300afc2b0d03ccd6l,0xb60016a34f3fac41l,0x8898910ea3a439f6l,
22014             0xdc00a99707ca11f5l },
22015           0 },
22016         /* 31 << 136 */
22017         { { 0x291b15ee8ed34662l,0xb780d54b2ee422a7l,0x5b9e3788fcfe4ccbl,
22018             0x4554cb8cbe8b7c3al },
22019           { 0xfdaccc2209a85a7fl,0x51f4a8ec555497edl,0x07dc69037da33505l,
22020             0xa3bc8bfcbc1fc1dbl },
22021           0 },
22022         /* 33 << 136 */
22023         { { 0x661638c151e25257l,0x0a6fd99c53304974l,0x29d8ae165078eec6l,
22024             0xed7512ad447b73del },
22025           { 0x0e21de607a4d0e9bl,0x842abd422462be01l,0x3be82afa5cddc709l,
22026             0x25bb9da99b52797dl },
22027           0 },
22028         /* 34 << 136 */
22029         { { 0x80613af28adc986al,0x4602284935776a41l,0x17d33e0f4665d03cl,
22030             0xeb12eb6c0df12b50l },
22031           { 0x0f0effa0ee41527fl,0x8ca2edb680531563l,0x4c354679f28c52c3l,
22032             0x67f1ba5c2f6df66dl },
22033           0 },
22034         /* 35 << 136 */
22035         { { 0x9c27207a2479fb3fl,0xef6e0f13515fb902l,0x3f7ad9e9d0d9436el,
22036             0x36eb4ea5893bbcf5l },
22037           { 0x5c53a2ac02b316b7l,0x10c75ee1f54f7585l,0x29e5879c3c7a4c1bl,
22038             0x77da3c82f29c67d6l },
22039           0 },
22040         /* 36 << 136 */
22041         { { 0xf2b75d21ef78a852l,0xba38cd34dd31a900l,0x72b3a68658ffe18al,
22042             0x7464190cbfd95745l },
22043           { 0x406e532177ed6e81l,0x1af0975bde535eabl,0x66ba22c760c54c82l,
22044             0x88e3b1ceb00a2fe0l },
22045           0 },
22046         /* 37 << 136 */
22047         { { 0xb6099b7df7e5c69bl,0x84aa1e26ba34ee2fl,0x5952600405c338bbl,
22048             0xe9a134374951a539l },
22049           { 0xb12276526ec196bdl,0x26a7be264b6dce36l,0x052e10a4e2a68458l,
22050             0x475fc74c1f38898bl },
22051           0 },
22052         /* 39 << 136 */
22053         { { 0x120167fc0a3eb4e1l,0xaa94bc70c0c21204l,0x313cd835e1243b75l,
22054             0x3bb63fb20bfd6a4al },
22055           { 0xa615dcae21ef05cfl,0x63774c2ec23c3ee5l,0x39365b1fed0dfd65l,
22056             0xb610e6ff5d2a2d7dl },
22057           0 },
22058         /* 40 << 136 */
22059         { { 0x55b7f977f0337b15l,0x3bc872a30e94973al,0x624ad983770deea0l,
22060             0xcaab336413a5efdbl },
22061           { 0x391dd0027a0d4247l,0x39590d5df312aed5l,0x532802c9351365acl,
22062             0xdd2e824578a2e22al },
22063           0 },
22064         /* 41 << 136 */
22065         { { 0x81b0d7be7f774fb8l,0x62f32bb3aa412425l,0xbe7afe26bbcd2162l,
22066             0xa6ce167c53c7fa7dl },
22067           { 0x8deca64fc5c4fc5bl,0x70e546aba6efd2fel,0xf2d8495987ff672al,
22068             0x2ca551f249c3059el },
22069           0 },
22070         /* 43 << 136 */
22071         { { 0x40b62d528eb99155l,0xe6b048947420a7e0l,0x9ebecb2bc685e58al,
22072             0x3ea642d8d3c8d2cbl },
22073           { 0x5340ac6ed489d0dfl,0xf3846d08c2b7588el,0x4cecd8a0611c289bl,
22074             0xdddc39c50dd71421l },
22075           0 },
22076         /* 44 << 136 */
22077         { { 0x98c6a6a52ebee687l,0xcdf65bfa56c1c731l,0x48e8132772def210l,
22078             0x4ea119418083b5a5l },
22079           { 0x3fdcea4fffebb525l,0x55aaea19fb50bf72l,0x5fbedc0a2a85b40cl,
22080             0x0d6fd954bf44f29fl },
22081           0 },
22082         /* 45 << 136 */
22083         { { 0x83a8302a9db4071el,0x52f104436f8ae934l,0x96de829d175b800al,
22084             0x20ff5035373e97cel },
22085           { 0xf58660185f65356al,0x992c15054c8cd782l,0x0b962c8eb57d727fl,
22086             0xe8a9abc92bba8bc7l },
22087           0 },
22088         /* 46 << 136 */
22089         { { 0x81a85ddd7cf2b565l,0x5e51e6afc34a0305l,0xa8d94ccefbc89faal,
22090             0x2bfd97c1e68cd288l },
22091           { 0x16d79c21af2958b8l,0x5e5d989defda7df8l,0x6d2f0ca6ff734c8al,
22092             0xfa5b8dd32cc9bafel },
22093           0 },
22094         /* 47 << 136 */
22095         { { 0x5787a9934e6ed688l,0x6815f3b5aab42f46l,0x7960f45b093c6c66l,
22096             0xb2b9829728be10cfl },
22097           { 0x1d4c7790296568cdl,0xa279a877f048e194l,0xcf7c20f4c6a58b4el,
22098             0xf0c717afa1f9c00fl },
22099           0 },
22100         /* 48 << 136 */
22101         { { 0x8a10b53189e800cal,0x50fe0c17145208fdl,0x9e43c0d3b714ba37l,
22102             0x427d200e34189accl },
22103           { 0x05dee24fe616e2c0l,0x9c25f4c8ee1854c1l,0x4d3222a58f342a73l,
22104             0x0807804fa027c952l },
22105           0 },
22106         /* 49 << 136 */
22107         { { 0x79730084ba196afcl,0x17d38e98054bd539l,0xc5cfff3918583239l,
22108             0x4b0db5a2d9adbee6l },
22109           { 0x9bc9f1e3c2a304e8l,0xbaa61de7de406fa8l,0x8e921ca9e4bec498l,
22110             0xd9f4e5ae6604ab02l },
22111           0 },
22112         /* 51 << 136 */
22113         { { 0xdf6b97b5b37f2097l,0x7576c3f9b4a5d2b9l,0x6eb697ed3588cabbl,
22114             0x4d75b38622598d8fl },
22115           { 0x4e6d93b522ff55e8l,0x4620ec635b8f7edal,0xd5006209f97b7749l,
22116             0x9e22e3a84da8b464l },
22117           0 },
22118         /* 52 << 136 */
22119         { { 0xbabfb7f82e8f326fl,0xed9cac225625a519l,0xf1109c1a0edae0a9l,
22120             0x45f80a9858521259l },
22121           { 0x37a44b075ab71f44l,0x21699eb64a21161bl,0xb523fddf56fe67eel,
22122             0x9f5c3a2120b9f72el },
22123           0 },
22124         /* 53 << 136 */
22125         { { 0x12c1131508b75673l,0xfa20121823b096d6l,0x839f01aeeacd6537l,
22126             0x0e592be787df32cal },
22127           { 0xfe3f65ff8b7dd0fcl,0xed09b4875c1d9a80l,0x8c09dd97b79786d8l,
22128             0x74eba2806c5bc983l },
22129           0 },
22130         /* 55 << 136 */
22131         { { 0xf917704862987b50l,0xcc84cdc6bc4ac456l,0x8bd2c922ae08fe12l,
22132             0x09d5f661fc2d06c7l },
22133           { 0xd10ac6dd9457d47fl,0x65aa30a23668060cl,0x33cddac6745161fcl,
22134             0xf4c18b5ea51e540fl },
22135           0 },
22136         /* 57 << 136 */
22137         { { 0x591c064ede723c1fl,0x92e5d4e601a4adael,0x3d7ee8a3145716ecl,
22138             0x0ef4c62061727816l },
22139           { 0x0e17c576f1bf6d6el,0x173104015ae18045l,0xdad620aae9589b75l,
22140             0xb10c7e2d0eda4905l },
22141           0 },
22142         /* 59 << 136 */
22143         { { 0xb8020f16aa08df6fl,0x03cf58ffd67054e9l,0x302e003c11fe3d1al,
22144             0x9c194bc1c638a3ecl },
22145           { 0x8ed3cb3adefd3f1el,0xc4115e079bf39de4l,0x8dece48bdf46fdf6l,
22146             0xebd1dbcf30eafeafl },
22147           0 },
22148         /* 60 << 136 */
22149         { { 0x058eb276fba319c5l,0xd33a91127f7fa54al,0xf060c1b4932a2dabl,
22150             0xce3a224e79c7d9bfl },
22151           { 0x6fb0388c0ba92823l,0x8d31738a69787881l,0x2d86eb0203cd00b7l,
22152             0x4e6e44512b69911bl },
22153           0 },
22154         /* 61 << 136 */
22155         { { 0xff2efe1cfdcca1cfl,0x08f22c69b5bb71e3l,0xc63f4a9f7023076el,
22156             0x88fb2aa0ce0c490el },
22157           { 0xcc7c97f91f77783cl,0x360026d942ab36b7l,0x547c34ecefd68f70l,
22158             0xebe7f99efbabfdabl },
22159           0 },
22160         /* 63 << 136 */
22161         { { 0xe7c1c1788613e87al,0xb035d65e60b82654l,0x055a82d03583a254l,
22162             0x27ce1ffc9b3b22fal },
22163           { 0x0cf904917ec83cd5l,0xfc6c21805604aa40l,0x1330604099357428l,
22164             0x9b0982f9ad4818b7l },
22165           0 },
22166         /* 64 << 136 */
22167         { { 0xc222653a4f0d56f3l,0x961e4047ca28b805l,0x2c03f8b04a73434bl,
22168             0x4c966787ab712a19l },
22169           { 0xcc196c42864fee42l,0xc1be93da5b0ece5cl,0xa87d9f22c131c159l,
22170             0x2bb6d593dce45655l },
22171           0 },
22172         /* 65 << 136 */
22173         { { 0x3a6080d9fb56bc3al,0xf1552dcad6212d7el,0x977ac5b59420f4f6l,
22174             0xef914d370e3cd97fl },
22175           { 0x807bd6e69c04f768l,0x743a7b552bb803f6l,0x7f5c20804215f4b0l,
22176             0x41e331288fc6ce42l },
22177           0 },
22178         /* 71 << 136 */
22179         { { 0x5a31c9ac61e6a460l,0x55102e4093e7eeddl,0x969fe0612da6adcel,
22180             0xe8cddc2f3ffea1d9l },
22181           { 0xaa26c6b1f0f327c5l,0x9e5b63743544f5e1l,0x5159fa1ddbaa685bl,
22182             0x9892d03aa7f44b99l },
22183           0 },
22184         /* 77 << 136 */
22185         { { 0x4dfcbf12e2c6fc1fl,0x703f2f5b7535ac29l,0x78f8617e82f7dc0fl,
22186             0x54b835ff853e792dl },
22187           { 0x3cc7f000df9f7353l,0x0d7ffd68db5a157al,0x2c1c33691672b21cl,
22188             0x694b4904ac970ef8l },
22189           0 },
22190         /* 83 << 136 */
22191         { { 0xd655bc42c1d2c45cl,0x572f603cbd22b05fl,0xa7fbf09388e4531al,
22192             0x8d38bbd91fdde98dl },
22193           { 0x16cc2aaa73b0fa01l,0x515019a25e8ffb04l,0xb075990611e792ccl,
22194             0x89df06f399112c90l },
22195           0 },
22196         /* 89 << 136 */
22197         { { 0x26d435c2481b46dal,0x73ab7e96266e9b3al,0x22d5b1db3c613c40l,
22198             0x9de4021c6727e399l },
22199           { 0x451ebba56051f8c9l,0xa37f6ec52c281a58l,0x3d7a28fe0e9f4cc5l,
22200             0x0f45bcd655b64df7l },
22201           0 },
22202         /* 95 << 136 */
22203         { { 0xba2a718c66616fbel,0x4b27810b3369a9acl,0x50b8391a2b426d5fl,
22204             0x420c88efa626fa05l },
22205           { 0xe39cef97b9c39a30l,0xcae7cde85e67e5d0l,0x3821f8319a58e521l,
22206             0xbf474d1941479509l },
22207           0 },
22208         /* 101 << 136 */
22209         { { 0x401bbab58fb15118l,0xb0376892dbf38b39l,0x10e4b9dd3a3ca42al,
22210             0xa69c2693f8063ffel },
22211           { 0xe10facdde07cb761l,0x96f4dde831d7759al,0xd702fdecc2cc7f9fl,
22212             0x9e87e46e1ac0162cl },
22213           0 },
22214         /* 107 << 136 */
22215         { { 0xb6cd60518479ca8fl,0xcca345e60968f6c7l,0x7b57248a64a9afe7l,
22216             0x5552e3511d0d4db9l },
22217           { 0x8f749b199dc68aabl,0x0fb86f06db1f7819l,0x23b300963143ac09l,
22218             0x61c166d8abfbcb9bl },
22219           0 },
22220         /* 113 << 136 */
22221         { { 0x4c96e85a43101165l,0x393a882fcf39bd19l,0xef9e1d42c2df6f33l,
22222             0xe1775c990278f088l },
22223           { 0xb1581929a9250d4al,0x582b0608c4168873l,0x0b3ffba3a1e68cd8l,
22224             0x3f78147ef9490897l },
22225           0 },
22226         /* 116 << 136 */
22227         { { 0x277b5177eb18ff20l,0x48002e9828f06d62l,0xece8d6c30e506d8dl,
22228             0x5cde0a58cd9ff963l },
22229           { 0x3b97cdb74e3baa0el,0x50560c0b631238f9l,0xe1c31b35cf79793dl,
22230             0x95d12f14355e2178l },
22231           0 },
22232         /* 119 << 136 */
22233         { { 0x0143f695bcc31b77l,0x3627aed14c49b65al,0x6e4f7a9ce441c183l,
22234             0xb708c79de1bfa0a3l },
22235           { 0xdbf0fc313a0726b8l,0xe04d82a8852d78bbl,0xb859001e3be5d398l,
22236             0x92dcc20c8e89bd11l },
22237           0 },
22238         /* 125 << 136 */
22239         { { 0x5f2416a3df9026b4l,0xffc01f3afcb29a1bl,0x18d02c9f1d94b20fl,
22240             0xd93b0f2f81cfdef3l },
22241           { 0xe6b0fd4713adf5f2l,0xcc9067b7ba06dff3l,0xb48c0cbb2256f842l,
22242             0xc2ae741dfd34df2fl },
22243           0 },
22244     },
22245     {
22246         /* 0 << 144 */
22247         { { 0x00, 0x00, 0x00, 0x00 },
22248           { 0x00, 0x00, 0x00, 0x00 },
22249           1 },
22250         /* 1 << 144 */
22251         { { 0x80531fe1c63c4962l,0x50541e89981fdb25l,0xdc1291a1fd4c2b6bl,
22252             0xc0693a17a6df4fcal },
22253           { 0xb2c4604e0117f203l,0x245f19630a99b8d0l,0xaedc20aac6212c44l,
22254             0xb1ed4e56520f52a8l },
22255           0 },
22256         /* 3 << 144 */
22257         { { 0x18f37a9c6bdf22dal,0xefbc432f90dc82dfl,0xc52cef8e5d703651l,
22258             0x82887ba0d99881a5l },
22259           { 0x7cec9ddab920ec1dl,0xd0d7e8c3ec3e8d3bl,0x445bc3954ca88747l,
22260             0xedeaa2e09fd53535l },
22261           0 },
22262         /* 4 << 144 */
22263         { { 0xa12b384ece53c2d0l,0x779d897d5e4606dal,0xa53e47b073ec12b0l,
22264             0x462dbbba5756f1adl },
22265           { 0x69fe09f2cafe37b6l,0x273d1ebfecce2e17l,0x8ac1d5383cf607fdl,
22266             0x8035f7ff12e10c25l },
22267           0 },
22268         /* 5 << 144 */
22269         { { 0xb7d4cc0f296c9005l,0x4b9094fa7b0aebdbl,0xe1bf10f1c00ec8d4l,
22270             0xd807b1c4d667c101l },
22271           { 0xa9412cdfbe713383l,0x435e063e81142ba1l,0x984c15ecaf0a6bdcl,
22272             0x592c246092a3dab9l },
22273           0 },
22274         /* 7 << 144 */
22275         { { 0x9365690016e23e9dl,0xcb220c6ba7cc41e1l,0xb36b20c369d6245cl,
22276             0x2d63c348b62e9a6al },
22277           { 0xa3473e19cdc0bcb5l,0x70f18b3f8f601b98l,0x8ad7a2c7cde346e4l,
22278             0xae9f6ec3bd3aaa64l },
22279           0 },
22280         /* 9 << 144 */
22281         { { 0x030223503274c7e1l,0x61ee8c934c4b6c26l,0x3c4397e3199389cel,
22282             0xe0082600488757cel },
22283           { 0xaac3a2df06b4dafbl,0x45af0700ddff5b6al,0x0a5974248c1d9fa0l,
22284             0x1640087d391fc68bl },
22285           0 },
22286         /* 10 << 144 */
22287         { { 0x26a43e41d07fa53dl,0x3154a78a74e35bc5l,0x7b768924e0da2f8cl,
22288             0xba964a2b23613f9al },
22289           { 0x5a548d35ba1d16c4l,0x2e1bfed1fb54d057l,0xff992136bc640205l,
22290             0xf39cb9148156df29l },
22291           0 },
22292         /* 11 << 144 */
22293         { { 0xf4873fcf4e5548bdl,0x8725da3f03ce57f0l,0xd82f5c95ca953258l,
22294             0xac647f127cf0747el },
22295           { 0xff2038b02d570bd5l,0xb0c2a767a13ae03fl,0xebaa27cde9932d16l,
22296             0xa686e3fc1234e901l },
22297           0 },
22298         /* 13 << 144 */
22299         { { 0x9f80435e63261eccl,0x6302a62e4337d6c9l,0x91916a49ca4958a0l,
22300             0x554958993149d5d3l },
22301           { 0x378d020b9f91de3cl,0x47b839a34dd25170l,0x2825854138b7f258l,
22302             0xea5b14f7437e7decl },
22303           0 },
22304         /* 15 << 144 */
22305         { { 0x74f08736b0018f44l,0xf4a03417b446d0f5l,0x66a4aa2fa40ca6b2l,
22306             0x215679f0badb60edl },
22307           { 0x3871195a323e4eefl,0x8f0940c320952b16l,0xfe8dac62879d5f7dl,
22308             0x649cb623c1a6e875l },
22309           0 },
22310         /* 16 << 144 */
22311         { { 0xecaff541338d6e43l,0x56f7dd734541d5ccl,0xb5d426de96bc88cal,
22312             0x48d94f6b9ed3a2c3l },
22313           { 0x6354a3bb2ef8279cl,0xd575465b0b1867f2l,0xef99b0ff95225151l,
22314             0xf3e19d88f94500d8l },
22315           0 },
22316         /* 17 << 144 */
22317         { { 0xa26a9087133ec108l,0x5dc5699f2712bdc0l,0x96903f4dd14224a9l,
22318             0x3da5992429e47b80l },
22319           { 0xb717712ff9dbba5al,0x9e52004b756391c9l,0xe669a11dcc9d219cl,
22320             0x3b6e6b84d1d6c07dl },
22321           0 },
22322         /* 19 << 144 */
22323         { { 0x5feec06a676feadbl,0xfc449bc59d69f322l,0x1d8d7b5e7cda8895l,
22324             0x5ed54dc11a3314a7l },
22325           { 0x1a11d2ae6de889c0l,0xb2a979724ced2bd9l,0x6ecf6989306a5ef6l,
22326             0x1611d57b8cc8a249l },
22327           0 },
22328         /* 21 << 144 */
22329         { { 0x2d9942ba007cbf87l,0x4e62bce6df3fc926l,0xe7eee5b0e4560affl,
22330             0xe51963bb7cb009b7l },
22331           { 0xaa5118cee29b37ddl,0x5cd84a4747263903l,0x3050caa6620055d8l,
22332             0x7ef576a76c4b1e3dl },
22333           0 },
22334         /* 23 << 144 */
22335         { { 0x9026a4dde6008ff1l,0x49e995ad1c8cd96cl,0x80722e73503e589bl,
22336             0x05bcbce184c2bc26l },
22337           { 0x255f9abbd4682c2cl,0xc42bcfc2f084d456l,0xa0eae9b0641c0767l,
22338             0x1b45632d864c9a2dl },
22339           0 },
22340         /* 25 << 144 */
22341         { { 0xcf25793b6ae024e0l,0x1b6607b484b5c4b0l,0x9579fa903f1624c8l,
22342             0x37fb65be68bd57e8l },
22343           { 0xd693a55efc39c203l,0x4e267ac4c87252e9l,0xb8d78bb09f899413l,
22344             0xe4c014070b3b8508l },
22345           0 },
22346         /* 27 << 144 */
22347         { { 0x662906e5bc3f3553l,0xde38d53531459684l,0x8f46a8c634f7280dl,
22348             0xaaf91b873d24198el },
22349           { 0xecd5ee115f9b117el,0xce00ffbe50ae8ddal,0x263a3d4e7710a9ael,
22350             0x0ff3f721f26ba74fl },
22351           0 },
22352         /* 28 << 144 */
22353         { { 0x4a8a4f47f0cefa69l,0xdc8e4cbaa4546866l,0x359ba69b23f603c1l,
22354             0xdab4d601187b7ac5l },
22355           { 0xa6ca4337c1ebc8d9l,0x9fa6585452b4074bl,0x1a4b4f81902fb733l,
22356             0xd2bb5d7aa525deaal },
22357           0 },
22358         /* 29 << 144 */
22359         { { 0xcc287ac2e6b3577al,0xd7528ca7f612003bl,0x8afdb6f12c1400b8l,
22360             0x103a2ed346a2dd8dl },
22361           { 0xc8f8c54d2ee21339l,0x8f011b92355a2d20l,0x81c6fc9f1346f2acl,
22362             0xdb6042f005a6d24bl },
22363           0 },
22364         /* 31 << 144 */
22365         { { 0xfc90e3630da4f996l,0x8ceca49daa6d6fe4l,0x1084affdbdfc619bl,
22366             0x2029f672c1140b04l },
22367           { 0x606ec25f136f3e5el,0x6d24149b02224c4al,0xabb0f142cfdfcf4cl,
22368             0xe40d0419fab1a0edl },
22369           0 },
22370         /* 33 << 144 */
22371         { { 0xcfdd08265cbccb84l,0x2258a16e88ad93c4l,0xb3ac365e728c5ad3l,
22372             0x0bbf97808560df1fl },
22373           { 0x42d08a39bad8c7b8l,0x1e3960106d3e8b91l,0xc332b39910274f58l,
22374             0xe0a84dacce2ea778l },
22375           0 },
22376         /* 34 << 144 */
22377         { { 0x113e1189ff432945l,0x4a0d2c3d04e1106cl,0xcde487744f3597b1l,
22378             0x853b029174fa26eal },
22379           { 0x2149e0ff02662e26l,0xb3181eaa5e6a030fl,0x086fc2159b006340l,
22380             0xa1df84a694a4e0bbl },
22381           0 },
22382         /* 35 << 144 */
22383         { { 0xc2cbd80ac99f8d3dl,0xe24b9d8f50ecf4f4l,0xf18d34728ecb126al,
22384             0x83966662e1670aael },
22385           { 0x1cece80fda5f594el,0x545e94ae65f391e0l,0xf3286dff93f98bb7l,
22386             0xf945e6cdf5abf176l },
22387           0 },
22388         /* 36 << 144 */
22389         { { 0x00ba5995dd95ac33l,0xa4957a40738f3bf4l,0x073539f599438a85l,
22390             0xcc9c43acc2eb1411l },
22391           { 0xe27501b5be2ec3d2l,0xa88d4ed057a85458l,0x870ae236755c8777l,
22392             0x0933c5af89216cbal },
22393           0 },
22394         /* 37 << 144 */
22395         { { 0xb5feea219e40e37fl,0x8c5ccb159e20fd60l,0xaeddc502ce8209a1l,
22396             0xbdf873cc11e793b3l },
22397           { 0xbc938103f0de8db5l,0x619fb72fb0e9d3d5l,0x800147cb588ed2adl,
22398             0x260f92bb7901ced8l },
22399           0 },
22400         /* 39 << 144 */
22401         { { 0x72dd9b089848c699l,0xc6086381185dacc1l,0x9489f11ff7d5a4c8l,
22402             0xedb41d5628dee90fl },
22403           { 0x1091db6b09af693cl,0xc7587551ae4b6413l,0x806aefb0768227adl,
22404             0x4214b83eafb3c88el },
22405           0 },
22406         /* 40 << 144 */
22407         { { 0xddfb02c4c753c45fl,0x18ca81b6f9c840fel,0x846fd09ab0f8a3e6l,
22408             0xb1162adde7733dbcl },
22409           { 0x7070ad20236e3ab6l,0xf88cdaf5b2a56326l,0x05fc8719997cbc7al,
22410             0x442cd4524b665272l },
22411           0 },
22412         /* 41 << 144 */
22413         { { 0x748819f9aa9c0ef5l,0xd7227d8ba458ad48l,0x8d67399f27aef626l,
22414             0xc6241a1859bf0a4cl },
22415           { 0xed9b0bfcc31cb9bbl,0x591254f896142555l,0x80e4bab461134151l,
22416             0x7c5e680243efbd83l },
22417           0 },
22418         /* 43 << 144 */
22419         { { 0x7f3f5a1706b9b7ddl,0x392132e75faeb417l,0x508ac4788fae38a2l,
22420             0x2b854ead0d3499c3l },
22421           { 0x26a687d8ef18bf0fl,0x62ff0c4a8ae00b61l,0x84111011f48578f2l,
22422             0xa879f383cd0fcd3al },
22423           0 },
22424         /* 44 << 144 */
22425         { { 0xeb7615aa202992f0l,0xde0562b38361d0b3l,0x789a302862027ee0l,
22426             0xe3e3e9921048f899l },
22427           { 0x07945c246deadab4l,0xeb06a15ec77d894el,0xb825af36bab1416bl,
22428             0x99083c4df4b4e04fl },
22429           0 },
22430         /* 45 << 144 */
22431         { { 0x4684a8f27b3ad6c3l,0x58238dbd928d9b6bl,0x31865b998da2c495l,
22432             0xc1ca784fb8e7cda1l },
22433           { 0xc9605dc71e081572l,0x8f560bcdef8ed104l,0x51f73981bd3feaedl,
22434             0xc778aa4e4251c88dl },
22435           0 },
22436         /* 46 << 144 */
22437         { { 0x9c0daa63aa502800l,0x73c7959a1e15b9bdl,0xd0447bcb7ab10f6cl,
22438             0x05b8fbc8b8311bdel },
22439           { 0xa8a74be1915d5c4el,0x38d41c1e0b7c0351l,0x5bb2d49ff52d6568l,
22440             0x6c48d8eed5e43593l },
22441           0 },
22442         /* 47 << 144 */
22443         { { 0x387b26d554159498l,0x92e92fad1ec34eb4l,0x0f88705e7a51b635l,
22444             0x66bcbf4dedca735fl },
22445           { 0x0a4c6112dcb896ccl,0x148e1dfe6fc72ad9l,0x3de977fd2b4c9585l,
22446             0x0cd6e65f741e62cal },
22447           0 },
22448         /* 48 << 144 */
22449         { { 0x7807f364b71698f5l,0x6ba418d29f7b605el,0xfd20b00fa03b2cbbl,
22450             0x883eca37da54386fl },
22451           { 0xff0be43ff3437f24l,0xe910b432a48bb33cl,0x4963a128329df765l,
22452             0xac1dd556be2fe6f7l },
22453           0 },
22454         /* 49 << 144 */
22455         { { 0x98ae40d53ce533bal,0x10342e1931fdd9c2l,0x54a255c8abf8b2bfl,
22456             0x8facc41b15f6fef7l },
22457           { 0x2e195565bc65b38bl,0xb9f3abaaeaea63cbl,0xede2ab9bf2b7518bl,
22458             0x5e84102ce9ea3d81l },
22459           0 },
22460         /* 51 << 144 */
22461         { { 0x162abc35113bc262l,0x8012f06829eb3fd4l,0x0e2727eb2c1ccf9cl,
22462             0x89561ff44b455b20l },
22463           { 0xc48db835ee3b1fd4l,0x4075ca86095bbfa7l,0x0c498d7d98745182l,
22464             0x828fb93c5dfb5205l },
22465           0 },
22466         /* 52 << 144 */
22467         { { 0xf95c7a5f0a76333bl,0x07603929cd607927l,0xabde328591028d3el,
22468             0x55765e8fa032a400l },
22469           { 0x3041f2cabed17cd7l,0x018a5b7b9a9e5923l,0xca4867975bb9bae3l,
22470             0x741c802ecc382cb5l },
22471           0 },
22472         /* 53 << 144 */
22473         { { 0x182a10311e5a3d8el,0xc352b8c8986c4d10l,0x7c50a172434c02ebl,
22474             0x121d728c4420c41cl },
22475           { 0x0f8eca2a8a51812fl,0xdb6c4a4ea5158430l,0x67944e0b8d8f4144l,
22476             0x387cc2052405c77al },
22477           0 },
22478         /* 55 << 144 */
22479         { { 0x98b36eb47e95ad76l,0x1973fa7d5f7e5ff7l,0xc4827abc6cc8a25cl,
22480             0x4263a0d3ec822ae4l },
22481           { 0x49f113f35217a6f4l,0xf27cc9bb81748aa6l,0x9cb81d97d822e08el,
22482             0x698d2826b5c360bcl },
22483           0 },
22484         /* 57 << 144 */
22485         { { 0x895f81514eb6d0b8l,0x32ef71df9f786536l,0x032a449430379a79l,
22486             0xa8c1076218bdb83fl },
22487           { 0x7a3b0b8fe53a4064l,0x0e724a54e2ce89b7l,0x565baeba7a31f6bcl,
22488             0x12b9fa6387d18a7bl },
22489           0 },
22490         /* 59 << 144 */
22491         { { 0x027231a3585bcfbdl,0x8690e977dca24269l,0x229c021afc6f1422l,
22492             0xd98050d044084cabl },
22493           { 0x6add95d79d4fd09al,0x12484c68c15b24ddl,0xa79a8f4facf4f551l,
22494             0xf53204e27a83cbecl },
22495           0 },
22496         /* 60 << 144 */
22497         { { 0xbc006413a906f7aal,0x9c8cd648bbeaf464l,0xaf5c7c64fb78cdf2l,
22498             0xe45839eafabc2375l },
22499           { 0x1eb89bd150012172l,0x9d0d76194488518cl,0xd55a7238bd534d32l,
22500             0x48f35d5e95b4fe55l },
22501           0 },
22502         /* 61 << 144 */
22503         { { 0xa6c5574f3e70a35al,0x35c11b5a8df97d97l,0x8f629f6cda85dd27l,
22504             0x94dab294c218452el },
22505           { 0xa2e1882e8916c731l,0xc02ce77c8929e350l,0xa7ed351fe4eff8afl,
22506             0xeb76ef0654c3e1c1l },
22507           0 },
22508         /* 63 << 144 */
22509         { { 0xc31d7cf87e3f5be5l,0x1472af0d3ce7f3a0l,0x226414f8f962e1afl,
22510             0xd318e3df16f54295l },
22511           { 0x9a3f6aaf41477cd3l,0x7034172f66ec6b2el,0xbea54eb537413a62l,
22512             0x79f81262dc515e73l },
22513           0 },
22514         /* 64 << 144 */
22515         { { 0x994f523a626332d5l,0x7bc388335561bb44l,0x005ed4b03d845ea2l,
22516             0xd39d3ee1c2a1f08al },
22517           { 0x6561fdd3e7676b0dl,0x620e35fffb706017l,0x36ce424ff264f9a8l,
22518             0xc4c3419fda2681f7l },
22519           0 },
22520         /* 65 << 144 */
22521         { { 0xb71a52b8b6bf8719l,0x0c7701f73196db36l,0xff1b936f53141cf4l,
22522             0x684d8a3c1b94a31cl },
22523           { 0xe555633ab52386e1l,0x9353a2af91450578l,0xc53db6fab99b14bcl,
22524             0x1f2d42adcf619d36l },
22525           0 },
22526         /* 71 << 144 */
22527         { { 0xbeb535ef3851c573l,0x3105fff585589843l,0xbe9f62a1d47aaf06l,
22528             0x6bb2ee5d107e1131l },
22529           { 0x82530247a4a7699fl,0x3fb475e144872afbl,0x8ad43fd73c4c49f2l,
22530             0x3f7632882e045fc4l },
22531           0 },
22532         /* 77 << 144 */
22533         { { 0x48440beb2924d7b2l,0x234163809c88fc57l,0xdc1d23d54ab08c2bl,
22534             0x576400b6e70feab0l },
22535           { 0x3b8afb8ba66da779l,0x7a7e3bf445468f16l,0x1976ddf3231f79dfl,
22536             0xbe61c170b8531a9el },
22537           0 },
22538         /* 83 << 144 */
22539         { { 0xf8d2dc768bf191b2l,0x3269e68813a39eb9l,0x104bb84be755eccfl,
22540             0xb8d1330f2868f807l },
22541           { 0x2b29c74cb06c6059l,0x3648baa1a6440a26l,0x5dfae323f1e6b2c9l,
22542             0x9d0319b79330ac0al },
22543           0 },
22544         /* 89 << 144 */
22545         { { 0x526ba3770e708bb2l,0x95c21ba327565dd9l,0x7071f46d48a0a873l,
22546             0xe4b9959efed6cc74l },
22547           { 0x1b16bfd1e08a5afal,0xc87fec98d1789782l,0x200186e946cfd068l,
22548             0x88ea35a7280bf3ebl },
22549           0 },
22550         /* 95 << 144 */
22551         { { 0x9e31943d42ac0e6cl,0xe61374cf1db8e40fl,0xbe27ea35a27db609l,
22552             0x7c5b91d67bf192e9l },
22553           { 0xc2af846defd0a24bl,0x1b2efc37669b647al,0xbfc3c38e5e58ef8al,
22554             0xb6afb167e13ab5a2l },
22555           0 },
22556         /* 101 << 144 */
22557         { { 0x08612d29b9f2aad4l,0x43c41330ad09dd17l,0xa45cb84a9f740519l,
22558             0x0a9ea9a7512ec031l },
22559           { 0x6e90dccaee747f35l,0xe4388bd1f0a1479bl,0x966140c4e20a9029l,
22560             0x1bb1f65d7dd956abl },
22561           0 },
22562         /* 107 << 144 */
22563         { { 0x066d206ea8f12bb3l,0xc9023b1b4325ec13l,0x1f56c72c96ead8ddl,
22564             0x454050fd8003e4c2l },
22565           { 0x9ca258a58917aa9dl,0xfe24b282d94593cfl,0xea66c203752741cfl,
22566             0x5714268c295a895el },
22567           0 },
22568         /* 113 << 144 */
22569         { { 0x72a9fbecc177d694l,0x38bb9387d68454d3l,0xa3d347bf590bc7d2l,
22570             0xcb6e292605ccc234l },
22571           { 0x588abfcf0d393c01l,0xf053dadf539e5568l,0xad7480fef2a8b157l,
22572             0xff28c8bb018cac8fl },
22573           0 },
22574         /* 116 << 144 */
22575         { { 0x12f1a00e7f5b8821l,0x0afa44e489b4b0cel,0x2dcaad8f6006338el,
22576             0x79c022cdba41242bl },
22577           { 0x7f6ef7e17871d350l,0x946c2a91674253adl,0xf686d137a9cbbdd9l,
22578             0xa47ce2eaf7d4f9f2l },
22579           0 },
22580         /* 119 << 144 */
22581         { { 0x1824991b205d40d6l,0x49cca1c085046a90l,0x7e23c1acd005e3c2l,
22582             0x093a9ae6d102c8ffl },
22583           { 0xf4791082d2f40843l,0xe456021811645483l,0x8a59c3b0fd3a6b39l,
22584             0x39130e7f820de158l },
22585           0 },
22586         /* 125 << 144 */
22587         { { 0xf7eef88d83b90783l,0xff60762af336d581l,0xf64f2d5dd801f5a0l,
22588             0x672b6ee7d6b3b8b9l },
22589           { 0xa2a2dceb08034d69l,0x3eca27f635638218l,0xe7065986fa17fefdl,
22590             0xf1b74445f5803af1l },
22591           0 },
22592     },
22593     {
22594         /* 0 << 152 */
22595         { { 0x00, 0x00, 0x00, 0x00 },
22596           { 0x00, 0x00, 0x00, 0x00 },
22597           1 },
22598         /* 1 << 152 */
22599         { { 0x32670d2f7189e71fl,0xc64387485ecf91e7l,0x15758e57db757a21l,
22600             0x427d09f8290a9ce5l },
22601           { 0x846a308f38384a7al,0xaac3acb4b0732b99l,0x9e94100917845819l,
22602             0x95cba111a7ce5e03l },
22603           0 },
22604         /* 3 << 152 */
22605         { { 0x37a01e48a105fc8el,0x769d754a289ba48cl,0xc08c6fe1d51c2180l,
22606             0xb032dd33b7bd1387l },
22607           { 0x953826db020b0aa6l,0x05137e800664c73cl,0xc66302c4660cf95dl,
22608             0x99004e11b2cef28al },
22609           0 },
22610         /* 4 << 152 */
22611         { { 0x214bc9a7d298c241l,0xe3b697ba56807cfdl,0xef1c78024564eadbl,
22612             0xdde8cdcfb48149c5l },
22613           { 0x946bf0a75a4d2604l,0x27154d7f6c1538afl,0x95cc9230de5b1fccl,
22614             0xd88519e966864f82l },
22615           0 },
22616         /* 5 << 152 */
22617         { { 0x1013e4f796ea6ca1l,0x567cdc2a1f792871l,0xadb728705c658d45l,
22618             0xf7c1ff4ace600e98l },
22619           { 0xa1ba86574b6cad39l,0x3d58d634ba20b428l,0xc0011cdea2e6fdfbl,
22620             0xa832367a7b18960dl },
22621           0 },
22622         /* 7 << 152 */
22623         { { 0x1ecc032af416448dl,0x4a7e8c10ec76d971l,0x854f9805b90b6eael,
22624             0xfd0b15324bed0594l },
22625           { 0x89f71848d98b5ca3l,0xd01fe5fcf039b3efl,0x4481332e627bda2el,
22626             0xe67cecd7a5073e41l },
22627           0 },
22628         /* 9 << 152 */
22629         { { 0x2ab0bce94595a859l,0x4d8c2da082084ee7l,0x21ff8be5acca3d3cl,
22630             0xd8b805337827f633l },
22631           { 0xf74e8c026becabbfl,0x9fae4dbefede4828l,0xd3885a5b3cc46bcfl,
22632             0x2d535e2b6e6ad144l },
22633           0 },
22634         /* 10 << 152 */
22635         { { 0x63d3444507d9e240l,0x6fbadf4338cff7e6l,0x8717624a959c9461l,
22636             0xd7d951c411fb775bl },
22637           { 0x4049161af6fc3a2bl,0x0dfa2547a1a8e98dl,0xeca780d439c2139cl,
22638             0xd8c2d8cbd73ea8efl },
22639           0 },
22640         /* 11 << 152 */
22641         { { 0x3aa1974f07605b28l,0x4f3d82a71e296255l,0xbbe5ea03b4e23f16l,
22642             0x8f5c6c6b4e654193l },
22643           { 0x27181182d3e8ab01l,0xc68bb231f3ba6bc2l,0x90a244d820af1fd7l,
22644             0x605abc055b713f4fl },
22645           0 },
22646         /* 13 << 152 */
22647         { { 0xca5fe19bd221991al,0x271ff066f05f400el,0x9d46ec4c9cf09896l,
22648             0xdcaa8dfdec4febc3l },
22649           { 0xaa3995a0adf19d04l,0xc98634239da573a6l,0x378058b2f2465b2bl,
22650             0x20d389f9b4c31612l },
22651           0 },
22652         /* 15 << 152 */
22653         { { 0xd7d199c7b7631c9dl,0x1322c2b8bb123942l,0xe662b68fbe8b6848l,
22654             0xc970faf2cde99b14l },
22655           { 0x61b27134b06655e5l,0xadcef8f781365d89l,0x917b5ab521b851aal,
22656             0x4f4472121cf694a7l },
22657           0 },
22658         /* 16 << 152 */
22659         { { 0x488f1185ca8d9d1al,0xadf2c77dd987ded2l,0x5f3039f060c46124l,
22660             0xe5d70b7571e095f4l },
22661           { 0x82d586506260e70fl,0x39d75ea7f750d105l,0x8cf3d0b175bac364l,
22662             0xf3a7564d21d01329l },
22663           0 },
22664         /* 17 << 152 */
22665         { { 0x241e3907fe44e547l,0x42d464c36b992187l,0xeaa8fa989ba72f28l,
22666             0x965a8b8f6afbb81fl },
22667           { 0x69356a7a8b375ea5l,0x22501ec741bdcc83l,0xf80f4e1445fb180cl,
22668             0xc0b12e95f5e1b822l },
22669           0 },
22670         /* 19 << 152 */
22671         { { 0x977234e05483dc02l,0x0167430c13d8dcb2l,0xa9971278049912edl,
22672             0xab044b18ca40fa39l },
22673           { 0xac9587449ff3896cl,0x75bb32eb860d1240l,0xf807071f6b958654l,
22674             0x67d2d3dc7121b4b6l },
22675           0 },
22676         /* 21 << 152 */
22677         { { 0x3b61e67722f9f017l,0x9c593eb1a8541696l,0xbeba950050eda653l,
22678             0x07b5a48f5e673f6al },
22679           { 0x748dca0013257aa3l,0x6bbddf9a7372e942l,0xc012f4badde83977l,
22680             0x6e59b327392ddb53l },
22681           0 },
22682         /* 23 << 152 */
22683         { { 0xb2f3fff641356603l,0x50e63537545f042bl,0x55e5149770eb530dl,
22684             0x5a7383c310860c3bl },
22685           { 0x7be30382ea669a09l,0xfdf735d289cc1c7fl,0x6e51ed844e0607cfl,
22686             0xdab566df4893795el },
22687           0 },
22688         /* 25 << 152 */
22689         { { 0x20e3be0f8920690dl,0x98db80eaac279c05l,0x4cd5c60a44b8a4f8l,
22690             0xeda7e91c7b0335f4l },
22691           { 0x45c1302a41ee5713l,0x1f6455fe588508d0l,0x82cb7311163d2fc3l,
22692             0xe866b90322f10b71l },
22693           0 },
22694         /* 27 << 152 */
22695         { { 0xc217a2e259b4041el,0x85b96ce274526cbfl,0xcbfc4f5473f12687l,
22696             0x097caa5fd40225e7l },
22697           { 0x0871ad406e91293fl,0x5f2ea207033b98ecl,0x0b3b8fac1f27d37al,
22698             0x7d72dd4c7f03876cl },
22699           0 },
22700         /* 28 << 152 */
22701         { { 0xb51a40a51e6a75c1l,0x24327c760ea7d817l,0x0663018207774597l,
22702             0xd6fdbec397fa7164l },
22703           { 0x20c99dfb13c90f48l,0xd6ac5273686ef263l,0xc6a50bdcfef64eebl,
22704             0xcd87b28186fdfc32l },
22705           0 },
22706         /* 29 << 152 */
22707         { { 0x2f0c49ac95861439l,0xcdcb051b2e36e38al,0x459474080ae20c0cl,
22708             0x374baad2dddf0aabl },
22709           { 0x291abc85d5d104a4l,0x0758001958a0657cl,0xd0f428e1a905ea13l,
22710             0x12599ddcf7241dbfl },
22711           0 },
22712         /* 31 << 152 */
22713         { { 0x16222ce81bc3c403l,0xbacc1508fc13ca02l,0xfa98db4d920ee8e9l,
22714             0xe5fc39c4df12a359l },
22715           { 0x4e8c9b90188733e8l,0x04283dd81394936cl,0x93b3db51cd130432l,
22716             0x33bfe3163c93ce31l },
22717           0 },
22718         /* 33 << 152 */
22719         { { 0xb48591e9840b1724l,0x1009559f5885ec6fl,0x45ee51121b077620l,
22720             0x848f9800f1f4cc8al },
22721           { 0x6ec1e0f74e97bceal,0x953bc23a98e80642l,0x9f0d1e8194ce7181l,
22722             0xeb3e6b9700eec596l },
22723           0 },
22724         /* 34 << 152 */
22725         { { 0x6d34b39bff7514dal,0x29ffe49825be3634l,0x63e56598f28c8b82l,
22726             0x78b99133aab41bcel },
22727           { 0x11febd5a52563180l,0xa3be94c5c356a8c0l,0x5e9b422e0d61f864l,
22728             0x2bf4ca1278fd259el },
22729           0 },
22730         /* 35 << 152 */
22731         { { 0x8f60e40266914514l,0x6d9e280fef178167l,0x2ff7aec9e2949a48l,
22732             0x422389ce72d37511l },
22733           { 0xe9b156f3307ac1d2l,0x1cb581a78518e79fl,0x56d43f302185cf82l,
22734             0x8d46c5aade59562cl },
22735           0 },
22736         /* 36 << 152 */
22737         { { 0x50fc0711745edc11l,0x9dd9ad7d3dc87558l,0xce6931fbb49d1e64l,
22738             0x6c77a0a2c98bd0f9l },
22739           { 0x62b9a6296baf7cb1l,0xcf065f91ccf72d22l,0x7203cce979639071l,
22740             0x09ae4885f9cb732fl },
22741           0 },
22742         /* 37 << 152 */
22743         { { 0xd007d682e4b35428l,0x80c162315bcdc0d6l,0xe55a86bd36fce9b2l,
22744             0x16772edb969a87cfl },
22745           { 0xff323a2d3f370c94l,0x8d3c8028bf3c1afcl,0x4e1591e73b0c3fafl,
22746             0xfbd6475cb981ce83l },
22747           0 },
22748         /* 39 << 152 */
22749         { { 0xcf414ae3315b2471l,0xf54abf8033168de6l,0x6883efc5df5cdb24l,
22750             0x3eca788c8efe81acl },
22751           { 0xdb58c6c778eeccadl,0x3c77939082fecfb7l,0x5736cdd9c9b513f3l,
22752             0xab7e6ea57b02aaf2l },
22753           0 },
22754         /* 40 << 152 */
22755         { { 0x5e7c3becee8314f3l,0x1c068aeddbea298fl,0x08d381f17c80acecl,
22756             0x03b56be8e330495bl },
22757           { 0xaeffb8f29222882dl,0x95ff38f6c4af8bf7l,0x50e32d351fc57d8cl,
22758             0x6635be5217b444f0l },
22759           0 },
22760         /* 41 << 152 */
22761         { { 0x2cec7ba64805d895l,0x4c8399870ac78e7cl,0x031ad6c7f79416c5l,
22762             0x1b2f2621f1838d2fl },
22763           { 0x60835eac91447f90l,0x59147af1f9bab5d9l,0x7a3005d6f393f175l,
22764             0x8cf3c468c4120ba2l },
22765           0 },
22766         /* 43 << 152 */
22767         { { 0xeccffc7d8a2c1f08l,0x308916d37e384bd4l,0x6b8c2ff55e366384l,
22768             0xf4b2850d03e4747cl },
22769           { 0xe839c569e96c1488l,0xa46ff7f956c9cb10l,0xd968c74c362fd172l,
22770             0x2aa7fe4cad6bb601l },
22771           0 },
22772         /* 44 << 152 */
22773         { { 0x04d15276a5177900l,0x4e1dbb47f6858752l,0x5b475622c615796cl,
22774             0xa6fa0387691867bfl },
22775           { 0xed7f5d562844c6d0l,0xc633cf9b03a2477dl,0xf6be5c402d3721d6l,
22776             0xaf312eb7e9fd68e6l },
22777           0 },
22778         /* 45 << 152 */
22779         { { 0xf3b8164eec04c847l,0xa305ca93fe65816cl,0xa65f9963c7e2ce52l,
22780             0xc448005198882cfcl },
22781           { 0x46a998df05c165bbl,0xc38f4edf9dfe1e98l,0xb96ec43f8739f77al,
22782             0x10a23af9313b40bfl },
22783           0 },
22784         /* 46 << 152 */
22785         { { 0xe476c3e3ee668e0cl,0xcec6a984478197c2l,0xc9fa1d68897147c1l,
22786             0x4e6aec0ea6465793l },
22787           { 0xedca9db76b219c3bl,0xa2cd57942e508d3bl,0x38b384663936e02al,
22788             0x0b8d3b4ca54ce90fl },
22789           0 },
22790         /* 47 << 152 */
22791         { { 0x66e06537af08e0fcl,0x70fe0f2a907f1a93l,0x8c25245285ec1647l,
22792             0x0b8b2964d5560eddl },
22793           { 0xda45a326f3ef8e14l,0xf3adf9a6abc3494bl,0xbbdd93c11eda0d92l,
22794             0x1b5e12c609912773l },
22795           0 },
22796         /* 48 << 152 */
22797         { { 0x242792d2e7417ce1l,0xff42bc71970ee7f5l,0x1ff4dc6d5c67a41el,
22798             0x77709b7b20882a58l },
22799           { 0x3554731dbe217f2cl,0x2af2a8cd5bb72177l,0x58eee769591dd059l,
22800             0xbb2930c94bba6477l },
22801           0 },
22802         /* 49 << 152 */
22803         { { 0x5d9d507551d01848l,0x53dadb405b600d1el,0x7ba5b4dc5cb0a9a3l,
22804             0xdb85b04c6795e547l },
22805           { 0x480e7443f0354843l,0xc7efe6e813012322l,0x479b674a2aeee1e6l,
22806             0xf5481f19704f4ea3l },
22807           0 },
22808         /* 51 << 152 */
22809         { { 0x76a38d6978c7816el,0xe020c87df84ec554l,0x99af2f78f9818010l,
22810             0x31cf103d988136eal },
22811           { 0x6b095a114816a5aal,0x5a4cd2a4eff0a4afl,0x543041a5892e5e04l,
22812             0x460f94c30aab9ee1l },
22813           0 },
22814         /* 52 << 152 */
22815         { { 0x863ee0477d930cfcl,0x4c262ad1396fd1f4l,0xf4765bc8039af7e1l,
22816             0x2519834b5ba104f6l },
22817           { 0x7cd61b4cd105f961l,0xa5415da5d63bca54l,0x778280a088a1f17cl,
22818             0xc49689492329512cl },
22819           0 },
22820         /* 53 << 152 */
22821         { { 0x282d92b48cd3948al,0x95d219dfe168205bl,0xf6111a6f87bf3abcl,
22822             0x910f8ce655fee9f2l },
22823           { 0xb6c806f74f71ac89l,0xd0cc300fb7235f73l,0xfe37ccb47d0d45bbl,
22824             0x5b2445f6952f0eaal },
22825           0 },
22826         /* 55 << 152 */
22827         { { 0x03870be447141962l,0x8b79033f4a2b3f7fl,0xb6983b5ed2e5e274l,
22828             0x2a2f8018501ed99cl },
22829           { 0x07a92eb9feb49656l,0x063f0a9e482e2972l,0x413be27a57435832l,
22830             0x56363c5f6f9d3de1l },
22831           0 },
22832         /* 57 << 152 */
22833         { { 0xd247153163b50214l,0x32b435eeb2b897del,0xc49f0b01b05df4del,
22834             0x97b6aa40b7df9b91l },
22835           { 0x58ff34ec8ec39d78l,0xab0889005e0114a3l,0x6872b4de4822b7b8l,
22836             0x7614c0d0ab239073l },
22837           0 },
22838         /* 59 << 152 */
22839         { { 0x81891d378aa5d80al,0xf48ca24292e45f2cl,0xba711b6c0d04904cl,
22840             0x5992cda349f16ed6l },
22841           { 0x18b9a739790593eel,0x8b98e84dc4ba16d1l,0xac55701cb7b81615l,
22842             0xadb4533b15822291l },
22843           0 },
22844         /* 60 << 152 */
22845         { { 0x6210db7181236c97l,0x74f7685b3ee0781fl,0x4df7da7ba3e41372l,
22846             0x2aae38b1b1a1553el },
22847           { 0x1688e222f6dd9d1bl,0x576954485b8b6487l,0x478d21274b2edeaal,
22848             0xb2818fa51e85956al },
22849           0 },
22850         /* 61 << 152 */
22851         { { 0xc0677533f255ba8el,0x2bdae2a1efa2aabel,0xf7aebbd4b086c8a6l,
22852             0x148455d992cb1147l },
22853           { 0xa084e8d715402565l,0x33f111a8fa41bf23l,0x4bc990d627ac189bl,
22854             0x48dbe6569d505f76l },
22855           0 },
22856         /* 63 << 152 */
22857         { { 0x59df7fab596766f3l,0x4cadcbfe604f26e4l,0x0cf199338a6af592l,
22858             0x3af1ace287b826c1l },
22859           { 0xf09a5b38ee60684el,0xa04cbeda4ed7c711l,0xdb28c42eb1731040l,
22860             0x75fcc0ec2e6e6523l },
22861           0 },
22862         /* 64 << 152 */
22863         { { 0x1e6adddaf176f2c0l,0x01ca4604e2572658l,0x0a404ded85342ffbl,
22864             0x8cf60f96441838d6l },
22865           { 0x9bbc691cc9071c4al,0xfd58874434442803l,0x97101c85809c0d81l,
22866             0xa7fb754c8c456f7fl },
22867           0 },
22868         /* 65 << 152 */
22869         { { 0x4374020072196f30l,0x59ed0dc0dcd6c935l,0x17d4ed8e5034161bl,
22870             0x8abe3e13009e7170l },
22871           { 0xe51c41c96c791456l,0xc671807704d72bb6l,0xd4309cf56bba424al,
22872             0x6122b951d0ca4ceal },
22873           0 },
22874         /* 71 << 152 */
22875         { { 0xdfdb2e9c4278982bl,0xf3a282b32d6a2a61l,0x5611650cd2f2b03cl,
22876             0xa62c177f43f7f83al },
22877           { 0x372310ab4c593d32l,0x2bb6903a2b570f9cl,0x2930da3df43af904l,
22878             0x2bbd04aa2c8a5a7dl },
22879           0 },
22880         /* 77 << 152 */
22881         { { 0x10c324c007e536del,0xc456836d377be1b4l,0x9a627d75d785af3fl,
22882             0xde74559118b58b31l },
22883           { 0xeac83ea60c47239al,0x35da24abbc02f670l,0x2d4abde0c3af6e63l,
22884             0xac53acba5a7ebf1bl },
22885           0 },
22886         /* 83 << 152 */
22887         { { 0x2b03ec2efd9a9f3el,0xc967cd2b9d898a09l,0xb24bcba8039dc4f6l,
22888             0x0ea1d297061ada1el },
22889           { 0x3a7a25fbc134b8bcl,0x846282d6f61cd312l,0xfa1de0d2e0d778d9l,
22890             0xf75fad4ef09be264l },
22891           0 },
22892         /* 89 << 152 */
22893         { { 0x7d35695bcf74afb3l,0x34d43d9f15bb36fbl,0x15f0b43960b45fbel,
22894             0xb15db8d84f38ec06l },
22895           { 0x93ce7d50f7da1406l,0x2db97edd9f076aaal,0x27ebb9aa354429dcl,
22896             0xf97eb5c446ace469l },
22897           0 },
22898         /* 95 << 152 */
22899         { { 0x758fa2312dcf498fl,0xaa8c14d15cf3853al,0x416f5dab097d786al,
22900             0xceec00ef38f242a0l },
22901           { 0x2f8b10b9d8b75ef2l,0xee64912b2281be6al,0xa883481aa382a51el,
22902             0x9442300f61b16b8al },
22903           0 },
22904         /* 101 << 152 */
22905         { { 0x80e7fbc4f4b171e1l,0xdd2246f5661564a4l,0xcf08d73cd00d4e54l,
22906             0xf725f5389fca9a30l },
22907           { 0xd9607358af20debel,0xa97c81e16f7d1cf2l,0x72794ae70dedfb2al,
22908             0xc328cb93159ff29dl },
22909           0 },
22910         /* 107 << 152 */
22911         { { 0xaf9491d6252f6d59l,0x6744d7518feda60dl,0xa485f8aa34c5c048l,
22912             0x2ed794b4b50ea53bl },
22913           { 0x0da82650db26c289l,0xed3ab4c50904af55l,0x425eda1176544463l,
22914             0x917be5f48939b29bl },
22915           0 },
22916         /* 113 << 152 */
22917         { { 0xa2e72d0f8e208e5dl,0x5a5e4344234a5fedl,0x6dcc56535005bee8l,
22918             0x09d0c254854e2e04l },
22919           { 0xade4bcdba82f0789l,0x5a3e3cd4ec460a91l,0x6b1a867be76695b2l,
22920             0xd1eb9df0a28b9331l },
22921           0 },
22922         /* 116 << 152 */
22923         { { 0x3f5cf5f678e62ddcl,0x2267c45407fd752bl,0x5e361b6b5e437bbel,
22924             0x95c595018354e075l },
22925           { 0xec725f85f2b254d9l,0x844b617d2cb52b4el,0xed8554f5cf425fb5l,
22926             0xab67703e2af9f312l },
22927           0 },
22928         /* 119 << 152 */
22929         { { 0x8dcc920005fb96bbl,0x29d2442470f84705l,0x540bb6e63f09628fl,
22930             0x07f8b4de2a9c2359l },
22931           { 0xb8e002d1957e41dcl,0x9a0fe82b9e683a3fl,0x996b1a5250e633fdl,
22932             0x748a11e500c669cal },
22933           0 },
22934         /* 125 << 152 */
22935         { { 0x0593a788581dfd6el,0x99f1164f64e1b329l,0x1142c44b1defddbbl,
22936             0xbc95c9c7660b9036l },
22937           { 0xf24b5a47079179ccl,0x6175b52c21f7033bl,0x8b5d84183bc2eec0l,
22938             0xc1332c8272d12670l },
22939           0 },
22940     },
22941     {
22942         /* 0 << 160 */
22943         { { 0x00, 0x00, 0x00, 0x00 },
22944           { 0x00, 0x00, 0x00, 0x00 },
22945           1 },
22946         /* 1 << 160 */
22947         { { 0xd433e50f6d3549cfl,0x6f33696ffacd665el,0x695bfdacce11fcb4l,
22948             0x810ee252af7c9860l },
22949           { 0x65450fe17159bb2cl,0xf7dfbebe758b357bl,0x2b057e74d69fea72l,
22950             0xd485717a92731745l },
22951           0 },
22952         /* 3 << 160 */
22953         { { 0x6c8d0aa9b898fd52l,0x2fb38a57be9af1a7l,0xe1f2b9a93b4f03f8l,
22954             0x2b1aad44c3f0cc6fl },
22955           { 0x58b5332e7cf2c084l,0x1c57d96f0367d26dl,0x2297eabdfa6e4a8dl,
22956             0x65a947ee4a0e2b6al },
22957           0 },
22958         /* 4 << 160 */
22959         { { 0xaaafafb0285b9491l,0x01a0be881e4c705el,0xff1d4f5d2ad9caabl,
22960             0x6e349a4ac37a233fl },
22961           { 0xcf1c12464a1c6a16l,0xd99e6b6629383260l,0xea3d43665f6d5471l,
22962             0x36974d04ff8cc89bl },
22963           0 },
22964         /* 5 << 160 */
22965         { { 0xf535b616fdd5b854l,0x592549c85728719fl,0xe231468606921cadl,
22966             0x98c8ce34311b1ef8l },
22967           { 0x28b937e7e9090b36l,0x67fc3ab90bf7bbb7l,0x12337097a9d87974l,
22968             0x3e5adca1f970e3fel },
22969           0 },
22970         /* 7 << 160 */
22971         { { 0xcdcc68a7b3f85ff0l,0xacd21cdd1a888044l,0xb6719b2e05dbe894l,
22972             0xfae1d3d88b8260d4l },
22973           { 0xedfedece8a1c5d92l,0xbca01a94dc52077el,0xc085549c16dd13edl,
22974             0xdc5c3bae495ebaadl },
22975           0 },
22976         /* 9 << 160 */
22977         { { 0xcc17063fbe7b643al,0x7872e1c846085760l,0x86b0fffbb4214c9el,
22978             0xb18bbc0e72bf3638l },
22979           { 0x8b17de0c722591c9l,0x1edeab1948c29e0cl,0x9fbfd98ef4304f20l,
22980             0x2d1dbb6b9c77ffb6l },
22981           0 },
22982         /* 10 << 160 */
22983         { { 0xf53f2c658ead09f7l,0x1335e1d59780d14dl,0x69cc20e0cd1b66bcl,
22984             0x9b670a37bbe0bfc8l },
22985           { 0xce53dc8128efbeedl,0x0c74e77c8326a6e5l,0x3604e0d2b88e9a63l,
22986             0xbab38fca13dc2248l },
22987           0 },
22988         /* 11 << 160 */
22989         { { 0x255616d3c7141771l,0xa86691ab2f226b66l,0xda19fea4b3ca63a9l,
22990             0xfc05dc42ae672f2bl },
22991           { 0xa9c6e786718ba28fl,0x07b7995b9c66b984l,0x0f434f551b3702f2l,
22992             0xd6f6212fda84eeffl },
22993           0 },
22994         /* 13 << 160 */
22995         { { 0x4b0e7987b5b41d78l,0xea7df9074bf0c4f8l,0xb4d03560fab80ecdl,
22996             0x6cf306f6fb1db7e5l },
22997           { 0x0d59fb5689fd4773l,0xab254f4000f9be33l,0x18a09a9277352da4l,
22998             0xf81862f5641ea3efl },
22999           0 },
23000         /* 15 << 160 */
23001         { { 0xb59b01579f759d01l,0xa2923d2f7eae4fdel,0x18327757690ba8c0l,
23002             0x4bf7e38b44f51443l },
23003           { 0xb6812563b413fc26l,0xedb7d36379e53b36l,0x4fa585c4c389f66dl,
23004             0x8e1adc3154bd3416l },
23005           0 },
23006         /* 16 << 160 */
23007         { { 0xd3b3a13f1402b9d0l,0x573441c32c7bc863l,0x4b301ec4578c3e6el,
23008             0xc26fc9c40adaf57el },
23009           { 0x96e71bfd7493cea3l,0xd05d4b3f1af81456l,0xdaca2a8a6a8c608fl,
23010             0x53ef07f60725b276l },
23011           0 },
23012         /* 17 << 160 */
23013         { { 0x971e9eedd5098497l,0x97692be63077d8a7l,0xb57e02ad79625a8al,
23014             0x5e3d20f6a688ecd5l },
23015           { 0xa4431a28188f964dl,0xd4eb23bd5a11c1dbl,0xfcda853eadc7446fl,
23016             0x9e2e98b593c94046l },
23017           0 },
23018         /* 19 << 160 */
23019         { { 0x4a649b66eddaa4f1l,0x35a04f185e690c50l,0x1639bdcff908bc53l,
23020             0xce6d525c121726e8l },
23021           { 0x70f34948902b402cl,0x3a40c6950e290579l,0x7b0ed90f469a0085l,
23022             0xecb979c60189c501l },
23023           0 },
23024         /* 21 << 160 */
23025         { { 0x847e2bde5cee8d07l,0x1bed198cd3340037l,0x439ffb3ce41586e3l,
23026             0x594980f1856f15b0l },
23027           { 0x22c3b86c6e9307c6l,0xf8b3ee08876382dbl,0x850c628e628f3f30l,
23028             0x22ec0acb51ee3659l },
23029           0 },
23030         /* 23 << 160 */
23031         { { 0xa4052591efcef5a0l,0x82692a47106d55afl,0xdac3ea88e6ead453l,
23032             0xaa1368fcf3dfd875l },
23033           { 0x87bc688aa0c539eal,0x905e206040b1de3el,0x072240b8f1d52452l,
23034             0x3ebf0644d57b6580l },
23035           0 },
23036         /* 25 << 160 */
23037         { { 0x12109bcc07a0b2f8l,0x336f87d2ca23f14cl,0xb39ae282452a2ea2l,
23038             0x8e085f5bab59a500l },
23039           { 0xf7daeb69b63f015cl,0x44c555bcacb47b38l,0x96190454b623910al,
23040             0x4b666e2255b41b70l },
23041           0 },
23042         /* 27 << 160 */
23043         { { 0xf146914eb53419fdl,0xd2109b07493e88bfl,0x30bf9cbccc54bcd5l,
23044             0xcf9ea59750e34a1fl },
23045           { 0x70ade8a59588591dl,0xf668be676b41c269l,0x3497c58f78df2e6bl,
23046             0x0fad05cc71042b56l },
23047           0 },
23048         /* 28 << 160 */
23049         { { 0x27f536e049ce89e7l,0x18908539cc890cb5l,0x308909abd83c2aa1l,
23050             0xecd3142b1ab73bd3l },
23051           { 0x6a85bf59b3f5ab84l,0x3c320a68f2bea4c6l,0xad8dc5386da4541fl,
23052             0xeaf34eb0b7c41186l },
23053           0 },
23054         /* 29 << 160 */
23055         { { 0x709da836093aa5f6l,0x567a9becb4644edel,0xae02a46044466b0cl,
23056             0xc80b237a407f1b3bl },
23057           { 0x451df45ab4168a98l,0xdc9b40ef24a3f7c9l,0x23593ef32671341dl,
23058             0x40f4533190b90faal },
23059           0 },
23060         /* 31 << 160 */
23061         { { 0x7f97768e922f36e3l,0x936943f8491034a2l,0x72f6c17f21483753l,
23062             0x5489fa0cb2918619l },
23063           { 0x55b31aa59cc21a46l,0xde4cc71a8e54ab14l,0x942cb8be9eaff8b0l,
23064             0xe38f6116d1755231l },
23065           0 },
23066         /* 33 << 160 */
23067         { { 0xf0c0606a395b39abl,0x0efcbc699b5166a5l,0x85995e6895453d85l,
23068             0xadc9a2920806ee5cl },
23069           { 0xc3662e804928fe09l,0x2a2ddcc6969c87e7l,0xa02d7947111d319dl,
23070             0xde23bcf12d20f66dl },
23071           0 },
23072         /* 34 << 160 */
23073         { { 0xc47cb3395f6d4a09l,0x6b4f355cee52b826l,0x3d100f5df51b930al,
23074             0xf4512fac9f668f69l },
23075           { 0x546781d5206c4c74l,0xd021d4d4cb4d2e48l,0x494a54c2ca085c2dl,
23076             0xf1dbaca4520850a8l },
23077           0 },
23078         /* 35 << 160 */
23079         { { 0xb2d15b14a911cc2bl,0xab2dfaf7643e28eal,0xfccc9ed1f52c4c2dl,
23080             0xfb4b1d4a09d8faa3l },
23081           { 0x6fd72a9b7f5ce767l,0x0233c856a287e2b5l,0xd42135e05775ebb9l,
23082             0xb3c9dada7376568bl },
23083           0 },
23084         /* 36 << 160 */
23085         { { 0x63c79326490a1acal,0xcb64dd9c41526b02l,0xbb772591a2979258l,
23086             0x3f58297048d97846l },
23087           { 0xd66b70d17c213ba7l,0xc28febb5e8a0ced4l,0x6b911831c10338c1l,
23088             0x0d54e389bf0126f3l },
23089           0 },
23090         /* 37 << 160 */
23091         { { 0x5952996b5306af1bl,0x99f444f4354b67bel,0x6f670181633a2928l,
23092             0x289023f0e9bdc4a6l },
23093           { 0xcbed12148f7455a2l,0x501ace2f659a4858l,0x83ee678d5f8e1784l,
23094             0x95c984587335c5bdl },
23095           0 },
23096         /* 39 << 160 */
23097         { { 0x2e25a1f3e0233000l,0xed0028cd44fe8ba9l,0x447501a6021d43b3l,
23098             0x4ec203906b4dffccl },
23099           { 0x50642f9ad0169740l,0x9360003373cc58adl,0x825f1a82fe9cf9acl,
23100             0x456194c653242bd6l },
23101           0 },
23102         /* 40 << 160 */
23103         { { 0x40242efeb483689bl,0x2575d3f6513ac262l,0xf30037c80ca6db72l,
23104             0xc9fcce8298864be2l },
23105           { 0x84a112ff0149362dl,0x95e575821c4ae971l,0x1fa4b1a8945cf86cl,
23106             0x4525a7340b024a2fl },
23107           0 },
23108         /* 41 << 160 */
23109         { { 0x83205e8f5db5e2b1l,0x94e7a2621e311c12l,0xe1cac7333e37068fl,
23110             0xe3f43f6d39965acfl },
23111           { 0xd28db9e854d905bal,0x686f372a101f2162l,0x409cfe5d3d1b46d4l,
23112             0x17648f1cbd0bb63al },
23113           0 },
23114         /* 43 << 160 */
23115         { { 0xef83315b821f4ee4l,0xb90766998ba78b4dl,0xee6a15880fce5260l,
23116             0x828f4a72d754affbl },
23117           { 0x4650ec7daaae54d2l,0x3174301f1057efe9l,0x174e0683eb7704cel,
23118             0xb7e6aeb357eb0b14l },
23119           0 },
23120         /* 44 << 160 */
23121         { { 0xcaead1c2c905d85fl,0xe9d7f7900733ae57l,0x24c9a65cf07cdd94l,
23122             0x7389359ca4b55931l },
23123           { 0xf58709b7367e45f7l,0x1f203067cb7e7adcl,0x82444bffc7b72818l,
23124             0x07303b35baac8033l },
23125           0 },
23126         /* 45 << 160 */
23127         { { 0xd59528fb38a0dc96l,0x8179dc9088d0e857l,0x55e9ba039ed4b1afl,
23128             0x8a2c0dc787b74cacl },
23129           { 0xe8ca91aeef1c0006l,0x67f59ab2de0e15d4l,0xba0cddf86e6634d2l,
23130             0x352803657b7ba591l },
23131           0 },
23132         /* 46 << 160 */
23133         { { 0x1e1ee4e4d13b7ea1l,0xe6489b24e0e74180l,0xa5f2c6107e70ef70l,
23134             0xa1655412bdd10894l },
23135           { 0x555ebefb7af4194el,0x533c1c3c8e89bd9cl,0x735b9b5789895856l,
23136             0x15fb3cd2567f5c15l },
23137           0 },
23138         /* 47 << 160 */
23139         { { 0xef07bfedfb0986c7l,0xde138afe47c1659al,0x8b79c159a555e907l,
23140             0x21d572f1125518bbl },
23141           { 0x2005999ad320410cl,0x4167dc469484414bl,0x0cd965c34c6aaefdl,
23142             0x2a1abc9a0e1d5e9dl },
23143           0 },
23144         /* 48 << 160 */
23145         { { 0x057fed45526f09fdl,0xe8a4f10c8128240al,0x9332efc4ff2bfd8dl,
23146             0x214e77a0bd35aa31l },
23147           { 0x32896d7314faa40el,0x767867ec01e5f186l,0xc9adf8f117a1813el,
23148             0xcb6cda7854741795l },
23149           0 },
23150         /* 49 << 160 */
23151         { { 0xadfaf39b888dedf1l,0x4f8b178aab1750b9l,0x26418617ffe6b0eal,
23152             0x01d1be82af04a59fl },
23153           { 0x41584147e652db64l,0xf7775ac5727f9ea7l,0x58052a20e72ad8bbl,
23154             0x5badf0dc6021160el },
23155           0 },
23156         /* 51 << 160 */
23157         { { 0x8490ea99183de59dl,0xc95f72146f5c6f8cl,0x89b55d15df00c334l,
23158             0x84386ad8a0ec36f7l },
23159           { 0x24dadaefe4dc1ed1l,0xc606ba4c1e717227l,0x7e4756c0bbfa62eal,
23160             0x3916cf14afc29cf3l },
23161           0 },
23162         /* 52 << 160 */
23163         { { 0xb7b4d00101dae185l,0x45434e0b9b7a94bcl,0xf54339affbd8cb0bl,
23164             0xdcc4569ee98ef49el },
23165           { 0x7789318a09a51299l,0x81b4d206b2b025d8l,0xf64aa418fae85792l,
23166             0x3e50258facd7baf7l },
23167           0 },
23168         /* 53 << 160 */
23169         { { 0x4152c508492d91f3l,0x59d6cf9c678f9db4l,0xb0a8c966404608d1l,
23170             0xdced55d0e3fed558l },
23171           { 0x0914a3cb33a76188l,0x79df212423d35d46l,0x2322507fca13b364l,
23172             0x0aed41d60078ab93l },
23173           0 },
23174         /* 55 << 160 */
23175         { { 0x7acdaa7f6b2ebfc2l,0xb5ab1a9a80d9f67fl,0x53ba8173ff8aa8b0l,
23176             0x9cd85cf874ca56a6l },
23177           { 0xabac57f49c4fad81l,0x2325bb8521078995l,0xbac5e3a1b928a054l,
23178             0x7219047a2394cc2al },
23179           0 },
23180         /* 57 << 160 */
23181         { { 0xa33410d2aa75fd37l,0x821093affc0f1192l,0xe45e85ed155e39a9l,
23182             0xd0e87cd12de67188l },
23183           { 0xdeca97d965d43d87l,0x8c73826f9d2c99ecl,0x1bfe111e33237ddbl,
23184             0xda32e865587bfb28l },
23185           0 },
23186         /* 59 << 160 */
23187         { { 0xde456d92c89e9e4el,0xe45688a98e47f3cdl,0x3deacfca3bacbde0l,
23188             0xdf9b32efc9683a70l },
23189           { 0x749bc007e1691106l,0x788a05342a5154d7l,0x1a06baecf7c7b70dl,
23190             0xb5b608eeae6ffc4cl },
23191           0 },
23192         /* 60 << 160 */
23193         { { 0x4cd296df5579bea4l,0x10e35ac85ceedaf1l,0x04c4c5fde3bcc5b1l,
23194             0x95f9ee8a89412cf9l },
23195           { 0x2c9459ee82b6eb0fl,0x2e84576595c2aaddl,0x774a84aed327fcfel,
23196             0xd8c937220368d476l },
23197           0 },
23198         /* 61 << 160 */
23199         { { 0x39ebf947ccd25abbl,0x74e7a868cb49ebael,0x576ea108332e6147l,
23200             0xcf3ba166150c1e5dl },
23201           { 0xb5411fc3515c0e93l,0x51b15761f15c8a34l,0x362a4a3a0d213f38l,
23202             0xf6f63c2e24e93aeal },
23203           0 },
23204         /* 63 << 160 */
23205         { { 0x0cb3a2dcb78528d5l,0xa1888c18d585bb41l,0x210cca40de402a6el,
23206             0x10c6339d9ed7c381l },
23207           { 0xcd3558d561fe2a0cl,0xc97db05dad5140b1l,0x3366b028b21f8d11l,
23208             0x878b09033e38be13l },
23209           0 },
23210         /* 64 << 160 */
23211         { { 0x211cde10296c36efl,0x7ee8967282c4da77l,0xb617d270a57836dal,
23212             0xf0cd9c319cb7560bl },
23213           { 0x01fdcbf7e455fe90l,0x3fb53cbb7e7334f3l,0x781e2ea44e7de4ecl,
23214             0x8adab3ad0b384fd0l },
23215           0 },
23216         /* 65 << 160 */
23217         { { 0x081e505aa353ba05l,0x244ab34a288b86b1l,0x1155f06214e3a829l,
23218             0x383300daf2118a6bl },
23219           { 0xe8fc17cef27032b9l,0xed7f05c9c7bd2389l,0x78f70d14202f8a88l,
23220             0x8a8310c0647b3f20l },
23221           0 },
23222         /* 71 << 160 */
23223         { { 0xc80786e1a3633369l,0x496d55de9073f5b9l,0x10deeb6a89ae93cel,
23224             0x6a2dd5c8b12e00c6l },
23225           { 0xc25cd2f90c68e26dl,0x29d7ad8b53f0bb64l,0x2dd0d027d7fc9b00l,
23226             0xad21e1f7ca9c4d5dl },
23227           0 },
23228         /* 77 << 160 */
23229         { { 0xd45cb932d83465f3l,0x95830c0faf22fdbdl,0x41d830e007cd2a0al,
23230             0x4a08500e3616e716l },
23231           { 0x5931fc9f277755a5l,0x7d11680731006764l,0xa409a0ad1b3999aal,
23232             0xec70368c9939d566l },
23233           0 },
23234         /* 83 << 160 */
23235         { { 0x3905cb59f2030370l,0x7e9bdee56dcc8fd7l,0xb1b7b04e9806e06fl,
23236             0xfbdadce22c73eb57l },
23237           { 0xfb1ab2e98d5b2eb3l,0x58fbf2df7699338bl,0x81b1c54a63b5a032l,
23238             0xefd1a1896a5d7ff4l },
23239           0 },
23240         /* 89 << 160 */
23241         { { 0x0265189da1f769eal,0x22fa0bbbfdb5a502l,0xf69f0d1b21027534l,
23242             0x64302b81f6066b99l },
23243           { 0xdef85fc98a717e80l,0xe066166386879a3bl,0xe5489b347f95b22cl,
23244             0x106dca9aa054a563l },
23245           0 },
23246         /* 95 << 160 */
23247         { { 0xd624b4f4b4be9a77l,0x21a11ed77d50acb1l,0x707181f43d406e11l,
23248             0x3f324d203ef158bcl },
23249           { 0xb29a2a34aa8cc8del,0x482f4a15315db969l,0x42ce4fc7d9af272el,
23250             0x784665b1f8f4cdc4l },
23251           0 },
23252         /* 101 << 160 */
23253         { { 0x66ff7f73ab43a863l,0xa90be2cba77fd07el,0x84843997f76e5288l,
23254             0x288c197f3cee129bl },
23255           { 0x39acc080c0a060a6l,0x4c8e574bd24e27cal,0x1dd6170ffcd3d5e9l,
23256             0x9736bb51f75e5150l },
23257           0 },
23258         /* 107 << 160 */
23259         { { 0x2133810e6ba75716l,0x4debf728712886a8l,0x351e46a1f527d1f3l,
23260             0x29709ae8e9591564l },
23261           { 0x696163d3a3dc1780l,0xd5b7825ae02aadf3l,0x23579d7cd565ae68l,
23262             0x105380124fa42cecl },
23263           0 },
23264         /* 113 << 160 */
23265         { { 0x04eb554d13ffa704l,0x7441a62f2ed33d20l,0xaa926fa0b5b81324l,
23266             0xb981bcb829836f61l },
23267           { 0x313a78d4cc9a7a15l,0xff1242d11b3921d2l,0xc0053fd36a209d4dl,
23268             0x95ac85caf7e92ca9l },
23269           0 },
23270         /* 116 << 160 */
23271         { { 0x6d2a483d6f73c51el,0xa4cb2412ea0dc2ddl,0x50663c411eb917ffl,
23272             0x3d3a74cfeade299el },
23273           { 0x29b3990f4a7a9202l,0xa9bccf59a7b15c3dl,0x66a3ccdca5df9208l,
23274             0x48027c1443f2f929l },
23275           0 },
23276         /* 119 << 160 */
23277         { { 0xdf8a6f9673c3f6fbl,0xe4b1f0d98cc03220l,0x5ddacd618350480cl,
23278             0x485c4fababdfb016l },
23279           { 0xdc840628b4d424b7l,0x07d3a99c215b2359l,0xad3dc5af56dff52el,
23280             0x5a3a6754973b6825l },
23281           0 },
23282         /* 125 << 160 */
23283         { { 0xcfe231b83539a06dl,0xb36d1f72f46770ddl,0x126049747bb900d6l,
23284             0x8d0990973fc31661l },
23285           { 0x03b2749c920bc39el,0xf933d510b0486e23l,0x09cc958f0e9b0bb5l,
23286             0x0b254dd1aa1e23abl },
23287           0 },
23288     },
23289     {
23290         /* 0 << 168 */
23291         { { 0x00, 0x00, 0x00, 0x00 },
23292           { 0x00, 0x00, 0x00, 0x00 },
23293           1 },
23294         /* 1 << 168 */
23295         { { 0x263a2cfb9db3b381l,0x9c3a2deed4df0a4bl,0x728d06e97d04e61fl,
23296             0x8b1adfbc42449325l },
23297           { 0x6ec1d9397e053a1bl,0xee2be5c766daf707l,0x80ba1e14810ac7abl,
23298             0xdd2ae778f530f174l },
23299           0 },
23300         /* 3 << 168 */
23301         { { 0xadbaeb79b6828f36l,0x9d7a025801bd5b9el,0xeda01e0d1e844b0cl,
23302             0x4b625175887edfc9l },
23303           { 0x14109fdd9669b621l,0x88a2ca56f6f87b98l,0xfe2eb788170df6bcl,
23304             0x0cea06f4ffa473f9l },
23305           0 },
23306         /* 4 << 168 */
23307         { { 0x43ed81b5c4e83d33l,0xd9f358795efd488bl,0x164a620f9deb4d0fl,
23308             0xc6927bdbac6a7394l },
23309           { 0x45c28df79f9e0f03l,0x2868661efcd7e1a9l,0x7cf4e8d0ffa348f1l,
23310             0x6bd4c284398538e0l },
23311           0 },
23312         /* 5 << 168 */
23313         { { 0x2618a091289a8619l,0xef796e606671b173l,0x664e46e59090c632l,
23314             0xa38062d41e66f8fbl },
23315           { 0x6c744a200573274el,0xd07b67e4a9271394l,0x391223b26bdc0e20l,
23316             0xbe2d93f1eb0a05a7l },
23317           0 },
23318         /* 7 << 168 */
23319         { { 0x7efa14b84444896bl,0x64974d2ff94027fbl,0xefdcd0e8de84487dl,
23320             0x8c45b2602b48989bl },
23321           { 0xa8fcbbc2d8463487l,0xd1b2b3f73fbc476cl,0x21d005b7c8f443c0l,
23322             0x518f2e6740c0139cl },
23323           0 },
23324         /* 9 << 168 */
23325         { { 0xae51dca2a91f6791l,0x2abe41909baa9efcl,0xd9d2e2f4559c7ac1l,
23326             0xe82f4b51fc9f773al },
23327           { 0xa77130274073e81cl,0xc0276facfbb596fcl,0x1d819fc9a684f70cl,
23328             0x29b47fddc9f7b1e0l },
23329           0 },
23330         /* 10 << 168 */
23331         { { 0x358de103459b1940l,0xec881c595b013e93l,0x51574c9349532ad3l,
23332             0x2db1d445b37b46del },
23333           { 0xc6445b87df239fd8l,0xc718af75151d24eel,0xaea1c4a4f43c6259l,
23334             0x40c0e5d770be02f7l },
23335           0 },
23336         /* 11 << 168 */
23337         { { 0x6a4590f4721b33f2l,0x2124f1fbfedf04eal,0xf8e53cde9745efe7l,
23338             0xe7e1043265f046d9l },
23339           { 0xc3fca28ee4d0c7e6l,0x847e339a87253b1bl,0x9b5953483743e643l,
23340             0xcb6a0a0b4fd12fc5l },
23341           0 },
23342         /* 13 << 168 */
23343         { { 0xec1214eda714181dl,0x609ac13b6067b341l,0xff4b4c97a545df1fl,
23344             0xa124050134d2076bl },
23345           { 0x6efa0c231409ca97l,0x254cc1a820638c43l,0xd4e363afdcfb46cdl,
23346             0x62c2adc303942a27l },
23347           0 },
23348         /* 15 << 168 */
23349         { { 0x27b6a8ab3fd40e09l,0xe455842e77313ea9l,0x8b51d1e21f55988bl,
23350             0x5716dd73062bbbfcl },
23351           { 0x633c11e54e8bf3del,0x9a0e77b61b85be3bl,0x565107290911cca6l,
23352             0x27e76495efa6590fl },
23353           0 },
23354         /* 16 << 168 */
23355         { { 0xe4ac8b33070d3aabl,0x2643672b9a2cd5e5l,0x52eff79b1cfc9173l,
23356             0x665ca49b90a7c13fl },
23357           { 0x5a8dda59b3efb998l,0x8a5b922d052f1341l,0xae9ebbab3cf9a530l,
23358             0x35986e7bf56da4d7l },
23359           0 },
23360         /* 17 << 168 */
23361         { { 0x3a636b5cff3513ccl,0xbb0cf8ba3198f7ddl,0xb8d4052241f16f86l,
23362             0x760575d8de13a7bfl },
23363           { 0x36f74e169f7aa181l,0x163a3ecff509ed1cl,0x6aead61f3c40a491l,
23364             0x158c95fcdfe8fcaal },
23365           0 },
23366         /* 19 << 168 */
23367         { { 0x6b47accdd9eee96cl,0x0ca277fbe58cec37l,0x113fe413e702c42al,
23368             0xdd1764eec47cbe51l },
23369           { 0x041e7cde7b3ed739l,0x50cb74595ce9e1c0l,0x355685132925b212l,
23370             0x7cff95c4001b081cl },
23371           0 },
23372         /* 21 << 168 */
23373         { { 0x726f0973da50c991l,0x48afcd5b822d6ee2l,0xe5fc718b20fd7771l,
23374             0xb9e8e77dfd0807a1l },
23375           { 0x7f5e0f4499a7703dl,0x6972930e618e36f3l,0x2b7c77b823807bbel,
23376             0xe5b82405cb27ff50l },
23377           0 },
23378         /* 23 << 168 */
23379         { { 0x98cb1ae9255c0980l,0x4bd863812b4a739fl,0x5a5c31e11e4a45a1l,
23380             0x1e5d55fe9cb0db2fl },
23381           { 0x74661b068ff5cc29l,0x026b389f0eb8a4f4l,0x536b21a458848c24l,
23382             0x2e5bf8ec81dc72b0l },
23383           0 },
23384         /* 25 << 168 */
23385         { { 0x9f0af483d309cbe6l,0x5b020d8ae0bced4fl,0x606e986db38023e3l,
23386             0xad8f2c9d1abc6933l },
23387           { 0x19292e1de7400e93l,0xfe3e18a952be5e4dl,0xe8e9771d2e0680bfl,
23388             0x8c5bec98c54db063l },
23389           0 },
23390         /* 27 << 168 */
23391         { { 0x4c23f62a2c160dcdl,0x34e6c5e38f90eaefl,0x35865519a9a65d5al,
23392             0x07c48aae8fd38a3dl },
23393           { 0xb7e7aeda50068527l,0x2c09ef231c90936al,0x31ecfeb6e879324cl,
23394             0xa0871f6bfb0ec938l },
23395           0 },
23396         /* 28 << 168 */
23397         { { 0xb1f0fb68d84d835dl,0xc90caf39861dc1e6l,0x12e5b0467594f8d7l,
23398             0x26897ae265012b92l },
23399           { 0xbcf68a08a4d6755dl,0x403ee41c0991fbdal,0x733e343e3bbf17e8l,
23400             0xd2c7980d679b3d65l },
23401           0 },
23402         /* 29 << 168 */
23403         { { 0x33056232d2e11305l,0x966be492f3c07a6fl,0x6a8878ffbb15509dl,
23404             0xff2211010a9b59a4l },
23405           { 0x6c9f564aabe30129l,0xc6f2c940336e64cfl,0x0fe752628b0c8022l,
23406             0xbe0267e96ae8db87l },
23407           0 },
23408         /* 31 << 168 */
23409         { { 0x9d031369a5e829e5l,0xcbb4c6fc1607aa41l,0x75ac59a6241d84c1l,
23410             0xc043f2bf8829e0eel },
23411           { 0x82a38f758ea5e185l,0x8bda40b9d87cbd9fl,0x9e65e75e2d8fc601l,
23412             0x3d515f74a35690b3l },
23413           0 },
23414         /* 33 << 168 */
23415         { { 0xf6b5b2d0bc8fa5bcl,0x8a5ead67500c277bl,0x214625e6dfa08a5dl,
23416             0x51fdfedc959cf047l },
23417           { 0x6bc9430b289fca32l,0xe36ff0cf9d9bdc3fl,0x2fe187cb58ea0edel,
23418             0xed66af205a900b3fl },
23419           0 },
23420         /* 34 << 168 */
23421         { { 0x00e0968b5fa9f4d6l,0x2d4066ce37a362e7l,0xa99a9748bd07e772l,
23422             0x710989c006a4f1d0l },
23423           { 0xd5dedf35ce40cbd8l,0xab55c5f01743293dl,0x766f11448aa24e2cl,
23424             0x94d874f8605fbcb4l },
23425           0 },
23426         /* 35 << 168 */
23427         { { 0xa365f0e8a518001bl,0xee605eb69d04ef0fl,0x5a3915cdba8d4d25l,
23428             0x44c0e1b8b5113472l },
23429           { 0xcbb024e88b6740dcl,0x89087a53ee1d4f0cl,0xa88fa05c1fc4e372l,
23430             0x8bf395cbaf8b3af2l },
23431           0 },
23432         /* 36 << 168 */
23433         { { 0x1e71c9a1deb8568bl,0xa35daea080fb3d32l,0xe8b6f2662cf8fb81l,
23434             0x6d51afe89490696al },
23435           { 0x81beac6e51803a19l,0xe3d24b7f86219080l,0x727cfd9ddf6f463cl,
23436             0x8c6865ca72284ee8l },
23437           0 },
23438         /* 37 << 168 */
23439         { { 0x32c88b7db743f4efl,0x3793909be7d11dcel,0xd398f9222ff2ebe8l,
23440             0x2c70ca44e5e49796l },
23441           { 0xdf4d9929cb1131b1l,0x7826f29825888e79l,0x4d3a112cf1d8740al,
23442             0x00384cb6270afa8bl },
23443           0 },
23444         /* 39 << 168 */
23445         { { 0xbe7e990ff0d796a0l,0x5fc62478df0e8b02l,0x8aae8bf4030c00adl,
23446             0x3d2db93b9004ba0fl },
23447           { 0xe48c8a79d85d5ddcl,0xe907caa76bb07f34l,0x58db343aa39eaed5l,
23448             0x0ea6e007adaf5724l },
23449           0 },
23450         /* 40 << 168 */
23451         { { 0xe00df169d23233f3l,0x3e32279677cb637fl,0x1f897c0e1da0cf6cl,
23452             0xa651f5d831d6bbddl },
23453           { 0xdd61af191a230c76l,0xbd527272cdaa5e4al,0xca753636d0abcd7el,
23454             0x78bdd37c370bd8dcl },
23455           0 },
23456         /* 41 << 168 */
23457         { { 0xc23916c217cd93fel,0x65b97a4ddadce6e2l,0xe04ed4eb174e42f8l,
23458             0x1491ccaabb21480al },
23459           { 0x145a828023196332l,0x3c3862d7587b479al,0x9f4a88a301dcd0edl,
23460             0x4da2b7ef3ea12f1fl },
23461           0 },
23462         /* 43 << 168 */
23463         { { 0x71965cbfc3dd9b4dl,0xce23edbffc068a87l,0xb78d4725745b029bl,
23464             0x74610713cefdd9bdl },
23465           { 0x7116f75f1266bf52l,0x0204672218e49bb6l,0xdf43df9f3d6f19e3l,
23466             0xef1bc7d0e685cb2fl },
23467           0 },
23468         /* 44 << 168 */
23469         { { 0xcddb27c17078c432l,0xe1961b9cb77fedb7l,0x1edc2f5cc2290570l,
23470             0x2c3fefca19cbd886l },
23471           { 0xcf880a36c2af389al,0x96c610fdbda71ceal,0xf03977a932aa8463l,
23472             0x8eb7763f8586d90al },
23473           0 },
23474         /* 45 << 168 */
23475         { { 0x3f3424542a296e77l,0xc871868342837a35l,0x7dc710906a09c731l,
23476             0x54778ffb51b816dbl },
23477           { 0x6b33bfecaf06defdl,0xfe3c105f8592b70bl,0xf937fda461da6114l,
23478             0x3c13e6514c266ad7l },
23479           0 },
23480         /* 46 << 168 */
23481         { { 0xe363a829855938e8l,0x2eeb5d9e9de54b72l,0xbeb93b0e20ccfab9l,
23482             0x3dffbb5f25e61a25l },
23483           { 0x7f655e431acc093dl,0x0cb6cc3d3964ce61l,0x6ab283a1e5e9b460l,
23484             0x55d787c5a1c7e72dl },
23485           0 },
23486         /* 47 << 168 */
23487         { { 0x4d2efd47deadbf02l,0x11e80219ac459068l,0x810c762671f311f0l,
23488             0xfa17ef8d4ab6ef53l },
23489           { 0xaf47fd2593e43bffl,0x5cb5ff3f0be40632l,0x546871068ee61da3l,
23490             0x7764196eb08afd0fl },
23491           0 },
23492         /* 48 << 168 */
23493         { { 0x831ab3edf0290a8fl,0xcae81966cb47c387l,0xaad7dece184efb4fl,
23494             0xdcfc53b34749110el },
23495           { 0x6698f23c4cb632f9l,0xc42a1ad6b91f8067l,0xb116a81d6284180al,
23496             0xebedf5f8e901326fl },
23497           0 },
23498         /* 49 << 168 */
23499         { { 0xf2274c9f97e3e044l,0x4201852011d09fc9l,0x56a65f17d18e6e23l,
23500             0x2ea61e2a352b683cl },
23501           { 0x27d291bc575eaa94l,0x9e7bc721b8ff522dl,0x5f7268bfa7f04d6fl,
23502             0x5868c73faba41748l },
23503           0 },
23504         /* 51 << 168 */
23505         { { 0x1c52e63596e78cc4l,0x5385c8b20c06b4a8l,0xd84ddfdbb0e87d03l,
23506             0xc49dfb66934bafadl },
23507           { 0x7071e17059f70772l,0x3a073a843a1db56bl,0x034949033b8af190l,
23508             0x7d882de3d32920f0l },
23509           0 },
23510         /* 52 << 168 */
23511         { { 0x91633f0ab2cf8940l,0x72b0b1786f948f51l,0x2d28dc30782653c8l,
23512             0x88829849db903a05l },
23513           { 0xb8095d0c6a19d2bbl,0x4b9e7f0c86f782cbl,0x7af739882d907064l,
23514             0xd12be0fe8b32643cl },
23515           0 },
23516         /* 53 << 168 */
23517         { { 0x358ed23d0e165dc3l,0x3d47ce624e2378cel,0x7e2bb0b9feb8a087l,
23518             0x3246e8aee29e10b9l },
23519           { 0x459f4ec703ce2b4dl,0xe9b4ca1bbbc077cfl,0x2613b4f20e9940c1l,
23520             0xfc598bb9047d1eb1l },
23521           0 },
23522         /* 55 << 168 */
23523         { { 0x52fb0c9d7fc63668l,0x6886c9dd0c039cdel,0x602bd59955b22351l,
23524             0xb00cab02360c7c13l },
23525           { 0x8cb616bc81b69442l,0x41486700b55c3ceel,0x71093281f49ba278l,
23526             0xad956d9c64a50710l },
23527           0 },
23528         /* 57 << 168 */
23529         { { 0xbaca6591d4b66947l,0xb452ce9804460a8cl,0x6830d24643768f55l,
23530             0xf4197ed87dff12dfl },
23531           { 0x6521b472400dd0f7l,0x59f5ca8f4b1e7093l,0x6feff11b080338ael,
23532             0x0ada31f6a29ca3c6l },
23533           0 },
23534         /* 59 << 168 */
23535         { { 0x04e5dfe0d809c7bdl,0xd7b2580c8f1050abl,0x6d91ad78d8a4176fl,
23536             0x0af556ee4e2e897cl },
23537           { 0x162a8b73921de0acl,0x52ac9c227ea78400l,0xee2a4eeaefce2174l,
23538             0xbe61844e6d637f79l },
23539           0 },
23540         /* 60 << 168 */
23541         { { 0x0491f1bc789a283bl,0x72d3ac3d880836f4l,0xaa1c5ea388e5402dl,
23542             0x1b192421d5cc473dl },
23543           { 0x5c0b99989dc84cacl,0xb0a8482d9c6e75b8l,0x639961d03a191ce2l,
23544             0xda3bc8656d837930l },
23545           0 },
23546         /* 61 << 168 */
23547         { { 0xca990653056e6f8fl,0x84861c4164d133a7l,0x8b403276746abe40l,
23548             0xb7b4d51aebf8e303l },
23549           { 0x05b43211220a255dl,0xc997152c02419e6el,0x76ff47b6630c2feal,
23550             0x50518677281fdadel },
23551           0 },
23552         /* 63 << 168 */
23553         { { 0x6d2d99b7ea7b979bl,0xcd78cd74e6fb3bcdl,0x11e45a9e86cffbfel,
23554             0x78a61cf4637024f6l },
23555           { 0xd06bc8723d502295l,0xf1376854458cb288l,0xb9db26a1342f8586l,
23556             0xf33effcf4beee09el },
23557           0 },
23558         /* 64 << 168 */
23559         { { 0xd7e0c4cdb30cfb3al,0x6d09b8c16c9db4c8l,0x40ba1a4207c8d9dfl,
23560             0x6fd495f71c52c66dl },
23561           { 0xfb0e169f275264dal,0x80c2b746e57d8362l,0xedd987f749ad7222l,
23562             0xfdc229af4398ec7bl },
23563           0 },
23564         /* 65 << 168 */
23565         { { 0xfe81af4609418a51l,0xdbb60b836f18e3a5l,0x5e7a86ea4566ec9cl,
23566             0xb76ff40f25093925l },
23567           { 0x5fe6662c429c5554l,0xfc9ec35384e478cfl,0x73dbb5f3e8cfa761l,
23568             0x031e506592f82709l },
23569           0 },
23570         /* 71 << 168 */
23571         { { 0x108c736abd49f2e0l,0xe230f2417487dcc8l,0x073fc4f8f74d939cl,
23572             0x98532487e9745bbel },
23573           { 0x5208eb981714b10bl,0xec35d0510458725dl,0x35dbb60bf203f4b6l,
23574             0x064299b27781ab38l },
23575           0 },
23576         /* 77 << 168 */
23577         { { 0x43cc7bbc02d26929l,0xeb00a683162d9607l,0x2af152b8ed9fa224l,
23578             0xf24e8bee12257f0cl },
23579           { 0xdf065dd5d004b1cbl,0x6aa20bcf9f9908c6l,0x8e5e86b6941c593dl,
23580             0x0e0034b398969717l },
23581           0 },
23582         /* 83 << 168 */
23583         { { 0x5be62e155c43b8fcl,0xd9e0adfc3c445636l,0xc5141df0e0d78f48l,
23584             0xd134bbed2c277716l },
23585           { 0x79033a84598fe069l,0x6c704367b081614cl,0x55c45d66bf5bf772l,
23586             0xf08744c57a444730l },
23587           0 },
23588         /* 89 << 168 */
23589         { { 0x866752091422b528l,0xdb297411c3e028eel,0x1f5575b040e1c3ccl,
23590             0x85367b84d333b04fl },
23591           { 0x57864c86e9804aa9l,0xf13fa8e3439156dfl,0xa3b337e0464e0aecl,
23592             0x0018dfd7f2ae382bl },
23593           0 },
23594         /* 95 << 168 */
23595         { { 0xe93cece9cea132fcl,0x985542d8f74e867al,0x2a3d18a5cc8fcf87l,
23596             0xa0561055479d0039l },
23597           { 0x3513c7eaac4b3f9dl,0xc095967256477606l,0xa63960f330df8ad6l,
23598             0x59ca8d53cc9ddcb3l },
23599           0 },
23600         /* 101 << 168 */
23601         { { 0x6d8e942b2f208191l,0xd49a6d9453fe5457l,0x2b55e391003010bal,
23602             0x3dd1fd9fdf4605ebl },
23603           { 0xdc006a3358682886l,0x60a5e86c1bd9ac88l,0xc4bd320ed0cab8f2l,
23604             0x7281e7cb7751855bl },
23605           0 },
23606         /* 107 << 168 */
23607         { { 0x7d564222e1881e7al,0x59061a89db0673c2l,0x1f9d607213f27313l,
23608             0x5b3b29368ff3aeb7l },
23609           { 0x6cf2304ccf969f43l,0x8eff4a25e7f69ae5l,0xbaeb6411d17da4ffl,
23610             0x666af0af9eea17ecl },
23611           0 },
23612         /* 113 << 168 */
23613         { { 0x6c0b811697f4cd0bl,0xcd7825d40e4ea852l,0x80158fb0677fef3dl,
23614             0x5bb1a3aaa10ee693l },
23615           { 0xc5df66678066fc9bl,0x3200dc11f404d4a6l,0x58868950a8686d8el,
23616             0xbdaaffb53770fabal },
23617           0 },
23618         /* 116 << 168 */
23619         { { 0xba6a9f84660326f5l,0x61c1e44161bc3e88l,0xfbf992a0bde85cf8l,
23620             0xe704dd1e6f8c8f5fl },
23621           { 0x231caa0ab1d7d486l,0xd10616d8891cd571l,0x2ddada75c008833cl,
23622             0x44337d6dad514c94l },
23623           0 },
23624         /* 119 << 168 */
23625         { { 0xd48678b8f6933cf0l,0x7b4d623e0b739471l,0x4ad620287b216238l,
23626             0xb4d4918959c4fabel },
23627           { 0x8c2a1bdc296d42d5l,0x9235d0ec2fd3eb96l,0xfe271972f81c135bl,
23628             0x82b5181741471e16l },
23629           0 },
23630         /* 125 << 168 */
23631         { { 0xe9aa8ce4051f8e81l,0x14484af67cd1391fl,0x53a361dcafb1656el,
23632             0x6ad8ba02f4d9d0cbl },
23633           { 0xfb4385466c50a722l,0x2f1c5bbc7edb37f4l,0x8dc90ccb16e4b795l,
23634             0xbcb32e1508127094l },
23635           0 },
23636     },
23637     {
23638         /* 0 << 176 */
23639         { { 0x00, 0x00, 0x00, 0x00 },
23640           { 0x00, 0x00, 0x00, 0x00 },
23641           1 },
23642         /* 1 << 176 */
23643         { { 0xb81d783e979f3925l,0x1efd130aaf4c89a7l,0x525c2144fd1bf7fal,
23644             0x4b2969041b265a9el },
23645           { 0xed8e9634b9db65b6l,0x35c82e3203599d8al,0xdaa7a54f403563f3l,
23646             0x9df088ad022c38abl },
23647           0 },
23648         /* 3 << 176 */
23649         { { 0x9e93ba24f111661el,0xedced484b105eb04l,0x96dc9ba1f424b578l,
23650             0xbf8f66b7e83e9069l },
23651           { 0x872d4df4d7ed8216l,0xbf07f3778e2cbecfl,0x4281d89998e73754l,
23652             0xfec85fbb8aab8708l },
23653           0 },
23654         /* 4 << 176 */
23655         { { 0x13b5bf22765fa7d0l,0x59805bf01d6a5370l,0x67a5e29d4280db98l,
23656             0x4f53916f776b1ce3l },
23657           { 0x714ff61f33ddf626l,0x4206238ea085d103l,0x1c50d4b7e5809ee3l,
23658             0x999f450d85f8eb1dl },
23659           0 },
23660         /* 5 << 176 */
23661         { { 0x82eebe731a3a93bcl,0x42bbf465a21adc1al,0xc10b6fa4ef030efdl,
23662             0x247aa4c787b097bbl },
23663           { 0x8b8dc632f60c77dal,0x6ffbc26ac223523el,0xa4f6ff11344579cfl,
23664             0x5825653c980250f6l },
23665           0 },
23666         /* 7 << 176 */
23667         { { 0xeda6c595d314e7bcl,0x2ee7464b467899edl,0x1cef423c0a1ed5d3l,
23668             0x217e76ea69cc7613l },
23669           { 0x27ccce1fe7cda917l,0x12d8016b8a893f16l,0xbcd6de849fc74f6bl,
23670             0xfa5817e2f3144e61l },
23671           0 },
23672         /* 9 << 176 */
23673         { { 0xc0b48d4e49ccd6d7l,0xff8fb02c88bd5580l,0xc75235e907d473b2l,
23674             0x4fab1ac5a2188af3l },
23675           { 0x030fa3bc97576ec0l,0xe8c946e80b7e7d2fl,0x40a5c9cc70305600l,
23676             0x6d8260a9c8b013b4l },
23677           0 },
23678         /* 10 << 176 */
23679         { { 0xe6c51073615cd9e4l,0x498ec047f1243c06l,0x3e5a8809b17b3d8cl,
23680             0x5cd99e610cc565f1l },
23681           { 0x81e312df7851dafel,0xf156f5baa79061e2l,0x80d62b71880c590el,
23682             0xbec9746f0a39faa1l },
23683           0 },
23684         /* 11 << 176 */
23685         { { 0x2b09d2c3cfdcf7ddl,0x41a9fce3723fcab4l,0x73d905f707f57ca3l,
23686             0x080f9fb1ac8e1555l },
23687           { 0x7c088e849ba7a531l,0x07d35586ed9a147fl,0x602846abaf48c336l,
23688             0x7320fd320ccf0e79l },
23689           0 },
23690         /* 13 << 176 */
23691         { { 0x92eb40907f8f875dl,0x9c9d754e56c26bbfl,0x158cea618110bbe7l,
23692             0x62a6b802745f91eal },
23693           { 0xa79c41aac6e7394bl,0x445b6a83ad57ef10l,0x0c5277eb6ea6f40cl,
23694             0x319fe96b88633365l },
23695           0 },
23696         /* 15 << 176 */
23697         { { 0x77f84203d39b8c34l,0xed8b1be63125eddbl,0x5bbf2441f6e39dc5l,
23698             0xb00f6ee66a5d678al },
23699           { 0xba456ecf57d0ea99l,0xdcae0f5817e06c43l,0x01643de40f5b4baal,
23700             0x2c324341d161b9bel },
23701           0 },
23702         /* 16 << 176 */
23703         { { 0x949c9976e1337c26l,0x6faadebdd73d68e5l,0x9e158614f1b768d9l,
23704             0x22dfa5579cc4f069l },
23705           { 0xccd6da17be93c6d6l,0x24866c61a504f5b9l,0x2121353c8d694da1l,
23706             0x1c6ca5800140b8c6l },
23707           0 },
23708         /* 17 << 176 */
23709         { { 0x4e77c5575b45afb4l,0xe9ded649efb8912dl,0x7ec9bbf542f6e557l,
23710             0x2570dfff62671f00l },
23711           { 0x2b3bfb7888e084bdl,0xa024b238f37fe5b4l,0x44e7dc0495649aeel,
23712             0x498ca2555e7ec1d8l },
23713           0 },
23714         /* 19 << 176 */
23715         { { 0x2e44d22526a1fc90l,0x0d6d10d24d70705dl,0xd94b6b10d70c45f4l,
23716             0x0f201022b216c079l },
23717           { 0xcec966c5658fde41l,0xa8d2bc7d7e27601dl,0xbfcce3e1ff230be7l,
23718             0x3394ff6b0033ffb5l },
23719           0 },
23720         /* 21 << 176 */
23721         { { 0x05d99be8b9c20cdal,0x89f7aad5d5cd0c98l,0x7ef936fe5bb94183l,
23722             0x92ca0753b05cd7f2l },
23723           { 0x9d65db1174a1e035l,0x02628cc813eaea92l,0xf2d9e24249e4fbf2l,
23724             0x94fdfd9be384f8b7l },
23725           0 },
23726         /* 23 << 176 */
23727         { { 0x29882d7c98379d44l,0xd000bdfb509edc8al,0xc6f95979e66fe464l,
23728             0x504a6115fa61bde0l },
23729           { 0x56b3b871effea31al,0x2d3de26df0c21a54l,0x21dbff31834753bfl,
23730             0xe67ecf4969269d86l },
23731           0 },
23732         /* 25 << 176 */
23733         { { 0xed29a56da16d4b34l,0x7fba9d09dca21c4fl,0x66d7ac006d8de486l,
23734             0x6006198773a2a5e1l },
23735           { 0x8b400f869da28ff0l,0x3133f70843c4599cl,0x9911c9b8ee28cb0dl,
23736             0xcd7e28748e0af61dl },
23737           0 },
23738         /* 27 << 176 */
23739         { { 0x6a7bb6a93b5bdb83l,0x08da65c0a4a72318l,0xc58d22aa63eb065fl,
23740             0x1717596c1b15d685l },
23741           { 0x112df0d0b266d88bl,0xf688ae975941945al,0x487386e37c292cacl,
23742             0x42f3b50d57d6985cl },
23743           0 },
23744         /* 28 << 176 */
23745         { { 0x69e3be0427596893l,0xb6bb02a645bf452bl,0x0875c11af4c698c8l,
23746             0x6652b5c7bece3794l },
23747           { 0x7b3755fd4f5c0499l,0x6ea16558b5532b38l,0xd1c69889a2e96ef7l,
23748             0x9c773c3a61ed8f48l },
23749           0 },
23750         /* 29 << 176 */
23751         { { 0x5a304ada8545d185l,0x82ae44ea738bb8cbl,0x628a35e3df87e10el,
23752             0xd3624f3da15b9fe3l },
23753           { 0xcc44209b14be4254l,0x7d0efcbcbdbc2ea5l,0x1f60336204c37bbel,
23754             0x21f363f556a5852cl },
23755           0 },
23756         /* 31 << 176 */
23757         { { 0x81262e4225346689l,0x716da290b07c7004l,0x35f911eab7950ee3l,
23758             0x6fd72969261d21b5l },
23759           { 0x5238980308b640d3l,0x5b0026ee887f12a1l,0x20e21660742e9311l,
23760             0x0ef6d5415ff77ff7l },
23761           0 },
23762         /* 33 << 176 */
23763         { { 0x64aa0874925dd0b0l,0x5ffd503851c474c6l,0x4478c72c8ebd4157l,
23764             0xb98694cb8c8375e2l },
23765           { 0xeda4edeecd8e208cl,0xf98a053d2c0670a6l,0x564bd3057f346b9dl,
23766             0xafbbf3e94c318fddl },
23767           0 },
23768         /* 34 << 176 */
23769         { { 0x8a03410aa96c4685l,0xef1b6b16a978a31bl,0x44738a3b629df6cfl,
23770             0xa1dc65da807713e9l },
23771           { 0x569cc7884c373442l,0x1f30a2464965fb52l,0x56822f1677ff5e2el,
23772             0x63f18812e303748bl },
23773           0 },
23774         /* 35 << 176 */
23775         { { 0x2abdc403dd0983ecl,0xec0c08c7f365c6f5l,0xe555083fbdb66b8bl,
23776             0x593685bc4e8973ffl },
23777           { 0x737df3f920e9c705l,0x00c7bcc309c31a5al,0x5f1d23e2efdcb34dl,
23778             0x79d9b382470f7949l },
23779           0 },
23780         /* 36 << 176 */
23781         { { 0x44a315645fd2eb1dl,0x4e7397263fdd1356l,0x9b96735463200efel,
23782             0xcb70402e520bbb6al },
23783           { 0xcbc90d7e693d2642l,0x6fb00064bc9b4002l,0x95f2eab3d96f7150l,
23784             0xb1619e3fe035f47al },
23785           0 },
23786         /* 37 << 176 */
23787         { { 0xd22d6073d1561bb7l,0x40666e4ba9928683l,0x90654dab8ab3f9b1l,
23788             0x7625c507b8773421l },
23789           { 0x288f28220ca88cd2l,0xbb88114ed8d005c1l,0xbeec2b0af603a11bl,
23790             0x8fdda60325f7949el },
23791           0 },
23792         /* 39 << 176 */
23793         { { 0x6503632d6ee4f1d0l,0xd5449747ea394840l,0xd696167a8abe13a1l,
23794             0xc080f76e609ebaa9l },
23795           { 0x181acf0c10aa70d6l,0x70614461291e5e50l,0x7ade8e84b9f0c0a3l,
23796             0xef1de9f2cb11b41el },
23797           0 },
23798         /* 40 << 176 */
23799         { { 0x2d5c3c848e592413l,0x727022961832ba2cl,0x22979b51596c6321l,
23800             0x738f31cb5a04db64l },
23801           { 0x0bdaa6ca98f84ee5l,0x4e9e827c15e21eeel,0x4c59dbcc3ea632e0l,
23802             0xed3404db5bc6f027l },
23803           0 },
23804         /* 41 << 176 */
23805         { { 0x2841f05cfbaf8b26l,0xac9830db5b243770l,0xde3ab1707787f324l,
23806             0x1ee12efe079209bcl },
23807           { 0x2d3fd62d5bcf6e3cl,0x8a680655d60b0582l,0xdafc5061bc2b64a1l,
23808             0xe0d91e7526a88788l },
23809           0 },
23810         /* 43 << 176 */
23811         { { 0x2d49c685426b1b1el,0x6c2149caeabb02f7l,0xa4697d7fde11984fl,
23812             0xa0e32fb3ed3c8707l },
23813           { 0xb783e825f4ca12dal,0xb2666e2448770a50l,0x82d47f478660e923l,
23814             0x6e36cd71fb4a984fl },
23815           0 },
23816         /* 44 << 176 */
23817         { { 0x3295a8ea43c66b92l,0x99387af6ac5d19d4l,0x545f9b1b8e9d2090l,
23818             0x138b1c4c2660f530l },
23819           { 0xbfb05fd2ff872627l,0xb6614b0f4c3bc45cl,0x13defece62ca0fb0l,
23820             0x82ddae134fededd8l },
23821           0 },
23822         /* 45 << 176 */
23823         { { 0x5a34499b871c4cbbl,0x3ab0e69a2eb6084bl,0xa8d0160025ef7755l,
23824             0x5db8f611d9e70f5dl },
23825           { 0x63f9eb9a7afa95d7l,0x328b97f9706d7964l,0x8bcf9a0f4b71dfcal,
23826             0x53d4c3042a5c7934l },
23827           0 },
23828         /* 46 << 176 */
23829         { { 0x0c87dd3a8768d9aal,0x201ce5a082f6a55fl,0xa3de6f3049ca4602l,
23830             0x36f421422aeb5f17l },
23831           { 0x5c9962399817b77al,0x2584a10ae8d165acl,0x80f683d0c726f4aal,
23832             0x524307502dcdfa48l },
23833           0 },
23834         /* 47 << 176 */
23835         { { 0x0c04399f94683df2l,0x0978e9d4e954838dl,0x01faa5e8cf4a7a7bl,
23836             0x92f6e6a90dae61cfl },
23837           { 0x0c0f1293373dc957l,0x8320178fd8cc6b67l,0x4af977ed4b6444f2l,
23838             0xd8c9a401ad8e5f84l },
23839           0 },
23840         /* 48 << 176 */
23841         { { 0xbd5660ed9aed9f40l,0x70ca6ad1532a8c99l,0xc4978bfb95c371eal,
23842             0xe5464d0d7003109dl },
23843           { 0x1af32fdfd9e535efl,0xabf57ea798c9185bl,0xed7a741712b42488l,
23844             0x8e0296a7e97286fal },
23845           0 },
23846         /* 49 << 176 */
23847         { { 0x79ee35ac16fca804l,0x8f16e6165f59782el,0x8fbef1011737694el,
23848             0xb34b7625462be08bl },
23849           { 0x7e63e1b016e75c91l,0xb6a18edd2d23728dl,0xcf761a1e7f299ab6l,
23850             0x796dcdebf16c770el },
23851           0 },
23852         /* 51 << 176 */
23853         { { 0x47354f22308ee4afl,0x96959a538ecd6f4bl,0xf60b5f104055cbd2l,
23854             0x04b1c9599bd86095l },
23855           { 0x26accd8486008564l,0x46b2fe0478f31ea7l,0x5500dbf72dd76f23l,
23856             0x36bcdf584c496c6fl },
23857           0 },
23858         /* 52 << 176 */
23859         { { 0x8836cd431527d7cel,0x1f236623187a50eal,0x6470c0ae847221f0l,
23860             0xc61f86b47e449110l },
23861           { 0x7cc9cc20fa9fcec1l,0xa394903019134349l,0xafe5a08ff53ab467l,
23862             0x9caba02301ed2919l },
23863           0 },
23864         /* 53 << 176 */
23865         { { 0xffecbdce406abf1el,0x0ef4bcd73ae340d4l,0x7e37bae0e19d5613l,
23866             0xe191669be4c6e97al },
23867           { 0x9fafe59797292db7l,0xab7ef3713172d716l,0x9f0fff330ce3b533l,
23868             0xca94ff8f932dd8cfl },
23869           0 },
23870         /* 55 << 176 */
23871         { { 0x659c8b5d78aea69el,0xdde7ab46476a8fb9l,0x26bfe303bd01b5e6l,
23872             0xf3dfb08a726a937cl },
23873           { 0xe7a591fa0a263670l,0xe872c3f8f97434a0l,0x4881a82e2e0f2c21l,
23874             0x17624e48788ef958l },
23875           0 },
23876         /* 57 << 176 */
23877         { { 0xd526d66da7222e5bl,0xd33bb78efeb00e25l,0x9a7d670b932c8d08l,
23878             0xea31e5273cee093fl },
23879           { 0x55cc091bd04b7a43l,0x12b08d6dd01a123dl,0x1d98a6467fb0e7bal,
23880             0xdabb09483535fd0dl },
23881           0 },
23882         /* 59 << 176 */
23883         { { 0x2862314d08b69b19l,0x9cf302e191effcfal,0x43bdc8462ead917al,
23884             0x21b238bbf94b3d8fl },
23885           { 0xa3736160e2f465d3l,0x4d7fb6818541e255l,0x46fa089a23551edcl,
23886             0xf7c41d17c1fefa8cl },
23887           0 },
23888         /* 60 << 176 */
23889         { { 0x8ed0807fed113000l,0x8e1672d04c691484l,0x33a13ab31ee86ca0l,
23890             0x9df0d9573bcaee4fl },
23891           { 0x0cf0c638ef0dfb71l,0x1e0fe22ac2c9510al,0x43f506716fcc6a21l,
23892             0xccb58404cec03a94l },
23893           0 },
23894         /* 61 << 176 */
23895         { { 0x59547e37fd0936c1l,0x81e0517df45140b1l,0xcc6ccd89ed49e3fcl,
23896             0xc2fa23eff3b897del },
23897           { 0x149511ef2050c80al,0xf66bea6b3140b833l,0xbbe1401e2786d723l,
23898             0x0aeb549c887509bcl },
23899           0 },
23900         /* 63 << 176 */
23901         { { 0xf938e85060f5867al,0x806e1fff72429adcl,0x5ff7962a45f43b52l,
23902             0xd8375ab6b2bbb403l },
23903           { 0x00d5819b21b287fcl,0x15c7190ebae37d58l,0x075ce5ce05fcfb07l,
23904             0x76368d06dbc003cbl },
23905           0 },
23906         /* 64 << 176 */
23907         { { 0x01079383171b445fl,0x9bcf21e38131ad4cl,0x8cdfe205c93987e8l,
23908             0xe63f4152c92e8c8fl },
23909           { 0x729462a930add43dl,0x62ebb143c980f05al,0x4f3954e53b06e968l,
23910             0xfe1d75ad242cf6b1l },
23911           0 },
23912         /* 65 << 176 */
23913         { { 0x1cf508197630655el,0x9b4685c408d417f5l,0x6ea942619b049259l,
23914             0x31c29b54fe73b755l },
23915           { 0x3d2872a1f1f2af17l,0xbcd1139956bcbc4bl,0x4d14f59890d7a85cl,
23916             0xd2c46040dbcbe998l },
23917           0 },
23918         /* 71 << 176 */
23919         { { 0x3c8a06ca9792c42al,0x92535628602460ddl,0xa95e13f2ddd4c676l,
23920             0xe823841d3b20d463l },
23921           { 0x0248605bbfad6051l,0x82985dd61af51233l,0x3d243a5cdef7d742l,
23922             0x0a88ce55ff6aa911l },
23923           0 },
23924         /* 77 << 176 */
23925         { { 0xcf5b5962449aec98l,0x40322a6531a41389l,0xcd15606fd72c0527l,
23926             0xfe91eac7b90d65a0l },
23927           { 0xcd32415487636360l,0x82f2c7bdfc653a6fl,0xd04d138ae315ce7cl,
23928             0x40ebfd5e78118dbcl },
23929           0 },
23930         /* 83 << 176 */
23931         { { 0x0f9ea6ae4144660fl,0x02345c6513279b25l,0x139497b65c7671cbl,
23932             0x7259f14b2ebed1d5l },
23933           { 0xa1e5d98ce9b29988l,0xaed0efcd8df73ac8l,0x88339f073b81a77cl,
23934             0x28f2bbca7109c8a6l },
23935           0 },
23936         /* 89 << 176 */
23937         { { 0xa264f99d811472ddl,0x0e7eae0afc07a80cl,0x77f264d4a683cdc6l,
23938             0x0512df49d053c668l },
23939           { 0x2b4dfbade61dea15l,0x83de61acfd74890al,0xd2552bab32d41182l,
23940             0x1fb9411435924e6al },
23941           0 },
23942         /* 95 << 176 */
23943         { { 0x85efe53ade23c988l,0x89d41dbbf897f91bl,0x1357f91e7873fa8dl,
23944             0x7a6ec2e3718d911cl },
23945           { 0xf9e4f92e8f209a01l,0x4ffb96a70fdd67f3l,0x4c81a787f83dde1cl,
23946             0x0d68fce15e163b60l },
23947           0 },
23948         /* 101 << 176 */
23949         { { 0xbc79b4b26ab6da9dl,0xb4be5c278bb005f1l,0x63624530cd3b280bl,
23950             0x543142f04e880026l },
23951           { 0xbf7fb14cad90ddbfl,0xfe456e8a3966732dl,0x85499fb987ce35e9l,
23952             0x8af09e6b24f1305dl },
23953           0 },
23954         /* 107 << 176 */
23955         { { 0x5fc563ec16dc2b4bl,0xfe5631b25d0e535fl,0xbf4c489f9a93e36cl,
23956             0x56badff1da2a07c4l },
23957           { 0x72ac6b77fb7c5595l,0x4b25b9428e6645d9l,0xeeae127251f0657el,
23958             0x30779ca51abeb76bl },
23959           0 },
23960         /* 113 << 176 */
23961         { { 0x3d602ef5d909f43dl,0x2b2951a6bb347c79l,0x44903bfaa0d88896l,
23962             0xd4ab20e8684c104fl },
23963           { 0x55f70b4dd9b7e626l,0x084b3ee646a5f9ecl,0x1799cbe3da4ae81al,
23964             0xc7cfac937fd6b80fl },
23965           0 },
23966         /* 116 << 176 */
23967         { { 0x45647911ca20c525l,0x78f83186004706abl,0x5596377d97510538l,
23968             0x047863defe041f8cl },
23969           { 0xaea784896ec82367l,0x9d4eac2601eee8fcl,0xb32728f19b57d9dbl,
23970             0x60a158f5313c0f65l },
23971           0 },
23972         /* 119 << 176 */
23973         { { 0xf78caf129754377bl,0xa7fce16b6966f0c4l,0xfea937555a54a2b7l,
23974             0x52d7f79b7cdfe951l },
23975           { 0x3e14b92e94b1dac0l,0x363f2e5af168b73bl,0xcc0e9dcb6436a8c2l,
23976             0x2dbece4bb52cbd27l },
23977           0 },
23978         /* 125 << 176 */
23979         { { 0x7e7907ed8df38ffel,0xa68ec827e24e8a24l,0x5093a97e5f168732l,
23980             0xa9ffea2f39ebb6dbl },
23981           { 0x89e02c12284276d4l,0xc1179e3b3f9502d6l,0x01becb51d8f69eb6l,
23982             0x86eee2935eb1c73cl },
23983           0 },
23984     },
23985     {
23986         /* 0 << 184 */
23987         { { 0x00, 0x00, 0x00, 0x00 },
23988           { 0x00, 0x00, 0x00, 0x00 },
23989           1 },
23990         /* 1 << 184 */
23991         { { 0xf3b7963f4c830320l,0x842c7aa0903203e3l,0xaf22ca0ae7327afbl,
23992             0x38e13092967609b6l },
23993           { 0x73b8fb62757558f1l,0x3cc3e831f7eca8c1l,0xe4174474f6331627l,
23994             0xa77989cac3c40234l },
23995           0 },
23996         /* 3 << 184 */
23997         { { 0xb32cb8b0b796d219l,0xc3e95f4f34741dd9l,0x8721212568edf6f5l,
23998             0x7a03aee4a2b9cb8el },
23999           { 0x0cd3c376f53a89aal,0x0d8af9b1948a28dcl,0xcf86a3f4902ab04fl,
24000             0x8aacb62a7f42002dl },
24001           0 },
24002         /* 4 << 184 */
24003         { { 0xfd8e139f8f5fcda8l,0xf3e558c4bdee5bfdl,0xd76cbaf4e33f9f77l,
24004             0x3a4c97a471771969l },
24005           { 0xda27e84bf6dce6a7l,0xff373d9613e6c2d1l,0xf115193cd759a6e9l,
24006             0x3f9b702563d2262cl },
24007           0 },
24008         /* 5 << 184 */
24009         { { 0x9cb0ae6c252bd479l,0x05e0f88a12b5848fl,0x78f6d2b2a5c97663l,
24010             0x6f6e149bc162225cl },
24011           { 0xe602235cde601a89l,0xd17bbe98f373be1fl,0xcaf49a5ba8471827l,
24012             0x7e1a0a8518aaa116l },
24013           0 },
24014         /* 7 << 184 */
24015         { { 0x8b1e572235e6fc06l,0x3477728f0b3e13d5l,0x150c294daa8a7372l,
24016             0xc0291d433bfa528al },
24017           { 0xc6c8bc67cec5a196l,0xdeeb31e45c2e8a7cl,0xba93e244fb6e1c51l,
24018             0xb9f8b71b2e28e156l },
24019           0 },
24020         /* 9 << 184 */
24021         { { 0x343ac0a3ee9523f0l,0xbb75eab2975ea978l,0x1bccf332107387f4l,
24022             0x790f92599ab0062el },
24023           { 0xf1a363ad1e4f6a5fl,0x06e08b8462519a50l,0x609151877265f1eel,
24024             0x6a80ca3493ae985el },
24025           0 },
24026         /* 10 << 184 */
24027         { { 0xa3f4f521e447f2c4l,0x81b8da7a604291f0l,0xd680bc467d5926del,
24028             0x84f21fd534a1202fl },
24029           { 0x1d1e31814e9df3d8l,0x1ca4861a39ab8d34l,0x809ddeec5b19aa4al,
24030             0x59f72f7e4d329366l },
24031           0 },
24032         /* 11 << 184 */
24033         { { 0x2dfb9e08be0f4492l,0x3ff0da03e9d5e517l,0x03dbe9a1f79466a8l,
24034             0x0b87bcd015ea9932l },
24035           { 0xeb64fc83ab1f58abl,0x6d9598da817edc8al,0x699cff661d3b67e5l,
24036             0x645c0f2992635853l },
24037           0 },
24038         /* 13 << 184 */
24039         { { 0xd50e57c7d7fe71f3l,0x15342190bc97ce38l,0x51bda2de4df07b63l,
24040             0xba12aeae200eb87dl },
24041           { 0xabe135d2a9b4f8f6l,0x04619d65fad6d99cl,0x4a6683a77994937cl,
24042             0x7a778c8b6f94f09al },
24043           0 },
24044         /* 15 << 184 */
24045         { { 0x8dd1fb83425c6559l,0x7fc00ee60af06fdal,0xe98c922533d956dfl,
24046             0x0f1ef3354fbdc8a2l },
24047           { 0x2abb5145b79b8ea2l,0x40fd2945bdbff288l,0x6a814ac4d7185db7l,
24048             0xc4329d6fc084609al },
24049           0 },
24050         /* 16 << 184 */
24051         { { 0x511053e453544774l,0x834d0ecc3adba2bcl,0x4215d7f7bae371f5l,
24052             0xfcfd57bf6c8663bcl },
24053           { 0xded2383dd6901b1dl,0x3b49fbb4b5587dc3l,0xfd44a08d07625f62l,
24054             0x3ee4d65b9de9b762l },
24055           0 },
24056         /* 17 << 184 */
24057         { { 0x55ef9d3dcc26e8b0l,0xf869c827729b707al,0xdbbf450d8c47e00cl,
24058             0x73d546ea60972ed7l },
24059           { 0x9563e11f0dcd6821l,0xe48e1af57d80de7fl,0xbe7139b49057838dl,
24060             0xf3f0ad4d7e5ca535l },
24061           0 },
24062         /* 19 << 184 */
24063         { { 0xac66d1d49f8f8cc2l,0x43fe5c154ef18941l,0xbae77b6ddc30fcbfl,
24064             0xdb95ea7d945723b7l },
24065           { 0x43298e2bda8097e2l,0x8004167baf22ea9bl,0x9cf5974196a83d57l,
24066             0xb35c9aba3cf67d5el },
24067           0 },
24068         /* 21 << 184 */
24069         { { 0x0569a48df766f793l,0x6b4c7b16706b3442l,0xcc97754416ff41e0l,
24070             0x800c56e31fee2e86l },
24071           { 0xce0c3d0fcdf93450l,0x6ec3703582f35916l,0x902520d5bbc11e68l,
24072             0x7e2b988505078223l },
24073           0 },
24074         /* 23 << 184 */
24075         { { 0xb30d1769101da00bl,0xb26872d5113cfdb6l,0x7b0491da44e48db5l,
24076             0x810e73bb2013f8c9l },
24077           { 0xc86e579a570f0b59l,0xf34107e37a918f34l,0x49286d00277473f1l,
24078             0x74423f5abc85905dl },
24079           0 },
24080         /* 25 << 184 */
24081         { { 0x90d7417879de6b48l,0xe762caf0d14fa75bl,0xa309dcf3bd91ec5dl,
24082             0x7aafe1ddf526d04fl },
24083           { 0x76911342d39e36ffl,0xe28994d2fabb34b8l,0xac23a92c863110cbl,
24084             0x9f0f69673aabd166l },
24085           0 },
24086         /* 27 << 184 */
24087         { { 0x7436bdf47e333f98l,0x879cf31f2455af64l,0x07933a9cf6cfde92l,
24088             0xfcac38a5b6e3203fl },
24089           { 0xa39b6a8098e5a6e0l,0x1d600b5da4837528l,0x54718de7c32d412bl,
24090             0x02870f46317937ccl },
24091           0 },
24092         /* 28 << 184 */
24093         { { 0x1f13756db1761ec8l,0xe53c8b98a4b97e55l,0xb2aee3f84096cc28l,
24094             0x48c361a0920f1a8dl },
24095           { 0xa98b672d8c31190al,0x7bc1e7d1001855d4l,0x242cfb07bf3f4b2al,
24096             0x9bf44a3f32a28bc4l },
24097           0 },
24098         /* 29 << 184 */
24099         { { 0x96d4b271e36eeccdl,0x2d8c01b859237e23l,0x24f7a6eb8adf2653l,
24100             0xc08ac4ab41183d80l },
24101           { 0xc35e5bb7036367c3l,0xd8c97cbc0ba59f61l,0x296b1f4c5aafe986l,
24102             0xa519c7a17d179c37l },
24103           0 },
24104         /* 31 << 184 */
24105         { { 0x4043490790ae5f49l,0x8ac8f73649556b81l,0xb57a89b0f4e77a16l,
24106             0xe1a1565d071020eal },
24107           { 0x4a27f34d3dda8450l,0x65af18b9bc395814l,0xaf21939f9ff49991l,
24108             0x47e00639b4af7691l },
24109           0 },
24110         /* 33 << 184 */
24111         { { 0x4b3e263246b1f9b2l,0x6457d838efde99d3l,0x77d5142325e56171l,
24112             0xb45de3df7d54996cl },
24113           { 0x1ee2dd3194098d98l,0x986896141f3ebdc5l,0x2704a107997efb47l,
24114             0x96b502eecb11e520l },
24115           0 },
24116         /* 34 << 184 */
24117         { { 0x58c8039ec19f866el,0xc84c053e386c2644l,0xb3708ab049435704l,
24118             0x1b70c3c86fc47b24l },
24119           { 0x235582a27f095649l,0x0d344b66673c9a9el,0x777c9e71e2b00efdl,
24120             0x91691d6e5b877856l },
24121           0 },
24122         /* 35 << 184 */
24123         { { 0x11c663c49cd31e22l,0x46ae0bd95fb943d7l,0x6e36bca6a392fc01l,
24124             0x4f8cc3a77948716fl },
24125           { 0x10ae9d6b3aa4bbb0l,0xcc9b6cb5d8001a86l,0x012c8e3aa0a4ceedl,
24126             0xe462971e52274942l },
24127           0 },
24128         /* 36 << 184 */
24129         { { 0x9982e2ac42e176a5l,0x324eba46e2782b64l,0x3d8caaafe18350f5l,
24130             0xf3d82af2f5d674cal },
24131           { 0xc2090fed56600d1el,0x4548e0ef5950de07l,0xb2f0023f765a4febl,
24132             0xb303103339f16790l },
24133           0 },
24134         /* 37 << 184 */
24135         { { 0xb94095dc7bdacf7al,0x0e73db39509b310al,0x76e99a6b41b5f772l,
24136             0xef40e9c596f3dbd7l },
24137           { 0xd0d644f980f2179el,0xe0db831d5a89807el,0xa0188493c2a2d6c6l,
24138             0xf2d9a85e5ba9faa9l },
24139           0 },
24140         /* 39 << 184 */
24141         { { 0x598b7876cdd95b93l,0x5f7cc827336966e8l,0x01887109e797f102l,
24142             0x665671c446c7c296l },
24143           { 0xb314793c6e019c72l,0x5a6c81580e0329acl,0x4faf2f1b44281b98l,
24144             0x825884072e1fc97el },
24145           0 },
24146         /* 40 << 184 */
24147         { { 0xa692781d61a3c8b3l,0x08bc385432876d0el,0xbecf05fb28027b03l,
24148             0x636c687da4b1e12fl },
24149           { 0x00e3003d07217c58l,0x613ba9375e01b2a3l,0xa58c8405881de16el,
24150             0xc653c43014f8f48bl },
24151           0 },
24152         /* 41 << 184 */
24153         { { 0x68e53c7c89c0c7c2l,0xf2e680b23c423272l,0xacd47fae60f50133l,
24154             0x4c484c6534f05605l },
24155           { 0x663bdcf9ebffbb7dl,0xb49cff3be42421c6l,0x0549f7b13f53f261l,
24156             0xc516aeda7c374766l },
24157           0 },
24158         /* 43 << 184 */
24159         { { 0xa515fe0f76a0ec26l,0xf727c0797b0b8b21l,0xaeed4c671993651el,
24160             0x1465a7f828ac7c87l },
24161           { 0x776bd5131f0ef90bl,0x57515d2cd9773e61l,0x235455e95564c50bl,
24162             0xf44daef80bf06a24l },
24163           0 },
24164         /* 44 << 184 */
24165         { { 0xbc1c6897d6a0d0f9l,0xd8e0ea0e3b0d7f55l,0xb35baa92b85b7aadl,
24166             0x2becd1b7674e48f4l },
24167           { 0xe2d7f78d6d7a9ac2l,0xf5074262f99c95d0l,0x4852470a89f611e9l,
24168             0xf7aa911992869decl },
24169           0 },
24170         /* 45 << 184 */
24171         { { 0x0bd1755b0ac4840fl,0x0f4c6c2aa22eef10l,0x3f72fe2d78d16dd9l,
24172             0xb2d49200ff7096a4l },
24173           { 0xa5dead555ffca031l,0x1d013c320b65f4cfl,0x67e498582a23f441l,
24174             0x55bae166d02412c0l },
24175           0 },
24176         /* 46 << 184 */
24177         { { 0x546dd4545739a62al,0x353dc1422a30b836l,0x1462449d99cbd704l,
24178             0xda02d0772da69411l },
24179           { 0xcb115fe565b1a1adl,0x395235f501230a22l,0x8ae630eed164d970l,
24180             0x60b679f0074e3a7el },
24181           0 },
24182         /* 47 << 184 */
24183         { { 0x2e64695245d231e1l,0xc96663ac00d8a0fbl,0xc1fbaa0cd07e1f41l,
24184             0x4b31484488758781l },
24185           { 0xd6971a835183e72el,0xd1d01f174cbe99b7l,0xe90b438c5a2f7512l,
24186             0xf858fa452957c620l },
24187           0 },
24188         /* 48 << 184 */
24189         { { 0xed7f2e774e6daae2l,0x7b3ae0e39e0a19bcl,0xd3293f8a91ae677el,
24190             0xd363b0cb45c8611fl },
24191           { 0xbe1d1ccf309ae93bl,0xa3f80be73920cae1l,0xaaacba74498edf01l,
24192             0x1e6d2a4ab2f5ac90l },
24193           0 },
24194         /* 49 << 184 */
24195         { { 0xb5c5bb67b972a778l,0xc2423a4a190f9b5al,0x4e693cf365247948l,
24196             0xc37d129ea94a65a3l },
24197           { 0xbea4736b6e9cd47bl,0xf3d1bd212338f524l,0xa2a0278e067a45dal,
24198             0xc86d631b5b5dce9bl },
24199           0 },
24200         /* 51 << 184 */
24201         { { 0xc2d75f46116952cel,0xd2b66269b75e40dal,0x024f670f921c4111l,
24202             0x37ffd854c91fd490l },
24203           { 0x6be44d0385b2f613l,0x040cd7d9ba11c4f9l,0x04c1cb762c0efb1fl,
24204             0xd905ff4f505e4698l },
24205           0 },
24206         /* 52 << 184 */
24207         { { 0x60c5f03f233550f1l,0xd4d09411925afd2el,0xa95b65c3d258e5a6l,
24208             0x1a19cfb59f902c6al },
24209           { 0xb486013af5ad5c68l,0xa2506776979638f3l,0x1232b4d0a38e0b28l,
24210             0xa64784b8d36a7b4fl },
24211           0 },
24212         /* 53 << 184 */
24213         { { 0x22c75830a13dcb47l,0xd6e81258efd7a08fl,0x6db703b6e4fc49b8l,
24214             0x8a5ac636f01817e9l },
24215           { 0x8d27b6e1b3f24514l,0x40edc3bc708c51d7l,0x9a1eec7765bb086dl,
24216             0x812ccb42b10800f8l },
24217           0 },
24218         /* 55 << 184 */
24219         { { 0x1a39c6acd4338453l,0x3d93822954b1295dl,0x7bf0bf45e0d81165l,
24220             0x83d58ca5972804d2l },
24221           { 0x105d3ddb00524b94l,0x65d516e7920378ecl,0x1d28f5f1aea33926l,
24222             0xa0b354313901c906l },
24223           0 },
24224         /* 57 << 184 */
24225         { { 0x000442a1e4f354del,0x165b44d9d1d112f5l,0x67fd9ced0d05c0a9l,
24226             0xd6ce074360bd5d60l },
24227           { 0x9ac80c931522af2al,0x8232d522fa07d449l,0x287b5534c3fdb652l,
24228             0x9f0548b3abd2ab98l },
24229           0 },
24230         /* 59 << 184 */
24231         { { 0xde8d7086b9aea1d4l,0x692180d98a7dc3fcl,0xd64ffb53bad3e6f3l,
24232             0x84628acf36ce3f91l },
24233           { 0xf76e470b6d498ac5l,0xa16945547abad602l,0x5b8fd6a5a255c1f6l,
24234             0xffe24e4a8576ae2al },
24235           0 },
24236         /* 60 << 184 */
24237         { { 0x5655179de7d70e03l,0x3e780c5c72a84570l,0xc102b4cb1d50029cl,
24238             0x3e71bdd5f075e839l },
24239           { 0x6460f4f0b498b822l,0x2682e06c6d4b8da5l,0x4eae53c996a740d4l,
24240             0xc19d8bef6389702cl },
24241           0 },
24242         /* 61 << 184 */
24243         { { 0x711be2081025fe1dl,0x2e562c89f0bc6a99l,0xcfd2be3a28bf4150l,
24244             0x33037b4a38e5bc91l },
24245           { 0x10c6da9df52fea02l,0x511f62444f0ea410l,0x19d37ca81a294c3fl,
24246             0x7e40f444618e6fd3l },
24247           0 },
24248         /* 63 << 184 */
24249         { { 0x4095f5ddbedb8734l,0x9c16027c4432f51al,0xced8179d873d0f11l,
24250             0x70c2bc9f6ebe6e61l },
24251           { 0x5c31035d616cf2f4l,0xf92e0fbd00a4af3dl,0xe6048a03511893c4l,
24252             0x639a804b52e2f462l },
24253           0 },
24254         /* 64 << 184 */
24255         { { 0x8735728dc2c6ff70l,0x79d6122fc5dc2235l,0x23f5d00319e277f9l,
24256             0x7ee84e25dded8cc7l },
24257           { 0x91a8afb063cd880al,0x3f3ea7c63574af60l,0x0cfcdc8402de7f42l,
24258             0x62d0792fb31aa152l },
24259           0 },
24260         /* 65 << 184 */
24261         { { 0x0f4bcefd9da373e4l,0x7278f44d119271a3l,0xb2dff94449e111c0l,
24262             0xb0a3abf8e5d2b2d4l },
24263           { 0x01baabb48ea80631l,0x27517ed3da305f85l,0x0a1ca6fc3f56aa86l,
24264             0x183d9c7694c22839l },
24265           0 },
24266         /* 71 << 184 */
24267         { { 0xe9a0dfbf22e238d7l,0x8690dfd97e8d8d31l,0xb3cb2a0d4006c59cl,
24268             0xe4d297caa1850d74l },
24269           { 0x066f10517842d14cl,0x68dd32737d43602bl,0x1f9f5cf931345f39l,
24270             0x44f18c2b10593890l },
24271           0 },
24272         /* 77 << 184 */
24273         { { 0x8d8c0233a7c3f60bl,0xfb59fe2d2bcbbd4cl,0xfa311680dc3e5b44l,
24274             0xb3cba9f3fbea5eedl },
24275           { 0xcb353b2f61e0e690l,0x06edf0c1b6e0efe0l,0xa29578cb1d0c02a2l,
24276             0xaeb2d677937fec07l },
24277           0 },
24278         /* 83 << 184 */
24279         { { 0xa19a81c5cdd0cac9l,0x5c10b942ec9cf85bl,0x0843ef4639e8c298l,
24280             0xcfd45d0e6c043258l },
24281           { 0x1011bcb9fb7e4b58l,0xae6362a544402bbdl,0x9ecc8c68ec15d751l,
24282             0xbc05998869d1a00bl },
24283           0 },
24284         /* 89 << 184 */
24285         { { 0xe9a43619460147e3l,0x881a6af423067448l,0x94f93ae6cee17a6bl,
24286             0x469e692f10782558l },
24287           { 0x01e244a1289bdb32l,0x240645779dddf970l,0x664cbd92d8f521ecl,
24288             0xadaf8ffb600222d0l },
24289           0 },
24290         /* 95 << 184 */
24291         { { 0x68314c740dbec437l,0x2095e1295ec75e2cl,0x8e88a3ddf0e6c606l,
24292             0x40ac647d1230f6b2l },
24293           { 0x09d124aaa2e6b991l,0xa22f9e2bcc81037cl,0xc842b64d15c3a1c2l,
24294             0x4d822becce808c65l },
24295           0 },
24296         /* 101 << 184 */
24297         { { 0xb02204d06ffb396bl,0x82eb6ecc881bead6l,0xf58432cebd6896c8l,
24298             0xc243468da38f4b9dl },
24299           { 0x8486402df8e628bdl,0x5dd338a1a4df2401l,0x748a41ab0daac953l,
24300             0xaa121d13e51e6235l },
24301           0 },
24302         /* 107 << 184 */
24303         { { 0x6daa0a4e50abc6aal,0x99fcc5bdeafb7cf2l,0xc705f64c4b8dbd2al,
24304             0x7deff836e7b51e90l },
24305           { 0xd92f42b859a8180fl,0x3bb298f8618d24acl,0x2433aa7357a56438l,
24306             0xcf29895b48a6a238l },
24307           0 },
24308         /* 113 << 184 */
24309         { { 0x74079dc59ed25aafl,0x7988245c023d5143l,0x7edfc6a6feb79c24l,
24310             0x7ed03c50a6baa70fl },
24311           { 0x71d3413596a753b4l,0x59efbafcef976246l,0xed050260a4a6947fl,
24312             0xabbc1f8066254247l },
24313           0 },
24314         /* 116 << 184 */
24315         { { 0x1f804e00caa4646fl,0x8643dc8870944924l,0xa37f1ca273f86de9l,
24316             0xa3199f9228889898l },
24317           { 0xc273ba580c1e4adfl,0x0f0d38af65bc82f0l,0xd8b28ab5f8a6cd3bl,
24318             0xeea6e08575894d8el },
24319           0 },
24320         /* 119 << 184 */
24321         { { 0x398f39132c1620f7l,0x9046d2dea921f3a3l,0x40a25a2785b50bb0l,
24322             0xb9adeca0d32e95f3l },
24323           { 0xa4199b1bdede5cbfl,0x9068aee084f5410bl,0x6665e4f5730f0397l,
24324             0x2e9ba18c8ae20659l },
24325           0 },
24326         /* 125 << 184 */
24327         { { 0xd76e9b2351835897l,0x72a0e000012deda6l,0x5bf08922bfec23e4l,
24328             0x8c2fcf1385cf2b7bl },
24329           { 0x6c42f935c63332c6l,0x8736c58395eccce9l,0x2d2abbb10721afc8l,
24330             0x1f7a76cc42d4e029l },
24331           0 },
24332     },
24333     {
24334         /* 0 << 192 */
24335         { { 0x00, 0x00, 0x00, 0x00 },
24336           { 0x00, 0x00, 0x00, 0x00 },
24337           1 },
24338         /* 1 << 192 */
24339         { { 0x56f8410ef4f8b16al,0x97241afec47b266al,0x0a406b8e6d9c87c1l,
24340             0x803f3e02cd42ab1bl },
24341           { 0x7f0309a804dbec69l,0xa83b85f73bbad05fl,0xc6097273ad8e197fl,
24342             0xc097440e5067adc1l },
24343           0 },
24344         /* 3 << 192 */
24345         { { 0x266344a43794f8dcl,0xdcca923a483c5c36l,0x2d6b6bbf3f9d10a0l,
24346             0xb320c5ca81d9bdf3l },
24347           { 0x620e28ff47b50a95l,0x933e3b01cef03371l,0xf081bf8599100153l,
24348             0x183be9a0c3a8c8d6l },
24349           0 },
24350         /* 4 << 192 */
24351         { { 0xb6c185c341dca566l,0x7de7fedad8622aa3l,0x99e84d92901b6dfbl,
24352             0x30a02b0e7c4ad288l },
24353           { 0xc7c81daa2fd3cf36l,0xd1319547df89e59fl,0xb2be8184cd496733l,
24354             0xd5f449eb93d3412bl },
24355           0 },
24356         /* 5 << 192 */
24357         { { 0x25470fabe085116bl,0x04a4337587285310l,0x4e39187ee2bfd52fl,
24358             0x36166b447d9ebc74l },
24359           { 0x92ad433cfd4b322cl,0x726aa817ba79ab51l,0xf96eacd8c1db15ebl,
24360             0xfaf71e910476be63l },
24361           0 },
24362         /* 7 << 192 */
24363         { { 0x72cfd2e949dee168l,0x1ae052233e2af239l,0x009e75be1d94066al,
24364             0x6cca31c738abf413l },
24365           { 0xb50bd61d9bc49908l,0x4a9b4a8cf5e2bc1el,0xeb6cc5f7946f83acl,
24366             0x27da93fcebffab28l },
24367           0 },
24368         /* 9 << 192 */
24369         { { 0x3ce519ef76257c51l,0x6f5818d318d477e7l,0xab022e037963edc0l,
24370             0xf0403a898bd1f5f3l },
24371           { 0xe43b8da0496033cal,0x0994e10ea1cfdd72l,0xb1ec6d20ba73c0e2l,
24372             0x0329c9ecb6bcfad1l },
24373           0 },
24374         /* 10 << 192 */
24375         { { 0xf1ff42a12c84bd9dl,0x751f3ec4390c674al,0x27bb36f701e5e0cal,
24376             0x65dfff515caf6692l },
24377           { 0x5df579c4cd7bbd3fl,0xef8fb29785591205l,0x1ded7203e47ac732l,
24378             0xa93dc45ccd1c331al },
24379           0 },
24380         /* 11 << 192 */
24381         { { 0xbdec338e3318d2d4l,0x733dd7bbbe8de963l,0x61bcc3baa2c47ebdl,
24382             0xa821ad1935efcbdel },
24383           { 0x91ac668c024cdd5cl,0x7ba558e4c1cdfa49l,0x491d4ce0908fb4dal,
24384             0x7ba869f9f685bde8l },
24385           0 },
24386         /* 13 << 192 */
24387         { { 0xed1b5ec279f464bal,0x2d65e42c47d72e26l,0x8198e5749e67f926l,
24388             0x4106673834747e44l },
24389           { 0x4637acc1e37e5447l,0x02cbc9ecf3e15822l,0x58a8e98e805aa83cl,
24390             0x73facd6e5595e800l },
24391           0 },
24392         /* 15 << 192 */
24393         { { 0x468ff80338330507l,0x06f34ddf4037a53el,0x70cd1a408d6993a4l,
24394             0xf85a159743e5c022l },
24395           { 0x396fc9c2c125a67dl,0x03b7bebf1064bfcbl,0x7c444592a9806dcbl,
24396             0x1b02614b4487cd54l },
24397           0 },
24398         /* 16 << 192 */
24399         { { 0x8303604f692ac542l,0xf079ffe1227b91d3l,0x19f63e6315aaf9bdl,
24400             0xf99ee565f1f344fbl },
24401           { 0x8a1d661fd6219199l,0x8c883bc6d48ce41cl,0x1065118f3c74d904l,
24402             0x713889ee0faf8b1bl },
24403           0 },
24404         /* 17 << 192 */
24405         { { 0xb47b60f70de21bb6l,0x64acae4fdcd836cal,0x3375ea6dc744ce63l,
24406             0xb764265fb047955bl },
24407           { 0xc68a5d4c9841c2c3l,0x60e98fd7cf454f60l,0xc701fbe2756aea0cl,
24408             0x09c8885eaab21c79l },
24409           0 },
24410         /* 19 << 192 */
24411         { { 0x45bb810869d2d46cl,0xe47c8b3968c8365al,0xf3b87663267551bdl,
24412             0x1590768f5b67547al },
24413           { 0x371c1db2fb2ed3ffl,0xe316691917a59440l,0x03c0d178df242c14l,
24414             0x40c93fceed862ac1l },
24415           0 },
24416         /* 21 << 192 */
24417         { { 0x1286da692bc982d6l,0x5f6d80f27bdae7e3l,0x3d9c5647a6f064fbl,
24418             0xfdc8e6a1d74c1540l },
24419           { 0x97da48c6d68b135al,0xc2097979d66dbfffl,0x0296adb9ea20531dl,
24420             0xa333730d4ab2c8f0l },
24421           0 },
24422         /* 23 << 192 */
24423         { { 0x0eb3565429847fedl,0xfdc142860a673dd0l,0x721b36278b62dd0bl,
24424             0x105a293e711a5771l },
24425           { 0xdf001cce7f761927l,0xf7b681b011d04c7dl,0x16dff792a3ac1996l,
24426             0x580c120b0fc4ae30l },
24427           0 },
24428         /* 25 << 192 */
24429         { { 0x31ea3d4f7ee8d0bcl,0x3832f22a0f42c3dcl,0xc661061a1a87a2f4l,
24430             0x0978c9f64b45576bl },
24431           { 0xb7abac3c6dfb5fd2l,0x27f36a00b7e01b90l,0x68f733cde9429e36l,
24432             0x953a4681dcbfe8cbl },
24433           0 },
24434         /* 27 << 192 */
24435         { { 0xbfb7c41067fe1eafl,0xa2073c6a6929a785l,0x6f2536f4a75fdb79l,
24436             0x859ad26d809bca69l },
24437           { 0x06f2c0693b197e7bl,0x656ad9f48ec0a573l,0xe7c7901f9a4d0262l,
24438             0xbec29443b938602bl },
24439           0 },
24440         /* 28 << 192 */
24441         { { 0xd00397fc0f0073a4l,0x5b668fa46f8d675fl,0x14374ac91522108cl,
24442             0x92efa7d10283e42el },
24443           { 0x673e6df90b6d024al,0x05f914d457581f26l,0xf5c8516267df8c12l,
24444             0x1197f1b4e06c2462l },
24445           0 },
24446         /* 29 << 192 */
24447         { { 0x6e2d1cb3dd9c90c1l,0x28f82d5a7990579el,0x90e189cd06226195l,
24448             0xbd2939df19b0dc74l },
24449           { 0x18b18505c0917177l,0xeed5470d3117d9c4l,0x39ef92eb6c893ca0l,
24450             0x4533ef8244a41940l },
24451           0 },
24452         /* 31 << 192 */
24453         { { 0xcaee9dec34943ddal,0x8e50e98e8b4b6782l,0x24358ea591ea3a1fl,
24454             0x71c4c827a9e1c194l },
24455           { 0xa38baa5d09bb7a94l,0xfb4ab4c057b58f9cl,0x4a01065e24e0ee19l,
24456             0xb9cf805107b877bfl },
24457           0 },
24458         /* 33 << 192 */
24459         { { 0xd38c1ce0a2980d5el,0x8b84cca4541face7l,0x93298136dbd8d05dl,
24460             0x582708d03f85c85al },
24461           { 0x6545eec7282960e4l,0x92e184aebaadec07l,0x05452564fd27a20fl,
24462             0x79d4668abddce6ebl },
24463           0 },
24464         /* 34 << 192 */
24465         { { 0xf5cc5cccf5191707l,0xe800328bd5d01f67l,0x0572012ebd9b1599l,
24466             0xf5be11a6863d0125l },
24467           { 0x4da7ca876ea441e0l,0x47dbf83b321b134al,0x5cbadcdac1acfb4al,
24468             0x19ac798a734f8e25l },
24469           0 },
24470         /* 35 << 192 */
24471         { { 0xe312623a7002114fl,0xb888b637e047686bl,0x23b2c270cbac91bdl,
24472             0xb50b31884dbfe02dl },
24473           { 0x8335ce43de97eef6l,0x6a4e65502bac193al,0xf2b35aac3101f720l,
24474             0x5b2c88d5379a2015l },
24475           0 },
24476         /* 36 << 192 */
24477         { { 0xf445e77131547128l,0x22761665e27811cal,0x9b944e91a37c6681l,
24478             0xc0aa06a536899860l },
24479           { 0x8c2b5816cfcd557el,0xf2734a19945aa357l,0x536ca07ca55a0049l,
24480             0x8328fdccc636d967l },
24481           0 },
24482         /* 37 << 192 */
24483         { { 0x52b513616aca06bdl,0x8d19b893cdf16560l,0x06b28179c3b438cdl,
24484             0xde1ef747cd1819e4l },
24485           { 0xbc6cc43b5f557985l,0xa277e11f61e0142al,0x58890f1e429cc392l,
24486             0x28d17dbfe5fc8f5el },
24487           0 },
24488         /* 39 << 192 */
24489         { { 0x556df61a29a8f7cbl,0x5cf554dfd14ab27al,0x243f933ba755b886l,
24490             0xa4d0b06ff2d4ce87l },
24491           { 0xa745eb8d2c0f1d39l,0xc228747aea3047a5l,0xced774c41d2cecc0l,
24492             0x54a55c3a774fb01al },
24493           0 },
24494         /* 40 << 192 */
24495         { { 0xa691398a4a9eb3f0l,0x56c1dbff3b99a48fl,0x9a87e1b91b4b5b32l,
24496             0xad6396145378b5fel },
24497           { 0x437a243ec26b5302l,0x0275878c3ccb4c10l,0x0e81e4a21de07015l,
24498             0x0c6265c9850df3c0l },
24499           0 },
24500         /* 41 << 192 */
24501         { { 0x182c3f0e6be95db0l,0x8c5ab38cae065c62l,0xcce8294ebe23abacl,
24502             0xed5b65c47d0add6dl },
24503           { 0xbce57d78cc9494cal,0x76f75c717f435877l,0xb3084b2eb06560a9l,
24504             0x67216bc850b55981l },
24505           0 },
24506         /* 43 << 192 */
24507         { { 0x49c9fd92557de68bl,0x357aa44fc3151b7al,0xd36286d11e4aebd0l,
24508             0x84562cd736a51203l },
24509           { 0x42a57e7c3cacc002l,0x794a47751b1e25a3l,0x2c2ab68cac0d4356l,
24510             0xececb6addb31afdcl },
24511           0 },
24512         /* 44 << 192 */
24513         { { 0x47a5f010b4c21bfel,0x45c5610f0ac3dc20l,0x20e689fcea3bf4dcl,
24514             0xf244ea49fb5f46e4l },
24515           { 0xd918e59e8ca38e45l,0x7d6c601d96189a6fl,0x1a40f03854138471l,
24516             0xfe867d7308a9d034l },
24517           0 },
24518         /* 45 << 192 */
24519         { { 0x3b49e489100c0410l,0x8831d3992adc2b29l,0xb6726cd1247a8116l,
24520             0x83a71a59d1d56d8el },
24521           { 0x82ade2fe5cd333e9l,0x3b087ef83ea11f1al,0x17b96ca66ce879cel,
24522             0xc2f74a971871dc43l },
24523           0 },
24524         /* 46 << 192 */
24525         { { 0xa11a1e3680b576cel,0xf91278bbce2683e8l,0xc3bab95fbae8bc5bl,
24526             0x642ca26397351715l },
24527           { 0x5ffc14726fecbbc1l,0x2465e996a23f36d4l,0x06fc53bf5187d428l,
24528             0x54b4014351fbce91l },
24529           0 },
24530         /* 47 << 192 */
24531         { { 0x081ca6f0eafc7b2cl,0x1ba047a38c48703fl,0xe84865046663accfl,
24532             0xde1f97568d43689cl },
24533           { 0xf5373e1d5bc19f75l,0x4e48c493d64b0a54l,0x0c43f4e25807dbf6l,
24534             0x73bef15167778c36l },
24535           0 },
24536         /* 48 << 192 */
24537         { { 0xca6c0937b1b76ba6l,0x1a2eab854d2026dcl,0xb1715e1519d9ae0al,
24538             0xf1ad9199bac4a026l },
24539           { 0x35b3dfb807ea7b0el,0xedf5496f3ed9eb89l,0x8932e5ff2d6d08abl,
24540             0xf314874e25bd2731l },
24541           0 },
24542         /* 49 << 192 */
24543         { { 0x9d5322e89e9bba53l,0xdd7c9ceb989ff350l,0xd76147eadab0d7b3l,
24544             0x8e45b1c6d7a9a9a1l },
24545           { 0x8f896a91d4f10c10l,0x999a73c54068de06l,0x84a9d0839cf0a779l,
24546             0x4d7cc7689f608ab2l },
24547           0 },
24548         /* 51 << 192 */
24549         { { 0x1833ccddaee93c82l,0x6a05ef7b9f35f20fl,0xc538dac9ae413bc2l,
24550             0x1e74f4658b4784bdl },
24551           { 0xccb2bc4a49ffd544l,0x9b88183d2b17ae88l,0x96037a136e43824fl,
24552             0xbbb61441480bf3dfl },
24553           0 },
24554         /* 52 << 192 */
24555         { { 0x13319d20e090ad42l,0x4ff3186e12cbb719l,0xf38e504913fc0a46l,
24556             0x83185a1254e60378l },
24557           { 0x08c4057797ea8935l,0x7b2212a946b614f9l,0xedcdfa520634cfb3l,
24558             0xdbc60eed9e7d5726l },
24559           0 },
24560         /* 53 << 192 */
24561         { { 0x9b0785c6c7e1070fl,0xec112f53cbf561e5l,0xc93511e37fab3464l,
24562             0x9e6dc4da9de8e0c2l },
24563           { 0x7733c425e206b4eel,0xb8b254ef50cedf29l,0xfaee4bbbd50ad285l,
24564             0x216e76d58c4eb6cfl },
24565           0 },
24566         /* 55 << 192 */
24567         { { 0x9d6a28641d51f254l,0x26c5062a0c2822c3l,0xd74ebba8334bf4eel,
24568             0x6e5446eb0b8f7305l },
24569           { 0x5988ae8eb629beccl,0x71e576d0a1de7d1dl,0x15e39592a8873970l,
24570             0x2b1f9a9342ecc74el },
24571           0 },
24572         /* 57 << 192 */
24573         { { 0xcbdb70727c519bf9l,0x112986bbcaaf48e6l,0x64d4c6d1a13baf3cl,
24574             0x85ccf6f7a065e77el },
24575           { 0x183be337749beaedl,0xb3703096cba6c9b1l,0x1edf81f0e42b8afel,
24576             0xf04ed594ccb73ad7l },
24577           0 },
24578         /* 59 << 192 */
24579         { { 0xfa954ebc38491e9fl,0xf75a5808d32f0b03l,0x196d4a828083b9d3l,
24580             0x92d5a0be5e8dc9fel },
24581           { 0x4a507ae9aea628bal,0xeea5861e11a02fb5l,0xa033b84fd23ec8f7l,
24582             0x1a68c36ec60f11d5l },
24583           0 },
24584         /* 60 << 192 */
24585         { { 0x3dfb55bdab920ef2l,0xe0090971e6244484l,0xdc39fd08f7c6e1a3l,
24586             0x1ca765356ee79e72l },
24587           { 0x472c8985287d590cl,0x67635e35ad6daeb4l,0x06ec4e7980f9fee3l,
24588             0x0aceb39921dc5fdbl },
24589           0 },
24590         /* 61 << 192 */
24591         { { 0xdb2478fd9410a756l,0xd106aefe3a53a1e6l,0x1f4c940d14286333l,
24592             0x6a98659d04950958l },
24593           { 0x3232a1c6a6bbe060l,0x19ad132ca5e7ca9bl,0x3c9c13ef800fae29l,
24594             0x9b0d9068b8660f49l },
24595           0 },
24596         /* 63 << 192 */
24597         { { 0x1e7f043795c53027l,0x5221e5c0da9a3806l,0xf297d8e379d9385fl,
24598             0x4d69e95f78ba697el },
24599           { 0xdda936cee76d13c1l,0xd9a5790a485b12f5l,0xeab84add51efbfd0l,
24600             0xc9a3ee9ca9f44aa4l },
24601           0 },
24602         /* 64 << 192 */
24603         { { 0xefb26a753f73f449l,0x1d1c94f88d44fc79l,0x49f0fbc53bc0dc4dl,
24604             0xb747ea0b3698a0d0l },
24605           { 0x5218c3fe228d291el,0x35b804b543c129d6l,0xfac859b8d1acc516l,
24606             0x6c10697d95d6e668l },
24607           0 },
24608         /* 65 << 192 */
24609         { { 0x8c12e87a15454db4l,0xbc1fc546908e8fbcl,0xc35d83c7e4cf1636l,
24610             0xcb2f5ac820641524l },
24611           { 0x2400aae2e644ecd0l,0x9b01e2d14be37119l,0x6cffd52831b54857l,
24612             0xb3fd5d864b5cbf81l },
24613           0 },
24614         /* 71 << 192 */
24615         { { 0x2e999a4739709fb9l,0x4cb4bbdb62c2b30fl,0x4c7259ac09de0c92l,
24616             0x73c1e34f8c59a0ffl },
24617           { 0x0a9e5f2e48cb0a12l,0x5e07449fcf499bb0l,0x0527a8b4b02c4a54l,
24618             0x7381287159da01e4l },
24619           0 },
24620         /* 77 << 192 */
24621         { { 0xe0b876ca0548ff87l,0x74b5a9b25e03bae3l,0xd5564cc5dd0642d2l,
24622             0x29ed211b668c4977l },
24623           { 0xf29d3b7aa7422b11l,0x17f2d3586d29b8bal,0x2e35cdda2bb887del,
24624             0x650f148078e4444bl },
24625           0 },
24626         /* 83 << 192 */
24627         { { 0x8c75532fb47435ebl,0x2234e2c5a113f905l,0x27b75fea31508ae9l,
24628             0x09733e40d489ad0bl },
24629           { 0x73b38464a1b06da1l,0x0aed522dc5b7ccf2l,0xcc04783e78d7e5afl,
24630             0xa81c8a8ff23eaab7l },
24631           0 },
24632         /* 89 << 192 */
24633         { { 0x6bb5eca73c149ffal,0x4593d851c536487al,0x3675daaad85eb9edl,
24634             0xbf65d0f9b8a58ffbl },
24635           { 0x1dc6ddddc22e83eel,0xb673397ee10d3c17l,0x6bdc20600ca62c93l,
24636             0x260389c30b821f6dl },
24637           0 },
24638         /* 95 << 192 */
24639         { { 0x45f5cf07b417be10l,0x0acb1a44e5d561d8l,0x54b7baeafb1dfbe9l,
24640             0x0e6e66219044672el },
24641           { 0xa9b6db6d9a793601l,0xd70eadb8a4a0ba4al,0xaedace846098b89el,
24642             0x970f2c23ac39d40fl },
24643           0 },
24644         /* 101 << 192 */
24645         { { 0x9dff8d289c7eaaa8l,0x38bcd076db0cc361l,0x25760147cdea9db8l,
24646             0x44c89dd40163f343l },
24647           { 0x18815d7544db8365l,0xa186d57b37f3e4b3l,0xa71de7806e84a7fal,
24648             0xf1c08989e56646b3l },
24649           0 },
24650         /* 107 << 192 */
24651         { { 0xad73e1448fb56a43l,0x078c14fb715543c9l,0xa57770fd64b92d54l,
24652             0xf0420a9277e9b919l },
24653           { 0xc660d0cb588ccc1dl,0x069baa1471415c2el,0x747438dc32982740l,
24654             0x4782ce08767381eel },
24655           0 },
24656         /* 113 << 192 */
24657         { { 0xc2a1ee5fdb3b6b5dl,0x08ce544820e1339fl,0x3cb954b77073955fl,
24658             0xb9ed2ee7f32d0832l },
24659           { 0xc0a998b1b4aac98el,0x4912273dbca4bac7l,0xac0f5014c3f92c4al,
24660             0xbf3dc27f9e916e78l },
24661           0 },
24662         /* 116 << 192 */
24663         { { 0x222c7bae28833944l,0xbb78a867f5e3cf67l,0x590cbd96faf6cfd6l,
24664             0x1c50aecb3b0d842el },
24665           { 0x8f2c5df1dbade9a5l,0x60923fb7e3840cecl,0xe8f2db6b03a67512l,
24666             0x90af187be0d7c628l },
24667           0 },
24668         /* 119 << 192 */
24669         { { 0xb4162b615fee3ccbl,0xe9786e7d7327e651l,0x6c85bd938812d9c1l,
24670             0xfe4905083dc9e838l },
24671           { 0xe66f25178a6765dfl,0x72fd294edeee184cl,0x07608bd27b6ec227l,
24672             0x9df7b664dfdaa5e6l },
24673           0 },
24674         /* 125 << 192 */
24675         { { 0x4aea16602d53a155l,0x7285069a32ab07fdl,0xf6f3000d8b6fcd19l,
24676             0x010b1f246e98953fl },
24677           { 0xe180bc559f9aa221l,0x7717ee383cba4534l,0x5997f3aa36cbda06l,
24678             0x54c6090064a04b05l },
24679           0 },
24680     },
24681     {
24682         /* 0 << 200 */
24683         { { 0x00, 0x00, 0x00, 0x00 },
24684           { 0x00, 0x00, 0x00, 0x00 },
24685           1 },
24686         /* 1 << 200 */
24687         { { 0x25914f7881fdad90l,0xcf638f560d2cf6abl,0xb90bc03fcc054de5l,
24688             0x932811a718b06350l },
24689           { 0x2f00b3309bbd11ffl,0x76108a6fb4044974l,0x801bb9e0a851d266l,
24690             0x0dd099bebf8990c1l },
24691           0 },
24692         /* 3 << 200 */
24693         { { 0xebd6a6777b0ac93dl,0xa6e37b0d78f5e0d7l,0x2516c09676f5492bl,
24694             0x1e4bf8889ac05f3al },
24695           { 0xcdb42ce04df0ba2bl,0x935d5cfd5062341bl,0x8a30333382acac20l,
24696             0x429438c45198b00el },
24697           0 },
24698         /* 4 << 200 */
24699         { { 0xfb2838be67e573e0l,0x05891db94084c44bl,0x9131137396c1c2c5l,
24700             0x6aebfa3fd958444bl },
24701           { 0xac9cdce9e56e55c1l,0x7148ced32caa46d0l,0x2e10c7efb61fe8ebl,
24702             0x9fd835daff97cf4dl },
24703           0 },
24704         /* 5 << 200 */
24705         { { 0x6c626f56c1770616l,0x5351909e09da9a2dl,0xe58e6825a3730e45l,
24706             0x9d8c8bc003ef0a79l },
24707           { 0x543f78b6056becfdl,0x33f13253a090b36dl,0x82ad4997794432f9l,
24708             0x1386493c4721f502l },
24709           0 },
24710         /* 7 << 200 */
24711         { { 0xe566f400b008733al,0xcba0697d512e1f57l,0x9537c2b240509cd0l,
24712             0x5f989c6957353d8cl },
24713           { 0x7dbec9724c3c2b2fl,0x90e02fa8ff031fa8l,0xf4d15c53cfd5d11fl,
24714             0xb3404fae48314dfcl },
24715           0 },
24716         /* 9 << 200 */
24717         { { 0xf02cc3a9f327a07fl,0xefb27a9b4490937dl,0x81451e96b1b3afa5l,
24718             0x67e24de891883be4l },
24719           { 0x1ad65d4770869e54l,0xd36291a464a3856al,0x070a1abf7132e880l,
24720             0x9511d0a30e28dfdfl },
24721           0 },
24722         /* 10 << 200 */
24723         { { 0xfdeed650f8d1cac4l,0xeb99194b6d16bda5l,0xb53b19f71cabbe46l,
24724             0x5f45af5039b9276cl },
24725           { 0xd0784c6126ee9d77l,0xf7a1558b0c02ca5dl,0xb61d6c59f032e720l,
24726             0xae3ffb95470cf3f7l },
24727           0 },
24728         /* 11 << 200 */
24729         { { 0x9b185facc72a4be5l,0xf66de2364d848089l,0xba14d07c717afea9l,
24730             0x25bfbfc02d551c1cl },
24731           { 0x2cef0ecd4cdf3d88l,0x8cee2aa3647f73c4l,0xc10a7d3d722d67f7l,
24732             0x090037a294564a21l },
24733           0 },
24734         /* 13 << 200 */
24735         { { 0x6ac07bb84f3815c4l,0xddb9f6241aa9017el,0x31e30228ca85720al,
24736             0xe59d63f57cb75838l },
24737           { 0x69e18e777baad2d0l,0x2cfdb784d42f5d73l,0x025dd53df5774983l,
24738             0x2f80e7cee042cd52l },
24739           0 },
24740         /* 15 << 200 */
24741         { { 0x43f18d7f4d6ee4abl,0xd3ac8cde9570c3dcl,0x527e49070b8c9b2al,
24742             0x716709a7c5a4c0f1l },
24743           { 0x930852b0916a26b1l,0x3cc17fcf4e071177l,0x34f5e3d459694868l,
24744             0xee0341aba28f655dl },
24745           0 },
24746         /* 16 << 200 */
24747         { { 0xf431f462060b5f61l,0xa56f46b47bd057c2l,0x348dca6c47e1bf65l,
24748             0x9a38783e41bcf1ffl },
24749           { 0x7a5d33a9da710718l,0x5a7799872e0aeaf6l,0xca87314d2d29d187l,
24750             0xfa0edc3ec687d733l },
24751           0 },
24752         /* 17 << 200 */
24753         { { 0x4b764317aa365220l,0x7a24affe68cc0355l,0x76732ed0ceb3df5el,
24754             0x2ce1332aae096ed0l },
24755           { 0x89ce70a7b8adac9dl,0xfdddcf05b3fc85c8l,0xbd7b29c6f2ee8bfel,
24756             0xa1effcb9457d50f3l },
24757           0 },
24758         /* 19 << 200 */
24759         { { 0x6053972dac953207l,0xc2ca9a8408ad12f6l,0x9ed6cd386ba36190l,
24760             0xa5b50a48539d18a4l },
24761           { 0xd9491347dbf18c2al,0x2cdce4662e9697cfl,0x4e97db5ca9e31819l,
24762             0x0fb02e2d4c044b74l },
24763           0 },
24764         /* 21 << 200 */
24765         { { 0x66a4dd414aa5e9ddl,0x6ec7576e64f6aeb9l,0x3f08ce06c7e980b5l,
24766             0x52fe9fd6c1a2aa7el },
24767           { 0xfe46e6d95074326al,0xd570ed734c126c1dl,0x86c7ec257217d55al,
24768             0x3cb434057c3de2b2l },
24769           0 },
24770         /* 23 << 200 */
24771         { { 0x48e0295dcc9e79bfl,0x2419485693eb403dl,0x9386fb7709dd8194l,
24772             0xb6e89bb101a242f6l },
24773           { 0xc7994f3924d308d7l,0xf0fbc392de673d88l,0x43eed52ea11abb62l,
24774             0xc900f9d0c83e7fbel },
24775           0 },
24776         /* 25 << 200 */
24777         { { 0x214a10dca8152891l,0xe6787b4c64f1abb2l,0x276333d9fa1a10edl,
24778             0xc0e1c88e47dbccbcl },
24779           { 0x8a3c37c4849dd12el,0x2144a8c8d86e109fl,0xbb6891f7286c140cl,
24780             0xb0b8c5e29cce5e6fl },
24781           0 },
24782         /* 27 << 200 */
24783         { { 0x3f9e0e3499753288l,0x6b26f1ebe559d93al,0x647fe21d9841faf1l,
24784             0x48a4b6efa786ea02l },
24785           { 0x6e09cd22665a882dl,0x95390d81b63ccda6l,0x5b014db4b026a44al,
24786             0x5b96efb22ad30ff1l },
24787           0 },
24788         /* 28 << 200 */
24789         { { 0x64c50c8b4a3b99e9l,0x2489a675d0a26f4fl,0xe2aacaeed85bc6fdl,
24790             0x556882038a6019bal },
24791           { 0x7ceb9da645cfac07l,0xe1ad3d25652dbd09l,0x086adf348d3b5d2bl,
24792             0xf9256d8aec3654a0l },
24793           0 },
24794         /* 29 << 200 */
24795         { { 0x571c246bf009a690l,0x8fe54231ccd90d3al,0x8adde6adfe173b79l,
24796             0x75d9a392b05a5e3bl },
24797           { 0x607f47b0d1bb3a84l,0xe4e3b472058e691al,0xfc0f793bf3d956e3l,
24798             0x6a6730b605de54dal },
24799           0 },
24800         /* 31 << 200 */
24801         { { 0x4daf7f540d80aaa1l,0xc571d04c229c4574l,0x469e2da5fffca53dl,
24802             0x9fffe29513ff7f59l },
24803           { 0x2075da5a33a254f7l,0x769f33acd35e575dl,0x7b940d2c3d35001al,
24804             0x2d606b57e34c95b7l },
24805           0 },
24806         /* 33 << 200 */
24807         { { 0xc7e4f8b899365f86l,0x8f6f959faae69527l,0x749ffedffdfaeeeal,
24808             0x2b91f0221b54c2a0l },
24809           { 0xe75c2352addbdf83l,0xe7329922fff2694cl,0xbb65ae06badadeacl,
24810             0x16cbb9d1f56be3b5l },
24811           0 },
24812         /* 34 << 200 */
24813         { { 0xb100a4c67a07bd70l,0x222fee7634787efel,0xa4dafc14f1e79d1bl,
24814             0x0d3a82dad18b8be4l },
24815           { 0xe0181445fc06922fl,0x0873d99b714a90b6l,0xdf43082fa5087a0el,
24816             0x195e49367399e0dbl },
24817           0 },
24818         /* 35 << 200 */
24819         { { 0x7e83545aae6fcc9cl,0x1a24fce819e15ce2l,0x4a3465c536d8c6a8l,
24820             0xd1e5f24109436ae0l },
24821           { 0xed334bfc6be463d5l,0xc46a600b934fbdcfl,0xbd2fd65b920321ffl,
24822             0x953fa91767fa154el },
24823           0 },
24824         /* 36 << 200 */
24825         { { 0x5dca4995f93ddad1l,0x061efcabf72470c2l,0xad78d54d5e7e0741l,
24826             0xa91f4e839c4e0ab4l },
24827           { 0xdd4403af5c75aa0dl,0x4308c8ee13c69113l,0x3a3b66f51ebc36adl,
24828             0xc07cc3f0f4bf777al },
24829           0 },
24830         /* 37 << 200 */
24831         { { 0x3fd1963e37a86b32l,0x22e236d60bd0880el,0xb87467cf89f0fa5cl,
24832             0x85b9c6c0310e0265l },
24833           { 0x82979a96783459ael,0xd19b0919bd529ed3l,0xa21f771808434f94l,
24834             0x3dd130a9195369c6l },
24835           0 },
24836         /* 39 << 200 */
24837         { { 0xc61e62767915d157l,0xc48244279e07fb0el,0x8980c1cc8420ea49l,
24838             0x10d82e4a588d4e2bl },
24839           { 0xdddecd52b17eff2dl,0xe44c7b2ded8492a4l,0x96ca89ebb9bea6afl,
24840             0x724166fe1b03ed03l },
24841           0 },
24842         /* 40 << 200 */
24843         { { 0xfc87975f8fb54738l,0x3516078827c3ead3l,0x834116d2b74a085al,
24844             0x53c99a73a62fe996l },
24845           { 0x87585be05b81c51bl,0x925bafa8be0852b7l,0x76a4fafda84d19a7l,
24846             0x39a45982585206d4l },
24847           0 },
24848         /* 41 << 200 */
24849         { { 0x8bbc484ed551f3e1l,0x6e058a90b7eb06d2l,0xfaccd9a0e5cd281al,
24850             0xe7661b78d5b44900l },
24851           { 0x03afe115725fde22l,0xbe929230c7229fd1l,0x5cd0d16a0000035el,
24852             0x1f6a9df0c8f5a910l },
24853           0 },
24854         /* 43 << 200 */
24855         { { 0xe54bbcfd535dfc82l,0x89be0b89a9012196l,0xa67831ee71011beal,
24856             0x2ea7a8292db43878l },
24857           { 0xff7c144378ffe871l,0xa67dc3d4c63f65eal,0xbbfc7fc2a1527419l,
24858             0x6440380bf6c36b8fl },
24859           0 },
24860         /* 44 << 200 */
24861         { { 0x71ab9f69d812d7e6l,0x2847c5516e142126l,0x9e27755bb31e7753l,
24862             0xb89533e2943b8c7fl },
24863           { 0xbe7f0c6e14fa7dc6l,0x782a06388cee1f7al,0x7069292938e13a6bl,
24864             0x1e1221f0c63f4d28l },
24865           0 },
24866         /* 45 << 200 */
24867         { { 0x9030aa9a63a431f4l,0x0fa7b5d45039a318l,0x6a0cf40af083687dl,
24868             0x46689cec659fa752l },
24869           { 0x8259727a456fa97el,0x4f618a355b08d7fcl,0x2c44217b72028d15l,
24870             0x8083b09935111e32l },
24871           0 },
24872         /* 46 << 200 */
24873         { { 0xaa5976523b5b29f1l,0xb07f10ab37432a54l,0x16e3e2236e36556fl,
24874             0xf1c7c9bd47cd4586l },
24875           { 0xa4eef99d3f87216dl,0x4e54d3c52e1eaa79l,0x534c5901d2540d91l,
24876             0x718df7c9b6f0fcfcl },
24877           0 },
24878         /* 47 << 200 */
24879         { { 0x99497f8a2eb0ee3bl,0x87e550c1caeb3a20l,0xd23e053dfb91627cl,
24880             0xb971c043873124e6l },
24881           { 0x3581ab853b16e467l,0x24541c926145187bl,0x4423ec5c010c2527l,
24882             0x775f13029fa82a68l },
24883           0 },
24884         /* 48 << 200 */
24885         { { 0x499b6ab65eb03c0el,0xf19b795472bc3fdel,0xa86b5b9c6e3a80d2l,
24886             0xe43775086d42819fl },
24887           { 0xc1663650bb3ee8a3l,0x75eb14fcb132075fl,0xa8ccc9067ad834f6l,
24888             0xea6a2474e6e92ffdl },
24889           0 },
24890         /* 49 << 200 */
24891         { { 0xbaebdd8a0c40aec4l,0x5eccafb563e8cfd0l,0x1c204c0eb5159938l,
24892             0x607109d34b996aa9l },
24893           { 0x024c6c4b9cef59fel,0xbc846e216ed4b6f1l,0xf6a50ff3ff652c0al,
24894             0x368af2c72d95220cl },
24895           0 },
24896         /* 51 << 200 */
24897         { { 0xec9c2e35cbd3ccafl,0xb9eeff3ddcda8f30l,0x82012e191062d02el,
24898             0xed964cc94efc6b6el },
24899           { 0x8853ea0a6bf54c22l,0xea40fcc0f3cbe264l,0x21f9c01ddecf114el,
24900             0x05e754c63da71e59l },
24901           0 },
24902         /* 52 << 200 */
24903         { { 0xe6a26d38046dfc72l,0x70409579c2175175l,0x2a575ac5d44e0c1dl,
24904             0xb35395e01479ab5al },
24905           { 0x1550a5d4f7bfbd8el,0x01daeb680778807bl,0xe0aa940321294dbal,
24906             0x84bcdc8c5b5a93b7l },
24907           0 },
24908         /* 53 << 200 */
24909         { { 0x876cc4d2520f04abl,0x6e320f5da85ff6a8l,0x7c504720ce17bc80l,
24910             0xe7907079a62089f9l },
24911           { 0xa45c4ac7bca45feel,0xd8f3facd5bd54b0cl,0xc0b036277b3e4a24l,
24912             0xaabe96dfe4cd4b57l },
24913           0 },
24914         /* 55 << 200 */
24915         { { 0xdc85a54773862ce4l,0x169051a3cc6f5d85l,0x8e3d3be0355f4df7l,
24916             0xa139d6fac72bac76l },
24917           { 0xddc95d0dfeb0a6f0l,0xd53f70e545cd6955l,0x18eede5e47e54112l,
24918             0x4a135dc9cbc6a52el },
24919           0 },
24920         /* 57 << 200 */
24921         { { 0x705a08ba90a58fb4l,0x10eef880fb3f8a64l,0x4ced9ba2f8e585ffl,
24922             0xb4f0f955fc6ebef5l },
24923           { 0x152c1a338d8b739el,0xb2be701db495bee5l,0xd27141a8d3540a74l,
24924             0x20c8a00247f9e9d7l },
24925           0 },
24926         /* 59 << 200 */
24927         { { 0x6d5ae921f5adcb3fl,0xaed1047003a3b610l,0x7c75e36f22256df9l,
24928             0xe664b36fb97dae99l },
24929           { 0x138b5eca91e746ael,0xb3e01ef5648674a7l,0xa3f256da9e375c74l,
24930             0xa00e82bc6a82d6f3l },
24931           0 },
24932         /* 60 << 200 */
24933         { { 0xe7a01eae6e28b4a8l,0xb3bf8224782166c9l,0x0b7ba2a06a244510l,
24934             0x9751a69c2abbb4dbl },
24935           { 0xb611adc1b3f9fcbcl,0x1d08eb3b436c4675l,0x1c71e98a20f96a64l,
24936             0x33d9b58c7ffd3f08l },
24937           0 },
24938         /* 61 << 200 */
24939         { { 0x7c7b03c1affa2d6cl,0x5f189bb9aec6e624l,0xe77a1eedadeff5e7l,
24940             0xfc58b90f4280b467l },
24941           { 0x561e5d579b71cb4el,0x8ed767aa36d6a17el,0x38d8671e8aa9e188l,
24942             0x7bc68f07a95350c0l },
24943           0 },
24944         /* 63 << 200 */
24945         { { 0xe0cd38cf98c01384l,0xc6741123a4226d9fl,0xdd1d42dbf877a0b8l,
24946             0xc5986ef0110b3cbal },
24947           { 0xeba949f809c8cebel,0x96b47bc4bd39f1dcl,0xbad140b6e07a2a3cl,
24948             0x2a8d80999ac5ca8al },
24949           0 },
24950         /* 64 << 200 */
24951         { { 0x39d934abd3c095f1l,0x04b261bee4b76d71l,0x1d2e6970e73e6984l,
24952             0x879fb23b5e5fcb11l },
24953           { 0x11506c72dfd75490l,0x3a97d08561bcf1c1l,0x43201d82bf5e7007l,
24954             0x7f0ac52f798232a7l },
24955           0 },
24956         /* 65 << 200 */
24957         { { 0x8cf27618590ca850l,0x58134f6f44bb94f2l,0x0a147562b78b4eecl,
24958             0x2e5986e39f1ed647l },
24959           { 0x9becf893348393b0l,0xaea21b92c31c2a86l,0x3d69859e5ff1b9a6l,
24960             0x6fcd19f4cd805691l },
24961           0 },
24962         /* 71 << 200 */
24963         { { 0x81619bd4841f43c3l,0x3a3325538e5c61f0l,0x2b68921eda862151l,
24964             0x97f5c8a741a491f8l },
24965           { 0x8b452094d3b9afa0l,0x93b2b7b4f2124dbcl,0x53285e7d26e0e26dl,
24966             0x3f003fc5c8a24edel },
24967           0 },
24968         /* 77 << 200 */
24969         { { 0x4cdabb586c025824l,0x5935ad1586bfcd7dl,0x8ce2c3101b7c5533l,
24970             0x761c9fe96cae8808l },
24971           { 0x8a0723f5d9e66d70l,0xb640b323dcced11dl,0x5768528051ae548cl,
24972             0x83576f75d53f3f2cl },
24973           0 },
24974         /* 83 << 200 */
24975         { { 0xc715edc47b532ec3l,0x159765e6c4a6e14bl,0x4a74f15228cd2d45l,
24976             0xbfd309edae8c753bl },
24977           { 0xf56bb5315d6d5245l,0x2c89c21833b30a55l,0xe436141acd4ed5fal,
24978             0x7eb7a5c707868ee6l },
24979           0 },
24980         /* 89 << 200 */
24981         { { 0x9a3ad3ffb0c7c48cl,0x25e8d977738e3638l,0xbb6c6c9d1c024074l,
24982             0xeda1ac0f8cfdf416l },
24983           { 0x93059ba538de49e2l,0xdb199cfc1b9ce741l,0x49b05e9446f3b494l,
24984             0x717cafc606480902l },
24985           0 },
24986         /* 95 << 200 */
24987         { { 0x8d27421052885708l,0x9d2297fd74e5b9b5l,0xe7cb6a68dc4d7318l,
24988             0x0b60b0d276357b31l },
24989           { 0x57301994532c2095l,0xfbae2ba203373452l,0xe8020b20ba700583l,
24990             0x1ca7772c2988919cl },
24991           0 },
24992         /* 101 << 200 */
24993         { { 0x723296eb918f3eecl,0x358c9ff0b79901c6l,0x64a1934c8d5e814cl,
24994             0x7e5a9afced165177l },
24995           { 0xd783840168733e7al,0xfcf3c0b6f61ede6dl,0x94ec0bf08434e804l,
24996             0xa5a70153c192c1cdl },
24997           0 },
24998         /* 107 << 200 */
24999         { { 0x03cdf976c23e49d4l,0x51e5cfa5a2ae72d5l,0x7716faa3100f7a51l,
25000             0xc53153a2c14dc015l },
25001           { 0xe7c69b052b47ec18l,0xff4756907ea93b01l,0x55fde3c540a2f205l,
25002             0x0263d0b12f85aed6l },
25003           0 },
25004         /* 113 << 200 */
25005         { { 0x668c56619686fe30l,0x382a8ccd8f73a476l,0xda012cbfb40a85e7l,
25006             0x55ea1e72e9e88b91l },
25007           { 0x8312556088cc5afcl,0x44ae54cbc45b19c7l,0xc91fffa8f86a02cdl,
25008             0xc79f573752d7e89bl },
25009           0 },
25010         /* 116 << 200 */
25011         { { 0x652b50523e357579l,0x08ce7d3a2afe5746l,0x9dc1cca6f71a12efl,
25012             0x80a221c24f6c4196l },
25013           { 0xdde40eff0f49f508l,0x7995bb46913b0dc3l,0x4adbdeb385e44f6el,
25014             0x6816bb3ab222e4bbl },
25015           0 },
25016         /* 119 << 200 */
25017         { { 0xce1ee518579a1a4dl,0x5d86e8912bc3870al,0x230878d18da907c4l,
25018             0xc648392777ae7ea8l },
25019           { 0x64319653016c0ad7l,0x7cbfa0b0b71f20dal,0xbf087dc3395ed4d8l,
25020             0x59512add307d218dl },
25021           0 },
25022         /* 125 << 200 */
25023         { { 0x7378a969d8ae335el,0x11c69965506d3a42l,0x212539769949468al,
25024             0x570cf87e64995050l },
25025           { 0xf300ad2e30b94e22l,0xbc159cf8f36dad32l,0xdff3b3767ca8aa6al,
25026             0xa5de93b5627fb9e7l },
25027           0 },
25028     },
25029     {
25030         /* 0 << 208 */
25031         { { 0x00, 0x00, 0x00, 0x00 },
25032           { 0x00, 0x00, 0x00, 0x00 },
25033           1 },
25034         /* 1 << 208 */
25035         { { 0x75d9bc15adf7cccfl,0x81a3e5d6dfa1e1b0l,0x8c39e444249bc17el,
25036             0xf37dccb28ea7fd43l },
25037           { 0xda654873907fba12l,0x35daa6da4a372904l,0x0564cfc66283a6c5l,
25038             0xd09fa4f64a9395bfl },
25039           0 },
25040         /* 3 << 208 */
25041         { { 0xc51aa29e5cfe5c48l,0x82c020ae815ee096l,0x7848ad827549a68al,
25042             0x7933d48960471355l },
25043           { 0x04998d2e67c51e57l,0x0f64020ad9944afcl,0x7a299fe1a7fadac6l,
25044             0x40c73ff45aefe92cl },
25045           0 },
25046         /* 4 << 208 */
25047         { { 0xe5f649be9d8e68fdl,0xdb0f05331b044320l,0xf6fde9b3e0c33398l,
25048             0x92f4209b66c8cfael },
25049           { 0xe9d1afcc1a739d4bl,0x09aea75fa28ab8del,0x14375fb5eac6f1d0l,
25050             0x6420b560708f7aa5l },
25051           0 },
25052         /* 5 << 208 */
25053         { { 0xbf44ffc75488771al,0xcb76e3f17f2f2191l,0x4197bde394f86a42l,
25054             0x45c25bb970641d9al },
25055           { 0xd8a29e31f88ce6dcl,0xbe2becfd4bb7ac7dl,0x13094214b5670cc7l,
25056             0xe90a8fd560af8433l },
25057           0 },
25058         /* 7 << 208 */
25059         { { 0x0ecf9b8b4ebd3f02l,0xa47acd9d86b770eal,0x93b84a6a2da213cel,
25060             0xd760871b53e7c8cfl },
25061           { 0x7a5f58e536e530d7l,0x7abc52a51912ad51l,0x7ad43db02ea0252al,
25062             0x498b00ecc176b742l },
25063           0 },
25064         /* 9 << 208 */
25065         { { 0x9ff713ef888ae17fl,0x6007f68fb34b7bebl,0x5d2b18983b653d64l,
25066             0xcbf73e91d3ca4b1bl },
25067           { 0x4b050ad56cdfb3a1l,0x41bd3ec3d1f833a4l,0x78d7e2ee719d7bf5l,
25068             0xea4604672a27412el },
25069           0 },
25070         /* 10 << 208 */
25071         { { 0x7dad6d1b42cd7900l,0xb6e6b439e058f8a4l,0x8836f1e662aa3bbcl,
25072             0xd45bf2c811142b0al },
25073           { 0xae324bac3c045ed1l,0x372be24d270a8333l,0xeeda7a3a6b7c73b6l,
25074             0xf6675402db49562al },
25075           0 },
25076         /* 11 << 208 */
25077         { { 0xc312ba68441e760dl,0x84d0d061a50e512el,0xfe764f4e4bbdd849l,
25078             0xa924adcf9dadd5c0l },
25079           { 0x08685961debfe976l,0xd3d846c529fba601l,0x43bf8227dc3f4040l,
25080             0x05e767b8a49e9ff5l },
25081           0 },
25082         /* 13 << 208 */
25083         { { 0xc4689c309953e453l,0x5e355a2e1712dca5l,0x1ff83c81f1cd96f7l,
25084             0xb06b89fb44cf56dbl },
25085           { 0x1827705365f16e0dl,0x6403b91de5618672l,0xba3f9475be384bc6l,
25086             0x7f691cbe303ce5f3l },
25087           0 },
25088         /* 15 << 208 */
25089         { { 0x4589ba03210f4045l,0xd5e7366301e8012al,0x1c26052d74462ffal,
25090             0xe78f600c4f989519l },
25091           { 0xc63ca0c97cee0b2fl,0xbe588573af760b5fl,0x05906fc4593773cdl,
25092             0xd5970fb0e322d5afl },
25093           0 },
25094         /* 16 << 208 */
25095         { { 0x103c46e60ebcf726l,0x4482b8316231470el,0x6f6dfaca487c2109l,
25096             0x2e0ace9762e666efl },
25097           { 0x3246a9d31f8d1f42l,0x1b1e83f1574944d2l,0x13dfa63aa57f334bl,
25098             0x0cf8daed9f025d81l },
25099           0 },
25100         /* 17 << 208 */
25101         { { 0xf67c098aae0690aal,0x1a4656422b7bc62bl,0xaffc6b917220dea2l,
25102             0xd97ac543d2552deel },
25103           { 0x1f84514a7e816b8el,0xe9887e81a8f38552l,0x2e6358e6847ad46bl,
25104             0x1f67871e6bc9895el },
25105           0 },
25106         /* 19 << 208 */
25107         { { 0x2462b6e0d47f43fal,0x71db3610d8a245e5l,0x0c26b0e734208974l,
25108             0x0cd6d49d2029bd2el },
25109           { 0xf207c9f6091922b8l,0x0c476c5c7f0fbf66l,0x6de7efb2295d6da8l,
25110             0xea054ee10ced6cfel },
25111           0 },
25112         /* 21 << 208 */
25113         { { 0xd21496e3e9bd795cl,0xf293f617c6a557del,0x9d041b7239a45642l,
25114             0xe8353dab4ac87f80l },
25115           { 0x21e9f35620d8d019l,0x1f4adca9d2fb2668l,0xe5f68227dfecd64al,
25116             0x10d71b79d7f09ec0l },
25117           0 },
25118         /* 23 << 208 */
25119         { { 0xca3f068999f87118l,0x99a933911b2417f0l,0xa383481a3d1f70e5l,
25120             0x7a31a6c833b14414l },
25121           { 0x9d60f4368b2a9931l,0xd4c97ded80588534l,0x7cb29e82ab6a8bdal,
25122             0x3799bdad97b4c45al },
25123           0 },
25124         /* 25 << 208 */
25125         { { 0x51da0ff629011af3l,0xcbb03c809a4f0855l,0xea3536725555b10bl,
25126             0x4bf94e025c7da97el },
25127           { 0x384352f5ff713300l,0xb2c2b675192d41e6l,0x4ff66861625ca046l,
25128             0xf0f5e472013dddc4l },
25129           0 },
25130         /* 27 << 208 */
25131         { { 0x38c44cdc59987914l,0xad7f2829757fb853l,0x9aabf1c8688e3342l,
25132             0xbe0f1e4ef534c850l },
25133           { 0x732cac652ec24ecal,0x9328b657933bb5e4l,0xe2747ff60bb31033l,
25134             0xdbaab72cfcdc36acl },
25135           0 },
25136         /* 28 << 208 */
25137         { { 0x0e5e3049a639fc6bl,0xe75c35d986003625l,0x0cf35bd85dcc1646l,
25138             0x8bcaced26c26273al },
25139           { 0xe22ecf1db5536742l,0x013dd8971a9e068bl,0x17f411cb8a7909c5l,
25140             0x5757ac98861dd506l },
25141           0 },
25142         /* 29 << 208 */
25143         { { 0xaf410d5aac66a3e8l,0x39fcbffb2031f658l,0xd29e58c947ce11fbl,
25144             0x7f0b874965f73e49l },
25145           { 0xedc30f4b27fea6c6l,0xe03b9103d2baa340l,0xa7bb3f17ae680612l,
25146             0xe06656a8197af6f0l },
25147           0 },
25148         /* 31 << 208 */
25149         { { 0x84562095bff86165l,0x994194e916bc7589l,0xb1320c7ec14c6710l,
25150             0x508a8d7f766e978fl },
25151           { 0xd04adc9ec7e1f6fel,0x7bafaff68398cecfl,0x906df2fccef3b934l,
25152             0xc65afe18f3008c38l },
25153           0 },
25154         /* 33 << 208 */
25155         { { 0x477ffeeeab983130l,0x5426363a96e83d55l,0xcf0370a15204af42l,
25156             0x99834414b5a6ea8fl },
25157           { 0xf475ba711ab4ee8al,0x8486da5d0102d8f2l,0x55082e713839c821l,
25158             0xa57e58395b65defal },
25159           0 },
25160         /* 34 << 208 */
25161         { { 0x34b2185bbbb33a76l,0x189038b7d48158c2l,0xfa32eb90e9e90217l,
25162             0x79271771730e74dfl },
25163           { 0x315ed8c2a5d01ffdl,0x9799dae723e6a95el,0x40070aa016f5715al,
25164             0x40e6c0ca5ea51f8cl },
25165           0 },
25166         /* 35 << 208 */
25167         { { 0x099c0570d8132163l,0xcd5508a3023dbbf3l,0x18162ff526bfe6a6l,
25168             0xf39e071144bbb455l },
25169           { 0x49664996eaa3cf96l,0x1c6442d5e2649be9l,0x6199f740c01d269dl,
25170             0x4be605ee37542c11l },
25171           0 },
25172         /* 36 << 208 */
25173         { { 0xc7313e9cf36658f0l,0xc433ef1c71f8057el,0x853262461b6a835al,
25174             0xc8f053987c86394cl },
25175           { 0xff398cdfe983c4a1l,0xbf5e816203b7b931l,0x93193c46b7b9045bl,
25176             0x1e4ebf5da4a6e46bl },
25177           0 },
25178         /* 37 << 208 */
25179         { { 0xd032fbfd0dbf82b4l,0x707181f668e58969l,0xef434381e7be2d5el,
25180             0x290669176f2c64ddl },
25181           { 0xf66cffc3772769abl,0x68d8a76a17aad01cl,0xdd3991c590f6e078l,
25182             0xdb74db06ea4ac7dcl },
25183           0 },
25184         /* 39 << 208 */
25185         { { 0x9f34a7c11c78be71l,0x7bf2f2d149ca6987l,0xb528a514dcd34afcl,
25186             0x4dddb3f1183a68b1l },
25187           { 0x54d2626660b83883l,0x9073e4e0e0cd8dadl,0xbd2b837d9eb818b2l,
25188             0x5fa5f9086ae2e32dl },
25189           0 },
25190         /* 40 << 208 */
25191         { { 0xf9942a6043a24fe7l,0x29c1191effb3492bl,0x9f662449902fde05l,
25192             0xc792a7ac6713c32dl },
25193           { 0x2fd88ad8b737982cl,0x7e3a0319a21e60e3l,0x09b0de447383591al,
25194             0x6df141ee8310a456l },
25195           0 },
25196         /* 41 << 208 */
25197         { { 0xcd02ba1e0df98a64l,0x301b6bfa03f5676el,0x41e1a8d4a2fe4090l,
25198             0x489c1cbf47f0e1dcl },
25199           { 0x4171a98c20760847l,0xdcb21cee77af4796l,0x5fb0f0c9d0b7e981l,
25200             0x4c2791dff33b9f8dl },
25201           0 },
25202         /* 43 << 208 */
25203         { { 0x95d7ec0c50420a50l,0x5794665c2a6756d5l,0x73558c6e9101e7f5l,
25204             0xa3fa0f8c1642af0el },
25205           { 0xa11b309b4ee43551l,0x3939de30cb8fc712l,0x9710f2320fde8921l,
25206             0x2a4db2d5cae8b41cl },
25207           0 },
25208         /* 44 << 208 */
25209         { { 0xaec1a039e6d6f471l,0x14b2ba0f1198d12el,0xebc1a1603aeee5acl,
25210             0x401f4836e0b964cel },
25211           { 0x2ee437964fd03f66l,0x3fdb4e49dd8f3f12l,0x6ef267f629380f18l,
25212             0x3e8e96708da64d16l },
25213           0 },
25214         /* 45 << 208 */
25215         { { 0xdf6cdac0bc4c78adl,0xbe9e32182e97376el,0xa37f9d8b1a139274l,
25216             0x7640c3982807128el },
25217           { 0xe9735166c05b5f85l,0xbccd3675100e5716l,0x51376a293e5c9682l,
25218             0x95efe088848f6aeal },
25219           0 },
25220         /* 46 << 208 */
25221         { { 0xfac2d7dd23d14105l,0xdda17149a9136f52l,0xb9f3a9c672d1a99bl,
25222             0x2fcf532a142c3b20l },
25223           { 0xc2731f1e61190c1bl,0x26dbe810a76509e4l,0xc96cc431908bb92fl,
25224             0x5661a84d80e3e694l },
25225           0 },
25226         /* 47 << 208 */
25227         { { 0x5194d144150ba121l,0x8de57c48b6b11561l,0x803228da96c156d9l,
25228             0x2112e4250a8f6376l },
25229           { 0x15436294643449ffl,0xfc3880add4118cd0l,0x16ed90731e3f7413l,
25230             0xa400699901d38d6dl },
25231           0 },
25232         /* 48 << 208 */
25233         { { 0xbc19180c207674f1l,0x112e09a733ae8fdbl,0x996675546aaeb71el,
25234             0x79432af1e101b1c7l },
25235           { 0xd5eb558fde2ddec6l,0x81392d1f5357753fl,0xa7a76b973ae1158al,
25236             0x416fbbff4a899991l },
25237           0 },
25238         /* 49 << 208 */
25239         { { 0xf84c9147c52d7384l,0x86391accec01efa6l,0xffd68616f9c6f3f4l,
25240             0xc7536461b17c2de6l },
25241           { 0xa81f4ba10121abdfl,0xa068a2e26f6eae27l,0xe0ee90350eb159f0l,
25242             0x4c48f761fd8c4b9cl },
25243           0 },
25244         /* 51 << 208 */
25245         { { 0x4b6d71e87790000cl,0xced195744ce9293el,0xc25626a3747585e8l,
25246             0xb8307d22d7044270l },
25247           { 0xf08e7ef6117c24cbl,0xae6403162f660d04l,0xbc3ffdcff224a2fdl,
25248             0x1ebc0328d0586c7el },
25249           0 },
25250         /* 52 << 208 */
25251         { { 0x9e65fdfd0d4a9dcfl,0x7bc29e48944ddf12l,0xbc1a92d93c856866l,
25252             0x273c69056e98dfe2l },
25253           { 0x69fce418cdfaa6b8l,0x606bd8235061c69fl,0x42d495a06af75e27l,
25254             0x8ed3d5056d873a1fl },
25255           0 },
25256         /* 53 << 208 */
25257         { { 0x46b160e5a6022278l,0x86b1d50cc30a51fcl,0xe898ac0e684b81b7l,
25258             0x04d591e277b93597l },
25259           { 0xd20cac347626e18al,0xb49c941f0a968733l,0x054e6e7e21631627l,
25260             0xd6d33db9d4c716b1l },
25261           0 },
25262         /* 55 << 208 */
25263         { { 0xaa79ab4bf91e9b75l,0x7df3235bd34d961dl,0x9f3954e6534a40e1l,
25264             0x80f88d2c790b4456l },
25265           { 0x98f7711b21e9fb2al,0x0a04c318877d27e6l,0x499b7c2412338848l,
25266             0x0b1dbe9ccd5e7ec3l },
25267           0 },
25268         /* 57 << 208 */
25269         { { 0xb430ff44e04715ffl,0x671358d565d076d0l,0x3946d38f22c3aa06l,
25270             0x80919ea363b2d627l },
25271           { 0x14ffa219e8790922l,0xfe1d895ae8d89c48l,0x717e9e51748e806el,
25272             0xb91e1ddf550d711dl },
25273           0 },
25274         /* 59 << 208 */
25275         { { 0x8aac26225f540127l,0x57cd5d7cba25f742l,0x87006a6b1df7a0fcl,
25276             0x88e9ab863ecbf26cl },
25277           { 0xe1b8155f9143b314l,0xc00196130b679bddl,0x819e7b61a1871d07l,
25278             0xc36e7892cc2c9cc9l },
25279           0 },
25280         /* 60 << 208 */
25281         { { 0x4b03c55b8e33787fl,0xef42f975a6384673l,0xff7304f75051b9f0l,
25282             0x18aca1dc741c87c2l },
25283           { 0x56f120a72d4bfe80l,0xfd823b3d053e732cl,0x11bccfe47537ca16l,
25284             0xdf6c9c741b5a996bl },
25285           0 },
25286         /* 61 << 208 */
25287         { { 0x65729b05301ee370l,0x3ed09a2a24c2824cl,0x781ef66a33481977l,
25288             0xf2ccdeec193506d0l },
25289           { 0x92b4f70d703422d6l,0x7f004a43f80a1b99l,0x47db23607a856445l,
25290             0x783a8dd1ce5b0622l },
25291           0 },
25292         /* 63 << 208 */
25293         { { 0x7febefd34e9aac5al,0x601c89e2bdd6173el,0x79b08930c257431el,
25294             0x915d601d399ee099l },
25295           { 0xfa48347eca02acd2l,0xc33249baeeb7ccedl,0xd76e408755704722l,
25296             0xd3709c600dcf4878l },
25297           0 },
25298         /* 64 << 208 */
25299         { { 0xee7332c7904fc3fal,0x14a23f45c7e3636al,0xc38659c3f091d9aal,
25300             0x4a995e5db12d8540l },
25301           { 0x20a53becf3a5598al,0x56534b17b1eaa995l,0x9ed3dca4bf04e03cl,
25302             0x716c563ad8d56268l },
25303           0 },
25304         /* 65 << 208 */
25305         { { 0x963353201580f3adl,0x6c495304b0cd50d4l,0xd035cdc7555ff981l,
25306             0xe65cd063c6b6bdfbl },
25307           { 0x7deb3cbb437e749cl,0xa9de9f3db5dc24a1l,0xe2e76a2b35c29ffal,
25308             0x4d35e261323ba650l },
25309           0 },
25310         /* 71 << 208 */
25311         { { 0x52c46fc8c89e2766l,0x7330b02bb945e5f2l,0xc77ef75c2673ebbcl,
25312             0x1740e72657c33783l },
25313           { 0xf0312d29623565fbl,0xff9f707af0ca1ed9l,0xb98609ca5ea51a4al,
25314             0xde86b9a87b5cc91fl },
25315           0 },
25316         /* 77 << 208 */
25317         { { 0x0dece4badca158b7l,0x5e39baf6a3e9f837l,0xcf14e6dc4d57b640l,
25318             0x0548aaa4b67bcbe7l },
25319           { 0xb6cf5b393c90e434l,0xf8b3c5645006f3abl,0xa74e92859bf04bd9l,
25320             0xf59a3a6bf99c8977l },
25321           0 },
25322         /* 83 << 208 */
25323         { { 0x652ca66ac5b072d5l,0x2102b55993ad4928l,0x1b5f192d88210f9bl,
25324             0xb18710144c6ad7e5l },
25325           { 0x3979fde3bc0abf13l,0xb5cb4c7dac3fd631l,0x4aedffa6c200ec7bl,
25326             0x8aed81ceaddf3610l },
25327           0 },
25328         /* 89 << 208 */
25329         { { 0x72b48105abeefbael,0x0e9e6e41827bb22bl,0xf45ada151e52a848l,
25330             0xb8e94579534867a2l },
25331           { 0x3a08773b7adb0fdcl,0xe7133a28b83316dfl,0xc8b7b08c5bb41470l,
25332             0x28719eb4aaf140c7l },
25333           0 },
25334         /* 95 << 208 */
25335         { { 0x398996cd430007cel,0x20d8c0e07642d616l,0x81566639a7eb2397l,
25336             0x74aa0b692e133732l },
25337           { 0x326745907ba80aa7l,0x56a491c39bd69d64l,0xc8c8b040e54dcce0l,
25338             0x3f991872d571d037l },
25339           0 },
25340         /* 101 << 208 */
25341         { { 0x70e681fa4fb595c9l,0xf0635d6386b4d97bl,0xfc029284c1347081l,
25342             0x5a4e9cbe4fee0303l },
25343           { 0xd43da8609c31094fl,0x0412cfed6515b4aal,0x10fc06da8d53be86l,
25344             0x4b7b380b4bccc94dl },
25345           0 },
25346         /* 107 << 208 */
25347         { { 0x560d57408e7d6738l,0xa82268a8937f12a2l,0x87787b2d3d95b463l,
25348             0xb36539b2030e23bfl },
25349           { 0x60d16b8fd61e761dl,0x96ba2949fe8efccdl,0x8c170eda667fa7ebl,
25350             0xc880d74cf800d7c3l },
25351           0 },
25352         /* 113 << 208 */
25353         { { 0x7c05d6c1efcbfea0l,0xae7ba3291a2f6dd8l,0x521598ed5bd42ecfl,
25354             0x58e07842ef0ab40cl },
25355           { 0xae65105f66c752a5l,0x4910fba45f99d499l,0xbfdaf5fce9e44357l,
25356             0x6aaf4053796ee5b6l },
25357           0 },
25358         /* 116 << 208 */
25359         { { 0xf58fecb16f640f62l,0xe274b92b39f51946l,0x7f4dfc046288af44l,
25360             0x0a91f32aeac329e5l },
25361           { 0x43ad274bd6aaba31l,0x719a16400f6884f9l,0x685d29f6daf91e20l,
25362             0x5ec1cc3327e49d52l },
25363           0 },
25364         /* 119 << 208 */
25365         { { 0x615ac02527ba93edl,0x0d43915d3556ef47l,0x8c739fd1cb0cda89l,
25366             0xa2318169625f7a16l },
25367           { 0x17d486113e0479cel,0x814beb6038ee541el,0x09c9807fb98ef355l,
25368             0x4ad3668752d07af6l },
25369           0 },
25370         /* 125 << 208 */
25371         { { 0x5c1f42e444f3f568l,0xd743b7c078fb409bl,0xe09edccb6224362cl,
25372             0x7f13d140c5fe872cl },
25373           { 0x85e8cb88f403c0ebl,0x918a231b688d20a0l,0xc65b7ab9f246c73fl,
25374             0xda743fbf76dbd6adl },
25375           0 },
25376     },
25377     {
25378         /* 0 << 216 */
25379         { { 0x00, 0x00, 0x00, 0x00 },
25380           { 0x00, 0x00, 0x00, 0x00 },
25381           1 },
25382         /* 1 << 216 */
25383         { { 0xa0158eeae457a477l,0xd19857dbee6ddc05l,0xb326522418c41671l,
25384             0x3ffdfc7e3c2c0d58l },
25385           { 0x3a3a525426ee7cdal,0x341b0869df02c3a8l,0xa023bf42723bbfc8l,
25386             0x3d15002a14452691l },
25387           0 },
25388         /* 3 << 216 */
25389         { { 0xf3cae7e9262a3539l,0x78a49d1d6670d59el,0x37de0f63c1c5e1b9l,
25390             0x3072c30c69cb7c1cl },
25391           { 0x1d278a5277c850e6l,0x84f15f8f1f6a3de6l,0x46a8bb45592ca7adl,
25392             0x1912e3eee4d424b8l },
25393           0 },
25394         /* 4 << 216 */
25395         { { 0x6ba7a92079e5fb67l,0xe1331feb70aa725el,0x5080ccf57df5d837l,
25396             0xe4cae01d7ff72e21l },
25397           { 0xd9243ee60412a77dl,0x06ff7cacdf449025l,0xbe75f7cd23ef5a31l,
25398             0xbc9578220ddef7a8l },
25399           0 },
25400         /* 5 << 216 */
25401         { { 0xdc988086365e668bl,0xada8dcdaaabda5fbl,0xbc146b4c255f1fbel,
25402             0x9cfcde29cf34cfc3l },
25403           { 0xacbb453e7e85d1e4l,0x9ca09679f92358b5l,0x15fc2d96240823ffl,
25404             0x8d65adf70c11d11el },
25405           0 },
25406         /* 7 << 216 */
25407         { { 0x775557f10296f4fdl,0x1dca76a3ea51b436l,0xf3e98f60fb950805l,
25408             0x31ff32ea831cf7f1l },
25409           { 0x643e7bf18d2c714bl,0x64b5c3392e9d2acal,0xa9fd9ccc6adc2d23l,
25410             0xfc2397eccc721b9bl },
25411           0 },
25412         /* 9 << 216 */
25413         { { 0xf031182db48ec57dl,0x515d32f804b233b9l,0x06bbb1d4093aad26l,
25414             0x88a142fe0d83d1ecl },
25415           { 0x3b95c099245c73f8l,0xb126d4af52edcd32l,0xf8022c1e8fcb52e6l,
25416             0x5a51ac4c0106d339l },
25417           0 },
25418         /* 10 << 216 */
25419         { { 0xc589e1ce44ace150l,0xe0f8d3d94381e97cl,0x59e99b1162c5a4b8l,
25420             0x90d262f7fd0ec9f9l },
25421           { 0xfbc854c9283e13c9l,0x2d04fde7aedc7085l,0x057d776547dcbecbl,
25422             0x8dbdf5919a76fa5fl },
25423           0 },
25424         /* 11 << 216 */
25425         { { 0xb7f70a1a7c64a054l,0x0dc1c0df9db43e79l,0x6d0a4ae251fe63d6l,
25426             0xe0d5e3327f0c8abfl },
25427           { 0xff5500362b7ecee8l,0x3ea0e6f75d055008l,0x30deb62ff24ac84fl,
25428             0x936969fd5d7116b7l },
25429           0 },
25430         /* 13 << 216 */
25431         { { 0x02da76122617cf7fl,0xd6e25d4eeee35260l,0xb2fa5b0afd3533e9l,
25432             0xe76bb7b0b9126f88l },
25433           { 0x692e6a9988856866l,0x3fdf394f49db65cal,0x2529699122d8d606l,
25434             0xe815bfbf3dd7c4cfl },
25435           0 },
25436         /* 15 << 216 */
25437         { { 0x69c984ed4d844e7fl,0xd354b2174a2e8a82l,0x25bd4addfb2c4136l,
25438             0xf72df4de144b26e1l },
25439           { 0xd0aa9db0e6101afdl,0x4445efaae49bd1b8l,0x5dc54eee331593b2l,
25440             0xfa35e3b9094bf10bl },
25441           0 },
25442         /* 16 << 216 */
25443         { { 0xdb567d6ac42bd6d2l,0x6df86468bb1f96ael,0x0efe5b1a4843b28el,
25444             0x961bbb056379b240l },
25445           { 0xb6caf5f070a6a26bl,0x70686c0d328e6e39l,0x80da06cf895fc8d3l,
25446             0x804d8810b363fdc9l },
25447           0 },
25448         /* 17 << 216 */
25449         { { 0x660a0f893ea089c3l,0xa25823aac9009b09l,0xb2262d7ba681f5e5l,
25450             0x4fc30c8c3413863al },
25451           { 0x691544b7c32059f7l,0xf65cf276b21c6134l,0xe3a96b2a5104dabal,
25452             0xbb08d109a43ee42fl },
25453           0 },
25454         /* 19 << 216 */
25455         { { 0x85a52d69f9916861l,0x595469a4da4fa813l,0x1dd7786e3338502fl,
25456             0x34b8ef2853963ac5l },
25457           { 0xc0f019f81a891b25l,0xb619970c4f4bd775l,0x8c2a5af3be19f681l,
25458             0x9463db0498ec1728l },
25459           0 },
25460         /* 21 << 216 */
25461         { { 0xeb62c27801f39eabl,0x27de39340ab3a4aal,0xfbd17520a982ca8dl,
25462             0x58817ec2e4bdc6edl },
25463           { 0x312d78de31c6ac13l,0x9483bf7609202ea6l,0xf64ab8b622c6d8e1l,
25464             0xdddf589ce580de74l },
25465           0 },
25466         /* 23 << 216 */
25467         { { 0xe0fa3336ee98a92al,0x7d80eeef66a4d745l,0xb612531bba0119d3l,
25468             0x86e770c1b351fe15l },
25469           { 0xafbad6f882d5a397l,0x1e5f1cb80dbf0110l,0x25138ac09f79063dl,
25470             0x089ed22f2746a156l },
25471           0 },
25472         /* 25 << 216 */
25473         { { 0x198d1b5d7d8b8ddel,0xf32c11078dab37fbl,0xf15fcb6d42b93874l,
25474             0x91ddb74f41f94f84l },
25475           { 0x6a64540a271524b2l,0x950a0c12758b5a64l,0xf9f237933dce9580l,
25476             0xc8edd0ab2cf8ce32l },
25477           0 },
25478         /* 27 << 216 */
25479         { { 0xefc6357eae1046b7l,0xe6704929612932e4l,0xa20305d4b1355b17l,
25480             0x88a9136a58b4a156l },
25481           { 0xbc379985b4d275ecl,0x718b91316eaf338bl,0x61229a7ad152a509l,
25482             0x1109f7c445157ae9l },
25483           0 },
25484         /* 28 << 216 */
25485         { { 0xcf197ca7fb8088fal,0x014272474ddc96c5l,0xa2d2550a30777176l,
25486             0x534698984d0cf71dl },
25487           { 0x6ce937b83a2aaac6l,0xe9f91dc35af38d9bl,0x2598ad83c8bf2899l,
25488             0x8e706ac9b5536c16l },
25489           0 },
25490         /* 29 << 216 */
25491         { { 0x2bde42140df85c2cl,0x4fb839f4058a7a63l,0x7c10572a47f51231l,
25492             0x878826231989824el },
25493           { 0xa8293d2016e1564al,0xcb11c0f818c04576l,0x83b91e7d9740c631l,
25494             0xbdcb23d0cbffcea0l },
25495           0 },
25496         /* 31 << 216 */
25497         { { 0x64bdfd2a9094bfc8l,0x8558acc60fc54d1el,0x3992848faf27721el,
25498             0x7a8fcbdaa14cd009l },
25499           { 0x6de6120900a4b9c2l,0xbd192b1b20cf8f28l,0x2356b90168d9be83l,
25500             0xce1e7a944a49a48al },
25501           0 },
25502         /* 33 << 216 */
25503         { { 0x7630103b6ac189b9l,0x15d35edc6f1f5549l,0x9051799d31cb58edl,
25504             0xb4f32694a7a8579el },
25505           { 0x6f037435f2abe306l,0xf0595696410fb2f7l,0x2a0d347a5cc98f59l,
25506             0x9c19a9a87e3bbd69l },
25507           0 },
25508         /* 34 << 216 */
25509         { { 0x87f8df7c0e58d493l,0xb1ae5ed058b73f12l,0xc368f784dea0c34dl,
25510             0x9bd0a120859a91a0l },
25511           { 0xb00d88b7cc863c68l,0x3a1cc11e3d1f4d65l,0xea38e0e70aa85593l,
25512             0x37f13e987dc4aee8l },
25513           0 },
25514         /* 35 << 216 */
25515         { { 0x91dbe00e49430cd2l,0xcc67c0b17aa8ef6bl,0x769985b8a273f1a5l,
25516             0x358371dc360e5dafl },
25517           { 0xbf9b9127d6d8b5e8l,0x748ae12cb45588c1l,0x9c609eb556076c58l,
25518             0xf287489109733e89l },
25519           0 },
25520         /* 36 << 216 */
25521         { { 0x10d38667bc947badl,0x738e07ce2a36ee2el,0xc93470cdc577fcacl,
25522             0xdee1b6162782470dl },
25523           { 0x36a25e672e793d12l,0xd6aa6caee0f186dal,0x474d0fd980e07af7l,
25524             0xf7cdc47dba8a5cd4l },
25525           0 },
25526         /* 37 << 216 */
25527         { { 0xceb6aa80f8a08fddl,0xd98fc56f46fead7bl,0xe26bd3f8b07b3f1fl,
25528             0x3547e9b99d361c3el },
25529           { 0x1a89f802e94b8eccl,0x2210a590c0a40ef2l,0xe7e5b965afc01bf2l,
25530             0xca3d57fe234b936bl },
25531           0 },
25532         /* 39 << 216 */
25533         { { 0x9230a70db9f9e8cdl,0xa63cebfcb81ba2ecl,0x8482ca87a8f664d6l,
25534             0xa8ae78e00b137064l },
25535           { 0xb787bd558384c687l,0xfde1d1bdb29ae830l,0xc4a9b2e39f0b7535l,
25536             0x7e6c9a15efde2d01l },
25537           0 },
25538         /* 40 << 216 */
25539         { { 0x7d2e5c054f7269b1l,0xfcf30777e287c385l,0x10edc84ff2a46f21l,
25540             0x354417574f43fa36l },
25541           { 0xf1327899fd703431l,0xa438d7a616dd587al,0x65c34c57e9c8352dl,
25542             0xa728edab5cc5a24el },
25543           0 },
25544         /* 41 << 216 */
25545         { { 0xcd6e6db872896d4fl,0x324afa99896c4640l,0x37d18c3d33a292bdl,
25546             0x98dba3b44143421fl },
25547           { 0x2406f3c949c61b84l,0x402d974754899588l,0xc73b7fd634a485e5l,
25548             0x75c9bae08587f0c3l },
25549           0 },
25550         /* 43 << 216 */
25551         { { 0x6c32fa8cb0b4a04dl,0xeb58d0d875fda587l,0x61d8a157c4b86563l,
25552             0x92191bf01006b8afl },
25553           { 0xd04d3eff32d3478bl,0x3cc52eab2a684fc8l,0xb19a0f1625de54ccl,
25554             0x5c5295973620db2dl },
25555           0 },
25556         /* 44 << 216 */
25557         { { 0xa97b51265c3427b0l,0x6401405cd282c9bdl,0x3629f8d7222c5c45l,
25558             0xb1c02c16e8d50aedl },
25559           { 0xbea2ed75d9635bc9l,0x226790c76e24552fl,0x3c33f2a365f1d066l,
25560             0x2a43463e6dfccc2el },
25561           0 },
25562         /* 45 << 216 */
25563         { { 0x09b2e0d3b8da1e01l,0xa3a1a8fee9c0eb04l,0x59af5afe8bf653bal,
25564             0xba979f8bd0a54836l },
25565           { 0xa0d8194b51ee6ffbl,0x451c29e2f4b0586cl,0x7eb5fddb7471ee3dl,
25566             0x84b627d4bcb3afd8l },
25567           0 },
25568         /* 46 << 216 */
25569         { { 0x8cc3453adb483761l,0xe7cc608565d5672bl,0x277ed6cbde3efc87l,
25570             0x19f2f36869234eafl },
25571           { 0x9aaf43175c0b800bl,0x1f1e7c898b6da6e2l,0x6cfb4715b94ec75el,
25572             0xd590dd5f453118c2l },
25573           0 },
25574         /* 47 << 216 */
25575         { { 0xa70e9b0afb54e812l,0x092a0d7d8d86819bl,0x5421ff042e669090l,
25576             0x8af770c6b133c952l },
25577           { 0xc8e8dd596c8b1426l,0x1c92eb0e9523b483l,0x5a7c88f2cf3d40edl,
25578             0x4cc0c04bf5dd98f8l },
25579           0 },
25580         /* 48 << 216 */
25581         { { 0x14e49da11f17a34cl,0x5420ab39235a1456l,0xb76372412f50363bl,
25582             0x7b15d623c3fabb6el },
25583           { 0xa0ef40b1e274e49cl,0x5cf5074496b1860al,0xd6583fbf66afe5a4l,
25584             0x44240510f47e3e9al },
25585           0 },
25586         /* 49 << 216 */
25587         { { 0xb3939a8ffd617288l,0x3d37e5c2d68c2636l,0x4a595fac9d666c0el,
25588             0xfebcad9edb3a4978l },
25589           { 0x6d284a49c125016fl,0x05a7b9c80ee246a2l,0xe8b351739436c6e9l,
25590             0xffb89032d4be40b7l },
25591           0 },
25592         /* 51 << 216 */
25593         { { 0xba1387a5436ebf33l,0xc351a400e8d05267l,0x18645dde4259dbe8l,
25594             0x5fc32895c10fd676l },
25595           { 0x1ef7a944807f040el,0x9486b5c625738e5fl,0xc9e56cf4a7e3e96cl,
25596             0x34c7dc87a20be832l },
25597           0 },
25598         /* 52 << 216 */
25599         { { 0xe10d49996fe8393fl,0x0f809a3fe91f3a32l,0x61096d1c802f63c8l,
25600             0x289e146257750d3dl },
25601           { 0xed06167e9889feeal,0xd5c9c0e2e0993909l,0x46fca0d856508ac6l,
25602             0x918260474f1b8e83l },
25603           0 },
25604         /* 53 << 216 */
25605         { { 0x1d5f2ad7a9bf79cbl,0x228fb24fca9c2f98l,0x5f7c3883701c4b71l,
25606             0x18cf76c4ec42d686l },
25607           { 0x3680d2e94dcdec8dl,0x6d58e87ba0d60cb6l,0x72fbf086a0e513cfl,
25608             0xb922d3c5346ed99al },
25609           0 },
25610         /* 55 << 216 */
25611         { { 0x1678d658c2b9b874l,0x0e0b2c47f6360d4dl,0x01a45c02a0c9b9acl,
25612             0x05e82e9d0da69afbl },
25613           { 0x50be4001f28b8018l,0x503d967b667d8241l,0x6cd816534981da04l,
25614             0x9b18c3117f09c35fl },
25615           0 },
25616         /* 57 << 216 */
25617         { { 0xdfdfd5b409d22331l,0xf445126817f0c6a2l,0xe51d1aa8a5cde27bl,
25618             0xb61a12a37aaf9513l },
25619           { 0xe43a241d3b3ea114l,0x5c62b624366ae28dl,0x085a530db5f237eal,
25620             0x7c4ed375651205afl },
25621           0 },
25622         /* 59 << 216 */
25623         { { 0xf9de879dce842decl,0xe505320a94cedb89l,0xee55dae7f05ad888l,
25624             0x44ffbfa7f028b4efl },
25625           { 0xa3c1b32e63b2cd31l,0x201a058910c5ab29l,0x20f930afcd4085d6l,
25626             0xda79ed169f6ff24bl },
25627           0 },
25628         /* 60 << 216 */
25629         { { 0x7e8cfbcf704e23c6l,0xc71b7d2228aaa65bl,0xa041b2bd245e3c83l,
25630             0x69b98834d21854ffl },
25631           { 0x89d227a3963bfeecl,0x99947aaade7da7cbl,0x1d9ee9dbee68a9b1l,
25632             0x0a08f003698ec368l },
25633           0 },
25634         /* 61 << 216 */
25635         { { 0x04c64f33b0959be5l,0x182332ba396a7fe2l,0x4c5401e302e15b97l,
25636             0x92880f9877db104bl },
25637           { 0x0bf0b9cc21726a33l,0x780264741acc7b6dl,0x9721f621a26f08e3l,
25638             0xe3935b434197fed1l },
25639           0 },
25640         /* 63 << 216 */
25641         { { 0x0bffae503652be69l,0x395a9c6afb3fd5d8l,0x17f66adaa4fadfbfl,
25642             0x1ee92a35f9268f8cl },
25643           { 0x40ded34d6827781al,0xcd36224e34e63dccl,0xec90cf571cd1ef7al,
25644             0xf6067d578f72a3bfl },
25645           0 },
25646         /* 64 << 216 */
25647         { { 0x142b55021a93507al,0xb4cd11878d3c06cfl,0xdf70e76a91ec3f40l,
25648             0x484e81ad4e7553c2l },
25649           { 0x830f87b5272e9d6el,0xea1c93e5c6ff514al,0x67cc2adcc4192a8el,
25650             0xc77e27e242f4535al },
25651           0 },
25652         /* 65 << 216 */
25653         { { 0x537388d299e2f9d2l,0x15ead88612cd6d08l,0x33dfe3a769082d86l,
25654             0x0ef25f4266d79d40l },
25655           { 0x8035b4e546ba5cf1l,0x4e48f53711eec591l,0x40b56cda122a7aael,
25656             0x78e270211dbb79a7l },
25657           0 },
25658         /* 71 << 216 */
25659         { { 0x520b655355b4a5b1l,0xeee835cafb4f5fdel,0xb2ae86e59a823d7fl,
25660             0x24325f4fc084497fl },
25661           { 0x542bed4e6f0eefa4l,0x2909233b141792fdl,0x74bfc3bfc847a946l,
25662             0x8ec1d009e212cb44l },
25663           0 },
25664         /* 77 << 216 */
25665         { { 0xc2082b6d5cedd516l,0xaf148eadeafa3a10l,0x104cd5855ad63aa6l,
25666             0xe3fdbf8c78c11e1el },
25667           { 0x78651c493c25c24el,0x8064c4f37b7cce0el,0xa55441d4a6d8a928l,
25668             0x4525c40eb0db3adcl },
25669           0 },
25670         /* 83 << 216 */
25671         { { 0x5f69e49cfde6001el,0xc61e753aee59b47el,0xd0d4559971b0db5bl,
25672             0x7f76f7b45ad4acc3l },
25673           { 0xb0318a9c39830897l,0x2b15da22feef3822l,0x34049400acfb0753l,
25674             0x16f4fb51a5114ed4l },
25675           0 },
25676         /* 89 << 216 */
25677         { { 0x0b5c76928defbf10l,0xb9f1795cb79cdb6el,0xba17e7759a90317cl,
25678             0x3cb69cf950cf514bl },
25679           { 0x076cc4c1e5b892ffl,0x75724e8fb548b73cl,0x2ebcdb33248ff2e6l,
25680             0x1f12967be109b08fl },
25681           0 },
25682         /* 95 << 216 */
25683         { { 0x3f514c63461b7bb3l,0x3bdca5aa70afbad7l,0x368ce251eab3e38bl,
25684             0xdc0fb3300d101049l },
25685           { 0x7ce09abdff5013eel,0x926dd7dd7d10729dl,0xe6fe47ab6f486197l,
25686             0xd23964eaa6eb6903l },
25687           0 },
25688         /* 101 << 216 */
25689         { { 0x537ceb74eca30797l,0xf171bba557b0f338l,0x220a31fee831f1f8l,
25690             0xabbc2c7c5ae6bbbcl },
25691           { 0xaf7609f27eadfb60l,0x22cff1d58f28b51bl,0x63c3d76d6d1863bdl,
25692             0x3a6a2fb489e8a4c8l },
25693           0 },
25694         /* 107 << 216 */
25695         { { 0x9e74f8beb26e38f0l,0xc4c73fc4ea8bd55bl,0x086f688e1429e1fcl,
25696             0x91438ff40f78159fl },
25697           { 0x3571ae5f20810acbl,0x305edafe7451eb00l,0x8443c96d5704385cl,
25698             0xc03b234e542605b5l },
25699           0 },
25700         /* 113 << 216 */
25701         { { 0x2e5ff4fed85567c2l,0x136f49c7e4abd0c6l,0x5a68730cfb8a62d1l,
25702             0x101ebfd030bcb848l },
25703           { 0x634b0618fee950bbl,0xfa748d21c8aa65bal,0xc1d67c3e699f5560l,
25704             0x6fb0546cb22889d2l },
25705           0 },
25706         /* 116 << 216 */
25707         { { 0xa9784ebd9c95f0f9l,0x5ed9deb224640771l,0x31244af7035561c4l,
25708             0x87332f3a7ee857del },
25709           { 0x09e16e9e2b9e0d88l,0x52d910f456a06049l,0x507ed477a9592f48l,
25710             0x85cb917b2365d678l },
25711           0 },
25712         /* 119 << 216 */
25713         { { 0x6108f2b458a9d40dl,0xb036034838e15a52l,0xcc5610a3fd5625d6l,
25714             0x79825dd083b0418el },
25715           { 0xf83a95fc6324b6e5l,0x2463114deedfc4ebl,0x58b177e32250707fl,
25716             0x778dcd454af8d942l },
25717           0 },
25718         /* 125 << 216 */
25719         { { 0x1ecf2670eb816bf8l,0xa2d6e73aaa6d59c6l,0xf9a11434156852ebl,
25720             0x9bc9bb70f6f82c83l },
25721           { 0xd23a018d9c874836l,0xd26bf8bc6db5a8b5l,0x1d648846bec0c624l,
25722             0x39f15d97ef90302fl },
25723           0 },
25724     },
25725     {
25726         /* 0 << 224 */
25727         { { 0x00, 0x00, 0x00, 0x00 },
25728           { 0x00, 0x00, 0x00, 0x00 },
25729           1 },
25730         /* 1 << 224 */
25731         { { 0xe3417bc035d0b34al,0x440b386b8327c0a7l,0x8fb7262dac0362d1l,
25732             0x2c41114ce0cdf943l },
25733           { 0x2ba5cef1ad95a0b1l,0xc09b37a867d54362l,0x26d6cdd201e486c9l,
25734             0x20477abf42ff9297l },
25735           0 },
25736         /* 3 << 224 */
25737         { { 0x126f35b51e706ad9l,0xb99cebb4c3a9ebdfl,0xa75389afbf608d90l,
25738             0x76113c4fc6c89858l },
25739           { 0x80de8eb097e2b5aal,0x7e1022cc63b91304l,0x3bdab6056ccc066cl,
25740             0x33cbb144b2edf900l },
25741           0 },
25742         /* 4 << 224 */
25743         { { 0xc41764717af715d2l,0xe2f7f594d0134a96l,0x2c1873efa41ec956l,
25744             0xe4e7b4f677821304l },
25745           { 0xe5c8ff9788d5374al,0x2b915e6380823d5bl,0xea6bc755b2ee8fe2l,
25746             0x6657624ce7112651l },
25747           0 },
25748         /* 5 << 224 */
25749         { { 0x157af101dace5acal,0xc4fdbcf211a6a267l,0xdaddf340c49c8609l,
25750             0x97e49f52e9604a65l },
25751           { 0x9be8e790937e2ad5l,0x846e2508326e17f1l,0x3f38007a0bbbc0dcl,
25752             0xcf03603fb11e16d6l },
25753           0 },
25754         /* 7 << 224 */
25755         { { 0x5ed0c007f8ae7c38l,0x6db07a5c3d740192l,0xbe5e9c2a5fe36db3l,
25756             0xd5b9d57a76e95046l },
25757           { 0x54ac32e78eba20f2l,0xef11ca8f71b9a352l,0x305e373eff98a658l,
25758             0xffe5a100823eb667l },
25759           0 },
25760         /* 9 << 224 */
25761         { { 0x5c8ed8d5da64309dl,0x61a6de5691b30704l,0xd6b52f6a2f9b5808l,
25762             0x0eee419498c958a7l },
25763           { 0xcddd9aab771e4caal,0x83965dfd78bc21bel,0x02affce3b3b504f5l,
25764             0x30847a21561c8291l },
25765           0 },
25766         /* 10 << 224 */
25767         { { 0xd2eb2cf152bfda05l,0xe0e4c4e96197b98cl,0x1d35076cf8a1726fl,
25768             0x6c06085b2db11e3dl },
25769           { 0x15c0c4d74463ba14l,0x9d292f830030238cl,0x1311ee8b3727536dl,
25770             0xfeea86efbeaedc1el },
25771           0 },
25772         /* 11 << 224 */
25773         { { 0xb9d18cd366131e2el,0xf31d974f80fe2682l,0xb6e49e0fe4160289l,
25774             0x7c48ec0b08e92799l },
25775           { 0x818111d8d1989aa7l,0xb34fa0aaebf926f9l,0xdb5fe2f5a245474al,
25776             0xf80a6ebb3c7ca756l },
25777           0 },
25778         /* 13 << 224 */
25779         { { 0x8ea610593de9abe3l,0x404348819cdc03bel,0x9b261245cfedce8cl,
25780             0x78c318b4cf5234a1l },
25781           { 0x510bcf16fde24c99l,0x2a77cb75a2c2ff5dl,0x9c895c2b27960fb4l,
25782             0xd30ce975b0eda42bl },
25783           0 },
25784         /* 15 << 224 */
25785         { { 0x09521177ff57d051l,0x2ff38037fb6a1961l,0xfc0aba74a3d76ad4l,
25786             0x7c76480325a7ec17l },
25787           { 0x7532d75f48879bc8l,0xea7eacc058ce6bc1l,0xc82176b48e896c16l,
25788             0x9a30e0b22c750fedl },
25789           0 },
25790         /* 16 << 224 */
25791         { { 0xc37e2c2e421d3aa4l,0xf926407ce84fa840l,0x18abc03d1454e41cl,
25792             0x26605ecd3f7af644l },
25793           { 0x242341a6d6a5eabfl,0x1edb84f4216b668el,0xd836edb804010102l,
25794             0x5b337ce7945e1d8cl },
25795           0 },
25796         /* 17 << 224 */
25797         { { 0xd2075c77c055dc14l,0x2a0ffa2581d89cdfl,0x8ce815ea6ffdcbafl,
25798             0xa3428878fb648867l },
25799           { 0x277699cf884655fbl,0xfa5b5bd6364d3e41l,0x01f680c6441e1cb7l,
25800             0x3fd61e66b70a7d67l },
25801           0 },
25802         /* 19 << 224 */
25803         { { 0xfd5bb657b1fa70fbl,0xfa07f50fd8073a00l,0xf72e3aa7bca02500l,
25804             0xf68f895d9975740dl },
25805           { 0x301120605cae2a6al,0x01bd721802874842l,0x3d4238917ce47bd3l,
25806             0xa66663c1789544f6l },
25807           0 },
25808         /* 21 << 224 */
25809         { { 0xb4b9a39b36194d40l,0xe857a7c577612601l,0xf4209dd24ecf2f58l,
25810             0x82b9e66d5a033487l },
25811           { 0xc1e36934e4e8b9ddl,0xd2372c9da42377d7l,0x51dc94c70e3ae43bl,
25812             0x4c57761e04474f6fl },
25813           0 },
25814         /* 23 << 224 */
25815         { { 0xa39114e24415503bl,0xc08ff7c64cbb17e9l,0x1eff674dd7dec966l,
25816             0x6d4690af53376f63l },
25817           { 0xff6fe32eea74237bl,0xc436d17ecd57508el,0x15aa28e1edcc40fel,
25818             0x0d769c04581bbb44l },
25819           0 },
25820         /* 25 << 224 */
25821         { { 0xfe51d0296ae55043l,0x8931e98f44a87de1l,0xe57f1cc609e4fee2l,
25822             0x0d063b674e072d92l },
25823           { 0x70a998b9ed0e4316l,0xe74a736b306aca46l,0xecf0fbf24fda97c7l,
25824             0xa40f65cb3e178d93l },
25825           0 },
25826         /* 27 << 224 */
25827         { { 0x8667e981c27253c9l,0x05a6aefb92b36a45l,0xa62c4b369cb7bb46l,
25828             0x8394f37511f7027bl },
25829           { 0x747bc79c5f109d0fl,0xcad88a765b8cc60al,0x80c5a66b58f09e68l,
25830             0xe753d451f6127eacl },
25831           0 },
25832         /* 28 << 224 */
25833         { { 0xc44b74a15b0ec6f5l,0x47989fe45289b2b8l,0x745f848458d6fc73l,
25834             0xec362a6ff61c70abl },
25835           { 0x070c98a7b3a8ad41l,0x73a20fc07b63db51l,0xed2c2173f44c35f4l,
25836             0x8a56149d9acc9dcal },
25837           0 },
25838         /* 29 << 224 */
25839         { { 0x98f178819ac6e0f4l,0x360fdeafa413b5edl,0x0625b8f4a300b0fdl,
25840             0xf1f4d76a5b3222d3l },
25841           { 0x9d6f5109587f76b8l,0x8b4ee08d2317fdb5l,0x88089bb78c68b095l,
25842             0x95570e9a5808d9b9l },
25843           0 },
25844         /* 31 << 224 */
25845         { { 0x2e1284943fb42622l,0x3b2700ac500907d5l,0xf370fb091a95ec63l,
25846             0xf8f30be231b6dfbdl },
25847           { 0xf2b2f8d269e55f15l,0x1fead851cc1323e9l,0xfa366010d9e5eef6l,
25848             0x64d487b0e316107el },
25849           0 },
25850         /* 33 << 224 */
25851         { { 0xc9a9513929607745l,0x0ca07420a26f2b28l,0xcb2790e74bc6f9ddl,
25852             0x345bbb58adcaffc0l },
25853           { 0xc65ea38cbe0f27a2l,0x67c24d7c641fcb56l,0x2c25f0a7a9e2c757l,
25854             0x93f5cdb016f16c49l },
25855           0 },
25856         /* 34 << 224 */
25857         { { 0x2ca5a9d7c5ee30a1l,0xd1593635b909b729l,0x804ce9f3dadeff48l,
25858             0xec464751b07c30c3l },
25859           { 0x89d65ff39e49af6al,0xf2d6238a6f3d01bcl,0x1095561e0bced843l,
25860             0x51789e12c8a13fd8l },
25861           0 },
25862         /* 35 << 224 */
25863         { { 0xd633f929763231dfl,0x46df9f7de7cbddefl,0x01c889c0cb265da8l,
25864             0xfce1ad10af4336d2l },
25865           { 0x8d110df6fc6a0a7el,0xdd431b986da425dcl,0xcdc4aeab1834aabel,
25866             0x84deb1248439b7fcl },
25867           0 },
25868         /* 36 << 224 */
25869         { { 0x8796f1693c2a5998l,0x9b9247b47947190dl,0x55b9d9a511597014l,
25870             0x7e9dd70d7b1566eel },
25871           { 0x94ad78f7cbcd5e64l,0x0359ac179bd4c032l,0x3b11baaf7cc222ael,
25872             0xa6a6e284ba78e812l },
25873           0 },
25874         /* 37 << 224 */
25875         { { 0x8392053f24cea1a0l,0xc97bce4a33621491l,0x7eb1db3435399ee9l,
25876             0x473f78efece81ad1l },
25877           { 0x41d72fe0f63d3d0dl,0xe620b880afab62fcl,0x92096bc993158383l,
25878             0x41a213578f896f6cl },
25879           0 },
25880         /* 39 << 224 */
25881         { { 0x6fb4d4e42bad4d5fl,0xfa4c3590fef0059bl,0x6a10218af5122294l,
25882             0x9a78a81aa85751d1l },
25883           { 0x04f20579a98e84e7l,0xfe1242c04997e5b5l,0xe77a273bca21e1e4l,
25884             0xfcc8b1ef9411939dl },
25885           0 },
25886         /* 40 << 224 */
25887         { { 0xe20ea30292d0487al,0x1442dbec294b91fel,0x1f7a4afebb6b0e8fl,
25888             0x1700ef746889c318l },
25889           { 0xf5bbffc370f1fc62l,0x3b31d4b669c79ccal,0xe8bc2aaba7f6340dl,
25890             0xb0b08ab4a725e10al },
25891           0 },
25892         /* 41 << 224 */
25893         { { 0x44f05701ae340050l,0xba4b30161cf0c569l,0x5aa29f83fbe19a51l,
25894             0x1b9ed428b71d752el },
25895           { 0x1666e54eeb4819f5l,0x616cdfed9e18b75bl,0x112ed5be3ee27b0bl,
25896             0xfbf2831944c7de4dl },
25897           0 },
25898         /* 43 << 224 */
25899         { { 0x722eb104e2b4e075l,0x49987295437c4926l,0xb1e4c0e446a9b82dl,
25900             0xd0cb319757a006f5l },
25901           { 0xf3de0f7dd7808c56l,0xb5c54d8f51f89772l,0x500a114aadbd31aal,
25902             0x9afaaaa6295f6cabl },
25903           0 },
25904         /* 44 << 224 */
25905         { { 0x94705e2104cf667al,0xfc2a811b9d3935d7l,0x560b02806d09267cl,
25906             0xf19ed119f780e53bl },
25907           { 0xf0227c09067b6269l,0x967b85335caef599l,0x155b924368efeebcl,
25908             0xcd6d34f5c497bae6l },
25909           0 },
25910         /* 45 << 224 */
25911         { { 0x1dd8d5d36cceb370l,0x2aeac579a78d7bf9l,0x5d65017d70b67a62l,
25912             0x70c8e44f17c53f67l },
25913           { 0xd1fc095086a34d09l,0xe0fca256e7134907l,0xe24fa29c80fdd315l,
25914             0x2c4acd03d87499adl },
25915           0 },
25916         /* 46 << 224 */
25917         { { 0xbaaf75173b5a9ba6l,0xb9cbe1f612e51a51l,0xd88edae35e154897l,
25918             0xe4309c3c77b66ca0l },
25919           { 0xf5555805f67f3746l,0x85fc37baa36401ffl,0xdf86e2cad9499a53l,
25920             0x6270b2a3ecbc955bl },
25921           0 },
25922         /* 47 << 224 */
25923         { { 0xafae64f5974ad33bl,0x04d85977fe7b2df1l,0x2a3db3ff4ab03f73l,
25924             0x0b87878a8702740al },
25925           { 0x6d263f015a061732l,0xc25430cea32a1901l,0xf7ebab3ddb155018l,
25926             0x3a86f69363a9b78el },
25927           0 },
25928         /* 48 << 224 */
25929         { { 0x349ae368da9f3804l,0x470f07fea164349cl,0xd52f4cc98562baa5l,
25930             0xc74a9e862b290df3l },
25931           { 0xd3a1aa3543471a24l,0x239446beb8194511l,0xbec2dd0081dcd44dl,
25932             0xca3d7f0fc42ac82dl },
25933           0 },
25934         /* 49 << 224 */
25935         { { 0x1f3db085fdaf4520l,0xbb6d3e804549daf2l,0xf5969d8a19ad5c42l,
25936             0x7052b13ddbfd1511l },
25937           { 0x11890d1b682b9060l,0xa71d3883ac34452cl,0xa438055b783805b4l,
25938             0x432412774725b23el },
25939           0 },
25940         /* 51 << 224 */
25941         { { 0x40b08f7443b30ca8l,0xe10b5bbad9934583l,0xe8a546d6b51110adl,
25942             0x1dd50e6628e0b6c5l },
25943           { 0x292e9d54cff2b821l,0x3882555d47281760l,0x134838f83724d6e3l,
25944             0xf2c679e022ddcda1l },
25945           0 },
25946         /* 52 << 224 */
25947         { { 0x40ee88156d2a5768l,0x7f227bd21c1e7e2dl,0x487ba134d04ff443l,
25948             0x76e2ff3dc614e54bl },
25949           { 0x36b88d6fa3177ec7l,0xbf731d512328fff5l,0x758caea249ba158el,
25950             0x5ab8ff4c02938188l },
25951           0 },
25952         /* 53 << 224 */
25953         { { 0x33e1605635edc56dl,0x5a69d3497e940d79l,0x6c4fd00103866dcbl,
25954             0x20a38f574893cdefl },
25955           { 0xfbf3e790fac3a15bl,0x6ed7ea2e7a4f8e6bl,0xa663eb4fbc3aca86l,
25956             0x22061ea5080d53f7l },
25957           0 },
25958         /* 55 << 224 */
25959         { { 0x635a8e5ec3a0ee43l,0x70aaebca679898ffl,0x9ee9f5475dc63d56l,
25960             0xce987966ffb34d00l },
25961           { 0xf9f86b195e26310al,0x9e435484382a8ca8l,0x253bcb81c2352fe4l,
25962             0xa4eac8b04474b571l },
25963           0 },
25964         /* 57 << 224 */
25965         { { 0x2617f91c93aa96b8l,0x0fc8716b7fca2e13l,0xa7106f5e95328723l,
25966             0xd1c9c40b262e6522l },
25967           { 0xb9bafe8642b7c094l,0x1873439d1543c021l,0xe1baa5de5cbefd5dl,
25968             0xa363fc5e521e8affl },
25969           0 },
25970         /* 59 << 224 */
25971         { { 0xbc00fc2f2f8ba2c7l,0x0966eb2f7c67aa28l,0x13f7b5165a786972l,
25972             0x3bfb75578a2fbba0l },
25973           { 0x131c4f235a2b9620l,0xbff3ed276faf46bel,0x9b4473d17e172323l,
25974             0x421e8878339f6246l },
25975           0 },
25976         /* 60 << 224 */
25977         { { 0x0fa8587a25a41632l,0xc0814124a35b6c93l,0x2b18a9f559ebb8dbl,
25978             0x264e335776edb29cl },
25979           { 0xaf245ccdc87c51e2l,0x16b3015b501e6214l,0xbb31c5600a3882cel,
25980             0x6961bb94fec11e04l },
25981           0 },
25982         /* 61 << 224 */
25983         { { 0x3b825b8deff7a3a0l,0xbec33738b1df7326l,0x68ad747c99604a1fl,
25984             0xd154c9349a3bd499l },
25985           { 0xac33506f1cc7a906l,0x73bb53926c560e8fl,0x6428fcbe263e3944l,
25986             0xc11828d51c387434l },
25987           0 },
25988         /* 63 << 224 */
25989         { { 0x659b17c8d8ceb147l,0x9b649eeeb70a5554l,0x6b7fa0b5ac6bc634l,
25990             0xd99fe2c71d6e732fl },
25991           { 0x30e6e7628d3abba2l,0x18fee6e7a797b799l,0x5c9d360dc696464dl,
25992             0xe3baeb4827bfde12l },
25993           0 },
25994         /* 64 << 224 */
25995         { { 0x2bf5db47f23206d5l,0x2f6d34201d260152l,0x17b876533f8ff89al,
25996             0x5157c30c378fa458l },
25997           { 0x7517c5c52d4fb936l,0xef22f7ace6518cdcl,0xdeb483e6bf847a64l,
25998             0xf508455892e0fa89l },
25999           0 },
26000         /* 65 << 224 */
26001         { { 0xf77bb113a74ed3bel,0x89e4eb8f074f2637l,0x7fbfa84df7ce2aebl,
26002             0xe7c6ecd5baaefe4cl },
26003           { 0x176bba7df6319542l,0x70098120f6080799l,0x2e2118339054d9aal,
26004             0x1be4c6a78295a912l },
26005           0 },
26006         /* 71 << 224 */
26007         { { 0x6bb4d8c35df1455fl,0xb839f08f0384b033l,0x718868af11f95d50l,
26008             0xae256a92e07a8801l },
26009           { 0xa5bafaf24d71a273l,0x18ff04ea2a30e68fl,0x364c193287ba727el,
26010             0x4bb8cf99befcaf73l },
26011           0 },
26012         /* 77 << 224 */
26013         { { 0xc79f5b1f4e9fb3d7l,0x52854970a51cccddl,0xa4e27e97f00054a3l,
26014             0x26a79792240e1232l },
26015           { 0xb15579fecb5ff465l,0x6ef54c3bd1722a84l,0xee211bfa5239a4d8l,
26016             0x36c7db27270b7059l },
26017           0 },
26018         /* 83 << 224 */
26019         { { 0x5e7da0a9f9858cd3l,0x67459de5b633de49l,0x2db0d54b2e73892el,
26020             0x37f50877adae399al },
26021           { 0x83c28b83b65e6179l,0xae5a915ca39faf17l,0x6ab8f3fbe841b53cl,
26022             0x7c30997b0df7d004l },
26023           0 },
26024         /* 89 << 224 */
26025         { { 0x87904ca7b3b862bdl,0x7593db93cf9ea671l,0x8a2670f8739aa783l,
26026             0x3921d779f5154ca6l },
26027           { 0xe81ca56468f65ebbl,0x0c600603bc4e64d4l,0xdf170049cb83b2d1l,
26028             0x373893b863487064l },
26029           0 },
26030         /* 95 << 224 */
26031         { { 0x7c3c52b9c0c4e88el,0x0f0484d06f0c2446l,0xeb876827000fe87bl,
26032             0xa749b3136d20f94al },
26033           { 0x0876dae9d55abda6l,0xe6e4367620726911l,0xf85e8a8c4a2676b4l,
26034             0x4e8c97f1b4a890ebl },
26035           0 },
26036         /* 101 << 224 */
26037         { { 0xa992f482a3c0a4f4l,0xe1536f3f7a8d961al,0x26fc79ae000752b0l,
26038             0xdbfb706b76ad8508l },
26039           { 0x2642b2ed6f4cf9e4l,0xa013db54557fa7e2l,0x2ef711821d326116l,
26040             0x8dc3f5bcbafc83ecl },
26041           0 },
26042         /* 107 << 224 */
26043         { { 0x9671258578e5a201l,0xc71aca1de9125569l,0x360c45c0e2231379l,
26044             0x2d71783512e82369l },
26045           { 0x392432d3d84b2153l,0x502fd3f6d6939ffel,0x33c440ae6e766cacl,
26046             0x99f1fbee28062416l },
26047           0 },
26048         /* 113 << 224 */
26049         { { 0xe51ad841861604cbl,0x1ec9c54f630283a7l,0xcc42cad582a39473l,
26050             0xa2eb053709929c4al },
26051           { 0xe374459767f655a3l,0x9f54c2451d7f2674l,0xd85e9163fbc8aba5l,
26052             0x12fd0b55866bc892l },
26053           0 },
26054         /* 116 << 224 */
26055         { { 0x4f2c3063d7bd4661l,0xe533798d57a974ccl,0x44860d503ea02d85l,
26056             0xf2a7f4e5acaa0521l },
26057           { 0x05593061abb108f0l,0x56d1056044528309l,0x1f674df9c88b6d1el,
26058             0x19fdc4cbd8744c4dl },
26059           0 },
26060         /* 119 << 224 */
26061         { { 0xfd1488ec00f2f1d5l,0x24fcc67b44a825ddl,0xc7bfae2ea925a0f4l,
26062             0x5e03249cad59cf48l },
26063           { 0x1dc5a8e11af4844cl,0x89b2fbc58a598c20l,0xb0f56afff2078121l,
26064             0x8194012d4878bb0dl },
26065           0 },
26066         /* 125 << 224 */
26067         { { 0xc1cbe9d3a5ae1031l,0x38da74435706b987l,0x01844b55b353f188l,
26068             0x390c59ca87a807c5l },
26069           { 0x55ac7b1fb13b780cl,0x060970bff375c1cbl,0x8dd1f378c7ab4e5cl,
26070             0xcca782e5cf726645l },
26071           0 },
26072     },
26073     {
26074         /* 0 << 232 */
26075         { { 0x00, 0x00, 0x00, 0x00 },
26076           { 0x00, 0x00, 0x00, 0x00 },
26077           1 },
26078         /* 1 << 232 */
26079         { { 0x91213462f23f2d92l,0x6cab71bd60b94078l,0x6bdd0a63176cde20l,
26080             0x54c9b20cee4d54bcl },
26081           { 0x3cd2d8aa9f2ac02fl,0x03f8e617206eedb0l,0xc7f68e1693086434l,
26082             0x831469c592dd3db9l },
26083           0 },
26084         /* 3 << 232 */
26085         { { 0x4a9090cde36d0757l,0xf722d7b1d9a29382l,0xfb7fb04c04b48ddfl,
26086             0x628ad2a7ebe16f43l },
26087           { 0xcd3fbfb520226040l,0x6c34ecb15104b6c4l,0x30c0754ec903c188l,
26088             0xec336b082d23cab0l },
26089           0 },
26090         /* 4 << 232 */
26091         { { 0x9f51439e558df019l,0x230da4baac712b27l,0x518919e355185a24l,
26092             0x4dcefcdd84b78f50l },
26093           { 0xa7d90fb2a47d4c5al,0x55ac9abfb30e009el,0xfd2fc35974eed273l,
26094             0xb72d824cdbea8fafl },
26095           0 },
26096         /* 5 << 232 */
26097         { { 0xd213f923cbb13d1bl,0x98799f425bfb9bfel,0x1ae8ddc9701144a9l,
26098             0x0b8b3bb64c5595eel },
26099           { 0x0ea9ef2e3ecebb21l,0x17cb6c4b3671f9a7l,0x47ef464f726f1d1fl,
26100             0x171b94846943a276l },
26101           0 },
26102         /* 7 << 232 */
26103         { { 0xc9941109a607419dl,0xfaa71e62bb6bca80l,0x34158c1307c431f3l,
26104             0x594abebc992bc47al },
26105           { 0x6dfea691eb78399fl,0x48aafb353f42cba4l,0xedcd65af077c04f0l,
26106             0x1a29a366e884491al },
26107           0 },
26108         /* 9 << 232 */
26109         { { 0x7bf6a5c1f7ea25aal,0xd165e6bffbb07d5fl,0xe353936189e78671l,
26110             0xa3fcac892bac4219l },
26111           { 0xdfab6fd4f0baa8abl,0x5a4adac1e2c1c2e5l,0x6cd75e3140d85849l,
26112             0xce263fea19b39181l },
26113           0 },
26114         /* 10 << 232 */
26115         { { 0xb8d804a3315980cdl,0x693bc492fa3bebf7l,0x3578aeee2253c504l,
26116             0x158de498cd2474a2l },
26117           { 0x1331f5c7cfda8368l,0xd2d7bbb378d7177el,0xdf61133af3c1e46el,
26118             0x5836ce7dd30e7be8l },
26119           0 },
26120         /* 11 << 232 */
26121         { { 0xe042ece59a29a5c5l,0xb19b3c073b6c8402l,0xc97667c719d92684l,
26122             0xb5624622ebc66372l },
26123           { 0x0cb96e653c04fa02l,0x83a7176c8eaa39aal,0x2033561deaa1633fl,
26124             0x45a9d0864533df73l },
26125           0 },
26126         /* 13 << 232 */
26127         { { 0xa29ae9df5ece6e7cl,0x0603ac8f0facfb55l,0xcfe85b7adda233a5l,
26128             0xe618919fbd75f0b8l },
26129           { 0xf555a3d299bf1603l,0x1f43afc9f184255al,0xdcdaf341319a3e02l,
26130             0xd3b117ef03903a39l },
26131           0 },
26132         /* 15 << 232 */
26133         { { 0xb6b82fa74d82f4c2l,0x90725a606804efb3l,0xbc82ec46adc3425el,
26134             0xb7b805812787843el },
26135           { 0xdf46d91cdd1fc74cl,0xdc1c62cbe783a6c4l,0x59d1b9f31a04cbbal,
26136             0xd87f6f7295e40764l },
26137           0 },
26138         /* 16 << 232 */
26139         { { 0x196860411e84e0e5l,0xa5db84d3aea34c93l,0xf9d5bb197073a732l,
26140             0xb8d2fe566bcfd7c0l },
26141           { 0x45775f36f3eb82fal,0x8cb20cccfdff8b58l,0x1659b65f8374c110l,
26142             0xb8b4a422330c789al },
26143           0 },
26144         /* 17 << 232 */
26145         { { 0xa6312c9e8977d99bl,0xbe94433183f531e7l,0x8232c0c218d3b1d4l,
26146             0x617aae8be1247b73l },
26147           { 0x40153fc4282aec3bl,0xc6063d2ff7b8f823l,0x68f10e583304f94cl,
26148             0x31efae74ee676346l },
26149           0 },
26150         /* 19 << 232 */
26151         { { 0xd98bf2a43734e520l,0x5e3abbe3209bdcbal,0x77c76553bc945b35l,
26152             0x5331c093c6ef14aal },
26153           { 0x518ffe2976b60c80l,0x2285593b7ace16f8l,0xab1f64ccbe2b9784l,
26154             0xe8f2c0d9ab2421b6l },
26155           0 },
26156         /* 21 << 232 */
26157         { { 0x481dae5fd5ecfefcl,0x07084fd8c2bff8fcl,0x8040a01aea324596l,
26158             0x4c646980d4de4036l },
26159           { 0x9eb8ab4ed65abfc3l,0xe01cb91f13541ec7l,0x8f029adbfd695012l,
26160             0x9ae284833c7569ecl },
26161           0 },
26162         /* 23 << 232 */
26163         { { 0xc83605f6f10ff927l,0xd387145123739fc6l,0x6d163450cac1c2ccl,
26164             0x6b521296a2ec1ac5l },
26165           { 0x0606c4f96e3cb4a5l,0xe47d3f41778abff7l,0x425a8d5ebe8e3a45l,
26166             0x53ea9e97a6102160l },
26167           0 },
26168         /* 25 << 232 */
26169         { { 0x6b72fab526bc2797l,0x13670d1699f16771l,0x001700521e3e48d1l,
26170             0x978fe401b7adf678l },
26171           { 0x55ecfb92d41c5dd4l,0x5ff8e247c7b27da5l,0xe7518272013fb606l,
26172             0x5768d7e52f547a3cl },
26173           0 },
26174         /* 27 << 232 */
26175         { { 0x0e966e64c73b2383l,0x49eb3447d17d8762l,0xde1078218da05dabl,
26176             0x443d8baa016b7236l },
26177           { 0x163b63a5ea7610d6l,0xe47e4185ce1ca979l,0xae648b6580baa132l,
26178             0xebf53de20e0d5b64l },
26179           0 },
26180         /* 28 << 232 */
26181         { { 0x6ba535da9a85788bl,0xd21f03aebd0626d4l,0x099f8c47e873dc64l,
26182             0xcda8564d018ec97el },
26183           { 0x3e8d7a5cde92c68cl,0x78e035a173323cc4l,0x3ef26275f880ff7cl,
26184             0xa4ee3dff273eedaal },
26185           0 },
26186         /* 29 << 232 */
26187         { { 0x8bbaec49571d92acl,0x569e85fe4692517fl,0x8333b014a14ea4afl,
26188             0x32f2a62f12e5c5adl },
26189           { 0x98c2ce3a06d89b85l,0xb90741aa2ff77a08l,0x2530defc01f795a2l,
26190             0xd6e5ba0b84b3c199l },
26191           0 },
26192         /* 31 << 232 */
26193         { { 0x3d1b24cb28c682c6l,0x27f252288612575bl,0xb587c779e8e66e98l,
26194             0x7b0c03e9405eb1fel },
26195           { 0xfdf0d03015b548e7l,0xa8be76e038b36af7l,0x4cdab04a4f310c40l,
26196             0x6287223ef47ecaecl },
26197           0 },
26198         /* 33 << 232 */
26199         { { 0x0a4c6f3670ad54aal,0xc24cfd0d2a543909l,0xe1b0bc5b745c1a97l,
26200             0xb8431cfd68f0ddbfl },
26201           { 0x326357989ed8cb06l,0xa00a80ff759d2b7dl,0x81f335c190570e02l,
26202             0xbfccd89849c4e4d9l },
26203           0 },
26204         /* 34 << 232 */
26205         { { 0x4dcb646bfd16d8c4l,0x76a6b640e38ba57bl,0xd92de1f79d8ae7e2l,
26206             0x126f48f13f77f23bl },
26207           { 0xb7b53ca977e8abc2l,0x3faa17112c0787ffl,0xf8f9308c8e5762f8l,
26208             0x600a8a7f6b83aea8l },
26209           0 },
26210         /* 35 << 232 */
26211         { { 0xa2aed4a799aa03c0l,0x1f93b93da18b79c5l,0x7b4550b7314192c3l,
26212             0x9da00676272bb08el },
26213           { 0xe42f0d7e23e072edl,0x7ce76494888b5783l,0x4c7900203680b63bl,
26214             0x6040c83f662a8718l },
26215           0 },
26216         /* 36 << 232 */
26217         { { 0xba9e5c88a56d73edl,0x6c24f7712ca054d3l,0x4a37c235083beae1l,
26218             0x04a883b26483e9fdl },
26219           { 0x0c63f3aee27c2c5dl,0x0e1da88dae4671f1l,0xa577e8e25995e1dbl,
26220             0xbfc4b1b16ed6066al },
26221           0 },
26222         /* 37 << 232 */
26223         { { 0x8b398541f53d9e63l,0x4ab045bb019395cbl,0x69a1b90371dd70c7l,
26224             0xdedf284b38aaa431l },
26225           { 0xb45e245aaed3efe7l,0x49460905079f2facl,0xde4dee470845bd78l,
26226             0x0540524039d02ec3l },
26227           0 },
26228         /* 39 << 232 */
26229         { { 0x300cf051675cc986l,0x758afea99324219fl,0xf524c3fad5a93b5fl,
26230             0xb73385abc3864a8al },
26231           { 0xbde19289f6be9050l,0xbb9018558205a3f3l,0x99a9d14d229f6b89l,
26232             0x4c3a802f4336e68fl },
26233           0 },
26234         /* 40 << 232 */
26235         { { 0xdd4a12d8e12b31f8l,0x577e29bc177736e6l,0x2353722ba88935e8l,
26236             0xca1d3729015f286dl },
26237           { 0x86c7b6a239a3e035l,0x6e5250bfd3b03a9fl,0x79d98930fd0d536el,
26238             0x8c4cbbabfa0c3832l },
26239           0 },
26240         /* 41 << 232 */
26241         { { 0x92ecff374f8e6163l,0x171cc8830f35faeal,0xc5434242bcd36142l,
26242             0x707049adb28b63bbl },
26243           { 0xa1f4d1dbf6443da9l,0x002bb062dabc108bl,0x17287f171a272b08l,
26244             0x2a3aac8c884cf6bbl },
26245           0 },
26246         /* 43 << 232 */
26247         { { 0x55524645651c0a5al,0x14624a9703cf0d12l,0xca9315a8f884a9e2l,
26248             0x9840c6e2df7c9d59l },
26249           { 0xd96bd10a7438e8d5l,0x12be73d2b2f887del,0x5e47445dca2493efl,
26250             0x85aef555e9fff03el },
26251           0 },
26252         /* 44 << 232 */
26253         { { 0x169b38c9a43b2339l,0x884308d91732bfabl,0xe4b593a28ff202ddl,
26254             0xaf51d11f1e65376cl },
26255           { 0x6ec648de741525ffl,0xf93cbd369ff4c628l,0xc76df9efb1129c79l,
26256             0x31a5f2e2b7a67294l },
26257           0 },
26258         /* 45 << 232 */
26259         { { 0x0661bc02801d0e38l,0x4a37dc0e71fc46b7l,0x0b224cfc80c3e311l,
26260             0x2dd3d2779646a957l },
26261           { 0xfa45aa18ef524012l,0x5d2a2d0916185a09l,0x34d5c630b5313dcel,
26262             0xd9581ed151e4cf84l },
26263           0 },
26264         /* 46 << 232 */
26265         { { 0x5845aa4a8ebd2af8l,0x141404ecd3df43ccl,0xff3fc7681ffd48d9l,
26266             0x8a096e72e0cefb65l },
26267           { 0xc9c81cfdffc3a5cdl,0x7550aa3029b27cf9l,0x34dca72b65fa0380l,
26268             0xe8c5f6059ddd032bl },
26269           0 },
26270         /* 47 << 232 */
26271         { { 0xe53da8a46bfbadb3l,0x4a9dfa55afaeeb5el,0x076245ea6644b1d4l,
26272             0xc19be4012307bbcbl },
26273           { 0x097774c19d77318bl,0xacc8a1519cfd51c4l,0x736ef6b3ecaa7b08l,
26274             0x107479132d643a80l },
26275           0 },
26276         /* 48 << 232 */
26277         { { 0x2d500910cab91f1el,0xbedd9e444d1cd216l,0xd634b74fedd02252l,
26278             0xbd60f8e11258617al },
26279           { 0xd8c7537b9e05614al,0xfd26c766e7af5fc5l,0x0660b581582bd926l,
26280             0x87019244acf07fc8l },
26281           0 },
26282         /* 49 << 232 */
26283         { { 0xd4889fdf6220ae8el,0x745d67ec1abf1549l,0x957b2e3d2fb89c36l,
26284             0x9768c90edc62ada9l },
26285           { 0x90332fd748e6c46el,0x5aa5a4e54e90ef0dl,0x58838fd3ddcc8571l,
26286             0xd12f6c6f9a721126l },
26287           0 },
26288         /* 51 << 232 */
26289         { { 0x2f0fd0b2cec757bal,0x46a7a9c63032cd1dl,0x9af3a600547d7a77l,
26290             0x828e16eca43da1bal },
26291           { 0x0b303a66092a8d92l,0x78ba0389c23d08bal,0x52aed08d4616bd29l,
26292             0x4c0ff1210539c9fal },
26293           0 },
26294         /* 52 << 232 */
26295         { { 0x2c3b7322badcfe8el,0x6e0616fac5e25a04l,0x0a3c12753da6e4a2l,
26296             0xe46c957e077bca01l },
26297           { 0xb46ca4e3da4be64bl,0xa59bda668e75ee78l,0x41835184a4de98f2l,
26298             0x6efb1f924ed6a568l },
26299           0 },
26300         /* 53 << 232 */
26301         { { 0xbb8cdc094af1dd72l,0x93c0aa38a2460633l,0xf66f5d238a7ebc93l,
26302             0x43ecda843e8e37a6l },
26303           { 0x399da8265fd5139el,0x8b39930fd446f38el,0x114414135d2b68efl,
26304             0x8be163b8d1637c38l },
26305           0 },
26306         /* 55 << 232 */
26307         { { 0x488e2a35b70ddbd3l,0xb4aa5f718da50077l,0xb38b74b1d8752bbdl,
26308             0x7007f328416106a3l },
26309           { 0xe6a62e4fcec4ea68l,0x9fdfb79741ef920bl,0x1a19d7dfe3c337a6l,
26310             0x08f643558be0f586l },
26311           0 },
26312         /* 57 << 232 */
26313         { { 0x91a5d8ff60343a1fl,0x921e442173ef8cdfl,0x4358f27b975138cdl,
26314             0x36fd8577a4992b08l },
26315           { 0xc07c8ca1f8d044c6l,0xcf42903687747b6bl,0x0932ffb0867c8632l,
26316             0x7e565213250e5a89l },
26317           0 },
26318         /* 59 << 232 */
26319         { { 0xae7c3b9b06255feal,0x2eb1d9a78a6fe229l,0xf81548e77601e6f8l,
26320             0x777394eb7bd96d6cl },
26321           { 0x54734187000a3509l,0xaeec146492d43c04l,0xc9b7f0d7c428b4acl,
26322             0x9d4bcedccd7f7018l },
26323           0 },
26324         /* 60 << 232 */
26325         { { 0x4741b9b311370605l,0x47fa72f75d09b355l,0x391a71ac7a144c6al,
26326             0x0808c0f498b6e3cal },
26327           { 0x7eaed9ef7fe53900l,0xf157a2a5e5a830bal,0xd13ec09127974afcl,
26328             0x78d710a70b87997dl },
26329           0 },
26330         /* 61 << 232 */
26331         { { 0xcbb96ecb4e263f81l,0x093e0d1509084351l,0x7af3232629220a81l,
26332             0xd721b415c60f36dcl },
26333           { 0xe3340a87fe9387a1l,0x6088bf482ff2b126l,0xd31028f1d2bc982cl,
26334             0x9794e106630d52cbl },
26335           0 },
26336         /* 63 << 232 */
26337         { { 0x1dac76780b11e972l,0x46e814c62698dafel,0x553f7370c37640d6l,
26338             0xdcf588cc51cede93l },
26339           { 0x4d6b56d3c3f6215bl,0x07edc6621b8f8f03l,0xdfef9d60b9a5dfbcl,
26340             0x377edf4d10af7a5bl },
26341           0 },
26342         /* 64 << 232 */
26343         { { 0x8928e99aeeaf8c49l,0xee7aa73d6e24d728l,0x4c5007c2e72b156cl,
26344             0x5fcf57c5ed408a1dl },
26345           { 0x9f719e39b6057604l,0x7d343c01c2868bbfl,0x2cca254b7e103e2dl,
26346             0xe6eb38a9f131bea2l },
26347           0 },
26348         /* 65 << 232 */
26349         { { 0x26ae28bede7a4b7el,0xd2f07569d2664163l,0x798690d4ff69266al,
26350             0x77093d356ef3695dl },
26351           { 0xaca9903d567dd3dfl,0x259c59a3a274c67bl,0x9f34bc0bfc1198b0l,
26352             0x51a7726290b1521cl },
26353           0 },
26354         /* 71 << 232 */
26355         { { 0xa20644bc80ca5391l,0xf9cdb4f7e5b36ea3l,0xe7936c0641426e22l,
26356             0x39bc23033eef8a52l },
26357           { 0x31253f43e5d8f896l,0xb0e5a588dc3df499l,0x1d03519a2d7e66d5l,
26358             0x923de91f6d7da5e3l },
26359           0 },
26360         /* 77 << 232 */
26361         { { 0x17a833ffedf861e4l,0x0ee3d0af4ebec965l,0xd0fac1c1ea66870el,
26362             0x325756d0ae810cf4l },
26363           { 0x4ed78d2c78e9a415l,0x6cc65685192046e4l,0x03e4243d8498a91el,
26364             0x56a02dd25ab97794l },
26365           0 },
26366         /* 83 << 232 */
26367         { { 0xc2fd373748e2b156l,0x259e9a98139645bel,0xe90106fb9877b4f1l,
26368             0x49e5bac5889ce002l },
26369           { 0x936a7dd18cf14e0bl,0x70bf6d304e3a8a01l,0x99d3e8bfeb748b62l,
26370             0xa52a27c99b31c55cl },
26371           0 },
26372         /* 89 << 232 */
26373         { { 0x9db1d41d300637d5l,0xe38744397c2dd836l,0x36179baf0d04ceb3l,
26374             0xe9ccd17b251b3f2dl },
26375           { 0xd8228073442b6d1dl,0x59a038363eed2971l,0xb443732046979f5cl,
26376             0x54ad4113ae63937cl },
26377           0 },
26378         /* 95 << 232 */
26379         { { 0x092c34e6d9246e9fl,0xb4b3b63d3eeb18a7l,0x8b3778beed9d1383l,
26380             0xe4cb7be9d70d5d80l },
26381           { 0xcff12e9b3d059203l,0x277af117ba86699fl,0x9bd4e8e363603585l,
26382             0x0750b0f28e89c8d5l },
26383           0 },
26384         /* 101 << 232 */
26385         { { 0x38b77e5958f7187bl,0x31c7068de0cb618el,0xa0f8e0d6c11ebe62l,
26386             0x07adc8010473d7ebl },
26387           { 0x36161a2c5c3e9510l,0xb2ec90d64ad04815l,0x01e2dd1f917d8166l,
26388             0x549bcbdd6aa0f794l },
26389           0 },
26390         /* 107 << 232 */
26391         { { 0x4ab27c3a8e4e45e5l,0xf6bd9d82f2bb99e7l,0xcab48c735e9da59fl,
26392             0xdeb09eb2b9727353l },
26393           { 0xc4a7954bafb8fa3el,0x34af2a49abf6803dl,0xc1ee1416d63e13bbl,
26394             0xd49bf42d7a949193l },
26395           0 },
26396         /* 113 << 232 */
26397         { { 0x504823ea9c9c07c6l,0x9dbec902bee2288cl,0x018d7875f0ceb6bbl,
26398             0x678b997304f7022cl },
26399           { 0x74d658238c5fb369l,0x7d4e1f114ca89ee8l,0x148316399905abc0l,
26400             0xc107324e2c4deff4l },
26401           0 },
26402         /* 116 << 232 */
26403         { { 0x1bc4fa8bdadc4404l,0x0edb9534daa12ee3l,0x084481b6a5f7289cl,
26404             0x7f42461d9d8fb3d2l },
26405           { 0xf93f1d3212293c70l,0xc14706596bb73ea3l,0xf80834afde339cadl,
26406             0x99dcfc0081f22953l },
26407           0 },
26408         /* 119 << 232 */
26409         { { 0x497e544f9fca737el,0x7f6342210e91e1afl,0x638e500c78d7b20bl,
26410             0xb1ffed3f7ebaa947l },
26411           { 0x751aa54871086f83l,0x8100bb703cf97848l,0xc32f91ace19ad68fl,
26412             0x7dffb6851fb9157el },
26413           0 },
26414         /* 125 << 232 */
26415         { { 0x5108589778e25060l,0x33e3cb7316cfe6cbl,0x0884cb8d410c0822l,
26416             0xaa806ecc0be3fc94l },
26417           { 0x9f9121f5f692353el,0xb9ab0310f8ee3349l,0x390032ce2561973el,
26418             0xc07b6c6c8856b766l },
26419           0 },
26420     },
26421     {
26422         /* 0 << 240 */
26423         { { 0x00, 0x00, 0x00, 0x00 },
26424           { 0x00, 0x00, 0x00, 0x00 },
26425           1 },
26426         /* 1 << 240 */
26427         { { 0x1083e2ea1f095615l,0x0a28ad7714e68c33l,0x6bfc02523d8818bel,
26428             0xb585113af35850cdl },
26429           { 0x7d935f0b30df8aa1l,0xaddda07c4ab7e3acl,0x92c34299552f00cbl,
26430             0xc33ed1de2909df6cl },
26431           0 },
26432         /* 3 << 240 */
26433         { { 0xabe7905a83cdd60el,0x50602fb5a1170184l,0x689886cdb023642al,
26434             0xd568d090a6e1fb00l },
26435           { 0x5b1922c70259217fl,0x93831cd9c43141e4l,0xdfca35870c95f86el,
26436             0xdec2057a568ae828l },
26437           0 },
26438         /* 4 << 240 */
26439         { { 0x568f8925913cc16dl,0x18bc5b6de1a26f5al,0xdfa413bef5f499ael,
26440             0xf8835decc3f0ae84l },
26441           { 0xb6e60bd865a40ab0l,0x65596439194b377el,0xbcd8562592084a69l,
26442             0x5ce433b94f23ede0l },
26443           0 },
26444         /* 5 << 240 */
26445         { { 0x860d523d42e06189l,0xbf0779414e3aff13l,0x0b616dcac1b20650l,
26446             0xe66dd6d12131300dl },
26447           { 0xd4a0fd67ff99abdel,0xc9903550c7aac50dl,0x022ecf8b7c46b2d7l,
26448             0x3333b1e83abf92afl },
26449           0 },
26450         /* 7 << 240 */
26451         { { 0xefecdef7be42a582l,0xd3fc608065046be6l,0xc9af13c809e8dba9l,
26452             0x1e6c9847641491ffl },
26453           { 0x3b574925d30c31f7l,0xb7eb72baac2a2122l,0x776a0dacef0859e7l,
26454             0x06fec31421900942l },
26455           0 },
26456         /* 9 << 240 */
26457         { { 0x7ec62fbbf4737f21l,0xd8dba5ab6209f5acl,0x24b5d7a9a5f9adbel,
26458             0x707d28f7a61dc768l },
26459           { 0x7711460bcaa999eal,0xba7b174d1c92e4ccl,0x3c4bab6618d4bf2dl,
26460             0xb8f0c980eb8bd279l },
26461           0 },
26462         /* 10 << 240 */
26463         { { 0x9d658932790691bfl,0xed61058906b736ael,0x712c2f04c0d63b6el,
26464             0x5cf06fd5c63d488fl },
26465           { 0x97363facd9588e41l,0x1f9bf7622b93257el,0xa9d1ffc4667acacel,
26466             0x1cf4a1aa0a061ecfl },
26467           0 },
26468         /* 11 << 240 */
26469         { { 0x28d675b2c0519a23l,0x9ebf94fe4f6952e3l,0xf28bb767a2294a8al,
26470             0x85512b4dfe0af3f5l },
26471           { 0x18958ba899b16a0dl,0x95c2430cba7548a7l,0xb30d1b10a16be615l,
26472             0xe3ebbb9785bfb74cl },
26473           0 },
26474         /* 13 << 240 */
26475         { { 0x81eeb865d2fdca23l,0x5a15ee08cc8ef895l,0x768fa10a01905614l,
26476             0xeff5b8ef880ee19bl },
26477           { 0xf0c0cabbcb1c8a0el,0x2e1ee9cdb8c838f9l,0x0587d8b88a4a14c0l,
26478             0xf6f278962ff698e5l },
26479           0 },
26480         /* 15 << 240 */
26481         { { 0x9c4b646e9e2fce99l,0x68a210811e80857fl,0x06d54e443643b52al,
26482             0xde8d6d630d8eb843l },
26483           { 0x7032156342146a0al,0x8ba826f25eaa3622l,0x227a58bd86138787l,
26484             0x43b6c03c10281d37l },
26485           0 },
26486         /* 16 << 240 */
26487         { { 0x02b37a952f41deffl,0x0e44a59ae63b89b7l,0x673257dc143ff951l,
26488             0x19c02205d752baf4l },
26489           { 0x46c23069c4b7d692l,0x2e6392c3fd1502acl,0x6057b1a21b220846l,
26490             0xe51ff9460c1b5b63l },
26491           0 },
26492         /* 17 << 240 */
26493         { { 0x7aca2632f02fc0f0l,0xb92b337dc7f01c86l,0x624bc4bf5afbdc7dl,
26494             0x812b07bc4de21a5el },
26495           { 0x29d137240b2090ccl,0x0403c5095a1b2132l,0x1dca34d50e35e015l,
26496             0xf085ed7d3bbbb66fl },
26497           0 },
26498         /* 19 << 240 */
26499         { { 0xc27b98f9f781e865l,0x51e1f692994e1345l,0x0807d516e19361eel,
26500             0x13885ceffb998aefl },
26501           { 0xd223d5e92f0f8a17l,0x48672010e8d20280l,0x6f02fd60237eac98l,
26502             0xcc51bfad9ada7ee7l },
26503           0 },
26504         /* 21 << 240 */
26505         { { 0x2756bcdd1e09701dl,0x94e31db990d45c80l,0xb9e856a98566e584l,
26506             0x4f87d9deab10e3f3l },
26507           { 0x166ecb373ded9cb2l,0xfd14c7073f653d3el,0x105d049b92aec425l,
26508             0x7f657e4909a42e11l },
26509           0 },
26510         /* 23 << 240 */
26511         { { 0xea6490076a159594l,0x3e424d6b1f97ce52l,0xac6df30a185e8ccbl,
26512             0xad56ec80517747bfl },
26513           { 0xf0935ccf4391fe93l,0x866b260f03811d40l,0x792047b99f7b9abel,
26514             0xb1600bc88ee42d84l },
26515           0 },
26516         /* 25 << 240 */
26517         { { 0x2d97b3db7768a85fl,0x2b78f6334287e038l,0x86c947676f892bb1l,
26518             0x920bfb1ac0a9c200l },
26519           { 0x4292f6ec332041b2l,0xa30bb937c9989d54l,0x39f941ebc6d5879el,
26520             0x76a450fcdfdbb187l },
26521           0 },
26522         /* 27 << 240 */
26523         { { 0x31256089ee430db6l,0xaece9bd8f6836f56l,0x484cfc4bfb85a046l,
26524             0xee1e3e2c1599b2b9l },
26525           { 0x7e3c38903d122eafl,0xaa940ce0c770556cl,0x4802d6631b08fae8l,
26526             0xb08a85807f69f8bal },
26527           0 },
26528         /* 28 << 240 */
26529         { { 0x70ed0a0405411eael,0x60deb08f16494c66l,0x8cf20fc6133797bbl,
26530             0x3e30f4f50c6bc310l },
26531           { 0x1a677c29749c46c7l,0xfe1d93f4f11e981cl,0x937303d82e3e688bl,
26532             0x01aef5a7a6aa9e85l },
26533           0 },
26534         /* 29 << 240 */
26535         { { 0x4902f495b959b920l,0x13b0fdbdfca2d885l,0x41cbd9e7b6a2f0fal,
26536             0xf9bdf11056430b87l },
26537           { 0xd705a223954d19b9l,0x74d0fc5c972a4fdel,0xcbcbfed6912977eal,
26538             0x870611fdcc59a5afl },
26539           0 },
26540         /* 31 << 240 */
26541         { { 0xf4f19bd04089236al,0x3b206c12313d0e0bl,0x73e70df303feaeb2l,
26542             0x09dba0eb9bd1efe0l },
26543           { 0x4c7fd532fc4e5305l,0xd792ffede93d787al,0xc72dc4e2e4245010l,
26544             0xe7e0d47d0466bbbdl },
26545           0 },
26546         /* 33 << 240 */
26547         { { 0x549c861983e4f8bbl,0xf70133fbd8e06829l,0xc962b8e28c64e849l,
26548             0xad87f5b1901e4c25l },
26549           { 0xd005bde568a1cab5l,0x6a591acf0d2a95bal,0x728f14ce30ebcae4l,
26550             0x303cec99a3459b0fl },
26551           0 },
26552         /* 34 << 240 */
26553         { { 0x62e62f258350e6bcl,0x5a5ea94d96adba1fl,0x36c2a2844a23c7b3l,
26554             0x32f50a72992f5c8bl },
26555           { 0x55d685204136c6afl,0x1aafd32992794f20l,0x69f5d820b59aa9bfl,
26556             0x218966a8570e209al },
26557           0 },
26558         /* 35 << 240 */
26559         { { 0xf3204feb2f9a31fcl,0x77f33a360429f463l,0xfb9f3a5a59a1d6a7l,
26560             0x4445a2e93b1a78e0l },
26561           { 0xc77a9b6fd58e32d3l,0xa44e23c8302e6390l,0x7d8e00b4c0f7bcb0l,
26562             0xd2e2237b0ffa46f4l },
26563           0 },
26564         /* 36 << 240 */
26565         { { 0xb3046cb13c8ea6d3l,0xf0151b5efce2f445l,0xa968e60b55e5715el,
26566             0x39e52662587dce61l },
26567           { 0xfde176e0b7de2862l,0x298d83e68e8db497l,0x1042136773641bfbl,
26568             0xd72ac78d36e0bb0dl },
26569           0 },
26570         /* 37 << 240 */
26571         { { 0x2cabb94fff6b8340l,0xf425a35a21771acbl,0x564fec3d12c4a758l,
26572             0x57a61af39ba8f281l },
26573           { 0x5807e78c97e9a71dl,0x991d9be75b8314e6l,0x1cd90b16ec4133b9l,
26574             0xff043efa0f1ac621l },
26575           0 },
26576         /* 39 << 240 */
26577         { { 0xea6e5527d7e58321l,0xfb95c13c04056ff1l,0x9447361f2fc4e732l,
26578             0x63cbc655786d0154l },
26579           { 0x302c0d668610fb71l,0xbf692d6920d06613l,0x8465b74b4be8355al,
26580             0xcc883c95c31356b7l },
26581           0 },
26582         /* 40 << 240 */
26583         { { 0x4ab6e919b33eabcal,0xb58f0998a1acacbfl,0xa747e5782ddbc28fl,
26584             0xf9dd04ca59866cbcl },
26585           { 0x084c062ff7a0073fl,0x6d22acdfb577fc38l,0x0870ee08eacd907cl,
26586             0x710b4b266c9fcf95l },
26587           0 },
26588         /* 41 << 240 */
26589         { { 0xa99546faf1c835a7l,0x1514a5a30d59f933l,0x1f6ad0f81bedd730l,
26590             0x24de76287b528aaal },
26591           { 0x4d9e7845c02fff87l,0xba74f8a942c79e67l,0x5bf5015f476e285bl,
26592             0x0b1a5d8b1b93b364l },
26593           0 },
26594         /* 43 << 240 */
26595         { { 0x8c7c0d7ff839819fl,0xc82b819827a95965l,0xce7294d377270519l,
26596             0xfb508d6cad47aff7l },
26597           { 0xf6de15431035076al,0x697d60ac5dd465c6l,0x88d771b8a76dcd26l,
26598             0x8c7ce11ab10c9c44l },
26599           0 },
26600         /* 44 << 240 */
26601         { { 0x215ea44a08216060l,0xccfa18a187996cf6l,0xccfb2483f7eccdd2l,
26602             0x07aa601ad453c66al },
26603           { 0xd43cf263cffee9e2l,0x230bc099718f69bfl,0xc43de21300c193e8l,
26604             0x94cf251799c8746fl },
26605           0 },
26606         /* 45 << 240 */
26607         { { 0x4785d7f87d1320c5l,0x84bed8c3d0771dcbl,0xff28044d22254edbl,
26608             0x2e5992a445f71504l },
26609           { 0xcb92695b72bbf5cdl,0x9bcbde35c42422e5l,0x856594fd1d07ed86l,
26610             0x3aaf0b717716b4ffl },
26611           0 },
26612         /* 46 << 240 */
26613         { { 0x3edf24f9eebed405l,0x9e3141360eccb503l,0xf7704c25b85c2bc2l,
26614             0x4cb7c1de9a3247eel },
26615           { 0x798ac8f2f0b507c5l,0x6e6217206851bbf1l,0xc0b89398c0d9ed16l,
26616             0xf7d5d2a09f20728fl },
26617           0 },
26618         /* 47 << 240 */
26619         { { 0x7358a94a19f0ededl,0x5e08c4c3e32ccfbbl,0x84a8eeeb0089f071l,
26620             0xdaf0514c41fc436el },
26621           { 0x30fe216f310309afl,0xe72f77bd564e6fc9l,0xe7ef3bddfdc59fd5l,
26622             0xd199b1c9a8e1169cl },
26623           0 },
26624         /* 48 << 240 */
26625         { { 0xb9dc857c5b0f7bd4l,0x6990c2c9108ea1cdl,0x84730b83b984c7a9l,
26626             0x552723d2eab18a78l },
26627           { 0x9752c2e2919ba0f9l,0x075a3bd94bf40890l,0x71e52a04a6d98212l,
26628             0x3fb6607a9f18a4c8l },
26629           0 },
26630         /* 49 << 240 */
26631         { { 0xa0305d01e8c3214dl,0x025b3cae8d51cea3l,0xeeaf7ab239923274l,
26632             0x51179407c876b72cl },
26633           { 0xcf0241c7d4549a68l,0xffae7f4c793dab3dl,0xdfb5917b4bdf2280l,
26634             0xcf25c870a652e391l },
26635           0 },
26636         /* 51 << 240 */
26637         { { 0xb1345466b922e1c8l,0xae42f46ab5bf8a34l,0x1e1ab6053310e604l,
26638             0x64093cd9b4d7a658l },
26639           { 0x5d3b385ab3d9242cl,0x2225b99ae56f8ec7l,0x19a8cbfc9a916e11l,
26640             0x11c5df831f957c03l },
26641           0 },
26642         /* 52 << 240 */
26643         { { 0x09f1d04af381147bl,0x7be13628b26b345fl,0xd8371966d1c60b78l,
26644             0xf1743c2c5d91808fl },
26645           { 0x8a2966acafc71cc3l,0x0ba9702efdfc24c3l,0x60c80158e6fbb539l,
26646             0x58eaee49812c32f4l },
26647           0 },
26648         /* 53 << 240 */
26649         { { 0x31af7f5ee89d0b84l,0xa776dada6caa110bl,0xd67b7891df6d54ddl,
26650             0x831613cab82b8a5cl },
26651           { 0x7a4eb86ef020af6dl,0x2914fd11bd795a7bl,0xc038a273fcb54a17l,
26652             0x6b2dc8e18219cc75l },
26653           0 },
26654         /* 55 << 240 */
26655         { { 0x031fc875464ba9b5l,0xe268cf45bd812dd3l,0x443f57defbfb664al,
26656             0xfd1a38544e28c2fal },
26657           { 0xb8799782cb96515bl,0xa12d3e3f1138c95dl,0x0cc5ee117748ee57l,
26658             0x6ab167cf955a7dfcl },
26659           0 },
26660         /* 57 << 240 */
26661         { { 0x0d54aaca4dc1c74fl,0x74af1807bf2e0d61l,0x151254f87aebe0f1l,
26662             0x4072f38bf6376095l },
26663           { 0x31ebe17a26646abfl,0xdc8cb6b40ecc1282l,0x4f6326bbbc095a66l,
26664             0x37dad65a0363636dl },
26665           0 },
26666         /* 59 << 240 */
26667         { { 0xc851860a70f8c15al,0xb2d4555488368381l,0xbfd46e197019c7b6l,
26668             0xa1a9b12f6bb6f33bl },
26669           { 0xecfd5fe6f170c82bl,0x6d58bb52d601afc3l,0xb8b3de15fe6eb102l,
26670             0xad07336886a47964l },
26671           0 },
26672         /* 60 << 240 */
26673         { { 0x89f514c91911840fl,0xc9fa6b504cc106bcl,0x70a97f0dfe55b4f1l,
26674             0xada6306be5888609l },
26675           { 0xa9437881c6dc8d15l,0x0fc0f5368411f3dfl,0xd26162087a913dd2l,
26676             0x4fe1c7c4e92848cdl },
26677           0 },
26678         /* 61 << 240 */
26679         { { 0xaa18eb262e07383dl,0xb948c35c34e90f3dl,0x95e97f81d3653565l,
26680             0x4a821a2687b5b75dl },
26681           { 0x87b4d81c892db882l,0xa69e65d689f3bfadl,0xe475f532eb371cacl,
26682             0xd8cc23fa17194d5dl },
26683           0 },
26684         /* 63 << 240 */
26685         { { 0x3fc0052ad789d484l,0xe8c67aac29324323l,0x133fd07cf54c43d3l,
26686             0xd4a0848fb91d4faal },
26687           { 0xf683ce065ea5098fl,0xe84348f9887c8a76l,0x38f8c2cf79b224b6l,
26688             0x327e4c534a818cb1l },
26689           0 },
26690         /* 64 << 240 */
26691         { { 0xb6d92a7f3e5f9f11l,0x9afe153ad6cb3b8el,0x4d1a6dd7ddf800bdl,
26692             0xf6c13cc0caf17e19l },
26693           { 0x15f6c58e325fc3eel,0x71095400a31dc3b2l,0x168e7c07afa3d3e7l,
26694             0x3f8417a194c7ae2dl },
26695           0 },
26696         /* 65 << 240 */
26697         { { 0x0c9e9237d5f812bcl,0xdae5b7e9595f02e5l,0x5ec1dece42b1e9a8l,
26698             0x506a6ef8e527a685l },
26699           { 0xe3049290236af251l,0x6322dd1bf81970acl,0x1459d39c516d5e61l,
26700             0x672f502d9455b694l },
26701           0 },
26702         /* 71 << 240 */
26703         { { 0xf83788e06b228af2l,0xaafc823911f596fal,0x6d47fa592f0fcb13l,
26704             0x0b7af65f1c99c5d4l },
26705           { 0xbc4c185dca961e6fl,0xec02b09f158481a4l,0x4bbfd9f31423fdd4l,
26706             0x0ff44a53b619644bl },
26707           0 },
26708         /* 77 << 240 */
26709         { { 0x23e255a3ea3f59d8l,0x1f4a47a8261ac30bl,0x346bf409c8faf0b3l,
26710             0xd13e73fbc03a226bl },
26711           { 0x670ddc792fe8a79bl,0x335fa172f1aac412l,0xe2347de1a5ceff20l,
26712             0x66e02c73381130f2l },
26713           0 },
26714         /* 83 << 240 */
26715         { { 0xa6b874c51db717cdl,0x027d318ab00f160bl,0x578f89f49be791afl,
26716             0x659ef2f01f3b5e9bl },
26717           { 0xa0c593033835d84cl,0xb71e261fdb6f9a60l,0x65837c7f44b7813fl,
26718             0xea776163ea4bcc96l },
26719           0 },
26720         /* 89 << 240 */
26721         { { 0x208234118df3f15fl,0xe0514d4694f341acl,0xdc66282d6486d704l,
26722             0xd5fb354ad2548389l },
26723           { 0xf3e98d72df273295l,0x27ded7fa50cd09fcl,0x4f486af3c5c1c169l,
26724             0xe51044150aa41ba3l },
26725           0 },
26726         /* 95 << 240 */
26727         { { 0x66b14d296fce0aecl,0x35fe5e60c8915ceal,0x06a023b736c5da39l,
26728             0x0977c9f0404e932fl },
26729           { 0x1dd6f95db54866del,0xe5ec79359387430cl,0x98dee57b5ef42e67l,
26730             0x1707f01912ed3ad0l },
26731           0 },
26732         /* 101 << 240 */
26733         { { 0xeb3abdedeec82495l,0x587a696e764a41c7l,0x13fdcce2add1a6a3l,
26734             0x299a0d43286b2162l },
26735           { 0x2c4e71e18131f1b4l,0x48f0e806ada3d04fl,0x91d2de80c57491b2l,
26736             0x1b1266236cc355cbl },
26737           0 },
26738         /* 107 << 240 */
26739         { { 0xdc28afe5a6d44444l,0xb5ad8d3cfe0b947bl,0x50c6126c96ce9fb9l,
26740             0x5384a998d1fc7d39l },
26741           { 0xa43ff8898788f51cl,0x30359593a6bc7b87l,0x3e1691dccc0d019al,
26742             0xda0ef5ad7943abcdl },
26743           0 },
26744         /* 113 << 240 */
26745         { { 0x5bc58b6f020b5cd7l,0x9098e202e103ff4el,0xc1f1a3d9f6fce7c7l,
26746             0xf9dc32a856090ccel },
26747           { 0x4c7d2520a9cc3b09l,0x98d47b5dd8c4dfcel,0xdcee788297e689b4l,
26748             0xe5eec71815f982b9l },
26749           0 },
26750         /* 116 << 240 */
26751         { { 0xff154bb8a1e1538cl,0xb9883276f7dcfae9l,0x1ac0a4d2c1c8cba4l,
26752             0x511a54cc76e6b284l },
26753           { 0xe2da436f00011f6dl,0x4d357a190f43a8adl,0xf36899c95458655bl,
26754             0xe5f75c768d613ed9l },
26755           0 },
26756         /* 119 << 240 */
26757         { { 0x15b4af1d93f12ef8l,0x3f4c5868fd032f88l,0x39f67a08f27d86bdl,
26758             0x2f551820da32db6bl },
26759           { 0x72fe295ac2c16214l,0x39927c381a2cf9afl,0x8dda23d6b1dc1ae7l,
26760             0x1209ff3ed32071d4l },
26761           0 },
26762         /* 125 << 240 */
26763         { { 0x861fdceb9a3c6c6fl,0x76d7a01386778453l,0xbf8d147cd5e422cbl,
26764             0xd16f532e51772d19l },
26765           { 0x72025ee2570d02cdl,0xe8e7737be80c7664l,0x81b7d56c334a8d8fl,
26766             0x42477a0ff1b79308l },
26767           0 },
26768     },
26769     {
26770         /* 0 << 248 */
26771         { { 0x00, 0x00, 0x00, 0x00 },
26772           { 0x00, 0x00, 0x00, 0x00 },
26773           1 },
26774         /* 1 << 248 */
26775         { { 0xf306a3c8ee3c76cbl,0x3cf11623d32a1f6el,0xe6d5ab646863e956l,
26776             0x3b8a4cbe5c005c26l },
26777           { 0xdcd529a59ce6bb27l,0xc4afaa5204d4b16fl,0xb0624a267923798dl,
26778             0x85e56df66b307fabl },
26779           0 },
26780         /* 3 << 248 */
26781         { { 0x896895959884aaf7l,0xb1959be307b348a6l,0x96250e573c147c87l,
26782             0xae0efb3add0c61f8l },
26783           { 0xed00745eca8c325el,0x3c911696ecff3f70l,0x73acbc65319ad41dl,
26784             0x7b01a020f0b1c7efl },
26785           0 },
26786         /* 4 << 248 */
26787         { { 0x9910ba6b23a5d896l,0x1fe19e357fe4364el,0x6e1da8c39a33c677l,
26788             0x15b4488b29fd9fd0l },
26789           { 0x1f4392541a1f22bfl,0x920a8a70ab8163e8l,0x3fd1b24907e5658el,
26790             0xf2c4f79cb6ec839bl },
26791           0 },
26792         /* 5 << 248 */
26793         { { 0x262143b5224c08dcl,0x2bbb09b481b50c91l,0xc16ed709aca8c84fl,
26794             0xa6210d9db2850ca8l },
26795           { 0x6d8df67a09cb54d6l,0x91eef6e0500919a4l,0x90f613810f132857l,
26796             0x9acede47f8d5028bl },
26797           0 },
26798         /* 7 << 248 */
26799         { { 0x45e21446de673629l,0x57f7aa1e703c2d21l,0xa0e99b7f98c868c7l,
26800             0x4e42f66d8b641676l },
26801           { 0x602884dc91077896l,0xa0d690cfc2c9885bl,0xfeb4da333b9a5187l,
26802             0x5f789598153c87eel },
26803           0 },
26804         /* 9 << 248 */
26805         { { 0xb19b1c4fca66eca8l,0xf04a20b55663de54l,0x42a29a33c223b617l,
26806             0x86c68d0d44827e11l },
26807           { 0x71f90ddeadba1206l,0xeeffb4167a6ceeeal,0x9e302fbac543e8afl,
26808             0xcf07f7471aa77b96l },
26809           0 },
26810         /* 10 << 248 */
26811         { { 0xcf57fca29849e95bl,0x96e9793ed510053cl,0x89fa443d07d3e75el,
26812             0xfe2bc235e52800a0l },
26813           { 0x1c208b8c0ac7e740l,0xb5852a49e7222263l,0x217e4005e541e592l,
26814             0xee52747dc960b0e1l },
26815           0 },
26816         /* 11 << 248 */
26817         { { 0x5fd7cafb475952afl,0x23a6d71954a43337l,0xa83a7523b1617941l,
26818             0x0b7f35d412b37dd4l },
26819           { 0x81ec51292ae27eafl,0x7ca92fb3318169dfl,0xc01bfd6078d0875al,
26820             0xcc6074e3c99c436el },
26821           0 },
26822         /* 13 << 248 */
26823         { { 0x4ca6bdebf57912b8l,0x9a17577e98507b5al,0x8ed4ab7759e51dfcl,
26824             0x103b7b2a470f5a36l },
26825           { 0x0c8545ac12553321l,0xab5861a760482817l,0xf4b5f602b9b856cfl,
26826             0x609955787adf2e5fl },
26827           0 },
26828         /* 15 << 248 */
26829         { { 0x60ce25b1ee5cb44fl,0xddcc7d182c2d7598l,0x1765a1b301847b5cl,
26830             0xf5d9c3635d0d23b7l },
26831           { 0x42ff1ba7928b65d0l,0x587ac69d6148e043l,0x3099be0dd320390bl,
26832             0xa7b88dfc4278329fl },
26833           0 },
26834         /* 16 << 248 */
26835         { { 0x80802dc91ec34f9el,0xd8772d3533810603l,0x3f06d66c530cb4f3l,
26836             0x7be5ed0dc475c129l },
26837           { 0xcb9e3c1931e82b10l,0xc63d2857c9ff6b4cl,0xb92118c692a1b45el,
26838             0x0aec44147285bbcal },
26839           0 },
26840         /* 17 << 248 */
26841         { { 0x7685bb9e0ba4e0b7l,0x330a7ebc5e58c29bl,0xbc1d9173e8a3797al,
26842             0x7c506a16ea60f86cl },
26843           { 0x9defb9248c099445l,0xcf1ddcc0256df210l,0x4844ce293d07e990l,
26844             0x92318e37e2628503l },
26845           0 },
26846         /* 19 << 248 */
26847         { { 0x61acd597fdf968d7l,0x7321a8b26598c381l,0xcb86a2809f448a0cl,
26848             0x38534a01855df66al },
26849           { 0xc119ec141e29037fl,0xe23c20ad0b42ba67l,0xefb1c4e033fb4f22l,
26850             0xf088358f445a5032l },
26851           0 },
26852         /* 21 << 248 */
26853         { { 0x2d73f5d1b8475744l,0xcc297e0a9d399b06l,0xa8c61d4038d3df06l,
26854             0xacc6e8651a2d27a0l },
26855           { 0x63dd6f6230153bf2l,0x6b23ad7bd73b83b7l,0x25382bf767ff7dcdl,
26856             0x7e268c8fcf7ce2d1l },
26857           0 },
26858         /* 23 << 248 */
26859         { { 0x4b9161c3cb2ebef1l,0x6009716b669ed801l,0x97c65219aacefe44l,
26860             0xde13597d71aae4b5l },
26861           { 0x3a077a816141d651l,0xe1b4e80129f876eal,0x729aed6d5c00c96cl,
26862             0x0c6f404374cc645el },
26863           0 },
26864         /* 25 << 248 */
26865         { { 0x22c51812df5a66e1l,0x1c8069c9ae7dedeal,0xcff9d86f0eea5180l,
26866             0x676dbd6f44235ddal },
26867           { 0xa53f01383db1ad42l,0xd079e571bcf19029l,0x1e37b9ecfab0cf82l,
26868             0x93ae35ed4844e9c4l },
26869           0 },
26870         /* 27 << 248 */
26871         { { 0xdaee55a543756358l,0x0ace18d41b2d3f89l,0x3391fa36824dd7d4l,
26872             0x7b9963d1770e5f3fl },
26873           { 0xc1fb9a78c94f724dl,0x94ff86fe76c4da6bl,0xb5d928c64170609bl,
26874             0xc9372becfb015a9fl },
26875           0 },
26876         /* 28 << 248 */
26877         { { 0x9c34b650e16e05e9l,0x965a774094e74640l,0xa3fd22fbcea3f029l,
26878             0x1eb6a9688f95277cl },
26879           { 0x2520a63d7bad84f6l,0xad917201f58f2feel,0xea92c1669b840d48l,
26880             0x12109c4aacef5cbdl },
26881           0 },
26882         /* 29 << 248 */
26883         { { 0xd85850d0d407a252l,0x6fa3b14de63909d4l,0x2ff9f6593e0fba69l,
26884             0x7f9fd2a2d1b2cd0bl },
26885           { 0x611233d745ad896al,0xfe4211648df850f9l,0x7808832399e32983l,
26886             0x4b040859dee6741dl },
26887           0 },
26888         /* 31 << 248 */
26889         { { 0x7dd2afd456e1ed5cl,0xd48429ec41ba4992l,0x97a02188968bab27l,
26890             0x09ecf813e63c4168l },
26891           { 0xf4ac65e77288b10cl,0x10630ab2afac7410l,0x4e3e59c3bb049e56l,
26892             0x25972fff40fea0b1l },
26893           0 },
26894         /* 33 << 248 */
26895         { { 0xfd8363da98365c18l,0x8aa57b1a8d47bf91l,0x423dce57695f4dd6l,
26896             0xfccf54d4cc17f034l },
26897           { 0x8fdba27c3610ea51l,0xcc0a06d654306b06l,0xb97a121c389b9dfdl,
26898             0x7dbb90eb1ed0ca42l },
26899           0 },
26900         /* 34 << 248 */
26901         { { 0xd32d7cec0094e84cl,0x862ae25e2ece8f72l,0x8644ef1cdfceb8abl,
26902             0x68a9969c8e225628l },
26903           { 0xdf209e27b3117876l,0x308a6e1882ba242bl,0xcbd09a659bf0cdb6l,
26904             0x79f2826cc85b9705l },
26905           0 },
26906         /* 35 << 248 */
26907         { { 0x3b36b6bf8f011496l,0xea6acc1a9bcf6ef8l,0x6db132263b101f12l,
26908             0x4fc4e35e3b7585c3l },
26909           { 0x641de27556eb64c6l,0x9b2834d3f3b08519l,0xebb76a2ba1f44b40l,
26910             0x1b545ccd3cd31677l },
26911           0 },
26912         /* 36 << 248 */
26913         { { 0xab293027aad991c1l,0x598d0bf8849be4b7l,0x8c94a21ab972da90l,
26914             0xada4cfdd7ecfa840l },
26915           { 0x93d4b9c0fbcec63al,0x7ca617a203219a34l,0x900424eb6a652a55l,
26916             0xaf9346e9eb8562e0l },
26917           0 },
26918         /* 37 << 248 */
26919         { { 0x9681a73d2d8bc904l,0x8b5f9b317b1553bel,0xfb03b874f6bc852fl,
26920             0x8e658fb8cbbec8b0l },
26921           { 0x9b2ff17bb9e9f9d1l,0xf46e9bf3e8679854l,0x7fbb1323618ed3aal,
26922             0x064a1c5d714ebc3dl },
26923           0 },
26924         /* 39 << 248 */
26925         { { 0xac0bdfc39f0e69dcl,0x71957386ae12f132l,0xa263ef2e6aa90b5bl,
26926             0xa94b152390d42976l },
26927           { 0xfb2d17741bcdbf7bl,0xba77b77c3a04f72fl,0xa6818ed8ec3e25a1l,
26928             0x2e0e01743733e251l },
26929           0 },
26930         /* 40 << 248 */
26931         { { 0xc3e04d7902381461l,0xb1643ab5911bc478l,0xc92becfa390b3ef2l,
26932             0x54476778acd2f1b6l },
26933           { 0x8daa0c4d66bf3aafl,0x2bc1287b2c21c65al,0xee182910b5a13ac3l,
26934             0xbb04730090b0790al },
26935           0 },
26936         /* 41 << 248 */
26937         { { 0x8bdd6f35a8540489l,0x788c03e5ee390d4el,0x203323c18f653017l,
26938             0x39953308c4bc0094l },
26939           { 0x6ee0857118308d0bl,0x70e9f90b450b0002l,0x191662aa8139f145l,
26940             0xd7c5415b62d71124l },
26941           0 },
26942         /* 43 << 248 */
26943         { { 0x41b37d72b927231cl,0xca17b5429e4de13al,0x7bc03469cded2ce3l,
26944             0x961b0ecb4f4560f9l },
26945           { 0x7c5bd41b43d31fa1l,0x3ed047f643f44dc3l,0x5b02083efe1a4d14l,
26946             0xcc2c66ac18b330bcl },
26947           0 },
26948         /* 44 << 248 */
26949         { { 0x83766947d17d4e0bl,0xc5772beefdc3a47bl,0x765a50db1a6fd0ffl,
26950             0x17f904ba45b0995el },
26951           { 0xcee643832883487el,0xf56db7f3c270aaedl,0x6738d94f46cb1fd9l,
26952             0xc8fa426a142fd4d5l },
26953           0 },
26954         /* 45 << 248 */
26955         { { 0xc85bef5b5a78efcel,0xaf380c6b0580e41el,0x6c093256a43b8d9bl,
26956             0xed9d07bbea670933l },
26957           { 0xfdb9a295f1682c6el,0x4cc29a63532b6bb7l,0x21a918f9f8e42dd0l,
26958             0x9ac935ce0edacca0l },
26959           0 },
26960         /* 46 << 248 */
26961         { { 0xbfe48a8ff43daf9dl,0xd7799b31b313c052l,0x46d480d77119c60el,
26962             0x5090d91f0b80bcb9l },
26963           { 0xc94c4c1e873bd7bfl,0x16e69b4f9915aa0al,0x769be02bb1d5928cl,
26964             0x3fdaf62162e1d85al },
26965           0 },
26966         /* 47 << 248 */
26967         { { 0x03497a57371c1b5cl,0x11e4c0b3552ab6abl,0xf857061f0a169ee7l,
26968             0xc21c6c43e6d1bc66l },
26969           { 0x706283a82832be7al,0xd35b143299aba62cl,0x7f4da83de9aef62dl,
26970             0x2b7e5fc8723fa4e5l },
26971           0 },
26972         /* 48 << 248 */
26973         { { 0xae485bb72b724759l,0x945353e1b2d4c63al,0x82159d07de7d6f2cl,
26974             0x389caef34ec5b109l },
26975           { 0x4a8ebb53db65ef14l,0x2dc2cb7edd99de43l,0x816fa3ed83f2405fl,
26976             0x73429bb9c14208a3l },
26977           0 },
26978         /* 49 << 248 */
26979         { { 0xc086e737eb4cfa54l,0x9400e1ad3c44aad9l,0x210bba94336959b4l,
26980             0x08621a809106f0cal },
26981           { 0x2ae66096c510ee9cl,0x2ba21617fc76a895l,0xc0707f8b0c186f1el,
26982             0x1fe170a3ed0bfe25l },
26983           0 },
26984         /* 51 << 248 */
26985         { { 0x3780fe2084759c5cl,0x716ec626b7050aa7l,0x6a43fb8b84b63bd1l,
26986             0xb01098a039bc449fl },
26987           { 0x96b3ff8ebb7daa4dl,0x2d146882654a7f01l,0x2500f701dcae6143l,
26988             0xc13d51d01626fd3bl },
26989           0 },
26990         /* 52 << 248 */
26991         { { 0x08ed8febd56daf06l,0x8d98277b4a837f69l,0x9947c636a9b6e05al,
26992             0x58c8a77ac0d58abdl },
26993           { 0xf45496a45f121e4fl,0x16cd67c71076d3d3l,0xecbd1958e3fb0c5dl,
26994             0xfbe185ec38e1eb47l },
26995           0 },
26996         /* 53 << 248 */
26997         { { 0x65b067eb740216e3l,0x1e19a71479db8760l,0x8d30dca18878de5al,
26998             0x627d03e8aa47c005l },
26999           { 0x096d58c0d2536c96l,0x232e6a4d69b12c2al,0x850eb8c0e7044bcel,
27000             0xd9cf923bef2ee9a1l },
27001           0 },
27002         /* 55 << 248 */
27003         { { 0x8b301094c8eaee90l,0x9a96950b8330928fl,0x472ba105faccc3bal,
27004             0x00f8620e9153172al },
27005           { 0x019b8164303fcdf5l,0x614d5c3c41fb4c73l,0x632d98f2c5992f89l,
27006             0xfbeb29d790e2dea5l },
27007           0 },
27008         /* 57 << 248 */
27009         { { 0xefd48b577f91d6e0l,0x8575605595bcf5d4l,0x7677b4a7bb9d891bl,
27010             0xdc9931e9685912c9l },
27011           { 0x69bca306f31a07c8l,0x3dd729534962a7f0l,0xdcea49cc9d366c2al,
27012             0xce664ba7dc79a57dl },
27013           0 },
27014         /* 59 << 248 */
27015         { { 0x7842d547013ec3b5l,0xa2785ceb433cf990l,0x9d667e5f700ab14al,
27016             0x4b46f362a0f46d55l },
27017           { 0x152c0e80cc7a3487l,0x7f3a88cef86f5e68l,0x6f950a73f1b2a75fl,
27018             0x9be5b1aa51d24f3bl },
27019           0 },
27020         /* 60 << 248 */
27021         { { 0xaea68626dc4ad4f4l,0x5dc516824ddbc0b6l,0xa76697bd602e9065l,
27022             0xbeeb3ea58c37888el },
27023           { 0x1ec4a2f214569113l,0xe48b820ca35f4484l,0x9fb560949ae44df2l,
27024             0x6ca1346292cc09fdl },
27025           0 },
27026         /* 61 << 248 */
27027         { { 0x887e0b87bcdc3a36l,0x6b0d617d503dee65l,0x96bda1f6cebcb893l,
27028             0xdc0dd17341e20b3el },
27029           { 0x812fbacfa6657c11l,0x32492fcbc94a6f4bl,0x854a0bcb6a772123l,
27030             0x1ed573f65d463f31l },
27031           0 },
27032         /* 63 << 248 */
27033         { { 0x22c7ef7bd022cc4dl,0xeec383d61e63b4bcl,0x52e0aaa06502b46fl,
27034             0x9224187ded5e41bfl },
27035           { 0x3a01f53dd26faf1cl,0x9bc4ee2e4e591d10l,0x10b7a98eea7e4c88l,
27036             0xe521c150e2c1beccl },
27037           0 },
27038         /* 64 << 248 */
27039         { { 0xb618d590b01e6e27l,0x047e2ccde180b2dcl,0xd1b299b504aea4a9l,
27040             0x412c9e1e9fa403a4l },
27041           { 0x88d28a3679407552l,0x49c50136f332b8e3l,0x3a1b6fcce668de19l,
27042             0x178851bc75122b97l },
27043           0 },
27044         /* 65 << 248 */
27045         { { 0x26f9b9322ed53a71l,0x0bac7348c72ef2e0l,0x7e96001da5c6faf1l,
27046             0x5d43f76dea00eb2dl },
27047           { 0x1327370f44f1c478l,0x1c83a9ac6bb964c8l,0xa3a9769f76ffbd25l,
27048             0xdf045fb6b04f1bddl },
27049           0 },
27050         /* 71 << 248 */
27051         { { 0x4283898d556b975el,0x6e2301ffe3880361l,0xc6d3b2bbe9198077l,
27052             0xc4799578d21cac02l },
27053           { 0x11448ff8f784eb7cl,0xb775973fbb81898dl,0x4e51f061519c76b9l,
27054             0xaba1f3ef3cad0393l },
27055           0 },
27056         /* 77 << 248 */
27057         { { 0x59d60c1c9b339830l,0x5af60a44ac32746dl,0x5ac006bc9dea8d80l,
27058             0x4a2a56d97f2b1180l },
27059           { 0x2032845a46946fc4l,0xe25b911226a3b503l,0xfed89db9a28827d3l,
27060             0xdd2d7e90c6b74593l },
27061           0 },
27062         /* 83 << 248 */
27063         { { 0x9b047a26cda38ecfl,0x6889284f5f6cb442l,0x4d128bcb14753820l,
27064             0x8f9937c160eedd78l },
27065           { 0xe333bad751ab9127l,0xd31b01c67ace3b19l,0x0732de39d7c0b4bel,
27066             0xad04fa4c649e2b9bl },
27067           0 },
27068         /* 89 << 248 */
27069         { { 0x02e042689d1495bal,0x95dca5a85591b5f8l,0xb10488d856f46c71l,
27070             0x97829baf3590000al },
27071           { 0xaeda5cb378c9e78al,0x3615873a7ba1c71cl,0x7c9f9f4d4333aa12l,
27072             0x893fab42cea8e6d3l },
27073           0 },
27074         /* 95 << 248 */
27075         { { 0x9eb09fff69aaa09fl,0xf36678a926731322l,0x8be61ee1cafcabafl,
27076             0x77a172f558ddb763l },
27077           { 0x7e09dfc66471130el,0x7f8909791039771el,0x0e44071d37800b9bl,
27078             0x09123d27fe762d10l },
27079           0 },
27080         /* 101 << 248 */
27081         { { 0xffd455a7a1b7fdd6l,0xb6162cb4dabdffael,0xf859519ec89c0e56l,
27082             0x07406c1b421f2846l },
27083           { 0x42db24ed9e96ddbbl,0x03bcae092dc5da85l,0x75099cd217aa7493l,
27084             0x8cd1aa4266b8740dl },
27085           0 },
27086         /* 107 << 248 */
27087         { { 0xe94333d5dde7fec3l,0x894fd673745a9be3l,0xaf3d97c725683748l,
27088             0xeaa469a2c9ec165fl },
27089           { 0xc9a18decdc7abd3bl,0xf059008082717b02l,0x9816374a4fdf4300l,
27090             0x449d3eb74fb5a6cel },
27091           0 },
27092         /* 113 << 248 */
27093         { { 0x7fc983ebd28001a6l,0xeabf5276dae74b6bl,0x50adb67d742ed0a5l,
27094             0x1d2ad363650e1446l },
27095           { 0x5a564253d122f5d0l,0x7e5aefc7e30471del,0xdc64cbb3e5dc2f2cl,
27096             0xe645b9fa9437be4el },
27097           0 },
27098         /* 116 << 248 */
27099         { { 0x0f58cec54e27d357l,0x08dcf2b70004539el,0xb1ead64104f96709l,
27100             0x350fed185a914c72l },
27101           { 0x44f43523c5147854l,0x45f8b46f46d04ac7l,0x62c306869a449d51l,
27102             0xaacc0f0d9e66d9a3l },
27103           0 },
27104         /* 119 << 248 */
27105         { { 0x94cb62e5bdd61b63l,0xe6ce5b5104a0ec57l,0x0461cb95f0bda8a4l,
27106             0xca2d6220cbadfe8fl },
27107           { 0x6c19bdf03c1ad65el,0x774a49bae04239d5l,0xf78cb7404a2fd59dl,
27108             0xaebf90ed66a09130l },
27109           0 },
27110         /* 125 << 248 */
27111         { { 0x10e4074857cc8d54l,0x29985831918e3cf9l,0x3d87def9f2e344eel,
27112             0x8899992c68977860l },
27113           { 0xbdc8d73b210f3c50l,0x98aa042fa9857f46l,0x76a34daf6c71357fl,
27114             0x086289d3200bcb6dl },
27115           0 },
27116     },
27117     {
27118         /* 0 << 256 */
27119         { { 0x00, 0x00, 0x00, 0x00 },
27120           { 0x00, 0x00, 0x00, 0x00 },
27121           1 },
27122         /* 1 << 256 */
27123         { { 0xb4e370af3aeac968l,0xe4f7fee9c4b63266l,0xb4acd4c2e3ac5664l,
27124             0xf8910bd2ceb38cbfl },
27125           { 0x1c3ae50cc9c0726el,0x15309569d97b40bfl,0x70884b7ffd5a5a1bl,
27126             0x3890896aef8314cdl },
27127           0 },
27128         /* 3 << 256 */
27129         { { 0x996884f5903fa271l,0xe6da0fd2b9da921el,0xa6f2f2695db01e54l,
27130             0x1ee3e9bd6876214el },
27131           { 0xa26e181ce27a9497l,0x36d254e48e215e04l,0x42f32a6c252cabcal,
27132             0x9948148780b57614l },
27133           0 },
27134         /* 4 << 256 */
27135         { { 0xab41b43a43228d83l,0x24ae1c304ad63f99l,0x8e525f1a46a51229l,
27136             0x14af860fcd26d2b4l },
27137           { 0xd6baef613f714aa1l,0xf51865adeb78795el,0xd3e21fcee6a9d694l,
27138             0x82ceb1dd8a37b527l },
27139           0 },
27140         /* 5 << 256 */
27141         { { 0x4a665bfd2f9fd51al,0x7f2f1fe2481b97f7l,0xcad05d69ad36ce50l,
27142             0x314fc2a4844f4dedl },
27143           { 0xd5593d8cb55fc5c6l,0xe3510ce8bfb1e23dl,0xf9b7be6937453ccel,
27144             0xd3541b7969fae631l },
27145           0 },
27146         /* 7 << 256 */
27147         { { 0x711b8a4176a9f05dl,0x06ca4e4b9011d488l,0x543bc62ba248a65el,
27148             0x017535ffc9290894l },
27149           { 0x840b84ce406851d7l,0xafa3acdf90e960b4l,0xac3394af7128fd34l,
27150             0x54eb4d5b2ac0f92cl },
27151           0 },
27152         /* 9 << 256 */
27153         { { 0x3549a0f14df48fecl,0x6ae7b1eec239f83al,0x001dcf253eb90ff3l,
27154             0x02ff0f02581e90edl },
27155           { 0x72921d8ca103dcefl,0x2c513c3c5876293el,0xc07064ca6b68875el,
27156             0x7198d44653b9537cl },
27157           0 },
27158         /* 10 << 256 */
27159         { { 0x58349b77685e089bl,0x1c678441219b7b8cl,0xba8da91f61e2e20dl,
27160             0xf9c50b8c309fd4e6l },
27161           { 0x99b0164996d0ef64l,0xac334ded60cdb63al,0x6b9ada19fb0bce4fl,
27162             0x39dc9375c7896377l },
27163           0 },
27164         /* 11 << 256 */
27165         { { 0x068dda8b7e1bc126l,0x77c7c58176243a21l,0xcc8ba55c875f9dael,
27166             0xdde7afe2ce469f95l },
27167           { 0xde2a15f5e9523b85l,0x447512c6d85674ael,0x5691f89e12c6c20cl,
27168             0xd64ef40e0fae4513l },
27169           0 },
27170         /* 13 << 256 */
27171         { { 0x10db2041c4d9eb40l,0x420eccb724f03f8al,0x64470fd17d29080el,
27172             0xf66c5b4416e52414l },
27173           { 0xa32cc70e4ca94031l,0xa67931592c8401bal,0x34f2dc29abfcc58dl,
27174             0x6f340f9a07325d7dl },
27175           0 },
27176         /* 15 << 256 */
27177         { { 0xf55d446b060a52bbl,0x2f33cb9f02939f24l,0x0f27a01bc8953718l,
27178             0x362882917fcd3932l },
27179           { 0x7485613488ed4436l,0xcfe69e27195f089el,0xd6ab040a8ff10bd8l,
27180             0x9741c5472e4a1623l },
27181           0 },
27182         /* 16 << 256 */
27183         { { 0xc52d8d8b6d55d6a4l,0xc4130fb3be58e8f9l,0x5f55c345e1275627l,
27184             0xb881a03c117042d3l },
27185           { 0x00a970a53238d301l,0x40d7cf2412a2c4f1l,0xace4a2f5d770ea74l,
27186             0x36a2e587e96940b2l },
27187           0 },
27188         /* 17 << 256 */
27189         { { 0x84793d9fef12d4c8l,0x04b89b152d8a163cl,0x0fdb566fb4a87740l,
27190             0xf7e6e5cf9e595680l },
27191           { 0xbcb973e41c5cd74el,0xafcb439fe4ed49d8l,0xd5c0820aebbae8eel,
27192             0x23483d836f56e2a2l },
27193           0 },
27194         /* 19 << 256 */
27195         { { 0x91f9b8be5e8ad115l,0xf1fd6a2e225db496l,0xf362d2cf4a444085l,
27196             0x033d9201eea043ebl },
27197           { 0x1e50c0989951a150l,0x4814fca5cfcf1f94l,0xaf3e8ef41bf82de5l,
27198             0xba0e2991038cff53l },
27199           0 },
27200         /* 21 << 256 */
27201         { { 0x904a41ae5fc373fal,0x235556d61a6a3fc4l,0xe44eb3ea36eeb570l,
27202             0xa4e1b34a26ba5ca6l },
27203           { 0x210e7c9131180257l,0x2c28669622158b0cl,0xc78b69c783ddd341l,
27204             0xfc05941b294e1750l },
27205           0 },
27206         /* 23 << 256 */
27207         { { 0x70666f51fc167dedl,0x47e9e289fe75b8d1l,0x8a5f59739605a03el,
27208             0x19876a58dd579094l },
27209           { 0x69a5c8cca964e426l,0xed74a652ccf20306l,0x5c93ae3cf06d31d5l,
27210             0x51922fa2127a8a12l },
27211           0 },
27212         /* 25 << 256 */
27213         { { 0xa18e26f99e3d509el,0xbc296dd2c10814fal,0x5dadd6eeaa24e147l,
27214             0xdba2121a8340f12el },
27215           { 0xd348e7f3e245ca21l,0x1e45a42978e3eb5bl,0x252bf89c169677bbl,
27216             0xfb33a2564021ac55l },
27217           0 },
27218         /* 27 << 256 */
27219         { { 0x30dc46586e7d72b8l,0x38df46fb0d81c3d6l,0x901bab6e10e84162l,
27220             0x25d7303ff7932801l },
27221           { 0xe781d5f37500be42l,0x9a7104c3380ff208l,0xfa801181652121a1l,
27222             0xef89f4f18d3bed43l },
27223           0 },
27224         /* 28 << 256 */
27225         { { 0xbe4ae5683594917al,0xef7c1c47a04bf81el,0xa1dc3612046d91a0l,
27226             0x3eee37affb11b338l },
27227           { 0x7e90278fd03d8f51l,0x3045a6da4fa183c6l,0xb39e573391cd16a9l,
27228             0xc748a504e54e9411l },
27229           0 },
27230         /* 29 << 256 */
27231         { { 0x07804331a1c6ec56l,0x25358e795b347123l,0x1ab9b39acf9432a4l,
27232             0x9628501d0a7881cel },
27233           { 0x749d58988a46d98el,0x01ea43346a17c321l,0xe2b197f9b1f9160fl,
27234             0x2052c7c07815f2a2l },
27235           0 },
27236         /* 31 << 256 */
27237         { { 0xaa691bfbc57a1a6dl,0x06cae127d737d525l,0x5be04b2f963c7c98l,
27238             0x936b1f5bfc00bc4al },
27239           { 0x3fed4ac77eda6a34l,0xba6ca7aa2500a438l,0x1e979fa6786c2a75l,
27240             0xa3db26bec13f37d4l },
27241           0 },
27242         /* 33 << 256 */
27243         { { 0x20afae333d7006d1l,0xdcbca6fbbda467d1l,0x2714b3827df4006cl,
27244             0x9abc0510c8e94549l },
27245           { 0x5b30a6d464c14915l,0xba91d0c35752b44fl,0x7ad9b19bbb389f1fl,
27246             0xe4c7aa04ef7c6e13l },
27247           0 },
27248         /* 34 << 256 */
27249         { { 0x1e24a3f23d12e2b6l,0xf99df403febd6db3l,0x61e580a6b0c8e12fl,
27250             0x819341b7c2bfe085l },
27251           { 0xd53002d640828921l,0x31e1eb65cea010efl,0xc48d0cfe85b3279fl,
27252             0xb90de69089f35fa5l },
27253           0 },
27254         /* 35 << 256 */
27255         { { 0xa3f6fd3c88ed748fl,0x6d72613af48127b9l,0xe85ed703d1e6f7e5l,
27256             0xbb563db449636f40l },
27257           { 0x23bae3c9708497bal,0x89dbff163aa65cf4l,0x70861847e6c0850al,
27258             0x5ef19d5d48b2e90cl },
27259           0 },
27260         /* 36 << 256 */
27261         { { 0xab6a1e13107f7bacl,0x83a8bc57972091f5l,0x3c65b454f6dcba41l,
27262             0xd7606ff96abc431dl },
27263           { 0xa3af9c189bd09971l,0x6ddd3bbf276bad63l,0xd2aba9beab4f0816l,
27264             0x8f13063c151581edl },
27265           0 },
27266         /* 37 << 256 */
27267         { { 0xf9c02364f5761b15l,0x3cfa250afd478139l,0x67d51e7416e26191l,
27268             0x0281bbf65eda396cl },
27269           { 0xbd38d4d70d1f4510l,0x2032a930edff593el,0x0ab74a0cf2ea4ad7l,
27270             0xb95aa9c3302498d6l },
27271           0 },
27272         /* 39 << 256 */
27273         { { 0x2995495dd7da3c7cl,0x28d579d0a0bb703el,0xabec6afec8288837l,
27274             0x93c34dfd05ab989bl },
27275           { 0xcc94f05dde5ea3dfl,0xc3e3d4ef90f436e6l,0x32b3dee1cf59dc4el,
27276             0x5eab01635447d9d9l },
27277           0 },
27278         /* 40 << 256 */
27279         { { 0xd31c5e8e2c23464el,0x5bcc382f50cfbde7l,0x6cee3d8da93c3d9bl,
27280             0xbee2948909ee62acl },
27281           { 0x4848d59c10742b84l,0x2486796fe35e9c84l,0x1a1d9570cd8f391al,
27282             0x839aa0913eedb743l },
27283           0 },
27284         /* 41 << 256 */
27285         { { 0xae02a7ce0f83f369l,0x3b67c56097994835l,0x715def441ae4bbeal,
27286             0x11e764ee59f6b9eel },
27287           { 0x70c775051c962c3al,0x42811507d937a258l,0x06dbdceed03e6e86l,
27288             0x39a3a7ed48cae79el },
27289           0 },
27290         /* 43 << 256 */
27291         { { 0xa32e729fb220eef8l,0x12d876baf37ac5d7l,0x9376ab45105a7f34l,
27292             0xb422331a4deb7275l },
27293           { 0x6ea07fb7686dea5el,0xba67ed3e1d8e32c9l,0x5ae52632bbc6bb9cl,
27294             0xdca55b86d1397575l },
27295           0 },
27296         /* 44 << 256 */
27297         { { 0xd9183f74378200b1l,0xe5ea1645762f5605l,0x78b42e2f7bd6290fl,
27298             0xa0bdfccc07fa0899l },
27299           { 0x2f92ea52dacda629l,0x810b4e6c48de27e2l,0x013d8587d9d1250dl,
27300             0xc153d519dd5141d5l },
27301           0 },
27302         /* 45 << 256 */
27303         { { 0x8f1f6cb5b8f1d719l,0xa9abc27b04e15a4el,0xc0d944a92ad42296l,
27304             0x69ecc877f3d2b0e5l },
27305           { 0xec60dbea16a5581al,0x2a0ead5fb85130d6l,0x7b3d2ebb6fddac23l,
27306             0x06213269ac448663l },
27307           0 },
27308         /* 46 << 256 */
27309         { { 0xe1074008ac11e180l,0xdff3339c14b8f830l,0x136e22be636504f3l,
27310             0xb07ae98aa09c5c4cl },
27311           { 0x9b0a0517192168e9l,0x39e09fac86ad0865l,0x24f90705adb08d41l,
27312             0x9c699cc759d3be24l },
27313           0 },
27314         /* 47 << 256 */
27315         { { 0xd9e16551907e36b0l,0x57f24b6caf91cb5al,0xbdb7dfdb062edae4l,
27316             0x99e3bffe4b85f424l },
27317           { 0x250774f4b2961ba7l,0xe7c0f2386d993c51l,0xcd0aae29f559b4bdl,
27318             0x3b12893a09a6859bl },
27319           0 },
27320         /* 48 << 256 */
27321         { { 0xac177eb985ae12c3l,0x8e6cb5cc6cf76537l,0x134abb19f265f9e3l,
27322             0xc37309b71ba3f55dl },
27323           { 0x570833b4392d564bl,0xaa273a27d8c22f00l,0x9ba6b6276006773al,
27324             0x2156c94f0a16c092l },
27325           0 },
27326         /* 49 << 256 */
27327         { { 0x2be0436b408e1258l,0xb179a2e34f47f121l,0x140b948fa42d3cfcl,
27328             0x96649c6700d2b4e6l },
27329           { 0x2bf934c7d08a4b34l,0x371c770136b472ddl,0x36297876e06adc73l,
27330             0x59e0d8251c3e6558l },
27331           0 },
27332         /* 51 << 256 */
27333         { { 0x9368cfd304a8bc81l,0x145249d4c49e58c7l,0x8c7ac1891392be01l,
27334             0x58cbcb5fbc7b0903l },
27335           { 0x502218a1a0377b0al,0x5c17eb8afb625836l,0x845c09ef349f4d26l,
27336             0x15fdeb2554ddce85l },
27337           0 },
27338         /* 52 << 256 */
27339         { { 0xf773535a64e8344dl,0xb8486a33d0dbabe6l,0x43c2df99b578862dl,
27340             0xcead29a11a39820el },
27341           { 0x3e5466fe63134d63l,0xc37ea88fdf43a104l,0x3b34ac34bbaacb5al,
27342             0x8281c240bc20be5al },
27343           0 },
27344         /* 53 << 256 */
27345         { { 0x55113d5e0f8dec77l,0xdfe59f251d7e1543l,0x3b2837e0a63a849al,
27346             0xdfbdb8b67a5691afl },
27347           { 0x8dd6faf0bd4cf444l,0x28b2bdfaab128b6cl,0x44af3ee24b1098ebl,
27348             0xbbf328ebe50b2d02l },
27349           0 },
27350         /* 55 << 256 */
27351         { { 0xf231b1f4e4e6151al,0x6ac7130413258c6al,0x6f9cb1c1a09b9f86l,
27352             0xbfc9291ee52ed880l },
27353           { 0x2a7d8230bea258a2l,0xd52a0da6baf386acl,0x5166764b3af00b7el,
27354             0x84792b043c985be2l },
27355           0 },
27356         /* 57 << 256 */
27357         { { 0x914ca588a906d9e4l,0xb4e4e86abc27a876l,0x97e6ed27724324f2l,
27358             0xda7e9aa5c0b87d2cl },
27359           { 0xafccbe6b33a56f84l,0x69e8fd4ac892d90al,0xb47512910bb5457fl,
27360             0xad65e4d05cb136fal },
27361           0 },
27362         /* 59 << 256 */
27363         { { 0xb09974d2fd679a1bl,0x17abc2a54578faf0l,0xe7da92828c830388l,
27364             0x7e455d8b0edf6146l },
27365           { 0xdff3b2f0c324bdb6l,0xe7a1718769f4a4f9l,0xfb4e0b3129c500a4l,
27366             0x1ed50799a09c5a07l },
27367           0 },
27368         /* 60 << 256 */
27369         { { 0x6b669496c679d9f9l,0x3b741f36e78f0830l,0xf99d4857eb3f9e53l,
27370             0x41be594276f7d4ael },
27371           { 0x75f44d57c09a112bl,0xa5139fd68475eeb7l,0xa4560cd5c6bc9df6l,
27372             0x8ce2c4cf50845434l },
27373           0 },
27374         /* 61 << 256 */
27375         { { 0x96b515c32b3cb0a6l,0x65836de3930d5344l,0xfb032d5b00e6d403l,
27376             0x2648301843c93bd1l },
27377           { 0xfc4525dd4b572363l,0x12b7923e7b28ab5cl,0xf376b633e22ac5e6l,
27378             0xd6ff6582e30b4707l },
27379           0 },
27380         /* 63 << 256 */
27381         { { 0x8bdce75c83b09e07l,0x64228b19227717c4l,0xeae8f8a2dc6a1f02l,
27382             0x1081031be72f3b6dl },
27383           { 0xba0f876072c3f736l,0xde38a0c5246a28adl,0x0b116fe08596c412l,
27384             0xb9e37be3fa135d11l },
27385           0 },
27386         /* 64 << 256 */
27387         { { 0x09800dc1b48d4168l,0xa740b282bfee87a2l,0x80c6b75dc94a547al,
27388             0x8cb622f0099c1985l },
27389           { 0xe6c789631467e05dl,0x027b658822fd3064l,0xe14735e2c2fdb68cl,
27390             0xfd2869947d853158l },
27391           0 },
27392         /* 65 << 256 */
27393         { { 0x301916a5bbd7caf1l,0xef563fda4e2076c2l,0xccbc56088467f279l,
27394             0xd7de3088b8d0f1bfl },
27395           { 0x3d9adcce8586910dl,0x3fa3b8b9d775e0e9l,0x4b7a4a1d88136503l,
27396             0xc748656de4994fcel },
27397           0 },
27398         /* 71 << 256 */
27399         { { 0x18cc605c2d9f8646l,0x3764f1c29e441b64l,0xb0ea7f7fc4b64ee3l,
27400             0xb5c22d0c042f8678l },
27401           { 0x3761f7f89b3057fdl,0xc85b8de64a207ce4l,0x11da715bc5c04cf7l,
27402             0x0cb1fa77c8e99c1fl },
27403           0 },
27404         /* 77 << 256 */
27405         { { 0x35f9cfc8045dab4el,0x08a65c6771a7d720l,0xf076767b8eef1351l,
27406             0x5351dbff8638fbe5l },
27407           { 0x5aead6f7772ad54cl,0x5f6b441fafe93e69l,0xb7b83d1aeeb876b5l,
27408             0xbe1ba4a7cdc094d9l },
27409           0 },
27410         /* 83 << 256 */
27411         { { 0x005d8f04ec0377bal,0x036b8e1ace58f05dl,0xdd6ffc6f1b28cf58l,
27412             0xc3d95a58e206189fl },
27413           { 0xcb2873c1f52e8b8cl,0xcffdb18d80142af1l,0x7cf88eb64c77ed78l,
27414             0xb3a3141981ef2c12l },
27415           0 },
27416         /* 89 << 256 */
27417         { { 0xbb17e6f957c175b1l,0xf33abc63260a6f6dl,0x9435f2de620ddd6bl,
27418             0x90bdde59ff3e99eal },
27419           { 0x3d7875e0567b520fl,0xdd6954aa813b4978l,0x1af3dc24de7b631cl,
27420             0x82ddcd08934d3c97l },
27421           0 },
27422         /* 95 << 256 */
27423         { { 0x7a9d60affc5ce598l,0xc6f507597c37abfdl,0xaa1b32f3a79355d0l,
27424             0xac581b94d7e4fcf3l },
27425           { 0x2669cefd139f6466l,0x560a98bb26f97570l,0x32e1c1db2837b908l,
27426             0x7823d7922d252781l },
27427           0 },
27428         /* 101 << 256 */
27429         { { 0xea018b4cdedf9af0l,0x4b64c0a380c1d2f9l,0x527a0b1c36992c44l,
27430             0x72a2408142b7adffl },
27431           { 0x0023d10f97a502eel,0xc0f9ed067b401ac4l,0xabd1bd03d6d3b516l,
27432             0xc320e3e478c5d0bel },
27433           0 },
27434         /* 107 << 256 */
27435         { { 0x9f5d2a6a37dd009cl,0x88c0f42ac2c3cbacl,0x3155636977552a1el,
27436             0xe78ec89d02f8098fl },
27437           { 0x276c2ad71b6eeff9l,0xf4c49a28f7f91856l,0x698a2368dc795124l,
27438             0x5502810de92a6c0fl },
27439           0 },
27440         /* 113 << 256 */
27441         { { 0x82a5042e9f5e5192l,0x64da65fac0965a88l,0xf4c80dd56668399el,
27442             0x635323757e33c233l },
27443           { 0x5e5339b1a0048616l,0x4a17b1931c91741fl,0x65fdc7c213dcf3d0l,
27444             0x230181426d10c410l },
27445           0 },
27446         /* 116 << 256 */
27447         { { 0x090a04220f46c635l,0xc7eac842a04de3f5l,0x45b69d4c8990d4b2l,
27448             0x032aeb50b8e0cdc6l },
27449           { 0x02ce332a4ee3f307l,0x3c80c1545043980fl,0xc774838bcbd5287cl,
27450             0x052661074a37d0ael },
27451           0 },
27452         /* 119 << 256 */
27453         { { 0xc401b9c0f4d70fbfl,0xf82bbfde98ee47fel,0x94965118c84d91afl,
27454             0xdd9a67c4d3b6ad1dl },
27455           { 0x85c9cf1eb66a3ad4l,0x05580a0fbf5f514cl,0xf3ef0fd00218536el,
27456             0x1dc2cf2bd14a7ca9l },
27457           0 },
27458         /* 125 << 256 */
27459         { { 0x18c83e337c1e24d4l,0x30911165563657c6l,0xf9be1af679e53083l,
27460             0x9b058059637753cel },
27461           { 0x6a37fa24e54522b9l,0xc11d38b426dbf4c4l,0xbc6738655ebd4d9al,
27462             0x2b40e9427fd4e2ecl },
27463           0 },
27464     },
27465 };
27466 
27467 /* Structure used to describe recoding of scalar multiplication. */
27468 typedef struct ecc_recode_sum {
27469     /* Index into pre-computation table. */
27470     uint8_t i;
27471     /* Multiplier to add point into. */
27472     uint8_t mul;
27473     /* Use the negative of the point. */
27474     uint8_t neg;
27475 } ecc_recode_sum;
27476 
27477 /* The index into pre-computation table to use. */
27478 static uint8_t recode_index_4_8[258] = {
27479      0,  1,  1,  1,  3,  4,  2,  5,  3,  2,  4,  8,  3,  9,  5,  4,
27480     11, 12,  6, 13,  7,  5,  8, 15, 55, 16,  9,  6, 18, 19,  7, 20,
27481     11,  8, 12, 23, 24, 25, 13,  9, 27, 28, 14, 29, 30, 10, 15, 33,
27482     11, 35, 16, 12, 37, 38, 17, 39, 18, 13, 19, 41, 42, 43, 20, 14,
27483     45, 46, 21, 44, 22, 15, 23, 47, 24, 43, 25, 16, 42, 48, 26, 41,
27484     27, 17, 28, 49, 18, 40, 29, 19, 30, 50, 31, 39, 32, 20, 33, 51,
27485     34, 38, 35, 21, 37, 52, 22, 36, 37, 23, 38, 53, 24, 35, 39, 25,
27486     34, 54, 40, 33, 55, 26, 32, 56, 27, 31, 43, 28, 30, 57, 44, 29,
27487     45, 29, 44, 57, 30, 28, 43, 31, 27, 56, 32, 26, 55, 33, 40, 54,
27488     34, 25, 39, 35, 24, 53, 38, 23, 37, 36, 22, 52, 37, 21, 35, 38,
27489     34, 51, 33, 20, 32, 39, 31, 50, 30, 19, 29, 40, 18, 49, 28, 17,
27490     27, 41, 26, 48, 42, 16, 25, 43, 24, 47, 23, 15, 22, 44, 21, 46,
27491     45, 14, 20, 43, 42, 41, 19, 13, 18, 39, 17, 38, 37, 12, 16, 35,
27492     11, 33, 15, 10, 30, 29, 14, 28, 27,  9, 13, 25, 24, 23, 12,  8,
27493     11, 20,  7, 19, 18,  6,  9, 16, 55, 15,  8,  5,  7, 13,  6, 12,
27494     11,  4,  5,  9,  3,  8,  4,  2,  3,  5,  2,  4,  3,  1,  1,  1,
27495      0,  1,
27496 };
27497 
27498 /* Multiple to add point into. */
27499 static uint8_t recode_mul_4_8[258] = {
27500      0,  1,  2,  3,  1,  1,  2,  1,  2,  3,  2,  1,  3,  1,  2,  3,
27501      1,  1,  2,  1,  2,  3,  2,  1,  2,  1,  2,  3,  1,  1,  3,  1,
27502      2,  3,  2,  1,  1,  1,  2,  3,  1,  1,  2,  1,  1,  3,  2,  1,
27503      3,  1,  2,  3,  1,  1,  2,  1,  2,  3,  2,  1,  1,  1,  2,  3,
27504      1,  1,  2,  3,  2,  3,  2,  1,  2,  3,  2,  3,  3,  1,  2,  3,
27505      2,  3,  2,  1,  3,  3,  2,  3,  2,  1,  2,  3,  2,  3,  2,  1,
27506      2,  3,  2,  3,  3,  1,  3,  3,  2,  3,  2,  1,  3,  3,  2,  3,
27507      3,  1,  2,  3,  1,  3,  3,  1,  3,  3,  2,  3,  3,  1,  2,  3,
27508      2,  3,  2,  1,  3,  3,  2,  3,  3,  1,  3,  3,  1,  3,  2,  1,
27509      3,  3,  2,  3,  3,  1,  2,  3,  2,  3,  3,  1,  3,  3,  2,  3,
27510      2,  1,  2,  3,  2,  3,  2,  1,  2,  3,  2,  3,  3,  1,  2,  3,
27511      2,  3,  2,  1,  3,  3,  2,  3,  2,  1,  2,  3,  2,  3,  2,  1,
27512      1,  3,  2,  1,  1,  1,  2,  3,  2,  1,  2,  1,  1,  3,  2,  1,
27513      3,  1,  2,  3,  1,  1,  2,  1,  1,  3,  2,  1,  1,  1,  2,  3,
27514      2,  1,  3,  1,  1,  3,  2,  1,  2,  1,  2,  3,  2,  1,  2,  1,
27515      1,  3,  2,  1,  3,  1,  2,  3,  2,  1,  2,  1,  1,  3,  2,  1,
27516      0,  1,
27517 };
27518 
27519 /* Whether to negate y-ordinate. */
27520 static uint8_t recode_neg_4_8[258] = {
27521      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
27522      0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,
27523      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
27524      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
27525      0,  0,  0,  1,  0,  0,  0,  0,  0,  1,  0,  0,  1,  0,  0,  1,
27526      0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,
27527      0,  1,  0,  0,  1,  0,  0,  1,  0,  0,  0,  0,  0,  1,  0,  0,
27528      1,  0,  0,  1,  0,  0,  1,  0,  0,  1,  0,  0,  1,  0,  0,  1,
27529      0,  0,  1,  1,  0,  1,  1,  0,  1,  1,  0,  1,  1,  0,  1,  1,
27530      0,  1,  1,  0,  1,  1,  1,  1,  1,  0,  1,  1,  0,  1,  1,  0,
27531      1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,
27532      1,  0,  1,  1,  0,  1,  1,  0,  1,  1,  1,  1,  1,  0,  1,  1,
27533      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
27534      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
27535      1,  1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,
27536      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
27537      0,  0,
27538 };
27539 
27540 /* Recode the scalar for multiplication using pre-computed values, multipliers
27541  * and subtraction.
27542  *
27543  * k  Scalar to multiply by.
27544  * v  Vector of operations to peform.
27545  */
27546 static void sp_256_ecc_recode_sum_8_4(sp_digit* k, ecc_recode_sum* v)
27547 {
27548     int i, j;
27549     uint16_t y;
27550     int carry = 0;
27551     int o;
27552     sp_digit n;
27553 
27554     j = 0;
27555     n = k[j];
27556     o = 0;
27557     for (i=0; i<33; i++) {
27558         y = n;
27559         if (o + 8 < 64) {
27560             y &= 0xff;
27561             n >>= 8;
27562             o += 8;
27563         }
27564         else if (o + 8 == 64) {
27565             n >>= 8;
27566             if (++j < 4)
27567                 n = k[j];
27568             o = 0;
27569         }
27570         else if (++j < 4) {
27571             n = k[j];
27572             y |= (n << (64 - o)) & 0xff;
27573             o -= 56;
27574             n >>= o;
27575         }
27576 
27577         y += carry;
27578         v[i].i = recode_index_4_8[y];
27579         v[i].mul = recode_mul_4_8[y];
27580         v[i].neg = recode_neg_4_8[y];
27581         carry = (y >> 8) + v[i].neg;
27582     }
27583 }
27584 
27585 /* Multiply the base point of P256 by the scalar and return the result.
27586  * If map is true then convert result to affine co-ordinates.
27587  *
27588  * r     Resulting point.
27589  * k     Scalar to multiply by.
27590  * map   Indicates whether to convert result to affine.
27591  * heap  Heap to use for allocation.
27592  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
27593  */
27594 static int sp_256_ecc_mulmod_base_4(sp_point* r, sp_digit* k, int map,
27595         void* heap)
27596 {
27597 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
27598     sp_point td[4];
27599     sp_point pd;
27600     sp_digit tmpd[2 * 4 * 5];
27601 #endif
27602     sp_point* t;
27603     sp_point* p;
27604     sp_digit* tmp;
27605     sp_digit* negy;
27606     int i;
27607     ecc_recode_sum v[33];
27608     int err;
27609 
27610     (void)heap;
27611 
27612     err = sp_ecc_point_new(heap, pd, p);
27613 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
27614     t = (sp_point*)XMALLOC(sizeof(sp_point) * 4, heap, DYNAMIC_TYPE_ECC);
27615     if (t == NULL)
27616         err = MEMORY_E;
27617     tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap,
27618                              DYNAMIC_TYPE_ECC);
27619     if (tmp == NULL)
27620         err = MEMORY_E;
27621 #else
27622     t = td;
27623     tmp = tmpd;
27624 #endif
27625     negy = tmp;
27626 
27627     if (err == MP_OKAY) {
27628         sp_256_ecc_recode_sum_8_4(k, v);
27629 
27630         XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
27631         XMEMSET(t, 0, sizeof(sp_point) * 4);
27632         for (i=0; i<4; i++) {
27633             XMEMCPY(t[i].z, p256_norm_mod, sizeof(p256_norm_mod));
27634             t[i].infinity = 1;
27635         }
27636 
27637         i = 32;
27638         XMEMCPY(t[v[i].mul].x, p256_table[i][v[i].i].x, sizeof(p256_table[i]->x));
27639         XMEMCPY(t[v[i].mul].y, p256_table[i][v[i].i].y, sizeof(p256_table[i]->y));
27640         t[v[i].mul].infinity = p256_table[i][v[i].i].infinity;
27641         for (--i; i>=0; i--) {
27642             XMEMCPY(p->x, p256_table[i][v[i].i].x, sizeof(p256_table[i]->x));
27643             XMEMCPY(p->y, p256_table[i][v[i].i].y, sizeof(p256_table[i]->y));
27644             p->infinity = p256_table[i][v[i].i].infinity;
27645             sp_256_sub_4(negy, p256_mod, p->y);
27646             sp_256_cond_copy_4(p->y, negy, (sp_digit)0 - v[i].neg);
27647             sp_256_proj_point_add_qz1_4(&t[v[i].mul], &t[v[i].mul], p, tmp);
27648         }
27649         sp_256_proj_point_add_4(&t[2], &t[2], &t[3], tmp);
27650         sp_256_proj_point_add_4(&t[1], &t[1], &t[3], tmp);
27651         sp_256_proj_point_dbl_4(&t[2], &t[2], tmp);
27652         sp_256_proj_point_add_4(&t[1], &t[1], &t[2], tmp);
27653 
27654         if (map)
27655             sp_256_map_4(r, &t[1], tmp);
27656         else
27657             XMEMCPY(r, &t[1], sizeof(sp_point));
27658     }
27659 
27660 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
27661     if (t != NULL) {
27662         XMEMSET(t, 0, sizeof(sp_point) * 4);
27663         XFREE(t, heap, DYNAMIC_TYPE_ECC);
27664     }
27665     if (tmp != NULL) {
27666         XMEMSET(tmp, 0, sizeof(sp_digit) * 2 * 4 * 5);
27667         XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
27668     }
27669 #else
27670     ForceZero(tmpd, sizeof(tmpd));
27671     ForceZero(td, sizeof(td));
27672 #endif
27673     sp_ecc_point_free(p, 0, heap);
27674 
27675     return MP_OKAY;
27676 }
27677 
27678 #endif /* WOLFSSL_SP_SMALL */
27679 /* Multiply the base point of P256 by the scalar and return the result.
27680  * If map is true then convert result to affine co-ordinates.
27681  *
27682  * km    Scalar to multiply by.
27683  * r     Resulting point.
27684  * map   Indicates whether to convert result to affine.
27685  * heap  Heap to use for allocation.
27686  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
27687  */
27688 int sp_ecc_mulmod_base_256(mp_int* km, ecc_point* r, int map, void* heap)
27689 {
27690 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
27691     sp_point p;
27692     sp_digit kd[4];
27693 #endif
27694     sp_point* point;
27695     sp_digit* k = NULL;
27696     int err = MP_OKAY;
27697 #ifdef HAVE_INTEL_AVX2
27698     word32 cpuid_flags = cpuid_get_flags();
27699 #endif
27700 
27701     err = sp_ecc_point_new(heap, p, point);
27702 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
27703     if (err == MP_OKAY) {
27704         k = XMALLOC(sizeof(sp_digit) * 4, heap, DYNAMIC_TYPE_ECC);
27705         if (k == NULL)
27706             err = MEMORY_E;
27707     }
27708 #else
27709     k = kd;
27710 #endif
27711     if (err == MP_OKAY) {
27712         sp_256_from_mp(k, 4, km);
27713 
27714 #ifdef HAVE_INTEL_AVX2
27715         if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags))
27716             err = sp_256_ecc_mulmod_base_avx2_4(point, k, map, heap);
27717         else
27718 #endif
27719             err = sp_256_ecc_mulmod_base_4(point, k, map, heap);
27720     }
27721     if (err == MP_OKAY)
27722         err = sp_256_point_to_ecc_point_4(point, r);
27723 
27724 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
27725     if (k != NULL)
27726         XFREE(k, heap, DYNAMIC_TYPE_ECC);
27727 #endif
27728     sp_ecc_point_free(point, 0, heap);
27729 
27730     return err;
27731 }
27732 
27733 #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN)
27734 /* Returns 1 if the number of zero.
27735  * Implementation is constant time.
27736  *
27737  * a  Number to check.
27738  * returns 1 if the number is zero and 0 otherwise.
27739  */
27740 static int sp_256_iszero_4(const sp_digit* a)
27741 {
27742     return (a[0] | a[1] | a[2] | a[3]) == 0;
27743 }
27744 
27745 #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN || HAVE_ECC_SIGN */
27746 /* Add 1 to a. (a = a + 1)
27747  *
27748  * r  A single precision integer.
27749  * a  A single precision integer.
27750  */
27751 static void sp_256_add_one_4(sp_digit* a)
27752 {
27753     __asm__ __volatile__ (
27754         "ldp    x1, x2,  [%[a], 0]\n\t"
27755         "ldp    x3, x4,  [%[a], 16]\n\t"
27756         "adds   x1, x1, #1\n\t"
27757         "adcs   x2, x2, xzr\n\t"
27758         "adcs   x3, x3, xzr\n\t"
27759         "adcs   x4, x4, xzr\n\t"
27760         "stp    x1, x2, [%[a], 0]\n\t"
27761         "stp    x3, x4, [%[a], 16]\n\t"
27762         :
27763         : [a] "r" (a)
27764         : "memory", "x1", "x2", "x3", "x4"
27765     );
27766 }
27767 
27768 /* Read big endian unsigned byte aray into r.
27769  *
27770  * r  A single precision integer.
27771  * a  Byte array.
27772  * n  Number of bytes in array to read.
27773  */
27774 static void sp_256_from_bin(sp_digit* r, int max, const byte* a, int n)
27775 {
27776     int i, j = 0, s = 0;
27777 
27778     r[0] = 0;
27779     for (i = n-1; i >= 0; i--) {
27780         r[j] |= ((sp_digit)a[i]) << s;
27781         if (s >= 56) {
27782             r[j] &= 0xffffffffffffffffl;
27783             s = 64 - s;
27784             if (j + 1 >= max)
27785                 break;
27786             r[++j] = a[i] >> s;
27787             s = 8 - s;
27788         }
27789         else
27790             s += 8;
27791     }
27792 
27793     for (j++; j < max; j++)
27794         r[j] = 0;
27795 }
27796 
27797 /* Generates a scalar that is in the range 1..order-1.
27798  *
27799  * rng  Random number generator.
27800  * k    Scalar value.
27801  * returns RNG failures, MEMORY_E when memory allocation fails and
27802  * MP_OKAY on success.
27803  */
27804 static int sp_256_ecc_gen_k_4(WC_RNG* rng, sp_digit* k)
27805 {
27806     int err;
27807     byte buf[32];
27808 
27809     do {
27810         err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
27811         if (err == 0) {
27812             sp_256_from_bin(k, 4, buf, sizeof(buf));
27813             if (sp_256_cmp_4(k, p256_order2) < 0) {
27814                 sp_256_add_one_4(k);
27815                 break;
27816             }
27817         }
27818     }
27819     while (err == 0);
27820 
27821     return err;
27822 }
27823 
27824 /* Makes a random EC key pair.
27825  *
27826  * rng   Random number generator.
27827  * priv  Generated private value.
27828  * pub   Generated public point.
27829  * heap  Heap to use for allocation.
27830  * returns ECC_INF_E when the point does not have the correct order, RNG
27831  * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
27832  */
27833 int sp_ecc_make_key_256(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
27834 {
27835 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
27836     sp_point p;
27837     sp_digit kd[4];
27838 #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
27839     sp_point inf;
27840 #endif
27841 #endif
27842     sp_point* point;
27843     sp_digit* k = NULL;
27844 #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
27845     sp_point* infinity;
27846 #endif
27847     int err;
27848 #ifdef HAVE_INTEL_AVX2
27849     word32 cpuid_flags = cpuid_get_flags();
27850 #endif
27851 
27852     (void)heap;
27853 
27854     err = sp_ecc_point_new(heap, p, point);
27855 #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
27856     if (err == MP_OKAY)
27857         err = sp_ecc_point_new(heap, inf, infinity);
27858 #endif
27859 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
27860     if (err == MP_OKAY) {
27861         k = XMALLOC(sizeof(sp_digit) * 4, heap, DYNAMIC_TYPE_ECC);
27862         if (k == NULL)
27863             err = MEMORY_E;
27864     }
27865 #else
27866     k = kd;
27867 #endif
27868 
27869     if (err == MP_OKAY)
27870         err = sp_256_ecc_gen_k_4(rng, k);
27871     if (err == MP_OKAY) {
27872 #ifdef HAVE_INTEL_AVX2
27873         if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags))
27874             err = sp_256_ecc_mulmod_base_avx2_4(point, k, 1, NULL);
27875         else
27876 #endif
27877             err = sp_256_ecc_mulmod_base_4(point, k, 1, NULL);
27878     }
27879 
27880 #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
27881     if (err == MP_OKAY) {
27882 #ifdef HAVE_INTEL_AVX2
27883         if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) {
27884             err = sp_256_ecc_mulmod_avx2_4(infinity, point, p256_order, 1,
27885                                                                           NULL);
27886         }
27887         else
27888 #endif
27889             err = sp_256_ecc_mulmod_4(infinity, point, p256_order, 1, NULL);
27890     }
27891     if (err == MP_OKAY) {
27892         if (!sp_256_iszero_4(point->x) || !sp_256_iszero_4(point->y))
27893             err = ECC_INF_E;
27894     }
27895 #endif
27896 
27897     if (err == MP_OKAY)
27898         err = sp_256_to_mp(k, priv);
27899     if (err == MP_OKAY)
27900         err = sp_256_point_to_ecc_point_4(point, pub);
27901 
27902 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
27903     if (k != NULL)
27904         XFREE(k, heap, DYNAMIC_TYPE_ECC);
27905 #endif
27906 #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
27907     sp_ecc_point_free(infinity, 1, heap);
27908 #endif
27909     sp_ecc_point_free(point, 1, heap);
27910 
27911     return err;
27912 }
27913 
27914 #ifdef HAVE_ECC_DHE
27915 /* Write r as big endian to byte aray.
27916  * Fixed length number of bytes written: 32
27917  *
27918  * r  A single precision integer.
27919  * a  Byte array.
27920  */
27921 static void sp_256_to_bin(sp_digit* r, byte* a)
27922 {
27923     int i, j, s = 0, b;
27924 
27925     j = 256 / 8 - 1;
27926     a[j] = 0;
27927     for (i=0; i<4 && j>=0; i++) {
27928         b = 0;
27929         a[j--] |= r[i] << s; b += 8 - s;
27930         if (j < 0)
27931             break;
27932         while (b < 64) {
27933             a[j--] = r[i] >> b; b += 8;
27934             if (j < 0)
27935                 break;
27936         }
27937         s = 8 - (b - 64);
27938         if (j >= 0)
27939             a[j] = 0;
27940         if (s != 0)
27941             j++;
27942     }
27943 }
27944 
27945 /* Multiply the point by the scalar and serialize the X ordinate.
27946  * The number is 0 padded to maximum size on output.
27947  *
27948  * priv    Scalar to multiply the point by.
27949  * pub     Point to multiply.
27950  * out     Buffer to hold X ordinate.
27951  * outLen  On entry, size of the buffer in bytes.
27952  *         On exit, length of data in buffer in bytes.
27953  * heap    Heap to use for allocation.
27954  * returns BUFFER_E if the buffer is to small for output size,
27955  * MEMORY_E when memory allocation fails and MP_OKAY on success.
27956  */
27957 int sp_ecc_secret_gen_256(mp_int* priv, ecc_point* pub, byte* out,
27958                           word32* outLen, void* heap)
27959 {
27960 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
27961     sp_point p;
27962     sp_digit kd[4];
27963 #endif
27964     sp_point* point = NULL;
27965     sp_digit* k = NULL;
27966     int err = MP_OKAY;
27967 #ifdef HAVE_INTEL_AVX2
27968     word32 cpuid_flags = cpuid_get_flags();
27969 #endif
27970 
27971     if (*outLen < 32)
27972         err = BUFFER_E;
27973 
27974     if (err == MP_OKAY)
27975         err = sp_ecc_point_new(heap, p, point);
27976 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
27977     if (err == MP_OKAY) {
27978         k = XMALLOC(sizeof(sp_digit) * 4, heap, DYNAMIC_TYPE_ECC);
27979         if (k == NULL)
27980             err = MEMORY_E;
27981     }
27982 #else
27983     k = kd;
27984 #endif
27985 
27986     if (err == MP_OKAY) {
27987         sp_256_from_mp(k, 4, priv);
27988         sp_256_point_from_ecc_point_4(point, pub);
27989 #ifdef HAVE_INTEL_AVX2
27990         if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags))
27991             err = sp_256_ecc_mulmod_avx2_4(point, point, k, 1, heap);
27992         else
27993 #endif
27994             err = sp_256_ecc_mulmod_4(point, point, k, 1, heap);
27995     }
27996     if (err == MP_OKAY) {
27997         sp_256_to_bin(point->x, out);
27998         *outLen = 32;
27999     }
28000 
28001 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
28002     if (k != NULL)
28003         XFREE(k, heap, DYNAMIC_TYPE_ECC);
28004 #endif
28005     sp_ecc_point_free(point, 0, heap);
28006 
28007     return err;
28008 }
28009 #endif /* HAVE_ECC_DHE */
28010 
28011 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
28012 /* Add b to a into r. (r = a + b)
28013  *
28014  * r  A single precision integer.
28015  * a  A single precision integer.
28016  * b  A single precision integer.
28017  */
28018 static sp_digit sp_256_add_4(sp_digit* r, const sp_digit* a,
28019         const sp_digit* b)
28020 {
28021     sp_digit c = 0;
28022 
28023     __asm__ __volatile__ (
28024         "ldp    x3, x4, [%[a], 0]\n\t"
28025         "ldp    x5, x6, [%[a], 16]\n\t"
28026         "ldp    x7, x8, [%[b], 0]\n\t"
28027         "ldp    x9, x10, [%[b], 16]\n\t"
28028         "adds   x3, x3, x7\n\t"
28029         "adcs   x4, x4, x8\n\t"
28030         "adcs   x5, x5, x9\n\t"
28031         "adcs   x6, x6, x10\n\t"
28032         "stp    x3, x4, [%[r], 0]\n\t"
28033         "stp    x5, x6, [%[r], 16]\n\t"
28034         "cset   %[c], cs\n\t"
28035         : [c] "+r" (c)
28036         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
28037         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
28038     );
28039 
28040     return c;
28041 }
28042 
28043 #endif
28044 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
28045 #ifdef WOLFSSL_SP_SMALL
28046 /* Multiply a and b into r. (r = a * b)
28047  *
28048  * r  A single precision integer.
28049  * a  A single precision integer.
28050  * b  A single precision integer.
28051  */
28052 static void sp_256_mul_4(sp_digit* r, const sp_digit* a, const sp_digit* b)
28053 {
28054     sp_digit tmp[8];
28055 
28056     __asm__ __volatile__ (
28057         "mov    x5, 0\n\t"
28058         "mov    x6, 0\n\t"
28059         "mov    x7, 0\n\t"
28060         "mov    x8, 0\n\t"
28061         "\n1:\n\t"
28062         "subs   x3, x5, 24\n\t"
28063         "csel   x3, xzr, x3, cc\n\t"
28064         "sub    x4, x5, x3\n\t"
28065         "\n2:\n\t"
28066         "ldr    x10, [%[a], x3]\n\t"
28067         "ldr    x11, [%[b], x4]\n\t"
28068         "mul    x9, x10, x11\n\t"
28069         "umulh  x10, x10, x11\n\t"
28070         "adds   x6, x6, x9\n\t"
28071         "adcs   x7, x7, x10\n\t"
28072         "adc    x8, x8, xzr\n\t"
28073         "add    x3, x3, #8\n\t"
28074         "sub    x4, x4, #8\n\t"
28075         "cmp    x3, 32\n\t"
28076         "b.eq   3f\n\t"
28077         "cmp    x3, x5\n\t"
28078         "b.le   2b\n\t"
28079         "\n3:\n\t"
28080         "str    x6, [%[r], x5]\n\t"
28081         "mov    x6, x7\n\t"
28082         "mov    x7, x8\n\t"
28083         "mov    x8, #0\n\t"
28084         "add    x5, x5, #8\n\t"
28085         "cmp    x5, 48\n\t"
28086         "b.le   1b\n\t"
28087         "str    x6, [%[r], x5]\n\t"
28088         :
28089         : [r] "r" (tmp), [a] "r" (a), [b] "r" (b)
28090         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
28091     );
28092 
28093     XMEMCPY(r, tmp, sizeof(tmp));
28094 }
28095 
28096 #else
28097 /* Multiply a and b into r. (r = a * b)
28098  *
28099  * r  A single precision integer.
28100  * a  A single precision integer.
28101  * b  A single precision integer.
28102  */
28103 static void sp_256_mul_4(sp_digit* r, const sp_digit* a, const sp_digit* b)
28104 {
28105     sp_digit tmp[4];
28106 
28107     __asm__ __volatile__ (
28108         "ldp    x8, x9, [%[a], 0]\n\t"
28109         "ldp    x10, x11, [%[a], 16]\n\t"
28110         "ldp    x12, x13, [%[b], 0]\n\t"
28111         "ldp    x14, x15, [%[b], 16]\n\t"
28112         "#  A[0] * B[0]\n\t"
28113         "mul    x3, x8, x12\n\t"
28114         "umulh  x4, x8, x12\n\t"
28115         "str    x3, [%[tmp]]\n\t"
28116         "#  A[0] * B[1]\n\t"
28117         "mul    x6, x8, x13\n\t"
28118         "umulh  x7, x8, x13\n\t"
28119         "adds   x4, x4, x6\n\t"
28120         "adc    x5, xzr, x7\n\t"
28121         "#  A[1] * B[0]\n\t"
28122         "mul    x6, x9, x12\n\t"
28123         "umulh  x7, x9, x12\n\t"
28124         "adds   x4, x4, x6\n\t"
28125         "adcs   x5, x5, x7\n\t"
28126         "adc    x3, xzr, xzr\n\t"
28127         "str    x4, [%[tmp], 8]\n\t"
28128         "#  A[0] * B[2]\n\t"
28129         "mul    x6, x8, x14\n\t"
28130         "umulh  x7, x8, x14\n\t"
28131         "adds   x5, x5, x6\n\t"
28132         "adcs   x3, x3, x7\n\t"
28133         "adc    x4, xzr, xzr\n\t"
28134         "#  A[1] * B[1]\n\t"
28135         "mul    x6, x9, x13\n\t"
28136         "umulh  x7, x9, x13\n\t"
28137         "adds   x5, x5, x6\n\t"
28138         "adcs   x3, x3, x7\n\t"
28139         "adc    x4, x4, xzr\n\t"
28140         "#  A[2] * B[0]\n\t"
28141         "mul    x6, x10, x12\n\t"
28142         "umulh  x7, x10, x12\n\t"
28143         "adds   x5, x5, x6\n\t"
28144         "adcs   x3, x3, x7\n\t"
28145         "adc    x4, x4, xzr\n\t"
28146         "str    x5, [%[tmp], 16]\n\t"
28147         "#  A[0] * B[3]\n\t"
28148         "mul    x6, x8, x15\n\t"
28149         "umulh  x7, x8, x15\n\t"
28150         "adds   x3, x3, x6\n\t"
28151         "adcs   x4, x4, x7\n\t"
28152         "adc    x5, xzr, xzr\n\t"
28153         "#  A[1] * B[2]\n\t"
28154         "mul    x6, x9, x14\n\t"
28155         "umulh  x7, x9, x14\n\t"
28156         "adds   x3, x3, x6\n\t"
28157         "adcs   x4, x4, x7\n\t"
28158         "adc    x5, x5, xzr\n\t"
28159         "#  A[2] * B[1]\n\t"
28160         "mul    x6, x10, x13\n\t"
28161         "umulh  x7, x10, x13\n\t"
28162         "adds   x3, x3, x6\n\t"
28163         "adcs   x4, x4, x7\n\t"
28164         "adc    x5, x5, xzr\n\t"
28165         "#  A[3] * B[0]\n\t"
28166         "mul    x6, x11, x12\n\t"
28167         "umulh  x7, x11, x12\n\t"
28168         "adds   x3, x3, x6\n\t"
28169         "adcs   x4, x4, x7\n\t"
28170         "adc    x5, x5, xzr\n\t"
28171         "str    x3, [%[tmp], 24]\n\t"
28172         "#  A[1] * B[3]\n\t"
28173         "mul    x6, x9, x15\n\t"
28174         "umulh  x7, x9, x15\n\t"
28175         "adds   x4, x4, x6\n\t"
28176         "adcs   x5, x5, x7\n\t"
28177         "adc    x3, xzr, xzr\n\t"
28178         "#  A[2] * B[2]\n\t"
28179         "mul    x6, x10, x14\n\t"
28180         "umulh  x7, x10, x14\n\t"
28181         "adds   x4, x4, x6\n\t"
28182         "adcs   x5, x5, x7\n\t"
28183         "adc    x3, x3, xzr\n\t"
28184         "#  A[3] * B[1]\n\t"
28185         "mul    x6, x11, x13\n\t"
28186         "umulh  x7, x11, x13\n\t"
28187         "adds   x4, x4, x6\n\t"
28188         "adcs   x5, x5, x7\n\t"
28189         "adc    x3, x3, xzr\n\t"
28190         "str    x4, [%[r], 32]\n\t"
28191         "#  A[2] * B[3]\n\t"
28192         "mul    x6, x10, x15\n\t"
28193         "umulh  x7, x10, x15\n\t"
28194         "adds   x5, x5, x6\n\t"
28195         "adcs   x3, x3, x7\n\t"
28196         "adc    x4, xzr, xzr\n\t"
28197         "#  A[3] * B[2]\n\t"
28198         "mul    x6, x11, x14\n\t"
28199         "umulh  x7, x11, x14\n\t"
28200         "adds   x5, x5, x6\n\t"
28201         "adcs   x3, x3, x7\n\t"
28202         "adc    x4, x4, xzr\n\t"
28203         "str    x5, [%[r], 40]\n\t"
28204         "#  A[3] * B[3]\n\t"
28205         "mul    x6, x11, x15\n\t"
28206         "umulh  x7, x11, x15\n\t"
28207         "adds   x3, x3, x6\n\t"
28208         "adc    x4, x4, x7\n\t"
28209         "stp    x3, x4, [%[r], 48]\n\t"
28210         :
28211         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [tmp] "r" (tmp)
28212         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15"
28213     );
28214 
28215     XMEMCPY(r, tmp, sizeof(tmp));
28216 }
28217 
28218 #endif /* WOLFSSL_SP_SMALL */
28219 #ifdef HAVE_INTEL_AVX2
28220 #endif /* HAVE_INTEL_AVX2 */
28221 #endif
28222 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
28223 /* Sub b from a into a. (a -= b)
28224  *
28225  * a  A single precision integer and result.
28226  * b  A single precision integer.
28227  */
28228 static sp_digit sp_256_sub_in_place_4(sp_digit* a, const sp_digit* b)
28229 {
28230     sp_digit c = 0;
28231 
28232     __asm__ __volatile__ (
28233         "ldp    x2, x3, [%[a], 0]\n\t"
28234         "ldp    x4, x5, [%[a], 16]\n\t"
28235         "ldp    x6, x7, [%[b], 0]\n\t"
28236         "ldp    x8, x9, [%[b], 16]\n\t"
28237         "subs   x2, x2, x6\n\t"
28238         "sbcs   x3, x3, x7\n\t"
28239         "sbcs   x4, x4, x8\n\t"
28240         "sbcs   x5, x5, x9\n\t"
28241         "stp    x2, x3, [%[a], 0]\n\t"
28242         "stp    x4, x5, [%[a], 16]\n\t"
28243         "csetm  %[c], cc\n\t"
28244         : [c] "+r" (c)
28245         : [a] "r" (a), [b] "r" (b)
28246         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
28247     );
28248 
28249     return c;
28250 }
28251 
28252 /* Mul a by digit b into r. (r = a * b)
28253  *
28254  * r  A single precision integer.
28255  * a  A single precision integer.
28256  * b  A single precision digit.
28257  */
28258 static void sp_256_mul_d_4(sp_digit* r, const sp_digit* a,
28259         const sp_digit b)
28260 {
28261     __asm__ __volatile__ (
28262         "# A[0] * B\n\t"
28263         "ldr    x8, [%[a]]\n\t"
28264         "mul    x3, %[b], x8\n\t"
28265         "umulh  x4, %[b], x8\n\t"
28266         "mov    x5, 0\n\t"
28267         "str    x3, [%[r]]\n\t"
28268         "# A[1] * B\n\t"
28269         "ldr        x8, [%[a], 8]\n\t"
28270         "mov        x3, 0\n\t"
28271         "mul        x6, %[b], x8\n\t"
28272         "umulh  x7, %[b], x8\n\t"
28273         "adds   x4, x4, x6\n\t"
28274         "adcs   x5, x5, x7\n\t"
28275         "adc        x3, xzr, xzr\n\t"
28276         "str        x4, [%[r], 8]\n\t"
28277         "# A[2] * B\n\t"
28278         "ldr        x8, [%[a], 16]\n\t"
28279         "mov        x4, 0\n\t"
28280         "mul        x6, %[b], x8\n\t"
28281         "umulh  x7, %[b], x8\n\t"
28282         "adds   x5, x5, x6\n\t"
28283         "adcs   x3, x3, x7\n\t"
28284         "adc        x4, xzr, xzr\n\t"
28285         "str        x5, [%[r], 16]\n\t"
28286         "# A[3] * B\n\t"
28287         "ldr    x8, [%[a], 24]\n\t"
28288         "mul    x6, %[b], x8\n\t"
28289         "umulh  x7, %[b], x8\n\t"
28290         "adds   x3, x3, x6\n\t"
28291         "adc    x4, x4, x7\n\t"
28292         "str    x3, [%[r], 24]\n\t"
28293         "str    x4, [%[r], 32]\n\t"
28294         :
28295         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
28296         : "memory", "x3", "x4", "x5", "x6", "x7", "x8"
28297     );
28298 }
28299 
28300 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
28301  *
28302  * d1   The high order half of the number to divide.
28303  * d0   The low order half of the number to divide.
28304  * div  The dividend.
28305  * returns the result of the division.
28306  */
28307 static sp_digit div_256_word_4(sp_digit d1, sp_digit d0, sp_digit div)
28308 {
28309     sp_digit r;
28310 
28311     __asm__ __volatile__ (
28312         "lsr    x5, %[div], 32\n\t"
28313         "add    x5, x5, 1\n\t"
28314 
28315         "udiv   x3, %[d1], x5\n\t"
28316         "lsl    x6, x3, 32\n\t"
28317         "mul    x4, %[div], x6\n\t"
28318         "umulh  x3, %[div], x6\n\t"
28319         "subs   %[d0], %[d0], x4\n\t"
28320         "sbc    %[d1], %[d1], x3\n\t"
28321 
28322         "udiv   x3, %[d1], x5\n\t"
28323         "lsl    x3, x3, 32\n\t"
28324         "add    x6, x6, x3\n\t"
28325         "mul    x4, %[div], x3\n\t"
28326         "umulh  x3, %[div], x3\n\t"
28327         "subs   %[d0], %[d0], x4\n\t"
28328         "sbc    %[d1], %[d1], x3\n\t"
28329 
28330         "lsl    x3, %[d1], 32\n\t"
28331         "orr    x3, x3, %[d0], lsr 32\n\t"
28332 
28333         "udiv   x3, x3, x5\n\t"
28334         "add    x6, x6, x3\n\t"
28335         "mul    x4, %[div], x3\n\t"
28336         "umulh  x3, %[div], x3\n\t"
28337         "subs   %[d0], %[d0], x4\n\t"
28338         "sbc    %[d1], %[d1], x3\n\t"
28339 
28340         "lsl    x3, %[d1], 32\n\t"
28341         "orr    x3, x3, %[d0], lsr 32\n\t"
28342 
28343         "udiv   x3, x3, x5\n\t"
28344         "add    x6, x6, x3\n\t"
28345         "mul    x4, %[div], x3\n\t"
28346         "umulh  x3, %[div], x3\n\t"
28347         "subs   %[d0], %[d0], x4\n\t"
28348         "sbc    %[d1], %[d1], x3\n\t"
28349 
28350         "udiv   x3, %[d0], %[div]\n\t"
28351         "add    x6, x6, x3\n\t"
28352         "mul    x3, %[div], x3\n\t"
28353         "sub    %[d0], %[d0], x3\n\t"
28354         "mov    %[r], x6\n\t"
28355 
28356         : [r] "=r" (r)
28357         : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div)
28358         : "x3", "x4", "x5", "x6"
28359     );
28360 
28361     return r;
28362 }
28363 
28364 /* AND m into each word of a and store in r.
28365  *
28366  * r  A single precision integer.
28367  * a  A single precision integer.
28368  * m  Mask to AND against each digit.
28369  */
28370 static void sp_256_mask_4(sp_digit* r, sp_digit* a, sp_digit m)
28371 {
28372 #ifdef WOLFSSL_SP_SMALL
28373     int i;
28374 
28375     for (i=0; i<4; i++)
28376         r[i] = a[i] & m;
28377 #else
28378     r[0] = a[0] & m;
28379     r[1] = a[1] & m;
28380     r[2] = a[2] & m;
28381     r[3] = a[3] & m;
28382 #endif
28383 }
28384 
28385 /* Divide d in a and put remainder into r (m*d + r = a)
28386  * m is not calculated as it is not needed at this time.
28387  *
28388  * a  Nmber to be divided.
28389  * d  Number to divide with.
28390  * m  Multiplier result.
28391  * r  Remainder from the division.
28392  * returns MP_OKAY indicating success.
28393  */
28394 static WC_INLINE int sp_256_div_4(sp_digit* a, sp_digit* d, sp_digit* m,
28395         sp_digit* r)
28396 {
28397     sp_digit t1[8], t2[5];
28398     sp_digit div, r1;
28399     int i;
28400 
28401     (void)m;
28402 
28403     div = d[3];
28404     XMEMCPY(t1, a, sizeof(*t1) * 2 * 4);
28405     for (i=3; i>=0; i--) {
28406         r1 = div_256_word_4(t1[4 + i], t1[4 + i - 1], div);
28407 
28408         sp_256_mul_d_4(t2, d, r1);
28409         t1[4 + i] += sp_256_sub_in_place_4(&t1[i], t2);
28410         t1[4 + i] -= t2[4];
28411         sp_256_mask_4(t2, d, t1[4 + i]);
28412         t1[4 + i] += sp_256_add_4(&t1[i], &t1[i], t2);
28413         sp_256_mask_4(t2, d, t1[4 + i]);
28414         t1[4 + i] += sp_256_add_4(&t1[i], &t1[i], t2);
28415     }
28416 
28417     r1 = sp_256_cmp_4(t1, d) >= 0;
28418     sp_256_cond_sub_4(r, t1, t2, (sp_digit)0 - r1);
28419 
28420     return MP_OKAY;
28421 }
28422 
28423 /* Reduce a modulo m into r. (r = a mod m)
28424  *
28425  * r  A single precision number that is the reduced result.
28426  * a  A single precision number that is to be reduced.
28427  * m  A single precision number that is the modulus to reduce with.
28428  * returns MP_OKAY indicating success.
28429  */
28430 static WC_INLINE int sp_256_mod_4(sp_digit* r, sp_digit* a, sp_digit* m)
28431 {
28432     return sp_256_div_4(a, m, NULL, r);
28433 }
28434 
28435 #endif
28436 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
28437 #ifdef WOLFSSL_SP_SMALL
28438 /* Square a and put result in r. (r = a * a)
28439  *
28440  * r  A single precision integer.
28441  * a  A single precision integer.
28442  */
28443 static void sp_256_sqr_4(sp_digit* r, const sp_digit* a)
28444 {
28445     sp_digit tmp[8];
28446 
28447     __asm__ __volatile__ (
28448         "mov    x6, 0\n\t"
28449         "mov    x7, 0\n\t"
28450         "mov    x8, 0\n\t"
28451         "mov    x5, 0\n\t"
28452         "\n1:\n\t"
28453         "subs   x3, x5, 24\n\t"
28454         "csel   x3, xzr, x3, cc\n\t"
28455         "sub    x4, x5, x3\n\t"
28456         "\n2:\n\t"
28457         "cmp    x4, x3\n\t"
28458         "b.eq   4f\n\t"
28459         "ldr    x10, [%[a], x3]\n\t"
28460         "ldr    x11, [%[a], x4]\n\t"
28461         "mul    x9, x10, x11\n\t"
28462         "umulh  x10, x10, x11\n\t"
28463         "adds   x6, x6, x9\n\t"
28464         "adcs   x7, x7, x10\n\t"
28465         "adc    x8, x8, xzr\n\t"
28466         "adds   x6, x6, x9\n\t"
28467         "adcs   x7, x7, x10\n\t"
28468         "adc    x8, x8, xzr\n\t"
28469         "b.al   5f\n\t"
28470         "\n4:\n\t"
28471         "ldr    x10, [%[a], x3]\n\t"
28472         "mul    x9, x10, x10\n\t"
28473         "umulh  x10, x10, x10\n\t"
28474         "adds   x6, x6, x9\n\t"
28475         "adcs   x7, x7, x10\n\t"
28476         "adc    x8, x8, xzr\n\t"
28477         "\n5:\n\t"
28478         "add    x3, x3, #8\n\t"
28479         "sub    x4, x4, #8\n\t"
28480         "cmp    x3, 32\n\t"
28481         "b.eq   3f\n\t"
28482         "cmp    x3, x4\n\t"
28483         "b.gt   3f\n\t"
28484         "cmp    x3, x5\n\t"
28485         "b.le   2b\n\t"
28486         "\n3:\n\t"
28487         "str    x6, [%[r], x5]\n\t"
28488         "mov    x6, x7\n\t"
28489         "mov    x7, x8\n\t"
28490         "mov    x8, #0\n\t"
28491         "add    x5, x5, #8\n\t"
28492         "cmp    x5, 48\n\t"
28493         "b.le   1b\n\t"
28494         "str    x6, [%[r], x5]\n\t"
28495         :
28496         : [r] "r" (tmp), [a] "r" (a)
28497         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
28498     );
28499 
28500     XMEMCPY(r, tmp, sizeof(tmp));
28501 }
28502 
28503 #else
28504 /* Square a and put result in r. (r = a * a)
28505  *
28506  * r  A single precision integer.
28507  * a  A single precision integer.
28508  */
28509 static void sp_256_sqr_4(sp_digit* r, const sp_digit* a)
28510 {
28511     sp_digit tmp[4];
28512 
28513     __asm__ __volatile__ (
28514         "ldp    x10, x11, [%[a], 0]\n\t"
28515         "ldp    x12, x13, [%[a], 16]\n\t"
28516         "#  A[0] * A[0]\n\t"
28517         "mul    x2, x10, x10\n\t"
28518         "umulh  x3, x10, x10\n\t"
28519         "str    x2, [%[tmp]]\n\t"
28520         "mov    x4, 0\n\t"
28521         "#  A[0] * A[1]\n\t"
28522         "mul    x8, x10, x11\n\t"
28523         "umulh  x9, x10, x11\n\t"
28524         "adds   x3, x3, x8\n\t"
28525         "adcs   x4, x4, x9\n\t"
28526         "adc    x2, xzr, xzr\n\t"
28527         "adds   x3, x3, x8\n\t"
28528         "adcs   x4, x4, x9\n\t"
28529         "adc    x2, x2, xzr\n\t"
28530         "str    x3, [%[tmp], 8]\n\t"
28531         "#  A[0] * A[2]\n\t"
28532         "mul    x8, x10, x12\n\t"
28533         "umulh  x9, x10, x12\n\t"
28534         "adds   x4, x4, x8\n\t"
28535         "adcs   x2, x2, x9\n\t"
28536         "adc    x3, xzr, xzr\n\t"
28537         "adds   x4, x4, x8\n\t"
28538         "adcs   x2, x2, x9\n\t"
28539         "adc    x3, x3, xzr\n\t"
28540         "#  A[1] * A[1]\n\t"
28541         "mul    x8, x11, x11\n\t"
28542         "umulh  x9, x11, x11\n\t"
28543         "adds   x4, x4, x8\n\t"
28544         "adcs   x2, x2, x9\n\t"
28545         "adc    x3, x3, xzr\n\t"
28546         "str    x4, [%[tmp], 16]\n\t"
28547         "#  A[0] * A[3]\n\t"
28548         "mul    x8, x10, x13\n\t"
28549         "umulh  x9, x10, x13\n\t"
28550         "adds   x2, x2, x8\n\t"
28551         "adcs   x3, x3, x9\n\t"
28552         "adc    x4, xzr, xzr\n\t"
28553         "adds   x2, x2, x8\n\t"
28554         "adcs   x3, x3, x9\n\t"
28555         "adc    x4, x4, xzr\n\t"
28556         "#  A[1] * A[2]\n\t"
28557         "mul    x8, x11, x12\n\t"
28558         "umulh  x9, x11, x12\n\t"
28559         "adds   x2, x2, x8\n\t"
28560         "adcs   x3, x3, x9\n\t"
28561         "adc    x4, x4, xzr\n\t"
28562         "adds   x2, x2, x8\n\t"
28563         "adcs   x3, x3, x9\n\t"
28564         "adc    x4, x4, xzr\n\t"
28565         "str    x2, [%[tmp], 24]\n\t"
28566         "#  A[1] * A[3]\n\t"
28567         "mul    x8, x11, x13\n\t"
28568         "umulh  x9, x11, x13\n\t"
28569         "adds   x3, x3, x8\n\t"
28570         "adcs   x4, x4, x9\n\t"
28571         "adc    x2, xzr, xzr\n\t"
28572         "adds   x3, x3, x8\n\t"
28573         "adcs   x4, x4, x9\n\t"
28574         "adc    x2, x2, xzr\n\t"
28575         "#  A[2] * A[2]\n\t"
28576         "mul    x8, x12, x12\n\t"
28577         "umulh  x9, x12, x12\n\t"
28578         "adds   x3, x3, x8\n\t"
28579         "adcs   x4, x4, x9\n\t"
28580         "adc    x2, x2, xzr\n\t"
28581         "str    x3, [%[r], 32]\n\t"
28582         "#  A[2] * A[3]\n\t"
28583         "mul    x8, x12, x13\n\t"
28584         "umulh  x9, x12, x13\n\t"
28585         "adds   x4, x4, x8\n\t"
28586         "adcs   x2, x2, x9\n\t"
28587         "adc    x3, xzr, xzr\n\t"
28588         "adds   x4, x4, x8\n\t"
28589         "adcs   x2, x2, x9\n\t"
28590         "adc    x3, x3, xzr\n\t"
28591         "str    x4, [%[r], 40]\n\t"
28592         "#  A[3] * A[3]\n\t"
28593         "mul    x8, x13, x13\n\t"
28594         "umulh  x9, x13, x13\n\t"
28595         "adds   x2, x2, x8\n\t"
28596         "adc    x3, x3, x9\n\t"
28597         "stp    x2, x3, [%[r], 48]\n\t"
28598         :
28599         : [r] "r" (r), [a] "r" (a), [tmp] "r" (tmp)
28600         : "memory", "x2", "x3", "x4", "x8", "x9", "x10", "x5", "x6", "x7", "x10", "x11", "x12", "x13"
28601     );
28602 
28603     XMEMCPY(r, tmp, sizeof(tmp));
28604 }
28605 
28606 #endif /* WOLFSSL_SP_SMALL */
28607 #ifdef WOLFSSL_SP_SMALL
28608 /* Order-2 for the P256 curve. */
28609 static const uint64_t p256_order_2[4] = {
28610     0xf3b9cac2fc63254f,0xbce6faada7179e84,0xffffffffffffffff,
28611     0xffffffff00000000
28612 };
28613 #else
28614 /* The low half of the order-2 of the P256 curve. */
28615 static const uint64_t p256_order_low[2] = {
28616     0xf3b9cac2fc63254f,0xbce6faada7179e84
28617 };
28618 #endif /* WOLFSSL_SP_SMALL */
28619 
28620 /* Multiply two number mod the order of P256 curve. (r = a * b mod order)
28621  *
28622  * r  Result of the multiplication.
28623  * a  First operand of the multiplication.
28624  * b  Second operand of the multiplication.
28625  */
28626 static void sp_256_mont_mul_order_4(sp_digit* r, sp_digit* a, sp_digit* b)
28627 {
28628     sp_256_mul_4(r, a, b);
28629     sp_256_mont_reduce_4(r, p256_order, p256_mp_order);
28630 }
28631 
28632 /* Square number mod the order of P256 curve. (r = a * a mod order)
28633  *
28634  * r  Result of the squaring.
28635  * a  Number to square.
28636  */
28637 static void sp_256_mont_sqr_order_4(sp_digit* r, sp_digit* a)
28638 {
28639     sp_256_sqr_4(r, a);
28640     sp_256_mont_reduce_4(r, p256_order, p256_mp_order);
28641 }
28642 
28643 #ifndef WOLFSSL_SP_SMALL
28644 /* Square number mod the order of P256 curve a number of times.
28645  * (r = a ^ n mod order)
28646  *
28647  * r  Result of the squaring.
28648  * a  Number to square.
28649  */
28650 static void sp_256_mont_sqr_n_order_4(sp_digit* r, sp_digit* a, int n)
28651 {
28652     int i;
28653 
28654     sp_256_mont_sqr_order_4(r, a);
28655     for (i=1; i<n; i++)
28656         sp_256_mont_sqr_order_4(r, r);
28657 }
28658 #endif /* !WOLFSSL_SP_SMALL */
28659 
28660 /* Invert the number, in Montgomery form, modulo the order of the P256 curve.
28661  * (r = 1 / a mod order)
28662  *
28663  * r   Inverse result.
28664  * a   Number to invert.
28665  * td  Temporary data.
28666  */
28667 static void sp_256_mont_inv_order_4(sp_digit* r, sp_digit* a,
28668         sp_digit* td)
28669 {
28670 #ifdef WOLFSSL_SP_SMALL
28671     sp_digit* t = td;
28672     int i;
28673 
28674     XMEMCPY(t, a, sizeof(sp_digit) * 4);
28675     for (i=254; i>=0; i--) {
28676         sp_256_mont_sqr_order_4(t, t);
28677         if (p256_order_2[i / 64] & ((sp_digit)1 << (i % 64)))
28678             sp_256_mont_mul_order_4(t, t, a);
28679     }
28680     XMEMCPY(r, t, sizeof(sp_digit) * 4);
28681 #else
28682     sp_digit* t = td;
28683     sp_digit* t2 = td + 2 * 4;
28684     sp_digit* t3 = td + 4 * 4;
28685     int i;
28686 
28687     /* t = a^2 */
28688     sp_256_mont_sqr_order_4(t, a);
28689     /* t = a^3 = t * a */
28690     sp_256_mont_mul_order_4(t, t, a);
28691     /* t2= a^c = t ^ 2 ^ 2 */
28692     sp_256_mont_sqr_n_order_4(t2, t, 2);
28693     /* t3= a^f = t2 * t */
28694     sp_256_mont_mul_order_4(t3, t2, t);
28695     /* t2= a^f0 = t3 ^ 2 ^ 4 */
28696     sp_256_mont_sqr_n_order_4(t2, t3, 4);
28697     /* t = a^ff = t2 * t3 */
28698     sp_256_mont_mul_order_4(t, t2, t3);
28699     /* t3= a^ff00 = t ^ 2 ^ 8 */
28700     sp_256_mont_sqr_n_order_4(t2, t, 8);
28701     /* t = a^ffff = t2 * t */
28702     sp_256_mont_mul_order_4(t, t2, t);
28703     /* t2= a^ffff0000 = t ^ 2 ^ 16 */
28704     sp_256_mont_sqr_n_order_4(t2, t, 16);
28705     /* t = a^ffffffff = t2 * t */
28706     sp_256_mont_mul_order_4(t, t2, t);
28707     /* t2= a^ffffffff0000000000000000 = t ^ 2 ^ 64  */
28708     sp_256_mont_sqr_n_order_4(t2, t, 64);
28709     /* t2= a^ffffffff00000000ffffffff = t2 * t */
28710     sp_256_mont_mul_order_4(t2, t2, t);
28711     /* t2= a^ffffffff00000000ffffffff00000000 = t2 ^ 2 ^ 32  */
28712     sp_256_mont_sqr_n_order_4(t2, t2, 32);
28713     /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */
28714     sp_256_mont_mul_order_4(t2, t2, t);
28715     /* t2= a^ffffffff00000000ffffffffffffffffbce6 */
28716     for (i=127; i>=112; i--) {
28717         sp_256_mont_sqr_order_4(t2, t2);
28718         if (p256_order_low[i / 64] & ((sp_digit)1 << (i % 64)))
28719             sp_256_mont_mul_order_4(t2, t2, a);
28720     }
28721     /* t2= a^ffffffff00000000ffffffffffffffffbce6f */
28722     sp_256_mont_sqr_n_order_4(t2, t2, 4);
28723     sp_256_mont_mul_order_4(t2, t2, t3);
28724     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84 */
28725     for (i=107; i>=64; i--) {
28726         sp_256_mont_sqr_order_4(t2, t2);
28727         if (p256_order_low[i / 64] & ((sp_digit)1 << (i % 64)))
28728             sp_256_mont_mul_order_4(t2, t2, a);
28729     }
28730     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f */
28731     sp_256_mont_sqr_n_order_4(t2, t2, 4);
28732     sp_256_mont_mul_order_4(t2, t2, t3);
28733     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2 */
28734     for (i=59; i>=32; i--) {
28735         sp_256_mont_sqr_order_4(t2, t2);
28736         if (p256_order_low[i / 64] & ((sp_digit)1 << (i % 64)))
28737             sp_256_mont_mul_order_4(t2, t2, a);
28738     }
28739     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2f */
28740     sp_256_mont_sqr_n_order_4(t2, t2, 4);
28741     sp_256_mont_mul_order_4(t2, t2, t3);
28742     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254 */
28743     for (i=27; i>=0; i--) {
28744         sp_256_mont_sqr_order_4(t2, t2);
28745         if (p256_order_low[i / 64] & ((sp_digit)1 << (i % 64)))
28746             sp_256_mont_mul_order_4(t2, t2, a);
28747     }
28748     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 */
28749     sp_256_mont_sqr_n_order_4(t2, t2, 4);
28750     /* r = a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f */
28751     sp_256_mont_mul_order_4(r, t2, t3);
28752 #endif /* WOLFSSL_SP_SMALL */
28753 }
28754 
28755 #ifdef HAVE_INTEL_AVX2
28756 /* Multiply two number mod the order of P256 curve. (r = a * b mod order)
28757  *
28758  * r  Result of the multiplication.
28759  * a  First operand of the multiplication.
28760  * b  Second operand of the multiplication.
28761  */
28762 static void sp_256_mont_mul_order_avx2_4(sp_digit* r, sp_digit* a, sp_digit* b)
28763 {
28764     sp_256_mul_avx2_4(r, a, b);
28765     sp_256_mont_reduce_avx2_4(r, p256_order, p256_mp_order);
28766 }
28767 
28768 /* Square number mod the order of P256 curve. (r = a * a mod order)
28769  *
28770  * r  Result of the squaring.
28771  * a  Number to square.
28772  */
28773 static void sp_256_mont_sqr_order_avx2_4(sp_digit* r, sp_digit* a)
28774 {
28775     sp_256_sqr_avx2_4(r, a);
28776     sp_256_mont_reduce_avx2_4(r, p256_order, p256_mp_order);
28777 }
28778 
28779 #ifndef WOLFSSL_SP_SMALL
28780 /* Square number mod the order of P256 curve a number of times.
28781  * (r = a ^ n mod order)
28782  *
28783  * r  Result of the squaring.
28784  * a  Number to square.
28785  */
28786 static void sp_256_mont_sqr_n_order_avx2_4(sp_digit* r, sp_digit* a, int n)
28787 {
28788     int i;
28789 
28790     sp_256_mont_sqr_order_avx2_4(r, a);
28791     for (i=1; i<n; i++)
28792         sp_256_mont_sqr_order_avx2_4(r, r);
28793 }
28794 #endif /* !WOLFSSL_SP_SMALL */
28795 
28796 /* Invert the number, in Montgomery form, modulo the order of the P256 curve.
28797  * (r = 1 / a mod order)
28798  *
28799  * r   Inverse result.
28800  * a   Number to invert.
28801  * td  Temporary data.
28802  */
28803 static void sp_256_mont_inv_order_avx2_4(sp_digit* r, sp_digit* a,
28804         sp_digit* td)
28805 {
28806 #ifdef WOLFSSL_SP_SMALL
28807     sp_digit* t = td;
28808     int i;
28809 
28810     XMEMCPY(t, a, sizeof(sp_digit) * 4);
28811     for (i=254; i>=0; i--) {
28812         sp_256_mont_sqr_order_avx2_4(t, t);
28813         if (p256_order_2[i / 64] & ((sp_digit)1 << (i % 64)))
28814             sp_256_mont_mul_order_avx2_4(t, t, a);
28815     }
28816     XMEMCPY(r, t, sizeof(sp_digit) * 4);
28817 #else
28818     sp_digit* t = td;
28819     sp_digit* t2 = td + 2 * 4;
28820     sp_digit* t3 = td + 4 * 4;
28821     int i;
28822 
28823     /* t = a^2 */
28824     sp_256_mont_sqr_order_avx2_4(t, a);
28825     /* t = a^3 = t * a */
28826     sp_256_mont_mul_order_avx2_4(t, t, a);
28827     /* t2= a^c = t ^ 2 ^ 2 */
28828     sp_256_mont_sqr_n_order_avx2_4(t2, t, 2);
28829     /* t3= a^f = t2 * t */
28830     sp_256_mont_mul_order_avx2_4(t3, t2, t);
28831     /* t2= a^f0 = t3 ^ 2 ^ 4 */
28832     sp_256_mont_sqr_n_order_avx2_4(t2, t3, 4);
28833     /* t = a^ff = t2 * t3 */
28834     sp_256_mont_mul_order_avx2_4(t, t2, t3);
28835     /* t3= a^ff00 = t ^ 2 ^ 8 */
28836     sp_256_mont_sqr_n_order_avx2_4(t2, t, 8);
28837     /* t = a^ffff = t2 * t */
28838     sp_256_mont_mul_order_avx2_4(t, t2, t);
28839     /* t2= a^ffff0000 = t ^ 2 ^ 16 */
28840     sp_256_mont_sqr_n_order_avx2_4(t2, t, 16);
28841     /* t = a^ffffffff = t2 * t */
28842     sp_256_mont_mul_order_avx2_4(t, t2, t);
28843     /* t2= a^ffffffff0000000000000000 = t ^ 2 ^ 64  */
28844     sp_256_mont_sqr_n_order_avx2_4(t2, t, 64);
28845     /* t2= a^ffffffff00000000ffffffff = t2 * t */
28846     sp_256_mont_mul_order_avx2_4(t2, t2, t);
28847     /* t2= a^ffffffff00000000ffffffff00000000 = t2 ^ 2 ^ 32  */
28848     sp_256_mont_sqr_n_order_avx2_4(t2, t2, 32);
28849     /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */
28850     sp_256_mont_mul_order_avx2_4(t2, t2, t);
28851     /* t2= a^ffffffff00000000ffffffffffffffffbce6 */
28852     for (i=127; i>=112; i--) {
28853         sp_256_mont_sqr_order_avx2_4(t2, t2);
28854         if (p256_order_low[i / 64] & ((sp_digit)1 << (i % 64)))
28855             sp_256_mont_mul_order_avx2_4(t2, t2, a);
28856     }
28857     /* t2= a^ffffffff00000000ffffffffffffffffbce6f */
28858     sp_256_mont_sqr_n_order_avx2_4(t2, t2, 4);
28859     sp_256_mont_mul_order_avx2_4(t2, t2, t3);
28860     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84 */
28861     for (i=107; i>=64; i--) {
28862         sp_256_mont_sqr_order_avx2_4(t2, t2);
28863         if (p256_order_low[i / 64] & ((sp_digit)1 << (i % 64)))
28864             sp_256_mont_mul_order_avx2_4(t2, t2, a);
28865     }
28866     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f */
28867     sp_256_mont_sqr_n_order_avx2_4(t2, t2, 4);
28868     sp_256_mont_mul_order_avx2_4(t2, t2, t3);
28869     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2 */
28870     for (i=59; i>=32; i--) {
28871         sp_256_mont_sqr_order_avx2_4(t2, t2);
28872         if (p256_order_low[i / 64] & ((sp_digit)1 << (i % 64)))
28873             sp_256_mont_mul_order_avx2_4(t2, t2, a);
28874     }
28875     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2f */
28876     sp_256_mont_sqr_n_order_avx2_4(t2, t2, 4);
28877     sp_256_mont_mul_order_avx2_4(t2, t2, t3);
28878     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254 */
28879     for (i=27; i>=0; i--) {
28880         sp_256_mont_sqr_order_avx2_4(t2, t2);
28881         if (p256_order_low[i / 64] & ((sp_digit)1 << (i % 64)))
28882             sp_256_mont_mul_order_avx2_4(t2, t2, a);
28883     }
28884     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 */
28885     sp_256_mont_sqr_n_order_avx2_4(t2, t2, 4);
28886     /* r = a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f */
28887     sp_256_mont_mul_order_avx2_4(r, t2, t3);
28888 #endif /* WOLFSSL_SP_SMALL */
28889 }
28890 
28891 #endif /* HAVE_INTEL_AVX2 */
28892 #endif /* HAVE_ECC_SIGN || HAVE_ECC_VERIFY */
28893 #ifdef HAVE_ECC_SIGN
28894 #ifndef SP_ECC_MAX_SIG_GEN
28895 #define SP_ECC_MAX_SIG_GEN  64
28896 #endif
28897 
28898 /* Sign the hash using the private key.
28899  *   e = [hash, 256 bits] from binary
28900  *   r = (k.G)->x mod order
28901  *   s = (r * x + e) / k mod order
28902  * The hash is truncated to the first 256 bits.
28903  *
28904  * hash     Hash to sign.
28905  * hashLen  Length of the hash data.
28906  * rng      Random number generator.
28907  * priv     Private part of key - scalar.
28908  * rm       First part of result as an mp_int.
28909  * sm       Sirst part of result as an mp_int.
28910  * heap     Heap to use for allocation.
28911  * returns RNG failures, MEMORY_E when memory allocation fails and
28912  * MP_OKAY on success.
28913  */
28914 int sp_ecc_sign_256(const byte* hash, word32 hashLen, WC_RNG* rng, mp_int* priv,
28915                     mp_int* rm, mp_int* sm, void* heap)
28916 {
28917 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
28918     sp_digit* d;
28919 #else
28920     sp_digit ed[2*4];
28921     sp_digit xd[2*4];
28922     sp_digit kd[2*4];
28923     sp_digit rd[2*4];
28924     sp_digit td[3 * 2*4];
28925     sp_point p;
28926 #endif
28927     sp_digit* e = NULL;
28928     sp_digit* x = NULL;
28929     sp_digit* k = NULL;
28930     sp_digit* r = NULL;
28931     sp_digit* tmp = NULL;
28932     sp_point* point = NULL;
28933     sp_digit carry;
28934     sp_digit* s;
28935     sp_digit* kInv;
28936     int err = MP_OKAY;
28937     int64_t c;
28938     int i;
28939 #ifdef HAVE_INTEL_AVX2
28940     word32 cpuid_flags = cpuid_get_flags();
28941 #endif
28942 
28943     (void)heap;
28944 
28945     err = sp_ecc_point_new(heap, p, point);
28946 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
28947     if (err == MP_OKAY) {
28948         d = XMALLOC(sizeof(sp_digit) * 7 * 2 * 4, heap, DYNAMIC_TYPE_ECC);
28949         if (d != NULL) {
28950             e = d + 0 * 4;
28951             x = d + 2 * 4;
28952             k = d + 4 * 4;
28953             r = d + 6 * 4;
28954             tmp = d + 8 * 4;
28955         }
28956         else
28957             err = MEMORY_E;
28958     }
28959 #else
28960     e = ed;
28961     x = xd;
28962     k = kd;
28963     r = rd;
28964     tmp = td;
28965 #endif
28966     s = e;
28967     kInv = k;
28968 
28969     if (err == MP_OKAY) {
28970         if (hashLen > 32)
28971             hashLen = 32;
28972 
28973         sp_256_from_bin(e, 4, hash, hashLen);
28974         sp_256_from_mp(x, 4, priv);
28975     }
28976 
28977     for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
28978         /* New random point. */
28979         err = sp_256_ecc_gen_k_4(rng, k);
28980         if (err == MP_OKAY) {
28981 #ifdef HAVE_INTEL_AVX2
28982             if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags))
28983                 err = sp_256_ecc_mulmod_base_avx2_4(point, k, 1, heap);
28984             else
28985 #endif
28986                 err = sp_256_ecc_mulmod_base_4(point, k, 1, NULL);
28987         }
28988 
28989         if (err == MP_OKAY) {
28990             /* r = point->x mod order */
28991             XMEMCPY(r, point->x, sizeof(sp_digit) * 4);
28992             sp_256_norm_4(r);
28993             c = sp_256_cmp_4(r, p256_order);
28994             sp_256_cond_sub_4(r, r, p256_order, 0 - (c >= 0));
28995             sp_256_norm_4(r);
28996 
28997             /* Conv k to Montgomery form (mod order) */
28998 #ifdef HAVE_INTEL_AVX2
28999             if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags))
29000                 sp_256_mul_avx2_4(k, k, p256_norm_order);
29001             else
29002 #endif
29003                 sp_256_mul_4(k, k, p256_norm_order);
29004             err = sp_256_mod_4(k, k, p256_order);
29005         }
29006         if (err == MP_OKAY) {
29007             sp_256_norm_4(k);
29008             /* kInv = 1/k mod order */
29009 #ifdef HAVE_INTEL_AVX2
29010             if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags))
29011                 sp_256_mont_inv_order_avx2_4(kInv, k, tmp);
29012             else
29013 #endif
29014                 sp_256_mont_inv_order_4(kInv, k, tmp);
29015             sp_256_norm_4(kInv);
29016 
29017             /* s = r * x + e */
29018 #ifdef HAVE_INTEL_AVX2
29019             if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags))
29020                 sp_256_mul_avx2_4(x, x, r);
29021             else
29022 #endif
29023                 sp_256_mul_4(x, x, r);
29024             err = sp_256_mod_4(x, x, p256_order);
29025         }
29026         if (err == MP_OKAY) {
29027             sp_256_norm_4(x);
29028             carry = sp_256_add_4(s, e, x);
29029             sp_256_cond_sub_4(s, s, p256_order, 0 - carry);
29030             sp_256_norm_4(s);
29031             c = sp_256_cmp_4(s, p256_order);
29032             sp_256_cond_sub_4(s, s, p256_order, 0 - (c >= 0));
29033             sp_256_norm_4(s);
29034 
29035             /* s = s * k^-1 mod order */
29036 #ifdef HAVE_INTEL_AVX2
29037             if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags))
29038                 sp_256_mont_mul_order_avx2_4(s, s, kInv);
29039             else
29040 #endif
29041                 sp_256_mont_mul_order_4(s, s, kInv);
29042             sp_256_norm_4(s);
29043 
29044             /* Check that signature is usable. */
29045             if (!sp_256_iszero_4(s))
29046                 break;
29047         }
29048     }
29049 
29050     if (i == 0)
29051         err = RNG_FAILURE_E;
29052 
29053     if (err == MP_OKAY)
29054         err = sp_256_to_mp(r, rm);
29055     if (err == MP_OKAY)
29056         err = sp_256_to_mp(s, sm);
29057 
29058 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29059     if (d != NULL) {
29060         XMEMSET(d, 0, sizeof(sp_digit) * 8 * 4);
29061         XFREE(d, heap, DYNAMIC_TYPE_ECC);
29062     }
29063 #else
29064     XMEMSET(e, 0, sizeof(sp_digit) * 2 * 4);
29065     XMEMSET(x, 0, sizeof(sp_digit) * 2 * 4);
29066     XMEMSET(k, 0, sizeof(sp_digit) * 2 * 4);
29067     XMEMSET(r, 0, sizeof(sp_digit) * 2 * 4);
29068     XMEMSET(r, 0, sizeof(sp_digit) * 2 * 4);
29069     XMEMSET(tmp, 0, sizeof(sp_digit) * 3 * 2*4);
29070 #endif
29071     sp_ecc_point_free(point, 1, heap);
29072 
29073     return err;
29074 }
29075 #endif /* HAVE_ECC_SIGN */
29076 
29077 #ifdef HAVE_ECC_VERIFY
29078 /* Verify the signature values with the hash and public key.
29079  *   e = Truncate(hash, 256)
29080  *   u1 = e/s mod order
29081  *   u2 = r/s mod order
29082  *   r == (u1.G + u2.Q)->x mod order
29083  * Optimization: Leave point in projective form.
29084  *   (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
29085  *   (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
29086  * The hash is truncated to the first 256 bits.
29087  *
29088  * hash     Hash to sign.
29089  * hashLen  Length of the hash data.
29090  * rng      Random number generator.
29091  * priv     Private part of key - scalar.
29092  * rm       First part of result as an mp_int.
29093  * sm       Sirst part of result as an mp_int.
29094  * heap     Heap to use for allocation.
29095  * returns RNG failures, MEMORY_E when memory allocation fails and
29096  * MP_OKAY on success.
29097  */
29098 int sp_ecc_verify_256(const byte* hash, word32 hashLen, mp_int* pX,
29099     mp_int* pY, mp_int* pZ, mp_int* r, mp_int* sm, int* res, void* heap)
29100 {
29101 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29102     sp_digit* d = NULL;
29103 #else
29104     sp_digit u1d[2*4];
29105     sp_digit u2d[2*4];
29106     sp_digit sd[2*4];
29107     sp_digit tmpd[2*4 * 5];
29108     sp_point p1d;
29109     sp_point p2d;
29110 #endif
29111     sp_digit* u1;
29112     sp_digit* u2;
29113     sp_digit* s;
29114     sp_digit* tmp;
29115     sp_point* p1;
29116     sp_point* p2 = NULL;
29117     sp_digit carry;
29118     int64_t c;
29119     int err;
29120 #ifdef HAVE_INTEL_AVX2
29121     word32 cpuid_flags = cpuid_get_flags();
29122 #endif
29123 
29124     err = sp_ecc_point_new(heap, p1d, p1);
29125     if (err == MP_OKAY)
29126         err = sp_ecc_point_new(heap, p2d, p2);
29127 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29128     if (err == MP_OKAY) {
29129         d = XMALLOC(sizeof(sp_digit) * 16 * 4, heap, DYNAMIC_TYPE_ECC);
29130         if (d != NULL) {
29131             u1  = d + 0 * 4;
29132             u2  = d + 2 * 4;
29133             s   = d + 4 * 4;
29134             tmp = d + 6 * 4;
29135         }
29136         else
29137             err = MEMORY_E;
29138     }
29139 #else
29140     u1 = u1d;
29141     u2 = u2d;
29142     s  = sd;
29143     tmp = tmpd;
29144 #endif
29145 
29146     if (err == MP_OKAY) {
29147         if (hashLen > 32)
29148             hashLen = 32;
29149 
29150         sp_256_from_bin(u1, 4, hash, hashLen);
29151         sp_256_from_mp(u2, 4, r);
29152         sp_256_from_mp(s, 4, sm);
29153         sp_256_from_mp(p2->x, 4, pX);
29154         sp_256_from_mp(p2->y, 4, pY);
29155         sp_256_from_mp(p2->z, 4, pZ);
29156 
29157 #ifdef HAVE_INTEL_AVX2
29158         if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags))
29159             sp_256_mul_avx2_4(s, s, p256_norm_order);
29160         else
29161 #endif
29162             sp_256_mul_4(s, s, p256_norm_order);
29163         err = sp_256_mod_4(s, s, p256_order);
29164     }
29165     if (err == MP_OKAY) {
29166         sp_256_norm_4(s);
29167 #ifdef HAVE_INTEL_AVX2
29168         if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) {
29169             sp_256_mont_inv_order_avx2_4(s, s, tmp);
29170             sp_256_mont_mul_order_avx2_4(u1, u1, s);
29171             sp_256_mont_mul_order_avx2_4(u2, u2, s);
29172         }
29173         else
29174 #endif
29175         {
29176             sp_256_mont_inv_order_4(s, s, tmp);
29177             sp_256_mont_mul_order_4(u1, u1, s);
29178             sp_256_mont_mul_order_4(u2, u2, s);
29179         }
29180 
29181 #ifdef HAVE_INTEL_AVX2
29182         if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags))
29183             err = sp_256_ecc_mulmod_base_avx2_4(p1, u1, 0, heap);
29184         else
29185 #endif
29186             err = sp_256_ecc_mulmod_base_4(p1, u1, 0, heap);
29187     }
29188     if (err == MP_OKAY) {
29189 #ifdef HAVE_INTEL_AVX2
29190         if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags))
29191             err = sp_256_ecc_mulmod_avx2_4(p2, p2, u2, 0, heap);
29192         else
29193 #endif
29194             err = sp_256_ecc_mulmod_4(p2, p2, u2, 0, heap);
29195     }
29196 
29197     if (err == MP_OKAY) {
29198 #ifdef HAVE_INTEL_AVX2
29199         if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags))
29200             sp_256_proj_point_add_avx2_4(p1, p1, p2, tmp);
29201         else
29202 #endif
29203             sp_256_proj_point_add_4(p1, p1, p2, tmp);
29204 
29205         /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
29206         /* Reload r and convert to Montgomery form. */
29207         sp_256_from_mp(u2, 4, r);
29208         err = sp_256_mod_mul_norm_4(u2, u2, p256_mod);
29209     }
29210 
29211     if (err == MP_OKAY) {
29212         /* u1 = r.z'.z' mod prime */
29213         sp_256_mont_sqr_4(p1->z, p1->z, p256_mod, p256_mp_mod);
29214         sp_256_mont_mul_4(u1, u2, p1->z, p256_mod, p256_mp_mod);
29215         *res = sp_256_cmp_4(p1->x, u1) == 0;
29216         if (*res == 0) {
29217             /* Reload r and add order. */
29218             sp_256_from_mp(u2, 4, r);
29219             carry = sp_256_add_4(u2, u2, p256_order);
29220             /* Carry means result is greater than mod and is not valid. */
29221             if (!carry) {
29222                 sp_256_norm_4(u2);
29223 
29224                 /* Compare with mod and if greater or equal then not valid. */
29225                 c = sp_256_cmp_4(u2, p256_mod);
29226                 if (c < 0) {
29227                     /* Convert to Montogomery form */
29228                     err = sp_256_mod_mul_norm_4(u2, u2, p256_mod);
29229                     if (err == MP_OKAY) {
29230                         /* u1 = (r + 1*order).z'.z' mod prime */
29231                         sp_256_mont_mul_4(u1, u2, p1->z, p256_mod,
29232                                                                   p256_mp_mod);
29233                         *res = sp_256_cmp_4(p1->x, u2) == 0;
29234                     }
29235                 }
29236             }
29237         }
29238     }
29239 
29240 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29241     if (d != NULL)
29242         XFREE(d, heap, DYNAMIC_TYPE_ECC);
29243 #endif
29244     sp_ecc_point_free(p1, 0, heap);
29245     sp_ecc_point_free(p2, 0, heap);
29246 
29247     return err;
29248 }
29249 #endif /* HAVE_ECC_VERIFY */
29250 
29251 #ifdef HAVE_ECC_CHECK_KEY
29252 /* Check that the x and y oridinates are a valid point on the curve.
29253  *
29254  * point  EC point.
29255  * heap   Heap to use if dynamically allocating.
29256  * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
29257  * not on the curve and MP_OKAY otherwise.
29258  */
29259 static int sp_256_ecc_is_point_4(sp_point* point, void* heap)
29260 {
29261 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29262     sp_digit* d = NULL;
29263 #else
29264     sp_digit t1d[2*4];
29265     sp_digit t2d[2*4];
29266 #endif
29267     sp_digit* t1;
29268     sp_digit* t2;
29269     int err = MP_OKAY;
29270 
29271 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29272     d = XMALLOC(sizeof(sp_digit) * 4 * 4, heap, DYNAMIC_TYPE_ECC);
29273     if (d != NULL) {
29274         t1 = d + 0 * 4;
29275         t2 = d + 2 * 4;
29276     }
29277     else
29278         err = MEMORY_E;
29279 #else
29280     (void)heap;
29281 
29282     t1 = t1d;
29283     t2 = t2d;
29284 #endif
29285 
29286     if (err == MP_OKAY) {
29287         sp_256_sqr_4(t1, point->y);
29288         sp_256_mod_4(t1, t1, p256_mod);
29289         sp_256_sqr_4(t2, point->x);
29290         sp_256_mod_4(t2, t2, p256_mod);
29291         sp_256_mul_4(t2, t2, point->x);
29292         sp_256_mod_4(t2, t2, p256_mod);
29293     sp_256_sub_4(t2, p256_mod, t2);
29294         sp_256_mont_add_4(t1, t1, t2, p256_mod);
29295 
29296         sp_256_mont_add_4(t1, t1, point->x, p256_mod);
29297         sp_256_mont_add_4(t1, t1, point->x, p256_mod);
29298         sp_256_mont_add_4(t1, t1, point->x, p256_mod);
29299 
29300         if (sp_256_cmp_4(t1, p256_b) != 0)
29301             err = MP_VAL;
29302     }
29303 
29304 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29305     if (d != NULL)
29306         XFREE(d, heap, DYNAMIC_TYPE_ECC);
29307 #endif
29308 
29309     return err;
29310 }
29311 
29312 /* Check that the x and y oridinates are a valid point on the curve.
29313  *
29314  * pX  X ordinate of EC point.
29315  * pY  Y ordinate of EC point.
29316  * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
29317  * not on the curve and MP_OKAY otherwise.
29318  */
29319 int sp_ecc_is_point_256(mp_int* pX, mp_int* pY)
29320 {
29321 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
29322     sp_point pubd;
29323 #endif
29324     sp_point* pub;
29325     byte one[1] = { 1 };
29326     int err;
29327 
29328     err = sp_ecc_point_new(NULL, pubd, pub);
29329     if (err == MP_OKAY) {
29330         sp_256_from_mp(pub->x, 4, pX);
29331         sp_256_from_mp(pub->y, 4, pY);
29332         sp_256_from_bin(pub->z, 4, one, sizeof(one));
29333 
29334         err = sp_256_ecc_is_point_4(pub, NULL);
29335     }
29336 
29337     sp_ecc_point_free(pub, 0, NULL);
29338 
29339     return err;
29340 }
29341 
29342 /* Check that the private scalar generates the EC point (px, py), the point is
29343  * on the curve and the point has the correct order.
29344  *
29345  * pX     X ordinate of EC point.
29346  * pY     Y ordinate of EC point.
29347  * privm  Private scalar that generates EC point.
29348  * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
29349  * not on the curve, ECC_INF_E if the point does not have the correct order,
29350  * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
29351  * MP_OKAY otherwise.
29352  */
29353 int sp_ecc_check_key_256(mp_int* pX, mp_int* pY, mp_int* privm, void* heap)
29354 {
29355 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
29356     sp_digit privd[4];
29357     sp_point pubd;
29358     sp_point pd;
29359 #endif
29360     sp_digit* priv = NULL;
29361     sp_point* pub;
29362     sp_point* p = NULL;
29363     byte one[1] = { 1 };
29364     int err;
29365 #ifdef HAVE_INTEL_AVX2
29366     word32 cpuid_flags = cpuid_get_flags();
29367 #endif
29368 
29369     err = sp_ecc_point_new(heap, pubd, pub);
29370     if (err == MP_OKAY)
29371         err = sp_ecc_point_new(heap, pd, p);
29372 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29373     if (err == MP_OKAY) {
29374         priv = XMALLOC(sizeof(sp_digit) * 4, heap, DYNAMIC_TYPE_ECC);
29375         if (priv == NULL)
29376             err = MEMORY_E;
29377     }
29378 #else
29379     priv = privd;
29380 #endif
29381 
29382     if (err == MP_OKAY) {
29383         sp_256_from_mp(pub->x, 4, pX);
29384         sp_256_from_mp(pub->y, 4, pY);
29385         sp_256_from_bin(pub->z, 4, one, sizeof(one));
29386         sp_256_from_mp(priv, 4, privm);
29387 
29388         /* Check point at infinitiy. */
29389         if (sp_256_iszero_4(pub->x) &&
29390             sp_256_iszero_4(pub->y))
29391             err = ECC_INF_E;
29392     }
29393 
29394     if (err == MP_OKAY) {
29395         /* Check range of X and Y */
29396         if (sp_256_cmp_4(pub->x, p256_mod) >= 0 ||
29397             sp_256_cmp_4(pub->y, p256_mod) >= 0)
29398             err = ECC_OUT_OF_RANGE_E;
29399     }
29400 
29401     if (err == MP_OKAY) {
29402         /* Check point is on curve */
29403         err = sp_256_ecc_is_point_4(pub, heap);
29404     }
29405 
29406     if (err == MP_OKAY) {
29407         /* Point * order = infinity */
29408 #ifdef HAVE_INTEL_AVX2
29409         if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags))
29410             err = sp_256_ecc_mulmod_avx2_4(p, pub, p256_order, 1, heap);
29411         else
29412 #endif
29413             err = sp_256_ecc_mulmod_4(p, pub, p256_order, 1, heap);
29414     }
29415     if (err == MP_OKAY) {
29416         /* Check result is infinity */
29417         if (!sp_256_iszero_4(p->x) ||
29418             !sp_256_iszero_4(p->y)) {
29419             err = ECC_INF_E;
29420         }
29421     }
29422 
29423     if (err == MP_OKAY) {
29424         /* Base * private = point */
29425 #ifdef HAVE_INTEL_AVX2
29426         if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags))
29427             err = sp_256_ecc_mulmod_base_avx2_4(p, priv, 1, heap);
29428         else
29429 #endif
29430             err = sp_256_ecc_mulmod_base_4(p, priv, 1, heap);
29431     }
29432     if (err == MP_OKAY) {
29433         /* Check result is public key */
29434         if (sp_256_cmp_4(p->x, pub->x) != 0 ||
29435             sp_256_cmp_4(p->y, pub->y) != 0) {
29436             err = ECC_PRIV_KEY_E;
29437         }
29438     }
29439 
29440 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29441     if (priv != NULL)
29442         XFREE(priv, heap, DYNAMIC_TYPE_ECC);
29443 #endif
29444     sp_ecc_point_free(p, 0, heap);
29445     sp_ecc_point_free(pub, 0, heap);
29446 
29447     return err;
29448 }
29449 #endif
29450 #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
29451 /* Add two projective EC points together.
29452  * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
29453  *
29454  * pX   First EC point's X ordinate.
29455  * pY   First EC point's Y ordinate.
29456  * pZ   First EC point's Z ordinate.
29457  * qX   Second EC point's X ordinate.
29458  * qY   Second EC point's Y ordinate.
29459  * qZ   Second EC point's Z ordinate.
29460  * rX   Resultant EC point's X ordinate.
29461  * rY   Resultant EC point's Y ordinate.
29462  * rZ   Resultant EC point's Z ordinate.
29463  * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
29464  */
29465 int sp_ecc_proj_add_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
29466                               mp_int* qX, mp_int* qY, mp_int* qZ,
29467                               mp_int* rX, mp_int* rY, mp_int* rZ)
29468 {
29469 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
29470     sp_digit tmpd[2 * 4 * 5];
29471     sp_point pd;
29472     sp_point qd;
29473 #endif
29474     sp_digit* tmp;
29475     sp_point* p;
29476     sp_point* q = NULL;
29477     int err;
29478 #ifdef HAVE_INTEL_AVX2
29479     word32 cpuid_flags = cpuid_get_flags();
29480 #endif
29481 
29482     err = sp_ecc_point_new(NULL, pd, p);
29483     if (err == MP_OKAY)
29484         err = sp_ecc_point_new(NULL, qd, q);
29485 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29486     if (err == MP_OKAY) {
29487         tmp = XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, NULL, DYNAMIC_TYPE_ECC);
29488         if (tmp == NULL)
29489             err = MEMORY_E;
29490     }
29491 #else
29492     tmp = tmpd;
29493 #endif
29494 
29495     if (err == MP_OKAY) {
29496         sp_256_from_mp(p->x, 4, pX);
29497         sp_256_from_mp(p->y, 4, pY);
29498         sp_256_from_mp(p->z, 4, pZ);
29499         sp_256_from_mp(q->x, 4, qX);
29500         sp_256_from_mp(q->y, 4, qY);
29501         sp_256_from_mp(q->z, 4, qZ);
29502 
29503 #ifdef HAVE_INTEL_AVX2
29504         if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags))
29505             sp_256_proj_point_add_avx2_4(p, p, q, tmp);
29506         else
29507 #endif
29508             sp_256_proj_point_add_4(p, p, q, tmp);
29509     }
29510 
29511     if (err == MP_OKAY)
29512         err = sp_256_to_mp(p->x, rX);
29513     if (err == MP_OKAY)
29514         err = sp_256_to_mp(p->y, rY);
29515     if (err == MP_OKAY)
29516         err = sp_256_to_mp(p->z, rZ);
29517 
29518 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29519     if (tmp != NULL)
29520         XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
29521 #endif
29522     sp_ecc_point_free(q, 0, NULL);
29523     sp_ecc_point_free(p, 0, NULL);
29524 
29525     return err;
29526 }
29527 
29528 /* Double a projective EC point.
29529  * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
29530  *
29531  * pX   EC point's X ordinate.
29532  * pY   EC point's Y ordinate.
29533  * pZ   EC point's Z ordinate.
29534  * rX   Resultant EC point's X ordinate.
29535  * rY   Resultant EC point's Y ordinate.
29536  * rZ   Resultant EC point's Z ordinate.
29537  * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
29538  */
29539 int sp_ecc_proj_dbl_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
29540                               mp_int* rX, mp_int* rY, mp_int* rZ)
29541 {
29542 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
29543     sp_digit tmpd[2 * 4 * 2];
29544     sp_point pd;
29545 #endif
29546     sp_digit* tmp;
29547     sp_point* p;
29548     int err;
29549 #ifdef HAVE_INTEL_AVX2
29550     word32 cpuid_flags = cpuid_get_flags();
29551 #endif
29552 
29553     err = sp_ecc_point_new(NULL, pd, p);
29554 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29555     if (err == MP_OKAY) {
29556         tmp = XMALLOC(sizeof(sp_digit) * 2 * 4 * 2, NULL, DYNAMIC_TYPE_ECC);
29557         if (tmp == NULL)
29558             err = MEMORY_E;
29559     }
29560 #else
29561     tmp = tmpd;
29562 #endif
29563 
29564     if (err == MP_OKAY) {
29565         sp_256_from_mp(p->x, 4, pX);
29566         sp_256_from_mp(p->y, 4, pY);
29567         sp_256_from_mp(p->z, 4, pZ);
29568 
29569 #ifdef HAVE_INTEL_AVX2
29570         if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags))
29571             sp_256_proj_point_dbl_avx2_4(p, p, tmp);
29572         else
29573 #endif
29574             sp_256_proj_point_dbl_4(p, p, tmp);
29575     }
29576 
29577     if (err == MP_OKAY)
29578         err = sp_256_to_mp(p->x, rX);
29579     if (err == MP_OKAY)
29580         err = sp_256_to_mp(p->y, rY);
29581     if (err == MP_OKAY)
29582         err = sp_256_to_mp(p->z, rZ);
29583 
29584 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29585     if (tmp != NULL)
29586         XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
29587 #endif
29588     sp_ecc_point_free(p, 0, NULL);
29589 
29590     return err;
29591 }
29592 
29593 /* Map a projective EC point to affine in place.
29594  * pZ will be one.
29595  *
29596  * pX   EC point's X ordinate.
29597  * pY   EC point's Y ordinate.
29598  * pZ   EC point's Z ordinate.
29599  * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
29600  */
29601 int sp_ecc_map_256(mp_int* pX, mp_int* pY, mp_int* pZ)
29602 {
29603 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
29604     sp_digit tmpd[2 * 4 * 4];
29605     sp_point pd;
29606 #endif
29607     sp_digit* tmp;
29608     sp_point* p;
29609     int err;
29610 
29611     err = sp_ecc_point_new(NULL, pd, p);
29612 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29613     if (err == MP_OKAY) {
29614         tmp = XMALLOC(sizeof(sp_digit) * 2 * 4 * 4, NULL, DYNAMIC_TYPE_ECC);
29615         if (tmp == NULL)
29616             err = MEMORY_E;
29617     }
29618 #else
29619     tmp = tmpd;
29620 #endif
29621     if (err == MP_OKAY) {
29622         sp_256_from_mp(p->x, 4, pX);
29623         sp_256_from_mp(p->y, 4, pY);
29624         sp_256_from_mp(p->z, 4, pZ);
29625 
29626         sp_256_map_4(p, p, tmp);
29627     }
29628 
29629     if (err == MP_OKAY)
29630         err = sp_256_to_mp(p->x, pX);
29631     if (err == MP_OKAY)
29632         err = sp_256_to_mp(p->y, pY);
29633     if (err == MP_OKAY)
29634         err = sp_256_to_mp(p->z, pZ);
29635 
29636 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29637     if (tmp != NULL)
29638         XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
29639 #endif
29640     sp_ecc_point_free(p, 0, NULL);
29641 
29642     return err;
29643 }
29644 #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
29645 #ifdef HAVE_COMP_KEY
29646 /* Find the square root of a number mod the prime of the curve.
29647  *
29648  * y  The number to operate on and the result.
29649  * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
29650  */
29651 static int sp_256_mont_sqrt_4(sp_digit* y)
29652 {
29653 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29654     sp_digit* d;
29655 #else
29656     sp_digit t1d[2 * 4];
29657     sp_digit t2d[2 * 4];
29658 #endif
29659     sp_digit* t1;
29660     sp_digit* t2;
29661     int err = MP_OKAY;
29662 #ifdef HAVE_INTEL_AVX2
29663     word32 cpuid_flags = cpuid_get_flags();
29664 #endif
29665 
29666 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29667     d = XMALLOC(sizeof(sp_digit) * 4 * 4, NULL, DYNAMIC_TYPE_ECC);
29668     if (d != NULL) {
29669         t1 = d + 0 * 4;
29670         t2 = d + 2 * 4;
29671     }
29672     else
29673         err = MEMORY_E;
29674 #else
29675     t1 = t1d;
29676     t2 = t2d;
29677 #endif
29678 
29679     if (err == MP_OKAY) {
29680 #ifdef HAVE_INTEL_AVX2
29681         if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) {
29682             /* t2 = y ^ 0x2 */
29683             sp_256_mont_sqr_avx2_4(t2, y, p256_mod, p256_mp_mod);
29684             /* t1 = y ^ 0x3 */
29685             sp_256_mont_mul_avx2_4(t1, t2, y, p256_mod, p256_mp_mod);
29686             /* t2 = y ^ 0xc */
29687             sp_256_mont_sqr_n_avx2_4(t2, t1, 2, p256_mod, p256_mp_mod);
29688             /* t1 = y ^ 0xf */
29689             sp_256_mont_mul_avx2_4(t1, t1, t2, p256_mod, p256_mp_mod);
29690             /* t2 = y ^ 0xf0 */
29691             sp_256_mont_sqr_n_avx2_4(t2, t1, 4, p256_mod, p256_mp_mod);
29692             /* t1 = y ^ 0xff */
29693             sp_256_mont_mul_avx2_4(t1, t1, t2, p256_mod, p256_mp_mod);
29694             /* t2 = y ^ 0xff00 */
29695             sp_256_mont_sqr_n_avx2_4(t2, t1, 8, p256_mod, p256_mp_mod);
29696             /* t1 = y ^ 0xffff */
29697             sp_256_mont_mul_avx2_4(t1, t1, t2, p256_mod, p256_mp_mod);
29698             /* t2 = y ^ 0xffff0000 */
29699             sp_256_mont_sqr_n_avx2_4(t2, t1, 16, p256_mod, p256_mp_mod);
29700             /* t1 = y ^ 0xffffffff */
29701             sp_256_mont_mul_avx2_4(t1, t1, t2, p256_mod, p256_mp_mod);
29702             /* t1 = y ^ 0xffffffff00000000 */
29703             sp_256_mont_sqr_n_avx2_4(t1, t1, 32, p256_mod, p256_mp_mod);
29704             /* t1 = y ^ 0xffffffff00000001 */
29705             sp_256_mont_mul_avx2_4(t1, t1, y, p256_mod, p256_mp_mod);
29706             /* t1 = y ^ 0xffffffff00000001000000000000000000000000 */
29707             sp_256_mont_sqr_n_avx2_4(t1, t1, 96, p256_mod, p256_mp_mod);
29708             /* t1 = y ^ 0xffffffff00000001000000000000000000000001 */
29709             sp_256_mont_mul_avx2_4(t1, t1, y, p256_mod, p256_mp_mod);
29710             sp_256_mont_sqr_n_avx2_4(y, t1, 94, p256_mod, p256_mp_mod);
29711         }
29712         else
29713 #endif
29714         {
29715             /* t2 = y ^ 0x2 */
29716             sp_256_mont_sqr_4(t2, y, p256_mod, p256_mp_mod);
29717             /* t1 = y ^ 0x3 */
29718             sp_256_mont_mul_4(t1, t2, y, p256_mod, p256_mp_mod);
29719             /* t2 = y ^ 0xc */
29720             sp_256_mont_sqr_n_4(t2, t1, 2, p256_mod, p256_mp_mod);
29721             /* t1 = y ^ 0xf */
29722             sp_256_mont_mul_4(t1, t1, t2, p256_mod, p256_mp_mod);
29723             /* t2 = y ^ 0xf0 */
29724             sp_256_mont_sqr_n_4(t2, t1, 4, p256_mod, p256_mp_mod);
29725             /* t1 = y ^ 0xff */
29726             sp_256_mont_mul_4(t1, t1, t2, p256_mod, p256_mp_mod);
29727             /* t2 = y ^ 0xff00 */
29728             sp_256_mont_sqr_n_4(t2, t1, 8, p256_mod, p256_mp_mod);
29729             /* t1 = y ^ 0xffff */
29730             sp_256_mont_mul_4(t1, t1, t2, p256_mod, p256_mp_mod);
29731             /* t2 = y ^ 0xffff0000 */
29732             sp_256_mont_sqr_n_4(t2, t1, 16, p256_mod, p256_mp_mod);
29733             /* t1 = y ^ 0xffffffff */
29734             sp_256_mont_mul_4(t1, t1, t2, p256_mod, p256_mp_mod);
29735             /* t1 = y ^ 0xffffffff00000000 */
29736             sp_256_mont_sqr_n_4(t1, t1, 32, p256_mod, p256_mp_mod);
29737             /* t1 = y ^ 0xffffffff00000001 */
29738             sp_256_mont_mul_4(t1, t1, y, p256_mod, p256_mp_mod);
29739             /* t1 = y ^ 0xffffffff00000001000000000000000000000000 */
29740             sp_256_mont_sqr_n_4(t1, t1, 96, p256_mod, p256_mp_mod);
29741             /* t1 = y ^ 0xffffffff00000001000000000000000000000001 */
29742             sp_256_mont_mul_4(t1, t1, y, p256_mod, p256_mp_mod);
29743             sp_256_mont_sqr_n_4(y, t1, 94, p256_mod, p256_mp_mod);
29744         }
29745     }
29746 
29747 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29748     if (d != NULL)
29749         XFREE(d, NULL, DYNAMIC_TYPE_ECC);
29750 #endif
29751 
29752     return err;
29753 }
29754 
29755 /* Uncompress the point given the X ordinate.
29756  *
29757  * xm    X ordinate.
29758  * odd   Whether the Y ordinate is odd.
29759  * ym    Calculated Y ordinate.
29760  * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
29761  */
29762 int sp_ecc_uncompress_256(mp_int* xm, int odd, mp_int* ym)
29763 {
29764 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29765     sp_digit* d;
29766 #else
29767     sp_digit xd[2 * 4];
29768     sp_digit yd[2 * 4];
29769 #endif
29770     sp_digit* x;
29771     sp_digit* y;
29772     int err = MP_OKAY;
29773 #ifdef HAVE_INTEL_AVX2
29774     word32 cpuid_flags = cpuid_get_flags();
29775 #endif
29776 
29777 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29778     d = XMALLOC(sizeof(sp_digit) * 4 * 4, NULL, DYNAMIC_TYPE_ECC);
29779     if (d != NULL) {
29780         x = d + 0 * 4;
29781         y = d + 2 * 4;
29782     }
29783     else
29784         err = MEMORY_E;
29785 #else
29786     x = xd;
29787     y = yd;
29788 #endif
29789 
29790     if (err == MP_OKAY) {
29791         sp_256_from_mp(x, 4, xm);
29792 
29793         err = sp_256_mod_mul_norm_4(x, x, p256_mod);
29794     }
29795 
29796     if (err == MP_OKAY) {
29797         /* y = x^3 */
29798 #ifdef HAVE_INTEL_AVX2
29799         if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) {
29800             sp_256_mont_sqr_avx2_4(y, x, p256_mod, p256_mp_mod);
29801             sp_256_mont_mul_avx2_4(y, y, x, p256_mod, p256_mp_mod);
29802         }
29803         else
29804 #endif
29805         {
29806             sp_256_mont_sqr_4(y, x, p256_mod, p256_mp_mod);
29807             sp_256_mont_mul_4(y, y, x, p256_mod, p256_mp_mod);
29808         }
29809         /* y = x^3 - 3x */
29810         sp_256_mont_sub_4(y, y, x, p256_mod);
29811         sp_256_mont_sub_4(y, y, x, p256_mod);
29812         sp_256_mont_sub_4(y, y, x, p256_mod);
29813         /* y = x^3 - 3x + b */
29814         err = sp_256_mod_mul_norm_4(x, p256_b, p256_mod);
29815     }
29816     if (err == MP_OKAY) {
29817         sp_256_mont_add_4(y, y, x, p256_mod);
29818         /* y = sqrt(x^3 - 3x + b) */
29819         err = sp_256_mont_sqrt_4(y);
29820     }
29821     if (err == MP_OKAY) {
29822         XMEMSET(y + 4, 0, 4 * sizeof(sp_digit));
29823         sp_256_mont_reduce_4(y, p256_mod, p256_mp_mod);
29824         if (((y[0] ^ odd) & 1) != 0)
29825             sp_256_mont_sub_4(y, p256_mod, y, p256_mod);
29826 
29827         err = sp_256_to_mp(y, ym);
29828     }
29829 
29830 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
29831     if (d != NULL)
29832         XFREE(d, NULL, DYNAMIC_TYPE_ECC);
29833 #endif
29834 
29835     return err;
29836 }
29837 #endif
29838 #endif /* WOLFSSL_SP_NO_256 */
29839 #endif /* WOLFSSL_HAVE_SP_ECC */
29840 #endif /* WOLFSSL_SP_ARM64_ASM */
29841 #endif /* WOLFSSL_HAVE_SP_RSA || WOLFSSL_HAVE_SP_DH || WOLFSSL_HAVE_SP_ECC */
29842