123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- TEXT _sha1block+0(SB),$328
- /*
- * wp[off] = x;
- * x += A <<< 5;
- * E += 0xca62c1d6 + x;
- * x = FN(B,C,D);
- * E += x;
- * B >>> 2
- */
- #define BODYX(off,FN,V,A,B,C,D,E)\
- FN(B,C,D)\
- ADDU TMP1,E;\
- ADDU V,E;\
- MOVW TMP2,off(WREG);\
- ADDU TMP2,E;\
- SLL $5,A,TMP3;\
- SRL $27,A,TMP4;\
- OR TMP3,TMP4;\
- ADDU TMP4,E;\
- SLL $30,B,TMP4;\
- SRL $2,B;\
- OR TMP4,B
- /*
- * x = data[i]
- * BODYX
- */
- #define BODY1(off,FN,V,A,B,C,D,E)\
- MOVBU off(DATAREG),TMP2;\
- MOVBU (off+1)(DATAREG),TMP3;\
- MOVBU (off+2)(DATAREG),TMP1;\
- MOVBU (off+3)(DATAREG),TMP4;\
- SLL $24,TMP2;\
- SLL $16,TMP3;\
- OR TMP3,TMP2;\
- SLL $8,TMP1;\
- OR TMP1,TMP2;\
- OR TMP4,TMP2;\
- BODYX(off,FN,V,A,B,C,D,E)
- /*
- * x = (wp[off-3] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1;
- * BODYX
- */
- #define BODY(off,FN,V,A,B,C,D,E)\
- MOVW (off-64)(WREG),TMP1;\
- MOVW (off-56)(WREG),TMP2;\
- MOVW (off-32)(WREG),TMP3;\
- MOVW (off-12)(WREG),TMP4;\
- XOR TMP1,TMP2;\
- XOR TMP3,TMP2;\
- XOR TMP4,TMP2;\
- SLL $1,TMP2,TMP1;\
- SRL $31,TMP2;\
- OR TMP1,TMP2;\
- BODYX(off,FN,V,A,B,C,D,E)
- /*
- * fn1 = (((C^D)&B)^D);
- */
- #define FN1(B,C,D)\
- XOR C,D,TMP1;\
- AND B,TMP1;\
- XOR D,TMP1;
- /*
- * fn24 = B ^ C ^ D
- */
- #define FN24(B,C,D)\
- XOR B,C,TMP1;\
- XOR D,TMP1;
- /*
- * fn3 = ((B ^ C) & (D ^ B)) ^ B
- */
- #define FN3(B,C,D)\
- XOR B,C,TMP1;\
- XOR B,D,TMP4;\
- AND TMP4,TMP1;\
- XOR B,TMP1;
- /*
- * stack offsets
- * void vtSha1Block(ulong *STATE, uchar *DATA, int LEN)
- */
- #define DATA 0
- #define LEN 4
- #define STATE 8
- /*
- * stack offsets for locals
- * ulong w[80];
- * uchar *edata;
- * ulong *w15, *w40, *w60, *w80;
- * register local
- * ulong *wp = BP
- * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi
- * ulong tmp = edi
- */
- #define WARRAY (-4-(80*4))
- #define AREG R5
- #define BREG R6
- #define CREG R7
- #define DREG R8
- #define EREG R9
- #define DATAREG R1
- #define STREG R11
- #define WREG R12
- #define W15REG R13
- #define W60REG R14
- #define W40REG R15
- #define W80REG R16
- #define EDREG R17
- #define VREG R18
- #define TMP1 R10
- #define TMP2 R2
- #define TMP3 R3
- #define TMP4 R4
- #define TMP5 R19
- MOVW len+LEN(FP),TMP1
- MOVW state+STATE(FP),STREG
- ADDU DATAREG,TMP1,EDREG
- MOVW 0(STREG),AREG
- MOVW 4(STREG),BREG
- MOVW 8(STREG),CREG
- MOVW 12(STREG),DREG
- MOVW 16(STREG),EREG
- MOVW $warray+WARRAY(SP),WREG
- ADDU $(15*4),WREG,W15REG
- ADDU $(40*4),WREG,W40REG
- ADDU $(60*4),WREG,W60REG
- ADDU $(80*4),WREG,W80REG
- mainloop:
- MOVW $warray+WARRAY(SP),WREG
- MOVW $0x5a827999,VREG
- loop1:
- BODY1(0,FN1,VREG,AREG,BREG,CREG,DREG,EREG)
- BODY1(4,FN1,VREG,EREG,AREG,BREG,CREG,DREG)
- BODY1(8,FN1,VREG,DREG,EREG,AREG,BREG,CREG)
- BODY1(12,FN1,VREG,CREG,DREG,EREG,AREG,BREG)
- BODY1(16,FN1,VREG,BREG,CREG,DREG,EREG,AREG)
- ADDU $20,DATAREG
- ADDU $20,WREG
- BNE WREG,W15REG,loop1
- BODY1(0,FN1,VREG,AREG,BREG,CREG,DREG,EREG)
- ADDU $4,DATAREG
- BODY(4,FN1,VREG,EREG,AREG,BREG,CREG,DREG)
- BODY(8,FN1,VREG,DREG,EREG,AREG,BREG,CREG)
- BODY(12,FN1,VREG,CREG,DREG,EREG,AREG,BREG)
- BODY(16,FN1,VREG,BREG,CREG,DREG,EREG,AREG)
- ADDU $20,WREG
- MOVW $0x6ed9eba1,VREG
- loop2:
- BODY(0,FN24,VREG,AREG,BREG,CREG,DREG,EREG)
- BODY(4,FN24,VREG,EREG,AREG,BREG,CREG,DREG)
- BODY(8,FN24,VREG,DREG,EREG,AREG,BREG,CREG)
- BODY(12,FN24,VREG,CREG,DREG,EREG,AREG,BREG)
- BODY(16,FN24,VREG,BREG,CREG,DREG,EREG,AREG)
- ADDU $20,WREG
- BNE WREG,W40REG,loop2
- MOVW $0x8f1bbcdc,VREG
- loop3:
- BODY(0,FN3,VREG,AREG,BREG,CREG,DREG,EREG)
- BODY(4,FN3,VREG,EREG,AREG,BREG,CREG,DREG)
- BODY(8,FN3,VREG,DREG,EREG,AREG,BREG,CREG)
- BODY(12,FN3,VREG,CREG,DREG,EREG,AREG,BREG)
- BODY(16,FN3,VREG,BREG,CREG,DREG,EREG,AREG)
- ADDU $20,WREG
- BNE WREG,W60REG,loop3
- MOVW $0xca62c1d6,VREG
- loop4:
- BODY(0,FN24,VREG,AREG,BREG,CREG,DREG,EREG)
- BODY(4,FN24,VREG,EREG,AREG,BREG,CREG,DREG)
- BODY(8,FN24,VREG,DREG,EREG,AREG,BREG,CREG)
- BODY(12,FN24,VREG,CREG,DREG,EREG,AREG,BREG)
- BODY(16,FN24,VREG,BREG,CREG,DREG,EREG,AREG)
- ADDU $20,WREG
- BNE WREG,W80REG,loop4
- MOVW 0(STREG),TMP1
- MOVW 4(STREG),TMP2
- MOVW 8(STREG),TMP3
- MOVW 12(STREG),TMP4
- MOVW 16(STREG),TMP5
- ADDU TMP1,AREG
- ADDU TMP2,BREG
- ADDU TMP3,CREG
- ADDU TMP4,DREG
- ADDU TMP5,EREG
- MOVW AREG,0(STREG)
- MOVW BREG,4(STREG)
- MOVW CREG,8(STREG)
- MOVW DREG,12(STREG)
- MOVW EREG,16(STREG)
- BNE DATAREG,EDREG,mainloop
- RET
- END
|