]> git.proxmox.com Git - rustc.git/blob - 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
1 use crate::abi::call::{ArgAbi, FnAbi, Reg, Uniform};
2 use crate::abi::{HasDataLayout, Size};
3
4 fn classify_ret<Ty, C>(cx: &C, ret: &mut ArgAbi<'_, Ty>, offset: &mut Size)
5 where
6 C: HasDataLayout,
7 {
8 if !ret.layout.is_aggregate() {
9 ret.extend_integer_width_to(32);
10 } else {
11 ret.make_indirect();
12 *offset += cx.data_layout().pointer_size;
13 }
14 }
15
16 fn classify_arg<Ty, C>(cx: &C, arg: &mut ArgAbi<'_, Ty>, offset: &mut Size)
17 where
18 C: HasDataLayout,
19 {
20 let dl = cx.data_layout();
21 let size = arg.layout.size;
22 let align = arg.layout.align.max(dl.i32_align).min(dl.i64_align).abi;
23
24 if arg.layout.is_aggregate() {
25 arg.cast_to(Uniform { unit: Reg::i32(), total: size });
26 if !offset.is_aligned(align) {
27 arg.pad_with(Reg::i32());
28 }
29 } else {
30 arg.extend_integer_width_to(32);
31 }
32
33 *offset = offset.align_to(align) + size.align_to(align);
34 }
35
36 pub fn compute_abi_info<Ty, C>(cx: &C, fn_abi: &mut FnAbi<'_, Ty>)
37 where
38 C: HasDataLayout,
39 {
40 let mut offset = Size::ZERO;
41 if !fn_abi.ret.is_ignore() {
42 classify_ret(cx, &mut fn_abi.ret, &mut offset);
43 }
44
45 for arg in &mut fn_abi.args {
46 if arg.is_ignore() {
47 continue;
48 }
49 classify_arg(cx, arg, &mut offset);
50 }
51 }