|
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