Aah, I guess you're right. I was confused by the memory constraint that requires a 32-bit app to use a separate 64-bit process if it wants to have an address space larger than 4GB.
It makes sense that an app running in 32-bit mode can only use 32-bit pointers but can still issue 64-bits instructions, because the instruction opcodes don't conflict with each other. Is this correct?