1#include "textflag.h" 2#define R10 g 3#define ROUND()\ 4 ADD.S R2,R0,R0;\ 5 ADC R3,R1,R1;\ 6 EOR R2<<13,R0,R8;\ 7 EOR R3>>19,R8,R8;\ 8 EOR R2>>19,R1,R11;\ 9 EOR R3<<13,R11,R11;\ 10 ADD.S R6,R4,R4;\ 11 ADC R7,R5,R5;\ 12 EOR R6<<16,R4,R2;\ 13 EOR R7>>16,R2,R2;\ 14 EOR R6>>16,R5,R3;\ 15 EOR R7<<16,R3,R3;\ 16 ADD.S R2,R1,R1;\ 17 ADC R3,R0,R0;\ 18 EOR R2<<21,R1,R6;\ 19 EOR R3>>11,R6,R6;\ 20 EOR R2>>11,R0,R7;\ 21 EOR R3<<21,R7,R7;\ 22 ADD.S R8,R4,R4;\ 23 ADC R11,R5,R5;\ 24 EOR R8<<17,R4,R2;\ 25 EOR R11>>15,R2,R2;\ 26 EOR R8>>15,R5,R3;\ 27 EOR R11<<17,R3,R3;\ 28 ADD.S R2,R1,R1;\ 29 ADC R3,R0,R0;\ 30 EOR R2<<13,R1,R8;\ 31 EOR R3>>19,R8,R8;\ 32 EOR R2>>19,R0,R11;\ 33 EOR R3<<13,R11,R11;\ 34 ADD.S R6,R5,R5;\ 35 ADC R7,R4,R4;\ 36 EOR R6<<16,R5,R2;\ 37 EOR R7>>16,R2,R2;\ 38 EOR R6>>16,R4,R3;\ 39 EOR R7<<16,R3,R3;\ 40 ADD.S R2,R0,R0;\ 41 ADC R3,R1,R1;\ 42 EOR R2<<21,R0,R6;\ 43 EOR R3>>11,R6,R6;\ 44 EOR R2>>11,R1,R7;\ 45 EOR R3<<21,R7,R7;\ 46 ADD.S R8,R5,R5;\ 47 ADC R11,R4,R4;\ 48 EOR R8<<17,R5,R2;\ 49 EOR R11>>15,R2,R2;\ 50 EOR R8>>15,R4,R3;\ 51 EOR R11<<17,R3,R3;\ 52 53// Hash(k0, k1 uint64, b []byte) uint64 54TEXT ·Hash(SB),NOSPLIT,$8-36 55 MOVW R10,sav-8(SP) 56 MOVW k0_lo+0(FP),R12 57 MOVW k0_hi+4(FP),R14 58 MOVW $0x70736575,R0 59 MOVW $0x736f6d65,R1 60 MOVW $0x6e657261,R4 61 MOVW $0x6c796765,R5 62 EOR R12,R0,R0 63 EOR R14,R1,R1 64 EOR R12,R4,R4 65 EOR R14,R5,R5 66 MOVW k1_lo+8(FP),R12 67 MOVW k1_hi+12(FP),R14 68 MOVW $0x6e646f6d,R2 69 MOVW $0x646f7261,R3 70 MOVW $0x79746573,R6 71 MOVW $0x74656462,R7 72 EOR R12,R2,R2 73 EOR R14,R3,R3 74 EOR R12,R6,R6 75 EOR R14,R7,R7 76 MOVW b+16(FP),R10 77 MOVW b_len+20(FP),R11 78 ADD R10,R11,R11 79 MOVW R11,endb-4(SP) 80 AND.S $3,R10,R8 81 BNE hashloopunaligned 82hashloop: 83 MOVW endb-4(SP),R11 84 SUB R10,R11,R11 85 SUB.S $8,R11 86 BLO hashend 87 MOVM.IA.W (R10),[R12,R14] 88 EOR R12,R6,R6 89 EOR R14,R7,R7 90 ROUND() 91 EOR R12,R0,R0 92 EOR R14,R1,R1 93 B hashloop 94hashloopunaligned: 95 MOVW endb-4(SP),R11 96 SUB R10,R11,R11 97 SUB.S $8,R11 98 BLO hashend 99 MOVB (R10),R12 100 MOVB 1(R10),R11 101 ORR R11<<8,R12,R12 102 MOVB 2(R10),R11 103 ORR R11<<16,R12,R12 104 MOVB 3(R10),R11 105 ORR R11<<24,R12,R12 106 MOVB 4(R10),R14 107 MOVB 5(R10),R11 108 ORR R11<<8,R14,R14 109 MOVB 6(R10),R11 110 ORR R11<<16,R14,R14 111 MOVB 7(R10),R11 112 ORR R11<<24,R14,R14 113 ADD $8,R10,R10 114 EOR R12,R6,R6 115 EOR R14,R7,R7 116 ROUND() 117 EOR R12,R0,R0 118 EOR R14,R1,R1 119 B hashloopunaligned 120hashend: 121 MOVW $0x0,R12 122 MOVW $0x0,R14 123 RSB $0,R11,R11 124 AND.S $7,R11 125 BEQ hashlast 126 MOVW (R10),R12 127 SLL $3,R11 128 AND $63,R11 129 SUB.S $32,R11,R11 130 BEQ hashlast 131 BLO hashhi 132 MOVW R12<<R11,R12 133 MOVW R12>>R11,R12 134 B hashlast 135hashhi: 136 ADD $32,R11 137 MOVW 4(R10),R14 138 MOVW R14<<R11,R14 139 MOVW R14>>R11,R14 140hashlast: 141 MOVW b_len+20(FP),R11 142 ORR R11<<24,R14,R14 143 EOR R12,R6,R6 144 EOR R14,R7,R7 145 ROUND() 146 EOR R12,R0,R0 147 EOR R14,R1,R1 148 EOR $255,R4 149 ROUND() 150 ROUND() 151 EOR R2,R0,R0 152 EOR R3,R1,R1 153 EOR R6,R4,R4 154 EOR R7,R5,R5 155 EOR R4,R0,R0 156 EOR R5,R1,R1 157 MOVW sav-8(SP),R10 158 MOVW R0,ret_lo+28(FP) 159 MOVW R1,ret_hi+32(FP) 160 RET 161