diff --git a/lib/Target/Mips/Mips64InstrInfo.td b/lib/Target/Mips/Mips64InstrInfo.td index 9b4b07b5f79..0a3a5003045 100644 --- a/lib/Target/Mips/Mips64InstrInfo.td +++ b/lib/Target/Mips/Mips64InstrInfo.td @@ -46,19 +46,19 @@ class Mult64 func, string instr_asm, InstrItinClass itin>: class Div64 func, string instr_asm, InstrItinClass itin>: Div; -multiclass Atomic2Ops64 { - def #NAME# : Atomic2Ops, +multiclass Atomic2Ops64 { + def #NAME# : Atomic2Ops, Requires<[NotN64, HasStdEnc]>; - def _P8 : Atomic2Ops, + def _P8 : Atomic2Ops, Requires<[IsN64, HasStdEnc]> { let isCodeGenOnly = 1; } } -multiclass AtomicCmpSwap64 { - def #NAME# : AtomicCmpSwap, +multiclass AtomicCmpSwap64 { + def #NAME# : AtomicCmpSwap, Requires<[NotN64, HasStdEnc]>; - def _P8 : AtomicCmpSwap, + def _P8 : AtomicCmpSwap, Requires<[IsN64, HasStdEnc]> { let isCodeGenOnly = 1; } @@ -66,14 +66,14 @@ multiclass AtomicCmpSwap64 { } let usesCustomInserter = 1, Predicates = [HasStdEnc], DecoderNamespace = "Mips64" in { - defm ATOMIC_LOAD_ADD_I64 : Atomic2Ops64; - defm ATOMIC_LOAD_SUB_I64 : Atomic2Ops64; - defm ATOMIC_LOAD_AND_I64 : Atomic2Ops64; - defm ATOMIC_LOAD_OR_I64 : Atomic2Ops64; - defm ATOMIC_LOAD_XOR_I64 : Atomic2Ops64; - defm ATOMIC_LOAD_NAND_I64 : Atomic2Ops64; - defm ATOMIC_SWAP_I64 : Atomic2Ops64; - defm ATOMIC_CMP_SWAP_I64 : AtomicCmpSwap64; + defm ATOMIC_LOAD_ADD_I64 : Atomic2Ops64; + defm ATOMIC_LOAD_SUB_I64 : Atomic2Ops64; + defm ATOMIC_LOAD_AND_I64 : Atomic2Ops64; + defm ATOMIC_LOAD_OR_I64 : Atomic2Ops64; + defm ATOMIC_LOAD_XOR_I64 : Atomic2Ops64; + defm ATOMIC_LOAD_NAND_I64 : Atomic2Ops64; + defm ATOMIC_SWAP_I64 : Atomic2Ops64; + defm ATOMIC_CMP_SWAP_I64 : AtomicCmpSwap64; } //===----------------------------------------------------------------------===// diff --git a/lib/Target/Mips/MipsDSPInstrFormats.td b/lib/Target/Mips/MipsDSPInstrFormats.td index 8e01d06596a..a72a763fde0 100644 --- a/lib/Target/Mips/MipsDSPInstrFormats.td +++ b/lib/Target/Mips/MipsDSPInstrFormats.td @@ -24,8 +24,9 @@ class DSPInst : MipsInst<(outs), (ins), "", [], NoItinerary, FrmOther> { let Predicates = [HasDSP]; } -class PseudoDSP pattern>: - MipsPseudo { +class PseudoDSP pattern, + InstrItinClass itin = IIPseudo>: + MipsPseudo { let Predicates = [HasDSP]; } diff --git a/lib/Target/Mips/MipsDSPInstrInfo.td b/lib/Target/Mips/MipsDSPInstrInfo.td index e28a1389b41..9531b914876 100644 --- a/lib/Target/Mips/MipsDSPInstrInfo.td +++ b/lib/Target/Mips/MipsDSPInstrInfo.td @@ -486,7 +486,7 @@ class MULT_DESC_BASE { } class BPOSGE32_PSEUDO_DESC_BASE : - MipsPseudo<(outs CPURegs:$dst), (ins), "", [(set CPURegs:$dst, (OpNode))]> { + MipsPseudo<(outs CPURegs:$dst), (ins), [(set CPURegs:$dst, (OpNode))]> { list Uses = [DSPCtrl]; bit usesCustomInserter = 1; } diff --git a/lib/Target/Mips/MipsInstrFPU.td b/lib/Target/Mips/MipsInstrFPU.td index 3abc986ab35..ab6f8ab7704 100644 --- a/lib/Target/Mips/MipsInstrFPU.td +++ b/lib/Target/Mips/MipsInstrFPU.td @@ -437,14 +437,13 @@ def FCMP_D64 : CEQS_FT<"d", FGR64, IIFcmp, MipsFPCmp>, CEQS_FM<17>, //===----------------------------------------------------------------------===// // Floating Point Pseudo-Instructions //===----------------------------------------------------------------------===// -def MOVCCRToCCR : PseudoSE<(outs CCR:$dst), (ins CCR:$src), - "# MOVCCRToCCR", []>; +def MOVCCRToCCR : PseudoSE<(outs CCR:$dst), (ins CCR:$src), []>; // This pseudo instr gets expanded into 2 mtc1 instrs after register // allocation. def BuildPairF64 : PseudoSE<(outs AFGR64:$dst), - (ins CPURegs:$lo, CPURegs:$hi), "", + (ins CPURegs:$lo, CPURegs:$hi), [(set AFGR64:$dst, (MipsBuildPairF64 CPURegs:$lo, CPURegs:$hi))]>; // This pseudo instr gets expanded into 2 mfc1 instrs after register @@ -452,7 +451,7 @@ def BuildPairF64 : // if n is 0, lower part of src is extracted. // if n is 1, higher part of src is extracted. def ExtractElementF64 : - PseudoSE<(outs CPURegs:$dst), (ins AFGR64:$src, i32imm:$n), "", + PseudoSE<(outs CPURegs:$dst), (ins AFGR64:$src, i32imm:$n), [(set CPURegs:$dst, (MipsExtractElementF64 AFGR64:$src, imm:$n))]>; //===----------------------------------------------------------------------===// diff --git a/lib/Target/Mips/MipsInstrFormats.td b/lib/Target/Mips/MipsInstrFormats.td index 988ed96cef5..b2633df21b3 100644 --- a/lib/Target/Mips/MipsInstrFormats.td +++ b/lib/Target/Mips/MipsInstrFormats.td @@ -80,15 +80,17 @@ class InstSE pattern, } // Mips Pseudo Instructions Format -class MipsPseudo pattern>: - MipsInst { +class MipsPseudo pattern, + InstrItinClass itin = IIPseudo> : + MipsInst { let isCodeGenOnly = 1; let isPseudo = 1; } // Mips32/64 Pseudo Instruction Format -class PseudoSE pattern>: - MipsPseudo { +class PseudoSE pattern, + InstrItinClass itin = IIPseudo>: + MipsPseudo { let Predicates = [HasStdEnc]; } diff --git a/lib/Target/Mips/MipsInstrInfo.td b/lib/Target/Mips/MipsInstrInfo.td index b1e63abb37a..4f5560ac158 100644 --- a/lib/Target/Mips/MipsInstrInfo.td +++ b/lib/Target/Mips/MipsInstrInfo.td @@ -789,32 +789,27 @@ class InsBase _funct, string instr_asm, RegisterClass RC>: } // Atomic instructions with 2 source operands (ATOMIC_SWAP & ATOMIC_LOAD_*). -class Atomic2Ops : +class Atomic2Ops : PseudoSE<(outs DRC:$dst), (ins PRC:$ptr, DRC:$incr), - !strconcat("atomic_", Opstr, "\t$dst, $ptr, $incr"), [(set DRC:$dst, (Op PRC:$ptr, DRC:$incr))]>; -multiclass Atomic2Ops32 { - def #NAME# : Atomic2Ops, - Requires<[NotN64, HasStdEnc]>; - def _P8 : Atomic2Ops, - Requires<[IsN64, HasStdEnc]> { +multiclass Atomic2Ops32 { + def #NAME# : Atomic2Ops, Requires<[NotN64, HasStdEnc]>; + def _P8 : Atomic2Ops, + Requires<[IsN64, HasStdEnc]> { let DecoderNamespace = "Mips64"; } } // Atomic Compare & Swap. -class AtomicCmpSwap : +class AtomicCmpSwap : PseudoSE<(outs DRC:$dst), (ins PRC:$ptr, DRC:$cmp, DRC:$swap), - !strconcat("atomic_cmp_swap_", Width, "\t$dst, $ptr, $cmp, $swap"), [(set DRC:$dst, (Op PRC:$ptr, DRC:$cmp, DRC:$swap))]>; -multiclass AtomicCmpSwap32 { - def #NAME# : AtomicCmpSwap, - Requires<[NotN64, HasStdEnc]>; - def _P8 : AtomicCmpSwap, +multiclass AtomicCmpSwap32 { + def #NAME# : AtomicCmpSwap, + Requires<[NotN64, HasStdEnc]>; + def _P8 : AtomicCmpSwap, Requires<[IsN64, HasStdEnc]> { let DecoderNamespace = "Mips64"; } @@ -839,44 +834,42 @@ class SCBase Opc, string opstring, RegisterClass RC, Operand Mem> : // Return RA. let isReturn=1, isTerminator=1, hasDelaySlot=1, isBarrier=1, hasCtrlDep=1 in -def RetRA : PseudoSE<(outs), (ins), "", [(MipsRet)]>; +def RetRA : PseudoSE<(outs), (ins), [(MipsRet)]>; let Defs = [SP], Uses = [SP], hasSideEffects = 1 in { def ADJCALLSTACKDOWN : MipsPseudo<(outs), (ins i32imm:$amt), - "!ADJCALLSTACKDOWN $amt", [(callseq_start timm:$amt)]>; def ADJCALLSTACKUP : MipsPseudo<(outs), (ins i32imm:$amt1, i32imm:$amt2), - "!ADJCALLSTACKUP $amt1", [(callseq_end timm:$amt1, timm:$amt2)]>; } let usesCustomInserter = 1 in { - defm ATOMIC_LOAD_ADD_I8 : Atomic2Ops32; - defm ATOMIC_LOAD_ADD_I16 : Atomic2Ops32; - defm ATOMIC_LOAD_ADD_I32 : Atomic2Ops32; - defm ATOMIC_LOAD_SUB_I8 : Atomic2Ops32; - defm ATOMIC_LOAD_SUB_I16 : Atomic2Ops32; - defm ATOMIC_LOAD_SUB_I32 : Atomic2Ops32; - defm ATOMIC_LOAD_AND_I8 : Atomic2Ops32; - defm ATOMIC_LOAD_AND_I16 : Atomic2Ops32; - defm ATOMIC_LOAD_AND_I32 : Atomic2Ops32; - defm ATOMIC_LOAD_OR_I8 : Atomic2Ops32; - defm ATOMIC_LOAD_OR_I16 : Atomic2Ops32; - defm ATOMIC_LOAD_OR_I32 : Atomic2Ops32; - defm ATOMIC_LOAD_XOR_I8 : Atomic2Ops32; - defm ATOMIC_LOAD_XOR_I16 : Atomic2Ops32; - defm ATOMIC_LOAD_XOR_I32 : Atomic2Ops32; - defm ATOMIC_LOAD_NAND_I8 : Atomic2Ops32; - defm ATOMIC_LOAD_NAND_I16 : Atomic2Ops32; - defm ATOMIC_LOAD_NAND_I32 : Atomic2Ops32; + defm ATOMIC_LOAD_ADD_I8 : Atomic2Ops32; + defm ATOMIC_LOAD_ADD_I16 : Atomic2Ops32; + defm ATOMIC_LOAD_ADD_I32 : Atomic2Ops32; + defm ATOMIC_LOAD_SUB_I8 : Atomic2Ops32; + defm ATOMIC_LOAD_SUB_I16 : Atomic2Ops32; + defm ATOMIC_LOAD_SUB_I32 : Atomic2Ops32; + defm ATOMIC_LOAD_AND_I8 : Atomic2Ops32; + defm ATOMIC_LOAD_AND_I16 : Atomic2Ops32; + defm ATOMIC_LOAD_AND_I32 : Atomic2Ops32; + defm ATOMIC_LOAD_OR_I8 : Atomic2Ops32; + defm ATOMIC_LOAD_OR_I16 : Atomic2Ops32; + defm ATOMIC_LOAD_OR_I32 : Atomic2Ops32; + defm ATOMIC_LOAD_XOR_I8 : Atomic2Ops32; + defm ATOMIC_LOAD_XOR_I16 : Atomic2Ops32; + defm ATOMIC_LOAD_XOR_I32 : Atomic2Ops32; + defm ATOMIC_LOAD_NAND_I8 : Atomic2Ops32; + defm ATOMIC_LOAD_NAND_I16 : Atomic2Ops32; + defm ATOMIC_LOAD_NAND_I32 : Atomic2Ops32; - defm ATOMIC_SWAP_I8 : Atomic2Ops32; - defm ATOMIC_SWAP_I16 : Atomic2Ops32; - defm ATOMIC_SWAP_I32 : Atomic2Ops32; + defm ATOMIC_SWAP_I8 : Atomic2Ops32; + defm ATOMIC_SWAP_I16 : Atomic2Ops32; + defm ATOMIC_SWAP_I32 : Atomic2Ops32; - defm ATOMIC_CMP_SWAP_I8 : AtomicCmpSwap32; - defm ATOMIC_CMP_SWAP_I16 : AtomicCmpSwap32; - defm ATOMIC_CMP_SWAP_I32 : AtomicCmpSwap32; + defm ATOMIC_CMP_SWAP_I8 : AtomicCmpSwap32; + defm ATOMIC_CMP_SWAP_I16 : AtomicCmpSwap32; + defm ATOMIC_CMP_SWAP_I32 : AtomicCmpSwap32; } //===----------------------------------------------------------------------===//