1 TEXT _sha1block+0(SB),$328 2 3/* 4 * wp[off] = x; 5 * x += A <<< 5; 6 * E += 0xca62c1d6 + x; 7 * x = FN(B,C,D); 8 * E += x; 9 * B >>> 2 10 */ 11#define BODYX(off,FN,V,A,B,C,D,E)\ 12 FN(B,C,D)\ 13 ADDU TMP1,E;\ 14 ADDU V,E;\ 15 MOVW TMP2,off(WREG);\ 16 ADDU TMP2,E;\ 17 SLL $5,A,TMP3;\ 18 SRL $27,A,TMP4;\ 19 OR TMP3,TMP4;\ 20 ADDU TMP4,E;\ 21 SLL $30,B,TMP4;\ 22 SRL $2,B;\ 23 OR TMP4,B 24 25/* 26 * x = data[i] 27 * BODYX 28 */ 29#define BODY1(off,FN,V,A,B,C,D,E)\ 30 MOVBU off(DATAREG),TMP2;\ 31 MOVBU (off+1)(DATAREG),TMP3;\ 32 MOVBU (off+2)(DATAREG),TMP1;\ 33 MOVBU (off+3)(DATAREG),TMP4;\ 34 SLL $24,TMP2;\ 35 SLL $16,TMP3;\ 36 OR TMP3,TMP2;\ 37 SLL $8,TMP1;\ 38 OR TMP1,TMP2;\ 39 OR TMP4,TMP2;\ 40 BODYX(off,FN,V,A,B,C,D,E) 41 42/* 43 * x = (wp[off-3] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1; 44 * BODYX 45 */ 46#define BODY(off,FN,V,A,B,C,D,E)\ 47 MOVW (off-64)(WREG),TMP1;\ 48 MOVW (off-56)(WREG),TMP2;\ 49 MOVW (off-32)(WREG),TMP3;\ 50 MOVW (off-12)(WREG),TMP4;\ 51 XOR TMP1,TMP2;\ 52 XOR TMP3,TMP2;\ 53 XOR TMP4,TMP2;\ 54 SLL $1,TMP2,TMP1;\ 55 SRL $31,TMP2;\ 56 OR TMP1,TMP2;\ 57 BODYX(off,FN,V,A,B,C,D,E) 58 59/* 60 * fn1 = (((C^D)&B)^D); 61 */ 62#define FN1(B,C,D)\ 63 XOR C,D,TMP1;\ 64 AND B,TMP1;\ 65 XOR D,TMP1; 66 67/* 68 * fn24 = B ^ C ^ D 69 */ 70#define FN24(B,C,D)\ 71 XOR B,C,TMP1;\ 72 XOR D,TMP1; 73 74/* 75 * fn3 = ((B ^ C) & (D ^ B)) ^ B 76 */ 77#define FN3(B,C,D)\ 78 XOR B,C,TMP1;\ 79 XOR B,D,TMP4;\ 80 AND TMP4,TMP1;\ 81 XOR B,TMP1; 82 83/* 84 * stack offsets 85 * void vtSha1Block(ulong *STATE, uchar *DATA, int LEN) 86 */ 87#define DATA 0 88#define LEN 4 89#define STATE 8 90 91/* 92 * stack offsets for locals 93 * ulong w[80]; 94 * uchar *edata; 95 * ulong *w15, *w40, *w60, *w80; 96 * register local 97 * ulong *wp = BP 98 * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi 99 * ulong tmp = edi 100 */ 101#define WARRAY (-4-(80*4)) 102 103#define AREG R5 104#define BREG R6 105#define CREG R7 106#define DREG R8 107#define EREG R9 108#define DATAREG R1 109#define STREG R11 110#define WREG R12 111#define W15REG R13 112#define W60REG R14 113#define W40REG R15 114#define W80REG R16 115#define EDREG R17 116#define VREG R18 117 118#define TMP1 R10 119#define TMP2 R2 120#define TMP3 R3 121#define TMP4 R4 122#define TMP5 R19 123 124 MOVW len+LEN(FP),TMP1 125 MOVW state+STATE(FP),STREG 126 ADDU DATAREG,TMP1,EDREG 127 128 MOVW 0(STREG),AREG 129 MOVW 4(STREG),BREG 130 MOVW 8(STREG),CREG 131 MOVW 12(STREG),DREG 132 MOVW 16(STREG),EREG 133 134 MOVW $warray+WARRAY(SP),WREG 135 ADDU $(15*4),WREG,W15REG 136 ADDU $(40*4),WREG,W40REG 137 ADDU $(60*4),WREG,W60REG 138 ADDU $(80*4),WREG,W80REG 139 140mainloop: 141 MOVW $warray+WARRAY(SP),WREG 142 143 MOVW $0x5a827999,VREG 144loop1: 145 BODY1(0,FN1,VREG,AREG,BREG,CREG,DREG,EREG) 146 BODY1(4,FN1,VREG,EREG,AREG,BREG,CREG,DREG) 147 BODY1(8,FN1,VREG,DREG,EREG,AREG,BREG,CREG) 148 BODY1(12,FN1,VREG,CREG,DREG,EREG,AREG,BREG) 149 BODY1(16,FN1,VREG,BREG,CREG,DREG,EREG,AREG) 150 151 ADDU $20,DATAREG 152 ADDU $20,WREG 153 BNE WREG,W15REG,loop1 154 155 BODY1(0,FN1,VREG,AREG,BREG,CREG,DREG,EREG) 156 ADDU $4,DATAREG 157 158 BODY(4,FN1,VREG,EREG,AREG,BREG,CREG,DREG) 159 BODY(8,FN1,VREG,DREG,EREG,AREG,BREG,CREG) 160 BODY(12,FN1,VREG,CREG,DREG,EREG,AREG,BREG) 161 BODY(16,FN1,VREG,BREG,CREG,DREG,EREG,AREG) 162 163 ADDU $20,WREG 164 165 MOVW $0x6ed9eba1,VREG 166loop2: 167 BODY(0,FN24,VREG,AREG,BREG,CREG,DREG,EREG) 168 BODY(4,FN24,VREG,EREG,AREG,BREG,CREG,DREG) 169 BODY(8,FN24,VREG,DREG,EREG,AREG,BREG,CREG) 170 BODY(12,FN24,VREG,CREG,DREG,EREG,AREG,BREG) 171 BODY(16,FN24,VREG,BREG,CREG,DREG,EREG,AREG) 172 173 ADDU $20,WREG 174 BNE WREG,W40REG,loop2 175 176 MOVW $0x8f1bbcdc,VREG 177loop3: 178 BODY(0,FN3,VREG,AREG,BREG,CREG,DREG,EREG) 179 BODY(4,FN3,VREG,EREG,AREG,BREG,CREG,DREG) 180 BODY(8,FN3,VREG,DREG,EREG,AREG,BREG,CREG) 181 BODY(12,FN3,VREG,CREG,DREG,EREG,AREG,BREG) 182 BODY(16,FN3,VREG,BREG,CREG,DREG,EREG,AREG) 183 184 ADDU $20,WREG 185 BNE WREG,W60REG,loop3 186 187 MOVW $0xca62c1d6,VREG 188loop4: 189 BODY(0,FN24,VREG,AREG,BREG,CREG,DREG,EREG) 190 BODY(4,FN24,VREG,EREG,AREG,BREG,CREG,DREG) 191 BODY(8,FN24,VREG,DREG,EREG,AREG,BREG,CREG) 192 BODY(12,FN24,VREG,CREG,DREG,EREG,AREG,BREG) 193 BODY(16,FN24,VREG,BREG,CREG,DREG,EREG,AREG) 194 195 ADDU $20,WREG 196 BNE WREG,W80REG,loop4 197 198 MOVW 0(STREG),TMP1 199 MOVW 4(STREG),TMP2 200 MOVW 8(STREG),TMP3 201 MOVW 12(STREG),TMP4 202 MOVW 16(STREG),TMP5 203 204 ADDU TMP1,AREG 205 ADDU TMP2,BREG 206 ADDU TMP3,CREG 207 ADDU TMP4,DREG 208 ADDU TMP5,EREG 209 210 MOVW AREG,0(STREG) 211 MOVW BREG,4(STREG) 212 MOVW CREG,8(STREG) 213 MOVW DREG,12(STREG) 214 MOVW EREG,16(STREG) 215 216 BNE DATAREG,EDREG,mainloop 217 218 RET 219 220 END 221