Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update stdarch #136831

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions compiler/rustc_span/src/analyze_source_file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,17 +83,17 @@ cfg_match! {

// For character in the chunk, see if its byte value is < 0, which
// indicates that it's part of a UTF-8 char.
let multibyte_test = unsafe { _mm_cmplt_epi8(chunk, _mm_set1_epi8(0)) };
let multibyte_test = _mm_cmplt_epi8(chunk, _mm_set1_epi8(0));
// Create a bit mask from the comparison results.
let multibyte_mask = unsafe { _mm_movemask_epi8(multibyte_test) };
let multibyte_mask = _mm_movemask_epi8(multibyte_test);

// If the bit mask is all zero, we only have ASCII chars here:
if multibyte_mask == 0 {
assert!(intra_chunk_offset == 0);

// Check for newlines in the chunk
let newlines_test = unsafe { _mm_cmpeq_epi8(chunk, _mm_set1_epi8(b'\n' as i8)) };
let mut newlines_mask = unsafe { _mm_movemask_epi8(newlines_test) };
let newlines_test = _mm_cmpeq_epi8(chunk, _mm_set1_epi8(b'\n' as i8));
let mut newlines_mask = _mm_movemask_epi8(newlines_test);

let output_offset = RelativeBytePos::from_usize(chunk_index * CHUNK_SIZE + 1);

Expand Down
2 changes: 2 additions & 0 deletions library/core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ check-cfg = [
'cfg(bootstrap)',
'cfg(no_fp_fmt_parse)',
'cfg(stdarch_intel_sde)',
# #[cfg(bootstrap)]
'cfg(target_feature, values("vector-enhancements-1"))',
# core use #[path] imports to portable-simd `core_simd` crate
# and to stdarch `core_arch` crate which messes-up with Cargo list
# of declared features, we therefor expect any feature cfg
Expand Down
3 changes: 3 additions & 0 deletions library/core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -202,14 +202,17 @@
//
// Target features:
// tidy-alphabetical-start
#![feature(aarch64_unstable_target_feature)]
#![feature(arm_target_feature)]
#![feature(avx512_target_feature)]
#![feature(hexagon_target_feature)]
#![feature(keylocker_x86)]
#![feature(loongarch_target_feature)]
#![feature(mips_target_feature)]
#![feature(powerpc_target_feature)]
#![feature(riscv_target_feature)]
#![feature(rtm_target_feature)]
#![feature(s390x_target_feature)]
#![feature(sha512_sm_x86)]
#![feature(sse4a_target_feature)]
#![feature(tbm_target_feature)]
Expand Down
2 changes: 1 addition & 1 deletion library/stdarch
Submodule stdarch updated 190 files
24 changes: 15 additions & 9 deletions src/tools/rust-analyzer/lib/line-index/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,8 @@ fn analyze_source_file_dispatch(
/// SSE2 intrinsics to quickly find all newlines.
#[target_feature(enable = "sse2")]
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
// This can be removed once 1.87 is stable due to some intrinsics switching to safe.
#[allow(unsafe_op_in_unsafe_fn)]
Copy link
Member

@Veykril Veykril Feb 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we maybe flip this by using #[allow(unused_unsafe)] instead? I think #[allow(unsafe_op_in_unsafe_fn)] will bite us when we try to upgrade the edition of this crate to 2024 pre-1.87

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you clarify what the concern is about updating to 2024? It should continue to work, since 2024 just changes the default of unsafe_op_in_unsafe_fn, but since it is already warn in rust-analyzer's Cargo.toml, it should have no change.

(I'm fine with switching, either approach works. It's just that if/when someone wants to remove #[allow(unused_unsafe)], they would need to re-apply the patches here to remove the unsafe blocks, which seems like more work to me.)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah right sorry, I mixed this up with edition dependent safety changes of the std::env things. My point is moot.

unsafe fn analyze_source_file_sse2(
src: &str,
lines: &mut Vec<TextSize>,
Expand Down Expand Up @@ -287,17 +289,17 @@ unsafe fn analyze_source_file_sse2(

// For character in the chunk, see if its byte value is < 0, which
// indicates that it's part of a UTF-8 char.
let multibyte_test = unsafe { _mm_cmplt_epi8(chunk, _mm_set1_epi8(0)) };
let multibyte_test = _mm_cmplt_epi8(chunk, _mm_set1_epi8(0));
// Create a bit mask from the comparison results.
let multibyte_mask = unsafe { _mm_movemask_epi8(multibyte_test) };
let multibyte_mask = _mm_movemask_epi8(multibyte_test);

// If the bit mask is all zero, we only have ASCII chars here:
if multibyte_mask == 0 {
assert!(intra_chunk_offset == 0);

// Check for newlines in the chunk
let newlines_test = unsafe { _mm_cmpeq_epi8(chunk, _mm_set1_epi8(b'\n' as i8)) };
let newlines_mask = unsafe { _mm_movemask_epi8(newlines_test) };
let newlines_test = _mm_cmpeq_epi8(chunk, _mm_set1_epi8(b'\n' as i8));
let newlines_mask = _mm_movemask_epi8(newlines_test);

if newlines_mask != 0 {
// All control characters are newlines, record them
Expand Down Expand Up @@ -354,15 +356,19 @@ unsafe fn analyze_source_file_sse2(
// The mask is a 64-bit integer, where each 4-bit corresponds to a u8 in the
// input vector. The least significant 4 bits correspond to the first byte in
// the vector.
// This can be removed once 1.87 is stable due to some intrinsics switching to safe.
#[allow(unsafe_op_in_unsafe_fn)]
unsafe fn move_mask(v: std::arch::aarch64::uint8x16_t) -> u64 {
use std::arch::aarch64::*;

let nibble_mask = unsafe { vshrn_n_u16(vreinterpretq_u16_u8(v), 4) };
unsafe { vget_lane_u64(vreinterpret_u64_u8(nibble_mask), 0) }
let nibble_mask = vshrn_n_u16(vreinterpretq_u16_u8(v), 4);
vget_lane_u64(vreinterpret_u64_u8(nibble_mask), 0)
}

#[target_feature(enable = "neon")]
#[cfg(all(target_arch = "aarch64", target_endian = "little"))]
// This can be removed once 1.87 is stable due to some intrinsics switching to safe.
#[allow(unsafe_op_in_unsafe_fn)]
unsafe fn analyze_source_file_neon(
src: &str,
lines: &mut Vec<TextSize>,
Expand All @@ -376,7 +382,7 @@ unsafe fn analyze_source_file_neon(

let chunk_count = src.len() / CHUNK_SIZE;

let newline = unsafe { vdupq_n_s8(b'\n' as i8) };
let newline = vdupq_n_s8(b'\n' as i8);

// This variable keeps track of where we should start decoding a
// chunk. If a multi-byte character spans across chunk boundaries,
Expand All @@ -390,7 +396,7 @@ unsafe fn analyze_source_file_neon(

// For character in the chunk, see if its byte value is < 0, which
// indicates that it's part of a UTF-8 char.
let multibyte_test = unsafe { vcltzq_s8(chunk) };
let multibyte_test = vcltzq_s8(chunk);
// Create a bit mask from the comparison results.
let multibyte_mask = unsafe { move_mask(multibyte_test) };

Expand All @@ -399,7 +405,7 @@ unsafe fn analyze_source_file_neon(
assert!(intra_chunk_offset == 0);

// Check for newlines in the chunk
let newlines_test = unsafe { vceqq_s8(chunk, newline) };
let newlines_test = vceqq_s8(chunk, newline);
let mut newlines_mask = unsafe { move_mask(newlines_test) };

// If the bit mask is not all zero, there are newlines in this chunk.
Expand Down
Loading