The PIC32MX chips have one or two shadow sets, on the systems with only
one shadow set it is hardcoded to the highest priority interrupt (7)
I have implemented detection of shadow register use, in this case the
registers do not get pushed on stack, that saves quite a few cpu-cycles
in that case.
But in a microcontroller systems you usually have several peripherals
running at different interrupt levels, not so important tasks run on
lower priorities so register saving is still an issue.
Until now I did not look into floating point at all, as the small
PIC32MX1/2 devices have no floating point processor I never used the
real datatype anyway but when code for hardware floating point is always
generated then this will of course create issues at runtime when
somebody uses that datatype. But that's a story for another rainy day.
Right now it is sufficient for me to know that it may be most likely a
bug or an unimplemented feature (like sergej said), I was fearing that I
did something wrong when defining the target.
Perhaps in a future far far away I will look what it needs to also
support PIC32MM and PIC32MZ but as they use MicroAdaptiv instruction set
(something like thumb mode on arm) I will need to learn more on the
inner workings of fpc so please bare with me when I continue asking
questions on the inner working of fpc, I am slowly understanding more
and more how things work but I still do not see the big picture....
Michael
Am 24.08.16 um 10:09 schrieb Florian Klämpfl:
Am 13.08.2016 um 18:57 schrieb Michael Ring:
Hi!
I am trying to bring interrupt handling routine size down (and speed up) for
mipsel-embedded target.
I need to use inline assembler routines like this one
procedure TSystemCore.setCoreTimerComp(value : longWord); assembler;
nostackframe;
asm
mtc0 $a1,$11,0
end ['a1'];
inside of the interrupt handler, but as soon as I include the call to this
procedure the number of
registers that get saved explodes. When I only need to modify some peripheral I
usually get away
with only $v0 and $v1 registers getting saved, but with asm routine included
all registers get saved.
Same is true if I put the asm block directly inside of the interrupt handler.
As you can see I have added the used registers list for this procedure so my
expectation was that
only the register declared does get added to the list of used registers.
Is this a bug on mips platform or is there in general no way to define the list
of used registers
for an assembler routine so that register allocation works more efficient?
Or is there another way for me to trick freepascal in not saving all registers?
Did you read the suggestion from Michael Schnell? Does the MIPS you use have a
shadow register set?
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel