https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92488
Peter Bergner <bergner at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |WAITING --- Comment #1 from Peter Bergner <bergner at gcc dot gnu.org> --- So if I look at what we generate for: _Decimal64 truncd128 (_Decimal128 d) { return d; } and: _Decimal32 truncd64(_Decimal64 d) { return d; } We basically just get a drdpq for the first function and a drsp for the second function. Ie, they don't change the rounding mode at all. If I modify your test case slightly to insert an intermediate cast to _Decimal64 like so: _Decimal32 truncd128 (_Decimal128 d) { return (_Decimal64)d; } ...then we get: drdpq 12,2 fmr 1,12 drsp 1,1 blr So is changing the rounding mode really required here when we go from _Decimal128 directly to _Decimal32? If so, do the other casts also need to be inserting rounding mode changes too? If not, why not?