|
1 |
| -use core::intrinsics; |
| 1 | +use core::{intrinsics, ptr}; |
2 | 2 |
|
3 |
| -#[cfg(feature = "mem")] |
4 |
| -use mem::{memcpy, memmove, memset}; |
| 3 | +use mem; |
5 | 4 |
|
6 | 5 | // NOTE This function and the ones below are implemented using assembly because they using a custom
|
7 | 6 | // calling convention which can't be implemented using a normal Rust function
|
@@ -60,65 +59,110 @@ pub unsafe fn __aeabi_ldivmod() {
|
60 | 59 | intrinsics::unreachable();
|
61 | 60 | }
|
62 | 61 |
|
63 |
| -// TODO: These aeabi_* functions should be defined as aliases |
64 |
| -#[cfg(not(feature = "mem"))] |
65 |
| -extern "C" { |
66 |
| - fn memcpy(dest: *mut u8, src: *const u8, n: usize) -> *mut u8; |
67 |
| - fn memmove(dest: *mut u8, src: *const u8, n: usize) -> *mut u8; |
68 |
| - fn memset(dest: *mut u8, c: i32, n: usize) -> *mut u8; |
69 |
| -} |
70 |
| - |
71 | 62 | // FIXME: The `*4` and `*8` variants should be defined as aliases.
|
72 | 63 |
|
| 64 | +#[cfg(not(target_os = "ios"))] |
73 | 65 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 66 | +#[cfg_attr(thumb, linkage = "weak")] |
74 | 67 | pub unsafe extern "aapcs" fn __aeabi_memcpy(dest: *mut u8, src: *const u8, n: usize) {
|
75 |
| - memcpy(dest, src, n); |
| 68 | + mem::memcpy(dest, src, n); |
76 | 69 | }
|
| 70 | + |
| 71 | +#[cfg(not(target_os = "ios"))] |
77 | 72 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
78 |
| -pub unsafe extern "aapcs" fn __aeabi_memcpy4(dest: *mut u8, src: *const u8, n: usize) { |
79 |
| - memcpy(dest, src, n); |
| 73 | +#[cfg_attr(thumb, linkage = "weak")] |
| 74 | +pub unsafe extern "aapcs" fn __aeabi_memcpy4(dest: *mut u8, src: *const u8, mut n: usize) { |
| 75 | + let mut dest = dest as *mut u32; |
| 76 | + let mut src = src as *mut u32; |
| 77 | + |
| 78 | + while n >= 4 { |
| 79 | + ptr::write(dest, ptr::read(src)); |
| 80 | + dest = dest.offset(1); |
| 81 | + src = src.offset(1); |
| 82 | + n -= 4; |
| 83 | + } |
| 84 | + |
| 85 | + __aeabi_memcpy(dest as *mut u8, src as *const u8, n); |
80 | 86 | }
|
| 87 | + |
| 88 | +#[cfg(not(target_os = "ios"))] |
81 | 89 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 90 | +#[cfg_attr(thumb, linkage = "weak")] |
82 | 91 | pub unsafe extern "aapcs" fn __aeabi_memcpy8(dest: *mut u8, src: *const u8, n: usize) {
|
83 |
| - memcpy(dest, src, n); |
| 92 | + __aeabi_memcpy4(dest, src, n); |
84 | 93 | }
|
85 | 94 |
|
| 95 | +#[cfg(not(target_os = "ios"))] |
86 | 96 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 97 | +#[cfg_attr(thumb, linkage = "weak")] |
87 | 98 | pub unsafe extern "aapcs" fn __aeabi_memmove(dest: *mut u8, src: *const u8, n: usize) {
|
88 |
| - memmove(dest, src, n); |
| 99 | + mem::memmove(dest, src, n); |
89 | 100 | }
|
| 101 | + |
| 102 | +#[cfg(not(target_os = "ios"))] |
90 | 103 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 104 | +#[cfg_attr(thumb, linkage = "weak")] |
91 | 105 | pub unsafe extern "aapcs" fn __aeabi_memmove4(dest: *mut u8, src: *const u8, n: usize) {
|
92 |
| - memmove(dest, src, n); |
| 106 | + __aeabi_memmove(dest, src, n); |
93 | 107 | }
|
| 108 | + |
| 109 | +#[cfg(not(target_os = "ios"))] |
94 | 110 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 111 | +#[cfg_attr(thumb, linkage = "weak")] |
95 | 112 | pub unsafe extern "aapcs" fn __aeabi_memmove8(dest: *mut u8, src: *const u8, n: usize) {
|
96 |
| - memmove(dest, src, n); |
| 113 | + __aeabi_memmove(dest, src, n); |
97 | 114 | }
|
98 | 115 |
|
99 |
| -// Note the different argument order |
| 116 | +#[cfg(not(target_os = "ios"))] |
100 | 117 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 118 | +#[cfg_attr(thumb, linkage = "weak")] |
101 | 119 | pub unsafe extern "aapcs" fn __aeabi_memset(dest: *mut u8, n: usize, c: i32) {
|
102 |
| - memset(dest, c, n); |
| 120 | + // Note the different argument order |
| 121 | + mem::memset(dest, c, n); |
103 | 122 | }
|
| 123 | + |
| 124 | +#[cfg(not(target_os = "ios"))] |
104 | 125 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
105 |
| -pub unsafe extern "aapcs" fn __aeabi_memset4(dest: *mut u8, n: usize, c: i32) { |
106 |
| - memset(dest, c, n); |
| 126 | +#[cfg_attr(thumb, linkage = "weak")] |
| 127 | +pub unsafe extern "aapcs" fn __aeabi_memset4(dest: *mut u8, mut n: usize, c: i32) { |
| 128 | + let mut dest = dest as *mut u32; |
| 129 | + |
| 130 | + let byte = (c as u32) & 0xff; |
| 131 | + let c = (byte << 24) | (byte << 16) | (byte << 8) | byte; |
| 132 | + |
| 133 | + while n >= 4 { |
| 134 | + ptr::write(dest, c); |
| 135 | + dest = dest.offset(1); |
| 136 | + n -= 4; |
| 137 | + } |
| 138 | + |
| 139 | + __aeabi_memset(dest as *mut u8, n, byte as i32); |
107 | 140 | }
|
| 141 | + |
| 142 | +#[cfg(not(target_os = "ios"))] |
108 | 143 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 144 | +#[cfg_attr(thumb, linkage = "weak")] |
109 | 145 | pub unsafe extern "aapcs" fn __aeabi_memset8(dest: *mut u8, n: usize, c: i32) {
|
110 |
| - memset(dest, c, n); |
| 146 | + __aeabi_memset4(dest, n, c); |
111 | 147 | }
|
112 | 148 |
|
| 149 | +#[cfg(not(target_os = "ios"))] |
113 | 150 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 151 | +#[cfg_attr(thumb, linkage = "weak")] |
114 | 152 | pub unsafe extern "aapcs" fn __aeabi_memclr(dest: *mut u8, n: usize) {
|
115 |
| - memset(dest, 0, n); |
| 153 | + __aeabi_memset(dest, n, 0); |
116 | 154 | }
|
| 155 | + |
| 156 | +#[cfg(not(target_os = "ios"))] |
117 | 157 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 158 | +#[cfg_attr(thumb, linkage = "weak")] |
118 | 159 | pub unsafe extern "aapcs" fn __aeabi_memclr4(dest: *mut u8, n: usize) {
|
119 |
| - memset(dest, 0, n); |
| 160 | + __aeabi_memset4(dest, n, 0); |
120 | 161 | }
|
| 162 | + |
| 163 | +#[cfg(not(target_os = "ios"))] |
121 | 164 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 165 | +#[cfg_attr(thumb, linkage = "weak")] |
122 | 166 | pub unsafe extern "aapcs" fn __aeabi_memclr8(dest: *mut u8, n: usize) {
|
123 |
| - memset(dest, 0, n); |
| 167 | + __aeabi_memset4(dest, n, 0); |
124 | 168 | }
|
0 commit comments