llvmpipe: Factor out intrisic calling code into a reusable function.
authorJosé Fonseca <jfonseca@vmware.com>
Sun, 2 Aug 2009 08:59:12 +0000 (09:59 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Sat, 29 Aug 2009 08:21:21 +0000 (09:21 +0100)
src/gallium/drivers/llvmpipe/lp_bld_arit.c

index cfffe3b12a0f6b52a460155dd8ccaef4ceef41ab..7e5af284aabc84c6ab4f038c41b107704c3e033d 100644 (file)
@@ -103,6 +103,35 @@ lp_build_const_aos(LLVMTypeRef type,
 }
                
 
+static LLVMValueRef
+lp_build_intrinsic_binary(LLVMBuilderRef builder,
+                          const char *name,
+                          LLVMValueRef a,
+                          LLVMValueRef b)
+{
+   LLVMModuleRef module = LLVMGetGlobalParent(LLVMGetBasicBlockParent(LLVMGetInsertBlock(builder)));
+   LLVMValueRef function;
+   LLVMValueRef args[2];
+
+   function = LLVMGetNamedFunction(module, name);
+   if(!function) {
+      LLVMTypeRef type = LLVMTypeOf(a);
+      LLVMTypeRef arg_types[2];
+      arg_types[0] = type;
+      arg_types[1] = type;
+      function = LLVMAddFunction(module, name, LLVMFunctionType(type, arg_types, 2, 0));
+      LLVMSetFunctionCallConv(function, LLVMCCallConv);
+      LLVMSetLinkage(function, LLVMExternalLinkage);
+   }
+   assert(LLVMIsDeclaration(function));
+
+   args[0] = a;
+   args[1] = b;
+
+   return LLVMBuildCall(builder, function, args, 2, "");
+}
+
+
 LLVMValueRef
 lp_build_add(LLVMBuilderRef builder,
              LLVMValueRef a,
@@ -168,26 +197,7 @@ lp_build_min(LLVMBuilderRef builder,
 
 #if defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64)
 
-   LLVMModuleRef module = LLVMGetGlobalParent(LLVMGetBasicBlockParent(LLVMGetInsertBlock(builder)));
-   LLVMValueRef function;
-   LLVMValueRef args[2];
-
-   function = LLVMGetNamedFunction(module, "llvm.x86.sse.min.ps");
-   if(!function) {
-      LLVMTypeRef type = LLVMVectorType(LLVMFloatType(), 4);
-      LLVMTypeRef arg_types[2];
-      arg_types[0] = type;
-      arg_types[1] = type;
-      function = LLVMAddFunction(module, "llvm.x86.sse.min.ps", LLVMFunctionType(type, arg_types, 2, 0));
-      LLVMSetFunctionCallConv(function, LLVMCCallConv);
-      LLVMSetLinkage(function, LLVMExternalLinkage);
-   }
-   assert(LLVMIsDeclaration(function));
-
-   args[0] = a;
-   args[1] = b;
-
-   return LLVMBuildCall(builder, function, args, 2, "");
+   return lp_build_intrinsic_binary(builder, "llvm.x86.sse.min.ps", a, b);
 
 #else
 
@@ -207,26 +217,7 @@ lp_build_max(LLVMBuilderRef builder,
 
 #if defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64)
 
-   LLVMModuleRef module = LLVMGetGlobalParent(LLVMGetBasicBlockParent(LLVMGetInsertBlock(builder)));
-   LLVMValueRef function;
-   LLVMValueRef args[2];
-
-   function = LLVMGetNamedFunction(module, "llvm.x86.sse.max.ps");
-   if(!function) {
-      LLVMTypeRef type = LLVMVectorType(LLVMFloatType(), 4);
-      LLVMTypeRef arg_types[2];
-      arg_types[0] = type;
-      arg_types[1] = type;
-      function = LLVMAddFunction(module, "llvm.x86.sse.max.ps", LLVMFunctionType(type, arg_types, 2, 0));
-      LLVMSetFunctionCallConv(function, LLVMCCallConv);
-      LLVMSetLinkage(function, LLVMExternalLinkage);
-   }
-   assert(LLVMIsDeclaration(function));
-
-   args[0] = a;
-   args[1] = b;
-
-   return LLVMBuildCall(builder, function, args, 2, "");
+   return lp_build_intrinsic_binary(builder, "llvm.x86.sse.max.ps", a, b);
 
 #else