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