/ / + build ! n o a s m ! a p p e n g i n e
/ / Copyright 2 0 1 5 , K l a u s P o s t , s e e L I C E N S E f o r d e t a i l s .
/ / Based o n h t t p : / / w w w . s n i a . o r g / s i t e s / d e f a u l t / f i l e s2 / S D C 2 0 1 3 / p r e s e n t a t i o n s / N e w T h i n k i n g / E t h a n M i l l e r _ S c r e a m i n g _ F a s t _ G a l o i s _ F i e l d % 2 0 A r i t h m e t i c _ S I M D % 2 0 I n s t r u c t i o n s . p d f
/ / and h t t p : / / j e r a s u r e . o r g / j e r a s u r e / g f - c o m p l e t e / t r e e / m a s t e r
/ / func g a l M u l S S S E 3 X o r ( l o w , h i g h , i n , o u t [ ] b y t e )
TEXT · g a l M u l S S S E 3 X o r ( S B ) , 7 , $ 0
MOVQ l o w + 0 ( F P ) , S I / / S I : & l o w
MOVQ h i g h + 2 4 ( F P ) , D X / / D X : & h i g h
MOVOU ( S I ) , X 6 / / X 6 l o w
MOVOU ( D X ) , X 7 / / X 7 : h i g h
MOVQ $ 1 5 , B X / / B X : l o w m a s k
MOVQ B X , X 8
PXOR X 5 , X 5
MOVQ i n + 4 8 ( F P ) , S I / / R 1 1 : & i n
MOVQ i n _ l e n + 5 6 ( F P ) , R 9 / / R 9 : l e n ( i n )
MOVQ o u t + 7 2 ( F P ) , D X / / D X : & o u t
PSHUFB X 5 , X 8 / / X 8 : l o m a s k ( u n p a c k e d )
SHRQ $ 4 , R 9 / / l e n ( i n ) / 1 6
MOVQ S I , A X
MOVQ D X , B X
ANDQ $ 1 5 , A X
ANDQ $ 1 5 , B X
CMPQ R 9 , $ 0
JEQ d o n e _ x o r
ORQ A X , B X
CMPQ B X , $ 0
JNZ l o o p b a c k _ x o r
loopback_xor_aligned :
MOVOA ( S I ) , X 0 / / i n [ x ]
MOVOA ( D X ) , X 4 / / o u t [ x ]
MOVOA X 0 , X 1 / / i n [ x ]
MOVOA X 6 , X 2 / / l o w c o p y
MOVOA X 7 , X 3 / / h i g h c o p y
PSRLQ $ 4 , X 1 / / X 1 : h i g h i n p u t
PAND X 8 , X 0 / / X 0 : l o w i n p u t
PAND X 8 , X 1 / / X 0 : h i g h i n p u t
PSHUFB X 0 , X 2 / / X 2 : m u l l o w p a r t
PSHUFB X 1 , X 3 / / X 3 : m u l h i g h p a r t
PXOR X 2 , X 3 / / X 3 : R e s u l t
PXOR X 4 , X 3 / / X 3 : R e s u l t x o r e x i s t i n g o u t
MOVOA X 3 , ( D X ) / / S t o r e
ADDQ $ 1 6 , S I / / i n + =16
ADDQ $ 1 6 , D X / / o u t + =16
SUBQ $ 1 , R 9
JNZ l o o p b a c k _ x o r _ a l i g n e d
JMP d o n e _ x o r
loopback_xor :
MOVOU ( S I ) , X 0 / / i n [ x ]
MOVOU ( D X ) , X 4 / / o u t [ x ]
MOVOU X 0 , X 1 / / i n [ x ]
MOVOU X 6 , X 2 / / l o w c o p y
MOVOU X 7 , X 3 / / h i g h c o p y
PSRLQ $ 4 , X 1 / / X 1 : h i g h i n p u t
PAND X 8 , X 0 / / X 0 : l o w i n p u t
PAND X 8 , X 1 / / X 0 : h i g h i n p u t
PSHUFB X 0 , X 2 / / X 2 : m u l l o w p a r t
PSHUFB X 1 , X 3 / / X 3 : m u l h i g h p a r t
PXOR X 2 , X 3 / / X 3 : R e s u l t
PXOR X 4 , X 3 / / X 3 : R e s u l t x o r e x i s t i n g o u t
MOVOU X 3 , ( D X ) / / S t o r e
ADDQ $ 1 6 , S I / / i n + =16
ADDQ $ 1 6 , D X / / o u t + =16
SUBQ $ 1 , R 9
JNZ l o o p b a c k _ x o r
done_xor :
RET
/ / func g a l M u l S S S E 3 ( l o w , h i g h , i n , o u t [ ] b y t e )
TEXT · g a l M u l S S S E 3 ( S B ) , 7 , $ 0
MOVQ l o w + 0 ( F P ) , S I / / S I : & l o w
MOVQ h i g h + 2 4 ( F P ) , D X / / D X : & h i g h
MOVOU ( S I ) , X 6 / / X 6 l o w
MOVOU ( D X ) , X 7 / / X 7 : h i g h
MOVQ $ 1 5 , B X / / B X : l o w m a s k
MOVQ B X , X 8
PXOR X 5 , X 5
MOVQ i n + 4 8 ( F P ) , S I / / R 1 1 : & i n
MOVQ i n _ l e n + 5 6 ( F P ) , R 9 / / R 9 : l e n ( i n )
MOVQ o u t + 7 2 ( F P ) , D X / / D X : & o u t
PSHUFB X 5 , X 8 / / X 8 : l o m a s k ( u n p a c k e d )
MOVQ S I , A X
MOVQ D X , B X
SHRQ $ 4 , R 9 / / l e n ( i n ) / 1 6
ANDQ $ 1 5 , A X
ANDQ $ 1 5 , B X
CMPQ R 9 , $ 0
JEQ d o n e
ORQ A X , B X
CMPQ B X , $ 0
JNZ l o o p b a c k
loopback_aligned :
MOVOA ( S I ) , X 0 / / i n [ x ]
MOVOA X 0 , X 1 / / i n [ x ]
MOVOA X 6 , X 2 / / l o w c o p y
MOVOA X 7 , X 3 / / h i g h c o p y
PSRLQ $ 4 , X 1 / / X 1 : h i g h i n p u t
PAND X 8 , X 0 / / X 0 : l o w i n p u t
PAND X 8 , X 1 / / X 0 : h i g h i n p u t
PSHUFB X 0 , X 2 / / X 2 : m u l l o w p a r t
PSHUFB X 1 , X 3 / / X 3 : m u l h i g h p a r t
PXOR X 2 , X 3 / / X 3 : R e s u l t
MOVOA X 3 , ( D X ) / / S t o r e
ADDQ $ 1 6 , S I / / i n + =16
ADDQ $ 1 6 , D X / / o u t + =16
SUBQ $ 1 , R 9
JNZ l o o p b a c k _ a l i g n e d
JMP d o n e
loopback :
MOVOU ( S I ) , X 0 / / i n [ x ]
MOVOU X 0 , X 1 / / i n [ x ]
MOVOA X 6 , X 2 / / l o w c o p y
MOVOA X 7 , X 3 / / h i g h c o p y
PSRLQ $ 4 , X 1 / / X 1 : h i g h i n p u t
PAND X 8 , X 0 / / X 0 : l o w i n p u t
PAND X 8 , X 1 / / X 0 : h i g h i n p u t
PSHUFB X 0 , X 2 / / X 2 : m u l l o w p a r t
PSHUFB X 1 , X 3 / / X 3 : m u l h i g h p a r t
PXOR X 2 , X 3 / / X 3 : R e s u l t
MOVOU X 3 , ( D X ) / / S t o r e
ADDQ $ 1 6 , S I / / i n + =16
ADDQ $ 1 6 , D X / / o u t + =16
SUBQ $ 1 , R 9
JNZ l o o p b a c k
done :
RET
/ / func g a l M u l A V X 2 X o r ( l o w , h i g h , i n , o u t [ ] b y t e )
TEXT · g a l M u l A V X 2 X o r ( S B ) , 7 , $ 0
MOVQ l o w + 0 ( F P ) , S I / / S I : & l o w
MOVQ h i g h + 2 4 ( F P ) , D X / / D X : & h i g h
MOVQ $ 1 5 , B X / / B X : l o w m a s k
MOVQ B X , X 5
MOVOU ( S I ) , X 6 / / X 6 : l o w
MOVOU ( D X ) , X 7 / / X 7 : h i g h
MOVQ i n _ l e n + 5 6 ( F P ) , R 9 / / R 9 : l e n ( i n )
VINSERTI1 2 8 $ 1 , X 6 , Y 6 , Y 6 / / l o w
VINSERTI1 2 8 $ 1 , X 7 , Y 7 , Y 7 / / h i g h
VPBROADCASTB X 5 , Y 8 / / Y 8 : l o m a s k ( u n p a c k e d )
SHRQ $ 5 , R 9 / / l e n ( i n ) / 3 2
MOVQ o u t + 7 2 ( F P ) , D X / / D X : & o u t
MOVQ i n + 4 8 ( F P ) , S I / / S I : & i n
TESTQ R 9 , R 9
JZ d o n e _ x o r _ a v x2
loopback_xor_avx2 :
VMOVDQU ( S I ) , Y 0
VMOVDQU ( D X ) , Y 4
VPSRLQ $ 4 , Y 0 , Y 1 / / Y 1 : h i g h i n p u t
VPAND Y 8 , Y 0 , Y 0 / / Y 0 : l o w i n p u t
VPAND Y 8 , Y 1 , Y 1 / / Y 1 : h i g h i n p u t
VPSHUFB Y 0 , Y 6 , Y 2 / / Y 2 : m u l l o w p a r t
VPSHUFB Y 1 , Y 7 , Y 3 / / Y 3 : m u l h i g h p a r t
VPXOR Y 3 , Y 2 , Y 3 / / Y 3 : R e s u l t
VPXOR Y 4 , Y 3 , Y 4 / / Y 4 : R e s u l t
VMOVDQU Y 4 , ( D X )
ADDQ $ 3 2 , S I / / i n + =32
ADDQ $ 3 2 , D X / / o u t + =32
SUBQ $ 1 , R 9
JNZ l o o p b a c k _ x o r _ a v x2
done_xor_avx2 :
VZEROUPPER
RET
/ / func g a l M u l A V X 2 ( l o w , h i g h , i n , o u t [ ] b y t e )
TEXT · g a l M u l A V X 2 ( S B ) , 7 , $ 0
MOVQ l o w + 0 ( F P ) , S I / / S I : & l o w
MOVQ h i g h + 2 4 ( F P ) , D X / / D X : & h i g h
MOVQ $ 1 5 , B X / / B X : l o w m a s k
MOVQ B X , X 5
MOVOU ( S I ) , X 6 / / X 6 : l o w
MOVOU ( D X ) , X 7 / / X 7 : h i g h
MOVQ i n _ l e n + 5 6 ( F P ) , R 9 / / R 9 : l e n ( i n )
VINSERTI1 2 8 $ 1 , X 6 , Y 6 , Y 6 / / l o w
VINSERTI1 2 8 $ 1 , X 7 , Y 7 , Y 7 / / h i g h
VPBROADCASTB X 5 , Y 8 / / Y 8 : l o m a s k ( u n p a c k e d )
SHRQ $ 5 , R 9 / / l e n ( i n ) / 3 2
MOVQ o u t + 7 2 ( F P ) , D X / / D X : & o u t
MOVQ i n + 4 8 ( F P ) , S I / / S I : & i n
TESTQ R 9 , R 9
JZ d o n e _ a v x2
loopback_avx2 :
VMOVDQU ( S I ) , Y 0
VPSRLQ $ 4 , Y 0 , Y 1 / / Y 1 : h i g h i n p u t
VPAND Y 8 , Y 0 , Y 0 / / Y 0 : l o w i n p u t
VPAND Y 8 , Y 1 , Y 1 / / Y 1 : h i g h i n p u t
VPSHUFB Y 0 , Y 6 , Y 2 / / Y 2 : m u l l o w p a r t
VPSHUFB Y 1 , Y 7 , Y 3 / / Y 3 : m u l h i g h p a r t
VPXOR Y 3 , Y 2 , Y 4 / / Y 4 : R e s u l t
VMOVDQU Y 4 , ( D X )
ADDQ $ 3 2 , S I / / i n + =32
ADDQ $ 3 2 , D X / / o u t + =32
SUBQ $ 1 , R 9
JNZ l o o p b a c k _ a v x2
done_avx2 :
VZEROUPPER
RET
/ / func s S E 2 X o r S l i c e ( i n , o u t [ ] b y t e )
TEXT · s S E 2 X o r S l i c e ( S B ) , 7 , $ 0
MOVQ i n + 0 ( F P ) , S I / / S I : & i n
MOVQ i n _ l e n + 8 ( F P ) , R 9 / / R 9 : l e n ( i n )
MOVQ o u t + 2 4 ( F P ) , D X / / D X : & o u t
SHRQ $ 4 , R 9 / / l e n ( i n ) / 1 6
CMPQ R 9 , $ 0
JEQ d o n e _ x o r _ s s e 2
loopback_xor_sse2 :
MOVOU ( S I ) , X 0 / / i n [ x ]
MOVOU ( D X ) , X 1 / / o u t [ x ]
PXOR X 0 , X 1
MOVOU X 1 , ( D X )
ADDQ $ 1 6 , S I / / i n + =16
ADDQ $ 1 6 , D X / / o u t + =16
SUBQ $ 1 , R 9
JNZ l o o p b a c k _ x o r _ s s e 2
done_xor_sse2 :
RET