]> git.lizzy.rs Git - rust.git/blob - src/test/assembly/asm/s390x-types.rs
Pin panic-in-drop=abort test to old pass manager
[rust.git] / src / test / assembly / asm / s390x-types.rs
1 // min-llvm-version: 10.0.1
2 // revisions: s390x
3 // assembly-output: emit-asm
4 //[s390x] compile-flags: --target s390x-unknown-linux-gnu
5 //[s390x] needs-llvm-components: systemz
6
7 #![feature(no_core, lang_items, rustc_attrs, repr_simd)]
8 #![crate_type = "rlib"]
9 #![no_core]
10 #![allow(asm_sub_register, non_camel_case_types)]
11
12 #[rustc_builtin_macro]
13 macro_rules! asm {
14     () => {};
15 }
16 #[rustc_builtin_macro]
17 macro_rules! concat {
18     () => {};
19 }
20 #[rustc_builtin_macro]
21 macro_rules! stringify {
22     () => {};
23 }
24
25 #[lang = "sized"]
26 trait Sized {}
27 #[lang = "copy"]
28 trait Copy {}
29
30 type ptr = *const i32;
31
32 impl Copy for i8 {}
33 impl Copy for u8 {}
34 impl Copy for i16 {}
35 impl Copy for i32 {}
36 impl Copy for i64 {}
37 impl Copy for f32 {}
38 impl Copy for f64 {}
39 impl Copy for ptr {}
40
41 extern "C" {
42     fn extern_func();
43     static extern_static: u8;
44 }
45
46 // Hack to avoid function merging
47 extern "Rust" {
48     fn dont_merge(s: &str);
49 }
50
51 macro_rules! check { ($func:ident, $ty:ty, $class:ident, $mov:literal) => {
52     #[no_mangle]
53     pub unsafe fn $func(x: $ty) -> $ty {
54         dont_merge(stringify!($func));
55
56         let y;
57         asm!(concat!($mov," {}, {}"), out($class) y, in($class) x);
58         y
59     }
60 };}
61
62 macro_rules! check_reg { ($func:ident, $ty:ty, $reg:tt, $mov:literal) => {
63     #[no_mangle]
64     pub unsafe fn $func(x: $ty) -> $ty {
65         dont_merge(stringify!($func));
66
67         let y;
68         asm!(concat!($mov, " %", $reg, ", %", $reg), lateout($reg) y, in($reg) x);
69         y
70     }
71 };}
72
73 // CHECK-LABEL: sym_fn_32:
74 // CHECK: #APP
75 // CHECK: brasl %r14, extern_func
76 // CHECK: #NO_APP
77 #[cfg(s390x)]
78 #[no_mangle]
79 pub unsafe fn sym_fn_32() {
80     asm!("brasl %r14, {}", sym extern_func);
81 }
82
83 // CHECK-LABEL: sym_static:
84 // CHECK: #APP
85 // CHECK: brasl %r14, extern_static
86 // CHECK: #NO_APP
87 #[no_mangle]
88 pub unsafe fn sym_static() {
89     asm!("brasl %r14, {}", sym extern_static);
90 }
91
92 // CHECK-LABEL: reg_i8:
93 // CHECK: #APP
94 // CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
95 // CHECK: #NO_APP
96 check!(reg_i8, i8, reg, "lgr");
97
98 // CHECK-LABEL: reg_i16:
99 // CHECK: #APP
100 // CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
101 // CHECK: #NO_APP
102 check!(reg_i16, i16, reg, "lgr");
103
104 // CHECK-LABEL: reg_i32:
105 // CHECK: #APP
106 // CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
107 // CHECK: #NO_APP
108 check!(reg_i32, i32, reg, "lgr");
109
110 // CHECK-LABEL: reg_i64:
111 // CHECK: #APP
112 // CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
113 // CHECK: #NO_APP
114 check!(reg_i64, i64, reg, "lgr");
115
116 // CHECK-LABEL: reg_f32:
117 // CHECK: #APP
118 // CHECK: ler %f{{[0-9]+}}, %f{{[0-9]+}}
119 // CHECK: #NO_APP
120 check!(reg_f32, f32, freg, "ler");
121
122 // CHECK-LABEL: reg_f64:
123 // CHECK: #APP
124 // CHECK: ldr %f{{[0-9]+}}, %f{{[0-9]+}}
125 // CHECK: #NO_APP
126 check!(reg_f64, f64, freg, "ldr");
127
128 // CHECK-LABEL: reg_ptr:
129 // CHECK: #APP
130 // CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
131 // CHECK: #NO_APP
132 check!(reg_ptr, ptr, reg, "lgr");
133
134 // CHECK-LABEL: r0_i8:
135 // CHECK: #APP
136 // CHECK: lr %r0, %r0
137 // CHECK: #NO_APP
138 check_reg!(r0_i8, i8, "r0", "lr");
139
140 // CHECK-LABEL: r0_i16:
141 // CHECK: #APP
142 // CHECK: lr %r0, %r0
143 // CHECK: #NO_APP
144 check_reg!(r0_i16, i16, "r0", "lr");
145
146 // CHECK-LABEL: r0_i32:
147 // CHECK: #APP
148 // CHECK: lr %r0, %r0
149 // CHECK: #NO_APP
150 check_reg!(r0_i32, i32, "r0", "lr");
151
152 // CHECK-LABEL: r0_i64:
153 // CHECK: #APP
154 // CHECK: lr %r0, %r0
155 // CHECK: #NO_APP
156 check_reg!(r0_i64, i64, "r0", "lr");
157
158 // CHECK-LABEL: f0_f32:
159 // CHECK: #APP
160 // CHECK: ler %f0, %f0
161 // CHECK: #NO_APP
162 check_reg!(f0_f32, f32, "f0", "ler");
163
164 // CHECK-LABEL: f0_f64:
165 // CHECK: #APP
166 // CHECK: ldr %f0, %f0
167 // CHECK: #NO_APP
168 check_reg!(f0_f64, f64, "f0", "ldr");