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