macroassembler 1.0.5

A library for writing portable x86-64/riscv64/aarch64 assembly code in Rust
Documentation
use cfg_if::cfg_if;

cfg_if! {
    if #[cfg(target_arch="x86_64")] {

        use crate::assembler::x86assembler::*;
        pub const NUMBER_OF_REGISTERS: usize = 6;
        pub const NUMBER_OF_ARGUMENT_REGISTERS: usize = 8;

        pub const FPREG_T0: u8 = xmm0;
        pub const FPREG_T1: u8 = xmm1;
        pub const FPREG_T2: u8 = xmm2;
        pub const FPREG_T3: u8 = xmm3;
        pub const FPREG_T4: u8 = xmm4;
        pub const FPREG_T5: u8 = xmm5;

        pub const ARGUMENT_FPR0: u8 = xmm0;
        pub const ARGUMENT_FPR1: u8 = xmm1;
        pub const ARGUMENT_FPR2: u8 = xmm2;
        pub const ARGUMENT_FPR3: u8 = xmm3;
        pub const ARGUMENT_FPR4: u8 = xmm4;
        pub const ARGUMENT_FPR5: u8 = xmm5;
        pub const ARGUMENT_FPR6: u8 = xmm6;
        pub const ARGUMENT_FPR7: u8 = xmm7;

        pub const RETURN_VALUE_FPR: u8 = xmm0;

        pub const NON_PRESERVED_NON_ARGUMENT_FPR0: u8 = xmm8;

        pub const fn to_argument_register(i: usize) -> u8 {
            match i {
                0 => ARGUMENT_FPR0,
                1 => ARGUMENT_FPR1,
                2 => ARGUMENT_FPR2,
                3 => ARGUMENT_FPR3,
                4 => ARGUMENT_FPR4,
                5 => ARGUMENT_FPR5,
                6 => ARGUMENT_FPR6,
                7 => ARGUMENT_FPR7,
                _ => panic!("Invalid argument register index"),
            }
        }
    } else if #[cfg(target_arch="riscv64")] {
        use crate::assembler::riscv64assembler::*;

        pub const FPREG_T0: u8 = f10;
        pub const FPREG_T1: u8 = f11;
        pub const FPREG_T2: u8 = f12;
        pub const FPREG_T3: u8 = f13;
        pub const FPREG_T4: u8 = f14;
        pub const FPREG_T5: u8 = f15;
        pub const FPREG_T6: u8 = f16;
        pub const FPREG_T7: u8 = f17;
        pub const FPREG_T8: u8 = f0;
        pub const FPREG_T9: u8 = f1;
        pub const FPREG_T10: u8 = f2;
        pub const FPREG_T11: u8 = f3;
        pub const FPREG_T12: u8 = f4;
        pub const FPREG_T13: u8 = f5;
        pub const FPREG_T14: u8 = f6;
        pub const FPREG_T15: u8 = f7;
        pub const FPREG_T16: u8 = f28;
        pub const FPREG_T17: u8 = f29;

        pub const FPREG_CS0: u8 = f8;
        pub const FPREG_CS1: u8 = f9;
        pub const FPREG_CS2: u8 = f18;
        pub const FPREG_CS3: u8 = f19;
        pub const FPREG_CS4: u8 = f20;
        pub const FPREG_CS5: u8 = f21;
        pub const FPREG_CS6: u8 = f22;
        pub const FPREG_CS7: u8 = f23;
        pub const FPREG_CS8: u8 = f24;
        pub const FPREG_CS9: u8 = f25;
        pub const FPREG_CS10: u8 = f26;
        pub const FPREG_CS11: u8 = f27;

        pub const ARGUMENT_FPR0: u8 = f10;
        pub const ARGUMENT_FPR1: u8 = f11;
        pub const ARGUMENT_FPR2: u8 = f12;
        pub const ARGUMENT_FPR3: u8 = f13;
        pub const ARGUMENT_FPR4: u8 = f14;
        pub const ARGUMENT_FPR5: u8 = f15;
        pub const ARGUMENT_FPR6: u8 = f16;
        pub const ARGUMENT_FPR7: u8 = f17;

        pub const RETURN_VALUE_FPR: u8 = f10;
        pub const NON_PRESERVED_NON_ARGUMENT_FPR0: u8 = f11;

        pub const NUMBER_OF_ARGUMENT_REGISTERS: usize = 8;

        pub const fn to_argument_register(i: usize) -> u8 {
            match i {
                0 => ARGUMENT_FPR0,
                1 => ARGUMENT_FPR1,
                2 => ARGUMENT_FPR2,
                3 => ARGUMENT_FPR3,
                4 => ARGUMENT_FPR4,
                5 => ARGUMENT_FPR5,
                6 => ARGUMENT_FPR6,
                7 => ARGUMENT_FPR7,
                _ => panic!("Invalid argument register index"),
            }
        }
    }
}