1 // FIXME: The assumes we're using the non-vector ABI, i.e., compiling
2 // for a pre-z13 machine or using -mno-vx.
4 use crate::abi::call::{ArgAbi, FnAbi, Reg};
5 use crate::abi::{self, HasDataLayout, LayoutOf, TyAbiInterface, TyAndLayout};
7 fn classify_ret<Ty>(ret: &mut ArgAbi<'_, Ty>) {
8 if !ret.layout.is_aggregate() && ret.layout.size.bits() <= 64 {
9 ret.extend_integer_width_to(64);
15 fn is_single_fp_element<'a, Ty, C>(cx: &C, layout: TyAndLayout<'a, Ty>) -> bool
17 Ty: TyAbiInterface<'a, C>,
18 C: LayoutOf<'a, Ty = Ty, TyAndLayout = TyAndLayout<'a, Ty>> + HasDataLayout,
21 abi::Abi::Scalar(ref scalar) => scalar.value.is_float(),
22 abi::Abi::Aggregate { .. } => {
23 if layout.fields.count() == 1 && layout.fields.offset(0).bytes() == 0 {
24 is_single_fp_element(cx, layout.field(cx, 0))
33 fn classify_arg<'a, Ty, C>(cx: &C, arg: &mut ArgAbi<'a, Ty>)
35 Ty: TyAbiInterface<'a, C> + Copy,
36 C: LayoutOf<'a, Ty = Ty, TyAndLayout = TyAndLayout<'a, Ty>> + HasDataLayout,
38 if !arg.layout.is_aggregate() && arg.layout.size.bits() <= 64 {
39 arg.extend_integer_width_to(64);
43 if is_single_fp_element(cx, arg.layout) {
44 match arg.layout.size.bytes() {
45 4 => arg.cast_to(Reg::f32()),
46 8 => arg.cast_to(Reg::f64()),
47 _ => arg.make_indirect(),
50 match arg.layout.size.bytes() {
51 1 => arg.cast_to(Reg::i8()),
52 2 => arg.cast_to(Reg::i16()),
53 4 => arg.cast_to(Reg::i32()),
54 8 => arg.cast_to(Reg::i64()),
55 _ => arg.make_indirect(),
60 pub fn compute_abi_info<'a, Ty, C>(cx: &C, fn_abi: &mut FnAbi<'a, Ty>)
62 Ty: TyAbiInterface<'a, C> + Copy,
63 C: LayoutOf<'a, Ty = Ty, TyAndLayout = TyAndLayout<'a, Ty>> + HasDataLayout,
65 if !fn_abi.ret.is_ignore() {
66 classify_ret(&mut fn_abi.ret);
69 for arg in &mut fn_abi.args {
73 classify_arg(cx, arg);