rustc_abi/callconv/
reg.rs

1#[cfg(feature = "nightly")]
2use rustc_macros::HashStable_Generic;
3
4use crate::{Align, HasDataLayout, Size};
5
6#[cfg_attr(feature = "nightly", derive(HashStable_Generic))]
7#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
8pub enum RegKind {
9    Integer,
10    Float,
11    Vector,
12}
13
14#[cfg_attr(feature = "nightly", derive(HashStable_Generic))]
15#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
16pub struct Reg {
17    pub kind: RegKind,
18    pub size: Size,
19}
20
21macro_rules! reg_ctor {
22    ($name:ident, $kind:ident, $bits:expr) => {
23        pub fn $name() -> Reg {
24            Reg { kind: RegKind::$kind, size: Size::from_bits($bits) }
25        }
26    };
27}
28
29impl Reg {
30    reg_ctor!(i8, Integer, 8);
31    reg_ctor!(i16, Integer, 16);
32    reg_ctor!(i32, Integer, 32);
33    reg_ctor!(i64, Integer, 64);
34    reg_ctor!(i128, Integer, 128);
35
36    reg_ctor!(f32, Float, 32);
37    reg_ctor!(f64, Float, 64);
38}
39
40impl Reg {
41    pub fn align<C: HasDataLayout>(&self, cx: &C) -> Align {
42        let dl = cx.data_layout();
43        match self.kind {
44            RegKind::Integer => match self.size.bits() {
45                1 => dl.i1_align.abi,
46                2..=8 => dl.i8_align.abi,
47                9..=16 => dl.i16_align.abi,
48                17..=32 => dl.i32_align.abi,
49                33..=64 => dl.i64_align.abi,
50                65..=128 => dl.i128_align.abi,
51                _ => panic!("unsupported integer: {self:?}"),
52            },
53            RegKind::Float => match self.size.bits() {
54                16 => dl.f16_align.abi,
55                32 => dl.f32_align.abi,
56                64 => dl.f64_align.abi,
57                128 => dl.f128_align.abi,
58                _ => panic!("unsupported float: {self:?}"),
59            },
60            RegKind::Vector => dl.llvmlike_vector_align(self.size).abi,
61        }
62    }
63}