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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to