104eeddc0SDimitry Andric//===- CSKYInstrInfoF2.td - CSKY Instruction Float2.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_f2 : Operand<i32> { 1404eeddc0SDimitry Andric let EncoderMethod = "getRegisterSeqOpValue"; 1504eeddc0SDimitry Andric let ParserMatchClass = RegSeqAsmOperand<"V2">; 1604eeddc0SDimitry Andric let PrintMethod = "printRegisterSeq"; 1704eeddc0SDimitry Andric let DecoderMethod = "DecodeRegSeqOperandF2"; 1804eeddc0SDimitry Andric let MIOperandInfo = (ops FPR32, uimm5); 1904eeddc0SDimitry Andric} 2004eeddc0SDimitry Andric 2104eeddc0SDimitry Andricdef regseq_d2 : Operand<i32> { 2204eeddc0SDimitry Andric let EncoderMethod = "getRegisterSeqOpValue"; 2304eeddc0SDimitry Andric let ParserMatchClass = RegSeqAsmOperand<"V2">; 2404eeddc0SDimitry Andric let PrintMethod = "printRegisterSeq"; 2504eeddc0SDimitry Andric let DecoderMethod = "DecodeRegSeqOperandD2"; 2604eeddc0SDimitry Andric let MIOperandInfo = (ops FPR64, uimm5); 2704eeddc0SDimitry Andric} 2804eeddc0SDimitry Andric 2904eeddc0SDimitry Andricdef FPR32Op : RegisterOperand<FPR32, "printFPR">; 3004eeddc0SDimitry Andricdef FPR64Op : RegisterOperand<FPR64, "printFPR">; 3104eeddc0SDimitry Andric 3204eeddc0SDimitry Andricinclude "CSKYInstrFormatsF2.td" 3304eeddc0SDimitry Andric 3404eeddc0SDimitry Andric// Predicates 3504eeddc0SDimitry Andricdef IsOrAdd: PatFrag<(ops node:$A, node:$B), (or node:$A, node:$B), [{ 3604eeddc0SDimitry Andric return isOrEquivalentToAdd(N); 3704eeddc0SDimitry Andric}]>; 3804eeddc0SDimitry Andric 3904eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 4004eeddc0SDimitry Andric// Instructions 4104eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 4204eeddc0SDimitry Andric 4304eeddc0SDimitry Andricdefm f2FADD : F2_XYZ_T<0b000000, "fadd", BinOpFrag<(fadd node:$LHS, node:$RHS)>>; 4404eeddc0SDimitry Andricdefm f2FSUB : F2_XYZ_T<0b000001, "fsub", BinOpFrag<(fsub node:$LHS, node:$RHS)>>; 4504eeddc0SDimitry Andricdefm f2FDIV : F2_XYZ_T<0b011000, "fdiv", BinOpFrag<(fdiv node:$LHS, node:$RHS)>>; 4604eeddc0SDimitry Andricdefm f2FMUL : F2_XYZ_T<0b010000, "fmul", BinOpFrag<(fmul node:$LHS, node:$RHS)>>; 4704eeddc0SDimitry Andric 4804eeddc0SDimitry Andricdefm f2FMAXNM : F2_XYZ_T<0b101000, "fmaxnm", BinOpFrag<(fmaxnum node:$LHS, node:$RHS)>>; 4904eeddc0SDimitry Andricdefm f2FMINNM : F2_XYZ_T<0b101001, "fminnm", BinOpFrag<(fminnum node:$LHS, node:$RHS)>>; 5004eeddc0SDimitry Andric 5104eeddc0SDimitry Andricdefm f2FABS : F2_XZ_T<0b000110, "fabs", fabs>; 5204eeddc0SDimitry Andricdefm f2FNEG : F2_XZ_T<0b000111, "fneg", fneg>; 5304eeddc0SDimitry Andricdefm f2FSQRT : F2_XZ_T<0b011010, "fsqrt", fsqrt>; 5404eeddc0SDimitry Andricdefm f2FMOV : F2_XZ_SET_T<0b000100, "fmov">; 5504eeddc0SDimitry Andricdef f2FMOVX : F2_XZ_SET<0b00001, FPR32Op, 0b000101, "fmovx.32">; 5604eeddc0SDimitry Andric 5704eeddc0SDimitry Andricdefm f2RECIP : F2_XZ_SET_T<0b011001, "frecip">; 5804eeddc0SDimitry Andric 5904eeddc0SDimitry Andric// fld/fst 6004eeddc0SDimitry Andriclet hasSideEffects = 0, mayLoad = 1, mayStore = 0 in { 6104eeddc0SDimitry Andric def f2FLD_S : F2_LDST_S<0b0, "fld", (outs FPR32Op:$vrz), (ins GPR:$rx, uimm8_2:$imm8)>; 6204eeddc0SDimitry Andric let Predicates = [HasFPUv3_DF] in 6304eeddc0SDimitry Andric def f2FLD_D : F2_LDST_D<0b0, "fld", (outs FPR64Op:$vrz), (ins GPR:$rx, uimm8_2:$imm8)>; 6404eeddc0SDimitry Andric} 6504eeddc0SDimitry Andriclet hasSideEffects = 0, mayLoad = 0, mayStore = 1 in { 6604eeddc0SDimitry Andric def f2FST_S : F2_LDST_S<0b1, "fst", (outs), (ins FPR32Op:$vrz, GPR:$rx, uimm8_2:$imm8)>; 6704eeddc0SDimitry Andric let Predicates = [HasFPUv3_DF] in 6804eeddc0SDimitry Andric def f2FST_D : F2_LDST_D<0b1, "fst", (outs), (ins FPR64Op:$vrz, GPR:$rx, uimm8_2:$imm8)>; 6904eeddc0SDimitry Andric} 7004eeddc0SDimitry Andric 7104eeddc0SDimitry Andriclet hasSideEffects = 0, mayLoad = 0, mayStore = 1 in { 7204eeddc0SDimitry Andric def f2FSTM_S : F2_LDSTM_S<0b1, 0, "fstm", (outs), (ins GPR:$rx, regseq_f2:$regs, variable_ops)>; 7304eeddc0SDimitry Andric let Predicates = [HasFPUv3_DF] in 7404eeddc0SDimitry Andric def f2FSTM_D : F2_LDSTM_D<0b1, 0, "fstm", (outs), (ins GPR:$rx, regseq_d2:$regs, variable_ops)>; 7504eeddc0SDimitry Andric 7604eeddc0SDimitry Andric def f2FSTMU_S : F2_LDSTM_S<0b1, 0b100, "fstmu", (outs), (ins GPR:$rx, regseq_f2:$regs, variable_ops)>; 7704eeddc0SDimitry Andric let Predicates = [HasFPUv3_DF] in 7804eeddc0SDimitry Andric def f2FSTMU_D : F2_LDSTM_D<0b1, 0b100, "fstmu", (outs), (ins GPR:$rx, regseq_d2:$regs, variable_ops)>; 7904eeddc0SDimitry Andric} 8004eeddc0SDimitry Andric 8104eeddc0SDimitry Andriclet hasSideEffects = 0, mayLoad = 1, mayStore = 0 in { 8204eeddc0SDimitry Andric def f2FLDM_S : F2_LDSTM_S<0b0, 0, "fldm", (outs), (ins GPR:$rx, regseq_f2:$regs, variable_ops)>; 8304eeddc0SDimitry Andric let Predicates = [HasFPUv3_DF] in 8404eeddc0SDimitry Andric def f2FLDM_D : F2_LDSTM_D<0b0, 0, "fldm", (outs), (ins GPR:$rx, regseq_d2:$regs, variable_ops)>; 8504eeddc0SDimitry Andric 8604eeddc0SDimitry Andric def f2FLDMU_S : F2_LDSTM_S<0b0, 0b100, "fldmu", (outs), (ins GPR:$rx, regseq_f2:$regs, variable_ops)>; 8704eeddc0SDimitry Andric let Predicates = [HasFPUv3_DF] in 8804eeddc0SDimitry Andric def f2FLDMU_D : F2_LDSTM_D<0b0, 0b100, "fldmu", (outs), (ins GPR:$rx, regseq_d2:$regs, variable_ops)>; 8904eeddc0SDimitry Andric} 9004eeddc0SDimitry Andric 9104eeddc0SDimitry Andricmulticlass FLSR { 9204eeddc0SDimitry Andric let hasSideEffects = 0, mayLoad = 1, mayStore = 0 in { 9304eeddc0SDimitry Andric def FLDR_S : F2_LDSTR_S<0b0, "fldr", (outs FPR32Op:$rz), (ins GPR:$rx, GPR:$ry, uimm2:$imm)>; 9404eeddc0SDimitry Andric let Predicates = [HasFPUv3_DF] in 9504eeddc0SDimitry Andric def FLDR_D : F2_LDSTR_D<0b0, "fldr", (outs FPR64Op:$rz), (ins GPR:$rx, GPR:$ry, uimm2:$imm)>; 9604eeddc0SDimitry Andric } 9704eeddc0SDimitry Andric let hasSideEffects = 0, mayLoad = 0, mayStore = 1 in { 9804eeddc0SDimitry Andric def FSTR_S : F2_LDSTR_S<0b1, "fstr", (outs), (ins FPR32Op:$rz, GPR:$rx, GPR:$ry, uimm2:$imm)>; 9904eeddc0SDimitry Andric let Predicates = [HasFPUv3_DF] in 10004eeddc0SDimitry Andric def FSTR_D : F2_LDSTR_D<0b1, "fstr", (outs), (ins FPR64Op:$rz, GPR:$rx, GPR:$ry, uimm2:$imm)>; 10104eeddc0SDimitry Andric } 10204eeddc0SDimitry Andric} 10304eeddc0SDimitry Andric 10404eeddc0SDimitry Andricdefm f2: FLSR; 10504eeddc0SDimitry Andric 10604eeddc0SDimitry Andricdef f2FLRW_S : F2_LRW<0b00, 0b0, "flrw.32", (outs FPR32Op:$vrz), (ins fconstpool_symbol:$imm8)>; 10704eeddc0SDimitry Andricdef f2FLRW_D : F2_LRW<0b01, 0b0, "flrw.64", (outs FPR64Op:$vrz), (ins fconstpool_symbol:$imm8)>; 10804eeddc0SDimitry Andric 10904eeddc0SDimitry Andricdef : Pat<(f32 (load constpool:$src)), (f2FLRW_S (to_tconstpool tconstpool:$src))>, Requires<[HasFPUv3_SF]>; 11004eeddc0SDimitry Andricdef : Pat<(f64 (load constpool:$src)), (f2FLRW_D (to_tconstpool tconstpool:$src))>, Requires<[HasFPUv3_DF]>; 11104eeddc0SDimitry Andric 11204eeddc0SDimitry Andricdefm : LdPat<load, uimm8_2, f2FLD_S, f32>, Requires<[HasFPUv3_SF]>; 11304eeddc0SDimitry Andricdefm : LdPat<load, uimm8_2, f2FLD_D, f64>, Requires<[HasFPUv3_DF]>; 11404eeddc0SDimitry Andricdefm : LdrPat<load, f2FLDR_S, f32>, Requires<[HasFPUv3_SF]>; 11504eeddc0SDimitry Andricdefm : LdrPat<load, f2FLDR_D, f64>, Requires<[HasFPUv3_DF]>; 11604eeddc0SDimitry Andric 11704eeddc0SDimitry Andricdefm : StPat<store, f32, uimm8_2, f2FST_S>, Requires<[HasFPUv3_SF]>; 11804eeddc0SDimitry Andricdefm : StPat<store, f64, uimm8_2, f2FST_D>, Requires<[HasFPUv3_DF]>; 11904eeddc0SDimitry Andricdefm : StrPat<store, f32, f2FSTR_S>, Requires<[HasFPUv3_SF]>; 12004eeddc0SDimitry Andricdefm : StrPat<store, f64, f2FSTR_D>, Requires<[HasFPUv3_DF]>; 12104eeddc0SDimitry Andric 12204eeddc0SDimitry Andric// fmfvr 12304eeddc0SDimitry Andriclet vry = 0 in 12404eeddc0SDimitry Andricdef f2FMFVRL : F2_XYZ<0b00011, 0b011001, "fmfvr.32.1\t$vrz, $vrx", 12504eeddc0SDimitry Andric (outs GPR:$vrz), (ins FPR32Op:$vrx), 12604eeddc0SDimitry Andric [(set GPR:$vrz, (bitconvert FPR32Op:$vrx))]>; 12704eeddc0SDimitry Andric// TODO: vrz and vrz+1 12804eeddc0SDimitry Andricdef f2FMFVRL_2 : F2_XYZ<0b00011, 0b111010, "fmfvr.32.2\t$vrz, $vry, $vrx", 12904eeddc0SDimitry Andric (outs GPR:$vrz, GPR:$vry), (ins FPR64Op:$vrx), 13004eeddc0SDimitry Andric []>; 13104eeddc0SDimitry Andric 13204eeddc0SDimitry Andriclet Predicates = [HasFPUv3_DF] in { 13304eeddc0SDimitry Andriclet vry = 0 in { 13404eeddc0SDimitry Andriclet isCodeGenOnly = 1 in 13504eeddc0SDimitry Andricdef f2FMFVRL_D : F2_XYZ<0b00011, 0b011001, "fmfvr.32.1\t$vrz, $vrx", 13604eeddc0SDimitry Andric (outs GPR:$vrz), (ins FPR64Op:$vrx), 13704eeddc0SDimitry Andric []>; 13804eeddc0SDimitry Andricdef f2FMFVRH_D : F2_XYZ<0b00011, 0b011000, "fmfvrh\t$vrz, $vrx", 13904eeddc0SDimitry Andric (outs GPR:$vrz), (ins FPR64Op:$vrx), 14004eeddc0SDimitry Andric []>; 14104eeddc0SDimitry Andric} 14204eeddc0SDimitry Andricdef f2FMFVR_D : F2_XYZ<0b00011, 0b111000, "fmfvr.64\t$vrz, $vry, $vrx", 14304eeddc0SDimitry Andric (outs GPR:$vrz, GPR:$vry), (ins FPR64Op:$vrx), 14404eeddc0SDimitry Andric [(set GPR:$vrz, GPR:$vry, (CSKY_BITCAST_TO_LOHI FPR64Op:$vrx))]>; 14504eeddc0SDimitry Andric} 14604eeddc0SDimitry Andric 14704eeddc0SDimitry Andric// fmtvr 14804eeddc0SDimitry Andricdef f2FMTVRL : F2_XZ_P<0b00011, 0b011011, "fmtvr.32.1", 14904eeddc0SDimitry Andric [(set FPR32Op:$vrz, (bitconvert GPR:$vrx))], 15004eeddc0SDimitry Andric (outs FPR32Op:$vrz), (ins GPR:$vrx)>; 15104eeddc0SDimitry Andric// TODO: vrz and vrz+1 15204eeddc0SDimitry Andricdef f2FMTVRL_2 : F2_XYZ<0b00011, 0b111110, "fmtvr.32.2\t$vrz, $vrx, $vry", 15304eeddc0SDimitry Andric (outs FPR32Op:$vrz), (ins GPR:$vrx, GPR:$vry), 15404eeddc0SDimitry Andric []>; 15504eeddc0SDimitry Andric 15604eeddc0SDimitry Andriclet Predicates = [HasFPUv3_DF] in { 15704eeddc0SDimitry Andriclet isCodeGenOnly = 1 in 15804eeddc0SDimitry Andricdef f2FMTVRL_D : F2_XZ_P<0b00011, 0b011011, "fmtvr.32.1", 15904eeddc0SDimitry Andric [], 16004eeddc0SDimitry Andric (outs FPR64Op:$vrz), (ins GPR:$vrx)>; 16104eeddc0SDimitry Andriclet Constraints = "$vrZ = $vrz" in 16204eeddc0SDimitry Andricdef f2FMTVRH_D : F2_XZ_P<0b00011, 0b011010, "fmtvrh", 16304eeddc0SDimitry Andric [], 16404eeddc0SDimitry Andric (outs FPR64Op:$vrz), (ins FPR64Op:$vrZ, GPR:$vrx)>; 16504eeddc0SDimitry Andricdef f2FMTVR_D : F2_XYZ<0b00011, 0b111100, "fmtvr.64\t$vrz, $vrx, $vry", 16604eeddc0SDimitry Andric (outs FPR64Op:$vrz), (ins GPR:$vrx, GPR:$vry), 16704eeddc0SDimitry Andric [(set FPR64Op:$vrz, (CSKY_BITCAST_FROM_LOHI GPR:$vrx, GPR:$vry))]>; 16804eeddc0SDimitry Andric} 16904eeddc0SDimitry Andric 17004eeddc0SDimitry Andric// fcmp 17104eeddc0SDimitry Andric 17204eeddc0SDimitry Andricdefm f2FCMPHS: F2_CXY_T<0b001100, "fcmphs">; 17304eeddc0SDimitry Andricdefm f2FCMPLT: F2_CXY_T<0b001101, "fcmplt">; 17404eeddc0SDimitry Andricdefm f2FCMPNE: F2_CXY_T<0b001110, "fcmpne">; 17504eeddc0SDimitry Andricdefm f2FCMPUO: F2_CXY_T<0b001111, "fcmpuo">; 17604eeddc0SDimitry Andric 17704eeddc0SDimitry Andricdefm f2FCMPHSZ: F2_CX_T<0b001000, "fcmphsz">; 17804eeddc0SDimitry Andricdefm f2FCMPHZ : F2_CX_T<0b101010, "fcmphz">; 17904eeddc0SDimitry Andricdefm f2FCMPLSZ: F2_CX_T<0b101011, "fcmplsz">; 18004eeddc0SDimitry Andricdefm f2FCMPLTZ: F2_CX_T<0b001001, "fcmpltz">; 18104eeddc0SDimitry Andricdefm f2FCMPNEZ: F2_CX_T<0b001010, "fcmpnez">; 18204eeddc0SDimitry Andricdefm f2FCMPUOZ: F2_CX_T<0b001011, "fcmpuoz">; 18304eeddc0SDimitry Andric 18404eeddc0SDimitry Andricdefm f2FMULA : F2_XYZZ_T<0b010100, "fmula", 18504eeddc0SDimitry Andric TriOpFrag<(fadd (fmul node:$LHS, node:$MHS), node:$RHS)>>; 18604eeddc0SDimitry Andric 18704eeddc0SDimitry Andricdefm f2FMULS : F2_XYZZ_T<0b010110, "fmuls", 18804eeddc0SDimitry Andric TriOpFrag<(fsub node:$RHS, (fmul node:$LHS, node:$MHS))>>; 18904eeddc0SDimitry Andric 19004eeddc0SDimitry Andricdefm f2FFMULA : F2_XYZZ_T<0b110000, "ffmula", 19104eeddc0SDimitry Andric TriOpFrag<(fma node:$LHS, node:$MHS, node:$RHS)>>; 19204eeddc0SDimitry Andric 19304eeddc0SDimitry Andricdefm f2FFMULS : F2_XYZZ_T<0b110001, "ffmuls", 19404eeddc0SDimitry Andric TriOpFrag<(fma (fneg node:$LHS), node:$MHS, node:$RHS)>>; 19504eeddc0SDimitry Andric 19604eeddc0SDimitry Andricdefm f2FFNMULA : F2_XYZZ_T<0b110010, "ffnmula", 19704eeddc0SDimitry Andric TriOpFrag<(fneg (fma node:$LHS, node:$MHS, node:$RHS))>>; 19804eeddc0SDimitry Andric 19904eeddc0SDimitry Andricdefm f2FFNMULS : F2_XYZZ_T<0b110011, "ffnmuls", 20004eeddc0SDimitry Andric TriOpFrag<(fma node:$LHS, node:$MHS, (fneg node:$RHS))>>; 20104eeddc0SDimitry Andric 20204eeddc0SDimitry Andricdefm f2FNMULA : F2_XYZZ_T<0b010111, "fnmula", 20304eeddc0SDimitry Andric TriOpFrag<(fneg (fadd (fmul node:$LHS, node:$MHS), node:$RHS))>>; 20404eeddc0SDimitry Andric 20504eeddc0SDimitry Andricdefm f2FNMULS : F2_XYZZ_T<0b010101, "fnmuls", 20604eeddc0SDimitry Andric TriOpFrag<(fneg (fsub node:$RHS, (fmul node:$LHS, node:$MHS)))>>; 20704eeddc0SDimitry Andric 20804eeddc0SDimitry Andricdefm f2FNMUL : F2_XYZ_T<0b010001, "fnmul", 20904eeddc0SDimitry Andric BinOpFrag<(fneg (fmul node:$LHS, node:$RHS))>>; 21004eeddc0SDimitry Andric 211*5f757f3fSDimitry Andric// multiplication 212*5f757f3fSDimitry Andriclet Predicates = [HasFPUv3_SF] in { 213*5f757f3fSDimitry Andric def : Pat<(f32 (fmul (fneg FPR32Op:$vrx), FPR32Op:$vry)), 214*5f757f3fSDimitry Andric (f2FNMUL_S FPR32Op:$vrx, FPR32Op:$vry)>; 215*5f757f3fSDimitry Andric} 216*5f757f3fSDimitry Andriclet Predicates = [HasFPUv3_DF] in { 217*5f757f3fSDimitry Andric def : Pat<(f64 (fmul (fneg FPR64Op:$vrx), FPR64Op:$vry)), 218*5f757f3fSDimitry Andric (f2FNMUL_D FPR64Op:$vrx, FPR64Op:$vry)>; 219*5f757f3fSDimitry Andric} 220*5f757f3fSDimitry Andric 22104eeddc0SDimitry Andric// fcvt 22204eeddc0SDimitry Andricdef f2FFTOS32_S : F2_XZ_P<0b01000, 0b011011, "fftoi.f32.s32", [], (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>; 22304eeddc0SDimitry Andricdef f2FFTOU32_S : F2_XZ_P<0b01000, 0b011010, "fftoi.f32.u32", [], (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>; 22404eeddc0SDimitry Andricdef f2FS32TOF_S : F2_XZ_P<0b01001, 0b011011, "fitof.s32.f32", [], (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>; 22504eeddc0SDimitry Andricdef f2FU32TOF_S : F2_XZ_P<0b01001, 0b011010, "fitof.u32.f32", [], (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>; 22604eeddc0SDimitry Andricdef f2FFTOXU32_S : F2_XZ_P<0b01000, 0b001010, "fftox.f32.u32", [], (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>; 22704eeddc0SDimitry Andricdef f2FFTOXS32_S : F2_XZ_P<0b01000, 0b001011, "fftox.f32.s32", [], (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>; 22804eeddc0SDimitry Andricdef f2FXTOFU32_S : F2_XZ_P<0b01001, 0b001010, "fxtof.u32.f32", [], (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>; 22904eeddc0SDimitry Andricdef f2FXTOFS32_S : F2_XZ_P<0b01001, 0b001011, "fxtof.s32.f32", [], (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>; 23004eeddc0SDimitry Andriclet Predicates = [HasFPUv3_DF] in { 23104eeddc0SDimitry Andricdef f2FFTOS32_D : F2_XZ_P<0b01000, 0b011101, "fftoi.f64.s32", [], (outs FPR32Op:$vrz), (ins FPR64Op:$vrx)>; 23204eeddc0SDimitry Andricdef f2FFTOU32_D : F2_XZ_P<0b01000, 0b011100, "fftoi.f64.u32", [], (outs FPR32Op:$vrz), (ins FPR64Op:$vrx)>; 23304eeddc0SDimitry Andricdef f2FS32TOF_D : F2_XZ_P<0b01001, 0b011101, "fitof.s32.f64", [], (outs FPR64Op:$vrz), (ins FPR32Op:$vrx)>; 23404eeddc0SDimitry Andricdef f2FU32TOF_D : F2_XZ_P<0b01001, 0b011100, "fitof.u32.f64", [], (outs FPR64Op:$vrz), (ins FPR32Op:$vrx)>; 23504eeddc0SDimitry Andricdef f2FFTOXU32_D : F2_XZ_P<0b01000, 0b001100, "fftox.f64.u32", [], (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>; 23604eeddc0SDimitry Andricdef f2FFTOXS32_D : F2_XZ_P<0b01000, 0b001101, "fftox.f64.s32", [], (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>; 23704eeddc0SDimitry Andricdef f2FXTOFU32_D : F2_XZ_P<0b01001, 0b001100, "fxtof.u32.f64", [], (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>; 23804eeddc0SDimitry Andricdef f2FXTOFS32_D : F2_XZ_P<0b01001, 0b001101, "fxtof.s32.f64", [], (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>; 23904eeddc0SDimitry Andric} 24004eeddc0SDimitry Andric 24104eeddc0SDimitry Andricdefm f2FF32TOSI32 : F2_XZ_RM<0b00011, 0b0000, "fftoi.f32.s32", (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>; 24204eeddc0SDimitry Andricdefm f2FF32TOUI32 : F2_XZ_RM<0b00011, 0b0001, "fftoi.f32.u32", (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>; 24304eeddc0SDimitry Andricdefm f2FF32TOFI32 : F2_XZ_RM<0b01000, 0b1001, "fftofi.f32", (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>; 24404eeddc0SDimitry Andriclet Predicates = [HasFPUv3_DF] in { 24504eeddc0SDimitry Andricdefm f2FF64TOSI32 : F2_XZ_RM<0b00011, 0b0010, "fftoi.f64.s32", (outs FPR32Op:$vrz), (ins FPR64Op:$vrx)>; 24604eeddc0SDimitry Andricdefm f2FF64TOUI32 : F2_XZ_RM<0b00011, 0b0011, "fftoi.f64.u32", (outs FPR32Op:$vrz), (ins FPR64Op:$vrx)>; 24704eeddc0SDimitry Andricdefm f2FF64TOFI32 : F2_XZ_RM<0b01000, 0b1010, "fftofi.f64", (outs FPR32Op:$vrz), (ins FPR32Op:$vrx)>; 24804eeddc0SDimitry Andric} 24904eeddc0SDimitry Andric 25004eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_sint (fround FPR32Op:$vrx))), (COPY_TO_REGCLASS (f2FF32TOSI32_RN $vrx), GPR)>, Requires<[HasFPUv3_SF]>; 25104eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_uint (fround FPR32Op:$vrx))), (COPY_TO_REGCLASS (f2FF32TOUI32_RN $vrx), GPR)>, Requires<[HasFPUv3_SF]>; 25204eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_sint (fceil FPR32Op:$vrx))), (COPY_TO_REGCLASS (f2FF32TOSI32_RPI $vrx), GPR)>, Requires<[HasFPUv3_SF]>; 25304eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_uint (fceil FPR32Op:$vrx))), (COPY_TO_REGCLASS (f2FF32TOUI32_RPI $vrx), GPR)>, Requires<[HasFPUv3_SF]>; 25404eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_sint (ffloor FPR32Op:$vrx))), (COPY_TO_REGCLASS (f2FF32TOSI32_RNI $vrx), GPR)>, Requires<[HasFPUv3_SF]>; 25504eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_uint (ffloor FPR32Op:$vrx))), (COPY_TO_REGCLASS (f2FF32TOUI32_RNI $vrx), GPR)>, Requires<[HasFPUv3_SF]>; 25604eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_sint (ftrunc FPR32Op:$vrx))), (COPY_TO_REGCLASS (f2FF32TOSI32_RZ $vrx), GPR)>, Requires<[HasFPUv3_SF]>; 25704eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_uint (ftrunc FPR32Op:$vrx))), (COPY_TO_REGCLASS (f2FF32TOUI32_RZ $vrx), GPR)>, Requires<[HasFPUv3_SF]>; 25804eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_sint FPR32Op:$vrx)), (COPY_TO_REGCLASS (f2FF32TOSI32_RZ $vrx), GPR)>, Requires<[HasFPUv3_SF]>; 25904eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_uint FPR32Op:$vrx)), (COPY_TO_REGCLASS (f2FF32TOUI32_RZ $vrx), GPR)>, Requires<[HasFPUv3_SF]>; 26004eeddc0SDimitry Andric 26104eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_sint (fround FPR64Op:$vrx))), (COPY_TO_REGCLASS (f2FF64TOSI32_RN $vrx), GPR)>, Requires<[HasFPUv3_DF]>; 26204eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_uint (fround FPR64Op:$vrx))), (COPY_TO_REGCLASS (f2FF64TOUI32_RN $vrx), GPR)>, Requires<[HasFPUv3_DF]>; 26304eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_sint (fceil FPR64Op:$vrx))), (COPY_TO_REGCLASS (f2FF64TOSI32_RPI $vrx), GPR)>, Requires<[HasFPUv3_DF]>; 26404eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_uint (fceil FPR64Op:$vrx))), (COPY_TO_REGCLASS (f2FF64TOUI32_RPI $vrx), GPR)>, Requires<[HasFPUv3_DF]>; 26504eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_sint (ffloor FPR64Op:$vrx))), (COPY_TO_REGCLASS (f2FF64TOSI32_RNI $vrx), GPR)>, Requires<[HasFPUv3_DF]>; 26604eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_uint (ffloor FPR64Op:$vrx))), (COPY_TO_REGCLASS (f2FF64TOUI32_RNI $vrx), GPR)>, Requires<[HasFPUv3_DF]>; 26704eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_sint (ftrunc FPR64Op:$vrx))), (COPY_TO_REGCLASS (f2FF64TOSI32_RZ $vrx), GPR)>, Requires<[HasFPUv3_DF]>; 26804eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_uint (ftrunc FPR64Op:$vrx))), (COPY_TO_REGCLASS (f2FF64TOUI32_RZ $vrx), GPR)>, Requires<[HasFPUv3_DF]>; 26904eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_sint FPR64Op:$vrx)), (COPY_TO_REGCLASS (f2FF64TOSI32_RZ $vrx), GPR)>, Requires<[HasFPUv3_DF]>; 27004eeddc0SDimitry Andricdef : Pat<(i32 (fp_to_uint FPR64Op:$vrx)), (COPY_TO_REGCLASS (f2FF64TOUI32_RZ $vrx), GPR)>, Requires<[HasFPUv3_DF]>; 27104eeddc0SDimitry Andric 27204eeddc0SDimitry Andricdef : Pat<(sint_to_fp GPR:$vrx), (f2FS32TOF_S (COPY_TO_REGCLASS $vrx, FPR32))>, Requires<[HasFPUv3_SF]>; 27304eeddc0SDimitry Andricdef : Pat<(uint_to_fp GPR:$vrx), (f2FU32TOF_S (COPY_TO_REGCLASS $vrx, FPR32))>, Requires<[HasFPUv3_SF]>; 27404eeddc0SDimitry Andricdef : Pat<(sint_to_fp GPR:$vrx), (f2FS32TOF_D (COPY_TO_REGCLASS $vrx, FPR32))>, Requires<[HasFPUv3_DF]>; 27504eeddc0SDimitry Andricdef : Pat<(uint_to_fp GPR:$vrx), (f2FU32TOF_D (COPY_TO_REGCLASS $vrx, FPR32))>, Requires<[HasFPUv3_DF]>; 27604eeddc0SDimitry Andric 27704eeddc0SDimitry Andriclet Predicates = [HasFPUv3_DF] in { 27804eeddc0SDimitry Andricdef f2FDTOS : F2_XZ_P<0b00011, 0b010110, "fdtos", [(set FPR32Op:$vrz, (fpround FPR64Op:$vrx))], (outs FPR32Op:$vrz), 27904eeddc0SDimitry Andric (ins FPR64Op:$vrx)>; 28004eeddc0SDimitry Andricdef f2FSTOD : F2_XZ_P<0b00011, 0b010111, "fstod", [(set FPR64Op:$vrz, (fpextend FPR32Op:$vrx))], (outs FPR64Op:$vrz), 28104eeddc0SDimitry Andric (ins FPR32Op:$vrx)>; 28204eeddc0SDimitry Andric} 28304eeddc0SDimitry Andric 28404eeddc0SDimitry Andric// fsel 28504eeddc0SDimitry Andricdefm f2FSEL: F2_CXYZ_T<0b111001, "fsel">; 28604eeddc0SDimitry Andric 28704eeddc0SDimitry Andricdef f2FINS: F2_XZ_SET<0b00000, FPR32Op, 0b011011, "fins.32">; 28804eeddc0SDimitry Andric 28904eeddc0SDimitry Andricdef : Pat<(f32 fpimm16:$imm),(COPY_TO_REGCLASS (MOVI32 (fpimm32_lo16 fpimm16:$imm)), FPR32)>, 29004eeddc0SDimitry Andric Requires<[HasFPUv3_SF]>; 29104eeddc0SDimitry Andricdef : Pat<(f32 fpimm16_16:$imm), (COPY_TO_REGCLASS (MOVIH32 (fpimm32_hi16 fpimm16_16:$imm)), FPR32)>, 29204eeddc0SDimitry Andric Requires<[HasFPUv3_SF]>; 29304eeddc0SDimitry Andricdef : Pat<(f32 fpimm:$imm),(COPY_TO_REGCLASS (ORI32 (MOVIH32 (fpimm32_hi16 fpimm:$imm)), (fpimm32_lo16 fpimm:$imm)), FPR32)>, 29404eeddc0SDimitry Andric Requires<[HasFPUv3_SF]>; 29504eeddc0SDimitry Andric 29604eeddc0SDimitry Andric 297*5f757f3fSDimitry Andricmulticlass BRCond_Bin_F2<CondCode CC, string Instr, Instruction Br0, Instruction Br1, Instruction MV, bit IsSelectSwap = 0> { 29804eeddc0SDimitry Andric let Predicates = [HasFPUv3_SF] in 29904eeddc0SDimitry Andric def : Pat<(brcond (i32 (setcc FPR32Op:$rs1, FPR32Op:$rs2, CC)), bb:$imm16), 300*5f757f3fSDimitry Andric (Br0 (!cast<Instruction>(Instr#_S) FPR32Op:$rs1, FPR32Op:$rs2), bb:$imm16)>; 301*5f757f3fSDimitry Andric let Predicates = [HasFPUv3_SF] in 302*5f757f3fSDimitry Andric def : Pat<(brcond (xor (i32 (setcc FPR32Op:$rs1, FPR32Op:$rs2, CC)), 1), bb:$imm16), 303*5f757f3fSDimitry Andric (Br1 (!cast<Instruction>(Instr#_S) FPR32Op:$rs1, FPR32Op:$rs2), bb:$imm16)>; 30404eeddc0SDimitry Andric let Predicates = [HasFPUv3_DF] in 30504eeddc0SDimitry Andric def : Pat<(brcond (i32 (setcc FPR64Op:$rs1, FPR64Op:$rs2, CC)), bb:$imm16), 306*5f757f3fSDimitry Andric (Br0 (!cast<Instruction>(Instr#_D) FPR64Op:$rs1, FPR64Op:$rs2), bb:$imm16)>; 307*5f757f3fSDimitry Andric let Predicates = [HasFPUv3_DF] in 308*5f757f3fSDimitry Andric def : Pat<(brcond (xor (i32 (setcc FPR64Op:$rs1, FPR64Op:$rs2, CC)), 1), bb:$imm16), 309*5f757f3fSDimitry Andric (Br1 (!cast<Instruction>(Instr#_D) FPR64Op:$rs1, FPR64Op:$rs2), bb:$imm16)>; 31004eeddc0SDimitry Andric 31104eeddc0SDimitry Andric let Predicates = [HasFPUv3_SF] in 31204eeddc0SDimitry Andric def : Pat<(i32 (setcc FPR32Op:$rs1, FPR32Op:$rs2, CC)), 31304eeddc0SDimitry Andric (MV (!cast<Instruction>(Instr#_S) FPR32Op:$rs1, FPR32Op:$rs2))>; 31404eeddc0SDimitry Andric let Predicates = [HasFPUv3_DF] in 31504eeddc0SDimitry Andric def : Pat<(i32 (setcc FPR64Op:$rs1, FPR64Op:$rs2, CC)), 31604eeddc0SDimitry Andric (MV (!cast<Instruction>(Instr#_D) FPR64Op:$rs1, FPR64Op:$rs2))>; 31704eeddc0SDimitry Andric 31804eeddc0SDimitry Andric let Predicates = [HasFPUv3_SF] in { 31904eeddc0SDimitry Andric def : Pat<(select (i32 (setcc FPR32Op:$rs1, FPR32Op:$rs2, CC)), FPR32Op:$rx, FPR32Op:$false), 32004eeddc0SDimitry Andric !if( 32104eeddc0SDimitry Andric !eq(IsSelectSwap, 0), 32204eeddc0SDimitry Andric (f2FSEL_S (!cast<Instruction>(Instr#_S) FPR32Op:$rs1, FPR32Op:$rs2), FPR32Op:$rx, FPR32Op:$false), 32304eeddc0SDimitry Andric (f2FSEL_S (!cast<Instruction>(Instr#_S) FPR32Op:$rs1, FPR32Op:$rs2), FPR32Op:$false, FPR32Op:$rx) 32404eeddc0SDimitry Andric )>; 32504eeddc0SDimitry Andric } 32604eeddc0SDimitry Andric let Predicates = [HasFPUv3_DF] in { 32704eeddc0SDimitry Andric def : Pat<(select (i32 (setcc FPR64Op:$rs1, FPR64Op:$rs2, CC)), FPR64Op:$rx, FPR64Op:$false), 32804eeddc0SDimitry Andric !if( 32904eeddc0SDimitry Andric !eq(IsSelectSwap, 0), 33004eeddc0SDimitry Andric (f2FSEL_D (!cast<Instruction>(Instr#_D) FPR64Op:$rs1, FPR64Op:$rs2), FPR64Op:$rx, FPR64Op:$false), 33104eeddc0SDimitry Andric (f2FSEL_D (!cast<Instruction>(Instr#_D) FPR64Op:$rs1, FPR64Op:$rs2), FPR64Op:$false, FPR64Op:$rx) 33204eeddc0SDimitry Andric )>; 33304eeddc0SDimitry Andric } 33404eeddc0SDimitry Andric} 33504eeddc0SDimitry Andric 336*5f757f3fSDimitry Andricmulticlass BRCond_Bin_SWAP_F2<CondCode CC, string Instr, Instruction Br0, Instruction Br1, Instruction MV, bit IsSelectSwap = 0> { 33704eeddc0SDimitry Andric let Predicates = [HasFPUv3_SF] in 33804eeddc0SDimitry Andric def : Pat<(brcond (i32 (setcc FPR32Op:$rs1, FPR32Op:$rs2, CC)), bb:$imm16), 339*5f757f3fSDimitry Andric (Br0 (!cast<Instruction>(Instr#_S) FPR32Op:$rs2, FPR32Op:$rs1), bb:$imm16)>; 340*5f757f3fSDimitry Andric let Predicates = [HasFPUv3_SF] in 341*5f757f3fSDimitry Andric def : Pat<(brcond (xor (i32 (setcc FPR32Op:$rs1, FPR32Op:$rs2, CC)), 1), bb:$imm16), 342*5f757f3fSDimitry Andric (Br1 (!cast<Instruction>(Instr#_S) FPR32Op:$rs2, FPR32Op:$rs1), bb:$imm16)>; 34304eeddc0SDimitry Andric let Predicates = [HasFPUv3_DF] in 34404eeddc0SDimitry Andric def : Pat<(brcond (i32 (setcc FPR64Op:$rs1, FPR64Op:$rs2, CC)), bb:$imm16), 345*5f757f3fSDimitry Andric (Br0 (!cast<Instruction>(Instr#_D) FPR64Op:$rs2, FPR64Op:$rs1), bb:$imm16)>; 346*5f757f3fSDimitry Andric let Predicates = [HasFPUv3_DF] in 347*5f757f3fSDimitry Andric def : Pat<(brcond (xor (i32 (setcc FPR64Op:$rs1, FPR64Op:$rs2, CC)), 1), bb:$imm16), 348*5f757f3fSDimitry Andric (Br1 (!cast<Instruction>(Instr#_D) FPR64Op:$rs2, FPR64Op:$rs1), bb:$imm16)>; 34904eeddc0SDimitry Andric 35004eeddc0SDimitry Andric let Predicates = [HasFPUv3_SF] in 35104eeddc0SDimitry Andric def : Pat<(i32 (setcc FPR32Op:$rs1, FPR32Op:$rs2, CC)), 35204eeddc0SDimitry Andric (MV (!cast<Instruction>(Instr#_S) FPR32Op:$rs2, FPR32Op:$rs1))>; 35304eeddc0SDimitry Andric let Predicates = [HasFPUv3_DF] in 35404eeddc0SDimitry Andric def : Pat<(i32 (setcc FPR64Op:$rs1, FPR64Op:$rs2, CC)), 35504eeddc0SDimitry Andric (MV (!cast<Instruction>(Instr#_D) FPR64Op:$rs2, FPR64Op:$rs1))>; 35604eeddc0SDimitry Andric 35704eeddc0SDimitry Andric let Predicates = [HasFPUv3_SF] in { 35804eeddc0SDimitry Andric def : Pat<(select (i32 (setcc FPR32Op:$rs1, FPR32Op:$rs2, CC)), FPR32Op:$rx, FPR32Op:$false), 35904eeddc0SDimitry Andric !if( 36004eeddc0SDimitry Andric !eq(IsSelectSwap, 0), 36104eeddc0SDimitry Andric (f2FSEL_S (!cast<Instruction>(Instr#_S) FPR32Op:$rs2, FPR32Op:$rs1), FPR32Op:$rx, FPR32Op:$false), 36204eeddc0SDimitry Andric (f2FSEL_S (!cast<Instruction>(Instr#_S) FPR32Op:$rs2, FPR32Op:$rs1), FPR32Op:$false, FPR32Op:$rx) 36304eeddc0SDimitry Andric )>; 36404eeddc0SDimitry Andric } 36504eeddc0SDimitry Andric let Predicates = [HasFPUv3_DF] in { 36604eeddc0SDimitry Andric def : Pat<(select (i32 (setcc FPR64Op:$rs1, FPR64Op:$rs2, CC)), FPR64Op:$rx, FPR64Op:$false), 36704eeddc0SDimitry Andric !if( 36804eeddc0SDimitry Andric !eq(IsSelectSwap, 0), 36904eeddc0SDimitry Andric (f2FSEL_D (!cast<Instruction>(Instr#_D) FPR64Op:$rs2, FPR64Op:$rs1), FPR64Op:$rx, FPR64Op:$false), 37004eeddc0SDimitry Andric (f2FSEL_D (!cast<Instruction>(Instr#_D) FPR64Op:$rs2, FPR64Op:$rs1), FPR64Op:$false, FPR64Op:$rx) 37104eeddc0SDimitry Andric )>; 37204eeddc0SDimitry Andric } 37304eeddc0SDimitry Andric} 37404eeddc0SDimitry Andric 37504eeddc0SDimitry Andric// inverse (order && compare) to (unorder || inverse(compare)) 37604eeddc0SDimitry Andric 377*5f757f3fSDimitry Andricdefm : BRCond_Bin_F2<SETUNE, "f2FCMPNE", BT32, BF32, MVC32>; 378*5f757f3fSDimitry Andricdefm : BRCond_Bin_F2<SETOEQ, "f2FCMPNE", BF32, BT32, MVCV32, 1>; 379*5f757f3fSDimitry Andricdefm : BRCond_Bin_F2<SETOGE, "f2FCMPHS", BT32, BF32, MVC32>; 380*5f757f3fSDimitry Andricdefm : BRCond_Bin_F2<SETOLT, "f2FCMPLT", BT32, BF32, MVC32>; 381*5f757f3fSDimitry Andricdefm : BRCond_Bin_F2<SETUO, "f2FCMPUO", BT32, BF32, MVC32>; 382*5f757f3fSDimitry Andricdefm : BRCond_Bin_F2<SETO, "f2FCMPUO", BF32, BT32, MVCV32, 1>; 383*5f757f3fSDimitry Andricdefm : BRCond_Bin_SWAP_F2<SETOGT, "f2FCMPLT", BT32, BF32, MVC32>; 384*5f757f3fSDimitry Andricdefm : BRCond_Bin_SWAP_F2<SETOLE, "f2FCMPHS", BT32, BF32, MVC32>; 38504eeddc0SDimitry Andric 386*5f757f3fSDimitry Andricdefm : BRCond_Bin_F2<SETNE, "f2FCMPNE", BT32, BF32, MVC32>; 387*5f757f3fSDimitry Andricdefm : BRCond_Bin_F2<SETEQ, "f2FCMPNE", BF32, BT32, MVCV32, 1>; 388*5f757f3fSDimitry Andricdefm : BRCond_Bin_F2<SETGE, "f2FCMPHS", BT32, BF32, MVC32>; 389*5f757f3fSDimitry Andricdefm : BRCond_Bin_F2<SETLT, "f2FCMPLT", BT32, BF32, MVC32>; 390*5f757f3fSDimitry Andricdefm : BRCond_Bin_SWAP_F2<SETGT, "f2FCMPLT", BT32, BF32, MVC32>; 391*5f757f3fSDimitry Andricdefm : BRCond_Bin_SWAP_F2<SETLE, "f2FCMPHS", BT32, BF32, MVC32>; 39204eeddc0SDimitry Andric 39304eeddc0SDimitry Andric// ------ 39404eeddc0SDimitry Andric 39504eeddc0SDimitry Andriclet Predicates = [HasFPUv3_SF] in { 39604eeddc0SDimitry Andric def : Pat<(brcond (i32 (setcc FPR32Op:$rs1, fpimm0, SETOGE)), bb:$imm16), 39704eeddc0SDimitry Andric (BT32 (f2FCMPHSZ_S FPR32Op:$rs1), bb:$imm16)>; 39804eeddc0SDimitry Andric def : Pat<(i32 (setcc FPR32Op:$rs1, fpimm0, SETOGE)), 39904eeddc0SDimitry Andric (MVC32 (f2FCMPHSZ_S FPR32Op:$rs1))>; 40004eeddc0SDimitry Andric def : Pat<(select (i32 (setcc FPR32Op:$rs1, fpimm0, SETOGE)), FPR32Op:$rx, FPR32Op:$false), 40104eeddc0SDimitry Andric (f2FSEL_S (f2FCMPHSZ_S FPR32Op:$rs1), FPR32Op:$rx, FPR32Op:$false)>; 40204eeddc0SDimitry Andric def : Pat<(brcond (i32 (setcc FPR32Op:$rs1, fpimm0, SETOLT)), bb:$imm16), 40304eeddc0SDimitry Andric (BT32 (f2FCMPLTZ_S FPR32Op:$rs1), bb:$imm16)>; 40404eeddc0SDimitry Andric def : Pat<(i32 (setcc FPR32Op:$rs1, fpimm0, SETOLT)), 40504eeddc0SDimitry Andric (MVC32 (f2FCMPLTZ_S FPR32Op:$rs1))>; 40604eeddc0SDimitry Andric def : Pat<(select (i32 (setcc FPR32Op:$rs1, fpimm0, SETOLT)), FPR32Op:$rx, FPR32Op:$false), 40704eeddc0SDimitry Andric (f2FSEL_S (f2FCMPLTZ_S FPR32Op:$rs1), FPR32Op:$rx, FPR32Op:$false)>; 40804eeddc0SDimitry Andric def : Pat<(brcond (i32 (setcc FPR32Op:$rs1, fpimm0, SETOLE)), bb:$imm16), 40904eeddc0SDimitry Andric (BT32 (f2FCMPLSZ_S FPR32Op:$rs1), bb:$imm16)>; 41004eeddc0SDimitry Andric def : Pat<(i32 (setcc FPR32Op:$rs1, fpimm0, SETOLE)), 41104eeddc0SDimitry Andric (MVC32 (f2FCMPLSZ_S FPR32Op:$rs1))>; 41204eeddc0SDimitry Andric def : Pat<(select (i32 (setcc FPR32Op:$rs1, fpimm0, SETOLE)), FPR32Op:$rx, FPR32Op:$false), 41304eeddc0SDimitry Andric (f2FSEL_S (f2FCMPLSZ_S FPR32Op:$rs1), FPR32Op:$rx, FPR32Op:$false)>; 41404eeddc0SDimitry Andric def : Pat<(brcond (i32 (setcc FPR32Op:$rs1, fpimm0, SETOGT)), bb:$imm16), 41504eeddc0SDimitry Andric (BT32 (f2FCMPHZ_S FPR32Op:$rs1), bb:$imm16)>; 41604eeddc0SDimitry Andric def : Pat<(i32 (setcc FPR32Op:$rs1, fpimm0, SETOGT)), 41704eeddc0SDimitry Andric (MVC32 (f2FCMPHZ_S FPR32Op:$rs1))>; 41804eeddc0SDimitry Andric def : Pat<(select (i32 (setcc FPR32Op:$rs1, fpimm0, SETOGT)), FPR32Op:$rx, FPR32Op:$false), 41904eeddc0SDimitry Andric (f2FSEL_S (f2FCMPHZ_S FPR32Op:$rs1), FPR32Op:$rx, FPR32Op:$false)>; 42004eeddc0SDimitry Andric def : Pat<(brcond (i32 (setcc FPR32Op:$rs1, fpimm0, SETUNE)), bb:$imm16), 42104eeddc0SDimitry Andric (BT32 (f2FCMPNEZ_S FPR32Op:$rs1), bb:$imm16)>; 42204eeddc0SDimitry Andric def : Pat<(i32 (setcc FPR32Op:$rs1, fpimm0, SETUNE)), 42304eeddc0SDimitry Andric (MVC32 (f2FCMPNEZ_S FPR32Op:$rs1))>; 42404eeddc0SDimitry Andric def : Pat<(select (i32 (setcc FPR32Op:$rs1, fpimm0, SETUNE)), FPR32Op:$rx, FPR32Op:$false), 42504eeddc0SDimitry Andric (f2FSEL_S (f2FCMPNEZ_S FPR32Op:$rs1), FPR32Op:$rx, FPR32Op:$false)>; 42604eeddc0SDimitry Andric def : Pat<(brcond (i32 (setcc FPR32Op:$rs1, fpimm, SETUO)), bb:$imm16), 42704eeddc0SDimitry Andric (BT32 (f2FCMPUOZ_S FPR32Op:$rs1), bb:$imm16)>; 42804eeddc0SDimitry Andric def : Pat<(i32 (setcc FPR32Op:$rs1, fpimm, SETUO)), 42904eeddc0SDimitry Andric (MVC32 (f2FCMPUOZ_S FPR32Op:$rs1))>; 43004eeddc0SDimitry Andric def : Pat<(select (i32 (setcc FPR32Op:$rs1, fpimm, SETUO)), FPR32Op:$rx, FPR32Op:$false), 43104eeddc0SDimitry Andric (f2FSEL_S (f2FCMPUOZ_S FPR32Op:$rs1), FPR32Op:$rx, FPR32Op:$false)>; 43204eeddc0SDimitry Andric def : Pat<(brcond (i32 (setcc FPR32Op:$rs1, fpimm0, SETGE)), bb:$imm16), 43304eeddc0SDimitry Andric (BT32 (f2FCMPHSZ_S FPR32Op:$rs1), bb:$imm16)>; 43404eeddc0SDimitry Andric def : Pat<(i32 (setcc FPR32Op:$rs1, fpimm0, SETGE)), 43504eeddc0SDimitry Andric (MVC32 (f2FCMPHSZ_S FPR32Op:$rs1))>; 43604eeddc0SDimitry Andric def : Pat<(select (i32 (setcc FPR32Op:$rs1, fpimm0, SETGE)), FPR32Op:$rx, FPR32Op:$false), 43704eeddc0SDimitry Andric (f2FSEL_S (f2FCMPHSZ_S FPR32Op:$rs1), FPR32Op:$rx, FPR32Op:$false)>; 43804eeddc0SDimitry Andric def : Pat<(brcond (i32 (setcc FPR32Op:$rs1, fpimm0, SETLT)), bb:$imm16), 43904eeddc0SDimitry Andric (BT32 (f2FCMPLTZ_S FPR32Op:$rs1), bb:$imm16)>; 44004eeddc0SDimitry Andric def : Pat<(i32 (setcc FPR32Op:$rs1, fpimm0, SETLT)), 44104eeddc0SDimitry Andric (MVC32 (f2FCMPLTZ_S FPR32Op:$rs1))>; 44204eeddc0SDimitry Andric def : Pat<(select (i32 (setcc FPR32Op:$rs1, fpimm0, SETLT)), FPR32Op:$rx, FPR32Op:$false), 44304eeddc0SDimitry Andric (f2FSEL_S (f2FCMPLTZ_S FPR32Op:$rs1), FPR32Op:$rx, FPR32Op:$false)>; 44404eeddc0SDimitry Andric def : Pat<(brcond (i32 (setcc FPR32Op:$rs1, fpimm0, SETLE)), bb:$imm16), 44504eeddc0SDimitry Andric (BT32 (f2FCMPLSZ_S FPR32Op:$rs1), bb:$imm16)>; 44604eeddc0SDimitry Andric def : Pat<(i32 (setcc FPR32Op:$rs1, fpimm0, SETLE)), 44704eeddc0SDimitry Andric (MVC32 (f2FCMPLSZ_S FPR32Op:$rs1))>; 44804eeddc0SDimitry Andric def : Pat<(select (i32 (setcc FPR32Op:$rs1, fpimm0, SETLE)), FPR32Op:$rx, FPR32Op:$false), 44904eeddc0SDimitry Andric (f2FSEL_S (f2FCMPLSZ_S FPR32Op:$rs1), FPR32Op:$rx, FPR32Op:$false)>; 45004eeddc0SDimitry Andric def : Pat<(brcond (i32 (setcc FPR32Op:$rs1, fpimm0, SETGT)), bb:$imm16), 45104eeddc0SDimitry Andric (BT32 (f2FCMPHZ_S FPR32Op:$rs1), bb:$imm16)>; 45204eeddc0SDimitry Andric def : Pat<(i32 (setcc FPR32Op:$rs1, fpimm0, SETGT)), 45304eeddc0SDimitry Andric (MVC32 (f2FCMPHZ_S FPR32Op:$rs1))>; 45404eeddc0SDimitry Andric def : Pat<(select (i32 (setcc FPR32Op:$rs1, fpimm0, SETGT)), FPR32Op:$rx, FPR32Op:$false), 45504eeddc0SDimitry Andric (f2FSEL_S (f2FCMPHZ_S FPR32Op:$rs1), FPR32Op:$rx, FPR32Op:$false)>; 45604eeddc0SDimitry Andric 45704eeddc0SDimitry Andric 45804eeddc0SDimitry Andric def : Pat<(brcond (i32 (setcc FPR32Op:$rs1, fpimm, SETO)), bb:$imm16), 45904eeddc0SDimitry Andric (BF32 (f2FCMPUOZ_S FPR32Op:$rs1), bb:$imm16)>; 46004eeddc0SDimitry Andric def : Pat<(i32 (setcc FPR32Op:$rs1, fpimm, SETO)), 46104eeddc0SDimitry Andric (MVCV32 (f2FCMPUOZ_S FPR32Op:$rs1))>; 46204eeddc0SDimitry Andric def : Pat<(select (i32 (setcc FPR32Op:$rs1, fpimm, SETO)), FPR32Op:$rx, FPR32Op:$false), 46304eeddc0SDimitry Andric (f2FSEL_S (f2FCMPUOZ_S FPR32Op:$rs1), FPR32Op:$false, FPR32Op:$rx)>; 46404eeddc0SDimitry Andric def : Pat<(brcond (i32 (setcc FPR32Op:$rs1, fpimm0, SETOEQ)), bb:$imm16), 46504eeddc0SDimitry Andric (BF32 (f2FCMPNEZ_S FPR32Op:$rs1), bb:$imm16)>; 46604eeddc0SDimitry Andric def : Pat<(i32 (setcc FPR32Op:$rs1, fpimm0, SETOEQ)), 46704eeddc0SDimitry Andric (MVCV32 (f2FCMPNEZ_S FPR32Op:$rs1))>; 46804eeddc0SDimitry Andric def : Pat<(select (i32 (setcc FPR32Op:$rs1, fpimm0, SETOEQ)), FPR32Op:$rx, FPR32Op:$false), 46904eeddc0SDimitry Andric (f2FSEL_S (f2FCMPNEZ_S FPR32Op:$rs1), FPR32Op:$false, FPR32Op:$rx)>; 47004eeddc0SDimitry Andric def : Pat<(brcond (i32 (setcc FPR32Op:$rs1, fpimm0, SETEQ)), bb:$imm16), 47104eeddc0SDimitry Andric (BF32 (f2FCMPNEZ_S FPR32Op:$rs1), bb:$imm16)>; 47204eeddc0SDimitry Andric def : Pat<(i32 (setcc FPR32Op:$rs1, fpimm0, SETEQ)), 47304eeddc0SDimitry Andric (MVCV32 (f2FCMPNEZ_S FPR32Op:$rs1))>; 47404eeddc0SDimitry Andric def : Pat<(select (i32 (setcc FPR32Op:$rs1, fpimm0, SETEQ)), FPR32Op:$rx, FPR32Op:$false), 47504eeddc0SDimitry Andric (f2FSEL_S (f2FCMPNEZ_S FPR32Op:$rs1), FPR32Op:$false, FPR32Op:$rx)>; 47604eeddc0SDimitry Andric} 47704eeddc0SDimitry Andric 47804eeddc0SDimitry Andric 47904eeddc0SDimitry Andriclet Predicates = [HasFPUv3_SF] in 48004eeddc0SDimitry Andricdef : Pat<(select CARRY:$ca, FPR32Op:$rx, FPR32Op:$false), 48104eeddc0SDimitry Andric (f2FSEL_S CARRY:$ca, FPR32Op:$rx, FPR32Op:$false)>; 48204eeddc0SDimitry Andriclet Predicates = [HasFPUv3_DF] in 48304eeddc0SDimitry Andricdef : Pat<(select CARRY:$ca, FPR64Op:$rx, FPR64Op:$false), 48404eeddc0SDimitry Andric (f2FSEL_D CARRY:$ca, FPR64Op:$rx, FPR64Op:$false)>; 485