]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libsec/amd64/chachablock.s
Mail: correct rendering of nested multipart messages
[plan9front.git] / sys / src / libsec / amd64 / chachablock.s
1 #define ROTATE(n, v1, v2) \
2         MOVO    v1, v2; \
3         PSLLL   $(n), v1; \
4         PSRLL   $(32-n), v2; \
5         POR     v1, v2
6
7 TEXT _chachablock(SB), 0, $0
8         MOVOU    0(RARG), X0
9         MOVOU   16(RARG), X1
10         MOVOU   32(RARG), X2
11         MOVOU   48(RARG), X3
12
13         MOVL    rounds+8(FP), CX
14         SHRL    $1, CX
15
16 _loop:
17         PADDL   X1, X0
18         PXOR    X0, X3
19         /* ROTATE(16, X3, X3) */
20         PSHUFLW $(1<<0 | 0<<2 | 3<<4 | 2<<6), X3, X3
21         PSHUFHW $(1<<0 | 0<<2 | 3<<4 | 2<<6), X3, X3
22
23         PADDL   X3, X2
24         MOVO    X1, X4
25         PXOR    X2, X4
26         ROTATE(12, X4, X1)
27         
28         PADDL   X1, X0
29         MOVO    X0, X4
30         PXOR    X3, X4
31         ROTATE(8, X4, X3)
32
33         PADDL   X3, X2
34         MOVO    X1, X4
35         PXOR    X2, X4
36         ROTATE(7, X4, X1)
37
38         PSHUFL $(1<<0 | 2<<2 | 3<<4 | 0<<6), X1, X1
39         PSHUFL $(2<<0 | 3<<2 | 0<<4 | 1<<6), X2, X2
40         PSHUFL $(3<<0 | 0<<2 | 1<<4 | 2<<6), X3, X3
41
42         PADDL   X1, X0
43         PXOR    X0, X3
44         /* ROTATE(16, X3, X3) */
45         PSHUFLW $(1<<0 | 0<<2 | 3<<4 | 2<<6), X3, X3
46         PSHUFHW $(1<<0 | 0<<2 | 3<<4 | 2<<6), X3, X3
47
48         PADDL   X3, X2
49         MOVO    X1, X4
50         PXOR    X2, X4
51         ROTATE(12, X4, X1)
52         
53         PADDL   X1, X0
54         MOVO    X0, X4
55         PXOR    X3, X4
56         ROTATE(8, X4, X3)
57
58         PADDL   X3, X2
59         MOVO    X1, X4
60         PXOR    X2, X4
61         ROTATE(7, X4, X1)
62
63         PSHUFL $(3<<0 | 0<<2 | 1<<4 | 2<<6), X1, X1
64         PSHUFL $(2<<0 | 3<<2 | 0<<4 | 1<<6), X2, X2
65         PSHUFL $(1<<0 | 2<<2 | 3<<4 | 0<<6), X3, X3
66
67         DECL CX
68         JNE _loop
69
70         MOVOU   X0, 0(RARG)
71         MOVOU   X1, 16(RARG)
72         MOVOU   X2, 32(RARG)
73         MOVOU   X3, 48(RARG)
74         RET