Microchip Technology SW006023-2N Data Sheet

Page of 238
MPLAB
®
 XC32 C/C++ Compiler User’s Guide
DS51686E-page 206
 2012 Microchip Technology Inc.
Defining a global register variable in a certain register reserves that register entirely for 
this use, at least within the current compilation. The register will not be allocated for any 
other purpose in the functions in the current compilation. The register will not be saved 
and restored by these functions. Stores into this register are never deleted even if they 
would appear to be dead, but references may be deleted, moved or simplified. 
It is not safe to access the global register variables from signal handlers, or from more 
than one thread of control, because the system library routines may temporarily use the 
register for other things (unless you recompile them especially for the task at hand). 
It is not safe for one function that uses a global register variable to call another such 
function foo by way of a third function lose that was compiled without knowledge of 
this variable (i.e., in a source file in which the variable wasn’t declared). This is because 
lose
 might save the register and put some other value there. For example, you can’t 
expect a global register variable to be available in the comparison-function that you 
pass to qsort, since qsort might have put something else in that register. This 
problem can be avoided by recompiling qsort with the same global register variable 
definition.
If you want to recompile qsort or other source files that do not actually use your global 
register variable, so that they will not use that register for any other purpose, then it 
suffices to specify the compiler command-line option -ffixed-reg. You need not 
actually add a global register declaration to their source code. 
A function that can alter the value of a global register variable cannot safely be called 
from a function compiled without this variable, because it could clobber the value the 
caller expects to find there on return. Therefore, the function that is the entry point into 
the part of the program that uses the global register variable must explicitly save and 
restore the value that belongs to its caller. 
The library function longjmp will restore to each global register variable the value it 
had at the time of the setjmp. 
All global register variable declarations must precede all function definitions. If such a 
declaration appears after function definitions, the register may be used for other 
purposes in the preceding functions. 
Global register variables may not have initial values because an executable file has no 
means to supply initial contents for a register. 
20.2.2
Specifying Registers for Local Variables
You can define a local register variable with a specified register like this: 
register int *foo asm ("w8");
Here w8 is the name of the register that should be used. Note that this is the same 
syntax used for defining global register variables, but for a local variable it would appear 
within a function. 
Defining such a register variable does not reserve the register; it remains available for 
other uses in places where flow control determines the variable’s value is not live. 
Using this feature may leave the compiler too few available registers to compile certain 
functions. 
This option does not ensure that the compiler will generate code that has this variable 
in the register you specify at all times. You may not code an explicit reference to this 
register in an asm statement and assume it will always refer to this variable. 
Assignments to local register variables may be deleted when they appear to be 
unused. References to local register variables may be deleted, moved or simplified.