88// option. This file may not be copied, modified, or distributed
99// except according to those terms.
1010
11- #![ feature( intrinsics) ]
11+ #![ feature( intrinsics, i128_type ) ]
1212
1313mod rusti {
1414 extern "rust-intrinsic" {
@@ -18,6 +18,7 @@ mod rusti {
1818 pub fn cttz < T > ( x : T ) -> T ;
1919 pub fn cttz_nonzero < T > ( x : T ) -> T ;
2020 pub fn bswap < T > ( x : T ) -> T ;
21+ pub fn bitreverse < T > ( x : T ) -> T ;
2122 }
2223}
2324
@@ -29,106 +30,127 @@ pub fn main() {
2930 assert_eq ! ( ctpop( 0u16 ) , 0 ) ; assert_eq ! ( ctpop( 0i16 ) , 0 ) ;
3031 assert_eq ! ( ctpop( 0u32 ) , 0 ) ; assert_eq ! ( ctpop( 0i32 ) , 0 ) ;
3132 assert_eq ! ( ctpop( 0u64 ) , 0 ) ; assert_eq ! ( ctpop( 0i64 ) , 0 ) ;
33+ assert_eq ! ( ctpop( 0u128 ) , 0 ) ; assert_eq ! ( ctpop( 0i128 ) , 0 ) ;
3234
3335 assert_eq ! ( ctpop( 1u8 ) , 1 ) ; assert_eq ! ( ctpop( 1i8 ) , 1 ) ;
3436 assert_eq ! ( ctpop( 1u16 ) , 1 ) ; assert_eq ! ( ctpop( 1i16 ) , 1 ) ;
3537 assert_eq ! ( ctpop( 1u32 ) , 1 ) ; assert_eq ! ( ctpop( 1i32 ) , 1 ) ;
3638 assert_eq ! ( ctpop( 1u64 ) , 1 ) ; assert_eq ! ( ctpop( 1i64 ) , 1 ) ;
39+ assert_eq ! ( ctpop( 1u128 ) , 1 ) ; assert_eq ! ( ctpop( 1i128 ) , 1 ) ;
3740
3841 assert_eq ! ( ctpop( 10u8 ) , 2 ) ; assert_eq ! ( ctpop( 10i8 ) , 2 ) ;
3942 assert_eq ! ( ctpop( 10u16 ) , 2 ) ; assert_eq ! ( ctpop( 10i16 ) , 2 ) ;
4043 assert_eq ! ( ctpop( 10u32 ) , 2 ) ; assert_eq ! ( ctpop( 10i32 ) , 2 ) ;
4144 assert_eq ! ( ctpop( 10u64 ) , 2 ) ; assert_eq ! ( ctpop( 10i64 ) , 2 ) ;
45+ assert_eq ! ( ctpop( 10u128 ) , 2 ) ; assert_eq ! ( ctpop( 10i128 ) , 2 ) ;
4246
4347 assert_eq ! ( ctpop( 100u8 ) , 3 ) ; assert_eq ! ( ctpop( 100i8 ) , 3 ) ;
4448 assert_eq ! ( ctpop( 100u16 ) , 3 ) ; assert_eq ! ( ctpop( 100i16 ) , 3 ) ;
4549 assert_eq ! ( ctpop( 100u32 ) , 3 ) ; assert_eq ! ( ctpop( 100i32 ) , 3 ) ;
4650 assert_eq ! ( ctpop( 100u64 ) , 3 ) ; assert_eq ! ( ctpop( 100i64 ) , 3 ) ;
51+ assert_eq ! ( ctpop( 100u128 ) , 3 ) ; assert_eq ! ( ctpop( 100i128 ) , 3 ) ;
4752
4853 assert_eq ! ( ctpop( -1i8 as u8 ) , 8 ) ; assert_eq ! ( ctpop( -1i8 ) , 8 ) ;
4954 assert_eq ! ( ctpop( -1i16 as u16 ) , 16 ) ; assert_eq ! ( ctpop( -1i16 ) , 16 ) ;
5055 assert_eq ! ( ctpop( -1i32 as u32 ) , 32 ) ; assert_eq ! ( ctpop( -1i32 ) , 32 ) ;
5156 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 ) ;
5258
5359 assert_eq ! ( ctlz( 0u8 ) , 8 ) ; assert_eq ! ( ctlz( 0i8 ) , 8 ) ;
5460 assert_eq ! ( ctlz( 0u16 ) , 16 ) ; assert_eq ! ( ctlz( 0i16 ) , 16 ) ;
5561 assert_eq ! ( ctlz( 0u32 ) , 32 ) ; assert_eq ! ( ctlz( 0i32 ) , 32 ) ;
5662 assert_eq ! ( ctlz( 0u64 ) , 64 ) ; assert_eq ! ( ctlz( 0i64 ) , 64 ) ;
63+ assert_eq ! ( ctlz( 0u128 ) , 128 ) ; assert_eq ! ( ctlz( 0i128 ) , 128 ) ;
5764
5865 assert_eq ! ( ctlz( 1u8 ) , 7 ) ; assert_eq ! ( ctlz( 1i8 ) , 7 ) ;
5966 assert_eq ! ( ctlz( 1u16 ) , 15 ) ; assert_eq ! ( ctlz( 1i16 ) , 15 ) ;
6067 assert_eq ! ( ctlz( 1u32 ) , 31 ) ; assert_eq ! ( ctlz( 1i32 ) , 31 ) ;
6168 assert_eq ! ( ctlz( 1u64 ) , 63 ) ; assert_eq ! ( ctlz( 1i64 ) , 63 ) ;
69+ assert_eq ! ( ctlz( 1u128 ) , 127 ) ; assert_eq ! ( ctlz( 1i128 ) , 127 ) ;
6270
6371 assert_eq ! ( ctlz( 10u8 ) , 4 ) ; assert_eq ! ( ctlz( 10i8 ) , 4 ) ;
6472 assert_eq ! ( ctlz( 10u16 ) , 12 ) ; assert_eq ! ( ctlz( 10i16 ) , 12 ) ;
6573 assert_eq ! ( ctlz( 10u32 ) , 28 ) ; assert_eq ! ( ctlz( 10i32 ) , 28 ) ;
6674 assert_eq ! ( ctlz( 10u64 ) , 60 ) ; assert_eq ! ( ctlz( 10i64 ) , 60 ) ;
75+ assert_eq ! ( ctlz( 10u128 ) , 124 ) ; assert_eq ! ( ctlz( 10i128 ) , 124 ) ;
6776
6877 assert_eq ! ( ctlz( 100u8 ) , 1 ) ; assert_eq ! ( ctlz( 100i8 ) , 1 ) ;
6978 assert_eq ! ( ctlz( 100u16 ) , 9 ) ; assert_eq ! ( ctlz( 100i16 ) , 9 ) ;
7079 assert_eq ! ( ctlz( 100u32 ) , 25 ) ; assert_eq ! ( ctlz( 100i32 ) , 25 ) ;
7180 assert_eq ! ( ctlz( 100u64 ) , 57 ) ; assert_eq ! ( ctlz( 100i64 ) , 57 ) ;
81+ assert_eq ! ( ctlz( 100u128 ) , 121 ) ; assert_eq ! ( ctlz( 100i128 ) , 121 ) ;
7282
7383 assert_eq ! ( ctlz_nonzero( 1u8 ) , 7 ) ; assert_eq ! ( ctlz_nonzero( 1i8 ) , 7 ) ;
7484 assert_eq ! ( ctlz_nonzero( 1u16 ) , 15 ) ; assert_eq ! ( ctlz_nonzero( 1i16 ) , 15 ) ;
7585 assert_eq ! ( ctlz_nonzero( 1u32 ) , 31 ) ; assert_eq ! ( ctlz_nonzero( 1i32 ) , 31 ) ;
7686 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 ) ;
7788
7889 assert_eq ! ( ctlz_nonzero( 10u8 ) , 4 ) ; assert_eq ! ( ctlz_nonzero( 10i8 ) , 4 ) ;
7990 assert_eq ! ( ctlz_nonzero( 10u16 ) , 12 ) ; assert_eq ! ( ctlz_nonzero( 10i16 ) , 12 ) ;
8091 assert_eq ! ( ctlz_nonzero( 10u32 ) , 28 ) ; assert_eq ! ( ctlz_nonzero( 10i32 ) , 28 ) ;
8192 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 ) ;
8294
8395 assert_eq ! ( ctlz_nonzero( 100u8 ) , 1 ) ; assert_eq ! ( ctlz_nonzero( 100i8 ) , 1 ) ;
8496 assert_eq ! ( ctlz_nonzero( 100u16 ) , 9 ) ; assert_eq ! ( ctlz_nonzero( 100i16 ) , 9 ) ;
8597 assert_eq ! ( ctlz_nonzero( 100u32 ) , 25 ) ; assert_eq ! ( ctlz_nonzero( 100i32 ) , 25 ) ;
8698 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 ) ;
87100
88101 assert_eq ! ( cttz( -1i8 as u8 ) , 0 ) ; assert_eq ! ( cttz( -1i8 ) , 0 ) ;
89102 assert_eq ! ( cttz( -1i16 as u16 ) , 0 ) ; assert_eq ! ( cttz( -1i16 ) , 0 ) ;
90103 assert_eq ! ( cttz( -1i32 as u32 ) , 0 ) ; assert_eq ! ( cttz( -1i32 ) , 0 ) ;
91104 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 ) ;
92106
93107 assert_eq ! ( cttz( 0u8 ) , 8 ) ; assert_eq ! ( cttz( 0i8 ) , 8 ) ;
94108 assert_eq ! ( cttz( 0u16 ) , 16 ) ; assert_eq ! ( cttz( 0i16 ) , 16 ) ;
95109 assert_eq ! ( cttz( 0u32 ) , 32 ) ; assert_eq ! ( cttz( 0i32 ) , 32 ) ;
96110 assert_eq ! ( cttz( 0u64 ) , 64 ) ; assert_eq ! ( cttz( 0i64 ) , 64 ) ;
111+ assert_eq ! ( cttz( 0u128 ) , 128 ) ; assert_eq ! ( cttz( 0i128 ) , 128 ) ;
97112
98113 assert_eq ! ( cttz( 1u8 ) , 0 ) ; assert_eq ! ( cttz( 1i8 ) , 0 ) ;
99114 assert_eq ! ( cttz( 1u16 ) , 0 ) ; assert_eq ! ( cttz( 1i16 ) , 0 ) ;
100115 assert_eq ! ( cttz( 1u32 ) , 0 ) ; assert_eq ! ( cttz( 1i32 ) , 0 ) ;
101116 assert_eq ! ( cttz( 1u64 ) , 0 ) ; assert_eq ! ( cttz( 1i64 ) , 0 ) ;
117+ assert_eq ! ( cttz( 1u128 ) , 0 ) ; assert_eq ! ( cttz( 1i128 ) , 0 ) ;
102118
103119 assert_eq ! ( cttz( 10u8 ) , 1 ) ; assert_eq ! ( cttz( 10i8 ) , 1 ) ;
104120 assert_eq ! ( cttz( 10u16 ) , 1 ) ; assert_eq ! ( cttz( 10i16 ) , 1 ) ;
105121 assert_eq ! ( cttz( 10u32 ) , 1 ) ; assert_eq ! ( cttz( 10i32 ) , 1 ) ;
106122 assert_eq ! ( cttz( 10u64 ) , 1 ) ; assert_eq ! ( cttz( 10i64 ) , 1 ) ;
123+ assert_eq ! ( cttz( 10u128 ) , 1 ) ; assert_eq ! ( cttz( 10i128 ) , 1 ) ;
107124
108125 assert_eq ! ( cttz( 100u8 ) , 2 ) ; assert_eq ! ( cttz( 100i8 ) , 2 ) ;
109126 assert_eq ! ( cttz( 100u16 ) , 2 ) ; assert_eq ! ( cttz( 100i16 ) , 2 ) ;
110127 assert_eq ! ( cttz( 100u32 ) , 2 ) ; assert_eq ! ( cttz( 100i32 ) , 2 ) ;
111128 assert_eq ! ( cttz( 100u64 ) , 2 ) ; assert_eq ! ( cttz( 100i64 ) , 2 ) ;
129+ assert_eq ! ( cttz( 100u128 ) , 2 ) ; assert_eq ! ( cttz( 100i128 ) , 2 ) ;
112130
113131 assert_eq ! ( cttz_nonzero( -1i8 as u8 ) , 0 ) ; assert_eq ! ( cttz_nonzero( -1i8 ) , 0 ) ;
114132 assert_eq ! ( cttz_nonzero( -1i16 as u16 ) , 0 ) ; assert_eq ! ( cttz_nonzero( -1i16 ) , 0 ) ;
115133 assert_eq ! ( cttz_nonzero( -1i32 as u32 ) , 0 ) ; assert_eq ! ( cttz_nonzero( -1i32 ) , 0 ) ;
116134 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 ) ;
117136
118137 assert_eq ! ( cttz_nonzero( 1u8 ) , 0 ) ; assert_eq ! ( cttz_nonzero( 1i8 ) , 0 ) ;
119138 assert_eq ! ( cttz_nonzero( 1u16 ) , 0 ) ; assert_eq ! ( cttz_nonzero( 1i16 ) , 0 ) ;
120139 assert_eq ! ( cttz_nonzero( 1u32 ) , 0 ) ; assert_eq ! ( cttz_nonzero( 1i32 ) , 0 ) ;
121140 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 ) ;
122142
123143 assert_eq ! ( cttz_nonzero( 10u8 ) , 1 ) ; assert_eq ! ( cttz_nonzero( 10i8 ) , 1 ) ;
124144 assert_eq ! ( cttz_nonzero( 10u16 ) , 1 ) ; assert_eq ! ( cttz_nonzero( 10i16 ) , 1 ) ;
125145 assert_eq ! ( cttz_nonzero( 10u32 ) , 1 ) ; assert_eq ! ( cttz_nonzero( 10i32 ) , 1 ) ;
126146 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 ) ;
127148
128149 assert_eq ! ( cttz_nonzero( 100u8 ) , 2 ) ; assert_eq ! ( cttz_nonzero( 100i8 ) , 2 ) ;
129150 assert_eq ! ( cttz_nonzero( 100u16 ) , 2 ) ; assert_eq ! ( cttz_nonzero( 100i16 ) , 2 ) ;
130151 assert_eq ! ( cttz_nonzero( 100u32 ) , 2 ) ; assert_eq ! ( cttz_nonzero( 100i32 ) , 2 ) ;
131152 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 ) ;
132154
133155 assert_eq ! ( bswap( 0x0Au8 ) , 0x0A ) ; // no-op
134156 assert_eq ! ( bswap( 0x0Ai8 ) , 0x0A ) ; // no-op
@@ -138,5 +160,18 @@ pub fn main() {
138160 assert_eq ! ( bswap( 0x0ABBCC0Di32 ) , 0x0DCCBB0A ) ;
139161 assert_eq ! ( bswap( 0x0122334455667708u64 ) , 0x0877665544332201 ) ;
140162 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 ) ;
141176 }
142177}
0 commit comments