|  | //==- IntrinsicsCellSPU.td - Cell SDK intrinsics           -*- tablegen -*-==// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // Department at The Aerospace Corporation and is distributed under the | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // Cell SPU Instructions: | 
|  | //===----------------------------------------------------------------------===// | 
|  | // TODO Items (not urgent today, but would be nice, low priority) | 
|  | // | 
|  | // ANDBI, ORBI: SPU constructs a 4-byte constant for these instructions by | 
|  | // concatenating the byte argument b as "bbbb". Could recognize this bit pattern | 
|  | // in 16-bit and 32-bit constants and reduce instruction count. | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | // 7-bit integer type, used as an immediate: | 
|  | def cell_i7_ty: LLVMType<i8>; | 
|  | def cell_i8_ty: LLVMType<i8>; | 
|  |  | 
|  | // Keep this here until it's actually supported: | 
|  | def llvm_i128_ty : LLVMType<i128>; | 
|  |  | 
|  | class v16i8_u7imm<string builtin_suffix> : | 
|  | GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>, | 
|  | Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, cell_i7_ty], | 
|  | [IntrNoMem]>; | 
|  |  | 
|  | class v16i8_u8imm<string builtin_suffix> : | 
|  | GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>, | 
|  | Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_i8_ty], | 
|  | [IntrNoMem]>; | 
|  |  | 
|  | class v16i8_s10imm<string builtin_suffix> : | 
|  | GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>, | 
|  | Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_i16_ty], | 
|  | [IntrNoMem]>; | 
|  |  | 
|  | class v16i8_u16imm<string builtin_suffix> : | 
|  | GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>, | 
|  | Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_i16_ty], | 
|  | [IntrNoMem]>; | 
|  |  | 
|  | class v16i8_rr<string builtin_suffix> : | 
|  | GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>, | 
|  | Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty], | 
|  | [IntrNoMem]>; | 
|  |  | 
|  | class v8i16_s10imm<string builtin_suffix> : | 
|  | GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>, | 
|  | Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_i16_ty], | 
|  | [IntrNoMem]>; | 
|  |  | 
|  | class v8i16_u16imm<string builtin_suffix> : | 
|  | GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>, | 
|  | Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_i16_ty], | 
|  | [IntrNoMem]>; | 
|  |  | 
|  | class v8i16_rr<string builtin_suffix> : | 
|  | GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>, | 
|  | Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty], | 
|  | [IntrNoMem]>; | 
|  |  | 
|  | class v4i32_rr<string builtin_suffix> : | 
|  | GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>, | 
|  | Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], | 
|  | [IntrNoMem]>; | 
|  |  | 
|  | class v4i32_u7imm<string builtin_suffix> : | 
|  | GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>, | 
|  | Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, cell_i7_ty], | 
|  | [IntrNoMem]>; | 
|  |  | 
|  | class v4i32_s10imm<string builtin_suffix> : | 
|  | GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>, | 
|  | Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_i16_ty], | 
|  | [IntrNoMem]>; | 
|  |  | 
|  | class v4i32_u16imm<string builtin_suffix> : | 
|  | GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>, | 
|  | Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_i16_ty], | 
|  | [IntrNoMem]>; | 
|  |  | 
|  | class v4f32_rr<string builtin_suffix> : | 
|  | GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>, | 
|  | Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty], | 
|  | [IntrNoMem]>; | 
|  |  | 
|  | class v4f32_rrr<string builtin_suffix> : | 
|  | GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>, | 
|  | Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty], | 
|  | [IntrNoMem]>; | 
|  |  | 
|  | class v2f64_rr<string builtin_suffix> : | 
|  | GCCBuiltin<!strconcat("__builtin_si_", builtin_suffix)>, | 
|  | Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty], | 
|  | [IntrNoMem]>; | 
|  |  | 
|  | // All Cell SPU intrinsics start with "llvm.spu.". | 
|  | let TargetPrefix = "spu" in { | 
|  | def int_spu_si_fsmbi  : v8i16_u16imm<"fsmbi">; | 
|  | def int_spu_si_ah     : v8i16_rr<"ah">; | 
|  | def int_spu_si_ahi    : v8i16_s10imm<"ahi">; | 
|  | def int_spu_si_a      : v4i32_rr<"a">; | 
|  | def int_spu_si_ai     : v4i32_s10imm<"ai">; | 
|  | def int_spu_si_sfh    : v8i16_rr<"sfh">; | 
|  | def int_spu_si_sfhi   : v8i16_s10imm<"sfhi">; | 
|  | def int_spu_si_sf     : v4i32_rr<"sf">; | 
|  | def int_spu_si_sfi    : v4i32_s10imm<"sfi">; | 
|  | def int_spu_si_addx   : v4i32_rr<"addx">; | 
|  | def int_spu_si_cg     : v4i32_rr<"cg">; | 
|  | def int_spu_si_cgx    : v4i32_rr<"cgx">; | 
|  | def int_spu_si_sfx    : v4i32_rr<"sfx">; | 
|  | def int_spu_si_bg     : v4i32_rr<"bg">; | 
|  | def int_spu_si_bgx    : v4i32_rr<"bgx">; | 
|  | def int_spu_si_mpy    : // This is special: | 
|  | GCCBuiltin<"__builtin_si_mpy">, | 
|  | Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty], | 
|  | [IntrNoMem]>; | 
|  | def int_spu_si_mpyu   : // This is special: | 
|  | GCCBuiltin<"__builtin_si_mpyu">, | 
|  | Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty], | 
|  | [IntrNoMem]>; | 
|  | def int_spu_si_mpyi   : // This is special: | 
|  | GCCBuiltin<"__builtin_si_mpyi">, | 
|  | Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_i16_ty], | 
|  | [IntrNoMem]>; | 
|  | def int_spu_si_mpyui  : // This is special: | 
|  | GCCBuiltin<"__builtin_si_mpyui">, | 
|  | Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_i16_ty], | 
|  | [IntrNoMem]>; | 
|  | def int_spu_si_mpya   : // This is special: | 
|  | GCCBuiltin<"__builtin_si_mpya">, | 
|  | Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v8i16_ty], | 
|  | [IntrNoMem]>; | 
|  | def int_spu_si_mpyh   : // This is special: | 
|  | GCCBuiltin<"__builtin_si_mpyh">, | 
|  | Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v8i16_ty], | 
|  | [IntrNoMem]>; | 
|  | def int_spu_si_mpys   : // This is special: | 
|  | GCCBuiltin<"__builtin_si_mpys">, | 
|  | Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty], | 
|  | [IntrNoMem]>; | 
|  | def int_spu_si_mpyhh  : // This is special: | 
|  | GCCBuiltin<"__builtin_si_mpyhh">, | 
|  | Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty], | 
|  | [IntrNoMem]>; | 
|  | def int_spu_si_mpyhha : // This is special: | 
|  | GCCBuiltin<"__builtin_si_mpyhha">, | 
|  | Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty], | 
|  | [IntrNoMem]>; | 
|  | def int_spu_si_mpyhhu : // This is special: | 
|  | GCCBuiltin<"__builtin_si_mpyhhu">, | 
|  | Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty], | 
|  | [IntrNoMem]>; | 
|  | def int_spu_si_mpyhhau : // This is special: | 
|  | GCCBuiltin<"__builtin_si_mpyhhau">, | 
|  | Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty], | 
|  | [IntrNoMem]>; | 
|  |  | 
|  | def int_spu_si_shli:          v4i32_u7imm<"shli">; | 
|  |  | 
|  | def int_spu_si_shlqbi: | 
|  | GCCBuiltin<!strconcat("__builtin_si_", "shlqbi")>, | 
|  | Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_i32_ty], | 
|  | [IntrNoMem]>; | 
|  |  | 
|  | def int_spu_si_shlqbii:       v16i8_u7imm<"shlqbii">; | 
|  | def int_spu_si_shlqby: | 
|  | GCCBuiltin<!strconcat("__builtin_si_", "shlqby")>, | 
|  | Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_i32_ty], | 
|  | [IntrNoMem]>; | 
|  | def int_spu_si_shlqbyi:       v16i8_u7imm<"shlqbyi">; | 
|  |  | 
|  | def int_spu_si_ceq:           v4i32_rr<"ceq">; | 
|  | def int_spu_si_ceqi:          v4i32_s10imm<"ceqi">; | 
|  | def int_spu_si_ceqb:          v16i8_rr<"ceqb">; | 
|  | def int_spu_si_ceqbi:         v16i8_u8imm<"ceqbi">; | 
|  | def int_spu_si_ceqh:          v8i16_rr<"ceqh">; | 
|  | def int_spu_si_ceqhi:         v8i16_s10imm<"ceqhi">; | 
|  | def int_spu_si_cgt:           v4i32_rr<"cgt">; | 
|  | def int_spu_si_cgti:          v4i32_s10imm<"cgti">; | 
|  | def int_spu_si_cgtb:          v16i8_rr<"cgtb">; | 
|  | def int_spu_si_cgtbi:         v16i8_u8imm<"cgtbi">; | 
|  | def int_spu_si_cgth:          v8i16_rr<"cgth">; | 
|  | def int_spu_si_cgthi:         v8i16_s10imm<"cgthi">; | 
|  | def int_spu_si_clgtb:         v16i8_rr<"clgtb">; | 
|  | def int_spu_si_clgtbi:        v16i8_u8imm<"clgtbi">; | 
|  | def int_spu_si_clgth:         v8i16_rr<"clgth">; | 
|  | def int_spu_si_clgthi:        v8i16_s10imm<"clgthi">; | 
|  | def int_spu_si_clgt:          v4i32_rr<"clgt">; | 
|  | def int_spu_si_clgti:         v4i32_s10imm<"clgti">; | 
|  |  | 
|  | def int_spu_si_and:           v4i32_rr<"and">; | 
|  | def int_spu_si_andbi:         v16i8_u8imm<"andbi">; | 
|  | def int_spu_si_andc:          v4i32_rr<"andc">; | 
|  | def int_spu_si_andhi:         v8i16_s10imm<"andhi">; | 
|  | def int_spu_si_andi:          v4i32_s10imm<"andi">; | 
|  |  | 
|  | def int_spu_si_or:            v4i32_rr<"or">; | 
|  | def int_spu_si_orbi:          v16i8_u8imm<"orbi">; | 
|  | def int_spu_si_orc:           v4i32_rr<"orc">; | 
|  | def int_spu_si_orhi:          v8i16_s10imm<"orhi">; | 
|  | def int_spu_si_ori:           v4i32_s10imm<"ori">; | 
|  |  | 
|  | def int_spu_si_xor:           v4i32_rr<"xor">; | 
|  | def int_spu_si_xorbi:         v16i8_u8imm<"xorbi">; | 
|  | def int_spu_si_xorhi:         v8i16_s10imm<"xorhi">; | 
|  | def int_spu_si_xori:          v4i32_s10imm<"xori">; | 
|  |  | 
|  | def int_spu_si_nor:           v4i32_rr<"nor">; | 
|  | def int_spu_si_nand:          v4i32_rr<"nand">; | 
|  |  | 
|  | def int_spu_si_fa:            v4f32_rr<"fa">; | 
|  | def int_spu_si_fs:            v4f32_rr<"fs">; | 
|  | def int_spu_si_fm:            v4f32_rr<"fm">; | 
|  |  | 
|  | def int_spu_si_fceq:          v4f32_rr<"fceq">; | 
|  | def int_spu_si_fcmeq:         v4f32_rr<"fcmeq">; | 
|  | def int_spu_si_fcgt:          v4f32_rr<"fcgt">; | 
|  | def int_spu_si_fcmgt:         v4f32_rr<"fcmgt">; | 
|  |  | 
|  | def int_spu_si_fma:           v4f32_rrr<"fma">; | 
|  | def int_spu_si_fnms:          v4f32_rrr<"fnms">; | 
|  | def int_spu_si_fms:           v4f32_rrr<"fms">; | 
|  |  | 
|  | def int_spu_si_dfa:           v2f64_rr<"dfa">; | 
|  | def int_spu_si_dfs:           v2f64_rr<"dfs">; | 
|  | def int_spu_si_dfm:           v2f64_rr<"dfm">; | 
|  |  | 
|  | //def int_spu_si_dfceq:         v2f64_rr<"dfceq">; | 
|  | //def int_spu_si_dfcmeq:        v2f64_rr<"dfcmeq">; | 
|  | //def int_spu_si_dfcgt:         v2f64_rr<"dfcgt">; | 
|  | //def int_spu_si_dfcmgt:        v2f64_rr<"dfcmgt">; | 
|  |  | 
|  | def int_spu_si_dfnma:         v2f64_rr<"dfnma">; | 
|  | def int_spu_si_dfma:          v2f64_rr<"dfma">; | 
|  | def int_spu_si_dfnms:         v2f64_rr<"dfnms">; | 
|  | def int_spu_si_dfms:          v2f64_rr<"dfms">; | 
|  | } |