@@ -8,10 +8,6 @@ type c_int = i16;
88#[ cfg( not( target_pointer_width = "16" ) ) ]
99type c_int = i32 ;
1010
11- use core:: intrinsics:: { atomic_load_unordered, atomic_store_unordered, exact_div} ;
12- use core:: mem;
13- use core:: ops:: { BitOr , Shl } ;
14-
1511// memcpy/memmove/memset have optimized implementations on some architectures
1612#[ cfg_attr(
1713 all( not( feature = "no-asm" ) , target_arch = "x86_64" ) ,
@@ -60,131 +56,3 @@ intrinsics! {
6056 impls:: c_string_length( s)
6157 }
6258}
63-
64- // `bytes` must be a multiple of `mem::size_of::<T>()`
65- #[ cfg_attr( not( target_has_atomic_load_store = "8" ) , allow( dead_code) ) ]
66- fn memcpy_element_unordered_atomic < T : Copy > ( dest : * mut T , src : * const T , bytes : usize ) {
67- unsafe {
68- let n = exact_div ( bytes, mem:: size_of :: < T > ( ) ) ;
69- let mut i = 0 ;
70- while i < n {
71- atomic_store_unordered ( dest. add ( i) , atomic_load_unordered ( src. add ( i) ) ) ;
72- i += 1 ;
73- }
74- }
75- }
76-
77- // `bytes` must be a multiple of `mem::size_of::<T>()`
78- #[ cfg_attr( not( target_has_atomic_load_store = "8" ) , allow( dead_code) ) ]
79- fn memmove_element_unordered_atomic < T : Copy > ( dest : * mut T , src : * const T , bytes : usize ) {
80- unsafe {
81- let n = exact_div ( bytes, mem:: size_of :: < T > ( ) ) ;
82- if src < dest as * const T {
83- // copy from end
84- let mut i = n;
85- while i != 0 {
86- i -= 1 ;
87- atomic_store_unordered ( dest. add ( i) , atomic_load_unordered ( src. add ( i) ) ) ;
88- }
89- } else {
90- // copy from beginning
91- let mut i = 0 ;
92- while i < n {
93- atomic_store_unordered ( dest. add ( i) , atomic_load_unordered ( src. add ( i) ) ) ;
94- i += 1 ;
95- }
96- }
97- }
98- }
99-
100- // `T` must be a primitive integer type, and `bytes` must be a multiple of `mem::size_of::<T>()`
101- #[ cfg_attr( not( target_has_atomic_load_store = "8" ) , allow( dead_code) ) ]
102- fn memset_element_unordered_atomic < T > ( s : * mut T , c : u8 , bytes : usize )
103- where
104- T : Copy + From < u8 > + Shl < u32 , Output = T > + BitOr < T , Output = T > ,
105- {
106- unsafe {
107- let n = exact_div ( bytes, mem:: size_of :: < T > ( ) ) ;
108-
109- // Construct a value of type `T` consisting of repeated `c`
110- // bytes, to let us ensure we write each `T` atomically.
111- let mut x = T :: from ( c) ;
112- let mut i = 1 ;
113- while i < mem:: size_of :: < T > ( ) {
114- x = ( x << 8 ) | T :: from ( c) ;
115- i += 1 ;
116- }
117-
118- // Write it to `s`
119- let mut i = 0 ;
120- while i < n {
121- atomic_store_unordered ( s. add ( i) , x) ;
122- i += 1 ;
123- }
124- }
125- }
126-
127- intrinsics ! {
128- #[ cfg( target_has_atomic_load_store = "8" ) ]
129- pub unsafe extern "C" fn __llvm_memcpy_element_unordered_atomic_1( dest: * mut u8 , src: * const u8 , bytes: usize ) -> ( ) {
130- memcpy_element_unordered_atomic( dest, src, bytes) ;
131- }
132- #[ cfg( target_has_atomic_load_store = "16" ) ]
133- pub unsafe extern "C" fn __llvm_memcpy_element_unordered_atomic_2( dest: * mut u16 , src: * const u16 , bytes: usize ) -> ( ) {
134- memcpy_element_unordered_atomic( dest, src, bytes) ;
135- }
136- #[ cfg( target_has_atomic_load_store = "32" ) ]
137- pub unsafe extern "C" fn __llvm_memcpy_element_unordered_atomic_4( dest: * mut u32 , src: * const u32 , bytes: usize ) -> ( ) {
138- memcpy_element_unordered_atomic( dest, src, bytes) ;
139- }
140- #[ cfg( target_has_atomic_load_store = "64" ) ]
141- pub unsafe extern "C" fn __llvm_memcpy_element_unordered_atomic_8( dest: * mut u64 , src: * const u64 , bytes: usize ) -> ( ) {
142- memcpy_element_unordered_atomic( dest, src, bytes) ;
143- }
144- #[ cfg( target_has_atomic_load_store = "128" ) ]
145- pub unsafe extern "C" fn __llvm_memcpy_element_unordered_atomic_16( dest: * mut u128 , src: * const u128 , bytes: usize ) -> ( ) {
146- memcpy_element_unordered_atomic( dest, src, bytes) ;
147- }
148-
149- #[ cfg( target_has_atomic_load_store = "8" ) ]
150- pub unsafe extern "C" fn __llvm_memmove_element_unordered_atomic_1( dest: * mut u8 , src: * const u8 , bytes: usize ) -> ( ) {
151- memmove_element_unordered_atomic( dest, src, bytes) ;
152- }
153- #[ cfg( target_has_atomic_load_store = "16" ) ]
154- pub unsafe extern "C" fn __llvm_memmove_element_unordered_atomic_2( dest: * mut u16 , src: * const u16 , bytes: usize ) -> ( ) {
155- memmove_element_unordered_atomic( dest, src, bytes) ;
156- }
157- #[ cfg( target_has_atomic_load_store = "32" ) ]
158- pub unsafe extern "C" fn __llvm_memmove_element_unordered_atomic_4( dest: * mut u32 , src: * const u32 , bytes: usize ) -> ( ) {
159- memmove_element_unordered_atomic( dest, src, bytes) ;
160- }
161- #[ cfg( target_has_atomic_load_store = "64" ) ]
162- pub unsafe extern "C" fn __llvm_memmove_element_unordered_atomic_8( dest: * mut u64 , src: * const u64 , bytes: usize ) -> ( ) {
163- memmove_element_unordered_atomic( dest, src, bytes) ;
164- }
165- #[ cfg( target_has_atomic_load_store = "128" ) ]
166- pub unsafe extern "C" fn __llvm_memmove_element_unordered_atomic_16( dest: * mut u128 , src: * const u128 , bytes: usize ) -> ( ) {
167- memmove_element_unordered_atomic( dest, src, bytes) ;
168- }
169-
170- #[ cfg( target_has_atomic_load_store = "8" ) ]
171- pub unsafe extern "C" fn __llvm_memset_element_unordered_atomic_1( s: * mut u8 , c: u8 , bytes: usize ) -> ( ) {
172- memset_element_unordered_atomic( s, c, bytes) ;
173- }
174- #[ cfg( target_has_atomic_load_store = "16" ) ]
175- pub unsafe extern "C" fn __llvm_memset_element_unordered_atomic_2( s: * mut u16 , c: u8 , bytes: usize ) -> ( ) {
176- memset_element_unordered_atomic( s, c, bytes) ;
177- }
178- #[ cfg( target_has_atomic_load_store = "32" ) ]
179- pub unsafe extern "C" fn __llvm_memset_element_unordered_atomic_4( s: * mut u32 , c: u8 , bytes: usize ) -> ( ) {
180- memset_element_unordered_atomic( s, c, bytes) ;
181- }
182- #[ cfg( target_has_atomic_load_store = "64" ) ]
183- pub unsafe extern "C" fn __llvm_memset_element_unordered_atomic_8( s: * mut u64 , c: u8 , bytes: usize ) -> ( ) {
184- memset_element_unordered_atomic( s, c, bytes) ;
185- }
186- #[ cfg( target_has_atomic_load_store = "128" ) ]
187- pub unsafe extern "C" fn __llvm_memset_element_unordered_atomic_16( s: * mut u128 , c: u8 , bytes: usize ) -> ( ) {
188- memset_element_unordered_atomic( s, c, bytes) ;
189- }
190- }
0 commit comments