llvmpipe: Factor out intrisic calling code into a reusable function.

This commit is contained in:
José Fonseca 2009-08-02 09:59:12 +01:00
parent 7ace0b1f4a
commit fe90e46dc9
1 changed files with 31 additions and 40 deletions

View 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