1 while (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