diff --git a/llvm/lib/Target/Xtensa/AsmParser/XtensaAsmParser.cpp b/llvm/lib/Target/Xtensa/AsmParser/XtensaAsmParser.cpp index e0bbbc79b201b..b9be5e26d1fd5 100644 --- a/llvm/lib/Target/Xtensa/AsmParser/XtensaAsmParser.cpp +++ b/llvm/lib/Target/Xtensa/AsmParser/XtensaAsmParser.cpp @@ -62,11 +62,14 @@ class XtensaAsmParser : public MCTargetAsmParser { #include "XtensaGenAsmMatcher.inc" ParseStatus parseImmediate(OperandVector &Operands); - ParseStatus parseRegister(OperandVector &Operands, bool AllowParens = false, - bool SR = false); + ParseStatus + parseRegister(OperandVector &Operands, bool AllowParens = false, + bool SR = false, + Xtensa::RegisterAccessType RAType = Xtensa::REGISTER_EXCHANGE); ParseStatus parseOperandWithModifier(OperandVector &Operands); - bool parseOperand(OperandVector &Operands, StringRef Mnemonic, - bool SR = false); + bool + parseOperand(OperandVector &Operands, StringRef Mnemonic, bool SR = false, + Xtensa::RegisterAccessType RAType = Xtensa::REGISTER_EXCHANGE); bool ParseInstructionWithSR(ParseInstructionInfo &Info, StringRef Name, SMLoc NameLoc, OperandVector &Operands); ParseStatus tryParseRegister(MCRegister &Reg, SMLoc &StartLoc, @@ -586,7 +589,8 @@ bool XtensaAsmParser::parseRegister(MCRegister &Reg, SMLoc &StartLoc, } ParseStatus XtensaAsmParser::parseRegister(OperandVector &Operands, - bool AllowParens, bool SR) { + bool AllowParens, bool SR, + Xtensa::RegisterAccessType RAType) { SMLoc FirstS = getLoc(); bool HadParens = false; AsmToken Buf[2]; @@ -630,7 +634,7 @@ ParseStatus XtensaAsmParser::parseRegister(OperandVector &Operands, return ParseStatus::NoMatch; } - if (!Xtensa::checkRegister(RegNo, getSTI().getFeatureBits())) + if (!Xtensa::checkRegister(RegNo, getSTI().getFeatureBits(), RAType)) return ParseStatus::NoMatch; if (HadParens) @@ -691,7 +695,7 @@ ParseStatus XtensaAsmParser::parseOperandWithModifier(OperandVector &Operands) { /// from this information, adding to Operands. /// If operand was parsed, returns false, else true. bool XtensaAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic, - bool SR) { + bool SR, Xtensa::RegisterAccessType RAType) { // Check if the current operand has a custom associated parser, if so, try to // custom parse the operand, or fallback to the general approach. ParseStatus Res = MatchOperandParserImpl(Operands, Mnemonic); @@ -705,7 +709,7 @@ bool XtensaAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic, return true; // Attempt to parse token as register - if (parseRegister(Operands, true, SR).isSuccess()) + if (parseRegister(Operands, true, SR, RAType).isSuccess()) return false; // Attempt to parse token as an immediate @@ -719,6 +723,11 @@ bool XtensaAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic, bool XtensaAsmParser::ParseInstructionWithSR(ParseInstructionInfo &Info, StringRef Name, SMLoc NameLoc, OperandVector &Operands) { + Xtensa::RegisterAccessType RAType = + Name[0] == 'w' ? Xtensa::REGISTER_WRITE + : (Name[0] == 'r' ? Xtensa::REGISTER_READ + : Xtensa::REGISTER_EXCHANGE); + if ((Name.starts_with("wsr.") || Name.starts_with("rsr.") || Name.starts_with("xsr.")) && (Name.size() > 4)) { @@ -734,7 +743,7 @@ bool XtensaAsmParser::ParseInstructionWithSR(ParseInstructionInfo &Info, if (RegNo == 0) RegNo = MatchRegisterAltName(RegName); - if (!Xtensa::checkRegister(RegNo, getSTI().getFeatureBits())) + if (!Xtensa::checkRegister(RegNo, getSTI().getFeatureBits(), RAType)) return Error(NameLoc, "invalid register name"); // Parse operand @@ -759,7 +768,7 @@ bool XtensaAsmParser::ParseInstructionWithSR(ParseInstructionInfo &Info, } // Parse second operand - if (parseOperand(Operands, Name, true)) + if (parseOperand(Operands, Name, true, RAType)) return true; } diff --git a/llvm/lib/Target/Xtensa/Disassembler/XtensaDisassembler.cpp b/llvm/lib/Target/Xtensa/Disassembler/XtensaDisassembler.cpp index dbd34964db074..3b37ac88b9b17 100644 --- a/llvm/lib/Target/Xtensa/Disassembler/XtensaDisassembler.cpp +++ b/llvm/lib/Target/Xtensa/Disassembler/XtensaDisassembler.cpp @@ -119,13 +119,39 @@ struct DecodeRegister { }; const DecodeRegister SRDecoderTable[] = { - {Xtensa::LBEG, 0}, {Xtensa::LEND, 1}, {Xtensa::LCOUNT, 2}, - {Xtensa::SAR, 3}, {Xtensa::BREG, 4}, {Xtensa::SAR, 3}, - {Xtensa::LITBASE, 5}, {Xtensa::ACCLO, 16}, {Xtensa::ACCHI, 17}, - {Xtensa::M0, 32}, {Xtensa::M1, 33}, {Xtensa::M2, 34}, - {Xtensa::M3, 35}, {Xtensa::WINDOWBASE, 72}, {Xtensa::WINDOWSTART, 73}, - {Xtensa::MEMCTL, 97}, {Xtensa::VECBASE, 231}, {Xtensa::MISC0, 244}, - {Xtensa::MISC1, 245}, {Xtensa::MISC2, 246}, {Xtensa::MISC3, 247}}; + {Xtensa::LBEG, 0}, {Xtensa::LEND, 1}, + {Xtensa::LCOUNT, 2}, {Xtensa::SAR, 3}, + {Xtensa::BREG, 4}, {Xtensa::LITBASE, 5}, + {Xtensa::ACCLO, 16}, {Xtensa::ACCHI, 17}, + {Xtensa::M0, 32}, {Xtensa::M1, 33}, + {Xtensa::M2, 34}, {Xtensa::M3, 35}, + {Xtensa::WINDOWBASE, 72}, {Xtensa::WINDOWSTART, 73}, + {Xtensa::IBREAKENABLE, 96}, {Xtensa::MEMCTL, 97}, + {Xtensa::DDR, 104}, {Xtensa::IBREAKA0, 128}, + {Xtensa::IBREAKA1, 129}, {Xtensa::DBREAKA0, 144}, + {Xtensa::DBREAKA1, 145}, {Xtensa::DBREAKC0, 160}, + {Xtensa::DBREAKC1, 161}, {Xtensa::CONFIGID0, 176}, + {Xtensa::EPC1, 177}, {Xtensa::EPC2, 178}, + {Xtensa::EPC3, 179}, {Xtensa::EPC4, 180}, + {Xtensa::EPC5, 181}, {Xtensa::EPC6, 182}, + {Xtensa::EPC7, 183}, {Xtensa::DEPC, 192}, + {Xtensa::EPS2, 194}, {Xtensa::EPS3, 195}, + {Xtensa::EPS4, 196}, {Xtensa::EPS5, 197}, + {Xtensa::EPS6, 198}, {Xtensa::EPS7, 199}, + {Xtensa::CONFIGID1, 208}, {Xtensa::EXCSAVE1, 209}, + {Xtensa::EXCSAVE2, 210}, {Xtensa::EXCSAVE3, 211}, + {Xtensa::EXCSAVE4, 212}, {Xtensa::EXCSAVE5, 213}, + {Xtensa::EXCSAVE6, 214}, {Xtensa::EXCSAVE7, 215}, + {Xtensa::CPENABLE, 224}, {Xtensa::INTERRUPT, 226}, + {Xtensa::INTCLEAR, 227}, {Xtensa::INTENABLE, 228}, + {Xtensa::PS, 230}, {Xtensa::VECBASE, 231}, + {Xtensa::EXCCAUSE, 232}, {Xtensa::DEBUGCAUSE, 233}, + {Xtensa::CCOUNT, 234}, {Xtensa::PRID, 235}, + {Xtensa::ICOUNT, 236}, {Xtensa::ICOUNTLEVEL, 237}, + {Xtensa::EXCVADDR, 238}, {Xtensa::CCOMPARE0, 240}, + {Xtensa::CCOMPARE1, 241}, {Xtensa::CCOMPARE2, 242}, + {Xtensa::MISC0, 244}, {Xtensa::MISC1, 245}, + {Xtensa::MISC2, 246}, {Xtensa::MISC3, 247}}; static DecodeStatus DecodeSRRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, @@ -133,12 +159,24 @@ static DecodeStatus DecodeSRRegisterClass(MCInst &Inst, uint64_t RegNo, if (RegNo > 255) return MCDisassembler::Fail; + Xtensa::RegisterAccessType RAType = + Inst.getOpcode() == Xtensa::WSR + ? Xtensa::REGISTER_WRITE + : (Inst.getOpcode() == Xtensa::RSR ? Xtensa::REGISTER_READ + : Xtensa::REGISTER_EXCHANGE); + for (unsigned i = 0; i < std::size(SRDecoderTable); i++) { if (SRDecoderTable[i].RegNo == RegNo) { MCPhysReg Reg = SRDecoderTable[i].Reg; - if (!Xtensa::checkRegister(Reg, - Decoder->getSubtargetInfo().getFeatureBits())) + // Handle special case. The INTERRUPT/INTSET registers use the same + // encoding, but INTERRUPT used for read and INTSET for write. + if (Reg == Xtensa::INTERRUPT && RAType == Xtensa::REGISTER_WRITE) { + Reg = Xtensa::INTSET; + } + + if (!Xtensa::checkRegister( + Reg, Decoder->getSubtargetInfo().getFeatureBits(), RAType)) return MCDisassembler::Fail; Inst.addOperand(MCOperand::createReg(Reg)); diff --git a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCTargetDesc.cpp b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCTargetDesc.cpp index 63fed46ac411f..f48c6225827b0 100644 --- a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCTargetDesc.cpp +++ b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCTargetDesc.cpp @@ -75,10 +75,95 @@ bool Xtensa::isValidAddrOffsetForOpcode(unsigned Opcode, int64_t Offset) { } // Verify Special Register -bool Xtensa::checkRegister(MCRegister RegNo, const FeatureBitset &FeatureBits) { +bool Xtensa::checkRegister(MCRegister RegNo, const FeatureBitset &FeatureBits, + RegisterAccessType RAType) { switch (RegNo) { case Xtensa::BREG: return FeatureBits[Xtensa::FeatureBoolean]; + case Xtensa::CCOUNT: + case Xtensa::CCOMPARE0: + if (FeatureBits[Xtensa::FeatureTimers1]) + return true; + LLVM_FALLTHROUGH; + case Xtensa::CCOMPARE1: + if (FeatureBits[Xtensa::FeatureTimers2]) + return true; + LLVM_FALLTHROUGH; + case Xtensa::CCOMPARE2: + if (FeatureBits[Xtensa::FeatureTimers3]) + return true; + return false; + case Xtensa::CONFIGID0: + return RAType != Xtensa::REGISTER_EXCHANGE; + case Xtensa::CONFIGID1: + return RAType == Xtensa::REGISTER_READ; + case Xtensa::CPENABLE: + return FeatureBits[Xtensa::FeatureCoprocessor]; + case Xtensa::DEBUGCAUSE: + return RAType == Xtensa::REGISTER_READ && FeatureBits[Xtensa::FeatureDebug]; + case Xtensa::DEPC: + case Xtensa::EPC1: + case Xtensa::EXCCAUSE: + case Xtensa::EXCSAVE1: + case Xtensa::EXCVADDR: + return FeatureBits[Xtensa::FeatureException]; + LLVM_FALLTHROUGH; + case Xtensa::EPC2: + case Xtensa::EPS2: + case Xtensa::EXCSAVE2: + if (FeatureBits[Xtensa::FeatureHighPriInterrupts]) + return true; + LLVM_FALLTHROUGH; + case Xtensa::EPC3: + case Xtensa::EPS3: + case Xtensa::EXCSAVE3: + if (FeatureBits[Xtensa::FeatureHighPriInterruptsLevel3]) + return true; + LLVM_FALLTHROUGH; + case Xtensa::EPC4: + case Xtensa::EPS4: + case Xtensa::EXCSAVE4: + if (FeatureBits[Xtensa::FeatureHighPriInterruptsLevel4]) + return true; + LLVM_FALLTHROUGH; + case Xtensa::EPC5: + case Xtensa::EPS5: + case Xtensa::EXCSAVE5: + if (FeatureBits[Xtensa::FeatureHighPriInterruptsLevel5]) + return true; + LLVM_FALLTHROUGH; + case Xtensa::EPC6: + case Xtensa::EPS6: + case Xtensa::EXCSAVE6: + if (FeatureBits[Xtensa::FeatureHighPriInterruptsLevel6]) + return true; + LLVM_FALLTHROUGH; + case Xtensa::EPC7: + case Xtensa::EPS7: + case Xtensa::EXCSAVE7: + if (FeatureBits[Xtensa::FeatureHighPriInterruptsLevel7]) + return true; + return false; + case Xtensa::INTENABLE: + return FeatureBits[Xtensa::FeatureInterrupt]; + case Xtensa::INTERRUPT: + return RAType == Xtensa::REGISTER_READ && + FeatureBits[Xtensa::FeatureInterrupt]; + case Xtensa::INTSET: + case Xtensa::INTCLEAR: + return RAType == Xtensa::REGISTER_WRITE && + FeatureBits[Xtensa::FeatureInterrupt]; + case Xtensa::ICOUNT: + case Xtensa::ICOUNTLEVEL: + case Xtensa::IBREAKENABLE: + case Xtensa::DDR: + case Xtensa::IBREAKA0: + case Xtensa::IBREAKA1: + case Xtensa::DBREAKA0: + case Xtensa::DBREAKA1: + case Xtensa::DBREAKC0: + case Xtensa::DBREAKC1: + return FeatureBits[Xtensa::FeatureDebug]; case Xtensa::LBEG: case Xtensa::LEND: case Xtensa::LCOUNT: @@ -99,6 +184,8 @@ bool Xtensa::checkRegister(MCRegister RegNo, const FeatureBitset &FeatureBits) { case Xtensa::MISC2: case Xtensa::MISC3: return FeatureBits[Xtensa::FeatureMiscSR]; + case Xtensa::PRID: + return RAType == Xtensa::REGISTER_READ && FeatureBits[Xtensa::FeaturePRID]; case Xtensa::VECBASE: return FeatureBits[Xtensa::FeatureRelocatableVector]; case Xtensa::WINDOWBASE: diff --git a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCTargetDesc.h b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCTargetDesc.h index cedc57a14f142..ec91f656bdcbd 100644 --- a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCTargetDesc.h +++ b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCTargetDesc.h @@ -55,8 +55,15 @@ bool isValidAddrOffset(int Scale, int64_t OffsetVal); // Check address offset for load/store instructions. bool isValidAddrOffsetForOpcode(unsigned Opcode, int64_t Offset); +enum RegisterAccessType { + REGISTER_WRITE = 1, + REGISTER_READ = 2, + REGISTER_EXCHANGE = 3 +}; + // Verify if it's correct to use a special register. -bool checkRegister(MCRegister RegNo, const FeatureBitset &FeatureBits); +bool checkRegister(MCRegister RegNo, const FeatureBitset &FeatureBits, + RegisterAccessType RA); } // namespace Xtensa } // end namespace llvm diff --git a/llvm/lib/Target/Xtensa/XtensaFeatures.td b/llvm/lib/Target/Xtensa/XtensaFeatures.td index 55977277daf8e..1dd03283e9313 100644 --- a/llvm/lib/Target/Xtensa/XtensaFeatures.td +++ b/llvm/lib/Target/Xtensa/XtensaFeatures.td @@ -92,3 +92,43 @@ def FeatureDataCache : SubtargetFeature<"dcache", "HasDataCache", "true", "Enable Xtensa Data Cache option">; def HasDataCache : Predicate<"Subtarget->hasDataCache()">, AssemblerPredicate<(all_of FeatureDataCache)>; + +// Xtensa Interrupts Options. +def FeatureHighPriInterrupts : SubtargetFeature<"highpriinterrupts", + "HasHighPriInterrupts", "true", + "Enable Xtensa HighPriInterrupts option">; +def HasHighPriInterrupts : Predicate<"Subtarget->hasHighPriInterrupts()">, + AssemblerPredicate<(all_of FeatureHighPriInterrupts)>; + +foreach i = {3-7} in + def FeatureHighPriInterruptsLevel#i : SubtargetFeature<"highpriinterrupts-level"#i, + "HasHighPriInterruptsLevel"#i#"", "true", "Enable Xtensa HighPriInterrupts Level"#i, [FeatureHighPriInterrupts]>; + +def FeatureInterrupt : SubtargetFeature<"interrupt", "HasInterrupt", "true", + "Enable Xtensa Interrupt option">; +def HasInterrupt : Predicate<"Subtarget->hasInterrupt()">, + AssemblerPredicate<(all_of FeatureInterrupt)>; + +def FeatureException : SubtargetFeature<"exception", "HasException", "true", + "Enable Xtensa Exception option">; +def HasException : Predicate<"Subtarget->hasException()">, + AssemblerPredicate<(all_of FeatureException)>; + +def FeatureDebug : SubtargetFeature<"debug", "HasDebug", "true", + "Enable Xtensa Debug option">; +def HasDebug : Predicate<"Subtarget->hasDebug()">, + AssemblerPredicate<(all_of FeatureDebug)>; + +foreach i = {1-3} in + def FeatureTimers#i : SubtargetFeature<"timers"#i, + "HasTimers"#i#"", "true", "Enable Xtensa Timers "#i>; + +def FeaturePRID : SubtargetFeature<"prid", "HasPRID", "true", + "Enable Xtensa Processor ID option">; +def HasPRID : Predicate<"Subtarget->hasPRID()">, + AssemblerPredicate<(all_of FeaturePRID)>; + +def FeatureCoprocessor : SubtargetFeature<"coprocessor", "HasCoprocessor", "true", + "Enable Xtensa Coprocessor option">; +def HasCoprocessor : Predicate<"Subtarget->hasCoprocessor()">, + AssemblerPredicate<(all_of FeatureCoprocessor)>; diff --git a/llvm/lib/Target/Xtensa/XtensaInstrInfo.td b/llvm/lib/Target/Xtensa/XtensaInstrInfo.td index 9a9424f916996..7e9fcd7058c20 100644 --- a/llvm/lib/Target/Xtensa/XtensaInstrInfo.td +++ b/llvm/lib/Target/Xtensa/XtensaInstrInfo.td @@ -499,6 +499,18 @@ def EXTW : RRR_Inst<0x00, 0x00, 0x00, (outs), (ins), let hasSideEffects = 1; } +//===----------------------------------------------------------------------===// +// Illegal instructions +//===----------------------------------------------------------------------===// + +def ILL : CALLX_Inst<0x00, 0x00, 0x00, (outs), (ins), + "ill", []> { + let m = 0x0; + let n = 0x0; + let r = 0; + let s = 0; +} + //===----------------------------------------------------------------------===// // Processor control instructions //===----------------------------------------------------------------------===// @@ -1044,6 +1056,109 @@ let Predicates = [HasRegionProtection] in { } } +//===----------------------------------------------------------------------===// +// Debug instructions +//===----------------------------------------------------------------------===// + +let isBarrier = 1, isTerminator = 1 in { + def BREAK : RRR_Inst<0x00, 0x00, 0x00, (outs), (ins uimm4:$s, uimm4:$t), + "break\t$s, $t", []>, Requires<[HasDebug]> { + let r = 0x04; + } + + def BREAK_N : RRRN_Inst<0x0C, (outs), (ins uimm4:$imm), + "break.n\t$imm", []>, Requires<[HasDensity, HasDebug]> { + bits<4> imm; + + let r = 0xf; + let s = imm; + let t = 0x2; + } +} + +def : InstAlias<"_break.n\t$imm", (BREAK_N uimm4:$imm)>; + +def : Pat<(trap), (BREAK (i32 1), (i32 15))>; + +// Load instruction +def LDDR32P : RRR_Inst<0x00, 0x00, 0x00, (outs AR:$s), (ins), + "lddr32.p\t$s", []>, Requires<[HasDebug]> { + let r = 0x7; + let t = 0xe; + let mayLoad = 1; +} + +// Store instruction +def SDDR32P : RRR_Inst<0x00, 0x00, 0x00, (outs), (ins AR:$s), + "sddr32.p\t$s", []>, Requires<[HasDebug]> { + let r = 0x7; + let t = 0xf; + let mayStore = 1; +} + +//===----------------------------------------------------------------------===// +// Exception feature instructions +//===----------------------------------------------------------------------===// + +def EXCW : RRR_Inst<0x00, 0x00, 0x00, (outs), (ins), + "excw", []>, Requires<[HasException]> { + let r = 0x2; + let s = 0x0; + let t = 0x8; +} + +def RFDE : RRR_Inst<0x00, 0x00, 0x00, (outs), (ins), + "rfde", []>, Requires<[HasException]> { + let r = 0x3; + let s = 0x2; + let t = 0x0; +} + + +def RFE : RRR_Inst<0x00, 0x00, 0x00, (outs), (ins), + "rfe", []>, Requires<[HasException]> { + let r = 0x3; + let s = 0x0; + let t = 0x0; +} + +def SYSCALL : RRR_Inst<0x00, 0x00, 0x00, (outs), (ins), + "syscall", []>, Requires<[HasException]> { + let r = 0x5; + let s = 0x0; + let t = 0x0; +} + +//===----------------------------------------------------------------------===// +// Interrupt feature instructions +//===----------------------------------------------------------------------===// + +def RSIL : RRR_Inst<0x00, 0x00, 0x00, (outs AR:$t), (ins uimm4:$imm), + "rsil\t$t, $imm", []>, Requires<[HasInterrupt]> { + bits<4> imm; + + let r = 0x6; + let s = imm{3-0}; +} + +def WAITI : RRR_Inst<0x00, 0x00, 0x00, (outs), (ins uimm4:$imm), + "waiti\t$imm", []>, Requires<[HasInterrupt]> { + bits<4> imm; + + let r = 0x7; + let s = imm{3-0}; + let t = 0; +} + +def RFI : RRR_Inst<0x00, 0x00, 0x00, (outs), (ins uimm4:$imm), + "rfi\t$imm", []>, Requires<[HasHighPriInterrupts]> { + bits<4> imm; + + let r = 0x3; + let s = imm{3-0}; + let t = 0x1; +} + //===----------------------------------------------------------------------===// // DSP Instructions //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/Xtensa/XtensaRegisterInfo.td b/llvm/lib/Target/Xtensa/XtensaRegisterInfo.td index c54e2556ba11f..7d44029124344 100644 --- a/llvm/lib/Target/Xtensa/XtensaRegisterInfo.td +++ b/llvm/lib/Target/Xtensa/XtensaRegisterInfo.td @@ -91,9 +91,111 @@ def LITBASE : SRReg<5, "litbase", ["LITBASE", "5"]>; def WINDOWBASE : SRReg<72, "windowbase", ["WINDOWBASE", "72"]>; def WINDOWSTART : SRReg<73, "windowstart", ["WINDOWSTART", "73"]>; +// Instuction breakpoint enable register +def IBREAKENABLE : SRReg<96, "ibreakenable", ["IBREAKENABLE", "96"]>; + // Memory Control Register def MEMCTL : SRReg<97, "memctl", ["MEMCTL", "97"]>; +def DDR : SRReg<104, "ddr", ["DDR", "104"]>; + +// Instuction break address register 0 +def IBREAKA0 : SRReg<128, "ibreaka0", ["IBREAKA0", "128"]>; + +// Instuction break address register 1 +def IBREAKA1 : SRReg<129, "ibreaka1", ["IBREAKA1", "129"]>; + +// Data break address register 0 +def DBREAKA0 : SRReg<144, "dbreaka0", ["DBREAKA0", "144"]>; + +// Data break address register 1 +def DBREAKA1 : SRReg<145, "dbreaka1", ["DBREAKA1", "145"]>; + +// Data breakpoint control register 0 +def DBREAKC0 : SRReg<160, "dbreakc0", ["DBREAKC0", "160"]>; + +// Data breakpoint control register 1 +def DBREAKC1 : SRReg<161, "dbreakc1", ["DBREAKC1", "161"]>; + +def CONFIGID0 : SRReg<176, "configid0", ["CONFIGID0", "176"]>; + +// Exception PC1 +def EPC1 : SRReg<177, "epc1", ["EPC1", "177"]>; + +// Exception PC2 +def EPC2 : SRReg<178, "epc2", ["EPC2", "178"]>; + +// Exception PC3 +def EPC3 : SRReg<179, "epc3", ["EPC3", "179"]>; + +// Exception PC4 +def EPC4 : SRReg<180, "epc4", ["EPC4", "180"]>; + +// Exception PC5 +def EPC5 : SRReg<181, "epc5", ["EPC5", "181"]>; + +// Exception PC6 +def EPC6 : SRReg<182, "epc6", ["EPC6", "182"]>; + +// Exception PC7 +def EPC7 : SRReg<183, "epc7", ["EPC7", "183"]>; + +def DEPC : SRReg<192, "depc", ["DEPC", "192"]>; +def EPS2 : SRReg<194, "eps2", ["EPS2", "194"]>; +def EPS3 : SRReg<195, "eps3", ["EPS3", "195"]>; +def EPS4 : SRReg<196, "eps4", ["EPS4", "196"]>; +def EPS5 : SRReg<197, "eps5", ["EPS5", "197"]>; +def EPS6 : SRReg<198, "eps6", ["EPS6", "198"]>; +def EPS7 : SRReg<199, "eps7", ["EPS7", "199"]>; + +def CONFIGID1 : SRReg<208, "configid1", ["CONFIGID1", "208"]>; + +def EXCSAVE1 : SRReg<209, "excsave1", ["EXCSAVE1", "209"]>; +def EXCSAVE2 : SRReg<210, "excsave2", ["EXCSAVE2", "210"]>; +def EXCSAVE3 : SRReg<211, "excsave3", ["EXCSAVE3", "211"]>; +def EXCSAVE4 : SRReg<212, "excsave4", ["EXCSAVE4", "212"]>; +def EXCSAVE5 : SRReg<213, "excsave5", ["EXCSAVE5", "213"]>; +def EXCSAVE6 : SRReg<214, "excsave6", ["EXCSAVE6", "214"]>; +def EXCSAVE7 : SRReg<215, "excsave7", ["EXCSAVE7", "215"]>; + +def CPENABLE : SRReg<224, "cpenable", ["CPENABLE", "224"]>; + +// Interrupt enable mask register +def INTERRUPT : SRReg<226, "interrupt", ["INTERRUPT", "226"]>; + +def INTSET : SRReg<226, "intset", ["INTSET"]>; + +def INTCLEAR : SRReg<227, "intclear", ["INTCLEAR", "227"]>; + +def INTENABLE : SRReg<228, "intenable", ["INTENABLE", "228"]>; + +// Processor State +def PS : SRReg<230, "ps", ["PS", "230"]>; + +def EXCCAUSE : SRReg<232, "exccause", ["EXCCAUSE", "232"]>; + +// Cause of last debug exception register +def DEBUGCAUSE : SRReg<233, "debugcause", ["DEBUGCAUSE", "233"]>; + +// Processor Clock Count Register +def CCOUNT : SRReg<234, "ccount", ["CCOUNT", "234"]>; + +// Processor ID Register +def PRID : SRReg<235, "prid", ["PRID", "235"]>; + +def ICOUNT : SRReg<236, "icount", ["ICOUNT", "236"]>; +def ICOUNTLEVEL : SRReg<237, "icountlevel", ["ICOUNTLEVEL", "237"]>; +def EXCVADDR : SRReg<238, "excvaddr", ["EXCVADDR", "238"]>; + +// Cycle number to interrupt register 0 +def CCOMPARE0 : SRReg<240, "ccompare0", ["CCOMPARE0", "240"]>; + +// Cycle number to interrupt register 1 +def CCOMPARE1 : SRReg<241, "ccompare1", ["CCOMPARE1", "241"]>; + +// Cycle number to interrupt register 2 +def CCOMPARE2 : SRReg<242, "ccompare2", ["CCOMPARE2", "242"]>; + // Vector base register def VECBASE : SRReg<231, "vecbase", ["VECBASE", "231"]>; @@ -116,8 +218,13 @@ def MR23 : RegisterClass<"Xtensa", [i32], 32, (add M2, M3)>; def MR : RegisterClass<"Xtensa", [i32], 32, (add MR01, MR23)>; def SR : RegisterClass<"Xtensa", [i32], 32, (add - LBEG, LEND, LCOUNT, SAR, BREG, LITBASE, ACCLO, ACCHI, MR, WINDOWBASE, WINDOWSTART, - MEMCTL, VECBASE, MISC0, MISC1, MISC2, MISC3)>; + LBEG, LEND, LCOUNT, SAR, BREG, LITBASE, ACCLO, ACCHI, MR, + WINDOWBASE, WINDOWSTART, IBREAKENABLE, MEMCTL, DDR, IBREAKA0, IBREAKA1, + DBREAKA0, DBREAKA1, DBREAKC0, DBREAKC1, CONFIGID0, EPC1, EPC2, EPC3, EPC4, EPC5, + EPC6, EPC7, DEPC, EPS2, EPS3, EPS4, EPS5, EPS6, EPS7, CONFIGID1, EXCSAVE1, EXCSAVE2, + EXCSAVE3, EXCSAVE4, EXCSAVE5, EXCSAVE6, EXCSAVE7, CPENABLE, INTERRUPT, INTSET, INTCLEAR, INTENABLE, + PS, VECBASE, EXCCAUSE, DEBUGCAUSE, CCOUNT, PRID, ICOUNT, ICOUNTLEVEL, EXCVADDR, CCOMPARE0, + CCOMPARE1, CCOMPARE2, MISC0, MISC1, MISC2, MISC3)>; //===----------------------------------------------------------------------===// // Boolean registers diff --git a/llvm/lib/Target/Xtensa/XtensaSubtarget.h b/llvm/lib/Target/Xtensa/XtensaSubtarget.h index 9909fb9ff4b37..da4e14a53eef3 100644 --- a/llvm/lib/Target/Xtensa/XtensaSubtarget.h +++ b/llvm/lib/Target/Xtensa/XtensaSubtarget.h @@ -82,6 +82,15 @@ class XtensaSubtarget : public XtensaGenSubtargetInfo { bool hasMiscSR() const { return HasMiscSR; } bool hasExtendedL32R() const { return HasExtendedL32R; } bool hasDataCache() const { return HasDataCache; } + bool hasHighPriInterrupts() const { return HasHighPriInterrupts; } + bool hasHighPriInterruptsLevel3() const { return HasHighPriInterruptsLevel3; } + bool hasHighPriInterruptsLevel4() const { return HasHighPriInterruptsLevel4; } + bool hasHighPriInterruptsLevel5() const { return HasHighPriInterruptsLevel5; } + bool hasHighPriInterruptsLevel6() const { return HasHighPriInterruptsLevel6; } + bool hasHighPriInterruptsLevel7() const { return HasHighPriInterruptsLevel7; } + bool hasInterrupt() const { return HasInterrupt; } + bool hasException() const { return HasException; } + bool isWindowedABI() const { return hasWindowed(); } // Automatically generated by tblgen. diff --git a/llvm/test/MC/Disassembler/Xtensa/coprocessor.txt b/llvm/test/MC/Disassembler/Xtensa/coprocessor.txt new file mode 100644 index 0000000000000..83904dcde938c --- /dev/null +++ b/llvm/test/MC/Disassembler/Xtensa/coprocessor.txt @@ -0,0 +1,10 @@ +# RUN: llvm-mc -triple=xtensa -mattr=+coprocessor -disassemble %s | FileCheck -check-prefixes=CHECK-COPROCESSOR %s +# RUN: not llvm-mc -triple=xtensa -disassemble %s 2>&1 | FileCheck --implicit-check-not=warning: -check-prefixes=CHECK-CORE %s + +## Verify that binary code is correctly disassembled with +## Xtensa coprocessor option enabled. Also verify that dissasembling without +## Xtensa coprocessor option generates warnings. + +[0x20,0xe0,0x61] +#CHECK-COPROCESSOR: xsr a2, cpenable +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding diff --git a/llvm/test/MC/Disassembler/Xtensa/debug.txt b/llvm/test/MC/Disassembler/Xtensa/debug.txt new file mode 100644 index 0000000000000..1321f09a973c3 --- /dev/null +++ b/llvm/test/MC/Disassembler/Xtensa/debug.txt @@ -0,0 +1,62 @@ +# RUN: llvm-mc -triple=xtensa -mattr=+debug,+density -disassemble %s | FileCheck -check-prefixes=CHECK-DEBUG %s +# RUN: not llvm-mc -triple=xtensa -disassemble %s 2>&1 | FileCheck --implicit-check-not=warning: -check-prefixes=CHECK-CORE %s + +## Verify that binary code is correctly disassembled with +## Xtensa debug option enabled. Also verify that dissasembling without +## Xtensa debug option generates warnings. + +[0x10,0x41,0x00] +# CHECK-DEBUG: break 1, 1 +# CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x2c,0xf1] +# CHECK-DEBUG: break.n 1 +# CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0xe0,0x73,0x00] +# CHECK-DEBUG: lddr32.p a3 +# CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0xf0,0x73,0x00] +# CHECK-DEBUG: sddr32.p a3 +# CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0xec, 0x61] +#CHECK-DEBUG: xsr a2, icount +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0xed, 0x61] +#CHECK-DEBUG: xsr a2, icountlevel +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0x60, 0x61] +#CHECK-DEBUG: xsr a2, ibreakenable +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0x68, 0x61] +#CHECK-DEBUG: xsr a2, ddr +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0x80, 0x61] +#CHECK-DEBUG: xsr a2, ibreaka0 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0x81, 0x61] +#CHECK-DEBUG: xsr a2, ibreaka1 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0x90, 0x61] +#CHECK-DEBUG: xsr a2, dbreaka0 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0x91, 0x61] +#CHECK-DEBUG: xsr a2, dbreaka1 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0xa0, 0x61] +#CHECK-DEBUG: xsr a2, dbreakc0 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0xa1, 0x61] +#CHECK-DEBUG: xsr a2, dbreakc1 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding diff --git a/llvm/test/MC/Disassembler/Xtensa/exception.txt b/llvm/test/MC/Disassembler/Xtensa/exception.txt new file mode 100644 index 0000000000000..f40cc9e6549ba --- /dev/null +++ b/llvm/test/MC/Disassembler/Xtensa/exception.txt @@ -0,0 +1,42 @@ +# RUN: llvm-mc -triple=xtensa -mattr=+exception -disassemble %s | FileCheck -check-prefixes=CHECK-EXCEPTION %s +# RUN: not llvm-mc -triple=xtensa -disassemble %s 2>&1 | FileCheck --implicit-check-not=warning: -check-prefixes=CHECK-CORE %s + +## Verify that binary code is correctly disassembled with +## Xtensa exception option enabled. Also verify that dissasembling without +## Xtensa exception option generates warnings. + +[0x80,0x20,0x00] +# CHECK-EXCEPTION: excw +# CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x00,0x50,0x00] +# CHECK-EXCEPTION: syscall +# CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x00,0x30,0x00] +# CHECK-EXCEPTION: rfe +# CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x00,0x32,0x00] +# CHECK-EXCEPTION: rfde +# CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0xb1, 0x61] +#CHECK-INST: xsr a2, epc1 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0xd1, 0x61] +#CHECK-INST: xsr a2, excsave1 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0xe8, 0x61] +#CHECK-INST: xsr a2, exccause +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0xee, 0x61] +#CHECK-INST: xsr a2, excvaddr +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0xc0, 0x61] +#CHECK-INST: xsr a2, depc +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding diff --git a/llvm/test/MC/Disassembler/Xtensa/highinterrupts.txt b/llvm/test/MC/Disassembler/Xtensa/highinterrupts.txt new file mode 100644 index 0000000000000..d5d87918c9d52 --- /dev/null +++ b/llvm/test/MC/Disassembler/Xtensa/highinterrupts.txt @@ -0,0 +1,82 @@ +# RUN: llvm-mc -triple=xtensa -mattr=+highpriinterrupts,+highpriinterrupts-level7 -disassemble %s | FileCheck -check-prefixes=CHECK-HPINTERRUPTS %s +# RUN: not llvm-mc -triple=xtensa -disassemble %s 2>&1 | FileCheck --implicit-check-not=warning: -check-prefixes=CHECK-CORE %s + +## Verify that binary code is correctly disassembled with +## Xtensa highpriinterrupts option enabled. Also verify that dissasembling without +## Xtensa highpriinterrupts option generates warnings. + +[0x10,0x31,0x00] +# CHECK-HPINTERRUPTS: rfi 1 +# CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xb2,0x61] +#CHECK-HPINTERRUPTS: xsr a2, epc2 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xb3,0x61] +#CHECK-HPINTERRUPTS: xsr a2, epc3 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xb4,0x61] +#CHECK-HPINTERRUPTS: xsr a2, epc4 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xb5,0x61] +#CHECK-HPINTERRUPTS: xsr a2, epc5 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xb6,0x61] +#CHECK-HPINTERRUPTS: xsr a2, epc6 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xb7,0x61] +#CHECK-HPINTERRUPTS: xsr a2, epc7 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xc2,0x61] +#CHECK-HPINTERRUPTS: xsr a2, eps2 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xc3,0x61] +#CHECK-HPINTERRUPTS: xsr a2, eps3 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xc4,0x61] +#CHECK-HPINTERRUPTS: xsr a2, eps4 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xc5,0x61] +#CHECK-HPINTERRUPTS: xsr a2, eps5 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xc6,0x61] +#CHECK-HPINTERRUPTS: xsr a2, eps6 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xc7,0x61] +#CHECK-HPINTERRUPTS: xsr a2, eps7 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xd2,0x61] +#CHECK-HPINTERRUPTS: xsr a2, excsave2 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xd3,0x61] +#CHECK-HPINTERRUPTS: xsr a2, excsave3 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xd4,0x61] +#CHECK-HPINTERRUPTS: xsr a2, excsave4 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xd5,0x61] +#CHECK-HPINTERRUPTS: xsr a2, excsave5 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xd6,0x61] +#CHECK-HPINTERRUPTS: xsr a2, excsave6 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xd7,0x61] +#CHECK-HPINTERRUPTS: xsr a2, excsave7 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding diff --git a/llvm/test/MC/Disassembler/Xtensa/interrupt.txt b/llvm/test/MC/Disassembler/Xtensa/interrupt.txt new file mode 100644 index 0000000000000..da8ea3aa5dc47 --- /dev/null +++ b/llvm/test/MC/Disassembler/Xtensa/interrupt.txt @@ -0,0 +1,26 @@ +# RUN: llvm-mc -triple=xtensa -mattr=+interrupt -disassemble %s | FileCheck -check-prefixes=CHECK-EXCEPTION %s +# RUN: not llvm-mc -triple=xtensa -disassemble %s 2>&1 | FileCheck --implicit-check-not=warning: -check-prefixes=CHECK-CORE %s + +## Verify that binary code is correctly disassembled with +## Xtensa interrupt option enabled. Also verify that dissasembling without +## Xtensa interrupt option generates warnings. + +[0x20,0x61,0x00] +# CHECK-EXCEPTION: rsil a2, 1 +# CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x00,0x71,0x00] +# CHECK-EXCEPTION: waiti 1 +# CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0xe4, 0x61] +#CHECK-INST: xsr a2, intenable +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0xe2, 0x03] +#CHECK-INST: rsr a2, interrupt +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20, 0xe3, 0x13] +#CHECK-INST: wsr a2, intclear +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding diff --git a/llvm/test/MC/Disassembler/Xtensa/prid.txt b/llvm/test/MC/Disassembler/Xtensa/prid.txt new file mode 100644 index 0000000000000..104ad1c31185c --- /dev/null +++ b/llvm/test/MC/Disassembler/Xtensa/prid.txt @@ -0,0 +1,10 @@ +# RUN: llvm-mc -triple=xtensa -mattr=+prid -disassemble %s | FileCheck -check-prefixes=CHECK-PRID %s +# RUN: not llvm-mc -triple=xtensa -disassemble %s 2>&1 | FileCheck --implicit-check-not=warning: -check-prefixes=CHECK-CORE %s + +## Verify that binary code is correctly disassembled with +## Xtensa prid option enabled. Also verify that dissasembling without +## Xtensa prid option generates warnings. + +[0x20,0xeb,0x03] +#CHECK-PRID: rsr a2, prid +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding diff --git a/llvm/test/MC/Disassembler/Xtensa/timer.txt b/llvm/test/MC/Disassembler/Xtensa/timer.txt new file mode 100644 index 0000000000000..daacf27872daa --- /dev/null +++ b/llvm/test/MC/Disassembler/Xtensa/timer.txt @@ -0,0 +1,22 @@ +# RUN: llvm-mc -triple=xtensa -mattr=+timers3 -disassemble %s | FileCheck -check-prefixes=CHECK-TIMER %s +# RUN: not llvm-mc -triple=xtensa -disassemble %s 2>&1 | FileCheck --implicit-check-not=warning: -check-prefixes=CHECK-CORE %s + +## Verify that binary code is correctly disassembled with +## Xtensa timer option enabled. Also verify that dissasembling without +## Xtensa timer option generates warnings. + +[0x20,0xea,0x61] +#CHECK-INST: xsr a2, ccount +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xf0,0x61] +#CHECK-TIMER: xsr a2, ccompare0 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xf1,0x61] +#CHECK-TIMER: xsr a2, ccompare1 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding + +[0x20,0xf2,0x61] +#CHECK-TIMER: xsr a2, ccompare2 +#CHECK-CORE: [[#@LINE-2]]:2: warning: invalid instruction encoding diff --git a/llvm/test/MC/Xtensa/Core/processor-control.s b/llvm/test/MC/Xtensa/Core/processor-control.s index 5b648356fc68b..4a37d8346893e 100644 --- a/llvm/test/MC/Xtensa/Core/processor-control.s +++ b/llvm/test/MC/Xtensa/Core/processor-control.s @@ -20,6 +20,11 @@ esync # CHECK: encoding: [0x00,0x20,0x00] isync +# Instruction format CALLX +# CHECK-INST: ill +# CHECK: encoding: [0x00,0x00,0x00] +ill + # Instruction format RRR # CHECK-INST: nop # CHECK: encoding: [0xf0,0x20,0x00] diff --git a/llvm/test/MC/Xtensa/coprocessor.s b/llvm/test/MC/Xtensa/coprocessor.s new file mode 100644 index 0000000000000..dca8c55fd72cb --- /dev/null +++ b/llvm/test/MC/Xtensa/coprocessor.s @@ -0,0 +1,20 @@ +# RUN: llvm-mc %s -triple=xtensa -show-encoding --mattr=+coprocessor \ +# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s + +.align 4 +LBL0: + +#Instruction format RRR +#CHECK-INST: xsr a2, cpenable +#CHECK: encoding: [0x20,0xe0,0x61] +xsr a2,cpenable + +#Instruction format RRR +#CHECK-INST: xsr a2, cpenable +#CHECK: encoding: [0x20,0xe0,0x61] +xsr.cpenable a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, cpenable +#CHECK: encoding: [0x20,0xe0,0x61] +xsr a2, 224 diff --git a/llvm/test/MC/Xtensa/debug-invalid.s b/llvm/test/MC/Xtensa/debug-invalid.s new file mode 100644 index 0000000000000..74f0df9fe8148 --- /dev/null +++ b/llvm/test/MC/Xtensa/debug-invalid.s @@ -0,0 +1,9 @@ +# RUN: not llvm-mc -triple xtensa --mattr=+debug,+density %s 2>&1 | FileCheck %s + +LBL0: + +# Out of range immediates + +# uimm4 +break 16, 0 +# CHECK: :[[#@LINE-1]]:7: error: expected immediate in range [0, 15] diff --git a/llvm/test/MC/Xtensa/debug.s b/llvm/test/MC/Xtensa/debug.s new file mode 100644 index 0000000000000..36b1f110d120b --- /dev/null +++ b/llvm/test/MC/Xtensa/debug.s @@ -0,0 +1,190 @@ +# RUN: llvm-mc %s -triple=xtensa -show-encoding --mattr=+debug,+density \ +# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s + +.align 4 +LBL0: + +# Instruction format RRR +# CHECK-INST: break 1, 1 +# CHECK: encoding: [0x10,0x41,0x00] +break 1, 1 + +# Instruction format RRRN +# CHECK-INST: break.n 1 +# CHECK: encoding: [0x2c,0xf1] +break.n 1 + +# Instruction format RRR +# CHECK-INST: lddr32.p a3 +# CHECK: encoding: [0xe0,0x73,0x00] +lddr32.p a3 + +# Instruction format RRR +# CHECK-INST: sddr32.p a3 +# CHECK: encoding: [0xf0,0x73,0x00] +sddr32.p a3 + +#Instruction format RRR +#CHECK-INST: xsr a2, icount +#CHECK: encoding: [0x20,0xec,0x61] +xsr a2,icount + +#Instruction format RRR +#CHECK-INST: xsr a2, icount +#CHECK: encoding: [0x20,0xec,0x61] +xsr.icount a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, icount +#CHECK: encoding: [0x20,0xec,0x61] +xsr a2, 236 + +#Instruction format RRR +#CHECK-INST: xsr a2, icountlevel +#CHECK: encoding: [0x20,0xed,0x61] +xsr a2,icountlevel + +#Instruction format RRR +#CHECK-INST: xsr a2, icountlevel +#CHECK: encoding: [0x20,0xed,0x61] +xsr.icountlevel a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, icountlevel +#CHECK: encoding: [0x20,0xed,0x61] +xsr a2, 237 + +#Instruction format RRR +#CHECK-INST: xsr a2, ibreaka0 +#CHECK: encoding: [0x20,0x80,0x61] +xsr a2,ibreaka0 + +#Instruction format RRR +#CHECK-INST: xsr a2, ibreaka0 +#CHECK: encoding: [0x20,0x80,0x61] +xsr.ibreaka0 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, ibreaka0 +#CHECK: encoding: [0x20,0x80,0x61] +xsr a2, 128 + +#Instruction format RRR +#CHECK-INST: xsr a2, ibreaka1 +#CHECK: encoding: [0x20,0x81,0x61] +xsr a2,ibreaka1 + +#Instruction format RRR +#CHECK-INST: xsr a2, ibreaka1 +#CHECK: encoding: [0x20,0x81,0x61] +xsr.ibreaka1 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, ibreaka1 +#CHECK: encoding: [0x20,0x81,0x61] +xsr a2, 129 + +#Instruction format RRR +#CHECK-INST: xsr a2, dbreaka0 +#CHECK: encoding: [0x20,0x90,0x61] +xsr a2,dbreaka0 + +#Instruction format RRR +#CHECK-INST: xsr a2, dbreaka0 +#CHECK: encoding: [0x20,0x90,0x61] +xsr.dbreaka0 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, dbreaka0 +#CHECK: encoding: [0x20,0x90,0x61] +xsr a2, 144 + +#Instruction format RRR +#CHECK-INST: xsr a2, dbreaka1 +#CHECK: encoding: [0x20,0x91,0x61] +xsr a2,dbreaka1 + +#Instruction format RRR +#CHECK-INST: xsr a2, dbreaka1 +#CHECK: encoding: [0x20,0x91,0x61] +xsr.dbreaka1 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, dbreaka1 +#CHECK: encoding: [0x20,0x91,0x61] +xsr a2, 145 + +#Instruction format RRR +#CHECK-INST: xsr a2, dbreakc0 +#CHECK: encoding: [0x20,0xa0,0x61] +xsr a2,dbreakc0 + +#Instruction format RRR +#CHECK-INST: xsr a2, dbreakc0 +#CHECK: encoding: [0x20,0xa0,0x61] +xsr.dbreakc0 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, dbreakc0 +#CHECK: encoding: [0x20,0xa0,0x61] +xsr a2, 160 + +#Instruction format RRR +#CHECK-INST: xsr a2, dbreakc1 +#CHECK: encoding: [0x20,0xa1,0x61] +xsr a2,dbreakc1 + +#Instruction format RRR +#CHECK-INST: xsr a2, dbreakc1 +#CHECK: encoding: [0x20,0xa1,0x61] +xsr.dbreakc1 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, dbreakc1 +#CHECK: encoding: [0x20,0xa1,0x61] +xsr a2, 161 + +#Instruction format RRR +#CHECK-INST: xsr a2, ibreakenable +#CHECK: encoding: [0x20,0x60,0x61] +xsr a2,ibreakenable + +#Instruction format RRR +#CHECK-INST: xsr a2, ibreakenable +#CHECK: encoding: [0x20,0x60,0x61] +xsr.ibreakenable a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, ibreakenable +#CHECK: encoding: [0x20,0x60,0x61] +xsr a2, 96 + +#Instruction format RRR +#CHECK-INST: rsr a2, debugcause +#CHECK: encoding: [0x20,0xe9,0x03] +rsr a2,debugcause + +#Instruction format RRR +#CHECK-INST: rsr a2, debugcause +#CHECK: encoding: [0x20,0xe9,0x03] +rsr.debugcause a2 + +#Instruction format RRR +#CHECK-INST: rsr a2, debugcause +#CHECK: encoding: [0x20,0xe9,0x03] +rsr a2, 233 + +#Instruction format RRR +#CHECK-INST: xsr a2, ddr +#CHECK: encoding: [0x20,0x68,0x61] +xsr a2,ddr + +#Instruction format RRR +#CHECK-INST: xsr a2, ddr +#CHECK: encoding: [0x20,0x68,0x61] +xsr.ddr a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, ddr +#CHECK: encoding: [0x20,0x68,0x61] +xsr a2, 104 diff --git a/llvm/test/MC/Xtensa/exception.s b/llvm/test/MC/Xtensa/exception.s new file mode 100644 index 0000000000000..7084ddacf0136 --- /dev/null +++ b/llvm/test/MC/Xtensa/exception.s @@ -0,0 +1,100 @@ +# RUN: llvm-mc %s -triple=xtensa -show-encoding --mattr=+exception \ +# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s + +.align 4 +LBL0: + +# Instruction format RRR +# CHECK-INST: excw +# CHECK: encoding: [0x80,0x20,0x00] +excw + +# Instruction format RRR +# CHECK-INST: syscall +# CHECK: encoding: [0x00,0x50,0x00] +syscall + +# Instruction format RRR +# CHECK-INST: rfe +# CHECK: encoding: [0x00,0x30,0x00] +rfe + +# Instruction format RRR +# CHECK-INST: rfde +# CHECK: encoding: [0x00,0x32,0x00] +rfde + +# Instruction format RRR +# CHECK-INST: xsr a2, epc1 +# CHECK: encoding: [0x20,0xb1,0x61] +xsr a2, epc1 + +# Instruction format RRR +# CHECK-INST: xsr a2, epc1 +# CHECK: encoding: [0x20,0xb1,0x61] +xsr.epc1 a2 + +# Instruction format RRR +# CHECK-INST: xsr a2, epc1 +# CHECK: encoding: [0x20,0xb1,0x61] +xsr a2, 177 + +# Instruction format RRR +# CHECK-INST: xsr a2, excsave1 +# CHECK: encoding: [0x20,0xd1,0x61] +xsr a2, excsave1 + +# Instruction format RRR +# CHECK-INST: xsr a2, excsave1 +# CHECK: encoding: [0x20,0xd1,0x61] +xsr.excsave1 a2 + +# Instruction format RRR +# CHECK-INST: xsr a2, excsave1 +# CHECK: encoding: [0x20,0xd1,0x61] +xsr a2, 209 + +# Instruction format RRR +# CHECK-INST: xsr a2, exccause +# CHECK: encoding: [0x20,0xe8,0x61] +xsr a2, exccause + +# Instruction format RRR +# CHECK-INST: xsr a2, exccause +# CHECK: encoding: [0x20,0xe8,0x61] +xsr.exccause a2 + +# Instruction format RRR +# CHECK-INST: xsr a2, exccause +# CHECK: encoding: [0x20,0xe8,0x61] +xsr a2, 232 + +# Instruction format RRR +# CHECK-INST: xsr a2, excvaddr +# CHECK: encoding: [0x20,0xee,0x61] +xsr a2, excvaddr + +# Instruction format RRR +# CHECK-INST: xsr a2, excvaddr +# CHECK: encoding: [0x20,0xee,0x61] +xsr.excvaddr a2 + +# Instruction format RRR +# CHECK-INST: xsr a2, excvaddr +# CHECK: encoding: [0x20,0xee,0x61] +xsr a2, 238 + +# Instruction format RRR +# CHECK-INST: xsr a2, depc +# CHECK: encoding: [0x20,0xc0,0x61] +xsr a2, depc + +# Instruction format RRR +# CHECK-INST: xsr a2, depc +# CHECK: encoding: [0x20,0xc0,0x61] +xsr.depc a2 + +# Instruction format RRR +# CHECK-INST: xsr a2, depc +# CHECK: encoding: [0x20,0xc0,0x61] +xsr a2, 192 diff --git a/llvm/test/MC/Xtensa/highinterrupts.s b/llvm/test/MC/Xtensa/highinterrupts.s new file mode 100644 index 0000000000000..4908176b1b030 --- /dev/null +++ b/llvm/test/MC/Xtensa/highinterrupts.s @@ -0,0 +1,280 @@ +# RUN: llvm-mc %s -triple=xtensa -show-encoding --mattr=+highpriinterrupts,+highpriinterrupts-level7 \ +# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s + +.align 4 +LBL0: + +# Instruction format RRR +# CHECK-INST: rfi 1 +# CHECK: encoding: [0x10,0x31,0x00] +rfi 1 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc2 +#CHECK: encoding: [0x20,0xb2,0x61] +xsr a2,epc2 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc2 +#CHECK: encoding: [0x20,0xb2,0x61] +xsr.epc2 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc2 +#CHECK: encoding: [0x20,0xb2,0x61] +xsr a2, 178 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc3 +#CHECK: encoding: [0x20,0xb3,0x61] +xsr a2,epc3 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc3 +#CHECK: encoding: [0x20,0xb3,0x61] +xsr.epc3 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc3 +#CHECK: encoding: [0x20,0xb3,0x61] +xsr a2, 179 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc4 +#CHECK: encoding: [0x20,0xb4,0x61] +xsr a2,epc4 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc4 +#CHECK: encoding: [0x20,0xb4,0x61] +xsr.epc4 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc4 +#CHECK: encoding: [0x20,0xb4,0x61] +xsr a2, 180 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc5 +#CHECK: encoding: [0x20,0xb5,0x61] +xsr a2,epc5 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc5 +#CHECK: encoding: [0x20,0xb5,0x61] +xsr.epc5 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc5 +#CHECK: encoding: [0x20,0xb5,0x61] +xsr a2, 181 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc6 +#CHECK: encoding: [0x20,0xb6,0x61] +xsr a2,epc6 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc6 +#CHECK: encoding: [0x20,0xb6,0x61] +xsr.epc6 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc6 +#CHECK: encoding: [0x20,0xb6,0x61] +xsr a2, 182 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc7 +#CHECK: encoding: [0x20,0xb7,0x61] +xsr a2,epc7 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc7 +#CHECK: encoding: [0x20,0xb7,0x61] +xsr.epc7 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, epc7 +#CHECK: encoding: [0x20,0xb7,0x61] +xsr a2, 183 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps2 +#CHECK: encoding: [0x20,0xc2,0x61] +xsr a2,eps2 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps2 +#CHECK: encoding: [0x20,0xc2,0x61] +xsr.eps2 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps2 +#CHECK: encoding: [0x20,0xc2,0x61] +xsr a2, 194 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps3 +#CHECK: encoding: [0x20,0xc3,0x61] +xsr a2,eps3 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps3 +#CHECK: encoding: [0x20,0xc3,0x61] +xsr.eps3 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps3 +#CHECK: encoding: [0x20,0xc3,0x61] +xsr a2, 195 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps4 +#CHECK: encoding: [0x20,0xc4,0x61] +xsr a2,eps4 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps4 +#CHECK: encoding: [0x20,0xc4,0x61] +xsr.eps4 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps4 +#CHECK: encoding: [0x20,0xc4,0x61] +xsr a2, 196 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps5 +#CHECK: encoding: [0x20,0xc5,0x61] +xsr a2,eps5 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps5 +#CHECK: encoding: [0x20,0xc5,0x61] +xsr.eps5 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps5 +#CHECK: encoding: [0x20,0xc5,0x61] +xsr a2, 197 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps6 +#CHECK: encoding: [0x20,0xc6,0x61] +xsr a2,eps6 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps6 +#CHECK: encoding: [0x20,0xc6,0x61] +xsr.eps6 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps6 +#CHECK: encoding: [0x20,0xc6,0x61] +xsr a2, 198 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps7 +#CHECK: encoding: [0x20,0xc7,0x61] +xsr a2,eps7 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps7 +#CHECK: encoding: [0x20,0xc7,0x61] +xsr.eps7 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, eps7 +#CHECK: encoding: [0x20,0xc7,0x61] +xsr a2, 199 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave2 +#CHECK: encoding: [0x20,0xd2,0x61] +xsr a2,excsave2 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave2 +#CHECK: encoding: [0x20,0xd2,0x61] +xsr.excsave2 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave2 +#CHECK: encoding: [0x20,0xd2,0x61] +xsr a2, 210 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave3 +#CHECK: encoding: [0x20,0xd3,0x61] +xsr a2,excsave3 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave3 +#CHECK: encoding: [0x20,0xd3,0x61] +xsr.excsave3 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave3 +#CHECK: encoding: [0x20,0xd3,0x61] +xsr a2, 211 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave4 +#CHECK: encoding: [0x20,0xd4,0x61] +xsr a2,excsave4 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave4 +#CHECK: encoding: [0x20,0xd4,0x61] +xsr.excsave4 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave4 +#CHECK: encoding: [0x20,0xd4,0x61] +xsr a2, 212 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave5 +#CHECK: encoding: [0x20,0xd5,0x61] +xsr a2,excsave5 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave5 +#CHECK: encoding: [0x20,0xd5,0x61] +xsr.excsave5 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave5 +#CHECK: encoding: [0x20,0xd5,0x61] +xsr a2, 213 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave6 +#CHECK: encoding: [0x20,0xd6,0x61] +xsr a2,excsave6 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave6 +#CHECK: encoding: [0x20,0xd6,0x61] +xsr.excsave6 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave6 +#CHECK: encoding: [0x20,0xd6,0x61] +xsr a2, 214 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave7 +#CHECK: encoding: [0x20,0xd7,0x61] +xsr a2,excsave7 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave7 +#CHECK: encoding: [0x20,0xd7,0x61] +xsr.excsave7 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, excsave7 +#CHECK: encoding: [0x20,0xd7,0x61] +xsr a2, 215 diff --git a/llvm/test/MC/Xtensa/interrupt.s b/llvm/test/MC/Xtensa/interrupt.s new file mode 100644 index 0000000000000..cb1b82dbfe5aa --- /dev/null +++ b/llvm/test/MC/Xtensa/interrupt.s @@ -0,0 +1,60 @@ +# RUN: llvm-mc %s -triple=xtensa -show-encoding --mattr=+interrupt \ +# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s + +.align 4 +LBL0: + +# Instruction format RRR +# CHECK-INST: rsil a2, 1 +# CHECK: encoding: [0x20,0x61,0x00] +rsil a2, 1 + +# Instruction format RRR +# CHECK-INST: waiti 1 +# CHECK: encoding: [0x00,0x71,0x00] +waiti 1 + +#Instruction format RRR +#CHECK-INST: rsr a2, interrupt +#CHECK: encoding: [0x20,0xe2,0x03] +rsr a2, interrupt + +#Instruction format RRR +#CHECK-INST: rsr a2, interrupt +#CHECK: encoding: [0x20,0xe2,0x03] +rsr.interrupt a2 + +#Instruction format RRR +#CHECK-INST: rsr a2, interrupt +#CHECK: encoding: [0x20,0xe2,0x03] +rsr a2, 226 + +#Instruction format RRR +#CHECK-INST: wsr a2, intclear +#CHECK: encoding: [0x20,0xe3,0x13] +wsr a2, intclear + +#Instruction format RRR +#CHECK-INST: wsr a2, intclear +#CHECK: encoding: [0x20,0xe3,0x13] +wsr.intclear a2 + +#Instruction format RRR +#CHECK-INST: wsr a2, intclear +#CHECK: encoding: [0x20,0xe3,0x13] +wsr a2, 227 + +#Instruction format RRR +#CHECK-INST: xsr a2, intenable +#CHECK: encoding: [0x20,0xe4,0x61] +xsr a2, intenable + +#Instruction format RRR +#CHECK-INST: xsr a2, intenable +#CHECK: encoding: [0x20,0xe4,0x61] +xsr.intenable a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, intenable +#CHECK: encoding: [0x20,0xe4,0x61] +xsr a2, 228 diff --git a/llvm/test/MC/Xtensa/prid.s b/llvm/test/MC/Xtensa/prid.s new file mode 100644 index 0000000000000..75fcc151e8eff --- /dev/null +++ b/llvm/test/MC/Xtensa/prid.s @@ -0,0 +1,20 @@ +# RUN: llvm-mc %s -triple=xtensa -show-encoding --mattr=+prid \ +# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s + +.align 4 +LBL0: + +#Instruction format RRR +#CHECK-INST: rsr a2, prid +#CHECK: encoding: [0x20,0xeb,0x03] +rsr a2,prid + +#Instruction format RRR +#CHECK-INST: rsr a2, prid +#CHECK: encoding: [0x20,0xeb,0x03] +rsr.prid a2 + +#Instruction format RRR +#CHECK-INST: rsr a2, prid +#CHECK: encoding: [0x20,0xeb,0x03] +rsr a2, 235 diff --git a/llvm/test/MC/Xtensa/timer.s b/llvm/test/MC/Xtensa/timer.s new file mode 100644 index 0000000000000..f1fc9709cdec9 --- /dev/null +++ b/llvm/test/MC/Xtensa/timer.s @@ -0,0 +1,65 @@ +# RUN: llvm-mc %s -triple=xtensa -show-encoding --mattr=+timers3 \ +# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s + +.align 4 +LBL0: + +#Instruction format RRR +#CHECK-INST: xsr a2, ccount +#CHECK: encoding: [0x20,0xea,0x61] +xsr a2,ccount + +#Instruction format RRR +#CHECK-INST: xsr a2, ccount +#CHECK: encoding: [0x20,0xea,0x61] +xsr.ccount a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, ccount +#CHECK: encoding: [0x20,0xea,0x61] +xsr a2, 234 + +#Instruction format RRR +#CHECK-INST: xsr a2, ccompare0 +#CHECK: encoding: [0x20,0xf0,0x61] +xsr a2,ccompare0 + +#Instruction format RRR +#CHECK-INST: xsr a2, ccompare0 +#CHECK: encoding: [0x20,0xf0,0x61] +xsr.ccompare0 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, ccompare0 +#CHECK: encoding: [0x20,0xf0,0x61] +xsr a2, 240 + +#Instruction format RRR +#CHECK-INST: xsr a2, ccompare1 +#CHECK: encoding: [0x20,0xf1,0x61] +xsr a2,ccompare1 + +#Instruction format RRR +#CHECK-INST: xsr a2, ccompare1 +#CHECK: encoding: [0x20,0xf1,0x61] +xsr.ccompare1 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, ccompare1 +#CHECK: encoding: [0x20,0xf1,0x61] +xsr a2, 241 + +#Instruction format RRR +#CHECK-INST: xsr a2, ccompare2 +#CHECK: encoding: [0x20,0xf2,0x61] +xsr a2,ccompare2 + +#Instruction format RRR +#CHECK-INST: xsr a2, ccompare2 +#CHECK: encoding: [0x20,0xf2,0x61] +xsr.ccompare2 a2 + +#Instruction format RRR +#CHECK-INST: xsr a2, ccompare2 +#CHECK: encoding: [0x20,0xf2,0x61] +xsr a2, 242