]> git.proxmox.com Git - rustc.git/blame - compiler/rustc_target/src/abi/call/mips.rs
New upstream version 1.56.0~beta.4+dfsg1
[rustc.git] / compiler / rustc_target / src / abi / call / mips.rs
CommitLineData
60c5eb7d 1use crate::abi::call::{ArgAbi, FnAbi, Reg, Uniform};
94222f64 2use crate::abi::{HasDataLayout, Size};
1a4d82fc 3
94222f64 4fn classify_ret<Ty, C>(cx: &C, ret: &mut ArgAbi<'_, Ty>, offset: &mut Size)
dfeec247 5where
94222f64 6 C: HasDataLayout,
83c7162d 7{
cc61c64b 8 if !ret.layout.is_aggregate() {
54a0048b 9 ret.extend_integer_width_to(32);
1a4d82fc 10 } else {
ff7c6d11 11 ret.make_indirect();
83c7162d 12 *offset += cx.data_layout().pointer_size;
1a4d82fc
JJ
13 }
14}
15
94222f64 16fn classify_arg<Ty, C>(cx: &C, arg: &mut ArgAbi<'_, Ty>, offset: &mut Size)
dfeec247 17where
94222f64 18 C: HasDataLayout,
83c7162d
XL
19{
20 let dl = cx.data_layout();
ff7c6d11 21 let size = arg.layout.size;
a1dfa0c6 22 let align = arg.layout.align.max(dl.i32_align).min(dl.i64_align).abi;
1a4d82fc 23
cc61c64b 24 if arg.layout.is_aggregate() {
dfeec247 25 arg.cast_to(Uniform { unit: Reg::i32(), total: size });
a1dfa0c6 26 if !offset.is_aligned(align) {
ff7c6d11 27 arg.pad_with(Reg::i32());
cc61c64b 28 }
1a4d82fc 29 } else {
54a0048b 30 arg.extend_integer_width_to(32);
1a4d82fc 31 }
1a4d82fc 32
a1dfa0c6 33 *offset = offset.align_to(align) + size.align_to(align);
1a4d82fc
JJ
34}
35
94222f64 36pub fn compute_abi_info<Ty, C>(cx: &C, fn_abi: &mut FnAbi<'_, Ty>)
dfeec247 37where
94222f64 38 C: HasDataLayout,
83c7162d 39{
94b46f34 40 let mut offset = Size::ZERO;
60c5eb7d
XL
41 if !fn_abi.ret.is_ignore() {
42 classify_ret(cx, &mut fn_abi.ret, &mut offset);
54a0048b 43 }
1a4d82fc 44
60c5eb7d 45 for arg in &mut fn_abi.args {
dfeec247
XL
46 if arg.is_ignore() {
47 continue;
48 }
60c5eb7d 49 classify_arg(cx, arg, &mut offset);
54a0048b 50 }
1a4d82fc 51}