aeabi_memcpy.rs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #![cfg(all(target_arch = "arm",
  2. not(any(target_env = "gnu", target_env = "musl")),
  3. target_os = "linux",
  4. feature = "mem"))]
  5. #![feature(compiler_builtins_lib)]
  6. #![no_std]
  7. extern crate compiler_builtins;
  8. // test runner
  9. extern crate utest_cortex_m_qemu;
  10. // overrides `panic!`
  11. #[macro_use]
  12. extern crate utest_macros;
  13. macro_rules! panic {
  14. ($($tt:tt)*) => {
  15. upanic!($($tt)*);
  16. };
  17. }
  18. extern "C" {
  19. fn __aeabi_memcpy(dest: *mut u8, src: *const u8, n: usize);
  20. fn __aeabi_memcpy4(dest: *mut u8, src: *const u8, n: usize);
  21. }
  22. struct Aligned {
  23. array: [u8; 8],
  24. _alignment: [u32; 0],
  25. }
  26. impl Aligned {
  27. fn new(array: [u8; 8]) -> Self {
  28. Aligned {
  29. array: array,
  30. _alignment: [],
  31. }
  32. }
  33. }
  34. #[test]
  35. fn memcpy() {
  36. let mut dest = [0; 4];
  37. let src = [0xde, 0xad, 0xbe, 0xef];
  38. for n in 0..dest.len() {
  39. dest.copy_from_slice(&[0; 4]);
  40. unsafe { __aeabi_memcpy(dest.as_mut_ptr(), src.as_ptr(), n) }
  41. assert_eq!(&dest[0..n], &src[0..n])
  42. }
  43. }
  44. #[test]
  45. fn memcpy4() {
  46. let mut aligned = Aligned::new([0; 8]);
  47. let dest = &mut aligned.array;
  48. let src = [0xde, 0xad, 0xbe, 0xef, 0xba, 0xad, 0xf0, 0x0d];
  49. for n in 0..dest.len() {
  50. dest.copy_from_slice(&[0; 8]);
  51. unsafe { __aeabi_memcpy4(dest.as_mut_ptr(), src.as_ptr(), n) }
  52. assert_eq!(&dest[0..n], &src[0..n])
  53. }
  54. }