2
2
3
3
abstract class BENES
4
4
{
5
+ private static final long [] TRANSPOSE_MASKS = { 0x5555555555555555L , 0x3333333333333333L ,
6
+ 0x0F0F0F0F0F0F0F0FL , 0x00FF00FF00FF00FFL , 0x0000FFFF0000FFFFL , 0x00000000FFFFFFFFL };
7
+
5
8
protected final int SYS_N ;
6
9
protected final int SYS_T ;
7
10
protected final int GFBITS ;
@@ -17,77 +20,70 @@ public BENES(int n, int t, int m)
17
20
/* output: out, transpose of in */
18
21
static void transpose_64x64 (long [] out , long [] in )
19
22
{
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
+ }
31
25
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 );
34
29
35
- for (d = 5 ; d >= 0 ; d --)
30
+ int d = 5 ;
31
+ do
36
32
{
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 )
39
36
{
40
- for (j = i ; j < i + s ; j ++ )
37
+ for (int j = i ; j < i + s ; j += 4 )
41
38
{
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 ;
47
63
}
48
64
}
49
65
}
66
+ while (--d >= 2 );
50
67
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
71
69
{
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 )
74
73
{
75
- for (j = i ; j < i + s ; j ++ )
74
+ for (int j = i ; j < i + s ; ++ j )
76
75
{
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 ;
82
82
}
83
83
}
84
84
}
85
-
85
+ while (-- d >= 0 );
86
86
}
87
87
88
-
89
88
abstract protected void support_gen (short [] s , byte [] c );
90
-
91
-
92
-
93
89
}
0 commit comments