I came across the following code, while studying how to create the RegisterInfo.td
file for a custom backend:
First, a register type is declared
multiclass MOSReg8<bits<16> num, string name> {
def LSB : MOSReg<!add(num, 1), name#"LSB">;
def NAME : MOSReg<num, name> {
let SubRegs = [!cast<Register>(NAME#LSB)];
let SubRegIndices = [sublsb];
}
}
Using the above class, register instances are defined
defm A : MOSReg8<0, "a">;
defm X : MOSReg8<2, "x">;
Later, a RegisterClass is declared
class MOSRegClass<list<ValueType> regTypes, int alignment, dag regList>
: RegisterClass<"MOS", regTypes, alignment, regList>;
class MOSReg8Class<dag RegList>: MOSRegClass<[i8], 8, RegList>;
Using this class, what exactly did we do here
// Single register classes.
let isPressureFineGrained = true in {
def Ac : MOSReg8Class<(add A)>;
def Xc : MOSReg8Class<(add X)>;
}
So, I have two questions:
- Why did we perform two
def
/defms
, if register was defined asA
, what isAc
? - What is the meaning of
add A
in thedef
ofAc
? To which parameter does this argument map to?