1 /* 2 * Copyright 2016 Bas Nieuwenhuizen 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the 6 * "Software"), to deal in the Software without restriction, including 7 * without limitation the rights to use, copy, modify, merge, publish, 8 * distribute, sub license, and/or sell copies of the Software, and to 9 * permit persons to whom the Software is furnished to do so, subject to 10 * the following conditions: 11 * 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 13 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 14 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 15 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 18 * USE OR OTHER DEALINGS IN THE SOFTWARE. 19 * 20 * The above copyright notice and this permission notice (including the 21 * next paragraph) shall be included in all copies or substantial portions 22 * of the Software. 23 * 24 */ 25 #ifndef AC_LLVM_BUILD_H 26 #define AC_LLVM_BUILD_H 27 28 #include <stdbool.h> 29 #include <llvm-c/TargetMachine.h> 30 31 #include "amd_family.h" 32 33 #ifdef __cplusplus 34 extern "C" { 35 #endif 36 37 enum { 38 AC_LOCAL_ADDR_SPACE = 3, 39 }; 40 41 struct ac_llvm_flow; 42 43 struct ac_llvm_context { 44 LLVMContextRef context; 45 LLVMModuleRef module; 46 LLVMBuilderRef builder; 47 48 LLVMTypeRef voidt; 49 LLVMTypeRef i1; 50 LLVMTypeRef i8; 51 LLVMTypeRef i16; 52 LLVMTypeRef i32; 53 LLVMTypeRef i64; 54 LLVMTypeRef f16; 55 LLVMTypeRef f32; 56 LLVMTypeRef f64; 57 LLVMTypeRef v2i32; 58 LLVMTypeRef v3i32; 59 LLVMTypeRef v4i32; 60 LLVMTypeRef v2f32; 61 LLVMTypeRef v4f32; 62 LLVMTypeRef v8i32; 63 64 LLVMValueRef i32_0; 65 LLVMValueRef i32_1; 66 LLVMValueRef i64_0; 67 LLVMValueRef i64_1; 68 LLVMValueRef f32_0; 69 LLVMValueRef f32_1; 70 LLVMValueRef f64_0; 71 LLVMValueRef f64_1; 72 LLVMValueRef i1true; 73 LLVMValueRef i1false; 74 75 struct ac_llvm_flow *flow; 76 unsigned flow_depth; 77 unsigned flow_depth_max; 78 79 unsigned range_md_kind; 80 unsigned invariant_load_md_kind; 81 unsigned uniform_md_kind; 82 unsigned fpmath_md_kind; 83 LLVMValueRef fpmath_md_2p5_ulp; 84 LLVMValueRef empty_md; 85 86 enum chip_class chip_class; 87 enum radeon_family family; 88 89 LLVMValueRef lds; 90 }; 91 92 void 93 ac_llvm_context_init(struct ac_llvm_context *ctx, LLVMContextRef context, 94 enum chip_class chip_class, enum radeon_family family); 95 96 void 97 ac_llvm_context_dispose(struct ac_llvm_context *ctx); 98 99 int 100 ac_get_llvm_num_components(LLVMValueRef value); 101 102 LLVMValueRef 103 ac_llvm_extract_elem(struct ac_llvm_context *ac, 104 LLVMValueRef value, 105 int index); 106 107 unsigned ac_get_type_size(LLVMTypeRef type); 108 109 LLVMTypeRef ac_to_integer_type(struct ac_llvm_context *ctx, LLVMTypeRef t); 110 LLVMValueRef ac_to_integer(struct ac_llvm_context *ctx, LLVMValueRef v); 111 LLVMTypeRef ac_to_float_type(struct ac_llvm_context *ctx, LLVMTypeRef t); 112 LLVMValueRef ac_to_float(struct ac_llvm_context *ctx, LLVMValueRef v); 113 114 LLVMValueRef 115 ac_build_intrinsic(struct ac_llvm_context *ctx, const char *name, 116 LLVMTypeRef return_type, LLVMValueRef *params, 117 unsigned param_count, unsigned attrib_mask); 118 119 void ac_build_type_name_for_intr(LLVMTypeRef type, char *buf, unsigned bufsize); 120 121 LLVMValueRef 122 ac_build_phi(struct ac_llvm_context *ctx, LLVMTypeRef type, 123 unsigned count_incoming, LLVMValueRef *values, 124 LLVMBasicBlockRef *blocks); 125 126 void ac_build_optimization_barrier(struct ac_llvm_context *ctx, 127 LLVMValueRef *pvgpr); 128 129 LLVMValueRef ac_build_ballot(struct ac_llvm_context *ctx, LLVMValueRef value); 130 131 LLVMValueRef ac_build_vote_all(struct ac_llvm_context *ctx, LLVMValueRef value); 132 133 LLVMValueRef ac_build_vote_any(struct ac_llvm_context *ctx, LLVMValueRef value); 134 135 LLVMValueRef ac_build_vote_eq(struct ac_llvm_context *ctx, LLVMValueRef value); 136 137 LLVMValueRef 138 ac_build_varying_gather_values(struct ac_llvm_context *ctx, LLVMValueRef *values, 139 unsigned value_count, unsigned component); 140 141 LLVMValueRef 142 ac_build_gather_values_extended(struct ac_llvm_context *ctx, 143 LLVMValueRef *values, 144 unsigned value_count, 145 unsigned value_stride, 146 bool load, 147 bool always_vector); 148 LLVMValueRef 149 ac_build_gather_values(struct ac_llvm_context *ctx, 150 LLVMValueRef *values, 151 unsigned value_count); 152 153 LLVMValueRef 154 ac_build_fdiv(struct ac_llvm_context *ctx, 155 LLVMValueRef num, 156 LLVMValueRef den); 157 158 void 159 ac_prepare_cube_coords(struct ac_llvm_context *ctx, 160 bool is_deriv, bool is_array, bool is_lod, 161 LLVMValueRef *coords_arg, 162 LLVMValueRef *derivs_arg); 163 164 165 LLVMValueRef 166 ac_build_fs_interp(struct ac_llvm_context *ctx, 167 LLVMValueRef llvm_chan, 168 LLVMValueRef attr_number, 169 LLVMValueRef params, 170 LLVMValueRef i, 171 LLVMValueRef j); 172 173 LLVMValueRef 174 ac_build_fs_interp_mov(struct ac_llvm_context *ctx, 175 LLVMValueRef parameter, 176 LLVMValueRef llvm_chan, 177 LLVMValueRef attr_number, 178 LLVMValueRef params); 179 180 LLVMValueRef 181 ac_build_gep0(struct ac_llvm_context *ctx, 182 LLVMValueRef base_ptr, 183 LLVMValueRef index); 184 185 void 186 ac_build_indexed_store(struct ac_llvm_context *ctx, 187 LLVMValueRef base_ptr, LLVMValueRef index, 188 LLVMValueRef value); 189 190 LLVMValueRef ac_build_load(struct ac_llvm_context *ctx, LLVMValueRef base_ptr, 191 LLVMValueRef index); 192 LLVMValueRef ac_build_load_invariant(struct ac_llvm_context *ctx, 193 LLVMValueRef base_ptr, LLVMValueRef index); 194 LLVMValueRef ac_build_load_to_sgpr(struct ac_llvm_context *ctx, 195 LLVMValueRef base_ptr, LLVMValueRef index); 196 197 void 198 ac_build_buffer_store_dword(struct ac_llvm_context *ctx, 199 LLVMValueRef rsrc, 200 LLVMValueRef vdata, 201 unsigned num_channels, 202 LLVMValueRef voffset, 203 LLVMValueRef soffset, 204 unsigned inst_offset, 205 bool glc, 206 bool slc, 207 bool writeonly_memory, 208 bool swizzle_enable_hint); 209 LLVMValueRef 210 ac_build_buffer_load(struct ac_llvm_context *ctx, 211 LLVMValueRef rsrc, 212 int num_channels, 213 LLVMValueRef vindex, 214 LLVMValueRef voffset, 215 LLVMValueRef soffset, 216 unsigned inst_offset, 217 unsigned glc, 218 unsigned slc, 219 bool can_speculate, 220 bool allow_smem); 221 222 LLVMValueRef ac_build_buffer_load_format(struct ac_llvm_context *ctx, 223 LLVMValueRef rsrc, 224 LLVMValueRef vindex, 225 LLVMValueRef voffset, 226 bool can_speculate); 227 228 /* load_format that handles the stride & element count better if idxen is 229 * disabled by LLVM. */ 230 LLVMValueRef ac_build_buffer_load_format_gfx9_safe(struct ac_llvm_context *ctx, 231 LLVMValueRef rsrc, 232 LLVMValueRef vindex, 233 LLVMValueRef voffset, 234 bool can_speculate); 235 236 LLVMValueRef 237 ac_get_thread_id(struct ac_llvm_context *ctx); 238 239 #define AC_TID_MASK_TOP_LEFT 0xfffffffc 240 #define AC_TID_MASK_TOP 0xfffffffd 241 #define AC_TID_MASK_LEFT 0xfffffffe 242 243 LLVMValueRef 244 ac_build_ddxy(struct ac_llvm_context *ctx, 245 uint32_t mask, 246 int idx, 247 LLVMValueRef val); 248 249 #define AC_SENDMSG_GS 2 250 #define AC_SENDMSG_GS_DONE 3 251 252 #define AC_SENDMSG_GS_OP_NOP (0 << 4) 253 #define AC_SENDMSG_GS_OP_CUT (1 << 4) 254 #define AC_SENDMSG_GS_OP_EMIT (2 << 4) 255 #define AC_SENDMSG_GS_OP_EMIT_CUT (3 << 4) 256 257 void ac_build_sendmsg(struct ac_llvm_context *ctx, 258 uint32_t msg, 259 LLVMValueRef wave_id); 260 261 LLVMValueRef ac_build_imsb(struct ac_llvm_context *ctx, 262 LLVMValueRef arg, 263 LLVMTypeRef dst_type); 264 265 LLVMValueRef ac_build_umsb(struct ac_llvm_context *ctx, 266 LLVMValueRef arg, 267 LLVMTypeRef dst_type); 268 LLVMValueRef ac_build_fmin(struct ac_llvm_context *ctx, LLVMValueRef a, 269 LLVMValueRef b); 270 LLVMValueRef ac_build_fmax(struct ac_llvm_context *ctx, LLVMValueRef a, 271 LLVMValueRef b); 272 LLVMValueRef ac_build_umin(struct ac_llvm_context *ctx, LLVMValueRef a, LLVMValueRef b); 273 LLVMValueRef ac_build_clamp(struct ac_llvm_context *ctx, LLVMValueRef value); 274 275 struct ac_export_args { 276 LLVMValueRef out[4]; 277 unsigned target; 278 unsigned enabled_channels; 279 bool compr; 280 bool done; 281 bool valid_mask; 282 }; 283 284 void ac_build_export(struct ac_llvm_context *ctx, struct ac_export_args *a); 285 286 enum ac_image_opcode { 287 ac_image_sample, 288 ac_image_gather4, 289 ac_image_load, 290 ac_image_load_mip, 291 ac_image_get_lod, 292 ac_image_get_resinfo, 293 }; 294 295 struct ac_image_args { 296 enum ac_image_opcode opcode; 297 bool level_zero; 298 bool bias; 299 bool lod; 300 bool deriv; 301 bool compare; 302 bool offset; 303 304 LLVMValueRef resource; 305 LLVMValueRef sampler; 306 LLVMValueRef addr; 307 unsigned dmask; 308 bool unorm; 309 bool da; 310 }; 311 312 LLVMValueRef ac_build_image_opcode(struct ac_llvm_context *ctx, 313 struct ac_image_args *a); 314 LLVMValueRef ac_build_cvt_pkrtz_f16(struct ac_llvm_context *ctx, 315 LLVMValueRef args[2]); 316 LLVMValueRef ac_build_wqm_vote(struct ac_llvm_context *ctx, LLVMValueRef i1); 317 void ac_build_kill_if_false(struct ac_llvm_context *ctx, LLVMValueRef i1); 318 LLVMValueRef ac_build_bfe(struct ac_llvm_context *ctx, LLVMValueRef input, 319 LLVMValueRef offset, LLVMValueRef width, 320 bool is_signed); 321 322 void ac_build_waitcnt(struct ac_llvm_context *ctx, unsigned simm16); 323 324 void ac_get_image_intr_name(const char *base_name, 325 LLVMTypeRef data_type, 326 LLVMTypeRef coords_type, 327 LLVMTypeRef rsrc_type, 328 char *out_name, unsigned out_len); 329 330 void ac_optimize_vs_outputs(struct ac_llvm_context *ac, 331 LLVMValueRef main_fn, 332 uint8_t *vs_output_param_offset, 333 uint32_t num_outputs, 334 uint8_t *num_param_exports); 335 void ac_init_exec_full_mask(struct ac_llvm_context *ctx); 336 337 void ac_declare_lds_as_pointer(struct ac_llvm_context *ac); 338 LLVMValueRef ac_lds_load(struct ac_llvm_context *ctx, 339 LLVMValueRef dw_addr); 340 void ac_lds_store(struct ac_llvm_context *ctx, 341 LLVMValueRef dw_addr, LLVMValueRef value); 342 343 LLVMValueRef ac_find_lsb(struct ac_llvm_context *ctx, 344 LLVMTypeRef dst_type, 345 LLVMValueRef src0); 346 347 void ac_build_bgnloop(struct ac_llvm_context *ctx, int lable_id); 348 void ac_build_break(struct ac_llvm_context *ctx); 349 void ac_build_continue(struct ac_llvm_context *ctx); 350 void ac_build_else(struct ac_llvm_context *ctx, int lable_id); 351 void ac_build_endif(struct ac_llvm_context *ctx, int lable_id); 352 void ac_build_endloop(struct ac_llvm_context *ctx, int lable_id); 353 void ac_build_if(struct ac_llvm_context *ctx, LLVMValueRef value, 354 int lable_id); 355 void ac_build_uif(struct ac_llvm_context *ctx, LLVMValueRef value, 356 int lable_id); 357 358 #ifdef __cplusplus 359 } 360 #endif 361 362 #endif 363