**************************************************************************/
#include <stdio.h>
+#include <inttypes.h>
#include "util/u_debug.h"
#include "util/u_memory.h"
LLVMTypeKind type_kind;
LLVMTypeRef type_ref;
LLVMValueRef params[2 + LP_MAX_VECTOR_LENGTH];
- char type_fmt[4] = " %x";
- char format[2 + 3 * LP_MAX_VECTOR_LENGTH + 2] = "%s";
+ char type_fmt[6] = " %x";
+ char format[2 + 5 * LP_MAX_VECTOR_LENGTH + 2] = "%s";
unsigned length;
unsigned i;
}
if (type_kind == LLVMFloatTypeKind || type_kind == LLVMDoubleTypeKind) {
- type_fmt[2] = 'f';
+ type_fmt[2] = '.';
+ type_fmt[3] = '9';
+ type_fmt[4] = 'g';
+ type_fmt[5] = '\0';
} else if (type_kind == LLVMIntegerTypeKind) {
- if (LLVMGetIntTypeWidth(type_ref) == 8) {
+ if (LLVMGetIntTypeWidth(type_ref) == 64) {
+ unsigned flen = strlen(PRId64);
+ assert(flen <= 3);
+ strncpy(type_fmt + 2, PRId64, flen);
+ } else if (LLVMGetIntTypeWidth(type_ref) == 8) {
type_fmt[2] = 'u';
} else {
type_fmt[2] = 'i';
}
+ } else if (type_kind == LLVMPointerTypeKind) {
+ type_fmt[2] = 'p';
} else {
/* Unsupported type */
assert(0);
params[2] = value;
} else {
for (i = 0; i < length; ++i) {
+ LLVMValueRef param;
util_strncat(format, type_fmt, sizeof(format) - strlen(format) - 1);
- params[2 + i] = LLVMBuildExtractElement(builder, value, lp_build_const_int32(gallivm, i), "");
+ param = LLVMBuildExtractElement(builder, value, lp_build_const_int32(gallivm, i), "");
+ if (type_kind == LLVMIntegerTypeKind &&
+ LLVMGetIntTypeWidth(type_ref) < sizeof(int) * 8) {
+ LLVMTypeRef int_type = LLVMIntTypeInContext(gallivm->context, sizeof(int) * 8);
+ if (LLVMGetIntTypeWidth(type_ref) == 8) {
+ param = LLVMBuildZExt(builder, param, int_type, "");
+ } else {
+ param = LLVMBuildSExt(builder, param, int_type, "");
+ }
+ }
+ params[2 + i] = param;
}
}