]> git.lizzy.rs Git - rust.git/blob - src/test/assembly/asm/powerpc-types.rs
Rollup merge of #95346 - Aaron1011:stablize-const-extern-fn, r=pnkfelix
[rust.git] / src / test / assembly / asm / powerpc-types.rs
1 // min-llvm-version: 12.0.1
2 // revisions: powerpc powerpc64
3 // assembly-output: emit-asm
4 //[powerpc] compile-flags: --target powerpc-unknown-linux-gnu
5 //[powerpc] needs-llvm-components: powerpc
6 //[powerpc64] compile-flags: --target powerpc64-unknown-linux-gnu
7 //[powerpc64] needs-llvm-components: powerpc
8
9 #![feature(no_core, lang_items, rustc_attrs, repr_simd, asm_sym, asm_experimental_arch)]
10 #![crate_type = "rlib"]
11 #![no_core]
12 #![allow(asm_sub_register, non_camel_case_types)]
13
14 #[rustc_builtin_macro]
15 macro_rules! asm {
16     () => {};
17 }
18 #[rustc_builtin_macro]
19 macro_rules! concat {
20     () => {};
21 }
22 #[rustc_builtin_macro]
23 macro_rules! stringify {
24     () => {};
25 }
26
27 #[lang = "sized"]
28 trait Sized {}
29 #[lang = "copy"]
30 trait Copy {}
31
32 type ptr = *const i32;
33
34 impl Copy for i8 {}
35 impl Copy for u8 {}
36 impl Copy for i16 {}
37 impl Copy for i32 {}
38 impl Copy for i64 {}
39 impl Copy for f32 {}
40 impl Copy for f64 {}
41 impl Copy for ptr {}
42 extern "C" {
43     fn extern_func();
44     static extern_static: u8;
45 }
46
47 // Hack to avoid function merging
48 extern "Rust" {
49     fn dont_merge(s: &str);
50 }
51
52 macro_rules! check { ($func:ident, $ty:ty, $class:ident, $mov:literal) => {
53     #[no_mangle]
54     pub unsafe fn $func(x: $ty) -> $ty {
55         dont_merge(stringify!($func));
56
57         let y;
58         asm!(concat!($mov," {}, {}"), out($class) y, in($class) x);
59         y
60     }
61 };}
62
63 macro_rules! check_reg { ($func:ident, $ty:ty, $rego:tt, $regc:tt, $mov:literal) => {
64     #[no_mangle]
65     pub unsafe fn $func(x: $ty) -> $ty {
66         dont_merge(stringify!($func));
67
68         let y;
69         asm!(concat!($mov, " ", $rego, ", ", $rego), lateout($regc) y, in($regc) x);
70         y
71     }
72 };}
73
74 // CHECK-LABEL: reg_i8:
75 // CHECK: #APP
76 // CHECK: mr {{[0-9]+}}, {{[0-9]+}}
77 // CHECK: #NO_APP
78 check!(reg_i8, i8, reg, "mr");
79
80 // CHECK-LABEL: reg_i16:
81 // CHECK: #APP
82 // CHECK: mr {{[0-9]+}}, {{[0-9]+}}
83 // CHECK: #NO_APP
84 check!(reg_i16, i16, reg, "mr");
85
86 // CHECK-LABEL: reg_i32:
87 // CHECK: #APP
88 // CHECK: mr {{[0-9]+}}, {{[0-9]+}}
89 // CHECK: #NO_APP
90 check!(reg_i32, i32, reg, "mr");
91
92 // powerpc64-LABEL: reg_i64:
93 // powerpc64: #APP
94 // powerpc64: mr {{[0-9]+}}, {{[0-9]+}}
95 // powerpc64: #NO_APP
96 #[cfg(powerpc64)]
97 check!(reg_i64, i64, reg, "mr");
98
99 // CHECK-LABEL: reg_i8_nz:
100 // CHECK: #APP
101 // CHECK: mr {{[0-9]+}}, {{[0-9]+}}
102 // CHECK: #NO_APP
103 check!(reg_i8_nz, i8, reg_nonzero, "mr");
104
105 // CHECK-LABEL: reg_i16_nz:
106 // CHECK: #APP
107 // CHECK: mr {{[0-9]+}}, {{[0-9]+}}
108 // CHECK: #NO_APP
109 check!(reg_i16_nz, i16, reg_nonzero, "mr");
110
111 // CHECK-LABEL: reg_i32_nz:
112 // CHECK: #APP
113 // CHECK: mr {{[0-9]+}}, {{[0-9]+}}
114 // CHECK: #NO_APP
115 check!(reg_i32_nz, i32, reg_nonzero, "mr");
116
117 // powerpc64-LABEL: reg_i64_nz:
118 // powerpc64: #APP
119 // powerpc64: mr {{[0-9]+}}, {{[0-9]+}}
120 // powerpc64: #NO_APP
121 #[cfg(powerpc64)]
122 check!(reg_i64_nz, i64, reg_nonzero, "mr");
123
124 // CHECK-LABEL: reg_f32:
125 // CHECK: #APP
126 // CHECK: fmr {{[0-9]+}}, {{[0-9]+}}
127 // CHECK: #NO_APP
128 check!(reg_f32, f32, freg, "fmr");
129
130 // CHECK-LABEL: reg_f64:
131 // CHECK: #APP
132 // CHECK: fmr {{[0-9]+}}, {{[0-9]+}}
133 // CHECK: #NO_APP
134 check!(reg_f64, f64, freg, "fmr");
135
136 // CHECK-LABEL: reg_i8_r0:
137 // CHECK: #APP
138 // CHECK: mr 0, 0
139 // CHECK: #NO_APP
140 check_reg!(reg_i8_r0, i8, "0", "0", "mr");
141
142 // CHECK-LABEL: reg_i16_r0:
143 // CHECK: #APP
144 // CHECK: mr 0, 0
145 // CHECK: #NO_APP
146 check_reg!(reg_i16_r0, i16, "0", "0", "mr");
147
148 // CHECK-LABEL: reg_i32_r0:
149 // CHECK: #APP
150 // CHECK: mr 0, 0
151 // CHECK: #NO_APP
152 check_reg!(reg_i32_r0, i32, "0", "0", "mr");
153
154 // powerpc64-LABEL: reg_i64_r0:
155 // powerpc64: #APP
156 // powerpc64: mr 0, 0
157 // powerpc64: #NO_APP
158 #[cfg(powerpc64)]
159 check_reg!(reg_i64_r0, i64, "0", "0", "mr");
160
161 // CHECK-LABEL: reg_i8_r18:
162 // CHECK: #APP
163 // CHECK: mr 18, 18
164 // CHECK: #NO_APP
165 check_reg!(reg_i8_r18, i8, "18", "18", "mr");
166
167 // CHECK-LABEL: reg_i16_r18:
168 // CHECK: #APP
169 // CHECK: mr 18, 18
170 // CHECK: #NO_APP
171 check_reg!(reg_i16_r18, i16, "18", "18", "mr");
172
173 // CHECK-LABEL: reg_i32_r18:
174 // CHECK: #APP
175 // CHECK: mr 18, 18
176 // CHECK: #NO_APP
177 check_reg!(reg_i32_r18, i32, "18", "18", "mr");
178
179 // powerpc64-LABEL: reg_i64_r18:
180 // powerpc64: #APP
181 // powerpc64: mr 18, 18
182 // powerpc64: #NO_APP
183 #[cfg(powerpc64)]
184 check_reg!(reg_i64_r18, i64, "18", "18", "mr");
185
186 // CHECK-LABEL: reg_f32_f0:
187 // CHECK: #APP
188 // CHECK: fmr 0, 0
189 // CHECK: #NO_APP
190 check_reg!(reg_f32_f0, f32, "0", "f0", "fmr");
191
192 // CHECK-LABEL: reg_f64_f0:
193 // CHECK: #APP
194 // CHECK: fmr 0, 0
195 // CHECK: #NO_APP
196 check_reg!(reg_f64_f0, f64, "0", "f0", "fmr");
197
198 // CHECK-LABEL: reg_f32_f18:
199 // CHECK: #APP
200 // CHECK: fmr 18, 18
201 // CHECK: #NO_APP
202 check_reg!(reg_f32_f18, f32, "18", "f18", "fmr");
203
204 // CHECK-LABEL: reg_f64_f18:
205 // CHECK: #APP
206 // CHECK: fmr 18, 18
207 // CHECK: #NO_APP
208 check_reg!(reg_f64_f18, f64, "18", "f18", "fmr");