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