2020-07-12 23:47:09 -05:00
|
|
|
//@ run-pass
|
2020-07-13 08:44:48 -05:00
|
|
|
|
2020-07-12 23:47:09 -05:00
|
|
|
#![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]]));
|
2020-07-13 00:52:10 -05:00
|
|
|
|
2020-07-12 23:47:09 -05:00
|
|
|
// test unaligned volatile store
|
|
|
|
let ptr = arr[1..].as_ptr() as *mut u16;
|
|
|
|
unaligned_volatile_store(ptr, 0);
|
|
|
|
assert_eq!(arr, [1, 0, 0]);
|
|
|
|
}
|
|
|
|
}
|