The R8C has a 20-bit addressing mode for data outside its normal addressing range. However, gcc *really* wants to CSE these and put their addresses in registers, which is not going to work (pointers are 16 bit, these addresses are 20 bit). How can I force gcc to use [sym] or [sym+reg] addressing, and not copy &sym to a register?
Alternately, can we fix the "gcc assumes all pointers are the same size" assumption? Specifically this code hurts m32c: rtx memory_address (enum machine_mode mode, rtx x) { rtx oldx = x; x = convert_memory_address (Pmode, x); /* By passing constant addresses through registers we get a chance to cse them. */ if (! cse_not_expected && CONSTANT_P (x) && CONSTANT_ADDRESS_P (x)) x = force_reg (Pmode, x); 1. It discards the actual pointer mode and substitutes Pmode, whether it's valid or not, and 2. It forces the address into a register whether it's valid or not.