https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113560
--- Comment #6 from Roger Sayle <roger at nextmovesoftware dot com> --- In the .optimized dump, we have: __int128 unsigned __res; __int128 unsigned _12; ... __res_11 = in_2(D) w* 184467440738; _12 = __res_11 & 18446744073709551615; __res_7 = _12 * 100; So the first multiplication is a widening multiplication and expanded using mulx, but the second multiplication is a full width TImode multiplication, which is why it has the same RTL expansion as "x * 100". This is looking like a tree-level issue and (perhaps) not a target-specific problem. In fact, it looks like this operation is actually a highpart_multiplication as only the highpart of the result is required (which should still generate mulx, but has a different representation at the tree-level).