-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
+class LLVMPointerType<LLVMType elty>
+ : LLVMType<iPTR, "Type::PointerTyID">{
+ LLVMType ElTy = elty;
+}
+
+class LLVMEmptyStructType
+ : LLVMType<OtherVT, "Type::StructTyID">{
+}
+
+def llvm_void_ty : LLVMType<isVoid, "Type::VoidTyID">;
+def llvm_int_ty : LLVMIntegerType<iAny, 0>;
+def llvm_i1_ty : LLVMIntegerType<i1 , 1>;
+def llvm_i8_ty : LLVMIntegerType<i8 , 8>;
+def llvm_i16_ty : LLVMIntegerType<i16, 16>;
+def llvm_i32_ty : LLVMIntegerType<i32, 32>;
+def llvm_i64_ty : LLVMIntegerType<i64, 64>;
+def llvm_float_ty : LLVMType<f32, "Type::FloatTyID">;
+def llvm_double_ty : LLVMType<f64, "Type::DoubleTyID">;
+def llvm_ptr_ty : LLVMPointerType<llvm_i8_ty>; // i8*
+def llvm_ptrptr_ty : LLVMPointerType<llvm_ptr_ty>; // i8**
+def llvm_empty_ty : LLVMEmptyStructType; // { }
+def llvm_descriptor_ty : LLVMPointerType<llvm_empty_ty>; // { }*
+
+def llvm_v16i8_ty : LLVMVectorType<v16i8,16, llvm_i8_ty>; // 16 x i8
+def llvm_v8i16_ty : LLVMVectorType<v8i16, 8, llvm_i16_ty>; // 8 x i16
+def llvm_v2i64_ty : LLVMVectorType<v2i64, 2, llvm_i64_ty>; // 2 x i64
+def llvm_v2i32_ty : LLVMVectorType<v2i32, 2, llvm_i32_ty>; // 2 x i32
+def llvm_v1i64_ty : LLVMVectorType<v1i64, 1, llvm_i64_ty>; // 1 x i64
+def llvm_v4i32_ty : LLVMVectorType<v4i32, 4, llvm_i32_ty>; // 4 x i32
+def llvm_v4f32_ty : LLVMVectorType<v4f32, 4, llvm_float_ty>; // 4 x float
+def llvm_v2f64_ty : LLVMVectorType<v2f64, 2, llvm_double_ty>;// 2 x double
+
+// MMX Vector Types
+def llvm_v8i8_ty : LLVMVectorType<v8i8, 8, llvm_i8_ty>; // 8 x i8
+def llvm_v4i16_ty : LLVMVectorType<v4i16, 4, llvm_i16_ty>; // 4 x i16
+
+def llvm_vararg_ty : LLVMType<isVoid, "...">; // vararg