Skip to content

Commit 462b73c

Browse files
iankronquistalexcrichton
authored andcommitted
Implement bcmp (#315)
As of LLVM 9.0, certain calls to memcmp may be converted to bcmp, which I guess could save a single subtraction on some architectures. [1] bcmp is just like memcmp except instead of returning the difference between the two differing bytes, it returns non-zero instead. As such, memcmp is a valid implementation of bcmp. If we care about size, bcmp should just call memcmp. If we care about speed, we can change bcmp to look like this instead: ```rust pub unsafe extern "C" fn bcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 { let mut i = 0; while i < n { let a = *s1.offset(i as isize); let b = *s2.offset(i as isize); if a != b { return 1; } i += 1; } 0 } ``` In this PR I do not address any changes which may or may not be needed for arm aebi as I lack proper test hardware. [1]: https://releases.llvm.org/9.0.0/docs/ReleaseNotes.html#noteworthy-optimizations
1 parent ea5db23 commit 462b73c

File tree

1 file changed

+5
-0
lines changed

1 file changed

+5
-0
lines changed

src/mem.rs

+5
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ pub unsafe extern "C" fn memcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 {
6363
0
6464
}
6565

66+
#[cfg_attr(all(feature = "mem", not(feature = "mangled-names")), no_mangle)]
67+
pub unsafe extern "C" fn bcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 {
68+
memcmp(s1, s2, n)
69+
}
70+
6671
// `bytes` must be a multiple of `mem::size_of::<T>()`
6772
fn memcpy_element_unordered_atomic<T: Copy>(dest: *mut T, src: *const T, bytes: usize) {
6873
unsafe {

0 commit comments

Comments
 (0)