progs/perftest.c: Use from Glibc syscall numbers.
[catacomb] / symm / chacha-arm-neon.S
index d69e2e4..2188576 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(chacha_core_arm_neon)
 
        // Arguments are in registers.
@@ -55,21 +56,18 @@ FUNC(chacha_core_arm_neon)
        // 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.
-       vldmia  r1, {d24-d31}
+       vldmia  r1, {QQ(q12, q15)}
 
        // a += b; d ^= a; d <<<= 16
        vadd.u32 q8, q12, q13
        veor    q11, q15, q8
-       vshl.u32 q0, q11, #16
-       vshr.u32 q11, q11, #16
-       vorr    q11, q11, q0
+       vrev32.16 q11, q11
 
        // c += d; b ^= c; b <<<= 12
        vadd.u32 q10, q14, q11
-       veor    q9, q13, q10
-       vshl.u32 q0, q9, #12
-       vshr.u32 q9, q9, #20
-       vorr    q9, q9, q0
+       veor    q0, q13, q10
+       vshl.u32 q9, q0, #12
+       vsri.u32 q9, q0, #20
 
 0:
        // Apply (the rest of) a column quarterround to each of the columns
@@ -78,19 +76,17 @@ FUNC(chacha_core_arm_neon)
 
        // a += b; d ^= a; d <<<=  8
        vadd.u32 q8, q8, q9
-       veor    q11, q11, q8
-       vshl.u32 q0, q11, #8
-       vshr.u32 q11, q11, #24
-       vorr    q11, q11, q0
+       veor    q0, q11, q8
+       vshl.u32 q11, q0, #8
+       vsri.u32 q11, q0, #24
 
        // c += d; b ^= c; b <<<=  7
        vadd.u32 q10, q10, q11
-       vext.32 q11, q11, q11, #3
-       veor    q9, q9, q10
-       vext.32 q10, q10, q10, #2
-       vshl.u32 q0, q9, #7
-       vshr.u32 q9, q9, #25
-       vorr    q9, q9, q0
+        vext.32 q11, q11, q11, #3
+       veor    q0, q9, q10
+        vext.32 q10, q10, q10, #2
+       vshl.u32 q9, q0, #7
+       vsri.u32 q9, q0, #25
 
        // The not-quite-transpose conveniently only involves reordering
        // elements of individual rows, which can be done quite easily.  It
@@ -112,32 +108,27 @@ FUNC(chacha_core_arm_neon)
        // a += b; d ^= a; d <<<= 16
        vadd.u32 q8, q8, q9
        veor    q11, q11, q8
-       vshl.u32 q0, q11, #16
-       vshr.u32 q11, q11, #16
-       vorr    q11, q11, q0
+       vrev32.16 q11, q11
 
        // c += d; b ^= c; b <<<= 12
        vadd.u32 q10, q10, q11
-       veor    q9, q9, q10
-       vshl.u32 q0, q9, #12
-       vshr.u32 q9, q9, #20
-       vorr    q9, q9, q0
+       veor    q0, q9, q10
+       vshl.u32 q9, q0, #12
+       vsri.u32 q9, q0, #20
 
        // a += b; d ^= a; d <<<=  8
        vadd.u32 q8, q8, q9
-       veor    q11, q11, q8
-       vshl.u32 q0, q11, #8
-       vshr.u32 q11, q11, #24
-       vorr    q11, q11, q0
+       veor    q0, q11, q8
+       vshl.u32 q11, q0, #8
+       vsri.u32 q11, q0, #24
 
        // c += d; b ^= c; b <<<=  7
        vadd.u32 q10, q10, q11
-       vext.32 q11, q11, q11, #1
-       veor    q9, q9, q10
-       vext.32 q10, q10, q10, #2
-       vshl.u32 q0, q9, #7
-       vshr.u32 q9, q9, #25
-       vorr    q9, q9, q0
+        vext.32 q11, q11, q11, #1
+       veor    q0, q9, q10
+        vext.32 q10, q10, q10, #2
+       vshl.u32 q9, q0, #7
+       vsri.u32 q9, q0, #25
 
        // Finally finish off undoing the transpose, and we're done for this
        // doubleround.  Again, most of this was done above so we don't have
@@ -153,16 +144,13 @@ FUNC(chacha_core_arm_neon)
        // a += b; d ^= a; d <<<= 16
        vadd.u32 q8, q8, q9
        veor    q11, q11, q8
-       vshl.u32 q0, q11, #16
-       vshr.u32 q11, q11, #16
-       vorr    q11, q11, q0
+       vrev32.16 q11, q11
 
        // c += d; b ^= c; b <<<= 12
        vadd.u32 q10, q10, q11
-       veor    q9, q9, q10
-       vshl.u32 q0, q9, #12
-       vshr.u32 q9, q9, #20
-       vorr    q9, q9, q0
+       veor    q0, q9, q10
+       vshl.u32 q9, q0, #12
+       vsri.u32 q9, q0, #20
 
        b       0b
 
@@ -173,7 +161,7 @@ FUNC(chacha_core_arm_neon)
        vadd.u32 q11, q11, q15
 
        // And now we write out the result.
-       vstmia  r2, {d16-d23}
+       vstmia  r2, {QQ(q8, q11)}
 
        // And with that, we're done.
        bx      r14