123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- TEXT _sha1block+0(SB),$352
- /* x = (wp[off-f] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1;
- * wp[off] = x;
- * x += A <<< 5;
- * E += 0xca62c1d6 + x;
- * x = FN(B,C,D);
- * E += x;
- * B >>> 2
- */
- #define BSWAPDI BYTE $0x0f; BYTE $0xcf;
- #define BODY(off,FN,V,A,B,C,D,E)\
- MOVL (off-64)(BP),DI;\
- XORL (off-56)(BP),DI;\
- XORL (off-32)(BP),DI;\
- XORL (off-12)(BP),DI;\
- ROLL $1,DI;\
- MOVL DI,off(BP);\
- LEAL V(DI)(E*1),E;\
- MOVL A,DI;\
- ROLL $5,DI;\
- ADDL DI,E;\
- FN(B,C,D)\
- ADDL DI,E;\
- RORL $2,B;\
- #define BODY0(off,FN,V,A,B,C,D,E)\
- MOVL off(BX),DI;\
- BSWAPDI;\
- MOVL DI,off(BP);\
- LEAL V(DI)(E*1),E;\
- MOVL A,DI;\
- ROLL $5,DI;\
- ADDL DI,E;\
- FN(B,C,D)\
- ADDL DI,E;\
- RORL $2,B;\
- /*
- * fn1 = (((C^D)&B)^D);
- */
- #define FN1(B,C,D)\
- MOVL C,DI;\
- XORL D,DI;\
- ANDL B,DI;\
- XORL D,DI;\
- /*
- * fn24 = B ^ C ^ D
- */
- #define FN24(B,C,D)\
- MOVL B,DI;\
- XORL C,DI;\
- XORL D,DI;\
- /*
- * fn3 = ((B ^ C) & (D ^= B)) ^ B
- * D ^= B to restore D
- */
- #define FN3(B,C,D)\
- MOVL B,DI;\
- XORL C,DI;\
- XORL B,D;\
- ANDL D,DI;\
- XORL B,DI;\
- XORL B,D;\
- /*
- * stack offsets
- * void sha1block(uchar *DATA, int LEN, ulong *STATE)
- */
- #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 TMP1 (-8-(80*4))
- #define TMP2 (-12-(80*4))
- #define W15 (-16-(80*4))
- #define W40 (-20-(80*4))
- #define W60 (-24-(80*4))
- #define W80 (-28-(80*4))
- #define EDATA (-32-(80*4))
- MOVL data+DATA(FP),AX
- ADDL len+LEN(FP),AX
- MOVL AX,edata+EDATA(SP)
- LEAL aw15+(WARRAY+15*4)(SP),DI
- MOVL DI,w15+W15(SP)
- LEAL aw40+(WARRAY+40*4)(SP),DX
- MOVL DX,w40+W40(SP)
- LEAL aw60+(WARRAY+60*4)(SP),CX
- MOVL CX,w60+W60(SP)
- LEAL aw80+(WARRAY+80*4)(SP),DI
- MOVL DI,w80+W80(SP)
- mainloop:
- LEAL warray+WARRAY(SP),BP
- MOVL state+STATE(FP),DI
- MOVL (DI),AX
- MOVL 4(DI),BX
- MOVL BX,tmp1+TMP1(SP)
- MOVL 8(DI),CX
- MOVL 12(DI),DX
- MOVL 16(DI),SI
- MOVL data+DATA(FP),BX
- loop1:
- BODY0(0,FN1,0x5a827999,AX,tmp1+TMP1(SP),CX,DX,SI)
- MOVL SI,tmp2+TMP2(SP)
- BODY0(4,FN1,0x5a827999,SI,AX,tmp1+TMP1(SP),CX,DX)
- MOVL tmp1+TMP1(SP),SI
- BODY0(8,FN1,0x5a827999,DX,tmp2+TMP2(SP),AX,SI,CX)
- BODY0(12,FN1,0x5a827999,CX,DX,tmp2+TMP2(SP),AX,SI)
- MOVL SI,tmp1+TMP1(SP)
- BODY0(16,FN1,0x5a827999,SI,CX,DX,tmp2+TMP2(SP),AX)
- MOVL tmp2+TMP2(SP),SI
- ADDL $20,BX
- ADDL $20,BP
- CMPL BP,w15+W15(SP)
- JCS loop1
- BODY0(0,FN1,0x5a827999,AX,tmp1+TMP1(SP),CX,DX,SI)
- ADDL $4,BX
- MOVL BX,data+DATA(FP)
- MOVL tmp1+TMP1(SP),BX
- BODY(4,FN1,0x5a827999,SI,AX,BX,CX,DX)
- BODY(8,FN1,0x5a827999,DX,SI,AX,BX,CX)
- BODY(12,FN1,0x5a827999,CX,DX,SI,AX,BX)
- BODY(16,FN1,0x5a827999,BX,CX,DX,SI,AX)
- ADDL $20,BP
- loop2:
- BODY(0,FN24,0x6ed9eba1,AX,BX,CX,DX,SI)
- BODY(4,FN24,0x6ed9eba1,SI,AX,BX,CX,DX)
- BODY(8,FN24,0x6ed9eba1,DX,SI,AX,BX,CX)
- BODY(12,FN24,0x6ed9eba1,CX,DX,SI,AX,BX)
- BODY(16,FN24,0x6ed9eba1,BX,CX,DX,SI,AX)
- ADDL $20,BP
- CMPL BP,w40+W40(SP)
- JCS loop2
- loop3:
- BODY(0,FN3,0x8f1bbcdc,AX,BX,CX,DX,SI)
- BODY(4,FN3,0x8f1bbcdc,SI,AX,BX,CX,DX)
- BODY(8,FN3,0x8f1bbcdc,DX,SI,AX,BX,CX)
- BODY(12,FN3,0x8f1bbcdc,CX,DX,SI,AX,BX)
- BODY(16,FN3,0x8f1bbcdc,BX,CX,DX,SI,AX)
- ADDL $20,BP
- CMPL BP,w60+W60(SP)
- JCS loop3
- loop4:
- BODY(0,FN24,0xca62c1d6,AX,BX,CX,DX,SI)
- BODY(4,FN24,0xca62c1d6,SI,AX,BX,CX,DX)
- BODY(8,FN24,0xca62c1d6,DX,SI,AX,BX,CX)
- BODY(12,FN24,0xca62c1d6,CX,DX,SI,AX,BX)
- BODY(16,FN24,0xca62c1d6,BX,CX,DX,SI,AX)
- ADDL $20,BP
- CMPL BP,w80+W80(SP)
- JCS loop4
- MOVL state+STATE(FP),DI
- ADDL AX,0(DI)
- ADDL BX,4(DI)
- ADDL CX,8(DI)
- ADDL DX,12(DI)
- ADDL SI,16(DI)
- MOVL edata+EDATA(SP),DI
- CMPL data+DATA(FP),DI
- JCS mainloop
- RET
- END
|