X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgallium%2Fauxiliary%2Fgallivm%2Flp_bld_flow.h;h=ddb3fdfd7b754031a20299508307096574933dcd;hb=7730d583c207002e14ca2e95d30cab181db20082;hp=a4fc8d19556cf7f965dcb93bde44f89154cfa729;hpb=d0ea4641597d23df2198fd76ed7430c06cef8c5d;p=mesa.git diff --git a/src/gallium/auxiliary/gallivm/lp_bld_flow.h b/src/gallium/auxiliary/gallivm/lp_bld_flow.h index a4fc8d19556..ddb3fdfd7b7 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_flow.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_flow.h @@ -37,33 +37,40 @@ #include "gallivm/lp_bld.h" +#ifdef __cplusplus +extern "C" { +#endif struct lp_type; -struct lp_build_flow_context; - - -struct lp_build_flow_context * -lp_build_flow_create(LLVMBuilderRef builder); +/** + * Early exit. Useful to skip to the end of a function or block when + * the execution mask becomes zero or when there is an error condition. + */ +struct lp_build_skip_context +{ + struct gallivm_state *gallivm; -void -lp_build_flow_destroy(struct lp_build_flow_context *flow); + /** Block to skip to */ + LLVMBasicBlockRef block; +}; void -lp_build_flow_skip_begin(struct lp_build_flow_context *flow); +lp_build_flow_skip_begin(struct lp_build_skip_context *ctx, + struct gallivm_state *gallivm); void -lp_build_flow_skip_cond_break(struct lp_build_flow_context *flow, +lp_build_flow_skip_cond_break(struct lp_build_skip_context *ctx, LLVMValueRef cond); void -lp_build_flow_skip_end(struct lp_build_flow_context *flow); +lp_build_flow_skip_end(struct lp_build_skip_context *ctx); struct lp_build_mask_context { - struct lp_build_flow_context *flow; + struct lp_build_skip_context skip; LLVMTypeRef reg_type; @@ -73,7 +80,7 @@ struct lp_build_mask_context void lp_build_mask_begin(struct lp_build_mask_context *mask, - struct lp_build_flow_context *flow, + struct gallivm_state *gallivm, struct lp_type type, LLVMValueRef value); @@ -103,31 +110,62 @@ lp_build_mask_end(struct lp_build_mask_context *mask); */ struct lp_build_loop_state { - LLVMBasicBlockRef block; - LLVMValueRef counter; + LLVMBasicBlockRef block; + LLVMValueRef counter_var; + LLVMValueRef counter; + struct gallivm_state *gallivm; }; void -lp_build_loop_begin(LLVMBuilderRef builder, - LLVMValueRef start, - struct lp_build_loop_state *state); - +lp_build_loop_begin(struct lp_build_loop_state *state, + struct gallivm_state *gallivm, + LLVMValueRef start); void -lp_build_loop_end(LLVMBuilderRef builder, +lp_build_loop_end(struct lp_build_loop_state *state, LLVMValueRef end, - LLVMValueRef step, - struct lp_build_loop_state *state); + LLVMValueRef step); + +void +lp_build_loop_force_set_counter(struct lp_build_loop_state *state, + LLVMValueRef end); void -lp_build_loop_end_cond(LLVMBuilderRef builder, +lp_build_loop_force_reload_counter(struct lp_build_loop_state *state); +void +lp_build_loop_end_cond(struct lp_build_loop_state *state, LLVMValueRef end, LLVMValueRef step, - int cond, /* LLVM condition */ - struct lp_build_loop_state *state); + LLVMIntPredicate cond); + +/** + * Implementation of simple C-style for loops + */ +struct lp_build_for_loop_state +{ + LLVMBasicBlockRef begin; + LLVMBasicBlockRef body; + LLVMBasicBlockRef exit; + LLVMValueRef counter_var; + LLVMValueRef counter; + LLVMValueRef step; + LLVMIntPredicate cond; + LLVMValueRef end; + struct gallivm_state *gallivm; +}; + +void +lp_build_for_loop_begin(struct lp_build_for_loop_state *state, + struct gallivm_state *gallivm, + LLVMValueRef start, + LLVMIntPredicate llvm_cond, + LLVMValueRef end, + LLVMValueRef step); +void +lp_build_for_loop_end(struct lp_build_for_loop_state *state); /** @@ -135,7 +173,7 @@ lp_build_loop_end_cond(LLVMBuilderRef builder, */ struct lp_build_if_state { - LLVMBuilderRef builder; + struct gallivm_state *gallivm; LLVMValueRef condition; LLVMBasicBlockRef entry_block; LLVMBasicBlockRef true_block; @@ -146,7 +184,7 @@ struct lp_build_if_state void lp_build_if(struct lp_build_if_state *ctx, - LLVMBuilderRef builder, + struct gallivm_state *gallivm, LLVMValueRef condition); void @@ -156,17 +194,26 @@ void lp_build_endif(struct lp_build_if_state *ctx); LLVMBasicBlockRef -lp_build_insert_new_block(LLVMBuilderRef builder, const char *name); +lp_build_insert_new_block(struct gallivm_state *gallivm, const char *name); LLVMValueRef -lp_build_alloca(LLVMBuilderRef builder, +lp_build_alloca(struct gallivm_state *gallivm, LLVMTypeRef type, const char *name); LLVMValueRef -lp_build_array_alloca(LLVMBuilderRef builder, +lp_build_alloca_undef(struct gallivm_state *gallivm, + LLVMTypeRef type, + const char *name); + +LLVMValueRef +lp_build_array_alloca(struct gallivm_state *gallivm, LLVMTypeRef type, LLVMValueRef count, const char *name); +#ifdef __cplusplus +} +#endif + #endif /* !LP_BLD_FLOW_H */