2018-09-30 18:02:42 -07:00
/ / Copyright 2 0 1 2 T h e G o A u t h o r s . A l l r i g h t s r e s e r v e d .
/ / Use o f t h i s s o u r c e c o d e i s g o v e r n e d b y a B S D - s t y l e
/ / license t h a t c a n b e f o u n d i n t h e L I C E N S E f i l e .
/ / + build a m d64 ,! g c c g o ,! a p p e n g i n e
# include " t e x t f l a g . h "
# define P O L Y 1 3 0 5 _ A D D ( m s g , h0 , h1 , h2 ) \
ADDQ 0 ( m s g ) , h0 ; \
ADCQ 8 ( m s g ) , h1 ; \
ADCQ $ 1 , h2 ; \
LEAQ 1 6 ( m s g ) , m s g
# define P O L Y 1 3 0 5 _ M U L ( h0 , h1 , h2 , r0 , r1 , t 0 , t 1 , t 2 , t 3 ) \
MOVQ r0 , A X ; \
MULQ h0 ; \
MOVQ A X , t 0 ; \
MOVQ D X , t 1 ; \
MOVQ r0 , A X ; \
MULQ h1 ; \
ADDQ A X , t 1 ; \
ADCQ $ 0 , D X ; \
MOVQ r0 , t 2 ; \
IMULQ h2 , t 2 ; \
ADDQ D X , t 2 ; \
\
MOVQ r1 , A X ; \
MULQ h0 ; \
ADDQ A X , t 1 ; \
ADCQ $ 0 , D X ; \
MOVQ D X , h0 ; \
MOVQ r1 , t 3 ; \
IMULQ h2 , t 3 ; \
MOVQ r1 , A X ; \
MULQ h1 ; \
ADDQ A X , t 2 ; \
ADCQ D X , t 3 ; \
ADDQ h0 , t 2 ; \
ADCQ $ 0 , t 3 ; \
\
MOVQ t 0 , h0 ; \
MOVQ t 1 , h1 ; \
MOVQ t 2 , h2 ; \
ANDQ $ 3 , h2 ; \
MOVQ t 2 , t 0 ; \
ANDQ $ 0 x F F F F F F F F F F F F F F F C , t 0 ; \
ADDQ t 0 , h0 ; \
ADCQ t 3 , h1 ; \
ADCQ $ 0 , h2 ; \
SHRQ $ 2 , t 3 , t 2 ; \
SHRQ $ 2 , t 3 ; \
ADDQ t 2 , h0 ; \
ADCQ t 3 , h1 ; \
ADCQ $ 0 , h2
DATA · p o l y 1 3 0 5 M a s k < > + 0 x00 ( S B ) / 8 , $ 0 x0 F F F F F F C 0 F F F F F F F
DATA · p o l y 1 3 0 5 M a s k < > + 0 x08 ( S B ) / 8 , $ 0 x0 F F F F F F C 0 F F F F F F C
GLOBL · p o l y 1 3 0 5 M a s k < > ( S B ) , R O D A T A , $ 1 6
2019-10-24 19:55:06 -04:00
/ / func p o l y 1 3 0 5 ( o u t * [ 1 6 ] b y t e , m * b y t e , m l e n u i n t 6 4 , k e y * [ 3 2 ] k e y )
TEXT · p o l y 1 3 0 5 ( S B ) , $ 0 - 3 2
MOVQ o u t + 0 ( F P ) , D I
MOVQ m + 8 ( F P ) , S I
MOVQ m l e n + 1 6 ( F P ) , R 1 5
MOVQ k e y + 2 4 ( F P ) , A X
MOVQ 0 ( A X ) , R 1 1
MOVQ 8 ( A X ) , R 1 2
ANDQ · p o l y 1 3 0 5 M a s k < > ( S B ) , R 1 1 / / r0
ANDQ · p o l y 1 3 0 5 M a s k < > + 8 ( S B ) , R 1 2 / / r1
XORQ R 8 , R 8 / / h0
XORQ R 9 , R 9 / / h1
XORQ R 1 0 , R 1 0 / / h2
2018-09-30 18:02:42 -07:00
CMPQ R 1 5 , $ 1 6
JB b y t e s _ b e t w e e n _ 0 _ a n d _ 1 5
loop :
POLY1 3 0 5 _ A D D ( S I , R 8 , R 9 , R 1 0 )
multiply :
POLY1 3 0 5 _ M U L ( R 8 , R 9 , R 1 0 , R 1 1 , R 1 2 , B X , C X , R 1 3 , R 1 4 )
SUBQ $ 1 6 , R 1 5
CMPQ R 1 5 , $ 1 6
JAE l o o p
bytes_between_0_and_15 :
TESTQ R 1 5 , R 1 5
JZ d o n e
MOVQ $ 1 , B X
XORQ C X , C X
XORQ R 1 3 , R 1 3
ADDQ R 1 5 , S I
flush_buffer :
SHLQ $ 8 , B X , C X
SHLQ $ 8 , B X
MOVB - 1 ( S I ) , R 1 3
XORQ R 1 3 , B X
DECQ S I
DECQ R 1 5
JNZ f l u s h _ b u f f e r
ADDQ B X , R 8
ADCQ C X , R 9
ADCQ $ 0 , R 1 0
MOVQ $ 1 6 , R 1 5
JMP m u l t i p l y
done :
2019-10-24 19:55:06 -04:00
MOVQ R 8 , A X
MOVQ R 9 , B X
2018-09-30 18:02:42 -07:00
SUBQ $ 0 x F F F F F F F F F F F F F F F B , A X
SBBQ $ 0 x F F F F F F F F F F F F F F F F , B X
2019-10-24 19:55:06 -04:00
SBBQ $ 3 , R 1 0
2018-09-30 18:02:42 -07:00
CMOVQCS R 8 , A X
CMOVQCS R 9 , B X
2019-10-24 19:55:06 -04:00
MOVQ k e y + 2 4 ( F P ) , R 8
ADDQ 1 6 ( R 8 ) , A X
ADCQ 2 4 ( R 8 ) , B X
2018-09-30 18:02:42 -07:00
MOVQ A X , 0 ( D I )
MOVQ B X , 8 ( D I )
RET