|
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,98 @@ 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 |
|
73 | 64 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 65 | +#[linkage = "weak"] |
74 | 66 | pub unsafe extern "aapcs" fn __aeabi_memcpy(dest: *mut u8, src: *const u8, n: usize) {
|
75 |
| - memcpy(dest, src, n); |
| 67 | + mem::memcpy(dest, src, n); |
76 | 68 | }
|
| 69 | + |
77 | 70 | #[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); |
| 71 | +#[linkage = "weak"] |
| 72 | +pub unsafe extern "aapcs" fn __aeabi_memcpy4(dest: *mut u8, src: *const u8, mut n: usize) { |
| 73 | + let mut dest = dest as *mut u32; |
| 74 | + let mut src = src as *mut u32; |
| 75 | + |
| 76 | + while n >= 4 { |
| 77 | + ptr::write(dest, ptr::read(src)); |
| 78 | + dest = dest.offset(1); |
| 79 | + src = src.offset(1); |
| 80 | + n -= 4; |
| 81 | + } |
| 82 | + |
| 83 | + __aeabi_memcpy(dest as *mut u8, src as *const u8, n); |
80 | 84 | }
|
| 85 | + |
81 | 86 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 87 | +#[linkage = "weak"] |
82 | 88 | pub unsafe extern "aapcs" fn __aeabi_memcpy8(dest: *mut u8, src: *const u8, n: usize) {
|
83 |
| - memcpy(dest, src, n); |
| 89 | + __aeabi_memcpy4(dest, src, n); |
84 | 90 | }
|
85 | 91 |
|
86 | 92 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 93 | +#[linkage = "weak"] |
87 | 94 | pub unsafe extern "aapcs" fn __aeabi_memmove(dest: *mut u8, src: *const u8, n: usize) {
|
88 |
| - memmove(dest, src, n); |
| 95 | + mem::memmove(dest, src, n); |
89 | 96 | }
|
| 97 | + |
90 | 98 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 99 | +#[linkage = "weak"] |
91 | 100 | pub unsafe extern "aapcs" fn __aeabi_memmove4(dest: *mut u8, src: *const u8, n: usize) {
|
92 |
| - memmove(dest, src, n); |
| 101 | + __aeabi_memmove(dest, src, n); |
93 | 102 | }
|
| 103 | + |
94 | 104 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 105 | +#[linkage = "weak"] |
95 | 106 | pub unsafe extern "aapcs" fn __aeabi_memmove8(dest: *mut u8, src: *const u8, n: usize) {
|
96 |
| - memmove(dest, src, n); |
| 107 | + __aeabi_memmove(dest, src, n); |
97 | 108 | }
|
98 | 109 |
|
99 | 110 | // Note the different argument order
|
100 | 111 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 112 | +#[linkage = "weak"] |
101 | 113 | pub unsafe extern "aapcs" fn __aeabi_memset(dest: *mut u8, n: usize, c: i32) {
|
102 |
| - memset(dest, c, n); |
| 114 | + mem::memset(dest, c, n); |
103 | 115 | }
|
| 116 | + |
104 | 117 | #[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); |
| 118 | +#[linkage = "weak"] |
| 119 | +pub unsafe extern "aapcs" fn __aeabi_memset4(dest: *mut u8, mut n: usize, c: i32) { |
| 120 | + let mut dest = dest as *mut u32; |
| 121 | + |
| 122 | + let byte = (c as u32) & 0xff; |
| 123 | + let c = (byte << 24) | (byte << 16) | (byte << 8) | byte; |
| 124 | + |
| 125 | + while n >= 4 { |
| 126 | + ptr::write(dest, c); |
| 127 | + dest = dest.offset(1); |
| 128 | + n -= 4; |
| 129 | + } |
| 130 | + |
| 131 | + __aeabi_memset(dest as *mut u8, n, byte as i32); |
107 | 132 | }
|
| 133 | + |
108 | 134 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 135 | +#[linkage = "weak"] |
109 | 136 | pub unsafe extern "aapcs" fn __aeabi_memset8(dest: *mut u8, n: usize, c: i32) {
|
110 |
| - memset(dest, c, n); |
| 137 | + __aeabi_memset4(dest, n, c); |
111 | 138 | }
|
112 | 139 |
|
113 | 140 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 141 | +#[linkage = "weak"] |
114 | 142 | pub unsafe extern "aapcs" fn __aeabi_memclr(dest: *mut u8, n: usize) {
|
115 |
| - memset(dest, 0, n); |
| 143 | + __aeabi_memset(dest, n, 0); |
116 | 144 | }
|
| 145 | + |
117 | 146 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 147 | +#[linkage = "weak"] |
118 | 148 | pub unsafe extern "aapcs" fn __aeabi_memclr4(dest: *mut u8, n: usize) {
|
119 |
| - memset(dest, 0, n); |
| 149 | + __aeabi_memset4(dest, n, 0); |
120 | 150 | }
|
| 151 | + |
121 | 152 | #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
|
| 153 | +#[linkage = "weak"] |
122 | 154 | pub unsafe extern "aapcs" fn __aeabi_memclr8(dest: *mut u8, n: usize) {
|
123 |
| - memset(dest, 0, n); |
| 155 | + __aeabi_memset4(dest, n, 0); |
124 | 156 | }
|
0 commit comments