Path: blob/main/sys/crypto/openssl/arm/keccak1600-armv4.S
39482 views
/* Do not modify. This file is auto-generated from keccak1600-armv4.pl. */1#include "arm_arch.h"23#if defined(__thumb2__)4.syntax unified5.thumb6#else7.code 328#endif910.text1112.type iotas32, %object13.align 514iotas32:15.long 0x00000001, 0x0000000016.long 0x00000000, 0x0000008917.long 0x00000000, 0x8000008b18.long 0x00000000, 0x8000808019.long 0x00000001, 0x0000008b20.long 0x00000001, 0x0000800021.long 0x00000001, 0x8000808822.long 0x00000001, 0x8000008223.long 0x00000000, 0x0000000b24.long 0x00000000, 0x0000000a25.long 0x00000001, 0x0000808226.long 0x00000000, 0x0000800327.long 0x00000001, 0x0000808b28.long 0x00000001, 0x8000000b29.long 0x00000001, 0x8000008a30.long 0x00000001, 0x8000008131.long 0x00000000, 0x8000008132.long 0x00000000, 0x8000000833.long 0x00000000, 0x0000008334.long 0x00000000, 0x8000800335.long 0x00000001, 0x8000808836.long 0x00000000, 0x8000008837.long 0x00000001, 0x0000800038.long 0x00000000, 0x8000808239.size iotas32,.-iotas324041.type KeccakF1600_int, %function42.align 543KeccakF1600_int:44add r9,sp,#17645add r12,sp,#046add r10,sp,#4047ldmia r9,{r4,r5,r6,r7,r8,r9} @ A[4][2..4]48KeccakF1600_enter:49str lr,[sp,#440]50eor r11,r11,r1151str r11,[sp,#444]52b .Lround2x5354.align 455.Lround2x:56ldmia r12,{r0,r1,r2,r3} @ A[0][0..1]57ldmia r10,{r10,r11,r12,r14} @ A[1][0..1]58#ifdef __thumb2__59eor r0,r0,r1060eor r1,r1,r1161eor r2,r2,r1262ldrd r10,r11,[sp,#56]63eor r3,r3,r1464ldrd r12,r14,[sp,#64]65eor r4,r4,r1066eor r5,r5,r1167eor r6,r6,r1268ldrd r10,r11,[sp,#72]69eor r7,r7,r1470ldrd r12,r14,[sp,#80]71eor r8,r8,r1072eor r9,r9,r1173eor r0,r0,r1274ldrd r10,r11,[sp,#88]75eor r1,r1,r1476ldrd r12,r14,[sp,#96]77eor r2,r2,r1078eor r3,r3,r1179eor r4,r4,r1280ldrd r10,r11,[sp,#104]81eor r5,r5,r1482ldrd r12,r14,[sp,#112]83eor r6,r6,r1084eor r7,r7,r1185eor r8,r8,r1286ldrd r10,r11,[sp,#120]87eor r9,r9,r1488ldrd r12,r14,[sp,#128]89eor r0,r0,r1090eor r1,r1,r1191eor r2,r2,r1292ldrd r10,r11,[sp,#136]93eor r3,r3,r1494ldrd r12,r14,[sp,#144]95eor r4,r4,r1096eor r5,r5,r1197eor r6,r6,r1298ldrd r10,r11,[sp,#152]99eor r7,r7,r14100ldrd r12,r14,[sp,#160]101eor r8,r8,r10102eor r9,r9,r11103eor r0,r0,r12104ldrd r10,r11,[sp,#168]105eor r1,r1,r14106ldrd r12,r14,[sp,#16]107eor r2,r2,r10108eor r3,r3,r11109eor r4,r4,r12110ldrd r10,r11,[sp,#24]111eor r5,r5,r14112ldrd r12,r14,[sp,#32]113#else114eor r0,r0,r10115add r10,sp,#56116eor r1,r1,r11117eor r2,r2,r12118eor r3,r3,r14119ldmia r10,{r10,r11,r12,r14} @ A[1][2..3]120eor r4,r4,r10121add r10,sp,#72122eor r5,r5,r11123eor r6,r6,r12124eor r7,r7,r14125ldmia r10,{r10,r11,r12,r14} @ A[1][4]..A[2][0]126eor r8,r8,r10127add r10,sp,#88128eor r9,r9,r11129eor r0,r0,r12130eor r1,r1,r14131ldmia r10,{r10,r11,r12,r14} @ A[2][1..2]132eor r2,r2,r10133add r10,sp,#104134eor r3,r3,r11135eor r4,r4,r12136eor r5,r5,r14137ldmia r10,{r10,r11,r12,r14} @ A[2][3..4]138eor r6,r6,r10139add r10,sp,#120140eor r7,r7,r11141eor r8,r8,r12142eor r9,r9,r14143ldmia r10,{r10,r11,r12,r14} @ A[3][0..1]144eor r0,r0,r10145add r10,sp,#136146eor r1,r1,r11147eor r2,r2,r12148eor r3,r3,r14149ldmia r10,{r10,r11,r12,r14} @ A[3][2..3]150eor r4,r4,r10151add r10,sp,#152152eor r5,r5,r11153eor r6,r6,r12154eor r7,r7,r14155ldmia r10,{r10,r11,r12,r14} @ A[3][4]..A[4][0]156eor r8,r8,r10157ldr r10,[sp,#168] @ A[4][1]158eor r9,r9,r11159ldr r11,[sp,#168+4]160eor r0,r0,r12161ldr r12,[sp,#16] @ A[0][2]162eor r1,r1,r14163ldr r14,[sp,#16+4]164eor r2,r2,r10165add r10,sp,#24166eor r3,r3,r11167eor r4,r4,r12168eor r5,r5,r14169ldmia r10,{r10,r11,r12,r14} @ A[0][3..4]170#endif171eor r6,r6,r10172eor r7,r7,r11173eor r8,r8,r12174eor r9,r9,r14175176eor r10,r0,r5,ror#32-1 @ E[0] = ROL64(C[2], 1) ^ C[0];177#ifndef __thumb2__178str r10,[sp,#208] @ D[1] = E[0]179#endif180eor r11,r1,r4181#ifndef __thumb2__182str r11,[sp,#208+4]183#else184strd r10,r11,[sp,#208] @ D[1] = E[0]185#endif186eor r12,r6,r1,ror#32-1 @ E[1] = ROL64(C[0], 1) ^ C[3];187eor r14,r7,r0188#ifndef __thumb2__189str r12,[sp,#232] @ D[4] = E[1]190#endif191eor r0,r8,r3,ror#32-1 @ C[0] = ROL64(C[1], 1) ^ C[4];192#ifndef __thumb2__193str r14,[sp,#232+4]194#else195strd r12,r14,[sp,#232] @ D[4] = E[1]196#endif197eor r1,r9,r2198#ifndef __thumb2__199str r0,[sp,#200] @ D[0] = C[0]200#endif201eor r2,r2,r7,ror#32-1 @ C[1] = ROL64(C[3], 1) ^ C[1];202#ifndef __thumb2__203ldr r7,[sp,#144]204#endif205eor r3,r3,r6206#ifndef __thumb2__207str r1,[sp,#200+4]208#else209strd r0,r1,[sp,#200] @ D[0] = C[0]210#endif211#ifndef __thumb2__212ldr r6,[sp,#144+4]213#else214ldrd r7,r6,[sp,#144]215#endif216#ifndef __thumb2__217str r2,[sp,#216] @ D[2] = C[1]218#endif219eor r4,r4,r9,ror#32-1 @ C[2] = ROL64(C[4], 1) ^ C[2];220#ifndef __thumb2__221str r3,[sp,#216+4]222#else223strd r2,r3,[sp,#216] @ D[2] = C[1]224#endif225eor r5,r5,r8226227#ifndef __thumb2__228ldr r8,[sp,#192]229#endif230#ifndef __thumb2__231ldr r9,[sp,#192+4]232#else233ldrd r8,r9,[sp,#192]234#endif235#ifndef __thumb2__236str r4,[sp,#224] @ D[3] = C[2]237#endif238eor r7,r7,r4239#ifndef __thumb2__240str r5,[sp,#224+4]241#else242strd r4,r5,[sp,#224] @ D[3] = C[2]243#endif244eor r6,r6,r5245#ifndef __thumb2__246ldr r4,[sp,#0]247#endif248@ mov r7,r7,ror#32-10 @ C[3] = ROL64(A[3][3] ^ C[2], rhotates[3][3]); /* D[3] */249@ mov r6,r6,ror#32-11250#ifndef __thumb2__251ldr r5,[sp,#0+4]252#else253ldrd r4,r5,[sp,#0]254#endif255eor r8,r8,r12256eor r9,r9,r14257#ifndef __thumb2__258ldr r12,[sp,#96]259#endif260eor r0,r0,r4261#ifndef __thumb2__262ldr r14,[sp,#96+4]263#else264ldrd r12,r14,[sp,#96]265#endif266@ mov r8,r8,ror#32-7 @ C[4] = ROL64(A[4][4] ^ E[1], rhotates[4][4]); /* D[4] */267@ mov r9,r9,ror#32-7268eor r1,r1,r5 @ C[0] = A[0][0] ^ C[0];269eor r12,r12,r2270#ifndef __thumb2__271ldr r2,[sp,#48]272#endif273eor r14,r14,r3274#ifndef __thumb2__275ldr r3,[sp,#48+4]276#else277ldrd r2,r3,[sp,#48]278#endif279mov r5,r12,ror#32-21 @ C[2] = ROL64(A[2][2] ^ C[1], rhotates[2][2]);280ldr r12,[sp,#444] @ load counter281eor r2,r2,r10282adr r10,iotas32283mov r4,r14,ror#32-22284add r14,r10,r12285eor r3,r3,r11286ldmia r14,{r10,r11} @ iotas[i]287bic r12,r4,r2,ror#32-22288bic r14,r5,r3,ror#32-22289mov r2,r2,ror#32-22 @ C[1] = ROL64(A[1][1] ^ E[0], rhotates[1][1]);290mov r3,r3,ror#32-22291eor r12,r12,r0292eor r14,r14,r1293eor r10,r10,r12294eor r11,r11,r14295#ifndef __thumb2__296str r10,[sp,#240] @ R[0][0] = C[0] ^ (~C[1] & C[2]) ^ iotas[i];297#endif298bic r12,r6,r4,ror#11299#ifndef __thumb2__300str r11,[sp,#240+4]301#else302strd r10,r11,[sp,#240] @ R[0][0] = C[0] ^ (~C[1] & C[2]) ^ iotas[i];303#endif304bic r14,r7,r5,ror#10305bic r10,r8,r6,ror#32-(11-7)306bic r11,r9,r7,ror#32-(10-7)307eor r12,r2,r12,ror#32-11308#ifndef __thumb2__309str r12,[sp,#248] @ R[0][1] = C[1] ^ (~C[2] & C[3]);310#endif311eor r14,r3,r14,ror#32-10312#ifndef __thumb2__313str r14,[sp,#248+4]314#else315strd r12,r14,[sp,#248] @ R[0][1] = C[1] ^ (~C[2] & C[3]);316#endif317eor r10,r4,r10,ror#32-7318eor r11,r5,r11,ror#32-7319#ifndef __thumb2__320str r10,[sp,#256] @ R[0][2] = C[2] ^ (~C[3] & C[4]);321#endif322bic r12,r0,r8,ror#32-7323#ifndef __thumb2__324str r11,[sp,#256+4]325#else326strd r10,r11,[sp,#256] @ R[0][2] = C[2] ^ (~C[3] & C[4]);327#endif328bic r14,r1,r9,ror#32-7329eor r12,r12,r6,ror#32-11330#ifndef __thumb2__331str r12,[sp,#264] @ R[0][3] = C[3] ^ (~C[4] & C[0]);332#endif333eor r14,r14,r7,ror#32-10334#ifndef __thumb2__335str r14,[sp,#264+4]336#else337strd r12,r14,[sp,#264] @ R[0][3] = C[3] ^ (~C[4] & C[0]);338#endif339bic r10,r2,r0340add r14,sp,#224341#ifndef __thumb2__342ldr r0,[sp,#24] @ A[0][3]343#endif344bic r11,r3,r1345#ifndef __thumb2__346ldr r1,[sp,#24+4]347#else348ldrd r0,r1,[sp,#24] @ A[0][3]349#endif350eor r10,r10,r8,ror#32-7351eor r11,r11,r9,ror#32-7352#ifndef __thumb2__353str r10,[sp,#272] @ R[0][4] = C[4] ^ (~C[0] & C[1]);354#endif355add r9,sp,#200356#ifndef __thumb2__357str r11,[sp,#272+4]358#else359strd r10,r11,[sp,#272] @ R[0][4] = C[4] ^ (~C[0] & C[1]);360#endif361362ldmia r14,{r10,r11,r12,r14} @ D[3..4]363ldmia r9,{r6,r7,r8,r9} @ D[0..1]364365#ifndef __thumb2__366ldr r2,[sp,#72] @ A[1][4]367#endif368eor r0,r0,r10369#ifndef __thumb2__370ldr r3,[sp,#72+4]371#else372ldrd r2,r3,[sp,#72] @ A[1][4]373#endif374eor r1,r1,r11375@ mov r0,r0,ror#32-14 @ C[0] = ROL64(A[0][3] ^ D[3], rhotates[0][3]);376#ifndef __thumb2__377ldr r10,[sp,#128] @ A[3][1]378#endif379@ mov r1,r1,ror#32-14380#ifndef __thumb2__381ldr r11,[sp,#128+4]382#else383ldrd r10,r11,[sp,#128] @ A[3][1]384#endif385386eor r2,r2,r12387#ifndef __thumb2__388ldr r4,[sp,#80] @ A[2][0]389#endif390eor r3,r3,r14391#ifndef __thumb2__392ldr r5,[sp,#80+4]393#else394ldrd r4,r5,[sp,#80] @ A[2][0]395#endif396@ mov r2,r2,ror#32-10 @ C[1] = ROL64(A[1][4] ^ D[4], rhotates[1][4]);397@ mov r3,r3,ror#32-10398399eor r6,r6,r4400#ifndef __thumb2__401ldr r12,[sp,#216] @ D[2]402#endif403eor r7,r7,r5404#ifndef __thumb2__405ldr r14,[sp,#216+4]406#else407ldrd r12,r14,[sp,#216] @ D[2]408#endif409mov r5,r6,ror#32-1 @ C[2] = ROL64(A[2][0] ^ D[0], rhotates[2][0]);410mov r4,r7,ror#32-2411412eor r10,r10,r8413#ifndef __thumb2__414ldr r8,[sp,#176] @ A[4][2]415#endif416eor r11,r11,r9417#ifndef __thumb2__418ldr r9,[sp,#176+4]419#else420ldrd r8,r9,[sp,#176] @ A[4][2]421#endif422mov r7,r10,ror#32-22 @ C[3] = ROL64(A[3][1] ^ D[1], rhotates[3][1]);423mov r6,r11,ror#32-23424425bic r10,r4,r2,ror#32-10426bic r11,r5,r3,ror#32-10427eor r12,r12,r8428eor r14,r14,r9429mov r9,r12,ror#32-30 @ C[4] = ROL64(A[4][2] ^ D[2], rhotates[4][2]);430mov r8,r14,ror#32-31431eor r10,r10,r0,ror#32-14432eor r11,r11,r1,ror#32-14433#ifndef __thumb2__434str r10,[sp,#280] @ R[1][0] = C[0] ^ (~C[1] & C[2])435#endif436bic r12,r6,r4437#ifndef __thumb2__438str r11,[sp,#280+4]439#else440strd r10,r11,[sp,#280] @ R[1][0] = C[0] ^ (~C[1] & C[2])441#endif442bic r14,r7,r5443eor r12,r12,r2,ror#32-10444#ifndef __thumb2__445str r12,[sp,#288] @ R[1][1] = C[1] ^ (~C[2] & C[3]);446#endif447eor r14,r14,r3,ror#32-10448#ifndef __thumb2__449str r14,[sp,#288+4]450#else451strd r12,r14,[sp,#288] @ R[1][1] = C[1] ^ (~C[2] & C[3]);452#endif453bic r10,r8,r6454bic r11,r9,r7455bic r12,r0,r8,ror#14456bic r14,r1,r9,ror#14457eor r10,r10,r4458eor r11,r11,r5459#ifndef __thumb2__460str r10,[sp,#296] @ R[1][2] = C[2] ^ (~C[3] & C[4]);461#endif462bic r2,r2,r0,ror#32-(14-10)463#ifndef __thumb2__464str r11,[sp,#296+4]465#else466strd r10,r11,[sp,#296] @ R[1][2] = C[2] ^ (~C[3] & C[4]);467#endif468eor r12,r6,r12,ror#32-14469bic r11,r3,r1,ror#32-(14-10)470#ifndef __thumb2__471str r12,[sp,#304] @ R[1][3] = C[3] ^ (~C[4] & C[0]);472#endif473eor r14,r7,r14,ror#32-14474#ifndef __thumb2__475str r14,[sp,#304+4]476#else477strd r12,r14,[sp,#304] @ R[1][3] = C[3] ^ (~C[4] & C[0]);478#endif479add r12,sp,#208480#ifndef __thumb2__481ldr r1,[sp,#8] @ A[0][1]482#endif483eor r10,r8,r2,ror#32-10484#ifndef __thumb2__485ldr r0,[sp,#8+4]486#else487ldrd r1,r0,[sp,#8] @ A[0][1]488#endif489eor r11,r9,r11,ror#32-10490#ifndef __thumb2__491str r10,[sp,#312] @ R[1][4] = C[4] ^ (~C[0] & C[1]);492#endif493#ifndef __thumb2__494str r11,[sp,#312+4]495#else496strd r10,r11,[sp,#312] @ R[1][4] = C[4] ^ (~C[0] & C[1]);497#endif498499add r9,sp,#224500ldmia r12,{r10,r11,r12,r14} @ D[1..2]501#ifndef __thumb2__502ldr r2,[sp,#56] @ A[1][2]503#endif504#ifndef __thumb2__505ldr r3,[sp,#56+4]506#else507ldrd r2,r3,[sp,#56] @ A[1][2]508#endif509ldmia r9,{r6,r7,r8,r9} @ D[3..4]510511eor r1,r1,r10512#ifndef __thumb2__513ldr r4,[sp,#104] @ A[2][3]514#endif515eor r0,r0,r11516#ifndef __thumb2__517ldr r5,[sp,#104+4]518#else519ldrd r4,r5,[sp,#104] @ A[2][3]520#endif521mov r0,r0,ror#32-1 @ C[0] = ROL64(A[0][1] ^ D[1], rhotates[0][1]);522523eor r2,r2,r12524#ifndef __thumb2__525ldr r10,[sp,#152] @ A[3][4]526#endif527eor r3,r3,r14528#ifndef __thumb2__529ldr r11,[sp,#152+4]530#else531ldrd r10,r11,[sp,#152] @ A[3][4]532#endif533@ mov r2,r2,ror#32-3 @ C[1] = ROL64(A[1][2] ^ D[2], rhotates[1][2]);534#ifndef __thumb2__535ldr r12,[sp,#200] @ D[0]536#endif537@ mov r3,r3,ror#32-3538#ifndef __thumb2__539ldr r14,[sp,#200+4]540#else541ldrd r12,r14,[sp,#200] @ D[0]542#endif543544eor r4,r4,r6545eor r5,r5,r7546@ mov r5,r6,ror#32-12 @ C[2] = ROL64(A[2][3] ^ D[3], rhotates[2][3]);547@ mov r4,r7,ror#32-13 @ [track reverse order below]548549eor r10,r10,r8550#ifndef __thumb2__551ldr r8,[sp,#160] @ A[4][0]552#endif553eor r11,r11,r9554#ifndef __thumb2__555ldr r9,[sp,#160+4]556#else557ldrd r8,r9,[sp,#160] @ A[4][0]558#endif559mov r6,r10,ror#32-4 @ C[3] = ROL64(A[3][4] ^ D[4], rhotates[3][4]);560mov r7,r11,ror#32-4561562eor r12,r12,r8563eor r14,r14,r9564mov r8,r12,ror#32-9 @ C[4] = ROL64(A[4][0] ^ D[0], rhotates[4][0]);565mov r9,r14,ror#32-9566567bic r10,r5,r2,ror#13-3568bic r11,r4,r3,ror#12-3569bic r12,r6,r5,ror#32-13570bic r14,r7,r4,ror#32-12571eor r10,r0,r10,ror#32-13572eor r11,r1,r11,ror#32-12573#ifndef __thumb2__574str r10,[sp,#320] @ R[2][0] = C[0] ^ (~C[1] & C[2])575#endif576eor r12,r12,r2,ror#32-3577#ifndef __thumb2__578str r11,[sp,#320+4]579#else580strd r10,r11,[sp,#320] @ R[2][0] = C[0] ^ (~C[1] & C[2])581#endif582eor r14,r14,r3,ror#32-3583#ifndef __thumb2__584str r12,[sp,#328] @ R[2][1] = C[1] ^ (~C[2] & C[3]);585#endif586bic r10,r8,r6587bic r11,r9,r7588#ifndef __thumb2__589str r14,[sp,#328+4]590#else591strd r12,r14,[sp,#328] @ R[2][1] = C[1] ^ (~C[2] & C[3]);592#endif593eor r10,r10,r5,ror#32-13594eor r11,r11,r4,ror#32-12595#ifndef __thumb2__596str r10,[sp,#336] @ R[2][2] = C[2] ^ (~C[3] & C[4]);597#endif598bic r12,r0,r8599#ifndef __thumb2__600str r11,[sp,#336+4]601#else602strd r10,r11,[sp,#336] @ R[2][2] = C[2] ^ (~C[3] & C[4]);603#endif604bic r14,r1,r9605eor r12,r12,r6606eor r14,r14,r7607#ifndef __thumb2__608str r12,[sp,#344] @ R[2][3] = C[3] ^ (~C[4] & C[0]);609#endif610bic r10,r2,r0,ror#3611#ifndef __thumb2__612str r14,[sp,#344+4]613#else614strd r12,r14,[sp,#344] @ R[2][3] = C[3] ^ (~C[4] & C[0]);615#endif616bic r11,r3,r1,ror#3617#ifndef __thumb2__618ldr r1,[sp,#32] @ A[0][4] [in reverse order]619#endif620eor r10,r8,r10,ror#32-3621#ifndef __thumb2__622ldr r0,[sp,#32+4]623#else624ldrd r1,r0,[sp,#32] @ A[0][4] [in reverse order]625#endif626eor r11,r9,r11,ror#32-3627#ifndef __thumb2__628str r10,[sp,#352] @ R[2][4] = C[4] ^ (~C[0] & C[1]);629#endif630add r9,sp,#208631#ifndef __thumb2__632str r11,[sp,#352+4]633#else634strd r10,r11,[sp,#352] @ R[2][4] = C[4] ^ (~C[0] & C[1]);635#endif636637#ifndef __thumb2__638ldr r10,[sp,#232] @ D[4]639#endif640#ifndef __thumb2__641ldr r11,[sp,#232+4]642#else643ldrd r10,r11,[sp,#232] @ D[4]644#endif645#ifndef __thumb2__646ldr r12,[sp,#200] @ D[0]647#endif648#ifndef __thumb2__649ldr r14,[sp,#200+4]650#else651ldrd r12,r14,[sp,#200] @ D[0]652#endif653654ldmia r9,{r6,r7,r8,r9} @ D[1..2]655656eor r1,r1,r10657#ifndef __thumb2__658ldr r2,[sp,#40] @ A[1][0]659#endif660eor r0,r0,r11661#ifndef __thumb2__662ldr r3,[sp,#40+4]663#else664ldrd r2,r3,[sp,#40] @ A[1][0]665#endif666@ mov r1,r10,ror#32-13 @ C[0] = ROL64(A[0][4] ^ D[4], rhotates[0][4]);667#ifndef __thumb2__668ldr r4,[sp,#88] @ A[2][1]669#endif670@ mov r0,r11,ror#32-14 @ [was loaded in reverse order]671#ifndef __thumb2__672ldr r5,[sp,#88+4]673#else674ldrd r4,r5,[sp,#88] @ A[2][1]675#endif676677eor r2,r2,r12678#ifndef __thumb2__679ldr r10,[sp,#136] @ A[3][2]680#endif681eor r3,r3,r14682#ifndef __thumb2__683ldr r11,[sp,#136+4]684#else685ldrd r10,r11,[sp,#136] @ A[3][2]686#endif687@ mov r2,r2,ror#32-18 @ C[1] = ROL64(A[1][0] ^ D[0], rhotates[1][0]);688#ifndef __thumb2__689ldr r12,[sp,#224] @ D[3]690#endif691@ mov r3,r3,ror#32-18692#ifndef __thumb2__693ldr r14,[sp,#224+4]694#else695ldrd r12,r14,[sp,#224] @ D[3]696#endif697698eor r6,r6,r4699eor r7,r7,r5700mov r4,r6,ror#32-5 @ C[2] = ROL64(A[2][1] ^ D[1], rhotates[2][1]);701mov r5,r7,ror#32-5702703eor r10,r10,r8704#ifndef __thumb2__705ldr r8,[sp,#184] @ A[4][3]706#endif707eor r11,r11,r9708#ifndef __thumb2__709ldr r9,[sp,#184+4]710#else711ldrd r8,r9,[sp,#184] @ A[4][3]712#endif713mov r7,r10,ror#32-7 @ C[3] = ROL64(A[3][2] ^ D[2], rhotates[3][2]);714mov r6,r11,ror#32-8715716eor r12,r12,r8717eor r14,r14,r9718mov r8,r12,ror#32-28 @ C[4] = ROL64(A[4][3] ^ D[3], rhotates[4][3]);719mov r9,r14,ror#32-28720721bic r10,r4,r2,ror#32-18722bic r11,r5,r3,ror#32-18723eor r10,r10,r0,ror#32-14724eor r11,r11,r1,ror#32-13725#ifndef __thumb2__726str r10,[sp,#360] @ R[3][0] = C[0] ^ (~C[1] & C[2])727#endif728bic r12,r6,r4729#ifndef __thumb2__730str r11,[sp,#360+4]731#else732strd r10,r11,[sp,#360] @ R[3][0] = C[0] ^ (~C[1] & C[2])733#endif734bic r14,r7,r5735eor r12,r12,r2,ror#32-18736#ifndef __thumb2__737str r12,[sp,#368] @ R[3][1] = C[1] ^ (~C[2] & C[3]);738#endif739eor r14,r14,r3,ror#32-18740#ifndef __thumb2__741str r14,[sp,#368+4]742#else743strd r12,r14,[sp,#368] @ R[3][1] = C[1] ^ (~C[2] & C[3]);744#endif745bic r10,r8,r6746bic r11,r9,r7747bic r12,r0,r8,ror#14748bic r14,r1,r9,ror#13749eor r10,r10,r4750eor r11,r11,r5751#ifndef __thumb2__752str r10,[sp,#376] @ R[3][2] = C[2] ^ (~C[3] & C[4]);753#endif754bic r2,r2,r0,ror#18-14755#ifndef __thumb2__756str r11,[sp,#376+4]757#else758strd r10,r11,[sp,#376] @ R[3][2] = C[2] ^ (~C[3] & C[4]);759#endif760eor r12,r6,r12,ror#32-14761bic r11,r3,r1,ror#18-13762eor r14,r7,r14,ror#32-13763#ifndef __thumb2__764str r12,[sp,#384] @ R[3][3] = C[3] ^ (~C[4] & C[0]);765#endif766#ifndef __thumb2__767str r14,[sp,#384+4]768#else769strd r12,r14,[sp,#384] @ R[3][3] = C[3] ^ (~C[4] & C[0]);770#endif771add r14,sp,#216772#ifndef __thumb2__773ldr r0,[sp,#16] @ A[0][2]774#endif775eor r10,r8,r2,ror#32-18776#ifndef __thumb2__777ldr r1,[sp,#16+4]778#else779ldrd r0,r1,[sp,#16] @ A[0][2]780#endif781eor r11,r9,r11,ror#32-18782#ifndef __thumb2__783str r10,[sp,#392] @ R[3][4] = C[4] ^ (~C[0] & C[1]);784#endif785#ifndef __thumb2__786str r11,[sp,#392+4]787#else788strd r10,r11,[sp,#392] @ R[3][4] = C[4] ^ (~C[0] & C[1]);789#endif790791ldmia r14,{r10,r11,r12,r14} @ D[2..3]792#ifndef __thumb2__793ldr r2,[sp,#64] @ A[1][3]794#endif795#ifndef __thumb2__796ldr r3,[sp,#64+4]797#else798ldrd r2,r3,[sp,#64] @ A[1][3]799#endif800#ifndef __thumb2__801ldr r6,[sp,#232] @ D[4]802#endif803#ifndef __thumb2__804ldr r7,[sp,#232+4]805#else806ldrd r6,r7,[sp,#232] @ D[4]807#endif808809eor r0,r0,r10810#ifndef __thumb2__811ldr r4,[sp,#112] @ A[2][4]812#endif813eor r1,r1,r11814#ifndef __thumb2__815ldr r5,[sp,#112+4]816#else817ldrd r4,r5,[sp,#112] @ A[2][4]818#endif819@ mov r0,r0,ror#32-31 @ C[0] = ROL64(A[0][2] ^ D[2], rhotates[0][2]);820#ifndef __thumb2__821ldr r8,[sp,#200] @ D[0]822#endif823@ mov r1,r1,ror#32-31824#ifndef __thumb2__825ldr r9,[sp,#200+4]826#else827ldrd r8,r9,[sp,#200] @ D[0]828#endif829830eor r12,r12,r2831#ifndef __thumb2__832ldr r10,[sp,#120] @ A[3][0]833#endif834eor r14,r14,r3835#ifndef __thumb2__836ldr r11,[sp,#120+4]837#else838ldrd r10,r11,[sp,#120] @ A[3][0]839#endif840mov r3,r12,ror#32-27 @ C[1] = ROL64(A[1][3] ^ D[3], rhotates[1][3]);841#ifndef __thumb2__842ldr r12,[sp,#208] @ D[1]843#endif844mov r2,r14,ror#32-28845#ifndef __thumb2__846ldr r14,[sp,#208+4]847#else848ldrd r12,r14,[sp,#208] @ D[1]849#endif850851eor r6,r6,r4852eor r7,r7,r5853mov r5,r6,ror#32-19 @ C[2] = ROL64(A[2][4] ^ D[4], rhotates[2][4]);854mov r4,r7,ror#32-20855856eor r10,r10,r8857#ifndef __thumb2__858ldr r8,[sp,#168] @ A[4][1]859#endif860eor r11,r11,r9861#ifndef __thumb2__862ldr r9,[sp,#168+4]863#else864ldrd r8,r9,[sp,#168] @ A[4][1]865#endif866mov r7,r10,ror#32-20 @ C[3] = ROL64(A[3][0] ^ D[0], rhotates[3][0]);867mov r6,r11,ror#32-21868869eor r8,r8,r12870eor r9,r9,r14871@ mov r8,r2,ror#32-1 @ C[4] = ROL64(A[4][1] ^ D[1], rhotates[4][1]);872@ mov r9,r3,ror#32-1873874bic r10,r4,r2875bic r11,r5,r3876eor r10,r10,r0,ror#32-31877#ifndef __thumb2__878str r10,[sp,#400] @ R[4][0] = C[0] ^ (~C[1] & C[2])879#endif880eor r11,r11,r1,ror#32-31881#ifndef __thumb2__882str r11,[sp,#400+4]883#else884strd r10,r11,[sp,#400] @ R[4][0] = C[0] ^ (~C[1] & C[2])885#endif886bic r12,r6,r4887bic r14,r7,r5888eor r12,r12,r2889eor r14,r14,r3890#ifndef __thumb2__891str r12,[sp,#408] @ R[4][1] = C[1] ^ (~C[2] & C[3]);892#endif893bic r10,r8,r6,ror#1894#ifndef __thumb2__895str r14,[sp,#408+4]896#else897strd r12,r14,[sp,#408] @ R[4][1] = C[1] ^ (~C[2] & C[3]);898#endif899bic r11,r9,r7,ror#1900bic r12,r0,r8,ror#31-1901bic r14,r1,r9,ror#31-1902eor r4,r4,r10,ror#32-1903#ifndef __thumb2__904str r4,[sp,#416] @ R[4][2] = C[2] ^= (~C[3] & C[4]);905#endif906eor r5,r5,r11,ror#32-1907#ifndef __thumb2__908str r5,[sp,#416+4]909#else910strd r4,r5,[sp,#416] @ R[4][2] = C[2] ^= (~C[3] & C[4]);911#endif912eor r6,r6,r12,ror#32-31913eor r7,r7,r14,ror#32-31914#ifndef __thumb2__915str r6,[sp,#424] @ R[4][3] = C[3] ^= (~C[4] & C[0]);916#endif917bic r10,r2,r0,ror#32-31918#ifndef __thumb2__919str r7,[sp,#424+4]920#else921strd r6,r7,[sp,#424] @ R[4][3] = C[3] ^= (~C[4] & C[0]);922#endif923bic r11,r3,r1,ror#32-31924add r12,sp,#240925eor r8,r10,r8,ror#32-1926add r10,sp,#280927eor r9,r11,r9,ror#32-1928#ifndef __thumb2__929str r8,[sp,#432] @ R[4][4] = C[4] ^= (~C[0] & C[1]);930#endif931#ifndef __thumb2__932str r9,[sp,#432+4]933#else934strd r8,r9,[sp,#432] @ R[4][4] = C[4] ^= (~C[0] & C[1]);935#endif936ldmia r12,{r0,r1,r2,r3} @ A[0][0..1]937ldmia r10,{r10,r11,r12,r14} @ A[1][0..1]938#ifdef __thumb2__939eor r0,r0,r10940eor r1,r1,r11941eor r2,r2,r12942ldrd r10,r11,[sp,#296]943eor r3,r3,r14944ldrd r12,r14,[sp,#304]945eor r4,r4,r10946eor r5,r5,r11947eor r6,r6,r12948ldrd r10,r11,[sp,#312]949eor r7,r7,r14950ldrd r12,r14,[sp,#320]951eor r8,r8,r10952eor r9,r9,r11953eor r0,r0,r12954ldrd r10,r11,[sp,#328]955eor r1,r1,r14956ldrd r12,r14,[sp,#336]957eor r2,r2,r10958eor r3,r3,r11959eor r4,r4,r12960ldrd r10,r11,[sp,#344]961eor r5,r5,r14962ldrd r12,r14,[sp,#352]963eor r6,r6,r10964eor r7,r7,r11965eor r8,r8,r12966ldrd r10,r11,[sp,#360]967eor r9,r9,r14968ldrd r12,r14,[sp,#368]969eor r0,r0,r10970eor r1,r1,r11971eor r2,r2,r12972ldrd r10,r11,[sp,#376]973eor r3,r3,r14974ldrd r12,r14,[sp,#384]975eor r4,r4,r10976eor r5,r5,r11977eor r6,r6,r12978ldrd r10,r11,[sp,#392]979eor r7,r7,r14980ldrd r12,r14,[sp,#400]981eor r8,r8,r10982eor r9,r9,r11983eor r0,r0,r12984ldrd r10,r11,[sp,#408]985eor r1,r1,r14986ldrd r12,r14,[sp,#256]987eor r2,r2,r10988eor r3,r3,r11989eor r4,r4,r12990ldrd r10,r11,[sp,#264]991eor r5,r5,r14992ldrd r12,r14,[sp,#272]993#else994eor r0,r0,r10995add r10,sp,#296996eor r1,r1,r11997eor r2,r2,r12998eor r3,r3,r14999ldmia r10,{r10,r11,r12,r14} @ A[1][2..3]1000eor r4,r4,r101001add r10,sp,#3121002eor r5,r5,r111003eor r6,r6,r121004eor r7,r7,r141005ldmia r10,{r10,r11,r12,r14} @ A[1][4]..A[2][0]1006eor r8,r8,r101007add r10,sp,#3281008eor r9,r9,r111009eor r0,r0,r121010eor r1,r1,r141011ldmia r10,{r10,r11,r12,r14} @ A[2][1..2]1012eor r2,r2,r101013add r10,sp,#3441014eor r3,r3,r111015eor r4,r4,r121016eor r5,r5,r141017ldmia r10,{r10,r11,r12,r14} @ A[2][3..4]1018eor r6,r6,r101019add r10,sp,#3601020eor r7,r7,r111021eor r8,r8,r121022eor r9,r9,r141023ldmia r10,{r10,r11,r12,r14} @ A[3][0..1]1024eor r0,r0,r101025add r10,sp,#3761026eor r1,r1,r111027eor r2,r2,r121028eor r3,r3,r141029ldmia r10,{r10,r11,r12,r14} @ A[3][2..3]1030eor r4,r4,r101031add r10,sp,#3921032eor r5,r5,r111033eor r6,r6,r121034eor r7,r7,r141035ldmia r10,{r10,r11,r12,r14} @ A[3][4]..A[4][0]1036eor r8,r8,r101037ldr r10,[sp,#408] @ A[4][1]1038eor r9,r9,r111039ldr r11,[sp,#408+4]1040eor r0,r0,r121041ldr r12,[sp,#256] @ A[0][2]1042eor r1,r1,r141043ldr r14,[sp,#256+4]1044eor r2,r2,r101045add r10,sp,#2641046eor r3,r3,r111047eor r4,r4,r121048eor r5,r5,r141049ldmia r10,{r10,r11,r12,r14} @ A[0][3..4]1050#endif1051eor r6,r6,r101052eor r7,r7,r111053eor r8,r8,r121054eor r9,r9,r1410551056eor r10,r0,r5,ror#32-1 @ E[0] = ROL64(C[2], 1) ^ C[0];1057#ifndef __thumb2__1058str r10,[sp,#208] @ D[1] = E[0]1059#endif1060eor r11,r1,r41061#ifndef __thumb2__1062str r11,[sp,#208+4]1063#else1064strd r10,r11,[sp,#208] @ D[1] = E[0]1065#endif1066eor r12,r6,r1,ror#32-1 @ E[1] = ROL64(C[0], 1) ^ C[3];1067eor r14,r7,r01068#ifndef __thumb2__1069str r12,[sp,#232] @ D[4] = E[1]1070#endif1071eor r0,r8,r3,ror#32-1 @ C[0] = ROL64(C[1], 1) ^ C[4];1072#ifndef __thumb2__1073str r14,[sp,#232+4]1074#else1075strd r12,r14,[sp,#232] @ D[4] = E[1]1076#endif1077eor r1,r9,r21078#ifndef __thumb2__1079str r0,[sp,#200] @ D[0] = C[0]1080#endif1081eor r2,r2,r7,ror#32-1 @ C[1] = ROL64(C[3], 1) ^ C[1];1082#ifndef __thumb2__1083ldr r7,[sp,#384]1084#endif1085eor r3,r3,r61086#ifndef __thumb2__1087str r1,[sp,#200+4]1088#else1089strd r0,r1,[sp,#200] @ D[0] = C[0]1090#endif1091#ifndef __thumb2__1092ldr r6,[sp,#384+4]1093#else1094ldrd r7,r6,[sp,#384]1095#endif1096#ifndef __thumb2__1097str r2,[sp,#216] @ D[2] = C[1]1098#endif1099eor r4,r4,r9,ror#32-1 @ C[2] = ROL64(C[4], 1) ^ C[2];1100#ifndef __thumb2__1101str r3,[sp,#216+4]1102#else1103strd r2,r3,[sp,#216] @ D[2] = C[1]1104#endif1105eor r5,r5,r811061107#ifndef __thumb2__1108ldr r8,[sp,#432]1109#endif1110#ifndef __thumb2__1111ldr r9,[sp,#432+4]1112#else1113ldrd r8,r9,[sp,#432]1114#endif1115#ifndef __thumb2__1116str r4,[sp,#224] @ D[3] = C[2]1117#endif1118eor r7,r7,r41119#ifndef __thumb2__1120str r5,[sp,#224+4]1121#else1122strd r4,r5,[sp,#224] @ D[3] = C[2]1123#endif1124eor r6,r6,r51125#ifndef __thumb2__1126ldr r4,[sp,#240]1127#endif1128@ mov r7,r7,ror#32-10 @ C[3] = ROL64(A[3][3] ^ C[2], rhotates[3][3]); /* D[3] */1129@ mov r6,r6,ror#32-111130#ifndef __thumb2__1131ldr r5,[sp,#240+4]1132#else1133ldrd r4,r5,[sp,#240]1134#endif1135eor r8,r8,r121136eor r9,r9,r141137#ifndef __thumb2__1138ldr r12,[sp,#336]1139#endif1140eor r0,r0,r41141#ifndef __thumb2__1142ldr r14,[sp,#336+4]1143#else1144ldrd r12,r14,[sp,#336]1145#endif1146@ mov r8,r8,ror#32-7 @ C[4] = ROL64(A[4][4] ^ E[1], rhotates[4][4]); /* D[4] */1147@ mov r9,r9,ror#32-71148eor r1,r1,r5 @ C[0] = A[0][0] ^ C[0];1149eor r12,r12,r21150#ifndef __thumb2__1151ldr r2,[sp,#288]1152#endif1153eor r14,r14,r31154#ifndef __thumb2__1155ldr r3,[sp,#288+4]1156#else1157ldrd r2,r3,[sp,#288]1158#endif1159mov r5,r12,ror#32-21 @ C[2] = ROL64(A[2][2] ^ C[1], rhotates[2][2]);1160ldr r12,[sp,#444] @ load counter1161eor r2,r2,r101162adr r10,iotas321163mov r4,r14,ror#32-221164add r14,r10,r121165eor r3,r3,r111166#ifndef __thumb2__1167ldr r10,[r14,#8] @ iotas[i].lo1168#endif1169add r12,r12,#161170#ifndef __thumb2__1171ldr r11,[r14,#12] @ iotas[i].hi1172#else1173ldrd r10,r11,[r14,#8] @ iotas[i].lo1174#endif1175cmp r12,#1921176str r12,[sp,#444] @ store counter1177bic r12,r4,r2,ror#32-221178bic r14,r5,r3,ror#32-221179mov r2,r2,ror#32-22 @ C[1] = ROL64(A[1][1] ^ E[0], rhotates[1][1]);1180mov r3,r3,ror#32-221181eor r12,r12,r01182eor r14,r14,r11183eor r10,r10,r121184eor r11,r11,r141185#ifndef __thumb2__1186str r10,[sp,#0] @ R[0][0] = C[0] ^ (~C[1] & C[2]) ^ iotas[i];1187#endif1188bic r12,r6,r4,ror#111189#ifndef __thumb2__1190str r11,[sp,#0+4]1191#else1192strd r10,r11,[sp,#0] @ R[0][0] = C[0] ^ (~C[1] & C[2]) ^ iotas[i];1193#endif1194bic r14,r7,r5,ror#101195bic r10,r8,r6,ror#32-(11-7)1196bic r11,r9,r7,ror#32-(10-7)1197eor r12,r2,r12,ror#32-111198#ifndef __thumb2__1199str r12,[sp,#8] @ R[0][1] = C[1] ^ (~C[2] & C[3]);1200#endif1201eor r14,r3,r14,ror#32-101202#ifndef __thumb2__1203str r14,[sp,#8+4]1204#else1205strd r12,r14,[sp,#8] @ R[0][1] = C[1] ^ (~C[2] & C[3]);1206#endif1207eor r10,r4,r10,ror#32-71208eor r11,r5,r11,ror#32-71209#ifndef __thumb2__1210str r10,[sp,#16] @ R[0][2] = C[2] ^ (~C[3] & C[4]);1211#endif1212bic r12,r0,r8,ror#32-71213#ifndef __thumb2__1214str r11,[sp,#16+4]1215#else1216strd r10,r11,[sp,#16] @ R[0][2] = C[2] ^ (~C[3] & C[4]);1217#endif1218bic r14,r1,r9,ror#32-71219eor r12,r12,r6,ror#32-111220#ifndef __thumb2__1221str r12,[sp,#24] @ R[0][3] = C[3] ^ (~C[4] & C[0]);1222#endif1223eor r14,r14,r7,ror#32-101224#ifndef __thumb2__1225str r14,[sp,#24+4]1226#else1227strd r12,r14,[sp,#24] @ R[0][3] = C[3] ^ (~C[4] & C[0]);1228#endif1229bic r10,r2,r01230add r14,sp,#2241231#ifndef __thumb2__1232ldr r0,[sp,#264] @ A[0][3]1233#endif1234bic r11,r3,r11235#ifndef __thumb2__1236ldr r1,[sp,#264+4]1237#else1238ldrd r0,r1,[sp,#264] @ A[0][3]1239#endif1240eor r10,r10,r8,ror#32-71241eor r11,r11,r9,ror#32-71242#ifndef __thumb2__1243str r10,[sp,#32] @ R[0][4] = C[4] ^ (~C[0] & C[1]);1244#endif1245add r9,sp,#2001246#ifndef __thumb2__1247str r11,[sp,#32+4]1248#else1249strd r10,r11,[sp,#32] @ R[0][4] = C[4] ^ (~C[0] & C[1]);1250#endif12511252ldmia r14,{r10,r11,r12,r14} @ D[3..4]1253ldmia r9,{r6,r7,r8,r9} @ D[0..1]12541255#ifndef __thumb2__1256ldr r2,[sp,#312] @ A[1][4]1257#endif1258eor r0,r0,r101259#ifndef __thumb2__1260ldr r3,[sp,#312+4]1261#else1262ldrd r2,r3,[sp,#312] @ A[1][4]1263#endif1264eor r1,r1,r111265@ mov r0,r0,ror#32-14 @ C[0] = ROL64(A[0][3] ^ D[3], rhotates[0][3]);1266#ifndef __thumb2__1267ldr r10,[sp,#368] @ A[3][1]1268#endif1269@ mov r1,r1,ror#32-141270#ifndef __thumb2__1271ldr r11,[sp,#368+4]1272#else1273ldrd r10,r11,[sp,#368] @ A[3][1]1274#endif12751276eor r2,r2,r121277#ifndef __thumb2__1278ldr r4,[sp,#320] @ A[2][0]1279#endif1280eor r3,r3,r141281#ifndef __thumb2__1282ldr r5,[sp,#320+4]1283#else1284ldrd r4,r5,[sp,#320] @ A[2][0]1285#endif1286@ mov r2,r2,ror#32-10 @ C[1] = ROL64(A[1][4] ^ D[4], rhotates[1][4]);1287@ mov r3,r3,ror#32-1012881289eor r6,r6,r41290#ifndef __thumb2__1291ldr r12,[sp,#216] @ D[2]1292#endif1293eor r7,r7,r51294#ifndef __thumb2__1295ldr r14,[sp,#216+4]1296#else1297ldrd r12,r14,[sp,#216] @ D[2]1298#endif1299mov r5,r6,ror#32-1 @ C[2] = ROL64(A[2][0] ^ D[0], rhotates[2][0]);1300mov r4,r7,ror#32-213011302eor r10,r10,r81303#ifndef __thumb2__1304ldr r8,[sp,#416] @ A[4][2]1305#endif1306eor r11,r11,r91307#ifndef __thumb2__1308ldr r9,[sp,#416+4]1309#else1310ldrd r8,r9,[sp,#416] @ A[4][2]1311#endif1312mov r7,r10,ror#32-22 @ C[3] = ROL64(A[3][1] ^ D[1], rhotates[3][1]);1313mov r6,r11,ror#32-2313141315bic r10,r4,r2,ror#32-101316bic r11,r5,r3,ror#32-101317eor r12,r12,r81318eor r14,r14,r91319mov r9,r12,ror#32-30 @ C[4] = ROL64(A[4][2] ^ D[2], rhotates[4][2]);1320mov r8,r14,ror#32-311321eor r10,r10,r0,ror#32-141322eor r11,r11,r1,ror#32-141323#ifndef __thumb2__1324str r10,[sp,#40] @ R[1][0] = C[0] ^ (~C[1] & C[2])1325#endif1326bic r12,r6,r41327#ifndef __thumb2__1328str r11,[sp,#40+4]1329#else1330strd r10,r11,[sp,#40] @ R[1][0] = C[0] ^ (~C[1] & C[2])1331#endif1332bic r14,r7,r51333eor r12,r12,r2,ror#32-101334#ifndef __thumb2__1335str r12,[sp,#48] @ R[1][1] = C[1] ^ (~C[2] & C[3]);1336#endif1337eor r14,r14,r3,ror#32-101338#ifndef __thumb2__1339str r14,[sp,#48+4]1340#else1341strd r12,r14,[sp,#48] @ R[1][1] = C[1] ^ (~C[2] & C[3]);1342#endif1343bic r10,r8,r61344bic r11,r9,r71345bic r12,r0,r8,ror#141346bic r14,r1,r9,ror#141347eor r10,r10,r41348eor r11,r11,r51349#ifndef __thumb2__1350str r10,[sp,#56] @ R[1][2] = C[2] ^ (~C[3] & C[4]);1351#endif1352bic r2,r2,r0,ror#32-(14-10)1353#ifndef __thumb2__1354str r11,[sp,#56+4]1355#else1356strd r10,r11,[sp,#56] @ R[1][2] = C[2] ^ (~C[3] & C[4]);1357#endif1358eor r12,r6,r12,ror#32-141359bic r11,r3,r1,ror#32-(14-10)1360#ifndef __thumb2__1361str r12,[sp,#64] @ R[1][3] = C[3] ^ (~C[4] & C[0]);1362#endif1363eor r14,r7,r14,ror#32-141364#ifndef __thumb2__1365str r14,[sp,#64+4]1366#else1367strd r12,r14,[sp,#64] @ R[1][3] = C[3] ^ (~C[4] & C[0]);1368#endif1369add r12,sp,#2081370#ifndef __thumb2__1371ldr r1,[sp,#248] @ A[0][1]1372#endif1373eor r10,r8,r2,ror#32-101374#ifndef __thumb2__1375ldr r0,[sp,#248+4]1376#else1377ldrd r1,r0,[sp,#248] @ A[0][1]1378#endif1379eor r11,r9,r11,ror#32-101380#ifndef __thumb2__1381str r10,[sp,#72] @ R[1][4] = C[4] ^ (~C[0] & C[1]);1382#endif1383#ifndef __thumb2__1384str r11,[sp,#72+4]1385#else1386strd r10,r11,[sp,#72] @ R[1][4] = C[4] ^ (~C[0] & C[1]);1387#endif13881389add r9,sp,#2241390ldmia r12,{r10,r11,r12,r14} @ D[1..2]1391#ifndef __thumb2__1392ldr r2,[sp,#296] @ A[1][2]1393#endif1394#ifndef __thumb2__1395ldr r3,[sp,#296+4]1396#else1397ldrd r2,r3,[sp,#296] @ A[1][2]1398#endif1399ldmia r9,{r6,r7,r8,r9} @ D[3..4]14001401eor r1,r1,r101402#ifndef __thumb2__1403ldr r4,[sp,#344] @ A[2][3]1404#endif1405eor r0,r0,r111406#ifndef __thumb2__1407ldr r5,[sp,#344+4]1408#else1409ldrd r4,r5,[sp,#344] @ A[2][3]1410#endif1411mov r0,r0,ror#32-1 @ C[0] = ROL64(A[0][1] ^ D[1], rhotates[0][1]);14121413eor r2,r2,r121414#ifndef __thumb2__1415ldr r10,[sp,#392] @ A[3][4]1416#endif1417eor r3,r3,r141418#ifndef __thumb2__1419ldr r11,[sp,#392+4]1420#else1421ldrd r10,r11,[sp,#392] @ A[3][4]1422#endif1423@ mov r2,r2,ror#32-3 @ C[1] = ROL64(A[1][2] ^ D[2], rhotates[1][2]);1424#ifndef __thumb2__1425ldr r12,[sp,#200] @ D[0]1426#endif1427@ mov r3,r3,ror#32-31428#ifndef __thumb2__1429ldr r14,[sp,#200+4]1430#else1431ldrd r12,r14,[sp,#200] @ D[0]1432#endif14331434eor r4,r4,r61435eor r5,r5,r71436@ mov r5,r6,ror#32-12 @ C[2] = ROL64(A[2][3] ^ D[3], rhotates[2][3]);1437@ mov r4,r7,ror#32-13 @ [track reverse order below]14381439eor r10,r10,r81440#ifndef __thumb2__1441ldr r8,[sp,#400] @ A[4][0]1442#endif1443eor r11,r11,r91444#ifndef __thumb2__1445ldr r9,[sp,#400+4]1446#else1447ldrd r8,r9,[sp,#400] @ A[4][0]1448#endif1449mov r6,r10,ror#32-4 @ C[3] = ROL64(A[3][4] ^ D[4], rhotates[3][4]);1450mov r7,r11,ror#32-414511452eor r12,r12,r81453eor r14,r14,r91454mov r8,r12,ror#32-9 @ C[4] = ROL64(A[4][0] ^ D[0], rhotates[4][0]);1455mov r9,r14,ror#32-914561457bic r10,r5,r2,ror#13-31458bic r11,r4,r3,ror#12-31459bic r12,r6,r5,ror#32-131460bic r14,r7,r4,ror#32-121461eor r10,r0,r10,ror#32-131462eor r11,r1,r11,ror#32-121463#ifndef __thumb2__1464str r10,[sp,#80] @ R[2][0] = C[0] ^ (~C[1] & C[2])1465#endif1466eor r12,r12,r2,ror#32-31467#ifndef __thumb2__1468str r11,[sp,#80+4]1469#else1470strd r10,r11,[sp,#80] @ R[2][0] = C[0] ^ (~C[1] & C[2])1471#endif1472eor r14,r14,r3,ror#32-31473#ifndef __thumb2__1474str r12,[sp,#88] @ R[2][1] = C[1] ^ (~C[2] & C[3]);1475#endif1476bic r10,r8,r61477bic r11,r9,r71478#ifndef __thumb2__1479str r14,[sp,#88+4]1480#else1481strd r12,r14,[sp,#88] @ R[2][1] = C[1] ^ (~C[2] & C[3]);1482#endif1483eor r10,r10,r5,ror#32-131484eor r11,r11,r4,ror#32-121485#ifndef __thumb2__1486str r10,[sp,#96] @ R[2][2] = C[2] ^ (~C[3] & C[4]);1487#endif1488bic r12,r0,r81489#ifndef __thumb2__1490str r11,[sp,#96+4]1491#else1492strd r10,r11,[sp,#96] @ R[2][2] = C[2] ^ (~C[3] & C[4]);1493#endif1494bic r14,r1,r91495eor r12,r12,r61496eor r14,r14,r71497#ifndef __thumb2__1498str r12,[sp,#104] @ R[2][3] = C[3] ^ (~C[4] & C[0]);1499#endif1500bic r10,r2,r0,ror#31501#ifndef __thumb2__1502str r14,[sp,#104+4]1503#else1504strd r12,r14,[sp,#104] @ R[2][3] = C[3] ^ (~C[4] & C[0]);1505#endif1506bic r11,r3,r1,ror#31507#ifndef __thumb2__1508ldr r1,[sp,#272] @ A[0][4] [in reverse order]1509#endif1510eor r10,r8,r10,ror#32-31511#ifndef __thumb2__1512ldr r0,[sp,#272+4]1513#else1514ldrd r1,r0,[sp,#272] @ A[0][4] [in reverse order]1515#endif1516eor r11,r9,r11,ror#32-31517#ifndef __thumb2__1518str r10,[sp,#112] @ R[2][4] = C[4] ^ (~C[0] & C[1]);1519#endif1520add r9,sp,#2081521#ifndef __thumb2__1522str r11,[sp,#112+4]1523#else1524strd r10,r11,[sp,#112] @ R[2][4] = C[4] ^ (~C[0] & C[1]);1525#endif15261527#ifndef __thumb2__1528ldr r10,[sp,#232] @ D[4]1529#endif1530#ifndef __thumb2__1531ldr r11,[sp,#232+4]1532#else1533ldrd r10,r11,[sp,#232] @ D[4]1534#endif1535#ifndef __thumb2__1536ldr r12,[sp,#200] @ D[0]1537#endif1538#ifndef __thumb2__1539ldr r14,[sp,#200+4]1540#else1541ldrd r12,r14,[sp,#200] @ D[0]1542#endif15431544ldmia r9,{r6,r7,r8,r9} @ D[1..2]15451546eor r1,r1,r101547#ifndef __thumb2__1548ldr r2,[sp,#280] @ A[1][0]1549#endif1550eor r0,r0,r111551#ifndef __thumb2__1552ldr r3,[sp,#280+4]1553#else1554ldrd r2,r3,[sp,#280] @ A[1][0]1555#endif1556@ mov r1,r10,ror#32-13 @ C[0] = ROL64(A[0][4] ^ D[4], rhotates[0][4]);1557#ifndef __thumb2__1558ldr r4,[sp,#328] @ A[2][1]1559#endif1560@ mov r0,r11,ror#32-14 @ [was loaded in reverse order]1561#ifndef __thumb2__1562ldr r5,[sp,#328+4]1563#else1564ldrd r4,r5,[sp,#328] @ A[2][1]1565#endif15661567eor r2,r2,r121568#ifndef __thumb2__1569ldr r10,[sp,#376] @ A[3][2]1570#endif1571eor r3,r3,r141572#ifndef __thumb2__1573ldr r11,[sp,#376+4]1574#else1575ldrd r10,r11,[sp,#376] @ A[3][2]1576#endif1577@ mov r2,r2,ror#32-18 @ C[1] = ROL64(A[1][0] ^ D[0], rhotates[1][0]);1578#ifndef __thumb2__1579ldr r12,[sp,#224] @ D[3]1580#endif1581@ mov r3,r3,ror#32-181582#ifndef __thumb2__1583ldr r14,[sp,#224+4]1584#else1585ldrd r12,r14,[sp,#224] @ D[3]1586#endif15871588eor r6,r6,r41589eor r7,r7,r51590mov r4,r6,ror#32-5 @ C[2] = ROL64(A[2][1] ^ D[1], rhotates[2][1]);1591mov r5,r7,ror#32-515921593eor r10,r10,r81594#ifndef __thumb2__1595ldr r8,[sp,#424] @ A[4][3]1596#endif1597eor r11,r11,r91598#ifndef __thumb2__1599ldr r9,[sp,#424+4]1600#else1601ldrd r8,r9,[sp,#424] @ A[4][3]1602#endif1603mov r7,r10,ror#32-7 @ C[3] = ROL64(A[3][2] ^ D[2], rhotates[3][2]);1604mov r6,r11,ror#32-816051606eor r12,r12,r81607eor r14,r14,r91608mov r8,r12,ror#32-28 @ C[4] = ROL64(A[4][3] ^ D[3], rhotates[4][3]);1609mov r9,r14,ror#32-2816101611bic r10,r4,r2,ror#32-181612bic r11,r5,r3,ror#32-181613eor r10,r10,r0,ror#32-141614eor r11,r11,r1,ror#32-131615#ifndef __thumb2__1616str r10,[sp,#120] @ R[3][0] = C[0] ^ (~C[1] & C[2])1617#endif1618bic r12,r6,r41619#ifndef __thumb2__1620str r11,[sp,#120+4]1621#else1622strd r10,r11,[sp,#120] @ R[3][0] = C[0] ^ (~C[1] & C[2])1623#endif1624bic r14,r7,r51625eor r12,r12,r2,ror#32-181626#ifndef __thumb2__1627str r12,[sp,#128] @ R[3][1] = C[1] ^ (~C[2] & C[3]);1628#endif1629eor r14,r14,r3,ror#32-181630#ifndef __thumb2__1631str r14,[sp,#128+4]1632#else1633strd r12,r14,[sp,#128] @ R[3][1] = C[1] ^ (~C[2] & C[3]);1634#endif1635bic r10,r8,r61636bic r11,r9,r71637bic r12,r0,r8,ror#141638bic r14,r1,r9,ror#131639eor r10,r10,r41640eor r11,r11,r51641#ifndef __thumb2__1642str r10,[sp,#136] @ R[3][2] = C[2] ^ (~C[3] & C[4]);1643#endif1644bic r2,r2,r0,ror#18-141645#ifndef __thumb2__1646str r11,[sp,#136+4]1647#else1648strd r10,r11,[sp,#136] @ R[3][2] = C[2] ^ (~C[3] & C[4]);1649#endif1650eor r12,r6,r12,ror#32-141651bic r11,r3,r1,ror#18-131652eor r14,r7,r14,ror#32-131653#ifndef __thumb2__1654str r12,[sp,#144] @ R[3][3] = C[3] ^ (~C[4] & C[0]);1655#endif1656#ifndef __thumb2__1657str r14,[sp,#144+4]1658#else1659strd r12,r14,[sp,#144] @ R[3][3] = C[3] ^ (~C[4] & C[0]);1660#endif1661add r14,sp,#2161662#ifndef __thumb2__1663ldr r0,[sp,#256] @ A[0][2]1664#endif1665eor r10,r8,r2,ror#32-181666#ifndef __thumb2__1667ldr r1,[sp,#256+4]1668#else1669ldrd r0,r1,[sp,#256] @ A[0][2]1670#endif1671eor r11,r9,r11,ror#32-181672#ifndef __thumb2__1673str r10,[sp,#152] @ R[3][4] = C[4] ^ (~C[0] & C[1]);1674#endif1675#ifndef __thumb2__1676str r11,[sp,#152+4]1677#else1678strd r10,r11,[sp,#152] @ R[3][4] = C[4] ^ (~C[0] & C[1]);1679#endif16801681ldmia r14,{r10,r11,r12,r14} @ D[2..3]1682#ifndef __thumb2__1683ldr r2,[sp,#304] @ A[1][3]1684#endif1685#ifndef __thumb2__1686ldr r3,[sp,#304+4]1687#else1688ldrd r2,r3,[sp,#304] @ A[1][3]1689#endif1690#ifndef __thumb2__1691ldr r6,[sp,#232] @ D[4]1692#endif1693#ifndef __thumb2__1694ldr r7,[sp,#232+4]1695#else1696ldrd r6,r7,[sp,#232] @ D[4]1697#endif16981699eor r0,r0,r101700#ifndef __thumb2__1701ldr r4,[sp,#352] @ A[2][4]1702#endif1703eor r1,r1,r111704#ifndef __thumb2__1705ldr r5,[sp,#352+4]1706#else1707ldrd r4,r5,[sp,#352] @ A[2][4]1708#endif1709@ mov r0,r0,ror#32-31 @ C[0] = ROL64(A[0][2] ^ D[2], rhotates[0][2]);1710#ifndef __thumb2__1711ldr r8,[sp,#200] @ D[0]1712#endif1713@ mov r1,r1,ror#32-311714#ifndef __thumb2__1715ldr r9,[sp,#200+4]1716#else1717ldrd r8,r9,[sp,#200] @ D[0]1718#endif17191720eor r12,r12,r21721#ifndef __thumb2__1722ldr r10,[sp,#360] @ A[3][0]1723#endif1724eor r14,r14,r31725#ifndef __thumb2__1726ldr r11,[sp,#360+4]1727#else1728ldrd r10,r11,[sp,#360] @ A[3][0]1729#endif1730mov r3,r12,ror#32-27 @ C[1] = ROL64(A[1][3] ^ D[3], rhotates[1][3]);1731#ifndef __thumb2__1732ldr r12,[sp,#208] @ D[1]1733#endif1734mov r2,r14,ror#32-281735#ifndef __thumb2__1736ldr r14,[sp,#208+4]1737#else1738ldrd r12,r14,[sp,#208] @ D[1]1739#endif17401741eor r6,r6,r41742eor r7,r7,r51743mov r5,r6,ror#32-19 @ C[2] = ROL64(A[2][4] ^ D[4], rhotates[2][4]);1744mov r4,r7,ror#32-2017451746eor r10,r10,r81747#ifndef __thumb2__1748ldr r8,[sp,#408] @ A[4][1]1749#endif1750eor r11,r11,r91751#ifndef __thumb2__1752ldr r9,[sp,#408+4]1753#else1754ldrd r8,r9,[sp,#408] @ A[4][1]1755#endif1756mov r7,r10,ror#32-20 @ C[3] = ROL64(A[3][0] ^ D[0], rhotates[3][0]);1757mov r6,r11,ror#32-2117581759eor r8,r8,r121760eor r9,r9,r141761@ mov r8,r2,ror#32-1 @ C[4] = ROL64(A[4][1] ^ D[1], rhotates[4][1]);1762@ mov r9,r3,ror#32-117631764bic r10,r4,r21765bic r11,r5,r31766eor r10,r10,r0,ror#32-311767#ifndef __thumb2__1768str r10,[sp,#160] @ R[4][0] = C[0] ^ (~C[1] & C[2])1769#endif1770eor r11,r11,r1,ror#32-311771#ifndef __thumb2__1772str r11,[sp,#160+4]1773#else1774strd r10,r11,[sp,#160] @ R[4][0] = C[0] ^ (~C[1] & C[2])1775#endif1776bic r12,r6,r41777bic r14,r7,r51778eor r12,r12,r21779eor r14,r14,r31780#ifndef __thumb2__1781str r12,[sp,#168] @ R[4][1] = C[1] ^ (~C[2] & C[3]);1782#endif1783bic r10,r8,r6,ror#11784#ifndef __thumb2__1785str r14,[sp,#168+4]1786#else1787strd r12,r14,[sp,#168] @ R[4][1] = C[1] ^ (~C[2] & C[3]);1788#endif1789bic r11,r9,r7,ror#11790bic r12,r0,r8,ror#31-11791bic r14,r1,r9,ror#31-11792eor r4,r4,r10,ror#32-11793#ifndef __thumb2__1794str r4,[sp,#176] @ R[4][2] = C[2] ^= (~C[3] & C[4]);1795#endif1796eor r5,r5,r11,ror#32-11797#ifndef __thumb2__1798str r5,[sp,#176+4]1799#else1800strd r4,r5,[sp,#176] @ R[4][2] = C[2] ^= (~C[3] & C[4]);1801#endif1802eor r6,r6,r12,ror#32-311803eor r7,r7,r14,ror#32-311804#ifndef __thumb2__1805str r6,[sp,#184] @ R[4][3] = C[3] ^= (~C[4] & C[0]);1806#endif1807bic r10,r2,r0,ror#32-311808#ifndef __thumb2__1809str r7,[sp,#184+4]1810#else1811strd r6,r7,[sp,#184] @ R[4][3] = C[3] ^= (~C[4] & C[0]);1812#endif1813bic r11,r3,r1,ror#32-311814add r12,sp,#01815eor r8,r10,r8,ror#32-11816add r10,sp,#401817eor r9,r11,r9,ror#32-11818#ifndef __thumb2__1819str r8,[sp,#192] @ R[4][4] = C[4] ^= (~C[0] & C[1]);1820#endif1821#ifndef __thumb2__1822str r9,[sp,#192+4]1823#else1824strd r8,r9,[sp,#192] @ R[4][4] = C[4] ^= (~C[0] & C[1]);1825#endif1826blo .Lround2x18271828#if __ARM_ARCH__>=51829ldr pc,[sp,#440]1830#else1831ldr lr,[sp,#440]1832tst lr,#11833moveq pc,lr @ be binary compatible with V4, yet1834.word 0xe12fff1e @ interoperable with Thumb ISA:-)1835#endif1836.size KeccakF1600_int,.-KeccakF1600_int18371838.type KeccakF1600, %function1839.align 51840KeccakF1600:1841stmdb sp!,{r0,r4-r11,lr}1842sub sp,sp,#440+16 @ space for A[5][5],D[5],T[5][5],...18431844add r10,r0,#401845add r11,sp,#401846ldmia r0, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9} @ copy A[5][5] to stack1847stmia sp, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1848ldmia r10!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1849stmia r11!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1850ldmia r10!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1851stmia r11!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1852ldmia r10!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1853stmia r11!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1854ldmia r10, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1855add r12,sp,#01856add r10,sp,#401857stmia r11, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}18581859bl KeccakF1600_enter18601861ldr r11, [sp,#440+16] @ restore pointer to A1862ldmia sp, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1863stmia r11!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9} @ return A[5][5]1864ldmia r10!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1865stmia r11!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1866ldmia r10!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1867stmia r11!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1868ldmia r10!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1869stmia r11!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1870ldmia r10, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1871stmia r11, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}18721873add sp,sp,#440+201874#if __ARM_ARCH__>=51875ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc}1876#else1877ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,lr}1878tst lr,#11879moveq pc,lr @ be binary compatible with V4, yet1880.word 0xe12fff1e @ interoperable with Thumb ISA:-)1881#endif1882.size KeccakF1600,.-KeccakF16001883.globl SHA3_absorb1884.type SHA3_absorb,%function1885.align 51886SHA3_absorb:1887stmdb sp!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}1888sub sp,sp,#456+1618891890add r10,r0,#401891@ mov r11,r11892mov r12,r21893mov r14,r31894cmp r2,r31895blo .Labsorb_abort18961897add r11,sp,#01898ldmia r0, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9} @ copy A[5][5] to stack1899stmia r11!, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1900ldmia r10!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1901stmia r11!, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1902ldmia r10!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1903stmia r11!, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1904ldmia r10!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1905stmia r11!, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1906ldmia r10!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}1907stmia r11, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}19081909ldr r11,[sp,#476] @ restore r111910#ifdef __thumb2__1911mov r9,#0x00ff00ff1912mov r8,#0x0f0f0f0f1913mov r7,#0x333333331914mov r6,#0x555555551915#else1916mov r6,#0x11 @ compose constants1917mov r8,#0x0f1918mov r9,#0xff1919orr r6,r6,r6,lsl#81920orr r8,r8,r8,lsl#81921orr r6,r6,r6,lsl#16 @ 0x111111111922orr r9,r9,r9,lsl#16 @ 0x00ff00ff1923orr r8,r8,r8,lsl#16 @ 0x0f0f0f0f1924orr r7,r6,r6,lsl#1 @ 0x333333331925orr r6,r6,r6,lsl#2 @ 0x555555551926#endif1927str r9,[sp,#468]1928str r8,[sp,#464]1929str r7,[sp,#460]1930str r6,[sp,#456]1931b .Loop_absorb19321933.align 41934.Loop_absorb:1935subs r0,r12,r141936blo .Labsorbed1937add r10,sp,#01938str r0,[sp,#480] @ save len - bsz19391940.align 41941.Loop_block:1942ldrb r0,[r11],#11943ldrb r1,[r11],#11944ldrb r2,[r11],#11945ldrb r3,[r11],#11946ldrb r4,[r11],#11947orr r0,r0,r1,lsl#81948ldrb r1,[r11],#11949orr r0,r0,r2,lsl#161950ldrb r2,[r11],#11951orr r0,r0,r3,lsl#24 @ lo1952ldrb r3,[r11],#11953orr r1,r4,r1,lsl#81954orr r1,r1,r2,lsl#161955orr r1,r1,r3,lsl#24 @ hi19561957and r2,r0,r6 @ &=0x555555551958and r0,r0,r6,lsl#1 @ &=0xaaaaaaaa1959and r3,r1,r6 @ &=0x555555551960and r1,r1,r6,lsl#1 @ &=0xaaaaaaaa1961orr r2,r2,r2,lsr#11962orr r0,r0,r0,lsl#11963orr r3,r3,r3,lsr#11964orr r1,r1,r1,lsl#11965and r2,r2,r7 @ &=0x333333331966and r0,r0,r7,lsl#2 @ &=0xcccccccc1967and r3,r3,r7 @ &=0x333333331968and r1,r1,r7,lsl#2 @ &=0xcccccccc1969orr r2,r2,r2,lsr#21970orr r0,r0,r0,lsl#21971orr r3,r3,r3,lsr#21972orr r1,r1,r1,lsl#21973and r2,r2,r8 @ &=0x0f0f0f0f1974and r0,r0,r8,lsl#4 @ &=0xf0f0f0f01975and r3,r3,r8 @ &=0x0f0f0f0f1976and r1,r1,r8,lsl#4 @ &=0xf0f0f0f01977ldmia r10,{r4,r5} @ A_flat[i]1978orr r2,r2,r2,lsr#41979orr r0,r0,r0,lsl#41980orr r3,r3,r3,lsr#41981orr r1,r1,r1,lsl#41982and r2,r2,r9 @ &=0x00ff00ff1983and r0,r0,r9,lsl#8 @ &=0xff00ff001984and r3,r3,r9 @ &=0x00ff00ff1985and r1,r1,r9,lsl#8 @ &=0xff00ff001986orr r2,r2,r2,lsr#81987orr r0,r0,r0,lsl#81988orr r3,r3,r3,lsr#81989orr r1,r1,r1,lsl#819901991mov r2,r2,lsl#161992mov r1,r1,lsr#161993eor r4,r4,r3,lsl#161994eor r5,r5,r0,lsr#161995eor r4,r4,r2,lsr#161996eor r5,r5,r1,lsl#161997stmia r10!,{r4,r5} @ A_flat[i++] ^= BitInterleave(inp[0..7])19981999subs r14,r14,#82000bhi .Loop_block20012002str r11,[sp,#476]20032004bl KeccakF1600_int20052006add r14,sp,#4562007ldmia r14,{r6,r7,r8,r9,r10,r11,r12,r14} @ restore constants and variables2008b .Loop_absorb20092010.align 42011.Labsorbed:2012add r11,sp,#402013ldmia sp, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}2014stmia r10!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9} @ return A[5][5]2015ldmia r11!, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}2016stmia r10!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}2017ldmia r11!, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}2018stmia r10!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}2019ldmia r11!, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}2020stmia r10!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}2021ldmia r11, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}2022stmia r10, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}20232024.Labsorb_abort:2025add sp,sp,#456+322026mov r0,r12 @ return value2027#if __ARM_ARCH__>=52028ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc}2029#else2030ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}2031tst lr,#12032moveq pc,lr @ be binary compatible with V4, yet2033.word 0xe12fff1e @ interoperable with Thumb ISA:-)2034#endif2035.size SHA3_absorb,.-SHA3_absorb2036.globl SHA3_squeeze2037.type SHA3_squeeze,%function2038.align 52039SHA3_squeeze:2040stmdb sp!,{r0,r3-r10,lr}20412042mov r10,r02043mov r4,r12044mov r5,r22045mov r12,r32046ldr r0, [sp, #40] @ next is after the 10 pushed registers (10*4)20472048#ifdef __thumb2__2049mov r9,#0x00ff00ff2050mov r8,#0x0f0f0f0f2051mov r7,#0x333333332052mov r6,#0x555555552053#else2054mov r6,#0x11 @ compose constants2055mov r8,#0x0f2056mov r9,#0xff2057orr r6,r6,r6,lsl#82058orr r8,r8,r8,lsl#82059orr r6,r6,r6,lsl#16 @ 0x111111112060orr r9,r9,r9,lsl#16 @ 0x00ff00ff2061orr r8,r8,r8,lsl#16 @ 0x0f0f0f0f2062orr r7,r6,r6,lsl#1 @ 0x333333332063orr r6,r6,r6,lsl#2 @ 0x555555552064#endif2065stmdb sp!,{r6,r7,r8,r9}20662067mov r14,r102068cmp r0, #12069beq .Lnext_block2070b .Loop_squeeze20712072.align 42073.Loop_squeeze:2074ldmia r10!,{r0,r1} @ A_flat[i++]20752076mov r2,r0,lsl#162077mov r3,r1,lsl#16 @ r3 = r1 << 162078mov r2,r2,lsr#16 @ r2 = r0 & 0x0000ffff2079mov r1,r1,lsr#162080mov r0,r0,lsr#16 @ r0 = r0 >> 162081mov r1,r1,lsl#16 @ r1 = r1 & 0xffff000020822083orr r2,r2,r2,lsl#82084orr r3,r3,r3,lsr#82085orr r0,r0,r0,lsl#82086orr r1,r1,r1,lsr#82087and r2,r2,r9 @ &=0x00ff00ff2088and r3,r3,r9,lsl#8 @ &=0xff00ff002089and r0,r0,r9 @ &=0x00ff00ff2090and r1,r1,r9,lsl#8 @ &=0xff00ff002091orr r2,r2,r2,lsl#42092orr r3,r3,r3,lsr#42093orr r0,r0,r0,lsl#42094orr r1,r1,r1,lsr#42095and r2,r2,r8 @ &=0x0f0f0f0f2096and r3,r3,r8,lsl#4 @ &=0xf0f0f0f02097and r0,r0,r8 @ &=0x0f0f0f0f2098and r1,r1,r8,lsl#4 @ &=0xf0f0f0f02099orr r2,r2,r2,lsl#22100orr r3,r3,r3,lsr#22101orr r0,r0,r0,lsl#22102orr r1,r1,r1,lsr#22103and r2,r2,r7 @ &=0x333333332104and r3,r3,r7,lsl#2 @ &=0xcccccccc2105and r0,r0,r7 @ &=0x333333332106and r1,r1,r7,lsl#2 @ &=0xcccccccc2107orr r2,r2,r2,lsl#12108orr r3,r3,r3,lsr#12109orr r0,r0,r0,lsl#12110orr r1,r1,r1,lsr#12111and r2,r2,r6 @ &=0x555555552112and r3,r3,r6,lsl#1 @ &=0xaaaaaaaa2113and r0,r0,r6 @ &=0x555555552114and r1,r1,r6,lsl#1 @ &=0xaaaaaaaa21152116orr r2,r2,r32117orr r0,r0,r121182119cmp r5,#82120blo .Lsqueeze_tail2121mov r1,r2,lsr#82122strb r2,[r4],#12123mov r3,r2,lsr#162124strb r1,[r4],#12125mov r2,r2,lsr#242126strb r3,[r4],#12127strb r2,[r4],#121282129mov r1,r0,lsr#82130strb r0,[r4],#12131mov r3,r0,lsr#162132strb r1,[r4],#12133mov r0,r0,lsr#242134strb r3,[r4],#12135strb r0,[r4],#12136subs r5,r5,#82137beq .Lsqueeze_done21382139subs r12,r12,#8 @ bsz -= 82140bhi .Loop_squeeze2141.Lnext_block:2142mov r0,r14 @ original r1021432144bl KeccakF160021452146ldmia sp,{r6,r7,r8,r9,r10,r12} @ restore constants and variables2147mov r14,r102148b .Loop_squeeze21492150.align 42151.Lsqueeze_tail:2152strb r2,[r4],#12153mov r2,r2,lsr#82154subs r5,r5,#12155beq .Lsqueeze_done2156strb r2,[r4],#12157mov r2,r2,lsr#82158subs r5,r5,#12159beq .Lsqueeze_done2160strb r2,[r4],#12161mov r2,r2,lsr#82162subs r5,r5,#12163beq .Lsqueeze_done2164strb r2,[r4],#12165subs r5,r5,#12166beq .Lsqueeze_done21672168strb r0,[r4],#12169mov r0,r0,lsr#82170subs r5,r5,#12171beq .Lsqueeze_done2172strb r0,[r4],#12173mov r0,r0,lsr#82174subs r5,r5,#12175beq .Lsqueeze_done2176strb r0,[r4]2177b .Lsqueeze_done21782179.align 42180.Lsqueeze_done:2181add sp,sp,#242182#if __ARM_ARCH__>=52183ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,pc}2184#else2185ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,lr}2186tst lr,#12187moveq pc,lr @ be binary compatible with V4, yet2188.word 0xe12fff1e @ interoperable with Thumb ISA:-)2189#endif2190.size SHA3_squeeze,.-SHA3_squeeze2191#if __ARM_MAX_ARCH__>=72192.fpu neon21932194.type iotas64, %object2195.align 52196iotas64:2197.quad 0x00000000000000012198.quad 0x00000000000080822199.quad 0x800000000000808a2200.quad 0x80000000800080002201.quad 0x000000000000808b2202.quad 0x00000000800000012203.quad 0x80000000800080812204.quad 0x80000000000080092205.quad 0x000000000000008a2206.quad 0x00000000000000882207.quad 0x00000000800080092208.quad 0x000000008000000a2209.quad 0x000000008000808b2210.quad 0x800000000000008b2211.quad 0x80000000000080892212.quad 0x80000000000080032213.quad 0x80000000000080022214.quad 0x80000000000000802215.quad 0x000000000000800a2216.quad 0x800000008000000a2217.quad 0x80000000800080812218.quad 0x80000000000080802219.quad 0x00000000800000012220.quad 0x80000000800080082221.size iotas64,.-iotas6422222223.type KeccakF1600_neon, %function2224.align 52225KeccakF1600_neon:2226add r1, r0, #162227adr r2, iotas642228mov r3, #24 @ loop counter2229b .Loop_neon22302231.align 42232.Loop_neon:2233@ Theta2234vst1.64 {q4}, [r0,:64] @ offload A[0..1][4]2235veor q13, q0, q5 @ A[0..1][0]^A[2..3][0]2236vst1.64 {d18}, [r1,:64] @ offload A[2][4]2237veor q14, q1, q6 @ A[0..1][1]^A[2..3][1]2238veor q15, q2, q7 @ A[0..1][2]^A[2..3][2]2239veor d26, d26, d27 @ C[0]=A[0][0]^A[1][0]^A[2][0]^A[3][0]2240veor d27, d28, d29 @ C[1]=A[0][1]^A[1][1]^A[2][1]^A[3][1]2241veor q14, q3, q8 @ A[0..1][3]^A[2..3][3]2242veor q4, q4, q9 @ A[0..1][4]^A[2..3][4]2243veor d30, d30, d31 @ C[2]=A[0][2]^A[1][2]^A[2][2]^A[3][2]2244veor d31, d28, d29 @ C[3]=A[0][3]^A[1][3]^A[2][3]^A[3][3]2245veor d25, d8, d9 @ C[4]=A[0][4]^A[1][4]^A[2][4]^A[3][4]2246veor q13, q13, q10 @ C[0..1]^=A[4][0..1]2247veor q14, q15, q11 @ C[2..3]^=A[4][2..3]2248veor d25, d25, d24 @ C[4]^=A[4][4]22492250vadd.u64 q4, q13, q13 @ C[0..1]<<12251vadd.u64 q15, q14, q14 @ C[2..3]<<12252vadd.u64 d18, d25, d25 @ C[4]<<12253vsri.u64 q4, q13, #63 @ ROL64(C[0..1],1)2254vsri.u64 q15, q14, #63 @ ROL64(C[2..3],1)2255vsri.u64 d18, d25, #63 @ ROL64(C[4],1)2256veor d25, d25, d9 @ D[0] = C[4] ^= ROL64(C[1],1)2257veor q13, q13, q15 @ D[1..2] = C[0..1] ^ ROL64(C[2..3],1)2258veor d28, d28, d18 @ D[3] = C[2] ^= ROL64(C[4],1)2259veor d29, d29, d8 @ D[4] = C[3] ^= ROL64(C[0],1)22602261veor d0, d0, d25 @ A[0][0] ^= C[4]2262veor d1, d1, d25 @ A[1][0] ^= C[4]2263veor d10, d10, d25 @ A[2][0] ^= C[4]2264veor d11, d11, d25 @ A[3][0] ^= C[4]2265veor d20, d20, d25 @ A[4][0] ^= C[4]22662267veor d2, d2, d26 @ A[0][1] ^= D[1]2268veor d3, d3, d26 @ A[1][1] ^= D[1]2269veor d12, d12, d26 @ A[2][1] ^= D[1]2270veor d13, d13, d26 @ A[3][1] ^= D[1]2271veor d21, d21, d26 @ A[4][1] ^= D[1]2272vmov d26, d2722732274veor d6, d6, d28 @ A[0][3] ^= C[2]2275veor d7, d7, d28 @ A[1][3] ^= C[2]2276veor d16, d16, d28 @ A[2][3] ^= C[2]2277veor d17, d17, d28 @ A[3][3] ^= C[2]2278veor d23, d23, d28 @ A[4][3] ^= C[2]2279vld1.64 {q4}, [r0,:64] @ restore A[0..1][4]2280vmov d28, d2922812282vld1.64 {d18}, [r1,:64] @ restore A[2][4]2283veor q2, q2, q13 @ A[0..1][2] ^= D[2]2284veor q7, q7, q13 @ A[2..3][2] ^= D[2]2285veor d22, d22, d27 @ A[4][2] ^= D[2]22862287veor q4, q4, q14 @ A[0..1][4] ^= C[3]2288veor q9, q9, q14 @ A[2..3][4] ^= C[3]2289veor d24, d24, d29 @ A[4][4] ^= C[3]22902291@ Rho + Pi2292vmov d26, d2 @ C[1] = A[0][1]2293vshl.u64 d2, d3, #442294vmov d27, d4 @ C[2] = A[0][2]2295vshl.u64 d4, d14, #432296vmov d28, d6 @ C[3] = A[0][3]2297vshl.u64 d6, d17, #212298vmov d29, d8 @ C[4] = A[0][4]2299vshl.u64 d8, d24, #142300vsri.u64 d2, d3, #64-44 @ A[0][1] = ROL64(A[1][1], rhotates[1][1])2301vsri.u64 d4, d14, #64-43 @ A[0][2] = ROL64(A[2][2], rhotates[2][2])2302vsri.u64 d6, d17, #64-21 @ A[0][3] = ROL64(A[3][3], rhotates[3][3])2303vsri.u64 d8, d24, #64-14 @ A[0][4] = ROL64(A[4][4], rhotates[4][4])23042305vshl.u64 d3, d9, #202306vshl.u64 d14, d16, #252307vshl.u64 d17, d15, #152308vshl.u64 d24, d21, #22309vsri.u64 d3, d9, #64-20 @ A[1][1] = ROL64(A[1][4], rhotates[1][4])2310vsri.u64 d14, d16, #64-25 @ A[2][2] = ROL64(A[2][3], rhotates[2][3])2311vsri.u64 d17, d15, #64-15 @ A[3][3] = ROL64(A[3][2], rhotates[3][2])2312vsri.u64 d24, d21, #64-2 @ A[4][4] = ROL64(A[4][1], rhotates[4][1])23132314vshl.u64 d9, d22, #612315@ vshl.u64 d16, d19, #82316vshl.u64 d15, d12, #102317vshl.u64 d21, d7, #552318vsri.u64 d9, d22, #64-61 @ A[1][4] = ROL64(A[4][2], rhotates[4][2])2319vext.8 d16, d19, d19, #8-1 @ A[2][3] = ROL64(A[3][4], rhotates[3][4])2320vsri.u64 d15, d12, #64-10 @ A[3][2] = ROL64(A[2][1], rhotates[2][1])2321vsri.u64 d21, d7, #64-55 @ A[4][1] = ROL64(A[1][3], rhotates[1][3])23222323vshl.u64 d22, d18, #392324@ vshl.u64 d19, d23, #562325vshl.u64 d12, d5, #62326vshl.u64 d7, d13, #452327vsri.u64 d22, d18, #64-39 @ A[4][2] = ROL64(A[2][4], rhotates[2][4])2328vext.8 d19, d23, d23, #8-7 @ A[3][4] = ROL64(A[4][3], rhotates[4][3])2329vsri.u64 d12, d5, #64-6 @ A[2][1] = ROL64(A[1][2], rhotates[1][2])2330vsri.u64 d7, d13, #64-45 @ A[1][3] = ROL64(A[3][1], rhotates[3][1])23312332vshl.u64 d18, d20, #182333vshl.u64 d23, d11, #412334vshl.u64 d5, d10, #32335vshl.u64 d13, d1, #362336vsri.u64 d18, d20, #64-18 @ A[2][4] = ROL64(A[4][0], rhotates[4][0])2337vsri.u64 d23, d11, #64-41 @ A[4][3] = ROL64(A[3][0], rhotates[3][0])2338vsri.u64 d5, d10, #64-3 @ A[1][2] = ROL64(A[2][0], rhotates[2][0])2339vsri.u64 d13, d1, #64-36 @ A[3][1] = ROL64(A[1][0], rhotates[1][0])23402341vshl.u64 d1, d28, #282342vshl.u64 d10, d26, #12343vshl.u64 d11, d29, #272344vshl.u64 d20, d27, #622345vsri.u64 d1, d28, #64-28 @ A[1][0] = ROL64(C[3], rhotates[0][3])2346vsri.u64 d10, d26, #64-1 @ A[2][0] = ROL64(C[1], rhotates[0][1])2347vsri.u64 d11, d29, #64-27 @ A[3][0] = ROL64(C[4], rhotates[0][4])2348vsri.u64 d20, d27, #64-62 @ A[4][0] = ROL64(C[2], rhotates[0][2])23492350@ Chi + Iota2351vbic q13, q2, q12352vbic q14, q3, q22353vbic q15, q4, q32354veor q13, q13, q0 @ A[0..1][0] ^ (~A[0..1][1] & A[0..1][2])2355veor q14, q14, q1 @ A[0..1][1] ^ (~A[0..1][2] & A[0..1][3])2356veor q2, q2, q15 @ A[0..1][2] ^= (~A[0..1][3] & A[0..1][4])2357vst1.64 {q13}, [r0,:64] @ offload A[0..1][0]2358vbic q13, q0, q42359vbic q15, q1, q02360vmov q1, q14 @ A[0..1][1]2361veor q3, q3, q13 @ A[0..1][3] ^= (~A[0..1][4] & A[0..1][0])2362veor q4, q4, q15 @ A[0..1][4] ^= (~A[0..1][0] & A[0..1][1])23632364vbic q13, q7, q62365vmov q0, q5 @ A[2..3][0]2366vbic q14, q8, q72367vmov q15, q6 @ A[2..3][1]2368veor q5, q5, q13 @ A[2..3][0] ^= (~A[2..3][1] & A[2..3][2])2369vbic q13, q9, q82370veor q6, q6, q14 @ A[2..3][1] ^= (~A[2..3][2] & A[2..3][3])2371vbic q14, q0, q92372veor q7, q7, q13 @ A[2..3][2] ^= (~A[2..3][3] & A[2..3][4])2373vbic q13, q15, q02374veor q8, q8, q14 @ A[2..3][3] ^= (~A[2..3][4] & A[2..3][0])2375vmov q14, q10 @ A[4][0..1]2376veor q9, q9, q13 @ A[2..3][4] ^= (~A[2..3][0] & A[2..3][1])23772378vld1.64 d25, [r2,:64]! @ Iota[i++]2379vbic d26, d22, d212380vbic d27, d23, d222381vld1.64 {q0}, [r0,:64] @ restore A[0..1][0]2382veor d20, d20, d26 @ A[4][0] ^= (~A[4][1] & A[4][2])2383vbic d26, d24, d232384veor d21, d21, d27 @ A[4][1] ^= (~A[4][2] & A[4][3])2385vbic d27, d28, d242386veor d22, d22, d26 @ A[4][2] ^= (~A[4][3] & A[4][4])2387vbic d26, d29, d282388veor d23, d23, d27 @ A[4][3] ^= (~A[4][4] & A[4][0])2389veor d0, d0, d25 @ A[0][0] ^= Iota[i]2390veor d24, d24, d26 @ A[4][4] ^= (~A[4][0] & A[4][1])23912392subs r3, r3, #12393bne .Loop_neon23942395bx lr2396.size KeccakF1600_neon,.-KeccakF1600_neon23972398.globl SHA3_absorb_neon2399.type SHA3_absorb_neon, %function2400.align 52401SHA3_absorb_neon:2402stmdb sp!, {r4,r5,r6,lr}2403vstmdb sp!, {d8,d9,d10,d11,d12,d13,d14,d15}24042405mov r4, r1 @ inp2406mov r5, r2 @ len2407mov r6, r3 @ bsz24082409vld1.32 {d0}, [r0,:64]! @ A[0][0]2410vld1.32 {d2}, [r0,:64]! @ A[0][1]2411vld1.32 {d4}, [r0,:64]! @ A[0][2]2412vld1.32 {d6}, [r0,:64]! @ A[0][3]2413vld1.32 {d8}, [r0,:64]! @ A[0][4]24142415vld1.32 {d1}, [r0,:64]! @ A[1][0]2416vld1.32 {d3}, [r0,:64]! @ A[1][1]2417vld1.32 {d5}, [r0,:64]! @ A[1][2]2418vld1.32 {d7}, [r0,:64]! @ A[1][3]2419vld1.32 {d9}, [r0,:64]! @ A[1][4]24202421vld1.32 {d10}, [r0,:64]! @ A[2][0]2422vld1.32 {d12}, [r0,:64]! @ A[2][1]2423vld1.32 {d14}, [r0,:64]! @ A[2][2]2424vld1.32 {d16}, [r0,:64]! @ A[2][3]2425vld1.32 {d18}, [r0,:64]! @ A[2][4]24262427vld1.32 {d11}, [r0,:64]! @ A[3][0]2428vld1.32 {d13}, [r0,:64]! @ A[3][1]2429vld1.32 {d15}, [r0,:64]! @ A[3][2]2430vld1.32 {d17}, [r0,:64]! @ A[3][3]2431vld1.32 {d19}, [r0,:64]! @ A[3][4]24322433vld1.32 {d20,d21,d22,d23}, [r0,:64]! @ A[4][0..3]2434vld1.32 {d24}, [r0,:64] @ A[4][4]2435sub r0, r0, #24*8 @ rewind2436b .Loop_absorb_neon24372438.align 42439.Loop_absorb_neon:2440subs r12, r5, r6 @ len - bsz2441blo .Labsorbed_neon2442mov r5, r1224432444vld1.8 {d31}, [r4]! @ endian-neutral loads...2445cmp r6, #8*22446veor d0, d0, d31 @ A[0][0] ^= *inp++2447blo .Lprocess_neon2448vld1.8 {d31}, [r4]!2449veor d2, d2, d31 @ A[0][1] ^= *inp++2450beq .Lprocess_neon2451vld1.8 {d31}, [r4]!2452cmp r6, #8*42453veor d4, d4, d31 @ A[0][2] ^= *inp++2454blo .Lprocess_neon2455vld1.8 {d31}, [r4]!2456veor d6, d6, d31 @ A[0][3] ^= *inp++2457beq .Lprocess_neon2458vld1.8 {d31},[r4]!2459cmp r6, #8*62460veor d8, d8, d31 @ A[0][4] ^= *inp++2461blo .Lprocess_neon24622463vld1.8 {d31}, [r4]!2464veor d1, d1, d31 @ A[1][0] ^= *inp++2465beq .Lprocess_neon2466vld1.8 {d31}, [r4]!2467cmp r6, #8*82468veor d3, d3, d31 @ A[1][1] ^= *inp++2469blo .Lprocess_neon2470vld1.8 {d31}, [r4]!2471veor d5, d5, d31 @ A[1][2] ^= *inp++2472beq .Lprocess_neon2473vld1.8 {d31}, [r4]!2474cmp r6, #8*102475veor d7, d7, d31 @ A[1][3] ^= *inp++2476blo .Lprocess_neon2477vld1.8 {d31}, [r4]!2478veor d9, d9, d31 @ A[1][4] ^= *inp++2479beq .Lprocess_neon24802481vld1.8 {d31}, [r4]!2482cmp r6, #8*122483veor d10, d10, d31 @ A[2][0] ^= *inp++2484blo .Lprocess_neon2485vld1.8 {d31}, [r4]!2486veor d12, d12, d31 @ A[2][1] ^= *inp++2487beq .Lprocess_neon2488vld1.8 {d31}, [r4]!2489cmp r6, #8*142490veor d14, d14, d31 @ A[2][2] ^= *inp++2491blo .Lprocess_neon2492vld1.8 {d31}, [r4]!2493veor d16, d16, d31 @ A[2][3] ^= *inp++2494beq .Lprocess_neon2495vld1.8 {d31}, [r4]!2496cmp r6, #8*162497veor d18, d18, d31 @ A[2][4] ^= *inp++2498blo .Lprocess_neon24992500vld1.8 {d31}, [r4]!2501veor d11, d11, d31 @ A[3][0] ^= *inp++2502beq .Lprocess_neon2503vld1.8 {d31}, [r4]!2504cmp r6, #8*182505veor d13, d13, d31 @ A[3][1] ^= *inp++2506blo .Lprocess_neon2507vld1.8 {d31}, [r4]!2508veor d15, d15, d31 @ A[3][2] ^= *inp++2509beq .Lprocess_neon2510vld1.8 {d31}, [r4]!2511cmp r6, #8*202512veor d17, d17, d31 @ A[3][3] ^= *inp++2513blo .Lprocess_neon2514vld1.8 {d31}, [r4]!2515veor d19, d19, d31 @ A[3][4] ^= *inp++2516beq .Lprocess_neon25172518vld1.8 {d31}, [r4]!2519cmp r6, #8*222520veor d20, d20, d31 @ A[4][0] ^= *inp++2521blo .Lprocess_neon2522vld1.8 {d31}, [r4]!2523veor d21, d21, d31 @ A[4][1] ^= *inp++2524beq .Lprocess_neon2525vld1.8 {d31}, [r4]!2526cmp r6, #8*242527veor d22, d22, d31 @ A[4][2] ^= *inp++2528blo .Lprocess_neon2529vld1.8 {d31}, [r4]!2530veor d23, d23, d31 @ A[4][3] ^= *inp++2531beq .Lprocess_neon2532vld1.8 {d31}, [r4]!2533veor d24, d24, d31 @ A[4][4] ^= *inp++25342535.Lprocess_neon:2536bl KeccakF1600_neon2537b .Loop_absorb_neon25382539.align 42540.Labsorbed_neon:2541vst1.32 {d0}, [r0,:64]! @ A[0][0..4]2542vst1.32 {d2}, [r0,:64]!2543vst1.32 {d4}, [r0,:64]!2544vst1.32 {d6}, [r0,:64]!2545vst1.32 {d8}, [r0,:64]!25462547vst1.32 {d1}, [r0,:64]! @ A[1][0..4]2548vst1.32 {d3}, [r0,:64]!2549vst1.32 {d5}, [r0,:64]!2550vst1.32 {d7}, [r0,:64]!2551vst1.32 {d9}, [r0,:64]!25522553vst1.32 {d10}, [r0,:64]! @ A[2][0..4]2554vst1.32 {d12}, [r0,:64]!2555vst1.32 {d14}, [r0,:64]!2556vst1.32 {d16}, [r0,:64]!2557vst1.32 {d18}, [r0,:64]!25582559vst1.32 {d11}, [r0,:64]! @ A[3][0..4]2560vst1.32 {d13}, [r0,:64]!2561vst1.32 {d15}, [r0,:64]!2562vst1.32 {d17}, [r0,:64]!2563vst1.32 {d19}, [r0,:64]!25642565vst1.32 {d20,d21,d22,d23}, [r0,:64]! @ A[4][0..4]2566vst1.32 {d24}, [r0,:64]25672568mov r0, r5 @ return value2569vldmia sp!, {d8,d9,d10,d11,d12,d13,d14,d15}2570ldmia sp!, {r4,r5,r6,pc}2571.size SHA3_absorb_neon,.-SHA3_absorb_neon25722573.globl SHA3_squeeze_neon2574.type SHA3_squeeze_neon, %function2575.align 52576SHA3_squeeze_neon:2577stmdb sp!, {r4,r5,r6,lr}25782579mov r4, r1 @ out2580mov r5, r2 @ len2581mov r6, r3 @ bsz2582mov r12, r0 @ A_flat2583mov r14, r3 @ bsz2584b .Loop_squeeze_neon25852586.align 42587.Loop_squeeze_neon:2588cmp r5, #82589blo .Lsqueeze_neon_tail2590vld1.32 {d0}, [r12]!2591vst1.8 {d0}, [r4]! @ endian-neutral store25922593subs r5, r5, #8 @ len -= 82594beq .Lsqueeze_neon_done25952596subs r14, r14, #8 @ bsz -= 82597bhi .Loop_squeeze_neon25982599vstmdb sp!, {d8,d9,d10,d11,d12,d13,d14,d15}26002601vld1.32 {d0}, [r0,:64]! @ A[0][0..4]2602vld1.32 {d2}, [r0,:64]!2603vld1.32 {d4}, [r0,:64]!2604vld1.32 {d6}, [r0,:64]!2605vld1.32 {d8}, [r0,:64]!26062607vld1.32 {d1}, [r0,:64]! @ A[1][0..4]2608vld1.32 {d3}, [r0,:64]!2609vld1.32 {d5}, [r0,:64]!2610vld1.32 {d7}, [r0,:64]!2611vld1.32 {d9}, [r0,:64]!26122613vld1.32 {d10}, [r0,:64]! @ A[2][0..4]2614vld1.32 {d12}, [r0,:64]!2615vld1.32 {d14}, [r0,:64]!2616vld1.32 {d16}, [r0,:64]!2617vld1.32 {d18}, [r0,:64]!26182619vld1.32 {d11}, [r0,:64]! @ A[3][0..4]2620vld1.32 {d13}, [r0,:64]!2621vld1.32 {d15}, [r0,:64]!2622vld1.32 {d17}, [r0,:64]!2623vld1.32 {d19}, [r0,:64]!26242625vld1.32 {d20,d21,d22,d23}, [r0,:64]! @ A[4][0..4]2626vld1.32 {d24}, [r0,:64]2627sub r0, r0, #24*8 @ rewind26282629bl KeccakF1600_neon26302631mov r12, r0 @ A_flat2632vst1.32 {d0}, [r0,:64]! @ A[0][0..4]2633vst1.32 {d2}, [r0,:64]!2634vst1.32 {d4}, [r0,:64]!2635vst1.32 {d6}, [r0,:64]!2636vst1.32 {d8}, [r0,:64]!26372638vst1.32 {d1}, [r0,:64]! @ A[1][0..4]2639vst1.32 {d3}, [r0,:64]!2640vst1.32 {d5}, [r0,:64]!2641vst1.32 {d7}, [r0,:64]!2642vst1.32 {d9}, [r0,:64]!26432644vst1.32 {d10}, [r0,:64]! @ A[2][0..4]2645vst1.32 {d12}, [r0,:64]!2646vst1.32 {d14}, [r0,:64]!2647vst1.32 {d16}, [r0,:64]!2648vst1.32 {d18}, [r0,:64]!26492650vst1.32 {d11}, [r0,:64]! @ A[3][0..4]2651vst1.32 {d13}, [r0,:64]!2652vst1.32 {d15}, [r0,:64]!2653vst1.32 {d17}, [r0,:64]!2654vst1.32 {d19}, [r0,:64]!26552656vst1.32 {d20,d21,d22,d23}, [r0,:64]! @ A[4][0..4]2657mov r14, r6 @ bsz2658vst1.32 {d24}, [r0,:64]2659mov r0, r12 @ rewind26602661vldmia sp!, {d8,d9,d10,d11,d12,d13,d14,d15}2662b .Loop_squeeze_neon26632664.align 42665.Lsqueeze_neon_tail:2666ldmia r12, {r2,r3}2667cmp r5, #22668strb r2, [r4],#1 @ endian-neutral store2669mov r2, r2, lsr#82670blo .Lsqueeze_neon_done2671strb r2, [r4], #12672mov r2, r2, lsr#82673beq .Lsqueeze_neon_done2674strb r2, [r4], #12675mov r2, r2, lsr#82676cmp r5, #42677blo .Lsqueeze_neon_done2678strb r2, [r4], #12679beq .Lsqueeze_neon_done26802681strb r3, [r4], #12682mov r3, r3, lsr#82683cmp r5, #62684blo .Lsqueeze_neon_done2685strb r3, [r4], #12686mov r3, r3, lsr#82687beq .Lsqueeze_neon_done2688strb r3, [r4], #126892690.Lsqueeze_neon_done:2691ldmia sp!, {r4,r5,r6,pc}2692.size SHA3_squeeze_neon,.-SHA3_squeeze_neon2693#endif2694.byte 75,101,99,99,97,107,45,49,54,48,48,32,97,98,115,111,114,98,32,97,110,100,32,115,113,117,101,101,122,101,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,02695.align 22696.align 2269726982699