8
8
// option. This file may not be copied, modified, or distributed
9
9
// except according to those terms.
10
10
11
- #![ feature( intrinsics) ]
11
+ #![ feature( intrinsics, i128_type ) ]
12
12
13
13
mod rusti {
14
14
extern "rust-intrinsic" {
@@ -18,6 +18,7 @@ mod rusti {
18
18
pub fn cttz < T > ( x : T ) -> T ;
19
19
pub fn cttz_nonzero < T > ( x : T ) -> T ;
20
20
pub fn bswap < T > ( x : T ) -> T ;
21
+ pub fn bitreverse < T > ( x : T ) -> T ;
21
22
}
22
23
}
23
24
@@ -29,106 +30,127 @@ pub fn main() {
29
30
assert_eq ! ( ctpop( 0u16 ) , 0 ) ; assert_eq ! ( ctpop( 0i16 ) , 0 ) ;
30
31
assert_eq ! ( ctpop( 0u32 ) , 0 ) ; assert_eq ! ( ctpop( 0i32 ) , 0 ) ;
31
32
assert_eq ! ( ctpop( 0u64 ) , 0 ) ; assert_eq ! ( ctpop( 0i64 ) , 0 ) ;
33
+ assert_eq ! ( ctpop( 0u128 ) , 0 ) ; assert_eq ! ( ctpop( 0i128 ) , 0 ) ;
32
34
33
35
assert_eq ! ( ctpop( 1u8 ) , 1 ) ; assert_eq ! ( ctpop( 1i8 ) , 1 ) ;
34
36
assert_eq ! ( ctpop( 1u16 ) , 1 ) ; assert_eq ! ( ctpop( 1i16 ) , 1 ) ;
35
37
assert_eq ! ( ctpop( 1u32 ) , 1 ) ; assert_eq ! ( ctpop( 1i32 ) , 1 ) ;
36
38
assert_eq ! ( ctpop( 1u64 ) , 1 ) ; assert_eq ! ( ctpop( 1i64 ) , 1 ) ;
39
+ assert_eq ! ( ctpop( 1u128 ) , 1 ) ; assert_eq ! ( ctpop( 1i128 ) , 1 ) ;
37
40
38
41
assert_eq ! ( ctpop( 10u8 ) , 2 ) ; assert_eq ! ( ctpop( 10i8 ) , 2 ) ;
39
42
assert_eq ! ( ctpop( 10u16 ) , 2 ) ; assert_eq ! ( ctpop( 10i16 ) , 2 ) ;
40
43
assert_eq ! ( ctpop( 10u32 ) , 2 ) ; assert_eq ! ( ctpop( 10i32 ) , 2 ) ;
41
44
assert_eq ! ( ctpop( 10u64 ) , 2 ) ; assert_eq ! ( ctpop( 10i64 ) , 2 ) ;
45
+ assert_eq ! ( ctpop( 10u128 ) , 2 ) ; assert_eq ! ( ctpop( 10i128 ) , 2 ) ;
42
46
43
47
assert_eq ! ( ctpop( 100u8 ) , 3 ) ; assert_eq ! ( ctpop( 100i8 ) , 3 ) ;
44
48
assert_eq ! ( ctpop( 100u16 ) , 3 ) ; assert_eq ! ( ctpop( 100i16 ) , 3 ) ;
45
49
assert_eq ! ( ctpop( 100u32 ) , 3 ) ; assert_eq ! ( ctpop( 100i32 ) , 3 ) ;
46
50
assert_eq ! ( ctpop( 100u64 ) , 3 ) ; assert_eq ! ( ctpop( 100i64 ) , 3 ) ;
51
+ assert_eq ! ( ctpop( 100u128 ) , 3 ) ; assert_eq ! ( ctpop( 100i128 ) , 3 ) ;
47
52
48
53
assert_eq ! ( ctpop( -1i8 as u8 ) , 8 ) ; assert_eq ! ( ctpop( -1i8 ) , 8 ) ;
49
54
assert_eq ! ( ctpop( -1i16 as u16 ) , 16 ) ; assert_eq ! ( ctpop( -1i16 ) , 16 ) ;
50
55
assert_eq ! ( ctpop( -1i32 as u32 ) , 32 ) ; assert_eq ! ( ctpop( -1i32 ) , 32 ) ;
51
56
assert_eq ! ( ctpop( -1i64 as u64 ) , 64 ) ; assert_eq ! ( ctpop( -1i64 ) , 64 ) ;
57
+ assert_eq ! ( ctpop( -1i128 as u128 ) , 128 ) ; assert_eq ! ( ctpop( -1i128 ) , 128 ) ;
52
58
53
59
assert_eq ! ( ctlz( 0u8 ) , 8 ) ; assert_eq ! ( ctlz( 0i8 ) , 8 ) ;
54
60
assert_eq ! ( ctlz( 0u16 ) , 16 ) ; assert_eq ! ( ctlz( 0i16 ) , 16 ) ;
55
61
assert_eq ! ( ctlz( 0u32 ) , 32 ) ; assert_eq ! ( ctlz( 0i32 ) , 32 ) ;
56
62
assert_eq ! ( ctlz( 0u64 ) , 64 ) ; assert_eq ! ( ctlz( 0i64 ) , 64 ) ;
63
+ assert_eq ! ( ctlz( 0u128 ) , 128 ) ; assert_eq ! ( ctlz( 0i128 ) , 128 ) ;
57
64
58
65
assert_eq ! ( ctlz( 1u8 ) , 7 ) ; assert_eq ! ( ctlz( 1i8 ) , 7 ) ;
59
66
assert_eq ! ( ctlz( 1u16 ) , 15 ) ; assert_eq ! ( ctlz( 1i16 ) , 15 ) ;
60
67
assert_eq ! ( ctlz( 1u32 ) , 31 ) ; assert_eq ! ( ctlz( 1i32 ) , 31 ) ;
61
68
assert_eq ! ( ctlz( 1u64 ) , 63 ) ; assert_eq ! ( ctlz( 1i64 ) , 63 ) ;
69
+ assert_eq ! ( ctlz( 1u128 ) , 127 ) ; assert_eq ! ( ctlz( 1i128 ) , 127 ) ;
62
70
63
71
assert_eq ! ( ctlz( 10u8 ) , 4 ) ; assert_eq ! ( ctlz( 10i8 ) , 4 ) ;
64
72
assert_eq ! ( ctlz( 10u16 ) , 12 ) ; assert_eq ! ( ctlz( 10i16 ) , 12 ) ;
65
73
assert_eq ! ( ctlz( 10u32 ) , 28 ) ; assert_eq ! ( ctlz( 10i32 ) , 28 ) ;
66
74
assert_eq ! ( ctlz( 10u64 ) , 60 ) ; assert_eq ! ( ctlz( 10i64 ) , 60 ) ;
75
+ assert_eq ! ( ctlz( 10u128 ) , 124 ) ; assert_eq ! ( ctlz( 10i128 ) , 124 ) ;
67
76
68
77
assert_eq ! ( ctlz( 100u8 ) , 1 ) ; assert_eq ! ( ctlz( 100i8 ) , 1 ) ;
69
78
assert_eq ! ( ctlz( 100u16 ) , 9 ) ; assert_eq ! ( ctlz( 100i16 ) , 9 ) ;
70
79
assert_eq ! ( ctlz( 100u32 ) , 25 ) ; assert_eq ! ( ctlz( 100i32 ) , 25 ) ;
71
80
assert_eq ! ( ctlz( 100u64 ) , 57 ) ; assert_eq ! ( ctlz( 100i64 ) , 57 ) ;
81
+ assert_eq ! ( ctlz( 100u128 ) , 121 ) ; assert_eq ! ( ctlz( 100i128 ) , 121 ) ;
72
82
73
83
assert_eq ! ( ctlz_nonzero( 1u8 ) , 7 ) ; assert_eq ! ( ctlz_nonzero( 1i8 ) , 7 ) ;
74
84
assert_eq ! ( ctlz_nonzero( 1u16 ) , 15 ) ; assert_eq ! ( ctlz_nonzero( 1i16 ) , 15 ) ;
75
85
assert_eq ! ( ctlz_nonzero( 1u32 ) , 31 ) ; assert_eq ! ( ctlz_nonzero( 1i32 ) , 31 ) ;
76
86
assert_eq ! ( ctlz_nonzero( 1u64 ) , 63 ) ; assert_eq ! ( ctlz_nonzero( 1i64 ) , 63 ) ;
87
+ assert_eq ! ( ctlz_nonzero( 1u128 ) , 127 ) ; assert_eq ! ( ctlz_nonzero( 1i128 ) , 127 ) ;
77
88
78
89
assert_eq ! ( ctlz_nonzero( 10u8 ) , 4 ) ; assert_eq ! ( ctlz_nonzero( 10i8 ) , 4 ) ;
79
90
assert_eq ! ( ctlz_nonzero( 10u16 ) , 12 ) ; assert_eq ! ( ctlz_nonzero( 10i16 ) , 12 ) ;
80
91
assert_eq ! ( ctlz_nonzero( 10u32 ) , 28 ) ; assert_eq ! ( ctlz_nonzero( 10i32 ) , 28 ) ;
81
92
assert_eq ! ( ctlz_nonzero( 10u64 ) , 60 ) ; assert_eq ! ( ctlz_nonzero( 10i64 ) , 60 ) ;
93
+ assert_eq ! ( ctlz_nonzero( 10u128 ) , 124 ) ; assert_eq ! ( ctlz_nonzero( 10i128 ) , 124 ) ;
82
94
83
95
assert_eq ! ( ctlz_nonzero( 100u8 ) , 1 ) ; assert_eq ! ( ctlz_nonzero( 100i8 ) , 1 ) ;
84
96
assert_eq ! ( ctlz_nonzero( 100u16 ) , 9 ) ; assert_eq ! ( ctlz_nonzero( 100i16 ) , 9 ) ;
85
97
assert_eq ! ( ctlz_nonzero( 100u32 ) , 25 ) ; assert_eq ! ( ctlz_nonzero( 100i32 ) , 25 ) ;
86
98
assert_eq ! ( ctlz_nonzero( 100u64 ) , 57 ) ; assert_eq ! ( ctlz_nonzero( 100i64 ) , 57 ) ;
99
+ assert_eq ! ( ctlz_nonzero( 100u128 ) , 121 ) ; assert_eq ! ( ctlz_nonzero( 100i128 ) , 121 ) ;
87
100
88
101
assert_eq ! ( cttz( -1i8 as u8 ) , 0 ) ; assert_eq ! ( cttz( -1i8 ) , 0 ) ;
89
102
assert_eq ! ( cttz( -1i16 as u16 ) , 0 ) ; assert_eq ! ( cttz( -1i16 ) , 0 ) ;
90
103
assert_eq ! ( cttz( -1i32 as u32 ) , 0 ) ; assert_eq ! ( cttz( -1i32 ) , 0 ) ;
91
104
assert_eq ! ( cttz( -1i64 as u64 ) , 0 ) ; assert_eq ! ( cttz( -1i64 ) , 0 ) ;
105
+ assert_eq ! ( cttz( -1i128 as u128 ) , 0 ) ; assert_eq ! ( cttz( -1i128 ) , 0 ) ;
92
106
93
107
assert_eq ! ( cttz( 0u8 ) , 8 ) ; assert_eq ! ( cttz( 0i8 ) , 8 ) ;
94
108
assert_eq ! ( cttz( 0u16 ) , 16 ) ; assert_eq ! ( cttz( 0i16 ) , 16 ) ;
95
109
assert_eq ! ( cttz( 0u32 ) , 32 ) ; assert_eq ! ( cttz( 0i32 ) , 32 ) ;
96
110
assert_eq ! ( cttz( 0u64 ) , 64 ) ; assert_eq ! ( cttz( 0i64 ) , 64 ) ;
111
+ assert_eq ! ( cttz( 0u128 ) , 128 ) ; assert_eq ! ( cttz( 0i128 ) , 128 ) ;
97
112
98
113
assert_eq ! ( cttz( 1u8 ) , 0 ) ; assert_eq ! ( cttz( 1i8 ) , 0 ) ;
99
114
assert_eq ! ( cttz( 1u16 ) , 0 ) ; assert_eq ! ( cttz( 1i16 ) , 0 ) ;
100
115
assert_eq ! ( cttz( 1u32 ) , 0 ) ; assert_eq ! ( cttz( 1i32 ) , 0 ) ;
101
116
assert_eq ! ( cttz( 1u64 ) , 0 ) ; assert_eq ! ( cttz( 1i64 ) , 0 ) ;
117
+ assert_eq ! ( cttz( 1u128 ) , 0 ) ; assert_eq ! ( cttz( 1i128 ) , 0 ) ;
102
118
103
119
assert_eq ! ( cttz( 10u8 ) , 1 ) ; assert_eq ! ( cttz( 10i8 ) , 1 ) ;
104
120
assert_eq ! ( cttz( 10u16 ) , 1 ) ; assert_eq ! ( cttz( 10i16 ) , 1 ) ;
105
121
assert_eq ! ( cttz( 10u32 ) , 1 ) ; assert_eq ! ( cttz( 10i32 ) , 1 ) ;
106
122
assert_eq ! ( cttz( 10u64 ) , 1 ) ; assert_eq ! ( cttz( 10i64 ) , 1 ) ;
123
+ assert_eq ! ( cttz( 10u128 ) , 1 ) ; assert_eq ! ( cttz( 10i128 ) , 1 ) ;
107
124
108
125
assert_eq ! ( cttz( 100u8 ) , 2 ) ; assert_eq ! ( cttz( 100i8 ) , 2 ) ;
109
126
assert_eq ! ( cttz( 100u16 ) , 2 ) ; assert_eq ! ( cttz( 100i16 ) , 2 ) ;
110
127
assert_eq ! ( cttz( 100u32 ) , 2 ) ; assert_eq ! ( cttz( 100i32 ) , 2 ) ;
111
128
assert_eq ! ( cttz( 100u64 ) , 2 ) ; assert_eq ! ( cttz( 100i64 ) , 2 ) ;
129
+ assert_eq ! ( cttz( 100u128 ) , 2 ) ; assert_eq ! ( cttz( 100i128 ) , 2 ) ;
112
130
113
131
assert_eq ! ( cttz_nonzero( -1i8 as u8 ) , 0 ) ; assert_eq ! ( cttz_nonzero( -1i8 ) , 0 ) ;
114
132
assert_eq ! ( cttz_nonzero( -1i16 as u16 ) , 0 ) ; assert_eq ! ( cttz_nonzero( -1i16 ) , 0 ) ;
115
133
assert_eq ! ( cttz_nonzero( -1i32 as u32 ) , 0 ) ; assert_eq ! ( cttz_nonzero( -1i32 ) , 0 ) ;
116
134
assert_eq ! ( cttz_nonzero( -1i64 as u64 ) , 0 ) ; assert_eq ! ( cttz_nonzero( -1i64 ) , 0 ) ;
135
+ assert_eq ! ( cttz_nonzero( -1i128 as u128 ) , 0 ) ; assert_eq ! ( cttz_nonzero( -1i128 ) , 0 ) ;
117
136
118
137
assert_eq ! ( cttz_nonzero( 1u8 ) , 0 ) ; assert_eq ! ( cttz_nonzero( 1i8 ) , 0 ) ;
119
138
assert_eq ! ( cttz_nonzero( 1u16 ) , 0 ) ; assert_eq ! ( cttz_nonzero( 1i16 ) , 0 ) ;
120
139
assert_eq ! ( cttz_nonzero( 1u32 ) , 0 ) ; assert_eq ! ( cttz_nonzero( 1i32 ) , 0 ) ;
121
140
assert_eq ! ( cttz_nonzero( 1u64 ) , 0 ) ; assert_eq ! ( cttz_nonzero( 1i64 ) , 0 ) ;
141
+ assert_eq ! ( cttz_nonzero( 1u128 ) , 0 ) ; assert_eq ! ( cttz_nonzero( 1i128 ) , 0 ) ;
122
142
123
143
assert_eq ! ( cttz_nonzero( 10u8 ) , 1 ) ; assert_eq ! ( cttz_nonzero( 10i8 ) , 1 ) ;
124
144
assert_eq ! ( cttz_nonzero( 10u16 ) , 1 ) ; assert_eq ! ( cttz_nonzero( 10i16 ) , 1 ) ;
125
145
assert_eq ! ( cttz_nonzero( 10u32 ) , 1 ) ; assert_eq ! ( cttz_nonzero( 10i32 ) , 1 ) ;
126
146
assert_eq ! ( cttz_nonzero( 10u64 ) , 1 ) ; assert_eq ! ( cttz_nonzero( 10i64 ) , 1 ) ;
147
+ assert_eq ! ( cttz_nonzero( 10u128 ) , 1 ) ; assert_eq ! ( cttz_nonzero( 10i128 ) , 1 ) ;
127
148
128
149
assert_eq ! ( cttz_nonzero( 100u8 ) , 2 ) ; assert_eq ! ( cttz_nonzero( 100i8 ) , 2 ) ;
129
150
assert_eq ! ( cttz_nonzero( 100u16 ) , 2 ) ; assert_eq ! ( cttz_nonzero( 100i16 ) , 2 ) ;
130
151
assert_eq ! ( cttz_nonzero( 100u32 ) , 2 ) ; assert_eq ! ( cttz_nonzero( 100i32 ) , 2 ) ;
131
152
assert_eq ! ( cttz_nonzero( 100u64 ) , 2 ) ; assert_eq ! ( cttz_nonzero( 100i64 ) , 2 ) ;
153
+ assert_eq ! ( cttz_nonzero( 100u128 ) , 2 ) ; assert_eq ! ( cttz_nonzero( 100i128 ) , 2 ) ;
132
154
133
155
assert_eq ! ( bswap( 0x0Au8 ) , 0x0A ) ; // no-op
134
156
assert_eq ! ( bswap( 0x0Ai8 ) , 0x0A ) ; // no-op
@@ -138,5 +160,18 @@ pub fn main() {
138
160
assert_eq ! ( bswap( 0x0ABBCC0Di32 ) , 0x0DCCBB0A ) ;
139
161
assert_eq ! ( bswap( 0x0122334455667708u64 ) , 0x0877665544332201 ) ;
140
162
assert_eq ! ( bswap( 0x0122334455667708i64 ) , 0x0877665544332201 ) ;
163
+ assert_eq ! ( bswap( 0x0122334455667708u128 ) , 0x08776655443322010000000000000000 ) ;
164
+ assert_eq ! ( bswap( 0x0122334455667708i128 ) , 0x08776655443322010000000000000000 ) ;
165
+
166
+ assert_eq ! ( bitreverse( 0x0Au8 ) , 0x50 ) ;
167
+ assert_eq ! ( bitreverse( 0x0Ai8 ) , 0x50 ) ;
168
+ assert_eq ! ( bitreverse( 0x0A0Cu16 ) , 0x3050 ) ;
169
+ assert_eq ! ( bitreverse( 0x0A0Ci16 ) , 0x3050 ) ;
170
+ assert_eq ! ( bitreverse( 0x0ABBCC0Eu32 ) , 0x7033DD50 ) ;
171
+ assert_eq ! ( bitreverse( 0x0ABBCC0Ei32 ) , 0x7033DD50 ) ;
172
+ assert_eq ! ( bitreverse( 0x0122334455667708u64 ) , 0x10EE66AA22CC4480 ) ;
173
+ assert_eq ! ( bitreverse( 0x0122334455667708i64 ) , 0x10EE66AA22CC4480 ) ;
174
+ assert_eq ! ( bitreverse( 0x0122334455667708u128 ) , 0x10EE66AA22CC44800000000000000000 ) ;
175
+ assert_eq ! ( bitreverse( 0x0122334455667708i128 ) , 0x10EE66AA22CC44800000000000000000 ) ;
141
176
}
142
177
}
0 commit comments