X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Famd%2Fcommon%2Fac_llvm_build.h;h=f0b5875b42391d70eb34f53ce66f7a003a37fad6;hb=854593b8eb2cf27d1666fd0ca1931eee80750019;hp=af16a2bca73fa510ca002ea6c4f487356dd41931;hpb=9c09592086d8b8801d663756efcc997bc741868d;p=mesa.git diff --git a/src/amd/common/ac_llvm_build.h b/src/amd/common/ac_llvm_build.h index af16a2bca73..f0b5875b423 100644 --- a/src/amd/common/ac_llvm_build.h +++ b/src/amd/common/ac_llvm_build.h @@ -28,6 +28,8 @@ #include #include +#include "amd_family.h" + #ifdef __cplusplus extern "C" { #endif @@ -40,11 +42,20 @@ struct ac_llvm_context { LLVMTypeRef voidt; LLVMTypeRef i1; LLVMTypeRef i8; + LLVMTypeRef i16; LLVMTypeRef i32; + LLVMTypeRef i64; + LLVMTypeRef f16; LLVMTypeRef f32; + LLVMTypeRef f64; LLVMTypeRef v4i32; LLVMTypeRef v4f32; - LLVMTypeRef v16i8; + LLVMTypeRef v8i32; + + LLVMValueRef i32_0; + LLVMValueRef i32_1; + LLVMValueRef f32_0; + LLVMValueRef f32_1; unsigned range_md_kind; unsigned invariant_load_md_kind; @@ -52,37 +63,64 @@ struct ac_llvm_context { unsigned fpmath_md_kind; LLVMValueRef fpmath_md_2p5_ulp; LLVMValueRef empty_md; + + enum chip_class chip_class; }; void -ac_llvm_context_init(struct ac_llvm_context *ctx, LLVMContextRef context); +ac_llvm_context_init(struct ac_llvm_context *ctx, LLVMContextRef context, + enum chip_class chip_class); + +unsigned ac_get_type_size(LLVMTypeRef type); + +LLVMTypeRef ac_to_integer_type(struct ac_llvm_context *ctx, LLVMTypeRef t); +LLVMValueRef ac_to_integer(struct ac_llvm_context *ctx, LLVMValueRef v); +LLVMTypeRef ac_to_float_type(struct ac_llvm_context *ctx, LLVMTypeRef t); +LLVMValueRef ac_to_float(struct ac_llvm_context *ctx, LLVMValueRef v); LLVMValueRef -ac_emit_llvm_intrinsic(struct ac_llvm_context *ctx, const char *name, - LLVMTypeRef return_type, LLVMValueRef *params, - unsigned param_count, unsigned attrib_mask); +ac_build_intrinsic(struct ac_llvm_context *ctx, const char *name, + LLVMTypeRef return_type, LLVMValueRef *params, + unsigned param_count, unsigned attrib_mask); void ac_build_type_name_for_intr(LLVMTypeRef type, char *buf, unsigned bufsize); +LLVMValueRef +ac_build_phi(struct ac_llvm_context *ctx, LLVMTypeRef type, + unsigned count_incoming, LLVMValueRef *values, + LLVMBasicBlockRef *blocks); + +void ac_build_optimization_barrier(struct ac_llvm_context *ctx, + LLVMValueRef *pvgpr); + +LLVMValueRef ac_build_ballot(struct ac_llvm_context *ctx, LLVMValueRef value); + +LLVMValueRef ac_build_vote_all(struct ac_llvm_context *ctx, LLVMValueRef value); + +LLVMValueRef ac_build_vote_any(struct ac_llvm_context *ctx, LLVMValueRef value); + +LLVMValueRef ac_build_vote_eq(struct ac_llvm_context *ctx, LLVMValueRef value); + LLVMValueRef ac_build_gather_values_extended(struct ac_llvm_context *ctx, LLVMValueRef *values, unsigned value_count, unsigned value_stride, - bool load); + bool load, + bool always_vector); LLVMValueRef ac_build_gather_values(struct ac_llvm_context *ctx, LLVMValueRef *values, unsigned value_count); LLVMValueRef -ac_emit_fdiv(struct ac_llvm_context *ctx, - LLVMValueRef num, - LLVMValueRef den); +ac_build_fdiv(struct ac_llvm_context *ctx, + LLVMValueRef num, + LLVMValueRef den); void ac_prepare_cube_coords(struct ac_llvm_context *ctx, - bool is_deriv, bool is_array, + bool is_deriv, bool is_array, bool is_lod, LLVMValueRef *coords_arg, LLVMValueRef *derivs_arg); @@ -112,40 +150,25 @@ ac_build_indexed_store(struct ac_llvm_context *ctx, LLVMValueRef base_ptr, LLVMValueRef index, LLVMValueRef value); -LLVMValueRef -ac_build_indexed_load(struct ac_llvm_context *ctx, - LLVMValueRef base_ptr, LLVMValueRef index, - bool uniform); - -LLVMValueRef -ac_build_indexed_load_const(struct ac_llvm_context *ctx, - LLVMValueRef base_ptr, LLVMValueRef index); - -void -ac_build_tbuffer_store_dwords(struct ac_llvm_context *ctx, - LLVMValueRef rsrc, - LLVMValueRef vdata, - unsigned num_channels, - LLVMValueRef vaddr, - LLVMValueRef soffset, - unsigned inst_offset); +LLVMValueRef ac_build_load(struct ac_llvm_context *ctx, LLVMValueRef base_ptr, + LLVMValueRef index); +LLVMValueRef ac_build_load_invariant(struct ac_llvm_context *ctx, + LLVMValueRef base_ptr, LLVMValueRef index); +LLVMValueRef ac_build_load_to_sgpr(struct ac_llvm_context *ctx, + LLVMValueRef base_ptr, LLVMValueRef index); void -ac_build_tbuffer_store(struct ac_llvm_context *ctx, - LLVMValueRef rsrc, - LLVMValueRef vdata, - unsigned num_channels, - LLVMValueRef vaddr, - LLVMValueRef soffset, - unsigned inst_offset, - unsigned dfmt, - unsigned nfmt, - unsigned offen, - unsigned idxen, - unsigned glc, - unsigned slc, - unsigned tfe); - +ac_build_buffer_store_dword(struct ac_llvm_context *ctx, + LLVMValueRef rsrc, + LLVMValueRef vdata, + unsigned num_channels, + LLVMValueRef voffset, + LLVMValueRef soffset, + unsigned inst_offset, + bool glc, + bool slc, + bool writeonly_memory, + bool swizzle_enable_hint); LLVMValueRef ac_build_buffer_load(struct ac_llvm_context *ctx, LLVMValueRef rsrc, @@ -156,7 +179,14 @@ ac_build_buffer_load(struct ac_llvm_context *ctx, unsigned inst_offset, unsigned glc, unsigned slc, - bool readonly_memory); + bool can_speculate, + bool allow_smem); + +LLVMValueRef ac_build_buffer_load_format(struct ac_llvm_context *ctx, + LLVMValueRef rsrc, + LLVMValueRef vindex, + LLVMValueRef voffset, + bool can_speculate); LLVMValueRef ac_get_thread_id(struct ac_llvm_context *ctx); @@ -166,12 +196,10 @@ ac_get_thread_id(struct ac_llvm_context *ctx); #define AC_TID_MASK_LEFT 0xfffffffe LLVMValueRef -ac_emit_ddxy(struct ac_llvm_context *ctx, - bool has_ds_bpermute, - uint32_t mask, - int idx, - LLVMValueRef lds, - LLVMValueRef val); +ac_build_ddxy(struct ac_llvm_context *ctx, + uint32_t mask, + int idx, + LLVMValueRef val); #define AC_SENDMSG_GS 2 #define AC_SENDMSG_GS_DONE 3 @@ -181,19 +209,20 @@ ac_emit_ddxy(struct ac_llvm_context *ctx, #define AC_SENDMSG_GS_OP_EMIT (2 << 4) #define AC_SENDMSG_GS_OP_EMIT_CUT (3 << 4) -void ac_emit_sendmsg(struct ac_llvm_context *ctx, - uint32_t msg, - LLVMValueRef wave_id); +void ac_build_sendmsg(struct ac_llvm_context *ctx, + uint32_t msg, + LLVMValueRef wave_id); -LLVMValueRef ac_emit_imsb(struct ac_llvm_context *ctx, - LLVMValueRef arg, - LLVMTypeRef dst_type); +LLVMValueRef ac_build_imsb(struct ac_llvm_context *ctx, + LLVMValueRef arg, + LLVMTypeRef dst_type); -LLVMValueRef ac_emit_umsb(struct ac_llvm_context *ctx, +LLVMValueRef ac_build_umsb(struct ac_llvm_context *ctx, LLVMValueRef arg, LLVMTypeRef dst_type); -LLVMValueRef ac_emit_clamp(struct ac_llvm_context *ctx, LLVMValueRef value); +LLVMValueRef ac_build_umin(struct ac_llvm_context *ctx, LLVMValueRef a, LLVMValueRef b); +LLVMValueRef ac_build_clamp(struct ac_llvm_context *ctx, LLVMValueRef value); struct ac_export_args { LLVMValueRef out[4]; @@ -204,7 +233,7 @@ struct ac_export_args { bool valid_mask; }; -void ac_emit_export(struct ac_llvm_context *ctx, struct ac_export_args *a); +void ac_build_export(struct ac_llvm_context *ctx, struct ac_export_args *a); enum ac_image_opcode { ac_image_sample, @@ -232,12 +261,26 @@ struct ac_image_args { bool da; }; -LLVMValueRef ac_emit_image_opcode(struct ac_llvm_context *ctx, - struct ac_image_args *a); -LLVMValueRef ac_emit_cvt_pkrtz_f16(struct ac_llvm_context *ctx, - LLVMValueRef args[2]); -void ac_emit_kill(struct ac_llvm_context *ctx, LLVMValueRef value); - +LLVMValueRef ac_build_image_opcode(struct ac_llvm_context *ctx, + struct ac_image_args *a); +LLVMValueRef ac_build_cvt_pkrtz_f16(struct ac_llvm_context *ctx, + LLVMValueRef args[2]); +void ac_build_kill(struct ac_llvm_context *ctx, LLVMValueRef value); +LLVMValueRef ac_build_bfe(struct ac_llvm_context *ctx, LLVMValueRef input, + LLVMValueRef offset, LLVMValueRef width, + bool is_signed); + +void ac_get_image_intr_name(const char *base_name, + LLVMTypeRef data_type, + LLVMTypeRef coords_type, + LLVMTypeRef rsrc_type, + char *out_name, unsigned out_len); + +void ac_optimize_vs_outputs(struct ac_llvm_context *ac, + LLVMValueRef main_fn, + uint8_t *vs_output_param_offset, + uint32_t num_outputs, + uint8_t *num_param_exports); #ifdef __cplusplus } #endif