]> git.lizzy.rs Git - rust.git/blob - tests/assembly/align_offset.rs
Move /src/test to /tests
[rust.git] / tests / assembly / align_offset.rs
1 // assembly-output: emit-asm
2 // compile-flags: -Copt-level=1
3 // only-x86_64
4 // min-llvm-version: 14.0
5 #![crate_type="rlib"]
6
7 // CHECK-LABEL: align_offset_byte_ptr
8 // CHECK: leaq 31
9 // CHECK: andq $-32
10 // CHECK: subq
11 #[no_mangle]
12 pub fn align_offset_byte_ptr(ptr: *const u8) -> usize {
13     ptr.align_offset(32)
14 }
15
16 // CHECK-LABEL: align_offset_byte_slice
17 // CHECK: leaq 31
18 // CHECK: andq $-32
19 // CHECK: subq
20 #[no_mangle]
21 pub fn align_offset_byte_slice(slice: &[u8]) -> usize {
22     slice.as_ptr().align_offset(32)
23 }
24
25 // CHECK-LABEL: align_offset_word_ptr
26 // CHECK: leaq 31
27 // CHECK: andq $-32
28 // CHECK: subq
29 // CHECK: shrq
30 // This `ptr` is not known to be aligned, so it is required to check if it is at all possible to
31 // align. LLVM applies a simple mask.
32 // CHECK: orq
33 #[no_mangle]
34 pub fn align_offset_word_ptr(ptr: *const u32) -> usize {
35     ptr.align_offset(32)
36 }
37
38 // CHECK-LABEL: align_offset_word_slice
39 // CHECK: leaq 31
40 // CHECK: andq $-32
41 // CHECK: subq
42 // CHECK: shrq
43 // `slice` is known to be aligned, so `!0` is not possible as a return
44 // CHECK-NOT: orq
45 #[no_mangle]
46 pub fn align_offset_word_slice(slice: &[u32]) -> usize {
47     slice.as_ptr().align_offset(32)
48 }