diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/MicroMips32r6InstrFormats.td | 18 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/MicroMips32r6InstrInfo.td | 29 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/MicroMipsInstrInfo.td | 12 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/MipsISelLowering.cpp | 16 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/MipsSERegisterInfo.cpp | 2 |
6 files changed, 64 insertions, 15 deletions
diff --git a/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp b/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp index 4cbfca4c643..eb2c33d2f4c 100644 --- a/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp +++ b/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp @@ -1860,7 +1860,7 @@ static DecodeStatus DecodeMemMMImm9(MCInst &Inst, Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg); Base = getReg(Decoder, Mips::GPR32RegClassID, Base); - if (Inst.getOpcode() == Mips::SCE_MM) + if (Inst.getOpcode() == Mips::SCE_MM || Inst.getOpcode() == Mips::SC_MMR6) Inst.addOperand(MCOperand::createReg(Reg)); Inst.addOperand(MCOperand::createReg(Reg)); diff --git a/llvm/lib/Target/Mips/MicroMips32r6InstrFormats.td b/llvm/lib/Target/Mips/MicroMips32r6InstrFormats.td index 159eefe3979..1540e09efdd 100644 --- a/llvm/lib/Target/Mips/MicroMips32r6InstrFormats.td +++ b/llvm/lib/Target/Mips/MicroMips32r6InstrFormats.td @@ -1032,3 +1032,21 @@ class POOL32B_LDWC2_SDWC2_FM_MMR6<string instr_asm, bits<4> funct> let Inst{11} = 0; let Inst{10-0} = offset; } + +class POOL32C_LL_E_SC_E_FM_MMR6<string instr_asm, bits<4> majorFunc, + bits<3> minorFunc> + : MMR6Arch<instr_asm>, MipsR6Inst { + bits<5> rt; + bits<21> addr; + bits<5> base = addr{20-16}; + bits<9> offset = addr{8-0}; + + bits<32> Inst; + + let Inst{31-26} = 0b011000; + let Inst{25-21} = rt; + let Inst{20-16} = base; + let Inst{15-12} = majorFunc; + let Inst{11-9} = minorFunc; + let Inst{8-0} = offset; +} diff --git a/llvm/lib/Target/Mips/MicroMips32r6InstrInfo.td b/llvm/lib/Target/Mips/MicroMips32r6InstrInfo.td index 44fec45cb29..185c37fea0f 100644 --- a/llvm/lib/Target/Mips/MicroMips32r6InstrInfo.td +++ b/llvm/lib/Target/Mips/MicroMips32r6InstrInfo.td @@ -234,6 +234,9 @@ class SDC2_MMR6_ENC : POOL32B_LDWC2_SDWC2_FM_MMR6<"sdc2", 0b1010>; class LWC2_MMR6_ENC : POOL32B_LDWC2_SDWC2_FM_MMR6<"lwc2", 0b0000>; class SWC2_MMR6_ENC : POOL32B_LDWC2_SDWC2_FM_MMR6<"swc2", 0b1000>; +class LL_MMR6_ENC : POOL32C_LL_E_SC_E_FM_MMR6<"ll", 0b0011, 0b000>; +class SC_MMR6_ENC : POOL32C_LL_E_SC_E_FM_MMR6<"sc", 0b1011, 0b000>; + /// Floating Point Instructions class FADD_S_MMR6_ENC : POOL32F_ARITH_FM_MMR6<"add.s", 0, 0b00110000>; class FSUB_S_MMR6_ENC : POOL32F_ARITH_FM_MMR6<"sub.s", 0, 0b01110000>; @@ -847,6 +850,30 @@ class GINVI_MMR6_DESC : GINV_MMR6_DESC_BASE<"ginvi", GPR32Opnd, class GINVT_MMR6_DESC : GINV_MMR6_DESC_BASE<"ginvt", GPR32Opnd, II_GINVT>; +class SC_MMR6_DESC_BASE<string opstr, InstrItinClass itin> { + dag OutOperandList = (outs GPR32Opnd:$dst); + dag InOperandList = (ins GPR32Opnd:$rt, mem_mm_9:$addr); + string AsmString = !strconcat(opstr, "\t$rt, $addr"); + InstrItinClass Itinerary = itin; + string BaseOpcode = opstr; + bit mayStore = 1; + string Constraints = "$rt = $dst"; + string DecoderMethod = "DecodeMemMMImm9"; +} + +class LL_MMR6_DESC_BASE<string opstr, InstrItinClass itin> { + dag OutOperandList = (outs GPR32Opnd:$rt); + dag InOperandList = (ins mem_mm_9:$addr); + string AsmString = !strconcat(opstr, "\t$rt, $addr"); + InstrItinClass Itinerary = itin; + string BaseOpcode = opstr; + bit mayLoad = 1; + string DecoderMethod = "DecodeMemMMImm9"; +} + +class SC_MMR6_DESC : SC_MMR6_DESC_BASE<"sc", II_SC>; +class LL_MMR6_DESC : LL_MMR6_DESC_BASE<"ll", II_LL>; + /// Floating Point Instructions class FARITH_MMR6_DESC_BASE<string instr_asm, RegisterOperand RC, InstrItinClass Itin, bit isComm, @@ -1593,6 +1620,8 @@ def LDC2_MMR6 : StdMMR6Rel, LDC2_MMR6_ENC, LDC2_MMR6_DESC, ISA_MICROMIPS32R6; def SDC2_MMR6 : StdMMR6Rel, SDC2_MMR6_ENC, SDC2_MMR6_DESC, ISA_MICROMIPS32R6; def LWC2_MMR6 : StdMMR6Rel, LWC2_MMR6_ENC, LWC2_MMR6_DESC, ISA_MICROMIPS32R6; def SWC2_MMR6 : StdMMR6Rel, SWC2_MMR6_ENC, SWC2_MMR6_DESC, ISA_MICROMIPS32R6; +def LL_MMR6 : R6MMR6Rel, LL_MMR6_ENC, LL_MMR6_DESC, ISA_MICROMIPS32R6; +def SC_MMR6 : R6MMR6Rel, SC_MMR6_ENC, SC_MMR6_DESC, ISA_MICROMIPS32R6; } def BOVC_MMR6 : R6MMR6Rel, BOVC_MMR6_ENC, BOVC_MMR6_DESC, ISA_MICROMIPS32R6, diff --git a/llvm/lib/Target/Mips/MicroMipsInstrInfo.td b/llvm/lib/Target/Mips/MicroMipsInstrInfo.td index a8c053b440d..e97ba095153 100644 --- a/llvm/lib/Target/Mips/MicroMipsInstrInfo.td +++ b/llvm/lib/Target/Mips/MicroMipsInstrInfo.td @@ -1041,13 +1041,13 @@ let DecoderNamespace = "MicroMips" in { TEQI_FM_MM<0x0a>, ISA_MICROMIPS32_NOT_MIPS32R6; def TNEI_MM : MMRel, TEQI_FT<"tnei", GPR32Opnd, II_TNEI>, TEQI_FM_MM<0x0c>, ISA_MICROMIPS32_NOT_MIPS32R6; -} -let DecoderNamespace = "MicroMips", Predicates = [InMicroMips] in { + /// Load-linked, Store-conditional - def LL_MM : LLBaseMM<"ll", GPR32Opnd>, LL_FM_MM<0x3>; - def SC_MM : SCBaseMM<"sc", GPR32Opnd>, LL_FM_MM<0xb>; -} -let DecoderNamespace = "MicroMips" in { + def LL_MM : LLBaseMM<"ll", GPR32Opnd>, LL_FM_MM<0x3>, + ISA_MICROMIPS32_NOT_MIPS32R6; + def SC_MM : SCBaseMM<"sc", GPR32Opnd>, LL_FM_MM<0xb>, + ISA_MICROMIPS32_NOT_MIPS32R6; + def LLE_MM : MMRel, LLEBaseMM<"lle", GPR32Opnd>, LLE_FM_MM<0x6>, ISA_MICROMIPS, ASE_EVA; def SCE_MM : MMRel, SCEBaseMM<"sce", GPR32Opnd>, LLE_FM_MM<0xA>, diff --git a/llvm/lib/Target/Mips/MipsISelLowering.cpp b/llvm/lib/Target/Mips/MipsISelLowering.cpp index 74797e69c55..1aa6db61735 100644 --- a/llvm/lib/Target/Mips/MipsISelLowering.cpp +++ b/llvm/lib/Target/Mips/MipsISelLowering.cpp @@ -1433,8 +1433,8 @@ MachineBasicBlock *MipsTargetLowering::emitAtomicBinary(MachineInstr &MI, if (Size == 4) { if (isMicroMips) { - LL = Mips::LL_MM; - SC = Mips::SC_MM; + LL = Subtarget.hasMips32r6() ? Mips::LL_MMR6 : Mips::LL_MM; + SC = Subtarget.hasMips32r6() ? Mips::SC_MMR6 : Mips::SC_MM; } else { LL = Subtarget.hasMips32r6() ? (ArePtrs64bit ? Mips::LL64_R6 : Mips::LL_R6) @@ -1580,8 +1580,8 @@ MachineBasicBlock *MipsTargetLowering::emitAtomicBinaryPartword( unsigned LL, SC; if (isMicroMips) { - LL = Mips::LL_MM; - SC = Mips::SC_MM; + LL = Subtarget.hasMips32r6() ? Mips::LL_MMR6 : Mips::LL_MM; + SC = Subtarget.hasMips32r6() ? Mips::SC_MMR6 : Mips::SC_MM; } else { LL = Subtarget.hasMips32r6() ? (ArePtrs64bit ? Mips::LL64_R6 : Mips::LL_R6) : (ArePtrs64bit ? Mips::LL64 : Mips::LL); @@ -1721,8 +1721,8 @@ MachineBasicBlock *MipsTargetLowering::emitAtomicCmpSwap(MachineInstr &MI, if (Size == 4) { if (isMicroMips) { - LL = Mips::LL_MM; - SC = Mips::SC_MM; + LL = Subtarget.hasMips32r6() ? Mips::LL_MMR6 : Mips::LL_MM; + SC = Subtarget.hasMips32r6() ? Mips::SC_MMR6 : Mips::SC_MM; } else { LL = Subtarget.hasMips32r6() ? (ArePtrs64bit ? Mips::LL64_R6 : Mips::LL_R6) @@ -1835,8 +1835,8 @@ MachineBasicBlock *MipsTargetLowering::emitAtomicCmpSwapPartword( unsigned LL, SC; if (isMicroMips) { - LL = Mips::LL_MM; - SC = Mips::SC_MM; + LL = Subtarget.hasMips32r6() ? Mips::LL_MMR6 : Mips::LL_MM; + SC = Subtarget.hasMips32r6() ? Mips::SC_MMR6 : Mips::SC_MM; } else { LL = Subtarget.hasMips32r6() ? (ArePtrs64bit ? Mips::LL64_R6 : Mips::LL_R6) : (ArePtrs64bit ? Mips::LL64 : Mips::LL); diff --git a/llvm/lib/Target/Mips/MipsSERegisterInfo.cpp b/llvm/lib/Target/Mips/MipsSERegisterInfo.cpp index c61b9db8084..e7d720a4b76 100644 --- a/llvm/lib/Target/Mips/MipsSERegisterInfo.cpp +++ b/llvm/lib/Target/Mips/MipsSERegisterInfo.cpp @@ -98,6 +98,8 @@ static inline unsigned getLoadStoreOffsetSizeInBits(const unsigned Opcode, case Mips::SC64_R6: case Mips::SCD_R6: case Mips::SC_R6: + case Mips::LL_MMR6: + case Mips::SC_MMR6: return 9; case Mips::INLINEASM: { unsigned ConstraintID = InlineAsm::getMemoryConstraintID(MO.getImm()); |