On Thu, 2023-11-23 at 11:05 +0800, Guo Jie wrote: > gcc/ChangeLog: > > * config/loongarch/loongarch.cc (loongarch_split_plus_constant): > avoid left shift of negative value -0x8000.
> --- > gcc/config/loongarch/loongarch.cc | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/gcc/config/loongarch/loongarch.cc > b/gcc/config/loongarch/loongarch.cc > index 33357c670e1..81cd9fa1e7c 100644 > --- a/gcc/config/loongarch/loongarch.cc > +++ b/gcc/config/loongarch/loongarch.cc > @@ -4249,7 +4249,7 @@ loongarch_split_plus_constant (rtx *op, machine_mode > mode) > else if (loongarch_addu16i_imm12_operand_p (v, mode)) > a = (v & ~HWIT_UC_0xFFF) + ((v & 0x800) << 1); > else if (mode == DImode && DUAL_ADDU16I_OPERAND (v)) > - a = (v > 0 ? 0x7fff : -0x8000) << 16; > + a = (v > 0 ? 0x7fff0000 : ~0x7fffffff); LGTM. "-0x8000 << 16" is allowed by C++20 [it allows x << 16 as long as x * (1 << 16) does not overflow], but not C++11. Unfortunately when I wrote the code I just used the C++20 specification as a reference... Thanks for the correction. -- Xi Ruoyao <xry...@xry111.site> School of Aerospace Science and Technology, Xidian University