49 #include <m4ri/m4ri.h>
50 #include <m4rie/gf2e.h>
51 #include <m4rie/m4ri_functions.h>
114 mzd_concat(C->
x, A->
x, B->
x);
138 mzd_stack(C->
x, A->
x, B->
x);
161 mzd_submatrix(S->
x, M->
x, lowr, lowc*M->
w, highr, highc*M->
w);
191 B->
nrows = highr - lowr;
192 B->
ncols = highc - lowc;
193 B->
x = mzd_init_window(A->
x, lowr, B->
w*lowc, highr, B->
w*highc);
206 mzd_free_window(A->
x);
247 #define mzed_sub mzed_add
259 #define _mzed_sub _mzed_add
425 return __mzd_read_bits(A->
x, row, A->
w*col, A->
w);
440 __mzd_xor_bits(A->
x, row, A->
w*col, A->
w, elem);
455 __mzd_clear_bits(A->
x, row, A->
w*col, A->
w);
456 __mzd_xor_bits(A->
x, row, A->
w*col, A->
w, elem);
473 return mzd_cmp(A->
x,B->
x);
485 return mzd_is_zero(A->
x);
517 assert(A->
x->offset == B->
x->offset);
518 assert(start_col < A->ncols);
520 const rci_t start = A->
x->offset + A->
w*start_col;
521 const wi_t startblock = start/m4ri_radix;
522 const word bitmask_begin = __M4RI_RIGHT_BITMASK(m4ri_radix - (start%m4ri_radix));
523 const word bitmask_end = __M4RI_LEFT_BITMASK((A->
x->offset + A->
x->ncols) % m4ri_radix);
525 word *_a = A->
x->rows[ar];
526 const word *_b = B->
x->rows[br];
529 if (A->
x->width - startblock > 1) {
530 _a[startblock] ^= _b[startblock] & bitmask_begin;
531 for(j=startblock+1; j<A->
x->width-1; j++)
533 _a[j] ^= _b[j] & bitmask_end;
535 _a[startblock] ^= _b[startblock] & (bitmask_begin & bitmask_end);
551 assert(start_col < A->ncols);
553 const rci_t start = A->
x->offset + A->
w*start_col;
554 const wi_t startblock = start/m4ri_radix;
555 word *_a = A->
x->rows[r];
556 const word bitmask_begin = __M4RI_RIGHT_BITMASK(m4ri_radix - (start%m4ri_radix));
557 const word bitmask_end = __M4RI_LEFT_BITMASK((A->
x->offset + A->
x->ncols) % m4ri_radix);
558 register word __a = _a[startblock]>>(start%m4ri_radix);
559 register word __t = 0;
563 switch( (start/2) % 32 ) {
564 case 0: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<0; __a >>= 2;
565 case 1: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<2; __a >>= 2;
566 case 2: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<4; __a >>= 2;
567 case 3: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<6; __a >>= 2;
568 case 4: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<8; __a >>= 2;
569 case 5: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<10; __a >>= 2;
570 case 6: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<12; __a >>= 2;
571 case 7: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<14; __a >>= 2;
572 case 8: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<16; __a >>= 2;
573 case 9: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<18; __a >>= 2;
574 case 10: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<20; __a >>= 2;
575 case 11: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<22; __a >>= 2;
576 case 12: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<24; __a >>= 2;
577 case 13: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<26; __a >>= 2;
578 case 14: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<28; __a >>= 2;
579 case 15: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<30; __a >>= 2;
580 case 16: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<32; __a >>= 2;
581 case 17: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<34; __a >>= 2;
582 case 18: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<36; __a >>= 2;
583 case 19: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<38; __a >>= 2;
584 case 20: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<40; __a >>= 2;
585 case 21: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<42; __a >>= 2;
586 case 22: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<44; __a >>= 2;
587 case 23: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<46; __a >>= 2;
588 case 24: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<48; __a >>= 2;
589 case 25: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<50; __a >>= 2;
590 case 26: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<52; __a >>= 2;
591 case 27: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<54; __a >>= 2;
592 case 28: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<56; __a >>= 2;
593 case 29: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<58; __a >>= 2;
594 case 30: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<60; __a >>= 2;
595 case 31: __t ^= (X[((__a)& 0x0000000000000003ULL)])<<62;
break;
596 default: m4ri_die(
"impossible");
598 if(A->
x->width-startblock == 1) {
599 _a[startblock] &= ~(bitmask_begin & bitmask_end);
600 _a[startblock] ^= __t & bitmask_begin & bitmask_end;
603 _a[startblock] &= ~bitmask_begin;
604 _a[startblock] ^= __t & bitmask_begin;
607 for(j=startblock+1; j<A->
x->width -1; j++) {
608 __a = _a[j], __t = 0;
609 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<0; __a >>= 2;
610 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<2; __a >>= 2;
611 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<4; __a >>= 2;
612 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<6; __a >>= 2;
613 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<8; __a >>= 2;
614 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<10; __a >>= 2;
615 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<12; __a >>= 2;
616 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<14; __a >>= 2;
617 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<16; __a >>= 2;
618 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<18; __a >>= 2;
619 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<20; __a >>= 2;
620 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<22; __a >>= 2;
621 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<24; __a >>= 2;
622 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<26; __a >>= 2;
623 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<28; __a >>= 2;
624 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<30; __a >>= 2;
625 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<32; __a >>= 2;
626 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<34; __a >>= 2;
627 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<36; __a >>= 2;
628 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<38; __a >>= 2;
629 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<40; __a >>= 2;
630 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<42; __a >>= 2;
631 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<44; __a >>= 2;
632 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<46; __a >>= 2;
633 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<48; __a >>= 2;
634 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<50; __a >>= 2;
635 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<52; __a >>= 2;
636 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<54; __a >>= 2;
637 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<56; __a >>= 2;
638 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<58; __a >>= 2;
639 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<60; __a >>= 2;
640 __t ^= (X[((__a)& 0x0000000000000003ULL)])<<62;
644 __t = _a[j] & ~bitmask_end;
645 switch((A->
x->offset+A->
x->ncols) % m4ri_radix) {
646 case 0: __t ^= ((word)X[(
int)((_a[j] & 0xC000000000000000ULL)>>62)])<<62;
647 case 62: __t ^= ((word)X[(
int)((_a[j] & 0x3000000000000000ULL)>>60)])<<60;
648 case 60: __t ^= ((word)X[(
int)((_a[j] & 0x0C00000000000000ULL)>>58)])<<58;
649 case 58: __t ^= ((word)X[(
int)((_a[j] & 0x0300000000000000ULL)>>56)])<<56;
650 case 56: __t ^= ((word)X[(
int)((_a[j] & 0x00C0000000000000ULL)>>54)])<<54;
651 case 54: __t ^= ((word)X[(
int)((_a[j] & 0x0030000000000000ULL)>>52)])<<52;
652 case 52: __t ^= ((word)X[(
int)((_a[j] & 0x000C000000000000ULL)>>50)])<<50;
653 case 50: __t ^= ((word)X[(
int)((_a[j] & 0x0003000000000000ULL)>>48)])<<48;
654 case 48: __t ^= ((word)X[(
int)((_a[j] & 0x0000C00000000000ULL)>>46)])<<46;
655 case 46: __t ^= ((word)X[(
int)((_a[j] & 0x0000300000000000ULL)>>44)])<<44;
656 case 44: __t ^= ((word)X[(
int)((_a[j] & 0x00000C0000000000ULL)>>42)])<<42;
657 case 42: __t ^= ((word)X[(
int)((_a[j] & 0x0000030000000000ULL)>>40)])<<40;
658 case 40: __t ^= ((word)X[(
int)((_a[j] & 0x000000C000000000ULL)>>38)])<<38;
659 case 38: __t ^= ((word)X[(
int)((_a[j] & 0x0000003000000000ULL)>>36)])<<36;
660 case 36: __t ^= ((word)X[(
int)((_a[j] & 0x0000000C00000000ULL)>>34)])<<34;
661 case 34: __t ^= ((word)X[(
int)((_a[j] & 0x0000000300000000ULL)>>32)])<<32;
662 case 32: __t ^= ((word)X[(
int)((_a[j] & 0x00000000C0000000ULL)>>30)])<<30;
663 case 30: __t ^= ((word)X[(
int)((_a[j] & 0x0000000030000000ULL)>>28)])<<28;
664 case 28: __t ^= ((word)X[(
int)((_a[j] & 0x000000000C000000ULL)>>26)])<<26;
665 case 26: __t ^= ((word)X[(
int)((_a[j] & 0x0000000003000000ULL)>>24)])<<24;
666 case 24: __t ^= ((word)X[(
int)((_a[j] & 0x0000000000C00000ULL)>>22)])<<22;
667 case 22: __t ^= ((word)X[(
int)((_a[j] & 0x0000000000300000ULL)>>20)])<<20;
668 case 20: __t ^= ((word)X[(
int)((_a[j] & 0x00000000000C0000ULL)>>18)])<<18;
669 case 18: __t ^= ((word)X[(
int)((_a[j] & 0x0000000000030000ULL)>>16)])<<16;
670 case 16: __t ^= ((word)X[(
int)((_a[j] & 0x000000000000C000ULL)>>14)])<<14;
671 case 14: __t ^= ((word)X[(
int)((_a[j] & 0x0000000000003000ULL)>>12)])<<12;
672 case 12: __t ^= ((word)X[(
int)((_a[j] & 0x0000000000000C00ULL)>>10)])<<10;
673 case 10: __t ^= ((word)X[(
int)((_a[j] & 0x0000000000000300ULL)>> 8)])<< 8;
674 case 8: __t ^= ((word)X[(
int)((_a[j] & 0x00000000000000C0ULL)>> 6)])<< 6;
675 case 6: __t ^= ((word)X[(
int)((_a[j] & 0x0000000000000030ULL)>> 4)])<< 4;
676 case 4: __t ^= ((word)X[(
int)((_a[j] & 0x000000000000000CULL)>> 2)])<< 2;
677 case 2: __t ^= ((word)X[(
int)((_a[j] & 0x0000000000000003ULL)>> 0)])<< 0;
681 }
else if(A->
w == 4) {
682 switch( (start/4)%16 ) {
683 case 0: __t ^= (X[((__a)& 0x000000000000000FULL)])<<0; __a >>= 4;
684 case 1: __t ^= (X[((__a)& 0x000000000000000FULL)])<<4; __a >>= 4;
685 case 2: __t ^= (X[((__a)& 0x000000000000000FULL)])<<8; __a >>= 4;
686 case 3: __t ^= (X[((__a)& 0x000000000000000FULL)])<<12; __a >>= 4;
687 case 4: __t ^= (X[((__a)& 0x000000000000000FULL)])<<16; __a >>= 4;
688 case 5: __t ^= (X[((__a)& 0x000000000000000FULL)])<<20; __a >>= 4;
689 case 6: __t ^= (X[((__a)& 0x000000000000000FULL)])<<24; __a >>= 4;
690 case 7: __t ^= (X[((__a)& 0x000000000000000FULL)])<<28; __a >>= 4;
691 case 8: __t ^= (X[((__a)& 0x000000000000000FULL)])<<32; __a >>= 4;
692 case 9: __t ^= (X[((__a)& 0x000000000000000FULL)])<<36; __a >>= 4;
693 case 10: __t ^= (X[((__a)& 0x000000000000000FULL)])<<40; __a >>= 4;
694 case 11: __t ^= (X[((__a)& 0x000000000000000FULL)])<<44; __a >>= 4;
695 case 12: __t ^= (X[((__a)& 0x000000000000000FULL)])<<48; __a >>= 4;
696 case 13: __t ^= (X[((__a)& 0x000000000000000FULL)])<<52; __a >>= 4;
697 case 14: __t ^= (X[((__a)& 0x000000000000000FULL)])<<56; __a >>= 4;
698 case 15: __t ^= (X[((__a)& 0x000000000000000FULL)])<<60;
break;
699 default: m4ri_die(
"impossible");
701 if(A->
x->width-startblock == 1) {
702 _a[startblock] &= ~(bitmask_begin & bitmask_end);
703 _a[startblock] ^= __t & bitmask_begin & bitmask_end;
706 _a[startblock] &= ~bitmask_begin;
707 _a[startblock] ^= __t & bitmask_begin;
710 for(j=startblock+1; j<A->
x->width -1; j++) {
711 __a = _a[j], __t = 0;
712 __t ^= (X[((__a)& 0x000000000000000FULL)])<<0; __a >>= 4;
713 __t ^= (X[((__a)& 0x000000000000000FULL)])<<4; __a >>= 4;
714 __t ^= (X[((__a)& 0x000000000000000FULL)])<<8; __a >>= 4;
715 __t ^= (X[((__a)& 0x000000000000000FULL)])<<12; __a >>= 4;
716 __t ^= (X[((__a)& 0x000000000000000FULL)])<<16; __a >>= 4;
717 __t ^= (X[((__a)& 0x000000000000000FULL)])<<20; __a >>= 4;
718 __t ^= (X[((__a)& 0x000000000000000FULL)])<<24; __a >>= 4;
719 __t ^= (X[((__a)& 0x000000000000000FULL)])<<28; __a >>= 4;
720 __t ^= (X[((__a)& 0x000000000000000FULL)])<<32; __a >>= 4;
721 __t ^= (X[((__a)& 0x000000000000000FULL)])<<36; __a >>= 4;
722 __t ^= (X[((__a)& 0x000000000000000FULL)])<<40; __a >>= 4;
723 __t ^= (X[((__a)& 0x000000000000000FULL)])<<44; __a >>= 4;
724 __t ^= (X[((__a)& 0x000000000000000FULL)])<<48; __a >>= 4;
725 __t ^= (X[((__a)& 0x000000000000000FULL)])<<52; __a >>= 4;
726 __t ^= (X[((__a)& 0x000000000000000FULL)])<<56; __a >>= 4;
727 __t ^= (X[((__a)& 0x000000000000000FULL)])<<60;
731 __t = _a[j] & ~bitmask_end;
732 switch( (A->
x->offset + A->
x->ncols) % m4ri_radix) {
733 case 0: __t ^= ((word)X[(
int)((_a[j] & 0xF000000000000000ULL)>>60)])<<60;
734 case 60: __t ^= ((word)X[(
int)((_a[j] & 0x0F00000000000000ULL)>>56)])<<56;
735 case 56: __t ^= ((word)X[(
int)((_a[j] & 0x00F0000000000000ULL)>>52)])<<52;
736 case 52: __t ^= ((word)X[(
int)((_a[j] & 0x000F000000000000ULL)>>48)])<<48;
737 case 48: __t ^= ((word)X[(
int)((_a[j] & 0x0000F00000000000ULL)>>44)])<<44;
738 case 44: __t ^= ((word)X[(
int)((_a[j] & 0x00000F0000000000ULL)>>40)])<<40;
739 case 40: __t ^= ((word)X[(
int)((_a[j] & 0x000000F000000000ULL)>>36)])<<36;
740 case 36: __t ^= ((word)X[(
int)((_a[j] & 0x0000000F00000000ULL)>>32)])<<32;
741 case 32: __t ^= ((word)X[(
int)((_a[j] & 0x00000000F0000000ULL)>>28)])<<28;
742 case 28: __t ^= ((word)X[(
int)((_a[j] & 0x000000000F000000ULL)>>24)])<<24;
743 case 24: __t ^= ((word)X[(
int)((_a[j] & 0x0000000000F00000ULL)>>20)])<<20;
744 case 20: __t ^= ((word)X[(
int)((_a[j] & 0x00000000000F0000ULL)>>16)])<<16;
745 case 16: __t ^= ((word)X[(
int)((_a[j] & 0x000000000000F000ULL)>>12)])<<12;
746 case 12: __t ^= ((word)X[(
int)((_a[j] & 0x0000000000000F00ULL)>> 8)])<< 8;
747 case 8: __t ^= ((word)X[(
int)((_a[j] & 0x00000000000000F0ULL)>> 4)])<< 4;
748 case 4: __t ^= ((word)X[(
int)((_a[j] & 0x000000000000000FULL)>> 0)])<< 0;
752 }
else if (A->
w == 8) {
754 register word __a0 = _a[startblock]>>(start%m4ri_radix);
756 register word __t0 = 0;
759 switch( (start/8) %8 ) {
760 case 0: __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<0; __a0 >>= 8;
761 case 1: __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<8; __a0 >>= 8;
762 case 2: __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<16; __a0 >>= 8;
763 case 3: __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<24; __a0 >>= 8;
764 case 4: __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<32; __a0 >>= 8;
765 case 5: __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<40; __a0 >>= 8;
766 case 6: __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<48; __a0 >>= 8;
767 case 7: __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<56;
break;
768 default: m4ri_die(
"impossible");
770 if(A->
x->width-startblock == 1) {
771 _a[startblock] &= ~(bitmask_begin & bitmask_end);
772 _a[startblock] ^= __t0 & bitmask_begin & bitmask_end;
775 _a[startblock] &= ~bitmask_begin;
776 _a[startblock] ^= __t0 & bitmask_begin;
779 for(j=startblock+1; j+2 < A->
x->width; j+=2) {
780 __a0 = _a[j], __t0 = 0;
781 __a1 = _a[j+1], __t1 = 0;
782 __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<0; __a0 >>= 8;
783 __t1 ^= (X[((__a1)& 0x00000000000000FFULL)])<<0; __a1 >>= 8;
784 __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<8; __a0 >>= 8;
785 __t1 ^= (X[((__a1)& 0x00000000000000FFULL)])<<8; __a1 >>= 8;
786 __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<16; __a0 >>= 8;
787 __t1 ^= (X[((__a1)& 0x00000000000000FFULL)])<<16; __a1 >>= 8;
788 __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<24; __a0 >>= 8;
789 __t1 ^= (X[((__a1)& 0x00000000000000FFULL)])<<24; __a1 >>= 8;
790 __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<32; __a0 >>= 8;
791 __t1 ^= (X[((__a1)& 0x00000000000000FFULL)])<<32; __a1 >>= 8;
792 __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<40; __a0 >>= 8;
793 __t1 ^= (X[((__a1)& 0x00000000000000FFULL)])<<40; __a1 >>= 8;
794 __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<48; __a0 >>= 8;
795 __t1 ^= (X[((__a1)& 0x00000000000000FFULL)])<<48; __a1 >>= 8;
796 __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<56; __a0 >>= 8;
797 __t1 ^= (X[((__a1)& 0x00000000000000FFULL)])<<56;
802 for(; j < A->
x->width-1; j++) {
803 __a0 = _a[j], __t0 = 0;
804 __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<0; __a0 >>= 8;
805 __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<8; __a0 >>= 8;
806 __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<16; __a0 >>= 8;
807 __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<24; __a0 >>= 8;
808 __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<32; __a0 >>= 8;
809 __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<40; __a0 >>= 8;
810 __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<48; __a0 >>= 8;
811 __t0 ^= (X[((__a0)& 0x00000000000000FFULL)])<<56;
815 __t = _a[j] & ~bitmask_end;
816 switch( (A->
x->offset + A->
x->ncols) % m4ri_radix ) {
817 case 0: __t ^= ((word)X[(
int)((_a[j] & 0xFF00000000000000ULL)>>56)])<<56;
818 case 56: __t ^= ((word)X[(
int)((_a[j] & 0x00FF000000000000ULL)>>48)])<<48;
819 case 48: __t ^= ((word)X[(
int)((_a[j] & 0x0000FF0000000000ULL)>>40)])<<40;
820 case 40: __t ^= ((word)X[(
int)((_a[j] & 0x000000FF00000000ULL)>>32)])<<32;
821 case 32: __t ^= ((word)X[(
int)((_a[j] & 0x00000000FF000000ULL)>>24)])<<24;
822 case 24: __t ^= ((word)X[(
int)((_a[j] & 0x0000000000FF0000ULL)>>16)])<<16;
823 case 16: __t ^= ((word)X[(
int)((_a[j] & 0x000000000000FF00ULL)>> 8)])<< 8;
824 case 8: __t ^= ((word)X[(
int)((_a[j] & 0x00000000000000FFULL)>> 0)])<< 0;
828 }
else if (A->
w == 16) {
829 switch( (start/16) %4 ) {
830 case 0: __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<0; __a >>= 16;
831 case 1: __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<16; __a >>= 16;
832 case 2: __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<32; __a >>= 16;
833 case 3: __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<48;
break;
834 default: m4ri_die(
"impossible");
836 if(A->
x->width-startblock == 1) {
837 _a[startblock] &= ~(bitmask_begin & bitmask_end);
838 _a[startblock] ^= __t & bitmask_begin & bitmask_end;
841 _a[startblock] &= ~bitmask_begin;
842 _a[startblock] ^= __t & bitmask_begin;
845 for(j=startblock+1; j+4<A->
x->width; j+=4) {
846 __a = _a[j], __t = 0;
847 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<0; __a >>= 16;
848 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<16; __a >>= 16;
849 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<32; __a >>= 16;
850 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<48;
853 __a = _a[j+1], __t = 0;
854 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<0; __a >>= 16;
855 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<16; __a >>= 16;
856 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<32; __a >>= 16;
857 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<48;
861 __a = _a[j+2], __t = 0;
862 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<0; __a >>= 16;
863 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<16; __a >>= 16;
864 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<32; __a >>= 16;
865 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<48;
868 __a = _a[j+3], __t = 0;
869 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<0; __a >>= 16;
870 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<16; __a >>= 16;
871 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<32; __a >>= 16;
872 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<48;
875 for( ; j<A->
x->width-1; j++) {
876 __a = _a[j], __t = 0;
877 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<0; __a >>= 16;
878 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<16; __a >>= 16;
879 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<32; __a >>= 16;
880 __t ^= (X[((__a)& 0x000000000000FFFFULL)])<<48;
884 __t = _a[j] & ~bitmask_end;
885 switch( (A->
x->offset + A->
x->ncols) % m4ri_radix) {
886 case 0: __t ^= ((word)X[(
int)((_a[j] & 0xFFFF000000000000ULL)>>48)])<<48;
887 case 48: __t ^= ((word)X[(
int)((_a[j] & 0x0000FFFF00000000ULL)>>32)])<<32;
888 case 32: __t ^= ((word)X[(
int)((_a[j] & 0x00000000FFFF0000ULL)>>16)])<<16;
889 case 16: __t ^= ((word)X[(
int)((_a[j] & 0x000000000000FFFFULL)>> 0)])<< 0;
894 for(rci_t j=start_col; j<A->
ncols; j++) {
911 mzd_row_swap(M->
x, rowa, rowb);
929 mzd_copy_row(B->
x, i, A->
x, j);
943 for(rci_t i=0; i<M->
w; i++)
944 mzd_col_swap(M->
x,M->
w*cola+i, M->
w*colb+i);
961 mzd_col_swap_in_rows(A->
x, A->
w*cola+e, A->
w*colb+e, start_row, stop_row);
979 mzd_row_add(M->
x, sourcerow, destrow);
993 return mzd_first_zero_row(A->
x);
1008 mzd_row_clear_offset(M->
x, row, coloffset*M->
w);
1036 #endif //M4RIE_MATRIX_H