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// Hash128(k0, k1 uint64, b []byte) (uint64, uint64) 54TEXT ·Hash128(SB),NOSPLIT,$8-44 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 $0x6e646f83,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) 80hashloop128: 81 MOVW endb-4(SP),R11 82 SUB R10,R11,R11 83 SUB.S $8,R11 84 BLO hashend128 85 MOVM.IA.W (R10),[R12,R14] 86 EOR R12,R6,R6 87 EOR R14,R7,R7 88 ROUND() 89 EOR R12,R0,R0 90 EOR R14,R1,R1 91 B hashloop128 92hashloop128unaligned: 93 MOVW endb-4(SP),R11 94 SUB R10,R11,R11 95 SUB.S $8,R11 96 BLO hashend128 97 MOVB (R10),R12 98 MOVB 1(R10),R11 99 ORR R11<<8,R12,R12 100 MOVB 2(R10),R11 101 ORR R11<<16,R12,R12 102 MOVB 3(R10),R11 103 ORR R11<<24,R12,R12 104 MOVB 4(R10),R14 105 MOVB 5(R10),R11 106 ORR R11<<8,R14,R14 107 MOVB 6(R10),R11 108 ORR R11<<16,R14,R14 109 MOVB 7(R10),R11 110 ORR R11<<24,R14,R14 111 ADD $8,R10,R10 112 EOR R12,R6,R6 113 EOR R14,R7,R7 114 ROUND() 115 EOR R12,R0,R0 116 EOR R14,R1,R1 117 B hashloop128unaligned 118hashend128: 119 MOVW $0x0,R12 120 MOVW $0x0,R14 121 RSB $0,R11,R11 122 AND.S $7,R11 123 BEQ hashlast128 124 MOVW (R10),R12 125 SLL $3,R11 126 AND $63,R11 127 SUB.S $32,R11,R11 128 BEQ hashlast128 129 BLO hashhi128 130 MOVW R12<<R11,R12 131 MOVW R12>>R11,R12 132 B hashlast128 133hashhi128: 134 ADD $32,R11 135 MOVW 4(R10),R14 136 MOVW R14<<R11,R14 137 MOVW R14>>R11,R14 138hashlast128: 139 MOVW b_len+20(FP),R11 140 ORR R11<<24,R14,R14 141 EOR R12,R6,R6 142 EOR R14,R7,R7 143 ROUND() 144 EOR R12,R0,R0 145 EOR R14,R1,R1 146 EOR $238,R4 147 ROUND() 148 ROUND() 149 EOR R0,R2,R12 150 EOR R1,R3,R14 151 EOR R4,R12,R12 152 EOR R5,R14,R14 153 EOR R6,R12,R12 154 EOR R7,R14,R14 155 MOVW R12,ret_lo+28(FP) 156 MOVW R14,ret_hi+32(FP) 157 EOR $221,R2 158 ROUND() 159 ROUND() 160 EOR R0,R2,R12 161 EOR R1,R3,R14 162 EOR R4,R12,R12 163 EOR R5,R14,R14 164 EOR R6,R12,R12 165 EOR R7,R14,R14 166 MOVW R12,unnamed_lo+36(FP) 167 MOVW R14,unnamed_hi+40(FP) 168 MOVW sav-8(SP),R10 169 RET 170