On Sat, 2023-11-18 at 14:59 +0800, Guo Jie wrote:
> For the following immediate load operation in 
> gcc/testsuite/gcc.target/loongarch/imm-load1.c:
> 
>       long long r = 0x0101010101010101;
> 
> Before this patch:
> 
>       lu12i.w     $r15,16842752>>12
>       ori         $r15,$r15,257
>       lu32i.d     $r15,0x1010100000000>>32
>       lu52i.d     $r15,$r15,0x100000000000000>>52
> 
> After this patch:
> 
>       lu12i.w     $r15,16842752>>12
>       ori         $r15,$r15,257
>       bstrins.d   $r15,$r15,63,32
> 
> gcc/ChangeLog:
> 
>       * config/loongarch/loongarch.cc (enum loongarch_load_imm_method): Add 
> new method.
>       (loongarch_build_integer): Add relevant implementations for new method.
>       (loongarch_move_integer): Ditto.

IIRC the ChangeLog line should be wrapped at 72 characters.

/* snip */

>  struct loongarch_integer_op
> @@ -1556,11 +1560,23 @@ loongarch_build_integer (struct loongarch_integer_op 
> *codes,
>  
>        int sign31 = (value & (HOST_WIDE_INT_1U << 31)) >> 31;
>        int sign51 = (value & (HOST_WIDE_INT_1U << 51)) >> 51;
> +
> +      unsigned HOST_WIDE_INT hival = value >> 32;
> +      unsigned HOST_WIDE_INT loval = value << 32 >> 32;

Use

uint32_t hival = (uint32_t) (value >> 32);
uint32_t loval = (uint32_t) value;

instead, because "value << 32" may trigger a left-shift of negative
value.

C++11 doesn't allow shifting left any negative value.  Yes it's allowed
as a GCC extension and it's also allowed by C++23, but GCC codebase is
still C++11.  So it may break GCC if bootstrapping from a different
compiler, and --with-build-config=bootstrap-ubsan will complain.

Otherwise LGTM.

-- 
Xi Ruoyao <xry...@xry111.site>
School of Aerospace Science and Technology, Xidian University

Reply via email to