xref: /freebsd/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYInstrInfoF1.td (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
104eeddc0SDimitry Andric//===- CSKYInstrInfoF1.td - CSKY Instruction Float1.0 ------*- tablegen -*-===//
204eeddc0SDimitry Andric//
304eeddc0SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
404eeddc0SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
504eeddc0SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
604eeddc0SDimitry Andric//
704eeddc0SDimitry Andric//===----------------------------------------------------------------------===//
804eeddc0SDimitry Andric//
904eeddc0SDimitry Andric// This file describes the CSKY instructions in TableGen format.
1004eeddc0SDimitry Andric//
1104eeddc0SDimitry Andric//===----------------------------------------------------------------------===//
1204eeddc0SDimitry Andric
1304eeddc0SDimitry Andricdef regseq_f1 : Operand<iPTR> {
1404eeddc0SDimitry Andric  let EncoderMethod = "getRegisterSeqOpValue";
1504eeddc0SDimitry Andric  let ParserMatchClass = RegSeqAsmOperand<"V1">;
1604eeddc0SDimitry Andric  let PrintMethod = "printRegisterSeq";
1704eeddc0SDimitry Andric  let DecoderMethod = "DecodeRegSeqOperandF1";
1804eeddc0SDimitry Andric  let MIOperandInfo = (ops sFPR32, uimm5);
1904eeddc0SDimitry Andric}
2004eeddc0SDimitry Andric
2104eeddc0SDimitry Andricdef regseq_d1 : Operand<iPTR> {
2204eeddc0SDimitry Andric  let EncoderMethod = "getRegisterSeqOpValue";
2304eeddc0SDimitry Andric  let ParserMatchClass = RegSeqAsmOperand<"V1">;
2404eeddc0SDimitry Andric  let PrintMethod = "printRegisterSeq";
2504eeddc0SDimitry Andric  let DecoderMethod = "DecodeRegSeqOperandD1";
2604eeddc0SDimitry Andric  let MIOperandInfo = (ops sFPR64, uimm5);
2704eeddc0SDimitry Andric}
2804eeddc0SDimitry Andric
2904eeddc0SDimitry Andricdef sFPR32Op : RegisterOperand<sFPR32, "printFPR">;
3004eeddc0SDimitry Andricdef sFPR64Op : RegisterOperand<sFPR64, "printFPR">;
3104eeddc0SDimitry Andricdef sFPR64_V_OP : RegisterOperand<sFPR64_V, "printFPR">;
3204eeddc0SDimitry Andric
3304eeddc0SDimitry Andricinclude "CSKYInstrFormatsF1.td"
3404eeddc0SDimitry Andric
3504eeddc0SDimitry Andric//===----------------------------------------------------------------------===//
3604eeddc0SDimitry Andric// CSKY specific DAG Nodes.
3704eeddc0SDimitry Andric//===----------------------------------------------------------------------===//
3804eeddc0SDimitry Andric
3904eeddc0SDimitry Andricdef SDT_BITCAST_TO_LOHI : SDTypeProfile<2, 1, [SDTCisSameAs<0, 1>]>;
4004eeddc0SDimitry Andricdef CSKY_BITCAST_TO_LOHI : SDNode<"CSKYISD::BITCAST_TO_LOHI", SDT_BITCAST_TO_LOHI>;
4104eeddc0SDimitry Andricdef SDT_BITCAST_FROM_LOHI : SDTypeProfile<1, 2, [SDTCisSameAs<1, 2>]>;
4204eeddc0SDimitry Andricdef CSKY_BITCAST_FROM_LOHI : SDNode<"CSKYISD::BITCAST_FROM_LOHI", SDT_BITCAST_FROM_LOHI>;
4304eeddc0SDimitry Andric//===----------------------------------------------------------------------===//
4404eeddc0SDimitry Andric// Operand and SDNode transformation definitions.
4504eeddc0SDimitry Andric//===----------------------------------------------------------------------===//
4604eeddc0SDimitry Andric
4704eeddc0SDimitry Andricdef fpimm0 : PatLeaf<(fpimm), [{ return N->isExactlyValue(+0.0); }]>;
4804eeddc0SDimitry Andric
4904eeddc0SDimitry Andricdef fpimm32_hi16 : SDNodeXForm<fpimm, [{
5004eeddc0SDimitry Andric  return CurDAG->getTargetConstant(
5104eeddc0SDimitry Andric    (N->getValueAPF().bitcastToAPInt().getZExtValue() >> 16) & 0xFFFF,
5204eeddc0SDimitry Andric    SDLoc(N), MVT::i32);
5304eeddc0SDimitry Andric}]>;
5404eeddc0SDimitry Andric
5504eeddc0SDimitry Andricdef fpimm32_lo16 : SDNodeXForm<fpimm, [{
5604eeddc0SDimitry Andric  return CurDAG->getTargetConstant(
5704eeddc0SDimitry Andric    N->getValueAPF().bitcastToAPInt().getZExtValue() & 0xFFFF,
5804eeddc0SDimitry Andric    SDLoc(N), MVT::i32);
5904eeddc0SDimitry Andric}]>;
6004eeddc0SDimitry Andric
6104eeddc0SDimitry Andricclass fpimm_xform<int width, int shift = 0> : SDNodeXForm<fpimm,
6204eeddc0SDimitry Andric  "return CurDAG->getTargetConstant(N->getValueAPF().bitcastToAPInt().lshr("#shift#").getLoBits("#width#"), SDLoc(N), MVT::i32);">;
6304eeddc0SDimitry Andric
6404eeddc0SDimitry Andricclass fpimm_xform_i16<int width, int shift = 0> : SDNodeXForm<fpimm,
6504eeddc0SDimitry Andric  "return CurDAG->getTargetConstant(N->getValueAPF().bitcastToAPInt().lshr("#shift#").getLoBits("#width#"), SDLoc(N), MVT::i16);">;
6604eeddc0SDimitry Andric
6704eeddc0SDimitry Andricclass fpimm_t<int width, int shift = 0> : PatLeaf<(fpimm),
6804eeddc0SDimitry Andric   "return isShiftedUInt<"#width#", "#shift#">(N->getValueAPF().bitcastToAPInt().getZExtValue());">;
6904eeddc0SDimitry Andric
7004eeddc0SDimitry Andricdef fpimm8 : fpimm_t<8>;
7104eeddc0SDimitry Andricdef fpimm8_8 : fpimm_t<8, 8>;
7204eeddc0SDimitry Andricdef fpimm8_16 : fpimm_t<8, 16>;
7304eeddc0SDimitry Andricdef fpimm8_24 : fpimm_t<8, 24>;
7404eeddc0SDimitry Andricdef fpimm16 : fpimm_t<16>;
7504eeddc0SDimitry Andricdef fpimm16_8 : fpimm_t<16, 8>;
7604eeddc0SDimitry Andricdef fpimm16_16 : fpimm_t<16, 16>;
7704eeddc0SDimitry Andricdef fpimm24 : fpimm_t<24>;
7804eeddc0SDimitry Andricdef fpimm24_8 : fpimm_t<24, 8>;
7904eeddc0SDimitry Andricdef fpimm32 : fpimm_t<32>;
8004eeddc0SDimitry Andric
8104eeddc0SDimitry Andricdef fpimm8_sr0_XFORM : fpimm_xform<8>;
8204eeddc0SDimitry Andricdef fpimm8_sr8_XFORM : fpimm_xform<8, 8>;
8304eeddc0SDimitry Andricdef fpimm8_sr16_XFORM : fpimm_xform<8, 16>;
8404eeddc0SDimitry Andricdef fpimm8_sr24_XFORM : fpimm_xform<8, 24>;
8504eeddc0SDimitry Andric
8604eeddc0SDimitry Andricdef fpimm8_sr0_i16_XFORM : fpimm_xform_i16<8>;
8704eeddc0SDimitry Andricdef fpimm8_sr8_i16_XFORM : fpimm_xform_i16<8, 8>;
8804eeddc0SDimitry Andric
8904eeddc0SDimitry Andricdef fconstpool_symbol : Operand<iPTR> {
9004eeddc0SDimitry Andric  let ParserMatchClass = Constpool;
9104eeddc0SDimitry Andric  let EncoderMethod =
9204eeddc0SDimitry Andric    "getConstpoolSymbolOpValue<CSKY::fixup_csky_pcrel_uimm8_scale4>";
9304eeddc0SDimitry Andric  let DecoderMethod = "decodeUImmOperand<8, 2>";
9404eeddc0SDimitry Andric  let PrintMethod = "printConstpool";
9504eeddc0SDimitry Andric  let OperandType = "OPERAND_PCREL";
9604eeddc0SDimitry Andric}
9704eeddc0SDimitry Andric
9804eeddc0SDimitry Andric
9904eeddc0SDimitry Andric
10004eeddc0SDimitry Andric//===----------------------------------------------------------------------===//
10104eeddc0SDimitry Andric// Instructions
10204eeddc0SDimitry Andric//===----------------------------------------------------------------------===//
10304eeddc0SDimitry Andric
10404eeddc0SDimitry Andric//arithmetic
10504eeddc0SDimitry Andric
10604eeddc0SDimitry Andricdef FABSM : F_XZ<0x2, 0b000110, "fabsm", "", UnOpFrag<(fabs node:$Src)>, sFPR64_V_OP>;
10704eeddc0SDimitry Andricdef FNEGM : F_XZ<0x2, 0b000111, "fnegm", "", UnOpFrag<(fneg node:$Src)>, sFPR64_V_OP>;
10804eeddc0SDimitry Andricdef FADDM : F_XYZ<0x2, 0b000000, "faddm", "", BinOpFrag<(fadd node:$LHS, node:$RHS)>, sFPR64_V_OP>;
10904eeddc0SDimitry Andricdef FSUBM : F_XYZ<0x2, 0b000001, "fsubm", "", BinOpFrag<(fsub node:$LHS, node:$RHS)>, sFPR64_V_OP>;
11004eeddc0SDimitry Andricdef FMULM : F_XYZ<0x2, 0b010000, "fmulm", "", BinOpFrag<(fmul node:$LHS, node:$RHS)>, sFPR64_V_OP>;
11104eeddc0SDimitry Andricdef FNMULM : F_XYZ<0x2, 0b010001, "fnmulm", "", BinOpFrag<(fneg (fmul node:$LHS, node:$RHS))>, sFPR64_V_OP>;
11204eeddc0SDimitry Andricdef FMACM : F_ACCUM_XYZ<0x2, 0b010100, "fmacm", "", TriOpFrag<(fadd node:$LHS, (fmul node:$MHS, node:$RHS))>, sFPR64_V_OP>;
11304eeddc0SDimitry Andricdef FMSCM : F_ACCUM_XYZ<0x2, 0b010101, "fmscm", "", TriOpFrag<(fsub (fmul node:$MHS, node:$RHS), node:$LHS)>, sFPR64_V_OP>;
11404eeddc0SDimitry Andricdef FNMACM : F_ACCUM_XYZ<0x2, 0b010110, "fnmacm", "", TriOpFrag<(fsub node:$LHS, (fmul node:$MHS, node:$RHS))>, sFPR64_V_OP>;
11504eeddc0SDimitry Andricdef FNMSCM : F_ACCUM_XYZ<0x2, 0b010111, "fnmscm", "", TriOpFrag<(fneg (fadd node:$LHS, (fmul node:$MHS, node:$RHS)))>, sFPR64_V_OP>;
11604eeddc0SDimitry Andric
11704eeddc0SDimitry Andricdef FMOVM :  F_MOV<0x2, 0b000100, "fmovm", "", sFPR64_V_OP>;
11804eeddc0SDimitry Andric
11904eeddc0SDimitry Andricdefm FABS   : FT_XZ<0b000110, "fabs", UnOpFrag<(fabs node:$Src)>>;
12004eeddc0SDimitry Andricdefm FNEG   : FT_XZ<0b000111, "fneg", UnOpFrag<(fneg node:$Src)>>;
12104eeddc0SDimitry Andricdefm FSQRT  : FT_XZ<0b011010, "fsqrt", UnOpFrag<(fsqrt node:$Src)>>;
12204eeddc0SDimitry Andric
12304eeddc0SDimitry Andricdefm FADD   : FT_XYZ<0b000000, "fadd", BinOpFrag<(fadd node:$LHS, node:$RHS)>>;
12404eeddc0SDimitry Andricdefm FSUB   : FT_XYZ<0b000001, "fsub", BinOpFrag<(fsub node:$LHS, node:$RHS)>>;
12504eeddc0SDimitry Andricdefm FDIV   : FT_XYZ<0b011000, "fdiv", BinOpFrag<(fdiv node:$LHS, node:$RHS)>>;
12604eeddc0SDimitry Andricdefm FMUL   : FT_XYZ<0b010000, "fmul", BinOpFrag<(fmul node:$LHS, node:$RHS)>>;
12704eeddc0SDimitry Andricdefm FNMUL  : FT_XYZ<0b010001, "fnmul", BinOpFrag<(fneg (fmul node:$LHS, node:$RHS))>>;
12804eeddc0SDimitry Andricdefm FMAC   : FT_ACCUM_XYZ<0b010100, "fmac", TriOpFrag<(fadd node:$LHS, (fmul node:$MHS, node:$RHS))>>;
12904eeddc0SDimitry Andricdefm FMSC   : FT_ACCUM_XYZ<0b010101, "fmsc", TriOpFrag<(fsub (fmul node:$MHS, node:$RHS), node:$LHS)>>;
13004eeddc0SDimitry Andricdefm FNMAC  : FT_ACCUM_XYZ<0b010110, "fnmac", TriOpFrag<(fsub node:$LHS, (fmul node:$MHS, node:$RHS))>>;
13104eeddc0SDimitry Andricdefm FNMSC  : FT_ACCUM_XYZ<0b010111, "fnmsc", TriOpFrag<(fneg (fadd node:$LHS, (fmul node:$MHS, node:$RHS)))>>;
13204eeddc0SDimitry Andric
13304eeddc0SDimitry Andricdefm FCMPHS : FT_CMPXY<0b001100, "fcmphs">;
13404eeddc0SDimitry Andricdefm FCMPLT : FT_CMPXY<0b001101, "fcmplt">;
13504eeddc0SDimitry Andricdefm FCMPNE : FT_CMPXY<0b001110, "fcmpne">;
13604eeddc0SDimitry Andricdefm FCMPUO : FT_CMPXY<0b001111, "fcmpuo">;
13704eeddc0SDimitry Andricdefm FCMPZHS : FT_CMPZX<0b001000, "fcmpzhs">;
13804eeddc0SDimitry Andricdefm FCMPZLS : FT_CMPZX<0b001001, "fcmpzls">;
13904eeddc0SDimitry Andricdefm FCMPZNE : FT_CMPZX<0b001010, "fcmpzne">;
14004eeddc0SDimitry Andricdefm FCMPZUO : FT_CMPZX<0b001011, "fcmpzuo">;
14104eeddc0SDimitry Andric
14204eeddc0SDimitry Andricdefm FRECIP   : FT_MOV<0b011001, "frecip">;
14304eeddc0SDimitry Andric
144*5f757f3fSDimitry Andric// multiplication
145*5f757f3fSDimitry Andriclet Predicates = [HasFPUv2_SF] in {
146*5f757f3fSDimitry Andric  def : Pat<(f32 (fmul (fneg sFPR32Op:$vrx), sFPR32Op:$vry)),
147*5f757f3fSDimitry Andric            (FNMUL_S sFPR32Op:$vrx, sFPR32Op:$vry)>;
148*5f757f3fSDimitry Andric}
149*5f757f3fSDimitry Andriclet Predicates = [HasFPUv2_DF] in {
150*5f757f3fSDimitry Andric  def : Pat<(f64 (fmul (fneg sFPR64Op:$vrx), sFPR64Op:$vry)),
151*5f757f3fSDimitry Andric            (FNMUL_D sFPR64Op:$vrx, sFPR64Op:$vry)>;
152*5f757f3fSDimitry Andric}
153*5f757f3fSDimitry Andric
15404eeddc0SDimitry Andric//fmov, fmtvr, fmfvr
15504eeddc0SDimitry Andricdefm FMOV : FT_MOV<0b000100, "fmov">;
15604eeddc0SDimitry Andricdef FMFVRL : F_XZ_GF<3, 0b011001, (outs GPR:$rz), (ins sFPR32Op:$vrx),
15704eeddc0SDimitry Andric                     "fmfvrl\t$rz, $vrx", [(set GPR:$rz, (bitconvert sFPR32Op:$vrx))]>;
15804eeddc0SDimitry Andricdef FMTVRL : F_XZ_FG<3, 0b011011, (outs sFPR32Op:$vrz), (ins GPR:$rx),
15904eeddc0SDimitry Andric                     "fmtvrl\t$vrz, $rx", [(set sFPR32Op:$vrz, (bitconvert GPR:$rx))]>;
16004eeddc0SDimitry Andric
16104eeddc0SDimitry Andriclet Predicates = [HasFPUv2_DF] in {
16204eeddc0SDimitry Andric  let isCodeGenOnly = 1 in
16304eeddc0SDimitry Andric  def FMFVRL_D : F_XZ_GF<3, 0b011001, (outs GPR:$rz), (ins sFPR64Op:$vrx),
16404eeddc0SDimitry Andric                         "fmfvrl\t$rz, $vrx", []>;
16504eeddc0SDimitry Andric  def FMFVRH_D : F_XZ_GF<3, 0b011000, (outs GPR:$rz), (ins sFPR64Op:$vrx),
16604eeddc0SDimitry Andric                         "fmfvrh\t$rz, $vrx", []>;
16704eeddc0SDimitry Andric  let isCodeGenOnly = 1 in
16804eeddc0SDimitry Andric  def FMTVRL_D : F_XZ_FG<3, 0b011011, (outs sFPR64Op:$vrz), (ins GPR:$rx),
16904eeddc0SDimitry Andric                         "fmtvrl\t$vrz, $rx", []>;
17004eeddc0SDimitry Andriclet Constraints = "$vrZ = $vrz" in
17104eeddc0SDimitry Andric  def FMTVRH_D : F_XZ_FG<3, 0b011010, (outs sFPR64Op:$vrz), (ins sFPR64Op:$vrZ, GPR:$rx),
17204eeddc0SDimitry Andric                         "fmtvrh\t$vrz, $rx", []>;
17304eeddc0SDimitry Andric}
17404eeddc0SDimitry Andric
17504eeddc0SDimitry Andric//fcvt
17604eeddc0SDimitry Andric
17704eeddc0SDimitry Andricdef FSITOS  : F_XZ_TRANS<0b010000, "fsitos", sFPR32Op, sFPR32Op>;
17804eeddc0SDimitry Andricdef : Pat<(f32 (sint_to_fp GPR:$a)),
17904eeddc0SDimitry Andric          (FSITOS (COPY_TO_REGCLASS GPR:$a, sFPR32))>,
18004eeddc0SDimitry Andric          Requires<[HasFPUv2_SF]>;
18104eeddc0SDimitry Andric
18204eeddc0SDimitry Andricdef FUITOS  : F_XZ_TRANS<0b010001, "fuitos", sFPR32Op, sFPR32Op>;
18304eeddc0SDimitry Andricdef : Pat<(f32 (uint_to_fp GPR:$a)),
18404eeddc0SDimitry Andric          (FUITOS (COPY_TO_REGCLASS GPR:$a, sFPR32))>,
18504eeddc0SDimitry Andric          Requires<[HasFPUv2_SF]>;
18604eeddc0SDimitry Andric
18704eeddc0SDimitry Andricdef FSITOD  : F_XZ_TRANS<0b010100, "fsitod", sFPR64Op, sFPR64Op>;
18804eeddc0SDimitry Andricdef : Pat<(f64 (sint_to_fp GPR:$a)),
18904eeddc0SDimitry Andric            (FSITOD (COPY_TO_REGCLASS GPR:$a, sFPR64))>,
19004eeddc0SDimitry Andric           Requires<[HasFPUv2_DF]>;
19104eeddc0SDimitry Andric
19204eeddc0SDimitry Andricdef FUITOD  : F_XZ_TRANS<0b010101, "fuitod", sFPR64Op, sFPR64Op>;
19304eeddc0SDimitry Andricdef : Pat<(f64 (uint_to_fp GPR:$a)),
19404eeddc0SDimitry Andric            (FUITOD (COPY_TO_REGCLASS GPR:$a, sFPR64))>,
19504eeddc0SDimitry Andric           Requires<[HasFPUv2_DF]>;
19604eeddc0SDimitry Andric
19704eeddc0SDimitry Andriclet Predicates = [HasFPUv2_DF] in {
19804eeddc0SDimitry Andricdef FDTOS   : F_XZ_TRANS_DS<0b010110,"fdtos", UnOpFrag<(fpround node:$Src)>>;
19904eeddc0SDimitry Andricdef FSTOD   : F_XZ_TRANS_SD<0b010111,"fstod", UnOpFrag<(fpextend node:$Src)>>;
20004eeddc0SDimitry Andric}
20104eeddc0SDimitry Andric
20204eeddc0SDimitry Andricdef rpiFSTOSI : F_XZ_TRANS<0b000010, "fstosi.rpi", sFPR32Op, sFPR32Op>;
20304eeddc0SDimitry Andricdef rpiFSTOUI : F_XZ_TRANS<0b000110, "fstoui.rpi", sFPR32Op, sFPR32Op>;
20404eeddc0SDimitry Andricdef rzFSTOSI : F_XZ_TRANS<0b000001, "fstosi.rz", sFPR32Op, sFPR32Op>;
20504eeddc0SDimitry Andricdef rzFSTOUI : F_XZ_TRANS<0b000101, "fstoui.rz", sFPR32Op, sFPR32Op>;
20604eeddc0SDimitry Andricdef rnFSTOSI : F_XZ_TRANS<0b000000, "fstosi.rn", sFPR32Op, sFPR32Op>;
20704eeddc0SDimitry Andricdef rnFSTOUI : F_XZ_TRANS<0b000100, "fstoui.rn", sFPR32Op, sFPR32Op>;
20804eeddc0SDimitry Andricdef rniFSTOSI : F_XZ_TRANS<0b000011, "fstosi.rni", sFPR32Op, sFPR32Op>;
20904eeddc0SDimitry Andricdef rniFSTOUI : F_XZ_TRANS<0b000111, "fstoui.rni", sFPR32Op, sFPR32Op>;
21004eeddc0SDimitry Andric
21104eeddc0SDimitry Andriclet Predicates = [HasFPUv2_DF] in {
21204eeddc0SDimitry Andricdef rpiFDTOSI : F_XZ_TRANS<0b001010, "fdtosi.rpi", sFPR64Op, sFPR64Op>;
21304eeddc0SDimitry Andricdef rpiFDTOUI : F_XZ_TRANS<0b001110, "fdtoui.rpi", sFPR64Op, sFPR64Op>;
21404eeddc0SDimitry Andricdef rzFDTOSI : F_XZ_TRANS<0b001001, "fdtosi.rz", sFPR64Op, sFPR64Op>;
21504eeddc0SDimitry Andricdef rzFDTOUI : F_XZ_TRANS<0b001101, "fdtoui.rz", sFPR64Op, sFPR64Op>;
21604eeddc0SDimitry Andricdef rnFDTOSI : F_XZ_TRANS<0b001000, "fdtosi.rn", sFPR64Op, sFPR64Op>;
21704eeddc0SDimitry Andricdef rnFDTOUI : F_XZ_TRANS<0b001100, "fdtoui.rn", sFPR64Op, sFPR64Op>;
21804eeddc0SDimitry Andricdef rniFDTOSI : F_XZ_TRANS<0b001011, "fdtosi.rni", sFPR64Op, sFPR64Op>;
21904eeddc0SDimitry Andricdef rniFDTOUI : F_XZ_TRANS<0b001111, "fdtoui.rni", sFPR64Op, sFPR64Op>;
22004eeddc0SDimitry Andric}
22104eeddc0SDimitry Andric
22204eeddc0SDimitry Andricmulticlass FPToIntegerPats<SDNode round, string SUFFIX> {
22304eeddc0SDimitry Andric  def : Pat<(i32 (fp_to_sint (round sFPR32Op:$Rn))),
22404eeddc0SDimitry Andric            (COPY_TO_REGCLASS (!cast<Instruction>(SUFFIX # FSTOSI) sFPR32Op:$Rn), GPR)>,
22504eeddc0SDimitry Andric            Requires<[HasFPUv2_SF]>;
22604eeddc0SDimitry Andric  def : Pat<(i32 (fp_to_uint (round sFPR32Op:$Rn))),
22704eeddc0SDimitry Andric            (COPY_TO_REGCLASS (!cast<Instruction>(SUFFIX # FSTOUI) sFPR32Op:$Rn), GPR)>,
22804eeddc0SDimitry Andric            Requires<[HasFPUv2_SF]>;
22904eeddc0SDimitry Andric  def : Pat<(i32 (fp_to_sint (round sFPR64Op:$Rn))),
23004eeddc0SDimitry Andric            (COPY_TO_REGCLASS (!cast<Instruction>(SUFFIX # FDTOSI) sFPR64Op:$Rn), GPR)>,
23104eeddc0SDimitry Andric            Requires<[HasFPUv2_DF]>;
23204eeddc0SDimitry Andric  def : Pat<(i32 (fp_to_uint (round sFPR64Op:$Rn))),
23304eeddc0SDimitry Andric            (COPY_TO_REGCLASS (!cast<Instruction>(SUFFIX # FDTOUI) sFPR64Op:$Rn), GPR)>,
23404eeddc0SDimitry Andric            Requires<[HasFPUv2_DF]>;
23504eeddc0SDimitry Andric}
23604eeddc0SDimitry Andric
23704eeddc0SDimitry Andricdefm: FPToIntegerPats<fceil, "rpi">;
23804eeddc0SDimitry Andricdefm: FPToIntegerPats<fround, "rn">;
23904eeddc0SDimitry Andricdefm: FPToIntegerPats<ffloor, "rni">;
24004eeddc0SDimitry Andric
24104eeddc0SDimitry Andricmulticlass FPToIntegerTowardszeroPats<string SUFFIX> {
24204eeddc0SDimitry Andric  def : Pat<(i32 (fp_to_sint sFPR32Op:$Rn)),
24304eeddc0SDimitry Andric            (COPY_TO_REGCLASS (!cast<Instruction>(SUFFIX # FSTOSI) sFPR32Op:$Rn), GPR)>,
24404eeddc0SDimitry Andric            Requires<[HasFPUv2_SF]>;
24504eeddc0SDimitry Andric  def : Pat<(i32 (fp_to_uint sFPR32Op:$Rn)),
24604eeddc0SDimitry Andric            (COPY_TO_REGCLASS (!cast<Instruction>(SUFFIX # FSTOUI) sFPR32Op:$Rn), GPR)>,
24704eeddc0SDimitry Andric            Requires<[HasFPUv2_SF]>;
24804eeddc0SDimitry Andric  def : Pat<(i32 (fp_to_sint sFPR64Op:$Rn)),
24904eeddc0SDimitry Andric            (COPY_TO_REGCLASS (!cast<Instruction>(SUFFIX # FDTOSI) sFPR64Op:$Rn), GPR)>,
25004eeddc0SDimitry Andric            Requires<[HasFPUv2_DF]>;
25104eeddc0SDimitry Andric  def : Pat<(i32 (fp_to_uint sFPR64Op:$Rn)),
25204eeddc0SDimitry Andric            (COPY_TO_REGCLASS (!cast<Instruction>(SUFFIX # FDTOUI) sFPR64Op:$Rn), GPR)>,
25304eeddc0SDimitry Andric            Requires<[HasFPUv2_DF]>;
25404eeddc0SDimitry Andric}
25504eeddc0SDimitry Andric
25604eeddc0SDimitry Andricdefm: FPToIntegerTowardszeroPats<"rz">;
25704eeddc0SDimitry Andric
25804eeddc0SDimitry Andric
25904eeddc0SDimitry Andric//fld, fst
26004eeddc0SDimitry Andriclet hasSideEffects = 0, mayLoad = 1, mayStore = 0 in {
26104eeddc0SDimitry Andric  defm FLD : FT_XYAI_LD<0b0010000, "fld">;
26204eeddc0SDimitry Andric  defm FLDR : FT_XYAR_LD<0b0010100, "fldr">;
26304eeddc0SDimitry Andric  defm FLDM : FT_XYAR_LDM<0b0011000, "fldm">;
26404eeddc0SDimitry Andric
26504eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
26604eeddc0SDimitry Andric  def FLDRM : F_XYAR_LD<0b0010101, 0, "fldrm", "", sFPR64Op>;
26704eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
26804eeddc0SDimitry Andric  def FLDMM : F_I4_XY_MEM<0b0011001, 0,
26904eeddc0SDimitry Andric    (outs), (ins GPR:$rx, regseq_d1:$regs, variable_ops), "fldmm\t$regs, (${rx})", []>;
27004eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
27104eeddc0SDimitry Andric  def FLDM : F_XYAI_LD<0b0010001, 0, "fldm", "", sFPR64Op, uimm8_3>;
27204eeddc0SDimitry Andric}
27304eeddc0SDimitry Andric
27404eeddc0SDimitry Andric
27504eeddc0SDimitry Andric
27604eeddc0SDimitry Andriclet hasSideEffects = 0, mayLoad = 0, mayStore = 1 in {
27704eeddc0SDimitry Andric  defm FST : FT_XYAI_ST<0b0010010, "fst">;
27804eeddc0SDimitry Andric  defm FSTR : FT_XYAR_ST<0b0010110, "fstr">;
27904eeddc0SDimitry Andric  defm FSTM : FT_XYAR_STM<0b0011010, "fstm">;
28004eeddc0SDimitry Andric
28104eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
28204eeddc0SDimitry Andric  def FSTRM : F_XYAR_ST<0b0010111, 0, "fstrm", "", sFPR64Op>;
28304eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
28404eeddc0SDimitry Andric  def FSTMM :  F_I4_XY_MEM<0b0011011, 0,
28504eeddc0SDimitry Andric    (outs), (ins GPR:$rx, regseq_d1:$regs, variable_ops), "fstmm\t$regs, (${rx})", []>;
28604eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
28704eeddc0SDimitry Andric  def FSTM : F_XYAI_ST<0b0010011, 0, "fstm", "", sFPR64Op, uimm8_3>;
28804eeddc0SDimitry Andric}
28904eeddc0SDimitry Andric
29004eeddc0SDimitry Andricdefm : LdPat<load, uimm8_2, FLD_S, f32>, Requires<[HasFPUv2_SF]>;
29104eeddc0SDimitry Andricdefm : LdPat<load, uimm8_2, FLD_D, f64>, Requires<[HasFPUv2_DF]>;
29204eeddc0SDimitry Andricdefm : LdrPat<load, FLDR_S, f32>, Requires<[HasFPUv2_SF]>;
29304eeddc0SDimitry Andricdefm : LdrPat<load, FLDR_D, f64>, Requires<[HasFPUv2_DF]>;
29404eeddc0SDimitry Andric
29504eeddc0SDimitry Andricdefm : StPat<store, f32, uimm8_2, FST_S>, Requires<[HasFPUv2_SF]>;
29604eeddc0SDimitry Andricdefm : StPat<store, f64, uimm8_2, FST_D>, Requires<[HasFPUv2_DF]>;
29704eeddc0SDimitry Andricdefm : StrPat<store, f32, FSTR_S>, Requires<[HasFPUv2_SF]>;
29804eeddc0SDimitry Andricdefm : StrPat<store, f64, FSTR_D>, Requires<[HasFPUv2_DF]>;
29904eeddc0SDimitry Andric
30004eeddc0SDimitry Andric
30104eeddc0SDimitry Andricdef : Pat<(f32 fpimm16:$imm), (COPY_TO_REGCLASS (MOVI32 (fpimm32_lo16 fpimm16:$imm)), sFPR32)>,
30204eeddc0SDimitry Andric        Requires<[HasFPUv2_SF]>;
30304eeddc0SDimitry Andricdef : Pat<(f32 fpimm16_16:$imm), (f32 (COPY_TO_REGCLASS (MOVIH32 (fpimm32_hi16 fpimm16_16:$imm)), sFPR32))>,
30404eeddc0SDimitry Andric        Requires<[HasFPUv2_SF]>;
30504eeddc0SDimitry Andricdef : Pat<(f32 fpimm:$imm), (COPY_TO_REGCLASS (ORI32 (MOVIH32 (fpimm32_hi16 fpimm:$imm)), (fpimm32_lo16 fpimm:$imm)), sFPR32)>,
30604eeddc0SDimitry Andric        Requires<[HasFPUv2_SF]>;
30704eeddc0SDimitry Andric
30804eeddc0SDimitry Andricdef : Pat<(f64(CSKY_BITCAST_FROM_LOHI GPR:$rs1, GPR:$rs2)), (FMTVRH_D(FMTVRL_D GPR:$rs1), GPR:$rs2)>,
30904eeddc0SDimitry Andric        Requires<[HasFPUv2_DF]>;
31004eeddc0SDimitry Andric
311*5f757f3fSDimitry Andricmulticlass BRCond_Bin<CondCode CC, string Instr, Instruction Br0, Instruction Br1, Instruction MV> {
31204eeddc0SDimitry Andric  let Predicates = [HasFPUv2_SF] in
31304eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR32Op:$rs1, sFPR32Op:$rs2, CC)), bb:$imm16),
314*5f757f3fSDimitry Andric            (Br0 (!cast<Instruction>(Instr#_S) sFPR32Op:$rs1, sFPR32Op:$rs2), bb:$imm16)>;
315*5f757f3fSDimitry Andric  let Predicates = [HasFPUv2_SF] in
316*5f757f3fSDimitry Andric  def : Pat<(brcond (xor (i32 (setcc sFPR32Op:$rs1, sFPR32Op:$rs2, CC)), 1), bb:$imm16),
317*5f757f3fSDimitry Andric            (Br1 (!cast<Instruction>(Instr#_S) sFPR32Op:$rs1, sFPR32Op:$rs2), bb:$imm16)>;
31804eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
31904eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR64Op:$rs1, sFPR64Op:$rs2, CC)), bb:$imm16),
320*5f757f3fSDimitry Andric            (Br0 (!cast<Instruction>(Instr#_D) sFPR64Op:$rs1, sFPR64Op:$rs2), bb:$imm16)>;
321*5f757f3fSDimitry Andric  let Predicates = [HasFPUv2_DF] in
322*5f757f3fSDimitry Andric  def : Pat<(brcond (xor (i32 (setcc sFPR64Op:$rs1, sFPR64Op:$rs2, CC)), 1), bb:$imm16),
323*5f757f3fSDimitry Andric            (Br1 (!cast<Instruction>(Instr#_D) sFPR64Op:$rs1, sFPR64Op:$rs2), bb:$imm16)>;
32404eeddc0SDimitry Andric
32504eeddc0SDimitry Andric  let Predicates = [HasFPUv2_SF] in
32604eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR32Op:$rs1, sFPR32Op:$rs2, CC)),
32704eeddc0SDimitry Andric            (MV (!cast<Instruction>(Instr#_S) sFPR32Op:$rs1, sFPR32Op:$rs2))>;
32804eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
32904eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR64Op:$rs1, sFPR64Op:$rs2, CC)),
33004eeddc0SDimitry Andric            (MV (!cast<Instruction>(Instr#_D) sFPR64Op:$rs1, sFPR64Op:$rs2))>;
33104eeddc0SDimitry Andric}
33204eeddc0SDimitry Andric
333*5f757f3fSDimitry Andricmulticlass BRCond_Bin_SWAP<CondCode CC, string Instr, Instruction Br0, Instruction Br1, Instruction MV> {
33404eeddc0SDimitry Andric  let Predicates = [HasFPUv2_SF] in
33504eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR32Op:$rs1, sFPR32Op:$rs2, CC)), bb:$imm16),
336*5f757f3fSDimitry Andric            (Br0 (!cast<Instruction>(Instr#_S) sFPR32Op:$rs2, sFPR32Op:$rs1), bb:$imm16)>;
337*5f757f3fSDimitry Andric  let Predicates = [HasFPUv2_SF] in
338*5f757f3fSDimitry Andric  def : Pat<(brcond (xor (i32 (setcc sFPR32Op:$rs1, sFPR32Op:$rs2, CC)), 1), bb:$imm16),
339*5f757f3fSDimitry Andric            (Br1 (!cast<Instruction>(Instr#_S) sFPR32Op:$rs2, sFPR32Op:$rs1), bb:$imm16)>;
34004eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
34104eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR64Op:$rs1, sFPR64Op:$rs2, CC)), bb:$imm16),
342*5f757f3fSDimitry Andric            (Br0 (!cast<Instruction>(Instr#_D) sFPR64Op:$rs2, sFPR64Op:$rs1), bb:$imm16)>;
343*5f757f3fSDimitry Andric  let Predicates = [HasFPUv2_DF] in
344*5f757f3fSDimitry Andric  def : Pat<(brcond (xor (i32 (setcc sFPR64Op:$rs1, sFPR64Op:$rs2, CC)), 1), bb:$imm16),
345*5f757f3fSDimitry Andric            (Br1 (!cast<Instruction>(Instr#_D) sFPR64Op:$rs2, sFPR64Op:$rs1), bb:$imm16)>;
34604eeddc0SDimitry Andric
34704eeddc0SDimitry Andric  let Predicates = [HasFPUv2_SF] in
34804eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR32Op:$rs1, sFPR32Op:$rs2, CC)),
34904eeddc0SDimitry Andric            (MV (!cast<Instruction>(Instr#_S) sFPR32Op:$rs2, sFPR32Op:$rs1))>;
35004eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
35104eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR64Op:$rs1, sFPR64Op:$rs2, CC)),
35204eeddc0SDimitry Andric            (MV (!cast<Instruction>(Instr#_D) sFPR64Op:$rs2, sFPR64Op:$rs1))>;
35304eeddc0SDimitry Andric}
35404eeddc0SDimitry Andric
35504eeddc0SDimitry Andric// inverse (order && compare) to (unorder || inverse(compare))
35604eeddc0SDimitry Andric
357*5f757f3fSDimitry Andricdefm : BRCond_Bin<SETUNE, "FCMPNE", BT32, BF32, MVC32>;
358*5f757f3fSDimitry Andricdefm : BRCond_Bin<SETOEQ, "FCMPNE", BF32, BT32, MVCV32>;
359*5f757f3fSDimitry Andricdefm : BRCond_Bin<SETOGE, "FCMPHS", BT32, BF32, MVC32>;
360*5f757f3fSDimitry Andricdefm : BRCond_Bin<SETOLT, "FCMPLT", BT32, BF32, MVC32>;
361*5f757f3fSDimitry Andricdefm : BRCond_Bin<SETUO, "FCMPUO", BT32, BF32, MVC32>;
362*5f757f3fSDimitry Andricdefm : BRCond_Bin<SETO, "FCMPUO", BF32, BT32, MVCV32>;
363*5f757f3fSDimitry Andricdefm : BRCond_Bin_SWAP<SETOGT, "FCMPLT", BT32, BF32, MVC32>;
364*5f757f3fSDimitry Andricdefm : BRCond_Bin_SWAP<SETOLE, "FCMPHS", BT32, BF32, MVC32>;
36504eeddc0SDimitry Andric
366*5f757f3fSDimitry Andricdefm : BRCond_Bin<SETNE, "FCMPNE", BT32, BF32, MVC32>;
367*5f757f3fSDimitry Andricdefm : BRCond_Bin<SETEQ, "FCMPNE", BF32, BT32, MVCV32>;
368*5f757f3fSDimitry Andricdefm : BRCond_Bin<SETGE, "FCMPHS", BT32, BF32, MVC32>;
369*5f757f3fSDimitry Andricdefm : BRCond_Bin<SETLT, "FCMPLT", BT32, BF32, MVC32>;
370*5f757f3fSDimitry Andricdefm : BRCond_Bin_SWAP<SETGT, "FCMPLT", BT32, BF32, MVC32>;
371*5f757f3fSDimitry Andricdefm : BRCond_Bin_SWAP<SETLE, "FCMPHS", BT32, BF32, MVC32>;
37204eeddc0SDimitry Andric
37304eeddc0SDimitry Andric// -----------
37404eeddc0SDimitry Andric
37504eeddc0SDimitry Andriclet Predicates = [HasFPUv2_SF] in {
37604eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR32Op:$rs1, fpimm0, SETOGE)), bb:$imm16),
37704eeddc0SDimitry Andric            (BT32 (FCMPZHS_S sFPR32Op:$rs1), bb:$imm16)>;
37804eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR32Op:$rs1, fpimm0, SETOGE)),
37904eeddc0SDimitry Andric            (MVC32 (FCMPZHS_S sFPR32Op:$rs1))>;
38004eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR32Op:$rs1, fpimm0, SETOLT)), bb:$imm16),
38104eeddc0SDimitry Andric            (BF32 (FCMPZHS_S sFPR32Op:$rs1), bb:$imm16)>;
38204eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR32Op:$rs1, fpimm0, SETOLT)),
38304eeddc0SDimitry Andric            (MVCV32 (FCMPZHS_S sFPR32Op:$rs1))>;
38404eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR32Op:$rs1, fpimm0, SETOLE)), bb:$imm16),
38504eeddc0SDimitry Andric            (BT32 (FCMPZLS_S sFPR32Op:$rs1), bb:$imm16)>;
38604eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR32Op:$rs1, fpimm0, SETOLE)),
38704eeddc0SDimitry Andric            (MVC32 (FCMPZLS_S sFPR32Op:$rs1))>;
38804eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR32Op:$rs1, fpimm0, SETOGT)), bb:$imm16),
38904eeddc0SDimitry Andric            (BF32 (FCMPZLS_S sFPR32Op:$rs1), bb:$imm16)>;
39004eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR32Op:$rs1, fpimm0, SETOGT)),
39104eeddc0SDimitry Andric            (MVCV32 (FCMPZLS_S sFPR32Op:$rs1))>;
39204eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR32Op:$rs1, fpimm0, SETUNE)), bb:$imm16),
39304eeddc0SDimitry Andric            (BT32 (FCMPZNE_S sFPR32Op:$rs1), bb:$imm16)>;
39404eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR32Op:$rs1, fpimm0, SETUNE)),
39504eeddc0SDimitry Andric            (MVC32 (FCMPZNE_S sFPR32Op:$rs1))>;
39604eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR32Op:$rs1, fpimm0, SETOEQ)), bb:$imm16),
39704eeddc0SDimitry Andric            (BF32 (FCMPZNE_S sFPR32Op:$rs1), bb:$imm16)>;
39804eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR32Op:$rs1, fpimm0, SETOEQ)),
39904eeddc0SDimitry Andric            (MVCV32 (FCMPZNE_S sFPR32Op:$rs1))>;
40004eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR32Op:$rs1, fpimm, SETUO)), bb:$imm16),
40104eeddc0SDimitry Andric            (BT32 (FCMPZUO_S sFPR32Op:$rs1), bb:$imm16)>;
40204eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR32Op:$rs1, fpimm, SETUO)),
40304eeddc0SDimitry Andric            (MVC32 (FCMPZUO_S sFPR32Op:$rs1))>;
40404eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR32Op:$rs1, fpimm, SETO)), bb:$imm16),
40504eeddc0SDimitry Andric            (BF32 (FCMPZUO_S sFPR32Op:$rs1), bb:$imm16)>;
40604eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR32Op:$rs1, fpimm, SETO)),
40704eeddc0SDimitry Andric            (MVCV32 (FCMPZUO_S sFPR32Op:$rs1))>;
40804eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR32Op:$rs1, fpimm0, SETGE)), bb:$imm16),
40904eeddc0SDimitry Andric            (BT32 (FCMPZHS_S sFPR32Op:$rs1), bb:$imm16)>;
41004eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR32Op:$rs1, fpimm0, SETGE)),
41104eeddc0SDimitry Andric            (MVC32 (FCMPZHS_S sFPR32Op:$rs1))>;
41204eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR32Op:$rs1, fpimm0, SETLT)), bb:$imm16),
41304eeddc0SDimitry Andric            (BF32 (FCMPZHS_S sFPR32Op:$rs1), bb:$imm16)>;
41404eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR32Op:$rs1, fpimm0, SETLT)),
41504eeddc0SDimitry Andric            (MVCV32 (FCMPZHS_S sFPR32Op:$rs1))>;
41604eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR32Op:$rs1, fpimm0, SETLE)), bb:$imm16),
41704eeddc0SDimitry Andric            (BT32 (FCMPZLS_S sFPR32Op:$rs1), bb:$imm16)>;
41804eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR32Op:$rs1, fpimm0, SETLE)),
41904eeddc0SDimitry Andric            (MVC32 (FCMPZLS_S sFPR32Op:$rs1))>;
42004eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR32Op:$rs1, fpimm0, SETGT)), bb:$imm16),
42104eeddc0SDimitry Andric            (BF32 (FCMPZLS_S sFPR32Op:$rs1), bb:$imm16)>;
42204eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR32Op:$rs1, fpimm0, SETGT)),
42304eeddc0SDimitry Andric            (MVCV32 (FCMPZLS_S sFPR32Op:$rs1))>;
42404eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR32Op:$rs1, fpimm0, SETNE)), bb:$imm16),
42504eeddc0SDimitry Andric            (BT32 (FCMPZNE_S sFPR32Op:$rs1), bb:$imm16)>;
42604eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR32Op:$rs1, fpimm0, SETNE)),
42704eeddc0SDimitry Andric            (MVC32 (FCMPZNE_S sFPR32Op:$rs1))>;
42804eeddc0SDimitry Andric  def : Pat<(brcond (i32 (setcc sFPR32Op:$rs1, fpimm0, SETEQ)), bb:$imm16),
42904eeddc0SDimitry Andric            (BF32 (FCMPZNE_S sFPR32Op:$rs1), bb:$imm16)>;
43004eeddc0SDimitry Andric  def : Pat<(i32 (setcc sFPR32Op:$rs1, fpimm0, SETEQ)),
43104eeddc0SDimitry Andric            (MVCV32 (FCMPZNE_S sFPR32Op:$rs1))>;
43204eeddc0SDimitry Andric}
43304eeddc0SDimitry Andric
43404eeddc0SDimitry Andriclet usesCustomInserter = 1 in  {
43504eeddc0SDimitry Andric  let Predicates = [HasFPUv2_SF] in
43604eeddc0SDimitry Andric  def FSELS : CSKYPseudo<(outs sFPR32Op:$dst), (ins CARRY:$cond, sFPR32Op:$src1, sFPR32Op:$src2),
43704eeddc0SDimitry Andric    "!fsels\t$dst, $src1, src2", [(set sFPR32Op:$dst, (select CARRY:$cond, sFPR32Op:$src1, sFPR32Op:$src2))]>;
43804eeddc0SDimitry Andric
43904eeddc0SDimitry Andric  let Predicates = [HasFPUv2_DF] in
44004eeddc0SDimitry Andric  def FSELD : CSKYPseudo<(outs sFPR64Op:$dst), (ins CARRY:$cond, sFPR64Op:$src1, sFPR64Op:$src2),
44104eeddc0SDimitry Andric    "!fseld\t$dst, $src1, src2", [(set sFPR64Op:$dst, (select CARRY:$cond, sFPR64Op:$src1, sFPR64Op:$src2))]>;
44204eeddc0SDimitry Andric}
443