diff options
| author | bors <bors@rust-lang.org> | 2020-08-08 11:34:18 +0000 | 
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-08-08 11:34:18 +0000 | 
| commit | c989ac132a81503ceaaa1054da0a3a8c5c305ef0 (patch) | |
| tree | 10dce6faef307c841dffe61928c4fd4fac3eb4b1 | |
| parent | c92fc8db8b009b7661cff31fa59a7c0348653bd0 (diff) | |
| parent | f55e4d036c10f5b887b4ed8c12b7b31f3bb75d23 (diff) | |
| download | rust-c989ac132a81503ceaaa1054da0a3a8c5c305ef0.tar.gz rust-c989ac132a81503ceaaa1054da0a3a8c5c305ef0.zip  | |
Auto merge of #74289 - lzutao:unroll, r=LukasKalbertodt
Remove some redundant parts from `unrolled_find_u16s` See each commit message for details. r? @wesleywiser from old PR #67705 .
| -rw-r--r-- | library/std/src/sys/windows/mod.rs | 41 | 
1 files changed, 13 insertions, 28 deletions
diff --git a/library/std/src/sys/windows/mod.rs b/library/std/src/sys/windows/mod.rs index 9a52371280e..982ec912c44 100644 --- a/library/std/src/sys/windows/mod.rs +++ b/library/std/src/sys/windows/mod.rs @@ -99,43 +99,28 @@ pub fn decode_error_kind(errno: i32) -> ErrorKind { pub fn unrolled_find_u16s(needle: u16, haystack: &[u16]) -> Option<usize> { let ptr = haystack.as_ptr(); - let mut len = haystack.len(); let mut start = &haystack[..]; // For performance reasons unfold the loop eight times. - while len >= 8 { - if start[0] == needle { - return Some((start.as_ptr() as usize - ptr as usize) / 2); - } - if start[1] == needle { - return Some((start[1..].as_ptr() as usize - ptr as usize) / 2); - } - if start[2] == needle { - return Some((start[2..].as_ptr() as usize - ptr as usize) / 2); - } - if start[3] == needle { - return Some((start[3..].as_ptr() as usize - ptr as usize) / 2); - } - if start[4] == needle { - return Some((start[4..].as_ptr() as usize - ptr as usize) / 2); - } - if start[5] == needle { - return Some((start[5..].as_ptr() as usize - ptr as usize) / 2); - } - if start[6] == needle { - return Some((start[6..].as_ptr() as usize - ptr as usize) / 2); - } - if start[7] == needle { - return Some((start[7..].as_ptr() as usize - ptr as usize) / 2); + while start.len() >= 8 { + macro_rules! if_return { + ($($n:literal,)+) => { + $( + if start[$n] == needle { + return Some((&start[$n] as *const u16 as usize - ptr as usize) / 2); + } + )+ + } } + if_return!(0, 1, 2, 3, 4, 5, 6, 7,); + start = &start[8..]; - len -= 8; } - for (i, c) in start.iter().enumerate() { + for c in start { if *c == needle { - return Some((start.as_ptr() as usize - ptr as usize) / 2 + i); + return Some((c as *const u16 as usize - ptr as usize) / 2); } } None  | 
