llvmpipe: Factor out lp_build_select from lp_build_select_aos.
authorJosé Fonseca <jfonseca@vmware.com>
Fri, 14 Aug 2009 09:03:12 +0000 (10:03 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Sat, 29 Aug 2009 08:21:31 +0000 (09:21 +0100)
src/gallium/drivers/llvmpipe/lp_bld_swizzle.c
src/gallium/drivers/llvmpipe/lp_bld_swizzle.h

index 3182573db29cc425d04ddd97c1ece51fea5f781f..627890a3af162084077a25defb013120f6c66c02 100644 (file)
@@ -131,6 +131,32 @@ lp_build_broadcast_aos(struct lp_build_context *bld,
 }
 
 
+LLVMValueRef
+lp_build_select(struct lp_build_context *bld,
+                LLVMValueRef mask,
+                LLVMValueRef a,
+                LLVMValueRef b)
+{
+   const union lp_type type = bld->type;
+
+   if(a == b)
+      return a;
+
+   /* TODO: On SSE4 we could do this with a single instruction -- PBLENDVB */
+
+   a = LLVMBuildAnd(bld->builder, a, mask, "");
+
+   /* This often gets translated to PANDN, but sometimes the NOT is
+    * pre-computed and stored in another constant. The best strategy depends
+    * on available registers, so it is not a big deal -- hopefully LLVM does
+    * the right decision attending the rest of the program.
+    */
+   b = LLVMBuildAnd(bld->builder, b, LLVMBuildNot(bld->builder, mask, ""), "");
+
+   return LLVMBuildOr(bld->builder, a, b, "");
+}
+
+
 LLVMValueRef
 lp_build_select_aos(struct lp_build_context *bld,
                     LLVMValueRef a,
@@ -188,19 +214,7 @@ lp_build_select_aos(struct lp_build_context *bld,
 #endif
    else {
       LLVMValueRef mask = lp_build_const_mask_aos(type, cond);
-
-      /* TODO: On SSE4 we could do this with a single instruction -- PBLENDVB */
-
-      a = LLVMBuildAnd(bld->builder, a, mask, "");
-
-      /* This often gets translated to PANDN, but sometimes the NOT is
-       * pre-computed and stored in another constant. The best strategy depends
-       * on available registers, so it is not a big deal -- hopefully LLVM does
-       * the right decision attending the rest of the program.
-       */
-      b = LLVMBuildAnd(bld->builder, b, LLVMBuildNot(bld->builder, mask, ""), "");
-
-      return LLVMBuildOr(bld->builder, a, b, "");
+      return lp_build_select(bld, mask, a, b);
    }
 }
 
index dede675e588b326574797a4d984a9f4e2f53027d..fe53e86786d6a8b155fa39e035d512d6f9174004 100644 (file)
@@ -59,6 +59,12 @@ lp_build_broadcast_aos(struct lp_build_context *bld,
                        unsigned channel);
 
 
+LLVMValueRef
+lp_build_select(struct lp_build_context *bld,
+                LLVMValueRef mask,
+                LLVMValueRef a,
+                LLVMValueRef b);
+
 LLVMValueRef
 lp_build_select_aos(struct lp_build_context *bld,
                     LLVMValueRef a,