2 * Author......: Jens Steube <jens.steube@gmail.com>
6 #pragma GCC diagnostic ignored "-Wunused-parameter"
7 #pragma GCC diagnostic ignored "-Wunused-function"
9 #include <rp_kernel_on_cpu.h>
11 static u32
generate_cmask (u32 buf
)
13 const u32 rmask
= ((buf
& 0x40404040) >> 1)
14 & ~((buf
& 0x80808080) >> 2);
16 const u32 hmask
= (buf
& 0x1f1f1f1f) + 0x05050505;
17 const u32 lmask
= (buf
& 0x1f1f1f1f) + 0x1f1f1f1f;
19 return rmask
& ~hmask
& lmask
;
22 static void truncate_right (u32 w0
[4], u32 w1
[4], const u32 len
)
24 const u32 tmp
= (1 << ((len
% 4) * 8)) - 1;
75 static void truncate_left (u32 w0
[4], u32 w1
[4], const u32 len
)
77 const u32 tmp
= ~((1 << ((len
% 4) * 8)) - 1);
128 static void lshift_block (const u32 in0
[4], const u32 in1
[4], u32 out0
[4], u32 out1
[4])
130 out0
[0] = in0
[0] >> 8 | in0
[1] << 24;
131 out0
[1] = in0
[1] >> 8 | in0
[2] << 24;
132 out0
[2] = in0
[2] >> 8 | in0
[3] << 24;
133 out0
[3] = in0
[3] >> 8 | in1
[0] << 24;
134 out1
[0] = in1
[0] >> 8 | in1
[1] << 24;
135 out1
[1] = in1
[1] >> 8 | in1
[2] << 24;
136 out1
[2] = in1
[2] >> 8 | in1
[3] << 24;
137 out1
[3] = in1
[3] >> 8;
140 static void rshift_block (const u32 in0
[4], const u32 in1
[4], u32 out0
[4], u32 out1
[4])
142 out1
[3] = in1
[3] << 8 | in1
[2] >> 24;
143 out1
[2] = in1
[2] << 8 | in1
[1] >> 24;
144 out1
[1] = in1
[1] << 8 | in1
[0] >> 24;
145 out1
[0] = in1
[0] << 8 | in0
[3] >> 24;
146 out0
[3] = in0
[3] << 8 | in0
[2] >> 24;
147 out0
[2] = in0
[2] << 8 | in0
[1] >> 24;
148 out0
[1] = in0
[1] << 8 | in0
[0] >> 24;
149 out0
[0] = in0
[0] << 8;
152 static void rshift_block_N (const u32 in0
[4], const u32 in1
[4], u32 out0
[4], u32 out1
[4], const u32 num
)
156 case 0: out1
[3] = in1
[3];
165 case 1: out1
[3] = in1
[3] << 8 | in1
[2] >> 24;
166 out1
[2] = in1
[2] << 8 | in1
[1] >> 24;
167 out1
[1] = in1
[1] << 8 | in1
[0] >> 24;
168 out1
[0] = in1
[0] << 8 | in0
[3] >> 24;
169 out0
[3] = in0
[3] << 8 | in0
[2] >> 24;
170 out0
[2] = in0
[2] << 8 | in0
[1] >> 24;
171 out0
[1] = in0
[1] << 8 | in0
[0] >> 24;
172 out0
[0] = in0
[0] << 8;
174 case 2: out1
[3] = in1
[3] << 16 | in1
[2] >> 16;
175 out1
[2] = in1
[2] << 16 | in1
[1] >> 16;
176 out1
[1] = in1
[1] << 16 | in1
[0] >> 16;
177 out1
[0] = in1
[0] << 16 | in0
[3] >> 16;
178 out0
[3] = in0
[3] << 16 | in0
[2] >> 16;
179 out0
[2] = in0
[2] << 16 | in0
[1] >> 16;
180 out0
[1] = in0
[1] << 16 | in0
[0] >> 16;
181 out0
[0] = in0
[0] << 16;
183 case 3: out1
[3] = in1
[3] << 24 | in1
[2] >> 8;
184 out1
[2] = in1
[2] << 24 | in1
[1] >> 8;
185 out1
[1] = in1
[1] << 24 | in1
[0] >> 8;
186 out1
[0] = in1
[0] << 24 | in0
[3] >> 8;
187 out0
[3] = in0
[3] << 24 | in0
[2] >> 8;
188 out0
[2] = in0
[2] << 24 | in0
[1] >> 8;
189 out0
[1] = in0
[1] << 24 | in0
[0] >> 8;
190 out0
[0] = in0
[0] << 24;
192 case 4: out1
[3] = in1
[2];
201 case 5: out1
[3] = in1
[2] << 8 | in1
[1] >> 24;
202 out1
[2] = in1
[1] << 8 | in1
[0] >> 24;
203 out1
[1] = in1
[0] << 8 | in0
[3] >> 24;
204 out1
[0] = in0
[3] << 8 | in0
[2] >> 24;
205 out0
[3] = in0
[2] << 8 | in0
[1] >> 24;
206 out0
[2] = in0
[1] << 8 | in0
[0] >> 24;
207 out0
[1] = in0
[0] << 8;
210 case 6: out1
[3] = in1
[2] << 16 | in1
[1] >> 16;
211 out1
[2] = in1
[1] << 16 | in1
[0] >> 16;
212 out1
[1] = in1
[0] << 16 | in0
[3] >> 16;
213 out1
[0] = in0
[3] << 16 | in0
[2] >> 16;
214 out0
[3] = in0
[2] << 16 | in0
[1] >> 16;
215 out0
[2] = in0
[1] << 16 | in0
[0] >> 16;
216 out0
[1] = in0
[0] << 16;
219 case 7: out1
[3] = in1
[2] << 24 | in1
[1] >> 8;
220 out1
[2] = in1
[1] << 24 | in1
[0] >> 8;
221 out1
[1] = in1
[0] << 24 | in0
[3] >> 8;
222 out1
[0] = in0
[3] << 24 | in0
[2] >> 8;
223 out0
[3] = in0
[2] << 24 | in0
[1] >> 8;
224 out0
[2] = in0
[1] << 24 | in0
[0] >> 8;
225 out0
[1] = in0
[0] << 24;
228 case 8: out1
[3] = in1
[1];
237 case 9: out1
[3] = in1
[1] << 8 | in1
[0] >> 24;
238 out1
[2] = in1
[0] << 8 | in0
[3] >> 24;
239 out1
[1] = in0
[3] << 8 | in0
[2] >> 24;
240 out1
[0] = in0
[2] << 8 | in0
[1] >> 24;
241 out0
[3] = in0
[1] << 8 | in0
[0] >> 24;
242 out0
[2] = in0
[0] << 8;
246 case 10: out1
[3] = in1
[1] << 16 | in1
[0] >> 16;
247 out1
[2] = in1
[0] << 16 | in0
[3] >> 16;
248 out1
[1] = in0
[3] << 16 | in0
[2] >> 16;
249 out1
[0] = in0
[2] << 16 | in0
[1] >> 16;
250 out0
[3] = in0
[1] << 16 | in0
[0] >> 16;
251 out0
[2] = in0
[0] << 16;
255 case 11: out1
[3] = in1
[1] << 24 | in1
[0] >> 8;
256 out1
[2] = in1
[0] << 24 | in0
[3] >> 8;
257 out1
[1] = in0
[3] << 24 | in0
[2] >> 8;
258 out1
[0] = in0
[2] << 24 | in0
[1] >> 8;
259 out0
[3] = in0
[1] << 24 | in0
[0] >> 8;
260 out0
[2] = in0
[0] << 24;
264 case 12: out1
[3] = in1
[0];
273 case 13: out1
[3] = in1
[0] << 8 | in0
[3] >> 24;
274 out1
[2] = in0
[3] << 8 | in0
[2] >> 24;
275 out1
[1] = in0
[2] << 8 | in0
[1] >> 24;
276 out1
[0] = in0
[1] << 8 | in0
[0] >> 24;
277 out0
[3] = in0
[0] << 8;
282 case 14: out1
[3] = in1
[0] << 16 | in0
[3] >> 16;
283 out1
[2] = in0
[3] << 16 | in0
[2] >> 16;
284 out1
[1] = in0
[2] << 16 | in0
[1] >> 16;
285 out1
[0] = in0
[1] << 16 | in0
[0] >> 16;
286 out0
[3] = in0
[0] << 16;
291 case 15: out1
[3] = in1
[0] << 24 | in0
[3] >> 8;
292 out1
[2] = in0
[3] << 24 | in0
[2] >> 8;
293 out1
[1] = in0
[2] << 24 | in0
[1] >> 8;
294 out1
[0] = in0
[1] << 24 | in0
[0] >> 8;
295 out0
[3] = in0
[0] << 24;
300 case 16: out1
[3] = in0
[3];
309 case 17: out1
[3] = in0
[3] << 8 | in0
[2] >> 24;
310 out1
[2] = in0
[2] << 8 | in0
[1] >> 24;
311 out1
[1] = in0
[1] << 8 | in0
[0] >> 24;
312 out1
[0] = in0
[0] << 8;
318 case 18: out1
[3] = in0
[3] << 16 | in0
[2] >> 16;
319 out1
[2] = in0
[2] << 16 | in0
[1] >> 16;
320 out1
[1] = in0
[1] << 16 | in0
[0] >> 16;
321 out1
[0] = in0
[0] << 16;
327 case 19: out1
[3] = in0
[3] << 24 | in0
[2] >> 8;
328 out1
[2] = in0
[2] << 24 | in0
[1] >> 8;
329 out1
[1] = in0
[1] << 24 | in0
[0] >> 8;
330 out1
[0] = in0
[0] << 24;
336 case 20: out1
[3] = in0
[2];
345 case 21: out1
[3] = in0
[2] << 8 | in0
[1] >> 24;
346 out1
[2] = in0
[1] << 8 | in0
[0] >> 24;
347 out1
[1] = in0
[0] << 8;
354 case 22: out1
[3] = in0
[2] << 16 | in0
[1] >> 16;
355 out1
[2] = in0
[1] << 16 | in0
[0] >> 16;
356 out1
[1] = in0
[0] << 16;
363 case 23: out1
[3] = in0
[2] << 24 | in0
[1] >> 8;
364 out1
[2] = in0
[1] << 24 | in0
[0] >> 8;
365 out1
[1] = in0
[0] << 24;
372 case 24: out1
[3] = in0
[1];
381 case 25: out1
[3] = in0
[1] << 8 | in0
[0] >> 24;
382 out1
[2] = in0
[0] << 8;
390 case 26: out1
[3] = in0
[1] << 16 | in0
[0] >> 16;
391 out1
[2] = in0
[0] << 16;
399 case 27: out1
[3] = in0
[1] << 24 | in0
[0] >> 8;
400 out1
[2] = in0
[0] << 24;
408 case 28: out1
[3] = in0
[0];
417 case 29: out1
[3] = in0
[0] << 8;
426 case 30: out1
[3] = in0
[0] << 16;
435 case 31: out1
[3] = in0
[0] << 24;
447 static void lshift_block_N (const u32 in0
[4], const u32 in1
[4], u32 out0
[4], u32 out1
[4], const u32 num
)
451 case 0: out0
[0] = in0
[0];
460 case 1: out0
[0] = in0
[0] >> 8 | in0
[1] << 24;
461 out0
[1] = in0
[1] >> 8 | in0
[2] << 24;
462 out0
[2] = in0
[2] >> 8 | in0
[3] << 24;
463 out0
[3] = in0
[3] >> 8 | in1
[0] << 24;
464 out1
[0] = in1
[0] >> 8 | in1
[1] << 24;
465 out1
[1] = in1
[1] >> 8 | in1
[2] << 24;
466 out1
[2] = in1
[2] >> 8 | in1
[3] << 24;
467 out1
[3] = in1
[3] >> 8;
469 case 2: out0
[0] = in0
[0] >> 16 | in0
[1] << 16;
470 out0
[1] = in0
[1] >> 16 | in0
[2] << 16;
471 out0
[2] = in0
[2] >> 16 | in0
[3] << 16;
472 out0
[3] = in0
[3] >> 16 | in1
[0] << 16;
473 out1
[0] = in1
[0] >> 16 | in1
[1] << 16;
474 out1
[1] = in1
[1] >> 16 | in1
[2] << 16;
475 out1
[2] = in1
[2] >> 16 | in1
[3] << 16;
476 out1
[3] = in1
[3] >> 16;
478 case 3: out0
[0] = in0
[0] >> 24 | in0
[1] << 8;
479 out0
[1] = in0
[1] >> 24 | in0
[2] << 8;
480 out0
[2] = in0
[2] >> 24 | in0
[3] << 8;
481 out0
[3] = in0
[3] >> 24 | in1
[0] << 8;
482 out1
[0] = in1
[0] >> 24 | in1
[1] << 8;
483 out1
[1] = in1
[1] >> 24 | in1
[2] << 8;
484 out1
[2] = in1
[2] >> 24 | in1
[3] << 8;
485 out1
[3] = in1
[3] >> 24;
487 case 4: out0
[0] = in0
[1];
496 case 5: out0
[0] = in0
[1] >> 8 | in0
[2] << 24;
497 out0
[1] = in0
[2] >> 8 | in0
[3] << 24;
498 out0
[2] = in0
[3] >> 8 | in1
[0] << 24;
499 out0
[3] = in1
[0] >> 8 | in1
[1] << 24;
500 out1
[0] = in1
[1] >> 8 | in1
[2] << 24;
501 out1
[1] = in1
[2] >> 8 | in1
[3] << 24;
502 out1
[2] = in1
[3] >> 8;
505 case 6: out0
[0] = in0
[1] >> 16 | in0
[2] << 16;
506 out0
[1] = in0
[2] >> 16 | in0
[3] << 16;
507 out0
[2] = in0
[3] >> 16 | in1
[0] << 16;
508 out0
[3] = in1
[0] >> 16 | in1
[1] << 16;
509 out1
[0] = in1
[1] >> 16 | in1
[2] << 16;
510 out1
[1] = in1
[2] >> 16 | in1
[3] << 16;
511 out1
[2] = in1
[3] >> 16;
514 case 7: out0
[0] = in0
[1] >> 24 | in0
[2] << 8;
515 out0
[1] = in0
[2] >> 24 | in0
[3] << 8;
516 out0
[2] = in0
[3] >> 24 | in1
[0] << 8;
517 out0
[3] = in1
[0] >> 24 | in1
[1] << 8;
518 out1
[0] = in1
[1] >> 24 | in1
[2] << 8;
519 out1
[1] = in1
[2] >> 24 | in1
[3] << 8;
520 out1
[2] = in1
[3] >> 24;
523 case 8: out0
[0] = in0
[2];
532 case 9: out0
[0] = in0
[2] >> 8 | in0
[3] << 24;
533 out0
[1] = in0
[3] >> 8 | in1
[0] << 24;
534 out0
[2] = in1
[0] >> 8 | in1
[1] << 24;
535 out0
[3] = in1
[1] >> 8 | in1
[2] << 24;
536 out1
[0] = in1
[2] >> 8 | in1
[3] << 24;
537 out1
[1] = in1
[3] >> 8;
541 case 10: out0
[0] = in0
[2] >> 16 | in0
[3] << 16;
542 out0
[1] = in0
[3] >> 16 | in1
[0] << 16;
543 out0
[2] = in1
[0] >> 16 | in1
[1] << 16;
544 out0
[3] = in1
[1] >> 16 | in1
[2] << 16;
545 out1
[0] = in1
[2] >> 16 | in1
[3] << 16;
546 out1
[1] = in1
[3] >> 16;
550 case 11: out0
[0] = in0
[2] >> 24 | in0
[3] << 8;
551 out0
[1] = in0
[3] >> 24 | in1
[0] << 8;
552 out0
[2] = in1
[0] >> 24 | in1
[1] << 8;
553 out0
[3] = in1
[1] >> 24 | in1
[2] << 8;
554 out1
[0] = in1
[2] >> 24 | in1
[3] << 8;
555 out1
[1] = in1
[3] >> 24;
559 case 12: out0
[0] = in0
[3];
569 out0
[0] = in0
[3] >> 8 | in1
[0] << 24;
570 out0
[1] = in1
[0] >> 8 | in1
[1] << 24;
571 out0
[2] = in1
[1] >> 8 | in1
[2] << 24;
572 out0
[3] = in1
[2] >> 8 | in1
[3] << 24;
573 out1
[0] = in1
[3] >> 8;
578 case 14: out0
[0] = in0
[3] >> 16 | in1
[0] << 16;
579 out0
[1] = in1
[0] >> 16 | in1
[1] << 16;
580 out0
[2] = in1
[1] >> 16 | in1
[2] << 16;
581 out0
[3] = in1
[2] >> 16 | in1
[3] << 16;
582 out1
[0] = in1
[3] >> 16;
587 case 15: out0
[0] = in0
[3] >> 24 | in1
[0] << 8;
588 out0
[1] = in1
[0] >> 24 | in1
[1] << 8;
589 out0
[2] = in1
[1] >> 24 | in1
[2] << 8;
590 out0
[3] = in1
[2] >> 24 | in1
[3] << 8;
591 out1
[0] = in1
[3] >> 24;
596 case 16: out0
[0] = in1
[0];
605 case 17: out0
[0] = in1
[0] >> 8 | in1
[1] << 24;
606 out0
[1] = in1
[1] >> 8 | in1
[2] << 24;
607 out0
[2] = in1
[2] >> 8 | in1
[3] << 24;
608 out0
[3] = in1
[3] >> 8;
614 case 18: out0
[0] = in1
[0] >> 16 | in1
[1] << 16;
615 out0
[1] = in1
[1] >> 16 | in1
[2] << 16;
616 out0
[2] = in1
[2] >> 16 | in1
[3] << 16;
617 out0
[3] = in1
[3] >> 16;
623 case 19: out0
[0] = in1
[0] >> 24 | in1
[1] << 8;
624 out0
[1] = in1
[1] >> 24 | in1
[2] << 8;
625 out0
[2] = in1
[2] >> 24 | in1
[3] << 8;
626 out0
[3] = in1
[3] >> 24;
632 case 20: out0
[0] = in1
[1];
641 case 21: out0
[0] = in1
[1] >> 8 | in1
[2] << 24;
642 out0
[1] = in1
[2] >> 8 | in1
[3] << 24;
643 out0
[2] = in1
[3] >> 8;
650 case 22: out0
[0] = in1
[1] >> 16 | in1
[2] << 16;
651 out0
[1] = in1
[2] >> 16 | in1
[3] << 16;
652 out0
[2] = in1
[3] >> 16;
659 case 23: out0
[0] = in1
[1] >> 24 | in1
[2] << 8;
660 out0
[1] = in1
[2] >> 24 | in1
[3] << 8;
661 out0
[2] = in1
[3] >> 24;
668 case 24: out0
[0] = in1
[2];
677 case 25: out0
[0] = in1
[2] >> 8 | in1
[3] << 24;
678 out0
[1] = in1
[3] >> 8;
686 case 26: out0
[0] = in1
[2] >> 16 | in1
[3] << 16;
687 out0
[1] = in1
[3] >> 16;
695 case 27: out0
[0] = in1
[2] >> 24 | in1
[3] << 8;
696 out0
[1] = in1
[3] >> 24;
704 case 28: out0
[0] = in1
[3];
713 case 29: out0
[0] = in1
[3] >> 8;
722 case 30: out0
[0] = in1
[3] >> 16;
731 case 31: out0
[0] = in1
[3] >> 24;
743 static void append_block1 (const u32 offset
, u32 dst0
[4], u32 dst1
[4], const u32 src_r0
)
749 case 0: tmp
[0] = src_r0
;
752 case 1: tmp
[0] = src_r0
<< 8;
753 tmp
[1] = src_r0
>> 24;
755 case 2: tmp
[0] = src_r0
<< 16;
756 tmp
[1] = src_r0
>> 16;
758 case 3: tmp
[0] = src_r0
<< 24;
759 tmp
[1] = src_r0
>> 8;
765 case 0: dst0
[0] |= tmp
[0];
768 case 1: dst0
[1] |= tmp
[0];
771 case 2: dst0
[2] |= tmp
[0];
774 case 3: dst0
[3] |= tmp
[0];
777 case 4: dst1
[0] |= tmp
[0];
780 case 5: dst1
[1] |= tmp
[0];
783 case 6: dst1
[2] |= tmp
[0];
786 case 7: dst1
[3] |= tmp
[0];
791 static 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])
807 dst0
[0] = src_l0
[0] | src_r0
[0] << 8;
808 dst0
[1] = src_r0
[0] >> 24 | src_r0
[1] << 8;
809 dst0
[2] = src_r0
[1] >> 24 | src_r0
[2] << 8;
810 dst0
[3] = src_r0
[2] >> 24 | src_r0
[3] << 8;
811 dst1
[0] = src_r0
[3] >> 24 | src_r1
[0] << 8;
812 dst1
[1] = src_r1
[0] >> 24 | src_r1
[1] << 8;
813 dst1
[2] = src_r1
[1] >> 24 | src_r1
[2] << 8;
814 dst1
[3] = src_r1
[2] >> 24 | src_r1
[3] << 8;
818 dst0
[0] = src_l0
[0] | src_r0
[0] << 16;
819 dst0
[1] = src_r0
[0] >> 16 | src_r0
[1] << 16;
820 dst0
[2] = src_r0
[1] >> 16 | src_r0
[2] << 16;
821 dst0
[3] = src_r0
[2] >> 16 | src_r0
[3] << 16;
822 dst1
[0] = src_r0
[3] >> 16 | src_r1
[0] << 16;
823 dst1
[1] = src_r1
[0] >> 16 | src_r1
[1] << 16;
824 dst1
[2] = src_r1
[1] >> 16 | src_r1
[2] << 16;
825 dst1
[3] = src_r1
[2] >> 16 | src_r1
[3] << 16;
829 dst0
[0] = src_l0
[0] | src_r0
[0] << 24;
830 dst0
[1] = src_r0
[0] >> 8 | src_r0
[1] << 24;
831 dst0
[2] = src_r0
[1] >> 8 | src_r0
[2] << 24;
832 dst0
[3] = src_r0
[2] >> 8 | src_r0
[3] << 24;
833 dst1
[0] = src_r0
[3] >> 8 | src_r1
[0] << 24;
834 dst1
[1] = src_r1
[0] >> 8 | src_r1
[1] << 24;
835 dst1
[2] = src_r1
[1] >> 8 | src_r1
[2] << 24;
836 dst1
[3] = src_r1
[2] >> 8 | src_r1
[3] << 24;
850 dst0
[1] = src_l0
[1] | src_r0
[0] << 8;
851 dst0
[2] = src_r0
[0] >> 24 | src_r0
[1] << 8;
852 dst0
[3] = src_r0
[1] >> 24 | src_r0
[2] << 8;
853 dst1
[0] = src_r0
[2] >> 24 | src_r0
[3] << 8;
854 dst1
[1] = src_r0
[3] >> 24 | src_r1
[0] << 8;
855 dst1
[2] = src_r1
[0] >> 24 | src_r1
[1] << 8;
856 dst1
[3] = src_r1
[1] >> 24 | src_r1
[2] << 8;
860 dst0
[1] = src_l0
[1] | src_r0
[0] << 16;
861 dst0
[2] = src_r0
[0] >> 16 | src_r0
[1] << 16;
862 dst0
[3] = src_r0
[1] >> 16 | src_r0
[2] << 16;
863 dst1
[0] = src_r0
[2] >> 16 | src_r0
[3] << 16;
864 dst1
[1] = src_r0
[3] >> 16 | src_r1
[0] << 16;
865 dst1
[2] = src_r1
[0] >> 16 | src_r1
[1] << 16;
866 dst1
[3] = src_r1
[1] >> 16 | src_r1
[2] << 16;
870 dst0
[1] = src_l0
[1] | src_r0
[0] << 24;
871 dst0
[2] = src_r0
[0] >> 8 | src_r0
[1] << 24;
872 dst0
[3] = src_r0
[1] >> 8 | src_r0
[2] << 24;
873 dst1
[0] = src_r0
[2] >> 8 | src_r0
[3] << 24;
874 dst1
[1] = src_r0
[3] >> 8 | src_r1
[0] << 24;
875 dst1
[2] = src_r1
[0] >> 8 | src_r1
[1] << 24;
876 dst1
[3] = src_r1
[1] >> 8 | src_r1
[2] << 24;
889 dst0
[2] = src_l0
[2] | src_r0
[0] << 8;
890 dst0
[3] = src_r0
[0] >> 24 | src_r0
[1] << 8;
891 dst1
[0] = src_r0
[1] >> 24 | src_r0
[2] << 8;
892 dst1
[1] = src_r0
[2] >> 24 | src_r0
[3] << 8;
893 dst1
[2] = src_r0
[3] >> 24 | src_r1
[0] << 8;
894 dst1
[3] = src_r1
[0] >> 24 | src_r1
[1] << 8;
898 dst0
[2] = src_l0
[2] | src_r0
[0] << 16;
899 dst0
[3] = src_r0
[0] >> 16 | src_r0
[1] << 16;
900 dst1
[0] = src_r0
[1] >> 16 | src_r0
[2] << 16;
901 dst1
[1] = src_r0
[2] >> 16 | src_r0
[3] << 16;
902 dst1
[2] = src_r0
[3] >> 16 | src_r1
[0] << 16;
903 dst1
[3] = src_r1
[0] >> 16 | src_r1
[1] << 16;
907 dst0
[2] = src_l0
[2] | src_r0
[0] << 24;
908 dst0
[3] = src_r0
[0] >> 8 | src_r0
[1] << 24;
909 dst1
[0] = src_r0
[1] >> 8 | src_r0
[2] << 24;
910 dst1
[1] = src_r0
[2] >> 8 | src_r0
[3] << 24;
911 dst1
[2] = src_r0
[3] >> 8 | src_r1
[0] << 24;
912 dst1
[3] = src_r1
[0] >> 8 | src_r1
[1] << 24;
924 dst0
[3] = src_l0
[3] | src_r0
[0] << 8;
925 dst1
[0] = src_r0
[0] >> 24 | src_r0
[1] << 8;
926 dst1
[1] = src_r0
[1] >> 24 | src_r0
[2] << 8;
927 dst1
[2] = src_r0
[2] >> 24 | src_r0
[3] << 8;
928 dst1
[3] = src_r0
[3] >> 24 | src_r1
[0] << 8;
932 dst0
[3] = src_l0
[3] | src_r0
[0] << 16;
933 dst1
[0] = src_r0
[0] >> 16 | src_r0
[1] << 16;
934 dst1
[1] = src_r0
[1] >> 16 | src_r0
[2] << 16;
935 dst1
[2] = src_r0
[2] >> 16 | src_r0
[3] << 16;
936 dst1
[3] = src_r0
[3] >> 16 | src_r1
[0] << 16;
940 dst0
[3] = src_l0
[3] | src_r0
[0] << 24;
941 dst1
[0] = src_r0
[0] >> 8 | src_r0
[1] << 24;
942 dst1
[1] = src_r0
[1] >> 8 | src_r0
[2] << 24;
943 dst1
[2] = src_r0
[2] >> 8 | src_r0
[3] << 24;
944 dst1
[3] = src_r0
[3] >> 8 | src_r1
[0] << 24;
955 dst1
[0] = src_l1
[0] | src_r0
[0] << 8;
956 dst1
[1] = src_r0
[0] >> 24 | src_r0
[1] << 8;
957 dst1
[2] = src_r0
[1] >> 24 | src_r0
[2] << 8;
958 dst1
[3] = src_r0
[2] >> 24 | src_r0
[3] << 8;
962 dst1
[0] = src_l1
[0] | src_r0
[0] << 16;
963 dst1
[1] = src_r0
[0] >> 16 | src_r0
[1] << 16;
964 dst1
[2] = src_r0
[1] >> 16 | src_r0
[2] << 16;
965 dst1
[3] = src_r0
[2] >> 16 | src_r0
[3] << 16;
969 dst1
[0] = src_l1
[0] | src_r0
[0] << 24;
970 dst1
[1] = src_r0
[0] >> 8 | src_r0
[1] << 24;
971 dst1
[2] = src_r0
[1] >> 8 | src_r0
[2] << 24;
972 dst1
[3] = src_r0
[2] >> 8 | src_r0
[3] << 24;
982 dst1
[1] = src_l1
[1] | src_r0
[0] << 8;
983 dst1
[2] = src_r0
[0] >> 24 | src_r0
[1] << 8;
984 dst1
[3] = src_r0
[1] >> 24 | src_r0
[2] << 8;
988 dst1
[1] = src_l1
[1] | src_r0
[0] << 16;
989 dst1
[2] = src_r0
[0] >> 16 | src_r0
[1] << 16;
990 dst1
[3] = src_r0
[1] >> 16 | src_r0
[2] << 16;
994 dst1
[1] = src_l1
[1] | src_r0
[0] << 24;
995 dst1
[2] = src_r0
[0] >> 8 | src_r0
[1] << 24;
996 dst1
[3] = src_r0
[1] >> 8 | src_r0
[2] << 24;
1000 dst1
[2] = src_r0
[0];
1001 dst1
[3] = src_r0
[1];
1005 dst1
[2] = src_l1
[2] | src_r0
[0] << 8;
1006 dst1
[3] = src_r0
[0] >> 24 | src_r0
[1] << 8;
1010 dst1
[2] = src_l1
[2] | src_r0
[0] << 16;
1011 dst1
[3] = src_r0
[0] >> 16 | src_r0
[1] << 16;
1015 dst1
[2] = src_l1
[2] | src_r0
[0] << 24;
1016 dst1
[3] = src_r0
[0] >> 8 | src_r0
[1] << 24;
1020 dst1
[3] = src_r0
[0];
1024 dst1
[3] = src_l1
[3] | src_r0
[0] << 8;
1028 dst1
[3] = src_l1
[3] | src_r0
[0] << 16;
1032 dst1
[3] = src_l1
[3] | src_r0
[0] << 24;
1037 static void reverse_block (u32 in0
[4], u32 in1
[4], u32 out0
[4], u32 out1
[4], const u32 len
)
1039 rshift_block_N (in0
, in1
, out0
, out1
, 32 - len
);
1053 out0
[0] = swap_workaround (tib40
[0]);
1054 out0
[1] = swap_workaround (tib40
[1]);
1055 out0
[2] = swap_workaround (tib40
[2]);
1056 out0
[3] = swap_workaround (tib40
[3]);
1057 out1
[0] = swap_workaround (tib41
[0]);
1058 out1
[1] = swap_workaround (tib41
[1]);
1059 out1
[2] = swap_workaround (tib41
[2]);
1060 out1
[3] = swap_workaround (tib41
[3]);
1063 static u32
rule_op_mangle_lrest (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1065 buf0
[0] |= (generate_cmask (buf0
[0]));
1066 buf0
[1] |= (generate_cmask (buf0
[1]));
1067 buf0
[2] |= (generate_cmask (buf0
[2]));
1068 buf0
[3] |= (generate_cmask (buf0
[3]));
1069 buf1
[0] |= (generate_cmask (buf1
[0]));
1070 buf1
[1] |= (generate_cmask (buf1
[1]));
1071 buf1
[2] |= (generate_cmask (buf1
[2]));
1072 buf1
[3] |= (generate_cmask (buf1
[3]));
1077 static u32
rule_op_mangle_urest (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1079 buf0
[0] &= ~(generate_cmask (buf0
[0]));
1080 buf0
[1] &= ~(generate_cmask (buf0
[1]));
1081 buf0
[2] &= ~(generate_cmask (buf0
[2]));
1082 buf0
[3] &= ~(generate_cmask (buf0
[3]));
1083 buf1
[0] &= ~(generate_cmask (buf1
[0]));
1084 buf1
[1] &= ~(generate_cmask (buf1
[1]));
1085 buf1
[2] &= ~(generate_cmask (buf1
[2]));
1086 buf1
[3] &= ~(generate_cmask (buf1
[3]));
1091 static u32
rule_op_mangle_lrest_ufirst (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1093 rule_op_mangle_lrest (p0
, p1
, buf0
, buf1
, in_len
);
1095 buf0
[0] &= ~(0x00000020 & generate_cmask (buf0
[0]));
1100 static u32
rule_op_mangle_urest_lfirst (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1102 rule_op_mangle_urest (p0
, p1
, buf0
, buf1
, in_len
);
1104 buf0
[0] |= (0x00000020 & generate_cmask (buf0
[0]));
1109 static u32
rule_op_mangle_trest (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1111 buf0
[0] ^= (generate_cmask (buf0
[0]));
1112 buf0
[1] ^= (generate_cmask (buf0
[1]));
1113 buf0
[2] ^= (generate_cmask (buf0
[2]));
1114 buf0
[3] ^= (generate_cmask (buf0
[3]));
1115 buf1
[0] ^= (generate_cmask (buf1
[0]));
1116 buf1
[1] ^= (generate_cmask (buf1
[1]));
1117 buf1
[2] ^= (generate_cmask (buf1
[2]));
1118 buf1
[3] ^= (generate_cmask (buf1
[3]));
1123 static u32
rule_op_mangle_toggle_at (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1125 if (p0
>= in_len
) return (in_len
);
1127 const u32 tmp
= 0x20u
<< ((p0
& 3) * 8);
1131 case 0: buf0
[0] ^= (tmp
& generate_cmask (buf0
[0])); break;
1132 case 1: buf0
[1] ^= (tmp
& generate_cmask (buf0
[1])); break;
1133 case 2: buf0
[2] ^= (tmp
& generate_cmask (buf0
[2])); break;
1134 case 3: buf0
[3] ^= (tmp
& generate_cmask (buf0
[3])); break;
1135 case 4: buf1
[0] ^= (tmp
& generate_cmask (buf1
[0])); break;
1136 case 5: buf1
[1] ^= (tmp
& generate_cmask (buf1
[1])); break;
1137 case 6: buf1
[2] ^= (tmp
& generate_cmask (buf1
[2])); break;
1138 case 7: buf1
[3] ^= (tmp
& generate_cmask (buf1
[3])); break;
1144 static u32
rule_op_mangle_reverse (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1146 reverse_block (buf0
, buf1
, buf0
, buf1
, in_len
);
1151 static u32
rule_op_mangle_dupeword (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1153 if ((in_len
+ in_len
) >= 32) return (in_len
);
1155 u32 out_len
= in_len
;
1169 append_block8 (out_len
, buf0
, buf1
, buf0
, buf1
, tib40
, tib41
);
1176 static u32
rule_op_mangle_dupeword_times (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1178 if (((in_len
* p0
) + in_len
) >= 32) return (in_len
);
1180 u32 out_len
= in_len
;
1194 for (u32 i
= 0; i
< p0
; i
++)
1196 append_block8 (out_len
, buf0
, buf1
, buf0
, buf1
, tib40
, tib41
);
1204 static u32
rule_op_mangle_reflect (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1206 if ((in_len
+ in_len
) >= 32) return (in_len
);
1208 u32 out_len
= in_len
;
1213 reverse_block (buf0
, buf1
, tib40
, tib41
, out_len
);
1215 append_block8 (out_len
, buf0
, buf1
, buf0
, buf1
, tib40
, tib41
);
1222 static u32
rule_op_mangle_append (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1224 if ((in_len
+ 1) >= 32) return (in_len
);
1226 u32 out_len
= in_len
;
1228 append_block1 (out_len
, buf0
, buf1
, p0
);
1235 static u32
rule_op_mangle_prepend (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1237 if ((in_len
+ 1) >= 32) return (in_len
);
1239 u32 out_len
= in_len
;
1241 rshift_block (buf0
, buf1
, buf0
, buf1
);
1243 buf0
[0] = buf0
[0] | p0
;
1250 static u32
rule_op_mangle_rotate_left (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1252 if (in_len
== 0) return (in_len
);
1254 const u32 in_len1
= in_len
- 1;
1256 const u32 sh
= (in_len1
& 3) * 8;
1258 const u32 tmp
= (buf0
[0] & 0xff) << sh
;
1260 lshift_block (buf0
, buf1
, buf0
, buf1
);
1262 switch (in_len1
/ 4)
1264 case 0: buf0
[0] |= tmp
; break;
1265 case 1: buf0
[1] |= tmp
; break;
1266 case 2: buf0
[2] |= tmp
; break;
1267 case 3: buf0
[3] |= tmp
; break;
1268 case 4: buf1
[0] |= tmp
; break;
1269 case 5: buf1
[1] |= tmp
; break;
1270 case 6: buf1
[2] |= tmp
; break;
1271 case 7: buf1
[3] |= tmp
; break;
1277 static u32
rule_op_mangle_rotate_right (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1279 if (in_len
== 0) return (in_len
);
1281 const u32 in_len1
= in_len
- 1;
1283 const u32 sh
= (in_len1
& 3) * 8;
1287 switch (in_len1
/ 4)
1289 case 0: tmp
= (buf0
[0] >> sh
) & 0xff; break;
1290 case 1: tmp
= (buf0
[1] >> sh
) & 0xff; break;
1291 case 2: tmp
= (buf0
[2] >> sh
) & 0xff; break;
1292 case 3: tmp
= (buf0
[3] >> sh
) & 0xff; break;
1293 case 4: tmp
= (buf1
[0] >> sh
) & 0xff; break;
1294 case 5: tmp
= (buf1
[1] >> sh
) & 0xff; break;
1295 case 6: tmp
= (buf1
[2] >> sh
) & 0xff; break;
1296 case 7: tmp
= (buf1
[3] >> sh
) & 0xff; break;
1299 rshift_block (buf0
, buf1
, buf0
, buf1
);
1303 truncate_right (buf0
, buf1
, in_len
);
1308 static u32
rule_op_mangle_delete_first (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1310 if (in_len
== 0) return (in_len
);
1312 const u32 in_len1
= in_len
- 1;
1314 lshift_block (buf0
, buf1
, buf0
, buf1
);
1319 static u32
rule_op_mangle_delete_last (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1321 if (in_len
== 0) return (in_len
);
1323 const u32 in_len1
= in_len
- 1;
1325 const u32 tmp
= (1 << ((in_len1
& 3) * 8)) - 1;
1327 switch (in_len1
/ 4)
1329 case 0: buf0
[0] &= tmp
; break;
1330 case 1: buf0
[1] &= tmp
; break;
1331 case 2: buf0
[2] &= tmp
; break;
1332 case 3: buf0
[3] &= tmp
; break;
1333 case 4: buf1
[0] &= tmp
; break;
1334 case 5: buf1
[1] &= tmp
; break;
1335 case 6: buf1
[2] &= tmp
; break;
1336 case 7: buf1
[3] &= tmp
; break;
1342 static u32
rule_op_mangle_delete_at (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1344 if (p0
>= in_len
) return (in_len
);
1346 u32 out_len
= in_len
;
1351 lshift_block (buf0
, buf1
, tib40
, tib41
);
1353 const u32 ml
= (1 << ((p0
& 3) * 8)) - 1;
1358 case 0: buf0
[0] = (buf0
[0] & ml
)
1368 case 1: buf0
[1] = (buf0
[1] & ml
)
1377 case 2: buf0
[2] = (buf0
[2] & ml
)
1385 case 3: buf0
[3] = (buf0
[3] & ml
)
1392 case 4: buf1
[0] = (buf1
[0] & ml
)
1398 case 5: buf1
[1] = (buf1
[1] & ml
)
1403 case 6: buf1
[2] = (buf1
[2] & ml
)
1407 case 7: buf1
[3] = (buf1
[3] & ml
)
1417 static u32
rule_op_mangle_extract (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1419 if (p0
>= in_len
) return (in_len
);
1421 if ((p0
+ p1
) > in_len
) return (in_len
);
1425 lshift_block_N (buf0
, buf1
, buf0
, buf1
, p0
);
1427 truncate_right (buf0
, buf1
, out_len
);
1432 static u32
rule_op_mangle_omit (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1434 if (p0
>= in_len
) return (in_len
);
1436 if ((p0
+ p1
) > in_len
) return (in_len
);
1438 u32 out_len
= in_len
;
1452 lshift_block_N (buf0
, buf1
, tib40
, tib41
, p1
);
1454 const u32 ml
= (1 << ((p0
& 3) * 8)) - 1;
1459 case 0: buf0
[0] = (buf0
[0] & ml
)
1469 case 1: buf0
[1] = (buf0
[1] & ml
)
1478 case 2: buf0
[2] = (buf0
[2] & ml
)
1486 case 3: buf0
[3] = (buf0
[3] & ml
)
1493 case 4: buf1
[0] = (buf1
[0] & ml
)
1499 case 5: buf1
[1] = (buf1
[1] & ml
)
1504 case 6: buf1
[2] = (buf1
[2] & ml
)
1508 case 7: buf1
[3] = (buf1
[3] & ml
)
1518 static u32
rule_op_mangle_insert (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1520 if (p0
> in_len
) return (in_len
);
1522 if ((in_len
+ 1) >= 32) return (in_len
);
1524 u32 out_len
= in_len
;
1529 rshift_block (buf0
, buf1
, tib40
, tib41
);
1531 const u32 p1n
= p1
<< ((p0
& 3) * 8);
1533 const u32 ml
= (1 << ((p0
& 3) * 8)) - 1;
1535 const u32 mr
= 0xffffff00 << ((p0
& 3) * 8);
1539 case 0: buf0
[0] = (buf0
[0] & ml
) | p1n
| (tib40
[0] & mr
);
1548 case 1: buf0
[1] = (buf0
[1] & ml
) | p1n
| (tib40
[1] & mr
);
1556 case 2: buf0
[2] = (buf0
[2] & ml
) | p1n
| (tib40
[2] & mr
);
1563 case 3: buf0
[3] = (buf0
[3] & ml
) | p1n
| (tib40
[3] & mr
);
1569 case 4: buf1
[0] = (buf1
[0] & ml
) | p1n
| (tib41
[0] & mr
);
1574 case 5: buf1
[1] = (buf1
[1] & ml
) | p1n
| (tib41
[1] & mr
);
1578 case 6: buf1
[2] = (buf1
[2] & ml
) | p1n
| (tib41
[2] & mr
);
1581 case 7: buf1
[3] = (buf1
[3] & ml
) | p1n
| (tib41
[3] & mr
);
1590 static u32
rule_op_mangle_overstrike (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1592 if (p0
>= in_len
) return (in_len
);
1594 const u32 p1n
= p1
<< ((p0
& 3) * 8);
1596 const u32 m
= ~(0xffu
<< ((p0
& 3) * 8));
1600 case 0: buf0
[0] = (buf0
[0] & m
) | p1n
; break;
1601 case 1: buf0
[1] = (buf0
[1] & m
) | p1n
; break;
1602 case 2: buf0
[2] = (buf0
[2] & m
) | p1n
; break;
1603 case 3: buf0
[3] = (buf0
[3] & m
) | p1n
; break;
1604 case 4: buf1
[0] = (buf1
[0] & m
) | p1n
; break;
1605 case 5: buf1
[1] = (buf1
[1] & m
) | p1n
; break;
1606 case 6: buf1
[2] = (buf1
[2] & m
) | p1n
; break;
1607 case 7: buf1
[3] = (buf1
[3] & m
) | p1n
; break;
1613 static u32
rule_op_mangle_truncate_at (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1615 if (p0
>= in_len
) return (in_len
);
1617 truncate_right (buf0
, buf1
, p0
);
1622 static u32
rule_op_mangle_replace (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1624 for (u32 i
= 0; i
< in_len
; i
++)
1628 case 0: if (((buf0
[0] >> 0) & 0xFF) == p0
) buf0
[0] = (buf0
[0] & 0xFFFFFF00) | p1
<< 0; break;
1629 case 1: if (((buf0
[0] >> 8) & 0xFF) == p0
) buf0
[0] = (buf0
[0] & 0xFFFF00FF) | p1
<< 8; break;
1630 case 2: if (((buf0
[0] >> 16) & 0xFF) == p0
) buf0
[0] = (buf0
[0] & 0xFF00FFFF) | p1
<< 16; break;
1631 case 3: if (((buf0
[0] >> 24) & 0xFF) == p0
) buf0
[0] = (buf0
[0] & 0x00FFFFFF) | p1
<< 24; break;
1632 case 4: if (((buf0
[1] >> 0) & 0xFF) == p0
) buf0
[1] = (buf0
[1] & 0xFFFFFF00) | p1
<< 0; break;
1633 case 5: if (((buf0
[1] >> 8) & 0xFF) == p0
) buf0
[1] = (buf0
[1] & 0xFFFF00FF) | p1
<< 8; break;
1634 case 6: if (((buf0
[1] >> 16) & 0xFF) == p0
) buf0
[1] = (buf0
[1] & 0xFF00FFFF) | p1
<< 16; break;
1635 case 7: if (((buf0
[1] >> 24) & 0xFF) == p0
) buf0
[1] = (buf0
[1] & 0x00FFFFFF) | p1
<< 24; break;
1636 case 8: if (((buf0
[2] >> 0) & 0xFF) == p0
) buf0
[2] = (buf0
[2] & 0xFFFFFF00) | p1
<< 0; break;
1637 case 9: if (((buf0
[2] >> 8) & 0xFF) == p0
) buf0
[2] = (buf0
[2] & 0xFFFF00FF) | p1
<< 8; break;
1638 case 10: if (((buf0
[2] >> 16) & 0xFF) == p0
) buf0
[2] = (buf0
[2] & 0xFF00FFFF) | p1
<< 16; break;
1639 case 11: if (((buf0
[2] >> 24) & 0xFF) == p0
) buf0
[2] = (buf0
[2] & 0x00FFFFFF) | p1
<< 24; break;
1640 case 12: if (((buf0
[3] >> 0) & 0xFF) == p0
) buf0
[3] = (buf0
[3] & 0xFFFFFF00) | p1
<< 0; break;
1641 case 13: if (((buf0
[3] >> 8) & 0xFF) == p0
) buf0
[3] = (buf0
[3] & 0xFFFF00FF) | p1
<< 8; break;
1642 case 14: if (((buf0
[3] >> 16) & 0xFF) == p0
) buf0
[3] = (buf0
[3] & 0xFF00FFFF) | p1
<< 16; break;
1643 case 15: if (((buf0
[3] >> 24) & 0xFF) == p0
) buf0
[3] = (buf0
[3] & 0x00FFFFFF) | p1
<< 24; break;
1644 case 16: if (((buf1
[0] >> 0) & 0xFF) == p0
) buf1
[0] = (buf1
[0] & 0xFFFFFF00) | p1
<< 0; break;
1645 case 17: if (((buf1
[0] >> 8) & 0xFF) == p0
) buf1
[0] = (buf1
[0] & 0xFFFF00FF) | p1
<< 8; break;
1646 case 18: if (((buf1
[0] >> 16) & 0xFF) == p0
) buf1
[0] = (buf1
[0] & 0xFF00FFFF) | p1
<< 16; break;
1647 case 19: if (((buf1
[0] >> 24) & 0xFF) == p0
) buf1
[0] = (buf1
[0] & 0x00FFFFFF) | p1
<< 24; break;
1648 case 20: if (((buf1
[1] >> 0) & 0xFF) == p0
) buf1
[1] = (buf1
[1] & 0xFFFFFF00) | p1
<< 0; break;
1649 case 21: if (((buf1
[1] >> 8) & 0xFF) == p0
) buf1
[1] = (buf1
[1] & 0xFFFF00FF) | p1
<< 8; break;
1650 case 22: if (((buf1
[1] >> 16) & 0xFF) == p0
) buf1
[1] = (buf1
[1] & 0xFF00FFFF) | p1
<< 16; break;
1651 case 23: if (((buf1
[1] >> 24) & 0xFF) == p0
) buf1
[1] = (buf1
[1] & 0x00FFFFFF) | p1
<< 24; break;
1652 case 24: if (((buf1
[2] >> 0) & 0xFF) == p0
) buf1
[2] = (buf1
[2] & 0xFFFFFF00) | p1
<< 0; break;
1653 case 25: if (((buf1
[2] >> 8) & 0xFF) == p0
) buf1
[2] = (buf1
[2] & 0xFFFF00FF) | p1
<< 8; break;
1654 case 26: if (((buf1
[2] >> 16) & 0xFF) == p0
) buf1
[2] = (buf1
[2] & 0xFF00FFFF) | p1
<< 16; break;
1655 case 27: if (((buf1
[2] >> 24) & 0xFF) == p0
) buf1
[2] = (buf1
[2] & 0x00FFFFFF) | p1
<< 24; break;
1656 case 28: if (((buf1
[3] >> 0) & 0xFF) == p0
) buf1
[3] = (buf1
[3] & 0xFFFFFF00) | p1
<< 0; break;
1657 case 29: if (((buf1
[3] >> 8) & 0xFF) == p0
) buf1
[3] = (buf1
[3] & 0xFFFF00FF) | p1
<< 8; break;
1658 case 30: if (((buf1
[3] >> 16) & 0xFF) == p0
) buf1
[3] = (buf1
[3] & 0xFF00FFFF) | p1
<< 16; break;
1659 case 31: if (((buf1
[3] >> 24) & 0xFF) == p0
) buf1
[3] = (buf1
[3] & 0x00FFFFFF) | p1
<< 24; break;
1666 static u32
rule_op_mangle_purgechar (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1672 buf_in
[0] = buf0
[0];
1673 buf_in
[1] = buf0
[1];
1674 buf_in
[2] = buf0
[2];
1675 buf_in
[3] = buf0
[3];
1676 buf_in
[4] = buf1
[0];
1677 buf_in
[5] = buf1
[1];
1678 buf_in
[6] = buf1
[2];
1679 buf_in
[7] = buf1
[3];
1681 u32 buf_out
[8] = { 0 };
1683 u8
*in
= (u8
*) buf_in
;
1684 u8
*out
= (u8
*) buf_out
;
1686 for (u32 pos
= 0; pos
< in_len
; pos
++)
1688 if (in
[pos
] == (u8
) p0
) continue;
1690 out
[out_len
] = in
[pos
];
1695 buf0
[0] = buf_out
[0];
1696 buf0
[1] = buf_out
[1];
1697 buf0
[2] = buf_out
[2];
1698 buf0
[3] = buf_out
[3];
1699 buf1
[0] = buf_out
[4];
1700 buf1
[1] = buf_out
[5];
1701 buf1
[2] = buf_out
[6];
1702 buf1
[3] = buf_out
[7];
1708 static u32 rule_op_mangle_togglecase_rec (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1715 static u32
rule_op_mangle_dupechar_first (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1717 if ( in_len
== 0) return (in_len
);
1718 if ((in_len
+ p0
) >= 32) return (in_len
);
1720 u32 out_len
= in_len
;
1722 const u32 tmp
= buf0
[0] & 0xFF;
1724 rshift_block_N (buf0
, buf1
, buf0
, buf1
, p0
);
1728 case 1: buf0
[0] |= tmp
<< 0;
1730 case 2: buf0
[0] |= tmp
<< 0 | tmp
<< 8;
1732 case 3: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16;
1734 case 4: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1736 case 5: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1737 buf0
[1] |= tmp
<< 0;
1739 case 6: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1740 buf0
[1] |= tmp
<< 0 | tmp
<< 8;
1742 case 7: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1743 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16;
1745 case 8: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1746 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1748 case 9: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1749 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1750 buf0
[2] |= tmp
<< 0;
1752 case 10: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1753 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1754 buf0
[2] |= tmp
<< 0 | tmp
<< 8;
1756 case 11: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1757 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1758 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16;
1760 case 12: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1761 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1762 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1764 case 13: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1765 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1766 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1767 buf0
[3] |= tmp
<< 0;
1769 case 14: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1770 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1771 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1772 buf0
[3] |= tmp
<< 0 | tmp
<< 8;
1774 case 15: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1775 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1776 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1777 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16;
1779 case 16: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1780 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1781 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1782 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1784 case 17: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1785 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1786 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1787 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1788 buf1
[0] |= tmp
<< 0;
1790 case 18: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1791 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1792 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1793 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1794 buf1
[0] |= tmp
<< 0 | tmp
<< 8;
1796 case 19: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1797 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1798 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1799 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1800 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16;
1802 case 20: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1803 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1804 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1805 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1806 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1808 case 21: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1809 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1810 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1811 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1812 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1813 buf1
[1] |= tmp
<< 0;
1815 case 22: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1816 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1817 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1818 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1819 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1820 buf1
[1] |= tmp
<< 0 | tmp
<< 8;
1822 case 23: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1823 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1824 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1825 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1826 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1827 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16;
1829 case 24: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1830 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1831 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1832 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1833 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1834 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1836 case 25: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1837 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1838 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1839 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1840 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1841 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1842 buf1
[2] |= tmp
<< 0;
1844 case 26: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1845 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1846 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1847 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1848 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1849 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1850 buf1
[2] |= tmp
<< 0 | tmp
<< 8;
1852 case 27: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1853 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1854 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1855 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1856 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1857 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1858 buf1
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16;
1860 case 28: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1861 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1862 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1863 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1864 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1865 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1866 buf1
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1868 case 29: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1869 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1870 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1871 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1872 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1873 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1874 buf1
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1875 buf1
[3] |= tmp
<< 0;
1877 case 30: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1878 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1879 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1880 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1881 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1882 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1883 buf1
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1884 buf1
[3] |= tmp
<< 0 | tmp
<< 8;
1886 case 31: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1887 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1888 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1889 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1890 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1891 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1892 buf1
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1893 buf1
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16;
1902 static u32
rule_op_mangle_dupechar_last (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1904 if ( in_len
== 0) return (in_len
);
1905 if ((in_len
+ p0
) >= 32) return (in_len
);
1907 const u32 in_len1
= in_len
- 1;
1909 const u32 sh
= (in_len1
& 3) * 8;
1913 switch (in_len1
/ 4)
1915 case 0: tmp
= (buf0
[0] >> sh
) & 0xff; break;
1916 case 1: tmp
= (buf0
[1] >> sh
) & 0xff; break;
1917 case 2: tmp
= (buf0
[2] >> sh
) & 0xff; break;
1918 case 3: tmp
= (buf0
[3] >> sh
) & 0xff; break;
1919 case 4: tmp
= (buf1
[0] >> sh
) & 0xff; break;
1920 case 5: tmp
= (buf1
[1] >> sh
) & 0xff; break;
1921 case 6: tmp
= (buf1
[2] >> sh
) & 0xff; break;
1922 case 7: tmp
= (buf1
[3] >> sh
) & 0xff; break;
1925 u32 out_len
= in_len
;
1927 for (u32 i
= 0; i
< p0
; i
++)
1929 append_block1 (out_len
, buf0
, buf1
, tmp
);
1937 static u32
rule_op_mangle_dupechar_all (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1939 if ( in_len
== 0) return (in_len
);
1940 if ((in_len
+ in_len
) >= 32) return (in_len
);
1942 u32 out_len
= in_len
;
1947 tib40
[0] = ((buf0
[0] & 0x000000FF) << 0) | ((buf0
[0] & 0x0000FF00) << 8);
1948 tib40
[1] = ((buf0
[0] & 0x00FF0000) >> 16) | ((buf0
[0] & 0xFF000000) >> 8);
1949 tib40
[2] = ((buf0
[1] & 0x000000FF) << 0) | ((buf0
[1] & 0x0000FF00) << 8);
1950 tib40
[3] = ((buf0
[1] & 0x00FF0000) >> 16) | ((buf0
[1] & 0xFF000000) >> 8);
1951 tib41
[0] = ((buf0
[2] & 0x000000FF) << 0) | ((buf0
[2] & 0x0000FF00) << 8);
1952 tib41
[1] = ((buf0
[2] & 0x00FF0000) >> 16) | ((buf0
[2] & 0xFF000000) >> 8);
1953 tib41
[2] = ((buf0
[3] & 0x000000FF) << 0) | ((buf0
[3] & 0x0000FF00) << 8);
1954 tib41
[3] = ((buf0
[3] & 0x00FF0000) >> 16) | ((buf0
[3] & 0xFF000000) >> 8);
1956 buf0
[0] = tib40
[0] | (tib40
[0] << 8);
1957 buf0
[1] = tib40
[1] | (tib40
[1] << 8);
1958 buf0
[2] = tib40
[2] | (tib40
[2] << 8);
1959 buf0
[3] = tib40
[3] | (tib40
[3] << 8);
1960 buf1
[0] = tib41
[0] | (tib41
[0] << 8);
1961 buf1
[1] = tib41
[1] | (tib41
[1] << 8);
1962 buf1
[2] = tib41
[2] | (tib41
[2] << 8);
1963 buf1
[3] = tib41
[3] | (tib41
[3] << 8);
1965 out_len
= out_len
+ out_len
;
1970 static u32
rule_op_mangle_switch_first (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1972 if (in_len
< 2) return (in_len
);
1974 buf0
[0] = (buf0
[0] & 0xFFFF0000) | ((buf0
[0] << 8) & 0x0000FF00) | ((buf0
[0] >> 8) & 0x000000FF);
1979 static u32
rule_op_mangle_switch_last (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1981 if (in_len
< 2) return (in_len
);
1985 case 2: buf0
[0] = ((buf0
[0] << 8) & 0x0000FF00) | ((buf0
[0] >> 8) & 0x000000FF);
1987 case 3: buf0
[0] = (buf0
[0] & 0x000000FF) | ((buf0
[0] << 8) & 0x00FF0000) | ((buf0
[0] >> 8) & 0x0000FF00);
1989 case 4: buf0
[0] = (buf0
[0] & 0x0000FFFF) | ((buf0
[0] << 8) & 0xFF000000) | ((buf0
[0] >> 8) & 0x00FF0000);
1991 case 5: buf0
[1] = (buf0
[0] & 0xFF000000) | buf0
[1];
1992 buf0
[0] = (buf0
[0] & 0x00FFFFFF) | (buf0
[1] << 24);
1993 buf0
[1] = (buf0
[1] >> 24);
1995 case 6: buf0
[1] = ((buf0
[1] << 8) & 0x0000FF00) | ((buf0
[1] >> 8) & 0x000000FF);
1997 case 7: buf0
[1] = (buf0
[1] & 0x000000FF) | ((buf0
[1] << 8) & 0x00FF0000) | ((buf0
[1] >> 8) & 0x0000FF00);
1999 case 8: buf0
[1] = (buf0
[1] & 0x0000FFFF) | ((buf0
[1] << 8) & 0xFF000000) | ((buf0
[1] >> 8) & 0x00FF0000);
2001 case 9: buf0
[2] = (buf0
[1] & 0xFF000000) | buf0
[2];
2002 buf0
[1] = (buf0
[1] & 0x00FFFFFF) | (buf0
[2] << 24);
2003 buf0
[2] = (buf0
[2] >> 24);
2005 case 10: buf0
[2] = ((buf0
[2] << 8) & 0x0000FF00) | ((buf0
[2] >> 8) & 0x000000FF);
2007 case 11: buf0
[2] = (buf0
[2] & 0x000000FF) | ((buf0
[2] << 8) & 0x00FF0000) | ((buf0
[2] >> 8) & 0x0000FF00);
2009 case 12: buf0
[2] = (buf0
[2] & 0x0000FFFF) | ((buf0
[2] << 8) & 0xFF000000) | ((buf0
[2] >> 8) & 0x00FF0000);
2011 case 13: buf0
[3] = (buf0
[2] & 0xFF000000) | buf0
[3];
2012 buf0
[2] = (buf0
[2] & 0x00FFFFFF) | (buf0
[3] << 24);
2013 buf0
[3] = (buf0
[3] >> 24);
2015 case 14: buf0
[3] = ((buf0
[3] << 8) & 0x0000FF00) | ((buf0
[3] >> 8) & 0x000000FF);
2017 case 15: buf0
[3] = (buf0
[3] & 0x000000FF) | ((buf0
[3] << 8) & 0x00FF0000) | ((buf0
[3] >> 8) & 0x0000FF00);
2019 case 16: buf0
[3] = (buf0
[3] & 0x0000FFFF) | ((buf0
[3] << 8) & 0xFF000000) | ((buf0
[3] >> 8) & 0x00FF0000);
2021 case 17: buf1
[0] = (buf0
[3] & 0xFF000000) | buf1
[0];
2022 buf0
[3] = (buf0
[3] & 0x00FFFFFF) | (buf1
[0] << 24);
2023 buf1
[0] = (buf1
[0] >> 24);
2025 case 18: buf1
[0] = ((buf1
[0] << 8) & 0x0000FF00) | ((buf1
[0] >> 8) & 0x000000FF);
2027 case 19: buf1
[0] = (buf1
[0] & 0x000000FF) | ((buf1
[0] << 8) & 0x00FF0000) | ((buf1
[0] >> 8) & 0x0000FF00);
2029 case 20: buf1
[0] = (buf1
[0] & 0x0000FFFF) | ((buf1
[0] << 8) & 0xFF000000) | ((buf1
[0] >> 8) & 0x00FF0000);
2031 case 21: buf1
[1] = (buf1
[0] & 0xFF000000) | buf1
[1];
2032 buf1
[0] = (buf1
[0] & 0x00FFFFFF) | (buf1
[1] << 24);
2033 buf1
[1] = (buf1
[1] >> 24);
2035 case 22: buf1
[1] = ((buf1
[1] << 8) & 0x0000FF00) | ((buf1
[1] >> 8) & 0x000000FF);
2037 case 23: buf1
[1] = (buf1
[1] & 0x000000FF) | ((buf1
[1] << 8) & 0x00FF0000) | ((buf1
[1] >> 8) & 0x0000FF00);
2039 case 24: buf1
[1] = (buf1
[1] & 0x0000FFFF) | ((buf1
[1] << 8) & 0xFF000000) | ((buf1
[1] >> 8) & 0x00FF0000);
2041 case 25: buf1
[2] = (buf1
[1] & 0xFF000000) | buf1
[2];
2042 buf1
[1] = (buf1
[1] & 0x00FFFFFF) | (buf1
[2] << 24);
2043 buf1
[2] = (buf1
[2] >> 24);
2045 case 26: buf1
[2] = ((buf1
[2] << 8) & 0x0000FF00) | ((buf1
[2] >> 8) & 0x000000FF);
2047 case 27: buf1
[2] = (buf1
[2] & 0x000000FF) | ((buf1
[2] << 8) & 0x00FF0000) | ((buf1
[2] >> 8) & 0x0000FF00);
2049 case 28: buf1
[2] = (buf1
[2] & 0x0000FFFF) | ((buf1
[2] << 8) & 0xFF000000) | ((buf1
[2] >> 8) & 0x00FF0000);
2051 case 29: buf1
[3] = (buf1
[2] & 0xFF000000) | buf1
[3];
2052 buf1
[2] = (buf1
[2] & 0x00FFFFFF) | (buf1
[3] << 24);
2053 buf1
[3] = (buf1
[3] >> 24);
2055 case 30: buf1
[3] = ((buf1
[3] << 8) & 0x0000FF00) | ((buf1
[3] >> 8) & 0x000000FF);
2057 case 31: buf1
[3] = (buf1
[3] & 0x000000FF) | ((buf1
[3] << 8) & 0x00FF0000) | ((buf1
[3] >> 8) & 0x0000FF00);
2064 static u32
rule_op_mangle_switch_at (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2066 if (p0
>= in_len
) return (in_len
);
2067 if (p1
>= in_len
) return (in_len
);
2074 case 0: tmp0
= (buf0
[0] >> 0) & 0xFF;
2076 case 1: tmp0
= (buf0
[0] >> 8) & 0xFF;
2078 case 2: tmp0
= (buf0
[0] >> 16) & 0xFF;
2080 case 3: tmp0
= (buf0
[0] >> 24) & 0xFF;
2082 case 4: tmp0
= (buf0
[1] >> 0) & 0xFF;
2084 case 5: tmp0
= (buf0
[1] >> 8) & 0xFF;
2086 case 6: tmp0
= (buf0
[1] >> 16) & 0xFF;
2088 case 7: tmp0
= (buf0
[1] >> 24) & 0xFF;
2090 case 8: tmp0
= (buf0
[2] >> 0) & 0xFF;
2092 case 9: tmp0
= (buf0
[2] >> 8) & 0xFF;
2094 case 10: tmp0
= (buf0
[2] >> 16) & 0xFF;
2096 case 11: tmp0
= (buf0
[2] >> 24) & 0xFF;
2098 case 12: tmp0
= (buf0
[3] >> 0) & 0xFF;
2100 case 13: tmp0
= (buf0
[3] >> 8) & 0xFF;
2102 case 14: tmp0
= (buf0
[3] >> 16) & 0xFF;
2104 case 15: tmp0
= (buf0
[3] >> 24) & 0xFF;
2106 case 16: tmp0
= (buf1
[0] >> 0) & 0xFF;
2108 case 17: tmp0
= (buf1
[0] >> 8) & 0xFF;
2110 case 18: tmp0
= (buf1
[0] >> 16) & 0xFF;
2112 case 19: tmp0
= (buf1
[0] >> 24) & 0xFF;
2114 case 20: tmp0
= (buf1
[1] >> 0) & 0xFF;
2116 case 21: tmp0
= (buf1
[1] >> 8) & 0xFF;
2118 case 22: tmp0
= (buf1
[1] >> 16) & 0xFF;
2120 case 23: tmp0
= (buf1
[1] >> 24) & 0xFF;
2122 case 24: tmp0
= (buf1
[2] >> 0) & 0xFF;
2124 case 25: tmp0
= (buf1
[2] >> 8) & 0xFF;
2126 case 26: tmp0
= (buf1
[2] >> 16) & 0xFF;
2128 case 27: tmp0
= (buf1
[2] >> 24) & 0xFF;
2130 case 28: tmp0
= (buf1
[3] >> 0) & 0xFF;
2132 case 29: tmp0
= (buf1
[3] >> 8) & 0xFF;
2134 case 30: tmp0
= (buf1
[3] >> 16) & 0xFF;
2136 case 31: tmp0
= (buf1
[3] >> 24) & 0xFF;
2142 case 0: tmp1
= (buf0
[0] >> 0) & 0xff;
2143 buf0
[0] = (buf0
[0] & 0xffffff00) | tmp0
<< 0;
2145 case 1: tmp1
= (buf0
[0] >> 8) & 0xff;
2146 buf0
[0] = (buf0
[0] & 0xffff00ff) | tmp0
<< 8;
2148 case 2: tmp1
= (buf0
[0] >> 16) & 0xff;
2149 buf0
[0] = (buf0
[0] & 0xff00ffff) | tmp0
<< 16;
2151 case 3: tmp1
= (buf0
[0] >> 24) & 0xff;
2152 buf0
[0] = (buf0
[0] & 0x00ffffff) | tmp0
<< 24;
2154 case 4: tmp1
= (buf0
[1] >> 0) & 0xff;
2155 buf0
[1] = (buf0
[1] & 0xffffff00) | tmp0
<< 0;
2157 case 5: tmp1
= (buf0
[1] >> 8) & 0xff;
2158 buf0
[1] = (buf0
[1] & 0xffff00ff) | tmp0
<< 8;
2160 case 6: tmp1
= (buf0
[1] >> 16) & 0xff;
2161 buf0
[1] = (buf0
[1] & 0xff00ffff) | tmp0
<< 16;
2163 case 7: tmp1
= (buf0
[1] >> 24) & 0xff;
2164 buf0
[1] = (buf0
[1] & 0x00ffffff) | tmp0
<< 24;
2166 case 8: tmp1
= (buf0
[2] >> 0) & 0xff;
2167 buf0
[2] = (buf0
[2] & 0xffffff00) | tmp0
<< 0;
2169 case 9: tmp1
= (buf0
[2] >> 8) & 0xff;
2170 buf0
[2] = (buf0
[2] & 0xffff00ff) | tmp0
<< 8;
2172 case 10: tmp1
= (buf0
[2] >> 16) & 0xff;
2173 buf0
[2] = (buf0
[2] & 0xff00ffff) | tmp0
<< 16;
2175 case 11: tmp1
= (buf0
[2] >> 24) & 0xff;
2176 buf0
[2] = (buf0
[2] & 0x00ffffff) | tmp0
<< 24;
2178 case 12: tmp1
= (buf0
[3] >> 0) & 0xff;
2179 buf0
[3] = (buf0
[3] & 0xffffff00) | tmp0
<< 0;
2181 case 13: tmp1
= (buf0
[3] >> 8) & 0xff;
2182 buf0
[3] = (buf0
[3] & 0xffff00ff) | tmp0
<< 8;
2184 case 14: tmp1
= (buf0
[3] >> 16) & 0xff;
2185 buf0
[3] = (buf0
[3] & 0xff00ffff) | tmp0
<< 16;
2187 case 15: tmp1
= (buf0
[3] >> 24) & 0xff;
2188 buf0
[3] = (buf0
[3] & 0x00ffffff) | tmp0
<< 24;
2190 case 16: tmp1
= (buf1
[0] >> 0) & 0xff;
2191 buf1
[0] = (buf1
[0] & 0xffffff00) | tmp0
<< 0;
2193 case 17: tmp1
= (buf1
[0] >> 8) & 0xff;
2194 buf1
[0] = (buf1
[0] & 0xffff00ff) | tmp0
<< 8;
2196 case 18: tmp1
= (buf1
[0] >> 16) & 0xff;
2197 buf1
[0] = (buf1
[0] & 0xff00ffff) | tmp0
<< 16;
2199 case 19: tmp1
= (buf1
[0] >> 24) & 0xff;
2200 buf1
[0] = (buf1
[0] & 0x00ffffff) | tmp0
<< 24;
2202 case 20: tmp1
= (buf1
[1] >> 0) & 0xff;
2203 buf1
[1] = (buf1
[1] & 0xffffff00) | tmp0
<< 0;
2205 case 21: tmp1
= (buf1
[1] >> 8) & 0xff;
2206 buf1
[1] = (buf1
[1] & 0xffff00ff) | tmp0
<< 8;
2208 case 22: tmp1
= (buf1
[1] >> 16) & 0xff;
2209 buf1
[1] = (buf1
[1] & 0xff00ffff) | tmp0
<< 16;
2211 case 23: tmp1
= (buf1
[1] >> 24) & 0xff;
2212 buf1
[1] = (buf1
[1] & 0x00ffffff) | tmp0
<< 24;
2214 case 24: tmp1
= (buf1
[2] >> 0) & 0xff;
2215 buf1
[2] = (buf1
[2] & 0xffffff00) | tmp0
<< 0;
2217 case 25: tmp1
= (buf1
[2] >> 8) & 0xff;
2218 buf1
[2] = (buf1
[2] & 0xffff00ff) | tmp0
<< 8;
2220 case 26: tmp1
= (buf1
[2] >> 16) & 0xff;
2221 buf1
[2] = (buf1
[2] & 0xff00ffff) | tmp0
<< 16;
2223 case 27: tmp1
= (buf1
[2] >> 24) & 0xff;
2224 buf1
[2] = (buf1
[2] & 0x00ffffff) | tmp0
<< 24;
2226 case 28: tmp1
= (buf1
[3] >> 0) & 0xff;
2227 buf1
[3] = (buf1
[3] & 0xffffff00) | tmp0
<< 0;
2229 case 29: tmp1
= (buf1
[3] >> 8) & 0xff;
2230 buf1
[3] = (buf1
[3] & 0xffff00ff) | tmp0
<< 8;
2232 case 30: tmp1
= (buf1
[3] >> 16) & 0xff;
2233 buf1
[3] = (buf1
[3] & 0xff00ffff) | tmp0
<< 16;
2235 case 31: tmp1
= (buf1
[3] >> 24) & 0xff;
2236 buf1
[3] = (buf1
[3] & 0x00ffffff) | tmp0
<< 24;
2242 case 0: buf0
[0] = (buf0
[0] & 0xffffff00) | tmp1
<< 0;
2244 case 1: buf0
[0] = (buf0
[0] & 0xffff00ff) | tmp1
<< 8;
2246 case 2: buf0
[0] = (buf0
[0] & 0xff00ffff) | tmp1
<< 16;
2248 case 3: buf0
[0] = (buf0
[0] & 0x00ffffff) | tmp1
<< 24;
2250 case 4: buf0
[1] = (buf0
[1] & 0xffffff00) | tmp1
<< 0;
2252 case 5: buf0
[1] = (buf0
[1] & 0xffff00ff) | tmp1
<< 8;
2254 case 6: buf0
[1] = (buf0
[1] & 0xff00ffff) | tmp1
<< 16;
2256 case 7: buf0
[1] = (buf0
[1] & 0x00ffffff) | tmp1
<< 24;
2258 case 8: buf0
[2] = (buf0
[2] & 0xffffff00) | tmp1
<< 0;
2260 case 9: buf0
[2] = (buf0
[2] & 0xffff00ff) | tmp1
<< 8;
2262 case 10: buf0
[2] = (buf0
[2] & 0xff00ffff) | tmp1
<< 16;
2264 case 11: buf0
[2] = (buf0
[2] & 0x00ffffff) | tmp1
<< 24;
2266 case 12: buf0
[3] = (buf0
[3] & 0xffffff00) | tmp1
<< 0;
2268 case 13: buf0
[3] = (buf0
[3] & 0xffff00ff) | tmp1
<< 8;
2270 case 14: buf0
[3] = (buf0
[3] & 0xff00ffff) | tmp1
<< 16;
2272 case 15: buf0
[3] = (buf0
[3] & 0x00ffffff) | tmp1
<< 24;
2274 case 16: buf1
[0] = (buf1
[0] & 0xffffff00) | tmp1
<< 0;
2276 case 17: buf1
[0] = (buf1
[0] & 0xffff00ff) | tmp1
<< 8;
2278 case 18: buf1
[0] = (buf1
[0] & 0xff00ffff) | tmp1
<< 16;
2280 case 19: buf1
[0] = (buf1
[0] & 0x00ffffff) | tmp1
<< 24;
2282 case 20: buf1
[1] = (buf1
[1] & 0xffffff00) | tmp1
<< 0;
2284 case 21: buf1
[1] = (buf1
[1] & 0xffff00ff) | tmp1
<< 8;
2286 case 22: buf1
[1] = (buf1
[1] & 0xff00ffff) | tmp1
<< 16;
2288 case 23: buf1
[1] = (buf1
[1] & 0x00ffffff) | tmp1
<< 24;
2290 case 24: buf1
[2] = (buf1
[2] & 0xffffff00) | tmp1
<< 0;
2292 case 25: buf1
[2] = (buf1
[2] & 0xffff00ff) | tmp1
<< 8;
2294 case 26: buf1
[2] = (buf1
[2] & 0xff00ffff) | tmp1
<< 16;
2296 case 27: buf1
[2] = (buf1
[2] & 0x00ffffff) | tmp1
<< 24;
2298 case 28: buf1
[3] = (buf1
[3] & 0xffffff00) | tmp1
<< 0;
2300 case 29: buf1
[3] = (buf1
[3] & 0xffff00ff) | tmp1
<< 8;
2302 case 30: buf1
[3] = (buf1
[3] & 0xff00ffff) | tmp1
<< 16;
2304 case 31: buf1
[3] = (buf1
[3] & 0x00ffffff) | tmp1
<< 24;
2311 static u32
rule_op_mangle_chr_shiftl (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2313 if (p0
>= in_len
) return (in_len
);
2315 const u32 mr
= 0xffu
<< ((p0
& 3) * 8);
2320 case 0: buf0
[0] = (buf0
[0] & ml
) | (((buf0
[0] & mr
) << 1) & mr
); break;
2321 case 1: buf0
[1] = (buf0
[1] & ml
) | (((buf0
[1] & mr
) << 1) & mr
); break;
2322 case 2: buf0
[2] = (buf0
[2] & ml
) | (((buf0
[2] & mr
) << 1) & mr
); break;
2323 case 3: buf0
[3] = (buf0
[3] & ml
) | (((buf0
[3] & mr
) << 1) & mr
); break;
2324 case 4: buf1
[0] = (buf1
[0] & ml
) | (((buf1
[0] & mr
) << 1) & mr
); break;
2325 case 5: buf1
[1] = (buf1
[1] & ml
) | (((buf1
[1] & mr
) << 1) & mr
); break;
2326 case 6: buf1
[2] = (buf1
[2] & ml
) | (((buf1
[2] & mr
) << 1) & mr
); break;
2327 case 7: buf1
[3] = (buf1
[3] & ml
) | (((buf1
[3] & mr
) << 1) & mr
); break;
2333 static u32
rule_op_mangle_chr_shiftr (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2335 if (p0
>= in_len
) return (in_len
);
2337 const u32 mr
= 0xffu
<< ((p0
& 3) * 8);
2342 case 0: buf0
[0] = (buf0
[0] & ml
) | (((buf0
[0] & mr
) >> 1) & mr
); break;
2343 case 1: buf0
[1] = (buf0
[1] & ml
) | (((buf0
[1] & mr
) >> 1) & mr
); break;
2344 case 2: buf0
[2] = (buf0
[2] & ml
) | (((buf0
[2] & mr
) >> 1) & mr
); break;
2345 case 3: buf0
[3] = (buf0
[3] & ml
) | (((buf0
[3] & mr
) >> 1) & mr
); break;
2346 case 4: buf1
[0] = (buf1
[0] & ml
) | (((buf1
[0] & mr
) >> 1) & mr
); break;
2347 case 5: buf1
[1] = (buf1
[1] & ml
) | (((buf1
[1] & mr
) >> 1) & mr
); break;
2348 case 6: buf1
[2] = (buf1
[2] & ml
) | (((buf1
[2] & mr
) >> 1) & mr
); break;
2349 case 7: buf1
[3] = (buf1
[3] & ml
) | (((buf1
[3] & mr
) >> 1) & mr
); break;
2355 static u32
rule_op_mangle_chr_incr (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2357 if (p0
>= in_len
) return (in_len
);
2359 const u32 mr
= 0xffu
<< ((p0
& 3) * 8);
2362 const u32 n
= 0x01010101 & mr
;
2366 case 0: buf0
[0] = (buf0
[0] & ml
) | (((buf0
[0] & mr
) + n
) & mr
); break;
2367 case 1: buf0
[1] = (buf0
[1] & ml
) | (((buf0
[1] & mr
) + n
) & mr
); break;
2368 case 2: buf0
[2] = (buf0
[2] & ml
) | (((buf0
[2] & mr
) + n
) & mr
); break;
2369 case 3: buf0
[3] = (buf0
[3] & ml
) | (((buf0
[3] & mr
) + n
) & mr
); break;
2370 case 4: buf1
[0] = (buf1
[0] & ml
) | (((buf1
[0] & mr
) + n
) & mr
); break;
2371 case 5: buf1
[1] = (buf1
[1] & ml
) | (((buf1
[1] & mr
) + n
) & mr
); break;
2372 case 6: buf1
[2] = (buf1
[2] & ml
) | (((buf1
[2] & mr
) + n
) & mr
); break;
2373 case 7: buf1
[3] = (buf1
[3] & ml
) | (((buf1
[3] & mr
) + n
) & mr
); break;
2379 static u32
rule_op_mangle_chr_decr (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2381 if (p0
>= in_len
) return (in_len
);
2383 const u32 mr
= 0xffu
<< ((p0
& 3) * 8);
2386 const u32 n
= 0x01010101 & mr
;
2390 case 0: buf0
[0] = (buf0
[0] & ml
) | (((buf0
[0] & mr
) - n
) & mr
); break;
2391 case 1: buf0
[1] = (buf0
[1] & ml
) | (((buf0
[1] & mr
) - n
) & mr
); break;
2392 case 2: buf0
[2] = (buf0
[2] & ml
) | (((buf0
[2] & mr
) - n
) & mr
); break;
2393 case 3: buf0
[3] = (buf0
[3] & ml
) | (((buf0
[3] & mr
) - n
) & mr
); break;
2394 case 4: buf1
[0] = (buf1
[0] & ml
) | (((buf1
[0] & mr
) - n
) & mr
); break;
2395 case 5: buf1
[1] = (buf1
[1] & ml
) | (((buf1
[1] & mr
) - n
) & mr
); break;
2396 case 6: buf1
[2] = (buf1
[2] & ml
) | (((buf1
[2] & mr
) - n
) & mr
); break;
2397 case 7: buf1
[3] = (buf1
[3] & ml
) | (((buf1
[3] & mr
) - n
) & mr
); break;
2403 static u32
rule_op_mangle_replace_np1 (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2405 if ((p0
+ 1) >= in_len
) return (in_len
);
2410 lshift_block (buf0
, buf1
, tib40
, tib41
);
2412 const u32 mr
= 0xffu
<< ((p0
& 3) * 8);
2417 case 0: buf0
[0] = (buf0
[0] & ml
) | (tib40
[0] & mr
); break;
2418 case 1: buf0
[1] = (buf0
[1] & ml
) | (tib40
[1] & mr
); break;
2419 case 2: buf0
[2] = (buf0
[2] & ml
) | (tib40
[2] & mr
); break;
2420 case 3: buf0
[3] = (buf0
[3] & ml
) | (tib40
[3] & mr
); break;
2421 case 4: buf1
[0] = (buf1
[0] & ml
) | (tib41
[0] & mr
); break;
2422 case 5: buf1
[1] = (buf1
[1] & ml
) | (tib41
[1] & mr
); break;
2423 case 6: buf1
[2] = (buf1
[2] & ml
) | (tib41
[2] & mr
); break;
2424 case 7: buf1
[3] = (buf1
[3] & ml
) | (tib41
[3] & mr
); break;
2430 static u32
rule_op_mangle_replace_nm1 (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2432 if (p0
== 0) return (in_len
);
2434 if (p0
>= in_len
) return (in_len
);
2439 rshift_block (buf0
, buf1
, tib40
, tib41
);
2441 const u32 mr
= 0xffu
<< ((p0
& 3) * 8);
2446 case 0: buf0
[0] = (buf0
[0] & ml
) | (tib40
[0] & mr
); break;
2447 case 1: buf0
[1] = (buf0
[1] & ml
) | (tib40
[1] & mr
); break;
2448 case 2: buf0
[2] = (buf0
[2] & ml
) | (tib40
[2] & mr
); break;
2449 case 3: buf0
[3] = (buf0
[3] & ml
) | (tib40
[3] & mr
); break;
2450 case 4: buf1
[0] = (buf1
[0] & ml
) | (tib41
[0] & mr
); break;
2451 case 5: buf1
[1] = (buf1
[1] & ml
) | (tib41
[1] & mr
); break;
2452 case 6: buf1
[2] = (buf1
[2] & ml
) | (tib41
[2] & mr
); break;
2453 case 7: buf1
[3] = (buf1
[3] & ml
) | (tib41
[3] & mr
); break;
2459 static u32
rule_op_mangle_dupeblock_first (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2461 if (p0
> in_len
) return (in_len
);
2463 if ((in_len
+ p0
) >= 32) return (in_len
);
2465 u32 out_len
= in_len
;
2479 truncate_right (tib40
, tib41
, p0
);
2481 rshift_block_N (buf0
, buf1
, buf0
, buf1
, p0
);
2483 buf0
[0] |= tib40
[0];
2484 buf0
[1] |= tib40
[1];
2485 buf0
[2] |= tib40
[2];
2486 buf0
[3] |= tib40
[3];
2487 buf1
[0] |= tib41
[0];
2488 buf1
[1] |= tib41
[1];
2489 buf1
[2] |= tib41
[2];
2490 buf1
[3] |= tib41
[3];
2497 static u32
rule_op_mangle_dupeblock_last (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2499 if (p0
> in_len
) return (in_len
);
2501 if ((in_len
+ p0
) >= 32) return (in_len
);
2503 u32 out_len
= in_len
;
2508 rshift_block_N (buf0
, buf1
, tib40
, tib41
, p0
);
2510 truncate_left (tib40
, tib41
, out_len
);
2512 buf0
[0] |= tib40
[0];
2513 buf0
[1] |= tib40
[1];
2514 buf0
[2] |= tib40
[2];
2515 buf0
[3] |= tib40
[3];
2516 buf1
[0] |= tib41
[0];
2517 buf1
[1] |= tib41
[1];
2518 buf1
[2] |= tib41
[2];
2519 buf1
[3] |= tib41
[3];
2526 static u32
rule_op_mangle_title (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2528 buf0
[0] |= (generate_cmask (buf0
[0]));
2529 buf0
[1] |= (generate_cmask (buf0
[1]));
2530 buf0
[2] |= (generate_cmask (buf0
[2]));
2531 buf0
[3] |= (generate_cmask (buf0
[3]));
2532 buf1
[0] |= (generate_cmask (buf1
[0]));
2533 buf1
[1] |= (generate_cmask (buf1
[1]));
2534 buf1
[2] |= (generate_cmask (buf1
[2]));
2535 buf1
[3] |= (generate_cmask (buf1
[3]));
2537 buf0
[0] &= ~(0x00000020 & generate_cmask (buf0
[0]));
2539 for (u32 i
= 0; i
< in_len
; i
++)
2546 case 0: tmp0
= (buf0
[0] >> 0) & 0xFF;
2547 tmp1
= ~(0x00002000 & generate_cmask (buf0
[0])); break;
2548 case 1: tmp0
= (buf0
[0] >> 8) & 0xFF;
2549 tmp1
= ~(0x00200000 & generate_cmask (buf0
[0])); break;
2550 case 2: tmp0
= (buf0
[0] >> 16) & 0xFF;
2551 tmp1
= ~(0x20000000 & generate_cmask (buf0
[0])); break;
2552 case 3: tmp0
= (buf0
[0] >> 24) & 0xFF;
2553 tmp1
= ~(0x00000020 & generate_cmask (buf0
[1])); break;
2554 case 4: tmp0
= (buf0
[1] >> 0) & 0xFF;
2555 tmp1
= ~(0x00002000 & generate_cmask (buf0
[1])); break;
2556 case 5: tmp0
= (buf0
[1] >> 8) & 0xFF;
2557 tmp1
= ~(0x00200000 & generate_cmask (buf0
[1])); break;
2558 case 6: tmp0
= (buf0
[1] >> 16) & 0xFF;
2559 tmp1
= ~(0x20000000 & generate_cmask (buf0
[1])); break;
2560 case 7: tmp0
= (buf0
[1] >> 24) & 0xFF;
2561 tmp1
= ~(0x00000020 & generate_cmask (buf0
[2])); break;
2562 case 8: tmp0
= (buf0
[2] >> 0) & 0xFF;
2563 tmp1
= ~(0x00002000 & generate_cmask (buf0
[2])); break;
2564 case 9: tmp0
= (buf0
[2] >> 8) & 0xFF;
2565 tmp1
= ~(0x00200000 & generate_cmask (buf0
[2])); break;
2566 case 10: tmp0
= (buf0
[2] >> 16) & 0xFF;
2567 tmp1
= ~(0x20000000 & generate_cmask (buf0
[2])); break;
2568 case 11: tmp0
= (buf0
[2] >> 24) & 0xFF;
2569 tmp1
= ~(0x00000020 & generate_cmask (buf0
[3])); break;
2570 case 12: tmp0
= (buf0
[3] >> 0) & 0xFF;
2571 tmp1
= ~(0x00002000 & generate_cmask (buf0
[3])); break;
2572 case 13: tmp0
= (buf0
[3] >> 8) & 0xFF;
2573 tmp1
= ~(0x00200000 & generate_cmask (buf0
[3])); break;
2574 case 14: tmp0
= (buf0
[3] >> 16) & 0xFF;
2575 tmp1
= ~(0x20000000 & generate_cmask (buf0
[3])); break;
2576 case 15: tmp0
= (buf0
[3] >> 24) & 0xFF;
2577 tmp1
= ~(0x00000020 & generate_cmask (buf1
[0])); break;
2578 case 16: tmp0
= (buf1
[0] >> 0) & 0xFF;
2579 tmp1
= ~(0x00002000 & generate_cmask (buf1
[0])); break;
2580 case 17: tmp0
= (buf1
[0] >> 8) & 0xFF;
2581 tmp1
= ~(0x00200000 & generate_cmask (buf1
[0])); break;
2582 case 18: tmp0
= (buf1
[0] >> 16) & 0xFF;
2583 tmp1
= ~(0x20000000 & generate_cmask (buf1
[0])); break;
2584 case 19: tmp0
= (buf1
[0] >> 24) & 0xFF;
2585 tmp1
= ~(0x00000020 & generate_cmask (buf1
[1])); break;
2586 case 20: tmp0
= (buf1
[1] >> 0) & 0xFF;
2587 tmp1
= ~(0x00002000 & generate_cmask (buf1
[1])); break;
2588 case 21: tmp0
= (buf1
[1] >> 8) & 0xFF;
2589 tmp1
= ~(0x00200000 & generate_cmask (buf1
[1])); break;
2590 case 22: tmp0
= (buf1
[1] >> 16) & 0xFF;
2591 tmp1
= ~(0x20000000 & generate_cmask (buf1
[1])); break;
2592 case 23: tmp0
= (buf1
[1] >> 24) & 0xFF;
2593 tmp1
= ~(0x00000020 & generate_cmask (buf1
[2])); break;
2594 case 24: tmp0
= (buf1
[2] >> 0) & 0xFF;
2595 tmp1
= ~(0x00002000 & generate_cmask (buf1
[2])); break;
2596 case 25: tmp0
= (buf1
[2] >> 8) & 0xFF;
2597 tmp1
= ~(0x00200000 & generate_cmask (buf1
[2])); break;
2598 case 26: tmp0
= (buf1
[2] >> 16) & 0xFF;
2599 tmp1
= ~(0x20000000 & generate_cmask (buf1
[2])); break;
2600 case 27: tmp0
= (buf1
[2] >> 24) & 0xFF;
2601 tmp1
= ~(0x00000020 & generate_cmask (buf1
[3])); break;
2602 case 28: tmp0
= (buf1
[3] >> 0) & 0xFF;
2603 tmp1
= ~(0x00002000 & generate_cmask (buf1
[3])); break;
2604 case 29: tmp0
= (buf1
[3] >> 8) & 0xFF;
2605 tmp1
= ~(0x00200000 & generate_cmask (buf1
[3])); break;
2606 case 30: tmp0
= (buf1
[3] >> 16) & 0xFF;
2607 tmp1
= ~(0x20000000 & generate_cmask (buf1
[3])); break;
2612 if (tmp0
== ' ') buf0
[0] &= tmp1
;
2616 if (tmp0
== ' ') buf0
[1] &= tmp1
;
2620 if (tmp0
== ' ') buf0
[2] &= tmp1
;
2624 if (tmp0
== ' ') buf0
[3] &= tmp1
;
2628 if (tmp0
== ' ') buf1
[0] &= tmp1
;
2632 if (tmp0
== ' ') buf1
[1] &= tmp1
;
2636 if (tmp0
== ' ') buf1
[2] &= tmp1
;
2640 if (tmp0
== ' ') buf1
[3] &= tmp1
;
2647 u32
apply_rule (const u32 name
, const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2649 u32 out_len
= in_len
;
2653 case RULE_OP_MANGLE_LREST
: out_len
= rule_op_mangle_lrest (p0
, p1
, buf0
, buf1
, out_len
); break;
2654 case RULE_OP_MANGLE_UREST
: out_len
= rule_op_mangle_urest (p0
, p1
, buf0
, buf1
, out_len
); break;
2655 case RULE_OP_MANGLE_LREST_UFIRST
: out_len
= rule_op_mangle_lrest_ufirst (p0
, p1
, buf0
, buf1
, out_len
); break;
2656 case RULE_OP_MANGLE_UREST_LFIRST
: out_len
= rule_op_mangle_urest_lfirst (p0
, p1
, buf0
, buf1
, out_len
); break;
2657 case RULE_OP_MANGLE_TREST
: out_len
= rule_op_mangle_trest (p0
, p1
, buf0
, buf1
, out_len
); break;
2658 case RULE_OP_MANGLE_TOGGLE_AT
: out_len
= rule_op_mangle_toggle_at (p0
, p1
, buf0
, buf1
, out_len
); break;
2659 case RULE_OP_MANGLE_REVERSE
: out_len
= rule_op_mangle_reverse (p0
, p1
, buf0
, buf1
, out_len
); break;
2660 case RULE_OP_MANGLE_DUPEWORD
: out_len
= rule_op_mangle_dupeword (p0
, p1
, buf0
, buf1
, out_len
); break;
2661 case RULE_OP_MANGLE_DUPEWORD_TIMES
: out_len
= rule_op_mangle_dupeword_times (p0
, p1
, buf0
, buf1
, out_len
); break;
2662 case RULE_OP_MANGLE_REFLECT
: out_len
= rule_op_mangle_reflect (p0
, p1
, buf0
, buf1
, out_len
); break;
2663 case RULE_OP_MANGLE_APPEND
: out_len
= rule_op_mangle_append (p0
, p1
, buf0
, buf1
, out_len
); break;
2664 case RULE_OP_MANGLE_PREPEND
: out_len
= rule_op_mangle_prepend (p0
, p1
, buf0
, buf1
, out_len
); break;
2665 case RULE_OP_MANGLE_ROTATE_LEFT
: out_len
= rule_op_mangle_rotate_left (p0
, p1
, buf0
, buf1
, out_len
); break;
2666 case RULE_OP_MANGLE_ROTATE_RIGHT
: out_len
= rule_op_mangle_rotate_right (p0
, p1
, buf0
, buf1
, out_len
); break;
2667 case RULE_OP_MANGLE_DELETE_FIRST
: out_len
= rule_op_mangle_delete_first (p0
, p1
, buf0
, buf1
, out_len
); break;
2668 case RULE_OP_MANGLE_DELETE_LAST
: out_len
= rule_op_mangle_delete_last (p0
, p1
, buf0
, buf1
, out_len
); break;
2669 case RULE_OP_MANGLE_DELETE_AT
: out_len
= rule_op_mangle_delete_at (p0
, p1
, buf0
, buf1
, out_len
); break;
2670 case RULE_OP_MANGLE_EXTRACT
: out_len
= rule_op_mangle_extract (p0
, p1
, buf0
, buf1
, out_len
); break;
2671 case RULE_OP_MANGLE_OMIT
: out_len
= rule_op_mangle_omit (p0
, p1
, buf0
, buf1
, out_len
); break;
2672 case RULE_OP_MANGLE_INSERT
: out_len
= rule_op_mangle_insert (p0
, p1
, buf0
, buf1
, out_len
); break;
2673 case RULE_OP_MANGLE_OVERSTRIKE
: out_len
= rule_op_mangle_overstrike (p0
, p1
, buf0
, buf1
, out_len
); break;
2674 case RULE_OP_MANGLE_TRUNCATE_AT
: out_len
= rule_op_mangle_truncate_at (p0
, p1
, buf0
, buf1
, out_len
); break;
2675 case RULE_OP_MANGLE_REPLACE
: out_len
= rule_op_mangle_replace (p0
, p1
, buf0
, buf1
, out_len
); break;
2676 case RULE_OP_MANGLE_PURGECHAR
: out_len
= rule_op_mangle_purgechar (p0
, p1
, buf0
, buf1
, out_len
); break;
2677 //case RULE_OP_MANGLE_TOGGLECASE_REC: out_len = rule_op_mangle_togglecase_rec (p0, p1, buf0, buf1, out_len); break;
2678 case RULE_OP_MANGLE_DUPECHAR_FIRST
: out_len
= rule_op_mangle_dupechar_first (p0
, p1
, buf0
, buf1
, out_len
); break;
2679 case RULE_OP_MANGLE_DUPECHAR_LAST
: out_len
= rule_op_mangle_dupechar_last (p0
, p1
, buf0
, buf1
, out_len
); break;
2680 case RULE_OP_MANGLE_DUPECHAR_ALL
: out_len
= rule_op_mangle_dupechar_all (p0
, p1
, buf0
, buf1
, out_len
); break;
2681 case RULE_OP_MANGLE_SWITCH_FIRST
: out_len
= rule_op_mangle_switch_first (p0
, p1
, buf0
, buf1
, out_len
); break;
2682 case RULE_OP_MANGLE_SWITCH_LAST
: out_len
= rule_op_mangle_switch_last (p0
, p1
, buf0
, buf1
, out_len
); break;
2683 case RULE_OP_MANGLE_SWITCH_AT
: out_len
= rule_op_mangle_switch_at (p0
, p1
, buf0
, buf1
, out_len
); break;
2684 case RULE_OP_MANGLE_CHR_SHIFTL
: out_len
= rule_op_mangle_chr_shiftl (p0
, p1
, buf0
, buf1
, out_len
); break;
2685 case RULE_OP_MANGLE_CHR_SHIFTR
: out_len
= rule_op_mangle_chr_shiftr (p0
, p1
, buf0
, buf1
, out_len
); break;
2686 case RULE_OP_MANGLE_CHR_INCR
: out_len
= rule_op_mangle_chr_incr (p0
, p1
, buf0
, buf1
, out_len
); break;
2687 case RULE_OP_MANGLE_CHR_DECR
: out_len
= rule_op_mangle_chr_decr (p0
, p1
, buf0
, buf1
, out_len
); break;
2688 case RULE_OP_MANGLE_REPLACE_NP1
: out_len
= rule_op_mangle_replace_np1 (p0
, p1
, buf0
, buf1
, out_len
); break;
2689 case RULE_OP_MANGLE_REPLACE_NM1
: out_len
= rule_op_mangle_replace_nm1 (p0
, p1
, buf0
, buf1
, out_len
); break;
2690 case RULE_OP_MANGLE_DUPEBLOCK_FIRST
: out_len
= rule_op_mangle_dupeblock_first (p0
, p1
, buf0
, buf1
, out_len
); break;
2691 case RULE_OP_MANGLE_DUPEBLOCK_LAST
: out_len
= rule_op_mangle_dupeblock_last (p0
, p1
, buf0
, buf1
, out_len
); break;
2692 case RULE_OP_MANGLE_TITLE
: out_len
= rule_op_mangle_title (p0
, p1
, buf0
, buf1
, out_len
); break;
2698 u32
apply_rules (u32
*cmds
, u32 buf0
[4], u32 buf1
[4], const u32 len
)
2702 for (u32 i
= 0; cmds
[i
] != 0; i
++)
2704 const u32 cmd
= cmds
[i
];
2706 const u32 name
= (cmd
>> 0) & 0xff;
2707 const u32 p0
= (cmd
>> 8) & 0xff;
2708 const u32 p1
= (cmd
>> 16) & 0xff;
2710 out_len
= apply_rule (name
, p0
, p1
, buf0
, buf1
, out_len
);