From cdcacd75689d685f15f940b3ab8c8d860d8f0f57 Mon Sep 17 00:00:00 2001 From: Zoran Jovanovic Date: Thu, 14 Aug 2014 12:09:10 +0000 Subject: [PATCH] [mips][microMIPS] MicroMIPS Compact Branch Instructions BEQZC and BNEZC Differential Revision: http://reviews.llvm.org/D3545 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215636 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Mips/MicroMipsInstrFormats.td | 12 ++++++++++++ lib/Target/Mips/MicroMipsInstrInfo.td | 16 ++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/lib/Target/Mips/MicroMipsInstrFormats.td b/lib/Target/Mips/MicroMipsInstrFormats.td index 15b951d98c5..90fbce72478 100644 --- a/lib/Target/Mips/MicroMipsInstrFormats.td +++ b/lib/Target/Mips/MicroMipsInstrFormats.td @@ -621,3 +621,15 @@ class MADDS_FM_MM funct>: MMArch { let Inst{10-6} = fr; let Inst{5-0} = funct; } + +class COMPACT_BRANCH_FM_MM funct> { + bits<5> rs; + bits<16> offset; + + bits<32> Inst; + + let Inst{31-26} = 0x10; + let Inst{25-21} = funct; + let Inst{20-16} = rs; + let Inst{15-0} = offset; +} diff --git a/lib/Target/Mips/MicroMipsInstrInfo.td b/lib/Target/Mips/MicroMipsInstrInfo.td index 87a3a3e29ca..f48083bbe6e 100644 --- a/lib/Target/Mips/MicroMipsInstrInfo.td +++ b/lib/Target/Mips/MicroMipsInstrInfo.td @@ -26,6 +26,16 @@ def brtarget_mm : Operand { let DecoderMethod = "DecodeBranchTargetMM"; } +class CompactBranchMM : + InstSE<(outs), (ins RO:$rs, opnd:$offset), + !strconcat(opstr, "\t$rs, $offset"), [], IIBranch, FrmI> { + let isBranch = 1; + let isTerminator = 1; + let hasDelaySlot = 0; + let Defs = [AT]; +} + let canFoldAsLoad = 1 in class LoadLeftRightMM : @@ -104,6 +114,12 @@ class WaitMM : NoItinerary, FrmOther, opstr>; let DecoderNamespace = "MicroMips", Predicates = [InMicroMips] in { + /// Compact Branch Instructions + def BEQZC_MM : CompactBranchMM<"beqzc", brtarget_mm, seteq, GPR32Opnd>, + COMPACT_BRANCH_FM_MM<0x7>; + def BNEZC_MM : CompactBranchMM<"bnezc", brtarget_mm, setne, GPR32Opnd>, + COMPACT_BRANCH_FM_MM<0x5>; + /// Arithmetic Instructions (ALU Immediate) def ADDiu_MM : MMRel, ArithLogicI<"addiu", simm16, GPR32Opnd>, ADDI_FM_MM<0xc>;