unsigned HOST_WIDE_INT hival = sext_hwi ((val - loval) >> 32, 32);
rtx hi = gen_reg_rtx (mode), lo = gen_reg_rtx (mode);
- riscv_move_integer (hi, hi, hival, mode);
riscv_move_integer (lo, lo, loval, mode);
- hi = gen_rtx_fmt_ee (ASHIFT, mode, hi, GEN_INT (32));
- hi = force_reg (mode, hi);
+ if (loval == hival)
+ hi = gen_rtx_ASHIFT (mode, lo, GEN_INT (32));
+ else
+ {
+ riscv_move_integer (hi, hi, hival, mode);
+ hi = gen_rtx_ASHIFT (mode, hi, GEN_INT (32));
+ }
- return gen_rtx_fmt_ee (PLUS, mode, hi, lo);
+ hi = force_reg (mode, hi);
+ return gen_rtx_PLUS (mode, hi, lo);
}
/* Return true if X is a thread-local symbol. */