1*68546e56SEric Biggers/* SPDX-License-Identifier: GPL-2.0-or-later */ 2*68546e56SEric Biggers# 3*68546e56SEric Biggers# This code is taken from CRYPTOGAMs[1] and is included here using the option 4*68546e56SEric Biggers# in the license to distribute the code under the GPL. Therefore this program 5*68546e56SEric Biggers# is free software; you can redistribute it and/or modify it under the terms of 6*68546e56SEric Biggers# the GNU General Public License version 2 as published by the Free Software 7*68546e56SEric Biggers# Foundation. 8*68546e56SEric Biggers# 9*68546e56SEric Biggers# [1] https://github.com/dot-asm/cryptogams/ 10*68546e56SEric Biggers 11*68546e56SEric Biggers# Copyright (c) 2006-2017, CRYPTOGAMS by <appro@openssl.org> 12*68546e56SEric Biggers# All rights reserved. 13*68546e56SEric Biggers# 14*68546e56SEric Biggers# Redistribution and use in source and binary forms, with or without 15*68546e56SEric Biggers# modification, are permitted provided that the following conditions 16*68546e56SEric Biggers# are met: 17*68546e56SEric Biggers# 18*68546e56SEric Biggers# * Redistributions of source code must retain copyright notices, 19*68546e56SEric Biggers# this list of conditions and the following disclaimer. 20*68546e56SEric Biggers# 21*68546e56SEric Biggers# * Redistributions in binary form must reproduce the above 22*68546e56SEric Biggers# copyright notice, this list of conditions and the following 23*68546e56SEric Biggers# disclaimer in the documentation and/or other materials 24*68546e56SEric Biggers# provided with the distribution. 25*68546e56SEric Biggers# 26*68546e56SEric Biggers# * Neither the name of the CRYPTOGAMS nor the names of its 27*68546e56SEric Biggers# copyright holder and contributors may be used to endorse or 28*68546e56SEric Biggers# promote products derived from this software without specific 29*68546e56SEric Biggers# prior written permission. 30*68546e56SEric Biggers# 31*68546e56SEric Biggers# ALTERNATIVELY, provided that this notice is retained in full, this 32*68546e56SEric Biggers# product may be distributed under the terms of the GNU General Public 33*68546e56SEric Biggers# License (GPL), in which case the provisions of the GPL apply INSTEAD OF 34*68546e56SEric Biggers# those given above. 35*68546e56SEric Biggers# 36*68546e56SEric Biggers# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS 37*68546e56SEric Biggers# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 38*68546e56SEric Biggers# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 39*68546e56SEric Biggers# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 40*68546e56SEric Biggers# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 41*68546e56SEric Biggers# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 42*68546e56SEric Biggers# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 43*68546e56SEric Biggers# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 44*68546e56SEric Biggers# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 45*68546e56SEric Biggers# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 46*68546e56SEric Biggers# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 47*68546e56SEric Biggers 48*68546e56SEric Biggers# ==================================================================== 49*68546e56SEric Biggers# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL 50*68546e56SEric Biggers# project. The module is, however, dual licensed under OpenSSL and 51*68546e56SEric Biggers# CRYPTOGAMS licenses depending on where you obtain it. For further 52*68546e56SEric Biggers# details see https://www.openssl.org/~appro/cryptogams/. 53*68546e56SEric Biggers# ==================================================================== 54*68546e56SEric Biggers 55*68546e56SEric Biggers# 56*68546e56SEric Biggers# ==================================================================== 57*68546e56SEric Biggers# Written and Modified by Danny Tsen <dtsen@us.ibm.com> 58*68546e56SEric Biggers# - Added x25519_fe51_sqr_times, x25519_fe51_frombytes, x25519_fe51_tobytes 59*68546e56SEric Biggers# and x25519_cswap 60*68546e56SEric Biggers# 61*68546e56SEric Biggers# Copyright 2024- IBM Corp. 62*68546e56SEric Biggers# 63*68546e56SEric Biggers# X25519 lower-level primitives for PPC64. 64*68546e56SEric Biggers# 65*68546e56SEric Biggers 66*68546e56SEric Biggers#include <linux/linkage.h> 67*68546e56SEric Biggers 68*68546e56SEric Biggers.text 69*68546e56SEric Biggers 70*68546e56SEric Biggers.align 5 71*68546e56SEric BiggersSYM_FUNC_START(x25519_fe51_mul) 72*68546e56SEric Biggers 73*68546e56SEric Biggers stdu 1,-144(1) 74*68546e56SEric Biggers std 21,56(1) 75*68546e56SEric Biggers std 22,64(1) 76*68546e56SEric Biggers std 23,72(1) 77*68546e56SEric Biggers std 24,80(1) 78*68546e56SEric Biggers std 25,88(1) 79*68546e56SEric Biggers std 26,96(1) 80*68546e56SEric Biggers std 27,104(1) 81*68546e56SEric Biggers std 28,112(1) 82*68546e56SEric Biggers std 29,120(1) 83*68546e56SEric Biggers std 30,128(1) 84*68546e56SEric Biggers std 31,136(1) 85*68546e56SEric Biggers 86*68546e56SEric Biggers ld 6,0(5) 87*68546e56SEric Biggers ld 7,0(4) 88*68546e56SEric Biggers ld 8,8(4) 89*68546e56SEric Biggers ld 9,16(4) 90*68546e56SEric Biggers ld 10,24(4) 91*68546e56SEric Biggers ld 11,32(4) 92*68546e56SEric Biggers 93*68546e56SEric Biggers mulld 22,7,6 94*68546e56SEric Biggers mulhdu 23,7,6 95*68546e56SEric Biggers 96*68546e56SEric Biggers mulld 24,8,6 97*68546e56SEric Biggers mulhdu 25,8,6 98*68546e56SEric Biggers 99*68546e56SEric Biggers mulld 30,11,6 100*68546e56SEric Biggers mulhdu 31,11,6 101*68546e56SEric Biggers ld 4,8(5) 102*68546e56SEric Biggers mulli 11,11,19 103*68546e56SEric Biggers 104*68546e56SEric Biggers mulld 26,9,6 105*68546e56SEric Biggers mulhdu 27,9,6 106*68546e56SEric Biggers 107*68546e56SEric Biggers mulld 28,10,6 108*68546e56SEric Biggers mulhdu 29,10,6 109*68546e56SEric Biggers mulld 12,11,4 110*68546e56SEric Biggers mulhdu 21,11,4 111*68546e56SEric Biggers addc 22,22,12 112*68546e56SEric Biggers adde 23,23,21 113*68546e56SEric Biggers 114*68546e56SEric Biggers mulld 12,7,4 115*68546e56SEric Biggers mulhdu 21,7,4 116*68546e56SEric Biggers addc 24,24,12 117*68546e56SEric Biggers adde 25,25,21 118*68546e56SEric Biggers 119*68546e56SEric Biggers mulld 12,10,4 120*68546e56SEric Biggers mulhdu 21,10,4 121*68546e56SEric Biggers ld 6,16(5) 122*68546e56SEric Biggers mulli 10,10,19 123*68546e56SEric Biggers addc 30,30,12 124*68546e56SEric Biggers adde 31,31,21 125*68546e56SEric Biggers 126*68546e56SEric Biggers mulld 12,8,4 127*68546e56SEric Biggers mulhdu 21,8,4 128*68546e56SEric Biggers addc 26,26,12 129*68546e56SEric Biggers adde 27,27,21 130*68546e56SEric Biggers 131*68546e56SEric Biggers mulld 12,9,4 132*68546e56SEric Biggers mulhdu 21,9,4 133*68546e56SEric Biggers addc 28,28,12 134*68546e56SEric Biggers adde 29,29,21 135*68546e56SEric Biggers mulld 12,10,6 136*68546e56SEric Biggers mulhdu 21,10,6 137*68546e56SEric Biggers addc 22,22,12 138*68546e56SEric Biggers adde 23,23,21 139*68546e56SEric Biggers 140*68546e56SEric Biggers mulld 12,11,6 141*68546e56SEric Biggers mulhdu 21,11,6 142*68546e56SEric Biggers addc 24,24,12 143*68546e56SEric Biggers adde 25,25,21 144*68546e56SEric Biggers 145*68546e56SEric Biggers mulld 12,9,6 146*68546e56SEric Biggers mulhdu 21,9,6 147*68546e56SEric Biggers ld 4,24(5) 148*68546e56SEric Biggers mulli 9,9,19 149*68546e56SEric Biggers addc 30,30,12 150*68546e56SEric Biggers adde 31,31,21 151*68546e56SEric Biggers 152*68546e56SEric Biggers mulld 12,7,6 153*68546e56SEric Biggers mulhdu 21,7,6 154*68546e56SEric Biggers addc 26,26,12 155*68546e56SEric Biggers adde 27,27,21 156*68546e56SEric Biggers 157*68546e56SEric Biggers mulld 12,8,6 158*68546e56SEric Biggers mulhdu 21,8,6 159*68546e56SEric Biggers addc 28,28,12 160*68546e56SEric Biggers adde 29,29,21 161*68546e56SEric Biggers mulld 12,9,4 162*68546e56SEric Biggers mulhdu 21,9,4 163*68546e56SEric Biggers addc 22,22,12 164*68546e56SEric Biggers adde 23,23,21 165*68546e56SEric Biggers 166*68546e56SEric Biggers mulld 12,10,4 167*68546e56SEric Biggers mulhdu 21,10,4 168*68546e56SEric Biggers addc 24,24,12 169*68546e56SEric Biggers adde 25,25,21 170*68546e56SEric Biggers 171*68546e56SEric Biggers mulld 12,8,4 172*68546e56SEric Biggers mulhdu 21,8,4 173*68546e56SEric Biggers ld 6,32(5) 174*68546e56SEric Biggers mulli 8,8,19 175*68546e56SEric Biggers addc 30,30,12 176*68546e56SEric Biggers adde 31,31,21 177*68546e56SEric Biggers 178*68546e56SEric Biggers mulld 12,11,4 179*68546e56SEric Biggers mulhdu 21,11,4 180*68546e56SEric Biggers addc 26,26,12 181*68546e56SEric Biggers adde 27,27,21 182*68546e56SEric Biggers 183*68546e56SEric Biggers mulld 12,7,4 184*68546e56SEric Biggers mulhdu 21,7,4 185*68546e56SEric Biggers addc 28,28,12 186*68546e56SEric Biggers adde 29,29,21 187*68546e56SEric Biggers mulld 12,8,6 188*68546e56SEric Biggers mulhdu 21,8,6 189*68546e56SEric Biggers addc 22,22,12 190*68546e56SEric Biggers adde 23,23,21 191*68546e56SEric Biggers 192*68546e56SEric Biggers mulld 12,9,6 193*68546e56SEric Biggers mulhdu 21,9,6 194*68546e56SEric Biggers addc 24,24,12 195*68546e56SEric Biggers adde 25,25,21 196*68546e56SEric Biggers 197*68546e56SEric Biggers mulld 12,10,6 198*68546e56SEric Biggers mulhdu 21,10,6 199*68546e56SEric Biggers addc 26,26,12 200*68546e56SEric Biggers adde 27,27,21 201*68546e56SEric Biggers 202*68546e56SEric Biggers mulld 12,11,6 203*68546e56SEric Biggers mulhdu 21,11,6 204*68546e56SEric Biggers addc 28,28,12 205*68546e56SEric Biggers adde 29,29,21 206*68546e56SEric Biggers 207*68546e56SEric Biggers mulld 12,7,6 208*68546e56SEric Biggers mulhdu 21,7,6 209*68546e56SEric Biggers addc 30,30,12 210*68546e56SEric Biggers adde 31,31,21 211*68546e56SEric Biggers 212*68546e56SEric Biggers.Lfe51_reduce: 213*68546e56SEric Biggers li 0,-1 214*68546e56SEric Biggers srdi 0,0,13 215*68546e56SEric Biggers 216*68546e56SEric Biggers srdi 12,26,51 217*68546e56SEric Biggers and 9,26,0 218*68546e56SEric Biggers insrdi 12,27,51,0 219*68546e56SEric Biggers srdi 21,22,51 220*68546e56SEric Biggers and 7,22,0 221*68546e56SEric Biggers insrdi 21,23,51,0 222*68546e56SEric Biggers addc 28,28,12 223*68546e56SEric Biggers addze 29,29 224*68546e56SEric Biggers addc 24,24,21 225*68546e56SEric Biggers addze 25,25 226*68546e56SEric Biggers 227*68546e56SEric Biggers srdi 12,28,51 228*68546e56SEric Biggers and 10,28,0 229*68546e56SEric Biggers insrdi 12,29,51,0 230*68546e56SEric Biggers srdi 21,24,51 231*68546e56SEric Biggers and 8,24,0 232*68546e56SEric Biggers insrdi 21,25,51,0 233*68546e56SEric Biggers addc 30,30,12 234*68546e56SEric Biggers addze 31,31 235*68546e56SEric Biggers add 9,9,21 236*68546e56SEric Biggers 237*68546e56SEric Biggers srdi 12,30,51 238*68546e56SEric Biggers and 11,30,0 239*68546e56SEric Biggers insrdi 12,31,51,0 240*68546e56SEric Biggers mulli 12,12,19 241*68546e56SEric Biggers 242*68546e56SEric Biggers add 7,7,12 243*68546e56SEric Biggers 244*68546e56SEric Biggers srdi 21,9,51 245*68546e56SEric Biggers and 9,9,0 246*68546e56SEric Biggers add 10,10,21 247*68546e56SEric Biggers 248*68546e56SEric Biggers srdi 12,7,51 249*68546e56SEric Biggers and 7,7,0 250*68546e56SEric Biggers add 8,8,12 251*68546e56SEric Biggers 252*68546e56SEric Biggers std 9,16(3) 253*68546e56SEric Biggers std 10,24(3) 254*68546e56SEric Biggers std 11,32(3) 255*68546e56SEric Biggers std 7,0(3) 256*68546e56SEric Biggers std 8,8(3) 257*68546e56SEric Biggers 258*68546e56SEric Biggers ld 21,56(1) 259*68546e56SEric Biggers ld 22,64(1) 260*68546e56SEric Biggers ld 23,72(1) 261*68546e56SEric Biggers ld 24,80(1) 262*68546e56SEric Biggers ld 25,88(1) 263*68546e56SEric Biggers ld 26,96(1) 264*68546e56SEric Biggers ld 27,104(1) 265*68546e56SEric Biggers ld 28,112(1) 266*68546e56SEric Biggers ld 29,120(1) 267*68546e56SEric Biggers ld 30,128(1) 268*68546e56SEric Biggers ld 31,136(1) 269*68546e56SEric Biggers addi 1,1,144 270*68546e56SEric Biggers blr 271*68546e56SEric BiggersSYM_FUNC_END(x25519_fe51_mul) 272*68546e56SEric Biggers 273*68546e56SEric Biggers.align 5 274*68546e56SEric BiggersSYM_FUNC_START(x25519_fe51_sqr) 275*68546e56SEric Biggers 276*68546e56SEric Biggers stdu 1,-144(1) 277*68546e56SEric Biggers std 21,56(1) 278*68546e56SEric Biggers std 22,64(1) 279*68546e56SEric Biggers std 23,72(1) 280*68546e56SEric Biggers std 24,80(1) 281*68546e56SEric Biggers std 25,88(1) 282*68546e56SEric Biggers std 26,96(1) 283*68546e56SEric Biggers std 27,104(1) 284*68546e56SEric Biggers std 28,112(1) 285*68546e56SEric Biggers std 29,120(1) 286*68546e56SEric Biggers std 30,128(1) 287*68546e56SEric Biggers std 31,136(1) 288*68546e56SEric Biggers 289*68546e56SEric Biggers ld 7,0(4) 290*68546e56SEric Biggers ld 8,8(4) 291*68546e56SEric Biggers ld 9,16(4) 292*68546e56SEric Biggers ld 10,24(4) 293*68546e56SEric Biggers ld 11,32(4) 294*68546e56SEric Biggers 295*68546e56SEric Biggers add 6,7,7 296*68546e56SEric Biggers mulli 21,11,19 297*68546e56SEric Biggers 298*68546e56SEric Biggers mulld 22,7,7 299*68546e56SEric Biggers mulhdu 23,7,7 300*68546e56SEric Biggers mulld 24,8,6 301*68546e56SEric Biggers mulhdu 25,8,6 302*68546e56SEric Biggers mulld 26,9,6 303*68546e56SEric Biggers mulhdu 27,9,6 304*68546e56SEric Biggers mulld 28,10,6 305*68546e56SEric Biggers mulhdu 29,10,6 306*68546e56SEric Biggers mulld 30,11,6 307*68546e56SEric Biggers mulhdu 31,11,6 308*68546e56SEric Biggers add 6,8,8 309*68546e56SEric Biggers mulld 12,11,21 310*68546e56SEric Biggers mulhdu 11,11,21 311*68546e56SEric Biggers addc 28,28,12 312*68546e56SEric Biggers adde 29,29,11 313*68546e56SEric Biggers 314*68546e56SEric Biggers mulli 5,10,19 315*68546e56SEric Biggers 316*68546e56SEric Biggers mulld 12,8,8 317*68546e56SEric Biggers mulhdu 11,8,8 318*68546e56SEric Biggers addc 26,26,12 319*68546e56SEric Biggers adde 27,27,11 320*68546e56SEric Biggers mulld 12,9,6 321*68546e56SEric Biggers mulhdu 11,9,6 322*68546e56SEric Biggers addc 28,28,12 323*68546e56SEric Biggers adde 29,29,11 324*68546e56SEric Biggers mulld 12,10,6 325*68546e56SEric Biggers mulhdu 11,10,6 326*68546e56SEric Biggers addc 30,30,12 327*68546e56SEric Biggers adde 31,31,11 328*68546e56SEric Biggers mulld 12,21,6 329*68546e56SEric Biggers mulhdu 11,21,6 330*68546e56SEric Biggers add 6,10,10 331*68546e56SEric Biggers addc 22,22,12 332*68546e56SEric Biggers adde 23,23,11 333*68546e56SEric Biggers mulld 12,10,5 334*68546e56SEric Biggers mulhdu 10,10,5 335*68546e56SEric Biggers addc 24,24,12 336*68546e56SEric Biggers adde 25,25,10 337*68546e56SEric Biggers mulld 12,6,21 338*68546e56SEric Biggers mulhdu 10,6,21 339*68546e56SEric Biggers add 6,9,9 340*68546e56SEric Biggers addc 26,26,12 341*68546e56SEric Biggers adde 27,27,10 342*68546e56SEric Biggers 343*68546e56SEric Biggers mulld 12,9,9 344*68546e56SEric Biggers mulhdu 10,9,9 345*68546e56SEric Biggers addc 30,30,12 346*68546e56SEric Biggers adde 31,31,10 347*68546e56SEric Biggers mulld 12,5,6 348*68546e56SEric Biggers mulhdu 10,5,6 349*68546e56SEric Biggers addc 22,22,12 350*68546e56SEric Biggers adde 23,23,10 351*68546e56SEric Biggers mulld 12,21,6 352*68546e56SEric Biggers mulhdu 10,21,6 353*68546e56SEric Biggers addc 24,24,12 354*68546e56SEric Biggers adde 25,25,10 355*68546e56SEric Biggers 356*68546e56SEric Biggers b .Lfe51_reduce 357*68546e56SEric BiggersSYM_FUNC_END(x25519_fe51_sqr) 358*68546e56SEric Biggers 359*68546e56SEric Biggers.align 5 360*68546e56SEric BiggersSYM_FUNC_START(x25519_fe51_mul121666) 361*68546e56SEric Biggers 362*68546e56SEric Biggers stdu 1,-144(1) 363*68546e56SEric Biggers std 21,56(1) 364*68546e56SEric Biggers std 22,64(1) 365*68546e56SEric Biggers std 23,72(1) 366*68546e56SEric Biggers std 24,80(1) 367*68546e56SEric Biggers std 25,88(1) 368*68546e56SEric Biggers std 26,96(1) 369*68546e56SEric Biggers std 27,104(1) 370*68546e56SEric Biggers std 28,112(1) 371*68546e56SEric Biggers std 29,120(1) 372*68546e56SEric Biggers std 30,128(1) 373*68546e56SEric Biggers std 31,136(1) 374*68546e56SEric Biggers 375*68546e56SEric Biggers lis 6,1 376*68546e56SEric Biggers ori 6,6,56130 377*68546e56SEric Biggers ld 7,0(4) 378*68546e56SEric Biggers ld 8,8(4) 379*68546e56SEric Biggers ld 9,16(4) 380*68546e56SEric Biggers ld 10,24(4) 381*68546e56SEric Biggers ld 11,32(4) 382*68546e56SEric Biggers 383*68546e56SEric Biggers mulld 22,7,6 384*68546e56SEric Biggers mulhdu 23,7,6 385*68546e56SEric Biggers mulld 24,8,6 386*68546e56SEric Biggers mulhdu 25,8,6 387*68546e56SEric Biggers mulld 26,9,6 388*68546e56SEric Biggers mulhdu 27,9,6 389*68546e56SEric Biggers mulld 28,10,6 390*68546e56SEric Biggers mulhdu 29,10,6 391*68546e56SEric Biggers mulld 30,11,6 392*68546e56SEric Biggers mulhdu 31,11,6 393*68546e56SEric Biggers 394*68546e56SEric Biggers b .Lfe51_reduce 395*68546e56SEric BiggersSYM_FUNC_END(x25519_fe51_mul121666) 396*68546e56SEric Biggers 397*68546e56SEric Biggers.align 5 398*68546e56SEric BiggersSYM_FUNC_START(x25519_fe51_sqr_times) 399*68546e56SEric Biggers 400*68546e56SEric Biggers stdu 1,-144(1) 401*68546e56SEric Biggers std 21,56(1) 402*68546e56SEric Biggers std 22,64(1) 403*68546e56SEric Biggers std 23,72(1) 404*68546e56SEric Biggers std 24,80(1) 405*68546e56SEric Biggers std 25,88(1) 406*68546e56SEric Biggers std 26,96(1) 407*68546e56SEric Biggers std 27,104(1) 408*68546e56SEric Biggers std 28,112(1) 409*68546e56SEric Biggers std 29,120(1) 410*68546e56SEric Biggers std 30,128(1) 411*68546e56SEric Biggers std 31,136(1) 412*68546e56SEric Biggers 413*68546e56SEric Biggers ld 7,0(4) 414*68546e56SEric Biggers ld 8,8(4) 415*68546e56SEric Biggers ld 9,16(4) 416*68546e56SEric Biggers ld 10,24(4) 417*68546e56SEric Biggers ld 11,32(4) 418*68546e56SEric Biggers 419*68546e56SEric Biggers mtctr 5 420*68546e56SEric Biggers 421*68546e56SEric Biggers.Lsqr_times_loop: 422*68546e56SEric Biggers add 6,7,7 423*68546e56SEric Biggers mulli 21,11,19 424*68546e56SEric Biggers 425*68546e56SEric Biggers mulld 22,7,7 426*68546e56SEric Biggers mulhdu 23,7,7 427*68546e56SEric Biggers mulld 24,8,6 428*68546e56SEric Biggers mulhdu 25,8,6 429*68546e56SEric Biggers mulld 26,9,6 430*68546e56SEric Biggers mulhdu 27,9,6 431*68546e56SEric Biggers mulld 28,10,6 432*68546e56SEric Biggers mulhdu 29,10,6 433*68546e56SEric Biggers mulld 30,11,6 434*68546e56SEric Biggers mulhdu 31,11,6 435*68546e56SEric Biggers add 6,8,8 436*68546e56SEric Biggers mulld 12,11,21 437*68546e56SEric Biggers mulhdu 11,11,21 438*68546e56SEric Biggers addc 28,28,12 439*68546e56SEric Biggers adde 29,29,11 440*68546e56SEric Biggers 441*68546e56SEric Biggers mulli 5,10,19 442*68546e56SEric Biggers 443*68546e56SEric Biggers mulld 12,8,8 444*68546e56SEric Biggers mulhdu 11,8,8 445*68546e56SEric Biggers addc 26,26,12 446*68546e56SEric Biggers adde 27,27,11 447*68546e56SEric Biggers mulld 12,9,6 448*68546e56SEric Biggers mulhdu 11,9,6 449*68546e56SEric Biggers addc 28,28,12 450*68546e56SEric Biggers adde 29,29,11 451*68546e56SEric Biggers mulld 12,10,6 452*68546e56SEric Biggers mulhdu 11,10,6 453*68546e56SEric Biggers addc 30,30,12 454*68546e56SEric Biggers adde 31,31,11 455*68546e56SEric Biggers mulld 12,21,6 456*68546e56SEric Biggers mulhdu 11,21,6 457*68546e56SEric Biggers add 6,10,10 458*68546e56SEric Biggers addc 22,22,12 459*68546e56SEric Biggers adde 23,23,11 460*68546e56SEric Biggers mulld 12,10,5 461*68546e56SEric Biggers mulhdu 10,10,5 462*68546e56SEric Biggers addc 24,24,12 463*68546e56SEric Biggers adde 25,25,10 464*68546e56SEric Biggers mulld 12,6,21 465*68546e56SEric Biggers mulhdu 10,6,21 466*68546e56SEric Biggers add 6,9,9 467*68546e56SEric Biggers addc 26,26,12 468*68546e56SEric Biggers adde 27,27,10 469*68546e56SEric Biggers 470*68546e56SEric Biggers mulld 12,9,9 471*68546e56SEric Biggers mulhdu 10,9,9 472*68546e56SEric Biggers addc 30,30,12 473*68546e56SEric Biggers adde 31,31,10 474*68546e56SEric Biggers mulld 12,5,6 475*68546e56SEric Biggers mulhdu 10,5,6 476*68546e56SEric Biggers addc 22,22,12 477*68546e56SEric Biggers adde 23,23,10 478*68546e56SEric Biggers mulld 12,21,6 479*68546e56SEric Biggers mulhdu 10,21,6 480*68546e56SEric Biggers addc 24,24,12 481*68546e56SEric Biggers adde 25,25,10 482*68546e56SEric Biggers 483*68546e56SEric Biggers # fe51_reduce 484*68546e56SEric Biggers li 0,-1 485*68546e56SEric Biggers srdi 0,0,13 486*68546e56SEric Biggers 487*68546e56SEric Biggers srdi 12,26,51 488*68546e56SEric Biggers and 9,26,0 489*68546e56SEric Biggers insrdi 12,27,51,0 490*68546e56SEric Biggers srdi 21,22,51 491*68546e56SEric Biggers and 7,22,0 492*68546e56SEric Biggers insrdi 21,23,51,0 493*68546e56SEric Biggers addc 28,28,12 494*68546e56SEric Biggers addze 29,29 495*68546e56SEric Biggers addc 24,24,21 496*68546e56SEric Biggers addze 25,25 497*68546e56SEric Biggers 498*68546e56SEric Biggers srdi 12,28,51 499*68546e56SEric Biggers and 10,28,0 500*68546e56SEric Biggers insrdi 12,29,51,0 501*68546e56SEric Biggers srdi 21,24,51 502*68546e56SEric Biggers and 8,24,0 503*68546e56SEric Biggers insrdi 21,25,51,0 504*68546e56SEric Biggers addc 30,30,12 505*68546e56SEric Biggers addze 31,31 506*68546e56SEric Biggers add 9,9,21 507*68546e56SEric Biggers 508*68546e56SEric Biggers srdi 12,30,51 509*68546e56SEric Biggers and 11,30,0 510*68546e56SEric Biggers insrdi 12,31,51,0 511*68546e56SEric Biggers mulli 12,12,19 512*68546e56SEric Biggers 513*68546e56SEric Biggers add 7,7,12 514*68546e56SEric Biggers 515*68546e56SEric Biggers srdi 21,9,51 516*68546e56SEric Biggers and 9,9,0 517*68546e56SEric Biggers add 10,10,21 518*68546e56SEric Biggers 519*68546e56SEric Biggers srdi 12,7,51 520*68546e56SEric Biggers and 7,7,0 521*68546e56SEric Biggers add 8,8,12 522*68546e56SEric Biggers 523*68546e56SEric Biggers bdnz .Lsqr_times_loop 524*68546e56SEric Biggers 525*68546e56SEric Biggers std 9,16(3) 526*68546e56SEric Biggers std 10,24(3) 527*68546e56SEric Biggers std 11,32(3) 528*68546e56SEric Biggers std 7,0(3) 529*68546e56SEric Biggers std 8,8(3) 530*68546e56SEric Biggers 531*68546e56SEric Biggers ld 21,56(1) 532*68546e56SEric Biggers ld 22,64(1) 533*68546e56SEric Biggers ld 23,72(1) 534*68546e56SEric Biggers ld 24,80(1) 535*68546e56SEric Biggers ld 25,88(1) 536*68546e56SEric Biggers ld 26,96(1) 537*68546e56SEric Biggers ld 27,104(1) 538*68546e56SEric Biggers ld 28,112(1) 539*68546e56SEric Biggers ld 29,120(1) 540*68546e56SEric Biggers ld 30,128(1) 541*68546e56SEric Biggers ld 31,136(1) 542*68546e56SEric Biggers addi 1,1,144 543*68546e56SEric Biggers blr 544*68546e56SEric BiggersSYM_FUNC_END(x25519_fe51_sqr_times) 545*68546e56SEric Biggers 546*68546e56SEric Biggers.align 5 547*68546e56SEric BiggersSYM_FUNC_START(x25519_fe51_frombytes) 548*68546e56SEric Biggers 549*68546e56SEric Biggers li 12, -1 550*68546e56SEric Biggers srdi 12, 12, 13 # 0x7ffffffffffff 551*68546e56SEric Biggers 552*68546e56SEric Biggers ld 5, 0(4) 553*68546e56SEric Biggers ld 6, 8(4) 554*68546e56SEric Biggers ld 7, 16(4) 555*68546e56SEric Biggers ld 8, 24(4) 556*68546e56SEric Biggers 557*68546e56SEric Biggers srdi 10, 5, 51 558*68546e56SEric Biggers and 5, 5, 12 # h0 559*68546e56SEric Biggers 560*68546e56SEric Biggers sldi 11, 6, 13 561*68546e56SEric Biggers or 11, 10, 11 # h1t 562*68546e56SEric Biggers srdi 10, 6, 38 563*68546e56SEric Biggers and 6, 11, 12 # h1 564*68546e56SEric Biggers 565*68546e56SEric Biggers sldi 11, 7, 26 566*68546e56SEric Biggers or 10, 10, 11 # h2t 567*68546e56SEric Biggers 568*68546e56SEric Biggers srdi 11, 7, 25 569*68546e56SEric Biggers and 7, 10, 12 # h2 570*68546e56SEric Biggers sldi 10, 8, 39 571*68546e56SEric Biggers or 11, 11, 10 # h3t 572*68546e56SEric Biggers 573*68546e56SEric Biggers srdi 9, 8, 12 574*68546e56SEric Biggers and 8, 11, 12 # h3 575*68546e56SEric Biggers and 9, 9, 12 # h4 576*68546e56SEric Biggers 577*68546e56SEric Biggers std 5, 0(3) 578*68546e56SEric Biggers std 6, 8(3) 579*68546e56SEric Biggers std 7, 16(3) 580*68546e56SEric Biggers std 8, 24(3) 581*68546e56SEric Biggers std 9, 32(3) 582*68546e56SEric Biggers 583*68546e56SEric Biggers blr 584*68546e56SEric BiggersSYM_FUNC_END(x25519_fe51_frombytes) 585*68546e56SEric Biggers 586*68546e56SEric Biggers.align 5 587*68546e56SEric BiggersSYM_FUNC_START(x25519_fe51_tobytes) 588*68546e56SEric Biggers 589*68546e56SEric Biggers ld 5, 0(4) 590*68546e56SEric Biggers ld 6, 8(4) 591*68546e56SEric Biggers ld 7, 16(4) 592*68546e56SEric Biggers ld 8, 24(4) 593*68546e56SEric Biggers ld 9, 32(4) 594*68546e56SEric Biggers 595*68546e56SEric Biggers li 12, -1 596*68546e56SEric Biggers srdi 12, 12, 13 # 0x7ffffffffffff 597*68546e56SEric Biggers 598*68546e56SEric Biggers # Full reducuction 599*68546e56SEric Biggers addi 10, 5, 19 600*68546e56SEric Biggers srdi 10, 10, 51 601*68546e56SEric Biggers add 10, 10, 6 602*68546e56SEric Biggers srdi 10, 10, 51 603*68546e56SEric Biggers add 10, 10, 7 604*68546e56SEric Biggers srdi 10, 10, 51 605*68546e56SEric Biggers add 10, 10, 8 606*68546e56SEric Biggers srdi 10, 10, 51 607*68546e56SEric Biggers add 10, 10, 9 608*68546e56SEric Biggers srdi 10, 10, 51 609*68546e56SEric Biggers 610*68546e56SEric Biggers mulli 10, 10, 19 611*68546e56SEric Biggers add 5, 5, 10 612*68546e56SEric Biggers srdi 11, 5, 51 613*68546e56SEric Biggers add 6, 6, 11 614*68546e56SEric Biggers srdi 11, 6, 51 615*68546e56SEric Biggers add 7, 7, 11 616*68546e56SEric Biggers srdi 11, 7, 51 617*68546e56SEric Biggers add 8, 8, 11 618*68546e56SEric Biggers srdi 11, 8, 51 619*68546e56SEric Biggers add 9, 9, 11 620*68546e56SEric Biggers 621*68546e56SEric Biggers and 5, 5, 12 622*68546e56SEric Biggers and 6, 6, 12 623*68546e56SEric Biggers and 7, 7, 12 624*68546e56SEric Biggers and 8, 8, 12 625*68546e56SEric Biggers and 9, 9, 12 626*68546e56SEric Biggers 627*68546e56SEric Biggers sldi 10, 6, 51 628*68546e56SEric Biggers or 5, 5, 10 # s0 629*68546e56SEric Biggers 630*68546e56SEric Biggers srdi 11, 6, 13 631*68546e56SEric Biggers sldi 10, 7, 38 632*68546e56SEric Biggers or 6, 11, 10 # s1 633*68546e56SEric Biggers 634*68546e56SEric Biggers srdi 11, 7, 26 635*68546e56SEric Biggers sldi 10, 8, 25 636*68546e56SEric Biggers or 7, 11, 10 # s2 637*68546e56SEric Biggers 638*68546e56SEric Biggers srdi 11, 8, 39 639*68546e56SEric Biggers sldi 10, 9, 12 640*68546e56SEric Biggers or 8, 11, 10 # s4 641*68546e56SEric Biggers 642*68546e56SEric Biggers std 5, 0(3) 643*68546e56SEric Biggers std 6, 8(3) 644*68546e56SEric Biggers std 7, 16(3) 645*68546e56SEric Biggers std 8, 24(3) 646*68546e56SEric Biggers 647*68546e56SEric Biggers blr 648*68546e56SEric BiggersSYM_FUNC_END(x25519_fe51_tobytes) 649*68546e56SEric Biggers 650*68546e56SEric Biggers.align 5 651*68546e56SEric BiggersSYM_FUNC_START(x25519_cswap) 652*68546e56SEric Biggers 653*68546e56SEric Biggers li 7, 5 654*68546e56SEric Biggers neg 6, 5 655*68546e56SEric Biggers mtctr 7 656*68546e56SEric Biggers 657*68546e56SEric Biggers.Lswap_loop: 658*68546e56SEric Biggers ld 8, 0(3) 659*68546e56SEric Biggers ld 9, 0(4) 660*68546e56SEric Biggers xor 10, 8, 9 661*68546e56SEric Biggers and 10, 10, 6 662*68546e56SEric Biggers xor 11, 8, 10 663*68546e56SEric Biggers xor 12, 9, 10 664*68546e56SEric Biggers std 11, 0(3) 665*68546e56SEric Biggers addi 3, 3, 8 666*68546e56SEric Biggers std 12, 0(4) 667*68546e56SEric Biggers addi 4, 4, 8 668*68546e56SEric Biggers bdnz .Lswap_loop 669*68546e56SEric Biggers 670*68546e56SEric Biggers blr 671*68546e56SEric BiggersSYM_FUNC_END(x25519_cswap) 672