Implememting named register intrinsics
[oota-llvm.git] / include / llvm / IR / IntrinsicsAArch64.td
index 37abbe7db8ae5c651ac7d83323928d2fca79f02e..61c0e5d419f4b13810b4dbecc370bb9a591c37d4 100644 (file)
@@ -68,7 +68,7 @@ class Neon_N3V_Intrinsic
               [IntrNoMem]>;
 class Neon_N2V_Narrow_Intrinsic
   : Intrinsic<[llvm_anyvector_ty],
-              [LLVMExtendedElementVectorType<0>, llvm_i32_ty],
+              [LLVMExtendedType<0>, llvm_i32_ty],
               [IntrNoMem]>;
 
 // Vector rounding shift right by immediate (Signed)
@@ -98,30 +98,34 @@ def int_aarch64_neon_umaxv  : Neon_Across_Intrinsic;
 def int_aarch64_neon_sminv  : Neon_Across_Intrinsic;
 def int_aarch64_neon_uminv  : Neon_Across_Intrinsic;
 def int_aarch64_neon_vaddv  : Neon_Across_Intrinsic;
-def int_aarch64_neon_vmaxv  : Neon_Across_Intrinsic;
-def int_aarch64_neon_vminv  : Neon_Across_Intrinsic;
-def int_aarch64_neon_vmaxnmv : Neon_Across_Intrinsic;
-def int_aarch64_neon_vminnmv : Neon_Across_Intrinsic;
+def int_aarch64_neon_vmaxv :
+  Intrinsic<[llvm_float_ty], [llvm_v4f32_ty], [IntrNoMem]>;
+def int_aarch64_neon_vminv :
+  Intrinsic<[llvm_float_ty], [llvm_v4f32_ty], [IntrNoMem]>;
+def int_aarch64_neon_vmaxnmv :
+  Intrinsic<[llvm_float_ty], [llvm_v4f32_ty], [IntrNoMem]>;
+def int_aarch64_neon_vminnmv :
+  Intrinsic<[llvm_float_ty], [llvm_v4f32_ty], [IntrNoMem]>;
 
 // Vector Table Lookup.
 def int_aarch64_neon_vtbl1 :
   Intrinsic<[llvm_anyvector_ty],
-            [llvm_anyvector_ty, LLVMMatchType<0>], [IntrNoMem]>;
+            [llvm_v16i8_ty, LLVMMatchType<0>], [IntrNoMem]>;
 
 def int_aarch64_neon_vtbl2 :
   Intrinsic<[llvm_anyvector_ty],
-            [llvm_anyvector_ty, LLVMMatchType<1>, LLVMMatchType<0>],
+            [llvm_v16i8_ty, llvm_v16i8_ty, LLVMMatchType<0>],
             [IntrNoMem]>;
 
 def int_aarch64_neon_vtbl3 :
   Intrinsic<[llvm_anyvector_ty],
-            [llvm_anyvector_ty, LLVMMatchType<1>, LLVMMatchType<1>,
+            [llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty,
             LLVMMatchType<0>], [IntrNoMem]>;
 
 def int_aarch64_neon_vtbl4 :
   Intrinsic<[llvm_anyvector_ty],
-            [llvm_anyvector_ty, LLVMMatchType<1>, LLVMMatchType<1>,
-            LLVMMatchType<1>, LLVMMatchType<0>], [IntrNoMem]>;
+            [llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty,
+            llvm_v16i8_ty, LLVMMatchType<0>], [IntrNoMem]>;
 
 // Vector Table Extension.
 // Some elements of the destination vector may not be updated, so the original
@@ -129,23 +133,23 @@ def int_aarch64_neon_vtbl4 :
 // arguments after that are the table.
 def int_aarch64_neon_vtbx1 :
   Intrinsic<[llvm_anyvector_ty],
-            [LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<0>],
+            [LLVMMatchType<0>, llvm_v16i8_ty, LLVMMatchType<0>],
             [IntrNoMem]>;
 
 def int_aarch64_neon_vtbx2 :
   Intrinsic<[llvm_anyvector_ty],
-            [LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<1>,
-            LLVMMatchType<0>], [IntrNoMem]>;
+            [LLVMMatchType<0>, llvm_v16i8_ty, llvm_v16i8_ty,
+             LLVMMatchType<0>], [IntrNoMem]>;
 
 def int_aarch64_neon_vtbx3 :
   Intrinsic<[llvm_anyvector_ty],
-            [LLVMMatchType<0>, llvm_anyvector_ty, LLVMMatchType<1>,
-            LLVMMatchType<1>, LLVMMatchType<0>], [IntrNoMem]>;
+            [LLVMMatchType<0>, llvm_v16i8_ty, llvm_v16i8_ty,
+             llvm_v16i8_ty, LLVMMatchType<0>], [IntrNoMem]>;
 
 def int_aarch64_neon_vtbx4 :
   Intrinsic<[llvm_anyvector_ty],
-            [LLVMMatchType<0>, llvm_anyvector_ty,  LLVMMatchType<1>,
-            LLVMMatchType<1>,  LLVMMatchType<1>, LLVMMatchType<0>],
+            [LLVMMatchType<0>, llvm_v16i8_ty, llvm_v16i8_ty,
+             llvm_v16i8_ty, llvm_v16i8_ty, LLVMMatchType<0>],
             [IntrNoMem]>;
 
 // Vector Load/store
@@ -260,38 +264,72 @@ def int_aarch64_neon_fcvtzs :
 def int_aarch64_neon_fcvtzu :
   Intrinsic<[llvm_anyvector_ty], [llvm_anyfloat_ty], [IntrNoMem]>;
 
+// Scalar Floating-point Reciprocal Estimate.
+def int_aarch64_neon_vrecpe :
+  Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>], [IntrNoMem]>;
+
 // Scalar Floating-point Reciprocal Exponent
-def int_aarch64_neon_vrecpx : Neon_1Arg_Intrinsic;
+def int_aarch64_neon_vrecpx :
+  Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>], [IntrNoMem]>;
 
-class Neon_Cmp_Intrinsic
-  : Intrinsic<[llvm_anyvector_ty], [llvm_anyvector_ty, llvm_anyvector_ty],
-              [IntrNoMem]>;
+// Scalar Floating-point Reciprocal Square Root Estimate
+def int_aarch64_neon_vrsqrte :
+  Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>], [IntrNoMem]>;
+
+// Scalar Floating-point Reciprocal Step
+def int_aarch64_neon_vrecps :
+  Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>, LLVMMatchType<0>],
+            [IntrNoMem]>;
+
+// Scalar Floating-point Reciprocal Square Root Step
+def int_aarch64_neon_vrsqrts :
+  Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>, LLVMMatchType<0>],
+            [IntrNoMem]>;
+
+// Compare with vector operands.
+class Neon_Cmp_Intrinsic :
+  Intrinsic<[llvm_anyvector_ty], [llvm_anyvector_ty, llvm_anyvector_ty],
+            [IntrNoMem]>;
+
+// Floating-point compare with scalar operands.
+class Neon_Float_Cmp_Intrinsic :
+  Intrinsic<[llvm_anyvector_ty], [llvm_anyfloat_ty, llvm_anyfloat_ty],
+            [IntrNoMem]>;
 
 // Scalar Compare Equal
 def int_aarch64_neon_vceq : Neon_Cmp_Intrinsic;
+def int_aarch64_neon_fceq : Neon_Float_Cmp_Intrinsic;
 
 // Scalar Compare Greater-Than or Equal
 def int_aarch64_neon_vcge : Neon_Cmp_Intrinsic;
 def int_aarch64_neon_vchs : Neon_Cmp_Intrinsic;
+def int_aarch64_neon_fcge : Neon_Float_Cmp_Intrinsic;
+def int_aarch64_neon_fchs : Neon_Float_Cmp_Intrinsic;
 
 // Scalar Compare Less-Than or Equal
 def int_aarch64_neon_vclez : Neon_Cmp_Intrinsic;
+def int_aarch64_neon_fclez : Neon_Float_Cmp_Intrinsic;
 
 // Scalar Compare Less-Than
 def int_aarch64_neon_vcltz : Neon_Cmp_Intrinsic;
+def int_aarch64_neon_fcltz : Neon_Float_Cmp_Intrinsic;
 
 // Scalar Compare Greater-Than
 def int_aarch64_neon_vcgt : Neon_Cmp_Intrinsic;
 def int_aarch64_neon_vchi : Neon_Cmp_Intrinsic;
+def int_aarch64_neon_fcgt : Neon_Float_Cmp_Intrinsic;
+def int_aarch64_neon_fchi : Neon_Float_Cmp_Intrinsic;
 
 // Scalar Compare Bitwise Test Bits
 def int_aarch64_neon_vtstd : Neon_Cmp_Intrinsic;
 
 // Scalar Floating-point Absolute Compare Greater Than Or Equal
 def int_aarch64_neon_vcage : Neon_Cmp_Intrinsic;
+def int_aarch64_neon_fcage : Neon_Float_Cmp_Intrinsic;
+
 // Scalar Floating-point Absolute Compare Greater Than
 def int_aarch64_neon_vcagt : Neon_Cmp_Intrinsic;
+def int_aarch64_neon_fcagt : Neon_Float_Cmp_Intrinsic;
 
 // Scalar Signed Saturating Accumulated of Unsigned Value
 def int_aarch64_neon_vuqadd : Neon_2Arg_Intrinsic;
@@ -366,11 +404,4 @@ def int_aarch64_neon_vcvtfp2fxs_n :
 def int_aarch64_neon_vcvtfp2fxu_n :
   Intrinsic<[llvm_anyvector_ty], [llvm_anyfloat_ty, llvm_i32_ty], [IntrNoMem]>;
 
-class Neon_SHA_Intrinsic
-  : Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v1i32_ty, llvm_v4i32_ty],
-              [IntrNoMem]>;
-
-def int_aarch64_neon_sha1c : Neon_SHA_Intrinsic;
-def int_aarch64_neon_sha1m : Neon_SHA_Intrinsic;
-def int_aarch64_neon_sha1p : Neon_SHA_Intrinsic;
 }