[Bf-blender-cvs] [48038ee] object_nodes: More codegen implementations for basic functions.
Lukas Tönne
noreply at git.blender.org
Wed Jun 22 18:26:33 CEST 2016
Commit: 48038ee8a5e716a2e70d69c1111405f5ffa48dae
Author: Lukas Tönne
Date: Wed Jun 22 18:25:37 2016 +0200
Branches: object_nodes
https://developer.blender.org/rB48038ee8a5e716a2e70d69c1111405f5ffa48dae
More codegen implementations for basic functions.
* float/int conversion
* float3/float4 getters and setters
===================================================================
M source/blender/blenvm/llvm/llvm_codegen.cc
M source/blender/blenvm/llvm/llvm_modules.cc
M source/blender/blenvm/llvm/llvm_modules.h
M source/blender/blenvm/llvm/llvm_types.cc
M source/blender/blenvm/llvm/llvm_types.h
===================================================================
diff --git a/source/blender/blenvm/llvm/llvm_codegen.cc b/source/blender/blenvm/llvm/llvm_codegen.cc
index fef7e7b..159cc1b 100644
--- a/source/blender/blenvm/llvm/llvm_codegen.cc
+++ b/source/blender/blenvm/llvm/llvm_codegen.cc
@@ -841,7 +841,27 @@ static void define_node_function(
case OP_VALUE_MATRIX44:
def_node_VALUE_MATRIX44(context, func);
break;
-
+
+ case OP_FLOAT_TO_INT:
+ def_node_FLOAT_TO_INT(context, func);
+ break;
+ case OP_INT_TO_FLOAT:
+ def_node_INT_TO_FLOAT(context, func);
+ break;
+
+ case OP_SET_FLOAT3:
+ def_node_SET_FLOAT3(context, func);
+ break;
+ case OP_GET_ELEM_FLOAT3:
+ def_node_GET_ELEM_FLOAT3(context, func);
+ break;
+ case OP_SET_FLOAT4:
+ def_node_SET_FLOAT4(context, func);
+ break;
+ case OP_GET_ELEM_FLOAT4:
+ def_node_GET_ELEM_FLOAT4(context, func);
+ break;
+
default:
define_elementary_functions(context, mod, op, nodetype);
define_dual_function_wrapper(context, mod, func, op, nodetype);
diff --git a/source/blender/blenvm/llvm/llvm_modules.cc b/source/blender/blenvm/llvm/llvm_modules.cc
index 2d42fe2..3c74bbe 100644
--- a/source/blender/blenvm/llvm/llvm_modules.cc
+++ b/source/blender/blenvm/llvm/llvm_modules.cc
@@ -56,6 +56,17 @@ extern "C" {
namespace blenvm {
+typedef llvm::IRBuilder<> Builder;
+
+static llvm::Value *float_vector_at(Builder &builder, llvm::Value *p_vec, llvm::Value *idx)
+{
+ using namespace llvm;
+
+ Type *float_ptr_type = bvm_get_llvm_type(builder.getContext(), BVM_FLOAT, false)->getPointerTo();
+ Value *p_elem = builder.CreatePointerCast(p_vec, float_ptr_type);
+ return builder.CreateInBoundsGEP(p_elem, idx);
+}
+
static void def_node_VALUE_t(llvm::LLVMContext &context, llvm::Function *func, const TypeSpec *typespec)
{
using namespace llvm;
@@ -110,6 +121,127 @@ void def_node_VALUE_MATRIX44(llvm::LLVMContext &context, llvm::Function *func)
def_node_VALUE_t(context, func, TypeSpec::get_typespec("MATRIX44"));
}
+void def_node_FLOAT_TO_INT(llvm::LLVMContext &context, llvm::Function *func)
+{
+ using namespace llvm;
+
+ Function::arg_iterator arg_it = func->arg_begin();
+ Argument *p_out_val = arg_it++;
+ Argument *in_val = arg_it++;
+ Argument *in_dx = arg_it++;
+ Argument *in_dy = arg_it++;
+ UNUSED_VARS(in_dx, in_dy);
+
+ BasicBlock *block = BasicBlock::Create(context, "entry", func);
+
+ IRBuilder<> builder(context);
+ builder.SetInsertPoint(block);
+
+ Type *target_type = bvm_get_llvm_type(context, BVM_INT, false);
+ Value *ival = builder.CreateFPToSI(in_val, target_type);
+ builder.CreateStore(ival, p_out_val);
+
+ builder.CreateRetVoid();
+}
+
+void def_node_INT_TO_FLOAT(llvm::LLVMContext &context, llvm::Function *func)
+{
+ using namespace llvm;
+
+ Function::arg_iterator arg_it = func->arg_begin();
+ Argument *p_out_val = arg_it++;
+ Argument *p_out_dx = arg_it++;
+ Argument *p_out_dy = arg_it++;
+ Argument *in_val = arg_it++;
+
+ BasicBlock *block = BasicBlock::Create(context, "entry", func);
+
+ IRBuilder<> builder(context);
+ builder.SetInsertPoint(block);
+
+ Type *target_type = bvm_get_llvm_type(context, BVM_FLOAT, false);
+ Value *fval = builder.CreateSIToFP(in_val, target_type);
+ builder.CreateStore(fval, p_out_val);
+
+ Constant *fzero = ConstantFP::get(builder.getContext(), APFloat(0.0f));
+ builder.CreateStore(fzero, p_out_dx);
+ builder.CreateStore(fzero, p_out_dy);
+
+ builder.CreateRetVoid();
+}
+
+static void def_node_SET_FLOATn(llvm::LLVMContext &context, llvm::Function *func, unsigned int n)
+{
+ using namespace llvm;
+
+ Function::arg_iterator arg_it = func->arg_begin();
+ Argument *p_out_val = arg_it++;
+ Argument *p_out_dx = arg_it++;
+ Argument *p_out_dy = arg_it++;
+
+ BasicBlock *block = BasicBlock::Create(context, "entry", func);
+
+ IRBuilder<> builder(context);
+ builder.SetInsertPoint(block);
+
+ for (unsigned int i = 0; i < n; ++i) {
+ Argument *val = arg_it++;
+ Argument *dx = arg_it++;
+ Argument *dy = arg_it++;
+
+ builder.CreateStore(val, builder.CreateStructGEP(p_out_val, i));
+ builder.CreateStore(dx, builder.CreateStructGEP(p_out_dx, i));
+ builder.CreateStore(dy, builder.CreateStructGEP(p_out_dy, i));
+ }
+
+ builder.CreateRetVoid();
+}
+
+void def_node_SET_FLOAT3(llvm::LLVMContext &context, llvm::Function *func)
+{
+ def_node_SET_FLOATn(context, func, 3);
+}
+
+void def_node_SET_FLOAT4(llvm::LLVMContext &context, llvm::Function *func)
+{
+ def_node_SET_FLOATn(context, func, 4);
+}
+
+static void def_node_GET_ELEM_FLOATn(llvm::LLVMContext &context, llvm::Function *func)
+{
+ using namespace llvm;
+
+ Function::arg_iterator arg_it = func->arg_begin();
+ Argument *p_out_val = arg_it++;
+ Argument *p_out_dx = arg_it++;
+ Argument *p_out_dy = arg_it++;
+ Argument *index = arg_it++;
+ Argument *vec_val = arg_it++;
+ Argument *vec_dx = arg_it++;
+ Argument *vec_dy = arg_it++;
+
+ BasicBlock *block = BasicBlock::Create(context, "entry", func);
+
+ IRBuilder<> builder(context);
+ builder.SetInsertPoint(block);
+
+ builder.CreateStore(builder.CreateLoad(float_vector_at(builder, vec_val, index)), p_out_val);
+ builder.CreateStore(builder.CreateLoad(float_vector_at(builder, vec_dx, index)), p_out_dx);
+ builder.CreateStore(builder.CreateLoad(float_vector_at(builder, vec_dy, index)), p_out_dy);
+
+ builder.CreateRetVoid();
+}
+
+void def_node_GET_ELEM_FLOAT3(llvm::LLVMContext &context, llvm::Function *func)
+{
+ def_node_GET_ELEM_FLOATn(context, func);
+}
+
+void def_node_GET_ELEM_FLOAT4(llvm::LLVMContext &context, llvm::Function *func)
+{
+ def_node_GET_ELEM_FLOATn(context, func);
+}
+
/* ------------------------------------------------------------------------- */
static void def_node_GET_DERIVATIVE_t(llvm::LLVMContext &context, llvm::Function *func, const TypeSpec *typespec)
diff --git a/source/blender/blenvm/llvm/llvm_modules.h b/source/blender/blenvm/llvm/llvm_modules.h
index e4ab6e3..14d5af4 100644
--- a/source/blender/blenvm/llvm/llvm_modules.h
+++ b/source/blender/blenvm/llvm/llvm_modules.h
@@ -53,6 +53,14 @@ void def_node_VALUE_FLOAT3(llvm::LLVMContext &context, llvm::Function *func);
void def_node_VALUE_FLOAT4(llvm::LLVMContext &context, llvm::Function *func);
void def_node_VALUE_MATRIX44(llvm::LLVMContext &context, llvm::Function *func);
+void def_node_FLOAT_TO_INT(llvm::LLVMContext &context, llvm::Function *func);
+void def_node_INT_TO_FLOAT(llvm::LLVMContext &context, llvm::Function *func);
+
+void def_node_SET_FLOAT3(llvm::LLVMContext &context, llvm::Function *func);
+void def_node_GET_ELEM_FLOAT3(llvm::LLVMContext &context, llvm::Function *func);
+void def_node_SET_FLOAT4(llvm::LLVMContext &context, llvm::Function *func);
+void def_node_GET_ELEM_FLOAT4(llvm::LLVMContext &context, llvm::Function *func);
+
void def_node_GET_DERIVATIVE_FLOAT(llvm::LLVMContext &context, llvm::Function *func);
void def_node_GET_DERIVATIVE_FLOAT3(llvm::LLVMContext &context, llvm::Function *func);
void def_node_GET_DERIVATIVE_FLOAT4(llvm::LLVMContext &context, llvm::Function *func);
diff --git a/source/blender/blenvm/llvm/llvm_types.cc b/source/blender/blenvm/llvm/llvm_types.cc
index 77c343a..0ca5e27 100644
--- a/source/blender/blenvm/llvm/llvm_types.cc
+++ b/source/blender/blenvm/llvm/llvm_types.cc
@@ -85,6 +85,45 @@ llvm::Type *bvm_get_llvm_type(llvm::LLVMContext &context, const TypeSpec *spec,
return NULL;
}
+llvm::Type *bvm_get_llvm_type(llvm::LLVMContext &context, BVMType type, bool use_dual)
+{
+ using namespace llvm;
+
+ if (use_dual) {
+#define BVM_BUILD_TYPE(t) \
+ TypeBuilder<BVMTypeLLVMTraits<t>::dual2_type, false>::get(context)
+ switch (type) {
+ case BVM_FLOAT: return BVM_BUILD_TYPE(BVM_FLOAT);
+ case BVM_FLOAT3: return BVM_BUILD_TYPE(BVM_FLOAT3);
+ case BVM_FLOAT4: return BVM_BUILD_TYPE(BVM_FLOAT4);
+ case BVM_INT: return BVM_BUILD_TYPE(BVM_INT);
+ case BVM_MATRIX44: return BVM_BUILD_TYPE(BVM_MATRIX44);
+ case BVM_STRING: return BVM_BUILD_TYPE(BVM_STRING);
+ case BVM_RNAPOINTER: return BVM_BUILD_TYPE(BVM_RNAPOINTER);
+ case BVM_MESH: return BVM_BUILD_TYPE(BVM_MESH);
+ case BVM_DUPLIS: return BVM_BUILD_TYPE(BVM_DUPLIS);
+ }
+#undef BVM_BUILD_TYPE
+ }
+ else {
+#define BVM_BUILD_TYPE(t) \
+ TypeBuilder<BVMTypeLLVMTraits<t>::value_type, false>::get(context)
+ switch (type) {
+ case BVM_FLOAT: return BVM_BUILD_TYPE(BVM_FLOAT);
+ case BVM_FLOAT3: return BVM_BUILD_TYPE(BVM_FLOAT3);
+ case BVM_FLOAT4: return BVM_BUILD_TYPE(BVM_FLOAT4);
+ case BVM_INT: return BVM_BUILD_TYPE(BVM_INT);
+ case BVM_MATRIX44: return BVM_BUILD_TYPE(BVM_MATRIX44);
+ case BVM_STRING: return BVM_BUILD_TYPE(BVM_STRING);
+ case BVM_RNAPOINTER: return BVM_BUILD_TYPE(BVM_RNAPOINTER);
+ case BVM_MESH: return BVM_BUILD_TYPE(BVM_MESH);
+ case BVM_DUPLIS: return BVM_BUILD_TYPE(BVM_DUPLIS);
+ }
+#undef BVM_BUILD_TYPE
+ }
+ return NULL;
+}
+
llvm::Constant *bvm_create_llvm_constant(llvm::LLVMContext &context, const NodeConstant *node_value)
{
using namespace llvm;
diff --git a/source/blender/blenvm/llvm/llvm_types.h b/source/blender/blenvm/llvm/llvm_types.h
index 5372595..166161e 100644
--- a/source/blender/blenvm/llvm/llvm_types.h
+++ b/source/blender/blenvm/llvm/llvm_types.h
@@ -452,6 +452,8 @@ struct BVMTypeLLVMTraits<BVM_DUPLIS> {
};
llvm::Type *bvm_get_llvm_type(llvm::LLVMContext &context, const TypeSpec *spec, bool use_dual);
+llvm::Type *bvm_get_llvm_type(llvm::LLVMContext &context, BVMType type, bool use_dual);
+
llvm::Constant *bvm_create_llvm_constant(llvm::LLVMContext &context, const NodeConstant *node_value);
bool bvm_type_has_dual_value(const TypeSpec *spec);
More information about the Bf-blender-cvs
mailing list