File tree 5 files changed +63
-0
lines changed
5 files changed +63
-0
lines changed Original file line number Diff line number Diff line change @@ -154,6 +154,9 @@ rely on CI.
154
154
- [ ] arm/unordsf2vfp.S
155
155
- [x] ashldi3.c
156
156
- [x] ashrdi3.c
157
+ - [x] bswapdi2.c
158
+ - [x] bswapsi2.c
159
+ - [x] bswapti2.c
157
160
- [x] comparedf2.c
158
161
- [x] comparesf2.c
159
162
- [x] divdf3.c
Original file line number Diff line number Diff line change @@ -161,6 +161,9 @@ fn configure_check_cfg() {
161
161
"__ashlsi3" ,
162
162
"__ashrdi3" ,
163
163
"__ashrsi3" ,
164
+ "__bswapsi2" ,
165
+ "__bswapdi2" ,
166
+ "__bswapti2" ,
164
167
"__clzsi2" ,
165
168
"__divdi3" ,
166
169
"__divsi3" ,
Original file line number Diff line number Diff line change
1
+ intrinsics ! {
2
+ #[ maybe_use_optimized_c_shim]
3
+ #[ avr_skip]
4
+ /// Swaps bytes in 32-bit number
5
+ pub extern "C" fn __bswapsi2( x: u32 ) -> u32 {
6
+ x. swap_bytes( )
7
+ }
8
+
9
+ #[ maybe_use_optimized_c_shim]
10
+ #[ avr_skip]
11
+ /// Swaps bytes in 64-bit number
12
+ pub extern "C" fn __bswapdi2( x: u64 ) -> u64 {
13
+ x. swap_bytes( )
14
+ }
15
+
16
+ #[ maybe_use_optimized_c_shim]
17
+ #[ avr_skip]
18
+ /// Swaps bytes in 128-bit number
19
+ pub extern "C" fn __bswapti2( x: u128 ) -> u128 {
20
+ x. swap_bytes( )
21
+ }
22
+ }
Original file line number Diff line number Diff line change @@ -4,6 +4,7 @@ mod specialized_div_rem;
4
4
5
5
pub mod addsub;
6
6
mod big;
7
+ pub mod bswap;
7
8
pub mod leading_zeros;
8
9
pub mod mul;
9
10
pub mod sdiv;
Original file line number Diff line number Diff line change @@ -92,6 +92,40 @@ fn leading_zeros() {
92
92
} )
93
93
}
94
94
95
+ #[ test]
96
+ #[ cfg( not( target_arch = "avr" ) ) ]
97
+ fn bswap ( ) {
98
+ use compiler_builtins:: int:: bswap:: { __bswapdi2, __bswapsi2} ;
99
+ fuzz ( N , |x : u32 | {
100
+ assert_eq ! ( x. swap_bytes( ) , __bswapsi2( x) ) ;
101
+ } ) ;
102
+ fuzz ( N , |x : u64 | {
103
+ assert_eq ! ( x. swap_bytes( ) , __bswapdi2( x) ) ;
104
+ } ) ;
105
+
106
+ assert_eq ! ( __bswapsi2( 0x12345678u32 ) , 0x78563412u32 ) ;
107
+ assert_eq ! ( __bswapsi2( 0x00000001u32 ) , 0x01000000u32 ) ;
108
+ assert_eq ! ( __bswapdi2( 0x123456789ABCDEF0u64 ) , 0xF0DEBC9A78563412u64 ) ;
109
+ assert_eq ! ( __bswapdi2( 0x0200000001000000u64 ) , 0x0000000100000002u64 ) ;
110
+
111
+ #[ cfg( any( target_pointer_width = "32" , target_pointer_width = "64" ) ) ]
112
+ {
113
+ use compiler_builtins:: int:: bswap:: __bswapti2;
114
+ fuzz ( N , |x : u128 | {
115
+ assert_eq ! ( x. swap_bytes( ) , __bswapti2( x) ) ;
116
+ } ) ;
117
+
118
+ assert_eq ! (
119
+ __bswapti2( 0x123456789ABCDEF013579BDF02468ACEu128 ) ,
120
+ 0xCE8A4602DF9B5713F0DEBC9A78563412u128
121
+ ) ;
122
+ assert_eq ! (
123
+ __bswapti2( 0x04000000030000000200000001000000u128 ) ,
124
+ 0x00000001000000020000000300000004u128
125
+ ) ;
126
+ }
127
+ }
128
+
95
129
// This is approximate because of issues related to
96
130
// https://github.com/rust-lang/rust/issues/73920.
97
131
// TODO how do we resolve this indeterminacy?
You can’t perform that action at this time.
0 commit comments