Rollup merge of #74285 - wangtheo:issue-71669, r=lcnr
#71669: add ui, codegen tests for volatile + nearby int intrinsics Added some tests for intrinsics. See https://github.com/rust-lang/rust/issues/71669.
This commit is contained in:
commit
fa4ada1a86
5 changed files with 146 additions and 0 deletions
18
src/test/codegen/intrinsics/nearby.rs
Normal file
18
src/test/codegen/intrinsics/nearby.rs
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
#![crate_type = "lib"]
|
||||
#![feature(core_intrinsics)]
|
||||
|
||||
use std::intrinsics;
|
||||
|
||||
// CHECK-LABEL: @nearbyintf32
|
||||
#[no_mangle]
|
||||
pub unsafe fn nearbyintf32(a: f32) -> f32 {
|
||||
// CHECK: llvm.nearbyint.f32
|
||||
intrinsics::nearbyintf32(a)
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @nearbyintf64
|
||||
#[no_mangle]
|
||||
pub unsafe fn nearbyintf64(a: f64) -> f64 {
|
||||
// CHECK: llvm.nearbyint.f64
|
||||
intrinsics::nearbyintf64(a)
|
||||
}
|
||||
55
src/test/codegen/intrinsics/volatile.rs
Normal file
55
src/test/codegen/intrinsics/volatile.rs
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
// compile-flags: -C no-prepopulate-passes
|
||||
|
||||
#![crate_type = "lib"]
|
||||
#![feature(core_intrinsics)]
|
||||
|
||||
use std::intrinsics;
|
||||
|
||||
// CHECK-LABEL: @volatile_copy_memory
|
||||
#[no_mangle]
|
||||
pub unsafe fn volatile_copy_memory(a: *mut u8, b: *const u8) {
|
||||
// CHECK: llvm.memmove.p0i8.p0i8.{{\w*(.*true)}}
|
||||
intrinsics::volatile_copy_memory(a, b, 1)
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @volatile_copy_nonoverlapping_memory
|
||||
#[no_mangle]
|
||||
pub unsafe fn volatile_copy_nonoverlapping_memory(a: *mut u8, b: *const u8) {
|
||||
// CHECK: llvm.memcpy.p0i8.p0i8.{{\w*(.*true)}}
|
||||
intrinsics::volatile_copy_nonoverlapping_memory(a, b, 1)
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @volatile_set_memory
|
||||
#[no_mangle]
|
||||
pub unsafe fn volatile_set_memory(a: *mut u8, b: u8) {
|
||||
// CHECK: llvm.memset.p0i8.{{\w*(.*true)}}
|
||||
intrinsics::volatile_set_memory(a, b, 1)
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @volatile_load
|
||||
#[no_mangle]
|
||||
pub unsafe fn volatile_load(a: *const u8) -> u8 {
|
||||
// CHECK: load volatile
|
||||
intrinsics::volatile_load(a)
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @volatile_store
|
||||
#[no_mangle]
|
||||
pub unsafe fn volatile_store(a: *mut u8, b: u8) {
|
||||
// CHECK: store volatile
|
||||
intrinsics::volatile_store(a, b)
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @unaligned_volatile_load
|
||||
#[no_mangle]
|
||||
pub unsafe fn unaligned_volatile_load(a: *const u8) -> u8 {
|
||||
// CHECK: load volatile
|
||||
intrinsics::unaligned_volatile_load(a)
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @unaligned_volatile_store
|
||||
#[no_mangle]
|
||||
pub unsafe fn unaligned_volatile_store(a: *mut u8, b: u8) {
|
||||
// CHECK: store volatile
|
||||
intrinsics::unaligned_volatile_store(a, b)
|
||||
}
|
||||
18
src/test/codegen/intrinsics/volatile_order.rs
Normal file
18
src/test/codegen/intrinsics/volatile_order.rs
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
#![crate_type = "lib"]
|
||||
#![feature(core_intrinsics)]
|
||||
|
||||
use std::intrinsics::*;
|
||||
|
||||
pub unsafe fn test_volatile_order() {
|
||||
let mut a: Box<u8> = Box::new(0);
|
||||
// CHECK: load volatile
|
||||
let x = volatile_load(&*a);
|
||||
// CHECK: load volatile
|
||||
let x = volatile_load(&*a);
|
||||
// CHECK: store volatile
|
||||
volatile_store(&mut *a, 12);
|
||||
// CHECK: store volatile
|
||||
unaligned_volatile_store(&mut *a, 12);
|
||||
// CHECK: llvm.memset.p0i8
|
||||
volatile_set_memory(&mut *a, 12, 1)
|
||||
}
|
||||
11
src/test/ui/intrinsics/intrinsic-nearby.rs
Normal file
11
src/test/ui/intrinsics/intrinsic-nearby.rs
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
// run-pass
|
||||
#![feature(core_intrinsics)]
|
||||
|
||||
use std::intrinsics::*;
|
||||
|
||||
fn main() {
|
||||
unsafe {
|
||||
assert_eq!(nearbyintf32(5.234f32), 5f32);
|
||||
assert_eq!(nearbyintf64(6.777f64), 7f64);
|
||||
}
|
||||
}
|
||||
44
src/test/ui/intrinsics/intrinsic-volatile.rs
Normal file
44
src/test/ui/intrinsics/intrinsic-volatile.rs
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
// run-pass
|
||||
|
||||
#![feature(core_intrinsics)]
|
||||
|
||||
use std::intrinsics::*;
|
||||
|
||||
pub fn main() {
|
||||
unsafe {
|
||||
let mut x: Box<u8> = Box::new(0);
|
||||
let mut y: Box<u8> = Box::new(0);
|
||||
|
||||
// test volatile load
|
||||
assert_eq!(volatile_load(&*x), 0);
|
||||
*x = 1;
|
||||
assert_eq!(volatile_load(&*x), 1);
|
||||
|
||||
// test volatile store
|
||||
volatile_store(&mut *x, 2);
|
||||
assert_eq!(*x, 2);
|
||||
|
||||
// test volatile copy memory
|
||||
volatile_copy_memory(&mut *y, &*x, 1);
|
||||
assert_eq!(*y, 2);
|
||||
|
||||
// test volatile copy non-overlapping memory
|
||||
*x = 3;
|
||||
volatile_copy_nonoverlapping_memory(&mut *y, &*x, 1);
|
||||
assert_eq!(*y, 3);
|
||||
|
||||
// test volatile set memory
|
||||
volatile_set_memory(&mut *x, 4, 1);
|
||||
assert_eq!(*x, 4);
|
||||
|
||||
// test unaligned volatile load
|
||||
let arr: [u8; 3] = [1, 2, 3];
|
||||
let ptr = arr[1..].as_ptr() as *const u16;
|
||||
assert_eq!(unaligned_volatile_load(ptr), u16::from_ne_bytes([arr[1], arr[2]]));
|
||||
|
||||
// test unaligned volatile store
|
||||
let ptr = arr[1..].as_ptr() as *mut u16;
|
||||
unaligned_volatile_store(ptr, 0);
|
||||
assert_eq!(arr, [1, 0, 0]);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue