]> git.lizzy.rs Git - rust.git/blob - src/test/assembly/asm/msp430-types.rs
6cfb86e276e2306bd93fd8a344b19edc9c25f544
[rust.git] / src / test / assembly / asm / msp430-types.rs
1 // min-llvm-version: 13.0
2 // assembly-output: emit-asm
3 // compile-flags: --target msp430-none-elf
4 // needs-llvm-components: msp430
5
6 #![feature(no_core, lang_items, rustc_attrs, asm_sym, asm_experimental_arch, asm_const)]
7 #![crate_type = "rlib"]
8 #![no_core]
9 #![allow(non_camel_case_types)]
10
11 #[rustc_builtin_macro]
12 macro_rules! asm {
13     () => {};
14 }
15 #[rustc_builtin_macro]
16 macro_rules! concat {
17     () => {};
18 }
19
20 #[lang = "sized"]
21 trait Sized {}
22 #[lang = "copy"]
23 trait Copy {}
24
25 type ptr = *const i16;
26
27 impl Copy for i8 {}
28 impl Copy for i16 {}
29 impl Copy for i32 {}
30 impl Copy for i64 {}
31 impl Copy for ptr {}
32
33 macro_rules! check {
34     ($func:ident $ty:ident $class:ident) => {
35         #[no_mangle]
36         pub unsafe fn $func(x: $ty) -> $ty {
37             let y;
38             asm!("mov {}, {}", lateout($class) y, in($class) x);
39             y
40         }
41     };
42 }
43
44 macro_rules! checkb {
45     ($func:ident $ty:ident $class:ident) => {
46         #[no_mangle]
47         pub unsafe fn $func(x: $ty) -> $ty {
48             let y;
49             asm!("mov.b {}, {}", lateout($class) y, in($class) x);
50             y
51         }
52     };
53 }
54
55 macro_rules! check_reg {
56     ($func:ident $ty:ident $reg:tt) => {
57         #[no_mangle]
58         pub unsafe fn $func(x: $ty) -> $ty {
59             let y;
60             asm!(concat!("mov ", $reg, ", ", $reg), lateout($reg) y, in($reg) x);
61             y
62         }
63     };
64 }
65
66 macro_rules! check_regb {
67     ($func:ident $ty:ident $reg:tt) => {
68         #[no_mangle]
69         pub unsafe fn $func(x: $ty) -> $ty {
70             let y;
71             asm!(concat!("mov.b ", $reg, ", ", $reg), lateout($reg) y, in($reg) x);
72             y
73         }
74     };
75 }
76
77 extern "C" {
78     fn extern_func();
79     static extern_static: i8;
80 }
81
82 // CHECK-LABEL: sym_fn
83 // CHECK: ;APP
84 // CHECK: call extern_func
85 // CHECK: ;NO_APP
86 #[no_mangle]
87 pub unsafe fn sym_fn() {
88     asm!("call {}", sym extern_func);
89 }
90
91 // CHECK-LABEL: sym_static
92 // CHECK: ;APP
93 // CHECK: mov.b extern_static, r{{[0-9]+}}
94 // CHECK: ;NO_APP
95 #[no_mangle]
96 pub unsafe fn sym_static() -> i8 {
97     let y;
98     asm!("mov.b {1}, {0}", lateout(reg) y, sym extern_static);
99     y
100 }
101
102 // CHECK-LABEL: add_const:
103 // CHECK: ;APP
104 // CHECK: add.b #5, r{{[0-9]+}}
105 // CHECK: ;NO_APP
106 #[no_mangle]
107 pub unsafe fn add_const() -> i8 {
108     let y;
109     asm!("add.b #{number}, {}", out(reg) y, number = const 5);
110     y
111 }
112
113 // CHECK-LABEL: mov_postincrement:
114 // CHECK: ;APP
115 // CHECK: mov @r5+, r{{[0-9]+}}
116 // CHECK: ;NO_APP
117 #[no_mangle]
118 pub unsafe fn mov_postincrement(mut x: *const i16) -> (i16, *const i16) {
119     let y;
120     asm!("mov @r5+, {0}", out(reg) y, inlateout("r5") x);
121     (y, x)
122 }
123
124 // CHECK-LABEL: reg_i8:
125 // CHECK: ;APP
126 // CHECK: mov r{{[0-9]+}}, r{{[0-9]+}}
127 // CHECK: ;NO_APP
128 check!(reg_i8 i8 reg);
129
130 // CHECK-LABEL: reg_i16:
131 // CHECK: ;APP
132 // CHECK: mov r{{[0-9]+}}, r{{[0-9]+}}
133 // CHECK: ;NO_APP
134 check!(reg_i16 i16 reg);
135
136 // CHECK-LABEL: reg_i8b:
137 // CHECK: ;APP
138 // CHECK: mov.b r{{[0-9]+}}, r{{[0-9]+}}
139 // CHECK: ;NO_APP
140 checkb!(reg_i8b i8 reg);
141
142 // CHECK-LABEL: r5_i8:
143 // CHECK: ;APP
144 // CHECK: mov r5, r5
145 // CHECK: ;NO_APP
146 check_reg!(r5_i8 i8 "r5");
147
148 // CHECK-LABEL: r5_i16:
149 // CHECK: ;APP
150 // CHECK: mov r5, r5
151 // CHECK: ;NO_APP
152 check_reg!(r5_i16 i16 "r5");
153
154 // CHECK-LABEL: r5_i8b:
155 // CHECK: ;APP
156 // CHECK: mov.b r5, r5
157 // CHECK: ;NO_APP
158 check_regb!(r5_i8b i8 "r5");