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 3182573..627890a 100644 (file)
@@ -132,6 +132,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,
                     LLVMValueRef b,
@@ -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 dede675..fe53e86 100644 (file)
@@ -60,6 +60,12 @@ lp_build_broadcast_aos(struct lp_build_context *bld,
 
 
 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,
                     LLVMValueRef b,