[Mesa-dev] [PATCH] gallivm: Introduce lp_format_intrinsic.
Roland Scheidegger
sroland at vmware.com
Sun Apr 3 23:01:40 UTC 2016
Am 04.04.2016 um 00:25 schrieb Jose Fonseca:
> For adding .v4f32 like suffixes to intrinsics, taking special care for
> scalar case, which was being often neglected.
>
> This fixes invalid IR when doing mipmap filtering on SSE2 (the only
> case where we'd use intrinsics with scalars.)
> ---
> src/gallium/auxiliary/gallivm/lp_bld_arit.c | 19 ++++---------
> src/gallium/auxiliary/gallivm/lp_bld_intr.c | 43 +++++++++++++++++++++++++++++
> src/gallium/auxiliary/gallivm/lp_bld_intr.h | 6 ++++
> 3 files changed, 54 insertions(+), 14 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_arit.c b/src/gallium/auxiliary/gallivm/lp_bld_arit.c
> index 587c83a..0c43617 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_arit.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_arit.c
> @@ -1493,7 +1493,7 @@ lp_build_abs(struct lp_build_context *bld,
>
> if(type.floating) {
> char intrinsic[32];
> - util_snprintf(intrinsic, sizeof intrinsic, "llvm.fabs.v%uf%u", type.length, type.width);
> + lp_format_intrinsic(intrinsic, sizeof intrinsic, "llvm.fabs", vec_type);
> return lp_build_intrinsic_unary(builder, intrinsic, vec_type, a);
> }
>
> @@ -1880,9 +1880,7 @@ lp_build_round_arch(struct lp_build_context *bld,
> break;
> }
>
> - util_snprintf(intrinsic, sizeof intrinsic, "%s.v%uf%u",
> - intrinsic_root, type.length, type.width);
> -
> + lp_format_intrinsic(intrinsic, sizeof intrinsic, intrinsic_root, bld->vec_type);
> return lp_build_intrinsic_unary(builder, intrinsic, bld->vec_type, a);
> }
> else /* (util_cpu_caps.has_altivec) */
> @@ -2026,7 +2024,7 @@ lp_build_floor(struct lp_build_context *bld,
>
> if (type.width != 32) {
> char intrinsic[32];
> - util_snprintf(intrinsic, sizeof intrinsic, "llvm.floor.v%uf%u", type.length, type.width);
> + lp_format_intrinsic(intrinsic, sizeof intrinsic, "llvm.floor", vec_type);
> return lp_build_intrinsic_unary(builder, intrinsic, vec_type, a);
> }
>
> @@ -2101,7 +2099,7 @@ lp_build_ceil(struct lp_build_context *bld,
>
> if (type.width != 32) {
> char intrinsic[32];
> - util_snprintf(intrinsic, sizeof intrinsic, "llvm.ceil.v%uf%u", type.length, type.width);
> + lp_format_intrinsic(intrinsic, sizeof intrinsic, "llvm.ceil", vec_type);
> return lp_build_intrinsic_unary(builder, intrinsic, vec_type, a);
> }
>
> @@ -2438,15 +2436,8 @@ lp_build_sqrt(struct lp_build_context *bld,
>
> assert(lp_check_value(type, a));
>
> - /* TODO: optimize the constant case */
> -
> assert(type.floating);
> - if (type.length == 1) {
> - util_snprintf(intrinsic, sizeof intrinsic, "llvm.sqrt.f%u", type.width);
> - }
> - else {
> - util_snprintf(intrinsic, sizeof intrinsic, "llvm.sqrt.v%uf%u", type.length, type.width);
> - }
> + lp_format_intrinsic(intrinsic, sizeof intrinsic, "llvm.sqrt", vec_type);
>
> return lp_build_intrinsic_unary(builder, intrinsic, vec_type, a);
> }
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_intr.c b/src/gallium/auxiliary/gallivm/lp_bld_intr.c
> index 30f4863..e153389 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_intr.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_intr.c
> @@ -45,6 +45,7 @@
>
>
> #include "util/u_debug.h"
> +#include "util/u_string.h"
>
> #include "lp_bld_const.h"
> #include "lp_bld_intr.h"
> @@ -52,6 +53,48 @@
> #include "lp_bld_pack.h"
>
>
> +void
> +lp_format_intrinsic(char *name,
> + size_t size,
> + const char *name_root,
> + LLVMTypeRef type)
> +{
> + unsigned length = 0;
> + unsigned width;
> + char c;
> +
> + LLVMTypeKind kind = LLVMGetTypeKind(type);
> + if (kind == LLVMVectorTypeKind) {
> + length = LLVMGetVectorSize(type);
> + type = LLVMGetElementType(type);
> + kind = LLVMGetTypeKind(type);
> + }
> +
> + switch (kind) {
> + case LLVMIntegerTypeKind:
> + c = 'i';
> + width = LLVMGetIntTypeWidth(type);
> + break;
> + case LLVMFloatTypeKind:
> + c = 'f';
> + width = 32;
> + break;
> + case LLVMDoubleTypeKind:
> + c = 'f';
> + width = 64;
> + break;
> + default:
> + assert(0);
> + }
> +
> + if (length) {
> + util_snprintf(name, size, "%s.v%u%c%u", name_root, length, c, width);
> + } else {
> + util_snprintf(name, size, "%s.%c%u", name_root, c, width);
> + }
> +}
> +
> +
> LLVMValueRef
> lp_declare_intrinsic(LLVMModuleRef module,
> const char *name,
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_intr.h b/src/gallium/auxiliary/gallivm/lp_bld_intr.h
> index a54b367..7d80ac2 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_intr.h
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_intr.h
> @@ -47,6 +47,12 @@
> #define LP_MAX_FUNC_ARGS 32
>
>
> +void
> +lp_format_intrinsic(char *name,
> + size_t size,
> + const char *name_root,
> + LLVMTypeRef type);
> +
> LLVMValueRef
> lp_declare_intrinsic(LLVMModuleRef module,
> const char *name,
>
Ah yes scalar case needs special formatting.
Reviewed-by: Roland Scheidegger <sroland at vmware.com>
More information about the mesa-dev
mailing list