I personally don't see a point in reimplementing existing LLVM functions. There is also LLVMConstNull for zeros and LLVMConstAllOnes for integer ones, though I think those are mainly good for vectors and people are most used to seeing LLVMConstInt and LLVMConstReal for scalars.
Marek On Wed, Dec 19, 2018 at 5:03 PM Rhys Perry <pendingchao...@gmail.com> wrote: > I would expect these helpers to be much more efficient than the > functions you suggested. They are also (in my opinion) more readable > than the suggested functions. > > I don't think it matters much though, so I'm fine either way. > > On Tue, 18 Dec 2018 at 02:48, Marek Olšák <mar...@gmail.com> wrote: > > > > On Fri, Dec 7, 2018 at 12:22 PM Rhys Perry <pendingchao...@gmail.com> > wrote: > >> > >> Signed-off-by: Rhys Perry <pendingchao...@gmail.com> > >> --- > >> src/amd/common/ac_llvm_build.c | 123 ++++++++++++++++++++++++++++++-- > >> src/amd/common/ac_llvm_build.h | 22 +++++- > >> src/amd/common/ac_nir_to_llvm.c | 30 ++++---- > >> 3 files changed, 154 insertions(+), 21 deletions(-) > >> > >> diff --git a/src/amd/common/ac_llvm_build.c > b/src/amd/common/ac_llvm_build.c > >> index 154cc696a2..cc7c6da5a4 100644 > >> --- a/src/amd/common/ac_llvm_build.c > >> +++ b/src/amd/common/ac_llvm_build.c > >> @@ -87,12 +87,16 @@ ac_llvm_context_init(struct ac_llvm_context *ctx, > >> ctx->v4f32 = LLVMVectorType(ctx->f32, 4); > >> ctx->v8i32 = LLVMVectorType(ctx->i32, 8); > >> > >> + ctx->i8_0 = LLVMConstInt(ctx->i8, 0, false); > >> + ctx->i8_1 = LLVMConstInt(ctx->i8, 1, false); > >> ctx->i16_0 = LLVMConstInt(ctx->i16, 0, false); > >> ctx->i16_1 = LLVMConstInt(ctx->i16, 1, false); > >> ctx->i32_0 = LLVMConstInt(ctx->i32, 0, false); > >> ctx->i32_1 = LLVMConstInt(ctx->i32, 1, false); > >> ctx->i64_0 = LLVMConstInt(ctx->i64, 0, false); > >> ctx->i64_1 = LLVMConstInt(ctx->i64, 1, false); > >> + ctx->f16_0 = LLVMConstReal(ctx->f16, 0.0); > >> + ctx->f16_1 = LLVMConstReal(ctx->f16, 1.0); > >> ctx->f32_0 = LLVMConstReal(ctx->f32, 0.0); > >> ctx->f32_1 = LLVMConstReal(ctx->f32, 1.0); > >> ctx->f64_0 = LLVMConstReal(ctx->f64, 0.0); > >> @@ -201,7 +205,9 @@ ac_get_type_size(LLVMTypeRef type) > >> > >> static LLVMTypeRef to_integer_type_scalar(struct ac_llvm_context *ctx, > LLVMTypeRef t) > >> { > >> - if (t == ctx->f16 || t == ctx->i16) > >> + if (t == ctx->i8) > >> + return ctx->i8; > >> + else if (t == ctx->f16 || t == ctx->i16) > >> return ctx->i16; > >> else if (t == ctx->f32 || t == ctx->i32) > >> return ctx->i32; > >> @@ -268,6 +274,110 @@ ac_to_float(struct ac_llvm_context *ctx, > LLVMValueRef v) > >> return LLVMBuildBitCast(ctx->builder, v, ac_to_float_type(ctx, > type), ""); > >> } > >> > >> +LLVMValueRef ac_get_zerof(struct ac_llvm_context *ctx, LLVMTypeRef t) > >> +{ > >> + if (t == ctx->f16) > >> + return ctx->f16_0; > >> + else if (t == ctx->f32) > >> + return ctx->f32_0; > >> + else if (t == ctx->f64) > >> + return ctx->f64_0; > >> + else > >> + unreachable("Unhandled float size"); > >> +} > >> + > >> +LLVMValueRef ac_get_onef(struct ac_llvm_context *ctx, LLVMTypeRef t) > >> +{ > >> + if (t == ctx->f16) > >> + return ctx->f16_1; > >> + else if (t == ctx->f32) > >> + return ctx->f32_1; > >> + else if (t == ctx->f64) > >> + return ctx->f64_1; > >> + else > >> + unreachable("Unhandled float size"); > >> +} > >> + > >> +LLVMValueRef ac_get_zero(struct ac_llvm_context *ctx, LLVMTypeRef t) > >> +{ > >> + if (t == ctx->i8) > >> + return ctx->i8_0; > >> + else if (t == ctx->i16) > >> + return ctx->i16_0; > >> + else if (t == ctx->i32) > >> + return ctx->i32_0; > >> + else if (t == ctx->i64) > >> + return ctx->i64_0; > >> + else > >> + unreachable("Unhandled bit size"); > >> +} > >> + > >> +LLVMValueRef ac_get_one(struct ac_llvm_context *ctx, LLVMTypeRef t) > >> +{ > >> + if (t == ctx->i8) > >> + return ctx->i8_1; > >> + else if (t == ctx->i16) > >> + return ctx->i16_1; > >> + else if (t == ctx->i32) > >> + return ctx->i32_1; > >> + else if (t == ctx->i64) > >> + return ctx->i64_1; > >> + else > >> + unreachable("Unhandled bit size"); > >> +} > > > > > > You don't need these helpers. You can just use LLVMConstInt and > LLVMConstReal. > > > >> > >> + > >> +LLVMTypeRef ac_float_of_size(struct ac_llvm_context *ctx, unsigned > bit_size) > >> +{ > >> + switch (bit_size) { > >> + case 16: > >> + return ctx->f16; > >> + case 32: > >> + return ctx->f32; > >> + case 64: > >> + return ctx->f64; > >> + default: > >> + unreachable("Unhandled bit size"); > >> + } > >> +} > >> + > >> +LLVMTypeRef ac_int_of_size(struct ac_llvm_context *ctx, unsigned > bit_size) > >> +{ > >> + switch (bit_size) { > >> + case 8: > >> + return ctx->i8; > >> + case 16: > >> + return ctx->i16; > >> + case 32: > >> + return ctx->i32; > >> + case 64: > >> + return ctx->i64; > >> + default: > >> + unreachable("Unhandled bit size"); > >> + } > >> +} > > > > > > This is the same as LLVMIntTypeInContext. > > > > Marek > > >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev