-
Notifications
You must be signed in to change notification settings - Fork 2
Open
Description
I am working on an extension for aliases to be properly rendered in LLVM.
register S : Index -> BitsX // general purpose register file with stack pointer
[zero : X(31)] // X(31) is the zero register
[regfile renaming]
alias register X = S // general purpose register file with zero register
[regfile renaming]
[half width of : X]
alias register W = S
The annotations above indicate the following behavior:
- If I use resource
Sthen replace it byX - If I use resource
Xand slice it to the half then replace it byW
In the expanded instruction MRS, I write from W(rt) while we also write X(rt). When, I need to
instruction MRS : MoveSystemRegFormat = if sysreg = SysRegEncode::NZCV then
X(rt) := (NZCV_N, NZCV_Z, NZCV_C, NZCV_V) as BitsX << 28
else
if CurrentEL = 0 then
raise GeneralException(ExceptionClass::Uncategorized, 0, PC, 0)
else
match sysreg with
{ SysRegEncode::CurrentEL => X(rt) := CurrentEL as BitsX << 2
, SysRegEncode::SPSel => X(rt) := SPSel as BitsX
, SysRegEncode::ESR_EL1 => X(rt) := ESR_EL1
, SysRegEncode::SPSR_EL1 => X(rt) := SPSR_EL1
, SysRegEncode::SP_EL0 => if SPSel = 0 then
raise GeneralException(ExceptionClass::Uncategorized, 0, PC, 0)
else
X(rt) := SP_EL0
, SysRegEncode::SP_EL1 => if SPSel = 0 then
raise GeneralException(ExceptionClass::Uncategorized, 0, PC, 0)
else
let sp = SP in
{
SP_EL1 := sp
X(rt) := sp
}
, SysRegEncode::ELR_EL1 => X(rt) := ELR_EL1
, SysRegEncode::VBAR_EL1 => X(rt) := VBAR_EL1
, _ => raise GeneralException(ExceptionClass::Uncategorized, 0, PC, 0)
}
def MRS : Instruction
{
let Namespace = "aarch64temp";
let Size = 4;
let CodeSize = 4;
let OutOperandList = ( outs X:$rt, W:$rt );
let InOperandList = ( ins AArch64Base_MRS_sysregAsInt64:$sysreg );
The let OutOperandList = ( outs X:$rt, W:$rt ); is not compilable.
Metadata
Metadata
Assignees
Labels
No labels