progs/perftest.c: Use from Glibc syscall numbers.
[catacomb] / symm / salsa20-arm-neon.S
index cea4019..519f8a3 100644 (file)
 /// MA 02111-1307, USA.
 
 ///--------------------------------------------------------------------------
-/// External definitions.
+/// Preliminaries.
 
 #include "config.h"
 #include "asm-common.h"
 
-///--------------------------------------------------------------------------
-/// Main.code.
-
        .arch   armv7-a
        .fpu    neon
+
        .text
 
+///--------------------------------------------------------------------------
+/// Main code.
+
 FUNC(salsa20_core_arm_neon)
 
        // Arguments are in registers.
@@ -71,11 +72,6 @@ FUNC(salsa20_core_arm_neon)
        //      [ 8  9 10 11]           [ 8 13  2  7] (c, q10)
        //      [12 13 14 15]           [12  1  6 11] (d, q11)
        //
-       //      [ 0  1  2  3] (a, q8)
-       //      [ 4  5  6  7] (b, q9)
-       //      [ 8  9 10 11] (c, q10)
-       //      [12 13 14 15] (d, q11)
-       //
        // We need a copy for later.  Rather than waste time copying them by
        // hand, we'll use the three-address nature of the instruction set.
        // But this means that the main loop is offset by a bit.
@@ -89,33 +85,29 @@ FUNC(salsa20_core_arm_neon)
        // b ^= (a + d) <<<  7
        vadd.u32 q0, q12, q15
        vshl.u32 q1, q0, #7
-       vshr.u32 q0, q0, #25
-       vorr    q0, q0, q1
-       veor    q9, q13, q0
+       vsri.u32 q1, q0, #25
+       veor    q9, q13, q1
 
        // c ^= (b + a) <<<  9
        vadd.u32 q0, q9, q12
        vshl.u32 q1, q0, #9
-       vshr.u32 q0, q0, #23
-       vorr    q0, q0, q1
-       veor    q10, q14, q0
+       vsri.u32 q1, q0, #23
+       veor    q10, q14, q1
 
        // d ^= (c + b) <<< 13
        vadd.u32 q0, q10, q9
-       vext.32 q9, q9, q9, #3
+        vext.32 q9, q9, q9, #3
        vshl.u32 q1, q0, #13
-       vshr.u32 q0, q0, #19
-       vorr    q0, q0, q1
-       veor    q11, q15, q0
+       vsri.u32 q1, q0, #19
+       veor    q11, q15, q1
 
        // a ^= (d + c) <<< 18
        vadd.u32 q0, q11, q10
-       vext.32 q10, q10, q10, #2
-       vext.32 q11, q11, q11, #1
+        vext.32 q10, q10, q10, #2
+        vext.32 q11, q11, q11, #1
        vshl.u32 q1, q0, #18
-       vshr.u32 q0, q0, #14
-       vorr    q0, q0, q1
-       veor    q8, q12, q0
+       vsri.u32 q1, q0, #14
+       veor    q8, q12, q1
 
 0:
        // The transpose conveniently only involves reordering elements of
@@ -136,33 +128,29 @@ FUNC(salsa20_core_arm_neon)
        // b ^= (a + d) <<<  7
        vadd.u32 q0, q8, q9
        vshl.u32 q1, q0, #7
-       vshr.u32 q0, q0, #25
-       vorr    q0, q0, q1
-       veor    q11, q11, q0
+       vsri.u32 q1, q0, #25
+       veor    q11, q11, q1
 
        // c ^= (b + a) <<<  9
        vadd.u32 q0, q11, q8
        vshl.u32 q1, q0, #9
-       vshr.u32 q0, q0, #23
-       vorr    q0, q0, q1
-       veor    q10, q10, q0
+       vsri.u32 q1, q0, #23
+       veor    q10, q10, q1
 
        // d ^= (c + b) <<< 13
        vadd.u32 q0, q10, q11
         vext.32 q11, q11, q11, #3
        vshl.u32 q1, q0, #13
-       vshr.u32 q0, q0, #19
-       vorr    q0, q0, q1
-       veor    q9, q9, q0
+       vsri.u32 q1, q0, #19
+       veor    q9, q9, q1
 
        // a ^= (d + c) <<< 18
        vadd.u32 q0, q9, q10
         vext.32 q10, q10, q10, #2
         vext.32 q9, q9, q9, #1
        vshl.u32 q1, q0, #18
-       vshr.u32 q0, q0, #14
-       vorr    q0, q0, q1
-       veor    q8, q8, q0
+       vsri.u32 q1, q0, #14
+       veor    q8, q8, q1
 
        // We had to undo the transpose ready for the next loop.  Again, push
        // back the reorderings to reduce latency.  Decrement the loop
@@ -175,40 +163,36 @@ FUNC(salsa20_core_arm_neon)
        // b ^= (a + d) <<<  7
        vadd.u32 q0, q8, q11
        vshl.u32 q1, q0, #7
-       vshr.u32 q0, q0, #25
-       vorr    q0, q0, q1
-       veor    q9, q9, q0
+       vsri.u32 q1, q0, #25
+       veor    q9, q9, q1
 
        // c ^= (b + a) <<<  9
        vadd.u32 q0, q9, q8
        vshl.u32 q1, q0, #9
-       vshr.u32 q0, q0, #23
-       vorr    q0, q0, q1
-       veor    q10, q10, q0
+       vsri.u32 q1, q0, #23
+       veor    q10, q10, q1
 
        // d ^= (c + b) <<< 13
        vadd.u32 q0, q10, q9
         vext.32 q9, q9, q9, #3
        vshl.u32 q1, q0, #13
-       vshr.u32 q0, q0, #19
-       vorr    q0, q0, q1
-       veor    q11, q11, q0
+       vsri.u32 q1, q0, #19
+       veor    q11, q11, q1
 
        // a ^= (d + c) <<< 18
        vadd.u32 q0, q11, q10
         vext.32 q10, q10, q10, #2
         vext.32 q11, q11, q11, #1
        vshl.u32 q1, q0, #18
-       vshr.u32 q0, q0, #14
-       vorr    q0, q0, q1
-       veor    q8, q8, q0
+       vsri.u32 q1, q0, #14
+       veor    q8, q8, q1
 
        b       0b
 
        // Almost there.  Firstly the feedfoward addition.  Also, establish a
        // constant which will be useful later.
 9:     vadd.u32 q0, q8, q12                    //  0,  5, 10, 15
-        vmov.i64 q12, #0xffffffff              // = (-1, 0, -1, 0)
+        vmov.i64 q12, #0xffffffff              // = (0, -1; 0, -1)
        vadd.u32 q1, q9, q13                    //  4,  9, 14,  3
        vadd.u32 q2, q10, q14                   //  8, 13,  2,  7
        vadd.u32 q3, q11, q15                   // 12,  1,  6, 11