//===-- CellSDKIntrinsics.td - Cell SDK Intrinsics ---------*- tablegen -*-===//
// 
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

///--==-- Arithmetic ops intrinsics --==--
def CellSDKah:
    RR_Int_v8i16<0b00010011000, "ah", IntegerOp, int_spu_si_ah>;
def CellSDKahi:
    RI10_Int_v8i16<0b00010011000, "ahi", IntegerOp, int_spu_si_ahi>;
def CellSDKa:
    RR_Int_v4i32<0b00000011000, "a", IntegerOp, int_spu_si_a>;
def CellSDKai:
    RI10_Int_v4i32<0b00111000, "ai", IntegerOp, int_spu_si_ai>;
def CellSDKsfh:
    RR_Int_v8i16<0b00010010000, "sfh", IntegerOp, int_spu_si_sfh>;
def CellSDKsfhi:
    RI10_Int_v8i16<0b10110000, "sfhi", IntegerOp, int_spu_si_sfhi>;
def CellSDKsf:
    RR_Int_v4i32<0b00000010000, "sf", IntegerOp, int_spu_si_sf>;
def CellSDKsfi:
    RI10_Int_v4i32<0b00110000, "sfi", IntegerOp, int_spu_si_sfi>;
def CellSDKaddx:
    RR_Int_v4i32<0b00000010110, "addx", IntegerOp, int_spu_si_addx>;
def CellSDKcg:
    RR_Int_v4i32<0b0100001100, "cg", IntegerOp, int_spu_si_cg>;
def CellSDKcgx:
    RR_Int_v4i32<0b01000010110, "cgx", IntegerOp, int_spu_si_cgx>;
def CellSDKsfx:
    RR_Int_v4i32<0b10000010110, "sfx", IntegerOp, int_spu_si_sfx>;
def CellSDKbg:
    RR_Int_v4i32<0b01000010000, "bg", IntegerOp, int_spu_si_bg>;
def CellSDKbgx:
    RR_Int_v4i32<0b11000010110, "bgx", IntegerOp, int_spu_si_bgx>;

def CellSDKmpy:
    RRForm<0b00100011110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
      "mpy $rT, $rA, $rB", IntegerMulDiv,
      [(set (v4i32 VECREG:$rT), (int_spu_si_mpy (v8i16 VECREG:$rA),
                                                (v8i16 VECREG:$rB)))]>;

def CellSDKmpyu:
    RRForm<0b00110011110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
      "mpyu $rT, $rA, $rB", IntegerMulDiv,
      [(set (v4i32 VECREG:$rT), (int_spu_si_mpyu (v8i16 VECREG:$rA),
                                                 (v8i16 VECREG:$rB)))] >;

def CellSDKmpyi:
    RI10Form<0b00101110, (outs VECREG:$rT), (ins VECREG:$rA, s10imm:$val),
      "mpyi $rT, $rA, $val", IntegerMulDiv,
      [(set (v4i32 VECREG:$rT), (int_spu_si_mpyi (v8i16 VECREG:$rA),
                                                 i16ImmSExt10:$val))]>;

def CellSDKmpyui:
    RI10Form<0b10101110, (outs VECREG:$rT), (ins VECREG:$rA, s10imm:$val),
      "mpyui $rT, $rA, $val", IntegerMulDiv,
      [(set (v4i32 VECREG:$rT), (int_spu_si_mpyui (v8i16 VECREG:$rA),
                                                  i16ImmSExt10:$val))]>;

def CellSDKmpya:
    RRRForm<0b0011, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB, VECREG:$rC),
      "mpya $rT, $rA, $rB, $rC", IntegerMulDiv,
      [(set (v4i32 VECREG:$rT), (int_spu_si_mpya (v8i16 VECREG:$rA),
                                                 (v8i16 VECREG:$rB),
                                                 (v8i16 VECREG:$rC)))]>;

def CellSDKmpyh:
    RRForm<0b10100011110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
      "mpyh $rT, $rA, $rB", IntegerMulDiv,
      [(set (v4i32 VECREG:$rT), (int_spu_si_mpyh (v4i32 VECREG:$rA),
                                                 (v8i16 VECREG:$rB)))]>;

def CellSDKmpys:
    RRForm<0b11100011110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
      "mpys $rT, $rA, $rB", IntegerMulDiv,
      [(set (v4i32 VECREG:$rT), (int_spu_si_mpys (v8i16 VECREG:$rA),
                                                 (v8i16 VECREG:$rB)))]>;

def CellSDKmpyhh:
    RRForm<0b01100011110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
      "mpyhh $rT, $rA, $rB", IntegerMulDiv,
      [(set (v4i32 VECREG:$rT), (int_spu_si_mpyhh (v8i16 VECREG:$rA),
                                                  (v8i16 VECREG:$rB)))]>;

def CellSDKmpyhha:
    RRForm<0b01100010110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
      "mpyhha $rT, $rA, $rB", IntegerMulDiv,
      [(set (v4i32 VECREG:$rT), (int_spu_si_mpyhha (v8i16 VECREG:$rA),
                                                   (v8i16 VECREG:$rB)))]>;

// Not sure how to match a (set $rT, (add $rT (mpyhh $rA, $rB)))... so leave
// as an intrinsic for the time being
def CellSDKmpyhhu:
    RRForm<0b01110011110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
      "mpyhhu $rT, $rA, $rB", IntegerMulDiv,
      [(set (v4i32 VECREG:$rT), (int_spu_si_mpyhhu (v8i16 VECREG:$rA),
                                                   (v8i16 VECREG:$rB)))]>;

def CellSDKmpyhhau:
    RRForm<0b01110010110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
      "mpyhhau $rT, $rA, $rB", IntegerMulDiv,
      [(set (v4i32 VECREG:$rT), (int_spu_si_mpyhhau (v8i16 VECREG:$rA),
                                                    (v8i16 VECREG:$rB)))]>;

def CellSDKand:
        RRForm<0b1000011000, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
          "and\t $rT, $rA, $rB", IntegerOp,
          [(set (v4i32 VECREG:$rT),
                (int_spu_si_and (v4i32 VECREG:$rA), (v4i32 VECREG:$rB)))]>;

def CellSDKandc:
        RRForm<0b10000011010, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
          "andc\t $rT, $rA, $rB", IntegerOp,
          [(set (v4i32 VECREG:$rT),
                (int_spu_si_andc (v4i32 VECREG:$rA), (v4i32 VECREG:$rB)))]>;

def CellSDKandbi:
     RI10Form<0b01101000, (outs VECREG:$rT), (ins VECREG:$rA, u10imm_i8:$val),
       "andbi\t $rT, $rA, $val", BranchResolv,
       [(set (v16i8 VECREG:$rT),
             (int_spu_si_andbi (v16i8 VECREG:$rA), immU8:$val))]>;

def CellSDKandhi:
     RI10Form<0b10101000, (outs VECREG:$rT), (ins VECREG:$rA, s10imm:$val),
           "andhi\t $rT, $rA, $val", BranchResolv,
       [(set (v8i16 VECREG:$rT),
             (int_spu_si_andhi (v8i16 VECREG:$rA), i16ImmSExt10:$val))]>;

def CellSDKandi:
     RI10Form<0b00101000, (outs VECREG:$rT), (ins VECREG:$rA, s10imm:$val),
           "andi\t $rT, $rA, $val", BranchResolv,
       [(set (v4i32 VECREG:$rT),
             (int_spu_si_andi (v4i32 VECREG:$rA), i32ImmSExt10:$val))]>;

def CellSDKor:
        RRForm<0b10000010000, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
          "or\t $rT, $rA, $rB", IntegerOp,
          [(set (v4i32 VECREG:$rT),
                (int_spu_si_or (v4i32 VECREG:$rA), (v4i32 VECREG:$rB)))]>;

def CellSDKorc:
        RRForm<0b10010011010, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
          "addc\t $rT, $rA, $rB", IntegerOp,
          [(set (v4i32 VECREG:$rT),
                (int_spu_si_orc (v4i32 VECREG:$rA), (v4i32 VECREG:$rB)))]>;

def CellSDKorbi:
     RI10Form<0b01100000, (outs VECREG:$rT), (ins VECREG:$rA, u10imm_i8:$val),
       "orbi\t $rT, $rA, $val", BranchResolv,
       [(set (v16i8 VECREG:$rT),
             (int_spu_si_orbi (v16i8 VECREG:$rA), immU8:$val))]>;

def CellSDKorhi:
     RI10Form<0b10100000, (outs VECREG:$rT), (ins VECREG:$rA, s10imm:$val),
           "orhi\t $rT, $rA, $val", BranchResolv,
       [(set (v8i16 VECREG:$rT),
             (int_spu_si_orhi (v8i16 VECREG:$rA), i16ImmSExt10:$val))]>;

def CellSDKori:
     RI10Form<0b00100000, (outs VECREG:$rT), (ins VECREG:$rA, s10imm:$val),
           "ori\t $rT, $rA, $val", BranchResolv,
       [(set (v4i32 VECREG:$rT),
             (int_spu_si_ori (v4i32 VECREG:$rA), i32ImmSExt10:$val))]>;

def CellSDKxor:
        RRForm<0b10000010000, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
          "xor\t $rT, $rA, $rB", IntegerOp,
          [(set (v4i32 VECREG:$rT), 
                (int_spu_si_xor (v4i32 VECREG:$rA), (v4i32 VECREG:$rB)))]>;

def CellSDKxorbi:
     RI10Form<0b01100000, (outs VECREG:$rT), (ins VECREG:$rA, u10imm_i8:$val),
       "xorbi\t $rT, $rA, $val", BranchResolv,
       [(set (v16i8 VECREG:$rT), (int_spu_si_xorbi (v16i8 VECREG:$rA), immU8:$val))]>;

def CellSDKxorhi:
     RI10Form<0b10100000, (outs VECREG:$rT), (ins VECREG:$rA, s10imm:$val),
       "xorhi\t $rT, $rA, $val", BranchResolv,
       [(set (v8i16 VECREG:$rT), 
             (int_spu_si_xorhi (v8i16 VECREG:$rA), i16ImmSExt10:$val))]>;

def CellSDKxori:
     RI10Form<0b00100000, (outs VECREG:$rT), (ins VECREG:$rA, s10imm:$val),
           "xori\t $rT, $rA, $val", BranchResolv,
       [(set (v4i32 VECREG:$rT), 
             (int_spu_si_xori (v4i32 VECREG:$rA), i32ImmSExt10:$val))]>;

def CellSDKnor:
        RRForm<0b10000010000, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
          "nor\t $rT, $rA, $rB", IntegerOp,
          [(set (v4i32 VECREG:$rT), 
                (int_spu_si_nor (v4i32 VECREG:$rA), (v4i32 VECREG:$rB)))]>;

def CellSDKnand:
        RRForm<0b10000010000, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
          "nand\t $rT, $rA, $rB", IntegerOp,
          [(set (v4i32 VECREG:$rT), 
                (int_spu_si_nand (v4i32 VECREG:$rA), (v4i32 VECREG:$rB)))]>;

//===----------------------------------------------------------------------===//
// Shift/rotate intrinsics:
//===----------------------------------------------------------------------===//

def CellSDKshli:
  Pat<(int_spu_si_shli (v4i32 VECREG:$rA), uimm7:$val),
      (SHLIv4i32 VECREG:$rA, uimm7:$val)>;

def CellSDKshlqbi:
  Pat<(int_spu_si_shlqbi VECREG:$rA, R32C:$rB),
      (SHLQBIv16i8 VECREG:$rA, R32C:$rB)>;

def CellSDKshlqii:
  Pat<(int_spu_si_shlqbii VECREG:$rA, uimm7:$val),
      (SHLQBIIv16i8 VECREG:$rA, uimm7:$val)>;

def CellSDKshlqby:
  Pat<(int_spu_si_shlqby VECREG:$rA, R32C:$rB),
      (SHLQBYv16i8 VECREG:$rA, R32C:$rB)>;

def CellSDKshlqbyi:
  Pat<(int_spu_si_shlqbyi VECREG:$rA, uimm7:$val),
      (SHLQBYIv16i8 VECREG:$rA, uimm7:$val)>;
          
//===----------------------------------------------------------------------===//
// Branch/compare intrinsics:
//===----------------------------------------------------------------------===//

def CellSDKceq:
  RRForm<0b00000011110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
        "ceq\t $rT, $rA, $rB", BranchResolv,
        [(set (v4i32 VECREG:$rT), 
              (int_spu_si_ceq (v4i32 VECREG:$rA), (v4i32 VECREG:$rB)))]>;

def CellSDKceqi:
  RI10Form<0b00111110, (outs VECREG:$rT), (ins VECREG:$rA, s10imm:$val),
        "ceqi\t $rT, $rA, $val", BranchResolv,
    [(set (v4i32 VECREG:$rT), 
          (int_spu_si_ceqi (v4i32 VECREG:$rA), i32ImmSExt10:$val))]>;

def CellSDKceqb:
  RRForm<0b00001011110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
        "ceqb\t $rT, $rA, $rB", BranchResolv,
        [(set (v16i8 VECREG:$rT), 
              (int_spu_si_ceqb (v16i8 VECREG:$rA), (v16i8 VECREG:$rB)))]>;

def CellSDKceqbi:
  RI10Form<0b01111110, (outs VECREG:$rT), (ins VECREG:$rA, u10imm_i8:$val),
        "ceqbi\t $rT, $rA, $val", BranchResolv,
    [(set (v16i8 VECREG:$rT), (int_spu_si_ceqbi (v16i8 VECREG:$rA), immU8:$val))]>;

def CellSDKceqh:
  RRForm<0b00010011110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
        "ceqh\t $rT, $rA, $rB", BranchResolv,
        [(set (v8i16 VECREG:$rT), 
              (int_spu_si_ceqh (v8i16 VECREG:$rA), (v8i16 VECREG:$rB)))]>;

def CellSDKceqhi:
  RI10Form<0b10111110, (outs VECREG:$rT), (ins VECREG:$rA, s10imm:$val),
        "ceqhi\t $rT, $rA, $val", BranchResolv,
    [(set (v8i16 VECREG:$rT), 
          (int_spu_si_ceqhi (v8i16 VECREG:$rA), i16ImmSExt10:$val))]>;
def CellSDKcgth:
  RRForm<0b00010011110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "cgth\t $rT, $rA, $rB", BranchResolv,
        [(set (v8i16 VECREG:$rT),
              (int_spu_si_cgth (v8i16 VECREG:$rA), (v8i16 VECREG:$rB)))]>;

def CellSDKcgthi:
  RI10Form<0b10111110, (outs VECREG:$rT), (ins VECREG:$rA, s10imm:$val),
    "cgthi\t $rT, $rA, $val", BranchResolv,
        [(set (v8i16 VECREG:$rT), 
              (int_spu_si_cgthi (v8i16 VECREG:$rA), i16ImmSExt10:$val))]>;

def CellSDKcgt:
  RRForm<0b00000010010, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "cgt\t $rT, $rA, $rB", BranchResolv,
        [(set (v4i32 VECREG:$rT), 
              (int_spu_si_cgt (v4i32 VECREG:$rA), (v4i32 VECREG:$rB)))]>;

def CellSDKcgti:
  RI10Form<0b00110010, (outs VECREG:$rT), (ins VECREG:$rA, s10imm:$val),
    "cgti\t $rT, $rA, $val", BranchResolv,
        [(set (v4i32 VECREG:$rT), 
              (int_spu_si_cgti (v4i32 VECREG:$rA), i32ImmSExt10:$val))]>;

def CellSDKcgtb:
  RRForm<0b00001010010, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "cgtb\t $rT, $rA, $rB", BranchResolv,
        [(set (v16i8 VECREG:$rT), 
              (int_spu_si_cgtb (v16i8 VECREG:$rA), (v16i8 VECREG:$rB)))]>;

def CellSDKcgtbi:
  RI10Form<0b01110010, (outs VECREG:$rT), (ins VECREG:$rA, u10imm_i8:$val),
    "cgtbi\t $rT, $rA, $val", BranchResolv,
        [(set (v16i8 VECREG:$rT), (int_spu_si_cgtbi (v16i8 VECREG:$rA), immU8:$val))]>;

def CellSDKclgth:
  RRForm<0b00010011010, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "clgth\t $rT, $rA, $rB", BranchResolv,
        [(set (v8i16 VECREG:$rT), 
              (int_spu_si_clgth (v8i16 VECREG:$rA), (v8i16 VECREG:$rB)))]>;

def CellSDKclgthi:
  RI10Form<0b10111010, (outs VECREG:$rT), (ins VECREG:$rA, s10imm:$val),
    "clgthi\t $rT, $rA, $val", BranchResolv,
        [(set (v8i16 VECREG:$rT), 
              (int_spu_si_clgthi (v8i16 VECREG:$rA), i16ImmSExt10:$val))]>;

def CellSDKclgt:
  RRForm<0b00000011010, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "clgt\t $rT, $rA, $rB", BranchResolv,
        [(set (v4i32 VECREG:$rT), 
              (int_spu_si_clgt (v4i32 VECREG:$rA), (v4i32 VECREG:$rB)))]>;

def CellSDKclgti:
  RI10Form<0b00111010, (outs VECREG:$rT), (ins VECREG:$rA, s10imm:$val),
    "clgti\t $rT, $rA, $val", BranchResolv,
        [(set (v4i32 VECREG:$rT), 
              (int_spu_si_clgti (v4i32 VECREG:$rA), i32ImmSExt10:$val))]>;

def CellSDKclgtb:
  RRForm<0b00001011010, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "clgtb\t $rT, $rA, $rB", BranchResolv,
    [(set (v16i8 VECREG:$rT),
          (int_spu_si_clgtb (v16i8 VECREG:$rA), (v16i8 VECREG:$rB)))]>;

def CellSDKclgtbi:
  RI10Form<0b01111010, (outs VECREG:$rT), (ins VECREG:$rA, u10imm_i8:$val),
    "clgtbi\t $rT, $rA, $val", BranchResolv,
    [(set (v16i8 VECREG:$rT),
          (int_spu_si_clgtbi (v16i8 VECREG:$rA), immU8:$val))]>;

//===----------------------------------------------------------------------===//
// Floating-point intrinsics:
//===----------------------------------------------------------------------===//

def CellSDKfa:
  RRForm<0b00100011010, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "fa\t $rT, $rA, $rB", SPrecFP,
        [(set (v4f32 VECREG:$rT), (int_spu_si_fa (v4f32 VECREG:$rA),
                                                 (v4f32 VECREG:$rB)))]>;

def CellSDKfs:
  RRForm<0b10100011010, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "fs\t $rT, $rA, $rB", SPrecFP,
        [(set (v4f32 VECREG:$rT), (int_spu_si_fs (v4f32 VECREG:$rA),
                                                 (v4f32 VECREG:$rB)))]>;

def CellSDKfm:
  RRForm<0b01100011010, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "fm\t $rT, $rA, $rB", SPrecFP,
        [(set (v4f32 VECREG:$rT), (int_spu_si_fm (v4f32 VECREG:$rA),
                                                 (v4f32 VECREG:$rB)))]>;

def CellSDKfceq:
  RRForm<0b01000011110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "fceq\t $rT, $rA, $rB", SPrecFP,
        [(set (v4f32 VECREG:$rT), (int_spu_si_fceq (v4f32 VECREG:$rA),
                                                   (v4f32 VECREG:$rB)))]>;

def CellSDKfcgt:
  RRForm<0b01000011010, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "fcgt\t $rT, $rA, $rB", SPrecFP,
        [(set (v4f32 VECREG:$rT), (int_spu_si_fcgt (v4f32 VECREG:$rA),
                                                   (v4f32 VECREG:$rB)))]>;

def CellSDKfcmeq:
  RRForm<0b01010011110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "fcmeq\t $rT, $rA, $rB", SPrecFP,
        [(set (v4f32 VECREG:$rT), (int_spu_si_fcmeq (v4f32 VECREG:$rA),
                                                    (v4f32 VECREG:$rB)))]>;

def CellSDKfcmgt:
  RRForm<0b01010011010, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "fcmgt\t $rT, $rA, $rB", SPrecFP,
        [(set (v4f32 VECREG:$rT), (int_spu_si_fcmgt (v4f32 VECREG:$rA),
                                                    (v4f32 VECREG:$rB)))]>;

def CellSDKfma:
  RRRForm<0b0111, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB, VECREG:$rC),
    "fma\t $rT, $rA, $rB, $rC", SPrecFP,
        [(set (v4f32 VECREG:$rT), (int_spu_si_fma (v4f32 VECREG:$rA),
                                                  (v4f32 VECREG:$rB),
                                                  (v4f32 VECREG:$rC)))]>;

def CellSDKfnms:
  RRRForm<0b1011, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB, VECREG:$rC),
    "fnms\t $rT, $rA, $rB, $rC", SPrecFP,
        [(set (v4f32 VECREG:$rT), (int_spu_si_fnms (v4f32 VECREG:$rA),
                                                   (v4f32 VECREG:$rB),
                                                   (v4f32 VECREG:$rC)))]>;

def CellSDKfms:
  RRRForm<0b1111, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB, VECREG:$rC),
    "fms\t $rT, $rA, $rB, $rC", SPrecFP,
        [(set (v4f32 VECREG:$rT), (int_spu_si_fms (v4f32 VECREG:$rA),
                                                  (v4f32 VECREG:$rB),
                                                  (v4f32 VECREG:$rC)))]>;

//===----------------------------------------------------------------------===//
// Double precision floating-point intrinsics:
//===----------------------------------------------------------------------===//

def CellSDKdfa:
  RRForm<0b00110011010, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "dfa\t $rT, $rA, $rB", DPrecFP,
        [(set (v2f64 VECREG:$rT), (int_spu_si_dfa (v2f64 VECREG:$rA),
                                                  (v2f64 VECREG:$rB)))]>;

def CellSDKdfs:
  RRForm<0b10110011010, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "dfs\t $rT, $rA, $rB", DPrecFP,
        [(set (v2f64 VECREG:$rT), (int_spu_si_dfs (v2f64 VECREG:$rA),
                                                  (v2f64 VECREG:$rB)))]>;

def CellSDKdfm:
  RRForm<0b01110011010, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "dfm\t $rT, $rA, $rB", DPrecFP,
        [(set (v2f64 VECREG:$rT), (int_spu_si_dfm (v2f64 VECREG:$rA),
                                                  (v2f64 VECREG:$rB)))]>;

def CellSDKdfma:
  RRForm<0b00111010110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "dfma\t $rT, $rA, $rB", DPrecFP,
        [(set (v2f64 VECREG:$rT), (int_spu_si_dfma (v2f64 VECREG:$rA),
                                                   (v2f64 VECREG:$rB)))]>;

def CellSDKdfnma:
  RRForm<0b11111010110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "dfnma\t $rT, $rA, $rB", DPrecFP,
        [(set (v2f64 VECREG:$rT), (int_spu_si_dfnma (v2f64 VECREG:$rA),
                                                    (v2f64 VECREG:$rB)))]>;

def CellSDKdfnms:
  RRForm<0b01111010110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "dfnms\t $rT, $rA, $rB", DPrecFP,
        [(set (v2f64 VECREG:$rT), (int_spu_si_dfnms (v2f64 VECREG:$rA),
                                                    (v2f64 VECREG:$rB)))]>;

def CellSDKdfms:
  RRForm<0b10111010110, (outs VECREG:$rT), (ins VECREG:$rA, VECREG:$rB),
    "dfms\t $rT, $rA, $rB", DPrecFP,
        [(set (v2f64 VECREG:$rT), (int_spu_si_dfms (v2f64 VECREG:$rA),
                                                   (v2f64 VECREG:$rB)))]>;
