1while (bytes >= 64) {
2    __m128i diag0 = _mm_loadu_si128((__m128i *) (x + 0));
3    __m128i diag1 = _mm_loadu_si128((__m128i *) (x + 4));
4    __m128i diag2 = _mm_loadu_si128((__m128i *) (x + 8));
5    __m128i diag3 = _mm_loadu_si128((__m128i *) (x + 12));
6    __m128i a0, a1, a2, a3, a4, a5, a6, a7;
7    __m128i b0, b1, b2, b3, b4, b5, b6, b7;
8
9    uint32_t in8;
10    uint32_t in9;
11    int      i;
12
13    a0 = diag1;
14    for (i = 0; i < ROUNDS; i += 4) {
15        a0    = _mm_add_epi32(a0, diag0);
16        a1    = diag0;
17        b0    = a0;
18        a0    = _mm_slli_epi32(a0, 7);
19        b0    = _mm_srli_epi32(b0, 25);
20        diag3 = _mm_xor_si128(diag3, a0);
21
22        diag3 = _mm_xor_si128(diag3, b0);
23
24        a1    = _mm_add_epi32(a1, diag3);
25        a2    = diag3;
26        b1    = a1;
27        a1    = _mm_slli_epi32(a1, 9);
28        b1    = _mm_srli_epi32(b1, 23);
29        diag2 = _mm_xor_si128(diag2, a1);
30        diag3 = _mm_shuffle_epi32(diag3, 0x93);
31        diag2 = _mm_xor_si128(diag2, b1);
32
33        a2    = _mm_add_epi32(a2, diag2);
34        a3    = diag2;
35        b2    = a2;
36        a2    = _mm_slli_epi32(a2, 13);
37        b2    = _mm_srli_epi32(b2, 19);
38        diag1 = _mm_xor_si128(diag1, a2);
39        diag2 = _mm_shuffle_epi32(diag2, 0x4e);
40        diag1 = _mm_xor_si128(diag1, b2);
41
42        a3    = _mm_add_epi32(a3, diag1);
43        a4    = diag3;
44        b3    = a3;
45        a3    = _mm_slli_epi32(a3, 18);
46        b3    = _mm_srli_epi32(b3, 14);
47        diag0 = _mm_xor_si128(diag0, a3);
48        diag1 = _mm_shuffle_epi32(diag1, 0x39);
49        diag0 = _mm_xor_si128(diag0, b3);
50
51        a4    = _mm_add_epi32(a4, diag0);
52        a5    = diag0;
53        b4    = a4;
54        a4    = _mm_slli_epi32(a4, 7);
55        b4    = _mm_srli_epi32(b4, 25);
56        diag1 = _mm_xor_si128(diag1, a4);
57
58        diag1 = _mm_xor_si128(diag1, b4);
59
60        a5    = _mm_add_epi32(a5, diag1);
61        a6    = diag1;
62        b5    = a5;
63        a5    = _mm_slli_epi32(a5, 9);
64        b5    = _mm_srli_epi32(b5, 23);
65        diag2 = _mm_xor_si128(diag2, a5);
66        diag1 = _mm_shuffle_epi32(diag1, 0x93);
67        diag2 = _mm_xor_si128(diag2, b5);
68
69        a6    = _mm_add_epi32(a6, diag2);
70        a7    = diag2;
71        b6    = a6;
72        a6    = _mm_slli_epi32(a6, 13);
73        b6    = _mm_srli_epi32(b6, 19);
74        diag3 = _mm_xor_si128(diag3, a6);
75        diag2 = _mm_shuffle_epi32(diag2, 0x4e);
76        diag3 = _mm_xor_si128(diag3, b6);
77
78        a7    = _mm_add_epi32(a7, diag3);
79        a0    = diag1;
80        b7    = a7;
81        a7    = _mm_slli_epi32(a7, 18);
82        b7    = _mm_srli_epi32(b7, 14);
83        diag0 = _mm_xor_si128(diag0, a7);
84        diag3 = _mm_shuffle_epi32(diag3, 0x39);
85        diag0 = _mm_xor_si128(diag0, b7);
86
87        a0    = _mm_add_epi32(a0, diag0);
88        a1    = diag0;
89        b0    = a0;
90        a0    = _mm_slli_epi32(a0, 7);
91        b0    = _mm_srli_epi32(b0, 25);
92        diag3 = _mm_xor_si128(diag3, a0);
93
94        diag3 = _mm_xor_si128(diag3, b0);
95
96        a1    = _mm_add_epi32(a1, diag3);
97        a2    = diag3;
98        b1    = a1;
99        a1    = _mm_slli_epi32(a1, 9);
100        b1    = _mm_srli_epi32(b1, 23);
101        diag2 = _mm_xor_si128(diag2, a1);
102        diag3 = _mm_shuffle_epi32(diag3, 0x93);
103        diag2 = _mm_xor_si128(diag2, b1);
104
105        a2    = _mm_add_epi32(a2, diag2);
106        a3    = diag2;
107        b2    = a2;
108        a2    = _mm_slli_epi32(a2, 13);
109        b2    = _mm_srli_epi32(b2, 19);
110        diag1 = _mm_xor_si128(diag1, a2);
111        diag2 = _mm_shuffle_epi32(diag2, 0x4e);
112        diag1 = _mm_xor_si128(diag1, b2);
113
114        a3    = _mm_add_epi32(a3, diag1);
115        a4    = diag3;
116        b3    = a3;
117        a3    = _mm_slli_epi32(a3, 18);
118        b3    = _mm_srli_epi32(b3, 14);
119        diag0 = _mm_xor_si128(diag0, a3);
120        diag1 = _mm_shuffle_epi32(diag1, 0x39);
121        diag0 = _mm_xor_si128(diag0, b3);
122
123        a4    = _mm_add_epi32(a4, diag0);
124        a5    = diag0;
125        b4    = a4;
126        a4    = _mm_slli_epi32(a4, 7);
127        b4    = _mm_srli_epi32(b4, 25);
128        diag1 = _mm_xor_si128(diag1, a4);
129
130        diag1 = _mm_xor_si128(diag1, b4);
131
132        a5    = _mm_add_epi32(a5, diag1);
133        a6    = diag1;
134        b5    = a5;
135        a5    = _mm_slli_epi32(a5, 9);
136        b5    = _mm_srli_epi32(b5, 23);
137        diag2 = _mm_xor_si128(diag2, a5);
138        diag1 = _mm_shuffle_epi32(diag1, 0x93);
139        diag2 = _mm_xor_si128(diag2, b5);
140
141        a6    = _mm_add_epi32(a6, diag2);
142        a7    = diag2;
143        b6    = a6;
144        a6    = _mm_slli_epi32(a6, 13);
145        b6    = _mm_srli_epi32(b6, 19);
146        diag3 = _mm_xor_si128(diag3, a6);
147        diag2 = _mm_shuffle_epi32(diag2, 0x4e);
148        diag3 = _mm_xor_si128(diag3, b6);
149
150        a7    = _mm_add_epi32(a7, diag3);
151        a0    = diag1;
152        b7    = a7;
153        a7    = _mm_slli_epi32(a7, 18);
154        b7    = _mm_srli_epi32(b7, 14);
155        diag0 = _mm_xor_si128(diag0, a7);
156        diag3 = _mm_shuffle_epi32(diag3, 0x39);
157        diag0 = _mm_xor_si128(diag0, b7);
158    }
159
160    diag0 = _mm_add_epi32(diag0, _mm_loadu_si128((__m128i *) (x + 0)));
161    diag1 = _mm_add_epi32(diag1, _mm_loadu_si128((__m128i *) (x + 4)));
162    diag2 = _mm_add_epi32(diag2, _mm_loadu_si128((__m128i *) (x + 8)));
163    diag3 = _mm_add_epi32(diag3, _mm_loadu_si128((__m128i *) (x + 12)));
164
165#define ONEQUAD_SHUFFLE(A, B, C, D)                      \
166    do {                                                 \
167        uint32_t in##A = _mm_cvtsi128_si32(diag0);       \
168        uint32_t in##B = _mm_cvtsi128_si32(diag1);       \
169        uint32_t in##C = _mm_cvtsi128_si32(diag2);       \
170        uint32_t in##D = _mm_cvtsi128_si32(diag3);       \
171        diag0          = _mm_shuffle_epi32(diag0, 0x39); \
172        diag1          = _mm_shuffle_epi32(diag1, 0x39); \
173        diag2          = _mm_shuffle_epi32(diag2, 0x39); \
174        diag3          = _mm_shuffle_epi32(diag3, 0x39); \
175        in##A ^= *(uint32_t *) (m + (A * 4));            \
176        in##B ^= *(uint32_t *) (m + (B * 4));            \
177        in##C ^= *(uint32_t *) (m + (C * 4));            \
178        in##D ^= *(uint32_t *) (m + (D * 4));            \
179        *(uint32_t *) (c + (A * 4)) = in##A;             \
180        *(uint32_t *) (c + (B * 4)) = in##B;             \
181        *(uint32_t *) (c + (C * 4)) = in##C;             \
182        *(uint32_t *) (c + (D * 4)) = in##D;             \
183    } while (0)
184
185#define ONEQUAD(A, B, C, D) ONEQUAD_SHUFFLE(A, B, C, D)
186
187    ONEQUAD(0, 12, 8, 4);
188    ONEQUAD(5, 1, 13, 9);
189    ONEQUAD(10, 6, 2, 14);
190    ONEQUAD(15, 11, 7, 3);
191
192#undef ONEQUAD
193#undef ONEQUAD_SHUFFLE
194
195    in8 = x[8];
196    in9 = x[13];
197    in8++;
198    if (in8 == 0) {
199        in9++;
200    }
201    x[8]  = in8;
202    x[13] = in9;
203
204    c += 64;
205    m += 64;
206    bytes -= 64;
207}
208