170 lines
2.9 KiB
ArmAsm
170 lines
2.9 KiB
ArmAsm
#include "textflag.h"
|
|
#define R10 g
|
|
#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;\
|
|
|
|
// Hash128(k0, k1 uint64, b []byte) (uint64, uint64)
|
|
TEXT ·Hash128(SB),NOSPLIT,$8-44
|
|
MOVW R10,sav-8(SP)
|
|
MOVW k0_lo+0(FP),R12
|
|
MOVW k0_hi+4(FP),R14
|
|
MOVW $0x70736575,R0
|
|
MOVW $0x736f6d65,R1
|
|
MOVW $0x6e657261,R4
|
|
MOVW $0x6c796765,R5
|
|
EOR R12,R0,R0
|
|
EOR R14,R1,R1
|
|
EOR R12,R4,R4
|
|
EOR R14,R5,R5
|
|
MOVW k1_lo+8(FP),R12
|
|
MOVW k1_hi+12(FP),R14
|
|
MOVW $0x6e646f83,R2
|
|
MOVW $0x646f7261,R3
|
|
MOVW $0x79746573,R6
|
|
MOVW $0x74656462,R7
|
|
EOR R12,R2,R2
|
|
EOR R14,R3,R3
|
|
EOR R12,R6,R6
|
|
EOR R14,R7,R7
|
|
MOVW b+16(FP),R10
|
|
MOVW b_len+20(FP),R11
|
|
ADD R10,R11,R11
|
|
MOVW R11,endb-4(SP)
|
|
hashloop128:
|
|
MOVW endb-4(SP),R11
|
|
SUB R10,R11,R11
|
|
SUB.S $8,R11
|
|
BLO hashend128
|
|
MOVM.IA.W (R10),[R12,R14]
|
|
EOR R12,R6,R6
|
|
EOR R14,R7,R7
|
|
ROUND()
|
|
EOR R12,R0,R0
|
|
EOR R14,R1,R1
|
|
B hashloop128
|
|
hashloop128unaligned:
|
|
MOVW endb-4(SP),R11
|
|
SUB R10,R11,R11
|
|
SUB.S $8,R11
|
|
BLO hashend128
|
|
MOVB (R10),R12
|
|
MOVB 1(R10),R11
|
|
ORR R11<<8,R12,R12
|
|
MOVB 2(R10),R11
|
|
ORR R11<<16,R12,R12
|
|
MOVB 3(R10),R11
|
|
ORR R11<<24,R12,R12
|
|
MOVB 4(R10),R14
|
|
MOVB 5(R10),R11
|
|
ORR R11<<8,R14,R14
|
|
MOVB 6(R10),R11
|
|
ORR R11<<16,R14,R14
|
|
MOVB 7(R10),R11
|
|
ORR R11<<24,R14,R14
|
|
ADD $8,R10,R10
|
|
EOR R12,R6,R6
|
|
EOR R14,R7,R7
|
|
ROUND()
|
|
EOR R12,R0,R0
|
|
EOR R14,R1,R1
|
|
B hashloop128unaligned
|
|
hashend128:
|
|
MOVW $0x0,R12
|
|
MOVW $0x0,R14
|
|
RSB $0,R11,R11
|
|
AND.S $7,R11
|
|
BEQ hashlast128
|
|
MOVW (R10),R12
|
|
SLL $3,R11
|
|
AND $63,R11
|
|
SUB.S $32,R11,R11
|
|
BEQ hashlast128
|
|
BLO hashhi128
|
|
MOVW R12<<R11,R12
|
|
MOVW R12>>R11,R12
|
|
B hashlast128
|
|
hashhi128:
|
|
ADD $32,R11
|
|
MOVW 4(R10),R14
|
|
MOVW R14<<R11,R14
|
|
MOVW R14>>R11,R14
|
|
hashlast128:
|
|
MOVW b_len+20(FP),R11
|
|
ORR R11<<24,R14,R14
|
|
EOR R12,R6,R6
|
|
EOR R14,R7,R7
|
|
ROUND()
|
|
EOR R12,R0,R0
|
|
EOR R14,R1,R1
|
|
EOR $238,R4
|
|
ROUND()
|
|
ROUND()
|
|
EOR R0,R2,R12
|
|
EOR R1,R3,R14
|
|
EOR R4,R12,R12
|
|
EOR R5,R14,R14
|
|
EOR R6,R12,R12
|
|
EOR R7,R14,R14
|
|
MOVW R12,ret_lo+28(FP)
|
|
MOVW R14,ret_hi+32(FP)
|
|
EOR $221,R2
|
|
ROUND()
|
|
ROUND()
|
|
EOR R0,R2,R12
|
|
EOR R1,R3,R14
|
|
EOR R4,R12,R12
|
|
EOR R5,R14,R14
|
|
EOR R6,R12,R12
|
|
EOR R7,R14,R14
|
|
MOVW R12,unnamed_lo+36(FP)
|
|
MOVW R14,unnamed_hi+40(FP)
|
|
MOVW sav-8(SP),R10
|
|
RET
|