For PR950:
[oota-llvm.git] / include / llvm / Intrinsics.td
index cceabf70b4916d55ac6db5a0cd520a56d7850a0a..3169c22a057a2ce01b9c94d2c2e1ec0a4edd2247 100644 (file)
@@ -11,6 +11,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+include "llvm/CodeGen/ValueTypes.td"
+
 //===----------------------------------------------------------------------===//
 //  Properties we keep track of for intrinsics.
 //===----------------------------------------------------------------------===//
@@ -22,24 +24,24 @@ class IntrinsicProperty;
 // if correct) to the least aggressive.  If no property is set, the worst case 
 // is assumed (IntrWriteMem).
 
-// InstrNoMem - The intrinsic does not access memory or have any other side
+// IntrNoMem - The intrinsic does not access memory or have any other side
 // effects.  It may be CSE'd deleted if dead, etc.
-def InstrNoMem : IntrinsicProperty;
+def IntrNoMem : IntrinsicProperty;
 
-// InstrReadArgMem - This intrinsic reads only from memory that one of its
+// IntrReadArgMem - This intrinsic reads only from memory that one of its
 // arguments points to, but may read an unspecified amount.
-def InstrReadArgMem : IntrinsicProperty;
+def IntrReadArgMem : IntrinsicProperty;
 
 // IntrReadMem - This intrinsic reads from unspecified memory, so it cannot be
 // moved across stores.  However, it can be reordered otherwise and can be
 // deleted if dead.
 def IntrReadMem : IntrinsicProperty;
 
-// InstrWriteArgMem - This intrinsic reads and writes only from memory that one
+// IntrWriteArgMem - This intrinsic reads and writes only from memory that one
 // of its arguments points to, but may access an unspecified amount.  It has no
 // other side effects.  This may only be used if the intrinsic doesn't "capture"
 // the argument pointer (e.g. storing it someplace).
-def InstrWriteArgMem : IntrinsicProperty;
+def IntrWriteArgMem : IntrinsicProperty;
 
 // IntrWriteMem - This intrinsic may read or modify unspecified memory or has 
 // other side effects.  It cannot be modified by the optimizer.  This is the
@@ -50,34 +52,41 @@ def IntrWriteMem : IntrinsicProperty;
 // Types used by intrinsics.
 //===----------------------------------------------------------------------===//
 
-class LLVMType<string typeval> {
+class LLVMType<ValueType vt, string typeval> {
+  ValueType VT = vt;
   string TypeVal = typeval;
 }
 
-class LLVMPackedType<int numelts, LLVMType elty> : LLVMType<"Type::PackedTyID">{
+class LLVMPackedType<ValueType VT, int numelts, LLVMType elty>
+  : LLVMType<VT, "Type::PackedTyID">{
   int NumElts = numelts;
   LLVMType ElTy = elty;
 } 
 
-def llvm_void_ty       : LLVMType<"Type::VoidTyID">;
-def llvm_bool_ty       : LLVMType<"Type::BoolTyID">;
-def llvm_sbyte_ty      : LLVMType<"Type::SByteTyID">;
-def llvm_short_ty      : LLVMType<"Type::ShortTyID">;
-def llvm_int_ty        : LLVMType<"Type::IntTyID">;
-def llvm_long_ty       : LLVMType<"Type::LongTyID">;
-def llvm_ubyte_ty      : LLVMType<"Type::UByteTyID">;
-def llvm_ushort_ty     : LLVMType<"Type::UShortTyID">;
-def llvm_uint_ty       : LLVMType<"Type::UIntTyID">;
-def llvm_ulong_ty      : LLVMType<"Type::ULongTyID">;
-def llvm_float_ty      : LLVMType<"Type::FloatTyID">;
-def llvm_double_ty     : LLVMType<"Type::DoubleTyID">;
-def llvm_ptr_ty        : LLVMType<"Type::PointerTyID">;     // sbyte*
-def llvm_ptrptr_ty     : LLVMType<"Type::PointerTyID">;     // sbyte**
-def llvm_descriptor_ty : LLVMType<"Type::PointerTyID">;     // global*
-
-def llvm_v4i32_ty      : LLVMPackedType<4, llvm_int_ty>;    // 4 x int
-def llvm_v4f32_ty      : LLVMPackedType<4, llvm_float_ty>;  // 4 x float
-def llvm_v2f64_ty      : LLVMPackedType<2, llvm_double_ty>; // 2 x double
+def llvm_void_ty       : LLVMType<isVoid, "Type::VoidTyID">;
+def llvm_bool_ty       : LLVMType<i1 , "Type::BoolTyID">;
+def llvm_sbyte_ty      : LLVMType<i8 , "Type::SByteTyID">;
+def llvm_short_ty      : LLVMType<i16, "Type::ShortTyID">;
+def llvm_int_ty        : LLVMType<i32, "Type::IntTyID">;
+def llvm_long_ty       : LLVMType<i64, "Type::LongTyID">;
+def llvm_ubyte_ty      : LLVMType<i8,  "Type::UByteTyID">;
+def llvm_ushort_ty     : LLVMType<i16, "Type::UShortTyID">;
+def llvm_uint_ty       : LLVMType<i32, "Type::UIntTyID">;
+def llvm_ulong_ty      : LLVMType<i64, "Type::ULongTyID">;
+def llvm_float_ty      : LLVMType<f32, "Type::FloatTyID">;
+def llvm_double_ty     : LLVMType<f64, "Type::DoubleTyID">;
+def llvm_ptr_ty        : LLVMType<iPTR, "Type::PointerTyID">;     // sbyte*
+def llvm_ptrptr_ty     : LLVMType<iPTR, "Type::PointerTyID">;     // sbyte**
+def llvm_descriptor_ty : LLVMType<iPTR, "Type::PointerTyID">;     // global*
+
+def llvm_v16i8_ty      : LLVMPackedType<v16i8,16, llvm_sbyte_ty>;  // 16 x sbyte
+def llvm_v8i16_ty      : LLVMPackedType<v8i16, 8, llvm_short_ty>;  // 8 x short
+
+def llvm_v2i64_ty      : LLVMPackedType<v2i64, 2, llvm_long_ty>;   // 2 x long
+def llvm_v2i32_ty      : LLVMPackedType<v2i32, 2, llvm_int_ty>;    // 2 x int
+def llvm_v4i32_ty      : LLVMPackedType<v4i32, 4, llvm_int_ty>;    // 4 x int
+def llvm_v4f32_ty      : LLVMPackedType<v4f32, 4, llvm_float_ty>;  // 4 x float
+def llvm_v2f64_ty      : LLVMPackedType<v2f64, 2, llvm_double_ty>; // 2 x double
 
 //===----------------------------------------------------------------------===//
 // Intrinsic Definitions.
@@ -121,14 +130,14 @@ def int_vaend   : Intrinsic<[llvm_void_ty, llvm_ptrptr_ty], [], "llvm.va_end">;
 //  
 def int_gcroot  : Intrinsic<[llvm_void_ty, llvm_ptrptr_ty, llvm_ptr_ty]>;
 def int_gcread  : Intrinsic<[llvm_ptr_ty, llvm_ptr_ty, llvm_ptrptr_ty],
-                            [InstrReadArgMem]>;
+                            [IntrReadArgMem]>;
 def int_gcwrite : Intrinsic<[llvm_void_ty, llvm_ptr_ty, llvm_ptr_ty,
-                             llvm_ptrptr_ty], [InstrWriteArgMem]>;
+                             llvm_ptrptr_ty], [IntrWriteArgMem]>;
 
 //===--------------------- Code Generator Intrinsics ----------------------===//
 //  
-def int_returnaddress : Intrinsic<[llvm_ptr_ty, llvm_uint_ty], [InstrNoMem]>;
-def int_frameaddress  : Intrinsic<[llvm_ptr_ty, llvm_uint_ty], [InstrNoMem]>;
+def int_returnaddress : Intrinsic<[llvm_ptr_ty, llvm_uint_ty], [IntrNoMem]>;
+def int_frameaddress  : Intrinsic<[llvm_ptr_ty, llvm_uint_ty], [IntrNoMem]>;
 def int_stacksave     : Intrinsic<[llvm_ptr_ty], [IntrReadMem]>;
 def int_stackrestore  : Intrinsic<[llvm_void_ty, llvm_ptr_ty]>;
 def int_prefetch      : Intrinsic<[llvm_void_ty, llvm_ptr_ty, 
@@ -140,7 +149,7 @@ def int_readcyclecounter : Intrinsic<[llvm_ulong_ty]>;
 //===------------------- Standard C Library Intrinsics --------------------===//
 //
 
-let Properties = [InstrWriteArgMem] in {
+let Properties = [IntrWriteArgMem] in {
   def int_memcpy_i32  : Intrinsic<[llvm_void_ty, llvm_ptr_ty, llvm_ptr_ty,
                                    llvm_uint_ty, llvm_uint_ty]>;
   def int_memcpy_i64  : Intrinsic<[llvm_void_ty, llvm_ptr_ty, llvm_ptr_ty,
@@ -155,26 +164,29 @@ let Properties = [InstrWriteArgMem] in {
                                    llvm_ulong_ty, llvm_uint_ty]>;
 }
 
-let Properties = [InstrNoMem] in {
+let Properties = [IntrNoMem] in {
   def int_isunordered_f32 : Intrinsic<[llvm_bool_ty, 
                                        llvm_float_ty,  llvm_float_ty]>;
   def int_isunordered_f64 : Intrinsic<[llvm_bool_ty, 
                                        llvm_double_ty, llvm_double_ty]>;
   def int_sqrt_f32 : Intrinsic<[llvm_float_ty , llvm_float_ty]>;
   def int_sqrt_f64 : Intrinsic<[llvm_double_ty, llvm_double_ty]>;
+
+  def int_powi_f32 : Intrinsic<[llvm_float_ty , llvm_float_ty, llvm_int_ty]>;
+  def int_powi_f64 : Intrinsic<[llvm_double_ty, llvm_double_ty, llvm_int_ty]>;
 }
 
 // NOTE: these are internal interfaces.
 def int_setjmp     : Intrinsic<[llvm_int_ty , llvm_ptr_ty]>;
 def int_longjmp    : Intrinsic<[llvm_void_ty, llvm_ptr_ty, llvm_int_ty]>;
-def int_sigsetjmp  : Intrinsic<[llvm_int_ty , llvm_ptr_ty]>;
+def int_sigsetjmp  : Intrinsic<[llvm_int_ty , llvm_ptr_ty, llvm_int_ty]>;
 def int_siglongjmp : Intrinsic<[llvm_void_ty, llvm_ptr_ty, llvm_int_ty]>;
 
 //===-------------------- Bit Manipulation Intrinsics ---------------------===//
 //
 
 // None of these intrinsics accesses memory at all.
-let Properties = [InstrNoMem] in {
+let Properties = [IntrNoMem] in {
   def int_bswap_i16 : Intrinsic<[llvm_ushort_ty, llvm_ushort_ty]>;
   def int_bswap_i32 : Intrinsic<[llvm_uint_ty,   llvm_uint_ty]>;
   def int_bswap_i64 : Intrinsic<[llvm_ulong_ty,  llvm_ulong_ty]>;
@@ -211,40 +223,5 @@ def int_dbg_declare      : Intrinsic<[llvm_void_ty, llvm_ptr_ty,
 // Target-specific intrinsics
 //===----------------------------------------------------------------------===//
 
-//===----------------------------------------------------------------------===//
-// PowerPC Intrinsics
-//
-let TargetPrefix = "ppc" in {  // All intrinsics start with "llvm.ppc.".
-  def int_ppc_altivec_lvx : GCCBuiltin<"__builtin_altivec_lvx">,
-              Intrinsic<[llvm_v4i32_ty, llvm_int_ty, llvm_ptr_ty],
-                        [IntrReadMem]>;
-  def int_ppc_altivec_stvx : GCCBuiltin<"__builtin_altivec_stvx">,
-              Intrinsic<[llvm_void_ty, llvm_v4i32_ty, llvm_int_ty, llvm_ptr_ty],
-                        [IntrWriteMem]>;
-                            
-  def int_ppc_altivec_vmaddfp : GCCBuiltin<"__builtin_altivec_vmaddfp">,
-              Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty,
-                         llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>;
-  def int_ppc_altivec_vadduwm : GCCBuiltin<"__builtin_altivec_vadduwm">,
-              Intrinsic<[llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
-                        [InstrNoMem]>;
-  
-}
-
-
-//===----------------------------------------------------------------------===//
-// X86 Intrinsics
-//
-
-// SSE1
-
-let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
-  def int_x86_sse_movmskps : GCCBuiltin<"__builtin_ia32_movmskps">,
-              Intrinsic<[llvm_int_ty, llvm_v4f32_ty], [InstrNoMem]>;
-}
-
-// SSE2
-let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
-  def int_x86_sse2_movmskpd : GCCBuiltin<"__builtin_ia32_movmskpd">,
-              Intrinsic<[llvm_int_ty, llvm_v2f64_ty], [InstrNoMem]>;
-}
\ No newline at end of file
+include "llvm/IntrinsicsPowerPC.td"
+include "llvm/IntrinsicsX86.td"