diff options
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonAsmPrinter.cpp | 33 | ||||
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonInstrInfo.td | 26 | ||||
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonInstrInfoV3.td | 2 |
4 files changed, 48 insertions, 18 deletions
diff --git a/llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp b/llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp index 6998383f08e..7c70a7e3d0a 100644 --- a/llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp +++ b/llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp @@ -2198,6 +2198,11 @@ int HexagonAsmParser::processInstruction(MCInst &Inst, if (!HexagonMCInstrInfo::mustExtend(*Inst.getOperand(0).getExpr())) Inst.setOpcode(Hexagon::S2_storerinewgp); break; + case Hexagon::A2_zxtb: { + Inst.setOpcode(Hexagon::A2_andir); + Inst.addOperand(MCOperand::createExpr(MCConstantExpr::create(255, Context))); + break; + } } // switch return Match_Success; diff --git a/llvm/lib/Target/Hexagon/HexagonAsmPrinter.cpp b/llvm/lib/Target/Hexagon/HexagonAsmPrinter.cpp index 54db5ad4374..01ba1ccd37f 100644 --- a/llvm/lib/Target/Hexagon/HexagonAsmPrinter.cpp +++ b/llvm/lib/Target/Hexagon/HexagonAsmPrinter.cpp @@ -282,6 +282,36 @@ void HexagonAsmPrinter::HexagonProcessInstruction(MCInst &Inst, break; } + case Hexagon::A2_tfrf: { + Inst.setOpcode(Hexagon::A2_paddif); + Inst.addOperand(MCOperand::createExpr(MCConstantExpr::create(0, OutContext))); + break; + } + + case Hexagon::A2_tfrt: { + Inst.setOpcode(Hexagon::A2_paddit); + Inst.addOperand(MCOperand::createExpr(MCConstantExpr::create(0, OutContext))); + break; + } + + case Hexagon::A2_tfrfnew: { + Inst.setOpcode(Hexagon::A2_paddifnew); + Inst.addOperand(MCOperand::createExpr(MCConstantExpr::create(0, OutContext))); + break; + } + + case Hexagon::A2_tfrtnew: { + Inst.setOpcode(Hexagon::A2_padditnew); + Inst.addOperand(MCOperand::createExpr(MCConstantExpr::create(0, OutContext))); + break; + } + + case Hexagon::A2_zxtb: { + Inst.setOpcode(Hexagon::A2_andir); + Inst.addOperand(MCOperand::createExpr(MCConstantExpr::create(255, OutContext))); + break; + } + // "$dst = CONST64(#$src1)", case Hexagon::CONST64: if (!OutStreamer->hasRawTextSupport()) { @@ -376,6 +406,9 @@ void HexagonAsmPrinter::HexagonProcessInstruction(MCInst &Inst, Rs.setReg(getHexagonRegisterPair(Rs.getReg(), RI)); return; } + case Hexagon::PS_call_nr: + Inst.setOpcode(Hexagon::J2_call); + break; case Hexagon::S5_asrhub_rnd_sat_goodsyntax: { MCOperand &MO = MappedInst.getOperand(2); int64_t Imm; diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfo.td b/llvm/lib/Target/Hexagon/HexagonInstrInfo.td index c5719ad5b6d..16298cae083 100644 --- a/llvm/lib/Target/Hexagon/HexagonInstrInfo.td +++ b/llvm/lib/Target/Hexagon/HexagonInstrInfo.td @@ -401,13 +401,12 @@ def A2_tfril: T_tfr16<0>; def A2_tfrih: T_tfr16<1>; // Conditional transfer is an alias to conditional "Rd = add(Rs, #0)". -let isPredicated = 1, hasNewValue = 1, opNewValue = 0 in +let isPredicated = 1, hasNewValue = 1, isCodeGenOnly = 1, opNewValue = 0, + isPseudo = 1 in class T_tfr_pred<bit isPredNot, bit isPredNew> : ALU32Inst<(outs IntRegs:$dst), (ins PredRegs:$src1, IntRegs:$src2), - "if ("#!if(isPredNot, "!", "")# - "$src1"#!if(isPredNew, ".new", "")# - ") $dst = $src2"> { + ""> { bits<5> dst; bits<2> src1; bits<5> src2; @@ -487,6 +486,11 @@ multiclass TFR64_base<string BaseName> { } } +def A2_tfrfAlias : InstAlias<"if (!$Pu4) $Rd32=$Rs32", (A2_paddif IntRegs:$Rd32, PredRegs:$Pu4, IntRegs:$Rs32, 0)>; +def A2_tfrfnewAlias : InstAlias<"if (!$Pu4.new) $Rd32=$Rs32", (A2_paddifnew IntRegs:$Rd32, PredRegs:$Pu4, IntRegs:$Rs32, 0)>; +def A2_tfrtAlias : InstAlias<"if ($Pu4) $Rd32=$Rs32", (A2_paddit IntRegs:$Rd32, PredRegs:$Pu4, IntRegs:$Rs32, 0)>; +def A2_tfrtnewAlias : InstAlias<"if ($Pu4.new) $Rd32=$Rs32", (A2_padditnew IntRegs:$Rd32, PredRegs:$Pu4, IntRegs:$Rs32, 0)>; + let InputType = "imm", isExtendable = 1, isExtentSigned = 1, opExtentBits = 12, isMoveImm = 1, opExtendable = 2, BaseOpcode = "TFRI", CextOpcode = "TFR", hasSideEffects = 0, isPredicated = 1, hasNewValue = 1 in @@ -699,19 +703,7 @@ defm zxth : ALU32_2op_base<"zxth", 0b110>, PredNewRel; let hasNewValue = 1, opNewValue = 0 in class T_ZXTB: ALU32Inst < (outs IntRegs:$Rd), (ins IntRegs:$Rs), - "$Rd = zxtb($Rs)", [] > { // Rd = and(Rs,255) - bits<5> Rd; - bits<5> Rs; - bits<10> s10 = 255; - - let IClass = 0b0111; - - let Inst{27-22} = 0b011000; - let Inst{4-0} = Rd; - let Inst{20-16} = Rs; - let Inst{21} = s10{9}; - let Inst{13-5} = s10{8-0}; -} + "$Rd=zxtb($Rs)", [] >; //Rd=zxtb(Rs): assembler mapped to "Rd=and(Rs,#255) multiclass ZXTB_base <string mnemonic, bits<3> minOp> { diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfoV3.td b/llvm/lib/Target/Hexagon/HexagonInstrInfoV3.td index 225f9440507..5b7610a68af 100644 --- a/llvm/lib/Target/Hexagon/HexagonInstrInfoV3.td +++ b/llvm/lib/Target/Hexagon/HexagonInstrInfoV3.td @@ -61,7 +61,7 @@ multiclass T_Calls<bit CSR, string ExtStr> { defm J2_call: T_Calls<1, "">, PredRel; let isCodeGenOnly = 1, isCall = 1, hasSideEffects = 1, - Defs = VolatileV3.Regs in + Defs = VolatileV3.Regs, isPseudo = 1 in def PS_call_nr : T_Call<1, "">, PredRel; let isCodeGenOnly = 1, isCall = 1, hasSideEffects = 1, |