Home | History | Annotate | Download | only in llvm
      1 //==- IntrinsicsCellSPU.td - Cell SDK intrinsics           -*- tablegen -*-==//
      2 // 
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // Department at The Aerospace Corporation and is distributed under the
      7 // License. See LICENSE.TXT for details.
      8 // 
      9 //===----------------------------------------------------------------------===//
     10 // Cell SPU Instructions:
     11 //===----------------------------------------------------------------------===//
     12 // TODO Items (not urgent today, but would be nice, low priority)
     13 //
     14 // ANDBI, ORBI: SPU constructs a 4-byte constant for these instructions by
     15 // concatenating the byte argument b as "bbbb". Could recognize this bit pattern
     16 // in 16-bit and 32-bit constants and reduce instruction count.
     17 //===----------------------------------------------------------------------===//
     18 
     19 // 7-bit integer type, used as an immediate:
     20 def cell_i7_ty: LLVMType<i8>;
     21 def cell_i8_ty: LLVMType<i8>;
     22 
     23 // Keep this here until it's actually supported:
     24 def llvm_i128_ty : LLVMType<i128>;
     25 
     26 class v16i8_u7imm<string builtin_suffix> :
     27   GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>,
     28   Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, cell_i7_ty],
     29             [IntrNoMem]>;
     30 
     31 class v16i8_u8imm<string builtin_suffix> :
     32   GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>,
     33   Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_i8_ty],
     34             [IntrNoMem]>;
     35 
     36 class v16i8_s10imm<string builtin_suffix> :
     37   GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>,
     38   Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_i16_ty],
     39             [IntrNoMem]>;
     40 
     41 class v16i8_u16imm<string builtin_suffix> :
     42   GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>,
     43   Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_i16_ty],
     44             [IntrNoMem]>;
     45 
     46 class v16i8_rr<string builtin_suffix> :
     47   GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>,
     48   Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
     49             [IntrNoMem]>;
     50 
     51 class v8i16_s10imm<string builtin_suffix> :
     52   GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>,
     53   Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_i16_ty],
     54             [IntrNoMem]>;
     55 
     56 class v8i16_u16imm<string builtin_suffix> :
     57   GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>,
     58   Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_i16_ty],
     59             [IntrNoMem]>;
     60 
     61 class v8i16_rr<string builtin_suffix> :
     62   GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>,
     63   Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
     64             [IntrNoMem]>;
     65 
     66 class v4i32_rr<string builtin_suffix> :
     67   GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>,
     68   Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
     69             [IntrNoMem]>;
     70 
     71 class v4i32_u7imm<string builtin_suffix> :
     72   GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>,
     73   Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, cell_i7_ty],
     74             [IntrNoMem]>;
     75 
     76 class v4i32_s10imm<string builtin_suffix> :
     77   GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>,
     78   Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_i16_ty],
     79             [IntrNoMem]>;
     80 
     81 class v4i32_u16imm<string builtin_suffix> :
     82   GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>,
     83   Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_i16_ty],
     84             [IntrNoMem]>;
     85 
     86 class v4f32_rr<string builtin_suffix> :
     87   GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>,
     88   Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty],
     89             [IntrNoMem]>;
     90 
     91 class v4f32_rrr<string builtin_suffix> :
     92   GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>,
     93   Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
     94             [IntrNoMem]>;
     95 
     96 class v2f64_rr<string builtin_suffix> :
     97   GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>,
     98   Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty],
     99             [IntrNoMem]>;
    100 
    101 // All Cell SPU intrinsics start with "llvm.spu.".
    102 let TargetPrefix = "spu" in {
    103   def int_spu_si_fsmbi  : v8i16_u16imm<"fsmbi">;
    104   def int_spu_si_ah     : v8i16_rr<"ah">;
    105   def int_spu_si_ahi    : v8i16_s10imm<"ahi">;
    106   def int_spu_si_a      : v4i32_rr<"a">;
    107   def int_spu_si_ai     : v4i32_s10imm<"ai">;
    108   def int_spu_si_sfh    : v8i16_rr<"sfh">;
    109   def int_spu_si_sfhi   : v8i16_s10imm<"sfhi">;
    110   def int_spu_si_sf     : v4i32_rr<"sf">;
    111   def int_spu_si_sfi    : v4i32_s10imm<"sfi">;
    112   def int_spu_si_addx   : v4i32_rr<"addx">;
    113   def int_spu_si_cg     : v4i32_rr<"cg">;
    114   def int_spu_si_cgx    : v4i32_rr<"cgx">;
    115   def int_spu_si_sfx    : v4i32_rr<"sfx">;
    116   def int_spu_si_bg     : v4i32_rr<"bg">;
    117   def int_spu_si_bgx    : v4i32_rr<"bgx">;
    118   def int_spu_si_mpy    : // This is special:
    119     GCCBuiltin<"__builtin_si_mpy">,
    120     Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
    121               [IntrNoMem]>;
    122   def int_spu_si_mpyu   : // This is special:
    123     GCCBuiltin<"__builtin_si_mpyu">,
    124     Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
    125               [IntrNoMem]>;
    126   def int_spu_si_mpyi   : // This is special:
    127     GCCBuiltin<"__builtin_si_mpyi">,
    128     Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_i16_ty],
    129               [IntrNoMem]>;
    130   def int_spu_si_mpyui  : // This is special:
    131     GCCBuiltin<"__builtin_si_mpyui">,
    132     Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_i16_ty],
    133               [IntrNoMem]>;
    134   def int_spu_si_mpya   : // This is special:
    135     GCCBuiltin<"__builtin_si_mpya">,
    136     Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v8i16_ty],
    137               [IntrNoMem]>;
    138   def int_spu_si_mpyh   : // This is special:
    139     GCCBuiltin<"__builtin_si_mpyh">,
    140     Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v8i16_ty],
    141               [IntrNoMem]>;
    142   def int_spu_si_mpys   : // This is special:
    143     GCCBuiltin<"__builtin_si_mpys">,
    144     Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
    145               [IntrNoMem]>;
    146   def int_spu_si_mpyhh  : // This is special:
    147     GCCBuiltin<"__builtin_si_mpyhh">,
    148     Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
    149               [IntrNoMem]>;
    150   def int_spu_si_mpyhha : // This is special:
    151     GCCBuiltin<"__builtin_si_mpyhha">,
    152     Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
    153               [IntrNoMem]>;
    154   def int_spu_si_mpyhhu : // This is special:
    155     GCCBuiltin<"__builtin_si_mpyhhu">,
    156     Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
    157               [IntrNoMem]>;
    158   def int_spu_si_mpyhhau : // This is special:
    159     GCCBuiltin<"__builtin_si_mpyhhau">,
    160     Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
    161               [IntrNoMem]>;
    162 
    163   def int_spu_si_shli:          v4i32_u7imm<"shli">;
    164 
    165   def int_spu_si_shlqbi:
    166     GCCBuiltin<!strconcat("__builtin_si_", "shlqbi")>,
    167     Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_i32_ty],
    168               [IntrNoMem]>;
    169 
    170   def int_spu_si_shlqbii:       v16i8_u7imm<"shlqbii">;
    171   def int_spu_si_shlqby:
    172     GCCBuiltin<!strconcat("__builtin_si_", "shlqby")>,
    173     Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_i32_ty],
    174               [IntrNoMem]>;
    175   def int_spu_si_shlqbyi:       v16i8_u7imm<"shlqbyi">;
    176   
    177   def int_spu_si_ceq:           v4i32_rr<"ceq">;
    178   def int_spu_si_ceqi:          v4i32_s10imm<"ceqi">;
    179   def int_spu_si_ceqb:          v16i8_rr<"ceqb">;
    180   def int_spu_si_ceqbi:         v16i8_u8imm<"ceqbi">;
    181   def int_spu_si_ceqh:          v8i16_rr<"ceqh">;
    182   def int_spu_si_ceqhi:         v8i16_s10imm<"ceqhi">;
    183   def int_spu_si_cgt:           v4i32_rr<"cgt">;
    184   def int_spu_si_cgti:          v4i32_s10imm<"cgti">;
    185   def int_spu_si_cgtb:          v16i8_rr<"cgtb">;
    186   def int_spu_si_cgtbi:         v16i8_u8imm<"cgtbi">;
    187   def int_spu_si_cgth:          v8i16_rr<"cgth">;
    188   def int_spu_si_cgthi:         v8i16_s10imm<"cgthi">;
    189   def int_spu_si_clgtb:         v16i8_rr<"clgtb">;
    190   def int_spu_si_clgtbi:        v16i8_u8imm<"clgtbi">;
    191   def int_spu_si_clgth:         v8i16_rr<"clgth">;
    192   def int_spu_si_clgthi:        v8i16_s10imm<"clgthi">;
    193   def int_spu_si_clgt:          v4i32_rr<"clgt">;
    194   def int_spu_si_clgti:         v4i32_s10imm<"clgti">;
    195   
    196   def int_spu_si_and:           v4i32_rr<"and">;
    197   def int_spu_si_andbi:         v16i8_u8imm<"andbi">;
    198   def int_spu_si_andc:          v4i32_rr<"andc">;
    199   def int_spu_si_andhi:         v8i16_s10imm<"andhi">;
    200   def int_spu_si_andi:          v4i32_s10imm<"andi">;
    201   
    202   def int_spu_si_or:            v4i32_rr<"or">;
    203   def int_spu_si_orbi:          v16i8_u8imm<"orbi">;
    204   def int_spu_si_orc:           v4i32_rr<"orc">;
    205   def int_spu_si_orhi:          v8i16_s10imm<"orhi">;
    206   def int_spu_si_ori:           v4i32_s10imm<"ori">;
    207   
    208   def int_spu_si_xor:           v4i32_rr<"xor">;
    209   def int_spu_si_xorbi:         v16i8_u8imm<"xorbi">;
    210   def int_spu_si_xorhi:         v8i16_s10imm<"xorhi">;
    211   def int_spu_si_xori:          v4i32_s10imm<"xori">;
    212 
    213   def int_spu_si_nor:           v4i32_rr<"nor">;
    214   def int_spu_si_nand:          v4i32_rr<"nand">;
    215   
    216   def int_spu_si_fa:            v4f32_rr<"fa">;
    217   def int_spu_si_fs:            v4f32_rr<"fs">;
    218   def int_spu_si_fm:            v4f32_rr<"fm">;
    219   
    220   def int_spu_si_fceq:          v4f32_rr<"fceq">;
    221   def int_spu_si_fcmeq:         v4f32_rr<"fcmeq">;
    222   def int_spu_si_fcgt:          v4f32_rr<"fcgt">;
    223   def int_spu_si_fcmgt:         v4f32_rr<"fcmgt">;
    224   
    225   def int_spu_si_fma:           v4f32_rrr<"fma">;
    226   def int_spu_si_fnms:          v4f32_rrr<"fnms">;
    227   def int_spu_si_fms:           v4f32_rrr<"fms">;
    228 
    229   def int_spu_si_dfa:           v2f64_rr<"dfa">;
    230   def int_spu_si_dfs:           v2f64_rr<"dfs">;
    231   def int_spu_si_dfm:           v2f64_rr<"dfm">;
    232   
    233 //def int_spu_si_dfceq:         v2f64_rr<"dfceq">;
    234 //def int_spu_si_dfcmeq:        v2f64_rr<"dfcmeq">;
    235 //def int_spu_si_dfcgt:         v2f64_rr<"dfcgt">;
    236 //def int_spu_si_dfcmgt:        v2f64_rr<"dfcmgt">;
    237   
    238   def int_spu_si_dfnma:         v2f64_rr<"dfnma">;
    239   def int_spu_si_dfma:          v2f64_rr<"dfma">;
    240   def int_spu_si_dfnms:         v2f64_rr<"dfnms">;
    241   def int_spu_si_dfms:          v2f64_rr<"dfms">;
    242 }
    243