18c2ecf20Sopenharmony_ci#! /usr/bin/env perl 28c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci# This code is taken from CRYPTOGAMs[1] and is included here using the option 58c2ecf20Sopenharmony_ci# in the license to distribute the code under the GPL. Therefore this program 68c2ecf20Sopenharmony_ci# is free software; you can redistribute it and/or modify it under the terms of 78c2ecf20Sopenharmony_ci# the GNU General Public License version 2 as published by the Free Software 88c2ecf20Sopenharmony_ci# Foundation. 98c2ecf20Sopenharmony_ci# 108c2ecf20Sopenharmony_ci# [1] https://www.openssl.org/~appro/cryptogams/ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci# Copyright (c) 2006-2017, CRYPTOGAMS by <appro@openssl.org> 138c2ecf20Sopenharmony_ci# All rights reserved. 148c2ecf20Sopenharmony_ci# 158c2ecf20Sopenharmony_ci# Redistribution and use in source and binary forms, with or without 168c2ecf20Sopenharmony_ci# modification, are permitted provided that the following conditions 178c2ecf20Sopenharmony_ci# are met: 188c2ecf20Sopenharmony_ci# 198c2ecf20Sopenharmony_ci# * Redistributions of source code must retain copyright notices, 208c2ecf20Sopenharmony_ci# this list of conditions and the following disclaimer. 218c2ecf20Sopenharmony_ci# 228c2ecf20Sopenharmony_ci# * Redistributions in binary form must reproduce the above 238c2ecf20Sopenharmony_ci# copyright notice, this list of conditions and the following 248c2ecf20Sopenharmony_ci# disclaimer in the documentation and/or other materials 258c2ecf20Sopenharmony_ci# provided with the distribution. 268c2ecf20Sopenharmony_ci# 278c2ecf20Sopenharmony_ci# * Neither the name of the CRYPTOGAMS nor the names of its 288c2ecf20Sopenharmony_ci# copyright holder and contributors may be used to endorse or 298c2ecf20Sopenharmony_ci# promote products derived from this software without specific 308c2ecf20Sopenharmony_ci# prior written permission. 318c2ecf20Sopenharmony_ci# 328c2ecf20Sopenharmony_ci# ALTERNATIVELY, provided that this notice is retained in full, this 338c2ecf20Sopenharmony_ci# product may be distributed under the terms of the GNU General Public 348c2ecf20Sopenharmony_ci# License (GPL), in which case the provisions of the GPL apply INSTEAD OF 358c2ecf20Sopenharmony_ci# those given above. 368c2ecf20Sopenharmony_ci# 378c2ecf20Sopenharmony_ci# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS 388c2ecf20Sopenharmony_ci# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 398c2ecf20Sopenharmony_ci# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 408c2ecf20Sopenharmony_ci# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 418c2ecf20Sopenharmony_ci# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 428c2ecf20Sopenharmony_ci# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 438c2ecf20Sopenharmony_ci# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 448c2ecf20Sopenharmony_ci# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 458c2ecf20Sopenharmony_ci# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 468c2ecf20Sopenharmony_ci# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 478c2ecf20Sopenharmony_ci# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci# ==================================================================== 508c2ecf20Sopenharmony_ci# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL 518c2ecf20Sopenharmony_ci# project. The module is, however, dual licensed under OpenSSL and 528c2ecf20Sopenharmony_ci# CRYPTOGAMS licenses depending on where you obtain it. For further 538c2ecf20Sopenharmony_ci# details see https://www.openssl.org/~appro/cryptogams/. 548c2ecf20Sopenharmony_ci# ==================================================================== 558c2ecf20Sopenharmony_ci# 568c2ecf20Sopenharmony_ci# This module implements support for AES instructions as per PowerISA 578c2ecf20Sopenharmony_ci# specification version 2.07, first implemented by POWER8 processor. 588c2ecf20Sopenharmony_ci# The module is endian-agnostic in sense that it supports both big- 598c2ecf20Sopenharmony_ci# and little-endian cases. Data alignment in parallelizable modes is 608c2ecf20Sopenharmony_ci# handled with VSX loads and stores, which implies MSR.VSX flag being 618c2ecf20Sopenharmony_ci# set. It should also be noted that ISA specification doesn't prohibit 628c2ecf20Sopenharmony_ci# alignment exceptions for these instructions on page boundaries. 638c2ecf20Sopenharmony_ci# Initially alignment was handled in pure AltiVec/VMX way [when data 648c2ecf20Sopenharmony_ci# is aligned programmatically, which in turn guarantees exception- 658c2ecf20Sopenharmony_ci# free execution], but it turned to hamper performance when vcipher 668c2ecf20Sopenharmony_ci# instructions are interleaved. It's reckoned that eventual 678c2ecf20Sopenharmony_ci# misalignment penalties at page boundaries are in average lower 688c2ecf20Sopenharmony_ci# than additional overhead in pure AltiVec approach. 698c2ecf20Sopenharmony_ci# 708c2ecf20Sopenharmony_ci# May 2016 718c2ecf20Sopenharmony_ci# 728c2ecf20Sopenharmony_ci# Add XTS subroutine, 9x on little- and 12x improvement on big-endian 738c2ecf20Sopenharmony_ci# systems were measured. 748c2ecf20Sopenharmony_ci# 758c2ecf20Sopenharmony_ci###################################################################### 768c2ecf20Sopenharmony_ci# Current large-block performance in cycles per byte processed with 778c2ecf20Sopenharmony_ci# 128-bit key (less is better). 788c2ecf20Sopenharmony_ci# 798c2ecf20Sopenharmony_ci# CBC en-/decrypt CTR XTS 808c2ecf20Sopenharmony_ci# POWER8[le] 3.96/0.72 0.74 1.1 818c2ecf20Sopenharmony_ci# POWER8[be] 3.75/0.65 0.66 1.0 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci$flavour = shift; 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ciif ($flavour =~ /64/) { 868c2ecf20Sopenharmony_ci $SIZE_T =8; 878c2ecf20Sopenharmony_ci $LRSAVE =2*$SIZE_T; 888c2ecf20Sopenharmony_ci $STU ="stdu"; 898c2ecf20Sopenharmony_ci $POP ="ld"; 908c2ecf20Sopenharmony_ci $PUSH ="std"; 918c2ecf20Sopenharmony_ci $UCMP ="cmpld"; 928c2ecf20Sopenharmony_ci $SHL ="sldi"; 938c2ecf20Sopenharmony_ci} elsif ($flavour =~ /32/) { 948c2ecf20Sopenharmony_ci $SIZE_T =4; 958c2ecf20Sopenharmony_ci $LRSAVE =$SIZE_T; 968c2ecf20Sopenharmony_ci $STU ="stwu"; 978c2ecf20Sopenharmony_ci $POP ="lwz"; 988c2ecf20Sopenharmony_ci $PUSH ="stw"; 998c2ecf20Sopenharmony_ci $UCMP ="cmplw"; 1008c2ecf20Sopenharmony_ci $SHL ="slwi"; 1018c2ecf20Sopenharmony_ci} else { die "nonsense $flavour"; } 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci$LITTLE_ENDIAN = ($flavour=~/le$/) ? $SIZE_T : 0; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; 1068c2ecf20Sopenharmony_ci( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or 1078c2ecf20Sopenharmony_ci( $xlate="${dir}../../perlasm/ppc-xlate.pl" and -f $xlate) or 1088c2ecf20Sopenharmony_cidie "can't locate ppc-xlate.pl"; 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ciopen STDOUT,"| $^X $xlate $flavour ".shift || die "can't call $xlate: $!"; 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci$FRAME=8*$SIZE_T; 1138c2ecf20Sopenharmony_ci$prefix="aes_p8"; 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci$sp="r1"; 1168c2ecf20Sopenharmony_ci$vrsave="r12"; 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci######################################################################### 1198c2ecf20Sopenharmony_ci{{{ # Key setup procedures # 1208c2ecf20Sopenharmony_cimy ($inp,$bits,$out,$ptr,$cnt,$rounds)=map("r$_",(3..8)); 1218c2ecf20Sopenharmony_cimy ($zero,$in0,$in1,$key,$rcon,$mask,$tmp)=map("v$_",(0..6)); 1228c2ecf20Sopenharmony_cimy ($stage,$outperm,$outmask,$outhead,$outtail)=map("v$_",(7..11)); 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ci$code.=<<___; 1258c2ecf20Sopenharmony_ci.machine "any" 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ci.text 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_ci.align 7 1308c2ecf20Sopenharmony_circon: 1318c2ecf20Sopenharmony_ci.long 0x01000000, 0x01000000, 0x01000000, 0x01000000 ?rev 1328c2ecf20Sopenharmony_ci.long 0x1b000000, 0x1b000000, 0x1b000000, 0x1b000000 ?rev 1338c2ecf20Sopenharmony_ci.long 0x0d0e0f0c, 0x0d0e0f0c, 0x0d0e0f0c, 0x0d0e0f0c ?rev 1348c2ecf20Sopenharmony_ci.long 0,0,0,0 ?asis 1358c2ecf20Sopenharmony_ciLconsts: 1368c2ecf20Sopenharmony_ci mflr r0 1378c2ecf20Sopenharmony_ci bcl 20,31,\$+4 1388c2ecf20Sopenharmony_ci mflr $ptr #vvvvv "distance between . and rcon 1398c2ecf20Sopenharmony_ci addi $ptr,$ptr,-0x48 1408c2ecf20Sopenharmony_ci mtlr r0 1418c2ecf20Sopenharmony_ci blr 1428c2ecf20Sopenharmony_ci .long 0 1438c2ecf20Sopenharmony_ci .byte 0,12,0x14,0,0,0,0,0 1448c2ecf20Sopenharmony_ci.asciz "AES for PowerISA 2.07, CRYPTOGAMS by <appro\@openssl.org>" 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci.globl .${prefix}_set_encrypt_key 1478c2ecf20Sopenharmony_ciLset_encrypt_key: 1488c2ecf20Sopenharmony_ci mflr r11 1498c2ecf20Sopenharmony_ci $PUSH r11,$LRSAVE($sp) 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci li $ptr,-1 1528c2ecf20Sopenharmony_ci ${UCMP}i $inp,0 1538c2ecf20Sopenharmony_ci beq- Lenc_key_abort # if ($inp==0) return -1; 1548c2ecf20Sopenharmony_ci ${UCMP}i $out,0 1558c2ecf20Sopenharmony_ci beq- Lenc_key_abort # if ($out==0) return -1; 1568c2ecf20Sopenharmony_ci li $ptr,-2 1578c2ecf20Sopenharmony_ci cmpwi $bits,128 1588c2ecf20Sopenharmony_ci blt- Lenc_key_abort 1598c2ecf20Sopenharmony_ci cmpwi $bits,256 1608c2ecf20Sopenharmony_ci bgt- Lenc_key_abort 1618c2ecf20Sopenharmony_ci andi. r0,$bits,0x3f 1628c2ecf20Sopenharmony_ci bne- Lenc_key_abort 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci lis r0,0xfff0 1658c2ecf20Sopenharmony_ci mfspr $vrsave,256 1668c2ecf20Sopenharmony_ci mtspr 256,r0 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_ci bl Lconsts 1698c2ecf20Sopenharmony_ci mtlr r11 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci neg r9,$inp 1728c2ecf20Sopenharmony_ci lvx $in0,0,$inp 1738c2ecf20Sopenharmony_ci addi $inp,$inp,15 # 15 is not typo 1748c2ecf20Sopenharmony_ci lvsr $key,0,r9 # borrow $key 1758c2ecf20Sopenharmony_ci li r8,0x20 1768c2ecf20Sopenharmony_ci cmpwi $bits,192 1778c2ecf20Sopenharmony_ci lvx $in1,0,$inp 1788c2ecf20Sopenharmony_ci le?vspltisb $mask,0x0f # borrow $mask 1798c2ecf20Sopenharmony_ci lvx $rcon,0,$ptr 1808c2ecf20Sopenharmony_ci le?vxor $key,$key,$mask # adjust for byte swap 1818c2ecf20Sopenharmony_ci lvx $mask,r8,$ptr 1828c2ecf20Sopenharmony_ci addi $ptr,$ptr,0x10 1838c2ecf20Sopenharmony_ci vperm $in0,$in0,$in1,$key # align [and byte swap in LE] 1848c2ecf20Sopenharmony_ci li $cnt,8 1858c2ecf20Sopenharmony_ci vxor $zero,$zero,$zero 1868c2ecf20Sopenharmony_ci mtctr $cnt 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci ?lvsr $outperm,0,$out 1898c2ecf20Sopenharmony_ci vspltisb $outmask,-1 1908c2ecf20Sopenharmony_ci lvx $outhead,0,$out 1918c2ecf20Sopenharmony_ci ?vperm $outmask,$zero,$outmask,$outperm 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci blt Loop128 1948c2ecf20Sopenharmony_ci addi $inp,$inp,8 1958c2ecf20Sopenharmony_ci beq L192 1968c2ecf20Sopenharmony_ci addi $inp,$inp,8 1978c2ecf20Sopenharmony_ci b L256 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_ci.align 4 2008c2ecf20Sopenharmony_ciLoop128: 2018c2ecf20Sopenharmony_ci vperm $key,$in0,$in0,$mask # rotate-n-splat 2028c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$in0,12 # >>32 2038c2ecf20Sopenharmony_ci vperm $outtail,$in0,$in0,$outperm # rotate 2048c2ecf20Sopenharmony_ci vsel $stage,$outhead,$outtail,$outmask 2058c2ecf20Sopenharmony_ci vmr $outhead,$outtail 2068c2ecf20Sopenharmony_ci vcipherlast $key,$key,$rcon 2078c2ecf20Sopenharmony_ci stvx $stage,0,$out 2088c2ecf20Sopenharmony_ci addi $out,$out,16 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 2118c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$tmp,12 # >>32 2128c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 2138c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$tmp,12 # >>32 2148c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 2158c2ecf20Sopenharmony_ci vadduwm $rcon,$rcon,$rcon 2168c2ecf20Sopenharmony_ci vxor $in0,$in0,$key 2178c2ecf20Sopenharmony_ci bdnz Loop128 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_ci lvx $rcon,0,$ptr # last two round keys 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci vperm $key,$in0,$in0,$mask # rotate-n-splat 2228c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$in0,12 # >>32 2238c2ecf20Sopenharmony_ci vperm $outtail,$in0,$in0,$outperm # rotate 2248c2ecf20Sopenharmony_ci vsel $stage,$outhead,$outtail,$outmask 2258c2ecf20Sopenharmony_ci vmr $outhead,$outtail 2268c2ecf20Sopenharmony_ci vcipherlast $key,$key,$rcon 2278c2ecf20Sopenharmony_ci stvx $stage,0,$out 2288c2ecf20Sopenharmony_ci addi $out,$out,16 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 2318c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$tmp,12 # >>32 2328c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 2338c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$tmp,12 # >>32 2348c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 2358c2ecf20Sopenharmony_ci vadduwm $rcon,$rcon,$rcon 2368c2ecf20Sopenharmony_ci vxor $in0,$in0,$key 2378c2ecf20Sopenharmony_ci 2388c2ecf20Sopenharmony_ci vperm $key,$in0,$in0,$mask # rotate-n-splat 2398c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$in0,12 # >>32 2408c2ecf20Sopenharmony_ci vperm $outtail,$in0,$in0,$outperm # rotate 2418c2ecf20Sopenharmony_ci vsel $stage,$outhead,$outtail,$outmask 2428c2ecf20Sopenharmony_ci vmr $outhead,$outtail 2438c2ecf20Sopenharmony_ci vcipherlast $key,$key,$rcon 2448c2ecf20Sopenharmony_ci stvx $stage,0,$out 2458c2ecf20Sopenharmony_ci addi $out,$out,16 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 2488c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$tmp,12 # >>32 2498c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 2508c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$tmp,12 # >>32 2518c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 2528c2ecf20Sopenharmony_ci vxor $in0,$in0,$key 2538c2ecf20Sopenharmony_ci vperm $outtail,$in0,$in0,$outperm # rotate 2548c2ecf20Sopenharmony_ci vsel $stage,$outhead,$outtail,$outmask 2558c2ecf20Sopenharmony_ci vmr $outhead,$outtail 2568c2ecf20Sopenharmony_ci stvx $stage,0,$out 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci addi $inp,$out,15 # 15 is not typo 2598c2ecf20Sopenharmony_ci addi $out,$out,0x50 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci li $rounds,10 2628c2ecf20Sopenharmony_ci b Ldone 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_ci.align 4 2658c2ecf20Sopenharmony_ciL192: 2668c2ecf20Sopenharmony_ci lvx $tmp,0,$inp 2678c2ecf20Sopenharmony_ci li $cnt,4 2688c2ecf20Sopenharmony_ci vperm $outtail,$in0,$in0,$outperm # rotate 2698c2ecf20Sopenharmony_ci vsel $stage,$outhead,$outtail,$outmask 2708c2ecf20Sopenharmony_ci vmr $outhead,$outtail 2718c2ecf20Sopenharmony_ci stvx $stage,0,$out 2728c2ecf20Sopenharmony_ci addi $out,$out,16 2738c2ecf20Sopenharmony_ci vperm $in1,$in1,$tmp,$key # align [and byte swap in LE] 2748c2ecf20Sopenharmony_ci vspltisb $key,8 # borrow $key 2758c2ecf20Sopenharmony_ci mtctr $cnt 2768c2ecf20Sopenharmony_ci vsububm $mask,$mask,$key # adjust the mask 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_ciLoop192: 2798c2ecf20Sopenharmony_ci vperm $key,$in1,$in1,$mask # roate-n-splat 2808c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$in0,12 # >>32 2818c2ecf20Sopenharmony_ci vcipherlast $key,$key,$rcon 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 2848c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$tmp,12 # >>32 2858c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 2868c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$tmp,12 # >>32 2878c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_ci vsldoi $stage,$zero,$in1,8 2908c2ecf20Sopenharmony_ci vspltw $tmp,$in0,3 2918c2ecf20Sopenharmony_ci vxor $tmp,$tmp,$in1 2928c2ecf20Sopenharmony_ci vsldoi $in1,$zero,$in1,12 # >>32 2938c2ecf20Sopenharmony_ci vadduwm $rcon,$rcon,$rcon 2948c2ecf20Sopenharmony_ci vxor $in1,$in1,$tmp 2958c2ecf20Sopenharmony_ci vxor $in0,$in0,$key 2968c2ecf20Sopenharmony_ci vxor $in1,$in1,$key 2978c2ecf20Sopenharmony_ci vsldoi $stage,$stage,$in0,8 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_ci vperm $key,$in1,$in1,$mask # rotate-n-splat 3008c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$in0,12 # >>32 3018c2ecf20Sopenharmony_ci vperm $outtail,$stage,$stage,$outperm # rotate 3028c2ecf20Sopenharmony_ci vsel $stage,$outhead,$outtail,$outmask 3038c2ecf20Sopenharmony_ci vmr $outhead,$outtail 3048c2ecf20Sopenharmony_ci vcipherlast $key,$key,$rcon 3058c2ecf20Sopenharmony_ci stvx $stage,0,$out 3068c2ecf20Sopenharmony_ci addi $out,$out,16 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_ci vsldoi $stage,$in0,$in1,8 3098c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 3108c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$tmp,12 # >>32 3118c2ecf20Sopenharmony_ci vperm $outtail,$stage,$stage,$outperm # rotate 3128c2ecf20Sopenharmony_ci vsel $stage,$outhead,$outtail,$outmask 3138c2ecf20Sopenharmony_ci vmr $outhead,$outtail 3148c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 3158c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$tmp,12 # >>32 3168c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 3178c2ecf20Sopenharmony_ci stvx $stage,0,$out 3188c2ecf20Sopenharmony_ci addi $out,$out,16 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci vspltw $tmp,$in0,3 3218c2ecf20Sopenharmony_ci vxor $tmp,$tmp,$in1 3228c2ecf20Sopenharmony_ci vsldoi $in1,$zero,$in1,12 # >>32 3238c2ecf20Sopenharmony_ci vadduwm $rcon,$rcon,$rcon 3248c2ecf20Sopenharmony_ci vxor $in1,$in1,$tmp 3258c2ecf20Sopenharmony_ci vxor $in0,$in0,$key 3268c2ecf20Sopenharmony_ci vxor $in1,$in1,$key 3278c2ecf20Sopenharmony_ci vperm $outtail,$in0,$in0,$outperm # rotate 3288c2ecf20Sopenharmony_ci vsel $stage,$outhead,$outtail,$outmask 3298c2ecf20Sopenharmony_ci vmr $outhead,$outtail 3308c2ecf20Sopenharmony_ci stvx $stage,0,$out 3318c2ecf20Sopenharmony_ci addi $inp,$out,15 # 15 is not typo 3328c2ecf20Sopenharmony_ci addi $out,$out,16 3338c2ecf20Sopenharmony_ci bdnz Loop192 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_ci li $rounds,12 3368c2ecf20Sopenharmony_ci addi $out,$out,0x20 3378c2ecf20Sopenharmony_ci b Ldone 3388c2ecf20Sopenharmony_ci 3398c2ecf20Sopenharmony_ci.align 4 3408c2ecf20Sopenharmony_ciL256: 3418c2ecf20Sopenharmony_ci lvx $tmp,0,$inp 3428c2ecf20Sopenharmony_ci li $cnt,7 3438c2ecf20Sopenharmony_ci li $rounds,14 3448c2ecf20Sopenharmony_ci vperm $outtail,$in0,$in0,$outperm # rotate 3458c2ecf20Sopenharmony_ci vsel $stage,$outhead,$outtail,$outmask 3468c2ecf20Sopenharmony_ci vmr $outhead,$outtail 3478c2ecf20Sopenharmony_ci stvx $stage,0,$out 3488c2ecf20Sopenharmony_ci addi $out,$out,16 3498c2ecf20Sopenharmony_ci vperm $in1,$in1,$tmp,$key # align [and byte swap in LE] 3508c2ecf20Sopenharmony_ci mtctr $cnt 3518c2ecf20Sopenharmony_ci 3528c2ecf20Sopenharmony_ciLoop256: 3538c2ecf20Sopenharmony_ci vperm $key,$in1,$in1,$mask # rotate-n-splat 3548c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$in0,12 # >>32 3558c2ecf20Sopenharmony_ci vperm $outtail,$in1,$in1,$outperm # rotate 3568c2ecf20Sopenharmony_ci vsel $stage,$outhead,$outtail,$outmask 3578c2ecf20Sopenharmony_ci vmr $outhead,$outtail 3588c2ecf20Sopenharmony_ci vcipherlast $key,$key,$rcon 3598c2ecf20Sopenharmony_ci stvx $stage,0,$out 3608c2ecf20Sopenharmony_ci addi $out,$out,16 3618c2ecf20Sopenharmony_ci 3628c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 3638c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$tmp,12 # >>32 3648c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 3658c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$tmp,12 # >>32 3668c2ecf20Sopenharmony_ci vxor $in0,$in0,$tmp 3678c2ecf20Sopenharmony_ci vadduwm $rcon,$rcon,$rcon 3688c2ecf20Sopenharmony_ci vxor $in0,$in0,$key 3698c2ecf20Sopenharmony_ci vperm $outtail,$in0,$in0,$outperm # rotate 3708c2ecf20Sopenharmony_ci vsel $stage,$outhead,$outtail,$outmask 3718c2ecf20Sopenharmony_ci vmr $outhead,$outtail 3728c2ecf20Sopenharmony_ci stvx $stage,0,$out 3738c2ecf20Sopenharmony_ci addi $inp,$out,15 # 15 is not typo 3748c2ecf20Sopenharmony_ci addi $out,$out,16 3758c2ecf20Sopenharmony_ci bdz Ldone 3768c2ecf20Sopenharmony_ci 3778c2ecf20Sopenharmony_ci vspltw $key,$in0,3 # just splat 3788c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$in1,12 # >>32 3798c2ecf20Sopenharmony_ci vsbox $key,$key 3808c2ecf20Sopenharmony_ci 3818c2ecf20Sopenharmony_ci vxor $in1,$in1,$tmp 3828c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$tmp,12 # >>32 3838c2ecf20Sopenharmony_ci vxor $in1,$in1,$tmp 3848c2ecf20Sopenharmony_ci vsldoi $tmp,$zero,$tmp,12 # >>32 3858c2ecf20Sopenharmony_ci vxor $in1,$in1,$tmp 3868c2ecf20Sopenharmony_ci 3878c2ecf20Sopenharmony_ci vxor $in1,$in1,$key 3888c2ecf20Sopenharmony_ci b Loop256 3898c2ecf20Sopenharmony_ci 3908c2ecf20Sopenharmony_ci.align 4 3918c2ecf20Sopenharmony_ciLdone: 3928c2ecf20Sopenharmony_ci lvx $in1,0,$inp # redundant in aligned case 3938c2ecf20Sopenharmony_ci vsel $in1,$outhead,$in1,$outmask 3948c2ecf20Sopenharmony_ci stvx $in1,0,$inp 3958c2ecf20Sopenharmony_ci li $ptr,0 3968c2ecf20Sopenharmony_ci mtspr 256,$vrsave 3978c2ecf20Sopenharmony_ci stw $rounds,0($out) 3988c2ecf20Sopenharmony_ci 3998c2ecf20Sopenharmony_ciLenc_key_abort: 4008c2ecf20Sopenharmony_ci mr r3,$ptr 4018c2ecf20Sopenharmony_ci blr 4028c2ecf20Sopenharmony_ci .long 0 4038c2ecf20Sopenharmony_ci .byte 0,12,0x14,1,0,0,3,0 4048c2ecf20Sopenharmony_ci .long 0 4058c2ecf20Sopenharmony_ci.size .${prefix}_set_encrypt_key,.-.${prefix}_set_encrypt_key 4068c2ecf20Sopenharmony_ci 4078c2ecf20Sopenharmony_ci.globl .${prefix}_set_decrypt_key 4088c2ecf20Sopenharmony_ci $STU $sp,-$FRAME($sp) 4098c2ecf20Sopenharmony_ci mflr r10 4108c2ecf20Sopenharmony_ci $PUSH r10,$FRAME+$LRSAVE($sp) 4118c2ecf20Sopenharmony_ci bl Lset_encrypt_key 4128c2ecf20Sopenharmony_ci mtlr r10 4138c2ecf20Sopenharmony_ci 4148c2ecf20Sopenharmony_ci cmpwi r3,0 4158c2ecf20Sopenharmony_ci bne- Ldec_key_abort 4168c2ecf20Sopenharmony_ci 4178c2ecf20Sopenharmony_ci slwi $cnt,$rounds,4 4188c2ecf20Sopenharmony_ci subi $inp,$out,240 # first round key 4198c2ecf20Sopenharmony_ci srwi $rounds,$rounds,1 4208c2ecf20Sopenharmony_ci add $out,$inp,$cnt # last round key 4218c2ecf20Sopenharmony_ci mtctr $rounds 4228c2ecf20Sopenharmony_ci 4238c2ecf20Sopenharmony_ciLdeckey: 4248c2ecf20Sopenharmony_ci lwz r0, 0($inp) 4258c2ecf20Sopenharmony_ci lwz r6, 4($inp) 4268c2ecf20Sopenharmony_ci lwz r7, 8($inp) 4278c2ecf20Sopenharmony_ci lwz r8, 12($inp) 4288c2ecf20Sopenharmony_ci addi $inp,$inp,16 4298c2ecf20Sopenharmony_ci lwz r9, 0($out) 4308c2ecf20Sopenharmony_ci lwz r10,4($out) 4318c2ecf20Sopenharmony_ci lwz r11,8($out) 4328c2ecf20Sopenharmony_ci lwz r12,12($out) 4338c2ecf20Sopenharmony_ci stw r0, 0($out) 4348c2ecf20Sopenharmony_ci stw r6, 4($out) 4358c2ecf20Sopenharmony_ci stw r7, 8($out) 4368c2ecf20Sopenharmony_ci stw r8, 12($out) 4378c2ecf20Sopenharmony_ci subi $out,$out,16 4388c2ecf20Sopenharmony_ci stw r9, -16($inp) 4398c2ecf20Sopenharmony_ci stw r10,-12($inp) 4408c2ecf20Sopenharmony_ci stw r11,-8($inp) 4418c2ecf20Sopenharmony_ci stw r12,-4($inp) 4428c2ecf20Sopenharmony_ci bdnz Ldeckey 4438c2ecf20Sopenharmony_ci 4448c2ecf20Sopenharmony_ci xor r3,r3,r3 # return value 4458c2ecf20Sopenharmony_ciLdec_key_abort: 4468c2ecf20Sopenharmony_ci addi $sp,$sp,$FRAME 4478c2ecf20Sopenharmony_ci blr 4488c2ecf20Sopenharmony_ci .long 0 4498c2ecf20Sopenharmony_ci .byte 0,12,4,1,0x80,0,3,0 4508c2ecf20Sopenharmony_ci .long 0 4518c2ecf20Sopenharmony_ci.size .${prefix}_set_decrypt_key,.-.${prefix}_set_decrypt_key 4528c2ecf20Sopenharmony_ci___ 4538c2ecf20Sopenharmony_ci}}} 4548c2ecf20Sopenharmony_ci######################################################################### 4558c2ecf20Sopenharmony_ci{{{ # Single block en- and decrypt procedures # 4568c2ecf20Sopenharmony_cisub gen_block () { 4578c2ecf20Sopenharmony_cimy $dir = shift; 4588c2ecf20Sopenharmony_cimy $n = $dir eq "de" ? "n" : ""; 4598c2ecf20Sopenharmony_cimy ($inp,$out,$key,$rounds,$idx)=map("r$_",(3..7)); 4608c2ecf20Sopenharmony_ci 4618c2ecf20Sopenharmony_ci$code.=<<___; 4628c2ecf20Sopenharmony_ci.globl .${prefix}_${dir}crypt 4638c2ecf20Sopenharmony_ci lwz $rounds,240($key) 4648c2ecf20Sopenharmony_ci lis r0,0xfc00 4658c2ecf20Sopenharmony_ci mfspr $vrsave,256 4668c2ecf20Sopenharmony_ci li $idx,15 # 15 is not typo 4678c2ecf20Sopenharmony_ci mtspr 256,r0 4688c2ecf20Sopenharmony_ci 4698c2ecf20Sopenharmony_ci lvx v0,0,$inp 4708c2ecf20Sopenharmony_ci neg r11,$out 4718c2ecf20Sopenharmony_ci lvx v1,$idx,$inp 4728c2ecf20Sopenharmony_ci lvsl v2,0,$inp # inpperm 4738c2ecf20Sopenharmony_ci le?vspltisb v4,0x0f 4748c2ecf20Sopenharmony_ci ?lvsl v3,0,r11 # outperm 4758c2ecf20Sopenharmony_ci le?vxor v2,v2,v4 4768c2ecf20Sopenharmony_ci li $idx,16 4778c2ecf20Sopenharmony_ci vperm v0,v0,v1,v2 # align [and byte swap in LE] 4788c2ecf20Sopenharmony_ci lvx v1,0,$key 4798c2ecf20Sopenharmony_ci ?lvsl v5,0,$key # keyperm 4808c2ecf20Sopenharmony_ci srwi $rounds,$rounds,1 4818c2ecf20Sopenharmony_ci lvx v2,$idx,$key 4828c2ecf20Sopenharmony_ci addi $idx,$idx,16 4838c2ecf20Sopenharmony_ci subi $rounds,$rounds,1 4848c2ecf20Sopenharmony_ci ?vperm v1,v1,v2,v5 # align round key 4858c2ecf20Sopenharmony_ci 4868c2ecf20Sopenharmony_ci vxor v0,v0,v1 4878c2ecf20Sopenharmony_ci lvx v1,$idx,$key 4888c2ecf20Sopenharmony_ci addi $idx,$idx,16 4898c2ecf20Sopenharmony_ci mtctr $rounds 4908c2ecf20Sopenharmony_ci 4918c2ecf20Sopenharmony_ciLoop_${dir}c: 4928c2ecf20Sopenharmony_ci ?vperm v2,v2,v1,v5 4938c2ecf20Sopenharmony_ci v${n}cipher v0,v0,v2 4948c2ecf20Sopenharmony_ci lvx v2,$idx,$key 4958c2ecf20Sopenharmony_ci addi $idx,$idx,16 4968c2ecf20Sopenharmony_ci ?vperm v1,v1,v2,v5 4978c2ecf20Sopenharmony_ci v${n}cipher v0,v0,v1 4988c2ecf20Sopenharmony_ci lvx v1,$idx,$key 4998c2ecf20Sopenharmony_ci addi $idx,$idx,16 5008c2ecf20Sopenharmony_ci bdnz Loop_${dir}c 5018c2ecf20Sopenharmony_ci 5028c2ecf20Sopenharmony_ci ?vperm v2,v2,v1,v5 5038c2ecf20Sopenharmony_ci v${n}cipher v0,v0,v2 5048c2ecf20Sopenharmony_ci lvx v2,$idx,$key 5058c2ecf20Sopenharmony_ci ?vperm v1,v1,v2,v5 5068c2ecf20Sopenharmony_ci v${n}cipherlast v0,v0,v1 5078c2ecf20Sopenharmony_ci 5088c2ecf20Sopenharmony_ci vspltisb v2,-1 5098c2ecf20Sopenharmony_ci vxor v1,v1,v1 5108c2ecf20Sopenharmony_ci li $idx,15 # 15 is not typo 5118c2ecf20Sopenharmony_ci ?vperm v2,v1,v2,v3 # outmask 5128c2ecf20Sopenharmony_ci le?vxor v3,v3,v4 5138c2ecf20Sopenharmony_ci lvx v1,0,$out # outhead 5148c2ecf20Sopenharmony_ci vperm v0,v0,v0,v3 # rotate [and byte swap in LE] 5158c2ecf20Sopenharmony_ci vsel v1,v1,v0,v2 5168c2ecf20Sopenharmony_ci lvx v4,$idx,$out 5178c2ecf20Sopenharmony_ci stvx v1,0,$out 5188c2ecf20Sopenharmony_ci vsel v0,v0,v4,v2 5198c2ecf20Sopenharmony_ci stvx v0,$idx,$out 5208c2ecf20Sopenharmony_ci 5218c2ecf20Sopenharmony_ci mtspr 256,$vrsave 5228c2ecf20Sopenharmony_ci blr 5238c2ecf20Sopenharmony_ci .long 0 5248c2ecf20Sopenharmony_ci .byte 0,12,0x14,0,0,0,3,0 5258c2ecf20Sopenharmony_ci .long 0 5268c2ecf20Sopenharmony_ci.size .${prefix}_${dir}crypt,.-.${prefix}_${dir}crypt 5278c2ecf20Sopenharmony_ci___ 5288c2ecf20Sopenharmony_ci} 5298c2ecf20Sopenharmony_ci&gen_block("en"); 5308c2ecf20Sopenharmony_ci&gen_block("de"); 5318c2ecf20Sopenharmony_ci}}} 5328c2ecf20Sopenharmony_ci######################################################################### 5338c2ecf20Sopenharmony_ci{{{ # CBC en- and decrypt procedures # 5348c2ecf20Sopenharmony_cimy ($inp,$out,$len,$key,$ivp,$enc,$rounds,$idx)=map("r$_",(3..10)); 5358c2ecf20Sopenharmony_cimy ($rndkey0,$rndkey1,$inout,$tmp)= map("v$_",(0..3)); 5368c2ecf20Sopenharmony_cimy ($ivec,$inptail,$inpperm,$outhead,$outperm,$outmask,$keyperm)= 5378c2ecf20Sopenharmony_ci map("v$_",(4..10)); 5388c2ecf20Sopenharmony_ci$code.=<<___; 5398c2ecf20Sopenharmony_ci.globl .${prefix}_cbc_encrypt 5408c2ecf20Sopenharmony_ci ${UCMP}i $len,16 5418c2ecf20Sopenharmony_ci bltlr- 5428c2ecf20Sopenharmony_ci 5438c2ecf20Sopenharmony_ci cmpwi $enc,0 # test direction 5448c2ecf20Sopenharmony_ci lis r0,0xffe0 5458c2ecf20Sopenharmony_ci mfspr $vrsave,256 5468c2ecf20Sopenharmony_ci mtspr 256,r0 5478c2ecf20Sopenharmony_ci 5488c2ecf20Sopenharmony_ci li $idx,15 5498c2ecf20Sopenharmony_ci vxor $rndkey0,$rndkey0,$rndkey0 5508c2ecf20Sopenharmony_ci le?vspltisb $tmp,0x0f 5518c2ecf20Sopenharmony_ci 5528c2ecf20Sopenharmony_ci lvx $ivec,0,$ivp # load [unaligned] iv 5538c2ecf20Sopenharmony_ci lvsl $inpperm,0,$ivp 5548c2ecf20Sopenharmony_ci lvx $inptail,$idx,$ivp 5558c2ecf20Sopenharmony_ci le?vxor $inpperm,$inpperm,$tmp 5568c2ecf20Sopenharmony_ci vperm $ivec,$ivec,$inptail,$inpperm 5578c2ecf20Sopenharmony_ci 5588c2ecf20Sopenharmony_ci neg r11,$inp 5598c2ecf20Sopenharmony_ci ?lvsl $keyperm,0,$key # prepare for unaligned key 5608c2ecf20Sopenharmony_ci lwz $rounds,240($key) 5618c2ecf20Sopenharmony_ci 5628c2ecf20Sopenharmony_ci lvsr $inpperm,0,r11 # prepare for unaligned load 5638c2ecf20Sopenharmony_ci lvx $inptail,0,$inp 5648c2ecf20Sopenharmony_ci addi $inp,$inp,15 # 15 is not typo 5658c2ecf20Sopenharmony_ci le?vxor $inpperm,$inpperm,$tmp 5668c2ecf20Sopenharmony_ci 5678c2ecf20Sopenharmony_ci ?lvsr $outperm,0,$out # prepare for unaligned store 5688c2ecf20Sopenharmony_ci vspltisb $outmask,-1 5698c2ecf20Sopenharmony_ci lvx $outhead,0,$out 5708c2ecf20Sopenharmony_ci ?vperm $outmask,$rndkey0,$outmask,$outperm 5718c2ecf20Sopenharmony_ci le?vxor $outperm,$outperm,$tmp 5728c2ecf20Sopenharmony_ci 5738c2ecf20Sopenharmony_ci srwi $rounds,$rounds,1 5748c2ecf20Sopenharmony_ci li $idx,16 5758c2ecf20Sopenharmony_ci subi $rounds,$rounds,1 5768c2ecf20Sopenharmony_ci beq Lcbc_dec 5778c2ecf20Sopenharmony_ci 5788c2ecf20Sopenharmony_ciLcbc_enc: 5798c2ecf20Sopenharmony_ci vmr $inout,$inptail 5808c2ecf20Sopenharmony_ci lvx $inptail,0,$inp 5818c2ecf20Sopenharmony_ci addi $inp,$inp,16 5828c2ecf20Sopenharmony_ci mtctr $rounds 5838c2ecf20Sopenharmony_ci subi $len,$len,16 # len-=16 5848c2ecf20Sopenharmony_ci 5858c2ecf20Sopenharmony_ci lvx $rndkey0,0,$key 5868c2ecf20Sopenharmony_ci vperm $inout,$inout,$inptail,$inpperm 5878c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key 5888c2ecf20Sopenharmony_ci addi $idx,$idx,16 5898c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 5908c2ecf20Sopenharmony_ci vxor $inout,$inout,$rndkey0 5918c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key 5928c2ecf20Sopenharmony_ci addi $idx,$idx,16 5938c2ecf20Sopenharmony_ci vxor $inout,$inout,$ivec 5948c2ecf20Sopenharmony_ci 5958c2ecf20Sopenharmony_ciLoop_cbc_enc: 5968c2ecf20Sopenharmony_ci ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm 5978c2ecf20Sopenharmony_ci vcipher $inout,$inout,$rndkey1 5988c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key 5998c2ecf20Sopenharmony_ci addi $idx,$idx,16 6008c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 6018c2ecf20Sopenharmony_ci vcipher $inout,$inout,$rndkey0 6028c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key 6038c2ecf20Sopenharmony_ci addi $idx,$idx,16 6048c2ecf20Sopenharmony_ci bdnz Loop_cbc_enc 6058c2ecf20Sopenharmony_ci 6068c2ecf20Sopenharmony_ci ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm 6078c2ecf20Sopenharmony_ci vcipher $inout,$inout,$rndkey1 6088c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key 6098c2ecf20Sopenharmony_ci li $idx,16 6108c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 6118c2ecf20Sopenharmony_ci vcipherlast $ivec,$inout,$rndkey0 6128c2ecf20Sopenharmony_ci ${UCMP}i $len,16 6138c2ecf20Sopenharmony_ci 6148c2ecf20Sopenharmony_ci vperm $tmp,$ivec,$ivec,$outperm 6158c2ecf20Sopenharmony_ci vsel $inout,$outhead,$tmp,$outmask 6168c2ecf20Sopenharmony_ci vmr $outhead,$tmp 6178c2ecf20Sopenharmony_ci stvx $inout,0,$out 6188c2ecf20Sopenharmony_ci addi $out,$out,16 6198c2ecf20Sopenharmony_ci bge Lcbc_enc 6208c2ecf20Sopenharmony_ci 6218c2ecf20Sopenharmony_ci b Lcbc_done 6228c2ecf20Sopenharmony_ci 6238c2ecf20Sopenharmony_ci.align 4 6248c2ecf20Sopenharmony_ciLcbc_dec: 6258c2ecf20Sopenharmony_ci ${UCMP}i $len,128 6268c2ecf20Sopenharmony_ci bge _aesp8_cbc_decrypt8x 6278c2ecf20Sopenharmony_ci vmr $tmp,$inptail 6288c2ecf20Sopenharmony_ci lvx $inptail,0,$inp 6298c2ecf20Sopenharmony_ci addi $inp,$inp,16 6308c2ecf20Sopenharmony_ci mtctr $rounds 6318c2ecf20Sopenharmony_ci subi $len,$len,16 # len-=16 6328c2ecf20Sopenharmony_ci 6338c2ecf20Sopenharmony_ci lvx $rndkey0,0,$key 6348c2ecf20Sopenharmony_ci vperm $tmp,$tmp,$inptail,$inpperm 6358c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key 6368c2ecf20Sopenharmony_ci addi $idx,$idx,16 6378c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 6388c2ecf20Sopenharmony_ci vxor $inout,$tmp,$rndkey0 6398c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key 6408c2ecf20Sopenharmony_ci addi $idx,$idx,16 6418c2ecf20Sopenharmony_ci 6428c2ecf20Sopenharmony_ciLoop_cbc_dec: 6438c2ecf20Sopenharmony_ci ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm 6448c2ecf20Sopenharmony_ci vncipher $inout,$inout,$rndkey1 6458c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key 6468c2ecf20Sopenharmony_ci addi $idx,$idx,16 6478c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 6488c2ecf20Sopenharmony_ci vncipher $inout,$inout,$rndkey0 6498c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key 6508c2ecf20Sopenharmony_ci addi $idx,$idx,16 6518c2ecf20Sopenharmony_ci bdnz Loop_cbc_dec 6528c2ecf20Sopenharmony_ci 6538c2ecf20Sopenharmony_ci ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm 6548c2ecf20Sopenharmony_ci vncipher $inout,$inout,$rndkey1 6558c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key 6568c2ecf20Sopenharmony_ci li $idx,16 6578c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 6588c2ecf20Sopenharmony_ci vncipherlast $inout,$inout,$rndkey0 6598c2ecf20Sopenharmony_ci ${UCMP}i $len,16 6608c2ecf20Sopenharmony_ci 6618c2ecf20Sopenharmony_ci vxor $inout,$inout,$ivec 6628c2ecf20Sopenharmony_ci vmr $ivec,$tmp 6638c2ecf20Sopenharmony_ci vperm $tmp,$inout,$inout,$outperm 6648c2ecf20Sopenharmony_ci vsel $inout,$outhead,$tmp,$outmask 6658c2ecf20Sopenharmony_ci vmr $outhead,$tmp 6668c2ecf20Sopenharmony_ci stvx $inout,0,$out 6678c2ecf20Sopenharmony_ci addi $out,$out,16 6688c2ecf20Sopenharmony_ci bge Lcbc_dec 6698c2ecf20Sopenharmony_ci 6708c2ecf20Sopenharmony_ciLcbc_done: 6718c2ecf20Sopenharmony_ci addi $out,$out,-1 6728c2ecf20Sopenharmony_ci lvx $inout,0,$out # redundant in aligned case 6738c2ecf20Sopenharmony_ci vsel $inout,$outhead,$inout,$outmask 6748c2ecf20Sopenharmony_ci stvx $inout,0,$out 6758c2ecf20Sopenharmony_ci 6768c2ecf20Sopenharmony_ci neg $enc,$ivp # write [unaligned] iv 6778c2ecf20Sopenharmony_ci li $idx,15 # 15 is not typo 6788c2ecf20Sopenharmony_ci vxor $rndkey0,$rndkey0,$rndkey0 6798c2ecf20Sopenharmony_ci vspltisb $outmask,-1 6808c2ecf20Sopenharmony_ci le?vspltisb $tmp,0x0f 6818c2ecf20Sopenharmony_ci ?lvsl $outperm,0,$enc 6828c2ecf20Sopenharmony_ci ?vperm $outmask,$rndkey0,$outmask,$outperm 6838c2ecf20Sopenharmony_ci le?vxor $outperm,$outperm,$tmp 6848c2ecf20Sopenharmony_ci lvx $outhead,0,$ivp 6858c2ecf20Sopenharmony_ci vperm $ivec,$ivec,$ivec,$outperm 6868c2ecf20Sopenharmony_ci vsel $inout,$outhead,$ivec,$outmask 6878c2ecf20Sopenharmony_ci lvx $inptail,$idx,$ivp 6888c2ecf20Sopenharmony_ci stvx $inout,0,$ivp 6898c2ecf20Sopenharmony_ci vsel $inout,$ivec,$inptail,$outmask 6908c2ecf20Sopenharmony_ci stvx $inout,$idx,$ivp 6918c2ecf20Sopenharmony_ci 6928c2ecf20Sopenharmony_ci mtspr 256,$vrsave 6938c2ecf20Sopenharmony_ci blr 6948c2ecf20Sopenharmony_ci .long 0 6958c2ecf20Sopenharmony_ci .byte 0,12,0x14,0,0,0,6,0 6968c2ecf20Sopenharmony_ci .long 0 6978c2ecf20Sopenharmony_ci___ 6988c2ecf20Sopenharmony_ci######################################################################### 6998c2ecf20Sopenharmony_ci{{ # Optimized CBC decrypt procedure # 7008c2ecf20Sopenharmony_cimy $key_="r11"; 7018c2ecf20Sopenharmony_cimy ($x00,$x10,$x20,$x30,$x40,$x50,$x60,$x70)=map("r$_",(0,8,26..31)); 7028c2ecf20Sopenharmony_cimy ($in0, $in1, $in2, $in3, $in4, $in5, $in6, $in7 )=map("v$_",(0..3,10..13)); 7038c2ecf20Sopenharmony_cimy ($out0,$out1,$out2,$out3,$out4,$out5,$out6,$out7)=map("v$_",(14..21)); 7048c2ecf20Sopenharmony_cimy $rndkey0="v23"; # v24-v25 rotating buffer for first found keys 7058c2ecf20Sopenharmony_ci # v26-v31 last 6 round keys 7068c2ecf20Sopenharmony_cimy ($tmp,$keyperm)=($in3,$in4); # aliases with "caller", redundant assignment 7078c2ecf20Sopenharmony_ci 7088c2ecf20Sopenharmony_ci$code.=<<___; 7098c2ecf20Sopenharmony_ci.align 5 7108c2ecf20Sopenharmony_ci_aesp8_cbc_decrypt8x: 7118c2ecf20Sopenharmony_ci $STU $sp,-`($FRAME+21*16+6*$SIZE_T)`($sp) 7128c2ecf20Sopenharmony_ci li r10,`$FRAME+8*16+15` 7138c2ecf20Sopenharmony_ci li r11,`$FRAME+8*16+31` 7148c2ecf20Sopenharmony_ci stvx v20,r10,$sp # ABI says so 7158c2ecf20Sopenharmony_ci addi r10,r10,32 7168c2ecf20Sopenharmony_ci stvx v21,r11,$sp 7178c2ecf20Sopenharmony_ci addi r11,r11,32 7188c2ecf20Sopenharmony_ci stvx v22,r10,$sp 7198c2ecf20Sopenharmony_ci addi r10,r10,32 7208c2ecf20Sopenharmony_ci stvx v23,r11,$sp 7218c2ecf20Sopenharmony_ci addi r11,r11,32 7228c2ecf20Sopenharmony_ci stvx v24,r10,$sp 7238c2ecf20Sopenharmony_ci addi r10,r10,32 7248c2ecf20Sopenharmony_ci stvx v25,r11,$sp 7258c2ecf20Sopenharmony_ci addi r11,r11,32 7268c2ecf20Sopenharmony_ci stvx v26,r10,$sp 7278c2ecf20Sopenharmony_ci addi r10,r10,32 7288c2ecf20Sopenharmony_ci stvx v27,r11,$sp 7298c2ecf20Sopenharmony_ci addi r11,r11,32 7308c2ecf20Sopenharmony_ci stvx v28,r10,$sp 7318c2ecf20Sopenharmony_ci addi r10,r10,32 7328c2ecf20Sopenharmony_ci stvx v29,r11,$sp 7338c2ecf20Sopenharmony_ci addi r11,r11,32 7348c2ecf20Sopenharmony_ci stvx v30,r10,$sp 7358c2ecf20Sopenharmony_ci stvx v31,r11,$sp 7368c2ecf20Sopenharmony_ci li r0,-1 7378c2ecf20Sopenharmony_ci stw $vrsave,`$FRAME+21*16-4`($sp) # save vrsave 7388c2ecf20Sopenharmony_ci li $x10,0x10 7398c2ecf20Sopenharmony_ci $PUSH r26,`$FRAME+21*16+0*$SIZE_T`($sp) 7408c2ecf20Sopenharmony_ci li $x20,0x20 7418c2ecf20Sopenharmony_ci $PUSH r27,`$FRAME+21*16+1*$SIZE_T`($sp) 7428c2ecf20Sopenharmony_ci li $x30,0x30 7438c2ecf20Sopenharmony_ci $PUSH r28,`$FRAME+21*16+2*$SIZE_T`($sp) 7448c2ecf20Sopenharmony_ci li $x40,0x40 7458c2ecf20Sopenharmony_ci $PUSH r29,`$FRAME+21*16+3*$SIZE_T`($sp) 7468c2ecf20Sopenharmony_ci li $x50,0x50 7478c2ecf20Sopenharmony_ci $PUSH r30,`$FRAME+21*16+4*$SIZE_T`($sp) 7488c2ecf20Sopenharmony_ci li $x60,0x60 7498c2ecf20Sopenharmony_ci $PUSH r31,`$FRAME+21*16+5*$SIZE_T`($sp) 7508c2ecf20Sopenharmony_ci li $x70,0x70 7518c2ecf20Sopenharmony_ci mtspr 256,r0 7528c2ecf20Sopenharmony_ci 7538c2ecf20Sopenharmony_ci subi $rounds,$rounds,3 # -4 in total 7548c2ecf20Sopenharmony_ci subi $len,$len,128 # bias 7558c2ecf20Sopenharmony_ci 7568c2ecf20Sopenharmony_ci lvx $rndkey0,$x00,$key # load key schedule 7578c2ecf20Sopenharmony_ci lvx v30,$x10,$key 7588c2ecf20Sopenharmony_ci addi $key,$key,0x20 7598c2ecf20Sopenharmony_ci lvx v31,$x00,$key 7608c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,v30,$keyperm 7618c2ecf20Sopenharmony_ci addi $key_,$sp,$FRAME+15 7628c2ecf20Sopenharmony_ci mtctr $rounds 7638c2ecf20Sopenharmony_ci 7648c2ecf20Sopenharmony_ciLoad_cbc_dec_key: 7658c2ecf20Sopenharmony_ci ?vperm v24,v30,v31,$keyperm 7668c2ecf20Sopenharmony_ci lvx v30,$x10,$key 7678c2ecf20Sopenharmony_ci addi $key,$key,0x20 7688c2ecf20Sopenharmony_ci stvx v24,$x00,$key_ # off-load round[1] 7698c2ecf20Sopenharmony_ci ?vperm v25,v31,v30,$keyperm 7708c2ecf20Sopenharmony_ci lvx v31,$x00,$key 7718c2ecf20Sopenharmony_ci stvx v25,$x10,$key_ # off-load round[2] 7728c2ecf20Sopenharmony_ci addi $key_,$key_,0x20 7738c2ecf20Sopenharmony_ci bdnz Load_cbc_dec_key 7748c2ecf20Sopenharmony_ci 7758c2ecf20Sopenharmony_ci lvx v26,$x10,$key 7768c2ecf20Sopenharmony_ci ?vperm v24,v30,v31,$keyperm 7778c2ecf20Sopenharmony_ci lvx v27,$x20,$key 7788c2ecf20Sopenharmony_ci stvx v24,$x00,$key_ # off-load round[3] 7798c2ecf20Sopenharmony_ci ?vperm v25,v31,v26,$keyperm 7808c2ecf20Sopenharmony_ci lvx v28,$x30,$key 7818c2ecf20Sopenharmony_ci stvx v25,$x10,$key_ # off-load round[4] 7828c2ecf20Sopenharmony_ci addi $key_,$sp,$FRAME+15 # rewind $key_ 7838c2ecf20Sopenharmony_ci ?vperm v26,v26,v27,$keyperm 7848c2ecf20Sopenharmony_ci lvx v29,$x40,$key 7858c2ecf20Sopenharmony_ci ?vperm v27,v27,v28,$keyperm 7868c2ecf20Sopenharmony_ci lvx v30,$x50,$key 7878c2ecf20Sopenharmony_ci ?vperm v28,v28,v29,$keyperm 7888c2ecf20Sopenharmony_ci lvx v31,$x60,$key 7898c2ecf20Sopenharmony_ci ?vperm v29,v29,v30,$keyperm 7908c2ecf20Sopenharmony_ci lvx $out0,$x70,$key # borrow $out0 7918c2ecf20Sopenharmony_ci ?vperm v30,v30,v31,$keyperm 7928c2ecf20Sopenharmony_ci lvx v24,$x00,$key_ # pre-load round[1] 7938c2ecf20Sopenharmony_ci ?vperm v31,v31,$out0,$keyperm 7948c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # pre-load round[2] 7958c2ecf20Sopenharmony_ci 7968c2ecf20Sopenharmony_ci #lvx $inptail,0,$inp # "caller" already did this 7978c2ecf20Sopenharmony_ci #addi $inp,$inp,15 # 15 is not typo 7988c2ecf20Sopenharmony_ci subi $inp,$inp,15 # undo "caller" 7998c2ecf20Sopenharmony_ci 8008c2ecf20Sopenharmony_ci le?li $idx,8 8018c2ecf20Sopenharmony_ci lvx_u $in0,$x00,$inp # load first 8 "words" 8028c2ecf20Sopenharmony_ci le?lvsl $inpperm,0,$idx 8038c2ecf20Sopenharmony_ci le?vspltisb $tmp,0x0f 8048c2ecf20Sopenharmony_ci lvx_u $in1,$x10,$inp 8058c2ecf20Sopenharmony_ci le?vxor $inpperm,$inpperm,$tmp # transform for lvx_u/stvx_u 8068c2ecf20Sopenharmony_ci lvx_u $in2,$x20,$inp 8078c2ecf20Sopenharmony_ci le?vperm $in0,$in0,$in0,$inpperm 8088c2ecf20Sopenharmony_ci lvx_u $in3,$x30,$inp 8098c2ecf20Sopenharmony_ci le?vperm $in1,$in1,$in1,$inpperm 8108c2ecf20Sopenharmony_ci lvx_u $in4,$x40,$inp 8118c2ecf20Sopenharmony_ci le?vperm $in2,$in2,$in2,$inpperm 8128c2ecf20Sopenharmony_ci vxor $out0,$in0,$rndkey0 8138c2ecf20Sopenharmony_ci lvx_u $in5,$x50,$inp 8148c2ecf20Sopenharmony_ci le?vperm $in3,$in3,$in3,$inpperm 8158c2ecf20Sopenharmony_ci vxor $out1,$in1,$rndkey0 8168c2ecf20Sopenharmony_ci lvx_u $in6,$x60,$inp 8178c2ecf20Sopenharmony_ci le?vperm $in4,$in4,$in4,$inpperm 8188c2ecf20Sopenharmony_ci vxor $out2,$in2,$rndkey0 8198c2ecf20Sopenharmony_ci lvx_u $in7,$x70,$inp 8208c2ecf20Sopenharmony_ci addi $inp,$inp,0x80 8218c2ecf20Sopenharmony_ci le?vperm $in5,$in5,$in5,$inpperm 8228c2ecf20Sopenharmony_ci vxor $out3,$in3,$rndkey0 8238c2ecf20Sopenharmony_ci le?vperm $in6,$in6,$in6,$inpperm 8248c2ecf20Sopenharmony_ci vxor $out4,$in4,$rndkey0 8258c2ecf20Sopenharmony_ci le?vperm $in7,$in7,$in7,$inpperm 8268c2ecf20Sopenharmony_ci vxor $out5,$in5,$rndkey0 8278c2ecf20Sopenharmony_ci vxor $out6,$in6,$rndkey0 8288c2ecf20Sopenharmony_ci vxor $out7,$in7,$rndkey0 8298c2ecf20Sopenharmony_ci 8308c2ecf20Sopenharmony_ci mtctr $rounds 8318c2ecf20Sopenharmony_ci b Loop_cbc_dec8x 8328c2ecf20Sopenharmony_ci.align 5 8338c2ecf20Sopenharmony_ciLoop_cbc_dec8x: 8348c2ecf20Sopenharmony_ci vncipher $out0,$out0,v24 8358c2ecf20Sopenharmony_ci vncipher $out1,$out1,v24 8368c2ecf20Sopenharmony_ci vncipher $out2,$out2,v24 8378c2ecf20Sopenharmony_ci vncipher $out3,$out3,v24 8388c2ecf20Sopenharmony_ci vncipher $out4,$out4,v24 8398c2ecf20Sopenharmony_ci vncipher $out5,$out5,v24 8408c2ecf20Sopenharmony_ci vncipher $out6,$out6,v24 8418c2ecf20Sopenharmony_ci vncipher $out7,$out7,v24 8428c2ecf20Sopenharmony_ci lvx v24,$x20,$key_ # round[3] 8438c2ecf20Sopenharmony_ci addi $key_,$key_,0x20 8448c2ecf20Sopenharmony_ci 8458c2ecf20Sopenharmony_ci vncipher $out0,$out0,v25 8468c2ecf20Sopenharmony_ci vncipher $out1,$out1,v25 8478c2ecf20Sopenharmony_ci vncipher $out2,$out2,v25 8488c2ecf20Sopenharmony_ci vncipher $out3,$out3,v25 8498c2ecf20Sopenharmony_ci vncipher $out4,$out4,v25 8508c2ecf20Sopenharmony_ci vncipher $out5,$out5,v25 8518c2ecf20Sopenharmony_ci vncipher $out6,$out6,v25 8528c2ecf20Sopenharmony_ci vncipher $out7,$out7,v25 8538c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # round[4] 8548c2ecf20Sopenharmony_ci bdnz Loop_cbc_dec8x 8558c2ecf20Sopenharmony_ci 8568c2ecf20Sopenharmony_ci subic $len,$len,128 # $len-=128 8578c2ecf20Sopenharmony_ci vncipher $out0,$out0,v24 8588c2ecf20Sopenharmony_ci vncipher $out1,$out1,v24 8598c2ecf20Sopenharmony_ci vncipher $out2,$out2,v24 8608c2ecf20Sopenharmony_ci vncipher $out3,$out3,v24 8618c2ecf20Sopenharmony_ci vncipher $out4,$out4,v24 8628c2ecf20Sopenharmony_ci vncipher $out5,$out5,v24 8638c2ecf20Sopenharmony_ci vncipher $out6,$out6,v24 8648c2ecf20Sopenharmony_ci vncipher $out7,$out7,v24 8658c2ecf20Sopenharmony_ci 8668c2ecf20Sopenharmony_ci subfe. r0,r0,r0 # borrow?-1:0 8678c2ecf20Sopenharmony_ci vncipher $out0,$out0,v25 8688c2ecf20Sopenharmony_ci vncipher $out1,$out1,v25 8698c2ecf20Sopenharmony_ci vncipher $out2,$out2,v25 8708c2ecf20Sopenharmony_ci vncipher $out3,$out3,v25 8718c2ecf20Sopenharmony_ci vncipher $out4,$out4,v25 8728c2ecf20Sopenharmony_ci vncipher $out5,$out5,v25 8738c2ecf20Sopenharmony_ci vncipher $out6,$out6,v25 8748c2ecf20Sopenharmony_ci vncipher $out7,$out7,v25 8758c2ecf20Sopenharmony_ci 8768c2ecf20Sopenharmony_ci and r0,r0,$len 8778c2ecf20Sopenharmony_ci vncipher $out0,$out0,v26 8788c2ecf20Sopenharmony_ci vncipher $out1,$out1,v26 8798c2ecf20Sopenharmony_ci vncipher $out2,$out2,v26 8808c2ecf20Sopenharmony_ci vncipher $out3,$out3,v26 8818c2ecf20Sopenharmony_ci vncipher $out4,$out4,v26 8828c2ecf20Sopenharmony_ci vncipher $out5,$out5,v26 8838c2ecf20Sopenharmony_ci vncipher $out6,$out6,v26 8848c2ecf20Sopenharmony_ci vncipher $out7,$out7,v26 8858c2ecf20Sopenharmony_ci 8868c2ecf20Sopenharmony_ci add $inp,$inp,r0 # $inp is adjusted in such 8878c2ecf20Sopenharmony_ci # way that at exit from the 8888c2ecf20Sopenharmony_ci # loop inX-in7 are loaded 8898c2ecf20Sopenharmony_ci # with last "words" 8908c2ecf20Sopenharmony_ci vncipher $out0,$out0,v27 8918c2ecf20Sopenharmony_ci vncipher $out1,$out1,v27 8928c2ecf20Sopenharmony_ci vncipher $out2,$out2,v27 8938c2ecf20Sopenharmony_ci vncipher $out3,$out3,v27 8948c2ecf20Sopenharmony_ci vncipher $out4,$out4,v27 8958c2ecf20Sopenharmony_ci vncipher $out5,$out5,v27 8968c2ecf20Sopenharmony_ci vncipher $out6,$out6,v27 8978c2ecf20Sopenharmony_ci vncipher $out7,$out7,v27 8988c2ecf20Sopenharmony_ci 8998c2ecf20Sopenharmony_ci addi $key_,$sp,$FRAME+15 # rewind $key_ 9008c2ecf20Sopenharmony_ci vncipher $out0,$out0,v28 9018c2ecf20Sopenharmony_ci vncipher $out1,$out1,v28 9028c2ecf20Sopenharmony_ci vncipher $out2,$out2,v28 9038c2ecf20Sopenharmony_ci vncipher $out3,$out3,v28 9048c2ecf20Sopenharmony_ci vncipher $out4,$out4,v28 9058c2ecf20Sopenharmony_ci vncipher $out5,$out5,v28 9068c2ecf20Sopenharmony_ci vncipher $out6,$out6,v28 9078c2ecf20Sopenharmony_ci vncipher $out7,$out7,v28 9088c2ecf20Sopenharmony_ci lvx v24,$x00,$key_ # re-pre-load round[1] 9098c2ecf20Sopenharmony_ci 9108c2ecf20Sopenharmony_ci vncipher $out0,$out0,v29 9118c2ecf20Sopenharmony_ci vncipher $out1,$out1,v29 9128c2ecf20Sopenharmony_ci vncipher $out2,$out2,v29 9138c2ecf20Sopenharmony_ci vncipher $out3,$out3,v29 9148c2ecf20Sopenharmony_ci vncipher $out4,$out4,v29 9158c2ecf20Sopenharmony_ci vncipher $out5,$out5,v29 9168c2ecf20Sopenharmony_ci vncipher $out6,$out6,v29 9178c2ecf20Sopenharmony_ci vncipher $out7,$out7,v29 9188c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # re-pre-load round[2] 9198c2ecf20Sopenharmony_ci 9208c2ecf20Sopenharmony_ci vncipher $out0,$out0,v30 9218c2ecf20Sopenharmony_ci vxor $ivec,$ivec,v31 # xor with last round key 9228c2ecf20Sopenharmony_ci vncipher $out1,$out1,v30 9238c2ecf20Sopenharmony_ci vxor $in0,$in0,v31 9248c2ecf20Sopenharmony_ci vncipher $out2,$out2,v30 9258c2ecf20Sopenharmony_ci vxor $in1,$in1,v31 9268c2ecf20Sopenharmony_ci vncipher $out3,$out3,v30 9278c2ecf20Sopenharmony_ci vxor $in2,$in2,v31 9288c2ecf20Sopenharmony_ci vncipher $out4,$out4,v30 9298c2ecf20Sopenharmony_ci vxor $in3,$in3,v31 9308c2ecf20Sopenharmony_ci vncipher $out5,$out5,v30 9318c2ecf20Sopenharmony_ci vxor $in4,$in4,v31 9328c2ecf20Sopenharmony_ci vncipher $out6,$out6,v30 9338c2ecf20Sopenharmony_ci vxor $in5,$in5,v31 9348c2ecf20Sopenharmony_ci vncipher $out7,$out7,v30 9358c2ecf20Sopenharmony_ci vxor $in6,$in6,v31 9368c2ecf20Sopenharmony_ci 9378c2ecf20Sopenharmony_ci vncipherlast $out0,$out0,$ivec 9388c2ecf20Sopenharmony_ci vncipherlast $out1,$out1,$in0 9398c2ecf20Sopenharmony_ci lvx_u $in0,$x00,$inp # load next input block 9408c2ecf20Sopenharmony_ci vncipherlast $out2,$out2,$in1 9418c2ecf20Sopenharmony_ci lvx_u $in1,$x10,$inp 9428c2ecf20Sopenharmony_ci vncipherlast $out3,$out3,$in2 9438c2ecf20Sopenharmony_ci le?vperm $in0,$in0,$in0,$inpperm 9448c2ecf20Sopenharmony_ci lvx_u $in2,$x20,$inp 9458c2ecf20Sopenharmony_ci vncipherlast $out4,$out4,$in3 9468c2ecf20Sopenharmony_ci le?vperm $in1,$in1,$in1,$inpperm 9478c2ecf20Sopenharmony_ci lvx_u $in3,$x30,$inp 9488c2ecf20Sopenharmony_ci vncipherlast $out5,$out5,$in4 9498c2ecf20Sopenharmony_ci le?vperm $in2,$in2,$in2,$inpperm 9508c2ecf20Sopenharmony_ci lvx_u $in4,$x40,$inp 9518c2ecf20Sopenharmony_ci vncipherlast $out6,$out6,$in5 9528c2ecf20Sopenharmony_ci le?vperm $in3,$in3,$in3,$inpperm 9538c2ecf20Sopenharmony_ci lvx_u $in5,$x50,$inp 9548c2ecf20Sopenharmony_ci vncipherlast $out7,$out7,$in6 9558c2ecf20Sopenharmony_ci le?vperm $in4,$in4,$in4,$inpperm 9568c2ecf20Sopenharmony_ci lvx_u $in6,$x60,$inp 9578c2ecf20Sopenharmony_ci vmr $ivec,$in7 9588c2ecf20Sopenharmony_ci le?vperm $in5,$in5,$in5,$inpperm 9598c2ecf20Sopenharmony_ci lvx_u $in7,$x70,$inp 9608c2ecf20Sopenharmony_ci addi $inp,$inp,0x80 9618c2ecf20Sopenharmony_ci 9628c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$inpperm 9638c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$inpperm 9648c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out 9658c2ecf20Sopenharmony_ci le?vperm $in6,$in6,$in6,$inpperm 9668c2ecf20Sopenharmony_ci vxor $out0,$in0,$rndkey0 9678c2ecf20Sopenharmony_ci le?vperm $out2,$out2,$out2,$inpperm 9688c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 9698c2ecf20Sopenharmony_ci le?vperm $in7,$in7,$in7,$inpperm 9708c2ecf20Sopenharmony_ci vxor $out1,$in1,$rndkey0 9718c2ecf20Sopenharmony_ci le?vperm $out3,$out3,$out3,$inpperm 9728c2ecf20Sopenharmony_ci stvx_u $out2,$x20,$out 9738c2ecf20Sopenharmony_ci vxor $out2,$in2,$rndkey0 9748c2ecf20Sopenharmony_ci le?vperm $out4,$out4,$out4,$inpperm 9758c2ecf20Sopenharmony_ci stvx_u $out3,$x30,$out 9768c2ecf20Sopenharmony_ci vxor $out3,$in3,$rndkey0 9778c2ecf20Sopenharmony_ci le?vperm $out5,$out5,$out5,$inpperm 9788c2ecf20Sopenharmony_ci stvx_u $out4,$x40,$out 9798c2ecf20Sopenharmony_ci vxor $out4,$in4,$rndkey0 9808c2ecf20Sopenharmony_ci le?vperm $out6,$out6,$out6,$inpperm 9818c2ecf20Sopenharmony_ci stvx_u $out5,$x50,$out 9828c2ecf20Sopenharmony_ci vxor $out5,$in5,$rndkey0 9838c2ecf20Sopenharmony_ci le?vperm $out7,$out7,$out7,$inpperm 9848c2ecf20Sopenharmony_ci stvx_u $out6,$x60,$out 9858c2ecf20Sopenharmony_ci vxor $out6,$in6,$rndkey0 9868c2ecf20Sopenharmony_ci stvx_u $out7,$x70,$out 9878c2ecf20Sopenharmony_ci addi $out,$out,0x80 9888c2ecf20Sopenharmony_ci vxor $out7,$in7,$rndkey0 9898c2ecf20Sopenharmony_ci 9908c2ecf20Sopenharmony_ci mtctr $rounds 9918c2ecf20Sopenharmony_ci beq Loop_cbc_dec8x # did $len-=128 borrow? 9928c2ecf20Sopenharmony_ci 9938c2ecf20Sopenharmony_ci addic. $len,$len,128 9948c2ecf20Sopenharmony_ci beq Lcbc_dec8x_done 9958c2ecf20Sopenharmony_ci nop 9968c2ecf20Sopenharmony_ci nop 9978c2ecf20Sopenharmony_ci 9988c2ecf20Sopenharmony_ciLoop_cbc_dec8x_tail: # up to 7 "words" tail... 9998c2ecf20Sopenharmony_ci vncipher $out1,$out1,v24 10008c2ecf20Sopenharmony_ci vncipher $out2,$out2,v24 10018c2ecf20Sopenharmony_ci vncipher $out3,$out3,v24 10028c2ecf20Sopenharmony_ci vncipher $out4,$out4,v24 10038c2ecf20Sopenharmony_ci vncipher $out5,$out5,v24 10048c2ecf20Sopenharmony_ci vncipher $out6,$out6,v24 10058c2ecf20Sopenharmony_ci vncipher $out7,$out7,v24 10068c2ecf20Sopenharmony_ci lvx v24,$x20,$key_ # round[3] 10078c2ecf20Sopenharmony_ci addi $key_,$key_,0x20 10088c2ecf20Sopenharmony_ci 10098c2ecf20Sopenharmony_ci vncipher $out1,$out1,v25 10108c2ecf20Sopenharmony_ci vncipher $out2,$out2,v25 10118c2ecf20Sopenharmony_ci vncipher $out3,$out3,v25 10128c2ecf20Sopenharmony_ci vncipher $out4,$out4,v25 10138c2ecf20Sopenharmony_ci vncipher $out5,$out5,v25 10148c2ecf20Sopenharmony_ci vncipher $out6,$out6,v25 10158c2ecf20Sopenharmony_ci vncipher $out7,$out7,v25 10168c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # round[4] 10178c2ecf20Sopenharmony_ci bdnz Loop_cbc_dec8x_tail 10188c2ecf20Sopenharmony_ci 10198c2ecf20Sopenharmony_ci vncipher $out1,$out1,v24 10208c2ecf20Sopenharmony_ci vncipher $out2,$out2,v24 10218c2ecf20Sopenharmony_ci vncipher $out3,$out3,v24 10228c2ecf20Sopenharmony_ci vncipher $out4,$out4,v24 10238c2ecf20Sopenharmony_ci vncipher $out5,$out5,v24 10248c2ecf20Sopenharmony_ci vncipher $out6,$out6,v24 10258c2ecf20Sopenharmony_ci vncipher $out7,$out7,v24 10268c2ecf20Sopenharmony_ci 10278c2ecf20Sopenharmony_ci vncipher $out1,$out1,v25 10288c2ecf20Sopenharmony_ci vncipher $out2,$out2,v25 10298c2ecf20Sopenharmony_ci vncipher $out3,$out3,v25 10308c2ecf20Sopenharmony_ci vncipher $out4,$out4,v25 10318c2ecf20Sopenharmony_ci vncipher $out5,$out5,v25 10328c2ecf20Sopenharmony_ci vncipher $out6,$out6,v25 10338c2ecf20Sopenharmony_ci vncipher $out7,$out7,v25 10348c2ecf20Sopenharmony_ci 10358c2ecf20Sopenharmony_ci vncipher $out1,$out1,v26 10368c2ecf20Sopenharmony_ci vncipher $out2,$out2,v26 10378c2ecf20Sopenharmony_ci vncipher $out3,$out3,v26 10388c2ecf20Sopenharmony_ci vncipher $out4,$out4,v26 10398c2ecf20Sopenharmony_ci vncipher $out5,$out5,v26 10408c2ecf20Sopenharmony_ci vncipher $out6,$out6,v26 10418c2ecf20Sopenharmony_ci vncipher $out7,$out7,v26 10428c2ecf20Sopenharmony_ci 10438c2ecf20Sopenharmony_ci vncipher $out1,$out1,v27 10448c2ecf20Sopenharmony_ci vncipher $out2,$out2,v27 10458c2ecf20Sopenharmony_ci vncipher $out3,$out3,v27 10468c2ecf20Sopenharmony_ci vncipher $out4,$out4,v27 10478c2ecf20Sopenharmony_ci vncipher $out5,$out5,v27 10488c2ecf20Sopenharmony_ci vncipher $out6,$out6,v27 10498c2ecf20Sopenharmony_ci vncipher $out7,$out7,v27 10508c2ecf20Sopenharmony_ci 10518c2ecf20Sopenharmony_ci vncipher $out1,$out1,v28 10528c2ecf20Sopenharmony_ci vncipher $out2,$out2,v28 10538c2ecf20Sopenharmony_ci vncipher $out3,$out3,v28 10548c2ecf20Sopenharmony_ci vncipher $out4,$out4,v28 10558c2ecf20Sopenharmony_ci vncipher $out5,$out5,v28 10568c2ecf20Sopenharmony_ci vncipher $out6,$out6,v28 10578c2ecf20Sopenharmony_ci vncipher $out7,$out7,v28 10588c2ecf20Sopenharmony_ci 10598c2ecf20Sopenharmony_ci vncipher $out1,$out1,v29 10608c2ecf20Sopenharmony_ci vncipher $out2,$out2,v29 10618c2ecf20Sopenharmony_ci vncipher $out3,$out3,v29 10628c2ecf20Sopenharmony_ci vncipher $out4,$out4,v29 10638c2ecf20Sopenharmony_ci vncipher $out5,$out5,v29 10648c2ecf20Sopenharmony_ci vncipher $out6,$out6,v29 10658c2ecf20Sopenharmony_ci vncipher $out7,$out7,v29 10668c2ecf20Sopenharmony_ci 10678c2ecf20Sopenharmony_ci vncipher $out1,$out1,v30 10688c2ecf20Sopenharmony_ci vxor $ivec,$ivec,v31 # last round key 10698c2ecf20Sopenharmony_ci vncipher $out2,$out2,v30 10708c2ecf20Sopenharmony_ci vxor $in1,$in1,v31 10718c2ecf20Sopenharmony_ci vncipher $out3,$out3,v30 10728c2ecf20Sopenharmony_ci vxor $in2,$in2,v31 10738c2ecf20Sopenharmony_ci vncipher $out4,$out4,v30 10748c2ecf20Sopenharmony_ci vxor $in3,$in3,v31 10758c2ecf20Sopenharmony_ci vncipher $out5,$out5,v30 10768c2ecf20Sopenharmony_ci vxor $in4,$in4,v31 10778c2ecf20Sopenharmony_ci vncipher $out6,$out6,v30 10788c2ecf20Sopenharmony_ci vxor $in5,$in5,v31 10798c2ecf20Sopenharmony_ci vncipher $out7,$out7,v30 10808c2ecf20Sopenharmony_ci vxor $in6,$in6,v31 10818c2ecf20Sopenharmony_ci 10828c2ecf20Sopenharmony_ci cmplwi $len,32 # switch($len) 10838c2ecf20Sopenharmony_ci blt Lcbc_dec8x_one 10848c2ecf20Sopenharmony_ci nop 10858c2ecf20Sopenharmony_ci beq Lcbc_dec8x_two 10868c2ecf20Sopenharmony_ci cmplwi $len,64 10878c2ecf20Sopenharmony_ci blt Lcbc_dec8x_three 10888c2ecf20Sopenharmony_ci nop 10898c2ecf20Sopenharmony_ci beq Lcbc_dec8x_four 10908c2ecf20Sopenharmony_ci cmplwi $len,96 10918c2ecf20Sopenharmony_ci blt Lcbc_dec8x_five 10928c2ecf20Sopenharmony_ci nop 10938c2ecf20Sopenharmony_ci beq Lcbc_dec8x_six 10948c2ecf20Sopenharmony_ci 10958c2ecf20Sopenharmony_ciLcbc_dec8x_seven: 10968c2ecf20Sopenharmony_ci vncipherlast $out1,$out1,$ivec 10978c2ecf20Sopenharmony_ci vncipherlast $out2,$out2,$in1 10988c2ecf20Sopenharmony_ci vncipherlast $out3,$out3,$in2 10998c2ecf20Sopenharmony_ci vncipherlast $out4,$out4,$in3 11008c2ecf20Sopenharmony_ci vncipherlast $out5,$out5,$in4 11018c2ecf20Sopenharmony_ci vncipherlast $out6,$out6,$in5 11028c2ecf20Sopenharmony_ci vncipherlast $out7,$out7,$in6 11038c2ecf20Sopenharmony_ci vmr $ivec,$in7 11048c2ecf20Sopenharmony_ci 11058c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$inpperm 11068c2ecf20Sopenharmony_ci le?vperm $out2,$out2,$out2,$inpperm 11078c2ecf20Sopenharmony_ci stvx_u $out1,$x00,$out 11088c2ecf20Sopenharmony_ci le?vperm $out3,$out3,$out3,$inpperm 11098c2ecf20Sopenharmony_ci stvx_u $out2,$x10,$out 11108c2ecf20Sopenharmony_ci le?vperm $out4,$out4,$out4,$inpperm 11118c2ecf20Sopenharmony_ci stvx_u $out3,$x20,$out 11128c2ecf20Sopenharmony_ci le?vperm $out5,$out5,$out5,$inpperm 11138c2ecf20Sopenharmony_ci stvx_u $out4,$x30,$out 11148c2ecf20Sopenharmony_ci le?vperm $out6,$out6,$out6,$inpperm 11158c2ecf20Sopenharmony_ci stvx_u $out5,$x40,$out 11168c2ecf20Sopenharmony_ci le?vperm $out7,$out7,$out7,$inpperm 11178c2ecf20Sopenharmony_ci stvx_u $out6,$x50,$out 11188c2ecf20Sopenharmony_ci stvx_u $out7,$x60,$out 11198c2ecf20Sopenharmony_ci addi $out,$out,0x70 11208c2ecf20Sopenharmony_ci b Lcbc_dec8x_done 11218c2ecf20Sopenharmony_ci 11228c2ecf20Sopenharmony_ci.align 5 11238c2ecf20Sopenharmony_ciLcbc_dec8x_six: 11248c2ecf20Sopenharmony_ci vncipherlast $out2,$out2,$ivec 11258c2ecf20Sopenharmony_ci vncipherlast $out3,$out3,$in2 11268c2ecf20Sopenharmony_ci vncipherlast $out4,$out4,$in3 11278c2ecf20Sopenharmony_ci vncipherlast $out5,$out5,$in4 11288c2ecf20Sopenharmony_ci vncipherlast $out6,$out6,$in5 11298c2ecf20Sopenharmony_ci vncipherlast $out7,$out7,$in6 11308c2ecf20Sopenharmony_ci vmr $ivec,$in7 11318c2ecf20Sopenharmony_ci 11328c2ecf20Sopenharmony_ci le?vperm $out2,$out2,$out2,$inpperm 11338c2ecf20Sopenharmony_ci le?vperm $out3,$out3,$out3,$inpperm 11348c2ecf20Sopenharmony_ci stvx_u $out2,$x00,$out 11358c2ecf20Sopenharmony_ci le?vperm $out4,$out4,$out4,$inpperm 11368c2ecf20Sopenharmony_ci stvx_u $out3,$x10,$out 11378c2ecf20Sopenharmony_ci le?vperm $out5,$out5,$out5,$inpperm 11388c2ecf20Sopenharmony_ci stvx_u $out4,$x20,$out 11398c2ecf20Sopenharmony_ci le?vperm $out6,$out6,$out6,$inpperm 11408c2ecf20Sopenharmony_ci stvx_u $out5,$x30,$out 11418c2ecf20Sopenharmony_ci le?vperm $out7,$out7,$out7,$inpperm 11428c2ecf20Sopenharmony_ci stvx_u $out6,$x40,$out 11438c2ecf20Sopenharmony_ci stvx_u $out7,$x50,$out 11448c2ecf20Sopenharmony_ci addi $out,$out,0x60 11458c2ecf20Sopenharmony_ci b Lcbc_dec8x_done 11468c2ecf20Sopenharmony_ci 11478c2ecf20Sopenharmony_ci.align 5 11488c2ecf20Sopenharmony_ciLcbc_dec8x_five: 11498c2ecf20Sopenharmony_ci vncipherlast $out3,$out3,$ivec 11508c2ecf20Sopenharmony_ci vncipherlast $out4,$out4,$in3 11518c2ecf20Sopenharmony_ci vncipherlast $out5,$out5,$in4 11528c2ecf20Sopenharmony_ci vncipherlast $out6,$out6,$in5 11538c2ecf20Sopenharmony_ci vncipherlast $out7,$out7,$in6 11548c2ecf20Sopenharmony_ci vmr $ivec,$in7 11558c2ecf20Sopenharmony_ci 11568c2ecf20Sopenharmony_ci le?vperm $out3,$out3,$out3,$inpperm 11578c2ecf20Sopenharmony_ci le?vperm $out4,$out4,$out4,$inpperm 11588c2ecf20Sopenharmony_ci stvx_u $out3,$x00,$out 11598c2ecf20Sopenharmony_ci le?vperm $out5,$out5,$out5,$inpperm 11608c2ecf20Sopenharmony_ci stvx_u $out4,$x10,$out 11618c2ecf20Sopenharmony_ci le?vperm $out6,$out6,$out6,$inpperm 11628c2ecf20Sopenharmony_ci stvx_u $out5,$x20,$out 11638c2ecf20Sopenharmony_ci le?vperm $out7,$out7,$out7,$inpperm 11648c2ecf20Sopenharmony_ci stvx_u $out6,$x30,$out 11658c2ecf20Sopenharmony_ci stvx_u $out7,$x40,$out 11668c2ecf20Sopenharmony_ci addi $out,$out,0x50 11678c2ecf20Sopenharmony_ci b Lcbc_dec8x_done 11688c2ecf20Sopenharmony_ci 11698c2ecf20Sopenharmony_ci.align 5 11708c2ecf20Sopenharmony_ciLcbc_dec8x_four: 11718c2ecf20Sopenharmony_ci vncipherlast $out4,$out4,$ivec 11728c2ecf20Sopenharmony_ci vncipherlast $out5,$out5,$in4 11738c2ecf20Sopenharmony_ci vncipherlast $out6,$out6,$in5 11748c2ecf20Sopenharmony_ci vncipherlast $out7,$out7,$in6 11758c2ecf20Sopenharmony_ci vmr $ivec,$in7 11768c2ecf20Sopenharmony_ci 11778c2ecf20Sopenharmony_ci le?vperm $out4,$out4,$out4,$inpperm 11788c2ecf20Sopenharmony_ci le?vperm $out5,$out5,$out5,$inpperm 11798c2ecf20Sopenharmony_ci stvx_u $out4,$x00,$out 11808c2ecf20Sopenharmony_ci le?vperm $out6,$out6,$out6,$inpperm 11818c2ecf20Sopenharmony_ci stvx_u $out5,$x10,$out 11828c2ecf20Sopenharmony_ci le?vperm $out7,$out7,$out7,$inpperm 11838c2ecf20Sopenharmony_ci stvx_u $out6,$x20,$out 11848c2ecf20Sopenharmony_ci stvx_u $out7,$x30,$out 11858c2ecf20Sopenharmony_ci addi $out,$out,0x40 11868c2ecf20Sopenharmony_ci b Lcbc_dec8x_done 11878c2ecf20Sopenharmony_ci 11888c2ecf20Sopenharmony_ci.align 5 11898c2ecf20Sopenharmony_ciLcbc_dec8x_three: 11908c2ecf20Sopenharmony_ci vncipherlast $out5,$out5,$ivec 11918c2ecf20Sopenharmony_ci vncipherlast $out6,$out6,$in5 11928c2ecf20Sopenharmony_ci vncipherlast $out7,$out7,$in6 11938c2ecf20Sopenharmony_ci vmr $ivec,$in7 11948c2ecf20Sopenharmony_ci 11958c2ecf20Sopenharmony_ci le?vperm $out5,$out5,$out5,$inpperm 11968c2ecf20Sopenharmony_ci le?vperm $out6,$out6,$out6,$inpperm 11978c2ecf20Sopenharmony_ci stvx_u $out5,$x00,$out 11988c2ecf20Sopenharmony_ci le?vperm $out7,$out7,$out7,$inpperm 11998c2ecf20Sopenharmony_ci stvx_u $out6,$x10,$out 12008c2ecf20Sopenharmony_ci stvx_u $out7,$x20,$out 12018c2ecf20Sopenharmony_ci addi $out,$out,0x30 12028c2ecf20Sopenharmony_ci b Lcbc_dec8x_done 12038c2ecf20Sopenharmony_ci 12048c2ecf20Sopenharmony_ci.align 5 12058c2ecf20Sopenharmony_ciLcbc_dec8x_two: 12068c2ecf20Sopenharmony_ci vncipherlast $out6,$out6,$ivec 12078c2ecf20Sopenharmony_ci vncipherlast $out7,$out7,$in6 12088c2ecf20Sopenharmony_ci vmr $ivec,$in7 12098c2ecf20Sopenharmony_ci 12108c2ecf20Sopenharmony_ci le?vperm $out6,$out6,$out6,$inpperm 12118c2ecf20Sopenharmony_ci le?vperm $out7,$out7,$out7,$inpperm 12128c2ecf20Sopenharmony_ci stvx_u $out6,$x00,$out 12138c2ecf20Sopenharmony_ci stvx_u $out7,$x10,$out 12148c2ecf20Sopenharmony_ci addi $out,$out,0x20 12158c2ecf20Sopenharmony_ci b Lcbc_dec8x_done 12168c2ecf20Sopenharmony_ci 12178c2ecf20Sopenharmony_ci.align 5 12188c2ecf20Sopenharmony_ciLcbc_dec8x_one: 12198c2ecf20Sopenharmony_ci vncipherlast $out7,$out7,$ivec 12208c2ecf20Sopenharmony_ci vmr $ivec,$in7 12218c2ecf20Sopenharmony_ci 12228c2ecf20Sopenharmony_ci le?vperm $out7,$out7,$out7,$inpperm 12238c2ecf20Sopenharmony_ci stvx_u $out7,0,$out 12248c2ecf20Sopenharmony_ci addi $out,$out,0x10 12258c2ecf20Sopenharmony_ci 12268c2ecf20Sopenharmony_ciLcbc_dec8x_done: 12278c2ecf20Sopenharmony_ci le?vperm $ivec,$ivec,$ivec,$inpperm 12288c2ecf20Sopenharmony_ci stvx_u $ivec,0,$ivp # write [unaligned] iv 12298c2ecf20Sopenharmony_ci 12308c2ecf20Sopenharmony_ci li r10,`$FRAME+15` 12318c2ecf20Sopenharmony_ci li r11,`$FRAME+31` 12328c2ecf20Sopenharmony_ci stvx $inpperm,r10,$sp # wipe copies of round keys 12338c2ecf20Sopenharmony_ci addi r10,r10,32 12348c2ecf20Sopenharmony_ci stvx $inpperm,r11,$sp 12358c2ecf20Sopenharmony_ci addi r11,r11,32 12368c2ecf20Sopenharmony_ci stvx $inpperm,r10,$sp 12378c2ecf20Sopenharmony_ci addi r10,r10,32 12388c2ecf20Sopenharmony_ci stvx $inpperm,r11,$sp 12398c2ecf20Sopenharmony_ci addi r11,r11,32 12408c2ecf20Sopenharmony_ci stvx $inpperm,r10,$sp 12418c2ecf20Sopenharmony_ci addi r10,r10,32 12428c2ecf20Sopenharmony_ci stvx $inpperm,r11,$sp 12438c2ecf20Sopenharmony_ci addi r11,r11,32 12448c2ecf20Sopenharmony_ci stvx $inpperm,r10,$sp 12458c2ecf20Sopenharmony_ci addi r10,r10,32 12468c2ecf20Sopenharmony_ci stvx $inpperm,r11,$sp 12478c2ecf20Sopenharmony_ci addi r11,r11,32 12488c2ecf20Sopenharmony_ci 12498c2ecf20Sopenharmony_ci mtspr 256,$vrsave 12508c2ecf20Sopenharmony_ci lvx v20,r10,$sp # ABI says so 12518c2ecf20Sopenharmony_ci addi r10,r10,32 12528c2ecf20Sopenharmony_ci lvx v21,r11,$sp 12538c2ecf20Sopenharmony_ci addi r11,r11,32 12548c2ecf20Sopenharmony_ci lvx v22,r10,$sp 12558c2ecf20Sopenharmony_ci addi r10,r10,32 12568c2ecf20Sopenharmony_ci lvx v23,r11,$sp 12578c2ecf20Sopenharmony_ci addi r11,r11,32 12588c2ecf20Sopenharmony_ci lvx v24,r10,$sp 12598c2ecf20Sopenharmony_ci addi r10,r10,32 12608c2ecf20Sopenharmony_ci lvx v25,r11,$sp 12618c2ecf20Sopenharmony_ci addi r11,r11,32 12628c2ecf20Sopenharmony_ci lvx v26,r10,$sp 12638c2ecf20Sopenharmony_ci addi r10,r10,32 12648c2ecf20Sopenharmony_ci lvx v27,r11,$sp 12658c2ecf20Sopenharmony_ci addi r11,r11,32 12668c2ecf20Sopenharmony_ci lvx v28,r10,$sp 12678c2ecf20Sopenharmony_ci addi r10,r10,32 12688c2ecf20Sopenharmony_ci lvx v29,r11,$sp 12698c2ecf20Sopenharmony_ci addi r11,r11,32 12708c2ecf20Sopenharmony_ci lvx v30,r10,$sp 12718c2ecf20Sopenharmony_ci lvx v31,r11,$sp 12728c2ecf20Sopenharmony_ci $POP r26,`$FRAME+21*16+0*$SIZE_T`($sp) 12738c2ecf20Sopenharmony_ci $POP r27,`$FRAME+21*16+1*$SIZE_T`($sp) 12748c2ecf20Sopenharmony_ci $POP r28,`$FRAME+21*16+2*$SIZE_T`($sp) 12758c2ecf20Sopenharmony_ci $POP r29,`$FRAME+21*16+3*$SIZE_T`($sp) 12768c2ecf20Sopenharmony_ci $POP r30,`$FRAME+21*16+4*$SIZE_T`($sp) 12778c2ecf20Sopenharmony_ci $POP r31,`$FRAME+21*16+5*$SIZE_T`($sp) 12788c2ecf20Sopenharmony_ci addi $sp,$sp,`$FRAME+21*16+6*$SIZE_T` 12798c2ecf20Sopenharmony_ci blr 12808c2ecf20Sopenharmony_ci .long 0 12818c2ecf20Sopenharmony_ci .byte 0,12,0x14,0,0x80,6,6,0 12828c2ecf20Sopenharmony_ci .long 0 12838c2ecf20Sopenharmony_ci.size .${prefix}_cbc_encrypt,.-.${prefix}_cbc_encrypt 12848c2ecf20Sopenharmony_ci___ 12858c2ecf20Sopenharmony_ci}} }}} 12868c2ecf20Sopenharmony_ci 12878c2ecf20Sopenharmony_ci######################################################################### 12888c2ecf20Sopenharmony_ci{{{ # CTR procedure[s] # 12898c2ecf20Sopenharmony_ci 12908c2ecf20Sopenharmony_ci####################### WARNING: Here be dragons! ####################### 12918c2ecf20Sopenharmony_ci# 12928c2ecf20Sopenharmony_ci# This code is written as 'ctr32', based on a 32-bit counter used 12938c2ecf20Sopenharmony_ci# upstream. The kernel does *not* use a 32-bit counter. The kernel uses 12948c2ecf20Sopenharmony_ci# a 128-bit counter. 12958c2ecf20Sopenharmony_ci# 12968c2ecf20Sopenharmony_ci# This leads to subtle changes from the upstream code: the counter 12978c2ecf20Sopenharmony_ci# is incremented with vaddu_q_m rather than vaddu_w_m. This occurs in 12988c2ecf20Sopenharmony_ci# both the bulk (8 blocks at a time) path, and in the individual block 12998c2ecf20Sopenharmony_ci# path. Be aware of this when doing updates. 13008c2ecf20Sopenharmony_ci# 13018c2ecf20Sopenharmony_ci# See: 13028c2ecf20Sopenharmony_ci# 1d4aa0b4c181 ("crypto: vmx - Fixing AES-CTR counter bug") 13038c2ecf20Sopenharmony_ci# 009b30ac7444 ("crypto: vmx - CTR: always increment IV as quadword") 13048c2ecf20Sopenharmony_ci# https://github.com/openssl/openssl/pull/8942 13058c2ecf20Sopenharmony_ci# 13068c2ecf20Sopenharmony_ci######################################################################### 13078c2ecf20Sopenharmony_cimy ($inp,$out,$len,$key,$ivp,$x10,$rounds,$idx)=map("r$_",(3..10)); 13088c2ecf20Sopenharmony_cimy ($rndkey0,$rndkey1,$inout,$tmp)= map("v$_",(0..3)); 13098c2ecf20Sopenharmony_cimy ($ivec,$inptail,$inpperm,$outhead,$outperm,$outmask,$keyperm,$one)= 13108c2ecf20Sopenharmony_ci map("v$_",(4..11)); 13118c2ecf20Sopenharmony_cimy $dat=$tmp; 13128c2ecf20Sopenharmony_ci 13138c2ecf20Sopenharmony_ci$code.=<<___; 13148c2ecf20Sopenharmony_ci.globl .${prefix}_ctr32_encrypt_blocks 13158c2ecf20Sopenharmony_ci ${UCMP}i $len,1 13168c2ecf20Sopenharmony_ci bltlr- 13178c2ecf20Sopenharmony_ci 13188c2ecf20Sopenharmony_ci lis r0,0xfff0 13198c2ecf20Sopenharmony_ci mfspr $vrsave,256 13208c2ecf20Sopenharmony_ci mtspr 256,r0 13218c2ecf20Sopenharmony_ci 13228c2ecf20Sopenharmony_ci li $idx,15 13238c2ecf20Sopenharmony_ci vxor $rndkey0,$rndkey0,$rndkey0 13248c2ecf20Sopenharmony_ci le?vspltisb $tmp,0x0f 13258c2ecf20Sopenharmony_ci 13268c2ecf20Sopenharmony_ci lvx $ivec,0,$ivp # load [unaligned] iv 13278c2ecf20Sopenharmony_ci lvsl $inpperm,0,$ivp 13288c2ecf20Sopenharmony_ci lvx $inptail,$idx,$ivp 13298c2ecf20Sopenharmony_ci vspltisb $one,1 13308c2ecf20Sopenharmony_ci le?vxor $inpperm,$inpperm,$tmp 13318c2ecf20Sopenharmony_ci vperm $ivec,$ivec,$inptail,$inpperm 13328c2ecf20Sopenharmony_ci vsldoi $one,$rndkey0,$one,1 13338c2ecf20Sopenharmony_ci 13348c2ecf20Sopenharmony_ci neg r11,$inp 13358c2ecf20Sopenharmony_ci ?lvsl $keyperm,0,$key # prepare for unaligned key 13368c2ecf20Sopenharmony_ci lwz $rounds,240($key) 13378c2ecf20Sopenharmony_ci 13388c2ecf20Sopenharmony_ci lvsr $inpperm,0,r11 # prepare for unaligned load 13398c2ecf20Sopenharmony_ci lvx $inptail,0,$inp 13408c2ecf20Sopenharmony_ci addi $inp,$inp,15 # 15 is not typo 13418c2ecf20Sopenharmony_ci le?vxor $inpperm,$inpperm,$tmp 13428c2ecf20Sopenharmony_ci 13438c2ecf20Sopenharmony_ci srwi $rounds,$rounds,1 13448c2ecf20Sopenharmony_ci li $idx,16 13458c2ecf20Sopenharmony_ci subi $rounds,$rounds,1 13468c2ecf20Sopenharmony_ci 13478c2ecf20Sopenharmony_ci ${UCMP}i $len,8 13488c2ecf20Sopenharmony_ci bge _aesp8_ctr32_encrypt8x 13498c2ecf20Sopenharmony_ci 13508c2ecf20Sopenharmony_ci ?lvsr $outperm,0,$out # prepare for unaligned store 13518c2ecf20Sopenharmony_ci vspltisb $outmask,-1 13528c2ecf20Sopenharmony_ci lvx $outhead,0,$out 13538c2ecf20Sopenharmony_ci ?vperm $outmask,$rndkey0,$outmask,$outperm 13548c2ecf20Sopenharmony_ci le?vxor $outperm,$outperm,$tmp 13558c2ecf20Sopenharmony_ci 13568c2ecf20Sopenharmony_ci lvx $rndkey0,0,$key 13578c2ecf20Sopenharmony_ci mtctr $rounds 13588c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key 13598c2ecf20Sopenharmony_ci addi $idx,$idx,16 13608c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 13618c2ecf20Sopenharmony_ci vxor $inout,$ivec,$rndkey0 13628c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key 13638c2ecf20Sopenharmony_ci addi $idx,$idx,16 13648c2ecf20Sopenharmony_ci b Loop_ctr32_enc 13658c2ecf20Sopenharmony_ci 13668c2ecf20Sopenharmony_ci.align 5 13678c2ecf20Sopenharmony_ciLoop_ctr32_enc: 13688c2ecf20Sopenharmony_ci ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm 13698c2ecf20Sopenharmony_ci vcipher $inout,$inout,$rndkey1 13708c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key 13718c2ecf20Sopenharmony_ci addi $idx,$idx,16 13728c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 13738c2ecf20Sopenharmony_ci vcipher $inout,$inout,$rndkey0 13748c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key 13758c2ecf20Sopenharmony_ci addi $idx,$idx,16 13768c2ecf20Sopenharmony_ci bdnz Loop_ctr32_enc 13778c2ecf20Sopenharmony_ci 13788c2ecf20Sopenharmony_ci vadduqm $ivec,$ivec,$one # Kernel change for 128-bit 13798c2ecf20Sopenharmony_ci vmr $dat,$inptail 13808c2ecf20Sopenharmony_ci lvx $inptail,0,$inp 13818c2ecf20Sopenharmony_ci addi $inp,$inp,16 13828c2ecf20Sopenharmony_ci subic. $len,$len,1 # blocks-- 13838c2ecf20Sopenharmony_ci 13848c2ecf20Sopenharmony_ci ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm 13858c2ecf20Sopenharmony_ci vcipher $inout,$inout,$rndkey1 13868c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key 13878c2ecf20Sopenharmony_ci vperm $dat,$dat,$inptail,$inpperm 13888c2ecf20Sopenharmony_ci li $idx,16 13898c2ecf20Sopenharmony_ci ?vperm $rndkey1,$rndkey0,$rndkey1,$keyperm 13908c2ecf20Sopenharmony_ci lvx $rndkey0,0,$key 13918c2ecf20Sopenharmony_ci vxor $dat,$dat,$rndkey1 # last round key 13928c2ecf20Sopenharmony_ci vcipherlast $inout,$inout,$dat 13938c2ecf20Sopenharmony_ci 13948c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key 13958c2ecf20Sopenharmony_ci addi $idx,$idx,16 13968c2ecf20Sopenharmony_ci vperm $inout,$inout,$inout,$outperm 13978c2ecf20Sopenharmony_ci vsel $dat,$outhead,$inout,$outmask 13988c2ecf20Sopenharmony_ci mtctr $rounds 13998c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 14008c2ecf20Sopenharmony_ci vmr $outhead,$inout 14018c2ecf20Sopenharmony_ci vxor $inout,$ivec,$rndkey0 14028c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key 14038c2ecf20Sopenharmony_ci addi $idx,$idx,16 14048c2ecf20Sopenharmony_ci stvx $dat,0,$out 14058c2ecf20Sopenharmony_ci addi $out,$out,16 14068c2ecf20Sopenharmony_ci bne Loop_ctr32_enc 14078c2ecf20Sopenharmony_ci 14088c2ecf20Sopenharmony_ci addi $out,$out,-1 14098c2ecf20Sopenharmony_ci lvx $inout,0,$out # redundant in aligned case 14108c2ecf20Sopenharmony_ci vsel $inout,$outhead,$inout,$outmask 14118c2ecf20Sopenharmony_ci stvx $inout,0,$out 14128c2ecf20Sopenharmony_ci 14138c2ecf20Sopenharmony_ci mtspr 256,$vrsave 14148c2ecf20Sopenharmony_ci blr 14158c2ecf20Sopenharmony_ci .long 0 14168c2ecf20Sopenharmony_ci .byte 0,12,0x14,0,0,0,6,0 14178c2ecf20Sopenharmony_ci .long 0 14188c2ecf20Sopenharmony_ci___ 14198c2ecf20Sopenharmony_ci######################################################################### 14208c2ecf20Sopenharmony_ci{{ # Optimized CTR procedure # 14218c2ecf20Sopenharmony_cimy $key_="r11"; 14228c2ecf20Sopenharmony_cimy ($x00,$x10,$x20,$x30,$x40,$x50,$x60,$x70)=map("r$_",(0,8,26..31)); 14238c2ecf20Sopenharmony_cimy ($in0, $in1, $in2, $in3, $in4, $in5, $in6, $in7 )=map("v$_",(0..3,10,12..14)); 14248c2ecf20Sopenharmony_cimy ($out0,$out1,$out2,$out3,$out4,$out5,$out6,$out7)=map("v$_",(15..22)); 14258c2ecf20Sopenharmony_cimy $rndkey0="v23"; # v24-v25 rotating buffer for first found keys 14268c2ecf20Sopenharmony_ci # v26-v31 last 6 round keys 14278c2ecf20Sopenharmony_cimy ($tmp,$keyperm)=($in3,$in4); # aliases with "caller", redundant assignment 14288c2ecf20Sopenharmony_cimy ($two,$three,$four)=($outhead,$outperm,$outmask); 14298c2ecf20Sopenharmony_ci 14308c2ecf20Sopenharmony_ci$code.=<<___; 14318c2ecf20Sopenharmony_ci.align 5 14328c2ecf20Sopenharmony_ci_aesp8_ctr32_encrypt8x: 14338c2ecf20Sopenharmony_ci $STU $sp,-`($FRAME+21*16+6*$SIZE_T)`($sp) 14348c2ecf20Sopenharmony_ci li r10,`$FRAME+8*16+15` 14358c2ecf20Sopenharmony_ci li r11,`$FRAME+8*16+31` 14368c2ecf20Sopenharmony_ci stvx v20,r10,$sp # ABI says so 14378c2ecf20Sopenharmony_ci addi r10,r10,32 14388c2ecf20Sopenharmony_ci stvx v21,r11,$sp 14398c2ecf20Sopenharmony_ci addi r11,r11,32 14408c2ecf20Sopenharmony_ci stvx v22,r10,$sp 14418c2ecf20Sopenharmony_ci addi r10,r10,32 14428c2ecf20Sopenharmony_ci stvx v23,r11,$sp 14438c2ecf20Sopenharmony_ci addi r11,r11,32 14448c2ecf20Sopenharmony_ci stvx v24,r10,$sp 14458c2ecf20Sopenharmony_ci addi r10,r10,32 14468c2ecf20Sopenharmony_ci stvx v25,r11,$sp 14478c2ecf20Sopenharmony_ci addi r11,r11,32 14488c2ecf20Sopenharmony_ci stvx v26,r10,$sp 14498c2ecf20Sopenharmony_ci addi r10,r10,32 14508c2ecf20Sopenharmony_ci stvx v27,r11,$sp 14518c2ecf20Sopenharmony_ci addi r11,r11,32 14528c2ecf20Sopenharmony_ci stvx v28,r10,$sp 14538c2ecf20Sopenharmony_ci addi r10,r10,32 14548c2ecf20Sopenharmony_ci stvx v29,r11,$sp 14558c2ecf20Sopenharmony_ci addi r11,r11,32 14568c2ecf20Sopenharmony_ci stvx v30,r10,$sp 14578c2ecf20Sopenharmony_ci stvx v31,r11,$sp 14588c2ecf20Sopenharmony_ci li r0,-1 14598c2ecf20Sopenharmony_ci stw $vrsave,`$FRAME+21*16-4`($sp) # save vrsave 14608c2ecf20Sopenharmony_ci li $x10,0x10 14618c2ecf20Sopenharmony_ci $PUSH r26,`$FRAME+21*16+0*$SIZE_T`($sp) 14628c2ecf20Sopenharmony_ci li $x20,0x20 14638c2ecf20Sopenharmony_ci $PUSH r27,`$FRAME+21*16+1*$SIZE_T`($sp) 14648c2ecf20Sopenharmony_ci li $x30,0x30 14658c2ecf20Sopenharmony_ci $PUSH r28,`$FRAME+21*16+2*$SIZE_T`($sp) 14668c2ecf20Sopenharmony_ci li $x40,0x40 14678c2ecf20Sopenharmony_ci $PUSH r29,`$FRAME+21*16+3*$SIZE_T`($sp) 14688c2ecf20Sopenharmony_ci li $x50,0x50 14698c2ecf20Sopenharmony_ci $PUSH r30,`$FRAME+21*16+4*$SIZE_T`($sp) 14708c2ecf20Sopenharmony_ci li $x60,0x60 14718c2ecf20Sopenharmony_ci $PUSH r31,`$FRAME+21*16+5*$SIZE_T`($sp) 14728c2ecf20Sopenharmony_ci li $x70,0x70 14738c2ecf20Sopenharmony_ci mtspr 256,r0 14748c2ecf20Sopenharmony_ci 14758c2ecf20Sopenharmony_ci subi $rounds,$rounds,3 # -4 in total 14768c2ecf20Sopenharmony_ci 14778c2ecf20Sopenharmony_ci lvx $rndkey0,$x00,$key # load key schedule 14788c2ecf20Sopenharmony_ci lvx v30,$x10,$key 14798c2ecf20Sopenharmony_ci addi $key,$key,0x20 14808c2ecf20Sopenharmony_ci lvx v31,$x00,$key 14818c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,v30,$keyperm 14828c2ecf20Sopenharmony_ci addi $key_,$sp,$FRAME+15 14838c2ecf20Sopenharmony_ci mtctr $rounds 14848c2ecf20Sopenharmony_ci 14858c2ecf20Sopenharmony_ciLoad_ctr32_enc_key: 14868c2ecf20Sopenharmony_ci ?vperm v24,v30,v31,$keyperm 14878c2ecf20Sopenharmony_ci lvx v30,$x10,$key 14888c2ecf20Sopenharmony_ci addi $key,$key,0x20 14898c2ecf20Sopenharmony_ci stvx v24,$x00,$key_ # off-load round[1] 14908c2ecf20Sopenharmony_ci ?vperm v25,v31,v30,$keyperm 14918c2ecf20Sopenharmony_ci lvx v31,$x00,$key 14928c2ecf20Sopenharmony_ci stvx v25,$x10,$key_ # off-load round[2] 14938c2ecf20Sopenharmony_ci addi $key_,$key_,0x20 14948c2ecf20Sopenharmony_ci bdnz Load_ctr32_enc_key 14958c2ecf20Sopenharmony_ci 14968c2ecf20Sopenharmony_ci lvx v26,$x10,$key 14978c2ecf20Sopenharmony_ci ?vperm v24,v30,v31,$keyperm 14988c2ecf20Sopenharmony_ci lvx v27,$x20,$key 14998c2ecf20Sopenharmony_ci stvx v24,$x00,$key_ # off-load round[3] 15008c2ecf20Sopenharmony_ci ?vperm v25,v31,v26,$keyperm 15018c2ecf20Sopenharmony_ci lvx v28,$x30,$key 15028c2ecf20Sopenharmony_ci stvx v25,$x10,$key_ # off-load round[4] 15038c2ecf20Sopenharmony_ci addi $key_,$sp,$FRAME+15 # rewind $key_ 15048c2ecf20Sopenharmony_ci ?vperm v26,v26,v27,$keyperm 15058c2ecf20Sopenharmony_ci lvx v29,$x40,$key 15068c2ecf20Sopenharmony_ci ?vperm v27,v27,v28,$keyperm 15078c2ecf20Sopenharmony_ci lvx v30,$x50,$key 15088c2ecf20Sopenharmony_ci ?vperm v28,v28,v29,$keyperm 15098c2ecf20Sopenharmony_ci lvx v31,$x60,$key 15108c2ecf20Sopenharmony_ci ?vperm v29,v29,v30,$keyperm 15118c2ecf20Sopenharmony_ci lvx $out0,$x70,$key # borrow $out0 15128c2ecf20Sopenharmony_ci ?vperm v30,v30,v31,$keyperm 15138c2ecf20Sopenharmony_ci lvx v24,$x00,$key_ # pre-load round[1] 15148c2ecf20Sopenharmony_ci ?vperm v31,v31,$out0,$keyperm 15158c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # pre-load round[2] 15168c2ecf20Sopenharmony_ci 15178c2ecf20Sopenharmony_ci vadduqm $two,$one,$one 15188c2ecf20Sopenharmony_ci subi $inp,$inp,15 # undo "caller" 15198c2ecf20Sopenharmony_ci $SHL $len,$len,4 15208c2ecf20Sopenharmony_ci 15218c2ecf20Sopenharmony_ci vadduqm $out1,$ivec,$one # counter values ... 15228c2ecf20Sopenharmony_ci vadduqm $out2,$ivec,$two # (do all ctr adds as 128-bit) 15238c2ecf20Sopenharmony_ci vxor $out0,$ivec,$rndkey0 # ... xored with rndkey[0] 15248c2ecf20Sopenharmony_ci le?li $idx,8 15258c2ecf20Sopenharmony_ci vadduqm $out3,$out1,$two 15268c2ecf20Sopenharmony_ci vxor $out1,$out1,$rndkey0 15278c2ecf20Sopenharmony_ci le?lvsl $inpperm,0,$idx 15288c2ecf20Sopenharmony_ci vadduqm $out4,$out2,$two 15298c2ecf20Sopenharmony_ci vxor $out2,$out2,$rndkey0 15308c2ecf20Sopenharmony_ci le?vspltisb $tmp,0x0f 15318c2ecf20Sopenharmony_ci vadduqm $out5,$out3,$two 15328c2ecf20Sopenharmony_ci vxor $out3,$out3,$rndkey0 15338c2ecf20Sopenharmony_ci le?vxor $inpperm,$inpperm,$tmp # transform for lvx_u/stvx_u 15348c2ecf20Sopenharmony_ci vadduqm $out6,$out4,$two 15358c2ecf20Sopenharmony_ci vxor $out4,$out4,$rndkey0 15368c2ecf20Sopenharmony_ci vadduqm $out7,$out5,$two 15378c2ecf20Sopenharmony_ci vxor $out5,$out5,$rndkey0 15388c2ecf20Sopenharmony_ci vadduqm $ivec,$out6,$two # next counter value 15398c2ecf20Sopenharmony_ci vxor $out6,$out6,$rndkey0 15408c2ecf20Sopenharmony_ci vxor $out7,$out7,$rndkey0 15418c2ecf20Sopenharmony_ci 15428c2ecf20Sopenharmony_ci mtctr $rounds 15438c2ecf20Sopenharmony_ci b Loop_ctr32_enc8x 15448c2ecf20Sopenharmony_ci.align 5 15458c2ecf20Sopenharmony_ciLoop_ctr32_enc8x: 15468c2ecf20Sopenharmony_ci vcipher $out0,$out0,v24 15478c2ecf20Sopenharmony_ci vcipher $out1,$out1,v24 15488c2ecf20Sopenharmony_ci vcipher $out2,$out2,v24 15498c2ecf20Sopenharmony_ci vcipher $out3,$out3,v24 15508c2ecf20Sopenharmony_ci vcipher $out4,$out4,v24 15518c2ecf20Sopenharmony_ci vcipher $out5,$out5,v24 15528c2ecf20Sopenharmony_ci vcipher $out6,$out6,v24 15538c2ecf20Sopenharmony_ci vcipher $out7,$out7,v24 15548c2ecf20Sopenharmony_ciLoop_ctr32_enc8x_middle: 15558c2ecf20Sopenharmony_ci lvx v24,$x20,$key_ # round[3] 15568c2ecf20Sopenharmony_ci addi $key_,$key_,0x20 15578c2ecf20Sopenharmony_ci 15588c2ecf20Sopenharmony_ci vcipher $out0,$out0,v25 15598c2ecf20Sopenharmony_ci vcipher $out1,$out1,v25 15608c2ecf20Sopenharmony_ci vcipher $out2,$out2,v25 15618c2ecf20Sopenharmony_ci vcipher $out3,$out3,v25 15628c2ecf20Sopenharmony_ci vcipher $out4,$out4,v25 15638c2ecf20Sopenharmony_ci vcipher $out5,$out5,v25 15648c2ecf20Sopenharmony_ci vcipher $out6,$out6,v25 15658c2ecf20Sopenharmony_ci vcipher $out7,$out7,v25 15668c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # round[4] 15678c2ecf20Sopenharmony_ci bdnz Loop_ctr32_enc8x 15688c2ecf20Sopenharmony_ci 15698c2ecf20Sopenharmony_ci subic r11,$len,256 # $len-256, borrow $key_ 15708c2ecf20Sopenharmony_ci vcipher $out0,$out0,v24 15718c2ecf20Sopenharmony_ci vcipher $out1,$out1,v24 15728c2ecf20Sopenharmony_ci vcipher $out2,$out2,v24 15738c2ecf20Sopenharmony_ci vcipher $out3,$out3,v24 15748c2ecf20Sopenharmony_ci vcipher $out4,$out4,v24 15758c2ecf20Sopenharmony_ci vcipher $out5,$out5,v24 15768c2ecf20Sopenharmony_ci vcipher $out6,$out6,v24 15778c2ecf20Sopenharmony_ci vcipher $out7,$out7,v24 15788c2ecf20Sopenharmony_ci 15798c2ecf20Sopenharmony_ci subfe r0,r0,r0 # borrow?-1:0 15808c2ecf20Sopenharmony_ci vcipher $out0,$out0,v25 15818c2ecf20Sopenharmony_ci vcipher $out1,$out1,v25 15828c2ecf20Sopenharmony_ci vcipher $out2,$out2,v25 15838c2ecf20Sopenharmony_ci vcipher $out3,$out3,v25 15848c2ecf20Sopenharmony_ci vcipher $out4,$out4,v25 15858c2ecf20Sopenharmony_ci vcipher $out5,$out5,v25 15868c2ecf20Sopenharmony_ci vcipher $out6,$out6,v25 15878c2ecf20Sopenharmony_ci vcipher $out7,$out7,v25 15888c2ecf20Sopenharmony_ci 15898c2ecf20Sopenharmony_ci and r0,r0,r11 15908c2ecf20Sopenharmony_ci addi $key_,$sp,$FRAME+15 # rewind $key_ 15918c2ecf20Sopenharmony_ci vcipher $out0,$out0,v26 15928c2ecf20Sopenharmony_ci vcipher $out1,$out1,v26 15938c2ecf20Sopenharmony_ci vcipher $out2,$out2,v26 15948c2ecf20Sopenharmony_ci vcipher $out3,$out3,v26 15958c2ecf20Sopenharmony_ci vcipher $out4,$out4,v26 15968c2ecf20Sopenharmony_ci vcipher $out5,$out5,v26 15978c2ecf20Sopenharmony_ci vcipher $out6,$out6,v26 15988c2ecf20Sopenharmony_ci vcipher $out7,$out7,v26 15998c2ecf20Sopenharmony_ci lvx v24,$x00,$key_ # re-pre-load round[1] 16008c2ecf20Sopenharmony_ci 16018c2ecf20Sopenharmony_ci subic $len,$len,129 # $len-=129 16028c2ecf20Sopenharmony_ci vcipher $out0,$out0,v27 16038c2ecf20Sopenharmony_ci addi $len,$len,1 # $len-=128 really 16048c2ecf20Sopenharmony_ci vcipher $out1,$out1,v27 16058c2ecf20Sopenharmony_ci vcipher $out2,$out2,v27 16068c2ecf20Sopenharmony_ci vcipher $out3,$out3,v27 16078c2ecf20Sopenharmony_ci vcipher $out4,$out4,v27 16088c2ecf20Sopenharmony_ci vcipher $out5,$out5,v27 16098c2ecf20Sopenharmony_ci vcipher $out6,$out6,v27 16108c2ecf20Sopenharmony_ci vcipher $out7,$out7,v27 16118c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # re-pre-load round[2] 16128c2ecf20Sopenharmony_ci 16138c2ecf20Sopenharmony_ci vcipher $out0,$out0,v28 16148c2ecf20Sopenharmony_ci lvx_u $in0,$x00,$inp # load input 16158c2ecf20Sopenharmony_ci vcipher $out1,$out1,v28 16168c2ecf20Sopenharmony_ci lvx_u $in1,$x10,$inp 16178c2ecf20Sopenharmony_ci vcipher $out2,$out2,v28 16188c2ecf20Sopenharmony_ci lvx_u $in2,$x20,$inp 16198c2ecf20Sopenharmony_ci vcipher $out3,$out3,v28 16208c2ecf20Sopenharmony_ci lvx_u $in3,$x30,$inp 16218c2ecf20Sopenharmony_ci vcipher $out4,$out4,v28 16228c2ecf20Sopenharmony_ci lvx_u $in4,$x40,$inp 16238c2ecf20Sopenharmony_ci vcipher $out5,$out5,v28 16248c2ecf20Sopenharmony_ci lvx_u $in5,$x50,$inp 16258c2ecf20Sopenharmony_ci vcipher $out6,$out6,v28 16268c2ecf20Sopenharmony_ci lvx_u $in6,$x60,$inp 16278c2ecf20Sopenharmony_ci vcipher $out7,$out7,v28 16288c2ecf20Sopenharmony_ci lvx_u $in7,$x70,$inp 16298c2ecf20Sopenharmony_ci addi $inp,$inp,0x80 16308c2ecf20Sopenharmony_ci 16318c2ecf20Sopenharmony_ci vcipher $out0,$out0,v29 16328c2ecf20Sopenharmony_ci le?vperm $in0,$in0,$in0,$inpperm 16338c2ecf20Sopenharmony_ci vcipher $out1,$out1,v29 16348c2ecf20Sopenharmony_ci le?vperm $in1,$in1,$in1,$inpperm 16358c2ecf20Sopenharmony_ci vcipher $out2,$out2,v29 16368c2ecf20Sopenharmony_ci le?vperm $in2,$in2,$in2,$inpperm 16378c2ecf20Sopenharmony_ci vcipher $out3,$out3,v29 16388c2ecf20Sopenharmony_ci le?vperm $in3,$in3,$in3,$inpperm 16398c2ecf20Sopenharmony_ci vcipher $out4,$out4,v29 16408c2ecf20Sopenharmony_ci le?vperm $in4,$in4,$in4,$inpperm 16418c2ecf20Sopenharmony_ci vcipher $out5,$out5,v29 16428c2ecf20Sopenharmony_ci le?vperm $in5,$in5,$in5,$inpperm 16438c2ecf20Sopenharmony_ci vcipher $out6,$out6,v29 16448c2ecf20Sopenharmony_ci le?vperm $in6,$in6,$in6,$inpperm 16458c2ecf20Sopenharmony_ci vcipher $out7,$out7,v29 16468c2ecf20Sopenharmony_ci le?vperm $in7,$in7,$in7,$inpperm 16478c2ecf20Sopenharmony_ci 16488c2ecf20Sopenharmony_ci add $inp,$inp,r0 # $inp is adjusted in such 16498c2ecf20Sopenharmony_ci # way that at exit from the 16508c2ecf20Sopenharmony_ci # loop inX-in7 are loaded 16518c2ecf20Sopenharmony_ci # with last "words" 16528c2ecf20Sopenharmony_ci subfe. r0,r0,r0 # borrow?-1:0 16538c2ecf20Sopenharmony_ci vcipher $out0,$out0,v30 16548c2ecf20Sopenharmony_ci vxor $in0,$in0,v31 # xor with last round key 16558c2ecf20Sopenharmony_ci vcipher $out1,$out1,v30 16568c2ecf20Sopenharmony_ci vxor $in1,$in1,v31 16578c2ecf20Sopenharmony_ci vcipher $out2,$out2,v30 16588c2ecf20Sopenharmony_ci vxor $in2,$in2,v31 16598c2ecf20Sopenharmony_ci vcipher $out3,$out3,v30 16608c2ecf20Sopenharmony_ci vxor $in3,$in3,v31 16618c2ecf20Sopenharmony_ci vcipher $out4,$out4,v30 16628c2ecf20Sopenharmony_ci vxor $in4,$in4,v31 16638c2ecf20Sopenharmony_ci vcipher $out5,$out5,v30 16648c2ecf20Sopenharmony_ci vxor $in5,$in5,v31 16658c2ecf20Sopenharmony_ci vcipher $out6,$out6,v30 16668c2ecf20Sopenharmony_ci vxor $in6,$in6,v31 16678c2ecf20Sopenharmony_ci vcipher $out7,$out7,v30 16688c2ecf20Sopenharmony_ci vxor $in7,$in7,v31 16698c2ecf20Sopenharmony_ci 16708c2ecf20Sopenharmony_ci bne Lctr32_enc8x_break # did $len-129 borrow? 16718c2ecf20Sopenharmony_ci 16728c2ecf20Sopenharmony_ci vcipherlast $in0,$out0,$in0 16738c2ecf20Sopenharmony_ci vcipherlast $in1,$out1,$in1 16748c2ecf20Sopenharmony_ci vadduqm $out1,$ivec,$one # counter values ... 16758c2ecf20Sopenharmony_ci vcipherlast $in2,$out2,$in2 16768c2ecf20Sopenharmony_ci vadduqm $out2,$ivec,$two 16778c2ecf20Sopenharmony_ci vxor $out0,$ivec,$rndkey0 # ... xored with rndkey[0] 16788c2ecf20Sopenharmony_ci vcipherlast $in3,$out3,$in3 16798c2ecf20Sopenharmony_ci vadduqm $out3,$out1,$two 16808c2ecf20Sopenharmony_ci vxor $out1,$out1,$rndkey0 16818c2ecf20Sopenharmony_ci vcipherlast $in4,$out4,$in4 16828c2ecf20Sopenharmony_ci vadduqm $out4,$out2,$two 16838c2ecf20Sopenharmony_ci vxor $out2,$out2,$rndkey0 16848c2ecf20Sopenharmony_ci vcipherlast $in5,$out5,$in5 16858c2ecf20Sopenharmony_ci vadduqm $out5,$out3,$two 16868c2ecf20Sopenharmony_ci vxor $out3,$out3,$rndkey0 16878c2ecf20Sopenharmony_ci vcipherlast $in6,$out6,$in6 16888c2ecf20Sopenharmony_ci vadduqm $out6,$out4,$two 16898c2ecf20Sopenharmony_ci vxor $out4,$out4,$rndkey0 16908c2ecf20Sopenharmony_ci vcipherlast $in7,$out7,$in7 16918c2ecf20Sopenharmony_ci vadduqm $out7,$out5,$two 16928c2ecf20Sopenharmony_ci vxor $out5,$out5,$rndkey0 16938c2ecf20Sopenharmony_ci le?vperm $in0,$in0,$in0,$inpperm 16948c2ecf20Sopenharmony_ci vadduqm $ivec,$out6,$two # next counter value 16958c2ecf20Sopenharmony_ci vxor $out6,$out6,$rndkey0 16968c2ecf20Sopenharmony_ci le?vperm $in1,$in1,$in1,$inpperm 16978c2ecf20Sopenharmony_ci vxor $out7,$out7,$rndkey0 16988c2ecf20Sopenharmony_ci mtctr $rounds 16998c2ecf20Sopenharmony_ci 17008c2ecf20Sopenharmony_ci vcipher $out0,$out0,v24 17018c2ecf20Sopenharmony_ci stvx_u $in0,$x00,$out 17028c2ecf20Sopenharmony_ci le?vperm $in2,$in2,$in2,$inpperm 17038c2ecf20Sopenharmony_ci vcipher $out1,$out1,v24 17048c2ecf20Sopenharmony_ci stvx_u $in1,$x10,$out 17058c2ecf20Sopenharmony_ci le?vperm $in3,$in3,$in3,$inpperm 17068c2ecf20Sopenharmony_ci vcipher $out2,$out2,v24 17078c2ecf20Sopenharmony_ci stvx_u $in2,$x20,$out 17088c2ecf20Sopenharmony_ci le?vperm $in4,$in4,$in4,$inpperm 17098c2ecf20Sopenharmony_ci vcipher $out3,$out3,v24 17108c2ecf20Sopenharmony_ci stvx_u $in3,$x30,$out 17118c2ecf20Sopenharmony_ci le?vperm $in5,$in5,$in5,$inpperm 17128c2ecf20Sopenharmony_ci vcipher $out4,$out4,v24 17138c2ecf20Sopenharmony_ci stvx_u $in4,$x40,$out 17148c2ecf20Sopenharmony_ci le?vperm $in6,$in6,$in6,$inpperm 17158c2ecf20Sopenharmony_ci vcipher $out5,$out5,v24 17168c2ecf20Sopenharmony_ci stvx_u $in5,$x50,$out 17178c2ecf20Sopenharmony_ci le?vperm $in7,$in7,$in7,$inpperm 17188c2ecf20Sopenharmony_ci vcipher $out6,$out6,v24 17198c2ecf20Sopenharmony_ci stvx_u $in6,$x60,$out 17208c2ecf20Sopenharmony_ci vcipher $out7,$out7,v24 17218c2ecf20Sopenharmony_ci stvx_u $in7,$x70,$out 17228c2ecf20Sopenharmony_ci addi $out,$out,0x80 17238c2ecf20Sopenharmony_ci 17248c2ecf20Sopenharmony_ci b Loop_ctr32_enc8x_middle 17258c2ecf20Sopenharmony_ci 17268c2ecf20Sopenharmony_ci.align 5 17278c2ecf20Sopenharmony_ciLctr32_enc8x_break: 17288c2ecf20Sopenharmony_ci cmpwi $len,-0x60 17298c2ecf20Sopenharmony_ci blt Lctr32_enc8x_one 17308c2ecf20Sopenharmony_ci nop 17318c2ecf20Sopenharmony_ci beq Lctr32_enc8x_two 17328c2ecf20Sopenharmony_ci cmpwi $len,-0x40 17338c2ecf20Sopenharmony_ci blt Lctr32_enc8x_three 17348c2ecf20Sopenharmony_ci nop 17358c2ecf20Sopenharmony_ci beq Lctr32_enc8x_four 17368c2ecf20Sopenharmony_ci cmpwi $len,-0x20 17378c2ecf20Sopenharmony_ci blt Lctr32_enc8x_five 17388c2ecf20Sopenharmony_ci nop 17398c2ecf20Sopenharmony_ci beq Lctr32_enc8x_six 17408c2ecf20Sopenharmony_ci cmpwi $len,0x00 17418c2ecf20Sopenharmony_ci blt Lctr32_enc8x_seven 17428c2ecf20Sopenharmony_ci 17438c2ecf20Sopenharmony_ciLctr32_enc8x_eight: 17448c2ecf20Sopenharmony_ci vcipherlast $out0,$out0,$in0 17458c2ecf20Sopenharmony_ci vcipherlast $out1,$out1,$in1 17468c2ecf20Sopenharmony_ci vcipherlast $out2,$out2,$in2 17478c2ecf20Sopenharmony_ci vcipherlast $out3,$out3,$in3 17488c2ecf20Sopenharmony_ci vcipherlast $out4,$out4,$in4 17498c2ecf20Sopenharmony_ci vcipherlast $out5,$out5,$in5 17508c2ecf20Sopenharmony_ci vcipherlast $out6,$out6,$in6 17518c2ecf20Sopenharmony_ci vcipherlast $out7,$out7,$in7 17528c2ecf20Sopenharmony_ci 17538c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$inpperm 17548c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$inpperm 17558c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out 17568c2ecf20Sopenharmony_ci le?vperm $out2,$out2,$out2,$inpperm 17578c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 17588c2ecf20Sopenharmony_ci le?vperm $out3,$out3,$out3,$inpperm 17598c2ecf20Sopenharmony_ci stvx_u $out2,$x20,$out 17608c2ecf20Sopenharmony_ci le?vperm $out4,$out4,$out4,$inpperm 17618c2ecf20Sopenharmony_ci stvx_u $out3,$x30,$out 17628c2ecf20Sopenharmony_ci le?vperm $out5,$out5,$out5,$inpperm 17638c2ecf20Sopenharmony_ci stvx_u $out4,$x40,$out 17648c2ecf20Sopenharmony_ci le?vperm $out6,$out6,$out6,$inpperm 17658c2ecf20Sopenharmony_ci stvx_u $out5,$x50,$out 17668c2ecf20Sopenharmony_ci le?vperm $out7,$out7,$out7,$inpperm 17678c2ecf20Sopenharmony_ci stvx_u $out6,$x60,$out 17688c2ecf20Sopenharmony_ci stvx_u $out7,$x70,$out 17698c2ecf20Sopenharmony_ci addi $out,$out,0x80 17708c2ecf20Sopenharmony_ci b Lctr32_enc8x_done 17718c2ecf20Sopenharmony_ci 17728c2ecf20Sopenharmony_ci.align 5 17738c2ecf20Sopenharmony_ciLctr32_enc8x_seven: 17748c2ecf20Sopenharmony_ci vcipherlast $out0,$out0,$in1 17758c2ecf20Sopenharmony_ci vcipherlast $out1,$out1,$in2 17768c2ecf20Sopenharmony_ci vcipherlast $out2,$out2,$in3 17778c2ecf20Sopenharmony_ci vcipherlast $out3,$out3,$in4 17788c2ecf20Sopenharmony_ci vcipherlast $out4,$out4,$in5 17798c2ecf20Sopenharmony_ci vcipherlast $out5,$out5,$in6 17808c2ecf20Sopenharmony_ci vcipherlast $out6,$out6,$in7 17818c2ecf20Sopenharmony_ci 17828c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$inpperm 17838c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$inpperm 17848c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out 17858c2ecf20Sopenharmony_ci le?vperm $out2,$out2,$out2,$inpperm 17868c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 17878c2ecf20Sopenharmony_ci le?vperm $out3,$out3,$out3,$inpperm 17888c2ecf20Sopenharmony_ci stvx_u $out2,$x20,$out 17898c2ecf20Sopenharmony_ci le?vperm $out4,$out4,$out4,$inpperm 17908c2ecf20Sopenharmony_ci stvx_u $out3,$x30,$out 17918c2ecf20Sopenharmony_ci le?vperm $out5,$out5,$out5,$inpperm 17928c2ecf20Sopenharmony_ci stvx_u $out4,$x40,$out 17938c2ecf20Sopenharmony_ci le?vperm $out6,$out6,$out6,$inpperm 17948c2ecf20Sopenharmony_ci stvx_u $out5,$x50,$out 17958c2ecf20Sopenharmony_ci stvx_u $out6,$x60,$out 17968c2ecf20Sopenharmony_ci addi $out,$out,0x70 17978c2ecf20Sopenharmony_ci b Lctr32_enc8x_done 17988c2ecf20Sopenharmony_ci 17998c2ecf20Sopenharmony_ci.align 5 18008c2ecf20Sopenharmony_ciLctr32_enc8x_six: 18018c2ecf20Sopenharmony_ci vcipherlast $out0,$out0,$in2 18028c2ecf20Sopenharmony_ci vcipherlast $out1,$out1,$in3 18038c2ecf20Sopenharmony_ci vcipherlast $out2,$out2,$in4 18048c2ecf20Sopenharmony_ci vcipherlast $out3,$out3,$in5 18058c2ecf20Sopenharmony_ci vcipherlast $out4,$out4,$in6 18068c2ecf20Sopenharmony_ci vcipherlast $out5,$out5,$in7 18078c2ecf20Sopenharmony_ci 18088c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$inpperm 18098c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$inpperm 18108c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out 18118c2ecf20Sopenharmony_ci le?vperm $out2,$out2,$out2,$inpperm 18128c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 18138c2ecf20Sopenharmony_ci le?vperm $out3,$out3,$out3,$inpperm 18148c2ecf20Sopenharmony_ci stvx_u $out2,$x20,$out 18158c2ecf20Sopenharmony_ci le?vperm $out4,$out4,$out4,$inpperm 18168c2ecf20Sopenharmony_ci stvx_u $out3,$x30,$out 18178c2ecf20Sopenharmony_ci le?vperm $out5,$out5,$out5,$inpperm 18188c2ecf20Sopenharmony_ci stvx_u $out4,$x40,$out 18198c2ecf20Sopenharmony_ci stvx_u $out5,$x50,$out 18208c2ecf20Sopenharmony_ci addi $out,$out,0x60 18218c2ecf20Sopenharmony_ci b Lctr32_enc8x_done 18228c2ecf20Sopenharmony_ci 18238c2ecf20Sopenharmony_ci.align 5 18248c2ecf20Sopenharmony_ciLctr32_enc8x_five: 18258c2ecf20Sopenharmony_ci vcipherlast $out0,$out0,$in3 18268c2ecf20Sopenharmony_ci vcipherlast $out1,$out1,$in4 18278c2ecf20Sopenharmony_ci vcipherlast $out2,$out2,$in5 18288c2ecf20Sopenharmony_ci vcipherlast $out3,$out3,$in6 18298c2ecf20Sopenharmony_ci vcipherlast $out4,$out4,$in7 18308c2ecf20Sopenharmony_ci 18318c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$inpperm 18328c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$inpperm 18338c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out 18348c2ecf20Sopenharmony_ci le?vperm $out2,$out2,$out2,$inpperm 18358c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 18368c2ecf20Sopenharmony_ci le?vperm $out3,$out3,$out3,$inpperm 18378c2ecf20Sopenharmony_ci stvx_u $out2,$x20,$out 18388c2ecf20Sopenharmony_ci le?vperm $out4,$out4,$out4,$inpperm 18398c2ecf20Sopenharmony_ci stvx_u $out3,$x30,$out 18408c2ecf20Sopenharmony_ci stvx_u $out4,$x40,$out 18418c2ecf20Sopenharmony_ci addi $out,$out,0x50 18428c2ecf20Sopenharmony_ci b Lctr32_enc8x_done 18438c2ecf20Sopenharmony_ci 18448c2ecf20Sopenharmony_ci.align 5 18458c2ecf20Sopenharmony_ciLctr32_enc8x_four: 18468c2ecf20Sopenharmony_ci vcipherlast $out0,$out0,$in4 18478c2ecf20Sopenharmony_ci vcipherlast $out1,$out1,$in5 18488c2ecf20Sopenharmony_ci vcipherlast $out2,$out2,$in6 18498c2ecf20Sopenharmony_ci vcipherlast $out3,$out3,$in7 18508c2ecf20Sopenharmony_ci 18518c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$inpperm 18528c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$inpperm 18538c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out 18548c2ecf20Sopenharmony_ci le?vperm $out2,$out2,$out2,$inpperm 18558c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 18568c2ecf20Sopenharmony_ci le?vperm $out3,$out3,$out3,$inpperm 18578c2ecf20Sopenharmony_ci stvx_u $out2,$x20,$out 18588c2ecf20Sopenharmony_ci stvx_u $out3,$x30,$out 18598c2ecf20Sopenharmony_ci addi $out,$out,0x40 18608c2ecf20Sopenharmony_ci b Lctr32_enc8x_done 18618c2ecf20Sopenharmony_ci 18628c2ecf20Sopenharmony_ci.align 5 18638c2ecf20Sopenharmony_ciLctr32_enc8x_three: 18648c2ecf20Sopenharmony_ci vcipherlast $out0,$out0,$in5 18658c2ecf20Sopenharmony_ci vcipherlast $out1,$out1,$in6 18668c2ecf20Sopenharmony_ci vcipherlast $out2,$out2,$in7 18678c2ecf20Sopenharmony_ci 18688c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$inpperm 18698c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$inpperm 18708c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out 18718c2ecf20Sopenharmony_ci le?vperm $out2,$out2,$out2,$inpperm 18728c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 18738c2ecf20Sopenharmony_ci stvx_u $out2,$x20,$out 18748c2ecf20Sopenharmony_ci addi $out,$out,0x30 18758c2ecf20Sopenharmony_ci b Lctr32_enc8x_done 18768c2ecf20Sopenharmony_ci 18778c2ecf20Sopenharmony_ci.align 5 18788c2ecf20Sopenharmony_ciLctr32_enc8x_two: 18798c2ecf20Sopenharmony_ci vcipherlast $out0,$out0,$in6 18808c2ecf20Sopenharmony_ci vcipherlast $out1,$out1,$in7 18818c2ecf20Sopenharmony_ci 18828c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$inpperm 18838c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$inpperm 18848c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out 18858c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 18868c2ecf20Sopenharmony_ci addi $out,$out,0x20 18878c2ecf20Sopenharmony_ci b Lctr32_enc8x_done 18888c2ecf20Sopenharmony_ci 18898c2ecf20Sopenharmony_ci.align 5 18908c2ecf20Sopenharmony_ciLctr32_enc8x_one: 18918c2ecf20Sopenharmony_ci vcipherlast $out0,$out0,$in7 18928c2ecf20Sopenharmony_ci 18938c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$inpperm 18948c2ecf20Sopenharmony_ci stvx_u $out0,0,$out 18958c2ecf20Sopenharmony_ci addi $out,$out,0x10 18968c2ecf20Sopenharmony_ci 18978c2ecf20Sopenharmony_ciLctr32_enc8x_done: 18988c2ecf20Sopenharmony_ci li r10,`$FRAME+15` 18998c2ecf20Sopenharmony_ci li r11,`$FRAME+31` 19008c2ecf20Sopenharmony_ci stvx $inpperm,r10,$sp # wipe copies of round keys 19018c2ecf20Sopenharmony_ci addi r10,r10,32 19028c2ecf20Sopenharmony_ci stvx $inpperm,r11,$sp 19038c2ecf20Sopenharmony_ci addi r11,r11,32 19048c2ecf20Sopenharmony_ci stvx $inpperm,r10,$sp 19058c2ecf20Sopenharmony_ci addi r10,r10,32 19068c2ecf20Sopenharmony_ci stvx $inpperm,r11,$sp 19078c2ecf20Sopenharmony_ci addi r11,r11,32 19088c2ecf20Sopenharmony_ci stvx $inpperm,r10,$sp 19098c2ecf20Sopenharmony_ci addi r10,r10,32 19108c2ecf20Sopenharmony_ci stvx $inpperm,r11,$sp 19118c2ecf20Sopenharmony_ci addi r11,r11,32 19128c2ecf20Sopenharmony_ci stvx $inpperm,r10,$sp 19138c2ecf20Sopenharmony_ci addi r10,r10,32 19148c2ecf20Sopenharmony_ci stvx $inpperm,r11,$sp 19158c2ecf20Sopenharmony_ci addi r11,r11,32 19168c2ecf20Sopenharmony_ci 19178c2ecf20Sopenharmony_ci mtspr 256,$vrsave 19188c2ecf20Sopenharmony_ci lvx v20,r10,$sp # ABI says so 19198c2ecf20Sopenharmony_ci addi r10,r10,32 19208c2ecf20Sopenharmony_ci lvx v21,r11,$sp 19218c2ecf20Sopenharmony_ci addi r11,r11,32 19228c2ecf20Sopenharmony_ci lvx v22,r10,$sp 19238c2ecf20Sopenharmony_ci addi r10,r10,32 19248c2ecf20Sopenharmony_ci lvx v23,r11,$sp 19258c2ecf20Sopenharmony_ci addi r11,r11,32 19268c2ecf20Sopenharmony_ci lvx v24,r10,$sp 19278c2ecf20Sopenharmony_ci addi r10,r10,32 19288c2ecf20Sopenharmony_ci lvx v25,r11,$sp 19298c2ecf20Sopenharmony_ci addi r11,r11,32 19308c2ecf20Sopenharmony_ci lvx v26,r10,$sp 19318c2ecf20Sopenharmony_ci addi r10,r10,32 19328c2ecf20Sopenharmony_ci lvx v27,r11,$sp 19338c2ecf20Sopenharmony_ci addi r11,r11,32 19348c2ecf20Sopenharmony_ci lvx v28,r10,$sp 19358c2ecf20Sopenharmony_ci addi r10,r10,32 19368c2ecf20Sopenharmony_ci lvx v29,r11,$sp 19378c2ecf20Sopenharmony_ci addi r11,r11,32 19388c2ecf20Sopenharmony_ci lvx v30,r10,$sp 19398c2ecf20Sopenharmony_ci lvx v31,r11,$sp 19408c2ecf20Sopenharmony_ci $POP r26,`$FRAME+21*16+0*$SIZE_T`($sp) 19418c2ecf20Sopenharmony_ci $POP r27,`$FRAME+21*16+1*$SIZE_T`($sp) 19428c2ecf20Sopenharmony_ci $POP r28,`$FRAME+21*16+2*$SIZE_T`($sp) 19438c2ecf20Sopenharmony_ci $POP r29,`$FRAME+21*16+3*$SIZE_T`($sp) 19448c2ecf20Sopenharmony_ci $POP r30,`$FRAME+21*16+4*$SIZE_T`($sp) 19458c2ecf20Sopenharmony_ci $POP r31,`$FRAME+21*16+5*$SIZE_T`($sp) 19468c2ecf20Sopenharmony_ci addi $sp,$sp,`$FRAME+21*16+6*$SIZE_T` 19478c2ecf20Sopenharmony_ci blr 19488c2ecf20Sopenharmony_ci .long 0 19498c2ecf20Sopenharmony_ci .byte 0,12,0x14,0,0x80,6,6,0 19508c2ecf20Sopenharmony_ci .long 0 19518c2ecf20Sopenharmony_ci.size .${prefix}_ctr32_encrypt_blocks,.-.${prefix}_ctr32_encrypt_blocks 19528c2ecf20Sopenharmony_ci___ 19538c2ecf20Sopenharmony_ci}} }}} 19548c2ecf20Sopenharmony_ci 19558c2ecf20Sopenharmony_ci######################################################################### 19568c2ecf20Sopenharmony_ci{{{ # XTS procedures # 19578c2ecf20Sopenharmony_ci# int aes_p8_xts_[en|de]crypt(const char *inp, char *out, size_t len, # 19588c2ecf20Sopenharmony_ci# const AES_KEY *key1, const AES_KEY *key2, # 19598c2ecf20Sopenharmony_ci# [const] unsigned char iv[16]); # 19608c2ecf20Sopenharmony_ci# If $key2 is NULL, then a "tweak chaining" mode is engaged, in which # 19618c2ecf20Sopenharmony_ci# input tweak value is assumed to be encrypted already, and last tweak # 19628c2ecf20Sopenharmony_ci# value, one suitable for consecutive call on same chunk of data, is # 19638c2ecf20Sopenharmony_ci# written back to original buffer. In addition, in "tweak chaining" # 19648c2ecf20Sopenharmony_ci# mode only complete input blocks are processed. # 19658c2ecf20Sopenharmony_ci 19668c2ecf20Sopenharmony_cimy ($inp,$out,$len,$key1,$key2,$ivp,$rounds,$idx) = map("r$_",(3..10)); 19678c2ecf20Sopenharmony_cimy ($rndkey0,$rndkey1,$inout) = map("v$_",(0..2)); 19688c2ecf20Sopenharmony_cimy ($output,$inptail,$inpperm,$leperm,$keyperm) = map("v$_",(3..7)); 19698c2ecf20Sopenharmony_cimy ($tweak,$seven,$eighty7,$tmp,$tweak1) = map("v$_",(8..12)); 19708c2ecf20Sopenharmony_cimy $taillen = $key2; 19718c2ecf20Sopenharmony_ci 19728c2ecf20Sopenharmony_ci ($inp,$idx) = ($idx,$inp); # reassign 19738c2ecf20Sopenharmony_ci 19748c2ecf20Sopenharmony_ci$code.=<<___; 19758c2ecf20Sopenharmony_ci.globl .${prefix}_xts_encrypt 19768c2ecf20Sopenharmony_ci mr $inp,r3 # reassign 19778c2ecf20Sopenharmony_ci li r3,-1 19788c2ecf20Sopenharmony_ci ${UCMP}i $len,16 19798c2ecf20Sopenharmony_ci bltlr- 19808c2ecf20Sopenharmony_ci 19818c2ecf20Sopenharmony_ci lis r0,0xfff0 19828c2ecf20Sopenharmony_ci mfspr r12,256 # save vrsave 19838c2ecf20Sopenharmony_ci li r11,0 19848c2ecf20Sopenharmony_ci mtspr 256,r0 19858c2ecf20Sopenharmony_ci 19868c2ecf20Sopenharmony_ci vspltisb $seven,0x07 # 0x070707..07 19878c2ecf20Sopenharmony_ci le?lvsl $leperm,r11,r11 19888c2ecf20Sopenharmony_ci le?vspltisb $tmp,0x0f 19898c2ecf20Sopenharmony_ci le?vxor $leperm,$leperm,$seven 19908c2ecf20Sopenharmony_ci 19918c2ecf20Sopenharmony_ci li $idx,15 19928c2ecf20Sopenharmony_ci lvx $tweak,0,$ivp # load [unaligned] iv 19938c2ecf20Sopenharmony_ci lvsl $inpperm,0,$ivp 19948c2ecf20Sopenharmony_ci lvx $inptail,$idx,$ivp 19958c2ecf20Sopenharmony_ci le?vxor $inpperm,$inpperm,$tmp 19968c2ecf20Sopenharmony_ci vperm $tweak,$tweak,$inptail,$inpperm 19978c2ecf20Sopenharmony_ci 19988c2ecf20Sopenharmony_ci neg r11,$inp 19998c2ecf20Sopenharmony_ci lvsr $inpperm,0,r11 # prepare for unaligned load 20008c2ecf20Sopenharmony_ci lvx $inout,0,$inp 20018c2ecf20Sopenharmony_ci addi $inp,$inp,15 # 15 is not typo 20028c2ecf20Sopenharmony_ci le?vxor $inpperm,$inpperm,$tmp 20038c2ecf20Sopenharmony_ci 20048c2ecf20Sopenharmony_ci ${UCMP}i $key2,0 # key2==NULL? 20058c2ecf20Sopenharmony_ci beq Lxts_enc_no_key2 20068c2ecf20Sopenharmony_ci 20078c2ecf20Sopenharmony_ci ?lvsl $keyperm,0,$key2 # prepare for unaligned key 20088c2ecf20Sopenharmony_ci lwz $rounds,240($key2) 20098c2ecf20Sopenharmony_ci srwi $rounds,$rounds,1 20108c2ecf20Sopenharmony_ci subi $rounds,$rounds,1 20118c2ecf20Sopenharmony_ci li $idx,16 20128c2ecf20Sopenharmony_ci 20138c2ecf20Sopenharmony_ci lvx $rndkey0,0,$key2 20148c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key2 20158c2ecf20Sopenharmony_ci addi $idx,$idx,16 20168c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 20178c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$rndkey0 20188c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key2 20198c2ecf20Sopenharmony_ci addi $idx,$idx,16 20208c2ecf20Sopenharmony_ci mtctr $rounds 20218c2ecf20Sopenharmony_ci 20228c2ecf20Sopenharmony_ciLtweak_xts_enc: 20238c2ecf20Sopenharmony_ci ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm 20248c2ecf20Sopenharmony_ci vcipher $tweak,$tweak,$rndkey1 20258c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key2 20268c2ecf20Sopenharmony_ci addi $idx,$idx,16 20278c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 20288c2ecf20Sopenharmony_ci vcipher $tweak,$tweak,$rndkey0 20298c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key2 20308c2ecf20Sopenharmony_ci addi $idx,$idx,16 20318c2ecf20Sopenharmony_ci bdnz Ltweak_xts_enc 20328c2ecf20Sopenharmony_ci 20338c2ecf20Sopenharmony_ci ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm 20348c2ecf20Sopenharmony_ci vcipher $tweak,$tweak,$rndkey1 20358c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key2 20368c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 20378c2ecf20Sopenharmony_ci vcipherlast $tweak,$tweak,$rndkey0 20388c2ecf20Sopenharmony_ci 20398c2ecf20Sopenharmony_ci li $ivp,0 # don't chain the tweak 20408c2ecf20Sopenharmony_ci b Lxts_enc 20418c2ecf20Sopenharmony_ci 20428c2ecf20Sopenharmony_ciLxts_enc_no_key2: 20438c2ecf20Sopenharmony_ci li $idx,-16 20448c2ecf20Sopenharmony_ci and $len,$len,$idx # in "tweak chaining" 20458c2ecf20Sopenharmony_ci # mode only complete 20468c2ecf20Sopenharmony_ci # blocks are processed 20478c2ecf20Sopenharmony_ciLxts_enc: 20488c2ecf20Sopenharmony_ci lvx $inptail,0,$inp 20498c2ecf20Sopenharmony_ci addi $inp,$inp,16 20508c2ecf20Sopenharmony_ci 20518c2ecf20Sopenharmony_ci ?lvsl $keyperm,0,$key1 # prepare for unaligned key 20528c2ecf20Sopenharmony_ci lwz $rounds,240($key1) 20538c2ecf20Sopenharmony_ci srwi $rounds,$rounds,1 20548c2ecf20Sopenharmony_ci subi $rounds,$rounds,1 20558c2ecf20Sopenharmony_ci li $idx,16 20568c2ecf20Sopenharmony_ci 20578c2ecf20Sopenharmony_ci vslb $eighty7,$seven,$seven # 0x808080..80 20588c2ecf20Sopenharmony_ci vor $eighty7,$eighty7,$seven # 0x878787..87 20598c2ecf20Sopenharmony_ci vspltisb $tmp,1 # 0x010101..01 20608c2ecf20Sopenharmony_ci vsldoi $eighty7,$eighty7,$tmp,15 # 0x870101..01 20618c2ecf20Sopenharmony_ci 20628c2ecf20Sopenharmony_ci ${UCMP}i $len,96 20638c2ecf20Sopenharmony_ci bge _aesp8_xts_encrypt6x 20648c2ecf20Sopenharmony_ci 20658c2ecf20Sopenharmony_ci andi. $taillen,$len,15 20668c2ecf20Sopenharmony_ci subic r0,$len,32 20678c2ecf20Sopenharmony_ci subi $taillen,$taillen,16 20688c2ecf20Sopenharmony_ci subfe r0,r0,r0 20698c2ecf20Sopenharmony_ci and r0,r0,$taillen 20708c2ecf20Sopenharmony_ci add $inp,$inp,r0 20718c2ecf20Sopenharmony_ci 20728c2ecf20Sopenharmony_ci lvx $rndkey0,0,$key1 20738c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key1 20748c2ecf20Sopenharmony_ci addi $idx,$idx,16 20758c2ecf20Sopenharmony_ci vperm $inout,$inout,$inptail,$inpperm 20768c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 20778c2ecf20Sopenharmony_ci vxor $inout,$inout,$tweak 20788c2ecf20Sopenharmony_ci vxor $inout,$inout,$rndkey0 20798c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key1 20808c2ecf20Sopenharmony_ci addi $idx,$idx,16 20818c2ecf20Sopenharmony_ci mtctr $rounds 20828c2ecf20Sopenharmony_ci b Loop_xts_enc 20838c2ecf20Sopenharmony_ci 20848c2ecf20Sopenharmony_ci.align 5 20858c2ecf20Sopenharmony_ciLoop_xts_enc: 20868c2ecf20Sopenharmony_ci ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm 20878c2ecf20Sopenharmony_ci vcipher $inout,$inout,$rndkey1 20888c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key1 20898c2ecf20Sopenharmony_ci addi $idx,$idx,16 20908c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 20918c2ecf20Sopenharmony_ci vcipher $inout,$inout,$rndkey0 20928c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key1 20938c2ecf20Sopenharmony_ci addi $idx,$idx,16 20948c2ecf20Sopenharmony_ci bdnz Loop_xts_enc 20958c2ecf20Sopenharmony_ci 20968c2ecf20Sopenharmony_ci ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm 20978c2ecf20Sopenharmony_ci vcipher $inout,$inout,$rndkey1 20988c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key1 20998c2ecf20Sopenharmony_ci li $idx,16 21008c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 21018c2ecf20Sopenharmony_ci vxor $rndkey0,$rndkey0,$tweak 21028c2ecf20Sopenharmony_ci vcipherlast $output,$inout,$rndkey0 21038c2ecf20Sopenharmony_ci 21048c2ecf20Sopenharmony_ci le?vperm $tmp,$output,$output,$leperm 21058c2ecf20Sopenharmony_ci be?nop 21068c2ecf20Sopenharmony_ci le?stvx_u $tmp,0,$out 21078c2ecf20Sopenharmony_ci be?stvx_u $output,0,$out 21088c2ecf20Sopenharmony_ci addi $out,$out,16 21098c2ecf20Sopenharmony_ci 21108c2ecf20Sopenharmony_ci subic. $len,$len,16 21118c2ecf20Sopenharmony_ci beq Lxts_enc_done 21128c2ecf20Sopenharmony_ci 21138c2ecf20Sopenharmony_ci vmr $inout,$inptail 21148c2ecf20Sopenharmony_ci lvx $inptail,0,$inp 21158c2ecf20Sopenharmony_ci addi $inp,$inp,16 21168c2ecf20Sopenharmony_ci lvx $rndkey0,0,$key1 21178c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key1 21188c2ecf20Sopenharmony_ci addi $idx,$idx,16 21198c2ecf20Sopenharmony_ci 21208c2ecf20Sopenharmony_ci subic r0,$len,32 21218c2ecf20Sopenharmony_ci subfe r0,r0,r0 21228c2ecf20Sopenharmony_ci and r0,r0,$taillen 21238c2ecf20Sopenharmony_ci add $inp,$inp,r0 21248c2ecf20Sopenharmony_ci 21258c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 21268c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 21278c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 21288c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 21298c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 21308c2ecf20Sopenharmony_ci 21318c2ecf20Sopenharmony_ci vperm $inout,$inout,$inptail,$inpperm 21328c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 21338c2ecf20Sopenharmony_ci vxor $inout,$inout,$tweak 21348c2ecf20Sopenharmony_ci vxor $output,$output,$rndkey0 # just in case $len<16 21358c2ecf20Sopenharmony_ci vxor $inout,$inout,$rndkey0 21368c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key1 21378c2ecf20Sopenharmony_ci addi $idx,$idx,16 21388c2ecf20Sopenharmony_ci 21398c2ecf20Sopenharmony_ci mtctr $rounds 21408c2ecf20Sopenharmony_ci ${UCMP}i $len,16 21418c2ecf20Sopenharmony_ci bge Loop_xts_enc 21428c2ecf20Sopenharmony_ci 21438c2ecf20Sopenharmony_ci vxor $output,$output,$tweak 21448c2ecf20Sopenharmony_ci lvsr $inpperm,0,$len # $inpperm is no longer needed 21458c2ecf20Sopenharmony_ci vxor $inptail,$inptail,$inptail # $inptail is no longer needed 21468c2ecf20Sopenharmony_ci vspltisb $tmp,-1 21478c2ecf20Sopenharmony_ci vperm $inptail,$inptail,$tmp,$inpperm 21488c2ecf20Sopenharmony_ci vsel $inout,$inout,$output,$inptail 21498c2ecf20Sopenharmony_ci 21508c2ecf20Sopenharmony_ci subi r11,$out,17 21518c2ecf20Sopenharmony_ci subi $out,$out,16 21528c2ecf20Sopenharmony_ci mtctr $len 21538c2ecf20Sopenharmony_ci li $len,16 21548c2ecf20Sopenharmony_ciLoop_xts_enc_steal: 21558c2ecf20Sopenharmony_ci lbzu r0,1(r11) 21568c2ecf20Sopenharmony_ci stb r0,16(r11) 21578c2ecf20Sopenharmony_ci bdnz Loop_xts_enc_steal 21588c2ecf20Sopenharmony_ci 21598c2ecf20Sopenharmony_ci mtctr $rounds 21608c2ecf20Sopenharmony_ci b Loop_xts_enc # one more time... 21618c2ecf20Sopenharmony_ci 21628c2ecf20Sopenharmony_ciLxts_enc_done: 21638c2ecf20Sopenharmony_ci ${UCMP}i $ivp,0 21648c2ecf20Sopenharmony_ci beq Lxts_enc_ret 21658c2ecf20Sopenharmony_ci 21668c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 21678c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 21688c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 21698c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 21708c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 21718c2ecf20Sopenharmony_ci 21728c2ecf20Sopenharmony_ci le?vperm $tweak,$tweak,$tweak,$leperm 21738c2ecf20Sopenharmony_ci stvx_u $tweak,0,$ivp 21748c2ecf20Sopenharmony_ci 21758c2ecf20Sopenharmony_ciLxts_enc_ret: 21768c2ecf20Sopenharmony_ci mtspr 256,r12 # restore vrsave 21778c2ecf20Sopenharmony_ci li r3,0 21788c2ecf20Sopenharmony_ci blr 21798c2ecf20Sopenharmony_ci .long 0 21808c2ecf20Sopenharmony_ci .byte 0,12,0x04,0,0x80,6,6,0 21818c2ecf20Sopenharmony_ci .long 0 21828c2ecf20Sopenharmony_ci.size .${prefix}_xts_encrypt,.-.${prefix}_xts_encrypt 21838c2ecf20Sopenharmony_ci 21848c2ecf20Sopenharmony_ci.globl .${prefix}_xts_decrypt 21858c2ecf20Sopenharmony_ci mr $inp,r3 # reassign 21868c2ecf20Sopenharmony_ci li r3,-1 21878c2ecf20Sopenharmony_ci ${UCMP}i $len,16 21888c2ecf20Sopenharmony_ci bltlr- 21898c2ecf20Sopenharmony_ci 21908c2ecf20Sopenharmony_ci lis r0,0xfff8 21918c2ecf20Sopenharmony_ci mfspr r12,256 # save vrsave 21928c2ecf20Sopenharmony_ci li r11,0 21938c2ecf20Sopenharmony_ci mtspr 256,r0 21948c2ecf20Sopenharmony_ci 21958c2ecf20Sopenharmony_ci andi. r0,$len,15 21968c2ecf20Sopenharmony_ci neg r0,r0 21978c2ecf20Sopenharmony_ci andi. r0,r0,16 21988c2ecf20Sopenharmony_ci sub $len,$len,r0 21998c2ecf20Sopenharmony_ci 22008c2ecf20Sopenharmony_ci vspltisb $seven,0x07 # 0x070707..07 22018c2ecf20Sopenharmony_ci le?lvsl $leperm,r11,r11 22028c2ecf20Sopenharmony_ci le?vspltisb $tmp,0x0f 22038c2ecf20Sopenharmony_ci le?vxor $leperm,$leperm,$seven 22048c2ecf20Sopenharmony_ci 22058c2ecf20Sopenharmony_ci li $idx,15 22068c2ecf20Sopenharmony_ci lvx $tweak,0,$ivp # load [unaligned] iv 22078c2ecf20Sopenharmony_ci lvsl $inpperm,0,$ivp 22088c2ecf20Sopenharmony_ci lvx $inptail,$idx,$ivp 22098c2ecf20Sopenharmony_ci le?vxor $inpperm,$inpperm,$tmp 22108c2ecf20Sopenharmony_ci vperm $tweak,$tweak,$inptail,$inpperm 22118c2ecf20Sopenharmony_ci 22128c2ecf20Sopenharmony_ci neg r11,$inp 22138c2ecf20Sopenharmony_ci lvsr $inpperm,0,r11 # prepare for unaligned load 22148c2ecf20Sopenharmony_ci lvx $inout,0,$inp 22158c2ecf20Sopenharmony_ci addi $inp,$inp,15 # 15 is not typo 22168c2ecf20Sopenharmony_ci le?vxor $inpperm,$inpperm,$tmp 22178c2ecf20Sopenharmony_ci 22188c2ecf20Sopenharmony_ci ${UCMP}i $key2,0 # key2==NULL? 22198c2ecf20Sopenharmony_ci beq Lxts_dec_no_key2 22208c2ecf20Sopenharmony_ci 22218c2ecf20Sopenharmony_ci ?lvsl $keyperm,0,$key2 # prepare for unaligned key 22228c2ecf20Sopenharmony_ci lwz $rounds,240($key2) 22238c2ecf20Sopenharmony_ci srwi $rounds,$rounds,1 22248c2ecf20Sopenharmony_ci subi $rounds,$rounds,1 22258c2ecf20Sopenharmony_ci li $idx,16 22268c2ecf20Sopenharmony_ci 22278c2ecf20Sopenharmony_ci lvx $rndkey0,0,$key2 22288c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key2 22298c2ecf20Sopenharmony_ci addi $idx,$idx,16 22308c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 22318c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$rndkey0 22328c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key2 22338c2ecf20Sopenharmony_ci addi $idx,$idx,16 22348c2ecf20Sopenharmony_ci mtctr $rounds 22358c2ecf20Sopenharmony_ci 22368c2ecf20Sopenharmony_ciLtweak_xts_dec: 22378c2ecf20Sopenharmony_ci ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm 22388c2ecf20Sopenharmony_ci vcipher $tweak,$tweak,$rndkey1 22398c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key2 22408c2ecf20Sopenharmony_ci addi $idx,$idx,16 22418c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 22428c2ecf20Sopenharmony_ci vcipher $tweak,$tweak,$rndkey0 22438c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key2 22448c2ecf20Sopenharmony_ci addi $idx,$idx,16 22458c2ecf20Sopenharmony_ci bdnz Ltweak_xts_dec 22468c2ecf20Sopenharmony_ci 22478c2ecf20Sopenharmony_ci ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm 22488c2ecf20Sopenharmony_ci vcipher $tweak,$tweak,$rndkey1 22498c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key2 22508c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 22518c2ecf20Sopenharmony_ci vcipherlast $tweak,$tweak,$rndkey0 22528c2ecf20Sopenharmony_ci 22538c2ecf20Sopenharmony_ci li $ivp,0 # don't chain the tweak 22548c2ecf20Sopenharmony_ci b Lxts_dec 22558c2ecf20Sopenharmony_ci 22568c2ecf20Sopenharmony_ciLxts_dec_no_key2: 22578c2ecf20Sopenharmony_ci neg $idx,$len 22588c2ecf20Sopenharmony_ci andi. $idx,$idx,15 22598c2ecf20Sopenharmony_ci add $len,$len,$idx # in "tweak chaining" 22608c2ecf20Sopenharmony_ci # mode only complete 22618c2ecf20Sopenharmony_ci # blocks are processed 22628c2ecf20Sopenharmony_ciLxts_dec: 22638c2ecf20Sopenharmony_ci lvx $inptail,0,$inp 22648c2ecf20Sopenharmony_ci addi $inp,$inp,16 22658c2ecf20Sopenharmony_ci 22668c2ecf20Sopenharmony_ci ?lvsl $keyperm,0,$key1 # prepare for unaligned key 22678c2ecf20Sopenharmony_ci lwz $rounds,240($key1) 22688c2ecf20Sopenharmony_ci srwi $rounds,$rounds,1 22698c2ecf20Sopenharmony_ci subi $rounds,$rounds,1 22708c2ecf20Sopenharmony_ci li $idx,16 22718c2ecf20Sopenharmony_ci 22728c2ecf20Sopenharmony_ci vslb $eighty7,$seven,$seven # 0x808080..80 22738c2ecf20Sopenharmony_ci vor $eighty7,$eighty7,$seven # 0x878787..87 22748c2ecf20Sopenharmony_ci vspltisb $tmp,1 # 0x010101..01 22758c2ecf20Sopenharmony_ci vsldoi $eighty7,$eighty7,$tmp,15 # 0x870101..01 22768c2ecf20Sopenharmony_ci 22778c2ecf20Sopenharmony_ci ${UCMP}i $len,96 22788c2ecf20Sopenharmony_ci bge _aesp8_xts_decrypt6x 22798c2ecf20Sopenharmony_ci 22808c2ecf20Sopenharmony_ci lvx $rndkey0,0,$key1 22818c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key1 22828c2ecf20Sopenharmony_ci addi $idx,$idx,16 22838c2ecf20Sopenharmony_ci vperm $inout,$inout,$inptail,$inpperm 22848c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 22858c2ecf20Sopenharmony_ci vxor $inout,$inout,$tweak 22868c2ecf20Sopenharmony_ci vxor $inout,$inout,$rndkey0 22878c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key1 22888c2ecf20Sopenharmony_ci addi $idx,$idx,16 22898c2ecf20Sopenharmony_ci mtctr $rounds 22908c2ecf20Sopenharmony_ci 22918c2ecf20Sopenharmony_ci ${UCMP}i $len,16 22928c2ecf20Sopenharmony_ci blt Ltail_xts_dec 22938c2ecf20Sopenharmony_ci be?b Loop_xts_dec 22948c2ecf20Sopenharmony_ci 22958c2ecf20Sopenharmony_ci.align 5 22968c2ecf20Sopenharmony_ciLoop_xts_dec: 22978c2ecf20Sopenharmony_ci ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm 22988c2ecf20Sopenharmony_ci vncipher $inout,$inout,$rndkey1 22998c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key1 23008c2ecf20Sopenharmony_ci addi $idx,$idx,16 23018c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 23028c2ecf20Sopenharmony_ci vncipher $inout,$inout,$rndkey0 23038c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key1 23048c2ecf20Sopenharmony_ci addi $idx,$idx,16 23058c2ecf20Sopenharmony_ci bdnz Loop_xts_dec 23068c2ecf20Sopenharmony_ci 23078c2ecf20Sopenharmony_ci ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm 23088c2ecf20Sopenharmony_ci vncipher $inout,$inout,$rndkey1 23098c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key1 23108c2ecf20Sopenharmony_ci li $idx,16 23118c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 23128c2ecf20Sopenharmony_ci vxor $rndkey0,$rndkey0,$tweak 23138c2ecf20Sopenharmony_ci vncipherlast $output,$inout,$rndkey0 23148c2ecf20Sopenharmony_ci 23158c2ecf20Sopenharmony_ci le?vperm $tmp,$output,$output,$leperm 23168c2ecf20Sopenharmony_ci be?nop 23178c2ecf20Sopenharmony_ci le?stvx_u $tmp,0,$out 23188c2ecf20Sopenharmony_ci be?stvx_u $output,0,$out 23198c2ecf20Sopenharmony_ci addi $out,$out,16 23208c2ecf20Sopenharmony_ci 23218c2ecf20Sopenharmony_ci subic. $len,$len,16 23228c2ecf20Sopenharmony_ci beq Lxts_dec_done 23238c2ecf20Sopenharmony_ci 23248c2ecf20Sopenharmony_ci vmr $inout,$inptail 23258c2ecf20Sopenharmony_ci lvx $inptail,0,$inp 23268c2ecf20Sopenharmony_ci addi $inp,$inp,16 23278c2ecf20Sopenharmony_ci lvx $rndkey0,0,$key1 23288c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key1 23298c2ecf20Sopenharmony_ci addi $idx,$idx,16 23308c2ecf20Sopenharmony_ci 23318c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 23328c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 23338c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 23348c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 23358c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 23368c2ecf20Sopenharmony_ci 23378c2ecf20Sopenharmony_ci vperm $inout,$inout,$inptail,$inpperm 23388c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 23398c2ecf20Sopenharmony_ci vxor $inout,$inout,$tweak 23408c2ecf20Sopenharmony_ci vxor $inout,$inout,$rndkey0 23418c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key1 23428c2ecf20Sopenharmony_ci addi $idx,$idx,16 23438c2ecf20Sopenharmony_ci 23448c2ecf20Sopenharmony_ci mtctr $rounds 23458c2ecf20Sopenharmony_ci ${UCMP}i $len,16 23468c2ecf20Sopenharmony_ci bge Loop_xts_dec 23478c2ecf20Sopenharmony_ci 23488c2ecf20Sopenharmony_ciLtail_xts_dec: 23498c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 23508c2ecf20Sopenharmony_ci vaddubm $tweak1,$tweak,$tweak 23518c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 23528c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 23538c2ecf20Sopenharmony_ci vxor $tweak1,$tweak1,$tmp 23548c2ecf20Sopenharmony_ci 23558c2ecf20Sopenharmony_ci subi $inp,$inp,16 23568c2ecf20Sopenharmony_ci add $inp,$inp,$len 23578c2ecf20Sopenharmony_ci 23588c2ecf20Sopenharmony_ci vxor $inout,$inout,$tweak # :-( 23598c2ecf20Sopenharmony_ci vxor $inout,$inout,$tweak1 # :-) 23608c2ecf20Sopenharmony_ci 23618c2ecf20Sopenharmony_ciLoop_xts_dec_short: 23628c2ecf20Sopenharmony_ci ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm 23638c2ecf20Sopenharmony_ci vncipher $inout,$inout,$rndkey1 23648c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key1 23658c2ecf20Sopenharmony_ci addi $idx,$idx,16 23668c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 23678c2ecf20Sopenharmony_ci vncipher $inout,$inout,$rndkey0 23688c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key1 23698c2ecf20Sopenharmony_ci addi $idx,$idx,16 23708c2ecf20Sopenharmony_ci bdnz Loop_xts_dec_short 23718c2ecf20Sopenharmony_ci 23728c2ecf20Sopenharmony_ci ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm 23738c2ecf20Sopenharmony_ci vncipher $inout,$inout,$rndkey1 23748c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key1 23758c2ecf20Sopenharmony_ci li $idx,16 23768c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 23778c2ecf20Sopenharmony_ci vxor $rndkey0,$rndkey0,$tweak1 23788c2ecf20Sopenharmony_ci vncipherlast $output,$inout,$rndkey0 23798c2ecf20Sopenharmony_ci 23808c2ecf20Sopenharmony_ci le?vperm $tmp,$output,$output,$leperm 23818c2ecf20Sopenharmony_ci be?nop 23828c2ecf20Sopenharmony_ci le?stvx_u $tmp,0,$out 23838c2ecf20Sopenharmony_ci be?stvx_u $output,0,$out 23848c2ecf20Sopenharmony_ci 23858c2ecf20Sopenharmony_ci vmr $inout,$inptail 23868c2ecf20Sopenharmony_ci lvx $inptail,0,$inp 23878c2ecf20Sopenharmony_ci #addi $inp,$inp,16 23888c2ecf20Sopenharmony_ci lvx $rndkey0,0,$key1 23898c2ecf20Sopenharmony_ci lvx $rndkey1,$idx,$key1 23908c2ecf20Sopenharmony_ci addi $idx,$idx,16 23918c2ecf20Sopenharmony_ci vperm $inout,$inout,$inptail,$inpperm 23928c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm 23938c2ecf20Sopenharmony_ci 23948c2ecf20Sopenharmony_ci lvsr $inpperm,0,$len # $inpperm is no longer needed 23958c2ecf20Sopenharmony_ci vxor $inptail,$inptail,$inptail # $inptail is no longer needed 23968c2ecf20Sopenharmony_ci vspltisb $tmp,-1 23978c2ecf20Sopenharmony_ci vperm $inptail,$inptail,$tmp,$inpperm 23988c2ecf20Sopenharmony_ci vsel $inout,$inout,$output,$inptail 23998c2ecf20Sopenharmony_ci 24008c2ecf20Sopenharmony_ci vxor $rndkey0,$rndkey0,$tweak 24018c2ecf20Sopenharmony_ci vxor $inout,$inout,$rndkey0 24028c2ecf20Sopenharmony_ci lvx $rndkey0,$idx,$key1 24038c2ecf20Sopenharmony_ci addi $idx,$idx,16 24048c2ecf20Sopenharmony_ci 24058c2ecf20Sopenharmony_ci subi r11,$out,1 24068c2ecf20Sopenharmony_ci mtctr $len 24078c2ecf20Sopenharmony_ci li $len,16 24088c2ecf20Sopenharmony_ciLoop_xts_dec_steal: 24098c2ecf20Sopenharmony_ci lbzu r0,1(r11) 24108c2ecf20Sopenharmony_ci stb r0,16(r11) 24118c2ecf20Sopenharmony_ci bdnz Loop_xts_dec_steal 24128c2ecf20Sopenharmony_ci 24138c2ecf20Sopenharmony_ci mtctr $rounds 24148c2ecf20Sopenharmony_ci b Loop_xts_dec # one more time... 24158c2ecf20Sopenharmony_ci 24168c2ecf20Sopenharmony_ciLxts_dec_done: 24178c2ecf20Sopenharmony_ci ${UCMP}i $ivp,0 24188c2ecf20Sopenharmony_ci beq Lxts_dec_ret 24198c2ecf20Sopenharmony_ci 24208c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 24218c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 24228c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 24238c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 24248c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 24258c2ecf20Sopenharmony_ci 24268c2ecf20Sopenharmony_ci le?vperm $tweak,$tweak,$tweak,$leperm 24278c2ecf20Sopenharmony_ci stvx_u $tweak,0,$ivp 24288c2ecf20Sopenharmony_ci 24298c2ecf20Sopenharmony_ciLxts_dec_ret: 24308c2ecf20Sopenharmony_ci mtspr 256,r12 # restore vrsave 24318c2ecf20Sopenharmony_ci li r3,0 24328c2ecf20Sopenharmony_ci blr 24338c2ecf20Sopenharmony_ci .long 0 24348c2ecf20Sopenharmony_ci .byte 0,12,0x04,0,0x80,6,6,0 24358c2ecf20Sopenharmony_ci .long 0 24368c2ecf20Sopenharmony_ci.size .${prefix}_xts_decrypt,.-.${prefix}_xts_decrypt 24378c2ecf20Sopenharmony_ci___ 24388c2ecf20Sopenharmony_ci######################################################################### 24398c2ecf20Sopenharmony_ci{{ # Optimized XTS procedures # 24408c2ecf20Sopenharmony_cimy $key_=$key2; 24418c2ecf20Sopenharmony_cimy ($x00,$x10,$x20,$x30,$x40,$x50,$x60,$x70)=map("r$_",(0,3,26..31)); 24428c2ecf20Sopenharmony_ci $x00=0 if ($flavour =~ /osx/); 24438c2ecf20Sopenharmony_cimy ($in0, $in1, $in2, $in3, $in4, $in5 )=map("v$_",(0..5)); 24448c2ecf20Sopenharmony_cimy ($out0, $out1, $out2, $out3, $out4, $out5)=map("v$_",(7,12..16)); 24458c2ecf20Sopenharmony_cimy ($twk0, $twk1, $twk2, $twk3, $twk4, $twk5)=map("v$_",(17..22)); 24468c2ecf20Sopenharmony_cimy $rndkey0="v23"; # v24-v25 rotating buffer for first found keys 24478c2ecf20Sopenharmony_ci # v26-v31 last 6 round keys 24488c2ecf20Sopenharmony_cimy ($keyperm)=($out0); # aliases with "caller", redundant assignment 24498c2ecf20Sopenharmony_cimy $taillen=$x70; 24508c2ecf20Sopenharmony_ci 24518c2ecf20Sopenharmony_ci$code.=<<___; 24528c2ecf20Sopenharmony_ci.align 5 24538c2ecf20Sopenharmony_ci_aesp8_xts_encrypt6x: 24548c2ecf20Sopenharmony_ci $STU $sp,-`($FRAME+21*16+6*$SIZE_T)`($sp) 24558c2ecf20Sopenharmony_ci mflr r11 24568c2ecf20Sopenharmony_ci li r7,`$FRAME+8*16+15` 24578c2ecf20Sopenharmony_ci li r3,`$FRAME+8*16+31` 24588c2ecf20Sopenharmony_ci $PUSH r11,`$FRAME+21*16+6*$SIZE_T+$LRSAVE`($sp) 24598c2ecf20Sopenharmony_ci stvx v20,r7,$sp # ABI says so 24608c2ecf20Sopenharmony_ci addi r7,r7,32 24618c2ecf20Sopenharmony_ci stvx v21,r3,$sp 24628c2ecf20Sopenharmony_ci addi r3,r3,32 24638c2ecf20Sopenharmony_ci stvx v22,r7,$sp 24648c2ecf20Sopenharmony_ci addi r7,r7,32 24658c2ecf20Sopenharmony_ci stvx v23,r3,$sp 24668c2ecf20Sopenharmony_ci addi r3,r3,32 24678c2ecf20Sopenharmony_ci stvx v24,r7,$sp 24688c2ecf20Sopenharmony_ci addi r7,r7,32 24698c2ecf20Sopenharmony_ci stvx v25,r3,$sp 24708c2ecf20Sopenharmony_ci addi r3,r3,32 24718c2ecf20Sopenharmony_ci stvx v26,r7,$sp 24728c2ecf20Sopenharmony_ci addi r7,r7,32 24738c2ecf20Sopenharmony_ci stvx v27,r3,$sp 24748c2ecf20Sopenharmony_ci addi r3,r3,32 24758c2ecf20Sopenharmony_ci stvx v28,r7,$sp 24768c2ecf20Sopenharmony_ci addi r7,r7,32 24778c2ecf20Sopenharmony_ci stvx v29,r3,$sp 24788c2ecf20Sopenharmony_ci addi r3,r3,32 24798c2ecf20Sopenharmony_ci stvx v30,r7,$sp 24808c2ecf20Sopenharmony_ci stvx v31,r3,$sp 24818c2ecf20Sopenharmony_ci li r0,-1 24828c2ecf20Sopenharmony_ci stw $vrsave,`$FRAME+21*16-4`($sp) # save vrsave 24838c2ecf20Sopenharmony_ci li $x10,0x10 24848c2ecf20Sopenharmony_ci $PUSH r26,`$FRAME+21*16+0*$SIZE_T`($sp) 24858c2ecf20Sopenharmony_ci li $x20,0x20 24868c2ecf20Sopenharmony_ci $PUSH r27,`$FRAME+21*16+1*$SIZE_T`($sp) 24878c2ecf20Sopenharmony_ci li $x30,0x30 24888c2ecf20Sopenharmony_ci $PUSH r28,`$FRAME+21*16+2*$SIZE_T`($sp) 24898c2ecf20Sopenharmony_ci li $x40,0x40 24908c2ecf20Sopenharmony_ci $PUSH r29,`$FRAME+21*16+3*$SIZE_T`($sp) 24918c2ecf20Sopenharmony_ci li $x50,0x50 24928c2ecf20Sopenharmony_ci $PUSH r30,`$FRAME+21*16+4*$SIZE_T`($sp) 24938c2ecf20Sopenharmony_ci li $x60,0x60 24948c2ecf20Sopenharmony_ci $PUSH r31,`$FRAME+21*16+5*$SIZE_T`($sp) 24958c2ecf20Sopenharmony_ci li $x70,0x70 24968c2ecf20Sopenharmony_ci mtspr 256,r0 24978c2ecf20Sopenharmony_ci 24988c2ecf20Sopenharmony_ci subi $rounds,$rounds,3 # -4 in total 24998c2ecf20Sopenharmony_ci 25008c2ecf20Sopenharmony_ci lvx $rndkey0,$x00,$key1 # load key schedule 25018c2ecf20Sopenharmony_ci lvx v30,$x10,$key1 25028c2ecf20Sopenharmony_ci addi $key1,$key1,0x20 25038c2ecf20Sopenharmony_ci lvx v31,$x00,$key1 25048c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,v30,$keyperm 25058c2ecf20Sopenharmony_ci addi $key_,$sp,$FRAME+15 25068c2ecf20Sopenharmony_ci mtctr $rounds 25078c2ecf20Sopenharmony_ci 25088c2ecf20Sopenharmony_ciLoad_xts_enc_key: 25098c2ecf20Sopenharmony_ci ?vperm v24,v30,v31,$keyperm 25108c2ecf20Sopenharmony_ci lvx v30,$x10,$key1 25118c2ecf20Sopenharmony_ci addi $key1,$key1,0x20 25128c2ecf20Sopenharmony_ci stvx v24,$x00,$key_ # off-load round[1] 25138c2ecf20Sopenharmony_ci ?vperm v25,v31,v30,$keyperm 25148c2ecf20Sopenharmony_ci lvx v31,$x00,$key1 25158c2ecf20Sopenharmony_ci stvx v25,$x10,$key_ # off-load round[2] 25168c2ecf20Sopenharmony_ci addi $key_,$key_,0x20 25178c2ecf20Sopenharmony_ci bdnz Load_xts_enc_key 25188c2ecf20Sopenharmony_ci 25198c2ecf20Sopenharmony_ci lvx v26,$x10,$key1 25208c2ecf20Sopenharmony_ci ?vperm v24,v30,v31,$keyperm 25218c2ecf20Sopenharmony_ci lvx v27,$x20,$key1 25228c2ecf20Sopenharmony_ci stvx v24,$x00,$key_ # off-load round[3] 25238c2ecf20Sopenharmony_ci ?vperm v25,v31,v26,$keyperm 25248c2ecf20Sopenharmony_ci lvx v28,$x30,$key1 25258c2ecf20Sopenharmony_ci stvx v25,$x10,$key_ # off-load round[4] 25268c2ecf20Sopenharmony_ci addi $key_,$sp,$FRAME+15 # rewind $key_ 25278c2ecf20Sopenharmony_ci ?vperm v26,v26,v27,$keyperm 25288c2ecf20Sopenharmony_ci lvx v29,$x40,$key1 25298c2ecf20Sopenharmony_ci ?vperm v27,v27,v28,$keyperm 25308c2ecf20Sopenharmony_ci lvx v30,$x50,$key1 25318c2ecf20Sopenharmony_ci ?vperm v28,v28,v29,$keyperm 25328c2ecf20Sopenharmony_ci lvx v31,$x60,$key1 25338c2ecf20Sopenharmony_ci ?vperm v29,v29,v30,$keyperm 25348c2ecf20Sopenharmony_ci lvx $twk5,$x70,$key1 # borrow $twk5 25358c2ecf20Sopenharmony_ci ?vperm v30,v30,v31,$keyperm 25368c2ecf20Sopenharmony_ci lvx v24,$x00,$key_ # pre-load round[1] 25378c2ecf20Sopenharmony_ci ?vperm v31,v31,$twk5,$keyperm 25388c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # pre-load round[2] 25398c2ecf20Sopenharmony_ci 25408c2ecf20Sopenharmony_ci vperm $in0,$inout,$inptail,$inpperm 25418c2ecf20Sopenharmony_ci subi $inp,$inp,31 # undo "caller" 25428c2ecf20Sopenharmony_ci vxor $twk0,$tweak,$rndkey0 25438c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 25448c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 25458c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 25468c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 25478c2ecf20Sopenharmony_ci vxor $out0,$in0,$twk0 25488c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 25498c2ecf20Sopenharmony_ci 25508c2ecf20Sopenharmony_ci lvx_u $in1,$x10,$inp 25518c2ecf20Sopenharmony_ci vxor $twk1,$tweak,$rndkey0 25528c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 25538c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 25548c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 25558c2ecf20Sopenharmony_ci le?vperm $in1,$in1,$in1,$leperm 25568c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 25578c2ecf20Sopenharmony_ci vxor $out1,$in1,$twk1 25588c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 25598c2ecf20Sopenharmony_ci 25608c2ecf20Sopenharmony_ci lvx_u $in2,$x20,$inp 25618c2ecf20Sopenharmony_ci andi. $taillen,$len,15 25628c2ecf20Sopenharmony_ci vxor $twk2,$tweak,$rndkey0 25638c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 25648c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 25658c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 25668c2ecf20Sopenharmony_ci le?vperm $in2,$in2,$in2,$leperm 25678c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 25688c2ecf20Sopenharmony_ci vxor $out2,$in2,$twk2 25698c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 25708c2ecf20Sopenharmony_ci 25718c2ecf20Sopenharmony_ci lvx_u $in3,$x30,$inp 25728c2ecf20Sopenharmony_ci sub $len,$len,$taillen 25738c2ecf20Sopenharmony_ci vxor $twk3,$tweak,$rndkey0 25748c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 25758c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 25768c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 25778c2ecf20Sopenharmony_ci le?vperm $in3,$in3,$in3,$leperm 25788c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 25798c2ecf20Sopenharmony_ci vxor $out3,$in3,$twk3 25808c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 25818c2ecf20Sopenharmony_ci 25828c2ecf20Sopenharmony_ci lvx_u $in4,$x40,$inp 25838c2ecf20Sopenharmony_ci subi $len,$len,0x60 25848c2ecf20Sopenharmony_ci vxor $twk4,$tweak,$rndkey0 25858c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 25868c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 25878c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 25888c2ecf20Sopenharmony_ci le?vperm $in4,$in4,$in4,$leperm 25898c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 25908c2ecf20Sopenharmony_ci vxor $out4,$in4,$twk4 25918c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 25928c2ecf20Sopenharmony_ci 25938c2ecf20Sopenharmony_ci lvx_u $in5,$x50,$inp 25948c2ecf20Sopenharmony_ci addi $inp,$inp,0x60 25958c2ecf20Sopenharmony_ci vxor $twk5,$tweak,$rndkey0 25968c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 25978c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 25988c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 25998c2ecf20Sopenharmony_ci le?vperm $in5,$in5,$in5,$leperm 26008c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 26018c2ecf20Sopenharmony_ci vxor $out5,$in5,$twk5 26028c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 26038c2ecf20Sopenharmony_ci 26048c2ecf20Sopenharmony_ci vxor v31,v31,$rndkey0 26058c2ecf20Sopenharmony_ci mtctr $rounds 26068c2ecf20Sopenharmony_ci b Loop_xts_enc6x 26078c2ecf20Sopenharmony_ci 26088c2ecf20Sopenharmony_ci.align 5 26098c2ecf20Sopenharmony_ciLoop_xts_enc6x: 26108c2ecf20Sopenharmony_ci vcipher $out0,$out0,v24 26118c2ecf20Sopenharmony_ci vcipher $out1,$out1,v24 26128c2ecf20Sopenharmony_ci vcipher $out2,$out2,v24 26138c2ecf20Sopenharmony_ci vcipher $out3,$out3,v24 26148c2ecf20Sopenharmony_ci vcipher $out4,$out4,v24 26158c2ecf20Sopenharmony_ci vcipher $out5,$out5,v24 26168c2ecf20Sopenharmony_ci lvx v24,$x20,$key_ # round[3] 26178c2ecf20Sopenharmony_ci addi $key_,$key_,0x20 26188c2ecf20Sopenharmony_ci 26198c2ecf20Sopenharmony_ci vcipher $out0,$out0,v25 26208c2ecf20Sopenharmony_ci vcipher $out1,$out1,v25 26218c2ecf20Sopenharmony_ci vcipher $out2,$out2,v25 26228c2ecf20Sopenharmony_ci vcipher $out3,$out3,v25 26238c2ecf20Sopenharmony_ci vcipher $out4,$out4,v25 26248c2ecf20Sopenharmony_ci vcipher $out5,$out5,v25 26258c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # round[4] 26268c2ecf20Sopenharmony_ci bdnz Loop_xts_enc6x 26278c2ecf20Sopenharmony_ci 26288c2ecf20Sopenharmony_ci subic $len,$len,96 # $len-=96 26298c2ecf20Sopenharmony_ci vxor $in0,$twk0,v31 # xor with last round key 26308c2ecf20Sopenharmony_ci vcipher $out0,$out0,v24 26318c2ecf20Sopenharmony_ci vcipher $out1,$out1,v24 26328c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 26338c2ecf20Sopenharmony_ci vxor $twk0,$tweak,$rndkey0 26348c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 26358c2ecf20Sopenharmony_ci vcipher $out2,$out2,v24 26368c2ecf20Sopenharmony_ci vcipher $out3,$out3,v24 26378c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 26388c2ecf20Sopenharmony_ci vcipher $out4,$out4,v24 26398c2ecf20Sopenharmony_ci vcipher $out5,$out5,v24 26408c2ecf20Sopenharmony_ci 26418c2ecf20Sopenharmony_ci subfe. r0,r0,r0 # borrow?-1:0 26428c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 26438c2ecf20Sopenharmony_ci vcipher $out0,$out0,v25 26448c2ecf20Sopenharmony_ci vcipher $out1,$out1,v25 26458c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 26468c2ecf20Sopenharmony_ci vcipher $out2,$out2,v25 26478c2ecf20Sopenharmony_ci vcipher $out3,$out3,v25 26488c2ecf20Sopenharmony_ci vxor $in1,$twk1,v31 26498c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 26508c2ecf20Sopenharmony_ci vxor $twk1,$tweak,$rndkey0 26518c2ecf20Sopenharmony_ci vcipher $out4,$out4,v25 26528c2ecf20Sopenharmony_ci vcipher $out5,$out5,v25 26538c2ecf20Sopenharmony_ci 26548c2ecf20Sopenharmony_ci and r0,r0,$len 26558c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 26568c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 26578c2ecf20Sopenharmony_ci vcipher $out0,$out0,v26 26588c2ecf20Sopenharmony_ci vcipher $out1,$out1,v26 26598c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 26608c2ecf20Sopenharmony_ci vcipher $out2,$out2,v26 26618c2ecf20Sopenharmony_ci vcipher $out3,$out3,v26 26628c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 26638c2ecf20Sopenharmony_ci vcipher $out4,$out4,v26 26648c2ecf20Sopenharmony_ci vcipher $out5,$out5,v26 26658c2ecf20Sopenharmony_ci 26668c2ecf20Sopenharmony_ci add $inp,$inp,r0 # $inp is adjusted in such 26678c2ecf20Sopenharmony_ci # way that at exit from the 26688c2ecf20Sopenharmony_ci # loop inX-in5 are loaded 26698c2ecf20Sopenharmony_ci # with last "words" 26708c2ecf20Sopenharmony_ci vxor $in2,$twk2,v31 26718c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 26728c2ecf20Sopenharmony_ci vxor $twk2,$tweak,$rndkey0 26738c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 26748c2ecf20Sopenharmony_ci vcipher $out0,$out0,v27 26758c2ecf20Sopenharmony_ci vcipher $out1,$out1,v27 26768c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 26778c2ecf20Sopenharmony_ci vcipher $out2,$out2,v27 26788c2ecf20Sopenharmony_ci vcipher $out3,$out3,v27 26798c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 26808c2ecf20Sopenharmony_ci vcipher $out4,$out4,v27 26818c2ecf20Sopenharmony_ci vcipher $out5,$out5,v27 26828c2ecf20Sopenharmony_ci 26838c2ecf20Sopenharmony_ci addi $key_,$sp,$FRAME+15 # rewind $key_ 26848c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 26858c2ecf20Sopenharmony_ci vcipher $out0,$out0,v28 26868c2ecf20Sopenharmony_ci vcipher $out1,$out1,v28 26878c2ecf20Sopenharmony_ci vxor $in3,$twk3,v31 26888c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 26898c2ecf20Sopenharmony_ci vxor $twk3,$tweak,$rndkey0 26908c2ecf20Sopenharmony_ci vcipher $out2,$out2,v28 26918c2ecf20Sopenharmony_ci vcipher $out3,$out3,v28 26928c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 26938c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 26948c2ecf20Sopenharmony_ci vcipher $out4,$out4,v28 26958c2ecf20Sopenharmony_ci vcipher $out5,$out5,v28 26968c2ecf20Sopenharmony_ci lvx v24,$x00,$key_ # re-pre-load round[1] 26978c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 26988c2ecf20Sopenharmony_ci 26998c2ecf20Sopenharmony_ci vcipher $out0,$out0,v29 27008c2ecf20Sopenharmony_ci vcipher $out1,$out1,v29 27018c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 27028c2ecf20Sopenharmony_ci vcipher $out2,$out2,v29 27038c2ecf20Sopenharmony_ci vcipher $out3,$out3,v29 27048c2ecf20Sopenharmony_ci vxor $in4,$twk4,v31 27058c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 27068c2ecf20Sopenharmony_ci vxor $twk4,$tweak,$rndkey0 27078c2ecf20Sopenharmony_ci vcipher $out4,$out4,v29 27088c2ecf20Sopenharmony_ci vcipher $out5,$out5,v29 27098c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # re-pre-load round[2] 27108c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 27118c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 27128c2ecf20Sopenharmony_ci 27138c2ecf20Sopenharmony_ci vcipher $out0,$out0,v30 27148c2ecf20Sopenharmony_ci vcipher $out1,$out1,v30 27158c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 27168c2ecf20Sopenharmony_ci vcipher $out2,$out2,v30 27178c2ecf20Sopenharmony_ci vcipher $out3,$out3,v30 27188c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 27198c2ecf20Sopenharmony_ci vcipher $out4,$out4,v30 27208c2ecf20Sopenharmony_ci vcipher $out5,$out5,v30 27218c2ecf20Sopenharmony_ci vxor $in5,$twk5,v31 27228c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 27238c2ecf20Sopenharmony_ci vxor $twk5,$tweak,$rndkey0 27248c2ecf20Sopenharmony_ci 27258c2ecf20Sopenharmony_ci vcipherlast $out0,$out0,$in0 27268c2ecf20Sopenharmony_ci lvx_u $in0,$x00,$inp # load next input block 27278c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 27288c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 27298c2ecf20Sopenharmony_ci vcipherlast $out1,$out1,$in1 27308c2ecf20Sopenharmony_ci lvx_u $in1,$x10,$inp 27318c2ecf20Sopenharmony_ci vcipherlast $out2,$out2,$in2 27328c2ecf20Sopenharmony_ci le?vperm $in0,$in0,$in0,$leperm 27338c2ecf20Sopenharmony_ci lvx_u $in2,$x20,$inp 27348c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 27358c2ecf20Sopenharmony_ci vcipherlast $out3,$out3,$in3 27368c2ecf20Sopenharmony_ci le?vperm $in1,$in1,$in1,$leperm 27378c2ecf20Sopenharmony_ci lvx_u $in3,$x30,$inp 27388c2ecf20Sopenharmony_ci vcipherlast $out4,$out4,$in4 27398c2ecf20Sopenharmony_ci le?vperm $in2,$in2,$in2,$leperm 27408c2ecf20Sopenharmony_ci lvx_u $in4,$x40,$inp 27418c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 27428c2ecf20Sopenharmony_ci vcipherlast $tmp,$out5,$in5 # last block might be needed 27438c2ecf20Sopenharmony_ci # in stealing mode 27448c2ecf20Sopenharmony_ci le?vperm $in3,$in3,$in3,$leperm 27458c2ecf20Sopenharmony_ci lvx_u $in5,$x50,$inp 27468c2ecf20Sopenharmony_ci addi $inp,$inp,0x60 27478c2ecf20Sopenharmony_ci le?vperm $in4,$in4,$in4,$leperm 27488c2ecf20Sopenharmony_ci le?vperm $in5,$in5,$in5,$leperm 27498c2ecf20Sopenharmony_ci 27508c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$leperm 27518c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$leperm 27528c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out # store output 27538c2ecf20Sopenharmony_ci vxor $out0,$in0,$twk0 27548c2ecf20Sopenharmony_ci le?vperm $out2,$out2,$out2,$leperm 27558c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 27568c2ecf20Sopenharmony_ci vxor $out1,$in1,$twk1 27578c2ecf20Sopenharmony_ci le?vperm $out3,$out3,$out3,$leperm 27588c2ecf20Sopenharmony_ci stvx_u $out2,$x20,$out 27598c2ecf20Sopenharmony_ci vxor $out2,$in2,$twk2 27608c2ecf20Sopenharmony_ci le?vperm $out4,$out4,$out4,$leperm 27618c2ecf20Sopenharmony_ci stvx_u $out3,$x30,$out 27628c2ecf20Sopenharmony_ci vxor $out3,$in3,$twk3 27638c2ecf20Sopenharmony_ci le?vperm $out5,$tmp,$tmp,$leperm 27648c2ecf20Sopenharmony_ci stvx_u $out4,$x40,$out 27658c2ecf20Sopenharmony_ci vxor $out4,$in4,$twk4 27668c2ecf20Sopenharmony_ci le?stvx_u $out5,$x50,$out 27678c2ecf20Sopenharmony_ci be?stvx_u $tmp, $x50,$out 27688c2ecf20Sopenharmony_ci vxor $out5,$in5,$twk5 27698c2ecf20Sopenharmony_ci addi $out,$out,0x60 27708c2ecf20Sopenharmony_ci 27718c2ecf20Sopenharmony_ci mtctr $rounds 27728c2ecf20Sopenharmony_ci beq Loop_xts_enc6x # did $len-=96 borrow? 27738c2ecf20Sopenharmony_ci 27748c2ecf20Sopenharmony_ci addic. $len,$len,0x60 27758c2ecf20Sopenharmony_ci beq Lxts_enc6x_zero 27768c2ecf20Sopenharmony_ci cmpwi $len,0x20 27778c2ecf20Sopenharmony_ci blt Lxts_enc6x_one 27788c2ecf20Sopenharmony_ci nop 27798c2ecf20Sopenharmony_ci beq Lxts_enc6x_two 27808c2ecf20Sopenharmony_ci cmpwi $len,0x40 27818c2ecf20Sopenharmony_ci blt Lxts_enc6x_three 27828c2ecf20Sopenharmony_ci nop 27838c2ecf20Sopenharmony_ci beq Lxts_enc6x_four 27848c2ecf20Sopenharmony_ci 27858c2ecf20Sopenharmony_ciLxts_enc6x_five: 27868c2ecf20Sopenharmony_ci vxor $out0,$in1,$twk0 27878c2ecf20Sopenharmony_ci vxor $out1,$in2,$twk1 27888c2ecf20Sopenharmony_ci vxor $out2,$in3,$twk2 27898c2ecf20Sopenharmony_ci vxor $out3,$in4,$twk3 27908c2ecf20Sopenharmony_ci vxor $out4,$in5,$twk4 27918c2ecf20Sopenharmony_ci 27928c2ecf20Sopenharmony_ci bl _aesp8_xts_enc5x 27938c2ecf20Sopenharmony_ci 27948c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$leperm 27958c2ecf20Sopenharmony_ci vmr $twk0,$twk5 # unused tweak 27968c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$leperm 27978c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out # store output 27988c2ecf20Sopenharmony_ci le?vperm $out2,$out2,$out2,$leperm 27998c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 28008c2ecf20Sopenharmony_ci le?vperm $out3,$out3,$out3,$leperm 28018c2ecf20Sopenharmony_ci stvx_u $out2,$x20,$out 28028c2ecf20Sopenharmony_ci vxor $tmp,$out4,$twk5 # last block prep for stealing 28038c2ecf20Sopenharmony_ci le?vperm $out4,$out4,$out4,$leperm 28048c2ecf20Sopenharmony_ci stvx_u $out3,$x30,$out 28058c2ecf20Sopenharmony_ci stvx_u $out4,$x40,$out 28068c2ecf20Sopenharmony_ci addi $out,$out,0x50 28078c2ecf20Sopenharmony_ci bne Lxts_enc6x_steal 28088c2ecf20Sopenharmony_ci b Lxts_enc6x_done 28098c2ecf20Sopenharmony_ci 28108c2ecf20Sopenharmony_ci.align 4 28118c2ecf20Sopenharmony_ciLxts_enc6x_four: 28128c2ecf20Sopenharmony_ci vxor $out0,$in2,$twk0 28138c2ecf20Sopenharmony_ci vxor $out1,$in3,$twk1 28148c2ecf20Sopenharmony_ci vxor $out2,$in4,$twk2 28158c2ecf20Sopenharmony_ci vxor $out3,$in5,$twk3 28168c2ecf20Sopenharmony_ci vxor $out4,$out4,$out4 28178c2ecf20Sopenharmony_ci 28188c2ecf20Sopenharmony_ci bl _aesp8_xts_enc5x 28198c2ecf20Sopenharmony_ci 28208c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$leperm 28218c2ecf20Sopenharmony_ci vmr $twk0,$twk4 # unused tweak 28228c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$leperm 28238c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out # store output 28248c2ecf20Sopenharmony_ci le?vperm $out2,$out2,$out2,$leperm 28258c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 28268c2ecf20Sopenharmony_ci vxor $tmp,$out3,$twk4 # last block prep for stealing 28278c2ecf20Sopenharmony_ci le?vperm $out3,$out3,$out3,$leperm 28288c2ecf20Sopenharmony_ci stvx_u $out2,$x20,$out 28298c2ecf20Sopenharmony_ci stvx_u $out3,$x30,$out 28308c2ecf20Sopenharmony_ci addi $out,$out,0x40 28318c2ecf20Sopenharmony_ci bne Lxts_enc6x_steal 28328c2ecf20Sopenharmony_ci b Lxts_enc6x_done 28338c2ecf20Sopenharmony_ci 28348c2ecf20Sopenharmony_ci.align 4 28358c2ecf20Sopenharmony_ciLxts_enc6x_three: 28368c2ecf20Sopenharmony_ci vxor $out0,$in3,$twk0 28378c2ecf20Sopenharmony_ci vxor $out1,$in4,$twk1 28388c2ecf20Sopenharmony_ci vxor $out2,$in5,$twk2 28398c2ecf20Sopenharmony_ci vxor $out3,$out3,$out3 28408c2ecf20Sopenharmony_ci vxor $out4,$out4,$out4 28418c2ecf20Sopenharmony_ci 28428c2ecf20Sopenharmony_ci bl _aesp8_xts_enc5x 28438c2ecf20Sopenharmony_ci 28448c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$leperm 28458c2ecf20Sopenharmony_ci vmr $twk0,$twk3 # unused tweak 28468c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$leperm 28478c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out # store output 28488c2ecf20Sopenharmony_ci vxor $tmp,$out2,$twk3 # last block prep for stealing 28498c2ecf20Sopenharmony_ci le?vperm $out2,$out2,$out2,$leperm 28508c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 28518c2ecf20Sopenharmony_ci stvx_u $out2,$x20,$out 28528c2ecf20Sopenharmony_ci addi $out,$out,0x30 28538c2ecf20Sopenharmony_ci bne Lxts_enc6x_steal 28548c2ecf20Sopenharmony_ci b Lxts_enc6x_done 28558c2ecf20Sopenharmony_ci 28568c2ecf20Sopenharmony_ci.align 4 28578c2ecf20Sopenharmony_ciLxts_enc6x_two: 28588c2ecf20Sopenharmony_ci vxor $out0,$in4,$twk0 28598c2ecf20Sopenharmony_ci vxor $out1,$in5,$twk1 28608c2ecf20Sopenharmony_ci vxor $out2,$out2,$out2 28618c2ecf20Sopenharmony_ci vxor $out3,$out3,$out3 28628c2ecf20Sopenharmony_ci vxor $out4,$out4,$out4 28638c2ecf20Sopenharmony_ci 28648c2ecf20Sopenharmony_ci bl _aesp8_xts_enc5x 28658c2ecf20Sopenharmony_ci 28668c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$leperm 28678c2ecf20Sopenharmony_ci vmr $twk0,$twk2 # unused tweak 28688c2ecf20Sopenharmony_ci vxor $tmp,$out1,$twk2 # last block prep for stealing 28698c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$leperm 28708c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out # store output 28718c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 28728c2ecf20Sopenharmony_ci addi $out,$out,0x20 28738c2ecf20Sopenharmony_ci bne Lxts_enc6x_steal 28748c2ecf20Sopenharmony_ci b Lxts_enc6x_done 28758c2ecf20Sopenharmony_ci 28768c2ecf20Sopenharmony_ci.align 4 28778c2ecf20Sopenharmony_ciLxts_enc6x_one: 28788c2ecf20Sopenharmony_ci vxor $out0,$in5,$twk0 28798c2ecf20Sopenharmony_ci nop 28808c2ecf20Sopenharmony_ciLoop_xts_enc1x: 28818c2ecf20Sopenharmony_ci vcipher $out0,$out0,v24 28828c2ecf20Sopenharmony_ci lvx v24,$x20,$key_ # round[3] 28838c2ecf20Sopenharmony_ci addi $key_,$key_,0x20 28848c2ecf20Sopenharmony_ci 28858c2ecf20Sopenharmony_ci vcipher $out0,$out0,v25 28868c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # round[4] 28878c2ecf20Sopenharmony_ci bdnz Loop_xts_enc1x 28888c2ecf20Sopenharmony_ci 28898c2ecf20Sopenharmony_ci add $inp,$inp,$taillen 28908c2ecf20Sopenharmony_ci cmpwi $taillen,0 28918c2ecf20Sopenharmony_ci vcipher $out0,$out0,v24 28928c2ecf20Sopenharmony_ci 28938c2ecf20Sopenharmony_ci subi $inp,$inp,16 28948c2ecf20Sopenharmony_ci vcipher $out0,$out0,v25 28958c2ecf20Sopenharmony_ci 28968c2ecf20Sopenharmony_ci lvsr $inpperm,0,$taillen 28978c2ecf20Sopenharmony_ci vcipher $out0,$out0,v26 28988c2ecf20Sopenharmony_ci 28998c2ecf20Sopenharmony_ci lvx_u $in0,0,$inp 29008c2ecf20Sopenharmony_ci vcipher $out0,$out0,v27 29018c2ecf20Sopenharmony_ci 29028c2ecf20Sopenharmony_ci addi $key_,$sp,$FRAME+15 # rewind $key_ 29038c2ecf20Sopenharmony_ci vcipher $out0,$out0,v28 29048c2ecf20Sopenharmony_ci lvx v24,$x00,$key_ # re-pre-load round[1] 29058c2ecf20Sopenharmony_ci 29068c2ecf20Sopenharmony_ci vcipher $out0,$out0,v29 29078c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # re-pre-load round[2] 29088c2ecf20Sopenharmony_ci vxor $twk0,$twk0,v31 29098c2ecf20Sopenharmony_ci 29108c2ecf20Sopenharmony_ci le?vperm $in0,$in0,$in0,$leperm 29118c2ecf20Sopenharmony_ci vcipher $out0,$out0,v30 29128c2ecf20Sopenharmony_ci 29138c2ecf20Sopenharmony_ci vperm $in0,$in0,$in0,$inpperm 29148c2ecf20Sopenharmony_ci vcipherlast $out0,$out0,$twk0 29158c2ecf20Sopenharmony_ci 29168c2ecf20Sopenharmony_ci vmr $twk0,$twk1 # unused tweak 29178c2ecf20Sopenharmony_ci vxor $tmp,$out0,$twk1 # last block prep for stealing 29188c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$leperm 29198c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out # store output 29208c2ecf20Sopenharmony_ci addi $out,$out,0x10 29218c2ecf20Sopenharmony_ci bne Lxts_enc6x_steal 29228c2ecf20Sopenharmony_ci b Lxts_enc6x_done 29238c2ecf20Sopenharmony_ci 29248c2ecf20Sopenharmony_ci.align 4 29258c2ecf20Sopenharmony_ciLxts_enc6x_zero: 29268c2ecf20Sopenharmony_ci cmpwi $taillen,0 29278c2ecf20Sopenharmony_ci beq Lxts_enc6x_done 29288c2ecf20Sopenharmony_ci 29298c2ecf20Sopenharmony_ci add $inp,$inp,$taillen 29308c2ecf20Sopenharmony_ci subi $inp,$inp,16 29318c2ecf20Sopenharmony_ci lvx_u $in0,0,$inp 29328c2ecf20Sopenharmony_ci lvsr $inpperm,0,$taillen # $in5 is no more 29338c2ecf20Sopenharmony_ci le?vperm $in0,$in0,$in0,$leperm 29348c2ecf20Sopenharmony_ci vperm $in0,$in0,$in0,$inpperm 29358c2ecf20Sopenharmony_ci vxor $tmp,$tmp,$twk0 29368c2ecf20Sopenharmony_ciLxts_enc6x_steal: 29378c2ecf20Sopenharmony_ci vxor $in0,$in0,$twk0 29388c2ecf20Sopenharmony_ci vxor $out0,$out0,$out0 29398c2ecf20Sopenharmony_ci vspltisb $out1,-1 29408c2ecf20Sopenharmony_ci vperm $out0,$out0,$out1,$inpperm 29418c2ecf20Sopenharmony_ci vsel $out0,$in0,$tmp,$out0 # $tmp is last block, remember? 29428c2ecf20Sopenharmony_ci 29438c2ecf20Sopenharmony_ci subi r30,$out,17 29448c2ecf20Sopenharmony_ci subi $out,$out,16 29458c2ecf20Sopenharmony_ci mtctr $taillen 29468c2ecf20Sopenharmony_ciLoop_xts_enc6x_steal: 29478c2ecf20Sopenharmony_ci lbzu r0,1(r30) 29488c2ecf20Sopenharmony_ci stb r0,16(r30) 29498c2ecf20Sopenharmony_ci bdnz Loop_xts_enc6x_steal 29508c2ecf20Sopenharmony_ci 29518c2ecf20Sopenharmony_ci li $taillen,0 29528c2ecf20Sopenharmony_ci mtctr $rounds 29538c2ecf20Sopenharmony_ci b Loop_xts_enc1x # one more time... 29548c2ecf20Sopenharmony_ci 29558c2ecf20Sopenharmony_ci.align 4 29568c2ecf20Sopenharmony_ciLxts_enc6x_done: 29578c2ecf20Sopenharmony_ci ${UCMP}i $ivp,0 29588c2ecf20Sopenharmony_ci beq Lxts_enc6x_ret 29598c2ecf20Sopenharmony_ci 29608c2ecf20Sopenharmony_ci vxor $tweak,$twk0,$rndkey0 29618c2ecf20Sopenharmony_ci le?vperm $tweak,$tweak,$tweak,$leperm 29628c2ecf20Sopenharmony_ci stvx_u $tweak,0,$ivp 29638c2ecf20Sopenharmony_ci 29648c2ecf20Sopenharmony_ciLxts_enc6x_ret: 29658c2ecf20Sopenharmony_ci mtlr r11 29668c2ecf20Sopenharmony_ci li r10,`$FRAME+15` 29678c2ecf20Sopenharmony_ci li r11,`$FRAME+31` 29688c2ecf20Sopenharmony_ci stvx $seven,r10,$sp # wipe copies of round keys 29698c2ecf20Sopenharmony_ci addi r10,r10,32 29708c2ecf20Sopenharmony_ci stvx $seven,r11,$sp 29718c2ecf20Sopenharmony_ci addi r11,r11,32 29728c2ecf20Sopenharmony_ci stvx $seven,r10,$sp 29738c2ecf20Sopenharmony_ci addi r10,r10,32 29748c2ecf20Sopenharmony_ci stvx $seven,r11,$sp 29758c2ecf20Sopenharmony_ci addi r11,r11,32 29768c2ecf20Sopenharmony_ci stvx $seven,r10,$sp 29778c2ecf20Sopenharmony_ci addi r10,r10,32 29788c2ecf20Sopenharmony_ci stvx $seven,r11,$sp 29798c2ecf20Sopenharmony_ci addi r11,r11,32 29808c2ecf20Sopenharmony_ci stvx $seven,r10,$sp 29818c2ecf20Sopenharmony_ci addi r10,r10,32 29828c2ecf20Sopenharmony_ci stvx $seven,r11,$sp 29838c2ecf20Sopenharmony_ci addi r11,r11,32 29848c2ecf20Sopenharmony_ci 29858c2ecf20Sopenharmony_ci mtspr 256,$vrsave 29868c2ecf20Sopenharmony_ci lvx v20,r10,$sp # ABI says so 29878c2ecf20Sopenharmony_ci addi r10,r10,32 29888c2ecf20Sopenharmony_ci lvx v21,r11,$sp 29898c2ecf20Sopenharmony_ci addi r11,r11,32 29908c2ecf20Sopenharmony_ci lvx v22,r10,$sp 29918c2ecf20Sopenharmony_ci addi r10,r10,32 29928c2ecf20Sopenharmony_ci lvx v23,r11,$sp 29938c2ecf20Sopenharmony_ci addi r11,r11,32 29948c2ecf20Sopenharmony_ci lvx v24,r10,$sp 29958c2ecf20Sopenharmony_ci addi r10,r10,32 29968c2ecf20Sopenharmony_ci lvx v25,r11,$sp 29978c2ecf20Sopenharmony_ci addi r11,r11,32 29988c2ecf20Sopenharmony_ci lvx v26,r10,$sp 29998c2ecf20Sopenharmony_ci addi r10,r10,32 30008c2ecf20Sopenharmony_ci lvx v27,r11,$sp 30018c2ecf20Sopenharmony_ci addi r11,r11,32 30028c2ecf20Sopenharmony_ci lvx v28,r10,$sp 30038c2ecf20Sopenharmony_ci addi r10,r10,32 30048c2ecf20Sopenharmony_ci lvx v29,r11,$sp 30058c2ecf20Sopenharmony_ci addi r11,r11,32 30068c2ecf20Sopenharmony_ci lvx v30,r10,$sp 30078c2ecf20Sopenharmony_ci lvx v31,r11,$sp 30088c2ecf20Sopenharmony_ci $POP r26,`$FRAME+21*16+0*$SIZE_T`($sp) 30098c2ecf20Sopenharmony_ci $POP r27,`$FRAME+21*16+1*$SIZE_T`($sp) 30108c2ecf20Sopenharmony_ci $POP r28,`$FRAME+21*16+2*$SIZE_T`($sp) 30118c2ecf20Sopenharmony_ci $POP r29,`$FRAME+21*16+3*$SIZE_T`($sp) 30128c2ecf20Sopenharmony_ci $POP r30,`$FRAME+21*16+4*$SIZE_T`($sp) 30138c2ecf20Sopenharmony_ci $POP r31,`$FRAME+21*16+5*$SIZE_T`($sp) 30148c2ecf20Sopenharmony_ci addi $sp,$sp,`$FRAME+21*16+6*$SIZE_T` 30158c2ecf20Sopenharmony_ci blr 30168c2ecf20Sopenharmony_ci .long 0 30178c2ecf20Sopenharmony_ci .byte 0,12,0x04,1,0x80,6,6,0 30188c2ecf20Sopenharmony_ci .long 0 30198c2ecf20Sopenharmony_ci 30208c2ecf20Sopenharmony_ci.align 5 30218c2ecf20Sopenharmony_ci_aesp8_xts_enc5x: 30228c2ecf20Sopenharmony_ci vcipher $out0,$out0,v24 30238c2ecf20Sopenharmony_ci vcipher $out1,$out1,v24 30248c2ecf20Sopenharmony_ci vcipher $out2,$out2,v24 30258c2ecf20Sopenharmony_ci vcipher $out3,$out3,v24 30268c2ecf20Sopenharmony_ci vcipher $out4,$out4,v24 30278c2ecf20Sopenharmony_ci lvx v24,$x20,$key_ # round[3] 30288c2ecf20Sopenharmony_ci addi $key_,$key_,0x20 30298c2ecf20Sopenharmony_ci 30308c2ecf20Sopenharmony_ci vcipher $out0,$out0,v25 30318c2ecf20Sopenharmony_ci vcipher $out1,$out1,v25 30328c2ecf20Sopenharmony_ci vcipher $out2,$out2,v25 30338c2ecf20Sopenharmony_ci vcipher $out3,$out3,v25 30348c2ecf20Sopenharmony_ci vcipher $out4,$out4,v25 30358c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # round[4] 30368c2ecf20Sopenharmony_ci bdnz _aesp8_xts_enc5x 30378c2ecf20Sopenharmony_ci 30388c2ecf20Sopenharmony_ci add $inp,$inp,$taillen 30398c2ecf20Sopenharmony_ci cmpwi $taillen,0 30408c2ecf20Sopenharmony_ci vcipher $out0,$out0,v24 30418c2ecf20Sopenharmony_ci vcipher $out1,$out1,v24 30428c2ecf20Sopenharmony_ci vcipher $out2,$out2,v24 30438c2ecf20Sopenharmony_ci vcipher $out3,$out3,v24 30448c2ecf20Sopenharmony_ci vcipher $out4,$out4,v24 30458c2ecf20Sopenharmony_ci 30468c2ecf20Sopenharmony_ci subi $inp,$inp,16 30478c2ecf20Sopenharmony_ci vcipher $out0,$out0,v25 30488c2ecf20Sopenharmony_ci vcipher $out1,$out1,v25 30498c2ecf20Sopenharmony_ci vcipher $out2,$out2,v25 30508c2ecf20Sopenharmony_ci vcipher $out3,$out3,v25 30518c2ecf20Sopenharmony_ci vcipher $out4,$out4,v25 30528c2ecf20Sopenharmony_ci vxor $twk0,$twk0,v31 30538c2ecf20Sopenharmony_ci 30548c2ecf20Sopenharmony_ci vcipher $out0,$out0,v26 30558c2ecf20Sopenharmony_ci lvsr $inpperm,r0,$taillen # $in5 is no more 30568c2ecf20Sopenharmony_ci vcipher $out1,$out1,v26 30578c2ecf20Sopenharmony_ci vcipher $out2,$out2,v26 30588c2ecf20Sopenharmony_ci vcipher $out3,$out3,v26 30598c2ecf20Sopenharmony_ci vcipher $out4,$out4,v26 30608c2ecf20Sopenharmony_ci vxor $in1,$twk1,v31 30618c2ecf20Sopenharmony_ci 30628c2ecf20Sopenharmony_ci vcipher $out0,$out0,v27 30638c2ecf20Sopenharmony_ci lvx_u $in0,0,$inp 30648c2ecf20Sopenharmony_ci vcipher $out1,$out1,v27 30658c2ecf20Sopenharmony_ci vcipher $out2,$out2,v27 30668c2ecf20Sopenharmony_ci vcipher $out3,$out3,v27 30678c2ecf20Sopenharmony_ci vcipher $out4,$out4,v27 30688c2ecf20Sopenharmony_ci vxor $in2,$twk2,v31 30698c2ecf20Sopenharmony_ci 30708c2ecf20Sopenharmony_ci addi $key_,$sp,$FRAME+15 # rewind $key_ 30718c2ecf20Sopenharmony_ci vcipher $out0,$out0,v28 30728c2ecf20Sopenharmony_ci vcipher $out1,$out1,v28 30738c2ecf20Sopenharmony_ci vcipher $out2,$out2,v28 30748c2ecf20Sopenharmony_ci vcipher $out3,$out3,v28 30758c2ecf20Sopenharmony_ci vcipher $out4,$out4,v28 30768c2ecf20Sopenharmony_ci lvx v24,$x00,$key_ # re-pre-load round[1] 30778c2ecf20Sopenharmony_ci vxor $in3,$twk3,v31 30788c2ecf20Sopenharmony_ci 30798c2ecf20Sopenharmony_ci vcipher $out0,$out0,v29 30808c2ecf20Sopenharmony_ci le?vperm $in0,$in0,$in0,$leperm 30818c2ecf20Sopenharmony_ci vcipher $out1,$out1,v29 30828c2ecf20Sopenharmony_ci vcipher $out2,$out2,v29 30838c2ecf20Sopenharmony_ci vcipher $out3,$out3,v29 30848c2ecf20Sopenharmony_ci vcipher $out4,$out4,v29 30858c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # re-pre-load round[2] 30868c2ecf20Sopenharmony_ci vxor $in4,$twk4,v31 30878c2ecf20Sopenharmony_ci 30888c2ecf20Sopenharmony_ci vcipher $out0,$out0,v30 30898c2ecf20Sopenharmony_ci vperm $in0,$in0,$in0,$inpperm 30908c2ecf20Sopenharmony_ci vcipher $out1,$out1,v30 30918c2ecf20Sopenharmony_ci vcipher $out2,$out2,v30 30928c2ecf20Sopenharmony_ci vcipher $out3,$out3,v30 30938c2ecf20Sopenharmony_ci vcipher $out4,$out4,v30 30948c2ecf20Sopenharmony_ci 30958c2ecf20Sopenharmony_ci vcipherlast $out0,$out0,$twk0 30968c2ecf20Sopenharmony_ci vcipherlast $out1,$out1,$in1 30978c2ecf20Sopenharmony_ci vcipherlast $out2,$out2,$in2 30988c2ecf20Sopenharmony_ci vcipherlast $out3,$out3,$in3 30998c2ecf20Sopenharmony_ci vcipherlast $out4,$out4,$in4 31008c2ecf20Sopenharmony_ci blr 31018c2ecf20Sopenharmony_ci .long 0 31028c2ecf20Sopenharmony_ci .byte 0,12,0x14,0,0,0,0,0 31038c2ecf20Sopenharmony_ci 31048c2ecf20Sopenharmony_ci.align 5 31058c2ecf20Sopenharmony_ci_aesp8_xts_decrypt6x: 31068c2ecf20Sopenharmony_ci $STU $sp,-`($FRAME+21*16+6*$SIZE_T)`($sp) 31078c2ecf20Sopenharmony_ci mflr r11 31088c2ecf20Sopenharmony_ci li r7,`$FRAME+8*16+15` 31098c2ecf20Sopenharmony_ci li r3,`$FRAME+8*16+31` 31108c2ecf20Sopenharmony_ci $PUSH r11,`$FRAME+21*16+6*$SIZE_T+$LRSAVE`($sp) 31118c2ecf20Sopenharmony_ci stvx v20,r7,$sp # ABI says so 31128c2ecf20Sopenharmony_ci addi r7,r7,32 31138c2ecf20Sopenharmony_ci stvx v21,r3,$sp 31148c2ecf20Sopenharmony_ci addi r3,r3,32 31158c2ecf20Sopenharmony_ci stvx v22,r7,$sp 31168c2ecf20Sopenharmony_ci addi r7,r7,32 31178c2ecf20Sopenharmony_ci stvx v23,r3,$sp 31188c2ecf20Sopenharmony_ci addi r3,r3,32 31198c2ecf20Sopenharmony_ci stvx v24,r7,$sp 31208c2ecf20Sopenharmony_ci addi r7,r7,32 31218c2ecf20Sopenharmony_ci stvx v25,r3,$sp 31228c2ecf20Sopenharmony_ci addi r3,r3,32 31238c2ecf20Sopenharmony_ci stvx v26,r7,$sp 31248c2ecf20Sopenharmony_ci addi r7,r7,32 31258c2ecf20Sopenharmony_ci stvx v27,r3,$sp 31268c2ecf20Sopenharmony_ci addi r3,r3,32 31278c2ecf20Sopenharmony_ci stvx v28,r7,$sp 31288c2ecf20Sopenharmony_ci addi r7,r7,32 31298c2ecf20Sopenharmony_ci stvx v29,r3,$sp 31308c2ecf20Sopenharmony_ci addi r3,r3,32 31318c2ecf20Sopenharmony_ci stvx v30,r7,$sp 31328c2ecf20Sopenharmony_ci stvx v31,r3,$sp 31338c2ecf20Sopenharmony_ci li r0,-1 31348c2ecf20Sopenharmony_ci stw $vrsave,`$FRAME+21*16-4`($sp) # save vrsave 31358c2ecf20Sopenharmony_ci li $x10,0x10 31368c2ecf20Sopenharmony_ci $PUSH r26,`$FRAME+21*16+0*$SIZE_T`($sp) 31378c2ecf20Sopenharmony_ci li $x20,0x20 31388c2ecf20Sopenharmony_ci $PUSH r27,`$FRAME+21*16+1*$SIZE_T`($sp) 31398c2ecf20Sopenharmony_ci li $x30,0x30 31408c2ecf20Sopenharmony_ci $PUSH r28,`$FRAME+21*16+2*$SIZE_T`($sp) 31418c2ecf20Sopenharmony_ci li $x40,0x40 31428c2ecf20Sopenharmony_ci $PUSH r29,`$FRAME+21*16+3*$SIZE_T`($sp) 31438c2ecf20Sopenharmony_ci li $x50,0x50 31448c2ecf20Sopenharmony_ci $PUSH r30,`$FRAME+21*16+4*$SIZE_T`($sp) 31458c2ecf20Sopenharmony_ci li $x60,0x60 31468c2ecf20Sopenharmony_ci $PUSH r31,`$FRAME+21*16+5*$SIZE_T`($sp) 31478c2ecf20Sopenharmony_ci li $x70,0x70 31488c2ecf20Sopenharmony_ci mtspr 256,r0 31498c2ecf20Sopenharmony_ci 31508c2ecf20Sopenharmony_ci subi $rounds,$rounds,3 # -4 in total 31518c2ecf20Sopenharmony_ci 31528c2ecf20Sopenharmony_ci lvx $rndkey0,$x00,$key1 # load key schedule 31538c2ecf20Sopenharmony_ci lvx v30,$x10,$key1 31548c2ecf20Sopenharmony_ci addi $key1,$key1,0x20 31558c2ecf20Sopenharmony_ci lvx v31,$x00,$key1 31568c2ecf20Sopenharmony_ci ?vperm $rndkey0,$rndkey0,v30,$keyperm 31578c2ecf20Sopenharmony_ci addi $key_,$sp,$FRAME+15 31588c2ecf20Sopenharmony_ci mtctr $rounds 31598c2ecf20Sopenharmony_ci 31608c2ecf20Sopenharmony_ciLoad_xts_dec_key: 31618c2ecf20Sopenharmony_ci ?vperm v24,v30,v31,$keyperm 31628c2ecf20Sopenharmony_ci lvx v30,$x10,$key1 31638c2ecf20Sopenharmony_ci addi $key1,$key1,0x20 31648c2ecf20Sopenharmony_ci stvx v24,$x00,$key_ # off-load round[1] 31658c2ecf20Sopenharmony_ci ?vperm v25,v31,v30,$keyperm 31668c2ecf20Sopenharmony_ci lvx v31,$x00,$key1 31678c2ecf20Sopenharmony_ci stvx v25,$x10,$key_ # off-load round[2] 31688c2ecf20Sopenharmony_ci addi $key_,$key_,0x20 31698c2ecf20Sopenharmony_ci bdnz Load_xts_dec_key 31708c2ecf20Sopenharmony_ci 31718c2ecf20Sopenharmony_ci lvx v26,$x10,$key1 31728c2ecf20Sopenharmony_ci ?vperm v24,v30,v31,$keyperm 31738c2ecf20Sopenharmony_ci lvx v27,$x20,$key1 31748c2ecf20Sopenharmony_ci stvx v24,$x00,$key_ # off-load round[3] 31758c2ecf20Sopenharmony_ci ?vperm v25,v31,v26,$keyperm 31768c2ecf20Sopenharmony_ci lvx v28,$x30,$key1 31778c2ecf20Sopenharmony_ci stvx v25,$x10,$key_ # off-load round[4] 31788c2ecf20Sopenharmony_ci addi $key_,$sp,$FRAME+15 # rewind $key_ 31798c2ecf20Sopenharmony_ci ?vperm v26,v26,v27,$keyperm 31808c2ecf20Sopenharmony_ci lvx v29,$x40,$key1 31818c2ecf20Sopenharmony_ci ?vperm v27,v27,v28,$keyperm 31828c2ecf20Sopenharmony_ci lvx v30,$x50,$key1 31838c2ecf20Sopenharmony_ci ?vperm v28,v28,v29,$keyperm 31848c2ecf20Sopenharmony_ci lvx v31,$x60,$key1 31858c2ecf20Sopenharmony_ci ?vperm v29,v29,v30,$keyperm 31868c2ecf20Sopenharmony_ci lvx $twk5,$x70,$key1 # borrow $twk5 31878c2ecf20Sopenharmony_ci ?vperm v30,v30,v31,$keyperm 31888c2ecf20Sopenharmony_ci lvx v24,$x00,$key_ # pre-load round[1] 31898c2ecf20Sopenharmony_ci ?vperm v31,v31,$twk5,$keyperm 31908c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # pre-load round[2] 31918c2ecf20Sopenharmony_ci 31928c2ecf20Sopenharmony_ci vperm $in0,$inout,$inptail,$inpperm 31938c2ecf20Sopenharmony_ci subi $inp,$inp,31 # undo "caller" 31948c2ecf20Sopenharmony_ci vxor $twk0,$tweak,$rndkey0 31958c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 31968c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 31978c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 31988c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 31998c2ecf20Sopenharmony_ci vxor $out0,$in0,$twk0 32008c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 32018c2ecf20Sopenharmony_ci 32028c2ecf20Sopenharmony_ci lvx_u $in1,$x10,$inp 32038c2ecf20Sopenharmony_ci vxor $twk1,$tweak,$rndkey0 32048c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 32058c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 32068c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 32078c2ecf20Sopenharmony_ci le?vperm $in1,$in1,$in1,$leperm 32088c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 32098c2ecf20Sopenharmony_ci vxor $out1,$in1,$twk1 32108c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 32118c2ecf20Sopenharmony_ci 32128c2ecf20Sopenharmony_ci lvx_u $in2,$x20,$inp 32138c2ecf20Sopenharmony_ci andi. $taillen,$len,15 32148c2ecf20Sopenharmony_ci vxor $twk2,$tweak,$rndkey0 32158c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 32168c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 32178c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 32188c2ecf20Sopenharmony_ci le?vperm $in2,$in2,$in2,$leperm 32198c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 32208c2ecf20Sopenharmony_ci vxor $out2,$in2,$twk2 32218c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 32228c2ecf20Sopenharmony_ci 32238c2ecf20Sopenharmony_ci lvx_u $in3,$x30,$inp 32248c2ecf20Sopenharmony_ci sub $len,$len,$taillen 32258c2ecf20Sopenharmony_ci vxor $twk3,$tweak,$rndkey0 32268c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 32278c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 32288c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 32298c2ecf20Sopenharmony_ci le?vperm $in3,$in3,$in3,$leperm 32308c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 32318c2ecf20Sopenharmony_ci vxor $out3,$in3,$twk3 32328c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 32338c2ecf20Sopenharmony_ci 32348c2ecf20Sopenharmony_ci lvx_u $in4,$x40,$inp 32358c2ecf20Sopenharmony_ci subi $len,$len,0x60 32368c2ecf20Sopenharmony_ci vxor $twk4,$tweak,$rndkey0 32378c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 32388c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 32398c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 32408c2ecf20Sopenharmony_ci le?vperm $in4,$in4,$in4,$leperm 32418c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 32428c2ecf20Sopenharmony_ci vxor $out4,$in4,$twk4 32438c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 32448c2ecf20Sopenharmony_ci 32458c2ecf20Sopenharmony_ci lvx_u $in5,$x50,$inp 32468c2ecf20Sopenharmony_ci addi $inp,$inp,0x60 32478c2ecf20Sopenharmony_ci vxor $twk5,$tweak,$rndkey0 32488c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 32498c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 32508c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 32518c2ecf20Sopenharmony_ci le?vperm $in5,$in5,$in5,$leperm 32528c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 32538c2ecf20Sopenharmony_ci vxor $out5,$in5,$twk5 32548c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 32558c2ecf20Sopenharmony_ci 32568c2ecf20Sopenharmony_ci vxor v31,v31,$rndkey0 32578c2ecf20Sopenharmony_ci mtctr $rounds 32588c2ecf20Sopenharmony_ci b Loop_xts_dec6x 32598c2ecf20Sopenharmony_ci 32608c2ecf20Sopenharmony_ci.align 5 32618c2ecf20Sopenharmony_ciLoop_xts_dec6x: 32628c2ecf20Sopenharmony_ci vncipher $out0,$out0,v24 32638c2ecf20Sopenharmony_ci vncipher $out1,$out1,v24 32648c2ecf20Sopenharmony_ci vncipher $out2,$out2,v24 32658c2ecf20Sopenharmony_ci vncipher $out3,$out3,v24 32668c2ecf20Sopenharmony_ci vncipher $out4,$out4,v24 32678c2ecf20Sopenharmony_ci vncipher $out5,$out5,v24 32688c2ecf20Sopenharmony_ci lvx v24,$x20,$key_ # round[3] 32698c2ecf20Sopenharmony_ci addi $key_,$key_,0x20 32708c2ecf20Sopenharmony_ci 32718c2ecf20Sopenharmony_ci vncipher $out0,$out0,v25 32728c2ecf20Sopenharmony_ci vncipher $out1,$out1,v25 32738c2ecf20Sopenharmony_ci vncipher $out2,$out2,v25 32748c2ecf20Sopenharmony_ci vncipher $out3,$out3,v25 32758c2ecf20Sopenharmony_ci vncipher $out4,$out4,v25 32768c2ecf20Sopenharmony_ci vncipher $out5,$out5,v25 32778c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # round[4] 32788c2ecf20Sopenharmony_ci bdnz Loop_xts_dec6x 32798c2ecf20Sopenharmony_ci 32808c2ecf20Sopenharmony_ci subic $len,$len,96 # $len-=96 32818c2ecf20Sopenharmony_ci vxor $in0,$twk0,v31 # xor with last round key 32828c2ecf20Sopenharmony_ci vncipher $out0,$out0,v24 32838c2ecf20Sopenharmony_ci vncipher $out1,$out1,v24 32848c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 32858c2ecf20Sopenharmony_ci vxor $twk0,$tweak,$rndkey0 32868c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 32878c2ecf20Sopenharmony_ci vncipher $out2,$out2,v24 32888c2ecf20Sopenharmony_ci vncipher $out3,$out3,v24 32898c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 32908c2ecf20Sopenharmony_ci vncipher $out4,$out4,v24 32918c2ecf20Sopenharmony_ci vncipher $out5,$out5,v24 32928c2ecf20Sopenharmony_ci 32938c2ecf20Sopenharmony_ci subfe. r0,r0,r0 # borrow?-1:0 32948c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 32958c2ecf20Sopenharmony_ci vncipher $out0,$out0,v25 32968c2ecf20Sopenharmony_ci vncipher $out1,$out1,v25 32978c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 32988c2ecf20Sopenharmony_ci vncipher $out2,$out2,v25 32998c2ecf20Sopenharmony_ci vncipher $out3,$out3,v25 33008c2ecf20Sopenharmony_ci vxor $in1,$twk1,v31 33018c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 33028c2ecf20Sopenharmony_ci vxor $twk1,$tweak,$rndkey0 33038c2ecf20Sopenharmony_ci vncipher $out4,$out4,v25 33048c2ecf20Sopenharmony_ci vncipher $out5,$out5,v25 33058c2ecf20Sopenharmony_ci 33068c2ecf20Sopenharmony_ci and r0,r0,$len 33078c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 33088c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 33098c2ecf20Sopenharmony_ci vncipher $out0,$out0,v26 33108c2ecf20Sopenharmony_ci vncipher $out1,$out1,v26 33118c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 33128c2ecf20Sopenharmony_ci vncipher $out2,$out2,v26 33138c2ecf20Sopenharmony_ci vncipher $out3,$out3,v26 33148c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 33158c2ecf20Sopenharmony_ci vncipher $out4,$out4,v26 33168c2ecf20Sopenharmony_ci vncipher $out5,$out5,v26 33178c2ecf20Sopenharmony_ci 33188c2ecf20Sopenharmony_ci add $inp,$inp,r0 # $inp is adjusted in such 33198c2ecf20Sopenharmony_ci # way that at exit from the 33208c2ecf20Sopenharmony_ci # loop inX-in5 are loaded 33218c2ecf20Sopenharmony_ci # with last "words" 33228c2ecf20Sopenharmony_ci vxor $in2,$twk2,v31 33238c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 33248c2ecf20Sopenharmony_ci vxor $twk2,$tweak,$rndkey0 33258c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 33268c2ecf20Sopenharmony_ci vncipher $out0,$out0,v27 33278c2ecf20Sopenharmony_ci vncipher $out1,$out1,v27 33288c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 33298c2ecf20Sopenharmony_ci vncipher $out2,$out2,v27 33308c2ecf20Sopenharmony_ci vncipher $out3,$out3,v27 33318c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 33328c2ecf20Sopenharmony_ci vncipher $out4,$out4,v27 33338c2ecf20Sopenharmony_ci vncipher $out5,$out5,v27 33348c2ecf20Sopenharmony_ci 33358c2ecf20Sopenharmony_ci addi $key_,$sp,$FRAME+15 # rewind $key_ 33368c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 33378c2ecf20Sopenharmony_ci vncipher $out0,$out0,v28 33388c2ecf20Sopenharmony_ci vncipher $out1,$out1,v28 33398c2ecf20Sopenharmony_ci vxor $in3,$twk3,v31 33408c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 33418c2ecf20Sopenharmony_ci vxor $twk3,$tweak,$rndkey0 33428c2ecf20Sopenharmony_ci vncipher $out2,$out2,v28 33438c2ecf20Sopenharmony_ci vncipher $out3,$out3,v28 33448c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 33458c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 33468c2ecf20Sopenharmony_ci vncipher $out4,$out4,v28 33478c2ecf20Sopenharmony_ci vncipher $out5,$out5,v28 33488c2ecf20Sopenharmony_ci lvx v24,$x00,$key_ # re-pre-load round[1] 33498c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 33508c2ecf20Sopenharmony_ci 33518c2ecf20Sopenharmony_ci vncipher $out0,$out0,v29 33528c2ecf20Sopenharmony_ci vncipher $out1,$out1,v29 33538c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 33548c2ecf20Sopenharmony_ci vncipher $out2,$out2,v29 33558c2ecf20Sopenharmony_ci vncipher $out3,$out3,v29 33568c2ecf20Sopenharmony_ci vxor $in4,$twk4,v31 33578c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 33588c2ecf20Sopenharmony_ci vxor $twk4,$tweak,$rndkey0 33598c2ecf20Sopenharmony_ci vncipher $out4,$out4,v29 33608c2ecf20Sopenharmony_ci vncipher $out5,$out5,v29 33618c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # re-pre-load round[2] 33628c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 33638c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 33648c2ecf20Sopenharmony_ci 33658c2ecf20Sopenharmony_ci vncipher $out0,$out0,v30 33668c2ecf20Sopenharmony_ci vncipher $out1,$out1,v30 33678c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 33688c2ecf20Sopenharmony_ci vncipher $out2,$out2,v30 33698c2ecf20Sopenharmony_ci vncipher $out3,$out3,v30 33708c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 33718c2ecf20Sopenharmony_ci vncipher $out4,$out4,v30 33728c2ecf20Sopenharmony_ci vncipher $out5,$out5,v30 33738c2ecf20Sopenharmony_ci vxor $in5,$twk5,v31 33748c2ecf20Sopenharmony_ci vsrab $tmp,$tweak,$seven # next tweak value 33758c2ecf20Sopenharmony_ci vxor $twk5,$tweak,$rndkey0 33768c2ecf20Sopenharmony_ci 33778c2ecf20Sopenharmony_ci vncipherlast $out0,$out0,$in0 33788c2ecf20Sopenharmony_ci lvx_u $in0,$x00,$inp # load next input block 33798c2ecf20Sopenharmony_ci vaddubm $tweak,$tweak,$tweak 33808c2ecf20Sopenharmony_ci vsldoi $tmp,$tmp,$tmp,15 33818c2ecf20Sopenharmony_ci vncipherlast $out1,$out1,$in1 33828c2ecf20Sopenharmony_ci lvx_u $in1,$x10,$inp 33838c2ecf20Sopenharmony_ci vncipherlast $out2,$out2,$in2 33848c2ecf20Sopenharmony_ci le?vperm $in0,$in0,$in0,$leperm 33858c2ecf20Sopenharmony_ci lvx_u $in2,$x20,$inp 33868c2ecf20Sopenharmony_ci vand $tmp,$tmp,$eighty7 33878c2ecf20Sopenharmony_ci vncipherlast $out3,$out3,$in3 33888c2ecf20Sopenharmony_ci le?vperm $in1,$in1,$in1,$leperm 33898c2ecf20Sopenharmony_ci lvx_u $in3,$x30,$inp 33908c2ecf20Sopenharmony_ci vncipherlast $out4,$out4,$in4 33918c2ecf20Sopenharmony_ci le?vperm $in2,$in2,$in2,$leperm 33928c2ecf20Sopenharmony_ci lvx_u $in4,$x40,$inp 33938c2ecf20Sopenharmony_ci vxor $tweak,$tweak,$tmp 33948c2ecf20Sopenharmony_ci vncipherlast $out5,$out5,$in5 33958c2ecf20Sopenharmony_ci le?vperm $in3,$in3,$in3,$leperm 33968c2ecf20Sopenharmony_ci lvx_u $in5,$x50,$inp 33978c2ecf20Sopenharmony_ci addi $inp,$inp,0x60 33988c2ecf20Sopenharmony_ci le?vperm $in4,$in4,$in4,$leperm 33998c2ecf20Sopenharmony_ci le?vperm $in5,$in5,$in5,$leperm 34008c2ecf20Sopenharmony_ci 34018c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$leperm 34028c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$leperm 34038c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out # store output 34048c2ecf20Sopenharmony_ci vxor $out0,$in0,$twk0 34058c2ecf20Sopenharmony_ci le?vperm $out2,$out2,$out2,$leperm 34068c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 34078c2ecf20Sopenharmony_ci vxor $out1,$in1,$twk1 34088c2ecf20Sopenharmony_ci le?vperm $out3,$out3,$out3,$leperm 34098c2ecf20Sopenharmony_ci stvx_u $out2,$x20,$out 34108c2ecf20Sopenharmony_ci vxor $out2,$in2,$twk2 34118c2ecf20Sopenharmony_ci le?vperm $out4,$out4,$out4,$leperm 34128c2ecf20Sopenharmony_ci stvx_u $out3,$x30,$out 34138c2ecf20Sopenharmony_ci vxor $out3,$in3,$twk3 34148c2ecf20Sopenharmony_ci le?vperm $out5,$out5,$out5,$leperm 34158c2ecf20Sopenharmony_ci stvx_u $out4,$x40,$out 34168c2ecf20Sopenharmony_ci vxor $out4,$in4,$twk4 34178c2ecf20Sopenharmony_ci stvx_u $out5,$x50,$out 34188c2ecf20Sopenharmony_ci vxor $out5,$in5,$twk5 34198c2ecf20Sopenharmony_ci addi $out,$out,0x60 34208c2ecf20Sopenharmony_ci 34218c2ecf20Sopenharmony_ci mtctr $rounds 34228c2ecf20Sopenharmony_ci beq Loop_xts_dec6x # did $len-=96 borrow? 34238c2ecf20Sopenharmony_ci 34248c2ecf20Sopenharmony_ci addic. $len,$len,0x60 34258c2ecf20Sopenharmony_ci beq Lxts_dec6x_zero 34268c2ecf20Sopenharmony_ci cmpwi $len,0x20 34278c2ecf20Sopenharmony_ci blt Lxts_dec6x_one 34288c2ecf20Sopenharmony_ci nop 34298c2ecf20Sopenharmony_ci beq Lxts_dec6x_two 34308c2ecf20Sopenharmony_ci cmpwi $len,0x40 34318c2ecf20Sopenharmony_ci blt Lxts_dec6x_three 34328c2ecf20Sopenharmony_ci nop 34338c2ecf20Sopenharmony_ci beq Lxts_dec6x_four 34348c2ecf20Sopenharmony_ci 34358c2ecf20Sopenharmony_ciLxts_dec6x_five: 34368c2ecf20Sopenharmony_ci vxor $out0,$in1,$twk0 34378c2ecf20Sopenharmony_ci vxor $out1,$in2,$twk1 34388c2ecf20Sopenharmony_ci vxor $out2,$in3,$twk2 34398c2ecf20Sopenharmony_ci vxor $out3,$in4,$twk3 34408c2ecf20Sopenharmony_ci vxor $out4,$in5,$twk4 34418c2ecf20Sopenharmony_ci 34428c2ecf20Sopenharmony_ci bl _aesp8_xts_dec5x 34438c2ecf20Sopenharmony_ci 34448c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$leperm 34458c2ecf20Sopenharmony_ci vmr $twk0,$twk5 # unused tweak 34468c2ecf20Sopenharmony_ci vxor $twk1,$tweak,$rndkey0 34478c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$leperm 34488c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out # store output 34498c2ecf20Sopenharmony_ci vxor $out0,$in0,$twk1 34508c2ecf20Sopenharmony_ci le?vperm $out2,$out2,$out2,$leperm 34518c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 34528c2ecf20Sopenharmony_ci le?vperm $out3,$out3,$out3,$leperm 34538c2ecf20Sopenharmony_ci stvx_u $out2,$x20,$out 34548c2ecf20Sopenharmony_ci le?vperm $out4,$out4,$out4,$leperm 34558c2ecf20Sopenharmony_ci stvx_u $out3,$x30,$out 34568c2ecf20Sopenharmony_ci stvx_u $out4,$x40,$out 34578c2ecf20Sopenharmony_ci addi $out,$out,0x50 34588c2ecf20Sopenharmony_ci bne Lxts_dec6x_steal 34598c2ecf20Sopenharmony_ci b Lxts_dec6x_done 34608c2ecf20Sopenharmony_ci 34618c2ecf20Sopenharmony_ci.align 4 34628c2ecf20Sopenharmony_ciLxts_dec6x_four: 34638c2ecf20Sopenharmony_ci vxor $out0,$in2,$twk0 34648c2ecf20Sopenharmony_ci vxor $out1,$in3,$twk1 34658c2ecf20Sopenharmony_ci vxor $out2,$in4,$twk2 34668c2ecf20Sopenharmony_ci vxor $out3,$in5,$twk3 34678c2ecf20Sopenharmony_ci vxor $out4,$out4,$out4 34688c2ecf20Sopenharmony_ci 34698c2ecf20Sopenharmony_ci bl _aesp8_xts_dec5x 34708c2ecf20Sopenharmony_ci 34718c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$leperm 34728c2ecf20Sopenharmony_ci vmr $twk0,$twk4 # unused tweak 34738c2ecf20Sopenharmony_ci vmr $twk1,$twk5 34748c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$leperm 34758c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out # store output 34768c2ecf20Sopenharmony_ci vxor $out0,$in0,$twk5 34778c2ecf20Sopenharmony_ci le?vperm $out2,$out2,$out2,$leperm 34788c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 34798c2ecf20Sopenharmony_ci le?vperm $out3,$out3,$out3,$leperm 34808c2ecf20Sopenharmony_ci stvx_u $out2,$x20,$out 34818c2ecf20Sopenharmony_ci stvx_u $out3,$x30,$out 34828c2ecf20Sopenharmony_ci addi $out,$out,0x40 34838c2ecf20Sopenharmony_ci bne Lxts_dec6x_steal 34848c2ecf20Sopenharmony_ci b Lxts_dec6x_done 34858c2ecf20Sopenharmony_ci 34868c2ecf20Sopenharmony_ci.align 4 34878c2ecf20Sopenharmony_ciLxts_dec6x_three: 34888c2ecf20Sopenharmony_ci vxor $out0,$in3,$twk0 34898c2ecf20Sopenharmony_ci vxor $out1,$in4,$twk1 34908c2ecf20Sopenharmony_ci vxor $out2,$in5,$twk2 34918c2ecf20Sopenharmony_ci vxor $out3,$out3,$out3 34928c2ecf20Sopenharmony_ci vxor $out4,$out4,$out4 34938c2ecf20Sopenharmony_ci 34948c2ecf20Sopenharmony_ci bl _aesp8_xts_dec5x 34958c2ecf20Sopenharmony_ci 34968c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$leperm 34978c2ecf20Sopenharmony_ci vmr $twk0,$twk3 # unused tweak 34988c2ecf20Sopenharmony_ci vmr $twk1,$twk4 34998c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$leperm 35008c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out # store output 35018c2ecf20Sopenharmony_ci vxor $out0,$in0,$twk4 35028c2ecf20Sopenharmony_ci le?vperm $out2,$out2,$out2,$leperm 35038c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 35048c2ecf20Sopenharmony_ci stvx_u $out2,$x20,$out 35058c2ecf20Sopenharmony_ci addi $out,$out,0x30 35068c2ecf20Sopenharmony_ci bne Lxts_dec6x_steal 35078c2ecf20Sopenharmony_ci b Lxts_dec6x_done 35088c2ecf20Sopenharmony_ci 35098c2ecf20Sopenharmony_ci.align 4 35108c2ecf20Sopenharmony_ciLxts_dec6x_two: 35118c2ecf20Sopenharmony_ci vxor $out0,$in4,$twk0 35128c2ecf20Sopenharmony_ci vxor $out1,$in5,$twk1 35138c2ecf20Sopenharmony_ci vxor $out2,$out2,$out2 35148c2ecf20Sopenharmony_ci vxor $out3,$out3,$out3 35158c2ecf20Sopenharmony_ci vxor $out4,$out4,$out4 35168c2ecf20Sopenharmony_ci 35178c2ecf20Sopenharmony_ci bl _aesp8_xts_dec5x 35188c2ecf20Sopenharmony_ci 35198c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$leperm 35208c2ecf20Sopenharmony_ci vmr $twk0,$twk2 # unused tweak 35218c2ecf20Sopenharmony_ci vmr $twk1,$twk3 35228c2ecf20Sopenharmony_ci le?vperm $out1,$out1,$out1,$leperm 35238c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out # store output 35248c2ecf20Sopenharmony_ci vxor $out0,$in0,$twk3 35258c2ecf20Sopenharmony_ci stvx_u $out1,$x10,$out 35268c2ecf20Sopenharmony_ci addi $out,$out,0x20 35278c2ecf20Sopenharmony_ci bne Lxts_dec6x_steal 35288c2ecf20Sopenharmony_ci b Lxts_dec6x_done 35298c2ecf20Sopenharmony_ci 35308c2ecf20Sopenharmony_ci.align 4 35318c2ecf20Sopenharmony_ciLxts_dec6x_one: 35328c2ecf20Sopenharmony_ci vxor $out0,$in5,$twk0 35338c2ecf20Sopenharmony_ci nop 35348c2ecf20Sopenharmony_ciLoop_xts_dec1x: 35358c2ecf20Sopenharmony_ci vncipher $out0,$out0,v24 35368c2ecf20Sopenharmony_ci lvx v24,$x20,$key_ # round[3] 35378c2ecf20Sopenharmony_ci addi $key_,$key_,0x20 35388c2ecf20Sopenharmony_ci 35398c2ecf20Sopenharmony_ci vncipher $out0,$out0,v25 35408c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # round[4] 35418c2ecf20Sopenharmony_ci bdnz Loop_xts_dec1x 35428c2ecf20Sopenharmony_ci 35438c2ecf20Sopenharmony_ci subi r0,$taillen,1 35448c2ecf20Sopenharmony_ci vncipher $out0,$out0,v24 35458c2ecf20Sopenharmony_ci 35468c2ecf20Sopenharmony_ci andi. r0,r0,16 35478c2ecf20Sopenharmony_ci cmpwi $taillen,0 35488c2ecf20Sopenharmony_ci vncipher $out0,$out0,v25 35498c2ecf20Sopenharmony_ci 35508c2ecf20Sopenharmony_ci sub $inp,$inp,r0 35518c2ecf20Sopenharmony_ci vncipher $out0,$out0,v26 35528c2ecf20Sopenharmony_ci 35538c2ecf20Sopenharmony_ci lvx_u $in0,0,$inp 35548c2ecf20Sopenharmony_ci vncipher $out0,$out0,v27 35558c2ecf20Sopenharmony_ci 35568c2ecf20Sopenharmony_ci addi $key_,$sp,$FRAME+15 # rewind $key_ 35578c2ecf20Sopenharmony_ci vncipher $out0,$out0,v28 35588c2ecf20Sopenharmony_ci lvx v24,$x00,$key_ # re-pre-load round[1] 35598c2ecf20Sopenharmony_ci 35608c2ecf20Sopenharmony_ci vncipher $out0,$out0,v29 35618c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # re-pre-load round[2] 35628c2ecf20Sopenharmony_ci vxor $twk0,$twk0,v31 35638c2ecf20Sopenharmony_ci 35648c2ecf20Sopenharmony_ci le?vperm $in0,$in0,$in0,$leperm 35658c2ecf20Sopenharmony_ci vncipher $out0,$out0,v30 35668c2ecf20Sopenharmony_ci 35678c2ecf20Sopenharmony_ci mtctr $rounds 35688c2ecf20Sopenharmony_ci vncipherlast $out0,$out0,$twk0 35698c2ecf20Sopenharmony_ci 35708c2ecf20Sopenharmony_ci vmr $twk0,$twk1 # unused tweak 35718c2ecf20Sopenharmony_ci vmr $twk1,$twk2 35728c2ecf20Sopenharmony_ci le?vperm $out0,$out0,$out0,$leperm 35738c2ecf20Sopenharmony_ci stvx_u $out0,$x00,$out # store output 35748c2ecf20Sopenharmony_ci addi $out,$out,0x10 35758c2ecf20Sopenharmony_ci vxor $out0,$in0,$twk2 35768c2ecf20Sopenharmony_ci bne Lxts_dec6x_steal 35778c2ecf20Sopenharmony_ci b Lxts_dec6x_done 35788c2ecf20Sopenharmony_ci 35798c2ecf20Sopenharmony_ci.align 4 35808c2ecf20Sopenharmony_ciLxts_dec6x_zero: 35818c2ecf20Sopenharmony_ci cmpwi $taillen,0 35828c2ecf20Sopenharmony_ci beq Lxts_dec6x_done 35838c2ecf20Sopenharmony_ci 35848c2ecf20Sopenharmony_ci lvx_u $in0,0,$inp 35858c2ecf20Sopenharmony_ci le?vperm $in0,$in0,$in0,$leperm 35868c2ecf20Sopenharmony_ci vxor $out0,$in0,$twk1 35878c2ecf20Sopenharmony_ciLxts_dec6x_steal: 35888c2ecf20Sopenharmony_ci vncipher $out0,$out0,v24 35898c2ecf20Sopenharmony_ci lvx v24,$x20,$key_ # round[3] 35908c2ecf20Sopenharmony_ci addi $key_,$key_,0x20 35918c2ecf20Sopenharmony_ci 35928c2ecf20Sopenharmony_ci vncipher $out0,$out0,v25 35938c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # round[4] 35948c2ecf20Sopenharmony_ci bdnz Lxts_dec6x_steal 35958c2ecf20Sopenharmony_ci 35968c2ecf20Sopenharmony_ci add $inp,$inp,$taillen 35978c2ecf20Sopenharmony_ci vncipher $out0,$out0,v24 35988c2ecf20Sopenharmony_ci 35998c2ecf20Sopenharmony_ci cmpwi $taillen,0 36008c2ecf20Sopenharmony_ci vncipher $out0,$out0,v25 36018c2ecf20Sopenharmony_ci 36028c2ecf20Sopenharmony_ci lvx_u $in0,0,$inp 36038c2ecf20Sopenharmony_ci vncipher $out0,$out0,v26 36048c2ecf20Sopenharmony_ci 36058c2ecf20Sopenharmony_ci lvsr $inpperm,0,$taillen # $in5 is no more 36068c2ecf20Sopenharmony_ci vncipher $out0,$out0,v27 36078c2ecf20Sopenharmony_ci 36088c2ecf20Sopenharmony_ci addi $key_,$sp,$FRAME+15 # rewind $key_ 36098c2ecf20Sopenharmony_ci vncipher $out0,$out0,v28 36108c2ecf20Sopenharmony_ci lvx v24,$x00,$key_ # re-pre-load round[1] 36118c2ecf20Sopenharmony_ci 36128c2ecf20Sopenharmony_ci vncipher $out0,$out0,v29 36138c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # re-pre-load round[2] 36148c2ecf20Sopenharmony_ci vxor $twk1,$twk1,v31 36158c2ecf20Sopenharmony_ci 36168c2ecf20Sopenharmony_ci le?vperm $in0,$in0,$in0,$leperm 36178c2ecf20Sopenharmony_ci vncipher $out0,$out0,v30 36188c2ecf20Sopenharmony_ci 36198c2ecf20Sopenharmony_ci vperm $in0,$in0,$in0,$inpperm 36208c2ecf20Sopenharmony_ci vncipherlast $tmp,$out0,$twk1 36218c2ecf20Sopenharmony_ci 36228c2ecf20Sopenharmony_ci le?vperm $out0,$tmp,$tmp,$leperm 36238c2ecf20Sopenharmony_ci le?stvx_u $out0,0,$out 36248c2ecf20Sopenharmony_ci be?stvx_u $tmp,0,$out 36258c2ecf20Sopenharmony_ci 36268c2ecf20Sopenharmony_ci vxor $out0,$out0,$out0 36278c2ecf20Sopenharmony_ci vspltisb $out1,-1 36288c2ecf20Sopenharmony_ci vperm $out0,$out0,$out1,$inpperm 36298c2ecf20Sopenharmony_ci vsel $out0,$in0,$tmp,$out0 36308c2ecf20Sopenharmony_ci vxor $out0,$out0,$twk0 36318c2ecf20Sopenharmony_ci 36328c2ecf20Sopenharmony_ci subi r30,$out,1 36338c2ecf20Sopenharmony_ci mtctr $taillen 36348c2ecf20Sopenharmony_ciLoop_xts_dec6x_steal: 36358c2ecf20Sopenharmony_ci lbzu r0,1(r30) 36368c2ecf20Sopenharmony_ci stb r0,16(r30) 36378c2ecf20Sopenharmony_ci bdnz Loop_xts_dec6x_steal 36388c2ecf20Sopenharmony_ci 36398c2ecf20Sopenharmony_ci li $taillen,0 36408c2ecf20Sopenharmony_ci mtctr $rounds 36418c2ecf20Sopenharmony_ci b Loop_xts_dec1x # one more time... 36428c2ecf20Sopenharmony_ci 36438c2ecf20Sopenharmony_ci.align 4 36448c2ecf20Sopenharmony_ciLxts_dec6x_done: 36458c2ecf20Sopenharmony_ci ${UCMP}i $ivp,0 36468c2ecf20Sopenharmony_ci beq Lxts_dec6x_ret 36478c2ecf20Sopenharmony_ci 36488c2ecf20Sopenharmony_ci vxor $tweak,$twk0,$rndkey0 36498c2ecf20Sopenharmony_ci le?vperm $tweak,$tweak,$tweak,$leperm 36508c2ecf20Sopenharmony_ci stvx_u $tweak,0,$ivp 36518c2ecf20Sopenharmony_ci 36528c2ecf20Sopenharmony_ciLxts_dec6x_ret: 36538c2ecf20Sopenharmony_ci mtlr r11 36548c2ecf20Sopenharmony_ci li r10,`$FRAME+15` 36558c2ecf20Sopenharmony_ci li r11,`$FRAME+31` 36568c2ecf20Sopenharmony_ci stvx $seven,r10,$sp # wipe copies of round keys 36578c2ecf20Sopenharmony_ci addi r10,r10,32 36588c2ecf20Sopenharmony_ci stvx $seven,r11,$sp 36598c2ecf20Sopenharmony_ci addi r11,r11,32 36608c2ecf20Sopenharmony_ci stvx $seven,r10,$sp 36618c2ecf20Sopenharmony_ci addi r10,r10,32 36628c2ecf20Sopenharmony_ci stvx $seven,r11,$sp 36638c2ecf20Sopenharmony_ci addi r11,r11,32 36648c2ecf20Sopenharmony_ci stvx $seven,r10,$sp 36658c2ecf20Sopenharmony_ci addi r10,r10,32 36668c2ecf20Sopenharmony_ci stvx $seven,r11,$sp 36678c2ecf20Sopenharmony_ci addi r11,r11,32 36688c2ecf20Sopenharmony_ci stvx $seven,r10,$sp 36698c2ecf20Sopenharmony_ci addi r10,r10,32 36708c2ecf20Sopenharmony_ci stvx $seven,r11,$sp 36718c2ecf20Sopenharmony_ci addi r11,r11,32 36728c2ecf20Sopenharmony_ci 36738c2ecf20Sopenharmony_ci mtspr 256,$vrsave 36748c2ecf20Sopenharmony_ci lvx v20,r10,$sp # ABI says so 36758c2ecf20Sopenharmony_ci addi r10,r10,32 36768c2ecf20Sopenharmony_ci lvx v21,r11,$sp 36778c2ecf20Sopenharmony_ci addi r11,r11,32 36788c2ecf20Sopenharmony_ci lvx v22,r10,$sp 36798c2ecf20Sopenharmony_ci addi r10,r10,32 36808c2ecf20Sopenharmony_ci lvx v23,r11,$sp 36818c2ecf20Sopenharmony_ci addi r11,r11,32 36828c2ecf20Sopenharmony_ci lvx v24,r10,$sp 36838c2ecf20Sopenharmony_ci addi r10,r10,32 36848c2ecf20Sopenharmony_ci lvx v25,r11,$sp 36858c2ecf20Sopenharmony_ci addi r11,r11,32 36868c2ecf20Sopenharmony_ci lvx v26,r10,$sp 36878c2ecf20Sopenharmony_ci addi r10,r10,32 36888c2ecf20Sopenharmony_ci lvx v27,r11,$sp 36898c2ecf20Sopenharmony_ci addi r11,r11,32 36908c2ecf20Sopenharmony_ci lvx v28,r10,$sp 36918c2ecf20Sopenharmony_ci addi r10,r10,32 36928c2ecf20Sopenharmony_ci lvx v29,r11,$sp 36938c2ecf20Sopenharmony_ci addi r11,r11,32 36948c2ecf20Sopenharmony_ci lvx v30,r10,$sp 36958c2ecf20Sopenharmony_ci lvx v31,r11,$sp 36968c2ecf20Sopenharmony_ci $POP r26,`$FRAME+21*16+0*$SIZE_T`($sp) 36978c2ecf20Sopenharmony_ci $POP r27,`$FRAME+21*16+1*$SIZE_T`($sp) 36988c2ecf20Sopenharmony_ci $POP r28,`$FRAME+21*16+2*$SIZE_T`($sp) 36998c2ecf20Sopenharmony_ci $POP r29,`$FRAME+21*16+3*$SIZE_T`($sp) 37008c2ecf20Sopenharmony_ci $POP r30,`$FRAME+21*16+4*$SIZE_T`($sp) 37018c2ecf20Sopenharmony_ci $POP r31,`$FRAME+21*16+5*$SIZE_T`($sp) 37028c2ecf20Sopenharmony_ci addi $sp,$sp,`$FRAME+21*16+6*$SIZE_T` 37038c2ecf20Sopenharmony_ci blr 37048c2ecf20Sopenharmony_ci .long 0 37058c2ecf20Sopenharmony_ci .byte 0,12,0x04,1,0x80,6,6,0 37068c2ecf20Sopenharmony_ci .long 0 37078c2ecf20Sopenharmony_ci 37088c2ecf20Sopenharmony_ci.align 5 37098c2ecf20Sopenharmony_ci_aesp8_xts_dec5x: 37108c2ecf20Sopenharmony_ci vncipher $out0,$out0,v24 37118c2ecf20Sopenharmony_ci vncipher $out1,$out1,v24 37128c2ecf20Sopenharmony_ci vncipher $out2,$out2,v24 37138c2ecf20Sopenharmony_ci vncipher $out3,$out3,v24 37148c2ecf20Sopenharmony_ci vncipher $out4,$out4,v24 37158c2ecf20Sopenharmony_ci lvx v24,$x20,$key_ # round[3] 37168c2ecf20Sopenharmony_ci addi $key_,$key_,0x20 37178c2ecf20Sopenharmony_ci 37188c2ecf20Sopenharmony_ci vncipher $out0,$out0,v25 37198c2ecf20Sopenharmony_ci vncipher $out1,$out1,v25 37208c2ecf20Sopenharmony_ci vncipher $out2,$out2,v25 37218c2ecf20Sopenharmony_ci vncipher $out3,$out3,v25 37228c2ecf20Sopenharmony_ci vncipher $out4,$out4,v25 37238c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # round[4] 37248c2ecf20Sopenharmony_ci bdnz _aesp8_xts_dec5x 37258c2ecf20Sopenharmony_ci 37268c2ecf20Sopenharmony_ci subi r0,$taillen,1 37278c2ecf20Sopenharmony_ci vncipher $out0,$out0,v24 37288c2ecf20Sopenharmony_ci vncipher $out1,$out1,v24 37298c2ecf20Sopenharmony_ci vncipher $out2,$out2,v24 37308c2ecf20Sopenharmony_ci vncipher $out3,$out3,v24 37318c2ecf20Sopenharmony_ci vncipher $out4,$out4,v24 37328c2ecf20Sopenharmony_ci 37338c2ecf20Sopenharmony_ci andi. r0,r0,16 37348c2ecf20Sopenharmony_ci cmpwi $taillen,0 37358c2ecf20Sopenharmony_ci vncipher $out0,$out0,v25 37368c2ecf20Sopenharmony_ci vncipher $out1,$out1,v25 37378c2ecf20Sopenharmony_ci vncipher $out2,$out2,v25 37388c2ecf20Sopenharmony_ci vncipher $out3,$out3,v25 37398c2ecf20Sopenharmony_ci vncipher $out4,$out4,v25 37408c2ecf20Sopenharmony_ci vxor $twk0,$twk0,v31 37418c2ecf20Sopenharmony_ci 37428c2ecf20Sopenharmony_ci sub $inp,$inp,r0 37438c2ecf20Sopenharmony_ci vncipher $out0,$out0,v26 37448c2ecf20Sopenharmony_ci vncipher $out1,$out1,v26 37458c2ecf20Sopenharmony_ci vncipher $out2,$out2,v26 37468c2ecf20Sopenharmony_ci vncipher $out3,$out3,v26 37478c2ecf20Sopenharmony_ci vncipher $out4,$out4,v26 37488c2ecf20Sopenharmony_ci vxor $in1,$twk1,v31 37498c2ecf20Sopenharmony_ci 37508c2ecf20Sopenharmony_ci vncipher $out0,$out0,v27 37518c2ecf20Sopenharmony_ci lvx_u $in0,0,$inp 37528c2ecf20Sopenharmony_ci vncipher $out1,$out1,v27 37538c2ecf20Sopenharmony_ci vncipher $out2,$out2,v27 37548c2ecf20Sopenharmony_ci vncipher $out3,$out3,v27 37558c2ecf20Sopenharmony_ci vncipher $out4,$out4,v27 37568c2ecf20Sopenharmony_ci vxor $in2,$twk2,v31 37578c2ecf20Sopenharmony_ci 37588c2ecf20Sopenharmony_ci addi $key_,$sp,$FRAME+15 # rewind $key_ 37598c2ecf20Sopenharmony_ci vncipher $out0,$out0,v28 37608c2ecf20Sopenharmony_ci vncipher $out1,$out1,v28 37618c2ecf20Sopenharmony_ci vncipher $out2,$out2,v28 37628c2ecf20Sopenharmony_ci vncipher $out3,$out3,v28 37638c2ecf20Sopenharmony_ci vncipher $out4,$out4,v28 37648c2ecf20Sopenharmony_ci lvx v24,$x00,$key_ # re-pre-load round[1] 37658c2ecf20Sopenharmony_ci vxor $in3,$twk3,v31 37668c2ecf20Sopenharmony_ci 37678c2ecf20Sopenharmony_ci vncipher $out0,$out0,v29 37688c2ecf20Sopenharmony_ci le?vperm $in0,$in0,$in0,$leperm 37698c2ecf20Sopenharmony_ci vncipher $out1,$out1,v29 37708c2ecf20Sopenharmony_ci vncipher $out2,$out2,v29 37718c2ecf20Sopenharmony_ci vncipher $out3,$out3,v29 37728c2ecf20Sopenharmony_ci vncipher $out4,$out4,v29 37738c2ecf20Sopenharmony_ci lvx v25,$x10,$key_ # re-pre-load round[2] 37748c2ecf20Sopenharmony_ci vxor $in4,$twk4,v31 37758c2ecf20Sopenharmony_ci 37768c2ecf20Sopenharmony_ci vncipher $out0,$out0,v30 37778c2ecf20Sopenharmony_ci vncipher $out1,$out1,v30 37788c2ecf20Sopenharmony_ci vncipher $out2,$out2,v30 37798c2ecf20Sopenharmony_ci vncipher $out3,$out3,v30 37808c2ecf20Sopenharmony_ci vncipher $out4,$out4,v30 37818c2ecf20Sopenharmony_ci 37828c2ecf20Sopenharmony_ci vncipherlast $out0,$out0,$twk0 37838c2ecf20Sopenharmony_ci vncipherlast $out1,$out1,$in1 37848c2ecf20Sopenharmony_ci vncipherlast $out2,$out2,$in2 37858c2ecf20Sopenharmony_ci vncipherlast $out3,$out3,$in3 37868c2ecf20Sopenharmony_ci vncipherlast $out4,$out4,$in4 37878c2ecf20Sopenharmony_ci mtctr $rounds 37888c2ecf20Sopenharmony_ci blr 37898c2ecf20Sopenharmony_ci .long 0 37908c2ecf20Sopenharmony_ci .byte 0,12,0x14,0,0,0,0,0 37918c2ecf20Sopenharmony_ci___ 37928c2ecf20Sopenharmony_ci}} }}} 37938c2ecf20Sopenharmony_ci 37948c2ecf20Sopenharmony_cimy $consts=1; 37958c2ecf20Sopenharmony_ciforeach(split("\n",$code)) { 37968c2ecf20Sopenharmony_ci s/\`([^\`]*)\`/eval($1)/geo; 37978c2ecf20Sopenharmony_ci 37988c2ecf20Sopenharmony_ci # constants table endian-specific conversion 37998c2ecf20Sopenharmony_ci if ($consts && m/\.(long|byte)\s+(.+)\s+(\?[a-z]*)$/o) { 38008c2ecf20Sopenharmony_ci my $conv=$3; 38018c2ecf20Sopenharmony_ci my @bytes=(); 38028c2ecf20Sopenharmony_ci 38038c2ecf20Sopenharmony_ci # convert to endian-agnostic format 38048c2ecf20Sopenharmony_ci if ($1 eq "long") { 38058c2ecf20Sopenharmony_ci foreach (split(/,\s*/,$2)) { 38068c2ecf20Sopenharmony_ci my $l = /^0/?oct:int; 38078c2ecf20Sopenharmony_ci push @bytes,($l>>24)&0xff,($l>>16)&0xff,($l>>8)&0xff,$l&0xff; 38088c2ecf20Sopenharmony_ci } 38098c2ecf20Sopenharmony_ci } else { 38108c2ecf20Sopenharmony_ci @bytes = map(/^0/?oct:int,split(/,\s*/,$2)); 38118c2ecf20Sopenharmony_ci } 38128c2ecf20Sopenharmony_ci 38138c2ecf20Sopenharmony_ci # little-endian conversion 38148c2ecf20Sopenharmony_ci if ($flavour =~ /le$/o) { 38158c2ecf20Sopenharmony_ci SWITCH: for($conv) { 38168c2ecf20Sopenharmony_ci /\?inv/ && do { @bytes=map($_^0xf,@bytes); last; }; 38178c2ecf20Sopenharmony_ci /\?rev/ && do { @bytes=reverse(@bytes); last; }; 38188c2ecf20Sopenharmony_ci } 38198c2ecf20Sopenharmony_ci } 38208c2ecf20Sopenharmony_ci 38218c2ecf20Sopenharmony_ci #emit 38228c2ecf20Sopenharmony_ci print ".byte\t",join(',',map (sprintf("0x%02x",$_),@bytes)),"\n"; 38238c2ecf20Sopenharmony_ci next; 38248c2ecf20Sopenharmony_ci } 38258c2ecf20Sopenharmony_ci $consts=0 if (m/Lconsts:/o); # end of table 38268c2ecf20Sopenharmony_ci 38278c2ecf20Sopenharmony_ci # instructions prefixed with '?' are endian-specific and need 38288c2ecf20Sopenharmony_ci # to be adjusted accordingly... 38298c2ecf20Sopenharmony_ci if ($flavour =~ /le$/o) { # little-endian 38308c2ecf20Sopenharmony_ci s/le\?//o or 38318c2ecf20Sopenharmony_ci s/be\?/#be#/o or 38328c2ecf20Sopenharmony_ci s/\?lvsr/lvsl/o or 38338c2ecf20Sopenharmony_ci s/\?lvsl/lvsr/o or 38348c2ecf20Sopenharmony_ci s/\?(vperm\s+v[0-9]+,\s*)(v[0-9]+,\s*)(v[0-9]+,\s*)(v[0-9]+)/$1$3$2$4/o or 38358c2ecf20Sopenharmony_ci s/\?(vsldoi\s+v[0-9]+,\s*)(v[0-9]+,)\s*(v[0-9]+,\s*)([0-9]+)/$1$3$2 16-$4/o or 38368c2ecf20Sopenharmony_ci s/\?(vspltw\s+v[0-9]+,\s*)(v[0-9]+,)\s*([0-9])/$1$2 3-$3/o; 38378c2ecf20Sopenharmony_ci } else { # big-endian 38388c2ecf20Sopenharmony_ci s/le\?/#le#/o or 38398c2ecf20Sopenharmony_ci s/be\?//o or 38408c2ecf20Sopenharmony_ci s/\?([a-z]+)/$1/o; 38418c2ecf20Sopenharmony_ci } 38428c2ecf20Sopenharmony_ci 38438c2ecf20Sopenharmony_ci print $_,"\n"; 38448c2ecf20Sopenharmony_ci} 38458c2ecf20Sopenharmony_ci 38468c2ecf20Sopenharmony_ciclose STDOUT; 3847