1 /**************************************************************************
3 * Copyright 2009 VMware, Inc.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 **************************************************************************/
29 * LLVM control flow build helpers.
31 * @author Jose Fonseca <jfonseca@vmware.com>
38 #include "gallivm/lp_bld.h"
48 * Early exit. Useful to skip to the end of a function or block when
49 * the execution mask becomes zero or when there is an error condition.
51 struct lp_build_skip_context
53 struct gallivm_state
*gallivm
;
55 /** Block to skip to */
56 LLVMBasicBlockRef block
;
60 lp_build_flow_skip_begin(struct lp_build_skip_context
*ctx
,
61 struct gallivm_state
*gallivm
);
64 lp_build_flow_skip_cond_break(struct lp_build_skip_context
*ctx
,
68 lp_build_flow_skip_end(struct lp_build_skip_context
*ctx
);
71 struct lp_build_mask_context
73 struct lp_build_skip_context skip
;
82 lp_build_mask_begin(struct lp_build_mask_context
*mask
,
83 struct gallivm_state
*gallivm
,
88 lp_build_mask_value(struct lp_build_mask_context
*mask
);
91 * Bitwise AND the mask with the given value, if a previous mask was set.
94 lp_build_mask_update(struct lp_build_mask_context
*mask
,
98 lp_build_mask_force(struct lp_build_mask_context
*mask
,
102 lp_build_mask_check(struct lp_build_mask_context
*mask
);
105 lp_build_mask_end(struct lp_build_mask_context
*mask
);
109 * LLVM's IR doesn't represent for-loops directly. Furthermore it
110 * it requires creating code blocks, branches, phi variables, so it
111 * requires a fair amount of code.
113 * @sa http://www.llvm.org/docs/tutorial/LangImpl5.html#for
115 struct lp_build_loop_state
117 LLVMBasicBlockRef block
;
118 LLVMValueRef counter_var
;
119 LLVMValueRef counter
;
120 struct gallivm_state
*gallivm
;
125 lp_build_loop_begin(struct lp_build_loop_state
*state
,
126 struct gallivm_state
*gallivm
,
130 lp_build_loop_end(struct lp_build_loop_state
*state
,
135 lp_build_loop_force_set_counter(struct lp_build_loop_state
*state
,
139 lp_build_loop_force_reload_counter(struct lp_build_loop_state
*state
);
141 lp_build_loop_end_cond(struct lp_build_loop_state
*state
,
144 LLVMIntPredicate cond
);
148 * Implementation of simple C-style for loops
150 struct lp_build_for_loop_state
152 LLVMBasicBlockRef begin
;
153 LLVMBasicBlockRef body
;
154 LLVMBasicBlockRef exit
;
155 LLVMValueRef counter_var
;
156 LLVMValueRef counter
;
158 LLVMIntPredicate cond
;
160 struct gallivm_state
*gallivm
;
164 lp_build_for_loop_begin(struct lp_build_for_loop_state
*state
,
165 struct gallivm_state
*gallivm
,
167 LLVMIntPredicate llvm_cond
,
172 lp_build_for_loop_end(struct lp_build_for_loop_state
*state
);
178 struct lp_build_if_state
180 struct gallivm_state
*gallivm
;
181 LLVMValueRef condition
;
182 LLVMBasicBlockRef entry_block
;
183 LLVMBasicBlockRef true_block
;
184 LLVMBasicBlockRef false_block
;
185 LLVMBasicBlockRef merge_block
;
190 lp_build_if(struct lp_build_if_state
*ctx
,
191 struct gallivm_state
*gallivm
,
192 LLVMValueRef condition
);
195 lp_build_else(struct lp_build_if_state
*ctx
);
198 lp_build_endif(struct lp_build_if_state
*ctx
);
201 lp_build_insert_new_block(struct gallivm_state
*gallivm
, const char *name
);
204 lp_build_alloca(struct gallivm_state
*gallivm
,
209 lp_build_alloca_undef(struct gallivm_state
*gallivm
,
214 lp_build_array_alloca(struct gallivm_state
*gallivm
,
223 #endif /* !LP_BLD_FLOW_H */