]> git.proxmox.com Git - rustc.git/blob - src/librustc_target/abi/call/s390x.rs
New upstream version 1.47.0+dfsg1
[rustc.git] / src / librustc_target / abi / call / s390x.rs
1 // FIXME: The assumes we're using the non-vector ABI, i.e., compiling
2 // for a pre-z13 machine or using -mno-vx.
3
4 use crate::abi::call::{ArgAbi, FnAbi, Reg};
5 use crate::abi::{self, HasDataLayout, LayoutOf, TyAndLayout, TyAndLayoutMethods};
6
7 fn classify_ret<'a, Ty, C>(ret: &mut ArgAbi<'_, Ty>)
8 where
9 Ty: TyAndLayoutMethods<'a, C>,
10 C: LayoutOf<Ty = Ty> + HasDataLayout,
11 {
12 if !ret.layout.is_aggregate() && ret.layout.size.bits() <= 64 {
13 ret.extend_integer_width_to(64);
14 } else {
15 ret.make_indirect();
16 }
17 }
18
19 fn is_single_fp_element<'a, Ty, C>(cx: &C, layout: TyAndLayout<'a, Ty>) -> bool
20 where
21 Ty: TyAndLayoutMethods<'a, C>,
22 C: LayoutOf<Ty = Ty, TyAndLayout = TyAndLayout<'a, Ty>> + HasDataLayout,
23 {
24 match layout.abi {
25 abi::Abi::Scalar(ref scalar) => scalar.value.is_float(),
26 abi::Abi::Aggregate { .. } => {
27 if layout.fields.count() == 1 && layout.fields.offset(0).bytes() == 0 {
28 is_single_fp_element(cx, layout.field(cx, 0))
29 } else {
30 false
31 }
32 }
33 _ => false,
34 }
35 }
36
37 fn classify_arg<'a, Ty, C>(cx: &C, arg: &mut ArgAbi<'a, Ty>)
38 where
39 Ty: TyAndLayoutMethods<'a, C> + Copy,
40 C: LayoutOf<Ty = Ty, TyAndLayout = TyAndLayout<'a, Ty>> + HasDataLayout,
41 {
42 if !arg.layout.is_aggregate() && arg.layout.size.bits() <= 64 {
43 arg.extend_integer_width_to(64);
44 return;
45 }
46
47 if is_single_fp_element(cx, arg.layout) {
48 match arg.layout.size.bytes() {
49 4 => arg.cast_to(Reg::f32()),
50 8 => arg.cast_to(Reg::f64()),
51 _ => arg.make_indirect(),
52 }
53 } else {
54 match arg.layout.size.bytes() {
55 1 => arg.cast_to(Reg::i8()),
56 2 => arg.cast_to(Reg::i16()),
57 4 => arg.cast_to(Reg::i32()),
58 8 => arg.cast_to(Reg::i64()),
59 _ => arg.make_indirect(),
60 }
61 }
62 }
63
64 pub fn compute_abi_info<'a, Ty, C>(cx: &C, fn_abi: &mut FnAbi<'a, Ty>)
65 where
66 Ty: TyAndLayoutMethods<'a, C> + Copy,
67 C: LayoutOf<Ty = Ty, TyAndLayout = TyAndLayout<'a, Ty>> + HasDataLayout,
68 {
69 if !fn_abi.ret.is_ignore() {
70 classify_ret(&mut fn_abi.ret);
71 }
72
73 for arg in &mut fn_abi.args {
74 if arg.is_ignore() {
75 continue;
76 }
77 classify_arg(cx, arg);
78 }
79 }