Przemyslaw Wirkus <przemyslaw.wir...@arm.com> writes:
> Ping :)

Sorry, guess I missed this.

>> This patch is sorting issue with LS64 intrinsics tests failing with
>> aarch64-linux-gnu_ilp32 target.
>>
>> Regtested on aarch64-linux-gnu_ilp32, aarch64-elf and aarch64_be-elf
>> and no issues.
>>
>> OK to install?
>>
>> gcc/ChangeLog:
>>
>>                PR target/103729
>>                * config/aarch64/aarch64-builtins.c 
>>(aarch64_expand_builtin_ls64):
>>                Handle SImode for ILP32.
>
> --- 
>
> diff --git a/gcc/config/aarch64/aarch64-builtins.c 
> b/gcc/config/aarch64/aarch64-builtins.c
> index 
> 0d09fe9dd6dd65c655f5bd0b9a622e7550b61a4b..58bcd99d25b79191589cf9bf8a99db4f4b6a6ba1
>  100644
> --- a/gcc/config/aarch64/aarch64-builtins.c
> +++ b/gcc/config/aarch64/aarch64-builtins.c
> @@ -2216,7 +2216,8 @@ aarch64_expand_builtin_ls64 (int fcode, tree exp, rtx 
> target)
>        {
>          rtx op0 = expand_normal (CALL_EXPR_ARG (exp, 0));
>          create_output_operand (&ops[0], target, V8DImode);
> -        create_input_operand (&ops[1], op0, DImode);
> +        create_input_operand (&ops[1],
> +            GET_MODE (op0) == SImode ? gen_reg_rtx (DImode) : op0, DImode);
>          expand_insn (CODE_FOR_ld64b, 2, ops);
>          return ops[0].value;
>        }
> @@ -2234,7 +2235,8 @@ aarch64_expand_builtin_ls64 (int fcode, tree exp, rtx 
> target)
>          rtx op0 = expand_normal (CALL_EXPR_ARG (exp, 0));
>          rtx op1 = expand_normal (CALL_EXPR_ARG (exp, 1));
>          create_output_operand (&ops[0], target, DImode);
> -        create_input_operand (&ops[1], op0, DImode);
> +        create_input_operand (&ops[1],
> +            GET_MODE (op0) == SImode ? gen_reg_rtx (DImode) : op0, DImode);
>          create_input_operand (&ops[2], op1, V8DImode);
>          expand_insn (CODE_FOR_st64bv, 3, ops);
>          return ops[0].value;
> @@ -2244,7 +2246,8 @@ aarch64_expand_builtin_ls64 (int fcode, tree exp, rtx 
> target)
>          rtx op0 = expand_normal (CALL_EXPR_ARG (exp, 0));
>          rtx op1 = expand_normal (CALL_EXPR_ARG (exp, 1));
>          create_output_operand (&ops[0], target, DImode);
> -        create_input_operand (&ops[1], op0, DImode);
> +        create_input_operand (&ops[1],
> +            GET_MODE (op0) == SImode ? gen_reg_rtx (DImode) : op0, DImode);
>          create_input_operand (&ops[2], op1, V8DImode);
>          expand_insn (CODE_FOR_st64bv0, 3, ops);
>          return ops[0].value;

In the GET_MODE (op0) == SImode case, it looks like this will just set
the operand to a new DImode register, whose value is never initialised.

I think instead we need to use create_convert_operand_from
to convert from Pmode (with unsigned_p true).

Thanks,
Richard

Reply via email to