22
33abstract class BENES
44{
5+ private static final long [] TRANSPOSE_MASKS = { 0x5555555555555555L , 0x3333333333333333L ,
6+ 0x0F0F0F0F0F0F0F0FL , 0x00FF00FF00FF00FFL , 0x0000FFFF0000FFFFL , 0x00000000FFFFFFFFL };
7+
58 protected final int SYS_N ;
69 protected final int SYS_T ;
710 protected final int GFBITS ;
@@ -17,77 +20,70 @@ public BENES(int n, int t, int m)
1720 /* output: out, transpose of in */
1821 static void transpose_64x64 (long [] out , long [] in )
1922 {
20- int i , j , s , d ;
21-
22- long x , y ;
23- long [][] masks = {
24- {0x5555555555555555L , 0xAAAAAAAAAAAAAAAAL },
25- {0x3333333333333333L , 0xCCCCCCCCCCCCCCCCL },
26- {0x0F0F0F0F0F0F0F0FL , 0xF0F0F0F0F0F0F0F0L },
27- {0x00FF00FF00FF00FFL , 0xFF00FF00FF00FF00L },
28- {0x0000FFFF0000FFFFL , 0xFFFF0000FFFF0000L },
29- {0x00000000FFFFFFFFL , 0xFFFFFFFF00000000L }
30- };
23+ transpose_64x64 (out , in , 0 );
24+ }
3125
32- for (i = 0 ; i < 64 ; i ++)
33- out [i ] = in [i ];
26+ static void transpose_64x64 (long [] out , long [] in , int offset )
27+ {
28+ System .arraycopy (in , offset , out , offset , 64 );
3429
35- for (d = 5 ; d >= 0 ; d --)
30+ int d = 5 ;
31+ do
3632 {
37- s = 1 << d ;
38- for (i = 0 ; i < 64 ; i += s *2 )
33+ long m = TRANSPOSE_MASKS [d ];
34+ int s = 1 << d ;
35+ for (int i = offset ; i < offset + 64 ; i += s * 2 )
3936 {
40- for (j = i ; j < i + s ; j ++ )
37+ for (int j = i ; j < i + s ; j += 4 )
4138 {
42- x = (out [j ] & masks [d ][0 ]) | ((out [j +s ] & masks [d ][0 ]) << s );
43- y = ((out [j ] & masks [d ][1 ]) >>> s ) | (out [j +s ] & masks [d ][1 ]);
44-
45- out [j +0 ] = x ;
46- out [j +s ] = y ;
39+ // Bits.bitPermuteStep2(ref out[j + s + 0], ref out[j + 0], m, s);
40+ // Bits.bitPermuteStep2(ref out[j + s + 1], ref out[j + 1], m, s);
41+ // Bits.bitPermuteStep2(ref out[j + s + 2], ref out[j + 2], m, s);
42+ // Bits.bitPermuteStep2(ref out[j + s + 3], ref out[j + 3], m, s);
43+ long lo0 = out [j + 0 ];
44+ long lo1 = out [j + 1 ];
45+ long lo2 = out [j + 2 ];
46+ long lo3 = out [j + 3 ];
47+ long hi0 = out [j + s + 0 ];
48+ long hi1 = out [j + s + 1 ];
49+ long hi2 = out [j + s + 2 ];
50+ long hi3 = out [j + s + 3 ];
51+ long t0 = ((lo0 >>> s ) ^ hi0 ) & m ;
52+ long t1 = ((lo1 >>> s ) ^ hi1 ) & m ;
53+ long t2 = ((lo2 >>> s ) ^ hi2 ) & m ;
54+ long t3 = ((lo3 >>> s ) ^ hi3 ) & m ;
55+ out [j + 0 ] = lo0 ^ t0 << s ;
56+ out [j + 1 ] = lo1 ^ t1 << s ;
57+ out [j + 2 ] = lo2 ^ t2 << s ;
58+ out [j + 3 ] = lo3 ^ t3 << s ;
59+ out [j + s + 0 ] = hi0 ^ t0 ;
60+ out [j + s + 1 ] = hi1 ^ t1 ;
61+ out [j + s + 2 ] = hi2 ^ t2 ;
62+ out [j + s + 3 ] = hi3 ^ t3 ;
4763 }
4864 }
4965 }
66+ while (--d >= 2 );
5067
51- }
52-
53- static void transpose_64x64 (long [] out , long [] in , int offset )
54- {
55- int i , j , s , d ;
56-
57- long x , y ;
58- long [][] masks = {
59- {0x5555555555555555L , 0xAAAAAAAAAAAAAAAAL },
60- {0x3333333333333333L , 0xCCCCCCCCCCCCCCCCL },
61- {0x0F0F0F0F0F0F0F0FL , 0xF0F0F0F0F0F0F0F0L },
62- {0x00FF00FF00FF00FFL , 0xFF00FF00FF00FF00L },
63- {0x0000FFFF0000FFFFL , 0xFFFF0000FFFF0000L },
64- {0x00000000FFFFFFFFL , 0xFFFFFFFF00000000L }
65- };
66-
67- for (i = 0 ; i < 64 ; i ++)
68- out [i + offset ] = in [i + offset ];
69-
70- for (d = 5 ; d >= 0 ; d --)
68+ do
7169 {
72- s = 1 << d ;
73- for (i = 0 ; i < 64 ; i += s *2 )
70+ long m = TRANSPOSE_MASKS [d ];
71+ int s = 1 << d ;
72+ for (int i = offset ; i < offset + 64 ; i += s * 2 )
7473 {
75- for (j = i ; j < i + s ; j ++ )
74+ for (int j = i ; j < i + s ; ++ j )
7675 {
77- x = (out [j +offset ] & masks [d ][0 ]) | ((out [j +s + offset ] & masks [d ][0 ]) << s );
78- y = ((out [j +offset ] & masks [d ][1 ]) >>> s ) | (out [j +s + offset ] & masks [d ][1 ]);
79-
80- out [j +0 + offset ] = x ;
81- out [j +s + offset ] = y ;
76+ // Bits.bitPermuteStep2(ref out[j + s], ref out[j], m, s);
77+ long lo = out [j + 0 ];
78+ long hi = out [j + s ];
79+ long t = ((lo >>> s ) ^ hi ) & m ;
80+ out [j + 0 ] = lo ^ t << s ;
81+ out [j + s ] = hi ^ t ;
8282 }
8383 }
8484 }
85-
85+ while (-- d >= 0 );
8686 }
8787
88-
8988 abstract protected void support_gen (short [] s , byte [] c );
90-
91-
92-
9389}
0 commit comments