[llvm-commits] [llvm] r78437 - /llvm/trunk/include/llvm/IntrinsicsARM.td

Bob Wilson bob.wilson at apple.com
Fri Aug 7 16:53:05 PDT 2009


Author: bwilson
Date: Fri Aug  7 18:53:05 2009
New Revision: 78437

URL: http://llvm.org/viewvc/llvm-project?rev=78437&view=rev
Log:
Add new intrinsics for Neon VTRN, VZIP and VUZP operations.  Modeling these
as vector shuffles did not work out well.  Shuffles that produce double-wide
vectors accurately represent the operation but make it hard to do anything
with the results.  I considered splitting them up into 2 shuffles, one to
write each register separately, but there doesn't seem to be a good way to
reunite them for codegen.

Modified:
    llvm/trunk/include/llvm/IntrinsicsARM.td

Modified: llvm/trunk/include/llvm/IntrinsicsARM.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IntrinsicsARM.td?rev=78437&r1=78436&r2=78437&view=diff

==============================================================================
--- llvm/trunk/include/llvm/IntrinsicsARM.td (original)
+++ llvm/trunk/include/llvm/IntrinsicsARM.td Fri Aug  7 18:53:05 2009
@@ -66,6 +66,12 @@
                  LLVMTruncatedElementVectorType<0>,
                  LLVMTruncatedElementVectorType<0>],
                 [IntrNoMem]>;
+  class Neon_2Result_Intrinsic
+    : Intrinsic<[llvm_anyint_ty, LLVMMatchType<0>],
+                [LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>;
+  class Neon_2Result_Float_Intrinsic
+    : Intrinsic<[llvm_anyfloat_ty, LLVMMatchType<0>],
+                [LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>;
   class Neon_CvtFxToFP_Intrinsic
     : Intrinsic<[llvm_anyfloat_ty], [llvm_anyint_ty, llvm_i32_ty], [IntrNoMem]>;
   class Neon_CvtFPToFx_Intrinsic
@@ -288,6 +294,18 @@
 def int_arm_neon_vmovls : Neon_1Arg_Long_Intrinsic;
 def int_arm_neon_vmovlu : Neon_1Arg_Long_Intrinsic;
 
+// Vector Transpose.
+def int_arm_neon_vtrni : Neon_2Result_Intrinsic;
+def int_arm_neon_vtrnf : Neon_2Result_Float_Intrinsic;
+
+// Vector Interleave (vzip).
+def int_arm_neon_vzipi : Neon_2Result_Intrinsic;
+def int_arm_neon_vzipf : Neon_2Result_Float_Intrinsic;
+
+// Vector Deinterleave (vuzp).
+def int_arm_neon_vuzpi : Neon_2Result_Intrinsic;
+def int_arm_neon_vuzpf : Neon_2Result_Float_Intrinsic;
+
 let TargetPrefix = "arm" in {
 
   // De-interleaving vector loads from N-element structures.





More information about the llvm-commits mailing list