mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-23 17:29:19 +00:00
[ARM] Mark a bunch of .td Operands with type _MEMORY.
This shouldn't affect anything in-tree, as the OperandType users are mostly smart disassemblers and such; more information is helpful there. However, on the flip side, that + the fact that this is just hinting at the meaning of operands makes this not really test-worthy or testable. Differential Revision: http://reviews.llvm.org/D8620 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234350 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
68e6b651a1
commit
236bac7a87
@ -388,6 +388,9 @@ def fsub_mlx : PatFrag<(ops node:$lhs, node:$rhs),(fsub node:$lhs, node:$rhs),[{
|
|||||||
// Immediate operands with a shared generic asm render method.
|
// Immediate operands with a shared generic asm render method.
|
||||||
class ImmAsmOperand : AsmOperandClass { let RenderMethod = "addImmOperands"; }
|
class ImmAsmOperand : AsmOperandClass { let RenderMethod = "addImmOperands"; }
|
||||||
|
|
||||||
|
// Operands that are part of a memory addressing mode.
|
||||||
|
class MemOperand : Operand<i32> { let OperandType = "OPERAND_MEMORY"; }
|
||||||
|
|
||||||
// Branch target.
|
// Branch target.
|
||||||
// FIXME: rename brtarget to t2_brtarget
|
// FIXME: rename brtarget to t2_brtarget
|
||||||
def brtarget : Operand<OtherVT> {
|
def brtarget : Operand<OtherVT> {
|
||||||
@ -790,7 +793,7 @@ def imm1_16 : Operand<i32>, PatLeaf<(imm), [{ return Imm > 0 && Imm <= 16; }],
|
|||||||
// addrmode_imm12 := reg +/- imm12
|
// addrmode_imm12 := reg +/- imm12
|
||||||
//
|
//
|
||||||
def MemImm12OffsetAsmOperand : AsmOperandClass { let Name = "MemImm12Offset"; }
|
def MemImm12OffsetAsmOperand : AsmOperandClass { let Name = "MemImm12Offset"; }
|
||||||
class AddrMode_Imm12 : Operand<i32>,
|
class AddrMode_Imm12 : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectAddrModeImm12", []> {
|
ComplexPattern<i32, 2, "SelectAddrModeImm12", []> {
|
||||||
// 12-bit immediate operand. Note that instructions using this encode
|
// 12-bit immediate operand. Note that instructions using this encode
|
||||||
// #0 and #-0 differently. We flag #-0 as the magic value INT32_MIN. All other
|
// #0 and #-0 differently. We flag #-0 as the magic value INT32_MIN. All other
|
||||||
@ -813,7 +816,7 @@ def addrmode_imm12_pre : AddrMode_Imm12 {
|
|||||||
// ldst_so_reg := reg +/- reg shop imm
|
// ldst_so_reg := reg +/- reg shop imm
|
||||||
//
|
//
|
||||||
def MemRegOffsetAsmOperand : AsmOperandClass { let Name = "MemRegOffset"; }
|
def MemRegOffsetAsmOperand : AsmOperandClass { let Name = "MemRegOffset"; }
|
||||||
def ldst_so_reg : Operand<i32>,
|
def ldst_so_reg : MemOperand,
|
||||||
ComplexPattern<i32, 3, "SelectLdStSOReg", []> {
|
ComplexPattern<i32, 3, "SelectLdStSOReg", []> {
|
||||||
let EncoderMethod = "getLdStSORegOpValue";
|
let EncoderMethod = "getLdStSORegOpValue";
|
||||||
// FIXME: Simplify the printer
|
// FIXME: Simplify the printer
|
||||||
@ -829,7 +832,7 @@ def ldst_so_reg : Operand<i32>,
|
|||||||
// {8} 1 is imm8 is non-negative. 0 otherwise.
|
// {8} 1 is imm8 is non-negative. 0 otherwise.
|
||||||
// {7-0} [0,255] imm8 value.
|
// {7-0} [0,255] imm8 value.
|
||||||
def PostIdxImm8AsmOperand : AsmOperandClass { let Name = "PostIdxImm8"; }
|
def PostIdxImm8AsmOperand : AsmOperandClass { let Name = "PostIdxImm8"; }
|
||||||
def postidx_imm8 : Operand<i32> {
|
def postidx_imm8 : MemOperand {
|
||||||
let PrintMethod = "printPostIdxImm8Operand";
|
let PrintMethod = "printPostIdxImm8Operand";
|
||||||
let ParserMatchClass = PostIdxImm8AsmOperand;
|
let ParserMatchClass = PostIdxImm8AsmOperand;
|
||||||
let MIOperandInfo = (ops i32imm);
|
let MIOperandInfo = (ops i32imm);
|
||||||
@ -841,7 +844,7 @@ def postidx_imm8 : Operand<i32> {
|
|||||||
// {8} 1 is imm8 is non-negative. 0 otherwise.
|
// {8} 1 is imm8 is non-negative. 0 otherwise.
|
||||||
// {7-0} [0,255] imm8 value, scaled by 4.
|
// {7-0} [0,255] imm8 value, scaled by 4.
|
||||||
def PostIdxImm8s4AsmOperand : AsmOperandClass { let Name = "PostIdxImm8s4"; }
|
def PostIdxImm8s4AsmOperand : AsmOperandClass { let Name = "PostIdxImm8s4"; }
|
||||||
def postidx_imm8s4 : Operand<i32> {
|
def postidx_imm8s4 : MemOperand {
|
||||||
let PrintMethod = "printPostIdxImm8s4Operand";
|
let PrintMethod = "printPostIdxImm8s4Operand";
|
||||||
let ParserMatchClass = PostIdxImm8s4AsmOperand;
|
let ParserMatchClass = PostIdxImm8s4AsmOperand;
|
||||||
let MIOperandInfo = (ops i32imm);
|
let MIOperandInfo = (ops i32imm);
|
||||||
@ -854,7 +857,7 @@ def PostIdxRegAsmOperand : AsmOperandClass {
|
|||||||
let Name = "PostIdxReg";
|
let Name = "PostIdxReg";
|
||||||
let ParserMethod = "parsePostIdxReg";
|
let ParserMethod = "parsePostIdxReg";
|
||||||
}
|
}
|
||||||
def postidx_reg : Operand<i32> {
|
def postidx_reg : MemOperand {
|
||||||
let EncoderMethod = "getPostIdxRegOpValue";
|
let EncoderMethod = "getPostIdxRegOpValue";
|
||||||
let DecoderMethod = "DecodePostIdxReg";
|
let DecoderMethod = "DecodePostIdxReg";
|
||||||
let PrintMethod = "printPostIdxRegOperand";
|
let PrintMethod = "printPostIdxRegOperand";
|
||||||
@ -869,7 +872,7 @@ def postidx_reg : Operand<i32> {
|
|||||||
// FIXME: addrmode2 should be refactored the rest of the way to always
|
// FIXME: addrmode2 should be refactored the rest of the way to always
|
||||||
// use explicit imm vs. reg versions above (addrmode_imm12 and ldst_so_reg).
|
// use explicit imm vs. reg versions above (addrmode_imm12 and ldst_so_reg).
|
||||||
def AddrMode2AsmOperand : AsmOperandClass { let Name = "AddrMode2"; }
|
def AddrMode2AsmOperand : AsmOperandClass { let Name = "AddrMode2"; }
|
||||||
def addrmode2 : Operand<i32>,
|
def addrmode2 : MemOperand,
|
||||||
ComplexPattern<i32, 3, "SelectAddrMode2", []> {
|
ComplexPattern<i32, 3, "SelectAddrMode2", []> {
|
||||||
let EncoderMethod = "getAddrMode2OpValue";
|
let EncoderMethod = "getAddrMode2OpValue";
|
||||||
let PrintMethod = "printAddrMode2Operand";
|
let PrintMethod = "printAddrMode2Operand";
|
||||||
@ -881,7 +884,7 @@ def PostIdxRegShiftedAsmOperand : AsmOperandClass {
|
|||||||
let Name = "PostIdxRegShifted";
|
let Name = "PostIdxRegShifted";
|
||||||
let ParserMethod = "parsePostIdxReg";
|
let ParserMethod = "parsePostIdxReg";
|
||||||
}
|
}
|
||||||
def am2offset_reg : Operand<i32>,
|
def am2offset_reg : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectAddrMode2OffsetReg",
|
ComplexPattern<i32, 2, "SelectAddrMode2OffsetReg",
|
||||||
[], [SDNPWantRoot]> {
|
[], [SDNPWantRoot]> {
|
||||||
let EncoderMethod = "getAddrMode2OffsetOpValue";
|
let EncoderMethod = "getAddrMode2OffsetOpValue";
|
||||||
@ -894,7 +897,7 @@ def am2offset_reg : Operand<i32>,
|
|||||||
// FIXME: am2offset_imm should only need the immediate, not the GPR. Having
|
// FIXME: am2offset_imm should only need the immediate, not the GPR. Having
|
||||||
// the GPR is purely vestigal at this point.
|
// the GPR is purely vestigal at this point.
|
||||||
def AM2OffsetImmAsmOperand : AsmOperandClass { let Name = "AM2OffsetImm"; }
|
def AM2OffsetImmAsmOperand : AsmOperandClass { let Name = "AM2OffsetImm"; }
|
||||||
def am2offset_imm : Operand<i32>,
|
def am2offset_imm : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectAddrMode2OffsetImm",
|
ComplexPattern<i32, 2, "SelectAddrMode2OffsetImm",
|
||||||
[], [SDNPWantRoot]> {
|
[], [SDNPWantRoot]> {
|
||||||
let EncoderMethod = "getAddrMode2OffsetOpValue";
|
let EncoderMethod = "getAddrMode2OffsetOpValue";
|
||||||
@ -909,7 +912,7 @@ def am2offset_imm : Operand<i32>,
|
|||||||
//
|
//
|
||||||
// FIXME: split into imm vs. reg versions.
|
// FIXME: split into imm vs. reg versions.
|
||||||
def AddrMode3AsmOperand : AsmOperandClass { let Name = "AddrMode3"; }
|
def AddrMode3AsmOperand : AsmOperandClass { let Name = "AddrMode3"; }
|
||||||
class AddrMode3 : Operand<i32>,
|
class AddrMode3 : MemOperand,
|
||||||
ComplexPattern<i32, 3, "SelectAddrMode3", []> {
|
ComplexPattern<i32, 3, "SelectAddrMode3", []> {
|
||||||
let EncoderMethod = "getAddrMode3OpValue";
|
let EncoderMethod = "getAddrMode3OpValue";
|
||||||
let ParserMatchClass = AddrMode3AsmOperand;
|
let ParserMatchClass = AddrMode3AsmOperand;
|
||||||
@ -932,7 +935,7 @@ def AM3OffsetAsmOperand : AsmOperandClass {
|
|||||||
let Name = "AM3Offset";
|
let Name = "AM3Offset";
|
||||||
let ParserMethod = "parseAM3Offset";
|
let ParserMethod = "parseAM3Offset";
|
||||||
}
|
}
|
||||||
def am3offset : Operand<i32>,
|
def am3offset : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectAddrMode3Offset",
|
ComplexPattern<i32, 2, "SelectAddrMode3Offset",
|
||||||
[], [SDNPWantRoot]> {
|
[], [SDNPWantRoot]> {
|
||||||
let EncoderMethod = "getAddrMode3OffsetOpValue";
|
let EncoderMethod = "getAddrMode3OffsetOpValue";
|
||||||
@ -951,7 +954,7 @@ def ldstm_mode : OptionalDefOperand<OtherVT, (ops i32), (ops (i32 1))> {
|
|||||||
// addrmode5 := reg +/- imm8*4
|
// addrmode5 := reg +/- imm8*4
|
||||||
//
|
//
|
||||||
def AddrMode5AsmOperand : AsmOperandClass { let Name = "AddrMode5"; }
|
def AddrMode5AsmOperand : AsmOperandClass { let Name = "AddrMode5"; }
|
||||||
class AddrMode5 : Operand<i32>,
|
class AddrMode5 : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectAddrMode5", []> {
|
ComplexPattern<i32, 2, "SelectAddrMode5", []> {
|
||||||
let EncoderMethod = "getAddrMode5OpValue";
|
let EncoderMethod = "getAddrMode5OpValue";
|
||||||
let DecoderMethod = "DecodeAddrMode5Operand";
|
let DecoderMethod = "DecodeAddrMode5Operand";
|
||||||
@ -970,7 +973,7 @@ def addrmode5_pre : AddrMode5 {
|
|||||||
// addrmode6 := reg with optional alignment
|
// addrmode6 := reg with optional alignment
|
||||||
//
|
//
|
||||||
def AddrMode6AsmOperand : AsmOperandClass { let Name = "AlignedMemory"; }
|
def AddrMode6AsmOperand : AsmOperandClass { let Name = "AlignedMemory"; }
|
||||||
def addrmode6 : Operand<i32>,
|
def addrmode6 : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectAddrMode6", [], [SDNPWantParent]>{
|
ComplexPattern<i32, 2, "SelectAddrMode6", [], [SDNPWantParent]>{
|
||||||
let PrintMethod = "printAddrMode6Operand";
|
let PrintMethod = "printAddrMode6Operand";
|
||||||
let MIOperandInfo = (ops GPR:$addr, i32imm:$align);
|
let MIOperandInfo = (ops GPR:$addr, i32imm:$align);
|
||||||
@ -979,7 +982,7 @@ def addrmode6 : Operand<i32>,
|
|||||||
let ParserMatchClass = AddrMode6AsmOperand;
|
let ParserMatchClass = AddrMode6AsmOperand;
|
||||||
}
|
}
|
||||||
|
|
||||||
def am6offset : Operand<i32>,
|
def am6offset : MemOperand,
|
||||||
ComplexPattern<i32, 1, "SelectAddrMode6Offset",
|
ComplexPattern<i32, 1, "SelectAddrMode6Offset",
|
||||||
[], [SDNPWantRoot]> {
|
[], [SDNPWantRoot]> {
|
||||||
let PrintMethod = "printAddrMode6OffsetOperand";
|
let PrintMethod = "printAddrMode6OffsetOperand";
|
||||||
@ -990,7 +993,7 @@ def am6offset : Operand<i32>,
|
|||||||
|
|
||||||
// Special version of addrmode6 to handle alignment encoding for VST1/VLD1
|
// Special version of addrmode6 to handle alignment encoding for VST1/VLD1
|
||||||
// (single element from one lane) for size 32.
|
// (single element from one lane) for size 32.
|
||||||
def addrmode6oneL32 : Operand<i32>,
|
def addrmode6oneL32 : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectAddrMode6", [], [SDNPWantParent]>{
|
ComplexPattern<i32, 2, "SelectAddrMode6", [], [SDNPWantParent]>{
|
||||||
let PrintMethod = "printAddrMode6Operand";
|
let PrintMethod = "printAddrMode6Operand";
|
||||||
let MIOperandInfo = (ops GPR:$addr, i32imm);
|
let MIOperandInfo = (ops GPR:$addr, i32imm);
|
||||||
@ -998,7 +1001,7 @@ def addrmode6oneL32 : Operand<i32>,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Base class for addrmode6 with specific alignment restrictions.
|
// Base class for addrmode6 with specific alignment restrictions.
|
||||||
class AddrMode6Align : Operand<i32>,
|
class AddrMode6Align : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectAddrMode6", [], [SDNPWantParent]>{
|
ComplexPattern<i32, 2, "SelectAddrMode6", [], [SDNPWantParent]>{
|
||||||
let PrintMethod = "printAddrMode6Operand";
|
let PrintMethod = "printAddrMode6Operand";
|
||||||
let MIOperandInfo = (ops GPR:$addr, i32imm:$align);
|
let MIOperandInfo = (ops GPR:$addr, i32imm:$align);
|
||||||
@ -1074,7 +1077,7 @@ def addrmode6align64or128or256 : AddrMode6Align {
|
|||||||
|
|
||||||
// Special version of addrmode6 to handle alignment encoding for VLD-dup
|
// Special version of addrmode6 to handle alignment encoding for VLD-dup
|
||||||
// instructions, specifically VLD4-dup.
|
// instructions, specifically VLD4-dup.
|
||||||
def addrmode6dup : Operand<i32>,
|
def addrmode6dup : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectAddrMode6", [], [SDNPWantParent]>{
|
ComplexPattern<i32, 2, "SelectAddrMode6", [], [SDNPWantParent]>{
|
||||||
let PrintMethod = "printAddrMode6Operand";
|
let PrintMethod = "printAddrMode6Operand";
|
||||||
let MIOperandInfo = (ops GPR:$addr, i32imm);
|
let MIOperandInfo = (ops GPR:$addr, i32imm);
|
||||||
@ -1085,7 +1088,7 @@ def addrmode6dup : Operand<i32>,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Base class for addrmode6dup with specific alignment restrictions.
|
// Base class for addrmode6dup with specific alignment restrictions.
|
||||||
class AddrMode6DupAlign : Operand<i32>,
|
class AddrMode6DupAlign : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectAddrMode6", [], [SDNPWantParent]>{
|
ComplexPattern<i32, 2, "SelectAddrMode6", [], [SDNPWantParent]>{
|
||||||
let PrintMethod = "printAddrMode6Operand";
|
let PrintMethod = "printAddrMode6Operand";
|
||||||
let MIOperandInfo = (ops GPR:$addr, i32imm);
|
let MIOperandInfo = (ops GPR:$addr, i32imm);
|
||||||
@ -1149,7 +1152,7 @@ def addrmode6dupalign64or128 : AddrMode6DupAlign {
|
|||||||
|
|
||||||
// addrmodepc := pc + reg
|
// addrmodepc := pc + reg
|
||||||
//
|
//
|
||||||
def addrmodepc : Operand<i32>,
|
def addrmodepc : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectAddrModePC", []> {
|
ComplexPattern<i32, 2, "SelectAddrModePC", []> {
|
||||||
let PrintMethod = "printAddrModePCOperand";
|
let PrintMethod = "printAddrModePCOperand";
|
||||||
let MIOperandInfo = (ops GPR, i32imm);
|
let MIOperandInfo = (ops GPR, i32imm);
|
||||||
@ -1158,7 +1161,7 @@ def addrmodepc : Operand<i32>,
|
|||||||
// addr_offset_none := reg
|
// addr_offset_none := reg
|
||||||
//
|
//
|
||||||
def MemNoOffsetAsmOperand : AsmOperandClass { let Name = "MemNoOffset"; }
|
def MemNoOffsetAsmOperand : AsmOperandClass { let Name = "MemNoOffset"; }
|
||||||
def addr_offset_none : Operand<i32>,
|
def addr_offset_none : MemOperand,
|
||||||
ComplexPattern<i32, 1, "SelectAddrOffsetNone", []> {
|
ComplexPattern<i32, 1, "SelectAddrOffsetNone", []> {
|
||||||
let PrintMethod = "printAddrMode7Operand";
|
let PrintMethod = "printAddrMode7Operand";
|
||||||
let DecoderMethod = "DecodeAddrMode7Operand";
|
let DecoderMethod = "DecodeAddrMode7Operand";
|
||||||
|
@ -142,7 +142,7 @@ def t_blxtarget : Operand<i32> {
|
|||||||
|
|
||||||
// t_addrmode_pc := <label> => pc + imm8 * 4
|
// t_addrmode_pc := <label> => pc + imm8 * 4
|
||||||
//
|
//
|
||||||
def t_addrmode_pc : Operand<i32> {
|
def t_addrmode_pc : MemOperand {
|
||||||
let EncoderMethod = "getAddrModePCOpValue";
|
let EncoderMethod = "getAddrModePCOpValue";
|
||||||
let DecoderMethod = "DecodeThumbAddrModePC";
|
let DecoderMethod = "DecodeThumbAddrModePC";
|
||||||
let PrintMethod = "printThumbLdrLabelOperand";
|
let PrintMethod = "printThumbLdrLabelOperand";
|
||||||
@ -153,7 +153,7 @@ def t_addrmode_pc : Operand<i32> {
|
|||||||
// t_addrmode_rr := reg + reg
|
// t_addrmode_rr := reg + reg
|
||||||
//
|
//
|
||||||
def t_addrmode_rr_asm_operand : AsmOperandClass { let Name = "MemThumbRR"; }
|
def t_addrmode_rr_asm_operand : AsmOperandClass { let Name = "MemThumbRR"; }
|
||||||
def t_addrmode_rr : Operand<i32>,
|
def t_addrmode_rr : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectThumbAddrModeRR", []> {
|
ComplexPattern<i32, 2, "SelectThumbAddrModeRR", []> {
|
||||||
let EncoderMethod = "getThumbAddrModeRegRegOpValue";
|
let EncoderMethod = "getThumbAddrModeRegRegOpValue";
|
||||||
let PrintMethod = "printThumbAddrModeRROperand";
|
let PrintMethod = "printThumbAddrModeRROperand";
|
||||||
@ -169,7 +169,7 @@ def t_addrmode_rr : Operand<i32>,
|
|||||||
// the reg+imm forms will match instead. This is a horrible way to do that,
|
// the reg+imm forms will match instead. This is a horrible way to do that,
|
||||||
// as it forces tight coupling between the methods, but it's how selectiondag
|
// as it forces tight coupling between the methods, but it's how selectiondag
|
||||||
// currently works.
|
// currently works.
|
||||||
def t_addrmode_rrs1 : Operand<i32>,
|
def t_addrmode_rrs1 : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectThumbAddrModeRI5S1", []> {
|
ComplexPattern<i32, 2, "SelectThumbAddrModeRI5S1", []> {
|
||||||
let EncoderMethod = "getThumbAddrModeRegRegOpValue";
|
let EncoderMethod = "getThumbAddrModeRegRegOpValue";
|
||||||
let PrintMethod = "printThumbAddrModeRROperand";
|
let PrintMethod = "printThumbAddrModeRROperand";
|
||||||
@ -177,7 +177,7 @@ def t_addrmode_rrs1 : Operand<i32>,
|
|||||||
let ParserMatchClass = t_addrmode_rr_asm_operand;
|
let ParserMatchClass = t_addrmode_rr_asm_operand;
|
||||||
let MIOperandInfo = (ops tGPR:$base, tGPR:$offsreg);
|
let MIOperandInfo = (ops tGPR:$base, tGPR:$offsreg);
|
||||||
}
|
}
|
||||||
def t_addrmode_rrs2 : Operand<i32>,
|
def t_addrmode_rrs2 : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectThumbAddrModeRI5S2", []> {
|
ComplexPattern<i32, 2, "SelectThumbAddrModeRI5S2", []> {
|
||||||
let EncoderMethod = "getThumbAddrModeRegRegOpValue";
|
let EncoderMethod = "getThumbAddrModeRegRegOpValue";
|
||||||
let DecoderMethod = "DecodeThumbAddrModeRR";
|
let DecoderMethod = "DecodeThumbAddrModeRR";
|
||||||
@ -185,7 +185,7 @@ def t_addrmode_rrs2 : Operand<i32>,
|
|||||||
let ParserMatchClass = t_addrmode_rr_asm_operand;
|
let ParserMatchClass = t_addrmode_rr_asm_operand;
|
||||||
let MIOperandInfo = (ops tGPR:$base, tGPR:$offsreg);
|
let MIOperandInfo = (ops tGPR:$base, tGPR:$offsreg);
|
||||||
}
|
}
|
||||||
def t_addrmode_rrs4 : Operand<i32>,
|
def t_addrmode_rrs4 : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectThumbAddrModeRI5S4", []> {
|
ComplexPattern<i32, 2, "SelectThumbAddrModeRI5S4", []> {
|
||||||
let EncoderMethod = "getThumbAddrModeRegRegOpValue";
|
let EncoderMethod = "getThumbAddrModeRegRegOpValue";
|
||||||
let DecoderMethod = "DecodeThumbAddrModeRR";
|
let DecoderMethod = "DecodeThumbAddrModeRR";
|
||||||
@ -197,7 +197,7 @@ def t_addrmode_rrs4 : Operand<i32>,
|
|||||||
// t_addrmode_is4 := reg + imm5 * 4
|
// t_addrmode_is4 := reg + imm5 * 4
|
||||||
//
|
//
|
||||||
def t_addrmode_is4_asm_operand : AsmOperandClass { let Name = "MemThumbRIs4"; }
|
def t_addrmode_is4_asm_operand : AsmOperandClass { let Name = "MemThumbRIs4"; }
|
||||||
def t_addrmode_is4 : Operand<i32>,
|
def t_addrmode_is4 : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectThumbAddrModeImm5S4", []> {
|
ComplexPattern<i32, 2, "SelectThumbAddrModeImm5S4", []> {
|
||||||
let EncoderMethod = "getAddrModeISOpValue";
|
let EncoderMethod = "getAddrModeISOpValue";
|
||||||
let DecoderMethod = "DecodeThumbAddrModeIS";
|
let DecoderMethod = "DecodeThumbAddrModeIS";
|
||||||
@ -209,7 +209,7 @@ def t_addrmode_is4 : Operand<i32>,
|
|||||||
// t_addrmode_is2 := reg + imm5 * 2
|
// t_addrmode_is2 := reg + imm5 * 2
|
||||||
//
|
//
|
||||||
def t_addrmode_is2_asm_operand : AsmOperandClass { let Name = "MemThumbRIs2"; }
|
def t_addrmode_is2_asm_operand : AsmOperandClass { let Name = "MemThumbRIs2"; }
|
||||||
def t_addrmode_is2 : Operand<i32>,
|
def t_addrmode_is2 : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectThumbAddrModeImm5S2", []> {
|
ComplexPattern<i32, 2, "SelectThumbAddrModeImm5S2", []> {
|
||||||
let EncoderMethod = "getAddrModeISOpValue";
|
let EncoderMethod = "getAddrModeISOpValue";
|
||||||
let DecoderMethod = "DecodeThumbAddrModeIS";
|
let DecoderMethod = "DecodeThumbAddrModeIS";
|
||||||
@ -221,7 +221,7 @@ def t_addrmode_is2 : Operand<i32>,
|
|||||||
// t_addrmode_is1 := reg + imm5
|
// t_addrmode_is1 := reg + imm5
|
||||||
//
|
//
|
||||||
def t_addrmode_is1_asm_operand : AsmOperandClass { let Name = "MemThumbRIs1"; }
|
def t_addrmode_is1_asm_operand : AsmOperandClass { let Name = "MemThumbRIs1"; }
|
||||||
def t_addrmode_is1 : Operand<i32>,
|
def t_addrmode_is1 : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectThumbAddrModeImm5S1", []> {
|
ComplexPattern<i32, 2, "SelectThumbAddrModeImm5S1", []> {
|
||||||
let EncoderMethod = "getAddrModeISOpValue";
|
let EncoderMethod = "getAddrModeISOpValue";
|
||||||
let DecoderMethod = "DecodeThumbAddrModeIS";
|
let DecoderMethod = "DecodeThumbAddrModeIS";
|
||||||
@ -235,7 +235,7 @@ def t_addrmode_is1 : Operand<i32>,
|
|||||||
// FIXME: This really shouldn't have an explicit SP operand at all. It should
|
// FIXME: This really shouldn't have an explicit SP operand at all. It should
|
||||||
// be implicit, just like in the instruction encoding itself.
|
// be implicit, just like in the instruction encoding itself.
|
||||||
def t_addrmode_sp_asm_operand : AsmOperandClass { let Name = "MemThumbSPI"; }
|
def t_addrmode_sp_asm_operand : AsmOperandClass { let Name = "MemThumbSPI"; }
|
||||||
def t_addrmode_sp : Operand<i32>,
|
def t_addrmode_sp : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectThumbAddrModeSP", []> {
|
ComplexPattern<i32, 2, "SelectThumbAddrModeSP", []> {
|
||||||
let EncoderMethod = "getAddrModeThumbSPOpValue";
|
let EncoderMethod = "getAddrModeThumbSPOpValue";
|
||||||
let DecoderMethod = "DecodeThumbAddrModeSP";
|
let DecoderMethod = "DecodeThumbAddrModeSP";
|
||||||
|
@ -148,7 +148,7 @@ def lo5AllOne : PatLeaf<(i32 imm), [{
|
|||||||
|
|
||||||
// t2addrmode_imm12 := reg + imm12
|
// t2addrmode_imm12 := reg + imm12
|
||||||
def t2addrmode_imm12_asmoperand : AsmOperandClass {let Name="MemUImm12Offset";}
|
def t2addrmode_imm12_asmoperand : AsmOperandClass {let Name="MemUImm12Offset";}
|
||||||
def t2addrmode_imm12 : Operand<i32>,
|
def t2addrmode_imm12 : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectT2AddrModeImm12", []> {
|
ComplexPattern<i32, 2, "SelectT2AddrModeImm12", []> {
|
||||||
let PrintMethod = "printAddrModeImm12Operand<false>";
|
let PrintMethod = "printAddrModeImm12Operand<false>";
|
||||||
let EncoderMethod = "getAddrModeImm12OpValue";
|
let EncoderMethod = "getAddrModeImm12OpValue";
|
||||||
@ -178,7 +178,7 @@ def t2adrlabel : Operand<i32> {
|
|||||||
|
|
||||||
// t2addrmode_posimm8 := reg + imm8
|
// t2addrmode_posimm8 := reg + imm8
|
||||||
def MemPosImm8OffsetAsmOperand : AsmOperandClass {let Name="MemPosImm8Offset";}
|
def MemPosImm8OffsetAsmOperand : AsmOperandClass {let Name="MemPosImm8Offset";}
|
||||||
def t2addrmode_posimm8 : Operand<i32> {
|
def t2addrmode_posimm8 : MemOperand {
|
||||||
let PrintMethod = "printT2AddrModeImm8Operand<false>";
|
let PrintMethod = "printT2AddrModeImm8Operand<false>";
|
||||||
let EncoderMethod = "getT2AddrModeImm8OpValue";
|
let EncoderMethod = "getT2AddrModeImm8OpValue";
|
||||||
let DecoderMethod = "DecodeT2AddrModeImm8";
|
let DecoderMethod = "DecodeT2AddrModeImm8";
|
||||||
@ -188,7 +188,7 @@ def t2addrmode_posimm8 : Operand<i32> {
|
|||||||
|
|
||||||
// t2addrmode_negimm8 := reg - imm8
|
// t2addrmode_negimm8 := reg - imm8
|
||||||
def MemNegImm8OffsetAsmOperand : AsmOperandClass {let Name="MemNegImm8Offset";}
|
def MemNegImm8OffsetAsmOperand : AsmOperandClass {let Name="MemNegImm8Offset";}
|
||||||
def t2addrmode_negimm8 : Operand<i32>,
|
def t2addrmode_negimm8 : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectT2AddrModeImm8", []> {
|
ComplexPattern<i32, 2, "SelectT2AddrModeImm8", []> {
|
||||||
let PrintMethod = "printT2AddrModeImm8Operand<false>";
|
let PrintMethod = "printT2AddrModeImm8Operand<false>";
|
||||||
let EncoderMethod = "getT2AddrModeImm8OpValue";
|
let EncoderMethod = "getT2AddrModeImm8OpValue";
|
||||||
@ -199,7 +199,7 @@ def t2addrmode_negimm8 : Operand<i32>,
|
|||||||
|
|
||||||
// t2addrmode_imm8 := reg +/- imm8
|
// t2addrmode_imm8 := reg +/- imm8
|
||||||
def MemImm8OffsetAsmOperand : AsmOperandClass { let Name = "MemImm8Offset"; }
|
def MemImm8OffsetAsmOperand : AsmOperandClass { let Name = "MemImm8Offset"; }
|
||||||
class T2AddrMode_Imm8 : Operand<i32>,
|
class T2AddrMode_Imm8 : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectT2AddrModeImm8", []> {
|
ComplexPattern<i32, 2, "SelectT2AddrModeImm8", []> {
|
||||||
let EncoderMethod = "getT2AddrModeImm8OpValue";
|
let EncoderMethod = "getT2AddrModeImm8OpValue";
|
||||||
let DecoderMethod = "DecodeT2AddrModeImm8";
|
let DecoderMethod = "DecodeT2AddrModeImm8";
|
||||||
@ -215,7 +215,7 @@ def t2addrmode_imm8_pre : T2AddrMode_Imm8 {
|
|||||||
let PrintMethod = "printT2AddrModeImm8Operand<true>";
|
let PrintMethod = "printT2AddrModeImm8Operand<true>";
|
||||||
}
|
}
|
||||||
|
|
||||||
def t2am_imm8_offset : Operand<i32>,
|
def t2am_imm8_offset : MemOperand,
|
||||||
ComplexPattern<i32, 1, "SelectT2AddrModeImm8Offset",
|
ComplexPattern<i32, 1, "SelectT2AddrModeImm8Offset",
|
||||||
[], [SDNPWantRoot]> {
|
[], [SDNPWantRoot]> {
|
||||||
let PrintMethod = "printT2AddrModeImm8OffsetOperand";
|
let PrintMethod = "printT2AddrModeImm8OffsetOperand";
|
||||||
@ -225,7 +225,7 @@ def t2am_imm8_offset : Operand<i32>,
|
|||||||
|
|
||||||
// t2addrmode_imm8s4 := reg +/- (imm8 << 2)
|
// t2addrmode_imm8s4 := reg +/- (imm8 << 2)
|
||||||
def MemImm8s4OffsetAsmOperand : AsmOperandClass {let Name = "MemImm8s4Offset";}
|
def MemImm8s4OffsetAsmOperand : AsmOperandClass {let Name = "MemImm8s4Offset";}
|
||||||
class T2AddrMode_Imm8s4 : Operand<i32> {
|
class T2AddrMode_Imm8s4 : MemOperand {
|
||||||
let EncoderMethod = "getT2AddrModeImm8s4OpValue";
|
let EncoderMethod = "getT2AddrModeImm8s4OpValue";
|
||||||
let DecoderMethod = "DecodeT2AddrModeImm8s4";
|
let DecoderMethod = "DecodeT2AddrModeImm8s4";
|
||||||
let ParserMatchClass = MemImm8s4OffsetAsmOperand;
|
let ParserMatchClass = MemImm8s4OffsetAsmOperand;
|
||||||
@ -241,7 +241,7 @@ def t2addrmode_imm8s4_pre : T2AddrMode_Imm8s4 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def t2am_imm8s4_offset_asmoperand : AsmOperandClass { let Name = "Imm8s4"; }
|
def t2am_imm8s4_offset_asmoperand : AsmOperandClass { let Name = "Imm8s4"; }
|
||||||
def t2am_imm8s4_offset : Operand<i32> {
|
def t2am_imm8s4_offset : MemOperand {
|
||||||
let PrintMethod = "printT2AddrModeImm8s4OffsetOperand";
|
let PrintMethod = "printT2AddrModeImm8s4OffsetOperand";
|
||||||
let EncoderMethod = "getT2Imm8s4OpValue";
|
let EncoderMethod = "getT2Imm8s4OpValue";
|
||||||
let DecoderMethod = "DecodeT2Imm8S4";
|
let DecoderMethod = "DecodeT2Imm8S4";
|
||||||
@ -251,7 +251,7 @@ def t2am_imm8s4_offset : Operand<i32> {
|
|||||||
def MemImm0_1020s4OffsetAsmOperand : AsmOperandClass {
|
def MemImm0_1020s4OffsetAsmOperand : AsmOperandClass {
|
||||||
let Name = "MemImm0_1020s4Offset";
|
let Name = "MemImm0_1020s4Offset";
|
||||||
}
|
}
|
||||||
def t2addrmode_imm0_1020s4 : Operand<i32>,
|
def t2addrmode_imm0_1020s4 : MemOperand,
|
||||||
ComplexPattern<i32, 2, "SelectT2AddrModeExclusive"> {
|
ComplexPattern<i32, 2, "SelectT2AddrModeExclusive"> {
|
||||||
let PrintMethod = "printT2AddrModeImm0_1020s4Operand";
|
let PrintMethod = "printT2AddrModeImm0_1020s4Operand";
|
||||||
let EncoderMethod = "getT2AddrModeImm0_1020s4OpValue";
|
let EncoderMethod = "getT2AddrModeImm0_1020s4OpValue";
|
||||||
@ -262,7 +262,7 @@ def t2addrmode_imm0_1020s4 : Operand<i32>,
|
|||||||
|
|
||||||
// t2addrmode_so_reg := reg + (reg << imm2)
|
// t2addrmode_so_reg := reg + (reg << imm2)
|
||||||
def t2addrmode_so_reg_asmoperand : AsmOperandClass {let Name="T2MemRegOffset";}
|
def t2addrmode_so_reg_asmoperand : AsmOperandClass {let Name="T2MemRegOffset";}
|
||||||
def t2addrmode_so_reg : Operand<i32>,
|
def t2addrmode_so_reg : MemOperand,
|
||||||
ComplexPattern<i32, 3, "SelectT2AddrModeSoReg", []> {
|
ComplexPattern<i32, 3, "SelectT2AddrModeSoReg", []> {
|
||||||
let PrintMethod = "printT2AddrModeSoRegOperand";
|
let PrintMethod = "printT2AddrModeSoRegOperand";
|
||||||
let EncoderMethod = "getT2AddrModeSORegOpValue";
|
let EncoderMethod = "getT2AddrModeSORegOpValue";
|
||||||
@ -273,13 +273,13 @@ def t2addrmode_so_reg : Operand<i32>,
|
|||||||
|
|
||||||
// Addresses for the TBB/TBH instructions.
|
// Addresses for the TBB/TBH instructions.
|
||||||
def addrmode_tbb_asmoperand : AsmOperandClass { let Name = "MemTBB"; }
|
def addrmode_tbb_asmoperand : AsmOperandClass { let Name = "MemTBB"; }
|
||||||
def addrmode_tbb : Operand<i32> {
|
def addrmode_tbb : MemOperand {
|
||||||
let PrintMethod = "printAddrModeTBB";
|
let PrintMethod = "printAddrModeTBB";
|
||||||
let ParserMatchClass = addrmode_tbb_asmoperand;
|
let ParserMatchClass = addrmode_tbb_asmoperand;
|
||||||
let MIOperandInfo = (ops GPR:$Rn, rGPR:$Rm);
|
let MIOperandInfo = (ops GPR:$Rn, rGPR:$Rm);
|
||||||
}
|
}
|
||||||
def addrmode_tbh_asmoperand : AsmOperandClass { let Name = "MemTBH"; }
|
def addrmode_tbh_asmoperand : AsmOperandClass { let Name = "MemTBH"; }
|
||||||
def addrmode_tbh : Operand<i32> {
|
def addrmode_tbh : MemOperand {
|
||||||
let PrintMethod = "printAddrModeTBH";
|
let PrintMethod = "printAddrModeTBH";
|
||||||
let ParserMatchClass = addrmode_tbh_asmoperand;
|
let ParserMatchClass = addrmode_tbh_asmoperand;
|
||||||
let MIOperandInfo = (ops GPR:$Rn, rGPR:$Rm);
|
let MIOperandInfo = (ops GPR:$Rn, rGPR:$Rm);
|
||||||
|
Loading…
Reference in New Issue
Block a user