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;
1667 static u32 rule_op_mangle_purgechar (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1673 static u32 rule_op_mangle_togglecase_rec (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1680 static u32
rule_op_mangle_dupechar_first (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1682 if ( in_len
== 0) return (in_len
);
1683 if ((in_len
+ p0
) >= 32) return (in_len
);
1685 u32 out_len
= in_len
;
1687 const u32 tmp
= buf0
[0] & 0xFF;
1689 rshift_block_N (buf0
, buf1
, buf0
, buf1
, p0
);
1693 case 1: buf0
[0] |= tmp
<< 0;
1695 case 2: buf0
[0] |= tmp
<< 0 | tmp
<< 8;
1697 case 3: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16;
1699 case 4: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1701 case 5: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1702 buf0
[1] |= tmp
<< 0;
1704 case 6: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1705 buf0
[1] |= tmp
<< 0 | tmp
<< 8;
1707 case 7: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1708 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16;
1710 case 8: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1711 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1713 case 9: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1714 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1715 buf0
[2] |= tmp
<< 0;
1717 case 10: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1718 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1719 buf0
[2] |= tmp
<< 0 | tmp
<< 8;
1721 case 11: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1722 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1723 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16;
1725 case 12: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1726 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1727 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1729 case 13: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1730 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1731 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1732 buf0
[3] |= tmp
<< 0;
1734 case 14: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1735 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1736 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1737 buf0
[3] |= tmp
<< 0 | tmp
<< 8;
1739 case 15: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1740 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1741 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1742 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16;
1744 case 16: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1745 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1746 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1747 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1749 case 17: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1750 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1751 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1752 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1753 buf1
[0] |= tmp
<< 0;
1755 case 18: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1756 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1757 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1758 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1759 buf1
[0] |= tmp
<< 0 | tmp
<< 8;
1761 case 19: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1762 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1763 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1764 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1765 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16;
1767 case 20: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1768 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1769 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1770 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1771 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1773 case 21: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1774 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1775 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1776 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1777 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1778 buf1
[1] |= tmp
<< 0;
1780 case 22: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1781 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1782 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1783 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1784 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1785 buf1
[1] |= tmp
<< 0 | tmp
<< 8;
1787 case 23: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1788 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1789 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1790 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1791 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1792 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16;
1794 case 24: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1795 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1796 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1797 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1798 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1799 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1801 case 25: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1802 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1803 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1804 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1805 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1806 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1807 buf1
[2] |= tmp
<< 0;
1809 case 26: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1810 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1811 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1812 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1813 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1814 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1815 buf1
[2] |= tmp
<< 0 | tmp
<< 8;
1817 case 27: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1818 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1819 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1820 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1821 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1822 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1823 buf1
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16;
1825 case 28: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1826 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1827 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1828 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1829 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1830 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1831 buf1
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1833 case 29: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1834 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1835 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1836 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1837 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1838 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1839 buf1
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1840 buf1
[3] |= tmp
<< 0;
1842 case 30: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1843 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1844 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1845 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1846 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1847 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1848 buf1
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1849 buf1
[3] |= tmp
<< 0 | tmp
<< 8;
1851 case 31: buf0
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1852 buf0
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1853 buf0
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1854 buf0
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1855 buf1
[0] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1856 buf1
[1] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1857 buf1
[2] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16 | tmp
<< 24;
1858 buf1
[3] |= tmp
<< 0 | tmp
<< 8 | tmp
<< 16;
1867 static u32
rule_op_mangle_dupechar_last (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1869 if ( in_len
== 0) return (in_len
);
1870 if ((in_len
+ p0
) >= 32) return (in_len
);
1872 const u32 in_len1
= in_len
- 1;
1874 const u32 sh
= (in_len1
& 3) * 8;
1878 switch (in_len1
/ 4)
1880 case 0: tmp
= (buf0
[0] >> sh
) & 0xff; break;
1881 case 1: tmp
= (buf0
[1] >> sh
) & 0xff; break;
1882 case 2: tmp
= (buf0
[2] >> sh
) & 0xff; break;
1883 case 3: tmp
= (buf0
[3] >> sh
) & 0xff; break;
1884 case 4: tmp
= (buf1
[0] >> sh
) & 0xff; break;
1885 case 5: tmp
= (buf1
[1] >> sh
) & 0xff; break;
1886 case 6: tmp
= (buf1
[2] >> sh
) & 0xff; break;
1887 case 7: tmp
= (buf1
[3] >> sh
) & 0xff; break;
1890 u32 out_len
= in_len
;
1892 for (u32 i
= 0; i
< p0
; i
++)
1894 append_block1 (out_len
, buf0
, buf1
, tmp
);
1902 static u32
rule_op_mangle_dupechar_all (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
+ in_len
) >= 32) return (in_len
);
1907 u32 out_len
= in_len
;
1912 tib40
[0] = ((buf0
[0] & 0x000000FF) << 0) | ((buf0
[0] & 0x0000FF00) << 8);
1913 tib40
[1] = ((buf0
[0] & 0x00FF0000) >> 16) | ((buf0
[0] & 0xFF000000) >> 8);
1914 tib40
[2] = ((buf0
[1] & 0x000000FF) << 0) | ((buf0
[1] & 0x0000FF00) << 8);
1915 tib40
[3] = ((buf0
[1] & 0x00FF0000) >> 16) | ((buf0
[1] & 0xFF000000) >> 8);
1916 tib41
[0] = ((buf0
[2] & 0x000000FF) << 0) | ((buf0
[2] & 0x0000FF00) << 8);
1917 tib41
[1] = ((buf0
[2] & 0x00FF0000) >> 16) | ((buf0
[2] & 0xFF000000) >> 8);
1918 tib41
[2] = ((buf0
[3] & 0x000000FF) << 0) | ((buf0
[3] & 0x0000FF00) << 8);
1919 tib41
[3] = ((buf0
[3] & 0x00FF0000) >> 16) | ((buf0
[3] & 0xFF000000) >> 8);
1921 buf0
[0] = tib40
[0] | (tib40
[0] << 8);
1922 buf0
[1] = tib40
[1] | (tib40
[1] << 8);
1923 buf0
[2] = tib40
[2] | (tib40
[2] << 8);
1924 buf0
[3] = tib40
[3] | (tib40
[3] << 8);
1925 buf1
[0] = tib41
[0] | (tib41
[0] << 8);
1926 buf1
[1] = tib41
[1] | (tib41
[1] << 8);
1927 buf1
[2] = tib41
[2] | (tib41
[2] << 8);
1928 buf1
[3] = tib41
[3] | (tib41
[3] << 8);
1930 out_len
= out_len
+ out_len
;
1935 static u32
rule_op_mangle_switch_first (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1937 if (in_len
< 2) return (in_len
);
1939 buf0
[0] = (buf0
[0] & 0xFFFF0000) | ((buf0
[0] << 8) & 0x0000FF00) | ((buf0
[0] >> 8) & 0x000000FF);
1944 static u32
rule_op_mangle_switch_last (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
1946 if (in_len
< 2) return (in_len
);
1950 case 2: buf0
[0] = ((buf0
[0] << 8) & 0x0000FF00) | ((buf0
[0] >> 8) & 0x000000FF);
1952 case 3: buf0
[0] = (buf0
[0] & 0x000000FF) | ((buf0
[0] << 8) & 0x00FF0000) | ((buf0
[0] >> 8) & 0x0000FF00);
1954 case 4: buf0
[0] = (buf0
[0] & 0x0000FFFF) | ((buf0
[0] << 8) & 0xFF000000) | ((buf0
[0] >> 8) & 0x00FF0000);
1956 case 5: buf0
[1] = (buf0
[0] & 0xFF000000) | buf0
[1];
1957 buf0
[0] = (buf0
[0] & 0x00FFFFFF) | (buf0
[1] << 24);
1958 buf0
[1] = (buf0
[1] >> 24);
1960 case 6: buf0
[1] = ((buf0
[1] << 8) & 0x0000FF00) | ((buf0
[1] >> 8) & 0x000000FF);
1962 case 7: buf0
[1] = (buf0
[1] & 0x000000FF) | ((buf0
[1] << 8) & 0x00FF0000) | ((buf0
[1] >> 8) & 0x0000FF00);
1964 case 8: buf0
[1] = (buf0
[1] & 0x0000FFFF) | ((buf0
[1] << 8) & 0xFF000000) | ((buf0
[1] >> 8) & 0x00FF0000);
1966 case 9: buf0
[2] = (buf0
[1] & 0xFF000000) | buf0
[2];
1967 buf0
[1] = (buf0
[1] & 0x00FFFFFF) | (buf0
[2] << 24);
1968 buf0
[2] = (buf0
[2] >> 24);
1970 case 10: buf0
[2] = ((buf0
[2] << 8) & 0x0000FF00) | ((buf0
[2] >> 8) & 0x000000FF);
1972 case 11: buf0
[2] = (buf0
[2] & 0x000000FF) | ((buf0
[2] << 8) & 0x00FF0000) | ((buf0
[2] >> 8) & 0x0000FF00);
1974 case 12: buf0
[2] = (buf0
[2] & 0x0000FFFF) | ((buf0
[2] << 8) & 0xFF000000) | ((buf0
[2] >> 8) & 0x00FF0000);
1976 case 13: buf0
[3] = (buf0
[2] & 0xFF000000) | buf0
[3];
1977 buf0
[2] = (buf0
[2] & 0x00FFFFFF) | (buf0
[3] << 24);
1978 buf0
[3] = (buf0
[3] >> 24);
1980 case 14: buf0
[3] = ((buf0
[3] << 8) & 0x0000FF00) | ((buf0
[3] >> 8) & 0x000000FF);
1982 case 15: buf0
[3] = (buf0
[3] & 0x000000FF) | ((buf0
[3] << 8) & 0x00FF0000) | ((buf0
[3] >> 8) & 0x0000FF00);
1984 case 16: buf0
[3] = (buf0
[3] & 0x0000FFFF) | ((buf0
[3] << 8) & 0xFF000000) | ((buf0
[3] >> 8) & 0x00FF0000);
1986 case 17: buf1
[0] = (buf0
[3] & 0xFF000000) | buf1
[0];
1987 buf0
[3] = (buf0
[3] & 0x00FFFFFF) | (buf1
[0] << 24);
1988 buf1
[0] = (buf1
[0] >> 24);
1990 case 18: buf1
[0] = ((buf1
[0] << 8) & 0x0000FF00) | ((buf1
[0] >> 8) & 0x000000FF);
1992 case 19: buf1
[0] = (buf1
[0] & 0x000000FF) | ((buf1
[0] << 8) & 0x00FF0000) | ((buf1
[0] >> 8) & 0x0000FF00);
1994 case 20: buf1
[0] = (buf1
[0] & 0x0000FFFF) | ((buf1
[0] << 8) & 0xFF000000) | ((buf1
[0] >> 8) & 0x00FF0000);
1996 case 21: buf1
[1] = (buf1
[0] & 0xFF000000) | buf1
[1];
1997 buf1
[0] = (buf1
[0] & 0x00FFFFFF) | (buf1
[1] << 24);
1998 buf1
[1] = (buf1
[1] >> 24);
2000 case 22: buf1
[1] = ((buf1
[1] << 8) & 0x0000FF00) | ((buf1
[1] >> 8) & 0x000000FF);
2002 case 23: buf1
[1] = (buf1
[1] & 0x000000FF) | ((buf1
[1] << 8) & 0x00FF0000) | ((buf1
[1] >> 8) & 0x0000FF00);
2004 case 24: buf1
[1] = (buf1
[1] & 0x0000FFFF) | ((buf1
[1] << 8) & 0xFF000000) | ((buf1
[1] >> 8) & 0x00FF0000);
2006 case 25: buf1
[2] = (buf1
[1] & 0xFF000000) | buf1
[2];
2007 buf1
[1] = (buf1
[1] & 0x00FFFFFF) | (buf1
[2] << 24);
2008 buf1
[2] = (buf1
[2] >> 24);
2010 case 26: buf1
[2] = ((buf1
[2] << 8) & 0x0000FF00) | ((buf1
[2] >> 8) & 0x000000FF);
2012 case 27: buf1
[2] = (buf1
[2] & 0x000000FF) | ((buf1
[2] << 8) & 0x00FF0000) | ((buf1
[2] >> 8) & 0x0000FF00);
2014 case 28: buf1
[2] = (buf1
[2] & 0x0000FFFF) | ((buf1
[2] << 8) & 0xFF000000) | ((buf1
[2] >> 8) & 0x00FF0000);
2016 case 29: buf1
[3] = (buf1
[2] & 0xFF000000) | buf1
[3];
2017 buf1
[2] = (buf1
[2] & 0x00FFFFFF) | (buf1
[3] << 24);
2018 buf1
[3] = (buf1
[3] >> 24);
2020 case 30: buf1
[3] = ((buf1
[3] << 8) & 0x0000FF00) | ((buf1
[3] >> 8) & 0x000000FF);
2022 case 31: buf1
[3] = (buf1
[3] & 0x000000FF) | ((buf1
[3] << 8) & 0x00FF0000) | ((buf1
[3] >> 8) & 0x0000FF00);
2029 static u32
rule_op_mangle_switch_at (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2031 if (p0
>= in_len
) return (in_len
);
2032 if (p1
>= in_len
) return (in_len
);
2039 case 0: tmp0
= (buf0
[0] >> 0) & 0xFF;
2041 case 1: tmp0
= (buf0
[0] >> 8) & 0xFF;
2043 case 2: tmp0
= (buf0
[0] >> 16) & 0xFF;
2045 case 3: tmp0
= (buf0
[0] >> 24) & 0xFF;
2047 case 4: tmp0
= (buf0
[1] >> 0) & 0xFF;
2049 case 5: tmp0
= (buf0
[1] >> 8) & 0xFF;
2051 case 6: tmp0
= (buf0
[1] >> 16) & 0xFF;
2053 case 7: tmp0
= (buf0
[1] >> 24) & 0xFF;
2055 case 8: tmp0
= (buf0
[2] >> 0) & 0xFF;
2057 case 9: tmp0
= (buf0
[2] >> 8) & 0xFF;
2059 case 10: tmp0
= (buf0
[2] >> 16) & 0xFF;
2061 case 11: tmp0
= (buf0
[2] >> 24) & 0xFF;
2063 case 12: tmp0
= (buf0
[3] >> 0) & 0xFF;
2065 case 13: tmp0
= (buf0
[3] >> 8) & 0xFF;
2067 case 14: tmp0
= (buf0
[3] >> 16) & 0xFF;
2069 case 15: tmp0
= (buf0
[3] >> 24) & 0xFF;
2071 case 16: tmp0
= (buf1
[0] >> 0) & 0xFF;
2073 case 17: tmp0
= (buf1
[0] >> 8) & 0xFF;
2075 case 18: tmp0
= (buf1
[0] >> 16) & 0xFF;
2077 case 19: tmp0
= (buf1
[0] >> 24) & 0xFF;
2079 case 20: tmp0
= (buf1
[1] >> 0) & 0xFF;
2081 case 21: tmp0
= (buf1
[1] >> 8) & 0xFF;
2083 case 22: tmp0
= (buf1
[1] >> 16) & 0xFF;
2085 case 23: tmp0
= (buf1
[1] >> 24) & 0xFF;
2087 case 24: tmp0
= (buf1
[2] >> 0) & 0xFF;
2089 case 25: tmp0
= (buf1
[2] >> 8) & 0xFF;
2091 case 26: tmp0
= (buf1
[2] >> 16) & 0xFF;
2093 case 27: tmp0
= (buf1
[2] >> 24) & 0xFF;
2095 case 28: tmp0
= (buf1
[3] >> 0) & 0xFF;
2097 case 29: tmp0
= (buf1
[3] >> 8) & 0xFF;
2099 case 30: tmp0
= (buf1
[3] >> 16) & 0xFF;
2101 case 31: tmp0
= (buf1
[3] >> 24) & 0xFF;
2107 case 0: tmp1
= (buf0
[0] >> 0) & 0xff;
2108 buf0
[0] = (buf0
[0] & 0xffffff00) | tmp0
<< 0;
2110 case 1: tmp1
= (buf0
[0] >> 8) & 0xff;
2111 buf0
[0] = (buf0
[0] & 0xffff00ff) | tmp0
<< 8;
2113 case 2: tmp1
= (buf0
[0] >> 16) & 0xff;
2114 buf0
[0] = (buf0
[0] & 0xff00ffff) | tmp0
<< 16;
2116 case 3: tmp1
= (buf0
[0] >> 24) & 0xff;
2117 buf0
[0] = (buf0
[0] & 0x00ffffff) | tmp0
<< 24;
2119 case 4: tmp1
= (buf0
[1] >> 0) & 0xff;
2120 buf0
[1] = (buf0
[1] & 0xffffff00) | tmp0
<< 0;
2122 case 5: tmp1
= (buf0
[1] >> 8) & 0xff;
2123 buf0
[1] = (buf0
[1] & 0xffff00ff) | tmp0
<< 8;
2125 case 6: tmp1
= (buf0
[1] >> 16) & 0xff;
2126 buf0
[1] = (buf0
[1] & 0xff00ffff) | tmp0
<< 16;
2128 case 7: tmp1
= (buf0
[1] >> 24) & 0xff;
2129 buf0
[1] = (buf0
[1] & 0x00ffffff) | tmp0
<< 24;
2131 case 8: tmp1
= (buf0
[2] >> 0) & 0xff;
2132 buf0
[2] = (buf0
[2] & 0xffffff00) | tmp0
<< 0;
2134 case 9: tmp1
= (buf0
[2] >> 8) & 0xff;
2135 buf0
[2] = (buf0
[2] & 0xffff00ff) | tmp0
<< 8;
2137 case 10: tmp1
= (buf0
[2] >> 16) & 0xff;
2138 buf0
[2] = (buf0
[2] & 0xff00ffff) | tmp0
<< 16;
2140 case 11: tmp1
= (buf0
[2] >> 24) & 0xff;
2141 buf0
[2] = (buf0
[2] & 0x00ffffff) | tmp0
<< 24;
2143 case 12: tmp1
= (buf0
[3] >> 0) & 0xff;
2144 buf0
[3] = (buf0
[3] & 0xffffff00) | tmp0
<< 0;
2146 case 13: tmp1
= (buf0
[3] >> 8) & 0xff;
2147 buf0
[3] = (buf0
[3] & 0xffff00ff) | tmp0
<< 8;
2149 case 14: tmp1
= (buf0
[3] >> 16) & 0xff;
2150 buf0
[3] = (buf0
[3] & 0xff00ffff) | tmp0
<< 16;
2152 case 15: tmp1
= (buf0
[3] >> 24) & 0xff;
2153 buf0
[3] = (buf0
[3] & 0x00ffffff) | tmp0
<< 24;
2155 case 16: tmp1
= (buf1
[0] >> 0) & 0xff;
2156 buf1
[0] = (buf1
[0] & 0xffffff00) | tmp0
<< 0;
2158 case 17: tmp1
= (buf1
[0] >> 8) & 0xff;
2159 buf1
[0] = (buf1
[0] & 0xffff00ff) | tmp0
<< 8;
2161 case 18: tmp1
= (buf1
[0] >> 16) & 0xff;
2162 buf1
[0] = (buf1
[0] & 0xff00ffff) | tmp0
<< 16;
2164 case 19: tmp1
= (buf1
[0] >> 24) & 0xff;
2165 buf1
[0] = (buf1
[0] & 0x00ffffff) | tmp0
<< 24;
2167 case 20: tmp1
= (buf1
[1] >> 0) & 0xff;
2168 buf1
[1] = (buf1
[1] & 0xffffff00) | tmp0
<< 0;
2170 case 21: tmp1
= (buf1
[1] >> 8) & 0xff;
2171 buf1
[1] = (buf1
[1] & 0xffff00ff) | tmp0
<< 8;
2173 case 22: tmp1
= (buf1
[1] >> 16) & 0xff;
2174 buf1
[1] = (buf1
[1] & 0xff00ffff) | tmp0
<< 16;
2176 case 23: tmp1
= (buf1
[1] >> 24) & 0xff;
2177 buf1
[1] = (buf1
[1] & 0x00ffffff) | tmp0
<< 24;
2179 case 24: tmp1
= (buf1
[2] >> 0) & 0xff;
2180 buf1
[2] = (buf1
[2] & 0xffffff00) | tmp0
<< 0;
2182 case 25: tmp1
= (buf1
[2] >> 8) & 0xff;
2183 buf1
[2] = (buf1
[2] & 0xffff00ff) | tmp0
<< 8;
2185 case 26: tmp1
= (buf1
[2] >> 16) & 0xff;
2186 buf1
[2] = (buf1
[2] & 0xff00ffff) | tmp0
<< 16;
2188 case 27: tmp1
= (buf1
[2] >> 24) & 0xff;
2189 buf1
[2] = (buf1
[2] & 0x00ffffff) | tmp0
<< 24;
2191 case 28: tmp1
= (buf1
[3] >> 0) & 0xff;
2192 buf1
[3] = (buf1
[3] & 0xffffff00) | tmp0
<< 0;
2194 case 29: tmp1
= (buf1
[3] >> 8) & 0xff;
2195 buf1
[3] = (buf1
[3] & 0xffff00ff) | tmp0
<< 8;
2197 case 30: tmp1
= (buf1
[3] >> 16) & 0xff;
2198 buf1
[3] = (buf1
[3] & 0xff00ffff) | tmp0
<< 16;
2200 case 31: tmp1
= (buf1
[3] >> 24) & 0xff;
2201 buf1
[3] = (buf1
[3] & 0x00ffffff) | tmp0
<< 24;
2207 case 0: buf0
[0] = (buf0
[0] & 0xffffff00) | tmp1
<< 0;
2209 case 1: buf0
[0] = (buf0
[0] & 0xffff00ff) | tmp1
<< 8;
2211 case 2: buf0
[0] = (buf0
[0] & 0xff00ffff) | tmp1
<< 16;
2213 case 3: buf0
[0] = (buf0
[0] & 0x00ffffff) | tmp1
<< 24;
2215 case 4: buf0
[1] = (buf0
[1] & 0xffffff00) | tmp1
<< 0;
2217 case 5: buf0
[1] = (buf0
[1] & 0xffff00ff) | tmp1
<< 8;
2219 case 6: buf0
[1] = (buf0
[1] & 0xff00ffff) | tmp1
<< 16;
2221 case 7: buf0
[1] = (buf0
[1] & 0x00ffffff) | tmp1
<< 24;
2223 case 8: buf0
[2] = (buf0
[2] & 0xffffff00) | tmp1
<< 0;
2225 case 9: buf0
[2] = (buf0
[2] & 0xffff00ff) | tmp1
<< 8;
2227 case 10: buf0
[2] = (buf0
[2] & 0xff00ffff) | tmp1
<< 16;
2229 case 11: buf0
[2] = (buf0
[2] & 0x00ffffff) | tmp1
<< 24;
2231 case 12: buf0
[3] = (buf0
[3] & 0xffffff00) | tmp1
<< 0;
2233 case 13: buf0
[3] = (buf0
[3] & 0xffff00ff) | tmp1
<< 8;
2235 case 14: buf0
[3] = (buf0
[3] & 0xff00ffff) | tmp1
<< 16;
2237 case 15: buf0
[3] = (buf0
[3] & 0x00ffffff) | tmp1
<< 24;
2239 case 16: buf1
[0] = (buf1
[0] & 0xffffff00) | tmp1
<< 0;
2241 case 17: buf1
[0] = (buf1
[0] & 0xffff00ff) | tmp1
<< 8;
2243 case 18: buf1
[0] = (buf1
[0] & 0xff00ffff) | tmp1
<< 16;
2245 case 19: buf1
[0] = (buf1
[0] & 0x00ffffff) | tmp1
<< 24;
2247 case 20: buf1
[1] = (buf1
[1] & 0xffffff00) | tmp1
<< 0;
2249 case 21: buf1
[1] = (buf1
[1] & 0xffff00ff) | tmp1
<< 8;
2251 case 22: buf1
[1] = (buf1
[1] & 0xff00ffff) | tmp1
<< 16;
2253 case 23: buf1
[1] = (buf1
[1] & 0x00ffffff) | tmp1
<< 24;
2255 case 24: buf1
[2] = (buf1
[2] & 0xffffff00) | tmp1
<< 0;
2257 case 25: buf1
[2] = (buf1
[2] & 0xffff00ff) | tmp1
<< 8;
2259 case 26: buf1
[2] = (buf1
[2] & 0xff00ffff) | tmp1
<< 16;
2261 case 27: buf1
[2] = (buf1
[2] & 0x00ffffff) | tmp1
<< 24;
2263 case 28: buf1
[3] = (buf1
[3] & 0xffffff00) | tmp1
<< 0;
2265 case 29: buf1
[3] = (buf1
[3] & 0xffff00ff) | tmp1
<< 8;
2267 case 30: buf1
[3] = (buf1
[3] & 0xff00ffff) | tmp1
<< 16;
2269 case 31: buf1
[3] = (buf1
[3] & 0x00ffffff) | tmp1
<< 24;
2276 static u32
rule_op_mangle_chr_shiftl (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2278 if (p0
>= in_len
) return (in_len
);
2280 const u32 mr
= 0xffu
<< ((p0
& 3) * 8);
2285 case 0: buf0
[0] = (buf0
[0] & ml
) | (((buf0
[0] & mr
) << 1) & mr
); break;
2286 case 1: buf0
[1] = (buf0
[1] & ml
) | (((buf0
[1] & mr
) << 1) & mr
); break;
2287 case 2: buf0
[2] = (buf0
[2] & ml
) | (((buf0
[2] & mr
) << 1) & mr
); break;
2288 case 3: buf0
[3] = (buf0
[3] & ml
) | (((buf0
[3] & mr
) << 1) & mr
); break;
2289 case 4: buf1
[0] = (buf1
[0] & ml
) | (((buf1
[0] & mr
) << 1) & mr
); break;
2290 case 5: buf1
[1] = (buf1
[1] & ml
) | (((buf1
[1] & mr
) << 1) & mr
); break;
2291 case 6: buf1
[2] = (buf1
[2] & ml
) | (((buf1
[2] & mr
) << 1) & mr
); break;
2292 case 7: buf1
[3] = (buf1
[3] & ml
) | (((buf1
[3] & mr
) << 1) & mr
); break;
2298 static u32
rule_op_mangle_chr_shiftr (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2300 if (p0
>= in_len
) return (in_len
);
2302 const u32 mr
= 0xffu
<< ((p0
& 3) * 8);
2307 case 0: buf0
[0] = (buf0
[0] & ml
) | (((buf0
[0] & mr
) >> 1) & mr
); break;
2308 case 1: buf0
[1] = (buf0
[1] & ml
) | (((buf0
[1] & mr
) >> 1) & mr
); break;
2309 case 2: buf0
[2] = (buf0
[2] & ml
) | (((buf0
[2] & mr
) >> 1) & mr
); break;
2310 case 3: buf0
[3] = (buf0
[3] & ml
) | (((buf0
[3] & mr
) >> 1) & mr
); break;
2311 case 4: buf1
[0] = (buf1
[0] & ml
) | (((buf1
[0] & mr
) >> 1) & mr
); break;
2312 case 5: buf1
[1] = (buf1
[1] & ml
) | (((buf1
[1] & mr
) >> 1) & mr
); break;
2313 case 6: buf1
[2] = (buf1
[2] & ml
) | (((buf1
[2] & mr
) >> 1) & mr
); break;
2314 case 7: buf1
[3] = (buf1
[3] & ml
) | (((buf1
[3] & mr
) >> 1) & mr
); break;
2320 static u32
rule_op_mangle_chr_incr (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2322 if (p0
>= in_len
) return (in_len
);
2324 const u32 mr
= 0xffu
<< ((p0
& 3) * 8);
2327 const u32 n
= 0x01010101 & mr
;
2331 case 0: buf0
[0] = (buf0
[0] & ml
) | (((buf0
[0] & mr
) + n
) & mr
); break;
2332 case 1: buf0
[1] = (buf0
[1] & ml
) | (((buf0
[1] & mr
) + n
) & mr
); break;
2333 case 2: buf0
[2] = (buf0
[2] & ml
) | (((buf0
[2] & mr
) + n
) & mr
); break;
2334 case 3: buf0
[3] = (buf0
[3] & ml
) | (((buf0
[3] & mr
) + n
) & mr
); break;
2335 case 4: buf1
[0] = (buf1
[0] & ml
) | (((buf1
[0] & mr
) + n
) & mr
); break;
2336 case 5: buf1
[1] = (buf1
[1] & ml
) | (((buf1
[1] & mr
) + n
) & mr
); break;
2337 case 6: buf1
[2] = (buf1
[2] & ml
) | (((buf1
[2] & mr
) + n
) & mr
); break;
2338 case 7: buf1
[3] = (buf1
[3] & ml
) | (((buf1
[3] & mr
) + n
) & mr
); break;
2344 static u32
rule_op_mangle_chr_decr (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2346 if (p0
>= in_len
) return (in_len
);
2348 const u32 mr
= 0xffu
<< ((p0
& 3) * 8);
2351 const u32 n
= 0x01010101 & mr
;
2355 case 0: buf0
[0] = (buf0
[0] & ml
) | (((buf0
[0] & mr
) - n
) & mr
); break;
2356 case 1: buf0
[1] = (buf0
[1] & ml
) | (((buf0
[1] & mr
) - n
) & mr
); break;
2357 case 2: buf0
[2] = (buf0
[2] & ml
) | (((buf0
[2] & mr
) - n
) & mr
); break;
2358 case 3: buf0
[3] = (buf0
[3] & ml
) | (((buf0
[3] & mr
) - n
) & mr
); break;
2359 case 4: buf1
[0] = (buf1
[0] & ml
) | (((buf1
[0] & mr
) - n
) & mr
); break;
2360 case 5: buf1
[1] = (buf1
[1] & ml
) | (((buf1
[1] & mr
) - n
) & mr
); break;
2361 case 6: buf1
[2] = (buf1
[2] & ml
) | (((buf1
[2] & mr
) - n
) & mr
); break;
2362 case 7: buf1
[3] = (buf1
[3] & ml
) | (((buf1
[3] & mr
) - n
) & mr
); break;
2368 static u32
rule_op_mangle_replace_np1 (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2370 if ((p0
+ 1) >= in_len
) return (in_len
);
2375 lshift_block (buf0
, buf1
, tib40
, tib41
);
2377 const u32 mr
= 0xffu
<< ((p0
& 3) * 8);
2382 case 0: buf0
[0] = (buf0
[0] & ml
) | (tib40
[0] & mr
); break;
2383 case 1: buf0
[1] = (buf0
[1] & ml
) | (tib40
[1] & mr
); break;
2384 case 2: buf0
[2] = (buf0
[2] & ml
) | (tib40
[2] & mr
); break;
2385 case 3: buf0
[3] = (buf0
[3] & ml
) | (tib40
[3] & mr
); break;
2386 case 4: buf1
[0] = (buf1
[0] & ml
) | (tib41
[0] & mr
); break;
2387 case 5: buf1
[1] = (buf1
[1] & ml
) | (tib41
[1] & mr
); break;
2388 case 6: buf1
[2] = (buf1
[2] & ml
) | (tib41
[2] & mr
); break;
2389 case 7: buf1
[3] = (buf1
[3] & ml
) | (tib41
[3] & mr
); break;
2395 static u32
rule_op_mangle_replace_nm1 (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2397 if (p0
== 0) return (in_len
);
2399 if (p0
>= in_len
) return (in_len
);
2404 rshift_block (buf0
, buf1
, tib40
, tib41
);
2406 const u32 mr
= 0xffu
<< ((p0
& 3) * 8);
2411 case 0: buf0
[0] = (buf0
[0] & ml
) | (tib40
[0] & mr
); break;
2412 case 1: buf0
[1] = (buf0
[1] & ml
) | (tib40
[1] & mr
); break;
2413 case 2: buf0
[2] = (buf0
[2] & ml
) | (tib40
[2] & mr
); break;
2414 case 3: buf0
[3] = (buf0
[3] & ml
) | (tib40
[3] & mr
); break;
2415 case 4: buf1
[0] = (buf1
[0] & ml
) | (tib41
[0] & mr
); break;
2416 case 5: buf1
[1] = (buf1
[1] & ml
) | (tib41
[1] & mr
); break;
2417 case 6: buf1
[2] = (buf1
[2] & ml
) | (tib41
[2] & mr
); break;
2418 case 7: buf1
[3] = (buf1
[3] & ml
) | (tib41
[3] & mr
); break;
2424 static u32
rule_op_mangle_dupeblock_first (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2426 if (p0
> in_len
) return (in_len
);
2428 if ((in_len
+ p0
) >= 32) return (in_len
);
2430 u32 out_len
= in_len
;
2444 truncate_right (tib40
, tib41
, p0
);
2446 rshift_block_N (buf0
, buf1
, buf0
, buf1
, p0
);
2448 buf0
[0] |= tib40
[0];
2449 buf0
[1] |= tib40
[1];
2450 buf0
[2] |= tib40
[2];
2451 buf0
[3] |= tib40
[3];
2452 buf1
[0] |= tib41
[0];
2453 buf1
[1] |= tib41
[1];
2454 buf1
[2] |= tib41
[2];
2455 buf1
[3] |= tib41
[3];
2462 static u32
rule_op_mangle_dupeblock_last (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2464 if (p0
> in_len
) return (in_len
);
2466 if ((in_len
+ p0
) >= 32) return (in_len
);
2468 u32 out_len
= in_len
;
2473 rshift_block_N (buf0
, buf1
, tib40
, tib41
, p0
);
2475 truncate_left (tib40
, tib41
, out_len
);
2477 buf0
[0] |= tib40
[0];
2478 buf0
[1] |= tib40
[1];
2479 buf0
[2] |= tib40
[2];
2480 buf0
[3] |= tib40
[3];
2481 buf1
[0] |= tib41
[0];
2482 buf1
[1] |= tib41
[1];
2483 buf1
[2] |= tib41
[2];
2484 buf1
[3] |= tib41
[3];
2491 static u32
rule_op_mangle_title (const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2493 buf0
[0] |= (generate_cmask (buf0
[0]));
2494 buf0
[1] |= (generate_cmask (buf0
[1]));
2495 buf0
[2] |= (generate_cmask (buf0
[2]));
2496 buf0
[3] |= (generate_cmask (buf0
[3]));
2497 buf1
[0] |= (generate_cmask (buf1
[0]));
2498 buf1
[1] |= (generate_cmask (buf1
[1]));
2499 buf1
[2] |= (generate_cmask (buf1
[2]));
2500 buf1
[3] |= (generate_cmask (buf1
[3]));
2502 buf0
[0] &= ~(0x00000020 & generate_cmask (buf0
[0]));
2504 for (u32 i
= 0; i
< in_len
; i
++)
2511 case 0: tmp0
= (buf0
[0] >> 0) & 0xFF;
2512 tmp1
= ~(0x00002000 & generate_cmask (buf0
[0])); break;
2513 case 1: tmp0
= (buf0
[0] >> 8) & 0xFF;
2514 tmp1
= ~(0x00200000 & generate_cmask (buf0
[0])); break;
2515 case 2: tmp0
= (buf0
[0] >> 16) & 0xFF;
2516 tmp1
= ~(0x20000000 & generate_cmask (buf0
[0])); break;
2517 case 3: tmp0
= (buf0
[0] >> 24) & 0xFF;
2518 tmp1
= ~(0x00000020 & generate_cmask (buf0
[1])); break;
2519 case 4: tmp0
= (buf0
[1] >> 0) & 0xFF;
2520 tmp1
= ~(0x00002000 & generate_cmask (buf0
[1])); break;
2521 case 5: tmp0
= (buf0
[1] >> 8) & 0xFF;
2522 tmp1
= ~(0x00200000 & generate_cmask (buf0
[1])); break;
2523 case 6: tmp0
= (buf0
[1] >> 16) & 0xFF;
2524 tmp1
= ~(0x20000000 & generate_cmask (buf0
[1])); break;
2525 case 7: tmp0
= (buf0
[1] >> 24) & 0xFF;
2526 tmp1
= ~(0x00000020 & generate_cmask (buf0
[2])); break;
2527 case 8: tmp0
= (buf0
[2] >> 0) & 0xFF;
2528 tmp1
= ~(0x00002000 & generate_cmask (buf0
[2])); break;
2529 case 9: tmp0
= (buf0
[2] >> 8) & 0xFF;
2530 tmp1
= ~(0x00200000 & generate_cmask (buf0
[2])); break;
2531 case 10: tmp0
= (buf0
[2] >> 16) & 0xFF;
2532 tmp1
= ~(0x20000000 & generate_cmask (buf0
[2])); break;
2533 case 11: tmp0
= (buf0
[2] >> 24) & 0xFF;
2534 tmp1
= ~(0x00000020 & generate_cmask (buf0
[3])); break;
2535 case 12: tmp0
= (buf0
[3] >> 0) & 0xFF;
2536 tmp1
= ~(0x00002000 & generate_cmask (buf0
[3])); break;
2537 case 13: tmp0
= (buf0
[3] >> 8) & 0xFF;
2538 tmp1
= ~(0x00200000 & generate_cmask (buf0
[3])); break;
2539 case 14: tmp0
= (buf0
[3] >> 16) & 0xFF;
2540 tmp1
= ~(0x20000000 & generate_cmask (buf0
[3])); break;
2541 case 15: tmp0
= (buf0
[3] >> 24) & 0xFF;
2542 tmp1
= ~(0x00000020 & generate_cmask (buf1
[0])); break;
2543 case 16: tmp0
= (buf1
[0] >> 0) & 0xFF;
2544 tmp1
= ~(0x00002000 & generate_cmask (buf1
[0])); break;
2545 case 17: tmp0
= (buf1
[0] >> 8) & 0xFF;
2546 tmp1
= ~(0x00200000 & generate_cmask (buf1
[0])); break;
2547 case 18: tmp0
= (buf1
[0] >> 16) & 0xFF;
2548 tmp1
= ~(0x20000000 & generate_cmask (buf1
[0])); break;
2549 case 19: tmp0
= (buf1
[0] >> 24) & 0xFF;
2550 tmp1
= ~(0x00000020 & generate_cmask (buf1
[1])); break;
2551 case 20: tmp0
= (buf1
[1] >> 0) & 0xFF;
2552 tmp1
= ~(0x00002000 & generate_cmask (buf1
[1])); break;
2553 case 21: tmp0
= (buf1
[1] >> 8) & 0xFF;
2554 tmp1
= ~(0x00200000 & generate_cmask (buf1
[1])); break;
2555 case 22: tmp0
= (buf1
[1] >> 16) & 0xFF;
2556 tmp1
= ~(0x20000000 & generate_cmask (buf1
[1])); break;
2557 case 23: tmp0
= (buf1
[1] >> 24) & 0xFF;
2558 tmp1
= ~(0x00000020 & generate_cmask (buf1
[2])); break;
2559 case 24: tmp0
= (buf1
[2] >> 0) & 0xFF;
2560 tmp1
= ~(0x00002000 & generate_cmask (buf1
[2])); break;
2561 case 25: tmp0
= (buf1
[2] >> 8) & 0xFF;
2562 tmp1
= ~(0x00200000 & generate_cmask (buf1
[2])); break;
2563 case 26: tmp0
= (buf1
[2] >> 16) & 0xFF;
2564 tmp1
= ~(0x20000000 & generate_cmask (buf1
[2])); break;
2565 case 27: tmp0
= (buf1
[2] >> 24) & 0xFF;
2566 tmp1
= ~(0x00000020 & generate_cmask (buf1
[3])); break;
2567 case 28: tmp0
= (buf1
[3] >> 0) & 0xFF;
2568 tmp1
= ~(0x00002000 & generate_cmask (buf1
[3])); break;
2569 case 29: tmp0
= (buf1
[3] >> 8) & 0xFF;
2570 tmp1
= ~(0x00200000 & generate_cmask (buf1
[3])); break;
2571 case 30: tmp0
= (buf1
[3] >> 16) & 0xFF;
2572 tmp1
= ~(0x20000000 & generate_cmask (buf1
[3])); break;
2577 if (tmp0
== ' ') buf0
[0] &= tmp1
;
2581 if (tmp0
== ' ') buf0
[1] &= tmp1
;
2585 if (tmp0
== ' ') buf0
[2] &= tmp1
;
2589 if (tmp0
== ' ') buf0
[3] &= tmp1
;
2593 if (tmp0
== ' ') buf1
[0] &= tmp1
;
2597 if (tmp0
== ' ') buf1
[1] &= tmp1
;
2601 if (tmp0
== ' ') buf1
[2] &= tmp1
;
2605 if (tmp0
== ' ') buf1
[3] &= tmp1
;
2612 u32
apply_rule (const u32 name
, const u32 p0
, const u32 p1
, u32 buf0
[4], u32 buf1
[4], const u32 in_len
)
2614 u32 out_len
= in_len
;
2618 case RULE_OP_MANGLE_LREST
: out_len
= rule_op_mangle_lrest (p0
, p1
, buf0
, buf1
, out_len
); break;
2619 case RULE_OP_MANGLE_UREST
: out_len
= rule_op_mangle_urest (p0
, p1
, buf0
, buf1
, out_len
); break;
2620 case RULE_OP_MANGLE_LREST_UFIRST
: out_len
= rule_op_mangle_lrest_ufirst (p0
, p1
, buf0
, buf1
, out_len
); break;
2621 case RULE_OP_MANGLE_UREST_LFIRST
: out_len
= rule_op_mangle_urest_lfirst (p0
, p1
, buf0
, buf1
, out_len
); break;
2622 case RULE_OP_MANGLE_TREST
: out_len
= rule_op_mangle_trest (p0
, p1
, buf0
, buf1
, out_len
); break;
2623 case RULE_OP_MANGLE_TOGGLE_AT
: out_len
= rule_op_mangle_toggle_at (p0
, p1
, buf0
, buf1
, out_len
); break;
2624 case RULE_OP_MANGLE_REVERSE
: out_len
= rule_op_mangle_reverse (p0
, p1
, buf0
, buf1
, out_len
); break;
2625 case RULE_OP_MANGLE_DUPEWORD
: out_len
= rule_op_mangle_dupeword (p0
, p1
, buf0
, buf1
, out_len
); break;
2626 case RULE_OP_MANGLE_DUPEWORD_TIMES
: out_len
= rule_op_mangle_dupeword_times (p0
, p1
, buf0
, buf1
, out_len
); break;
2627 case RULE_OP_MANGLE_REFLECT
: out_len
= rule_op_mangle_reflect (p0
, p1
, buf0
, buf1
, out_len
); break;
2628 case RULE_OP_MANGLE_APPEND
: out_len
= rule_op_mangle_append (p0
, p1
, buf0
, buf1
, out_len
); break;
2629 case RULE_OP_MANGLE_PREPEND
: out_len
= rule_op_mangle_prepend (p0
, p1
, buf0
, buf1
, out_len
); break;
2630 case RULE_OP_MANGLE_ROTATE_LEFT
: out_len
= rule_op_mangle_rotate_left (p0
, p1
, buf0
, buf1
, out_len
); break;
2631 case RULE_OP_MANGLE_ROTATE_RIGHT
: out_len
= rule_op_mangle_rotate_right (p0
, p1
, buf0
, buf1
, out_len
); break;
2632 case RULE_OP_MANGLE_DELETE_FIRST
: out_len
= rule_op_mangle_delete_first (p0
, p1
, buf0
, buf1
, out_len
); break;
2633 case RULE_OP_MANGLE_DELETE_LAST
: out_len
= rule_op_mangle_delete_last (p0
, p1
, buf0
, buf1
, out_len
); break;
2634 case RULE_OP_MANGLE_DELETE_AT
: out_len
= rule_op_mangle_delete_at (p0
, p1
, buf0
, buf1
, out_len
); break;
2635 case RULE_OP_MANGLE_EXTRACT
: out_len
= rule_op_mangle_extract (p0
, p1
, buf0
, buf1
, out_len
); break;
2636 case RULE_OP_MANGLE_OMIT
: out_len
= rule_op_mangle_omit (p0
, p1
, buf0
, buf1
, out_len
); break;
2637 case RULE_OP_MANGLE_INSERT
: out_len
= rule_op_mangle_insert (p0
, p1
, buf0
, buf1
, out_len
); break;
2638 case RULE_OP_MANGLE_OVERSTRIKE
: out_len
= rule_op_mangle_overstrike (p0
, p1
, buf0
, buf1
, out_len
); break;
2639 case RULE_OP_MANGLE_TRUNCATE_AT
: out_len
= rule_op_mangle_truncate_at (p0
, p1
, buf0
, buf1
, out_len
); break;
2640 case RULE_OP_MANGLE_REPLACE
: out_len
= rule_op_mangle_replace (p0
, p1
, buf0
, buf1
, out_len
); break;
2641 //case RULE_OP_MANGLE_PURGECHAR: out_len = rule_op_mangle_purgechar (p0, p1, buf0, buf1, out_len); break;
2642 //case RULE_OP_MANGLE_TOGGLECASE_REC: out_len = rule_op_mangle_togglecase_rec (p0, p1, buf0, buf1, out_len); break;
2643 case RULE_OP_MANGLE_DUPECHAR_FIRST
: out_len
= rule_op_mangle_dupechar_first (p0
, p1
, buf0
, buf1
, out_len
); break;
2644 case RULE_OP_MANGLE_DUPECHAR_LAST
: out_len
= rule_op_mangle_dupechar_last (p0
, p1
, buf0
, buf1
, out_len
); break;
2645 case RULE_OP_MANGLE_DUPECHAR_ALL
: out_len
= rule_op_mangle_dupechar_all (p0
, p1
, buf0
, buf1
, out_len
); break;
2646 case RULE_OP_MANGLE_SWITCH_FIRST
: out_len
= rule_op_mangle_switch_first (p0
, p1
, buf0
, buf1
, out_len
); break;
2647 case RULE_OP_MANGLE_SWITCH_LAST
: out_len
= rule_op_mangle_switch_last (p0
, p1
, buf0
, buf1
, out_len
); break;
2648 case RULE_OP_MANGLE_SWITCH_AT
: out_len
= rule_op_mangle_switch_at (p0
, p1
, buf0
, buf1
, out_len
); break;
2649 case RULE_OP_MANGLE_CHR_SHIFTL
: out_len
= rule_op_mangle_chr_shiftl (p0
, p1
, buf0
, buf1
, out_len
); break;
2650 case RULE_OP_MANGLE_CHR_SHIFTR
: out_len
= rule_op_mangle_chr_shiftr (p0
, p1
, buf0
, buf1
, out_len
); break;
2651 case RULE_OP_MANGLE_CHR_INCR
: out_len
= rule_op_mangle_chr_incr (p0
, p1
, buf0
, buf1
, out_len
); break;
2652 case RULE_OP_MANGLE_CHR_DECR
: out_len
= rule_op_mangle_chr_decr (p0
, p1
, buf0
, buf1
, out_len
); break;
2653 case RULE_OP_MANGLE_REPLACE_NP1
: out_len
= rule_op_mangle_replace_np1 (p0
, p1
, buf0
, buf1
, out_len
); break;
2654 case RULE_OP_MANGLE_REPLACE_NM1
: out_len
= rule_op_mangle_replace_nm1 (p0
, p1
, buf0
, buf1
, out_len
); break;
2655 case RULE_OP_MANGLE_DUPEBLOCK_FIRST
: out_len
= rule_op_mangle_dupeblock_first (p0
, p1
, buf0
, buf1
, out_len
); break;
2656 case RULE_OP_MANGLE_DUPEBLOCK_LAST
: out_len
= rule_op_mangle_dupeblock_last (p0
, p1
, buf0
, buf1
, out_len
); break;
2657 case RULE_OP_MANGLE_TITLE
: out_len
= rule_op_mangle_title (p0
, p1
, buf0
, buf1
, out_len
); break;
2663 u32
apply_rules (u32
*cmds
, u32 buf0
[4], u32 buf1
[4], const u32 len
)
2667 for (u32 i
= 0; cmds
[i
] != 0; i
++)
2669 const u32 cmd
= cmds
[i
];
2671 const u32 name
= (cmd
>> 0) & 0xff;
2672 const u32 p0
= (cmd
>> 8) & 0xff;
2673 const u32 p1
= (cmd
>> 16) & 0xff;
2675 out_len
= apply_rule (name
, p0
, p1
, buf0
, buf1
, out_len
);