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, TyAndLayout, TyAndLayoutMethods}
;
7 fn classify_ret
<'a
, Ty
, C
>(ret
: &mut ArgAbi
<'_
, Ty
>)
9 Ty
: TyAndLayoutMethods
<'a
, C
>,
10 C
: LayoutOf
<Ty
= Ty
> + HasDataLayout
,
12 if !ret
.layout
.is_aggregate() && ret
.layout
.size
.bits() <= 64 {
13 ret
.extend_integer_width_to(64);
19 fn is_single_fp_element
<'a
, Ty
, C
>(cx
: &C
, layout
: TyAndLayout
<'a
, Ty
>) -> bool
21 Ty
: TyAndLayoutMethods
<'a
, C
>,
22 C
: LayoutOf
<Ty
= Ty
, TyAndLayout
= TyAndLayout
<'a
, Ty
>> + HasDataLayout
,
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))
37 fn classify_arg
<'a
, Ty
, C
>(cx
: &C
, arg
: &mut ArgAbi
<'a
, Ty
>)
39 Ty
: TyAndLayoutMethods
<'a
, C
> + Copy
,
40 C
: LayoutOf
<Ty
= Ty
, TyAndLayout
= TyAndLayout
<'a
, Ty
>> + HasDataLayout
,
42 if !arg
.layout
.is_aggregate() && arg
.layout
.size
.bits() <= 64 {
43 arg
.extend_integer_width_to(64);
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(),
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(),
64 pub fn compute_abi_info
<'a
, Ty
, C
>(cx
: &C
, fn_abi
: &mut FnAbi
<'a
, Ty
>)
66 Ty
: TyAndLayoutMethods
<'a
, C
> + Copy
,
67 C
: LayoutOf
<Ty
= Ty
, TyAndLayout
= TyAndLayout
<'a
, Ty
>> + HasDataLayout
,
69 if !fn_abi
.ret
.is_ignore() {
70 classify_ret(&mut fn_abi
.ret
);
73 for arg
in &mut fn_abi
.args
{
77 classify_arg(cx
, arg
);