#include "textflag.h" #define ROUND()\ ADD.S R2,R0,R0;\ ADC R3,R1,R1;\ EOR R2<<13,R0,R8;\ EOR R3>>19,R8,R8;\ EOR R2>>19,R1,R11;\ EOR R3<<13,R11,R11;\ ADD.S R6,R4,R4;\ ADC R7,R5,R5;\ EOR R6<<16,R4,R2;\ EOR R7>>16,R2,R2;\ EOR R6>>16,R5,R3;\ EOR R7<<16,R3,R3;\ ADD.S R2,R1,R1;\ ADC R3,R0,R0;\ EOR R2<<21,R1,R6;\ EOR R3>>11,R6,R6;\ EOR R2>>11,R0,R7;\ EOR R3<<21,R7,R7;\ ADD.S R8,R4,R4;\ ADC R11,R5,R5;\ EOR R8<<17,R4,R2;\ EOR R11>>15,R2,R2;\ EOR R8>>15,R5,R3;\ EOR R11<<17,R3,R3;\ ADD.S R2,R1,R1;\ ADC R3,R0,R0;\ EOR R2<<13,R1,R8;\ EOR R3>>19,R8,R8;\ EOR R2>>19,R0,R11;\ EOR R3<<13,R11,R11;\ ADD.S R6,R5,R5;\ ADC R7,R4,R4;\ EOR R6<<16,R5,R2;\ EOR R7>>16,R2,R2;\ EOR R6>>16,R4,R3;\ EOR R7<<16,R3,R3;\ ADD.S R2,R0,R0;\ ADC R3,R1,R1;\ EOR R2<<21,R0,R6;\ EOR R3>>11,R6,R6;\ EOR R2>>11,R1,R7;\ EOR R3<<21,R7,R7;\ ADD.S R8,R5,R5;\ ADC R11,R4,R4;\ EOR R8<<17,R5,R2;\ EOR R11>>15,R2,R2;\ EOR R8>>15,R4,R3;\ EOR R11<<17,R3,R3; // once(d *digest) TEXT ·once(SB),NOSPLIT,$4-4 MOVW d+0(FP),R8 MOVM.IA (R8),[R0,R1,R2,R3,R4,R5,R6,R7] MOVW 48(R8),R12 MOVW 52(R8),R14 EOR R12,R6,R6 EOR R14,R7,R7 ROUND() EOR R12,R0,R0 EOR R14,R1,R1 MOVW d+0(FP),R8 MOVM.IA [R0,R1,R2,R3,R4,R5,R6,R7],(R8) RET // finalize(d *digest) uint64 TEXT ·finalize(SB),NOSPLIT,$4-12 MOVW d+0(FP),R8 MOVM.IA (R8),[R0,R1,R2,R3,R4,R5,R6,R7] MOVW 48(R8),R12 MOVW 52(R8),R14 EOR R12,R6,R6 EOR R14,R7,R7 ROUND() EOR R12,R0,R0 EOR R14,R1,R1 EOR $255,R4 ROUND() ROUND() EOR R2,R0,R0 EOR R3,R1,R1 EOR R6,R4,R4 EOR R7,R5,R5 EOR R4,R0,R0 EOR R5,R1,R1 MOVW R0,ret_lo+4(FP) MOVW R1,ret_hi+8(FP) RET // blocks(d *digest, data []uint8) TEXT ·blocks(SB),NOSPLIT,$8-16 MOVW R9,sav-8(SP) MOVW d+0(FP),R8 MOVM.IA (R8),[R0,R1,R2,R3,R4,R5,R6,R7] MOVW p+4(FP),R9 MOVW p_len+8(FP),R11 ADD R9,R11,R11 MOVW R11,endp-4(SP) AND.S $3,R9,R8 BNE blocksunaligned blocksloop: MOVM.IA.W (R9),[R12,R14] EOR R12,R6,R6 EOR R14,R7,R7 ROUND() EOR R12,R0,R0 EOR R14,R1,R1 MOVW endp-4(SP),R11 CMP R11,R9 BLO blocksloop MOVW d+0(FP),R8 MOVM.IA [R0,R1,R2,R3,R4,R5,R6,R7],(R8) MOVW sav-8(SP),R9 RET blocksunaligned: MOVBU (R9),R12 MOVBU 1(R9),R11 ORR R11<<8,R12,R12 MOVBU 2(R9),R11 ORR R11<<16,R12,R12 MOVBU 3(R9),R11 ORR R11<<24,R12,R12 MOVBU 4(R9),R14 MOVBU 5(R9),R11 ORR R11<<8,R14,R14 MOVBU 6(R9),R11 ORR R11<<16,R14,R14 MOVBU 7(R9),R11 ORR R11<<24,R14,R14 ADD $8,R9,R9 EOR R12,R6,R6 EOR R14,R7,R7 ROUND() EOR R12,R0,R0 EOR R14,R1,R1 MOVW endp-4(SP),R11 CMP R11,R9 BLO blocksunaligned MOVW d+0(FP),R8 MOVM.IA [R0,R1,R2,R3,R4,R5,R6,R7],(R8) MOVW sav-8(SP),R9 RET