xref: /llvm-project/llvm/lib/Target/LoongArch/LoongArchFloatInstrFormats.td (revision 271087e3a0875672b26c185a28b3552d5600d2fb)
1a79ddac5Swanglei// LoongArchFloatInstrFormats.td - LoongArch FP Instr Formats -*- tablegen -*-//
23a49ad71SWeining Lu//
33a49ad71SWeining Lu// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43a49ad71SWeining Lu// See https://llvm.org/LICENSE.txt for license information.
53a49ad71SWeining Lu// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63a49ad71SWeining Lu//
73a49ad71SWeining Lu//===----------------------------------------------------------------------===//
83a49ad71SWeining Lu
93a49ad71SWeining Lu//===----------------------------------------------------------------------===//
103a49ad71SWeining Lu//  Describe LoongArch floating-point instructions format
113a49ad71SWeining Lu//
123a49ad71SWeining Lu//  opcode       - operation code.
133a49ad71SWeining Lu//  fd           - destination register operand.
143a49ad71SWeining Lu//  {c/f}{j/k/a} - source register operand.
153a49ad71SWeining Lu//  immN         - immediate data operand.
163a49ad71SWeining Lu//
173a49ad71SWeining Lu//===----------------------------------------------------------------------===//
183a49ad71SWeining Lu
19294bee10SWANG Xuerui// Some FP instructions are defined twice, for accepting FPR32 and FPR64, but
20294bee10SWANG Xuerui// with the same mnemonic. Also some are codegen-only definitions that
21294bee10SWANG Xuerui// nevertheless require a "normal" mnemonic.
22294bee10SWANG Xuerui//
23294bee10SWANG Xuerui// In order to accommodate these needs, the instruction defs have names
24294bee10SWANG Xuerui// suffixed with `_x[SD]` or `_64`, that will get trimmed before the mnemonics
25294bee10SWANG Xuerui// are derived.
26294bee10SWANG Xueruiclass deriveFPInsnMnemonic<string name> {
27294bee10SWANG Xuerui  string ret = deriveInsnMnemonic<!subst("_64", "",
28294bee10SWANG Xuerui                                         !subst("_xD", "",
29294bee10SWANG Xuerui                                                !subst("_xS", "", name)))>.ret;
30294bee10SWANG Xuerui}
31294bee10SWANG Xuerui
323a49ad71SWeining Lu// 2R-type
333a49ad71SWeining Lu// <opcode | fj | fd>
3446aec7bcSwangleiclass FPFmt2R<bits<32> op, dag outs, dag ins, string opnstr,
353a49ad71SWeining Lu              list<dag> pattern = []>
36294bee10SWANG Xuerui    : LAInst<outs, ins, deriveFPInsnMnemonic<NAME>.ret, opnstr, pattern> {
373a49ad71SWeining Lu  bits<5> fj;
383a49ad71SWeining Lu  bits<5> fd;
393a49ad71SWeining Lu
4046aec7bcSwanglei  let Inst{31-0} = op;
413a49ad71SWeining Lu  let Inst{9-5} = fj;
423a49ad71SWeining Lu  let Inst{4-0} = fd;
433a49ad71SWeining Lu}
443a49ad71SWeining Lu
453a49ad71SWeining Lu// 3R-type
463a49ad71SWeining Lu// <opcode | fk | fj | fd>
4746aec7bcSwangleiclass FPFmt3R<bits<32> op, dag outs, dag ins, string opnstr,
483a49ad71SWeining Lu              list<dag> pattern = []>
49294bee10SWANG Xuerui    : LAInst<outs, ins, deriveFPInsnMnemonic<NAME>.ret, opnstr, pattern> {
503a49ad71SWeining Lu  bits<5> fk;
513a49ad71SWeining Lu  bits<5> fj;
523a49ad71SWeining Lu  bits<5> fd;
533a49ad71SWeining Lu
5446aec7bcSwanglei  let Inst{31-0} = op;
553a49ad71SWeining Lu  let Inst{14-10} = fk;
563a49ad71SWeining Lu  let Inst{9-5} = fj;
573a49ad71SWeining Lu  let Inst{4-0} = fd;
583a49ad71SWeining Lu}
593a49ad71SWeining Lu
603a49ad71SWeining Lu// 4R-type
613a49ad71SWeining Lu// <opcode | fa | fk | fj | fd>
6246aec7bcSwangleiclass FPFmt4R<bits<32> op, dag outs, dag ins, string opnstr,
633a49ad71SWeining Lu              list<dag> pattern = []>
64294bee10SWANG Xuerui    : LAInst<outs, ins, deriveFPInsnMnemonic<NAME>.ret, opnstr, pattern> {
653a49ad71SWeining Lu  bits<5> fa;
663a49ad71SWeining Lu  bits<5> fk;
673a49ad71SWeining Lu  bits<5> fj;
683a49ad71SWeining Lu  bits<5> fd;
693a49ad71SWeining Lu
7046aec7bcSwanglei  let Inst{31-0} = op;
713a49ad71SWeining Lu  let Inst{19-15} = fa;
723a49ad71SWeining Lu  let Inst{14-10} = fk;
733a49ad71SWeining Lu  let Inst{9-5} = fj;
743a49ad71SWeining Lu  let Inst{4-0} = fd;
753a49ad71SWeining Lu}
763a49ad71SWeining Lu
773a49ad71SWeining Lu// 2RI12-type
783a49ad71SWeining Lu// <opcode | I12 | rj | fd>
7946aec7bcSwangleiclass FPFmt2RI12<bits<32> op, dag outs, dag ins, string opnstr,
803a49ad71SWeining Lu                 list<dag> pattern = []>
81294bee10SWANG Xuerui    : LAInst<outs, ins, deriveFPInsnMnemonic<NAME>.ret, opnstr, pattern> {
823a49ad71SWeining Lu  bits<12> imm12;
833a49ad71SWeining Lu  bits<5> rj;
843a49ad71SWeining Lu  bits<5> fd;
853a49ad71SWeining Lu
8646aec7bcSwanglei  let Inst{31-0} = op;
873a49ad71SWeining Lu  let Inst{21-10} = imm12;
883a49ad71SWeining Lu  let Inst{9-5} = rj;
893a49ad71SWeining Lu  let Inst{4-0} = fd;
903a49ad71SWeining Lu}
913a49ad71SWeining Lu
923a49ad71SWeining Lu// FmtFCMP
9346aec7bcSwanglei// <opcode | fk | fj | cd>
9446aec7bcSwangleiclass FPFmtFCMP<bits<32> op, dag outs, dag ins, string opnstr,
95294bee10SWANG Xuerui                list<dag> pattern = []>
96294bee10SWANG Xuerui    : LAInst<outs, ins, deriveFPInsnMnemonic<NAME>.ret, opnstr, pattern> {
973a49ad71SWeining Lu  bits<5> fk;
983a49ad71SWeining Lu  bits<5> fj;
993a49ad71SWeining Lu  bits<3> cd;
1003a49ad71SWeining Lu
10146aec7bcSwanglei  let Inst{31-0} = op;
1023a49ad71SWeining Lu  let Inst{14-10} = fk;
1033a49ad71SWeining Lu  let Inst{9-5} = fj;
1043a49ad71SWeining Lu  let Inst{2-0} = cd;
1053a49ad71SWeining Lu}
1063a49ad71SWeining Lu
1073a49ad71SWeining Lu// FPFmtBR
10846aec7bcSwanglei// <opcode | I21[15:0] | cj | I21[20:16]>
10946aec7bcSwangleiclass FPFmtBR<bits<32> op, dag outs, dag ins, string opnstr,
110294bee10SWANG Xuerui              list<dag> pattern = []>
111294bee10SWANG Xuerui    : LAInst<outs, ins, deriveFPInsnMnemonic<NAME>.ret, opnstr, pattern> {
1123a49ad71SWeining Lu  bits<21> imm21;
1133a49ad71SWeining Lu  bits<3> cj;
1143a49ad71SWeining Lu
11546aec7bcSwanglei  let Inst{31-0} = op;
1163a49ad71SWeining Lu  let Inst{25-10} = imm21{15-0};
1173a49ad71SWeining Lu  let Inst{7-5} = cj;
1183a49ad71SWeining Lu  let Inst{4-0} = imm21{20-16};
1193a49ad71SWeining Lu}
1203a49ad71SWeining Lu
1213a49ad71SWeining Lu// FmtFSEL
1223a49ad71SWeining Lu// <opcode | ca | fk | fj | fd>
12346aec7bcSwangleiclass FPFmtFSEL<bits<32> op, dag outs, dag ins, string opnstr,
1243a49ad71SWeining Lu                list<dag> pattern = []>
125294bee10SWANG Xuerui    : LAInst<outs, ins, deriveFPInsnMnemonic<NAME>.ret, opnstr, pattern> {
1263a49ad71SWeining Lu  bits<3> ca;
1273a49ad71SWeining Lu  bits<5> fk;
1283a49ad71SWeining Lu  bits<5> fj;
1293a49ad71SWeining Lu  bits<5> fd;
1303a49ad71SWeining Lu
13146aec7bcSwanglei  let Inst{31-0} = op;
1323a49ad71SWeining Lu  let Inst{17-15} = ca;
1333a49ad71SWeining Lu  let Inst{14-10} = fk;
1343a49ad71SWeining Lu  let Inst{9-5} = fj;
1353a49ad71SWeining Lu  let Inst{4-0} = fd;
1363a49ad71SWeining Lu}
1373a49ad71SWeining Lu
1383a49ad71SWeining Lu// FPFmtMOV
1393a49ad71SWeining Lu// <opcode | src | dst>
14046aec7bcSwangleiclass FPFmtMOV<bits<32> op, dag outs, dag ins, string opnstr,
1413a49ad71SWeining Lu               list<dag> pattern = []>
142294bee10SWANG Xuerui    : LAInst<outs, ins, deriveFPInsnMnemonic<NAME>.ret, opnstr, pattern> {
1433a49ad71SWeining Lu  bits<5> src;
1443a49ad71SWeining Lu  bits<5> dst;
1453a49ad71SWeining Lu
14646aec7bcSwanglei  let Inst{31-0} = op;
1473a49ad71SWeining Lu  let Inst{9-5} = src;
1483a49ad71SWeining Lu  let Inst{4-0} = dst;
1493a49ad71SWeining Lu}
1503a49ad71SWeining Lu
1513a49ad71SWeining Lu// FPFmtMEM
1523a49ad71SWeining Lu// <opcode | rk | rj | fd>
15346aec7bcSwangleiclass FPFmtMEM<bits<32> op, dag outs, dag ins, string opnstr,
1543a49ad71SWeining Lu               list<dag> pattern = []>
155294bee10SWANG Xuerui    : LAInst<outs, ins, deriveFPInsnMnemonic<NAME>.ret, opnstr, pattern> {
1563a49ad71SWeining Lu  bits<5> rk;
1573a49ad71SWeining Lu  bits<5> rj;
1583a49ad71SWeining Lu  bits<5> fd;
1593a49ad71SWeining Lu
16046aec7bcSwanglei  let Inst{31-0} = op;
1613a49ad71SWeining Lu  let Inst{14-10} = rk;
1623a49ad71SWeining Lu  let Inst{9-5} = rj;
1633a49ad71SWeining Lu  let Inst{4-0} = fd;
1643a49ad71SWeining Lu}
1653a49ad71SWeining Lu
1663a49ad71SWeining Lu//===----------------------------------------------------------------------===//
1673a49ad71SWeining Lu// Instruction class templates
1683a49ad71SWeining Lu//===----------------------------------------------------------------------===//
1693a49ad71SWeining Lu
170f9e0845eSWang Ruilet hasSideEffects = 0, mayLoad = 0, mayStore = 0 in {
17146aec7bcSwangleiclass FP_ALU_2R<bits<32> op, RegisterClass rc = FPR32>
172294bee10SWANG Xuerui    : FPFmt2R<op, (outs rc:$fd), (ins rc:$fj), "$fd, $fj">;
1733a49ad71SWeining Lu
17446aec7bcSwangleiclass FP_ALU_3R<bits<32> op, RegisterClass rc = FPR32>
175294bee10SWANG Xuerui    : FPFmt3R<op, (outs rc:$fd), (ins rc:$fj, rc:$fk), "$fd, $fj, $fk">;
1763a49ad71SWeining Lu
17746aec7bcSwangleiclass FP_ALU_4R<bits<32> op, RegisterClass rc = FPR32>
178294bee10SWANG Xuerui    : FPFmt4R<op, (outs rc:$fd), (ins rc:$fj, rc:$fk, rc:$fa),
1793a49ad71SWeining Lu              "$fd, $fj, $fk, $fa">;
180f9e0845eSWang Rui} // hasSideEffects = 0, mayLoad = 0, mayStore = 0
1813a49ad71SWeining Lu
182f9e0845eSWang Ruilet hasSideEffects = 0, mayLoad = 0, mayStore = 0 in {
18346aec7bcSwangleiclass FP_CMP<bits<32> op, RegisterClass rc = FPR32>
18446aec7bcSwanglei    : FPFmtFCMP<op, (outs CFR:$cd), (ins rc:$fj, rc:$fk), "$cd, $fj, $fk">;
1853a49ad71SWeining Lu
18646aec7bcSwangleiclass FP_CONV<bits<32> op, RegisterClass rcd = FPR32, RegisterClass rcs = FPR32>
187294bee10SWANG Xuerui    : FPFmt2R<op, (outs rcd:$fd), (ins rcs:$fj), "$fd, $fj">;
1883a49ad71SWeining Lu
18946aec7bcSwangleiclass FP_MOV<bits<32> op, RegisterClass rcd = FPR32, RegisterClass rcs = FPR32>
190294bee10SWANG Xuerui    : FPFmtMOV<op, (outs rcd:$dst), (ins rcs:$src), "$dst, $src">;
1913a49ad71SWeining Lu
19246aec7bcSwangleiclass FP_SEL<bits<32> op, RegisterClass rc = FPR32>
193294bee10SWANG Xuerui    : FPFmtFSEL<op, (outs rc:$fd), (ins rc:$fj, rc:$fk, CFR:$ca),
1943a49ad71SWeining Lu                "$fd, $fj, $fk, $ca">;
1953a49ad71SWeining Lu
19646aec7bcSwangleiclass FP_BRANCH<bits<32> opcode>
197294bee10SWANG Xuerui    : FPFmtBR<opcode, (outs), (ins CFR:$cj, simm21_lsl2:$imm21),
1983a49ad71SWeining Lu              "$cj, $imm21"> {
1993a49ad71SWeining Lu  let isBranch = 1;
2003a49ad71SWeining Lu  let isTerminator = 1;
2013a49ad71SWeining Lu}
202f9e0845eSWang Rui} // hasSideEffects = 0, mayLoad = 0, mayStore = 0
2033a49ad71SWeining Lu
204f9e0845eSWang Ruilet hasSideEffects = 0, mayLoad = 1, mayStore = 0 in {
20546aec7bcSwangleiclass FP_LOAD_3R<bits<32> op, RegisterClass rc = FPR32>
206294bee10SWANG Xuerui    : FPFmtMEM<op, (outs rc:$fd), (ins GPR:$rj, GPR:$rk),
2073a49ad71SWeining Lu               "$fd, $rj, $rk">;
20846aec7bcSwangleiclass FP_LOAD_2RI12<bits<32> op, RegisterClass rc = FPR32>
209294bee10SWANG Xuerui    : FPFmt2RI12<op, (outs rc:$fd), (ins GPR:$rj, simm12:$imm12),
2103a49ad71SWeining Lu                 "$fd, $rj, $imm12">;
211f9e0845eSWang Rui} // hasSideEffects = 0, mayLoad = 1, mayStore = 0
2123a49ad71SWeining Lu
213f9e0845eSWang Ruilet hasSideEffects = 0, mayLoad = 0, mayStore = 1 in {
21446aec7bcSwangleiclass FP_STORE_3R<bits<32> op, RegisterClass rc = FPR32>
215294bee10SWANG Xuerui    : FPFmtMEM<op, (outs), (ins rc:$fd, GPR:$rj, GPR:$rk),
2163a49ad71SWeining Lu               "$fd, $rj, $rk">;
21746aec7bcSwangleiclass FP_STORE_2RI12<bits<32> op, RegisterClass rc = FPR32>
218294bee10SWANG Xuerui    : FPFmt2RI12<op, (outs), (ins rc:$fd, GPR:$rj, simm12:$imm12),
2193a49ad71SWeining Lu                 "$fd, $rj, $imm12">;
220f9e0845eSWang Rui} // hasSideEffects = 0, mayLoad = 0, mayStore = 1
221*271087e3Swanglei
222*271087e3Swanglei// This class is used to define `SET_CFR_{FALSE,TRUE}` instructions which are
223*271087e3Swanglei// used to expand `PseudoCopyCFR`.
224*271087e3Swangleiclass SET_CFR<bits<32> op, string opcstr>
225*271087e3Swanglei    : FP_CMP<op> {
226*271087e3Swanglei  let isCodeGenOnly = 1;
227*271087e3Swanglei  let fj = 0; // fa0
228*271087e3Swanglei  let fk = 0; // fa0
229*271087e3Swanglei  let AsmString = opcstr # "\t$cd, $$fa0, $$fa0";
230*271087e3Swanglei  let OutOperandList = (outs CFR:$cd);
231*271087e3Swanglei  let InOperandList = (ins);
232*271087e3Swanglei}
233