From 4f99836a9e7228827bde6f205ec487cdd022c93f Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Fri, 30 Mar 2018 15:29:47 +0000 Subject: [PATCH] [Hexagon] Recognize and handle :endloop01 llvm-svn: 328870 --- .../lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp | 11 +++++++---- llvm/lib/Target/Hexagon/HexagonPseudo.td | 7 +++++++ .../Hexagon/MCTargetDesc/HexagonInstPrinter.cpp | 19 ++++++++++--------- llvm/test/MC/Hexagon/capitalizedEndloop.s | 13 ++++++++++--- 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp b/llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp index 8c7596a..1d15a27 100644 --- a/llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp +++ b/llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp @@ -506,16 +506,19 @@ bool HexagonAsmParser::matchBundleOptions() { "supported with this architecture"; StringRef Option = Parser.getTok().getString(); auto IDLoc = Parser.getTok().getLoc(); - if (Option.compare_lower("endloop0") == 0) + if (Option.compare_lower("endloop01") == 0) { HexagonMCInstrInfo::setInnerLoop(MCB); - else if (Option.compare_lower("endloop1") == 0) HexagonMCInstrInfo::setOuterLoop(MCB); - else if (Option.compare_lower("mem_noshuf") == 0) + } else if (Option.compare_lower("endloop0") == 0) { + HexagonMCInstrInfo::setInnerLoop(MCB); + } else if (Option.compare_lower("endloop1") == 0) { + HexagonMCInstrInfo::setOuterLoop(MCB); + } else if (Option.compare_lower("mem_noshuf") == 0) { if (getSTI().getFeatureBits()[Hexagon::FeatureMemNoShuf]) HexagonMCInstrInfo::setMemReorderDisabled(MCB); else return getParser().Error(IDLoc, MemNoShuffMsg); - else + } else return getParser().Error(IDLoc, llvm::Twine("'") + Option + "' is not a valid bundle option"); Lex(); diff --git a/llvm/lib/Target/Hexagon/HexagonPseudo.td b/llvm/lib/Target/Hexagon/HexagonPseudo.td index b6c837e..0a8907d 100644 --- a/llvm/lib/Target/Hexagon/HexagonPseudo.td +++ b/llvm/lib/Target/Hexagon/HexagonPseudo.td @@ -102,6 +102,13 @@ def ENDLOOP1 : Endloop<(outs), (ins b30_2Imm:$offset), []>; } +let isBranch = 1, isTerminator = 1, hasSideEffects = 0, + Defs = [PC, LC0, LC1], Uses = [SA0, SA1, LC0, LC1] in { +def ENDLOOP01 : Endloop<(outs), (ins b30_2Imm:$offset), + ":endloop01", + []>; +} + let isExtendable = 1, isExtentSigned = 1, opExtentBits = 9, opExtentAlign = 2, opExtendable = 0, hasSideEffects = 0 in class LOOP_iBase diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonInstPrinter.cpp b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonInstPrinter.cpp index 1929152..4142b99 100644 --- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonInstPrinter.cpp +++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonInstPrinter.cpp @@ -69,16 +69,17 @@ void HexagonInstPrinter::printInst(const MCInst *MI, raw_ostream &OS, OS << "\n"; } - auto Separator = ""; if (HexagonMCInstrInfo::isInnerLoop(*MI)) { - OS << Separator; - Separator = " "; - MCInst ME; - ME.setOpcode(Hexagon::ENDLOOP0); - printInstruction(&ME, OS); - } - if (HexagonMCInstrInfo::isOuterLoop(*MI)) { - OS << Separator; + if (HexagonMCInstrInfo::isOuterLoop(*MI)) { + MCInst ME; + ME.setOpcode(Hexagon::ENDLOOP01); + printInstruction(&ME, OS); + } else { + MCInst ME; + ME.setOpcode(Hexagon::ENDLOOP0); + printInstruction(&ME, OS); + } + } else if (HexagonMCInstrInfo::isOuterLoop(*MI)) { MCInst ME; ME.setOpcode(Hexagon::ENDLOOP1); printInstruction(&ME, OS); diff --git a/llvm/test/MC/Hexagon/capitalizedEndloop.s b/llvm/test/MC/Hexagon/capitalizedEndloop.s index c7a25d9..c65204e 100644 --- a/llvm/test/MC/Hexagon/capitalizedEndloop.s +++ b/llvm/test/MC/Hexagon/capitalizedEndloop.s @@ -11,6 +11,10 @@ { R0 = mpyi(R0,R0) } : ENDLOOP1 { R0 = mpyi(R0,R0) }:endloop1 + { R0 = mpyi(R0,R0) } : endloop01 + { R0 = mpyi(R0,R0) } : ENDLOOP01 + { R0 = mpyi(R0,R0) }:endloop01 + { R0 = mpyi(R0,R0) } : endloop0 : endloop1 { R0 = mpyi(R0,R0) } : ENDLOOP0 : ENDLOOP1 { R0 = mpyi(R0,R0) }:endloop0:endloop1 @@ -22,8 +26,11 @@ # CHECK: :endloop1 # CHECK: :endloop1 # CHECK: :endloop1 -# CHECK: :endloop0 :endloop1 -# CHECK: :endloop0 :endloop1 -# CHECK: :endloop0 :endloop1 +# CHECK: :endloop01 +# CHECK: :endloop01 +# CHECK: :endloop01 +# CHECK: :endloop01 +# CHECK: :endloop01 +# CHECK: :endloop01 -- 2.7.4