On 03/07/2023 18:42, Rafał Pietrak via Gcc wrote:
Hi Ian,
W dniu 3.07.2023 o 17:07, Ian Lance Taylor pisze:
On Wed, Jun 28, 2023 at 11:21 PM Rafał Pietrak via Gcc
<gcc@gcc.gnu.org> wrote:
[--------]
I was thinking about that, and it doesn't look as requiring that deep
rewrites. ABI spec, that could accomodate the functionality could be as
little as one additional attribute to linker segments.
If I understand correctly, you are looking for something like the x32
mode that was available for a while on x86_64 processors:
https://en.wikipedia.org/wiki/X32_ABI . That was a substantial amount
of work including changes to the compiler, assembler, linker, standard
library, and kernel. And at least to me it's never seemed
particularly popular.
Yes.
And WiKi reporting up to 40% performance improvements in some corner
cases is impressive and encouraging. I believe, that the reported
average of 5-8% improvement would be significantly better within MCU
tiny resources environment. In MCU world, such improvement could mean
fit-nofit of a project into a particular device.
-R
A key difference is that using 32-bit pointers on an x86 is enough
address space for a large majority of use-cases, while even on the
smallest small ARM microcontroller, 16-bit is not enough. (It's not
even enough to access all memory on larger AVR microcontrollers - the
only 8-bit device supported by mainline gcc.) So while 16 bits would
cover the address space of the RAM on a small ARM microcontroller, it
would not cover access to code/flash space (including read-only data),
IO registers, or other areas of memory-mapped memory and peripherals.
Generic low-level pointers really have to be able to access everything.
So an equivalent of x32 mode would not work at all. Really, what you
want is a 16-bit "small pointer" that is added to 0x20000000 (the base
address for RAM in small ARM devices, in case anyone following this
thread is unfamiliar with the details) to get a real data pointer. And
you'd like these small pointers to have convenient syntax and efficient use.
I think a C++ class (or rather, class template) with inline functions is
the way to go here. gcc's optimiser will give good code, and the C++
class will let you get nice syntax to hide the messy details.
There is no good way to do this in C. Named address spaces would be a
possibility, but require quite a bit of effort and change to the
compiler to implement, and they don't give you anything that you would
not get from a C++ class.
(That's not quite true - named address spaces can, I believe, also
influence the section name used for allocation of data defined in these
spaces, which cannot be done by a C++ class.)
David