use crate::core::{
arch_traits::*,
operand::{OperandSignature, RegTraits, RegType},
types::TypeId,
};
use super::operands::{Gp, RISCV32Gp, RISCV64Gp, RISCVFp, RISCVPC, RISCVVec};
#[rustfmt::skip]
const RISCV64_SIGNATURES: [OperandSignature; 32] = [
OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(RISCVPC::SIGNATURE), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(RISCV64Gp::SIGNATURE), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(RISCVFp::SIGNATURE), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(RISCVVec::SIGNATURE), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0),
OperandSignature::new(0),
OperandSignature::new(0),
OperandSignature::new(0),
OperandSignature::new(0),
OperandSignature::new(0),
OperandSignature::new(0),
];
#[rustfmt::skip]
const RISCV32_SIGNATURES: [OperandSignature; 32] = [
OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(RISCVPC::SIGNATURE), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(RISCV32Gp::SIGNATURE), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(RISCVFp::SIGNATURE), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(RISCVVec::SIGNATURE), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0), OperandSignature::new(0),
OperandSignature::new(0),
OperandSignature::new(0),
OperandSignature::new(0),
OperandSignature::new(0),
OperandSignature::new(0),
OperandSignature::new(0),
];
#[rustfmt::skip]
const RISCV64_REG_TYPE_TO_TYPE_ID: [TypeId; 32] = [
TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Int64, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Int64, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Float64, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Int32x4, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Void,
TypeId::Void,
TypeId::Void,
TypeId::Void,
TypeId::Void,
TypeId::Void,
TypeId::Void,
];
#[rustfmt::skip]
const RISCV32_REG_TYPE_TO_TYPE_ID: [TypeId; 32] = [
TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Int64, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Int32, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Float64, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Int32x4, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Void, TypeId::Void,
TypeId::Void,
TypeId::Void,
TypeId::Void,
TypeId::Void,
TypeId::Void,
TypeId::Void,
];
#[rustfmt::skip]
const RISCV64_TYPE_ID_TO_REG_TYPE: [RegType; 32] = [
RegType::Gp64, RegType::Gp64, RegType::Gp64, RegType::Gp64, RegType::Gp64, RegType::Gp64, RegType::Gp64, RegType::Gp64, RegType::Gp64, RegType::Gp64, RegType::Vec64, RegType::Vec64, RegType::None, RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
];
#[rustfmt::skip]
const RISCV32_TYPE_ID_TO_REG_TYPE: [RegType; 32] = [
RegType::Gp32, RegType::Gp32, RegType::Gp32, RegType::Gp32, RegType::Gp32, RegType::Gp32, RegType::Gp32, RegType::Gp32, RegType::None, RegType::None, RegType::Vec64, RegType::Vec64, RegType::None, RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
RegType::None,
];
const MIN_STACK_OFFSET: u32 = 0xFFFFF800;
const MAX_STACK_OFFSET: u32 = 2047;
pub const RISCV64_ARCH_TRAITS: ArchTraits = ArchTraits {
sp_reg_id: Gp::X2 as u8, fp_reg_id: Gp::X8 as u8, link_reg_id: Gp::X1 as u8, ip_reg_id: 0xff,
hw_stack_alignment: 16,
min_stack_offset: MIN_STACK_OFFSET,
max_stack_offset: MAX_STACK_OFFSET,
regs_signature: RISCV64_SIGNATURES,
reg_type_to_type_id: RISCV64_REG_TYPE_TO_TYPE_ID,
type_id_to_reg_type: RISCV64_TYPE_ID_TO_REG_TYPE,
};
pub const RISCV32_ARCH_TRAITS: ArchTraits = ArchTraits {
sp_reg_id: Gp::X2 as u8, fp_reg_id: Gp::X8 as u8, link_reg_id: Gp::X1 as u8, ip_reg_id: 0xff,
hw_stack_alignment: 16,
min_stack_offset: MIN_STACK_OFFSET,
max_stack_offset: MAX_STACK_OFFSET,
regs_signature: RISCV32_SIGNATURES,
reg_type_to_type_id: RISCV32_REG_TYPE_TO_TYPE_ID,
type_id_to_reg_type: RISCV32_TYPE_ID_TO_REG_TYPE,
};