[Mesa-dev] [PATCH] llvmpipe: add print for int128
Adam Jackson
ajax at redhat.com
Mon Apr 1 06:02:03 PDT 2013
From: Adhemerval Zanella <azanella at linux.vnet.ibm.com>
Reviewed-by: Adam Jackson <ajax at redhat.com>
Signed-off-by: Adhemerval Zanella <azanella at linux.vnet.ibm.com>
---
src/gallium/auxiliary/gallivm/lp_bld_printf.c | 56 +++++++++++++++++++--------
1 file changed, 39 insertions(+), 17 deletions(-)
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_printf.c b/src/gallium/auxiliary/gallivm/lp_bld_printf.c
index 7a6bbd9..71c4d1b 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_printf.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_printf.c
@@ -83,33 +83,47 @@ lp_build_print_value(struct gallivm_state *gallivm,
LLVMTypeKind type_kind;
LLVMTypeRef type_ref;
LLVMValueRef params[2 + LP_MAX_VECTOR_LENGTH];
- char type_fmt[6] = " %x";
+ char type_fmt[20];
char format[2 + 5 * LP_MAX_VECTOR_LENGTH + 2] = "%s";
- unsigned length;
+ unsigned vecsize;
+ unsigned nargs;
unsigned i;
type_ref = LLVMTypeOf(value);
type_kind = LLVMGetTypeKind(type_ref);
if (type_kind == LLVMVectorTypeKind) {
- length = LLVMGetVectorSize(type_ref);
+ vecsize = LLVMGetVectorSize(type_ref);
+ nargs = vecsize;
type_ref = LLVMGetElementType(type_ref);
type_kind = LLVMGetTypeKind(type_ref);
+ } else if (LLVMGetIntTypeWidth(type_ref) == 128) {
+ vecsize = 1;
+ nargs = 2;
} else {
- length = 1;
+ vecsize = 1;
+ nargs = 1;
}
if (type_kind == LLVMFloatTypeKind || type_kind == LLVMDoubleTypeKind) {
- type_fmt[2] = '.';
- type_fmt[3] = '9';
- type_fmt[4] = 'g';
- type_fmt[5] = '\0';
+ snprintf(type_fmt, sizeof type_fmt, " %%9g");
} else if (type_kind == LLVMIntegerTypeKind) {
- if (LLVMGetIntTypeWidth(type_ref) == 8) {
- type_fmt[2] = 'u';
- } else {
- type_fmt[2] = 'i';
+ unsigned typeWidth = LLVMGetIntTypeWidth(type_ref);
+ if (LLVMGetIntTypeWidth(type_ref) <= 32) {
+ snprintf(type_fmt, sizeof type_fmt, " %%x");
+ } else if (typeWidth == 64) {
+#if __WORDSIZE == 64
+ snprintf(type_fmt, sizeof type_fmt, " %%016lx");
+#else
+ snprintf(type_fmt, sizeof type_fmt, " %%016llx");
+#endif
+ } else if (typeWidth == 128) {
+#if __WORDSIZE == 64
+ snprintf(type_fmt, sizeof type_fmt, " %%016lx%%016lx");
+#else
+ snprintf(type_fmt, sizeof type_fmt, " %%016llx%%016llx");
+#endif
}
} else {
/* Unsupported type */
@@ -117,14 +131,22 @@ lp_build_print_value(struct gallivm_state *gallivm,
}
/* Create format string and arguments */
- assert(strlen(format) + strlen(type_fmt) * length + 2 <= sizeof format);
+ assert(strlen(format) + strlen(type_fmt) * nargs + 2 <= sizeof format);
params[1] = lp_build_const_string(gallivm, msg);
- if (length == 1) {
+ if (vecsize == 1) {
util_strncat(format, type_fmt, sizeof(format) - strlen(format) - 1);
- params[2] = value;
+ if (LLVMGetIntTypeWidth(type_ref) <= 64) {
+ params[2] = value;
+ } else {
+ LLVMValueRef shift = LLVMConstInt(LLVMIntTypeInContext(gallivm->context, 128), 64, 0);
+ LLVMValueRef lshr = LLVMBuildLShr(builder, value, shift, "");
+ LLVMTypeRef type64 = LLVMInt64TypeInContext(gallivm->context);
+ params[2] = LLVMBuildTrunc(builder, lshr, type64, "");
+ params[3] = LLVMBuildTrunc(builder, value, type64, "");
+ }
} else {
- for (i = 0; i < length; ++i) {
+ for (i = 0; i < vecsize; ++i) {
LLVMValueRef param;
util_strncat(format, type_fmt, sizeof(format) - strlen(format) - 1);
param = LLVMBuildExtractElement(builder, value, lp_build_const_int32(gallivm, i), "");
@@ -144,7 +166,7 @@ lp_build_print_value(struct gallivm_state *gallivm,
util_strncat(format, "\n", sizeof(format) - strlen(format) - 1);
params[0] = lp_build_const_string(gallivm, format);
- return lp_build_print_args(gallivm, 2 + length, params);
+ return lp_build_print_args(gallivm, 2 + nargs, params);
}
--
1.7.11.4
More information about the mesa-dev
mailing list