]> git.lizzy.rs Git - rust.git/blob - tests/codegen/asm-multiple-options.rs
Auto merge of #107843 - bjorn3:sync_cg_clif-2023-02-09, r=bjorn3
[rust.git] / tests / codegen / asm-multiple-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), options(nomem));
15 }
16
17 pub static mut VAR: i32 = 0;
18 pub static mut DUMMY_OUTPUT: i32 = 0;
19
20 // CHECK-LABEL: @readonly
21 // CHECK: call i32 asm
22 // CHECK: ret i32 1
23 #[no_mangle]
24 pub unsafe fn readonly() -> i32 {
25     VAR = 1;
26     asm!("", out("ax") DUMMY_OUTPUT, options(pure), options(readonly));
27     VAR
28 }
29
30 // CHECK-LABEL: @nomem
31 // CHECK-NOT: store
32 // CHECK: call i32 asm
33 // CHECK: store
34 // CHECK: ret i32 2
35 #[no_mangle]
36 pub unsafe fn nomem() -> i32 {
37     VAR = 1;
38     asm!("", out("ax") DUMMY_OUTPUT, options(pure), options(nomem));
39     VAR = 2;
40     VAR
41 }
42
43 // CHECK-LABEL: @not_nomem
44 // CHECK: store
45 // CHECK: call i32 asm
46 // CHECK: store
47 // CHECK: ret i32 2
48 #[no_mangle]
49 pub unsafe fn not_nomem() -> i32 {
50     VAR = 1;
51     asm!("", out("ax") DUMMY_OUTPUT, options(pure), options(readonly));
52     VAR = 2;
53     VAR
54 }