xref: /llvm-project/llvm/lib/Target/Mips/MipsMTInstrInfo.td (revision 2946cd701067404b99c39fb29dc9c74bd7193eb3)
17323f7acSSimon Dardis//===-- MipsMTInstrInfo.td - Mips MT Instruction Infos -----*- tablegen -*-===//
27323f7acSSimon Dardis//
3*2946cd70SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67323f7acSSimon Dardis//
77323f7acSSimon Dardis//===----------------------------------------------------------------------===//
8de5ed0c5SSimon Dardis//
9de5ed0c5SSimon Dardis// This file describes the MIPS MT ASE as defined by MD00378 1.12.
10de5ed0c5SSimon Dardis//
11de5ed0c5SSimon Dardis// TODO: Add support for the microMIPS encodings for the MT ASE and add the
12de5ed0c5SSimon Dardis//       instruction mappings.
13de5ed0c5SSimon Dardis//
14de5ed0c5SSimon Dardis//===----------------------------------------------------------------------===//
157323f7acSSimon Dardis
167323f7acSSimon Dardis//===----------------------------------------------------------------------===//
177323f7acSSimon Dardis// MIPS MT Instruction Encodings
187323f7acSSimon Dardis//===----------------------------------------------------------------------===//
197323f7acSSimon Dardis
207323f7acSSimon Dardisclass DMT_ENC : COP0_MFMC0_MT<FIELD5_1_DMT_EMT, FIELD5_2_DMT_EMT,
212de1ddbdSSimon Dardis                              OPCODE_SC_D>;
227323f7acSSimon Dardis
237323f7acSSimon Dardisclass EMT_ENC : COP0_MFMC0_MT<FIELD5_1_DMT_EMT, FIELD5_2_DMT_EMT,
242de1ddbdSSimon Dardis                              OPCODE_SC_E>;
252de1ddbdSSimon Dardis
262de1ddbdSSimon Dardisclass DVPE_ENC : COP0_MFMC0_MT<FIELD5_1_2_DVPE_EVPE, FIELD5_1_2_DVPE_EVPE,
272de1ddbdSSimon Dardis                               OPCODE_SC_D>;
282de1ddbdSSimon Dardis
292de1ddbdSSimon Dardisclass EVPE_ENC : COP0_MFMC0_MT<FIELD5_1_2_DVPE_EVPE, FIELD5_1_2_DVPE_EVPE,
302de1ddbdSSimon Dardis                               OPCODE_SC_E>;
317323f7acSSimon Dardis
3276eb647eSSimon Dardisclass FORK_ENC : SPECIAL3_MT_FORK;
3376eb647eSSimon Dardis
3476eb647eSSimon Dardisclass YIELD_ENC : SPECIAL3_MT_YIELD;
3576eb647eSSimon Dardis
36de5ed0c5SSimon Dardisclass MFTR_ENC : COP0_MFTTR_MT<FIELD5_MFTR>;
37de5ed0c5SSimon Dardis
38de5ed0c5SSimon Dardisclass MTTR_ENC : COP0_MFTTR_MT<FIELD5_MTTR>;
39de5ed0c5SSimon Dardis
407323f7acSSimon Dardis//===----------------------------------------------------------------------===//
417323f7acSSimon Dardis// MIPS MT Instruction Descriptions
427323f7acSSimon Dardis//===----------------------------------------------------------------------===//
437323f7acSSimon Dardis
447323f7acSSimon Dardisclass MT_1R_DESC_BASE<string instr_asm, InstrItinClass Itin = NoItinerary> {
457323f7acSSimon Dardis  dag OutOperandList = (outs GPR32Opnd:$rt);
467323f7acSSimon Dardis  dag InOperandList = (ins);
477323f7acSSimon Dardis  string AsmString = !strconcat(instr_asm, "\t$rt");
487323f7acSSimon Dardis  list<dag> Pattern = [];
497323f7acSSimon Dardis  InstrItinClass Itinerary = Itin;
507323f7acSSimon Dardis}
517323f7acSSimon Dardis
52de5ed0c5SSimon Dardisclass MFTR_DESC {
53de5ed0c5SSimon Dardis  dag OutOperandList = (outs GPR32Opnd:$rd);
54de5ed0c5SSimon Dardis  dag InOperandList = (ins GPR32Opnd:$rt, uimm1:$u, uimm3:$sel, uimm1:$h);
55de5ed0c5SSimon Dardis  string AsmString = "mftr\t$rd, $rt, $u, $sel, $h";
56de5ed0c5SSimon Dardis  list<dag> Pattern = [];
57de5ed0c5SSimon Dardis  InstrItinClass Itinerary = II_MFTR;
58de5ed0c5SSimon Dardis}
59de5ed0c5SSimon Dardis
60de5ed0c5SSimon Dardisclass MTTR_DESC {
61de5ed0c5SSimon Dardis  dag OutOperandList = (outs GPR32Opnd:$rd);
62de5ed0c5SSimon Dardis  dag InOperandList = (ins GPR32Opnd:$rt, uimm1:$u, uimm3:$sel, uimm1:$h);
63de5ed0c5SSimon Dardis  string AsmString = "mttr\t$rt, $rd, $u, $sel, $h";
64de5ed0c5SSimon Dardis  list<dag> Pattern = [];
65de5ed0c5SSimon Dardis  InstrItinClass Itinerary = II_MTTR;
66de5ed0c5SSimon Dardis}
67de5ed0c5SSimon Dardis
6876eb647eSSimon Dardisclass FORK_DESC {
6976eb647eSSimon Dardis  dag OutOperandList = (outs GPR32Opnd:$rs, GPR32Opnd:$rd);
7076eb647eSSimon Dardis  dag InOperandList = (ins GPR32Opnd:$rt);
7176eb647eSSimon Dardis  string AsmString = "fork\t$rd, $rs, $rt";
7276eb647eSSimon Dardis  list<dag> Pattern = [];
7376eb647eSSimon Dardis  InstrItinClass Itinerary = II_FORK;
7476eb647eSSimon Dardis}
7576eb647eSSimon Dardis
7676eb647eSSimon Dardisclass YIELD_DESC {
7776eb647eSSimon Dardis  dag OutOperandList = (outs GPR32Opnd:$rd);
7876eb647eSSimon Dardis  dag InOperandList = (ins GPR32Opnd:$rs);
7976eb647eSSimon Dardis  string AsmString = "yield\t$rd, $rs";
8076eb647eSSimon Dardis  list<dag> Pattern = [];
8176eb647eSSimon Dardis  InstrItinClass Itinerary = II_YIELD;
8276eb647eSSimon Dardis}
8376eb647eSSimon Dardis
847323f7acSSimon Dardisclass DMT_DESC : MT_1R_DESC_BASE<"dmt", II_DMT>;
857323f7acSSimon Dardis
867323f7acSSimon Dardisclass EMT_DESC : MT_1R_DESC_BASE<"emt", II_EMT>;
877323f7acSSimon Dardis
882de1ddbdSSimon Dardisclass DVPE_DESC : MT_1R_DESC_BASE<"dvpe", II_DVPE>;
892de1ddbdSSimon Dardis
902de1ddbdSSimon Dardisclass EVPE_DESC : MT_1R_DESC_BASE<"evpe", II_EVPE>;
912de1ddbdSSimon Dardis
927323f7acSSimon Dardis//===----------------------------------------------------------------------===//
937323f7acSSimon Dardis// MIPS MT Instruction Definitions
947323f7acSSimon Dardis//===----------------------------------------------------------------------===//
957323f7acSSimon Dardislet hasSideEffects = 1, isNotDuplicable = 1,
967323f7acSSimon Dardis    AdditionalPredicates = [NotInMicroMips] in {
977323f7acSSimon Dardis  def DMT : DMT_ENC, DMT_DESC, ASE_MT;
987323f7acSSimon Dardis
997323f7acSSimon Dardis  def EMT : EMT_ENC, EMT_DESC, ASE_MT;
1002de1ddbdSSimon Dardis
1012de1ddbdSSimon Dardis  def DVPE : DVPE_ENC, DVPE_DESC, ASE_MT;
1022de1ddbdSSimon Dardis
1032de1ddbdSSimon Dardis  def EVPE : EVPE_ENC, EVPE_DESC, ASE_MT;
10476eb647eSSimon Dardis
10576eb647eSSimon Dardis  def FORK : FORK_ENC, FORK_DESC, ASE_MT;
10676eb647eSSimon Dardis
10776eb647eSSimon Dardis  def YIELD : YIELD_ENC, YIELD_DESC, ASE_MT;
108de5ed0c5SSimon Dardis
109de5ed0c5SSimon Dardis  def MFTR : MFTR_ENC, MFTR_DESC, ASE_MT;
110de5ed0c5SSimon Dardis
111de5ed0c5SSimon Dardis  def MTTR : MTTR_ENC, MTTR_DESC, ASE_MT;
1127323f7acSSimon Dardis}
1137323f7acSSimon Dardis
1147323f7acSSimon Dardis//===----------------------------------------------------------------------===//
115de5ed0c5SSimon Dardis// MIPS MT Pseudo Instructions - used to support mtfr & mttr aliases.
116de5ed0c5SSimon Dardis//===----------------------------------------------------------------------===//
117de5ed0c5SSimon Dardisdef MFTC0 : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), (ins COP0Opnd:$rt,
118de5ed0c5SSimon Dardis                                                        uimm3:$sel),
119de5ed0c5SSimon Dardis                              "mftc0 $rd, $rt, $sel">, ASE_MT;
120de5ed0c5SSimon Dardis
121de5ed0c5SSimon Dardisdef MFTGPR : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), (ins GPR32Opnd:$rt,
122de5ed0c5SSimon Dardis                                                          uimm3:$sel),
123de5ed0c5SSimon Dardis                               "mftgpr $rd, $rt">, ASE_MT;
124de5ed0c5SSimon Dardis
125de5ed0c5SSimon Dardisdef MFTLO : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), (ins ACC64DSPOpnd:$ac),
126de5ed0c5SSimon Dardis                              "mftlo $rt, $ac">, ASE_MT;
127de5ed0c5SSimon Dardis
128de5ed0c5SSimon Dardisdef MFTHI : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), (ins ACC64DSPOpnd:$ac),
129de5ed0c5SSimon Dardis                              "mfthi $rt, $ac">, ASE_MT;
130de5ed0c5SSimon Dardis
131de5ed0c5SSimon Dardisdef MFTACX : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), (ins ACC64DSPOpnd:$ac),
132de5ed0c5SSimon Dardis                               "mftacx $rt, $ac">, ASE_MT;
133de5ed0c5SSimon Dardis
134de5ed0c5SSimon Dardisdef MFTDSP : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), (ins),
135de5ed0c5SSimon Dardis                               "mftdsp $rt">, ASE_MT;
136de5ed0c5SSimon Dardis
137de5ed0c5SSimon Dardisdef MFTC1 : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), (ins FGR32Opnd:$ft),
138de5ed0c5SSimon Dardis                              "mftc1 $rt, $ft">, ASE_MT;
139de5ed0c5SSimon Dardis
140de5ed0c5SSimon Dardisdef MFTHC1 : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), (ins FGR32Opnd:$ft),
141de5ed0c5SSimon Dardis                               "mfthc1 $rt, $ft">, ASE_MT;
142de5ed0c5SSimon Dardis
143de5ed0c5SSimon Dardisdef CFTC1 : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), (ins FGRCCOpnd:$ft),
144de5ed0c5SSimon Dardis                              "cftc1 $rt, $ft">, ASE_MT;
145de5ed0c5SSimon Dardis
146de5ed0c5SSimon Dardis
147de5ed0c5SSimon Dardisdef MTTC0 : MipsAsmPseudoInst<(outs COP0Opnd:$rd), (ins GPR32Opnd:$rt,
148de5ed0c5SSimon Dardis                                                        uimm3:$sel),
149de5ed0c5SSimon Dardis                              "mttc0 $rt, $rd, $sel">, ASE_MT;
150de5ed0c5SSimon Dardis
151de5ed0c5SSimon Dardisdef MTTGPR : MipsAsmPseudoInst<(outs GPR32Opnd:$rt), (ins GPR32Opnd:$rd),
152de5ed0c5SSimon Dardis                               "mttgpr $rd, $rt">, ASE_MT;
153de5ed0c5SSimon Dardis
154de5ed0c5SSimon Dardisdef MTTLO : MipsAsmPseudoInst<(outs ACC64DSPOpnd:$ac), (ins GPR32Opnd:$rt),
155de5ed0c5SSimon Dardis                              "mttlo $rt, $ac">, ASE_MT;
156de5ed0c5SSimon Dardis
157de5ed0c5SSimon Dardisdef MTTHI : MipsAsmPseudoInst<(outs ACC64DSPOpnd:$ac), (ins GPR32Opnd:$rt),
158de5ed0c5SSimon Dardis                              "mtthi $rt, $ac">, ASE_MT;
159de5ed0c5SSimon Dardis
160de5ed0c5SSimon Dardisdef MTTACX : MipsAsmPseudoInst<(outs ACC64DSPOpnd:$ac), (ins GPR32Opnd:$rt),
161de5ed0c5SSimon Dardis                               "mttacx $rt, $ac">, ASE_MT;
162de5ed0c5SSimon Dardis
163de5ed0c5SSimon Dardisdef MTTDSP : MipsAsmPseudoInst<(outs), (ins GPR32Opnd:$rt),
164de5ed0c5SSimon Dardis                               "mttdsp $rt">, ASE_MT;
165de5ed0c5SSimon Dardis
166de5ed0c5SSimon Dardisdef MTTC1 : MipsAsmPseudoInst<(outs FGR32Opnd:$ft), (ins GPR32Opnd:$rt),
167de5ed0c5SSimon Dardis                              "mttc1 $rt, $ft">, ASE_MT;
168de5ed0c5SSimon Dardis
169de5ed0c5SSimon Dardisdef MTTHC1 : MipsAsmPseudoInst<(outs FGR32Opnd:$ft), (ins GPR32Opnd:$rt),
170de5ed0c5SSimon Dardis                               "mtthc1 $rt, $ft">, ASE_MT;
171de5ed0c5SSimon Dardis
172de5ed0c5SSimon Dardisdef CTTC1 : MipsAsmPseudoInst<(outs FGRCCOpnd:$ft), (ins GPR32Opnd:$rt),
173de5ed0c5SSimon Dardis                              "cttc1 $rt, $ft">, ASE_MT;
174de5ed0c5SSimon Dardis
175de5ed0c5SSimon Dardis//===----------------------------------------------------------------------===//
1767323f7acSSimon Dardis// MIPS MT Instruction Definitions
1777323f7acSSimon Dardis//===----------------------------------------------------------------------===//
1787323f7acSSimon Dardis
1797323f7acSSimon Dardislet AdditionalPredicates = [NotInMicroMips] in {
1807323f7acSSimon Dardis  def : MipsInstAlias<"dmt", (DMT ZERO), 1>, ASE_MT;
1817323f7acSSimon Dardis
1827323f7acSSimon Dardis  def : MipsInstAlias<"emt", (EMT ZERO), 1>, ASE_MT;
1832de1ddbdSSimon Dardis
1842de1ddbdSSimon Dardis  def : MipsInstAlias<"dvpe", (DVPE ZERO), 1>, ASE_MT;
1852de1ddbdSSimon Dardis
1862de1ddbdSSimon Dardis  def : MipsInstAlias<"evpe", (EVPE ZERO), 1>, ASE_MT;
18776eb647eSSimon Dardis
18876eb647eSSimon Dardis  def : MipsInstAlias<"yield $rs", (YIELD ZERO, GPR32Opnd:$rs), 1>, ASE_MT;
189de5ed0c5SSimon Dardis
190de5ed0c5SSimon Dardis  def : MipsInstAlias<"mftc0 $rd, $rt", (MFTC0 GPR32Opnd:$rd, COP0Opnd:$rt, 0),
191de5ed0c5SSimon Dardis                      1>, ASE_MT;
192de5ed0c5SSimon Dardis
193de5ed0c5SSimon Dardis  def : MipsInstAlias<"mftlo $rt", (MFTLO GPR32Opnd:$rt, AC0), 1>, ASE_MT;
194de5ed0c5SSimon Dardis
195de5ed0c5SSimon Dardis  def : MipsInstAlias<"mfthi $rt", (MFTHI GPR32Opnd:$rt, AC0), 1>, ASE_MT;
196de5ed0c5SSimon Dardis
197de5ed0c5SSimon Dardis  def : MipsInstAlias<"mftacx $rt", (MFTACX GPR32Opnd:$rt, AC0), 1>, ASE_MT;
198de5ed0c5SSimon Dardis
199de5ed0c5SSimon Dardis  def : MipsInstAlias<"mttc0 $rd, $rt", (MTTC0 COP0Opnd:$rt, GPR32Opnd:$rd, 0),
200de5ed0c5SSimon Dardis                      1>, ASE_MT;
201de5ed0c5SSimon Dardis
202de5ed0c5SSimon Dardis  def : MipsInstAlias<"mttlo $rt", (MTTLO AC0, GPR32Opnd:$rt), 1>, ASE_MT;
203de5ed0c5SSimon Dardis
204de5ed0c5SSimon Dardis  def : MipsInstAlias<"mtthi $rt", (MTTHI AC0, GPR32Opnd:$rt), 1>, ASE_MT;
205de5ed0c5SSimon Dardis
206de5ed0c5SSimon Dardis  def : MipsInstAlias<"mttacx $rt", (MTTACX AC0, GPR32Opnd:$rt), 1>, ASE_MT;
2077323f7acSSimon Dardis}
208