X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/98421fc1a6832ad5de4b3f6171852437aa3e0fb2..HEAD:/symm/chacha-arm-neon.S diff --git a/symm/chacha-arm-neon.S b/symm/chacha-arm-neon.S index 5fb0073d..21885763 100644 --- a/symm/chacha-arm-neon.S +++ b/symm/chacha-arm-neon.S @@ -25,17 +25,18 @@ /// MA 02111-1307, USA. ///-------------------------------------------------------------------------- -/// External definitions. +/// Preliminaries. #include "config.h" #include "asm-common.h" -///-------------------------------------------------------------------------- -/// Main.code. - .arch armv7-a .fpu neon - .section .text + + .text + +///-------------------------------------------------------------------------- +/// Main code. FUNC(chacha_core_arm_neon) @@ -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