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}