4d2d22c2d35cd483b07b80501db22f8946e60fe0
[hashcat.git] / OpenCL / inc_rp.cl
1 /**
2  * Authors.....: Jens Steube <jens.steube@gmail.com>
3  *               magnum <john.magnum@hushmail.com>
4  *
5  * License.....: MIT
6  */
7
8 #define DO_NOT_USE_BYTE_PERM
9
10 #ifdef DO_NOT_USE_BYTE_PERM
11 #ifdef IS_NV
12 #undef IS_NV
13 #define IS_GENERIC
14 #define RESTORE_NV
15 #endif
16 #endif
17
18 inline u32  apply_rule (const u32 name, const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len);
19 inline u32  apply_rules (const __global u32 *cmds, u32 buf0[4], u32 buf1[4], const u32 len);
20 inline u32x apply_rules_vect (const u32 pw_buf0[4], const u32 pw_buf1[4], const u32 pw_len, const __global kernel_rule_t *rules_buf, const u32 il_pos, u32x w0[4], u32x w1[4]);
21
22 inline u32 generate_cmask (u32 buf)
23 {
24   const u32 rmask = ((buf & 0x40404040) >> 1)
25                  & ~((buf & 0x80808080) >> 2);
26
27   const u32 hmask = (buf & 0x1f1f1f1f) + 0x05050505;
28   const u32 lmask = (buf & 0x1f1f1f1f) + 0x1f1f1f1f;
29
30   return rmask & ~hmask & lmask;
31 }
32
33 inline void truncate_right (u32 w0[4], u32 w1[4], const u32 len)
34 {
35   const u32 tmp = (1 << ((len % 4) * 8)) - 1;
36
37   switch (len / 4)
38   {
39     case  0:  w0[0] &= tmp;
40               w0[1]  = 0;
41               w0[2]  = 0;
42               w0[3]  = 0;
43               w1[0]  = 0;
44               w1[1]  = 0;
45               w1[2]  = 0;
46               w1[3]  = 0;
47               break;
48     case  1:  w0[1] &= tmp;
49               w0[2]  = 0;
50               w0[3]  = 0;
51               w1[0]  = 0;
52               w1[1]  = 0;
53               w1[2]  = 0;
54               w1[3]  = 0;
55               break;
56     case  2:  w0[2] &= tmp;
57               w0[3]  = 0;
58               w1[0]  = 0;
59               w1[1]  = 0;
60               w1[2]  = 0;
61               w1[3]  = 0;
62               break;
63     case  3:  w0[3] &= tmp;
64               w1[0]  = 0;
65               w1[1]  = 0;
66               w1[2]  = 0;
67               w1[3]  = 0;
68               break;
69     case  4:  w1[0] &= tmp;
70               w1[1]  = 0;
71               w1[2]  = 0;
72               w1[3]  = 0;
73               break;
74     case  5:  w1[1] &= tmp;
75               w1[2]  = 0;
76               w1[3]  = 0;
77               break;
78     case  6:  w1[2] &= tmp;
79               w1[3]  = 0;
80               break;
81     case  7:  w1[3] &= tmp;
82               break;
83   }
84 }
85
86 inline void truncate_left (u32 w0[4], u32 w1[4], const u32 len)
87 {
88   const u32 tmp = ~((1 << ((len % 4) * 8)) - 1);
89
90   switch (len / 4)
91   {
92     case  0:  w0[0] &= tmp;
93               break;
94     case  1:  w0[0]  = 0;
95               w0[1] &= tmp;
96               break;
97     case  2:  w0[0]  = 0;
98               w0[1]  = 0;
99               w0[2] &= tmp;
100               break;
101     case  3:  w0[0]  = 0;
102               w0[1]  = 0;
103               w0[2]  = 0;
104               w0[3] &= tmp;
105               break;
106     case  4:  w0[0]  = 0;
107               w0[1]  = 0;
108               w0[2]  = 0;
109               w0[3]  = 0;
110               w1[0] &= tmp;
111               break;
112     case  5:  w0[0]  = 0;
113               w0[1]  = 0;
114               w0[2]  = 0;
115               w0[3]  = 0;
116               w1[0]  = 0;
117               w1[1] &= tmp;
118               break;
119     case  6:  w0[0]  = 0;
120               w0[1]  = 0;
121               w0[2]  = 0;
122               w0[3]  = 0;
123               w1[0]  = 0;
124               w1[1]  = 0;
125               w1[2] &= tmp;
126               break;
127     case  7:  w0[0]  = 0;
128               w0[1]  = 0;
129               w0[2]  = 0;
130               w0[3]  = 0;
131               w1[0]  = 0;
132               w1[1]  = 0;
133               w1[2]  = 0;
134               w1[3] &= tmp;
135               break;
136   }
137 }
138
139 inline void lshift_block (const u32 in0[4], const u32 in1[4], u32 out0[4], u32 out1[4])
140 {
141   #ifdef IS_NV
142   out0[0] = __byte_perm_S (in0[0], in0[1], 0x4321);
143   out0[1] = __byte_perm_S (in0[1], in0[2], 0x4321);
144   out0[2] = __byte_perm_S (in0[2], in0[3], 0x4321);
145   out0[3] = __byte_perm_S (in0[3], in1[0], 0x4321);
146   out1[0] = __byte_perm_S (in1[0], in1[1], 0x4321);
147   out1[1] = __byte_perm_S (in1[1], in1[2], 0x4321);
148   out1[2] = __byte_perm_S (in1[2], in1[3], 0x4321);
149   out1[3] = __byte_perm_S (in1[3],      0, 0x4321);
150   #endif
151
152   #if defined IS_AMD || defined IS_GENERIC
153   out0[0] = amd_bytealign_S (in0[1], in0[0], 1);
154   out0[1] = amd_bytealign_S (in0[2], in0[1], 1);
155   out0[2] = amd_bytealign_S (in0[3], in0[2], 1);
156   out0[3] = amd_bytealign_S (in1[0], in0[3], 1);
157   out1[0] = amd_bytealign_S (in1[1], in1[0], 1);
158   out1[1] = amd_bytealign_S (in1[2], in1[1], 1);
159   out1[2] = amd_bytealign_S (in1[3], in1[2], 1);
160   out1[3] = amd_bytealign_S (     0, in1[3], 1);
161   #endif
162 }
163
164 inline void rshift_block (const u32 in0[4], const u32 in1[4], u32 out0[4], u32 out1[4])
165 {
166   #ifdef IS_NV
167   out1[3] = __byte_perm_S (in1[2], in1[3], 0x6543);
168   out1[2] = __byte_perm_S (in1[1], in1[2], 0x6543);
169   out1[1] = __byte_perm_S (in1[0], in1[1], 0x6543);
170   out1[0] = __byte_perm_S (in0[3], in1[0], 0x6543);
171   out0[3] = __byte_perm_S (in0[2], in0[3], 0x6543);
172   out0[2] = __byte_perm_S (in0[1], in0[2], 0x6543);
173   out0[1] = __byte_perm_S (in0[0], in0[1], 0x6543);
174   out0[0] = __byte_perm_S (     0, in0[0], 0x6543);
175   #endif
176
177   #if defined IS_AMD || defined IS_GENERIC
178   out1[3] = amd_bytealign_S (in1[3], in1[2], 3);
179   out1[2] = amd_bytealign_S (in1[2], in1[1], 3);
180   out1[1] = amd_bytealign_S (in1[1], in1[0], 3);
181   out1[0] = amd_bytealign_S (in1[0], in0[3], 3);
182   out0[3] = amd_bytealign_S (in0[3], in0[2], 3);
183   out0[2] = amd_bytealign_S (in0[2], in0[1], 3);
184   out0[1] = amd_bytealign_S (in0[1], in0[0], 3);
185   out0[0] = amd_bytealign_S (in0[0],      0, 3);
186   #endif
187 }
188
189 inline void lshift_block_N (const u32 in0[4], const u32 in1[4], u32 out0[4], u32 out1[4], const u32 num)
190 {
191   #ifdef IS_NV
192   switch (num)
193   {
194     case  0:  out0[0] = in0[0];
195               out0[1] = in0[1];
196               out0[2] = in0[2];
197               out0[3] = in0[3];
198               out1[0] = in1[0];
199               out1[1] = in1[1];
200               out1[2] = in1[2];
201               out1[3] = in1[3];
202               break;
203     case  1:  out0[0] = __byte_perm_S (in0[0], in0[1], 0x4321);
204               out0[1] = __byte_perm_S (in0[1], in0[2], 0x4321);
205               out0[2] = __byte_perm_S (in0[2], in0[3], 0x4321);
206               out0[3] = __byte_perm_S (in0[3], in1[0], 0x4321);
207               out1[0] = __byte_perm_S (in1[0], in1[1], 0x4321);
208               out1[1] = __byte_perm_S (in1[1], in1[2], 0x4321);
209               out1[2] = __byte_perm_S (in1[2], in1[3], 0x4321);
210               out1[3] = __byte_perm_S (in1[3],      0, 0x4321);
211               break;
212     case  2:  out0[0] = __byte_perm_S (in0[0], in0[1], 0x5432);
213               out0[1] = __byte_perm_S (in0[1], in0[2], 0x5432);
214               out0[2] = __byte_perm_S (in0[2], in0[3], 0x5432);
215               out0[3] = __byte_perm_S (in0[3], in1[0], 0x5432);
216               out1[0] = __byte_perm_S (in1[0], in1[1], 0x5432);
217               out1[1] = __byte_perm_S (in1[1], in1[2], 0x5432);
218               out1[2] = __byte_perm_S (in1[2], in1[3], 0x5432);
219               out1[3] = __byte_perm_S (in1[3],      0, 0x5432);
220               break;
221     case  3:  out0[0] = __byte_perm_S (in0[0], in0[1], 0x6543);
222               out0[1] = __byte_perm_S (in0[1], in0[2], 0x6543);
223               out0[2] = __byte_perm_S (in0[2], in0[3], 0x6543);
224               out0[3] = __byte_perm_S (in0[3], in1[0], 0x6543);
225               out1[0] = __byte_perm_S (in1[0], in1[1], 0x6543);
226               out1[1] = __byte_perm_S (in1[1], in1[2], 0x6543);
227               out1[2] = __byte_perm_S (in1[2], in1[3], 0x6543);
228               out1[3] = __byte_perm_S (in1[3],      0, 0x6543);
229               break;
230     case  4:  out0[0] = in0[1];
231               out0[1] = in0[2];
232               out0[2] = in0[3];
233               out0[3] = in1[0];
234               out1[0] = in1[1];
235               out1[1] = in1[2];
236               out1[2] = in1[3];
237               out1[3] = 0;
238               break;
239     case  5:  out0[0] = __byte_perm_S (in0[1], in0[2], 0x4321);
240               out0[1] = __byte_perm_S (in0[2], in0[3], 0x4321);
241               out0[2] = __byte_perm_S (in0[3], in1[0], 0x4321);
242               out0[3] = __byte_perm_S (in1[0], in1[1], 0x4321);
243               out1[0] = __byte_perm_S (in1[1], in1[2], 0x4321);
244               out1[1] = __byte_perm_S (in1[2], in1[3], 0x4321);
245               out1[2] = __byte_perm_S (in1[3],      0, 0x4321);
246               out1[3] = 0;
247               break;
248     case  6:  out0[0] = __byte_perm_S (in0[1], in0[2], 0x5432);
249               out0[1] = __byte_perm_S (in0[2], in0[3], 0x5432);
250               out0[2] = __byte_perm_S (in0[3], in1[0], 0x5432);
251               out0[3] = __byte_perm_S (in1[0], in1[1], 0x5432);
252               out1[0] = __byte_perm_S (in1[1], in1[2], 0x5432);
253               out1[1] = __byte_perm_S (in1[2], in1[3], 0x5432);
254               out1[2] = __byte_perm_S (in1[3],      0, 0x5432);
255               out1[3] = 0;
256               break;
257     case  7:  out0[0] = __byte_perm_S (in0[1], in0[2], 0x6543);
258               out0[1] = __byte_perm_S (in0[2], in0[3], 0x6543);
259               out0[2] = __byte_perm_S (in0[3], in1[0], 0x6543);
260               out0[3] = __byte_perm_S (in1[0], in1[1], 0x6543);
261               out1[0] = __byte_perm_S (in1[1], in1[2], 0x6543);
262               out1[1] = __byte_perm_S (in1[2], in1[3], 0x6543);
263               out1[2] = __byte_perm_S (in1[3],      0, 0x6543);
264               out1[3] = 0;
265               break;
266     case  8:  out0[0] = in0[2];
267               out0[1] = in0[3];
268               out0[2] = in1[0];
269               out0[3] = in1[1];
270               out1[0] = in1[2];
271               out1[1] = in1[3];
272               out1[2] = 0;
273               out1[3] = 0;
274               break;
275     case  9:  out0[0] = __byte_perm_S (in0[2], in0[3], 0x4321);
276               out0[1] = __byte_perm_S (in0[3], in1[0], 0x4321);
277               out0[2] = __byte_perm_S (in1[0], in1[1], 0x4321);
278               out0[3] = __byte_perm_S (in1[1], in1[2], 0x4321);
279               out1[0] = __byte_perm_S (in1[2], in1[3], 0x4321);
280               out1[1] = __byte_perm_S (in1[3],      0, 0x4321);
281               out1[2] = 0;
282               out1[3] = 0;
283               break;
284     case 10:  out0[0] = __byte_perm_S (in0[2], in0[3], 0x5432);
285               out0[1] = __byte_perm_S (in0[3], in1[0], 0x5432);
286               out0[2] = __byte_perm_S (in1[0], in1[1], 0x5432);
287               out0[3] = __byte_perm_S (in1[1], in1[2], 0x5432);
288               out1[0] = __byte_perm_S (in1[2], in1[3], 0x5432);
289               out1[1] = __byte_perm_S (in1[3],      0, 0x5432);
290               out1[2] = 0;
291               out1[3] = 0;
292               break;
293     case 11:  out0[0] = __byte_perm_S (in0[2], in0[3], 0x6543);
294               out0[1] = __byte_perm_S (in0[3], in1[0], 0x6543);
295               out0[2] = __byte_perm_S (in1[0], in1[1], 0x6543);
296               out0[3] = __byte_perm_S (in1[1], in1[2], 0x6543);
297               out1[0] = __byte_perm_S (in1[2], in1[3], 0x6543);
298               out1[1] = __byte_perm_S (in1[3],      0, 0x6543);
299               out1[2] = 0;
300               out1[3] = 0;
301               break;
302     case 12:  out0[0] = in0[3];
303               out0[1] = in1[0];
304               out0[2] = in1[1];
305               out0[3] = in1[2];
306               out1[0] = in1[3];
307               out1[1] = 0;
308               out1[2] = 0;
309               out1[3] = 0;
310               break;
311     case 13:
312               out0[0] = __byte_perm_S (in0[3], in1[0], 0x4321);
313               out0[1] = __byte_perm_S (in1[0], in1[1], 0x4321);
314               out0[2] = __byte_perm_S (in1[1], in1[2], 0x4321);
315               out0[3] = __byte_perm_S (in1[2], in1[3], 0x4321);
316               out1[0] = __byte_perm_S (in1[3],      0, 0x4321);
317               out1[1] = 0;
318               out1[2] = 0;
319               out1[3] = 0;
320               break;
321     case 14:  out0[0] = __byte_perm_S (in0[3], in1[0], 0x5432);
322               out0[1] = __byte_perm_S (in1[0], in1[1], 0x5432);
323               out0[2] = __byte_perm_S (in1[1], in1[2], 0x5432);
324               out0[3] = __byte_perm_S (in1[2], in1[3], 0x5432);
325               out1[0] = __byte_perm_S (in1[3],      0, 0x5432);
326               out1[1] = 0;
327               out1[2] = 0;
328               out1[3] = 0;
329               break;
330     case 15:  out0[0] = __byte_perm_S (in0[3], in1[0], 0x6543);
331               out0[1] = __byte_perm_S (in1[0], in1[1], 0x6543);
332               out0[2] = __byte_perm_S (in1[1], in1[2], 0x6543);
333               out0[3] = __byte_perm_S (in1[2], in1[3], 0x6543);
334               out1[0] = __byte_perm_S (in1[3],      0, 0x6543);
335               out1[1] = 0;
336               out1[2] = 0;
337               out1[3] = 0;
338               break;
339     case 16:  out0[0] = in1[0];
340               out0[1] = in1[1];
341               out0[2] = in1[2];
342               out0[3] = in1[3];
343               out1[0] = 0;
344               out1[1] = 0;
345               out1[2] = 0;
346               out1[3] = 0;
347               break;
348     case 17:  out0[0] = __byte_perm_S (in1[0], in1[1], 0x4321);
349               out0[1] = __byte_perm_S (in1[1], in1[2], 0x4321);
350               out0[2] = __byte_perm_S (in1[2], in1[3], 0x4321);
351               out0[3] = __byte_perm_S (in1[3],      0, 0x4321);
352               out1[0] = 0;
353               out1[1] = 0;
354               out1[2] = 0;
355               out1[3] = 0;
356               break;
357     case 18:  out0[0] = __byte_perm_S (in1[0], in1[1], 0x5432);
358               out0[1] = __byte_perm_S (in1[1], in1[2], 0x5432);
359               out0[2] = __byte_perm_S (in1[2], in1[3], 0x5432);
360               out0[3] = __byte_perm_S (in1[3],      0, 0x5432);
361               out1[0] = 0;
362               out1[1] = 0;
363               out1[2] = 0;
364               out1[3] = 0;
365               break;
366     case 19:  out0[0] = __byte_perm_S (in1[0], in1[1], 0x6543);
367               out0[1] = __byte_perm_S (in1[1], in1[2], 0x6543);
368               out0[2] = __byte_perm_S (in1[2], in1[3], 0x6543);
369               out0[3] = __byte_perm_S (in1[3],      0, 0x6543);
370               out1[0] = 0;
371               out1[1] = 0;
372               out1[2] = 0;
373               out1[3] = 0;
374               break;
375     case 20:  out0[0] = in1[1];
376               out0[1] = in1[2];
377               out0[2] = in1[3];
378               out0[3] = 0;
379               out1[0] = 0;
380               out1[1] = 0;
381               out1[2] = 0;
382               out1[3] = 0;
383               break;
384     case 21:  out0[0] = __byte_perm_S (in1[1], in1[2], 0x4321);
385               out0[1] = __byte_perm_S (in1[2], in1[3], 0x4321);
386               out0[2] = __byte_perm_S (in1[3],      0, 0x4321);
387               out0[3] = 0;
388               out1[0] = 0;
389               out1[1] = 0;
390               out1[2] = 0;
391               out1[3] = 0;
392               break;
393     case 22:  out0[0] = __byte_perm_S (in1[1], in1[2], 0x5432);
394               out0[1] = __byte_perm_S (in1[2], in1[3], 0x5432);
395               out0[2] = __byte_perm_S (in1[3],      0, 0x5432);
396               out0[3] = 0;
397               out1[0] = 0;
398               out1[1] = 0;
399               out1[2] = 0;
400               out1[3] = 0;
401               break;
402     case 23:  out0[0] = __byte_perm_S (in1[1], in1[2], 0x6543);
403               out0[1] = __byte_perm_S (in1[2], in1[3], 0x6543);
404               out0[2] = __byte_perm_S (in1[3],      0, 0x6543);
405               out0[3] = 0;
406               out1[0] = 0;
407               out1[1] = 0;
408               out1[2] = 0;
409               out1[3] = 0;
410               break;
411     case 24:  out0[0] = in1[2];
412               out0[1] = in1[3];
413               out0[2] = 0;
414               out0[3] = 0;
415               out1[0] = 0;
416               out1[1] = 0;
417               out1[2] = 0;
418               out1[3] = 0;
419               break;
420     case 25:  out0[0] = __byte_perm_S (in1[2], in1[3], 0x4321);
421               out0[1] = __byte_perm_S (in1[3],      0, 0x4321);
422               out0[2] = 0;
423               out0[3] = 0;
424               out1[0] = 0;
425               out1[1] = 0;
426               out1[2] = 0;
427               out1[3] = 0;
428               break;
429     case 26:  out0[0] = __byte_perm_S (in1[2], in1[3], 0x5432);
430               out0[1] = __byte_perm_S (in1[3],      0, 0x5432);
431               out0[2] = 0;
432               out0[3] = 0;
433               out1[0] = 0;
434               out1[1] = 0;
435               out1[2] = 0;
436               out1[3] = 0;
437               break;
438     case 27:  out0[0] = __byte_perm_S (in1[2], in1[3], 0x6543);
439               out0[1] = __byte_perm_S (in1[3],      0, 0x6543);
440               out0[2] = 0;
441               out0[3] = 0;
442               out1[0] = 0;
443               out1[1] = 0;
444               out1[2] = 0;
445               out1[3] = 0;
446               break;
447     case 28:  out0[0] = in1[3];
448               out0[1] = 0;
449               out0[2] = 0;
450               out0[3] = 0;
451               out1[0] = 0;
452               out1[1] = 0;
453               out1[2] = 0;
454               out1[3] = 0;
455               break;
456     case 29:  out0[0] = __byte_perm_S (in1[3],     0, 0x4321);
457               out0[1] = 0;
458               out0[2] = 0;
459               out0[3] = 0;
460               out1[0] = 0;
461               out1[1] = 0;
462               out1[2] = 0;
463               out1[3] = 0;
464               break;
465     case 30:  out0[0] =  __byte_perm_S (in1[3],     0, 0x5432);
466               out0[1] = 0;
467               out0[2] = 0;
468               out0[3] = 0;
469               out1[0] = 0;
470               out1[1] = 0;
471               out1[2] = 0;
472               out1[3] = 0;
473               break;
474     case 31:  out0[0] =  __byte_perm_S (in1[3],     0, 0x6543);
475               out0[1] = 0;
476               out0[2] = 0;
477               out0[3] = 0;
478               out1[0] = 0;
479               out1[1] = 0;
480               out1[2] = 0;
481               out1[3] = 0;
482               break;
483   }
484   #endif
485
486   #if defined IS_AMD || defined IS_GENERIC
487   switch (num)
488   {
489     case  0:  out0[0] = in0[0];
490               out0[1] = in0[1];
491               out0[2] = in0[2];
492               out0[3] = in0[3];
493               out1[0] = in1[0];
494               out1[1] = in1[1];
495               out1[2] = in1[2];
496               out1[3] = in1[3];
497               break;
498     case  1:  out0[0] = amd_bytealign_S (in0[1], in0[0], 1);
499               out0[1] = amd_bytealign_S (in0[2], in0[1], 1);
500               out0[2] = amd_bytealign_S (in0[3], in0[2], 1);
501               out0[3] = amd_bytealign_S (in1[0], in0[3], 1);
502               out1[0] = amd_bytealign_S (in1[1], in1[0], 1);
503               out1[1] = amd_bytealign_S (in1[2], in1[1], 1);
504               out1[2] = amd_bytealign_S (in1[3], in1[2], 1);
505               out1[3] = amd_bytealign_S (     0, in1[3], 1);
506               break;
507     case  2:  out0[0] = amd_bytealign_S (in0[1], in0[0], 2);
508               out0[1] = amd_bytealign_S (in0[2], in0[1], 2);
509               out0[2] = amd_bytealign_S (in0[3], in0[2], 2);
510               out0[3] = amd_bytealign_S (in1[0], in0[3], 2);
511               out1[0] = amd_bytealign_S (in1[1], in1[0], 2);
512               out1[1] = amd_bytealign_S (in1[2], in1[1], 2);
513               out1[2] = amd_bytealign_S (in1[3], in1[2], 2);
514               out1[3] = amd_bytealign_S (     0, in1[3], 2);
515               break;
516     case  3:  out0[0] = amd_bytealign_S (in0[1], in0[0], 3);
517               out0[1] = amd_bytealign_S (in0[2], in0[1], 3);
518               out0[2] = amd_bytealign_S (in0[3], in0[2], 3);
519               out0[3] = amd_bytealign_S (in1[0], in0[3], 3);
520               out1[0] = amd_bytealign_S (in1[1], in1[0], 3);
521               out1[1] = amd_bytealign_S (in1[2], in1[1], 3);
522               out1[2] = amd_bytealign_S (in1[3], in1[2], 3);
523               out1[3] = amd_bytealign_S (     0, in1[3], 3);
524               break;
525     case  4:  out0[0] = in0[1];
526               out0[1] = in0[2];
527               out0[2] = in0[3];
528               out0[3] = in1[0];
529               out1[0] = in1[1];
530               out1[1] = in1[2];
531               out1[2] = in1[3];
532               out1[3] = 0;
533               break;
534     case  5:  out0[0] = amd_bytealign_S (in0[2], in0[1], 1);
535               out0[1] = amd_bytealign_S (in0[3], in0[2], 1);
536               out0[2] = amd_bytealign_S (in1[0], in0[3], 1);
537               out0[3] = amd_bytealign_S (in1[1], in1[0], 1);
538               out1[0] = amd_bytealign_S (in1[2], in1[1], 1);
539               out1[1] = amd_bytealign_S (in1[3], in1[2], 1);
540               out1[2] = amd_bytealign_S (     0, in1[3], 1);
541               out1[3] = 0;
542               break;
543     case  6:  out0[0] = amd_bytealign_S (in0[2], in0[1], 2);
544               out0[1] = amd_bytealign_S (in0[3], in0[2], 2);
545               out0[2] = amd_bytealign_S (in1[0], in0[3], 2);
546               out0[3] = amd_bytealign_S (in1[1], in1[0], 2);
547               out1[0] = amd_bytealign_S (in1[2], in1[1], 2);
548               out1[1] = amd_bytealign_S (in1[3], in1[2], 2);
549               out1[2] = amd_bytealign_S (     0, in1[3], 2);
550               out1[3] = 0;
551               break;
552     case  7:  out0[0] = amd_bytealign_S (in0[2], in0[1], 3);
553               out0[1] = amd_bytealign_S (in0[3], in0[2], 3);
554               out0[2] = amd_bytealign_S (in1[0], in0[3], 3);
555               out0[3] = amd_bytealign_S (in1[1], in1[0], 3);
556               out1[0] = amd_bytealign_S (in1[2], in1[1], 3);
557               out1[1] = amd_bytealign_S (in1[3], in1[2], 3);
558               out1[2] = amd_bytealign_S (     0, in1[3], 3);
559               out1[3] = 0;
560               break;
561     case  8:  out0[0] = in0[2];
562               out0[1] = in0[3];
563               out0[2] = in1[0];
564               out0[3] = in1[1];
565               out1[0] = in1[2];
566               out1[1] = in1[3];
567               out1[2] = 0;
568               out1[3] = 0;
569               break;
570     case  9:  out0[0] = amd_bytealign_S (in0[3], in0[2], 1);
571               out0[1] = amd_bytealign_S (in1[0], in0[3], 1);
572               out0[2] = amd_bytealign_S (in1[1], in1[0], 1);
573               out0[3] = amd_bytealign_S (in1[2], in1[1], 1);
574               out1[0] = amd_bytealign_S (in1[3], in1[2], 1);
575               out1[1] = amd_bytealign_S (     0, in1[3], 1);
576               out1[2] = 0;
577               out1[3] = 0;
578               break;
579     case 10:  out0[0] = amd_bytealign_S (in0[3], in0[2], 2);
580               out0[1] = amd_bytealign_S (in1[0], in0[3], 2);
581               out0[2] = amd_bytealign_S (in1[1], in1[0], 2);
582               out0[3] = amd_bytealign_S (in1[2], in1[1], 2);
583               out1[0] = amd_bytealign_S (in1[3], in1[2], 2);
584               out1[1] = amd_bytealign_S (     0, in1[3], 2);
585               out1[2] = 0;
586               out1[3] = 0;
587               break;
588     case 11:  out0[0] = amd_bytealign_S (in0[3], in0[2], 3);
589               out0[1] = amd_bytealign_S (in1[0], in0[3], 3);
590               out0[2] = amd_bytealign_S (in1[1], in1[0], 3);
591               out0[3] = amd_bytealign_S (in1[2], in1[1], 3);
592               out1[0] = amd_bytealign_S (in1[3], in1[2], 3);
593               out1[1] = amd_bytealign_S (     0, in1[3], 3);
594               out1[2] = 0;
595               out1[3] = 0;
596               break;
597     case 12:  out0[0] = in0[3];
598               out0[1] = in1[0];
599               out0[2] = in1[1];
600               out0[3] = in1[2];
601               out1[0] = in1[3];
602               out1[1] = 0;
603               out1[2] = 0;
604               out1[3] = 0;
605               break;
606     case 13:  out0[0] = amd_bytealign_S (in1[0], in0[3], 1);
607               out0[1] = amd_bytealign_S (in1[1], in1[0], 1);
608               out0[2] = amd_bytealign_S (in1[2], in1[1], 1);
609               out0[3] = amd_bytealign_S (in1[3], in1[2], 1);
610               out1[0] = amd_bytealign_S (     0, in1[3], 1);
611               out1[1] = 0;
612               out1[2] = 0;
613               out1[3] = 0;
614               break;
615     case 14:  out0[0] = amd_bytealign_S (in1[0], in0[3], 2);
616               out0[1] = amd_bytealign_S (in1[1], in1[0], 2);
617               out0[2] = amd_bytealign_S (in1[2], in1[1], 2);
618               out0[3] = amd_bytealign_S (in1[3], in1[2], 2);
619               out1[0] = amd_bytealign_S (     0, in1[3], 2);
620               out1[1] = 0;
621               out1[2] = 0;
622               out1[3] = 0;
623               break;
624     case 15:  out0[0] = amd_bytealign_S (in1[0], in0[3], 3);
625               out0[1] = amd_bytealign_S (in1[1], in1[0], 3);
626               out0[2] = amd_bytealign_S (in1[2], in1[1], 3);
627               out0[3] = amd_bytealign_S (in1[3], in1[2], 3);
628               out1[0] = amd_bytealign_S (     0, in1[3], 3);
629               out1[1] = 0;
630               out1[2] = 0;
631               out1[3] = 0;
632               break;
633     case 16:  out0[0] = in1[0];
634               out0[1] = in1[1];
635               out0[2] = in1[2];
636               out0[3] = in1[3];
637               out1[0] = 0;
638               out1[1] = 0;
639               out1[2] = 0;
640               out1[3] = 0;
641               break;
642     case 17:  out0[0] = amd_bytealign_S (in1[1], in1[0], 1);
643               out0[1] = amd_bytealign_S (in1[2], in1[1], 1);
644               out0[2] = amd_bytealign_S (in1[3], in1[2], 1);
645               out0[3] = amd_bytealign_S (     0, in1[3], 1);
646               out1[0] = 0;
647               out1[1] = 0;
648               out1[2] = 0;
649               out1[3] = 0;
650               break;
651     case 18:  out0[0] = amd_bytealign_S (in1[1], in1[0], 2);
652               out0[1] = amd_bytealign_S (in1[2], in1[1], 2);
653               out0[2] = amd_bytealign_S (in1[3], in1[2], 2);
654               out0[3] = amd_bytealign_S (     0, in1[3], 2);
655               out1[0] = 0;
656               out1[1] = 0;
657               out1[2] = 0;
658               out1[3] = 0;
659               break;
660     case 19:  out0[0] = amd_bytealign_S (in1[1], in1[0], 3);
661               out0[1] = amd_bytealign_S (in1[2], in1[1], 3);
662               out0[2] = amd_bytealign_S (in1[3], in1[2], 3);
663               out0[3] = amd_bytealign_S (     0, in1[3], 3);
664               out1[0] = 0;
665               out1[1] = 0;
666               out1[2] = 0;
667               out1[3] = 0;
668               break;
669     case 20:  out0[0] = in1[1];
670               out0[1] = in1[2];
671               out0[2] = in1[3];
672               out0[3] = 0;
673               out1[0] = 0;
674               out1[1] = 0;
675               out1[2] = 0;
676               out1[3] = 0;
677               break;
678     case 21:  out0[0] = amd_bytealign_S (in1[2], in1[1], 1);
679               out0[1] = amd_bytealign_S (in1[3], in1[2], 1);
680               out0[2] = amd_bytealign_S (     0, in1[3], 1);
681               out0[3] = 0;
682               out1[0] = 0;
683               out1[1] = 0;
684               out1[2] = 0;
685               out1[3] = 0;
686               break;
687     case 22:  out0[0] = amd_bytealign_S (in1[2], in1[1], 2);
688               out0[1] = amd_bytealign_S (in1[3], in1[2], 2);
689               out0[2] = amd_bytealign_S (     0, in1[3], 2);
690               out0[3] = 0;
691               out1[0] = 0;
692               out1[1] = 0;
693               out1[2] = 0;
694               out1[3] = 0;
695               break;
696     case 23:  out0[0] = amd_bytealign_S (in1[2], in1[1], 3);
697               out0[1] = amd_bytealign_S (in1[3], in1[2], 3);
698               out0[2] = amd_bytealign_S (     0, in1[3], 3);
699               out0[3] = 0;
700               out1[0] = 0;
701               out1[1] = 0;
702               out1[2] = 0;
703               out1[3] = 0;
704               break;
705     case 24:  out0[0] = in1[2];
706               out0[1] = in1[3];
707               out0[2] = 0;
708               out0[3] = 0;
709               out1[0] = 0;
710               out1[1] = 0;
711               out1[2] = 0;
712               out1[3] = 0;
713               break;
714     case 25:  out0[0] = amd_bytealign_S (in1[3], in1[2], 1);
715               out0[1] = amd_bytealign_S (     0, in1[3], 1);
716               out0[2] = 0;
717               out0[3] = 0;
718               out1[0] = 0;
719               out1[1] = 0;
720               out1[2] = 0;
721               out1[3] = 0;
722               break;
723     case 26:  out0[0] = amd_bytealign_S (in1[3], in1[2], 2);
724               out0[1] = amd_bytealign_S (     0, in1[3], 2);
725               out0[2] = 0;
726               out0[3] = 0;
727               out1[0] = 0;
728               out1[1] = 0;
729               out1[2] = 0;
730               out1[3] = 0;
731               break;
732     case 27:  out0[0] = amd_bytealign_S (in1[3], in1[2], 3);
733               out0[1] = amd_bytealign_S (     0, in1[3], 3);
734               out0[2] = 0;
735               out0[3] = 0;
736               out1[0] = 0;
737               out1[1] = 0;
738               out1[2] = 0;
739               out1[3] = 0;
740               break;
741     case 28:  out0[0] = in1[3];
742               out0[1] = 0;
743               out0[2] = 0;
744               out0[3] = 0;
745               out1[0] = 0;
746               out1[1] = 0;
747               out1[2] = 0;
748               out1[3] = 0;
749               break;
750     case 29:  out0[0] = amd_bytealign_S (     0, in1[3], 1);
751               out0[1] = 0;
752               out0[2] = 0;
753               out0[3] = 0;
754               out1[0] = 0;
755               out1[1] = 0;
756               out1[2] = 0;
757               out1[3] = 0;
758               break;
759     case 30:  out0[0] = amd_bytealign_S (     0, in1[3], 2);
760               out0[1] = 0;
761               out0[2] = 0;
762               out0[3] = 0;
763               out1[0] = 0;
764               out1[1] = 0;
765               out1[2] = 0;
766               out1[3] = 0;
767               break;
768     case 31:  out0[0] = amd_bytealign_S (     0, in1[3], 3);
769               out0[1] = 0;
770               out0[2] = 0;
771               out0[3] = 0;
772               out1[0] = 0;
773               out1[1] = 0;
774               out1[2] = 0;
775               out1[3] = 0;
776               break;
777   }
778   #endif
779 }
780
781 inline void rshift_block_N (const u32 in0[4], const u32 in1[4], u32 out0[4], u32 out1[4], const u32 num)
782 {
783   #ifdef IS_NV
784   switch (num)
785   {
786     case  0:  out1[3] = in1[3];
787               out1[2] = in1[2];
788               out1[1] = in1[1];
789               out1[0] = in1[0];
790               out0[3] = in0[3];
791               out0[2] = in0[2];
792               out0[1] = in0[1];
793               out0[0] = in0[0];
794               break;
795     case  1:  out1[3] = __byte_perm_S (in1[2], in1[3], 0x6543);
796               out1[2] = __byte_perm_S (in1[1], in1[2], 0x6543);
797               out1[1] = __byte_perm_S (in1[0], in1[1], 0x6543);
798               out1[0] = __byte_perm_S (in0[3], in1[0], 0x6543);
799               out0[3] = __byte_perm_S (in0[2], in0[3], 0x6543);
800               out0[2] = __byte_perm_S (in0[1], in0[2], 0x6543);
801               out0[1] = __byte_perm_S (in0[0], in0[1], 0x6543);
802               out0[0] = __byte_perm_S (     0, in0[0], 0x6543);
803               break;
804     case  2:  out1[3] = __byte_perm_S (in1[2], in1[3], 0x5432);
805               out1[2] = __byte_perm_S (in1[1], in1[2], 0x5432);
806               out1[1] = __byte_perm_S (in1[0], in1[1], 0x5432);
807               out1[0] = __byte_perm_S (in0[3], in1[0], 0x5432);
808               out0[3] = __byte_perm_S (in0[2], in0[3], 0x5432);
809               out0[2] = __byte_perm_S (in0[1], in0[2], 0x5432);
810               out0[1] = __byte_perm_S (in0[0], in0[1], 0x5432);
811               out0[0] = __byte_perm_S (     0, in0[0], 0x5432);
812               break;
813     case  3:  out1[3] = __byte_perm_S (in1[2], in1[3], 0x4321);
814               out1[2] = __byte_perm_S (in1[1], in1[2], 0x4321);
815               out1[1] = __byte_perm_S (in1[0], in1[1], 0x4321);
816               out1[0] = __byte_perm_S (in0[3], in1[0], 0x4321);
817               out0[3] = __byte_perm_S (in0[2], in0[3], 0x4321);
818               out0[2] = __byte_perm_S (in0[1], in0[2], 0x4321);
819               out0[1] = __byte_perm_S (in0[0], in0[1], 0x4321);
820               out0[0] = __byte_perm_S (     0, in0[0], 0x4321);
821               break;
822     case  4:  out1[3] = in1[2];
823               out1[2] = in1[1];
824               out1[1] = in1[0];
825               out1[0] = in0[3];
826               out0[3] = in0[2];
827               out0[2] = in0[1];
828               out0[1] = in0[0];
829               out0[0] = 0;
830               break;
831     case  5:  out1[3] = __byte_perm_S (in1[1], in1[2], 0x6543);
832               out1[2] = __byte_perm_S (in1[0], in1[1], 0x6543);
833               out1[1] = __byte_perm_S (in0[3], in1[0], 0x6543);
834               out1[0] = __byte_perm_S (in0[2], in0[3], 0x6543);
835               out0[3] = __byte_perm_S (in0[1], in0[2], 0x6543);
836               out0[2] = __byte_perm_S (in0[0], in0[1], 0x6543);
837               out0[1] = __byte_perm_S (     0, in0[0], 0x6543);
838               out0[0] = 0;
839               break;
840     case  6:  out1[3] = __byte_perm_S (in1[1], in1[2], 0x5432);
841               out1[2] = __byte_perm_S (in1[0], in1[1], 0x5432);
842               out1[1] = __byte_perm_S (in0[3], in1[0], 0x5432);
843               out1[0] = __byte_perm_S (in0[2], in0[3], 0x5432);
844               out0[3] = __byte_perm_S (in0[1], in0[2], 0x5432);
845               out0[2] = __byte_perm_S (in0[0], in0[1], 0x5432);
846               out0[1] = __byte_perm_S (     0, in0[0], 0x5432);
847               out0[0] = 0;
848               break;
849     case  7:  out1[3] = __byte_perm_S (in1[1], in1[2], 0x4321);
850               out1[2] = __byte_perm_S (in1[0], in1[1], 0x4321);
851               out1[1] = __byte_perm_S (in0[3], in1[0], 0x4321);
852               out1[0] = __byte_perm_S (in0[2], in0[3], 0x4321);
853               out0[3] = __byte_perm_S (in0[1], in0[2], 0x4321);
854               out0[2] = __byte_perm_S (in0[0], in0[1], 0x4321);
855               out0[1] = __byte_perm_S (     0, in0[0], 0x4321);
856               out0[0] = 0;
857               break;
858     case  8:  out1[3] = in1[1];
859               out1[2] = in1[0];
860               out1[1] = in0[3];
861               out1[0] = in0[2];
862               out0[3] = in0[1];
863               out0[2] = in0[0];
864               out0[1] = 0;
865               out0[0] = 0;
866               break;
867     case  9:  out1[3] = __byte_perm_S (in1[0], in1[1], 0x6543);
868               out1[2] = __byte_perm_S (in0[3], in1[0], 0x6543);
869               out1[1] = __byte_perm_S (in0[2], in0[3], 0x6543);
870               out1[0] = __byte_perm_S (in0[1], in0[2], 0x6543);
871               out0[3] = __byte_perm_S (in0[0], in0[1], 0x6543);
872               out0[2] = __byte_perm_S (     0, in0[0], 0x6543);
873               out0[1] = 0;
874               out0[0] = 0;
875               break;
876     case 10:  out1[3] = __byte_perm_S (in1[0], in1[1], 0x5432);
877               out1[2] = __byte_perm_S (in0[3], in1[0], 0x5432);
878               out1[1] = __byte_perm_S (in0[2], in0[3], 0x5432);
879               out1[0] = __byte_perm_S (in0[1], in0[2], 0x5432);
880               out0[3] = __byte_perm_S (in0[0], in0[1], 0x5432);
881               out0[2] = __byte_perm_S (     0, in0[0], 0x5432);
882               out0[1] = 0;
883               out0[0] = 0;
884               break;
885     case 11:  out1[3] = __byte_perm_S (in1[0], in1[1], 0x4321);
886               out1[2] = __byte_perm_S (in0[3], in1[0], 0x4321);
887               out1[1] = __byte_perm_S (in0[2], in0[3], 0x4321);
888               out1[0] = __byte_perm_S (in0[1], in0[2], 0x4321);
889               out0[3] = __byte_perm_S (in0[0], in0[1], 0x4321);
890               out0[2] = __byte_perm_S (     0, in0[0], 0x4321);
891               out0[1] = 0;
892               out0[0] = 0;
893               break;
894     case 12:  out1[3] = in1[0];
895               out1[2] = in0[3];
896               out1[1] = in0[2];
897               out1[0] = in0[1];
898               out0[3] = in0[0];
899               out0[2] = 0;
900               out0[1] = 0;
901               out0[0] = 0;
902               break;
903     case 13:  out1[3] = __byte_perm_S (in0[3], in1[0], 0x6543);
904               out1[2] = __byte_perm_S (in0[2], in0[3], 0x6543);
905               out1[1] = __byte_perm_S (in0[1], in0[2], 0x6543);
906               out1[0] = __byte_perm_S (in0[0], in0[1], 0x6543);
907               out0[3] = __byte_perm_S (     0, in0[0], 0x6543);
908               out0[2] = 0;
909               out0[1] = 0;
910               out0[0] = 0;
911               break;
912     case 14:  out1[3] = __byte_perm_S (in0[3], in1[0], 0x5432);
913               out1[2] = __byte_perm_S (in0[2], in0[3], 0x5432);
914               out1[1] = __byte_perm_S (in0[1], in0[2], 0x5432);
915               out1[0] = __byte_perm_S (in0[0], in0[1], 0x5432);
916               out0[3] = __byte_perm_S (     0, in0[0], 0x5432);
917               out0[2] = 0;
918               out0[1] = 0;
919               out0[0] = 0;
920               break;
921     case 15:  out1[3] = __byte_perm_S (in0[3], in1[0], 0x4321);
922               out1[2] = __byte_perm_S (in0[2], in0[3], 0x4321);
923               out1[1] = __byte_perm_S (in0[1], in0[2], 0x4321);
924               out1[0] = __byte_perm_S (in0[0], in0[1], 0x4321);
925               out0[3] = __byte_perm_S (     0, in0[0], 0x4321);
926               out0[2] = 0;
927               out0[1] = 0;
928               out0[0] = 0;
929               break;
930     case 16:  out1[3] = in0[3];
931               out1[2] = in0[2];
932               out1[1] = in0[1];
933               out1[0] = in0[0];
934               out0[3] = 0;
935               out0[2] = 0;
936               out0[1] = 0;
937               out0[0] = 0;
938               break;
939     case 17:  out1[3] = __byte_perm_S (in0[2], in0[3], 0x6543);
940               out1[2] = __byte_perm_S (in0[1], in0[2], 0x6543);
941               out1[1] = __byte_perm_S (in0[0], in0[1], 0x6543);
942               out1[0] = __byte_perm_S (     0, in0[0], 0x6543);
943               out0[3] = 0;
944               out0[2] = 0;
945               out0[1] = 0;
946               out0[0] = 0;
947               break;
948     case 18:  out1[3] = __byte_perm_S (in0[2], in0[3], 0x5432);
949               out1[2] = __byte_perm_S (in0[1], in0[2], 0x5432);
950               out1[1] = __byte_perm_S (in0[0], in0[1], 0x5432);
951               out1[0] = __byte_perm_S (     0, in0[0], 0x5432);
952               out0[3] = 0;
953               out0[2] = 0;
954               out0[1] = 0;
955               out0[0] = 0;
956               break;
957     case 19:  out1[3] = __byte_perm_S (in0[2], in0[3], 0x4321);
958               out1[2] = __byte_perm_S (in0[1], in0[2], 0x4321);
959               out1[1] = __byte_perm_S (in0[0], in0[1], 0x4321);
960               out1[0] = __byte_perm_S (     0, in0[0], 0x4321);
961               out0[3] = 0;
962               out0[2] = 0;
963               out0[1] = 0;
964               out0[0] = 0;
965               break;
966     case 20:  out1[3] = in0[2];
967               out1[2] = in0[1];
968               out1[1] = in0[0];
969               out1[0] = 0;
970               out0[3] = 0;
971               out0[2] = 0;
972               out0[1] = 0;
973               out0[0] = 0;
974               break;
975     case 21:  out1[3] = __byte_perm_S (in0[1], in0[2], 0x6543);
976               out1[2] = __byte_perm_S (in0[0], in0[1], 0x6543);
977               out1[1] = __byte_perm_S (     0, in0[0], 0x6543);
978               out1[0] = 0;
979               out0[3] = 0;
980               out0[2] = 0;
981               out0[1] = 0;
982               out0[0] = 0;
983               break;
984     case 22:  out1[3] = __byte_perm_S (in0[1], in0[2], 0x5432);
985               out1[2] = __byte_perm_S (in0[0], in0[1], 0x5432);
986               out1[1] = __byte_perm_S (     0, in0[0], 0x5432);
987               out1[0] = 0;
988               out0[3] = 0;
989               out0[2] = 0;
990               out0[1] = 0;
991               out0[0] = 0;
992               break;
993     case 23:  out1[3] = __byte_perm_S (in0[1], in0[2], 0x4321);
994               out1[2] = __byte_perm_S (in0[0], in0[1], 0x4321);
995               out1[1] = __byte_perm_S (     0, in0[0], 0x4321);
996               out1[0] = 0;
997               out0[3] = 0;
998               out0[2] = 0;
999               out0[1] = 0;
1000               out0[0] = 0;
1001               break;
1002     case 24:  out1[3] = in0[1];
1003               out1[2] = in0[0];
1004               out1[1] = 0;
1005               out1[0] = 0;
1006               out0[3] = 0;
1007               out0[2] = 0;
1008               out0[1] = 0;
1009               out0[0] = 0;
1010               break;
1011     case 25:  out1[3] = __byte_perm_S (in0[0], in0[1], 0x6543);
1012               out1[2] = __byte_perm_S (     0, in0[0], 0x6543);
1013               out1[1] = 0;
1014               out1[0] = 0;
1015               out0[3] = 0;
1016               out0[2] = 0;
1017               out0[1] = 0;
1018               out0[0] = 0;
1019               break;
1020     case 26:  out1[3] = __byte_perm_S (in0[0], in0[1], 0x5432);
1021               out1[2] = __byte_perm_S (     0, in0[0], 0x5432);
1022               out1[1] = 0;
1023               out1[0] = 0;
1024               out0[3] = 0;
1025               out0[2] = 0;
1026               out0[1] = 0;
1027               out0[0] = 0;
1028               break;
1029     case 27:  out1[3] = __byte_perm_S (in0[0], in0[1], 0x4321);
1030               out1[2] = __byte_perm_S (     0, in0[0], 0x4321);
1031               out1[1] = 0;
1032               out1[0] = 0;
1033               out0[3] = 0;
1034               out0[2] = 0;
1035               out0[1] = 0;
1036               out0[0] = 0;
1037               break;
1038     case 28:  out1[3] = in0[0];
1039               out1[2] = 0;
1040               out1[1] = 0;
1041               out1[0] = 0;
1042               out0[3] = 0;
1043               out0[2] = 0;
1044               out0[1] = 0;
1045               out0[0] = 0;
1046               break;
1047     case 29:  out1[3] = __byte_perm_S (     0, in0[0], 0x6543);
1048               out1[2] = 0;
1049               out1[1] = 0;
1050               out1[0] = 0;
1051               out0[3] = 0;
1052               out0[2] = 0;
1053               out0[1] = 0;
1054               out0[0] = 0;
1055               break;
1056     case 30:  out1[3] = __byte_perm_S (     0, in0[0], 0x5432);
1057               out1[2] = 0;
1058               out1[1] = 0;
1059               out1[0] = 0;
1060               out0[3] = 0;
1061               out0[2] = 0;
1062               out0[1] = 0;
1063               out0[0] = 0;
1064               break;
1065     case 31:  out1[3] = __byte_perm_S (     0, in0[0], 0x4321);
1066               out1[2] = 0;
1067               out1[1] = 0;
1068               out1[0] = 0;
1069               out0[3] = 0;
1070               out0[2] = 0;
1071               out0[1] = 0;
1072               out0[0] = 0;
1073               break;
1074   }
1075   #endif
1076
1077   #if defined IS_AMD || defined IS_GENERIC
1078   switch (num)
1079   {
1080     case  0:  out1[3] = in1[3];
1081               out1[2] = in1[2];
1082               out1[1] = in1[1];
1083               out1[0] = in1[0];
1084               out0[3] = in0[3];
1085               out0[2] = in0[2];
1086               out0[1] = in0[1];
1087               out0[0] = in0[0];
1088               break;
1089     case  1:  out1[3] = amd_bytealign_S (in1[3], in1[2], 3);
1090               out1[2] = amd_bytealign_S (in1[2], in1[1], 3);
1091               out1[1] = amd_bytealign_S (in1[1], in1[0], 3);
1092               out1[0] = amd_bytealign_S (in1[0], in0[3], 3);
1093               out0[3] = amd_bytealign_S (in0[3], in0[2], 3);
1094               out0[2] = amd_bytealign_S (in0[2], in0[1], 3);
1095               out0[1] = amd_bytealign_S (in0[1], in0[0], 3);
1096               out0[0] = amd_bytealign_S (in0[0],      0, 3);
1097               break;
1098     case  2:  out1[3] = amd_bytealign_S (in1[3], in1[2], 2);
1099               out1[2] = amd_bytealign_S (in1[2], in1[1], 2);
1100               out1[1] = amd_bytealign_S (in1[1], in1[0], 2);
1101               out1[0] = amd_bytealign_S (in1[0], in0[3], 2);
1102               out0[3] = amd_bytealign_S (in0[3], in0[2], 2);
1103               out0[2] = amd_bytealign_S (in0[2], in0[1], 2);
1104               out0[1] = amd_bytealign_S (in0[1], in0[0], 2);
1105               out0[0] = amd_bytealign_S (in0[0],      0, 2);
1106               break;
1107     case  3:  out1[3] = amd_bytealign_S (in1[3], in1[2], 1);
1108               out1[2] = amd_bytealign_S (in1[2], in1[1], 1);
1109               out1[1] = amd_bytealign_S (in1[1], in1[0], 1);
1110               out1[0] = amd_bytealign_S (in1[0], in0[3], 1);
1111               out0[3] = amd_bytealign_S (in0[3], in0[2], 1);
1112               out0[2] = amd_bytealign_S (in0[2], in0[1], 1);
1113               out0[1] = amd_bytealign_S (in0[1], in0[0], 1);
1114               out0[0] = amd_bytealign_S (in0[0],      0, 1);
1115               break;
1116     case  4:  out1[3] = in1[2];
1117               out1[2] = in1[1];
1118               out1[1] = in1[0];
1119               out1[0] = in0[3];
1120               out0[3] = in0[2];
1121               out0[2] = in0[1];
1122               out0[1] = in0[0];
1123               out0[0] = 0;
1124               break;
1125     case  5:  out1[3] = amd_bytealign_S (in1[2], in1[1], 3);
1126               out1[2] = amd_bytealign_S (in1[1], in1[0], 3);
1127               out1[1] = amd_bytealign_S (in1[0], in0[3], 3);
1128               out1[0] = amd_bytealign_S (in0[3], in0[2], 3);
1129               out0[3] = amd_bytealign_S (in0[2], in0[1], 3);
1130               out0[2] = amd_bytealign_S (in0[1], in0[0], 3);
1131               out0[1] = amd_bytealign_S (in0[0],      0, 3);
1132               out0[0] = 0;
1133               break;
1134     case  6:  out1[3] = amd_bytealign_S (in1[2], in1[1], 2);
1135               out1[2] = amd_bytealign_S (in1[1], in1[0], 2);
1136               out1[1] = amd_bytealign_S (in1[0], in0[3], 2);
1137               out1[0] = amd_bytealign_S (in0[3], in0[2], 2);
1138               out0[3] = amd_bytealign_S (in0[2], in0[1], 2);
1139               out0[2] = amd_bytealign_S (in0[1], in0[0], 2);
1140               out0[1] = amd_bytealign_S (in0[0],      0, 2);
1141               out0[0] = 0;
1142               break;
1143     case  7:  out1[3] = amd_bytealign_S (in1[2], in1[1], 1);
1144               out1[2] = amd_bytealign_S (in1[1], in1[0], 1);
1145               out1[1] = amd_bytealign_S (in1[0], in0[3], 1);
1146               out1[0] = amd_bytealign_S (in0[3], in0[2], 1);
1147               out0[3] = amd_bytealign_S (in0[2], in0[1], 1);
1148               out0[2] = amd_bytealign_S (in0[1], in0[0], 1);
1149               out0[1] = amd_bytealign_S (in0[0],      0, 1);
1150               out0[0] = 0;
1151               break;
1152     case  8:  out1[3] = in1[1];
1153               out1[2] = in1[0];
1154               out1[1] = in0[3];
1155               out1[0] = in0[2];
1156               out0[3] = in0[1];
1157               out0[2] = in0[0];
1158               out0[1] = 0;
1159               out0[0] = 0;
1160               break;
1161     case  9:  out1[3] = amd_bytealign_S (in1[1], in1[0], 3);
1162               out1[2] = amd_bytealign_S (in1[0], in0[3], 3);
1163               out1[1] = amd_bytealign_S (in0[3], in0[2], 3);
1164               out1[0] = amd_bytealign_S (in0[2], in0[1], 3);
1165               out0[3] = amd_bytealign_S (in0[1], in0[0], 3);
1166               out0[2] = amd_bytealign_S (in0[0],      0, 3);
1167               out0[1] = 0;
1168               out0[0] = 0;
1169               break;
1170     case 10:  out1[3] = amd_bytealign_S (in1[1], in1[0], 2);
1171               out1[2] = amd_bytealign_S (in1[0], in0[3], 2);
1172               out1[1] = amd_bytealign_S (in0[3], in0[2], 2);
1173               out1[0] = amd_bytealign_S (in0[2], in0[1], 2);
1174               out0[3] = amd_bytealign_S (in0[1], in0[0], 2);
1175               out0[2] = amd_bytealign_S (in0[0],      0, 2);
1176               out0[1] = 0;
1177               out0[0] = 0;
1178               break;
1179     case 11:  out1[3] = amd_bytealign_S (in1[1], in1[0], 1);
1180               out1[2] = amd_bytealign_S (in1[0], in0[3], 1);
1181               out1[1] = amd_bytealign_S (in0[3], in0[2], 1);
1182               out1[0] = amd_bytealign_S (in0[2], in0[1], 1);
1183               out0[3] = amd_bytealign_S (in0[1], in0[0], 1);
1184               out0[2] = amd_bytealign_S (in0[0],      0, 1);
1185               out0[1] = 0;
1186               out0[0] = 0;
1187               break;
1188     case 12:  out1[3] = in1[0];
1189               out1[2] = in0[3];
1190               out1[1] = in0[2];
1191               out1[0] = in0[1];
1192               out0[3] = in0[0];
1193               out0[2] = 0;
1194               out0[1] = 0;
1195               out0[0] = 0;
1196               break;
1197     case 13:  out1[3] = amd_bytealign_S (in1[0], in0[3], 3);
1198               out1[2] = amd_bytealign_S (in0[3], in0[2], 3);
1199               out1[1] = amd_bytealign_S (in0[2], in0[1], 3);
1200               out1[0] = amd_bytealign_S (in0[1], in0[0], 3);
1201               out0[3] = amd_bytealign_S (in0[0],      0, 3);
1202               out0[2] = 0;
1203               out0[1] = 0;
1204               out0[0] = 0;
1205               break;
1206     case 14:  out1[3] = amd_bytealign_S (in1[0], in0[3], 2);
1207               out1[2] = amd_bytealign_S (in0[3], in0[2], 2);
1208               out1[1] = amd_bytealign_S (in0[2], in0[1], 2);
1209               out1[0] = amd_bytealign_S (in0[1], in0[0], 2);
1210               out0[3] = amd_bytealign_S (in0[0],      0, 2);
1211               out0[2] = 0;
1212               out0[1] = 0;
1213               out0[0] = 0;
1214               break;
1215     case 15:  out1[3] = amd_bytealign_S (in1[0], in0[3], 1);
1216               out1[2] = amd_bytealign_S (in0[3], in0[2], 1);
1217               out1[1] = amd_bytealign_S (in0[2], in0[1], 1);
1218               out1[0] = amd_bytealign_S (in0[1], in0[0], 1);
1219               out0[3] = amd_bytealign_S (in0[0],      0, 1);
1220               out0[2] = 0;
1221               out0[1] = 0;
1222               out0[0] = 0;
1223               break;
1224     case 16:  out1[3] = in0[3];
1225               out1[2] = in0[2];
1226               out1[1] = in0[1];
1227               out1[0] = in0[0];
1228               out0[3] = 0;
1229               out0[2] = 0;
1230               out0[1] = 0;
1231               out0[0] = 0;
1232               break;
1233     case 17:  out1[3] = amd_bytealign_S (in0[3], in0[2], 3);
1234               out1[2] = amd_bytealign_S (in0[2], in0[1], 3);
1235               out1[1] = amd_bytealign_S (in0[1], in0[0], 3);
1236               out1[0] = amd_bytealign_S (in0[0],      0, 3);
1237               out0[3] = 0;
1238               out0[2] = 0;
1239               out0[1] = 0;
1240               out0[0] = 0;
1241               break;
1242     case 18:  out1[3] = amd_bytealign_S (in0[3], in0[2], 2);
1243               out1[2] = amd_bytealign_S (in0[2], in0[1], 2);
1244               out1[1] = amd_bytealign_S (in0[1], in0[0], 2);
1245               out1[0] = amd_bytealign_S (in0[0],      0, 2);
1246               out0[3] = 0;
1247               out0[2] = 0;
1248               out0[1] = 0;
1249               out0[0] = 0;
1250               break;
1251     case 19:  out1[3] = amd_bytealign_S (in0[3], in0[2], 1);
1252               out1[2] = amd_bytealign_S (in0[2], in0[1], 1);
1253               out1[1] = amd_bytealign_S (in0[1], in0[0], 1);
1254               out1[0] = amd_bytealign_S (in0[0],      0, 1);
1255               out0[3] = 0;
1256               out0[2] = 0;
1257               out0[1] = 0;
1258               out0[0] = 0;
1259               break;
1260     case 20:  out1[3] = in0[2];
1261               out1[2] = in0[1];
1262               out1[1] = in0[0];
1263               out1[0] = 0;
1264               out0[3] = 0;
1265               out0[2] = 0;
1266               out0[1] = 0;
1267               out0[0] = 0;
1268               break;
1269     case 21:  out1[3] = amd_bytealign_S (in0[2], in0[1], 3);
1270               out1[2] = amd_bytealign_S (in0[1], in0[0], 3);
1271               out1[1] = amd_bytealign_S (in0[0],      0, 3);
1272               out1[0] = 0;
1273               out0[3] = 0;
1274               out0[2] = 0;
1275               out0[1] = 0;
1276               out0[0] = 0;
1277               break;
1278     case 22:  out1[3] = amd_bytealign_S (in0[2], in0[1], 2);
1279               out1[2] = amd_bytealign_S (in0[1], in0[0], 2);
1280               out1[1] = amd_bytealign_S (in0[0],      0, 2);
1281               out1[0] = 0;
1282               out0[3] = 0;
1283               out0[2] = 0;
1284               out0[1] = 0;
1285               out0[0] = 0;
1286               break;
1287     case 23:  out1[3] = amd_bytealign_S (in0[2], in0[1], 1);
1288               out1[2] = amd_bytealign_S (in0[1], in0[0], 1);
1289               out1[1] = amd_bytealign_S (in0[0],      0, 1);
1290               out1[0] = 0;
1291               out0[3] = 0;
1292               out0[2] = 0;
1293               out0[1] = 0;
1294               out0[0] = 0;
1295               break;
1296     case 24:  out1[3] = in0[1];
1297               out1[2] = in0[0];
1298               out1[1] = 0;
1299               out1[0] = 0;
1300               out0[3] = 0;
1301               out0[2] = 0;
1302               out0[1] = 0;
1303               out0[0] = 0;
1304               break;
1305     case 25:  out1[3] = amd_bytealign_S (in0[1], in0[0], 3);
1306               out1[2] = amd_bytealign_S (in0[0],      0, 3);
1307               out1[1] = 0;
1308               out1[0] = 0;
1309               out0[3] = 0;
1310               out0[2] = 0;
1311               out0[1] = 0;
1312               out0[0] = 0;
1313               break;
1314     case 26:  out1[3] = amd_bytealign_S (in0[1], in0[0], 2);
1315               out1[2] = amd_bytealign_S (in0[0],      0, 2);
1316               out1[1] = 0;
1317               out1[0] = 0;
1318               out0[3] = 0;
1319               out0[2] = 0;
1320               out0[1] = 0;
1321               out0[0] = 0;
1322               break;
1323     case 27:  out1[3] = amd_bytealign_S (in0[1], in0[0], 1);
1324               out1[2] = amd_bytealign_S (in0[0],      0, 1);
1325               out1[1] = 0;
1326               out1[0] = 0;
1327               out0[3] = 0;
1328               out0[2] = 0;
1329               out0[1] = 0;
1330               out0[0] = 0;
1331               break;
1332     case 28:  out1[3] = in0[0];
1333               out1[2] = 0;
1334               out1[1] = 0;
1335               out1[0] = 0;
1336               out0[3] = 0;
1337               out0[2] = 0;
1338               out0[1] = 0;
1339               out0[0] = 0;
1340               break;
1341     case 29:  out1[3] = amd_bytealign_S (in0[0],      0, 3);
1342               out1[2] = 0;
1343               out1[1] = 0;
1344               out1[0] = 0;
1345               out0[3] = 0;
1346               out0[2] = 0;
1347               out0[1] = 0;
1348               out0[0] = 0;
1349               break;
1350     case 30:  out1[3] = amd_bytealign_S (in0[0],      0, 2);
1351               out1[2] = 0;
1352               out1[1] = 0;
1353               out1[0] = 0;
1354               out0[3] = 0;
1355               out0[2] = 0;
1356               out0[1] = 0;
1357               out0[0] = 0;
1358               break;
1359     case 31:  out1[3] = amd_bytealign_S (in0[0],      0, 1);
1360               out1[2] = 0;
1361               out1[1] = 0;
1362               out1[0] = 0;
1363               out0[3] = 0;
1364               out0[2] = 0;
1365               out0[1] = 0;
1366               out0[0] = 0;
1367               break;
1368   }
1369   #endif
1370 }
1371
1372 inline void append_block1 (const u32 offset, u32 dst0[4], u32 dst1[4], const u32 src_r0)
1373 {
1374   u32 tmp[2];
1375
1376   switch (offset & 3)
1377   {
1378     case  0:  tmp[0] = src_r0;
1379               tmp[1] = 0;
1380               break;
1381     case  1:  tmp[0] = src_r0 <<  8;
1382               tmp[1] = src_r0 >> 24;
1383               break;
1384     case  2:  tmp[0] = src_r0 << 16;
1385               tmp[1] = src_r0 >> 16;
1386               break;
1387     case  3:  tmp[0] = src_r0 << 24;
1388               tmp[1] = src_r0 >>  8;
1389               break;
1390   }
1391
1392   switch (offset / 4)
1393   {
1394     case  0:  dst0[0] |= tmp[0];
1395               dst0[1]  = tmp[1];
1396               break;
1397     case  1:  dst0[1] |= tmp[0];
1398               dst0[2]  = tmp[1];
1399               break;
1400     case  2:  dst0[2] |= tmp[0];
1401               dst0[3]  = tmp[1];
1402               break;
1403     case  3:  dst0[3] |= tmp[0];
1404               dst1[0]  = tmp[1];
1405               break;
1406     case  4:  dst1[0] |= tmp[0];
1407               dst1[1]  = tmp[1];
1408               break;
1409     case  5:  dst1[1] |= tmp[0];
1410               dst1[2]  = tmp[1];
1411               break;
1412     case  6:  dst1[2] |= tmp[0];
1413               dst1[3]  = tmp[1];
1414               break;
1415     case  7:  dst1[3] |= tmp[0];
1416               break;
1417   }
1418 }
1419
1420 inline void append_block8 (const u32 offset, u32 dst0[4], u32 dst1[4], const u32 src_l0[4], const u32 src_l1[4], const u32 src_r0[4], const u32 src_r1[4])
1421 {
1422 /*
1423   #ifdef IS_NV
1424   switch (offset)
1425   {
1426     case 0:
1427       dst0[0] = src_r0[0];
1428       dst0[1] = src_r0[1];
1429       dst0[2] = src_r0[2];
1430       dst0[3] = src_r0[3];
1431       dst1[0] = src_r1[0];
1432       dst1[1] = src_r1[1];
1433       dst1[2] = src_r1[2];
1434       dst1[3] = src_r1[3];
1435       break;
1436
1437     case 1:
1438       dst0[0] = __byte_perm_S (src_l0[0], src_r0[0], 0x6540);
1439       dst0[1] = __byte_perm_S (src_r0[0], src_r0[1], 0x6543);
1440       dst0[2] = __byte_perm_S (src_r0[1], src_r0[2], 0x6543);
1441       dst0[3] = __byte_perm_S (src_r0[2], src_r0[3], 0x6543);
1442       dst1[0] = __byte_perm_S (src_r0[3], src_r1[0], 0x6543);
1443       dst1[1] = __byte_perm_S (src_r1[0], src_r1[1], 0x6543);
1444       dst1[2] = __byte_perm_S (src_r1[1], src_r1[2], 0x6543);
1445       dst1[3] = __byte_perm_S (src_r1[2], src_r1[3], 0x6543);
1446       break;
1447
1448     case 2:
1449       dst0[0] = __byte_perm_S (src_l0[0], src_r0[0], 0x5410);
1450       dst0[1] = __byte_perm_S (src_r0[0], src_r0[1], 0x5432);
1451       dst0[2] = __byte_perm_S (src_r0[1], src_r0[2], 0x5432);
1452       dst0[3] = __byte_perm_S (src_r0[2], src_r0[3], 0x5432);
1453       dst1[0] = __byte_perm_S (src_r0[3], src_r1[0], 0x5432);
1454       dst1[1] = __byte_perm_S (src_r1[0], src_r1[1], 0x5432);
1455       dst1[2] = __byte_perm_S (src_r1[1], src_r1[2], 0x5432);
1456       dst1[3] = __byte_perm_S (src_r1[2], src_r1[3], 0x5432);
1457       break;
1458
1459     case 3:
1460       dst0[0] = __byte_perm_S (src_l0[0], src_r0[0], 0x4210);
1461       dst0[1] = __byte_perm_S (src_r0[0], src_r0[1], 0x4321);
1462       dst0[2] = __byte_perm_S (src_r0[1], src_r0[2], 0x4321);
1463       dst0[3] = __byte_perm_S (src_r0[2], src_r0[3], 0x4321);
1464       dst1[0] = __byte_perm_S (src_r0[3], src_r1[0], 0x4321);
1465       dst1[1] = __byte_perm_S (src_r1[0], src_r1[1], 0x4321);
1466       dst1[2] = __byte_perm_S (src_r1[1], src_r1[2], 0x4321);
1467       dst1[3] = __byte_perm_S (src_r1[2], src_r1[3], 0x4321);
1468       break;
1469
1470     case 4:
1471       dst0[1] = src_r0[0];
1472       dst0[2] = src_r0[1];
1473       dst0[3] = src_r0[2];
1474       dst1[0] = src_r0[3];
1475       dst1[1] = src_r1[0];
1476       dst1[2] = src_r1[1];
1477       dst1[3] = src_r1[2];
1478       break;
1479
1480     case 5:
1481       dst0[1] = __byte_perm_S (src_l0[1], src_r0[0], 0x6540);
1482       dst0[2] = __byte_perm_S (src_r0[0], src_r0[1], 0x6543);
1483       dst0[3] = __byte_perm_S (src_r0[1], src_r0[2], 0x6543);
1484       dst1[0] = __byte_perm_S (src_r0[2], src_r0[3], 0x6543);
1485       dst1[1] = __byte_perm_S (src_r0[3], src_r1[0], 0x6543);
1486       dst1[2] = __byte_perm_S (src_r1[0], src_r1[1], 0x6543);
1487       dst1[3] = __byte_perm_S (src_r1[1], src_r1[2], 0x6543);
1488       break;
1489
1490     case 6:
1491       dst0[1] = __byte_perm_S (src_l0[1], src_r0[0], 0x5410);
1492       dst0[2] = __byte_perm_S (src_r0[0], src_r0[1], 0x5432);
1493       dst0[3] = __byte_perm_S (src_r0[1], src_r0[2], 0x5432);
1494       dst1[0] = __byte_perm_S (src_r0[2], src_r0[3], 0x5432);
1495       dst1[1] = __byte_perm_S (src_r0[3], src_r1[0], 0x5432);
1496       dst1[2] = __byte_perm_S (src_r1[0], src_r1[1], 0x5432);
1497       dst1[3] = __byte_perm_S (src_r1[1], src_r1[2], 0x5432);
1498       break;
1499
1500     case 7:
1501       dst0[1] = __byte_perm_S (src_l0[1], src_r0[0], 0x4210);
1502       dst0[2] = __byte_perm_S (src_r0[0], src_r0[1], 0x4321);
1503       dst0[3] = __byte_perm_S (src_r0[1], src_r0[2], 0x4321);
1504       dst1[0] = __byte_perm_S (src_r0[2], src_r0[3], 0x4321);
1505       dst1[1] = __byte_perm_S (src_r0[3], src_r1[0], 0x4321);
1506       dst1[2] = __byte_perm_S (src_r1[0], src_r1[1], 0x4321);
1507       dst1[3] = __byte_perm_S (src_r1[1], src_r1[2], 0x4321);
1508       break;
1509
1510     case 8:
1511       dst0[2] = src_r0[0];
1512       dst0[3] = src_r0[1];
1513       dst1[0] = src_r0[2];
1514       dst1[1] = src_r0[3];
1515       dst1[2] = src_r1[0];
1516       dst1[3] = src_r1[1];
1517       break;
1518
1519     case 9:
1520       dst0[2] = __byte_perm_S (src_l0[2], src_r0[0], 0x6540);
1521       dst0[3] = __byte_perm_S (src_r0[0], src_r0[1], 0x6543);
1522       dst1[0] = __byte_perm_S (src_r0[1], src_r0[2], 0x6543);
1523       dst1[1] = __byte_perm_S (src_r0[2], src_r0[3], 0x6543);
1524       dst1[2] = __byte_perm_S (src_r0[3], src_r1[0], 0x6543);
1525       dst1[3] = __byte_perm_S (src_r1[0], src_r1[1], 0x6543);
1526       break;
1527
1528     case 10:
1529       dst0[2] = __byte_perm_S (src_l0[2], src_r0[0], 0x5410);
1530       dst0[3] = __byte_perm_S (src_r0[0], src_r0[1], 0x5432);
1531       dst1[0] = __byte_perm_S (src_r0[1], src_r0[2], 0x5432);
1532       dst1[1] = __byte_perm_S (src_r0[2], src_r0[3], 0x5432);
1533       dst1[2] = __byte_perm_S (src_r0[3], src_r1[0], 0x5432);
1534       dst1[3] = __byte_perm_S (src_r1[0], src_r1[1], 0x5432);
1535       break;
1536
1537     case 11:
1538       dst0[2] = __byte_perm_S (src_l0[2], src_r0[0], 0x4210);
1539       dst0[3] = __byte_perm_S (src_r0[0], src_r0[1], 0x4321);
1540       dst1[0] = __byte_perm_S (src_r0[1], src_r0[2], 0x4321);
1541       dst1[1] = __byte_perm_S (src_r0[2], src_r0[3], 0x4321);
1542       dst1[2] = __byte_perm_S (src_r0[3], src_r1[0], 0x4321);
1543       dst1[3] = __byte_perm_S (src_r1[0], src_r1[1], 0x4321);
1544       break;
1545
1546     case 12:
1547       dst0[3] = src_r0[0];
1548       dst1[0] = src_r0[1];
1549       dst1[1] = src_r0[2];
1550       dst1[2] = src_r0[3];
1551       dst1[3] = src_r1[0];
1552       break;
1553
1554     case 13:
1555       dst0[3] = __byte_perm_S (src_l0[3], src_r0[0], 0x6540);
1556       dst1[0] = __byte_perm_S (src_r0[0], src_r0[1], 0x6543);
1557       dst1[1] = __byte_perm_S (src_r0[1], src_r0[2], 0x6543);
1558       dst1[2] = __byte_perm_S (src_r0[2], src_r0[3], 0x6543);
1559       dst1[3] = __byte_perm_S (src_r0[3], src_r1[0], 0x6543);
1560       break;
1561
1562     case 14:
1563       dst0[3] = __byte_perm_S (src_l0[3], src_r0[0], 0x5410);
1564       dst1[0] = __byte_perm_S (src_r0[0], src_r0[1], 0x5432);
1565       dst1[1] = __byte_perm_S (src_r0[1], src_r0[2], 0x5432);
1566       dst1[2] = __byte_perm_S (src_r0[2], src_r0[3], 0x5432);
1567       dst1[3] = __byte_perm_S (src_r0[3], src_r1[0], 0x5432);
1568       break;
1569
1570     case 15:
1571       dst0[3] = __byte_perm_S (src_l0[3], src_r0[0], 0x4210);
1572       dst1[0] = __byte_perm_S (src_r0[0], src_r0[1], 0x4321);
1573       dst1[1] = __byte_perm_S (src_r0[1], src_r0[2], 0x4321);
1574       dst1[2] = __byte_perm_S (src_r0[2], src_r0[3], 0x4321);
1575       dst1[3] = __byte_perm_S (src_r0[3], src_r1[0], 0x4321);
1576       break;
1577
1578     case 16:
1579       dst1[0] = src_r0[0];
1580       dst1[1] = src_r0[1];
1581       dst1[2] = src_r0[2];
1582       dst1[3] = src_r0[3];
1583       break;
1584
1585     case 17:
1586       dst1[0] = __byte_perm_S (src_l1[0], src_r0[0], 0x6540);
1587       dst1[1] = __byte_perm_S (src_r0[0], src_r0[1], 0x6543);
1588       dst1[2] = __byte_perm_S (src_r0[1], src_r0[2], 0x6543);
1589       dst1[3] = __byte_perm_S (src_r0[2], src_r0[3], 0x6543);
1590       break;
1591
1592     case 18:
1593       dst1[0] = __byte_perm_S (src_l1[0], src_r0[0], 0x5410);
1594       dst1[1] = __byte_perm_S (src_r0[0], src_r0[1], 0x5432);
1595       dst1[2] = __byte_perm_S (src_r0[1], src_r0[2], 0x5432);
1596       dst1[3] = __byte_perm_S (src_r0[2], src_r0[3], 0x5432);
1597       break;
1598
1599     case 19:
1600       dst1[0] = __byte_perm_S (src_l1[0], src_r0[0], 0x4210);
1601       dst1[1] = __byte_perm_S (src_r0[0], src_r0[1], 0x4321);
1602       dst1[2] = __byte_perm_S (src_r0[1], src_r0[2], 0x4321);
1603       dst1[3] = __byte_perm_S (src_r0[2], src_r0[3], 0x4321);
1604       break;
1605
1606     case 20:
1607       dst1[1] = src_r0[0];
1608       dst1[2] = src_r0[1];
1609       dst1[3] = src_r0[2];
1610       break;
1611
1612     case 21:
1613       dst1[1] = __byte_perm_S (src_l1[1], src_r0[0], 0x6540);
1614       dst1[2] = __byte_perm_S (src_r0[0], src_r0[1], 0x6543);
1615       dst1[3] = __byte_perm_S (src_r0[1], src_r0[2], 0x6543);
1616       break;
1617
1618     case 22:
1619       dst1[1] = __byte_perm_S (src_l1[1], src_r0[0], 0x5410);
1620       dst1[2] = __byte_perm_S (src_r0[0], src_r0[1], 0x5432);
1621       dst1[3] = __byte_perm_S (src_r0[1], src_r0[2], 0x5432);
1622       break;
1623
1624     case 23:
1625       dst1[1] = __byte_perm_S (src_l1[1], src_r0[0], 0x4210);
1626       dst1[2] = __byte_perm_S (src_r0[0], src_r0[1], 0x4321);
1627       dst1[3] = __byte_perm_S (src_r0[1], src_r0[2], 0x4321);
1628       break;
1629
1630     case 24:
1631       dst1[2] = src_r0[0];
1632       dst1[3] = src_r0[1];
1633       break;
1634
1635     case 25:
1636       dst1[2] = __byte_perm_S (src_l1[2], src_r0[0], 0x6540);
1637       dst1[3] = __byte_perm_S (src_r0[0], src_r0[1], 0x6543);
1638       break;
1639
1640     case 26:
1641       dst1[2] = __byte_perm_S (src_l1[2], src_r0[0], 0x5410);
1642       dst1[3] = __byte_perm_S (src_r0[0], src_r0[1], 0x5432);
1643       break;
1644
1645     case 27:
1646       dst1[2] = __byte_perm_S (src_l1[2], src_r0[0], 0x4210);
1647       dst1[3] = __byte_perm_S (src_r0[0], src_r0[1], 0x4321);
1648       break;
1649
1650     case 28:
1651       dst1[3] = src_r0[0];
1652       break;
1653
1654     case 29:
1655       dst1[3] = __byte_perm_S (src_l1[3], src_r0[0], 0x6540);
1656       break;
1657
1658     case 30:
1659       dst1[3] = __byte_perm_S (src_l1[3], src_r0[0], 0x5410);
1660       break;
1661
1662     case 31:
1663       dst1[3] = __byte_perm_S (src_l1[3], src_r0[0], 0x4210);
1664       break;
1665   }
1666   #endif
1667
1668   #if defined IS_AMD || defined IS_GENERIC
1669 */
1670   switch (offset)
1671   {
1672     case 31:
1673       dst1[3] = src_l1[3] | src_r0[0] << 24;
1674       break;
1675     case 30:
1676       dst1[3] = src_l1[3] | src_r0[0] << 16;
1677       break;
1678     case 29:
1679       dst1[3] = src_l1[3] | src_r0[0] <<  8;
1680       break;
1681     case 28:
1682       dst1[3] = src_r0[0];
1683       break;
1684     case 27:
1685       dst1[3] = amd_bytealign_S (src_r0[1], src_r0[0], 1);
1686       dst1[2] = src_l1[2] | src_r0[0] << 24;
1687       break;
1688     case 26:
1689       dst1[3] = amd_bytealign_S (src_r0[1], src_r0[0], 2);
1690       dst1[2] = src_l1[2] | src_r0[0] << 16;
1691       break;
1692     case 25:
1693       dst1[3] = amd_bytealign_S (src_r0[1], src_r0[0], 3);
1694       dst1[2] = src_l1[2] | src_r0[0] <<  8;
1695       break;
1696     case 24:
1697       dst1[3] = src_r0[1];
1698       dst1[2] = src_r0[0];
1699       break;
1700     case 23:
1701       dst1[3] = amd_bytealign_S (src_r0[2], src_r0[1], 1);
1702       dst1[2] = amd_bytealign_S (src_r0[1], src_r0[0], 1);
1703       dst1[1] = src_l1[1] | src_r0[0] << 24;
1704       break;
1705     case 22:
1706       dst1[3] = amd_bytealign_S (src_r0[2], src_r0[1], 2);
1707       dst1[2] = amd_bytealign_S (src_r0[1], src_r0[0], 2);
1708       dst1[1] = src_l1[1] | src_r0[0] << 16;
1709       break;
1710     case 21:
1711       dst1[3] = amd_bytealign_S (src_r0[2], src_r0[1], 3);
1712       dst1[2] = amd_bytealign_S (src_r0[1], src_r0[0], 3);
1713       dst1[1] = src_l1[1] | src_r0[0] <<  8;
1714       break;
1715     case 20:
1716       dst1[3] = src_r0[2];
1717       dst1[2] = src_r0[1];
1718       dst1[1] = src_r0[0];
1719       break;
1720     case 19:
1721       dst1[3] = amd_bytealign_S (src_r0[3], src_r0[2], 1);
1722       dst1[2] = amd_bytealign_S (src_r0[2], src_r0[1], 1);
1723       dst1[1] = amd_bytealign_S (src_r0[1], src_r0[0], 1);
1724       dst1[0] = src_l1[0] | src_r0[0] << 24;
1725       break;
1726     case 18:
1727       dst1[3] = amd_bytealign_S (src_r0[3], src_r0[2], 2);
1728       dst1[2] = amd_bytealign_S (src_r0[2], src_r0[1], 2);
1729       dst1[1] = amd_bytealign_S (src_r0[1], src_r0[0], 2);
1730       dst1[0] = src_l1[0] | src_r0[0] << 16;
1731       break;
1732     case 17:
1733       dst1[3] = amd_bytealign_S (src_r0[3], src_r0[2], 3);
1734       dst1[2] = amd_bytealign_S (src_r0[2], src_r0[1], 3);
1735       dst1[1] = amd_bytealign_S (src_r0[1], src_r0[0], 3);
1736       dst1[0] = src_l1[0] | src_r0[0] <<  8;
1737       break;
1738     case 16:
1739       dst1[3] = src_r0[3];
1740       dst1[2] = src_r0[2];
1741       dst1[1] = src_r0[1];
1742       dst1[0] = src_r0[0];
1743       break;
1744     case 15:
1745       dst1[3] = amd_bytealign_S (src_r1[0], src_r0[3], 1);
1746       dst1[2] = amd_bytealign_S (src_r0[3], src_r0[2], 1);
1747       dst1[1] = amd_bytealign_S (src_r0[2], src_r0[1], 1);
1748       dst1[0] = amd_bytealign_S (src_r0[1], src_r0[0], 1);
1749       dst0[3] = src_l0[3] | src_r0[0] << 24;
1750       break;
1751     case 14:
1752       dst1[3] = amd_bytealign_S (src_r1[0], src_r0[3], 2);
1753       dst1[2] = amd_bytealign_S (src_r0[3], src_r0[2], 2);
1754       dst1[1] = amd_bytealign_S (src_r0[2], src_r0[1], 2);
1755       dst1[0] = amd_bytealign_S (src_r0[1], src_r0[0], 2);
1756       dst0[3] = src_l0[3] | src_r0[0] << 16;
1757       break;
1758     case 13:
1759       dst1[3] = amd_bytealign_S (src_r1[0], src_r0[3], 3);
1760       dst1[2] = amd_bytealign_S (src_r0[3], src_r0[2], 3);
1761       dst1[1] = amd_bytealign_S (src_r0[2], src_r0[1], 3);
1762       dst1[0] = amd_bytealign_S (src_r0[1], src_r0[0], 3);
1763       dst0[3] = src_l0[3] | src_r0[0] <<  8;
1764       break;
1765     case 12:
1766       dst1[3] = src_r1[0];
1767       dst1[2] = src_r0[3];
1768       dst1[1] = src_r0[2];
1769       dst1[0] = src_r0[1];
1770       dst0[3] = src_r0[0];
1771       break;
1772     case 11:
1773       dst1[3] = amd_bytealign_S (src_r1[1], src_r1[0], 1);
1774       dst1[2] = amd_bytealign_S (src_r1[0], src_r0[3], 1);
1775       dst1[1] = amd_bytealign_S (src_r0[3], src_r0[2], 1);
1776       dst1[0] = amd_bytealign_S (src_r0[2], src_r0[1], 1);
1777       dst0[3] = amd_bytealign_S (src_r0[1], src_r0[0], 1);
1778       dst0[2] = src_l0[2] | src_r0[0] << 24;
1779       break;
1780     case 10:
1781       dst1[3] = amd_bytealign_S (src_r1[1], src_r1[0], 2);
1782       dst1[2] = amd_bytealign_S (src_r1[0], src_r0[3], 2);
1783       dst1[1] = amd_bytealign_S (src_r0[3], src_r0[2], 2);
1784       dst1[0] = amd_bytealign_S (src_r0[2], src_r0[1], 2);
1785       dst0[3] = amd_bytealign_S (src_r0[1], src_r0[0], 2);
1786       dst0[2] = src_l0[2] | src_r0[0] << 16;
1787       break;
1788     case 9:
1789       dst1[3] = amd_bytealign_S (src_r1[1], src_r1[0], 3);
1790       dst1[2] = amd_bytealign_S (src_r1[0], src_r0[3], 3);
1791       dst1[1] = amd_bytealign_S (src_r0[3], src_r0[2], 3);
1792       dst1[0] = amd_bytealign_S (src_r0[2], src_r0[1], 3);
1793       dst0[3] = amd_bytealign_S (src_r0[1], src_r0[0], 3);
1794       dst0[2] = src_l0[2] | src_r0[0] <<  8;
1795       break;
1796     case 8:
1797       dst1[3] = src_r1[1];
1798       dst1[2] = src_r1[0];
1799       dst1[1] = src_r0[3];
1800       dst1[0] = src_r0[2];
1801       dst0[3] = src_r0[1];
1802       dst0[2] = src_r0[0];
1803       break;
1804     case 7:
1805       dst1[3] = amd_bytealign_S (src_r1[2], src_r1[1], 1);
1806       dst1[2] = amd_bytealign_S (src_r1[1], src_r1[0], 1);
1807       dst1[1] = amd_bytealign_S (src_r1[0], src_r0[3], 1);
1808       dst1[0] = amd_bytealign_S (src_r0[3], src_r0[2], 1);
1809       dst0[3] = amd_bytealign_S (src_r0[2], src_r0[1], 1);
1810       dst0[2] = amd_bytealign_S (src_r0[1], src_r0[0], 1);
1811       dst0[1] = src_l0[1] | src_r0[0] << 24;
1812       break;
1813     case 6:
1814       dst1[3] = amd_bytealign_S (src_r1[2], src_r1[1], 2);
1815       dst1[2] = amd_bytealign_S (src_r1[1], src_r1[0], 2);
1816       dst1[1] = amd_bytealign_S (src_r1[0], src_r0[3], 2);
1817       dst1[0] = amd_bytealign_S (src_r0[3], src_r0[2], 2);
1818       dst0[3] = amd_bytealign_S (src_r0[2], src_r0[1], 2);
1819       dst0[2] = amd_bytealign_S (src_r0[1], src_r0[0], 2);
1820       dst0[1] = src_l0[1] | src_r0[0] << 16;
1821       break;
1822     case 5:
1823       dst1[3] = amd_bytealign_S (src_r1[2], src_r1[1], 3);
1824       dst1[2] = amd_bytealign_S (src_r1[1], src_r1[0], 3);
1825       dst1[1] = amd_bytealign_S (src_r1[0], src_r0[3], 3);
1826       dst1[0] = amd_bytealign_S (src_r0[3], src_r0[2], 3);
1827       dst0[3] = amd_bytealign_S (src_r0[2], src_r0[1], 3);
1828       dst0[2] = amd_bytealign_S (src_r0[1], src_r0[0], 3);
1829       dst0[1] = src_l0[1] | src_r0[0] <<  8;
1830       break;
1831     case 4:
1832       dst1[3] = src_r1[2];
1833       dst1[2] = src_r1[1];
1834       dst1[1] = src_r1[0];
1835       dst1[0] = src_r0[3];
1836       dst0[3] = src_r0[2];
1837       dst0[2] = src_r0[1];
1838       dst0[1] = src_r0[0];
1839       break;
1840     case 3:
1841       dst1[3] = amd_bytealign_S (src_r1[3], src_r1[2], 1);
1842       dst1[2] = amd_bytealign_S (src_r1[2], src_r1[1], 1);
1843       dst1[1] = amd_bytealign_S (src_r1[1], src_r1[0], 1);
1844       dst1[0] = amd_bytealign_S (src_r1[0], src_r0[3], 1);
1845       dst0[3] = amd_bytealign_S (src_r0[3], src_r0[2], 1);
1846       dst0[2] = amd_bytealign_S (src_r0[2], src_r0[1], 1);
1847       dst0[1] = amd_bytealign_S (src_r0[1], src_r0[0], 1);
1848       dst0[0] = src_l0[0] | src_r0[0] << 24;
1849       break;
1850     case 2:
1851       dst1[3] = amd_bytealign_S (src_r1[3], src_r1[2], 2);
1852       dst1[2] = amd_bytealign_S (src_r1[2], src_r1[1], 2);
1853       dst1[1] = amd_bytealign_S (src_r1[1], src_r1[0], 2);
1854       dst1[0] = amd_bytealign_S (src_r1[0], src_r0[3], 2);
1855       dst0[3] = amd_bytealign_S (src_r0[3], src_r0[2], 2);
1856       dst0[2] = amd_bytealign_S (src_r0[2], src_r0[1], 2);
1857       dst0[1] = amd_bytealign_S (src_r0[1], src_r0[0], 2);
1858       dst0[0] = src_l0[0] | src_r0[0] << 16;
1859       break;
1860     case 1:
1861       dst1[3] = amd_bytealign_S (src_r1[3], src_r1[2], 3);
1862       dst1[2] = amd_bytealign_S (src_r1[2], src_r1[1], 3);
1863       dst1[1] = amd_bytealign_S (src_r1[1], src_r1[0], 3);
1864       dst1[0] = amd_bytealign_S (src_r1[0], src_r0[3], 3);
1865       dst0[3] = amd_bytealign_S (src_r0[3], src_r0[2], 3);
1866       dst0[2] = amd_bytealign_S (src_r0[2], src_r0[1], 3);
1867       dst0[1] = amd_bytealign_S (src_r0[1], src_r0[0], 3);
1868       dst0[0] = src_l0[0] | src_r0[0] <<  8;
1869       break;
1870     case 0:
1871       dst1[3] = src_r1[3];
1872       dst1[2] = src_r1[2];
1873       dst1[1] = src_r1[1];
1874       dst1[0] = src_r1[0];
1875       dst0[3] = src_r0[3];
1876       dst0[2] = src_r0[2];
1877       dst0[1] = src_r0[1];
1878       dst0[0] = src_r0[0];
1879       break;
1880   }
1881 //  #endif
1882 }
1883
1884 inline void reverse_block (u32 in0[4], u32 in1[4], u32 out0[4], u32 out1[4], const u32 len)
1885 {
1886   rshift_block_N (in0, in1, out0, out1, 32 - len);
1887
1888   u32 tib40[4];
1889   u32 tib41[4];
1890
1891   tib40[0] = out1[3];
1892   tib40[1] = out1[2];
1893   tib40[2] = out1[1];
1894   tib40[3] = out1[0];
1895   tib41[0] = out0[3];
1896   tib41[1] = out0[2];
1897   tib41[2] = out0[1];
1898   tib41[3] = out0[0];
1899
1900   out0[0] = swap32_S (tib40[0]);
1901   out0[1] = swap32_S (tib40[1]);
1902   out0[2] = swap32_S (tib40[2]);
1903   out0[3] = swap32_S (tib40[3]);
1904   out1[0] = swap32_S (tib41[0]);
1905   out1[1] = swap32_S (tib41[1]);
1906   out1[2] = swap32_S (tib41[2]);
1907   out1[3] = swap32_S (tib41[3]);
1908 }
1909
1910 inline u32 rule_op_mangle_lrest (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1911 {
1912   buf0[0] |= (generate_cmask (buf0[0]));
1913   buf0[1] |= (generate_cmask (buf0[1]));
1914   buf0[2] |= (generate_cmask (buf0[2]));
1915   buf0[3] |= (generate_cmask (buf0[3]));
1916   buf1[0] |= (generate_cmask (buf1[0]));
1917   buf1[1] |= (generate_cmask (buf1[1]));
1918   buf1[2] |= (generate_cmask (buf1[2]));
1919   buf1[3] |= (generate_cmask (buf1[3]));
1920
1921   return in_len;
1922 }
1923
1924 inline u32 rule_op_mangle_urest (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1925 {
1926   buf0[0] &= ~(generate_cmask (buf0[0]));
1927   buf0[1] &= ~(generate_cmask (buf0[1]));
1928   buf0[2] &= ~(generate_cmask (buf0[2]));
1929   buf0[3] &= ~(generate_cmask (buf0[3]));
1930   buf1[0] &= ~(generate_cmask (buf1[0]));
1931   buf1[1] &= ~(generate_cmask (buf1[1]));
1932   buf1[2] &= ~(generate_cmask (buf1[2]));
1933   buf1[3] &= ~(generate_cmask (buf1[3]));
1934
1935   return in_len;
1936 }
1937
1938 inline u32 rule_op_mangle_lrest_ufirst (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1939 {
1940   rule_op_mangle_lrest (p0, p1, buf0, buf1, in_len);
1941
1942   buf0[0] &= ~(0x00000020 & generate_cmask (buf0[0]));
1943
1944   return in_len;
1945 }
1946
1947 inline u32 rule_op_mangle_urest_lfirst (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1948 {
1949   rule_op_mangle_urest (p0, p1, buf0, buf1, in_len);
1950
1951   buf0[0] |= (0x00000020 & generate_cmask (buf0[0]));
1952
1953   return in_len;
1954 }
1955
1956 inline u32 rule_op_mangle_trest (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1957 {
1958   buf0[0] ^= (generate_cmask (buf0[0]));
1959   buf0[1] ^= (generate_cmask (buf0[1]));
1960   buf0[2] ^= (generate_cmask (buf0[2]));
1961   buf0[3] ^= (generate_cmask (buf0[3]));
1962   buf1[0] ^= (generate_cmask (buf1[0]));
1963   buf1[1] ^= (generate_cmask (buf1[1]));
1964   buf1[2] ^= (generate_cmask (buf1[2]));
1965   buf1[3] ^= (generate_cmask (buf1[3]));
1966
1967   return in_len;
1968 }
1969
1970 inline u32 rule_op_mangle_toggle_at (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1971 {
1972   if (p0 >= in_len) return (in_len);
1973
1974   const u32 tmp = 0x20u << ((p0 & 3) * 8);
1975
1976   switch (p0 / 4)
1977   {
1978     case  0:  buf0[0] ^= (tmp & generate_cmask (buf0[0])); break;
1979     case  1:  buf0[1] ^= (tmp & generate_cmask (buf0[1])); break;
1980     case  2:  buf0[2] ^= (tmp & generate_cmask (buf0[2])); break;
1981     case  3:  buf0[3] ^= (tmp & generate_cmask (buf0[3])); break;
1982     case  4:  buf1[0] ^= (tmp & generate_cmask (buf1[0])); break;
1983     case  5:  buf1[1] ^= (tmp & generate_cmask (buf1[1])); break;
1984     case  6:  buf1[2] ^= (tmp & generate_cmask (buf1[2])); break;
1985     case  7:  buf1[3] ^= (tmp & generate_cmask (buf1[3])); break;
1986   }
1987
1988   return in_len;
1989 }
1990
1991 inline u32 rule_op_mangle_reverse (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1992 {
1993   reverse_block (buf0, buf1, buf0, buf1, in_len);
1994
1995   return in_len;
1996 }
1997
1998 inline u32 rule_op_mangle_dupeword (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1999 {
2000   if ((in_len + in_len) >= 32) return (in_len);
2001
2002   u32 out_len = in_len;
2003
2004   append_block8 (out_len, buf0, buf1, buf0, buf1, buf0, buf1);
2005
2006   out_len += in_len;
2007
2008   return out_len;
2009 }
2010
2011 inline u32 rule_op_mangle_dupeword_times (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2012 {
2013   if (((in_len * p0) + in_len) >= 32) return (in_len);
2014
2015   u32 out_len = in_len;
2016
2017   u32 tib40[4];
2018   u32 tib41[4];
2019
2020   tib40[0] = buf0[0];
2021   tib40[1] = buf0[1];
2022   tib40[2] = buf0[2];
2023   tib40[3] = buf0[3];
2024   tib41[0] = buf1[0];
2025   tib41[1] = buf1[1];
2026   tib41[2] = buf1[2];
2027   tib41[3] = buf1[3];
2028
2029   for (u32 i = 0; i < p0; i++)
2030   {
2031     append_block8 (out_len, buf0, buf1, buf0, buf1, tib40, tib41);
2032
2033     out_len += in_len;
2034   }
2035
2036   return out_len;
2037 }
2038
2039 inline u32 rule_op_mangle_reflect (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2040 {
2041   if ((in_len + in_len) >= 32) return (in_len);
2042
2043   u32 out_len = in_len;
2044
2045   u32 tib40[4];
2046   u32 tib41[4];
2047
2048   reverse_block (buf0, buf1, tib40, tib41, out_len);
2049
2050   append_block8 (out_len, buf0, buf1, buf0, buf1, tib40, tib41);
2051
2052   out_len += in_len;
2053
2054   return out_len;
2055 }
2056
2057 inline u32 rule_op_mangle_append (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2058 {
2059   if ((in_len + 1) >= 32) return (in_len);
2060
2061   u32 out_len = in_len;
2062
2063   append_block1 (out_len, buf0, buf1, p0);
2064
2065   out_len++;
2066
2067   return out_len;
2068 }
2069
2070 inline u32 rule_op_mangle_prepend (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2071 {
2072   if ((in_len + 1) >= 32) return (in_len);
2073
2074   u32 out_len = in_len;
2075
2076   rshift_block (buf0, buf1, buf0, buf1);
2077
2078   buf0[0] = buf0[0] | p0;
2079
2080   out_len++;
2081
2082   return out_len;
2083 }
2084
2085 inline u32 rule_op_mangle_rotate_left (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2086 {
2087   if (in_len == 0) return (in_len);
2088
2089   const u32 in_len1 = in_len - 1;
2090
2091   const u32 sh = (in_len1 & 3) * 8;
2092
2093   const u32 tmp = (buf0[0] & 0xff) << sh;
2094
2095   lshift_block (buf0, buf1, buf0, buf1);
2096
2097   switch (in_len1 / 4)
2098   {
2099     case  0:  buf0[0] |= tmp; break;
2100     case  1:  buf0[1] |= tmp; break;
2101     case  2:  buf0[2] |= tmp; break;
2102     case  3:  buf0[3] |= tmp; break;
2103     case  4:  buf1[0] |= tmp; break;
2104     case  5:  buf1[1] |= tmp; break;
2105     case  6:  buf1[2] |= tmp; break;
2106     case  7:  buf1[3] |= tmp; break;
2107   }
2108
2109   return in_len;
2110 }
2111
2112 inline u32 rule_op_mangle_rotate_right (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2113 {
2114   if (in_len == 0) return (in_len);
2115
2116   const u32 in_len1 = in_len - 1;
2117
2118   const u32 sh = (in_len1 & 3) * 8;
2119
2120   u32 tmp = 0;
2121
2122   switch (in_len1 / 4)
2123   {
2124     case  0:  tmp = (buf0[0] >> sh) & 0xff; break;
2125     case  1:  tmp = (buf0[1] >> sh) & 0xff; break;
2126     case  2:  tmp = (buf0[2] >> sh) & 0xff; break;
2127     case  3:  tmp = (buf0[3] >> sh) & 0xff; break;
2128     case  4:  tmp = (buf1[0] >> sh) & 0xff; break;
2129     case  5:  tmp = (buf1[1] >> sh) & 0xff; break;
2130     case  6:  tmp = (buf1[2] >> sh) & 0xff; break;
2131     case  7:  tmp = (buf1[3] >> sh) & 0xff; break;
2132   }
2133
2134   rshift_block (buf0, buf1, buf0, buf1);
2135
2136   buf0[0] |= tmp;
2137
2138   truncate_right (buf0, buf1, in_len);
2139
2140   return in_len;
2141 }
2142
2143 inline u32 rule_op_mangle_delete_first (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2144 {
2145   if (in_len == 0) return (in_len);
2146
2147   const u32 in_len1 = in_len - 1;
2148
2149   lshift_block (buf0, buf1, buf0, buf1);
2150
2151   return in_len1;
2152 }
2153
2154 inline u32 rule_op_mangle_delete_last (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2155 {
2156   if (in_len == 0) return (in_len);
2157
2158   const u32 in_len1 = in_len - 1;
2159
2160   const u32 tmp = (1 << ((in_len1 & 3) * 8)) - 1;
2161
2162   switch (in_len1 / 4)
2163   {
2164     case  0:  buf0[0] &= tmp; break;
2165     case  1:  buf0[1] &= tmp; break;
2166     case  2:  buf0[2] &= tmp; break;
2167     case  3:  buf0[3] &= tmp; break;
2168     case  4:  buf1[0] &= tmp; break;
2169     case  5:  buf1[1] &= tmp; break;
2170     case  6:  buf1[2] &= tmp; break;
2171     case  7:  buf1[3] &= tmp; break;
2172   }
2173
2174   return in_len1;
2175 }
2176
2177 inline u32 rule_op_mangle_delete_at (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2178 {
2179   if (p0 >= in_len) return (in_len);
2180
2181   u32 out_len = in_len;
2182
2183   u32 tib40[4];
2184   u32 tib41[4];
2185
2186   lshift_block (buf0, buf1, tib40, tib41);
2187
2188   const u32 ml = (1 << ((p0 & 3) * 8)) - 1;
2189   const u32 mr = ~ml;
2190
2191   switch (p0 / 4)
2192   {
2193     case  0:  buf0[0] =  (buf0[0] & ml)
2194                       | (tib40[0] & mr);
2195               buf0[1] =  tib40[1];
2196               buf0[2] =  tib40[2];
2197               buf0[3] =  tib40[3];
2198               buf1[0] =  tib41[0];
2199               buf1[1] =  tib41[1];
2200               buf1[2] =  tib41[2];
2201               buf1[3] =  tib41[3];
2202               break;
2203     case  1:  buf0[1] =  (buf0[1] & ml)
2204                       | (tib40[1] & mr);
2205               buf0[2] =  tib40[2];
2206               buf0[3] =  tib40[3];
2207               buf1[0] =  tib41[0];
2208               buf1[1] =  tib41[1];
2209               buf1[2] =  tib41[2];
2210               buf1[3] =  tib41[3];
2211               break;
2212     case  2:  buf0[2] =  (buf0[2] & ml)
2213                       | (tib40[2] & mr);
2214               buf0[3] =  tib40[3];
2215               buf1[0] =  tib41[0];
2216               buf1[1] =  tib41[1];
2217               buf1[2] =  tib41[2];
2218               buf1[3] =  tib41[3];
2219               break;
2220     case  3:  buf0[3] =  (buf0[3] & ml)
2221                       | (tib40[3] & mr);
2222               buf1[0] =  tib41[0];
2223               buf1[1] =  tib41[1];
2224               buf1[2] =  tib41[2];
2225               buf1[3] =  tib41[3];
2226               break;
2227     case  4:  buf1[0] =  (buf1[0] & ml)
2228                       | (tib41[0] & mr);
2229               buf1[1] =  tib41[1];
2230               buf1[2] =  tib41[2];
2231               buf1[3] =  tib41[3];
2232               break;
2233     case  5:  buf1[1] =  (buf1[1] & ml)
2234                       | (tib41[1] & mr);
2235               buf1[2] =  tib41[2];
2236               buf1[3] =  tib41[3];
2237               break;
2238     case  6:  buf1[2] =  (buf1[2] & ml)
2239                       | (tib41[2] & mr);
2240               buf1[3] =  tib41[3];
2241               break;
2242     case  7:  buf1[3] =  (buf1[3] & ml)
2243                       | (tib41[3] & mr);
2244               break;
2245   }
2246
2247   out_len--;
2248
2249   return out_len;
2250 }
2251
2252 inline u32 rule_op_mangle_extract (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2253 {
2254   if (p0 >= in_len) return (in_len);
2255
2256   if ((p0 + p1) > in_len) return (in_len);
2257
2258   u32 out_len = p1;
2259
2260   lshift_block_N (buf0, buf1, buf0, buf1, p0);
2261
2262   truncate_right (buf0, buf1, out_len);
2263
2264   return out_len;
2265 }
2266
2267 inline u32 rule_op_mangle_omit (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2268 {
2269   if (p0 >= in_len) return (in_len);
2270
2271   if ((p0 + p1) > in_len) return (in_len);
2272
2273   u32 out_len = in_len;
2274
2275   u32 tib40[4];
2276   u32 tib41[4];
2277
2278   tib40[0] = 0;
2279   tib40[1] = 0;
2280   tib40[2] = 0;
2281   tib40[3] = 0;
2282   tib41[0] = 0;
2283   tib41[1] = 0;
2284   tib41[2] = 0;
2285   tib41[3] = 0;
2286
2287   lshift_block_N (buf0, buf1, tib40, tib41, p1);
2288
2289   const u32 ml = (1 << ((p0 & 3) * 8)) - 1;
2290   const u32 mr = ~ml;
2291
2292   switch (p0 / 4)
2293   {
2294     case  0:  buf0[0] =  (buf0[0] & ml)
2295                       | (tib40[0] & mr);
2296               buf0[1] =  tib40[1];
2297               buf0[2] =  tib40[2];
2298               buf0[3] =  tib40[3];
2299               buf1[0] =  tib41[0];
2300               buf1[1] =  tib41[1];
2301               buf1[2] =  tib41[2];
2302               buf1[3] =  tib41[3];
2303               break;
2304     case  1:  buf0[1] =  (buf0[1] & ml)
2305                       | (tib40[1] & mr);
2306               buf0[2] =  tib40[2];
2307               buf0[3] =  tib40[3];
2308               buf1[0] =  tib41[0];
2309               buf1[1] =  tib41[1];
2310               buf1[2] =  tib41[2];
2311               buf1[3] =  tib41[3];
2312               break;
2313     case  2:  buf0[2] =  (buf0[2] & ml)
2314                       | (tib40[2] & mr);
2315               buf0[3] =  tib40[3];
2316               buf1[0] =  tib41[0];
2317               buf1[1] =  tib41[1];
2318               buf1[2] =  tib41[2];
2319               buf1[3] =  tib41[3];
2320               break;
2321     case  3:  buf0[3] =  (buf0[3] & ml)
2322                       | (tib40[3] & mr);
2323               buf1[0] =  tib41[0];
2324               buf1[1] =  tib41[1];
2325               buf1[2] =  tib41[2];
2326               buf1[3] =  tib41[3];
2327               break;
2328     case  4:  buf1[0] =  (buf1[0] & ml)
2329                       | (tib41[0] & mr);
2330               buf1[1] =  tib41[1];
2331               buf1[2] =  tib41[2];
2332               buf1[3] =  tib41[3];
2333               break;
2334     case  5:  buf1[1] =  (buf1[1] & ml)
2335                       | (tib41[1] & mr);
2336               buf1[2] =  tib41[2];
2337               buf1[3] =  tib41[3];
2338               break;
2339     case  6:  buf1[2] =  (buf1[2] & ml)
2340                       | (tib41[2] & mr);
2341               buf1[3] =  tib41[3];
2342               break;
2343     case  7:  buf1[3] =  (buf1[3] & ml)
2344                       | (tib41[3] & mr);
2345               break;
2346   }
2347
2348   out_len -= p1;
2349
2350   return out_len;
2351 }
2352
2353 inline u32 rule_op_mangle_insert (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2354 {
2355   if (p0 > in_len) return (in_len);
2356
2357   if ((in_len + 1) >= 32) return (in_len);
2358
2359   u32 out_len = in_len;
2360
2361   u32 tib40[4];
2362   u32 tib41[4];
2363
2364   rshift_block (buf0, buf1, tib40, tib41);
2365
2366   const u32 p1n = p1 << ((p0 & 3) * 8);
2367
2368   const u32 ml = (1 << ((p0 & 3) * 8)) - 1;
2369
2370   const u32 mr = 0xffffff00 << ((p0 & 3) * 8);
2371
2372   switch (p0 / 4)
2373   {
2374     case  0:  buf0[0] =  (buf0[0] & ml) | p1n | (tib40[0] & mr);
2375               buf0[1] =  tib40[1];
2376               buf0[2] =  tib40[2];
2377               buf0[3] =  tib40[3];
2378               buf1[0] =  tib41[0];
2379               buf1[1] =  tib41[1];
2380               buf1[2] =  tib41[2];
2381               buf1[3] =  tib41[3];
2382               break;
2383     case  1:  buf0[1] =  (buf0[1] & ml) | p1n | (tib40[1] & mr);
2384               buf0[2] =  tib40[2];
2385               buf0[3] =  tib40[3];
2386               buf1[0] =  tib41[0];
2387               buf1[1] =  tib41[1];
2388               buf1[2] =  tib41[2];
2389               buf1[3] =  tib41[3];
2390               break;
2391     case  2:  buf0[2] =  (buf0[2] & ml) | p1n | (tib40[2] & mr);
2392               buf0[3] =  tib40[3];
2393               buf1[0] =  tib41[0];
2394               buf1[1] =  tib41[1];
2395               buf1[2] =  tib41[2];
2396               buf1[3] =  tib41[3];
2397               break;
2398     case  3:  buf0[3] =  (buf0[3] & ml) | p1n | (tib40[3] & mr);
2399               buf1[0] =  tib41[0];
2400               buf1[1] =  tib41[1];
2401               buf1[2] =  tib41[2];
2402               buf1[3] =  tib41[3];
2403               break;
2404     case  4:  buf1[0] =  (buf1[0] & ml) | p1n | (tib41[0] & mr);
2405               buf1[1] =  tib41[1];
2406               buf1[2] =  tib41[2];
2407               buf1[3] =  tib41[3];
2408               break;
2409     case  5:  buf1[1] =  (buf1[1] & ml) | p1n | (tib41[1] & mr);
2410               buf1[2] =  tib41[2];
2411               buf1[3] =  tib41[3];
2412               break;
2413     case  6:  buf1[2] =  (buf1[2] & ml) | p1n | (tib41[2] & mr);
2414               buf1[3] =  tib41[3];
2415               break;
2416     case  7:  buf1[3] =  (buf1[3] & ml) | p1n | (tib41[3] & mr);
2417               break;
2418   }
2419
2420   out_len++;
2421
2422   return out_len;
2423 }
2424
2425 inline u32 rule_op_mangle_overstrike (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2426 {
2427   if (p0 >= in_len) return (in_len);
2428
2429   const u32 p1n = p1 << ((p0 & 3) * 8);
2430
2431   const u32 m = ~(0xffu << ((p0 & 3) * 8));
2432
2433   switch (p0 / 4)
2434   {
2435     case  0: buf0[0] = (buf0[0] & m) | p1n; break;
2436     case  1: buf0[1] = (buf0[1] & m) | p1n; break;
2437     case  2: buf0[2] = (buf0[2] & m) | p1n; break;
2438     case  3: buf0[3] = (buf0[3] & m) | p1n; break;
2439     case  4: buf1[0] = (buf1[0] & m) | p1n; break;
2440     case  5: buf1[1] = (buf1[1] & m) | p1n; break;
2441     case  6: buf1[2] = (buf1[2] & m) | p1n; break;
2442     case  7: buf1[3] = (buf1[3] & m) | p1n; break;
2443   }
2444
2445   return in_len;
2446 }
2447
2448 inline u32 rule_op_mangle_truncate_at (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2449 {
2450   if (p0 >= in_len) return (in_len);
2451
2452   truncate_right (buf0, buf1, p0);
2453
2454   return p0;
2455 }
2456
2457 inline u32 rule_op_mangle_replace (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2458 {
2459   #ifdef IS_NV
2460   for (u32 i = 0; i < in_len; i++)
2461   {
2462     switch (i)
2463     {
2464       case  0:  if ((__byte_perm_S (buf0[0], 0, 0x6540)) == p0) buf0[0] = __byte_perm_S (p1, buf0[0], 0x7650);
2465                 break;
2466       case  1:  if ((__byte_perm_S (buf0[0], 0, 0x6541)) == p0) buf0[0] = __byte_perm_S (p1, buf0[0], 0x7604);
2467                 break;
2468       case  2:  if ((__byte_perm_S (buf0[0], 0, 0x6542)) == p0) buf0[0] = __byte_perm_S (p1, buf0[0], 0x7054);
2469                 break;
2470       case  3:  if ((__byte_perm_S (buf0[0], 0, 0x6543)) == p0) buf0[0] = __byte_perm_S (p1, buf0[0], 0x0654);
2471                 break;
2472       case  4:  if ((__byte_perm_S (buf0[1], 0, 0x6540)) == p0) buf0[1] = __byte_perm_S (p1, buf0[1], 0x7650);
2473                 break;
2474       case  5:  if ((__byte_perm_S (buf0[1], 0, 0x6541)) == p0) buf0[1] = __byte_perm_S (p1, buf0[1], 0x7604);
2475                 break;
2476       case  6:  if ((__byte_perm_S (buf0[1], 0, 0x6542)) == p0) buf0[1] = __byte_perm_S (p1, buf0[1], 0x7054);
2477                 break;
2478       case  7:  if ((__byte_perm_S (buf0[1], 0, 0x6543)) == p0) buf0[1] = __byte_perm_S (p1, buf0[1], 0x0654);
2479                 break;
2480       case  8:  if ((__byte_perm_S (buf0[2], 0, 0x6540)) == p0) buf0[2] = __byte_perm_S (p1, buf0[2], 0x7650);
2481                 break;
2482       case  9:  if ((__byte_perm_S (buf0[2], 0, 0x6541)) == p0) buf0[2] = __byte_perm_S (p1, buf0[2], 0x7604);
2483                 break;
2484       case 10:  if ((__byte_perm_S (buf0[2], 0, 0x6542)) == p0) buf0[2] = __byte_perm_S (p1, buf0[2], 0x7054);
2485                 break;
2486       case 11:  if ((__byte_perm_S (buf0[2], 0, 0x6543)) == p0) buf0[2] = __byte_perm_S (p1, buf0[2], 0x0654);
2487                 break;
2488       case 12:  if ((__byte_perm_S (buf0[3], 0, 0x6540)) == p0) buf0[3] = __byte_perm_S (p1, buf0[3], 0x7650);
2489                 break;
2490       case 13:  if ((__byte_perm_S (buf0[3], 0, 0x6541)) == p0) buf0[3] = __byte_perm_S (p1, buf0[3], 0x7604);
2491                 break;
2492       case 14:  if ((__byte_perm_S (buf0[3], 0, 0x6542)) == p0) buf0[3] = __byte_perm_S (p1, buf0[3], 0x7054);
2493                 break;
2494       case 15:  if ((__byte_perm_S (buf0[3], 0, 0x6543)) == p0) buf0[3] = __byte_perm_S (p1, buf0[3], 0x0654);
2495                 break;
2496       case 16:  if ((__byte_perm_S (buf1[0], 0, 0x6540)) == p0) buf1[0] = __byte_perm_S (p1, buf1[0], 0x7650);
2497                 break;
2498       case 17:  if ((__byte_perm_S (buf1[0], 0, 0x6541)) == p0) buf1[0] = __byte_perm_S (p1, buf1[0], 0x7604);
2499                 break;
2500       case 18:  if ((__byte_perm_S (buf1[0], 0, 0x6542)) == p0) buf1[0] = __byte_perm_S (p1, buf1[0], 0x7054);
2501                 break;
2502       case 19:  if ((__byte_perm_S (buf1[0], 0, 0x6543)) == p0) buf1[0] = __byte_perm_S (p1, buf1[0], 0x0654);
2503                 break;
2504       case 20:  if ((__byte_perm_S (buf1[1], 0, 0x6540)) == p0) buf1[1] = __byte_perm_S (p1, buf1[1], 0x7650);
2505                 break;
2506       case 21:  if ((__byte_perm_S (buf1[1], 0, 0x6541)) == p0) buf1[1] = __byte_perm_S (p1, buf1[1], 0x7604);
2507                 break;
2508       case 22:  if ((__byte_perm_S (buf1[1], 0, 0x6542)) == p0) buf1[1] = __byte_perm_S (p1, buf1[1], 0x7054);
2509                 break;
2510       case 23:  if ((__byte_perm_S (buf1[1], 0, 0x6543)) == p0) buf1[1] = __byte_perm_S (p1, buf1[1], 0x0654);
2511                 break;
2512       case 24:  if ((__byte_perm_S (buf1[2], 0, 0x6540)) == p0) buf1[2] = __byte_perm_S (p1, buf1[2], 0x7650);
2513                 break;
2514       case 25:  if ((__byte_perm_S (buf1[2], 0, 0x6541)) == p0) buf1[2] = __byte_perm_S (p1, buf1[2], 0x7604);
2515                 break;
2516       case 26:  if ((__byte_perm_S (buf1[2], 0, 0x6542)) == p0) buf1[2] = __byte_perm_S (p1, buf1[2], 0x7054);
2517                 break;
2518       case 27:  if ((__byte_perm_S (buf1[2], 0, 0x6543)) == p0) buf1[2] = __byte_perm_S (p1, buf1[2], 0x0654);
2519                 break;
2520       case 28:  if ((__byte_perm_S (buf1[3], 0, 0x6540)) == p0) buf1[3] = __byte_perm_S (p1, buf1[3], 0x7650);
2521                 break;
2522       case 29:  if ((__byte_perm_S (buf1[3], 0, 0x6541)) == p0) buf1[3] = __byte_perm_S (p1, buf1[3], 0x7604);
2523                 break;
2524       case 30:  if ((__byte_perm_S (buf1[3], 0, 0x6542)) == p0) buf1[3] = __byte_perm_S (p1, buf1[3], 0x7054);
2525                 break;
2526       case 31:  if ((__byte_perm_S (buf1[3], 0, 0x6543)) == p0) buf1[3] = __byte_perm_S (p1, buf1[3], 0x0654);
2527                 break;
2528     }
2529   }
2530   #endif
2531
2532   #if defined IS_AMD || defined IS_GENERIC
2533   const uchar4 tmp0 = (uchar4) (p0);
2534   const uchar4 tmp1 = (uchar4) (p1);
2535
2536   uchar4 tmp;
2537
2538   tmp = as_uchar4 (buf0[0]); tmp = select (tmp, tmp1, tmp == tmp0); buf0[0] = as_uint (tmp);
2539   tmp = as_uchar4 (buf0[1]); tmp = select (tmp, tmp1, tmp == tmp0); buf0[1] = as_uint (tmp);
2540   tmp = as_uchar4 (buf0[2]); tmp = select (tmp, tmp1, tmp == tmp0); buf0[2] = as_uint (tmp);
2541   tmp = as_uchar4 (buf0[3]); tmp = select (tmp, tmp1, tmp == tmp0); buf0[3] = as_uint (tmp);
2542   tmp = as_uchar4 (buf1[0]); tmp = select (tmp, tmp1, tmp == tmp0); buf1[0] = as_uint (tmp);
2543   tmp = as_uchar4 (buf1[1]); tmp = select (tmp, tmp1, tmp == tmp0); buf1[1] = as_uint (tmp);
2544   tmp = as_uchar4 (buf1[2]); tmp = select (tmp, tmp1, tmp == tmp0); buf1[2] = as_uint (tmp);
2545   tmp = as_uchar4 (buf1[3]); tmp = select (tmp, tmp1, tmp == tmp0); buf1[3] = as_uint (tmp);
2546   #endif
2547
2548   return in_len;
2549 }
2550
2551 inline u32 rule_op_mangle_purgechar (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2552 {
2553   // TODO
2554   return in_len;
2555 }
2556
2557 inline u32 rule_op_mangle_togglecase_rec (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2558 {
2559   // TODO
2560   return in_len;
2561 }
2562
2563 inline u32 rule_op_mangle_dupechar_first (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2564 {
2565   if ( in_len       ==  0) return (in_len);
2566   if ((in_len + p0) >= 32) return (in_len);
2567
2568   u32 out_len = in_len;
2569
2570   const u32 tmp = buf0[0] & 0xFF;
2571
2572   rshift_block_N (buf0, buf1, buf0, buf1, p0);
2573
2574   #ifdef IS_NV
2575   switch (p0)
2576   {
2577     case  1:  buf0[0] |= tmp;
2578               break;
2579     case  2:  buf0[0] |= __byte_perm_S (tmp, 0, 0x5400);
2580               break;
2581     case  3:  buf0[0] |= __byte_perm_S (tmp, 0, 0x4000);
2582               break;
2583     case  4:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2584               break;
2585     case  5:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2586               buf0[1] |= tmp;
2587               break;
2588     case  6:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2589               buf0[1] |= __byte_perm_S (tmp, 0, 0x5400);
2590               break;
2591     case  7:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2592               buf0[1] |= __byte_perm_S (tmp, 0, 0x4000);
2593               break;
2594     case  8:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2595               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2596               break;
2597     case  9:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2598               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2599               buf0[2] |= tmp;
2600               break;
2601     case 10:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2602               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2603               buf0[2] |= __byte_perm_S (tmp, 0, 0x5400);
2604               break;
2605     case 11:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2606               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2607               buf0[2] |= __byte_perm_S (tmp, 0, 0x4000);
2608               break;
2609     case 12:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2610               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2611               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2612               break;
2613     case 13:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2614               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2615               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2616               buf0[3] |= tmp;
2617               break;
2618     case 14:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2619               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2620               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2621               buf0[3] |= __byte_perm_S (tmp, 0, 0x5400);
2622               break;
2623     case 15:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2624               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2625               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2626               buf0[3] |= __byte_perm_S (tmp, 0, 0x4000);
2627               break;
2628     case 16:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2629               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2630               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2631               buf0[3] |= __byte_perm_S (tmp, 0, 0x0000);
2632               break;
2633     case 17:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2634               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2635               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2636               buf0[3] |= __byte_perm_S (tmp, 0, 0x0000);
2637               buf1[0] |= tmp;
2638               break;
2639     case 18:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2640               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2641               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2642               buf0[3] |= __byte_perm_S (tmp, 0, 0x0000);
2643               buf1[0] |= __byte_perm_S (tmp, 0, 0x5400);
2644               break;
2645     case 19:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2646               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2647               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2648               buf0[3] |= __byte_perm_S (tmp, 0, 0x0000);
2649               buf1[0] |= __byte_perm_S (tmp, 0, 0x4000);
2650               break;
2651     case 20:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2652               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2653               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2654               buf0[3] |= __byte_perm_S (tmp, 0, 0x0000);
2655               buf1[0] |= __byte_perm_S (tmp, 0, 0x0000);
2656               break;
2657     case 21:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2658               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2659               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2660               buf0[3] |= __byte_perm_S (tmp, 0, 0x0000);
2661               buf1[0] |= __byte_perm_S (tmp, 0, 0x0000);
2662               buf1[1] |= tmp;
2663               break;
2664     case 22:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2665               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2666               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2667               buf0[3] |= __byte_perm_S (tmp, 0, 0x0000);
2668               buf1[0] |= __byte_perm_S (tmp, 0, 0x0000);
2669               buf1[1] |= __byte_perm_S (tmp, 0, 0x5400);
2670               break;
2671     case 23:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2672               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2673               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2674               buf0[3] |= __byte_perm_S (tmp, 0, 0x0000);
2675               buf1[0] |= __byte_perm_S (tmp, 0, 0x0000);
2676               buf1[1] |= __byte_perm_S (tmp, 0, 0x4000);
2677               break;
2678     case 24:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2679               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2680               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2681               buf0[3] |= __byte_perm_S (tmp, 0, 0x0000);
2682               buf1[0] |= __byte_perm_S (tmp, 0, 0x0000);
2683               buf1[1] |= __byte_perm_S (tmp, 0, 0x0000);
2684               break;
2685     case 25:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2686               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2687               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2688               buf0[3] |= __byte_perm_S (tmp, 0, 0x0000);
2689               buf1[0] |= __byte_perm_S (tmp, 0, 0x0000);
2690               buf1[1] |= __byte_perm_S (tmp, 0, 0x0000);
2691               buf1[2] |= tmp;
2692               break;
2693     case 26:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2694               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2695               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2696               buf0[3] |= __byte_perm_S (tmp, 0, 0x0000);
2697               buf1[0] |= __byte_perm_S (tmp, 0, 0x0000);
2698               buf1[1] |= __byte_perm_S (tmp, 0, 0x0000);
2699               buf1[2] |= __byte_perm_S (tmp, 0, 0x5400);
2700               break;
2701     case 27:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2702               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2703               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2704               buf0[3] |= __byte_perm_S (tmp, 0, 0x0000);
2705               buf1[0] |= __byte_perm_S (tmp, 0, 0x0000);
2706               buf1[1] |= __byte_perm_S (tmp, 0, 0x0000);
2707               buf1[2] |= __byte_perm_S (tmp, 0, 0x4000);
2708               break;
2709     case 28:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2710               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2711               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2712               buf0[3] |= __byte_perm_S (tmp, 0, 0x0000);
2713               buf1[0] |= __byte_perm_S (tmp, 0, 0x0000);
2714               buf1[1] |= __byte_perm_S (tmp, 0, 0x0000);
2715               buf1[2] |= __byte_perm_S (tmp, 0, 0x0000);
2716               break;
2717     case 29:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2718               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2719               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2720               buf0[3] |= __byte_perm_S (tmp, 0, 0x0000);
2721               buf1[0] |= __byte_perm_S (tmp, 0, 0x0000);
2722               buf1[1] |= __byte_perm_S (tmp, 0, 0x0000);
2723               buf1[2] |= __byte_perm_S (tmp, 0, 0x0000);
2724               buf1[3] |= tmp;
2725               break;
2726     case 30:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2727               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2728               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2729               buf0[3] |= __byte_perm_S (tmp, 0, 0x0000);
2730               buf1[0] |= __byte_perm_S (tmp, 0, 0x0000);
2731               buf1[1] |= __byte_perm_S (tmp, 0, 0x0000);
2732               buf1[2] |= __byte_perm_S (tmp, 0, 0x0000);
2733               buf1[3] |= __byte_perm_S (tmp, 0, 0x5400);
2734               break;
2735     case 31:  buf0[0] |= __byte_perm_S (tmp, 0, 0x0000);
2736               buf0[1] |= __byte_perm_S (tmp, 0, 0x0000);
2737               buf0[2] |= __byte_perm_S (tmp, 0, 0x0000);
2738               buf0[3] |= __byte_perm_S (tmp, 0, 0x0000);
2739               buf1[0] |= __byte_perm_S (tmp, 0, 0x0000);
2740               buf1[1] |= __byte_perm_S (tmp, 0, 0x0000);
2741               buf1[2] |= __byte_perm_S (tmp, 0, 0x0000);
2742               buf1[3] |= __byte_perm_S (tmp, 0, 0x4000);
2743               break;
2744   }
2745   #endif
2746
2747   #if defined IS_AMD || defined IS_GENERIC
2748   switch (p0)
2749   {
2750     case  1:  buf0[0] |= tmp <<  0;
2751               break;
2752     case  2:  buf0[0] |= tmp <<  0 | tmp << 8;
2753               break;
2754     case  3:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16;
2755               break;
2756     case  4:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2757               break;
2758     case  5:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2759               buf0[1] |= tmp <<  0;
2760               break;
2761     case  6:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2762               buf0[1] |= tmp <<  0 | tmp << 8;
2763               break;
2764     case  7:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2765               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16;
2766               break;
2767     case  8:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2768               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2769               break;
2770     case  9:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2771               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2772               buf0[2] |= tmp <<  0;
2773               break;
2774     case 10:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2775               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2776               buf0[2] |= tmp <<  0 | tmp << 8;
2777               break;
2778     case 11:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2779               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2780               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16;
2781               break;
2782     case 12:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2783               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2784               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2785               break;
2786     case 13:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2787               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2788               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2789               buf0[3] |= tmp <<  0;
2790               break;
2791     case 14:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2792               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2793               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2794               buf0[3] |= tmp <<  0 | tmp << 8;
2795               break;
2796     case 15:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2797               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2798               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2799               buf0[3] |= tmp <<  0 | tmp << 8 | tmp << 16;
2800               break;
2801     case 16:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2802               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2803               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2804               buf0[3] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2805               break;
2806     case 17:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2807               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2808               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2809               buf0[3] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2810               buf1[0] |= tmp <<  0;
2811               break;
2812     case 18:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2813               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2814               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2815               buf0[3] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2816               buf1[0] |= tmp <<  0 | tmp << 8;
2817               break;
2818     case 19:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2819               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2820               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2821               buf0[3] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2822               buf1[0] |= tmp <<  0 | tmp << 8 | tmp << 16;
2823               break;
2824     case 20:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2825               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2826               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2827               buf0[3] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2828               buf1[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2829               break;
2830     case 21:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2831               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2832               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2833               buf0[3] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2834               buf1[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2835               buf1[1] |= tmp <<  0;
2836               break;
2837     case 22:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2838               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2839               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2840               buf0[3] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2841               buf1[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2842               buf1[1] |= tmp <<  0 | tmp << 8;
2843               break;
2844     case 23:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2845               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2846               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2847               buf0[3] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2848               buf1[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2849               buf1[1] |= tmp <<  0 | tmp << 8 | tmp << 16;
2850               break;
2851     case 24:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2852               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2853               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2854               buf0[3] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2855               buf1[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2856               buf1[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2857               break;
2858     case 25:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2859               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2860               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2861               buf0[3] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2862               buf1[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2863               buf1[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2864               buf1[2] |= tmp <<  0;
2865               break;
2866     case 26:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2867               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2868               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2869               buf0[3] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2870               buf1[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2871               buf1[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2872               buf1[2] |= tmp <<  0 | tmp << 8;
2873               break;
2874     case 27:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2875               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2876               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2877               buf0[3] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2878               buf1[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2879               buf1[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2880               buf1[2] |= tmp <<  0 | tmp << 8 | tmp << 16;
2881               break;
2882     case 28:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2883               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2884               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2885               buf0[3] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2886               buf1[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2887               buf1[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2888               buf1[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2889               break;
2890     case 29:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2891               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2892               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2893               buf0[3] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2894               buf1[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2895               buf1[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2896               buf1[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2897               buf1[3] |= tmp <<  0;
2898               break;
2899     case 30:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2900               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2901               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2902               buf0[3] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2903               buf1[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2904               buf1[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2905               buf1[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2906               buf1[3] |= tmp <<  0 | tmp << 8;
2907               break;
2908     case 31:  buf0[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2909               buf0[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2910               buf0[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2911               buf0[3] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2912               buf1[0] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2913               buf1[1] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2914               buf1[2] |= tmp <<  0 | tmp << 8 | tmp << 16 | tmp << 24;
2915               buf1[3] |= tmp <<  0 | tmp << 8 | tmp << 16;
2916               break;
2917   }
2918   #endif
2919
2920   out_len += p0;
2921
2922   return out_len;
2923 }
2924
2925 inline u32 rule_op_mangle_dupechar_last (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2926 {
2927   if ( in_len       ==  0) return (in_len);
2928   if ((in_len + p0) >= 32) return (in_len);
2929
2930   const u32 in_len1 = in_len - 1;
2931
2932   const u32 sh = (in_len1 & 3) * 8;
2933
2934   u32 tmp = 0;
2935
2936   switch (in_len1 / 4)
2937   {
2938     case  0:  tmp = (buf0[0] >> sh) & 0xff; break;
2939     case  1:  tmp = (buf0[1] >> sh) & 0xff; break;
2940     case  2:  tmp = (buf0[2] >> sh) & 0xff; break;
2941     case  3:  tmp = (buf0[3] >> sh) & 0xff; break;
2942     case  4:  tmp = (buf1[0] >> sh) & 0xff; break;
2943     case  5:  tmp = (buf1[1] >> sh) & 0xff; break;
2944     case  6:  tmp = (buf1[2] >> sh) & 0xff; break;
2945     case  7:  tmp = (buf1[3] >> sh) & 0xff; break;
2946   }
2947
2948   u32 out_len = in_len;
2949
2950   for (u32 i = 0; i < p0; i++)
2951   {
2952     append_block1 (out_len, buf0, buf1, tmp);
2953
2954     out_len++;
2955   }
2956
2957   return out_len;
2958 }
2959
2960 inline u32 rule_op_mangle_dupechar_all (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2961 {
2962   if ( in_len           ==  0) return (in_len);
2963   if ((in_len + in_len) >= 32) return (in_len);
2964
2965   u32 out_len = in_len;
2966
2967   u32 tib40[4];
2968   u32 tib41[4];
2969
2970   #ifdef IS_NV
2971   tib40[0] = __byte_perm_S (buf0[0], 0, 0x1100);
2972   tib40[1] = __byte_perm_S (buf0[0], 0, 0x3322);
2973   tib40[2] = __byte_perm_S (buf0[1], 0, 0x1100);
2974   tib40[3] = __byte_perm_S (buf0[1], 0, 0x3322);
2975   tib41[0] = __byte_perm_S (buf0[2], 0, 0x1100);
2976   tib41[1] = __byte_perm_S (buf0[2], 0, 0x3322);
2977   tib41[2] = __byte_perm_S (buf0[3], 0, 0x1100);
2978   tib41[3] = __byte_perm_S (buf0[3], 0, 0x3322);
2979
2980   buf0[0] = tib40[0];
2981   buf0[1] = tib40[1];
2982   buf0[2] = tib40[2];
2983   buf0[3] = tib40[3];
2984   buf1[0] = tib41[0];
2985   buf1[1] = tib41[1];
2986   buf1[2] = tib41[2];
2987   buf1[3] = tib41[3];
2988   #endif
2989
2990   #if defined IS_AMD || defined IS_GENERIC
2991   tib40[0] = ((buf0[0] & 0x000000FF) <<  0) | ((buf0[0] & 0x0000FF00) <<  8);
2992   tib40[1] = ((buf0[0] & 0x00FF0000) >> 16) | ((buf0[0] & 0xFF000000) >>  8);
2993   tib40[2] = ((buf0[1] & 0x000000FF) <<  0) | ((buf0[1] & 0x0000FF00) <<  8);
2994   tib40[3] = ((buf0[1] & 0x00FF0000) >> 16) | ((buf0[1] & 0xFF000000) >>  8);
2995   tib41[0] = ((buf0[2] & 0x000000FF) <<  0) | ((buf0[2] & 0x0000FF00) <<  8);
2996   tib41[1] = ((buf0[2] & 0x00FF0000) >> 16) | ((buf0[2] & 0xFF000000) >>  8);
2997   tib41[2] = ((buf0[3] & 0x000000FF) <<  0) | ((buf0[3] & 0x0000FF00) <<  8);
2998   tib41[3] = ((buf0[3] & 0x00FF0000) >> 16) | ((buf0[3] & 0xFF000000) >>  8);
2999
3000   buf0[0] = tib40[0] | (tib40[0] <<  8);
3001   buf0[1] = tib40[1] | (tib40[1] <<  8);
3002   buf0[2] = tib40[2] | (tib40[2] <<  8);
3003   buf0[3] = tib40[3] | (tib40[3] <<  8);
3004   buf1[0] = tib41[0] | (tib41[0] <<  8);
3005   buf1[1] = tib41[1] | (tib41[1] <<  8);
3006   buf1[2] = tib41[2] | (tib41[2] <<  8);
3007   buf1[3] = tib41[3] | (tib41[3] <<  8);
3008   #endif
3009
3010   out_len = out_len + out_len;
3011
3012   return out_len;
3013 }
3014
3015 inline u32 rule_op_mangle_switch_first (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
3016 {
3017   if (in_len < 2) return (in_len);
3018
3019   #ifdef IS_NV
3020   buf0[0] = __byte_perm_S (buf0[0], 0, 0x3201);
3021   #endif
3022
3023   #if defined IS_AMD || defined IS_GENERIC
3024   buf0[0] = (buf0[0] & 0xFFFF0000) | ((buf0[0] << 8) & 0x0000FF00) | ((buf0[0] >> 8) & 0x000000FF);
3025   #endif
3026
3027   return in_len;
3028 }
3029
3030 inline u32 rule_op_mangle_switch_last (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
3031 {
3032   if (in_len < 2) return (in_len);
3033
3034   #ifdef IS_NV
3035   switch (in_len)
3036   {
3037     case  2:  buf0[0] = __byte_perm_S (buf0[0],       0, 0x5401);
3038               break;
3039     case  3:  buf0[0] = __byte_perm_S (buf0[0],       0, 0x4120);
3040               break;
3041     case  4:  buf0[0] = __byte_perm_S (buf0[0],       0, 0x2310);
3042               break;
3043     case  5:  buf0[1] = __byte_perm_S (buf0[1], buf0[0], 0x7210);
3044               buf0[0] = __byte_perm_S (buf0[0], buf0[1], 0x4210);
3045               buf0[1] = __byte_perm_S (buf0[1],       0, 0x6543);
3046               break;
3047     case  6:  buf0[1] = __byte_perm_S (buf0[1],       0, 0x5401);
3048               break;
3049     case  7:  buf0[1] = __byte_perm_S (buf0[1],       0, 0x4120);
3050               break;
3051     case  8:  buf0[1] = __byte_perm_S (buf0[1],       0, 0x2310);
3052               break;
3053     case  9:  buf0[2] = __byte_perm_S (buf0[2], buf0[1], 0x7210);
3054               buf0[1] = __byte_perm_S (buf0[1], buf0[2], 0x4210);
3055               buf0[2] = __byte_perm_S (buf0[2],       0, 0x6543);
3056               break;
3057     case 10:  buf0[2] = __byte_perm_S (buf0[2],       0, 0x5401);
3058               break;
3059     case 11:  buf0[2] = __byte_perm_S (buf0[2],       0, 0x4120);
3060               break;
3061     case 12:  buf0[2] = __byte_perm_S (buf0[2],       0, 0x2310);
3062               break;
3063     case 13:  buf0[3] = __byte_perm_S (buf0[3], buf0[2], 0x7210);
3064               buf0[2] = __byte_perm_S (buf0[2], buf0[3], 0x4210);
3065               buf0[3] = __byte_perm_S (buf0[3],       0, 0x6543);
3066               break;
3067     case 14:  buf0[3] = __byte_perm_S (buf0[3],       0, 0x5401);
3068               break;
3069     case 15:  buf0[3] = __byte_perm_S (buf0[3],       0, 0x4120);
3070               break;
3071     case 16:  buf0[3] = __byte_perm_S (buf0[3],       0, 0x2310);
3072               break;
3073     case 17:  buf1[0] = __byte_perm_S (buf1[0], buf0[3], 0x7210);
3074               buf0[3] = __byte_perm_S (buf0[3], buf1[0], 0x4210);
3075               buf1[0] = __byte_perm_S (buf1[0],       0, 0x6543);
3076               break;
3077     case 18:  buf1[0] = __byte_perm_S (buf1[0],       0, 0x5401);
3078               break;
3079     case 19:  buf1[0] = __byte_perm_S (buf1[0],       0, 0x4120);
3080               break;
3081     case 20:  buf1[0] = __byte_perm_S (buf1[0],       0, 0x2310);
3082               break;
3083     case 21:  buf1[1] = __byte_perm_S (buf1[1], buf1[0], 0x7210);
3084               buf1[0] = __byte_perm_S (buf1[0], buf1[1], 0x4210);
3085               buf1[1] = __byte_perm_S (buf1[1],       0, 0x6543);
3086               break;
3087     case 22:  buf1[1] = __byte_perm_S (buf1[1],       0, 0x5401);
3088               break;
3089     case 23:  buf1[1] = __byte_perm_S (buf1[1],       0, 0x4120);
3090               break;
3091     case 24:  buf1[1] = __byte_perm_S (buf1[1],       0, 0x2310);
3092               break;
3093     case 25:  buf1[2] = __byte_perm_S (buf1[2], buf1[1], 0x7210);
3094               buf1[1] = __byte_perm_S (buf1[1], buf1[2], 0x4210);
3095               buf1[2] = __byte_perm_S (buf1[2],       0, 0x6543);
3096               break;
3097     case 26:  buf1[2] = __byte_perm_S (buf1[2],       0, 0x5401);
3098               break;
3099     case 27:  buf1[2] = __byte_perm_S (buf1[2],       0, 0x4120);
3100               break;
3101     case 28:  buf1[2] = __byte_perm_S (buf1[2],       0, 0x2310);
3102               break;
3103     case 29:  buf1[3] = __byte_perm_S (buf1[3], buf1[2], 0x7210);
3104               buf1[2] = __byte_perm_S (buf1[2], buf1[3], 0x4210);
3105               buf1[3] = __byte_perm_S (buf1[3],       0, 0x6543);
3106               break;
3107     case 30:  buf1[3] = __byte_perm_S (buf1[3],       0, 0x5401);
3108               break;
3109     case 31:  buf1[3] = __byte_perm_S (buf1[3],       0, 0x4120);
3110               break;
3111   }
3112   #endif
3113
3114   #if defined IS_AMD || defined IS_GENERIC
3115   switch (in_len)
3116   {
3117     case  2:  buf0[0] = ((buf0[0] << 8) & 0x0000FF00) | ((buf0[0] >> 8) & 0x000000FF);
3118               break;
3119     case  3:  buf0[0] =  (buf0[0] & 0x000000FF) | ((buf0[0] <<  8) & 0x00FF0000) | ((buf0[0] >>  8) & 0x0000FF00);
3120               break;
3121     case  4:  buf0[0] =  (buf0[0] & 0x0000FFFF) | ((buf0[0] <<  8) & 0xFF000000) | ((buf0[0] >>  8) & 0x00FF0000);
3122               break;
3123     case  5:  buf0[1] =  (buf0[0] & 0xFF000000) |   buf0[1];
3124               buf0[0] =  (buf0[0] & 0x00FFFFFF) |  (buf0[1] << 24);
3125               buf0[1] =  (buf0[1] >> 24);
3126               break;
3127     case  6:  buf0[1] = ((buf0[1] << 8) & 0x0000FF00) | ((buf0[1] >> 8) & 0x000000FF);
3128               break;
3129     case  7:  buf0[1] =  (buf0[1] & 0x000000FF) | ((buf0[1] <<  8) & 0x00FF0000) | ((buf0[1] >>  8) & 0x0000FF00);
3130               break;
3131     case  8:  buf0[1] =  (buf0[1] & 0x0000FFFF) | ((buf0[1] <<  8) & 0xFF000000) | ((buf0[1] >>  8) & 0x00FF0000);
3132               break;
3133     case  9:  buf0[2] =  (buf0[1] & 0xFF000000) |   buf0[2];
3134               buf0[1] =  (buf0[1] & 0x00FFFFFF) |  (buf0[2] << 24);
3135               buf0[2] =  (buf0[2] >> 24);
3136               break;
3137     case 10:  buf0[2] = ((buf0[2] << 8) & 0x0000FF00) | ((buf0[2] >> 8) & 0x000000FF);
3138               break;
3139     case 11:  buf0[2] =  (buf0[2] & 0x000000FF) | ((buf0[2] <<  8) & 0x00FF0000) | ((buf0[2] >>  8) & 0x0000FF00);
3140               break;
3141     case 12:  buf0[2] =  (buf0[2] & 0x0000FFFF) | ((buf0[2] <<  8) & 0xFF000000) | ((buf0[2] >>  8) & 0x00FF0000);
3142               break;
3143     case 13:  buf0[3] =  (buf0[2] & 0xFF000000) |   buf0[3];
3144               buf0[2] =  (buf0[2] & 0x00FFFFFF) |  (buf0[3] << 24);
3145               buf0[3] =  (buf0[3] >> 24);
3146               break;
3147     case 14:  buf0[3] = ((buf0[3] << 8) & 0x0000FF00) | ((buf0[3] >> 8) & 0x000000FF);
3148               break;
3149     case 15:  buf0[3] =  (buf0[3] & 0x000000FF) |  ((buf0[3] <<  8) & 0x00FF0000) | ((buf0[3] >>  8) & 0x0000FF00);
3150               break;
3151     case 16:  buf0[3] =  (buf0[3] & 0x0000FFFF) | ((buf0[3] <<  8) & 0xFF000000) | ((buf0[3] >>  8) & 0x00FF0000);
3152               break;
3153     case 17:  buf1[0] =  (buf0[3] & 0xFF000000) |   buf1[0];
3154               buf0[3] =  (buf0[3] & 0x00FFFFFF) |  (buf1[0] << 24);
3155               buf1[0] =  (buf1[0] >> 24);
3156               break;
3157     case 18:  buf1[0] = ((buf1[0] << 8) & 0x0000FF00) | ((buf1[0] >> 8) & 0x000000FF);
3158               break;
3159     case 19:  buf1[0] =  (buf1[0] & 0x000000FF) | ((buf1[0] <<  8) & 0x00FF0000) | ((buf1[0] >>  8) & 0x0000FF00);
3160               break;
3161     case 20:  buf1[0] =  (buf1[0] & 0x0000FFFF) | ((buf1[0] <<  8) & 0xFF000000) | ((buf1[0] >>  8) & 0x00FF0000);
3162               break;
3163     case 21:  buf1[1] =  (buf1[0] & 0xFF000000) |   buf1[1];
3164               buf1[0] =  (buf1[0] & 0x00FFFFFF) |  (buf1[1] << 24);
3165               buf1[1] =  (buf1[1] >> 24);
3166               break;
3167     case 22:  buf1[1] = ((buf1[1] << 8) & 0x0000FF00) | ((buf1[1] >> 8) & 0x000000FF);
3168               break;
3169     case 23:  buf1[1] =  (buf1[1] & 0x000000FF) | ((buf1[1] <<  8) & 0x00FF0000) | ((buf1[1] >>  8) & 0x0000FF00);
3170               break;
3171     case 24:  buf1[1] =  (buf1[1] & 0x0000FFFF) | ((buf1[1] <<  8) & 0xFF000000) | ((buf1[1] >>  8) & 0x00FF0000);
3172               break;
3173     case 25:  buf1[2] =  (buf1[1] & 0xFF000000) |   buf1[2];
3174               buf1[1] =  (buf1[1] & 0x00FFFFFF) |  (buf1[2] << 24);
3175               buf1[2] =  (buf1[2] >> 24);
3176               break;
3177     case 26:  buf1[2] = ((buf1[2] << 8) & 0x0000FF00) | ((buf1[2] >> 8) & 0x000000FF);
3178               break;
3179     case 27:  buf1[2] =  (buf1[2] & 0x000000FF) | ((buf1[2] <<  8) & 0x00FF0000) | ((buf1[2] >>  8) & 0x0000FF00);
3180               break;
3181     case 28:  buf1[2] =  (buf1[2] & 0x0000FFFF) | ((buf1[2] <<  8) & 0xFF000000) | ((buf1[2] >>  8) & 0x00FF0000);
3182               break;
3183     case 29:  buf1[3] =  (buf1[2] & 0xFF000000) |   buf1[3];
3184               buf1[2] =  (buf1[2] & 0x00FFFFFF) |  (buf1[3] << 24);
3185               buf1[3] =  (buf1[3] >> 24);
3186               break;
3187     case 30:  buf1[3] = ((buf1[3] << 8) & 0x0000FF00) | ((buf1[3] >> 8) & 0x000000FF);
3188               break;
3189     case 31:  buf1[3] =  (buf1[3] & 0x000000FF) |  ((buf1[3] <<  8) & 0x00FF0000) | ((buf1[3] >>  8) & 0x0000FF00);
3190               break;
3191   }
3192   #endif
3193
3194   return in_len;
3195 }
3196
3197 inline u32 rule_op_mangle_switch_at (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
3198 {
3199   if (p0 >= in_len) return (in_len);
3200   if (p1 >= in_len) return (in_len);
3201
3202   u32 tmp0 = 0;
3203   u32 tmp1 = 0;
3204
3205   #ifdef IS_NV
3206   switch (p0)
3207   {
3208     case  0:  tmp0 = __byte_perm_S (buf0[0], 0, 0x6540);
3209               break;
3210     case  1:  tmp0 = __byte_perm_S (buf0[0], 0, 0x6541);
3211               break;
3212     case  2:  tmp0 = __byte_perm_S (buf0[0], 0, 0x6542);
3213               break;
3214     case  3:  tmp0 = __byte_perm_S (buf0[0], 0, 0x6543);
3215               break;
3216     case  4:  tmp0 = __byte_perm_S (buf0[1], 0, 0x6540);
3217               break;
3218     case  5:  tmp0 = __byte_perm_S (buf0[1], 0, 0x6541);
3219               break;
3220     case  6:  tmp0 = __byte_perm_S (buf0[1], 0, 0x6542);
3221               break;
3222     case  7:  tmp0 = __byte_perm_S (buf0[1], 0, 0x6543);
3223               break;
3224     case  8:  tmp0 = __byte_perm_S (buf0[2], 0, 0x6540);
3225               break;
3226     case  9:  tmp0 = __byte_perm_S (buf0[2], 0, 0x6541);
3227               break;
3228     case 10:  tmp0 = __byte_perm_S (buf0[2], 0, 0x6542);
3229               break;
3230     case 11:  tmp0 = __byte_perm_S (buf0[2], 0, 0x6543);
3231               break;
3232     case 12:  tmp0 = __byte_perm_S (buf0[3], 0, 0x6540);
3233               break;
3234     case 13:  tmp0 = __byte_perm_S (buf0[3], 0, 0x6541);
3235               break;
3236     case 14:  tmp0 = __byte_perm_S (buf0[3], 0, 0x6542);
3237               break;
3238     case 15:  tmp0 = __byte_perm_S (buf0[3], 0, 0x6543);
3239               break;
3240     case 16:  tmp0 = __byte_perm_S (buf1[0], 0, 0x6540);
3241               break;
3242     case 17:  tmp0 = __byte_perm_S (buf1[0], 0, 0x6541);
3243               break;
3244     case 18:  tmp0 = __byte_perm_S (buf1[0], 0, 0x6542);
3245               break;
3246     case 19:  tmp0 = __byte_perm_S (buf1[0], 0, 0x6543);
3247               break;
3248     case 20:  tmp0 = __byte_perm_S (buf1[1], 0, 0x6540);
3249               break;
3250     case 21:  tmp0 = __byte_perm_S (buf1[1], 0, 0x6541);
3251               break;
3252     case 22:  tmp0 = __byte_perm_S (buf1[1], 0, 0x6542);
3253               break;
3254     case 23:  tmp0 = __byte_perm_S (buf1[1], 0, 0x6543);
3255               break;
3256     case 24:  tmp0 = __byte_perm_S (buf1[2], 0, 0x6540);
3257               break;
3258     case 25:  tmp0 = __byte_perm_S (buf1[2], 0, 0x6541);
3259               break;
3260     case 26:  tmp0 = __byte_perm_S (buf1[2], 0, 0x6542);
3261               break;
3262     case 27:  tmp0 = __byte_perm_S (buf1[2], 0, 0x6543);
3263               break;
3264     case 28:  tmp0 = __byte_perm_S (buf1[3], 0, 0x6540);
3265               break;
3266     case 29:  tmp0 = __byte_perm_S (buf1[3], 0, 0x6541);
3267               break;
3268     case 30:  tmp0 = __byte_perm_S (buf1[3], 0, 0x6542);
3269               break;
3270     case 31:  tmp0 = __byte_perm_S (buf1[3], 0, 0x6543);
3271               break;
3272   }
3273
3274   switch (p1)
3275   {
3276     case  0:  tmp1    = __byte_perm_S (buf0[0],       0, 0x6540);
3277               buf0[0] = __byte_perm_S (tmp0,    buf0[0], 0x7650);
3278               break;
3279     case  1:  tmp1    = __byte_perm_S (buf0[0],       0, 0x6541);
3280               buf0[0] = __byte_perm_S (tmp0,    buf0[0], 0x7604);
3281               break;
3282     case  2:  tmp1    = __byte_perm_S (buf0[0],       0, 0x6542);
3283               buf0[0] = __byte_perm_S (tmp0,    buf0[0], 0x7054);
3284               break;
3285     case  3:  tmp1    = __byte_perm_S (buf0[0],       0, 0x6543);
3286               buf0[0] = __byte_perm_S (tmp0,    buf0[0], 0x0654);
3287               break;
3288     case  4:  tmp1    = __byte_perm_S (buf0[1],       0, 0x6540);
3289               buf0[1] = __byte_perm_S (tmp0,    buf0[1], 0x7650);
3290               break;
3291     case  5:  tmp1    = __byte_perm_S (buf0[1],       0, 0x6541);
3292               buf0[1] = __byte_perm_S (tmp0,    buf0[1], 0x7604);
3293               break;
3294     case  6:  tmp1    = __byte_perm_S (buf0[1],       0, 0x6542);
3295               buf0[1] = __byte_perm_S (tmp0,    buf0[1], 0x7054);
3296               break;
3297     case  7:  tmp1    = __byte_perm_S (buf0[1],       0, 0x6543);
3298               buf0[1] = __byte_perm_S (tmp0,    buf0[1], 0x0654);
3299               break;
3300     case  8:  tmp1    = __byte_perm_S (buf0[2],       0, 0x6540);
3301               buf0[2] = __byte_perm_S (tmp0,    buf0[2], 0x7650);
3302               break;
3303     case  9:  tmp1    = __byte_perm_S (buf0[2],       0, 0x6541);
3304               buf0[2] = __byte_perm_S (tmp0,    buf0[2], 0x7604);
3305               break;
3306     case 10:  tmp1    = __byte_perm_S (buf0[2],       0, 0x6542);
3307               buf0[2] = __byte_perm_S (tmp0,    buf0[2], 0x7054);
3308               break;
3309     case 11:  tmp1    = __byte_perm_S (buf0[2],       0, 0x6543);
3310               buf0[2] = __byte_perm_S (tmp0,    buf0[2], 0x0654);
3311               break;
3312     case 12:  tmp1    = __byte_perm_S (buf0[3],       0, 0x6540);
3313               buf0[3] = __byte_perm_S (tmp0,    buf0[3], 0x7650);
3314               break;
3315     case 13:  tmp1    = __byte_perm_S (buf0[3],       0, 0x6541);
3316               buf0[3] = __byte_perm_S (tmp0,    buf0[3], 0x7604);
3317               break;
3318     case 14:  tmp1    = __byte_perm_S (buf0[3],       0, 0x6542);
3319               buf0[3] = __byte_perm_S (tmp0,    buf0[3], 0x7054);
3320               break;
3321     case 15:  tmp1    = __byte_perm_S (buf0[3],       0, 0x6543);
3322               buf0[3] = __byte_perm_S (tmp0,    buf0[3], 0x0654);
3323               break;
3324     case 16:  tmp1    = __byte_perm_S (buf1[0],       0, 0x6540);
3325               buf1[0] = __byte_perm_S (tmp0,    buf1[0], 0x7650);
3326               break;
3327     case 17:  tmp1    = __byte_perm_S (buf1[0],       0, 0x6541);
3328               buf1[0] = __byte_perm_S (tmp0,    buf1[0], 0x7604);
3329               break;
3330     case 18:  tmp1    = __byte_perm_S (buf1[0],       0, 0x6542);
3331               buf1[0] = __byte_perm_S (tmp0,    buf1[0], 0x7054);
3332               break;
3333     case 19:  tmp1    = __byte_perm_S (buf1[0],       0, 0x6543);
3334               buf1[0] = __byte_perm_S (tmp0,    buf1[0], 0x0654);
3335               break;
3336     case 20:  tmp1    = __byte_perm_S (buf1[1],       0, 0x6540);
3337               buf1[1] = __byte_perm_S (tmp0,    buf1[1], 0x7650);
3338               break;
3339     case 21:  tmp1    = __byte_perm_S (buf1[1],       0, 0x6541);
3340               buf1[1] = __byte_perm_S (tmp0,    buf1[1], 0x7604);
3341               break;
3342     case 22:  tmp1    = __byte_perm_S (buf1[1],       0, 0x6542);
3343               buf1[1] = __byte_perm_S (tmp0,    buf1[1], 0x7054);
3344               break;
3345     case 23:  tmp1    = __byte_perm_S (buf1[1],       0, 0x6543);
3346               buf1[1] = __byte_perm_S (tmp0,    buf1[1], 0x0654);
3347               break;
3348     case 24:  tmp1    = __byte_perm_S (buf1[2],       0, 0x6540);
3349               buf1[2] = __byte_perm_S (tmp0,    buf1[2], 0x7650);
3350               break;
3351     case 25:  tmp1    = __byte_perm_S (buf1[2],       0, 0x6541);
3352               buf1[2] = __byte_perm_S (tmp0,    buf1[2], 0x7604);
3353               break;
3354     case 26:  tmp1    = __byte_perm_S (buf1[2],       0, 0x6542);
3355               buf1[2] = __byte_perm_S (tmp0,    buf1[2], 0x7054);
3356               break;
3357     case 27:  tmp1    = __byte_perm_S (buf1[2],       0, 0x6543);
3358               buf1[2] = __byte_perm_S (tmp0,    buf1[2], 0x0654);
3359               break;
3360     case 28:  tmp1    = __byte_perm_S (buf1[3],       0, 0x6540);
3361               buf1[3] = __byte_perm_S (tmp0,    buf1[3], 0x7650);
3362               break;
3363     case 29:  tmp1    = __byte_perm_S (buf1[3],       0, 0x6541);
3364               buf1[3] = __byte_perm_S (tmp0,    buf1[3], 0x7604);
3365               break;
3366     case 30:  tmp1    = __byte_perm_S (buf1[3],       0, 0x6542);
3367               buf1[3] = __byte_perm_S (tmp0,    buf1[3], 0x7054);
3368               break;
3369     case 31:  tmp1    = __byte_perm_S (buf1[3],       0, 0x6543);
3370               buf1[3] = __byte_perm_S (tmp0,    buf1[3], 0x0654);
3371               break;
3372   }
3373
3374   switch (p0)
3375   {
3376     case  0:  buf0[0] = __byte_perm_S (tmp1, buf0[0], 0x7650);
3377               break;
3378     case  1:  buf0[0] = __byte_perm_S (tmp1, buf0[0], 0x7604);
3379               break;
3380     case  2:  buf0[0] = __byte_perm_S (tmp1, buf0[0], 0x7054);
3381               break;
3382     case  3:  buf0[0] = __byte_perm_S (tmp1, buf0[0], 0x0654);
3383               break;
3384     case  4:  buf0[1] = __byte_perm_S (tmp1, buf0[1], 0x7650);
3385               break;
3386     case  5:  buf0[1] = __byte_perm_S (tmp1, buf0[1], 0x7604);
3387               break;
3388     case  6:  buf0[1] = __byte_perm_S (tmp1, buf0[1], 0x7054);
3389               break;
3390     case  7:  buf0[1] = __byte_perm_S (tmp1, buf0[1], 0x0654);
3391               break;
3392     case  8:  buf0[2] = __byte_perm_S (tmp1, buf0[2], 0x7650);
3393               break;
3394     case  9:  buf0[2] = __byte_perm_S (tmp1, buf0[2], 0x7604);
3395               break;
3396     case 10:  buf0[2] = __byte_perm_S (tmp1, buf0[2], 0x7054);
3397               break;
3398     case 11:  buf0[2] = __byte_perm_S (tmp1, buf0[2], 0x0654);
3399               break;
3400     case 12:  buf0[3] = __byte_perm_S (tmp1, buf0[3], 0x7650);
3401               break;
3402     case 13:  buf0[3] = __byte_perm_S (tmp1, buf0[3], 0x7604);
3403               break;
3404     case 14:  buf0[3] = __byte_perm_S (tmp1, buf0[3], 0x7054);
3405               break;
3406     case 15:  buf0[3] = __byte_perm_S (tmp1, buf0[3], 0x0654);
3407               break;
3408     case 16:  buf1[0] = __byte_perm_S (tmp1, buf1[0], 0x7650);
3409               break;
3410     case 17:  buf1[0] = __byte_perm_S (tmp1, buf1[0], 0x7604);
3411               break;
3412     case 18:  buf1[0] = __byte_perm_S (tmp1, buf1[0], 0x7054);
3413               break;
3414     case 19:  buf1[0] = __byte_perm_S (tmp1, buf1[0], 0x0654);
3415               break;
3416     case 20:  buf1[1] = __byte_perm_S (tmp1, buf1[1], 0x7650);
3417               break;
3418     case 21:  buf1[1] = __byte_perm_S (tmp1, buf1[1], 0x7604);
3419               break;
3420     case 22:  buf1[1] = __byte_perm_S (tmp1, buf1[1], 0x7054);
3421               break;
3422     case 23:  buf1[1] = __byte_perm_S (tmp1, buf1[1], 0x0654);
3423               break;
3424     case 24:  buf1[2] = __byte_perm_S (tmp1, buf1[2], 0x7650);
3425               break;
3426     case 25:  buf1[2] = __byte_perm_S (tmp1, buf1[2], 0x7604);
3427               break;
3428     case 26:  buf1[2] = __byte_perm_S (tmp1, buf1[2], 0x7054);
3429               break;
3430     case 27:  buf1[2] = __byte_perm_S (tmp1, buf1[2], 0x0654);
3431               break;
3432     case 28:  buf1[3] = __byte_perm_S (tmp1, buf1[3], 0x7650);
3433               break;
3434     case 29:  buf1[3] = __byte_perm_S (tmp1, buf1[3], 0x7604);
3435               break;
3436     case 30:  buf1[3] = __byte_perm_S (tmp1, buf1[3], 0x7054);
3437               break;
3438     case 31:  buf1[3] = __byte_perm_S (tmp1, buf1[3], 0x0654);
3439               break;
3440   }
3441   #endif
3442
3443   #if defined IS_AMD || defined IS_GENERIC
3444   switch (p0)
3445   {
3446     case  0:  tmp0 = (buf0[0] >>  0) & 0xFF;
3447               break;
3448     case  1:  tmp0 = (buf0[0] >>  8) & 0xFF;
3449               break;
3450     case  2:  tmp0 = (buf0[0] >> 16) & 0xFF;
3451               break;
3452     case  3:  tmp0 = (buf0[0] >> 24) & 0xFF;
3453               break;
3454     case  4:  tmp0 = (buf0[1] >>  0) & 0xFF;
3455               break;
3456     case  5:  tmp0 = (buf0[1] >>  8) & 0xFF;
3457               break;
3458     case  6:  tmp0 = (buf0[1] >> 16) & 0xFF;
3459               break;
3460     case  7:  tmp0 = (buf0[1] >> 24) & 0xFF;
3461               break;
3462     case  8:  tmp0 = (buf0[2] >>  0) & 0xFF;
3463               break;
3464     case  9:  tmp0 = (buf0[2] >>  8) & 0xFF;
3465               break;
3466     case 10:  tmp0 = (buf0[2] >> 16) & 0xFF;
3467               break;
3468     case 11:  tmp0 = (buf0[2] >> 24) & 0xFF;
3469               break;
3470     case 12:  tmp0 = (buf0[3] >>  0) & 0xFF;
3471               break;
3472     case 13:  tmp0 = (buf0[3] >>  8) & 0xFF;
3473               break;
3474     case 14:  tmp0 = (buf0[3] >> 16) & 0xFF;
3475               break;
3476     case 15:  tmp0 = (buf0[3] >> 24) & 0xFF;
3477               break;
3478     case 16:  tmp0 = (buf1[0] >>  0) & 0xFF;
3479               break;
3480     case 17:  tmp0 = (buf1[0] >>  8) & 0xFF;
3481               break;
3482     case 18:  tmp0 = (buf1[0] >> 16) & 0xFF;
3483               break;
3484     case 19:  tmp0 = (buf1[0] >> 24) & 0xFF;
3485               break;
3486     case 20:  tmp0 = (buf1[1] >>  0) & 0xFF;
3487               break;
3488     case 21:  tmp0 = (buf1[1] >>  8) & 0xFF;
3489               break;
3490     case 22:  tmp0 = (buf1[1] >> 16) & 0xFF;
3491               break;
3492     case 23:  tmp0 = (buf1[1] >> 24) & 0xFF;
3493               break;
3494     case 24:  tmp0 = (buf1[2] >>  0) & 0xFF;
3495               break;
3496     case 25:  tmp0 = (buf1[2] >>  8) & 0xFF;
3497               break;
3498     case 26:  tmp0 = (buf1[2] >> 16) & 0xFF;
3499               break;
3500     case 27:  tmp0 = (buf1[2] >> 24) & 0xFF;
3501               break;
3502     case 28:  tmp0 = (buf1[3] >>  0) & 0xFF;
3503               break;
3504     case 29:  tmp0 = (buf1[3] >>  8) & 0xFF;
3505               break;
3506     case 30:  tmp0 = (buf1[3] >> 16) & 0xFF;
3507               break;
3508     case 31:  tmp0 = (buf1[3] >> 24) & 0xFF;
3509               break;
3510   }
3511
3512   switch (p1)
3513   {
3514     case  0:  tmp1 = (buf0[0] >>  0) & 0xff;
3515               buf0[0]  = (buf0[0] & 0xffffff00) | tmp0 <<  0;
3516               break;
3517     case  1:  tmp1 = (buf0[0] >>  8) & 0xff;
3518               buf0[0]  = (buf0[0] & 0xffff00ff) | tmp0 <<  8;
3519               break;
3520     case  2:  tmp1 = (buf0[0] >> 16) & 0xff;
3521               buf0[0]  = (buf0[0] & 0xff00ffff) | tmp0 << 16;
3522               break;
3523     case  3:  tmp1 = (buf0[0] >> 24) & 0xff;
3524               buf0[0]  = (buf0[0] & 0x00ffffff) | tmp0 << 24;
3525               break;
3526     case  4:  tmp1 = (buf0[1] >>  0) & 0xff;
3527               buf0[1]  = (buf0[1] & 0xffffff00) | tmp0 <<  0;
3528               break;
3529     case  5:  tmp1 = (buf0[1] >>  8) & 0xff;
3530               buf0[1]  = (buf0[1] & 0xffff00ff) | tmp0 <<  8;
3531               break;
3532     case  6:  tmp1 = (buf0[1] >> 16) & 0xff;
3533               buf0[1]  = (buf0[1] & 0xff00ffff) | tmp0 << 16;
3534               break;
3535     case  7:  tmp1 = (buf0[1] >> 24) & 0xff;
3536               buf0[1]  = (buf0[1] & 0x00ffffff) | tmp0 << 24;
3537               break;
3538     case  8:  tmp1 = (buf0[2] >>  0) & 0xff;
3539               buf0[2]  = (buf0[2] & 0xffffff00) | tmp0 <<  0;
3540               break;
3541     case  9:  tmp1 = (buf0[2] >>  8) & 0xff;
3542               buf0[2]  = (buf0[2] & 0xffff00ff) | tmp0 <<  8;
3543               break;
3544     case 10:  tmp1 = (buf0[2] >> 16) & 0xff;
3545               buf0[2]  = (buf0[2] & 0xff00ffff) | tmp0 << 16;
3546               break;
3547     case 11:  tmp1 = (buf0[2] >> 24) & 0xff;
3548               buf0[2]  = (buf0[2] & 0x00ffffff) | tmp0 << 24;
3549               break;
3550     case 12:  tmp1 = (buf0[3] >>  0) & 0xff;
3551               buf0[3]  = (buf0[3] & 0xffffff00) | tmp0 <<  0;
3552               break;
3553     case 13:  tmp1 = (buf0[3] >>  8) & 0xff;
3554               buf0[3]  = (buf0[3] & 0xffff00ff) | tmp0 <<  8;
3555               break;
3556     case 14:  tmp1 = (buf0[3] >> 16) & 0xff;
3557               buf0[3]  = (buf0[3] & 0xff00ffff) | tmp0 << 16;
3558               break;
3559     case 15:  tmp1 = (buf0[3] >> 24) & 0xff;
3560               buf0[3]  = (buf0[3] & 0x00ffffff) | tmp0 << 24;
3561               break;
3562     case 16:  tmp1 = (buf1[0] >>  0) & 0xff;
3563               buf1[0]  = (buf1[0] & 0xffffff00) | tmp0 <<  0;
3564               break;
3565     case 17:  tmp1 = (buf1[0] >>  8) & 0xff;
3566               buf1[0]  = (buf1[0] & 0xffff00ff) | tmp0 <<  8;
3567               break;
3568     case 18:  tmp1 = (buf1[0] >> 16) & 0xff;
3569               buf1[0]  = (buf1[0] & 0xff00ffff) | tmp0 << 16;
3570               break;
3571     case 19:  tmp1 = (buf1[0] >> 24) & 0xff;
3572               buf1[0]  = (buf1[0] & 0x00ffffff) | tmp0 << 24;
3573               break;
3574     case 20:  tmp1 = (buf1[1] >>  0) & 0xff;
3575               buf1[1]  = (buf1[1] & 0xffffff00) | tmp0 <<  0;
3576               break;
3577     case 21:  tmp1 = (buf1[1] >>  8) & 0xff;
3578               buf1[1]  = (buf1[1] & 0xffff00ff) | tmp0 <<  8;
3579               break;
3580     case 22:  tmp1 = (buf1[1] >> 16) & 0xff;
3581               buf1[1]  = (buf1[1] & 0xff00ffff) | tmp0 << 16;
3582               break;
3583     case 23:  tmp1 = (buf1[1] >> 24) & 0xff;
3584               buf1[1]  = (buf1[1] & 0x00ffffff) | tmp0 << 24;
3585               break;
3586     case 24:  tmp1 = (buf1[2] >>  0) & 0xff;
3587               buf1[2]  = (buf1[2] & 0xffffff00) | tmp0 <<  0;
3588               break;
3589     case 25:  tmp1 = (buf1[2] >>  8) & 0xff;
3590               buf1[2]  = (buf1[2] & 0xffff00ff) | tmp0 <<  8;
3591               break;
3592     case 26:  tmp1 = (buf1[2] >> 16) & 0xff;
3593               buf1[2]  = (buf1[2] & 0xff00ffff) | tmp0 << 16;
3594               break;
3595     case 27:  tmp1 = (buf1[2] >> 24) & 0xff;
3596               buf1[2]  = (buf1[2] & 0x00ffffff) | tmp0 << 24;
3597               break;
3598     case 28:  tmp1 = (buf1[3] >>  0) & 0xff;
3599               buf1[3]  = (buf1[3] & 0xffffff00) | tmp0 <<  0;
3600               break;
3601     case 29:  tmp1 = (buf1[3] >>  8) & 0xff;
3602               buf1[3]  = (buf1[3] & 0xffff00ff) | tmp0 <<  8;
3603               break;
3604     case 30:  tmp1 = (buf1[3] >> 16) & 0xff;
3605               buf1[3]  = (buf1[3] & 0xff00ffff) | tmp0 << 16;
3606               break;
3607     case 31:  tmp1 = (buf1[3] >> 24) & 0xff;
3608               buf1[3]  = (buf1[3] & 0x00ffffff) | tmp0 << 24;
3609               break;
3610   }
3611
3612   switch (p0)
3613   {
3614     case  0:  buf0[0]  = (buf0[0] & 0xffffff00) | tmp1 <<  0;
3615               break;
3616     case  1:  buf0[0]  = (buf0[0] & 0xffff00ff) | tmp1 <<  8;
3617               break;
3618     case  2:  buf0[0]  = (buf0[0] & 0xff00ffff) | tmp1 << 16;
3619               break;
3620     case  3:  buf0[0]  = (buf0[0] & 0x00ffffff) | tmp1 << 24;
3621               break;
3622     case  4:  buf0[1]  = (buf0[1] & 0xffffff00) | tmp1 <<  0;
3623               break;
3624     case  5:  buf0[1]  = (buf0[1] & 0xffff00ff) | tmp1 <<  8;
3625               break;
3626     case  6:  buf0[1]  = (buf0[1] & 0xff00ffff) | tmp1 << 16;
3627               break;
3628     case  7:  buf0[1]  = (buf0[1] & 0x00ffffff) | tmp1 << 24;
3629               break;
3630     case  8:  buf0[2]  = (buf0[2] & 0xffffff00) | tmp1 <<  0;
3631               break;
3632     case  9:  buf0[2]  = (buf0[2] & 0xffff00ff) | tmp1 <<  8;
3633               break;
3634     case 10:  buf0[2]  = (buf0[2] & 0xff00ffff) | tmp1 << 16;
3635               break;
3636     case 11:  buf0[2]  = (buf0[2] & 0x00ffffff) | tmp1 << 24;
3637               break;
3638     case 12:  buf0[3]  = (buf0[3] & 0xffffff00) | tmp1 <<  0;
3639               break;
3640     case 13:  buf0[3]  = (buf0[3] & 0xffff00ff) | tmp1 <<  8;
3641               break;
3642     case 14:  buf0[3]  = (buf0[3] & 0xff00ffff) | tmp1 << 16;
3643               break;
3644     case 15:  buf0[3]  = (buf0[3] & 0x00ffffff) | tmp1 << 24;
3645               break;
3646     case 16:  buf1[0]  = (buf1[0] & 0xffffff00) | tmp1 <<  0;
3647               break;
3648     case 17:  buf1[0]  = (buf1[0] & 0xffff00ff) | tmp1 <<  8;
3649               break;
3650     case 18:  buf1[0]  = (buf1[0] & 0xff00ffff) | tmp1 << 16;
3651               break;
3652     case 19:  buf1[0]  = (buf1[0] & 0x00ffffff) | tmp1 << 24;
3653               break;
3654     case 20:  buf1[1]  = (buf1[1] & 0xffffff00) | tmp1 <<  0;
3655               break;
3656     case 21:  buf1[1]  = (buf1[1] & 0xffff00ff) | tmp1 <<  8;
3657               break;
3658     case 22:  buf1[1]  = (buf1[1] & 0xff00ffff) | tmp1 << 16;
3659               break;
3660     case 23:  buf1[1]  = (buf1[1] & 0x00ffffff) | tmp1 << 24;
3661               break;
3662     case 24:  buf1[2]  = (buf1[2] & 0xffffff00) | tmp1 <<  0;
3663               break;
3664     case 25:  buf1[2]  = (buf1[2] & 0xffff00ff) | tmp1 <<  8;
3665               break;
3666     case 26:  buf1[2]  = (buf1[2] & 0xff00ffff) | tmp1 << 16;
3667               break;
3668     case 27:  buf1[2]  = (buf1[2] & 0x00ffffff) | tmp1 << 24;
3669               break;
3670     case 28:  buf1[3]  = (buf1[3] & 0xffffff00) | tmp1 <<  0;
3671               break;
3672     case 29:  buf1[3]  = (buf1[3] & 0xffff00ff) | tmp1 <<  8;
3673               break;
3674     case 30:  buf1[3]  = (buf1[3] & 0xff00ffff) | tmp1 << 16;
3675               break;
3676     case 31:  buf1[3]  = (buf1[3] & 0x00ffffff) | tmp1 << 24;
3677               break;
3678   }
3679   #endif
3680
3681   return in_len;
3682 }
3683
3684 inline u32 rule_op_mangle_chr_shiftl (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
3685 {
3686   if (p0 >= in_len) return (in_len);
3687
3688   const u32 mr = 0xffu << ((p0 & 3) * 8);
3689   const u32 ml = ~mr;
3690
3691   switch (p0 / 4)
3692   {
3693     case  0:  buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) << 1) & mr); break;
3694     case  1:  buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) << 1) & mr); break;
3695     case  2:  buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) << 1) & mr); break;
3696     case  3:  buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) << 1) & mr); break;
3697     case  4:  buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) << 1) & mr); break;
3698     case  5:  buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) << 1) & mr); break;
3699     case  6:  buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) << 1) & mr); break;
3700     case  7:  buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) << 1) & mr); break;
3701   }
3702
3703   return in_len;
3704 }
3705
3706 inline u32 rule_op_mangle_chr_shiftr (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
3707 {
3708   if (p0 >= in_len) return (in_len);
3709
3710   const u32 mr = 0xffu << ((p0 & 3) * 8);
3711   const u32 ml = ~mr;
3712
3713   switch (p0 / 4)
3714   {
3715     case  0:  buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) >> 1) & mr); break;
3716     case  1:  buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) >> 1) & mr); break;
3717     case  2:  buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) >> 1) & mr); break;
3718     case  3:  buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) >> 1) & mr); break;
3719     case  4:  buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) >> 1) & mr); break;
3720     case  5:  buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) >> 1) & mr); break;
3721     case  6:  buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) >> 1) & mr); break;
3722     case  7:  buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) >> 1) & mr); break;
3723   }
3724
3725   return in_len;
3726 }
3727
3728 inline u32 rule_op_mangle_chr_incr (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
3729 {
3730   if (p0 >= in_len) return (in_len);
3731
3732   const u32 mr = 0xffu << ((p0 & 3) * 8);
3733   const u32 ml = ~mr;
3734
3735   const u32 n = 0x01010101 & mr;
3736
3737   switch (p0 / 4)
3738   {
3739     case  0:  buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) + n) & mr); break;
3740     case  1:  buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) + n) & mr); break;
3741     case  2:  buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) + n) & mr); break;
3742     case  3:  buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) + n) & mr); break;
3743     case  4:  buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) + n) & mr); break;
3744     case  5:  buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) + n) & mr); break;
3745     case  6:  buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) + n) & mr); break;
3746     case  7:  buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) + n) & mr); break;
3747   }
3748
3749   return in_len;
3750 }
3751
3752 inline u32 rule_op_mangle_chr_decr (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
3753 {
3754   if (p0 >= in_len) return (in_len);
3755
3756   const u32 mr = 0xffu << ((p0 & 3) * 8);
3757   const u32 ml = ~mr;
3758
3759   const u32 n = 0x01010101 & mr;
3760
3761   switch (p0 / 4)
3762   {
3763     case  0:  buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) - n) & mr); break;
3764     case  1:  buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) - n) & mr); break;
3765     case  2:  buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) - n) & mr); break;
3766     case  3:  buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) - n) & mr); break;
3767     case  4:  buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) - n) & mr); break;
3768     case  5:  buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) - n) & mr); break;
3769     case  6:  buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) - n) & mr); break;
3770     case  7:  buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) - n) & mr); break;
3771   }
3772
3773   return in_len;
3774 }
3775
3776 inline u32 rule_op_mangle_replace_np1 (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
3777 {
3778   if ((p0 + 1) >= in_len) return (in_len);
3779
3780   u32 tib40[4];
3781   u32 tib41[4];
3782
3783   lshift_block (buf0, buf1, tib40, tib41);
3784
3785   const u32 mr = 0xffu << ((p0 & 3) * 8);
3786   const u32 ml = ~mr;
3787
3788   switch (p0 / 4)
3789   {
3790     case  0:  buf0[0] = (buf0[0] & ml) | (tib40[0] & mr); break;
3791     case  1:  buf0[1] = (buf0[1] & ml) | (tib40[1] & mr); break;
3792     case  2:  buf0[2] = (buf0[2] & ml) | (tib40[2] & mr); break;
3793     case  3:  buf0[3] = (buf0[3] & ml) | (tib40[3] & mr); break;
3794     case  4:  buf1[0] = (buf1[0] & ml) | (tib41[0] & mr); break;
3795     case  5:  buf1[1] = (buf1[1] & ml) | (tib41[1] & mr); break;
3796     case  6:  buf1[2] = (buf1[2] & ml) | (tib41[2] & mr); break;
3797     case  7:  buf1[3] = (buf1[3] & ml) | (tib41[3] & mr); break;
3798   }
3799
3800   return in_len;
3801 }
3802
3803 inline u32 rule_op_mangle_replace_nm1 (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
3804 {
3805   if (p0 == 0) return (in_len);
3806
3807   if (p0 >= in_len) return (in_len);
3808
3809   u32 tib40[4];
3810   u32 tib41[4];
3811
3812   rshift_block (buf0, buf1, tib40, tib41);
3813
3814   const u32 mr = 0xffu << ((p0 & 3) * 8);
3815   const u32 ml = ~mr;
3816
3817   switch (p0 / 4)
3818   {
3819     case  0:  buf0[0] = (buf0[0] & ml) | (tib40[0] & mr); break;
3820     case  1:  buf0[1] = (buf0[1] & ml) | (tib40[1] & mr); break;
3821     case  2:  buf0[2] = (buf0[2] & ml) | (tib40[2] & mr); break;
3822     case  3:  buf0[3] = (buf0[3] & ml) | (tib40[3] & mr); break;
3823     case  4:  buf1[0] = (buf1[0] & ml) | (tib41[0] & mr); break;
3824     case  5:  buf1[1] = (buf1[1] & ml) | (tib41[1] & mr); break;
3825     case  6:  buf1[2] = (buf1[2] & ml) | (tib41[2] & mr); break;
3826     case  7:  buf1[3] = (buf1[3] & ml) | (tib41[3] & mr); break;
3827   }
3828
3829   return in_len;
3830 }
3831
3832 inline u32 rule_op_mangle_dupeblock_first (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
3833 {
3834   if (p0 > in_len) return (in_len);
3835
3836   if ((in_len + p0) >= 32) return (in_len);
3837
3838   u32 out_len = in_len;
3839
3840   u32 tib40[4];
3841   u32 tib41[4];
3842
3843   tib40[0] = buf0[0];
3844   tib40[1] = buf0[1];
3845   tib40[2] = buf0[2];
3846   tib40[3] = buf0[3];
3847   tib41[0] = buf1[0];
3848   tib41[1] = buf1[1];
3849   tib41[2] = buf1[2];
3850   tib41[3] = buf1[3];
3851
3852   truncate_right (tib40, tib41, p0);
3853
3854   rshift_block_N (buf0, buf1, buf0, buf1, p0);
3855
3856   buf0[0] |= tib40[0];
3857   buf0[1] |= tib40[1];
3858   buf0[2] |= tib40[2];
3859   buf0[3] |= tib40[3];
3860   buf1[0] |= tib41[0];
3861   buf1[1] |= tib41[1];
3862   buf1[2] |= tib41[2];
3863   buf1[3] |= tib41[3];
3864
3865   out_len += p0;
3866
3867   return out_len;
3868 }
3869
3870 inline u32 rule_op_mangle_dupeblock_last (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
3871 {
3872   if (p0 > in_len) return (in_len);
3873
3874   if ((in_len + p0) >= 32) return (in_len);
3875
3876   u32 out_len = in_len;
3877
3878   u32 tib40[4];
3879   u32 tib41[4];
3880
3881   rshift_block_N (buf0, buf1, tib40, tib41, p0);
3882
3883   truncate_left (tib40, tib41, out_len);
3884
3885   buf0[0] |= tib40[0];
3886   buf0[1] |= tib40[1];
3887   buf0[2] |= tib40[2];
3888   buf0[3] |= tib40[3];
3889   buf1[0] |= tib41[0];
3890   buf1[1] |= tib41[1];
3891   buf1[2] |= tib41[2];
3892   buf1[3] |= tib41[3];
3893
3894   out_len += p0;
3895
3896   return out_len;
3897 }
3898
3899 inline u32 rule_op_mangle_title (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
3900 {
3901   buf0[0] |= (generate_cmask (buf0[0]));
3902   buf0[1] |= (generate_cmask (buf0[1]));
3903   buf0[2] |= (generate_cmask (buf0[2]));
3904   buf0[3] |= (generate_cmask (buf0[3]));
3905   buf1[0] |= (generate_cmask (buf1[0]));
3906   buf1[1] |= (generate_cmask (buf1[1]));
3907   buf1[2] |= (generate_cmask (buf1[2]));
3908   buf1[3] |= (generate_cmask (buf1[3]));
3909
3910   #ifdef IS_NV
3911   buf0[0] &= ~(0x00000020 & generate_cmask (buf0[0]));
3912
3913   for (u32 i = 0; i < in_len; i++)
3914   {
3915     u32 tmp0;
3916     u32 tmp1;
3917
3918     switch (i)
3919     {
3920       case  0:  tmp0 = __byte_perm_S (buf0[0], 0, 0x6540);
3921                 tmp1 = ~(0x00002000 & generate_cmask (buf0[0])); break;
3922       case  1:  tmp0 = __byte_perm_S (buf0[0], 0, 0x6541);
3923                 tmp1 = ~(0x00200000 & generate_cmask (buf0[0])); break;
3924       case  2:  tmp0 = __byte_perm_S (buf0[0], 0, 0x6542);
3925                 tmp1 = ~(0x20000000 & generate_cmask (buf0[0])); break;
3926       case  3:  tmp0 = __byte_perm_S (buf0[0], 0, 0x6543);
3927                 tmp1 = ~(0x00000020 & generate_cmask (buf0[1])); break;
3928       case  4:  tmp0 = __byte_perm_S (buf0[1], 0, 0x6540);
3929                 tmp1 = ~(0x00002000 & generate_cmask (buf0[1])); break;
3930       case  5:  tmp0 = __byte_perm_S (buf0[1], 0, 0x6541);
3931                 tmp1 = ~(0x00200000 & generate_cmask (buf0[1])); break;
3932       case  6:  tmp0 = __byte_perm_S (buf0[1], 0, 0x6542);
3933                 tmp1 = ~(0x20000000 & generate_cmask (buf0[1])); break;
3934       case  7:  tmp0 = __byte_perm_S (buf0[1], 0, 0x6543);
3935                 tmp1 = ~(0x00000020 & generate_cmask (buf0[2])); break;
3936       case  8:  tmp0 = __byte_perm_S (buf0[2], 0, 0x6540);
3937                 tmp1 = ~(0x00002000 & generate_cmask (buf0[2])); break;
3938       case  9:  tmp0 = __byte_perm_S (buf0[2], 0, 0x6541);
3939                 tmp1 = ~(0x00200000 & generate_cmask (buf0[2])); break;
3940       case 10:  tmp0 = __byte_perm_S (buf0[2], 0, 0x6542);
3941                 tmp1 = ~(0x20000000 & generate_cmask (buf0[2])); break;
3942       case 11:  tmp0 = __byte_perm_S (buf0[2], 0, 0x6543);
3943                 tmp1 = ~(0x00000020 & generate_cmask (buf0[3])); break;
3944       case 12:  tmp0 = __byte_perm_S (buf0[3], 0, 0x6540);
3945                 tmp1 = ~(0x00002000 & generate_cmask (buf0[3])); break;
3946       case 13:  tmp0 = __byte_perm_S (buf0[3], 0, 0x6541);
3947                 tmp1 = ~(0x00200000 & generate_cmask (buf0[3])); break;
3948       case 14:  tmp0 = __byte_perm_S (buf0[3], 0, 0x6542);
3949                 tmp1 = ~(0x20000000 & generate_cmask (buf0[3])); break;
3950       case 15:  tmp0 = __byte_perm_S (buf0[3], 0, 0x6543);
3951                 tmp1 = ~(0x00000020 & generate_cmask (buf1[0])); break;
3952       case 16:  tmp0 = __byte_perm_S (buf1[0], 0, 0x6540);
3953                 tmp1 = ~(0x00002000 & generate_cmask (buf1[0])); break;
3954       case 17:  tmp0 = __byte_perm_S (buf1[0], 0, 0x6541);
3955                 tmp1 = ~(0x00200000 & generate_cmask (buf1[0])); break;
3956       case 18:  tmp0 = __byte_perm_S (buf1[0], 0, 0x6542);
3957                 tmp1 = ~(0x20000000 & generate_cmask (buf1[0])); break;
3958       case 19:  tmp0 = __byte_perm_S (buf1[0], 0, 0x6543);
3959                 tmp1 = ~(0x00000020 & generate_cmask (buf1[1])); break;
3960       case 20:  tmp0 = __byte_perm_S (buf1[1], 0, 0x6540);
3961                 tmp1 = ~(0x00002000 & generate_cmask (buf1[1])); break;
3962       case 21:  tmp0 = __byte_perm_S (buf1[1], 0, 0x6541);
3963                 tmp1 = ~(0x00200000 & generate_cmask (buf1[1])); break;
3964       case 22:  tmp0 = __byte_perm_S (buf1[1], 0, 0x6542);
3965                 tmp1 = ~(0x20000000 & generate_cmask (buf1[1])); break;
3966       case 23:  tmp0 = __byte_perm_S (buf1[1], 0, 0x6543);
3967                 tmp1 = ~(0x00000020 & generate_cmask (buf1[2])); break;
3968       case 24:  tmp0 = __byte_perm_S (buf1[2], 0, 0x6540);
3969                 tmp1 = ~(0x00002000 & generate_cmask (buf1[2])); break;
3970       case 25:  tmp0 = __byte_perm_S (buf1[2], 0, 0x6541);
3971                 tmp1 = ~(0x00200000 & generate_cmask (buf1[2])); break;
3972       case 26:  tmp0 = __byte_perm_S (buf1[2], 0, 0x6542);
3973                 tmp1 = ~(0x20000000 & generate_cmask (buf1[2])); break;
3974       case 27:  tmp0 = __byte_perm_S (buf1[2], 0, 0x6543);
3975                 tmp1 = ~(0x00000020 & generate_cmask (buf1[3])); break;
3976       case 28:  tmp0 = __byte_perm_S (buf1[3], 0, 0x6540);
3977                 tmp1 = ~(0x00002000 & generate_cmask (buf1[3])); break;
3978       case 29:  tmp0 = __byte_perm_S (buf1[3], 0, 0x6541);
3979                 tmp1 = ~(0x00200000 & generate_cmask (buf1[3])); break;
3980       case 30:  tmp0 = __byte_perm_S (buf1[3], 0, 0x6542);
3981                 tmp1 = ~(0x20000000 & generate_cmask (buf1[3])); break;
3982     }
3983
3984     if (i < 3)
3985     {
3986       if (tmp0   == ' ') buf0[0]   &= tmp1  ;
3987     }
3988     else if (i < 7)
3989     {
3990       if (tmp0   == ' ') buf0[1]   &= tmp1  ;
3991     }
3992     else if (i < 11)
3993     {
3994       if (tmp0   == ' ') buf0[2]   &= tmp1  ;
3995     }
3996     else if (i < 15)
3997     {
3998       if (tmp0   == ' ') buf0[3]   &= tmp1  ;
3999     }
4000     else if (i < 19)
4001     {
4002       if (tmp0   == ' ') buf1[0]   &= tmp1  ;
4003     }
4004     else if (i < 23)
4005     {
4006       if (tmp0   == ' ') buf1[1]   &= tmp1  ;
4007     }
4008     else if (i < 27)
4009     {
4010       if (tmp0   == ' ') buf1[2]   &= tmp1  ;
4011     }
4012     else if (i < 31)
4013     {
4014       if (tmp0   == ' ') buf1[3]   &= tmp1  ;
4015     }
4016   }
4017   #endif
4018
4019   #if defined IS_AMD || defined IS_GENERIC
4020   u32 tib40[4];
4021   u32 tib41[4];
4022
4023   const uchar4 tmp0 = (uchar4) (' ');
4024   const uchar4 tmp1 = (uchar4) (0x00);
4025   const uchar4 tmp2 = (uchar4) (0xff);
4026
4027   uchar4 tmp;
4028
4029   tmp = as_uchar4 (buf0[0]); tmp = select (tmp1, tmp2, tmp == tmp0); tib40[0] = as_uint (tmp);
4030   tmp = as_uchar4 (buf0[1]); tmp = select (tmp1, tmp2, tmp == tmp0); tib40[1] = as_uint (tmp);
4031   tmp = as_uchar4 (buf0[2]); tmp = select (tmp1, tmp2, tmp == tmp0); tib40[2] = as_uint (tmp);
4032   tmp = as_uchar4 (buf0[3]); tmp = select (tmp1, tmp2, tmp == tmp0); tib40[3] = as_uint (tmp);
4033   tmp = as_uchar4 (buf1[0]); tmp = select (tmp1, tmp2, tmp == tmp0); tib41[0] = as_uint (tmp);
4034   tmp = as_uchar4 (buf1[1]); tmp = select (tmp1, tmp2, tmp == tmp0); tib41[1] = as_uint (tmp);
4035   tmp = as_uchar4 (buf1[2]); tmp = select (tmp1, tmp2, tmp == tmp0); tib41[2] = as_uint (tmp);
4036   tmp = as_uchar4 (buf1[3]); tmp = select (tmp1, tmp2, tmp == tmp0); tib41[3] = as_uint (tmp);
4037
4038   rshift_block (tib40, tib41, tib40, tib41); tib40[0] |= 0xff;
4039
4040   buf0[0] &= ~(generate_cmask (buf0[0]) & tib40[0]);
4041   buf0[1] &= ~(generate_cmask (buf0[1]) & tib40[1]);
4042   buf0[2] &= ~(generate_cmask (buf0[2]) & tib40[2]);
4043   buf0[3] &= ~(generate_cmask (buf0[3]) & tib40[3]);
4044   buf1[0] &= ~(generate_cmask (buf1[0]) & tib41[0]);
4045   buf1[1] &= ~(generate_cmask (buf1[1]) & tib41[1]);
4046   buf1[2] &= ~(generate_cmask (buf1[2]) & tib41[2]);
4047   buf1[3] &= ~(generate_cmask (buf1[3]) & tib41[3]);
4048   #endif
4049
4050   return in_len;
4051 }
4052
4053 inline u32 apply_rule (const u32 name, const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
4054 {
4055   u32 out_len = in_len;
4056
4057   switch (name)
4058   {
4059     case RULE_OP_MANGLE_LREST:            out_len = rule_op_mangle_lrest            (p0, p1, buf0, buf1, out_len); break;
4060     case RULE_OP_MANGLE_UREST:            out_len = rule_op_mangle_urest            (p0, p1, buf0, buf1, out_len); break;
4061     case RULE_OP_MANGLE_LREST_UFIRST:     out_len = rule_op_mangle_lrest_ufirst     (p0, p1, buf0, buf1, out_len); break;
4062     case RULE_OP_MANGLE_UREST_LFIRST:     out_len = rule_op_mangle_urest_lfirst     (p0, p1, buf0, buf1, out_len); break;
4063     case RULE_OP_MANGLE_TREST:            out_len = rule_op_mangle_trest            (p0, p1, buf0, buf1, out_len); break;
4064     case RULE_OP_MANGLE_TOGGLE_AT:        out_len = rule_op_mangle_toggle_at        (p0, p1, buf0, buf1, out_len); break;
4065     case RULE_OP_MANGLE_REVERSE:          out_len = rule_op_mangle_reverse          (p0, p1, buf0, buf1, out_len); break;
4066     case RULE_OP_MANGLE_DUPEWORD:         out_len = rule_op_mangle_dupeword         (p0, p1, buf0, buf1, out_len); break;
4067     case RULE_OP_MANGLE_DUPEWORD_TIMES:   out_len = rule_op_mangle_dupeword_times   (p0, p1, buf0, buf1, out_len); break;
4068     case RULE_OP_MANGLE_REFLECT:          out_len = rule_op_mangle_reflect          (p0, p1, buf0, buf1, out_len); break;
4069     case RULE_OP_MANGLE_APPEND:           out_len = rule_op_mangle_append           (p0, p1, buf0, buf1, out_len); break;
4070     case RULE_OP_MANGLE_PREPEND:          out_len = rule_op_mangle_prepend          (p0, p1, buf0, buf1, out_len); break;
4071     case RULE_OP_MANGLE_ROTATE_LEFT:      out_len = rule_op_mangle_rotate_left      (p0, p1, buf0, buf1, out_len); break;
4072     case RULE_OP_MANGLE_ROTATE_RIGHT:     out_len = rule_op_mangle_rotate_right     (p0, p1, buf0, buf1, out_len); break;
4073     case RULE_OP_MANGLE_DELETE_FIRST:     out_len = rule_op_mangle_delete_first     (p0, p1, buf0, buf1, out_len); break;
4074     case RULE_OP_MANGLE_DELETE_LAST:      out_len = rule_op_mangle_delete_last      (p0, p1, buf0, buf1, out_len); break;
4075     case RULE_OP_MANGLE_DELETE_AT:        out_len = rule_op_mangle_delete_at        (p0, p1, buf0, buf1, out_len); break;
4076     case RULE_OP_MANGLE_EXTRACT:          out_len = rule_op_mangle_extract          (p0, p1, buf0, buf1, out_len); break;
4077     case RULE_OP_MANGLE_OMIT:             out_len = rule_op_mangle_omit             (p0, p1, buf0, buf1, out_len); break;
4078     case RULE_OP_MANGLE_INSERT:           out_len = rule_op_mangle_insert           (p0, p1, buf0, buf1, out_len); break;
4079     case RULE_OP_MANGLE_OVERSTRIKE:       out_len = rule_op_mangle_overstrike       (p0, p1, buf0, buf1, out_len); break;
4080     case RULE_OP_MANGLE_TRUNCATE_AT:      out_len = rule_op_mangle_truncate_at      (p0, p1, buf0, buf1, out_len); break;
4081     case RULE_OP_MANGLE_REPLACE:          out_len = rule_op_mangle_replace          (p0, p1, buf0, buf1, out_len); break;
4082     //case RULE_OP_MANGLE_PURGECHAR:        out_len = rule_op_mangle_purgechar        (p0, p1, buf0, buf1, out_len); break;
4083     //case RULE_OP_MANGLE_TOGGLECASE_REC:   out_len = rule_op_mangle_togglecase_rec   (p0, p1, buf0, buf1, out_len); break;
4084     case RULE_OP_MANGLE_DUPECHAR_FIRST:   out_len = rule_op_mangle_dupechar_first   (p0, p1, buf0, buf1, out_len); break;
4085     case RULE_OP_MANGLE_DUPECHAR_LAST:    out_len = rule_op_mangle_dupechar_last    (p0, p1, buf0, buf1, out_len); break;
4086     case RULE_OP_MANGLE_DUPECHAR_ALL:     out_len = rule_op_mangle_dupechar_all     (p0, p1, buf0, buf1, out_len); break;
4087     case RULE_OP_MANGLE_SWITCH_FIRST:     out_len = rule_op_mangle_switch_first     (p0, p1, buf0, buf1, out_len); break;
4088     case RULE_OP_MANGLE_SWITCH_LAST:      out_len = rule_op_mangle_switch_last      (p0, p1, buf0, buf1, out_len); break;
4089     case RULE_OP_MANGLE_SWITCH_AT:        out_len = rule_op_mangle_switch_at        (p0, p1, buf0, buf1, out_len); break;
4090     case RULE_OP_MANGLE_CHR_SHIFTL:       out_len = rule_op_mangle_chr_shiftl       (p0, p1, buf0, buf1, out_len); break;
4091     case RULE_OP_MANGLE_CHR_SHIFTR:       out_len = rule_op_mangle_chr_shiftr       (p0, p1, buf0, buf1, out_len); break;
4092     case RULE_OP_MANGLE_CHR_INCR:         out_len = rule_op_mangle_chr_incr         (p0, p1, buf0, buf1, out_len); break;
4093     case RULE_OP_MANGLE_CHR_DECR:         out_len = rule_op_mangle_chr_decr         (p0, p1, buf0, buf1, out_len); break;
4094     case RULE_OP_MANGLE_REPLACE_NP1:      out_len = rule_op_mangle_replace_np1      (p0, p1, buf0, buf1, out_len); break;
4095     case RULE_OP_MANGLE_REPLACE_NM1:      out_len = rule_op_mangle_replace_nm1      (p0, p1, buf0, buf1, out_len); break;
4096     case RULE_OP_MANGLE_DUPEBLOCK_FIRST:  out_len = rule_op_mangle_dupeblock_first  (p0, p1, buf0, buf1, out_len); break;
4097     case RULE_OP_MANGLE_DUPEBLOCK_LAST:   out_len = rule_op_mangle_dupeblock_last   (p0, p1, buf0, buf1, out_len); break;
4098     case RULE_OP_MANGLE_TITLE:            out_len = rule_op_mangle_title            (p0, p1, buf0, buf1, out_len); break;
4099   }
4100
4101   return out_len;
4102 }
4103
4104 inline u32 apply_rules (const __global u32 *cmds, u32 buf0[4], u32 buf1[4], const u32 len)
4105 {
4106   u32 out_len = len;
4107
4108   for (u32 i = 0; cmds[i] != 0; i++)
4109   {
4110     const u32 cmd = cmds[i];
4111
4112     const u32 name = (cmd >>  0) & 0xff;
4113     const u32 p0   = (cmd >>  8) & 0xff;
4114     const u32 p1   = (cmd >> 16) & 0xff;
4115
4116     out_len = apply_rule (name, p0, p1, buf0, buf1, out_len);
4117   }
4118
4119   return out_len;
4120 }
4121
4122 inline u32x apply_rules_vect (const u32 pw_buf0[4], const u32 pw_buf1[4], const u32 pw_len, const __global kernel_rule_t *rules_buf, const u32 il_pos, u32x w0[4], u32x w1[4])
4123 {
4124   #if VECT_SIZE == 1
4125
4126   w0[0] = pw_buf0[0];
4127   w0[1] = pw_buf0[1];
4128   w0[2] = pw_buf0[2];
4129   w0[3] = pw_buf0[3];
4130   w1[0] = pw_buf1[0];
4131   w1[1] = pw_buf1[1];
4132   w1[2] = pw_buf1[2];
4133   w1[3] = pw_buf1[3];
4134
4135   return apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
4136
4137   #else
4138
4139   u32x out_len = 0;
4140
4141   #ifdef _unroll
4142   #pragma unroll
4143   #endif
4144   for (int i = 0; i < VECT_SIZE; i++)
4145   {
4146     u32 tmp0[4];
4147     u32 tmp1[4];
4148
4149     tmp0[0] = pw_buf0[0];
4150     tmp0[1] = pw_buf0[1];
4151     tmp0[2] = pw_buf0[2];
4152     tmp0[3] = pw_buf0[3];
4153     tmp1[0] = pw_buf1[0];
4154     tmp1[1] = pw_buf1[1];
4155     tmp1[2] = pw_buf1[2];
4156     tmp1[3] = pw_buf1[3];
4157
4158     const u32 tmp_len = apply_rules (rules_buf[il_pos + i].cmds, tmp0, tmp1, pw_len);
4159
4160     switch (i)
4161     {
4162       #if VECT_SIZE >= 2
4163       case 0:
4164         w0[0].s0 = tmp0[0];
4165         w0[1].s0 = tmp0[1];
4166         w0[2].s0 = tmp0[2];
4167         w0[3].s0 = tmp0[3];
4168         w1[0].s0 = tmp1[0];
4169         w1[1].s0 = tmp1[1];
4170         w1[2].s0 = tmp1[2];
4171         w1[3].s0 = tmp1[3];
4172         out_len.s0 = tmp_len;
4173         break;
4174
4175       case 1:
4176         w0[0].s1 = tmp0[0];
4177         w0[1].s1 = tmp0[1];
4178         w0[2].s1 = tmp0[2];
4179         w0[3].s1 = tmp0[3];
4180         w1[0].s1 = tmp1[0];
4181         w1[1].s1 = tmp1[1];
4182         w1[2].s1 = tmp1[2];
4183         w1[3].s1 = tmp1[3];
4184         out_len.s1 = tmp_len;
4185         break;
4186       #endif
4187
4188       #if VECT_SIZE >= 4
4189       case 2:
4190         w0[0].s2 = tmp0[0];
4191         w0[1].s2 = tmp0[1];
4192         w0[2].s2 = tmp0[2];
4193         w0[3].s2 = tmp0[3];
4194         w1[0].s2 = tmp1[0];
4195         w1[1].s2 = tmp1[1];
4196         w1[2].s2 = tmp1[2];
4197         w1[3].s2 = tmp1[3];
4198         out_len.s2 = tmp_len;
4199         break;
4200
4201       case 3:
4202         w0[0].s3 = tmp0[0];
4203         w0[1].s3 = tmp0[1];
4204         w0[2].s3 = tmp0[2];
4205         w0[3].s3 = tmp0[3];
4206         w1[0].s3 = tmp1[0];
4207         w1[1].s3 = tmp1[1];
4208         w1[2].s3 = tmp1[2];
4209         w1[3].s3 = tmp1[3];
4210         out_len.s3 = tmp_len;
4211         break;
4212       #endif
4213
4214       #if VECT_SIZE >= 8
4215       case 4:
4216         w0[0].s4 = tmp0[0];
4217         w0[1].s4 = tmp0[1];
4218         w0[2].s4 = tmp0[2];
4219         w0[3].s4 = tmp0[3];
4220         w1[0].s4 = tmp1[0];
4221         w1[1].s4 = tmp1[1];
4222         w1[2].s4 = tmp1[2];
4223         w1[3].s4 = tmp1[3];
4224         out_len.s4 = tmp_len;
4225         break;
4226
4227       case 5:
4228         w0[0].s5 = tmp0[0];
4229         w0[1].s5 = tmp0[1];
4230         w0[2].s5 = tmp0[2];
4231         w0[3].s5 = tmp0[3];
4232         w1[0].s5 = tmp1[0];
4233         w1[1].s5 = tmp1[1];
4234         w1[2].s5 = tmp1[2];
4235         w1[3].s5 = tmp1[3];
4236         out_len.s5 = tmp_len;
4237         break;
4238
4239       case 6:
4240         w0[0].s6 = tmp0[0];
4241         w0[1].s6 = tmp0[1];
4242         w0[2].s6 = tmp0[2];
4243         w0[3].s6 = tmp0[3];
4244         w1[0].s6 = tmp1[0];
4245         w1[1].s6 = tmp1[1];
4246         w1[2].s6 = tmp1[2];
4247         w1[3].s6 = tmp1[3];
4248         out_len.s6 = tmp_len;
4249         break;
4250
4251       case 7:
4252         w0[0].s7 = tmp0[0];
4253         w0[1].s7 = tmp0[1];
4254         w0[2].s7 = tmp0[2];
4255         w0[3].s7 = tmp0[3];
4256         w1[0].s7 = tmp1[0];
4257         w1[1].s7 = tmp1[1];
4258         w1[2].s7 = tmp1[2];
4259         w1[3].s7 = tmp1[3];
4260         out_len.s7 = tmp_len;
4261         break;
4262       #endif
4263
4264       #if VECT_SIZE >= 16
4265       case 8:
4266         w0[0].s8 = tmp0[0];
4267         w0[1].s8 = tmp0[1];
4268         w0[2].s8 = tmp0[2];
4269         w0[3].s8 = tmp0[3];
4270         w1[0].s8 = tmp1[0];
4271         w1[1].s8 = tmp1[1];
4272         w1[2].s8 = tmp1[2];
4273         w1[3].s8 = tmp1[3];
4274         out_len.s8 = tmp_len;
4275         break;
4276
4277       case 9:
4278         w0[0].s9 = tmp0[0];
4279         w0[1].s9 = tmp0[1];
4280         w0[2].s9 = tmp0[2];
4281         w0[3].s9 = tmp0[3];
4282         w1[0].s9 = tmp1[0];
4283         w1[1].s9 = tmp1[1];
4284         w1[2].s9 = tmp1[2];
4285         w1[3].s9 = tmp1[3];
4286         out_len.s9 = tmp_len;
4287         break;
4288
4289       case 10:
4290         w0[0].sa = tmp0[0];
4291         w0[1].sa = tmp0[1];
4292         w0[2].sa = tmp0[2];
4293         w0[3].sa = tmp0[3];
4294         w1[0].sa = tmp1[0];
4295         w1[1].sa = tmp1[1];
4296         w1[2].sa = tmp1[2];
4297         w1[3].sa = tmp1[3];
4298         out_len.sa = tmp_len;
4299         break;
4300
4301       case 11:
4302         w0[0].sb = tmp0[0];
4303         w0[1].sb = tmp0[1];
4304         w0[2].sb = tmp0[2];
4305         w0[3].sb = tmp0[3];
4306         w1[0].sb = tmp1[0];
4307         w1[1].sb = tmp1[1];
4308         w1[2].sb = tmp1[2];
4309         w1[3].sb = tmp1[3];
4310         out_len.sb = tmp_len;
4311         break;
4312
4313       case 12:
4314         w0[0].sc = tmp0[0];
4315         w0[1].sc = tmp0[1];
4316         w0[2].sc = tmp0[2];
4317         w0[3].sc = tmp0[3];
4318         w1[0].sc = tmp1[0];
4319         w1[1].sc = tmp1[1];
4320         w1[2].sc = tmp1[2];
4321         w1[3].sc = tmp1[3];
4322         out_len.sc = tmp_len;
4323         break;
4324
4325       case 13:
4326         w0[0].sd = tmp0[0];
4327         w0[1].sd = tmp0[1];
4328         w0[2].sd = tmp0[2];
4329         w0[3].sd = tmp0[3];
4330         w1[0].sd = tmp1[0];
4331         w1[1].sd = tmp1[1];
4332         w1[2].sd = tmp1[2];
4333         w1[3].sd = tmp1[3];
4334         out_len.sd = tmp_len;
4335         break;
4336
4337       case 14:
4338         w0[0].se = tmp0[0];
4339         w0[1].se = tmp0[1];
4340         w0[2].se = tmp0[2];
4341         w0[3].se = tmp0[3];
4342         w1[0].se = tmp1[0];
4343         w1[1].se = tmp1[1];
4344         w1[2].se = tmp1[2];
4345         w1[3].se = tmp1[3];
4346         out_len.se = tmp_len;
4347         break;
4348
4349       case 15:
4350         w0[0].sf = tmp0[0];
4351         w0[1].sf = tmp0[1];
4352         w0[2].sf = tmp0[2];
4353         w0[3].sf = tmp0[3];
4354         w1[0].sf = tmp1[0];
4355         w1[1].sf = tmp1[1];
4356         w1[2].sf = tmp1[2];
4357         w1[3].sf = tmp1[3];
4358         out_len.sf = tmp_len;
4359         break;
4360       #endif
4361     }
4362   }
4363
4364   return out_len;
4365
4366   #endif
4367 }
4368
4369 #ifdef DO_NOT_USE_BYTE_PERM
4370 #ifdef RESTORE_NV
4371 #undef RESTORE_NV
4372 #undef IS_GENERIC
4373 #define IS_NV
4374 #endif
4375 #endif