Skip to content

Commit 447fc0f

Browse files
committed
Add test cases for memcpy, memmove and memset for different alignment
1 parent e6fd1b2 commit 447fc0f

File tree

1 file changed

+129
-0
lines changed

1 file changed

+129
-0
lines changed

testcrate/tests/mem.rs

+129
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
extern crate compiler_builtins;
22
use compiler_builtins::mem::{memcmp, memcpy, memmove, memset};
33

4+
const WORD_SIZE: usize = core::mem::size_of::<usize>();
5+
46
#[test]
57
fn memcpy_3() {
68
let mut arr: [u8; 12] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
@@ -131,3 +133,130 @@ fn memcmp_ne() {
131133
assert!(memcmp(arr2.as_ptr(), arr1.as_ptr(), 8) > 0);
132134
}
133135
}
136+
137+
#[derive(Clone, Copy)]
138+
struct AlignedStorage<const N: usize>([u8; N], [usize; 0]);
139+
140+
fn gen_arr<const N: usize>() -> AlignedStorage<N> {
141+
let mut ret = AlignedStorage::<N>([0; N], []);
142+
for i in 0..N {
143+
ret.0[i] = i as u8;
144+
}
145+
ret
146+
}
147+
148+
#[test]
149+
fn memmove_forward_misaligned_nonaligned_start() {
150+
let mut arr = gen_arr::<32>();
151+
let mut reference = arr;
152+
unsafe {
153+
let src = arr.0.as_ptr().offset(6);
154+
let dst = arr.0.as_mut_ptr().offset(3);
155+
assert_eq!(memmove(dst, src, 17), dst);
156+
reference.0.copy_within(6..6 + 17, 3);
157+
assert_eq!(arr.0, reference.0);
158+
}
159+
}
160+
161+
#[test]
162+
fn memmove_forward_misaligned_aligned_start() {
163+
let mut arr = gen_arr::<32>();
164+
let mut reference = arr;
165+
unsafe {
166+
let src = arr.0.as_ptr().offset(6);
167+
let dst = arr.0.as_mut_ptr().add(0);
168+
assert_eq!(memmove(dst, src, 17), dst);
169+
reference.0.copy_within(6..6 + 17, 0);
170+
assert_eq!(arr.0, reference.0);
171+
}
172+
}
173+
174+
#[test]
175+
fn memmove_forward_aligned() {
176+
let mut arr = gen_arr::<32>();
177+
let mut reference = arr;
178+
unsafe {
179+
let src = arr.0.as_ptr().add(3 + WORD_SIZE);
180+
let dst = arr.0.as_mut_ptr().add(3);
181+
assert_eq!(memmove(dst, src, 17), dst);
182+
reference
183+
.0
184+
.copy_within(3 + WORD_SIZE..3 + WORD_SIZE + 17, 3);
185+
assert_eq!(arr.0, reference.0);
186+
}
187+
}
188+
189+
#[test]
190+
fn memmove_backward_misaligned_nonaligned_start() {
191+
let mut arr = gen_arr::<32>();
192+
let mut reference = arr;
193+
unsafe {
194+
let src = arr.0.as_ptr().offset(3);
195+
let dst = arr.0.as_mut_ptr().offset(6);
196+
assert_eq!(memmove(dst, src, 17), dst);
197+
reference.0.copy_within(3..3 + 17, 6);
198+
assert_eq!(arr.0, reference.0);
199+
}
200+
}
201+
202+
#[test]
203+
fn memmove_backward_misaligned_aligned_start() {
204+
let mut arr = gen_arr::<32>();
205+
let mut reference = arr;
206+
unsafe {
207+
let src = arr.0.as_ptr().offset(3);
208+
let dst = arr.0.as_mut_ptr().add(WORD_SIZE);
209+
assert_eq!(memmove(dst, src, 17), dst);
210+
reference.0.copy_within(3..3 + 17, WORD_SIZE);
211+
assert_eq!(arr.0, reference.0);
212+
}
213+
}
214+
215+
#[test]
216+
fn memmove_backward_aligned() {
217+
let mut arr = gen_arr::<32>();
218+
let mut reference = arr;
219+
unsafe {
220+
let src = arr.0.as_ptr().add(3);
221+
let dst = arr.0.as_mut_ptr().add(3 + WORD_SIZE);
222+
assert_eq!(memmove(dst, src, 17), dst);
223+
reference.0.copy_within(3..3 + 17, 3 + WORD_SIZE);
224+
assert_eq!(arr.0, reference.0);
225+
}
226+
}
227+
228+
#[test]
229+
fn memset_backward_misaligned_nonaligned_start() {
230+
let mut arr = gen_arr::<32>();
231+
let mut reference = arr;
232+
unsafe {
233+
let ptr = arr.0.as_mut_ptr().offset(6);
234+
assert_eq!(memset(ptr, 0xCC, 17), ptr);
235+
core::ptr::write_bytes(reference.0.as_mut_ptr().add(6), 0xCC, 17);
236+
assert_eq!(arr.0, reference.0);
237+
}
238+
}
239+
240+
#[test]
241+
fn memset_backward_misaligned_aligned_start() {
242+
let mut arr = gen_arr::<32>();
243+
let mut reference = arr;
244+
unsafe {
245+
let ptr = arr.0.as_mut_ptr().add(WORD_SIZE);
246+
assert_eq!(memset(ptr, 0xCC, 17), ptr);
247+
core::ptr::write_bytes(reference.0.as_mut_ptr().add(WORD_SIZE), 0xCC, 17);
248+
assert_eq!(arr.0, reference.0);
249+
}
250+
}
251+
252+
#[test]
253+
fn memset_backward_aligned() {
254+
let mut arr = gen_arr::<32>();
255+
let mut reference = arr;
256+
unsafe {
257+
let ptr = arr.0.as_mut_ptr().add(3 + WORD_SIZE);
258+
assert_eq!(memset(ptr, 0xCC, 17), ptr);
259+
core::ptr::write_bytes(reference.0.as_mut_ptr().add(3 + WORD_SIZE), 0xCC, 17);
260+
assert_eq!(arr.0, reference.0);
261+
}
262+
}

0 commit comments

Comments
 (0)