[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