Skip to content
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
4 changes: 2 additions & 2 deletions ci/docker/loongarch64-unknown-linux-gnu/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ FROM ubuntu:25.10

RUN apt-get update && \
apt-get install -y --no-install-recommends \
gcc libc6-dev qemu-user-static ca-certificates \
gcc libc6-dev qemu-user ca-certificates \
gcc-loongarch64-linux-gnu libc6-dev-loong64-cross


ENV CARGO_TARGET_LOONGARCH64_UNKNOWN_LINUX_GNU_LINKER=loongarch64-linux-gnu-gcc \
CARGO_TARGET_LOONGARCH64_UNKNOWN_LINUX_GNU_RUNNER="qemu-loongarch64-static -cpu max -L /usr/loongarch64-linux-gnu" \
CARGO_TARGET_LOONGARCH64_UNKNOWN_LINUX_GNU_RUNNER="qemu-loongarch64 -cpu max -L /usr/loongarch64-linux-gnu" \
OBJDUMP=loongarch64-linux-gnu-objdump \
STDARCH_TEST_SKIP_FEATURE=frecipe
133 changes: 63 additions & 70 deletions crates/core_arch/src/x86/adx.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ unsafe extern "unadjusted" {
#[inline]
#[cfg_attr(test, assert_instr(adc))]
#[stable(feature = "simd_x86_adx", since = "1.33.0")]
pub unsafe fn _addcarry_u32(c_in: u8, a: u32, b: u32, out: &mut u32) -> u8 {
let (a, b) = llvm_addcarry_u32(c_in, a, b);
pub fn _addcarry_u32(c_in: u8, a: u32, b: u32, out: &mut u32) -> u8 {
let (a, b) = unsafe { llvm_addcarry_u32(c_in, a, b) };
*out = b;
a
}
Expand All @@ -34,8 +34,8 @@ pub unsafe fn _addcarry_u32(c_in: u8, a: u32, b: u32, out: &mut u32) -> u8 {
#[target_feature(enable = "adx")]
#[cfg_attr(test, assert_instr(adc))]
#[stable(feature = "simd_x86_adx", since = "1.33.0")]
pub unsafe fn _addcarryx_u32(c_in: u8, a: u32, b: u32, out: &mut u32) -> u8 {
llvm_addcarryx_u32(c_in, a, b, out as *mut _)
pub fn _addcarryx_u32(c_in: u8, a: u32, b: u32, out: &mut u32) -> u8 {
unsafe { llvm_addcarryx_u32(c_in, a, b, out as *mut _) }
}

/// Adds unsigned 32-bit integers `a` and `b` with unsigned 8-bit carry-in `c_in`
Expand All @@ -46,8 +46,8 @@ pub unsafe fn _addcarryx_u32(c_in: u8, a: u32, b: u32, out: &mut u32) -> u8 {
#[inline]
#[cfg_attr(test, assert_instr(sbb))]
#[stable(feature = "simd_x86_adx", since = "1.33.0")]
pub unsafe fn _subborrow_u32(c_in: u8, a: u32, b: u32, out: &mut u32) -> u8 {
let (a, b) = llvm_subborrow_u32(c_in, a, b);
pub fn _subborrow_u32(c_in: u8, a: u32, b: u32, out: &mut u32) -> u8 {
let (a, b) = unsafe { llvm_subborrow_u32(c_in, a, b) };
*out = b;
a
}
Expand All @@ -60,38 +60,36 @@ mod tests {

#[test]
fn test_addcarry_u32() {
unsafe {
let a = u32::MAX;
let mut out = 0;

let r = _addcarry_u32(0, a, 1, &mut out);
assert_eq!(r, 1);
assert_eq!(out, 0);

let r = _addcarry_u32(0, a, 0, &mut out);
assert_eq!(r, 0);
assert_eq!(out, a);

let r = _addcarry_u32(1, a, 1, &mut out);
assert_eq!(r, 1);
assert_eq!(out, 1);

let r = _addcarry_u32(1, a, 0, &mut out);
assert_eq!(r, 1);
assert_eq!(out, 0);

let r = _addcarry_u32(0, 3, 4, &mut out);
assert_eq!(r, 0);
assert_eq!(out, 7);

let r = _addcarry_u32(1, 3, 4, &mut out);
assert_eq!(r, 0);
assert_eq!(out, 8);
}
let a = u32::MAX;
let mut out = 0;

let r = _addcarry_u32(0, a, 1, &mut out);
assert_eq!(r, 1);
assert_eq!(out, 0);

let r = _addcarry_u32(0, a, 0, &mut out);
assert_eq!(r, 0);
assert_eq!(out, a);

let r = _addcarry_u32(1, a, 1, &mut out);
assert_eq!(r, 1);
assert_eq!(out, 1);

let r = _addcarry_u32(1, a, 0, &mut out);
assert_eq!(r, 1);
assert_eq!(out, 0);

let r = _addcarry_u32(0, 3, 4, &mut out);
assert_eq!(r, 0);
assert_eq!(out, 7);

let r = _addcarry_u32(1, 3, 4, &mut out);
assert_eq!(r, 0);
assert_eq!(out, 8);
}

#[simd_test(enable = "adx")]
unsafe fn test_addcarryx_u32() {
fn test_addcarryx_u32() {
let a = u32::MAX;
let mut out = 0;

Expand Down Expand Up @@ -121,44 +119,39 @@ mod tests {
}

#[simd_test(enable = "adx")]
unsafe fn test_addcarryx_u32_2() {
unsafe fn add_1_2_3() -> u32 {
let mut out = 0;
_addcarryx_u32(1, 2, 3, &mut out);
out
}
assert_eq!(6, add_1_2_3());
fn test_addcarryx_u32_2() {
let mut out = 0;
_addcarryx_u32(1, 2, 3, &mut out);
assert_eq!(6, out);
}

#[test]
fn test_subborrow_u32() {
unsafe {
let a = u32::MAX;
let mut out = 0;

let r = _subborrow_u32(0, 0, 1, &mut out);
assert_eq!(r, 1);
assert_eq!(out, a);

let r = _subborrow_u32(0, 0, 0, &mut out);
assert_eq!(r, 0);
assert_eq!(out, 0);

let r = _subborrow_u32(1, 0, 1, &mut out);
assert_eq!(r, 1);
assert_eq!(out, a - 1);

let r = _subborrow_u32(1, 0, 0, &mut out);
assert_eq!(r, 1);
assert_eq!(out, a);

let r = _subborrow_u32(0, 7, 3, &mut out);
assert_eq!(r, 0);
assert_eq!(out, 4);

let r = _subborrow_u32(1, 7, 3, &mut out);
assert_eq!(r, 0);
assert_eq!(out, 3);
}
let a = u32::MAX;
let mut out = 0;

let r = _subborrow_u32(0, 0, 1, &mut out);
assert_eq!(r, 1);
assert_eq!(out, a);

let r = _subborrow_u32(0, 0, 0, &mut out);
assert_eq!(r, 0);
assert_eq!(out, 0);

let r = _subborrow_u32(1, 0, 1, &mut out);
assert_eq!(r, 1);
assert_eq!(out, a - 1);

let r = _subborrow_u32(1, 0, 0, &mut out);
assert_eq!(r, 1);
assert_eq!(out, a);

let r = _subborrow_u32(0, 7, 3, &mut out);
assert_eq!(r, 0);
assert_eq!(out, 4);

let r = _subborrow_u32(1, 7, 3, &mut out);
assert_eq!(r, 0);
assert_eq!(out, 3);
}
}
2 changes: 1 addition & 1 deletion crates/core_arch/src/x86/avx512fp16.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11111,7 +11111,7 @@ pub fn _mm256_reduce_mul_ph(a: __m256h) -> f16 {
#[inline]
#[target_feature(enable = "avx512fp16")]
#[unstable(feature = "stdarch_x86_avx512_f16", issue = "127213")]
pub unsafe fn _mm512_reduce_mul_ph(a: __m512h) -> f16 {
pub fn _mm512_reduce_mul_ph(a: __m512h) -> f16 {
unsafe {
let p = simd_shuffle!(a, a, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]);
let q = simd_shuffle!(
Expand Down
8 changes: 3 additions & 5 deletions crates/core_arch/src/x86/bswap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use stdarch_test::assert_instr;
#[inline]
#[cfg_attr(test, assert_instr(bswap))]
#[stable(feature = "simd_x86", since = "1.27.0")]
pub unsafe fn _bswap(x: i32) -> i32 {
pub fn _bswap(x: i32) -> i32 {
x.swap_bytes()
}

Expand All @@ -20,9 +20,7 @@ mod tests {

#[test]
fn test_bswap() {
unsafe {
assert_eq!(_bswap(0x0EADBE0F), 0x0FBEAD0E);
assert_eq!(_bswap(0x00000000), 0x00000000);
}
assert_eq!(_bswap(0x0EADBE0F), 0x0FBEAD0E);
assert_eq!(_bswap(0x00000000), 0x00000000);
}
}
16 changes: 8 additions & 8 deletions crates/core_arch/src/x86/rdrand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ use stdarch_test::assert_instr;
#[target_feature(enable = "rdrand")]
#[cfg_attr(test, assert_instr(rdrand))]
#[stable(feature = "simd_x86", since = "1.27.0")]
pub unsafe fn _rdrand16_step(val: &mut u16) -> i32 {
let (v, flag) = x86_rdrand16_step();
pub fn _rdrand16_step(val: &mut u16) -> i32 {
let (v, flag) = unsafe { x86_rdrand16_step() };
*val = v;
flag
}
Expand All @@ -40,8 +40,8 @@ pub unsafe fn _rdrand16_step(val: &mut u16) -> i32 {
#[target_feature(enable = "rdrand")]
#[cfg_attr(test, assert_instr(rdrand))]
#[stable(feature = "simd_x86", since = "1.27.0")]
pub unsafe fn _rdrand32_step(val: &mut u32) -> i32 {
let (v, flag) = x86_rdrand32_step();
pub fn _rdrand32_step(val: &mut u32) -> i32 {
let (v, flag) = unsafe { x86_rdrand32_step() };
*val = v;
flag
}
Expand All @@ -54,8 +54,8 @@ pub unsafe fn _rdrand32_step(val: &mut u32) -> i32 {
#[target_feature(enable = "rdseed")]
#[cfg_attr(test, assert_instr(rdseed))]
#[stable(feature = "simd_x86", since = "1.27.0")]
pub unsafe fn _rdseed16_step(val: &mut u16) -> i32 {
let (v, flag) = x86_rdseed16_step();
pub fn _rdseed16_step(val: &mut u16) -> i32 {
let (v, flag) = unsafe { x86_rdseed16_step() };
*val = v;
flag
}
Expand All @@ -68,8 +68,8 @@ pub unsafe fn _rdseed16_step(val: &mut u16) -> i32 {
#[target_feature(enable = "rdseed")]
#[cfg_attr(test, assert_instr(rdseed))]
#[stable(feature = "simd_x86", since = "1.27.0")]
pub unsafe fn _rdseed32_step(val: &mut u32) -> i32 {
let (v, flag) = x86_rdseed32_step();
pub fn _rdseed32_step(val: &mut u32) -> i32 {
let (v, flag) = unsafe { x86_rdseed32_step() };
*val = v;
flag
}
10 changes: 6 additions & 4 deletions crates/core_arch/src/x86/sse.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1445,8 +1445,8 @@ pub fn _mm_move_ss(a: __m128, b: __m128) -> __m128 {
#[target_feature(enable = "sse")]
#[cfg_attr(test, assert_instr(sfence))]
#[stable(feature = "simd_x86", since = "1.27.0")]
pub unsafe fn _mm_sfence() {
sfence()
pub fn _mm_sfence() {
unsafe { sfence() }
}

/// Gets the unsigned 32-bit value of the MXCSR control and status register.
Expand Down Expand Up @@ -1897,11 +1897,13 @@ pub const _MM_HINT_ET1: i32 = 6;
#[cfg_attr(test, assert_instr(prefetchnta, STRATEGY = _MM_HINT_NTA))]
#[rustc_legacy_const_generics(1)]
#[stable(feature = "simd_x86", since = "1.27.0")]
pub unsafe fn _mm_prefetch<const STRATEGY: i32>(p: *const i8) {
pub fn _mm_prefetch<const STRATEGY: i32>(p: *const i8) {
static_assert_uimm_bits!(STRATEGY, 3);
// We use the `llvm.prefetch` intrinsic with `cache type` = 1 (data cache).
// `locality` and `rw` are based on our `STRATEGY`.
prefetch(p, (STRATEGY >> 2) & 1, STRATEGY & 3, 1);
unsafe {
prefetch(p, (STRATEGY >> 2) & 1, STRATEGY & 3, 1);
}
}

/// Returns vector of type __m128 with indeterminate elements.with indetermination elements.
Expand Down
14 changes: 7 additions & 7 deletions crates/core_arch/src/x86/sse2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ use crate::{
#[inline]
#[cfg_attr(all(test, target_feature = "sse2"), assert_instr(pause))]
#[stable(feature = "simd_x86", since = "1.27.0")]
pub unsafe fn _mm_pause() {
pub fn _mm_pause() {
// note: `pause` is guaranteed to be interpreted as a `nop` by CPUs without
// the SSE2 target-feature - therefore it does not require any target features
pause()
unsafe { pause() }
}

/// Invalidates and flushes the cache line that contains `p` from all levels of
Expand All @@ -49,8 +49,8 @@ pub unsafe fn _mm_clflush(p: *const u8) {
#[target_feature(enable = "sse2")]
#[cfg_attr(test, assert_instr(lfence))]
#[stable(feature = "simd_x86", since = "1.27.0")]
pub unsafe fn _mm_lfence() {
lfence()
pub fn _mm_lfence() {
unsafe { lfence() }
}

/// Performs a serializing operation on all load-from-memory and store-to-memory
Expand All @@ -65,8 +65,8 @@ pub unsafe fn _mm_lfence() {
#[target_feature(enable = "sse2")]
#[cfg_attr(test, assert_instr(mfence))]
#[stable(feature = "simd_x86", since = "1.27.0")]
pub unsafe fn _mm_mfence() {
mfence()
pub fn _mm_mfence() {
unsafe { mfence() }
}

/// Adds packed 8-bit integers in `a` and `b`.
Expand Down Expand Up @@ -3142,7 +3142,7 @@ mod tests {

#[test]
fn test_mm_pause() {
unsafe { _mm_pause() }
_mm_pause()
}

#[simd_test(enable = "sse2")]
Expand Down
Loading