xref: /freebsd/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYInstrInfoF2.td (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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