14.7 Function Call Conventions

When calling a function:

  • Registers W0-W7 are caller saved. The calling function must preserve these values before the function call, if their value is required subsequently from the function call. The stack is a good place to preserve these values.
  • Registers W8-W14 are callee saved. The function being called must save any of these registers it will modify.
  • Registers W0-W4 are used for function return values.
  • Registers W0-W7 are used for argument transmission.
  • For dsPIC33C/E/F and dsPIC30F devices, DSRPAG/PSVPAG should be preserved if the -mconst-in-code (auto_psv) memory model is being used.
  • For dsPIC33A devices, the following conventions hold:
    • Registers F0 - F7 are caller saved. The calling function must preserve these values before the function call if their value is required upon returning from the function. The stack is a good place to preserve these values.
    • Registers F8 - F31 are callee saved. The function being called must save any of these registers it will modify.
    • Registers F0 - F1 will be used to return float , double or long double values.
    • Registers F0 - F7 will be used to transmit float , double or long double values.
Table 14-1. Registers Required
Data TypeArchitectureNumber and Type of Registers Required
charAll1 W register
shortAll1 W register
intAll1 W register
any C qualified pointerAll1 W register
any extended qualified pointerdsPIC33C/E/F and dsPIC30F2 W registers
longdsPIC33C/E/F and dsPIC30F2 W registers, aligned to even numbered register
dsPIC33A1 W register
floatdsPIC33C/E/F and dsPIC30F2 W registers, aligned to an even numbered register
dsPIC33A1 F register
double (Note 1)dsPIC33C/E/F and dsPIC30F2 W registers, aligned to an even numbered register
dsPIC33A1 F register
long long intdsPIC33C/E/F and dsPIC30F4 W registers, aligned to a quad numbered register
dsPIC33A2 W register, aligned to an even numbered register
long doubledsPIC33C/E/F and dsPIC30F4 W registers, aligned to a quad numbered register
dsPIC33A2 F registers, aligned to an even numbered register
_FractdsPIC33C/E/F and dsPIC30F1 W register
_long _FractdsPIC33C/E/F and dsPIC30F2 W registers, aligned to even numbered register
_AccumdsPIC33C/E/F and dsPIC30F3 W registers, aligned to a quad numbered register
structdsPIC33C/E/F and dsPIC30F1 register per 2 bytes in structure
dsPIC33A1 register per 4 bytes in structure
Note 1: double is equivalent to long double if -fno-short-double is used.