]> git.lizzy.rs Git - rust.git/blob - tests/codegen/asm-options.rs
Rollup merge of #106427 - mejrs:translation_errors, r=davidtwco
[rust.git] / tests / codegen / asm-options.rs
1 // compile-flags: -O
2 // only-x86_64
3
4 #![crate_type = "rlib"]
5
6 use std::arch::asm;
7
8 // CHECK-LABEL: @pure
9 // CHECK-NOT: asm
10 // CHECK: ret void
11 #[no_mangle]
12 pub unsafe fn pure(x: i32) {
13     let y: i32;
14     asm!("", out("ax") y, in("cx") x, options(pure, nomem));
15 }
16
17 // CHECK-LABEL: @noreturn
18 // CHECK: call void asm
19 // CHECK-NEXT: unreachable
20 #[no_mangle]
21 pub unsafe fn noreturn() {
22     asm!("", options(noreturn));
23 }
24
25 pub static mut VAR: i32 = 0;
26 pub static mut DUMMY_OUTPUT: i32 = 0;
27
28 // CHECK-LABEL: @readonly
29 // CHECK: call i32 asm
30 // CHECK: ret i32 1
31 #[no_mangle]
32 pub unsafe fn readonly() -> i32 {
33     VAR = 1;
34     asm!("", out("ax") DUMMY_OUTPUT, options(pure, readonly));
35     VAR
36 }
37
38 // CHECK-LABEL: @not_readonly
39 // CHECK: call i32 asm
40 // CHECK: ret i32 %
41 #[no_mangle]
42 pub unsafe fn not_readonly() -> i32 {
43     VAR = 1;
44     asm!("", out("ax") DUMMY_OUTPUT, options());
45     VAR
46 }
47
48 // CHECK-LABEL: @nomem
49 // CHECK-NOT: store
50 // CHECK: call i32 asm
51 // CHECK: store
52 // CHECK: ret i32 2
53 #[no_mangle]
54 pub unsafe fn nomem() -> i32 {
55     VAR = 1;
56     asm!("", out("ax") DUMMY_OUTPUT, options(pure, nomem));
57     VAR = 2;
58     VAR
59 }
60
61 // CHECK-LABEL: @nomem_nopure
62 // CHECK-NOT: store
63 // CHECK: call i32 asm
64 // CHECK: store
65 // CHECK: ret i32 2
66 #[no_mangle]
67 pub unsafe fn nomem_nopure() -> i32 {
68     VAR = 1;
69     asm!("", out("ax") DUMMY_OUTPUT, options(nomem));
70     VAR = 2;
71     VAR
72 }
73
74 // CHECK-LABEL: @not_nomem
75 // CHECK: store
76 // CHECK: call i32 asm
77 // CHECK: store
78 // CHECK: ret i32 2
79 #[no_mangle]
80 pub unsafe fn not_nomem() -> i32 {
81     VAR = 1;
82     asm!("", out("ax") DUMMY_OUTPUT, options(pure, readonly));
83     VAR = 2;
84     VAR
85 }
86
87 // CHECK-LABEL: @dont_remove_nonpure
88 // CHECK: call void asm
89 // CHECK: call void asm
90 // CHECK: call void asm
91 // CHECK: ret void
92 #[no_mangle]
93 pub unsafe fn dont_remove_nonpure() {
94     asm!("", options());
95     asm!("", options(nomem));
96     asm!("", options(readonly));
97 }
98
99 // CHECK-LABEL: @raw
100 // CHECK: call void asm sideeffect inteldialect "{} {}", ""()
101 #[no_mangle]
102 pub unsafe fn raw() {
103     asm!("{} {}", options(nostack, nomem, preserves_flags, raw));
104 }