1def addrimm12 : ComplexPattern<iPTR, 2, "selectIntAddrMM", [frameindex]>; 2def addrimm4lsl2 : ComplexPattern<iPTR, 2, "selectIntAddrLSL2MM", [frameindex]>; 3 4def simm4 : Operand<i32> { 5 let DecoderMethod = "DecodeSimm4"; 6} 7def simm7 : Operand<i32>; 8def li_simm7 : Operand<i32> { 9 let DecoderMethod = "DecodeLiSimm7"; 10} 11 12def simm12 : Operand<i32> { 13 let DecoderMethod = "DecodeSimm12"; 14} 15 16def MipsUimm5Lsl2AsmOperand : AsmOperandClass { 17 let Name = "Uimm5Lsl2"; 18 let RenderMethod = "addImmOperands"; 19 let ParserMethod = "parseImm"; 20 let PredicateMethod = "isUImm5Lsl2"; 21} 22 23def uimm5_lsl2 : Operand<OtherVT> { 24 let EncoderMethod = "getUImm5Lsl2Encoding"; 25 let DecoderMethod = "DecodeUImm5lsl2"; 26 let ParserMatchClass = MipsUimm5Lsl2AsmOperand; 27} 28 29def uimm6_lsl2 : Operand<i32> { 30 let EncoderMethod = "getUImm6Lsl2Encoding"; 31 let DecoderMethod = "DecodeUImm6Lsl2"; 32} 33 34def simm9_addiusp : Operand<i32> { 35 let EncoderMethod = "getSImm9AddiuspValue"; 36 let DecoderMethod = "DecodeSimm9SP"; 37} 38 39def uimm3_shift : Operand<i32> { 40 let EncoderMethod = "getUImm3Mod8Encoding"; 41 let DecoderMethod = "DecodePOOL16BEncodedField"; 42} 43 44def simm3_lsa2 : Operand<i32> { 45 let EncoderMethod = "getSImm3Lsa2Value"; 46 let DecoderMethod = "DecodeAddiur2Simm7"; 47} 48 49def uimm4_andi : Operand<i32> { 50 let EncoderMethod = "getUImm4AndValue"; 51 let DecoderMethod = "DecodeANDI16Imm"; 52} 53 54def immSExtAddiur2 : ImmLeaf<i32, [{return Imm == 1 || Imm == -1 || 55 ((Imm % 4 == 0) && 56 Imm < 28 && Imm > 0);}]>; 57 58def immSExtAddius5 : ImmLeaf<i32, [{return Imm >= -8 && Imm <= 7;}]>; 59 60def immZExtAndi16 : ImmLeaf<i32, 61 [{return (Imm == 128 || (Imm >= 1 && Imm <= 4) || Imm == 7 || Imm == 8 || 62 Imm == 15 || Imm == 16 || Imm == 31 || Imm == 32 || Imm == 63 || 63 Imm == 64 || Imm == 255 || Imm == 32768 || Imm == 65535 );}]>; 64 65def immZExt2Shift : ImmLeaf<i32, [{return Imm >= 1 && Imm <= 8;}]>; 66 67def immLi16 : ImmLeaf<i32, [{return Imm >= -1 && Imm <= 126;}]>; 68 69def MicroMipsMemGPRMM16AsmOperand : AsmOperandClass { 70 let Name = "MicroMipsMem"; 71 let RenderMethod = "addMicroMipsMemOperands"; 72 let ParserMethod = "parseMemOperand"; 73 let PredicateMethod = "isMemWithGRPMM16Base"; 74} 75 76class mem_mm_4_generic : Operand<i32> { 77 let PrintMethod = "printMemOperand"; 78 let MIOperandInfo = (ops GPRMM16, simm4); 79 let OperandType = "OPERAND_MEMORY"; 80 let ParserMatchClass = MicroMipsMemGPRMM16AsmOperand; 81} 82 83def mem_mm_4 : mem_mm_4_generic { 84 let EncoderMethod = "getMemEncodingMMImm4"; 85} 86 87def mem_mm_4_lsl1 : mem_mm_4_generic { 88 let EncoderMethod = "getMemEncodingMMImm4Lsl1"; 89} 90 91def mem_mm_4_lsl2 : mem_mm_4_generic { 92 let EncoderMethod = "getMemEncodingMMImm4Lsl2"; 93} 94 95def MicroMipsMemSPAsmOperand : AsmOperandClass { 96 let Name = "MicroMipsMemSP"; 97 let RenderMethod = "addMemOperands"; 98 let ParserMethod = "parseMemOperand"; 99 let PredicateMethod = "isMemWithUimmWordAlignedOffsetSP<7>"; 100} 101 102def mem_mm_sp_imm5_lsl2 : Operand<i32> { 103 let PrintMethod = "printMemOperand"; 104 let MIOperandInfo = (ops GPR32:$base, simm5:$offset); 105 let OperandType = "OPERAND_MEMORY"; 106 let ParserMatchClass = MicroMipsMemSPAsmOperand; 107 let EncoderMethod = "getMemEncodingMMSPImm5Lsl2"; 108} 109 110def mem_mm_gp_imm7_lsl2 : Operand<i32> { 111 let PrintMethod = "printMemOperand"; 112 let MIOperandInfo = (ops GPRMM16:$base, simm7:$offset); 113 let OperandType = "OPERAND_MEMORY"; 114 let EncoderMethod = "getMemEncodingMMGPImm7Lsl2"; 115} 116 117def mem_mm_9 : Operand<i32> { 118 let PrintMethod = "printMemOperand"; 119 let MIOperandInfo = (ops GPR32, simm9); 120 let EncoderMethod = "getMemEncodingMMImm9"; 121 let ParserMatchClass = MipsMemAsmOperand; 122 let OperandType = "OPERAND_MEMORY"; 123} 124 125def mem_mm_12 : Operand<i32> { 126 let PrintMethod = "printMemOperand"; 127 let MIOperandInfo = (ops GPR32, simm12); 128 let EncoderMethod = "getMemEncodingMMImm12"; 129 let ParserMatchClass = MipsMemAsmOperand; 130 let OperandType = "OPERAND_MEMORY"; 131} 132 133def mem_mm_16 : Operand<i32> { 134 let PrintMethod = "printMemOperand"; 135 let MIOperandInfo = (ops GPR32, simm16); 136 let EncoderMethod = "getMemEncodingMMImm16"; 137 let ParserMatchClass = MipsMemAsmOperand; 138 let OperandType = "OPERAND_MEMORY"; 139} 140 141def MipsMemUimm4AsmOperand : AsmOperandClass { 142 let Name = "MemOffsetUimm4"; 143 let SuperClasses = [MipsMemAsmOperand]; 144 let RenderMethod = "addMemOperands"; 145 let ParserMethod = "parseMemOperand"; 146 let PredicateMethod = "isMemWithUimmOffsetSP<6>"; 147} 148 149def mem_mm_4sp : Operand<i32> { 150 let PrintMethod = "printMemOperand"; 151 let MIOperandInfo = (ops GPR32, uimm8); 152 let EncoderMethod = "getMemEncodingMMImm4sp"; 153 let ParserMatchClass = MipsMemUimm4AsmOperand; 154 let OperandType = "OPERAND_MEMORY"; 155} 156 157def jmptarget_mm : Operand<OtherVT> { 158 let EncoderMethod = "getJumpTargetOpValueMM"; 159} 160 161def calltarget_mm : Operand<iPTR> { 162 let EncoderMethod = "getJumpTargetOpValueMM"; 163} 164 165def brtarget7_mm : Operand<OtherVT> { 166 let EncoderMethod = "getBranchTarget7OpValueMM"; 167 let OperandType = "OPERAND_PCREL"; 168 let DecoderMethod = "DecodeBranchTarget7MM"; 169 let ParserMatchClass = MipsJumpTargetAsmOperand; 170} 171 172def brtarget10_mm : Operand<OtherVT> { 173 let EncoderMethod = "getBranchTargetOpValueMMPC10"; 174 let OperandType = "OPERAND_PCREL"; 175 let DecoderMethod = "DecodeBranchTarget10MM"; 176 let ParserMatchClass = MipsJumpTargetAsmOperand; 177} 178 179def brtarget_mm : Operand<OtherVT> { 180 let EncoderMethod = "getBranchTargetOpValueMM"; 181 let OperandType = "OPERAND_PCREL"; 182 let DecoderMethod = "DecodeBranchTargetMM"; 183 let ParserMatchClass = MipsJumpTargetAsmOperand; 184} 185 186def simm23_lsl2 : Operand<i32> { 187 let EncoderMethod = "getSimm23Lsl2Encoding"; 188 let DecoderMethod = "DecodeSimm23Lsl2"; 189} 190 191class CompactBranchMM<string opstr, DAGOperand opnd, PatFrag cond_op, 192 RegisterOperand RO> : 193 InstSE<(outs), (ins RO:$rs, opnd:$offset), 194 !strconcat(opstr, "\t$rs, $offset"), [], II_BCCZC, FrmI> { 195 let isBranch = 1; 196 let isTerminator = 1; 197 let hasDelaySlot = 0; 198 let Defs = [AT]; 199} 200 201let canFoldAsLoad = 1 in 202class LoadLeftRightMM<string opstr, SDNode OpNode, RegisterOperand RO, 203 Operand MemOpnd> : 204 InstSE<(outs RO:$rt), (ins MemOpnd:$addr, RO:$src), 205 !strconcat(opstr, "\t$rt, $addr"), 206 [(set RO:$rt, (OpNode addrimm12:$addr, RO:$src))], 207 NoItinerary, FrmI> { 208 let DecoderMethod = "DecodeMemMMImm12"; 209 string Constraints = "$src = $rt"; 210} 211 212class StoreLeftRightMM<string opstr, SDNode OpNode, RegisterOperand RO, 213 Operand MemOpnd>: 214 InstSE<(outs), (ins RO:$rt, MemOpnd:$addr), 215 !strconcat(opstr, "\t$rt, $addr"), 216 [(OpNode RO:$rt, addrimm12:$addr)], NoItinerary, FrmI> { 217 let DecoderMethod = "DecodeMemMMImm12"; 218} 219 220/// A register pair used by movep instruction. 221def MovePRegPairAsmOperand : AsmOperandClass { 222 let Name = "MovePRegPair"; 223 let ParserMethod = "parseMovePRegPair"; 224 let PredicateMethod = "isMovePRegPair"; 225} 226 227def movep_regpair : Operand<i32> { 228 let EncoderMethod = "getMovePRegPairOpValue"; 229 let ParserMatchClass = MovePRegPairAsmOperand; 230 let PrintMethod = "printRegisterList"; 231 let DecoderMethod = "DecodeMovePRegPair"; 232 let MIOperandInfo = (ops GPR32Opnd, GPR32Opnd); 233} 234 235class MovePMM16<string opstr, RegisterOperand RO> : 236MicroMipsInst16<(outs movep_regpair:$dst_regs), (ins RO:$rs, RO:$rt), 237 !strconcat(opstr, "\t$dst_regs, $rs, $rt"), [], 238 NoItinerary, FrmR> { 239 let isReMaterializable = 1; 240} 241 242/// A register pair used by load/store pair instructions. 243def RegPairAsmOperand : AsmOperandClass { 244 let Name = "RegPair"; 245 let ParserMethod = "parseRegisterPair"; 246} 247 248def regpair : Operand<i32> { 249 let EncoderMethod = "getRegisterPairOpValue"; 250 let ParserMatchClass = RegPairAsmOperand; 251 let PrintMethod = "printRegisterPair"; 252 let DecoderMethod = "DecodeRegPairOperand"; 253 let MIOperandInfo = (ops GPR32Opnd, GPR32Opnd); 254} 255 256class StorePairMM<string opstr, InstrItinClass Itin = NoItinerary, 257 ComplexPattern Addr = addr> : 258 InstSE<(outs), (ins regpair:$rt, mem_mm_12:$addr), 259 !strconcat(opstr, "\t$rt, $addr"), [], Itin, FrmI, opstr> { 260 let DecoderMethod = "DecodeMemMMImm12"; 261 let mayStore = 1; 262} 263 264class LoadPairMM<string opstr, InstrItinClass Itin = NoItinerary, 265 ComplexPattern Addr = addr> : 266 InstSE<(outs regpair:$rt), (ins mem_mm_12:$addr), 267 !strconcat(opstr, "\t$rt, $addr"), [], Itin, FrmI, opstr> { 268 let DecoderMethod = "DecodeMemMMImm12"; 269 let mayLoad = 1; 270} 271 272class LLBaseMM<string opstr, RegisterOperand RO> : 273 InstSE<(outs RO:$rt), (ins mem_mm_12:$addr), 274 !strconcat(opstr, "\t$rt, $addr"), [], NoItinerary, FrmI> { 275 let DecoderMethod = "DecodeMemMMImm12"; 276 let mayLoad = 1; 277} 278 279class LLEBaseMM<string opstr, RegisterOperand RO> : 280 InstSE<(outs RO:$rt), (ins mem_mm_12:$addr), 281 !strconcat(opstr, "\t$rt, $addr"), [], NoItinerary, FrmI> { 282 let DecoderMethod = "DecodeMemMMImm9"; 283 let mayLoad = 1; 284} 285 286class SCBaseMM<string opstr, RegisterOperand RO> : 287 InstSE<(outs RO:$dst), (ins RO:$rt, mem_mm_12:$addr), 288 !strconcat(opstr, "\t$rt, $addr"), [], NoItinerary, FrmI> { 289 let DecoderMethod = "DecodeMemMMImm12"; 290 let mayStore = 1; 291 let Constraints = "$rt = $dst"; 292} 293 294class SCEBaseMM<string opstr, RegisterOperand RO> : 295 InstSE<(outs RO:$dst), (ins RO:$rt, mem_mm_12:$addr), 296 !strconcat(opstr, "\t$rt, $addr"), [], NoItinerary, FrmI> { 297 let DecoderMethod = "DecodeMemMMImm9"; 298 let mayStore = 1; 299 let Constraints = "$rt = $dst"; 300} 301 302class LoadMM<string opstr, DAGOperand RO, SDPatternOperator OpNode = null_frag, 303 InstrItinClass Itin = NoItinerary> : 304 InstSE<(outs RO:$rt), (ins mem_mm_12:$addr), 305 !strconcat(opstr, "\t$rt, $addr"), 306 [(set RO:$rt, (OpNode addrimm12:$addr))], Itin, FrmI> { 307 let DecoderMethod = "DecodeMemMMImm12"; 308 let canFoldAsLoad = 1; 309 let mayLoad = 1; 310} 311 312class ArithRMM16<string opstr, RegisterOperand RO, bit isComm = 0, 313 InstrItinClass Itin = NoItinerary, 314 SDPatternOperator OpNode = null_frag> : 315 MicroMipsInst16<(outs RO:$rd), (ins RO:$rs, RO:$rt), 316 !strconcat(opstr, "\t$rd, $rs, $rt"), 317 [(set RO:$rd, (OpNode RO:$rs, RO:$rt))], Itin, FrmR> { 318 let isCommutable = isComm; 319} 320 321class AndImmMM16<string opstr, RegisterOperand RO, 322 InstrItinClass Itin = NoItinerary> : 323 MicroMipsInst16<(outs RO:$rd), (ins RO:$rs, uimm4_andi:$imm), 324 !strconcat(opstr, "\t$rd, $rs, $imm"), [], Itin, FrmI>; 325 326class LogicRMM16<string opstr, RegisterOperand RO, 327 InstrItinClass Itin = NoItinerary, 328 SDPatternOperator OpNode = null_frag> : 329 MicroMipsInst16<(outs RO:$dst), (ins RO:$rs, RO:$rt), 330 !strconcat(opstr, "\t$rt, $rs"), 331 [(set RO:$dst, (OpNode RO:$rs, RO:$rt))], Itin, FrmR> { 332 let isCommutable = 1; 333 let Constraints = "$rt = $dst"; 334} 335 336class NotMM16<string opstr, RegisterOperand RO> : 337 MicroMipsInst16<(outs RO:$rt), (ins RO:$rs), 338 !strconcat(opstr, "\t$rt, $rs"), 339 [(set RO:$rt, (not RO:$rs))], NoItinerary, FrmR>; 340 341class ShiftIMM16<string opstr, Operand ImmOpnd, RegisterOperand RO, 342 InstrItinClass Itin = NoItinerary> : 343 MicroMipsInst16<(outs RO:$rd), (ins RO:$rt, ImmOpnd:$shamt), 344 !strconcat(opstr, "\t$rd, $rt, $shamt"), [], Itin, FrmR>; 345 346class LoadMM16<string opstr, DAGOperand RO, SDPatternOperator OpNode, 347 InstrItinClass Itin, Operand MemOpnd> : 348 MicroMipsInst16<(outs RO:$rt), (ins MemOpnd:$addr), 349 !strconcat(opstr, "\t$rt, $addr"), [], Itin, FrmI> { 350 let DecoderMethod = "DecodeMemMMImm4"; 351 let canFoldAsLoad = 1; 352 let mayLoad = 1; 353} 354 355class StoreMM16<string opstr, DAGOperand RTOpnd, DAGOperand RO, 356 SDPatternOperator OpNode, InstrItinClass Itin, 357 Operand MemOpnd> : 358 MicroMipsInst16<(outs), (ins RTOpnd:$rt, MemOpnd:$addr), 359 !strconcat(opstr, "\t$rt, $addr"), [], Itin, FrmI> { 360 let DecoderMethod = "DecodeMemMMImm4"; 361 let mayStore = 1; 362} 363 364class LoadSPMM16<string opstr, DAGOperand RO, InstrItinClass Itin, 365 Operand MemOpnd> : 366 MicroMipsInst16<(outs RO:$rt), (ins MemOpnd:$offset), 367 !strconcat(opstr, "\t$rt, $offset"), [], Itin, FrmI> { 368 let DecoderMethod = "DecodeMemMMSPImm5Lsl2"; 369 let canFoldAsLoad = 1; 370 let mayLoad = 1; 371} 372 373class StoreSPMM16<string opstr, DAGOperand RO, InstrItinClass Itin, 374 Operand MemOpnd> : 375 MicroMipsInst16<(outs), (ins RO:$rt, MemOpnd:$offset), 376 !strconcat(opstr, "\t$rt, $offset"), [], Itin, FrmI> { 377 let DecoderMethod = "DecodeMemMMSPImm5Lsl2"; 378 let mayStore = 1; 379} 380 381class LoadGPMM16<string opstr, DAGOperand RO, InstrItinClass Itin, 382 Operand MemOpnd> : 383 MicroMipsInst16<(outs RO:$rt), (ins MemOpnd:$offset), 384 !strconcat(opstr, "\t$rt, $offset"), [], Itin, FrmI> { 385 let DecoderMethod = "DecodeMemMMGPImm7Lsl2"; 386 let canFoldAsLoad = 1; 387 let mayLoad = 1; 388} 389 390class AddImmUR2<string opstr, RegisterOperand RO> : 391 MicroMipsInst16<(outs RO:$rd), (ins RO:$rs, simm3_lsa2:$imm), 392 !strconcat(opstr, "\t$rd, $rs, $imm"), 393 [], NoItinerary, FrmR> { 394 let isCommutable = 1; 395} 396 397class AddImmUS5<string opstr, RegisterOperand RO> : 398 MicroMipsInst16<(outs RO:$dst), (ins RO:$rd, simm4:$imm), 399 !strconcat(opstr, "\t$rd, $imm"), [], NoItinerary, FrmR> { 400 let Constraints = "$rd = $dst"; 401} 402 403class AddImmUR1SP<string opstr, RegisterOperand RO> : 404 MicroMipsInst16<(outs RO:$rd), (ins uimm6_lsl2:$imm), 405 !strconcat(opstr, "\t$rd, $imm"), [], NoItinerary, FrmR>; 406 407class AddImmUSP<string opstr> : 408 MicroMipsInst16<(outs), (ins simm9_addiusp:$imm), 409 !strconcat(opstr, "\t$imm"), [], NoItinerary, FrmI>; 410 411class MoveFromHILOMM<string opstr, RegisterOperand RO, Register UseReg> : 412 MicroMipsInst16<(outs RO:$rd), (ins), !strconcat(opstr, "\t$rd"), 413 [], II_MFHI_MFLO, FrmR> { 414 let Uses = [UseReg]; 415 let hasSideEffects = 0; 416} 417 418class MoveMM16<string opstr, RegisterOperand RO, bit isComm = 0, 419 InstrItinClass Itin = NoItinerary> : 420 MicroMipsInst16<(outs RO:$rd), (ins RO:$rs), 421 !strconcat(opstr, "\t$rd, $rs"), [], Itin, FrmR> { 422 let isCommutable = isComm; 423 let isReMaterializable = 1; 424} 425 426class LoadImmMM16<string opstr, Operand Od, RegisterOperand RO> : 427 MicroMipsInst16<(outs RO:$rd), (ins Od:$imm), 428 !strconcat(opstr, "\t$rd, $imm"), [], NoItinerary, FrmI> { 429 let isReMaterializable = 1; 430} 431 432// 16-bit Jump and Link (Call) 433class JumpLinkRegMM16<string opstr, RegisterOperand RO> : 434 MicroMipsInst16<(outs), (ins RO:$rs), !strconcat(opstr, "\t$rs"), 435 [(MipsJmpLink RO:$rs)], II_JALR, FrmR>, PredicateControl { 436 let isCall = 1; 437 let hasDelaySlot = 1; 438 let Defs = [RA]; 439} 440 441// 16-bit Jump Reg 442class JumpRegMM16<string opstr, RegisterOperand RO> : 443 MicroMipsInst16<(outs), (ins RO:$rs), !strconcat(opstr, "\t$rs"), 444 [], II_JR, FrmR> { 445 let hasDelaySlot = 1; 446 let isBranch = 1; 447 let isIndirectBranch = 1; 448} 449 450// Base class for JRADDIUSP instruction. 451class JumpRAddiuStackMM16 : 452 MicroMipsInst16<(outs), (ins uimm5_lsl2:$imm), "jraddiusp\t$imm", 453 [], II_JRADDIUSP, FrmR> { 454 let isTerminator = 1; 455 let isBarrier = 1; 456 let isBranch = 1; 457 let isIndirectBranch = 1; 458} 459 460// 16-bit Jump and Link (Call) - Short Delay Slot 461class JumpLinkRegSMM16<string opstr, RegisterOperand RO> : 462 MicroMipsInst16<(outs), (ins RO:$rs), !strconcat(opstr, "\t$rs"), 463 [], II_JALRS, FrmR> { 464 let isCall = 1; 465 let hasDelaySlot = 1; 466 let Defs = [RA]; 467} 468 469// 16-bit Jump Register Compact - No delay slot 470class JumpRegCMM16<string opstr, RegisterOperand RO> : 471 MicroMipsInst16<(outs), (ins RO:$rs), !strconcat(opstr, "\t$rs"), 472 [], II_JRC, FrmR> { 473 let isTerminator = 1; 474 let isBarrier = 1; 475 let isBranch = 1; 476 let isIndirectBranch = 1; 477} 478 479// Break16 and Sdbbp16 480class BrkSdbbp16MM<string opstr> : 481 MicroMipsInst16<(outs), (ins uimm4:$code_), 482 !strconcat(opstr, "\t$code_"), 483 [], NoItinerary, FrmOther>; 484 485class CBranchZeroMM<string opstr, DAGOperand opnd, RegisterOperand RO> : 486 MicroMipsInst16<(outs), (ins RO:$rs, opnd:$offset), 487 !strconcat(opstr, "\t$rs, $offset"), [], II_BCCZ, FrmI> { 488 let isBranch = 1; 489 let isTerminator = 1; 490 let hasDelaySlot = 1; 491 let Defs = [AT]; 492} 493 494// MicroMIPS Jump and Link (Call) - Short Delay Slot 495let isCall = 1, hasDelaySlot = 1, Defs = [RA] in { 496 class JumpLinkMM<string opstr, DAGOperand opnd> : 497 InstSE<(outs), (ins opnd:$target), !strconcat(opstr, "\t$target"), 498 [], II_JALS, FrmJ, opstr> { 499 let DecoderMethod = "DecodeJumpTargetMM"; 500 } 501 502 class JumpLinkRegMM<string opstr, RegisterOperand RO>: 503 InstSE<(outs RO:$rd), (ins RO:$rs), !strconcat(opstr, "\t$rd, $rs"), 504 [], II_JALRS, FrmR>; 505 506 class BranchCompareToZeroLinkMM<string opstr, DAGOperand opnd, 507 RegisterOperand RO> : 508 InstSE<(outs), (ins RO:$rs, opnd:$offset), 509 !strconcat(opstr, "\t$rs, $offset"), [], II_BCCZALS, FrmI, opstr>; 510} 511 512class LoadWordIndexedScaledMM<string opstr, RegisterOperand RO, 513 InstrItinClass Itin = NoItinerary, 514 SDPatternOperator OpNode = null_frag> : 515 InstSE<(outs RO:$rd), (ins PtrRC:$base, PtrRC:$index), 516 !strconcat(opstr, "\t$rd, ${index}(${base})"), [], Itin, FrmFI>; 517 518class PrefetchIndexed<string opstr> : 519 InstSE<(outs), (ins PtrRC:$base, PtrRC:$index, uimm5:$hint), 520 !strconcat(opstr, "\t$hint, ${index}(${base})"), [], NoItinerary, FrmOther>; 521 522class AddImmUPC<string opstr, RegisterOperand RO> : 523 InstSE<(outs RO:$rs), (ins simm23_lsl2:$imm), 524 !strconcat(opstr, "\t$rs, $imm"), [], NoItinerary, FrmR>; 525 526/// A list of registers used by load/store multiple instructions. 527def RegListAsmOperand : AsmOperandClass { 528 let Name = "RegList"; 529 let ParserMethod = "parseRegisterList"; 530} 531 532def reglist : Operand<i32> { 533 let EncoderMethod = "getRegisterListOpValue"; 534 let ParserMatchClass = RegListAsmOperand; 535 let PrintMethod = "printRegisterList"; 536 let DecoderMethod = "DecodeRegListOperand"; 537} 538 539def RegList16AsmOperand : AsmOperandClass { 540 let Name = "RegList16"; 541 let ParserMethod = "parseRegisterList"; 542 let PredicateMethod = "isRegList16"; 543 let RenderMethod = "addRegListOperands"; 544} 545 546def reglist16 : Operand<i32> { 547 let EncoderMethod = "getRegisterListOpValue16"; 548 let DecoderMethod = "DecodeRegListOperand16"; 549 let PrintMethod = "printRegisterList"; 550 let ParserMatchClass = RegList16AsmOperand; 551} 552 553class StoreMultMM<string opstr, 554 InstrItinClass Itin = NoItinerary, ComplexPattern Addr = addr> : 555 InstSE<(outs), (ins reglist:$rt, mem_mm_12:$addr), 556 !strconcat(opstr, "\t$rt, $addr"), [], Itin, FrmI, opstr> { 557 let DecoderMethod = "DecodeMemMMImm12"; 558 let mayStore = 1; 559} 560 561class LoadMultMM<string opstr, 562 InstrItinClass Itin = NoItinerary, ComplexPattern Addr = addr> : 563 InstSE<(outs reglist:$rt), (ins mem_mm_12:$addr), 564 !strconcat(opstr, "\t$rt, $addr"), [], Itin, FrmI, opstr> { 565 let DecoderMethod = "DecodeMemMMImm12"; 566 let mayLoad = 1; 567} 568 569class StoreMultMM16<string opstr, 570 InstrItinClass Itin = NoItinerary, 571 ComplexPattern Addr = addr> : 572 MicroMipsInst16<(outs), (ins reglist16:$rt, mem_mm_4sp:$addr), 573 !strconcat(opstr, "\t$rt, $addr"), [], Itin, FrmI> { 574 let DecoderMethod = "DecodeMemMMReglistImm4Lsl2"; 575 let mayStore = 1; 576} 577 578class LoadMultMM16<string opstr, 579 InstrItinClass Itin = NoItinerary, 580 ComplexPattern Addr = addr> : 581 MicroMipsInst16<(outs reglist16:$rt), (ins mem_mm_4sp:$addr), 582 !strconcat(opstr, "\t$rt, $addr"), [], Itin, FrmI> { 583 let DecoderMethod = "DecodeMemMMReglistImm4Lsl2"; 584 let mayLoad = 1; 585} 586 587class UncondBranchMM16<string opstr> : 588 MicroMipsInst16<(outs), (ins brtarget10_mm:$offset), 589 !strconcat(opstr, "\t$offset"), 590 [], II_B, FrmI> { 591 let isBranch = 1; 592 let isTerminator = 1; 593 let isBarrier = 1; 594 let hasDelaySlot = 1; 595 let Predicates = [RelocPIC, InMicroMips]; 596 let Defs = [AT]; 597} 598 599def ADDU16_MM : ArithRMM16<"addu16", GPRMM16Opnd, 1, II_ADDU, add>, 600 ARITH_FM_MM16<0>, ISA_MICROMIPS_NOT_32R6_64R6; 601def AND16_MM : LogicRMM16<"and16", GPRMM16Opnd, II_AND, and>, 602 LOGIC_FM_MM16<0x2>, ISA_MICROMIPS_NOT_32R6_64R6; 603def ANDI16_MM : AndImmMM16<"andi16", GPRMM16Opnd, II_AND>, ANDI_FM_MM16<0x0b>, 604 ISA_MICROMIPS_NOT_32R6_64R6; 605def NOT16_MM : NotMM16<"not16", GPRMM16Opnd>, LOGIC_FM_MM16<0x0>, 606 ISA_MICROMIPS_NOT_32R6_64R6; 607def OR16_MM : LogicRMM16<"or16", GPRMM16Opnd, II_OR, or>, LOGIC_FM_MM16<0x3>, 608 ISA_MICROMIPS_NOT_32R6_64R6; 609def SLL16_MM : ShiftIMM16<"sll16", uimm3_shift, GPRMM16Opnd, II_SLL>, 610 SHIFT_FM_MM16<0>, ISA_MICROMIPS_NOT_32R6_64R6; 611def SRL16_MM : ShiftIMM16<"srl16", uimm3_shift, GPRMM16Opnd, II_SRL>, 612 SHIFT_FM_MM16<1>, ISA_MICROMIPS_NOT_32R6_64R6; 613 614def SUBU16_MM : ArithRMM16<"subu16", GPRMM16Opnd, 0, II_SUBU, sub>, 615 ARITH_FM_MM16<1>, ISA_MICROMIPS_NOT_32R6_64R6; 616def XOR16_MM : LogicRMM16<"xor16", GPRMM16Opnd, II_XOR, xor>, 617 LOGIC_FM_MM16<0x1>, ISA_MICROMIPS_NOT_32R6_64R6; 618def LBU16_MM : LoadMM16<"lbu16", GPRMM16Opnd, zextloadi8, II_LBU, 619 mem_mm_4>, LOAD_STORE_FM_MM16<0x02>; 620def LHU16_MM : LoadMM16<"lhu16", GPRMM16Opnd, zextloadi16, II_LHU, 621 mem_mm_4_lsl1>, LOAD_STORE_FM_MM16<0x0a>; 622def LW16_MM : LoadMM16<"lw16", GPRMM16Opnd, load, II_LW, mem_mm_4_lsl2>, 623 LOAD_STORE_FM_MM16<0x1a>; 624def SB16_MM : StoreMM16<"sb16", GPRMM16OpndZero, GPRMM16Opnd, truncstorei8, 625 II_SB, mem_mm_4>, LOAD_STORE_FM_MM16<0x22>; 626def SH16_MM : StoreMM16<"sh16", GPRMM16OpndZero, GPRMM16Opnd, truncstorei16, 627 II_SH, mem_mm_4_lsl1>, 628 LOAD_STORE_FM_MM16<0x2a>; 629def SW16_MM : StoreMM16<"sw16", GPRMM16OpndZero, GPRMM16Opnd, store, II_SW, 630 mem_mm_4_lsl2>, LOAD_STORE_FM_MM16<0x3a>; 631def LWGP_MM : LoadGPMM16<"lw", GPRMM16Opnd, II_LW, mem_mm_gp_imm7_lsl2>, 632 LOAD_GP_FM_MM16<0x19>; 633def LWSP_MM : LoadSPMM16<"lw", GPR32Opnd, II_LW, mem_mm_sp_imm5_lsl2>, 634 LOAD_STORE_SP_FM_MM16<0x12>; 635def SWSP_MM : StoreSPMM16<"sw", GPR32Opnd, II_SW, mem_mm_sp_imm5_lsl2>, 636 LOAD_STORE_SP_FM_MM16<0x32>; 637def ADDIUR1SP_MM : AddImmUR1SP<"addiur1sp", GPRMM16Opnd>, ADDIUR1SP_FM_MM16; 638def ADDIUR2_MM : AddImmUR2<"addiur2", GPRMM16Opnd>, ADDIUR2_FM_MM16; 639def ADDIUS5_MM : AddImmUS5<"addius5", GPR32Opnd>, ADDIUS5_FM_MM16; 640def ADDIUSP_MM : AddImmUSP<"addiusp">, ADDIUSP_FM_MM16; 641def MFHI16_MM : MoveFromHILOMM<"mfhi", GPR32Opnd, AC0>, MFHILO_FM_MM16<0x10>; 642def MFLO16_MM : MoveFromHILOMM<"mflo", GPR32Opnd, AC0>, MFHILO_FM_MM16<0x12>; 643def MOVE16_MM : MoveMM16<"move", GPR32Opnd>, MOVE_FM_MM16<0x03>; 644def MOVEP_MM : MovePMM16<"movep", GPRMM16OpndMoveP>, MOVEP_FM_MM16; 645def LI16_MM : LoadImmMM16<"li16", li_simm7, GPRMM16Opnd>, LI_FM_MM16, 646 IsAsCheapAsAMove; 647def JALR16_MM : JumpLinkRegMM16<"jalr", GPR32Opnd>, JALR_FM_MM16<0x0e>, 648 ISA_MICROMIPS32_NOT_MIPS32R6; 649def JALRS16_MM : JumpLinkRegSMM16<"jalrs16", GPR32Opnd>, JALR_FM_MM16<0x0f>; 650def JRC16_MM : JumpRegCMM16<"jrc", GPR32Opnd>, JALR_FM_MM16<0x0d>; 651def JRADDIUSP : JumpRAddiuStackMM16, JRADDIUSP_FM_MM16<0x18>; 652def JR16_MM : JumpRegMM16<"jr16", GPR32Opnd>, JALR_FM_MM16<0x0c>; 653def BEQZ16_MM : CBranchZeroMM<"beqz16", brtarget7_mm, GPRMM16Opnd>, 654 BEQNEZ_FM_MM16<0x23>; 655def BNEZ16_MM : CBranchZeroMM<"bnez16", brtarget7_mm, GPRMM16Opnd>, 656 BEQNEZ_FM_MM16<0x2b>; 657def B16_MM : UncondBranchMM16<"b16">, B16_FM; 658def BREAK16_MM : BrkSdbbp16MM<"break16">, BRKSDBBP16_FM_MM<0x28>, 659 ISA_MICROMIPS_NOT_32R6_64R6; 660def SDBBP16_MM : BrkSdbbp16MM<"sdbbp16">, BRKSDBBP16_FM_MM<0x2C>, 661 ISA_MICROMIPS_NOT_32R6_64R6; 662 663let DecoderNamespace = "MicroMips" in { 664 /// Load and Store Instructions - multiple 665 def SWM16_MM : StoreMultMM16<"swm16">, LWM_FM_MM16<0x5>, 666 ISA_MICROMIPS32_NOT_MIPS32R6; 667 def LWM16_MM : LoadMultMM16<"lwm16">, LWM_FM_MM16<0x4>, 668 ISA_MICROMIPS32_NOT_MIPS32R6; 669} 670 671class WaitMM<string opstr> : 672 InstSE<(outs), (ins uimm10:$code_), !strconcat(opstr, "\t$code_"), [], 673 NoItinerary, FrmOther, opstr>; 674 675let DecoderNamespace = "MicroMips", Predicates = [InMicroMips] in { 676 /// Compact Branch Instructions 677 def BEQZC_MM : CompactBranchMM<"beqzc", brtarget_mm, seteq, GPR32Opnd>, 678 COMPACT_BRANCH_FM_MM<0x7>; 679 def BNEZC_MM : CompactBranchMM<"bnezc", brtarget_mm, setne, GPR32Opnd>, 680 COMPACT_BRANCH_FM_MM<0x5>; 681 682 /// Arithmetic Instructions (ALU Immediate) 683 def ADDiu_MM : MMRel, ArithLogicI<"addiu", simm16, GPR32Opnd>, 684 ADDI_FM_MM<0xc>; 685 def ADDi_MM : MMRel, ArithLogicI<"addi", simm16, GPR32Opnd>, 686 ADDI_FM_MM<0x4>; 687 def SLTi_MM : MMRel, SetCC_I<"slti", setlt, simm16, immSExt16, GPR32Opnd>, 688 SLTI_FM_MM<0x24>; 689 def SLTiu_MM : MMRel, SetCC_I<"sltiu", setult, simm16, immSExt16, GPR32Opnd>, 690 SLTI_FM_MM<0x2c>; 691 def ANDi_MM : MMRel, ArithLogicI<"andi", uimm16, GPR32Opnd>, 692 ADDI_FM_MM<0x34>; 693 def ORi_MM : MMRel, ArithLogicI<"ori", uimm16, GPR32Opnd>, 694 ADDI_FM_MM<0x14>; 695 def XORi_MM : MMRel, ArithLogicI<"xori", uimm16, GPR32Opnd>, 696 ADDI_FM_MM<0x1c>; 697 def LUi_MM : MMRel, LoadUpper<"lui", GPR32Opnd, uimm16>, LUI_FM_MM; 698 699 def LEA_ADDiu_MM : MMRel, EffectiveAddress<"addiu", GPR32Opnd>, 700 LW_FM_MM<0xc>; 701 702 /// Arithmetic Instructions (3-Operand, R-Type) 703 def ADDu_MM : MMRel, ArithLogicR<"addu", GPR32Opnd, 1, II_ADDU, add>, 704 ADD_FM_MM<0, 0x150>; 705 def SUBu_MM : MMRel, ArithLogicR<"subu", GPR32Opnd, 0, II_SUBU, sub>, 706 ADD_FM_MM<0, 0x1d0>; 707 def MUL_MM : MMRel, ArithLogicR<"mul", GPR32Opnd>, ADD_FM_MM<0, 0x210>; 708 def ADD_MM : MMRel, ArithLogicR<"add", GPR32Opnd>, ADD_FM_MM<0, 0x110>; 709 def SUB_MM : MMRel, ArithLogicR<"sub", GPR32Opnd>, ADD_FM_MM<0, 0x190>; 710 def SLT_MM : MMRel, SetCC_R<"slt", setlt, GPR32Opnd>, ADD_FM_MM<0, 0x350>; 711 def SLTu_MM : MMRel, SetCC_R<"sltu", setult, GPR32Opnd>, 712 ADD_FM_MM<0, 0x390>; 713 def AND_MM : MMRel, ArithLogicR<"and", GPR32Opnd, 1, II_AND, and>, 714 ADD_FM_MM<0, 0x250>; 715 def OR_MM : MMRel, ArithLogicR<"or", GPR32Opnd, 1, II_OR, or>, 716 ADD_FM_MM<0, 0x290>; 717 def XOR_MM : MMRel, ArithLogicR<"xor", GPR32Opnd, 1, II_XOR, xor>, 718 ADD_FM_MM<0, 0x310>; 719 def NOR_MM : MMRel, LogicNOR<"nor", GPR32Opnd>, ADD_FM_MM<0, 0x2d0>; 720 def MULT_MM : MMRel, Mult<"mult", II_MULT, GPR32Opnd, [HI0, LO0]>, 721 MULT_FM_MM<0x22c>; 722 def MULTu_MM : MMRel, Mult<"multu", II_MULTU, GPR32Opnd, [HI0, LO0]>, 723 MULT_FM_MM<0x26c>; 724 def SDIV_MM : MMRel, Div<"div", II_DIV, GPR32Opnd, [HI0, LO0]>, 725 MULT_FM_MM<0x2ac>; 726 def UDIV_MM : MMRel, Div<"divu", II_DIVU, GPR32Opnd, [HI0, LO0]>, 727 MULT_FM_MM<0x2ec>; 728 729 /// Arithmetic Instructions with PC and Immediate 730 def ADDIUPC_MM : AddImmUPC<"addiupc", GPRMM16Opnd>, ADDIUPC_FM_MM; 731 732 /// Shift Instructions 733 def SLL_MM : MMRel, shift_rotate_imm<"sll", uimm5, GPR32Opnd, II_SLL>, 734 SRA_FM_MM<0, 0>; 735 def SRL_MM : MMRel, shift_rotate_imm<"srl", uimm5, GPR32Opnd, II_SRL>, 736 SRA_FM_MM<0x40, 0>; 737 def SRA_MM : MMRel, shift_rotate_imm<"sra", uimm5, GPR32Opnd, II_SRA>, 738 SRA_FM_MM<0x80, 0>; 739 def SLLV_MM : MMRel, shift_rotate_reg<"sllv", GPR32Opnd, II_SLLV>, 740 SRLV_FM_MM<0x10, 0>; 741 def SRLV_MM : MMRel, shift_rotate_reg<"srlv", GPR32Opnd, II_SRLV>, 742 SRLV_FM_MM<0x50, 0>; 743 def SRAV_MM : MMRel, shift_rotate_reg<"srav", GPR32Opnd, II_SRAV>, 744 SRLV_FM_MM<0x90, 0>; 745 def ROTR_MM : MMRel, shift_rotate_imm<"rotr", uimm5, GPR32Opnd, II_ROTR>, 746 SRA_FM_MM<0xc0, 0>; 747 def ROTRV_MM : MMRel, shift_rotate_reg<"rotrv", GPR32Opnd, II_ROTRV>, 748 SRLV_FM_MM<0xd0, 0>; 749 750 /// Load and Store Instructions - aligned 751 let DecoderMethod = "DecodeMemMMImm16" in { 752 def LB_MM : Load<"lb", GPR32Opnd>, MMRel, LW_FM_MM<0x7>; 753 def LBu_MM : Load<"lbu", GPR32Opnd>, MMRel, LW_FM_MM<0x5>; 754 def LH_MM : Load<"lh", GPR32Opnd>, MMRel, LW_FM_MM<0xf>; 755 def LHu_MM : Load<"lhu", GPR32Opnd>, MMRel, LW_FM_MM<0xd>; 756 def LW_MM : Load<"lw", GPR32Opnd>, MMRel, LW_FM_MM<0x3f>; 757 def SB_MM : Store<"sb", GPR32Opnd>, MMRel, LW_FM_MM<0x6>; 758 def SH_MM : Store<"sh", GPR32Opnd>, MMRel, LW_FM_MM<0xe>; 759 def SW_MM : Store<"sw", GPR32Opnd>, MMRel, LW_FM_MM<0x3e>; 760 } 761 762 let DecoderMethod = "DecodeMemMMImm9" in { 763 def LBE_MM : Load<"lbe", GPR32Opnd>, POOL32C_LHUE_FM_MM<0x18, 0x6, 0x4>; 764 def LBuE_MM : Load<"lbue", GPR32Opnd>, POOL32C_LHUE_FM_MM<0x18, 0x6, 0x0>; 765 def LHE_MM : Load<"lhe", GPR32Opnd>, POOL32C_LHUE_FM_MM<0x18, 0x6, 0x5>; 766 def LHuE_MM : Load<"lhue", GPR32Opnd>, POOL32C_LHUE_FM_MM<0x18, 0x6, 0x1>; 767 def LWE_MM : Load<"lwe", GPR32Opnd>, POOL32C_LHUE_FM_MM<0x18, 0x6, 0x7>; 768 def SBE_MM : Store<"sbe", GPR32Opnd>, POOL32C_LHUE_FM_MM<0x18, 0xa, 0x4>; 769 def SHE_MM : Store<"she", GPR32Opnd>, POOL32C_LHUE_FM_MM<0x18, 0xa, 0x5>; 770 def SWE_MM : StoreMemory<"swe", GPR32Opnd, mem_simm9gpr>, 771 POOL32C_LHUE_FM_MM<0x18, 0xa, 0x7>; 772 } 773 774 def LWXS_MM : LoadWordIndexedScaledMM<"lwxs", GPR32Opnd>, LWXS_FM_MM<0x118>; 775 776 def LWU_MM : LoadMM<"lwu", GPR32Opnd, zextloadi32, II_LWU>, LL_FM_MM<0xe>; 777 778 /// Load and Store Instructions - unaligned 779 def LWL_MM : LoadLeftRightMM<"lwl", MipsLWL, GPR32Opnd, mem_mm_12>, 780 LWL_FM_MM<0x0>; 781 def LWR_MM : LoadLeftRightMM<"lwr", MipsLWR, GPR32Opnd, mem_mm_12>, 782 LWL_FM_MM<0x1>; 783 def SWL_MM : StoreLeftRightMM<"swl", MipsSWL, GPR32Opnd, mem_mm_12>, 784 LWL_FM_MM<0x8>; 785 def SWR_MM : StoreLeftRightMM<"swr", MipsSWR, GPR32Opnd, mem_mm_12>, 786 LWL_FM_MM<0x9>; 787 let DecoderMethod = "DecodeMemMMImm9" in { 788 def LWLE_MM : LoadLeftRightMM<"lwle", MipsLWL, GPR32Opnd, mem_mm_12>, 789 POOL32C_STEVA_LDEVA_FM_MM<0x6, 0x2>; 790 def LWRE_MM : LoadLeftRightMM<"lwre", MipsLWR, GPR32Opnd, mem_mm_12>, 791 POOL32C_STEVA_LDEVA_FM_MM<0x6, 0x3>; 792 def SWLE_MM : StoreLeftRightMM<"swle", MipsSWL, GPR32Opnd, mem_mm_12>, 793 POOL32C_STEVA_LDEVA_FM_MM<0xa, 0x0>; 794 def SWRE_MM : StoreLeftRightMM<"swre", MipsSWR, GPR32Opnd, mem_mm_12>, 795 POOL32C_STEVA_LDEVA_FM_MM<0xa, 0x1>, ISA_MIPS1_NOT_32R6_64R6; 796 } 797 798 /// Load and Store Instructions - multiple 799 def SWM32_MM : StoreMultMM<"swm32">, LWM_FM_MM<0xd>; 800 def LWM32_MM : LoadMultMM<"lwm32">, LWM_FM_MM<0x5>; 801 802 /// Load and Store Pair Instructions 803 def SWP_MM : StorePairMM<"swp">, LWM_FM_MM<0x9>; 804 def LWP_MM : LoadPairMM<"lwp">, LWM_FM_MM<0x1>; 805 806 /// Load and Store multiple pseudo Instructions 807 class LoadWordMultMM<string instr_asm > : 808 MipsAsmPseudoInst<(outs reglist:$rt), (ins mem_mm_12:$addr), 809 !strconcat(instr_asm, "\t$rt, $addr")> ; 810 811 class StoreWordMultMM<string instr_asm > : 812 MipsAsmPseudoInst<(outs), (ins reglist:$rt, mem_mm_12:$addr), 813 !strconcat(instr_asm, "\t$rt, $addr")> ; 814 815 816 def SWM_MM : StoreWordMultMM<"swm">; 817 def LWM_MM : LoadWordMultMM<"lwm">; 818 819 /// Move Conditional 820 def MOVZ_I_MM : MMRel, CMov_I_I_FT<"movz", GPR32Opnd, GPR32Opnd, 821 NoItinerary>, ADD_FM_MM<0, 0x58>; 822 def MOVN_I_MM : MMRel, CMov_I_I_FT<"movn", GPR32Opnd, GPR32Opnd, 823 NoItinerary>, ADD_FM_MM<0, 0x18>; 824 def MOVT_I_MM : MMRel, CMov_F_I_FT<"movt", GPR32Opnd, II_MOVT>, 825 CMov_F_I_FM_MM<0x25>; 826 def MOVF_I_MM : MMRel, CMov_F_I_FT<"movf", GPR32Opnd, II_MOVF>, 827 CMov_F_I_FM_MM<0x5>; 828 829 /// Move to/from HI/LO 830 def MTHI_MM : MMRel, MoveToLOHI<"mthi", GPR32Opnd, [HI0]>, 831 MTLO_FM_MM<0x0b5>; 832 def MTLO_MM : MMRel, MoveToLOHI<"mtlo", GPR32Opnd, [LO0]>, 833 MTLO_FM_MM<0x0f5>; 834 def MFHI_MM : MMRel, MoveFromLOHI<"mfhi", GPR32Opnd, AC0>, 835 MFLO_FM_MM<0x035>; 836 def MFLO_MM : MMRel, MoveFromLOHI<"mflo", GPR32Opnd, AC0>, 837 MFLO_FM_MM<0x075>; 838 839 /// Multiply Add/Sub Instructions 840 def MADD_MM : MMRel, MArithR<"madd", II_MADD, 1>, MULT_FM_MM<0x32c>; 841 def MADDU_MM : MMRel, MArithR<"maddu", II_MADDU, 1>, MULT_FM_MM<0x36c>; 842 def MSUB_MM : MMRel, MArithR<"msub", II_MSUB>, MULT_FM_MM<0x3ac>; 843 def MSUBU_MM : MMRel, MArithR<"msubu", II_MSUBU>, MULT_FM_MM<0x3ec>; 844 845 /// Count Leading 846 def CLZ_MM : MMRel, CountLeading0<"clz", GPR32Opnd>, CLO_FM_MM<0x16c>, 847 ISA_MIPS32; 848 def CLO_MM : MMRel, CountLeading1<"clo", GPR32Opnd>, CLO_FM_MM<0x12c>, 849 ISA_MIPS32; 850 851 /// Sign Ext In Register Instructions. 852 def SEB_MM : MMRel, SignExtInReg<"seb", i8, GPR32Opnd, II_SEB>, 853 SEB_FM_MM<0x0ac>, ISA_MIPS32R2; 854 def SEH_MM : MMRel, SignExtInReg<"seh", i16, GPR32Opnd, II_SEH>, 855 SEB_FM_MM<0x0ec>, ISA_MIPS32R2; 856 857 /// Word Swap Bytes Within Halfwords 858 def WSBH_MM : MMRel, SubwordSwap<"wsbh", GPR32Opnd, II_WSBH>, 859 SEB_FM_MM<0x1ec>, ISA_MIPS32R2; 860 861 def EXT_MM : MMRel, ExtBase<"ext", GPR32Opnd, uimm5, MipsExt>, 862 EXT_FM_MM<0x2c>; 863 def INS_MM : MMRel, InsBase<"ins", GPR32Opnd, uimm5, MipsIns>, 864 EXT_FM_MM<0x0c>; 865 866 /// Jump Instructions 867 let DecoderMethod = "DecodeJumpTargetMM" in { 868 def J_MM : MMRel, JumpFJ<jmptarget_mm, "j", br, bb, "j">, 869 J_FM_MM<0x35>; 870 def JAL_MM : MMRel, JumpLink<"jal", calltarget_mm>, J_FM_MM<0x3d>; 871 def JALX_MM : MMRel, JumpLink<"jalx", calltarget>, J_FM_MM<0x3c>; 872 } 873 def JR_MM : MMRel, IndirectBranch<"jr", GPR32Opnd>, JR_FM_MM<0x3c>; 874 def JALR_MM : JumpLinkReg<"jalr", GPR32Opnd>, JALR_FM_MM<0x03c>; 875 876 /// Jump Instructions - Short Delay Slot 877 def JALS_MM : JumpLinkMM<"jals", calltarget_mm>, J_FM_MM<0x1d>; 878 def JALRS_MM : JumpLinkRegMM<"jalrs", GPR32Opnd>, JALR_FM_MM<0x13c>; 879 880 /// Branch Instructions 881 def BEQ_MM : MMRel, CBranch<"beq", brtarget_mm, seteq, GPR32Opnd>, 882 BEQ_FM_MM<0x25>; 883 def BNE_MM : MMRel, CBranch<"bne", brtarget_mm, setne, GPR32Opnd>, 884 BEQ_FM_MM<0x2d>; 885 def BGEZ_MM : MMRel, CBranchZero<"bgez", brtarget_mm, setge, GPR32Opnd>, 886 BGEZ_FM_MM<0x2>; 887 def BGTZ_MM : MMRel, CBranchZero<"bgtz", brtarget_mm, setgt, GPR32Opnd>, 888 BGEZ_FM_MM<0x6>; 889 def BLEZ_MM : MMRel, CBranchZero<"blez", brtarget_mm, setle, GPR32Opnd>, 890 BGEZ_FM_MM<0x4>; 891 def BLTZ_MM : MMRel, CBranchZero<"bltz", brtarget_mm, setlt, GPR32Opnd>, 892 BGEZ_FM_MM<0x0>; 893 def BGEZAL_MM : MMRel, BGEZAL_FT<"bgezal", brtarget_mm, GPR32Opnd>, 894 BGEZAL_FM_MM<0x03>; 895 def BLTZAL_MM : MMRel, BGEZAL_FT<"bltzal", brtarget_mm, GPR32Opnd>, 896 BGEZAL_FM_MM<0x01>; 897 898 /// Branch Instructions - Short Delay Slot 899 def BGEZALS_MM : BranchCompareToZeroLinkMM<"bgezals", brtarget_mm, 900 GPR32Opnd>, BGEZAL_FM_MM<0x13>; 901 def BLTZALS_MM : BranchCompareToZeroLinkMM<"bltzals", brtarget_mm, 902 GPR32Opnd>, BGEZAL_FM_MM<0x11>; 903 904 /// Control Instructions 905 def SYNC_MM : MMRel, SYNC_FT<"sync">, SYNC_FM_MM; 906 def BREAK_MM : MMRel, BRK_FT<"break">, BRK_FM_MM; 907 def SYSCALL_MM : MMRel, SYS_FT<"syscall">, SYS_FM_MM; 908 def WAIT_MM : WaitMM<"wait">, WAIT_FM_MM; 909 def ERET_MM : MMRel, ER_FT<"eret">, ER_FM_MM<0x3cd>; 910 def DERET_MM : MMRel, ER_FT<"deret">, ER_FM_MM<0x38d>; 911 def EI_MM : MMRel, DEI_FT<"ei", GPR32Opnd>, EI_FM_MM<0x15d>, 912 ISA_MIPS32R2; 913 def DI_MM : MMRel, DEI_FT<"di", GPR32Opnd>, EI_FM_MM<0x11d>, 914 ISA_MIPS32R2; 915 916 /// Trap Instructions 917 def TEQ_MM : MMRel, TEQ_FT<"teq", GPR32Opnd>, TEQ_FM_MM<0x0>; 918 def TGE_MM : MMRel, TEQ_FT<"tge", GPR32Opnd>, TEQ_FM_MM<0x08>; 919 def TGEU_MM : MMRel, TEQ_FT<"tgeu", GPR32Opnd>, TEQ_FM_MM<0x10>; 920 def TLT_MM : MMRel, TEQ_FT<"tlt", GPR32Opnd>, TEQ_FM_MM<0x20>; 921 def TLTU_MM : MMRel, TEQ_FT<"tltu", GPR32Opnd>, TEQ_FM_MM<0x28>; 922 def TNE_MM : MMRel, TEQ_FT<"tne", GPR32Opnd>, TEQ_FM_MM<0x30>; 923 924 def TEQI_MM : MMRel, TEQI_FT<"teqi", GPR32Opnd>, TEQI_FM_MM<0x0e>; 925 def TGEI_MM : MMRel, TEQI_FT<"tgei", GPR32Opnd>, TEQI_FM_MM<0x09>; 926 def TGEIU_MM : MMRel, TEQI_FT<"tgeiu", GPR32Opnd>, TEQI_FM_MM<0x0b>; 927 def TLTI_MM : MMRel, TEQI_FT<"tlti", GPR32Opnd>, TEQI_FM_MM<0x08>; 928 def TLTIU_MM : MMRel, TEQI_FT<"tltiu", GPR32Opnd>, TEQI_FM_MM<0x0a>; 929 def TNEI_MM : MMRel, TEQI_FT<"tnei", GPR32Opnd>, TEQI_FM_MM<0x0c>; 930 931 /// Load-linked, Store-conditional 932 def LL_MM : LLBaseMM<"ll", GPR32Opnd>, LL_FM_MM<0x3>; 933 def SC_MM : SCBaseMM<"sc", GPR32Opnd>, LL_FM_MM<0xb>; 934 935 def LLE_MM : LLEBaseMM<"lle", GPR32Opnd>, LLE_FM_MM<0x6>; 936 def SCE_MM : SCEBaseMM<"sce", GPR32Opnd>, LLE_FM_MM<0xA>; 937 938 let DecoderMethod = "DecodeCacheOpMM" in { 939 def CACHE_MM : MMRel, CacheOp<"cache", mem_mm_12>, 940 CACHE_PREF_FM_MM<0x08, 0x6>; 941 def PREF_MM : MMRel, CacheOp<"pref", mem_mm_12>, 942 CACHE_PREF_FM_MM<0x18, 0x2>; 943 } 944 945 let DecoderMethod = "DecodePrefeOpMM" in { 946 def PREFE_MM : MMRel, CacheOp<"prefe", mem_mm_9>, 947 CACHE_PREFE_FM_MM<0x18, 0x2>; 948 def CACHEE_MM : MMRel, CacheOp<"cachee", mem_mm_9>, 949 CACHE_PREFE_FM_MM<0x18, 0x3>; 950 } 951 def SSNOP_MM : MMRel, Barrier<"ssnop">, BARRIER_FM_MM<0x1>; 952 def EHB_MM : MMRel, Barrier<"ehb">, BARRIER_FM_MM<0x3>; 953 def PAUSE_MM : MMRel, Barrier<"pause">, BARRIER_FM_MM<0x5>; 954 955 def TLBP_MM : MMRel, TLB<"tlbp">, COP0_TLB_FM_MM<0x0d>; 956 def TLBR_MM : MMRel, TLB<"tlbr">, COP0_TLB_FM_MM<0x4d>; 957 def TLBWI_MM : MMRel, TLB<"tlbwi">, COP0_TLB_FM_MM<0x8d>; 958 def TLBWR_MM : MMRel, TLB<"tlbwr">, COP0_TLB_FM_MM<0xcd>; 959 960 def SDBBP_MM : MMRel, SYS_FT<"sdbbp">, SDBBP_FM_MM; 961 962 def PREFX_MM : PrefetchIndexed<"prefx">, POOL32F_PREFX_FM_MM<0x15, 0x1A0>; 963} 964 965let DecoderNamespace = "MicroMips" in { 966 def RDHWR_MM : MMRel, R6MMR6Rel, ReadHardware<GPR32Opnd, HWRegsOpnd>, 967 RDHWR_FM_MM, ISA_MICROMIPS32_NOT_MIPS32R6; 968} 969 970let Predicates = [InMicroMips] in { 971 972//===----------------------------------------------------------------------===// 973// MicroMips arbitrary patterns that map to one or more instructions 974//===----------------------------------------------------------------------===// 975 976def : MipsPat<(i32 immLi16:$imm), 977 (LI16_MM immLi16:$imm)>; 978def : MipsPat<(i32 immSExt16:$imm), 979 (ADDiu_MM ZERO, immSExt16:$imm)>; 980def : MipsPat<(i32 immZExt16:$imm), 981 (ORi_MM ZERO, immZExt16:$imm)>; 982def : MipsPat<(not GPR32:$in), 983 (NOR_MM GPR32Opnd:$in, ZERO)>; 984 985def : MipsPat<(add GPRMM16:$src, immSExtAddiur2:$imm), 986 (ADDIUR2_MM GPRMM16:$src, immSExtAddiur2:$imm)>; 987def : MipsPat<(add GPR32:$src, immSExtAddius5:$imm), 988 (ADDIUS5_MM GPR32:$src, immSExtAddius5:$imm)>; 989def : MipsPat<(add GPR32:$src, immSExt16:$imm), 990 (ADDiu_MM GPR32:$src, immSExt16:$imm)>; 991 992def : MipsPat<(and GPRMM16:$src, immZExtAndi16:$imm), 993 (ANDI16_MM GPRMM16:$src, immZExtAndi16:$imm)>; 994def : MipsPat<(and GPR32:$src, immZExt16:$imm), 995 (ANDi_MM GPR32:$src, immZExt16:$imm)>; 996 997def : MipsPat<(shl GPRMM16:$src, immZExt2Shift:$imm), 998 (SLL16_MM GPRMM16:$src, immZExt2Shift:$imm)>; 999def : MipsPat<(shl GPR32:$src, immZExt5:$imm), 1000 (SLL_MM GPR32:$src, immZExt5:$imm)>; 1001 1002def : MipsPat<(srl GPRMM16:$src, immZExt2Shift:$imm), 1003 (SRL16_MM GPRMM16:$src, immZExt2Shift:$imm)>; 1004def : MipsPat<(srl GPR32:$src, immZExt5:$imm), 1005 (SRL_MM GPR32:$src, immZExt5:$imm)>; 1006 1007def : MipsPat<(store GPRMM16:$src, addrimm4lsl2:$addr), 1008 (SW16_MM GPRMM16:$src, addrimm4lsl2:$addr)>; 1009def : MipsPat<(store GPR32:$src, addr:$addr), 1010 (SW_MM GPR32:$src, addr:$addr)>; 1011 1012def : MipsPat<(load addrimm4lsl2:$addr), 1013 (LW16_MM addrimm4lsl2:$addr)>; 1014def : MipsPat<(load addr:$addr), 1015 (LW_MM addr:$addr)>; 1016 1017//===----------------------------------------------------------------------===// 1018// MicroMips instruction aliases 1019//===----------------------------------------------------------------------===// 1020 1021class UncondBranchMMPseudo<string opstr> : 1022 MipsAsmPseudoInst<(outs), (ins brtarget_mm:$offset), 1023 !strconcat(opstr, "\t$offset")>; 1024 1025def B_MM_Pseudo : UncondBranchMMPseudo<"b">, ISA_MICROMIPS; 1026 1027 def : MipsInstAlias<"wait", (WAIT_MM 0x0), 1>; 1028 def : MipsInstAlias<"nop", (SLL_MM ZERO, ZERO, 0), 1>; 1029 def : MipsInstAlias<"nop", (MOVE16_MM ZERO, ZERO), 1>; 1030} 1031 1032let Predicates = [InMicroMips] in { 1033def : MipsInstAlias<"ei", (EI_MM ZERO), 1>, ISA_MIPS32R2; 1034def : MipsInstAlias<"teq $rs, $rt", 1035 (TEQ_MM GPR32Opnd:$rs, GPR32Opnd:$rt, 0), 1>; 1036def : MipsInstAlias<"tge $rs, $rt", 1037 (TGE_MM GPR32Opnd:$rs, GPR32Opnd:$rt, 0), 1>; 1038def : MipsInstAlias<"tgeu $rs, $rt", 1039 (TGEU_MM GPR32Opnd:$rs, GPR32Opnd:$rt, 0), 1>; 1040def : MipsInstAlias<"tlt $rs, $rt", 1041 (TLT_MM GPR32Opnd:$rs, GPR32Opnd:$rt, 0), 1>; 1042def : MipsInstAlias<"tltu $rs, $rt", 1043 (TLTU_MM GPR32Opnd:$rs, GPR32Opnd:$rt, 0), 1>; 1044def : MipsInstAlias<"tne $rs, $rt", 1045 (TNE_MM GPR32Opnd:$rs, GPR32Opnd:$rt, 0), 1>; 1046} 1047