1 // min-llvm-version: 10.0.1
3 // assembly-output: emit-asm
4 //[s390x] compile-flags: --target s390x-unknown-linux-gnu
5 //[s390x] needs-llvm-components: systemz
7 #![feature(no_core, lang_items, rustc_attrs, repr_simd)]
8 #![crate_type = "rlib"]
10 #![allow(asm_sub_register, non_camel_case_types)]
12 #[rustc_builtin_macro]
16 #[rustc_builtin_macro]
20 #[rustc_builtin_macro]
21 macro_rules! stringify {
30 type ptr = *const i32;
43 static extern_static: u8;
46 // Hack to avoid function merging
48 fn dont_merge(s: &str);
51 macro_rules! check { ($func:ident, $ty:ty, $class:ident, $mov:literal) => {
53 pub unsafe fn $func(x: $ty) -> $ty {
54 dont_merge(stringify!($func));
57 asm!(concat!($mov," {}, {}"), out($class) y, in($class) x);
62 macro_rules! check_reg { ($func:ident, $ty:ty, $reg:tt, $mov:literal) => {
64 pub unsafe fn $func(x: $ty) -> $ty {
65 dont_merge(stringify!($func));
68 asm!(concat!($mov, " %", $reg, ", %", $reg), lateout($reg) y, in($reg) x);
73 // CHECK-LABEL: sym_fn_32:
75 // CHECK: brasl %r14, extern_func
79 pub unsafe fn sym_fn_32() {
80 asm!("brasl %r14, {}", sym extern_func);
83 // CHECK-LABEL: sym_static:
85 // CHECK: brasl %r14, extern_static
88 pub unsafe fn sym_static() {
89 asm!("brasl %r14, {}", sym extern_static);
92 // CHECK-LABEL: reg_i8:
94 // CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
96 check!(reg_i8, i8, reg, "lgr");
98 // CHECK-LABEL: reg_i16:
100 // CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
102 check!(reg_i16, i16, reg, "lgr");
104 // CHECK-LABEL: reg_i32:
106 // CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
108 check!(reg_i32, i32, reg, "lgr");
110 // CHECK-LABEL: reg_i64:
112 // CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
114 check!(reg_i64, i64, reg, "lgr");
116 // CHECK-LABEL: reg_f32:
118 // CHECK: ler %f{{[0-9]+}}, %f{{[0-9]+}}
120 check!(reg_f32, f32, freg, "ler");
122 // CHECK-LABEL: reg_f64:
124 // CHECK: ldr %f{{[0-9]+}}, %f{{[0-9]+}}
126 check!(reg_f64, f64, freg, "ldr");
128 // CHECK-LABEL: reg_ptr:
130 // CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
132 check!(reg_ptr, ptr, reg, "lgr");
134 // CHECK-LABEL: r0_i8:
136 // CHECK: lr %r0, %r0
138 check_reg!(r0_i8, i8, "r0", "lr");
140 // CHECK-LABEL: r0_i16:
142 // CHECK: lr %r0, %r0
144 check_reg!(r0_i16, i16, "r0", "lr");
146 // CHECK-LABEL: r0_i32:
148 // CHECK: lr %r0, %r0
150 check_reg!(r0_i32, i32, "r0", "lr");
152 // CHECK-LABEL: r0_i64:
154 // CHECK: lr %r0, %r0
156 check_reg!(r0_i64, i64, "r0", "lr");
158 // CHECK-LABEL: f0_f32:
160 // CHECK: ler %f0, %f0
162 check_reg!(f0_f32, f32, "f0", "ler");
164 // CHECK-LABEL: f0_f64:
166 // CHECK: ldr %f0, %f0
168 check_reg!(f0_f64, f64, "f0", "ldr");