summaryrefslogtreecommitdiff
path: root/vendor/github.com/dchest/siphash/blocks_arm.s
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/dchest/siphash/blocks_arm.s')
-rw-r--r--vendor/github.com/dchest/siphash/blocks_arm.s144
1 files changed, 144 insertions, 0 deletions
diff --git a/vendor/github.com/dchest/siphash/blocks_arm.s b/vendor/github.com/dchest/siphash/blocks_arm.s
new file mode 100644
index 0000000..bfcfd9b
--- /dev/null
+++ b/vendor/github.com/dchest/siphash/blocks_arm.s
@@ -0,0 +1,144 @@
+#include "textflag.h"
+
+#define ROUND()\
+ ADD.S R2,R0,R0;\
+ ADC R3,R1,R1;\
+ EOR R2<<13,R0,R8;\
+ EOR R3>>19,R8,R8;\
+ EOR R2>>19,R1,R11;\
+ EOR R3<<13,R11,R11;\
+ ADD.S R6,R4,R4;\
+ ADC R7,R5,R5;\
+ EOR R6<<16,R4,R2;\
+ EOR R7>>16,R2,R2;\
+ EOR R6>>16,R5,R3;\
+ EOR R7<<16,R3,R3;\
+ ADD.S R2,R1,R1;\
+ ADC R3,R0,R0;\
+ EOR R2<<21,R1,R6;\
+ EOR R3>>11,R6,R6;\
+ EOR R2>>11,R0,R7;\
+ EOR R3<<21,R7,R7;\
+ ADD.S R8,R4,R4;\
+ ADC R11,R5,R5;\
+ EOR R8<<17,R4,R2;\
+ EOR R11>>15,R2,R2;\
+ EOR R8>>15,R5,R3;\
+ EOR R11<<17,R3,R3;\
+ ADD.S R2,R1,R1;\
+ ADC R3,R0,R0;\
+ EOR R2<<13,R1,R8;\
+ EOR R3>>19,R8,R8;\
+ EOR R2>>19,R0,R11;\
+ EOR R3<<13,R11,R11;\
+ ADD.S R6,R5,R5;\
+ ADC R7,R4,R4;\
+ EOR R6<<16,R5,R2;\
+ EOR R7>>16,R2,R2;\
+ EOR R6>>16,R4,R3;\
+ EOR R7<<16,R3,R3;\
+ ADD.S R2,R0,R0;\
+ ADC R3,R1,R1;\
+ EOR R2<<21,R0,R6;\
+ EOR R3>>11,R6,R6;\
+ EOR R2>>11,R1,R7;\
+ EOR R3<<21,R7,R7;\
+ ADD.S R8,R5,R5;\
+ ADC R11,R4,R4;\
+ EOR R8<<17,R5,R2;\
+ EOR R11>>15,R2,R2;\
+ EOR R8>>15,R4,R3;\
+ EOR R11<<17,R3,R3;
+
+// once(d *digest)
+TEXT ·once(SB),NOSPLIT,$4-4
+ MOVW d+0(FP),R8
+ MOVM.IA (R8),[R0,R1,R2,R3,R4,R5,R6,R7]
+ MOVW 48(R8),R12
+ MOVW 52(R8),R14
+ EOR R12,R6,R6
+ EOR R14,R7,R7
+ ROUND()
+ EOR R12,R0,R0
+ EOR R14,R1,R1
+ MOVW d+0(FP),R8
+ MOVM.IA [R0,R1,R2,R3,R4,R5,R6,R7],(R8)
+ RET
+
+// finalize(d *digest) uint64
+TEXT ·finalize(SB),NOSPLIT,$4-12
+ MOVW d+0(FP),R8
+ MOVM.IA (R8),[R0,R1,R2,R3,R4,R5,R6,R7]
+ MOVW 48(R8),R12
+ MOVW 52(R8),R14
+ EOR R12,R6,R6
+ EOR R14,R7,R7
+ ROUND()
+ EOR R12,R0,R0
+ EOR R14,R1,R1
+ EOR $255,R4
+ ROUND()
+ ROUND()
+ EOR R2,R0,R0
+ EOR R3,R1,R1
+ EOR R6,R4,R4
+ EOR R7,R5,R5
+ EOR R4,R0,R0
+ EOR R5,R1,R1
+ MOVW R0,ret_lo+4(FP)
+ MOVW R1,ret_hi+8(FP)
+ RET
+
+// blocks(d *digest, data []uint8)
+TEXT ·blocks(SB),NOSPLIT,$8-16
+ MOVW R9,sav-8(SP)
+ MOVW d+0(FP),R8
+ MOVM.IA (R8),[R0,R1,R2,R3,R4,R5,R6,R7]
+ MOVW p+4(FP),R9
+ MOVW p_len+8(FP),R11
+ ADD R9,R11,R11
+ MOVW R11,endp-4(SP)
+ AND.S $3,R9,R8
+ BNE blocksunaligned
+blocksloop:
+ MOVM.IA.W (R9),[R12,R14]
+ EOR R12,R6,R6
+ EOR R14,R7,R7
+ ROUND()
+ EOR R12,R0,R0
+ EOR R14,R1,R1
+ MOVW endp-4(SP),R11
+ CMP R11,R9
+ BLO blocksloop
+ MOVW d+0(FP),R8
+ MOVM.IA [R0,R1,R2,R3,R4,R5,R6,R7],(R8)
+ MOVW sav-8(SP),R9
+ RET
+blocksunaligned:
+ MOVBU (R9),R12
+ MOVBU 1(R9),R11
+ ORR R11<<8,R12,R12
+ MOVBU 2(R9),R11
+ ORR R11<<16,R12,R12
+ MOVBU 3(R9),R11
+ ORR R11<<24,R12,R12
+ MOVBU 4(R9),R14
+ MOVBU 5(R9),R11
+ ORR R11<<8,R14,R14
+ MOVBU 6(R9),R11
+ ORR R11<<16,R14,R14
+ MOVBU 7(R9),R11
+ ORR R11<<24,R14,R14
+ ADD $8,R9,R9
+ EOR R12,R6,R6
+ EOR R14,R7,R7
+ ROUND()
+ EOR R12,R0,R0
+ EOR R14,R1,R1
+ MOVW endp-4(SP),R11
+ CMP R11,R9
+ BLO blocksunaligned
+ MOVW d+0(FP),R8
+ MOVM.IA [R0,R1,R2,R3,R4,R5,R6,R7],(R8)
+ MOVW sav-8(SP),R9
+ RET