Changeset View
Changeset View
Standalone View
Standalone View
llvm/trunk/lib/Target/Mips/MipsInstrInfo.td
Show First 20 Lines • Show All 388 Lines • ▼ Show 20 Lines | class ConstantSImmAsmOperandClass<int Bits, list<AsmOperandClass> Supers = [], | ||||
int Offset = 0> : AsmOperandClass { | int Offset = 0> : AsmOperandClass { | ||||
let Name = "ConstantSImm" # Bits # "_" # Offset; | let Name = "ConstantSImm" # Bits # "_" # Offset; | ||||
let RenderMethod = "addConstantSImmOperands<" # Bits # ", " # Offset # ">"; | let RenderMethod = "addConstantSImmOperands<" # Bits # ", " # Offset # ">"; | ||||
let PredicateMethod = "isConstantSImm<" # Bits # ", " # Offset # ">"; | let PredicateMethod = "isConstantSImm<" # Bits # ", " # Offset # ">"; | ||||
let SuperClasses = Supers; | let SuperClasses = Supers; | ||||
let DiagnosticType = "SImm" # Bits # "_" # Offset; | let DiagnosticType = "SImm" # Bits # "_" # Offset; | ||||
} | } | ||||
def ConstantSImm4AsmOperandClass | |||||
: ConstantSImmAsmOperandClass< | |||||
4, []>; | |||||
class ConstantUImmAsmOperandClass<int Bits, list<AsmOperandClass> Supers = [], | class ConstantUImmAsmOperandClass<int Bits, list<AsmOperandClass> Supers = [], | ||||
int Offset = 0> : AsmOperandClass { | int Offset = 0> : AsmOperandClass { | ||||
let Name = "ConstantUImm" # Bits # "_" # Offset; | let Name = "ConstantUImm" # Bits # "_" # Offset; | ||||
let RenderMethod = "addConstantUImmOperands<" # Bits # ", " # Offset # ">"; | let RenderMethod = "addConstantUImmOperands<" # Bits # ", " # Offset # ">"; | ||||
let PredicateMethod = "isConstantUImm<" # Bits # ", " # Offset # ">"; | let PredicateMethod = "isConstantUImm<" # Bits # ", " # Offset # ">"; | ||||
let SuperClasses = Supers; | let SuperClasses = Supers; | ||||
let DiagnosticType = "UImm" # Bits # "_" # Offset; | let DiagnosticType = "UImm" # Bits # "_" # Offset; | ||||
} | } | ||||
Show All 12 Lines | class UImmAsmOperandClass<int Bits, list<AsmOperandClass> Supers = []> | ||||
: AsmOperandClass { | : AsmOperandClass { | ||||
let Name = "UImm" # Bits; | let Name = "UImm" # Bits; | ||||
let RenderMethod = "addUImmOperands<" # Bits # ">"; | let RenderMethod = "addUImmOperands<" # Bits # ">"; | ||||
let PredicateMethod = "isUImm<" # Bits # ">"; | let PredicateMethod = "isUImm<" # Bits # ">"; | ||||
let SuperClasses = Supers; | let SuperClasses = Supers; | ||||
let DiagnosticType = "UImm" # Bits; | let DiagnosticType = "UImm" # Bits; | ||||
} | } | ||||
// AsmOperandClasses require a strict ordering which is difficult to manage | |||||
// as a hierarchy. Instead, we use a linear ordering and impose an order that | |||||
// is in some places arbitrary. | |||||
// | |||||
// Here the rules that are in use: | |||||
// * Wider immediates are a superset of narrower immediates: | |||||
// uimm4 < uimm5 < uimm6 | |||||
// * For the same bit-width, unsigned immediates are a superset of signed | |||||
// immediates:: | |||||
// simm4 < uimm4 < simm5 < uimm5 | |||||
// * For the same upper-bound, signed immediates are a superset of unsigned | |||||
// immediates: | |||||
// uimm3 < simm4 < uimm4 < simm4 | |||||
// * Modified immediates are a superset of ordinary immediates: | |||||
// uimm5 < uimm5_plus1 (1..32) < uimm5_plus32 (32..63) < uimm6 | |||||
// The term 'superset' starts to break down here since the uimm5_plus* classes | |||||
// are not true supersets of uimm5 (but they are still subsets of uimm6). | |||||
// * 'Relaxed' immediates are supersets of the corresponding unsigned immediate. | |||||
// uimm16 < uimm16_relaxed | |||||
// * The codeGen pattern type is arbitrarily ordered. | |||||
// uimm5 < uimm5_64, and uimm5 < vsplat_uimm5 | |||||
// This is entirely arbitrary. We need an ordering and what we pick is | |||||
// unimportant since only one is possible for a given mnemonic. | |||||
def ConstantUImm20AsmOperandClass | def ConstantUImm20AsmOperandClass | ||||
: ConstantUImmAsmOperandClass<20, []>; | : ConstantUImmAsmOperandClass<20, []>; | ||||
def UImm16RelaxedAsmOperandClass | def UImm16RelaxedAsmOperandClass | ||||
: UImmAsmOperandClass<16, [ConstantUImm20AsmOperandClass]> { | : UImmAsmOperandClass<16, [ConstantUImm20AsmOperandClass]> { | ||||
let Name = "UImm16_Relaxed"; | let Name = "UImm16_Relaxed"; | ||||
let PredicateMethod = "isAnyImm<16>"; | let PredicateMethod = "isAnyImm<16>"; | ||||
let DiagnosticType = "UImm16_Relaxed"; | let DiagnosticType = "UImm16_Relaxed"; | ||||
} | } | ||||
def UImm16AsmOperandClass | def UImm16AsmOperandClass | ||||
: UImmAsmOperandClass<16, [UImm16RelaxedAsmOperandClass]>; | : UImmAsmOperandClass<16, [UImm16RelaxedAsmOperandClass]>; | ||||
def ConstantUImm10AsmOperandClass | def ConstantUImm10AsmOperandClass | ||||
: ConstantUImmAsmOperandClass<10, [UImm16AsmOperandClass]>; | : ConstantUImmAsmOperandClass<10, [UImm16AsmOperandClass]>; | ||||
def ConstantUImm8AsmOperandClass | def ConstantUImm8AsmOperandClass | ||||
: ConstantUImmAsmOperandClass<8, [ConstantUImm10AsmOperandClass]>; | : ConstantUImmAsmOperandClass<8, [ConstantUImm10AsmOperandClass]>; | ||||
def ConstantUImm7AsmOperandClass | def ConstantUImm7AsmOperandClass | ||||
: ConstantUImmAsmOperandClass<7, [ConstantUImm8AsmOperandClass]>; | : ConstantUImmAsmOperandClass<7, [ConstantUImm8AsmOperandClass]>; | ||||
def ConstantUImm6Lsl2AsmOperandClass : AsmOperandClass { | def ConstantUImm6Lsl2AsmOperandClass : AsmOperandClass { | ||||
let Name = "UImm6Lsl2"; | let Name = "UImm6Lsl2"; | ||||
let RenderMethod = "addImmOperands"; | let RenderMethod = "addImmOperands"; | ||||
let PredicateMethod = "isScaledUImm<6, 2>"; | let PredicateMethod = "isScaledUImm<6, 2>"; | ||||
let SuperClasses = [ConstantUImm7AsmOperandClass]; | let SuperClasses = [ConstantUImm7AsmOperandClass]; | ||||
let DiagnosticType = "UImm6_Lsl2"; | let DiagnosticType = "UImm6_Lsl2"; | ||||
} | } | ||||
def ConstantUImm6AsmOperandClass | def ConstantUImm6AsmOperandClass | ||||
: ConstantUImmAsmOperandClass<6, [ConstantUImm7AsmOperandClass]>; | : ConstantUImmAsmOperandClass<6, [ConstantUImm6Lsl2AsmOperandClass]>; | ||||
def ConstantSImm6AsmOperandClass | def ConstantSImm6AsmOperandClass | ||||
: ConstantSImmAsmOperandClass<6, [ConstantUImm7AsmOperandClass]>; | : ConstantSImmAsmOperandClass<6, [ConstantUImm6AsmOperandClass]>; | ||||
def ConstantUImm5Plus1AsmOperandClass | |||||
: ConstantUImmAsmOperandClass<5, [ConstantUImm6AsmOperandClass], 1>; | |||||
def ConstantUImm5_Range2_64AsmOperandClass | |||||
: ConstantUImmRangeAsmOperandClass<2, 64, [ConstantUImm6AsmOperandClass]>; | |||||
def ConstantUImm5Plus32AsmOperandClass | |||||
: ConstantUImmAsmOperandClass<5, [ConstantUImm6AsmOperandClass], 32>; | |||||
def ConstantUImm5Plus33AsmOperandClass | |||||
: ConstantUImmAsmOperandClass<5, [ConstantUImm6AsmOperandClass], 33>; | |||||
def ConstantUImm5Plus32NormalizeAsmOperandClass | |||||
: ConstantUImmAsmOperandClass<5, [ConstantUImm6AsmOperandClass], 32> { | |||||
let Name = "ConstantUImm5_32_Norm"; | |||||
// We must also subtract 32 when we render the operand. | |||||
let RenderMethod = "addConstantUImmOperands<5, 32, -32>"; | |||||
} | |||||
def ConstantUImm5Lsl2AsmOperandClass : AsmOperandClass { | def ConstantUImm5Lsl2AsmOperandClass : AsmOperandClass { | ||||
let Name = "UImm5Lsl2"; | let Name = "UImm5Lsl2"; | ||||
let RenderMethod = "addImmOperands"; | let RenderMethod = "addImmOperands"; | ||||
let PredicateMethod = "isScaledUImm<5, 2>"; | let PredicateMethod = "isScaledUImm<5, 2>"; | ||||
let SuperClasses = [ConstantUImm6AsmOperandClass]; | let SuperClasses = [ConstantSImm6AsmOperandClass]; | ||||
let DiagnosticType = "UImm5_Lsl2"; | let DiagnosticType = "UImm5_Lsl2"; | ||||
} | } | ||||
def ConstantUImm5_Range2_64AsmOperandClass | |||||
: ConstantUImmRangeAsmOperandClass<2, 64, [ConstantUImm5Lsl2AsmOperandClass]>; | |||||
def ConstantUImm5Plus33AsmOperandClass | |||||
: ConstantUImmAsmOperandClass<5, [ConstantUImm5_Range2_64AsmOperandClass], | |||||
33>; | |||||
def ConstantUImm5ReportUImm6AsmOperandClass | def ConstantUImm5ReportUImm6AsmOperandClass | ||||
: ConstantUImmAsmOperandClass<5, [ConstantUImm6AsmOperandClass]> { | : ConstantUImmAsmOperandClass<5, [ConstantUImm5Plus33AsmOperandClass]> { | ||||
let Name = "ConstantUImm5_0_Report_UImm6"; | let Name = "ConstantUImm5_0_Report_UImm6"; | ||||
let DiagnosticType = "UImm5_0_Report_UImm6"; | let DiagnosticType = "UImm5_0_Report_UImm6"; | ||||
} | } | ||||
def ConstantUImm5Plus32AsmOperandClass | |||||
: ConstantUImmAsmOperandClass< | |||||
5, [ConstantUImm5ReportUImm6AsmOperandClass], 32>; | |||||
def ConstantUImm5Plus32NormalizeAsmOperandClass | |||||
: ConstantUImmAsmOperandClass<5, [ConstantUImm5Plus32AsmOperandClass], 32> { | |||||
let Name = "ConstantUImm5_32_Norm"; | |||||
// We must also subtract 32 when we render the operand. | |||||
let RenderMethod = "addConstantUImmOperands<5, 32, -32>"; | |||||
} | |||||
def ConstantUImm5Plus1AsmOperandClass | |||||
: ConstantUImmAsmOperandClass< | |||||
5, [ConstantUImm5Plus32NormalizeAsmOperandClass], 1>; | |||||
def ConstantUImm5AsmOperandClass | def ConstantUImm5AsmOperandClass | ||||
: ConstantUImmAsmOperandClass<5, [ConstantUImm6AsmOperandClass]>; | : ConstantUImmAsmOperandClass<5, [ConstantUImm5Plus1AsmOperandClass]>; | ||||
def ConstantUImm4AsmOperandClass | def ConstantUImm4AsmOperandClass | ||||
: ConstantUImmAsmOperandClass< | : ConstantUImmAsmOperandClass<4, [ConstantUImm5AsmOperandClass]>; | ||||
4, [ConstantUImm5AsmOperandClass, | def ConstantSImm4AsmOperandClass | ||||
ConstantUImm5Plus32AsmOperandClass, | : ConstantSImmAsmOperandClass<4, [ConstantUImm4AsmOperandClass]>; | ||||
ConstantUImm5Plus32NormalizeAsmOperandClass]>; | |||||
def ConstantUImm3AsmOperandClass | def ConstantUImm3AsmOperandClass | ||||
: ConstantUImmAsmOperandClass<3, [ConstantSImm4AsmOperandClass, | : ConstantUImmAsmOperandClass<3, [ConstantSImm4AsmOperandClass]>; | ||||
ConstantUImm4AsmOperandClass]>; | |||||
def ConstantUImm2Plus1AsmOperandClass | def ConstantUImm2Plus1AsmOperandClass | ||||
: ConstantUImmAsmOperandClass<2, [ConstantUImm3AsmOperandClass], 1>; | : ConstantUImmAsmOperandClass<2, [ConstantUImm3AsmOperandClass], 1>; | ||||
def ConstantUImm2AsmOperandClass | def ConstantUImm2AsmOperandClass | ||||
: ConstantUImmAsmOperandClass<2, [ConstantUImm3AsmOperandClass]>; | : ConstantUImmAsmOperandClass<2, [ConstantUImm3AsmOperandClass]>; | ||||
def ConstantUImm1AsmOperandClass | def ConstantUImm1AsmOperandClass | ||||
: ConstantUImmAsmOperandClass<1, [ConstantUImm2AsmOperandClass]>; | : ConstantUImmAsmOperandClass<1, [ConstantUImm2AsmOperandClass]>; | ||||
def ConstantImmzAsmOperandClass : AsmOperandClass { | def ConstantImmzAsmOperandClass : AsmOperandClass { | ||||
let Name = "ConstantImmz"; | let Name = "ConstantImmz"; | ||||
▲ Show 20 Lines • Show All 1,923 Lines • Show Last 20 Lines |