https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119131
--- Comment #3 from Wilco <wilco at gcc dot gnu.org> --- This is a latent issue with zero handling for decimal float, this looks wrong: /* Return TRUE if rtx X is immediate constant 0.0 (but not in Decimal Floating Point). */ bool aarch64_float_const_zero_rtx_p (rtx x) { /* 0.0 in Decimal Floating Point cannot be represented by #0 or zr as our callers expect, so no need to check the actual value if X is of Decimal Floating Point type. */ if (GET_MODE_CLASS (GET_MODE (x)) == MODE_DECIMAL_FLOAT) return false; When I comment out this if-statement, it correctly emits a movi s15, 0 as using alt 0 in movsd. With this fixed, I think the if (!DECIMAL_FLOAT_MODE_P (mode)) in aarch64_valid_fp_move() may no longer be necessary as a workaround.