1 ;; C-SKY FPU instruction descriptions.
2 ;; Copyright (C) 2018-2022 Free Software Foundation, Inc.
3 ;; Contributed by C-SKY Microsystems and Mentor Graphics.
5 ;; This file is part of GCC.
7 ;; GCC is free software; you can redistribute it and/or modify it
8 ;; under the terms of the GNU General Public License as published by
9 ;; the Free Software Foundation; either version 3, or (at your option)
12 ;; GCC is distributed in the hope that it will be useful, but
13 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 ;; General Public License for more details.
17 ;; You should have received a copy of the GNU General Public License
18 ;; along with GCC; see the file COPYING3. If not see
19 ;; <http://www.gnu.org/licenses/>. */
21 (define_c_enum "unspec" [
28 (define_c_enum "unspecv" [
29 VUNSPEC_GET_FCR ; Represent fetch of FCR content.
30 VUNSPEC_SET_FCR ; Represent assign of FCR content.
31 VUNSPEC_INS_FCR ; Represent insert of FCR content.
34 (define_mode_iterator F3ANY [HF SF DF])
35 (define_mode_attr f3t [(HF "16") (SF "32") (DF "64")])
37 (define_mode_iterator SFDF [SF DF])
38 (define_mode_attr f2t [(SF "32") (DF "64")])
40 (define_code_iterator FCMPZ [ne ge lt gt le])
41 (define_code_attr zero_inst [(ne "nez") (ge "hsz") (lt "ltz") (gt "hz") (le "lsz")])
43 (define_code_iterator FCMP [ne ge lt])
44 (define_code_attr reg_inst [(ne "ne") (ge "hs") (lt "lt")])
46 (define_code_iterator FIX_SU [fix unsigned_fix])
47 (define_code_attr fixsuop [(fix "") (unsigned_fix "uns")])
48 (define_code_attr fixsu [(fix "s") (unsigned_fix "u")])
50 (define_code_iterator FLOAT_SU [float unsigned_float])
51 (define_code_attr floatsuop [(float "") (unsigned_float "uns")])
52 (define_code_attr floatsu [(float "s") (unsigned_float "u")])
54 (define_int_iterator FRM [UNSPEC_FLOOR
55 UNSPEC_CEIL UNSPEC_RINT])
57 (define_int_iterator FRMF [UNSPEC_FLOOR
58 UNSPEC_CEIL UNSPEC_BTRUNC])
60 (define_int_attr frm_pattern [(UNSPEC_FLOOR "floor")
61 (UNSPEC_CEIL "ceil") (UNSPEC_BTRUNC "btrunc")
62 (UNSPEC_RINT "rint")])
64 (define_int_attr rm [(UNSPEC_FLOOR ".rni")
65 (UNSPEC_CEIL ".rpi") (UNSPEC_BTRUNC ".rz")
69 ;; -------------------------------------------------------------------------
70 ;; Float mov instructions
71 ;; -------------------------------------------------------------------------
73 (define_expand "movhf"
74 [(set (match_operand:HF 0 "general_operand" "")
75 (match_operand:HF 1 "general_operand" ""))]
76 "CSKY_ISA_FEATURE(fpv3_hf)"
79 if (GET_CODE(operands[0]) == MEM && can_create_pseudo_p ())
81 operands[1] = force_reg (HFmode, operands[1]);
86 (define_expand "mov<mode>"
87 [(set (match_operand:SFDF 0 "general_operand" "")
88 (match_operand:SFDF 1 "general_operand" ""))]
89 "CSKY_ISA_FEATURE(fpv2_<mode>)
90 || CSKY_ISA_FEATURE(fpv3_<mode>)"
93 if (GET_CODE(operands[0]) == MEM && can_create_pseudo_p ())
95 operands[1] = force_reg (<MODE>mode, operands[1]);
100 ;; Move float value with general register.
102 (define_insn "*e2_movsf"
103 [(set (match_operand:SF 0 "nonimmediate_operand" "=b,r,r,r, m")
104 (match_operand:SF 1 "general_operand" " b,r,m,mF,r"))]
105 "CSKY_ISA_FEATURE (E2)
106 && !CSKY_ISA_FEATURE (fpv2_sf)
107 && !CSKY_ISA_FEATURE (fpv3_sf)"
108 "* return csky_output_move (insn, operands, SFmode);"
109 [(set_attr "length" "2,4,4,4,4")
110 (set_attr "type" "alu,alu,load,load,store")]
113 (define_insn "*e2_movdf"
114 [(set (match_operand:DF 0 "nonimmediate_operand" "=b,r,r,r, m")
115 (match_operand:DF 1 "general_operand" " b,r,m,mF,r"))]
116 "CSKY_ISA_FEATURE (E2)
117 && !CSKY_ISA_FEATURE (fpv2_df)
118 && !CSKY_ISA_FEATURE (fpv3_df)"
119 "* return csky_output_movedouble (operands, DFmode);"
120 [(set_attr "length" "4,8,8,8,8")
121 (set_attr "type" "alu,alu,load,load,store")]
124 (define_insn "*e1_movsf"
125 [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,r, m")
126 (match_operand:SF 1 "general_operand" " r,m,mF,r"))]
127 "CSKY_ISA_FEATURE (E1)"
128 "* return csky_output_ck801_move (insn, operands, SFmode);"
129 [(set_attr "length" "2,4,4,4")
130 (set_attr "type" "alu,load,load,store")]
133 (define_insn "*e1_movdf"
134 [(set (match_operand:DF 0 "nonimmediate_operand" "=r,r,r, m")
135 (match_operand:DF 1 "general_operand" " r,m,mF,r"))]
136 "CSKY_ISA_FEATURE (E1)"
137 "* return csky_output_ck801_movedouble (operands, DFmode);"
138 [(set_attr "length" "4,8,8,8")
139 (set_attr "type" "alu,load,load,store")]
142 ;; -------------------------------------------------------------------------
143 ;; Float Mul instructions
144 ;; -------------------------------------------------------------------------
146 (define_expand "mulhf3"
147 [(set (match_operand:HF 0 "register_operand" "=v")
148 (mult:HF (match_operand:HF 1 "register_operand" "v")
149 (match_operand:HF 2 "register_operand" "v")))]
150 "CSKY_ISA_FEATURE(fpv3_hf)"
153 (define_expand "mul<mode>3"
154 [(set (match_operand:SFDF 0 "register_operand" "=v")
155 (mult:SFDF (match_operand:SFDF 1 "register_operand" "v")
156 (match_operand:SFDF 2 "register_operand" "v")))]
157 "CSKY_ISA_FEATURE(fpv2_<mode>)
158 || CSKY_ISA_FEATURE(fpv3_<mode>)"
161 (define_expand "fma<mode>4"
162 [(set (match_operand:F3ANY 0 "register_operand" "=v")
163 (fma:F3ANY (match_operand:F3ANY 1 "register_operand" "v")
164 (match_operand:F3ANY 2 "register_operand" "v")
165 (match_operand:F3ANY 3 "register_operand" "0")))]
166 "CSKY_ISA_FEATURE(fpv3_<mode>)"
169 ;; -------------------------------------------------------------------------
170 ;; Float ADD SUB NEG ABS instructions
171 ;; -------------------------------------------------------------------------
173 (define_expand "addhf3"
174 [(set (match_operand:HF 0 "register_operand" "")
175 (plus:HF (match_operand:HF 1 "register_operand" "")
176 (match_operand:HF 2 "register_operand" "")))]
177 "CSKY_ISA_FEATURE(fpv3_hf)"
181 (define_expand "add<mode>3"
182 [(set (match_operand:SFDF 0 "register_operand" "")
183 (plus:SFDF (match_operand:SFDF 1 "register_operand" "")
184 (match_operand:SFDF 2 "register_operand" "")))]
185 "CSKY_ISA_FEATURE(fpv2_<mode>) || CSKY_ISA_FEATURE(fpv3_<mode>)"
189 (define_expand "subhf3"
190 [(set (match_operand:HF 0 "register_operand" "")
191 (minus:HF (match_operand:HF 1 "register_operand" "")
192 (match_operand:HF 2 "register_operand" "")))]
193 "CSKY_ISA_FEATURE(fpv3_hf)"
197 (define_expand "sub<mode>3"
198 [(set (match_operand:SFDF 0 "register_operand" "")
199 (minus:SFDF (match_operand:SFDF 1 "register_operand" "")
200 (match_operand:SFDF 2 "register_operand" "")))]
201 "CSKY_ISA_FEATURE(fpv2_<mode>) || CSKY_ISA_FEATURE(fpv3_<mode>)"
205 (define_expand "abshf2"
206 [(set (match_operand:HF 0 "register_operand" "")
207 (abs:HF (match_operand:HF 1 "register_operand" "")))]
208 "CSKY_ISA_FEATURE(fpv3_hf)"
212 (define_expand "abs<mode>2"
213 [(set (match_operand:SFDF 0 "register_operand" "")
214 (abs:SFDF (match_operand:SFDF 1 "register_operand" "")))]
215 "CSKY_ISA_FEATURE(fpv2_<mode>) || CSKY_ISA_FEATURE(fpv3_<mode>)"
219 (define_expand "neghf2"
220 [(set (match_operand:HF 0 "register_operand" "")
221 (neg:HF (match_operand:HF 1 "register_operand" "")))]
222 "CSKY_ISA_FEATURE(fpv3_hf)"
226 (define_expand "neg<mode>2"
227 [(set (match_operand:SFDF 0 "register_operand" "")
228 (neg:SFDF (match_operand:SFDF 1 "register_operand" "")))]
229 "CSKY_ISA_FEATURE(fpv2_<mode>) || CSKY_ISA_FEATURE(fpv3_<mode>)"
233 (define_expand "sqrthf2"
234 [(set (match_operand:HF 0 "register_operand" "")
235 (sqrt:HF (match_operand:HF 1 "register_operand" "")))]
236 "CSKY_ISA_FEATURE(fpv3_hf)"
240 (define_expand "sqrt<mode>2"
241 [(set (match_operand:SFDF 0 "register_operand" "")
242 (sqrt:SFDF (match_operand:SFDF 1 "register_operand" "")))]
243 "CSKY_ISA_FEATURE(fpv2_<mode>) || CSKY_ISA_FEATURE(fpv3_<mode>)"
247 ;; -------------------------------------------------------------------------
248 ;; Float div instructions
249 ;; -------------------------------------------------------------------------
251 (define_expand "div<mode>3"
252 [(set (match_operand:SFDF 0 "register_operand" "")
253 (div:SFDF (match_operand:SFDF 1 "csky_arith_float1_operand" "")
254 (match_operand:SFDF 2 "register_operand" "")))]
255 "CSKY_ISA_FEATURE(fpv2_<mode>) || CSKY_ISA_FEATURE(fpv3_<mode>)"
258 (define_expand "divhf3"
259 [(set (match_operand:HF 0 "register_operand" "")
260 (div:HF (match_operand:HF 1 "csky_arith_float1_operand" "")
261 (match_operand:HF 2 "register_operand" "")))]
262 "CSKY_ISA_FEATURE(fpv3_hf)"
265 ;; -------------------------------------------------------------------------
266 ;; Float compare instructions
267 ;; -------------------------------------------------------------------------
269 (define_expand "cbranch<mode>4"
270 [(set (pc) (if_then_else (match_operator 0 "csky_float_comparison_operator"
271 [(match_operand:SFDF 1 "register_operand")
272 (match_operand:SFDF 2 "csky_compare_operand_float")])
273 (label_ref (match_operand 3 ""))
275 "CSKY_ISA_FEATURE(fpv2_<mode>) || CSKY_ISA_FEATURE(fpv3_<mode>)"
277 enum rtx_code code = GET_CODE (operands[0]);
280 invert = csky_emit_compare_float (code, operands[1], operands[2]);
283 emit_jump_insn (gen_csky_jbf (operands[3]));
285 emit_jump_insn (gen_csky_jbt (operands[3]));
291 (define_expand "cbranchhf4"
292 [(set (pc) (if_then_else (match_operator 0 "csky_float_comparison_operator"
293 [(match_operand:HF 1 "register_operand")
294 (match_operand:HF 2 "csky_compare_operand_float")])
295 (label_ref (match_operand 3 ""))
297 "CSKY_ISA_FEATURE(fpv3_hf)"
299 enum rtx_code code = GET_CODE (operands[0]);
302 invert = csky_emit_compare_float (code, operands[1], operands[2]);
305 emit_jump_insn (gen_csky_jbf (operands[3]));
307 emit_jump_insn (gen_csky_jbt (operands[3]));
313 ;; -------------------------------------------------------------------------
314 ;; Instructions for float cstore
315 ;; -------------------------------------------------------------------------
317 (define_expand "cstore<mode>4"
318 [(set (match_operand:SI 0 "register_operand" "")
319 (match_operator 1 "csky_float_comparison_operator"
320 [(match_operand:SFDF 2 "register_operand" "")
321 (match_operand:SFDF 3 "csky_compare_operand_float" "")]))]
322 "CSKY_ISA_FEATURE (fpv2_<mode>) || CSKY_ISA_FEATURE(fpv3_<mode>)"
326 invert = csky_emit_compare_float (GET_CODE (operands[1]),
327 operands[2], operands[3]);
329 emit_insn (gen_mvcv (operands[0]));
331 emit_insn (gen_mvc (operands[0]));
336 (define_expand "cstorehf4"
337 [(set (match_operand:SI 0 "register_operand" "")
338 (match_operator 1 "csky_float_comparison_operator"
339 [(match_operand:HF 2 "register_operand" "")
340 (match_operand:HF 3 "csky_compare_operand_float" "")]))]
341 "CSKY_ISA_FEATURE(fpv3_hf)"
345 invert = csky_emit_compare_float (GET_CODE (operands[1]),
346 operands[2], operands[3]);
348 emit_insn (gen_mvcv (operands[0]));
350 emit_insn (gen_mvc (operands[0]));
355 ;; -------------------------------------------------------------------------
356 ;; Float convert instructions
357 ;; -------------------------------------------------------------------------
360 (define_expand "extendhfsf2"
361 [(set (match_operand:SF 0 "register_operand" "")
362 (float_extend:SF (match_operand:HF 1 "register_operand" "")))]
363 "CSKY_ISA_FEATURE(fpv3_hf)"
367 (define_expand "truncsfhf2"
368 [(set (match_operand:HF 0 "register_operand" "")
369 (float_truncate:HF (match_operand:SF 1 "register_operand" "")))]
370 "CSKY_ISA_FEATURE(fpv3_hf)"
374 (define_expand "extendsfdf2"
375 [(set (match_operand:DF 0 "register_operand" "")
376 (float_extend:DF (match_operand:SF 1 "register_operand" "")))]
377 "CSKY_ISA_FEATURE(fpv2_df) || CSKY_ISA_FEATURE(fpv3_df)"
381 (define_expand "truncdfsf2"
382 [(set (match_operand:SF 0 "register_operand" "")
383 (float_truncate:SF (match_operand:DF 1 "register_operand" "")))]
384 "CSKY_ISA_FEATURE(fpv2_df) || CSKY_ISA_FEATURE(fpv3_df)"
387 ;; HF <- unsigned SI,SI
388 (define_expand "float<floatsuop>sihf2"
389 [(set (match_operand:HF 0 "register_operand" "")
390 (FLOAT_SU:HF (match_operand:SI 1 "register_operand" "")))]
391 "CSKY_ISA_FEATURE(fpv3_hf)"
394 ;; DF,SF <- unsigned SI,SI
395 (define_expand "float<floatsuop>si<mode>2"
396 [(set (match_operand:SFDF 0 "register_operand" "")
397 (FLOAT_SU:SFDF (match_operand:SI 1 "register_operand" "")))]
398 "CSKY_ISA_FEATURE(fpv2_<mode>) || CSKY_ISA_FEATURE(fpv3_<mode>)"
401 ;; HF <- unsigned HI,HI
402 (define_expand "float<floatsuop>hihf2"
403 [(set (match_operand:HF 0 "register_operand" "")
404 (FLOAT_SU:HF (match_operand:HI 1 "register_operand" "")))]
405 "CSKY_ISA_FEATURE(fpv3_hi) && CSKY_ISA_FEATURE(fpv3_hf)"
408 ;; unsigned SI,SI <- HF
409 (define_expand "fix<fixsuop>_trunchfsi2"
410 [(set (match_operand:SI 0 "register_operand" "")
411 (FIX_SU:SI (fix:HF (match_operand:HF 1 "register_operand" ""))))]
412 "CSKY_ISA_FEATURE(fpv3_hf)"
415 ;; unsigned SI,SI <- DF,SF
416 (define_expand "fix<fixsuop>_trunc<mode>si2"
417 [(set (match_operand:SI 0 "register_operand" "")
418 (FIX_SU:SI (fix:SFDF (match_operand:SFDF 1 "register_operand" ""))))]
419 "CSKY_ISA_FEATURE(fpv2_<mode>) || CSKY_ISA_FEATURE(fpv3_<mode>)"
422 (include "csky_insn_fpuv3.md")
423 (include "csky_insn_fpuv2.md")