LoongArchFloatInstrFormats.td 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. //==- LoongArchInstrFormatsF.td - LoongArch FP Instr Formats -*- tablegen -*-=//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //===----------------------------------------------------------------------===//
  9. // Describe LoongArch floating-point instructions format
  10. //
  11. // opcode - operation code.
  12. // fd - destination register operand.
  13. // {c/f}{j/k/a} - source register operand.
  14. // immN - immediate data operand.
  15. //
  16. //===----------------------------------------------------------------------===//
  17. // 2R-type
  18. // <opcode | fj | fd>
  19. class FPFmt2R<bits<22> op, dag outs, dag ins, string opcstr, string opnstr,
  20. list<dag> pattern = []>
  21. : LAInst<outs, ins, opcstr, opnstr, pattern> {
  22. bits<5> fj;
  23. bits<5> fd;
  24. let Inst{31-10} = op;
  25. let Inst{9-5} = fj;
  26. let Inst{4-0} = fd;
  27. }
  28. // 3R-type
  29. // <opcode | fk | fj | fd>
  30. class FPFmt3R<bits<17> op, dag outs, dag ins, string opcstr, string opnstr,
  31. list<dag> pattern = []>
  32. : LAInst<outs, ins, opcstr, opnstr, pattern> {
  33. bits<5> fk;
  34. bits<5> fj;
  35. bits<5> fd;
  36. let Inst{31-15} = op;
  37. let Inst{14-10} = fk;
  38. let Inst{9-5} = fj;
  39. let Inst{4-0} = fd;
  40. }
  41. // 4R-type
  42. // <opcode | fa | fk | fj | fd>
  43. class FPFmt4R<bits<12> op, dag outs, dag ins, string opcstr, string opnstr,
  44. list<dag> pattern = []>
  45. : LAInst<outs, ins, opcstr, opnstr, pattern> {
  46. bits<5> fa;
  47. bits<5> fk;
  48. bits<5> fj;
  49. bits<5> fd;
  50. let Inst{31-20} = op;
  51. let Inst{19-15} = fa;
  52. let Inst{14-10} = fk;
  53. let Inst{9-5} = fj;
  54. let Inst{4-0} = fd;
  55. }
  56. // 2RI12-type
  57. // <opcode | I12 | rj | fd>
  58. class FPFmt2RI12<bits<10> op, dag outs, dag ins, string opcstr, string opnstr,
  59. list<dag> pattern = []>
  60. : LAInst<outs, ins, opcstr, opnstr, pattern> {
  61. bits<12> imm12;
  62. bits<5> rj;
  63. bits<5> fd;
  64. let Inst{31-22} = op;
  65. let Inst{21-10} = imm12;
  66. let Inst{9-5} = rj;
  67. let Inst{4-0} = fd;
  68. }
  69. // FmtFCMP
  70. // <opcode | cond | fk | fj | 0b00 | cd>
  71. class FPFmtFCMP<bits<12> op, bits<5> cond, dag outs, dag ins, string opcstr,
  72. string opnstr, list<dag> pattern = []>
  73. : LAInst<outs, ins, opcstr, opnstr, pattern> {
  74. bits<5> fk;
  75. bits<5> fj;
  76. bits<3> cd;
  77. let Inst{31-20} = op;
  78. let Inst{19-15} = cond;
  79. let Inst{14-10} = fk;
  80. let Inst{9-5} = fj;
  81. let Inst{4-3} = 0b00;
  82. let Inst{2-0} = cd;
  83. }
  84. // FPFmtBR
  85. // <opcode[7:2] | I21[15:0] | opcode[1:0] | cj | I21[20:16]>
  86. class FPFmtBR<bits<8> opcode, dag outs, dag ins, string opcstr,
  87. string opnstr, list<dag> pattern = []>
  88. : LAInst<outs, ins, opcstr, opnstr, pattern> {
  89. bits<21> imm21;
  90. bits<3> cj;
  91. let Inst{31-26} = opcode{7-2};
  92. let Inst{25-10} = imm21{15-0};
  93. let Inst{9-8} = opcode{1-0};
  94. let Inst{7-5} = cj;
  95. let Inst{4-0} = imm21{20-16};
  96. }
  97. // FmtFSEL
  98. // <opcode | ca | fk | fj | fd>
  99. class FPFmtFSEL<bits<14> op, dag outs, dag ins, string opcstr, string opnstr,
  100. list<dag> pattern = []>
  101. : LAInst<outs, ins, opcstr, opnstr, pattern> {
  102. bits<3> ca;
  103. bits<5> fk;
  104. bits<5> fj;
  105. bits<5> fd;
  106. let Inst{31-18} = op;
  107. let Inst{17-15} = ca;
  108. let Inst{14-10} = fk;
  109. let Inst{9-5} = fj;
  110. let Inst{4-0} = fd;
  111. }
  112. // FPFmtMOV
  113. // <opcode | src | dst>
  114. class FPFmtMOV<bits<22> op, dag outs, dag ins, string opcstr, string opnstr,
  115. list<dag> pattern = []>
  116. : LAInst<outs, ins, opcstr, opnstr, pattern> {
  117. bits<5> src;
  118. bits<5> dst;
  119. let Inst{31-10} = op;
  120. let Inst{9-5} = src;
  121. let Inst{4-0} = dst;
  122. }
  123. // FPFmtMEM
  124. // <opcode | rk | rj | fd>
  125. class FPFmtMEM<bits<17> op, dag outs, dag ins, string opcstr, string opnstr,
  126. list<dag> pattern = []>
  127. : LAInst<outs, ins, opcstr, opnstr, pattern> {
  128. bits<5> rk;
  129. bits<5> rj;
  130. bits<5> fd;
  131. let Inst{31-15} = op;
  132. let Inst{14-10} = rk;
  133. let Inst{9-5} = rj;
  134. let Inst{4-0} = fd;
  135. }
  136. //===----------------------------------------------------------------------===//
  137. // Instruction class templates
  138. //===----------------------------------------------------------------------===//
  139. class FP_ALU_2R<bits<22> op, string opstr, RegisterClass rc>
  140. : FPFmt2R<op, (outs rc:$fd), (ins rc:$fj), opstr, "$fd, $fj">;
  141. class FP_ALU_3R<bits<17> op, string opstr, RegisterClass rc>
  142. : FPFmt3R<op, (outs rc:$fd), (ins rc:$fj, rc:$fk), opstr, "$fd, $fj, $fk">;
  143. class FP_ALU_4R<bits<12> op, string opstr, RegisterClass rc>
  144. : FPFmt4R<op, (outs rc:$fd), (ins rc:$fj, rc:$fk, rc:$fa), opstr,
  145. "$fd, $fj, $fk, $fa">;
  146. class FPCMPOpc<bits<12> value> {
  147. bits<12> val = value;
  148. }
  149. class FPCMPCond<bits<5> value> {
  150. bits<5> val = value;
  151. }
  152. class FP_CMP<FPCMPOpc op, FPCMPCond cond, string opstr, RegisterClass rc>
  153. : FPFmtFCMP<op.val, cond.val, (outs CFR:$cd), (ins rc:$fj, rc:$fk), opstr,
  154. "$cd, $fj, $fk">;
  155. class FP_CONV<bits<22> op, string opstr, RegisterClass rcd, RegisterClass rcs>
  156. : FPFmt2R<op, (outs rcd:$fd), (ins rcs:$fj), opstr, "$fd, $fj">;
  157. class FP_MOV<bits<22> op, string opstr, RegisterClass rcd, RegisterClass rcs>
  158. : FPFmtMOV<op, (outs rcd:$dst), (ins rcs:$src), opstr, "$dst, $src">;
  159. class FP_SEL<bits<14> op, string opstr, RegisterClass rc>
  160. : FPFmtFSEL<op, (outs rc:$fd), (ins rc:$fj, rc:$fk, CFR:$ca), opstr,
  161. "$fd, $fj, $fk, $ca">;
  162. class FP_BRANCH<bits<8> opcode, string opstr>
  163. : FPFmtBR<opcode, (outs), (ins CFR:$cj, simm21_lsl2:$imm21), opstr,
  164. "$cj, $imm21"> {
  165. let isBranch = 1;
  166. let isTerminator = 1;
  167. }
  168. let mayLoad = 1 in {
  169. class FP_LOAD_3R<bits<17> op, string opstr, RegisterClass rc>
  170. : FPFmtMEM<op, (outs rc:$fd), (ins GPR:$rj, GPR:$rk), opstr,
  171. "$fd, $rj, $rk">;
  172. class FP_LOAD_2RI12<bits<10> op, string opstr, RegisterClass rc>
  173. : FPFmt2RI12<op, (outs rc:$fd), (ins GPR:$rj, simm12:$imm12), opstr,
  174. "$fd, $rj, $imm12">;
  175. } // mayLoad = 1
  176. let mayStore = 1 in {
  177. class FP_STORE_3R<bits<17> op, string opstr, RegisterClass rc>
  178. : FPFmtMEM<op, (outs), (ins rc:$fd, GPR:$rj, GPR:$rk), opstr,
  179. "$fd, $rj, $rk">;
  180. class FP_STORE_2RI12<bits<10> op, string opstr, RegisterClass rc>
  181. : FPFmt2RI12<op, (outs), (ins rc:$fd, GPR:$rj, simm12:$imm12), opstr,
  182. "$fd, $rj, $imm12">;
  183. } // mayStore = 1
  184. def FPCMP_OPC_S : FPCMPOpc<0b000011000001>;
  185. def FPCMP_OPC_D : FPCMPOpc<0b000011000010>;
  186. def FPCMP_COND_CAF : FPCMPCond<0x0>;
  187. def FPCMP_COND_CUN : FPCMPCond<0x8>;
  188. def FPCMP_COND_CEQ : FPCMPCond<0x4>;
  189. def FPCMP_COND_CUEQ : FPCMPCond<0xC>;
  190. def FPCMP_COND_CLT : FPCMPCond<0x2>;
  191. def FPCMP_COND_CULT : FPCMPCond<0xA>;
  192. def FPCMP_COND_CLE : FPCMPCond<0x6>;
  193. def FPCMP_COND_CULE : FPCMPCond<0xE>;
  194. def FPCMP_COND_CNE : FPCMPCond<0x10>;
  195. def FPCMP_COND_COR : FPCMPCond<0x14>;
  196. def FPCMP_COND_CUNE : FPCMPCond<0x18>;
  197. def FPCMP_COND_SAF : FPCMPCond<0x1>;
  198. def FPCMP_COND_SUN : FPCMPCond<0x9>;
  199. def FPCMP_COND_SEQ : FPCMPCond<0x5>;
  200. def FPCMP_COND_SUEQ : FPCMPCond<0xD>;
  201. def FPCMP_COND_SLT : FPCMPCond<0x3>;
  202. def FPCMP_COND_SULT : FPCMPCond<0xB>;
  203. def FPCMP_COND_SLE : FPCMPCond<0x7>;
  204. def FPCMP_COND_SULE : FPCMPCond<0xF>;
  205. def FPCMP_COND_SNE : FPCMPCond<0x11>;
  206. def FPCMP_COND_SOR : FPCMPCond<0x15>;
  207. def FPCMP_COND_SUNE : FPCMPCond<0x19>;