X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/e2f967aeff8b2c0b42d0b0a209f47543d61e48b1..HEAD:/symm/chacha-arm-neon.S diff --git a/symm/chacha-arm-neon.S b/symm/chacha-arm-neon.S index a900db76..21885763 100644 --- a/symm/chacha-arm-neon.S +++ b/symm/chacha-arm-neon.S @@ -36,7 +36,7 @@ .text ///-------------------------------------------------------------------------- -/// Main.code. +/// Main code. FUNC(chacha_core_arm_neon) @@ -61,16 +61,13 @@ FUNC(chacha_core_arm_neon) // 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 @@ -79,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 + veor q0, q9, q10 vext.32 q10, q10, q10, #2 - vshl.u32 q0, q9, #7 - vshr.u32 q9, q9, #25 - vorr q9, q9, q0 + 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 @@ -113,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 + veor q0, q9, q10 vext.32 q10, q10, q10, #2 - vshl.u32 q0, q9, #7 - vshr.u32 q9, q9, #25 - vorr q9, q9, q0 + 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 @@ -154,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