Skip to content

lcb: Problem when reading from the same field with different resources #439

@kper

Description

@kper

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:

  1. If I use resource S then replace it by X
  2. If I use resource X and slice it to the half then replace it by W

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
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions