sha/asm/keccak1600-armv8.pl: halve the size of hw-assisted subroutine.
authorAndy Polyakov <appro@openssl.org>
Sun, 22 Apr 2018 10:24:09 +0000 (12:24 +0200)
committerAndy Polyakov <appro@openssl.org>
Mon, 23 Apr 2018 15:19:57 +0000 (17:19 +0200)
Reviewed-by: Richard Levitte <levitte@openssl.org>
Reviewed-by: Rich Salz <rsalz@openssl.org>
crypto/sha/asm/keccak1600-armv8.pl

index a32b8bae84c401a673b88fda908498a7fd7d7b6e..704ab4a7e45a875b1887d04bb7f4ea66b5fe6d53 100755 (executable)
@@ -538,13 +538,13 @@ $code.=<<___;
 .type  KeccakF1600_ce,%function
 .align 5
 KeccakF1600_ce:
-       mov     x9,#6
+       mov     x9,#12
        adr     x10,iotas
        b       .Loop_ce
 .align 4
 .Loop_ce:
 ___
-for($i=0; $i<4; $i++) {
+for($i=0; $i<2; $i++) {
 $code.=<<___;
        ////////////////////////////////////////////////// Theta
        eor3    $C[0],$A[0][0],$A[1][0],$A[2][0]
@@ -584,7 +584,7 @@ $code.=<<___;
        eor     $A[0][0],$A[0][0],$C[4]
        ldr     x11,[x10],#8
 
-       xar     $C[1]   ,$A[3][3],$C[2],#64-$rhotates[3][3]     // C[1]=A[0][3]
+       xar     $C[1],   $A[3][3],$C[2],#64-$rhotates[3][3]     // C[1]=A[0][3]
        xar     $A[3][3],$A[3][2],$C[6],#64-$rhotates[3][2]
        xar     $A[3][2],$A[2][1],$C[5],#64-$rhotates[2][1]
        xar     $A[2][1],$A[1][2],$C[6],#64-$rhotates[1][2]
@@ -598,7 +598,7 @@ $code.=<<___;
        xar     $A[1][3],$A[3][1],$C[5],#64-$rhotates[3][1]
        xar     $A[3][1],$A[1][0],$C[4],#64-$rhotates[1][0]
 
-       xar     $A[1][0],$A[0][3],$C[2],#64-$rhotates[0][3]     // *
+       xar     $C[2],   $A[0][3],$C[2],#64-$rhotates[0][3]     // C[2]=A[1][0]
 
        ////////////////////////////////////////////////// Chi+Iota
        dup     $C[6],x11                               // borrow C[6]
@@ -608,36 +608,36 @@ $code.=<<___;
        bcax    $A[0][3],$C[1],   $A[0][0],$A[0][4]
        bcax    $A[0][4],$A[0][4],$C[0],   $A[0][0]
 
-       bcax    $C[0],   $A[1][0],$A[1][2],$A[1][1]     // *
-       bcax    $C[1],   $A[1][1],$A[1][3],$A[1][2]     // *
+       bcax    $A[1][0],$C[2],   $A[1][2],$A[1][1]     // *
+       bcax    $C[0],   $A[1][1],$A[1][3],$A[1][2]     // *
        bcax    $A[1][2],$A[1][2],$A[1][4],$A[1][3]
-       bcax    $A[1][3],$A[1][3],$A[1][0],$A[1][4]
-       bcax    $A[1][4],$A[1][4],$A[1][1],$A[1][0]
+       bcax    $A[1][3],$A[1][3],$C[2],   $A[1][4]
+       bcax    $A[1][4],$A[1][4],$A[1][1],$C[2]
 
        eor     $A[0][0],$C[3],$C[6]                    // Iota
 
-       bcax    $C[2],   $A[2][0],$A[2][2],$A[2][1]     // *
-       bcax    $C[3],   $A[2][1],$A[2][3],$A[2][2]     // *
+       bcax    $C[1],   $A[2][0],$A[2][2],$A[2][1]     // *
+       bcax    $C[2],   $A[2][1],$A[2][3],$A[2][2]     // *
        bcax    $A[2][2],$A[2][2],$A[2][4],$A[2][3]
        bcax    $A[2][3],$A[2][3],$A[2][0],$A[2][4]
        bcax    $A[2][4],$A[2][4],$A[2][1],$A[2][0]
 
-       bcax    $A[2][0],$A[3][0],$A[3][2],$A[3][1]     // *
-       bcax    $A[2][1],$A[3][1],$A[3][3],$A[3][2]     // *
+       bcax    $C[3],   $A[3][0],$A[3][2],$A[3][1]     // *
+       bcax    $C[4],   $A[3][1],$A[3][3],$A[3][2]     // *
        bcax    $A[3][2],$A[3][2],$A[3][4],$A[3][3]
        bcax    $A[3][3],$A[3][3],$A[3][0],$A[3][4]
        bcax    $A[3][4],$A[3][4],$A[3][1],$A[3][0]
 
-       bcax    $A[3][0],$A[4][0],$A[4][2],$A[4][1]     // *
-       bcax    $A[3][1],$A[4][1],$A[4][3],$A[4][2]     // *
+       bcax    $C[5],   $A[4][0],$A[4][2],$A[4][1]     // *
+       bcax    $C[6],   $A[4][1],$A[4][3],$A[4][2]     // *
        bcax    $A[4][2],$A[4][2],$A[4][4],$A[4][3]
        bcax    $A[4][3],$A[4][3],$A[4][0],$A[4][4]
        bcax    $A[4][4],$A[4][4],$A[4][1],$A[4][0]
 ___
-       ($A[1][0],$A[1][1], $C[0],$C[1])
-       =  ($C[0],$C[1],    $A[1][0],$A[1][1]);
-       ($A[2][0],$A[2][1], $A[3][0],$A[3][1], $A[4][0],$A[4][1], $C[2],$C[3])
-       =  ($C[2],$C[3],    $A[2][0],$A[2][1], $A[3][0],$A[3][1], $A[4][0],$A[4][1]);
+       (         $A[1][1],       $C[0]) = (      $C[0],          $A[1][1]);
+       ($A[2][0],$A[2][1], $C[1],$C[2]) = ($C[1],$C[2], $A[2][0],$A[2][1]);
+       ($A[3][0],$A[3][1], $C[3],$C[4]) = ($C[3],$C[4], $A[3][0],$A[3][1]);
+       ($A[4][0],$A[4][1], $C[5],$C[6]) = ($C[5],$C[6], $A[4][0],$A[4][1]);
 }
 $code.=<<___;
        subs    x9,x9,#1