[Beignet] [PATCH] Add long support for printf
He Junyan
junyan.he at inbox.com
Wed Sep 17 21:40:55 PDT 2014
Sorry, this if V2
V2:
Replace all the long and ulong to int64_t
On 四, 2014-09-18 at 12:39 +0800, junyan.he at inbox.com wrote:
> From: Junyan He <junyan.he at linux.intel.com>
>
> Signed-off-by: Junyan He <junyan.he at linux.intel.com>
> ---
> backend/src/ir/printf.cpp | 25 ++++++++++++++++++++-----
> backend/src/llvm/llvm_printf_parser.cpp | 22 +++++++++++++++-------
> kernels/test_printf.cl | 3 +++
> 3 files changed, 38 insertions(+), 12 deletions(-)
>
> diff --git a/backend/src/ir/printf.cpp b/backend/src/ir/printf.cpp
> index 9d60402..e99aad5 100644
> --- a/backend/src/ir/printf.cpp
> +++ b/backend/src/ir/printf.cpp
> @@ -149,20 +149,35 @@ namespace gbe
> switch (slot.state->conversion_specifier) {
> case PRINTF_CONVERSION_D:
> case PRINTF_CONVERSION_I:
> - PRINT_SOMETHING(int, d);
> + if (slot.state->length_modifier == PRINTF_LM_L)
> + PRINT_SOMETHING(uint64_t, d);
> + else
> + PRINT_SOMETHING(int, d);
> break;
>
> case PRINTF_CONVERSION_O:
> - PRINT_SOMETHING(int, o);
> + if (slot.state->length_modifier == PRINTF_LM_L)
> + PRINT_SOMETHING(uint64_t, o);
> + else
> + PRINT_SOMETHING(int, o);
> break;
> case PRINTF_CONVERSION_U:
> - PRINT_SOMETHING(int, u);
> + if (slot.state->length_modifier == PRINTF_LM_L)
> + PRINT_SOMETHING(uint64_t, u);
> + else
> + PRINT_SOMETHING(int, u);
> break;
> case PRINTF_CONVERSION_X:
> - PRINT_SOMETHING(int, X);
> + if (slot.state->length_modifier == PRINTF_LM_L)
> + PRINT_SOMETHING(uint64_t, X);
> + else
> + PRINT_SOMETHING(int, X);
> break;
> case PRINTF_CONVERSION_x:
> - PRINT_SOMETHING(int, x);
> + if (slot.state->length_modifier == PRINTF_LM_L)
> + PRINT_SOMETHING(uint64_t, x);
> + else
> + PRINT_SOMETHING(int, x);
> break;
>
> case PRINTF_CONVERSION_C:
> diff --git a/backend/src/llvm/llvm_printf_parser.cpp b/backend/src/llvm/llvm_printf_parser.cpp
> index 00e1ef8..29684ba 100644
> --- a/backend/src/llvm/llvm_printf_parser.cpp
> +++ b/backend/src/llvm/llvm_printf_parser.cpp
> @@ -640,14 +640,22 @@ error:
> case PRINTF_CONVERSION_U:
> case PRINTF_CONVERSION_x:
> case PRINTF_CONVERSION_X:
> - /* If the bits change, we need to consider the signed. */
> - if (arg->getType() != Type::getInt32Ty(module->getContext())) {
> - arg = builder->CreateIntCast(arg, Type::getInt32Ty(module->getContext()), sign);
> - }
> + if (slot.state->length_modifier == PRINTF_LM_L) { /* we would rather print long. */
> + if (arg->getType() != Type::getInt64Ty(module->getContext())) {
> + arg = builder->CreateIntCast(arg, Type::getInt64Ty(module->getContext()), sign);
> + }
> + dst_type = Type::getInt64PtrTy(module->getContext(), 1);
> + sizeof_size = sizeof(int64_t);
> + } else {
> + /* If the bits change, we need to consider the signed. */
> + if (arg->getType() != Type::getInt32Ty(module->getContext())) {
> + arg = builder->CreateIntCast(arg, Type::getInt32Ty(module->getContext()), sign);
> + }
>
> - /* Int to Int, just store. */
> - dst_type = Type::getInt32PtrTy(module->getContext(), 1);
> - sizeof_size = sizeof(int);
> + /* Int to Int, just store. */
> + dst_type = Type::getInt32PtrTy(module->getContext(), 1);
> + sizeof_size = sizeof(int);
> + }
> return true;
>
> case PRINTF_CONVERSION_C:
> diff --git a/kernels/test_printf.cl b/kernels/test_printf.cl
> index 84bb478..c2844f4 100644
> --- a/kernels/test_printf.cl
> +++ b/kernels/test_printf.cl
> @@ -7,6 +7,7 @@ test_printf(void)
> uint a = 'x';
> float f = 5.0f;
> int3 vec;
> + ulong cc = 1004294967296;
> vec.x = x;
> vec.y = y;
> vec.z = z;
> @@ -15,6 +16,8 @@ test_printf(void)
> printf("--- Welcome to the printf test of %s ---\n", "Intel Beignet");
>
> printf("### output a char is %c\n", a);
> +
> + printf("@@@ A long value is %ld\n", cc);
> }
>
> if (x % 15 == 0)
More information about the Beignet
mailing list