I think that regarding to parity bit calculation the C language is to blame, not the compiler. If in C there were parity bit operator it would be obvious to use it and compiler would certainly know how to translate it into assembler.
In our RS485 bus (up to 50 devices) anyone can start transmitting when it needs. Microprocessor UARTs don’t give you information that at that moment no one other just started to transmit so in parallel to UART the other part of interrupted driven code is looking at RXD line.
I can imagine, even I have never written a code in assembler (even the book I mentioned here:
was full of assembler examples).
I have only written (around 1990) an assembler itself and for 8051 my brother was using only my assembler. I used 32 bit numbers for internal calculations and my brother used it to calculate RS232 speed based on quartz frequency. He got overflow in that in other assembler he could use (they used 16 bit numbers).