Restriction: "Parameter Adjust" is not used for AMODE
64 applications only.
The following example shows "by reference" parameters. In
this example, "Parameter Adjust" is always zero and arguments
are never passed in floating point registers. The value of the high-order
bit on the last, or any, reference parameter is not defined here;
this is left to the implementation, possibly specified by language
constructs such as #pragma in C.
Prototype: |
f0( |
int&, |
float&, |
double&, |
struct { /*... */ }&, |
int&) |
|
Offset in argument list |
+0 |
+4 |
+8 |
+12 |
+16 |
|
Stored in argument list |
No |
No |
No |
Yes |
Yes |
|
Passed in Registers |
GPR1 |
GPR2 |
GPR3 |
|
|
|
Parameter Adjust |
000000/000000/000000/000000 |
The remaining examples show "by value" semantics in parameter
lists. "Parameter Adjust" is zero except where shown.
Prototype: |
f1( |
int, |
int, |
int, |
int, |
int) |
|
Offset
in argument list |
+0 |
+4 |
+8 |
+12 |
+16 |
|
Stored
in argument list |
No |
No |
No |
Yes |
Yes |
|
Passed
in Registers |
GPR1 |
GPR2 |
GPR3 |
|
|
|
Prototype: |
f2( |
char, |
short, |
int, |
long long) |
|
|
Offset
in argument list |
+0 |
+4 |
+8 |
+12 |
|
|
Stored
in argument list |
No |
No |
No |
Yes |
|
|
Passed
in Registers |
GPR1 |
GPR2 |
GPR3 |
|
|
|
Prototype: |
f3( |
long long, |
int, |
int) |
|
|
|
Offset
in argument list |
+0 |
+8 |
+12 |
|
|
|
Stored
in argument list |
No |
No |
Yes |
|
|
|
Passed
in Registers |
GPR1/
GPR2
|
GPR3 |
|
|
|
|
Prototype: |
f4( |
struct {int, |
int }, |
int, |
int) |
|
|
Offset
in argument list |
+0 |
+4 |
+8 |
+12 |
|
|
Stored
in argument list |
No |
No |
No |
Yes |
|
|
Passed
in Registers |
GPR1 |
GPR2 |
GPR3 |
|
|
|
Prototype: |
f5( |
struct {float, |
double }, |
int, |
int) |
|
|
Offset
in argument list |
+0 |
+8 |
+16 |
+20 |
|
|
Stored
in argument list |
No |
No |
Yes |
Yes |
|
|
Passed
in Registers |
GPR1 |
GPR3 |
|
|
|
|
Prototype: |
f6( |
struct {double, |
float }, |
int, |
int) |
|
|
Offset
in argument list |
+0 |
+8 |
+16 |
+20 |
|
|
Stored
in argument list |
No |
No |
Yes |
Yes |
|
|
Passed
in Registers |
GPR1/2 |
GPR3 |
|
|
|
|
Prototype: |
f7( |
double, |
long double, |
double) |
|
|
|
Offset in argument list |
+0 |
+8 |
+24 |
|
|
|
Stored in argument list |
No |
No |
Yes |
|
|
|
Passed in Registers |
FPR0 |
FPR4/6 |
|
|
|
|
Parameter Adjust |
100000/000000/100000/100000 |
Prototype: |
f8( |
int, |
long double, |
int, |
double, |
int, |
double) |
Offset in argument list |
+0 |
+4 |
+20 |
+24 |
+32 |
+36 |
Stored in argument list |
No |
No |
Yes |
No |
Yes |
No |
Passed in Registers |
GPR1 |
FPR0/2 |
|
FPR4 |
|
FPR6 |
Parameter Adjust |
100001/100000/100001/100001 |
Prototype: |
f9( |
double, |
double, |
double, |
long double) |
|
|
Offset in argument list |
+0 |
+8 |
+16 |
+24 |
|
|
Stored in argument list |
No |
No |
No |
Yes |
|
|
Passed in Registers |
FPR0 |
FPR2 |
FPR4 |
|
|
|
Parameter Adjust |
100000/100000/100000/000000 |
Prototype: |
f10( |
double, |
double, |
double) |
|
|
|
Offset in argument list |
+0 |
+8 |
+16 |
|
|
|
Stored in argument list |
No |
No |
No |
|
|
|
Passed in Registers |
FPR0 |
FPR2 |
FPR4 |
|
|
|
Parameter Adjust |
100000/100000/100000/000000 |
Prototype: |
f11( |
double, |
double, |
double, |
struct { double, |
double}) |
|
Offset in argument list |
+0 |
+8 |
+16 |
+24 |
+32 |
|
Stored in argument list |
No |
No |
No |
No |
Yes |
|
Passed in Registers |
FPR0 |
FPR2 |
FPR4 |
FPR6 |
|
|
Parameter Adjust |
100000/100000/100000/100000 |
Prototype: |
f12( |
int, |
double, |
...) |
|
|
|
Actual Parameters |
|
|
int |
double |
|
|
Offset in argument list |
+0 |
+4 |
+12 |
+16 |
|
|
Stored in argument list |
No |
No |
Yes |
Yes |
|
|
Passed in Registers |
GPR1 |
FPR0 |
|
|
|
|
Parameter Adjust |
100001/000000/000000/000000 |
Prototype: |
f13( |
double, |
...) |
|
|
|
|
Actual Parameters |
|
double |
|
|
|
|
Offset in argument list |
+0 |
+8 |
+12 |
|
|
|
Stored in argument list |
No |
Yes |
Yes |
|
|
|
Passed in Registers |
FPR0 |
GPR3 |
|
|
|
|
Parameter Adjust |
100000/000000/000000/000000 |
The following two figures show how a C/C++ structure containing
two doubles is used to mimic the native COMPLEX(16) type in PLI (shown
here passed by value).
Prototype: |
f14( |
double |
struct { double, |
double}) |
|
|
|
Offset in argument list |
+0 |
+8 |
+16 |
|
|
|
Stored in argument list |
No |
No |
No |
|
|
|
Passed in Registers |
FPR0 |
FPR2 |
FPR4 |
|
|
|
Parameter Adjust |
100000/100000/100000/000000 |
Prototype:
|
DCL F15 ENTRY( |
FLOAT (16) |
COMPLEX (16) |
|
|
|
Offset in argument list |
+0 |
+8 |
+24 |
|
|
|
Stored in argument list |
No |
No |
No |
|
|
|
Passed in Registers |
FPR0 |
FPR2 |
FPR4 |
|
|
|
Parameter Adjust |
100000/100000/100000/000000 |
The following two figures show how a C/C++ structure containing
two long doubles is used to mimic the native COMPLEX(33) type in PLI.
Prototype: |
f16( |
double, |
struct { long double, |
long double}) |
|
|
|
Offset in argument list |
+0 |
+8 |
+24 |
|
|
|
Stored in argument list |
No |
No |
Yes |
|
|
|
Passed in Registers |
FPR0 |
FPR4/6 |
|
|
|
|
Parameter Adjust |
100000/000000/100000/100000 |
Prototype: |
DCL F17 ENTRY( |
FLOAT (16) |
COMPLEX (33) |
|
|
|
Offset in argument list |
+0 |
+8 |
+24 |
|
|
|
Stored in argument list |
No |
No |
Yes |
|
|
|
Passed in Registers |
FPR0 |
FPR4/6 |
|
|
|
|
Parameter Adjust |
100000/000000/100000/100000 |
The following figures show how unprototyped calls match the conventions
expected by both vararg and non-vararg functions.
Prototype: |
(none) |
Actual Parameters |
int |
int |
double |
|
|
Offset in argument list |
+0 |
+4 |
+8 |
+12 |
|
|
Stored in argument list |
No |
No |
Yes |
Yes |
|
|
Passed
in Registers |
GPR1 |
GPR2 |
GPR3 |
|
|
|
FPR0 |
Parameter Adjust |
(none) |
Prototype: |
f18( |
int, |
...) |
Actual Parameters |
|
int |
double |
|
|
Offset in argument list |
+0 |
+4 |
+8 |
+12 |
|
|
Stored in argument list |
No |
No |
Yes |
Yes |
|
|
Passed in Registers |
GPR1 |
GPR2 |
GPR3 |
|
|
|
Prototype: |
f19( |
int, |
int, |
double) |
|
|
|
Offset in argument list |
+0 |
+4 |
+8 |
|
|
|
Stored in argument list |
No |
No |
No |
|
|
|
Passed in Registers |
GPR1 |
GPR2 |
FPR0 |
|
|
|
Parameter Adjust |
100010/000000/000000/000000 |
Prototype: |
(none) |
Actual Parameters |
int |
int |
double |
float (IEEE) |
|
Offset in argument list |
+0 |
+4 |
+8 |
+12 |
+16 |
|
Stored in argument list |
No |
No |
Yes |
Yes |
Yes |
|
Passed
in Registers |
GPR1 |
GPR2 |
GPR3 |
|
FPR2 |
|
FPR0 |
Parameter Adjust |
(none) |
Prototype: |
f20( |
int, |
...) |
Actual Parameters |
|
int |
double |
float (IEEE) |
|
Offset in argument list |
+0 |
+4 |
+8 |
+12 |
+16 |
|
Stored in argument list |
No |
No |
Yes |
Yes |
Yes |
|
Passed in Registers |
GPR1 |
GPR2 |
GPR3 |
|
|
|
Prototype: |
f21( |
int, |
int, |
double, |
float (IEEE)) |
|
|
Offset in argument list |
+0 |
+4 |
+8 |
+16 |
|
|
Stored in argument list |
No |
No |
No |
No |
|
|
Passed in Registers |
GPR1 |
GPR2 |
FPR0 |
FPR2 |
|
|
Parameter Adjust |
100010/010000/000000/000000 |
Prototype: |
(none) |
Actual Parameters |
int |
float (IEEE) |
double |
long double |
|
Offset in argument list |
+0 |
+4 |
+8 |
+12 |
+16 |
|
Stored in argument list |
No |
No |
Yes |
Yes |
Yes |
|
Passed
in Registers |
GPR1 |
GPR2 |
GPR3 |
|
FPR4
FPR6
|
|
FPR0 |
FPR0 |
Parameter Adjust |
(none) |
Prototype: |
f22( |
int, |
...) |
Actual Parameters |
|
float (IEEE) |
double |
long double |
|
Offset in argument list |
+0 |
+4 |
+8 |
+12 |
+16 |
|
Stored in argument list |
No |
No |
Yes |
Yes |
Yes |
|
Passed in Registers |
GPR1 |
GPR2 |
GPR3 |
|
|
|
Prototype: |
f23( |
int, |
float (IEEE), |
double, |
long double) |
|
|
Offset in argument list |
+0 |
+4 |
+8 |
+16 |
|
|
Stored in argument list |
No |
No |
No |
No |
|
|
Passed in Registers |
GPR1 |
FPR0 |
FPR2 |
FPR4
FPR6
|
|
|
Parameter Adjust |
010001/100000/100000/100000 |
Prototype: |
(none) |
Actual Parameters |
int |
float (Hex) |
int |
long double |
|
|
Offset in argument list |
+0 |
+4 |
+12 |
+16 |
|
|
Stored in argument list |
No |
No |
Yes |
Yes |
|
|
Passed
in Registers |
GPR1 |
GPR2/3 |
|
FPR4
FPR6
|
|
|
FPR0 |
Parameter Adjust |
(none) |
Prototype: |
f24( |
int, |
float (Hex), |
int, |
long double) |
|
|
Offset in argument list |
+0 |
+4 |
+12 |
+16 |
|
|
Stored in argument list |
No |
No |
Yes |
No |
|
|
Passed in Registers |
GPR1 |
FPR0 |
|
FPR4
FPR6
|
|
|
Parameter Adjust |
100001/000000/100001/100000 |
Prototype: |
(none) |
Actual Parameters |
int |
float (IEEE) |
int |
long double |
|
|
Offset in argument list |
+0 |
+4 |
+8 |
+12 |
|
|
Stored in argument list |
No |
No |
No |
Yes |
|
|
Passed
in Registers |
GPR1 |
GPR2 |
GPR3 |
FPR4
FPR6
|
|
|
FPR0 |
Parameter Adjust |
(none) |
Prototype: |
f25( |
int, |
float (IEEE), |
...) |
Actual
Parameters |
|
|
int |
long double |
|
|
Offset
in argument list |
+0 |
+4 |
+8 |
+12 |
|
|
Stored
in argument list |
No |
No |
No |
Yes |
|
|
Passed
in Registers |
GPR1 |
FPR0 |
GPR3 |
|
|
|
Prototype: |
f26( |
int, |
float (IEEE), |
int, |
long double) |
|
|
Offset in argument list |
+0 |
+4 |
+8 |
+12 |
|
|
Stored in argument list |
No |
No |
No |
No |
|
|
Passed in Registers |
GPR1 |
FPR0 |
GPR3 |
FPR4
FPR6
|
|
|
Parameter Adjust |
010001/000000/100001/100000 |
Prototype: |
f27( |
int, |
float (Hex), |
...) |
|
|
|
Actual
Parameters |
|
|
int |
long double |
|
|
Offset
in argument list |
+0 |
+4 |
+12 |
+16 |
|
|
Stored
in argument list |
No |
No |
Yes |
Yes |
|
|
Passed
in Registers |
GPR1 |
FPR0 |
|
|
|
|
The following figures show how
vector type arguments are passed. A vector argument is double-word-aligned
and occupy 16 bytes in the argument list. And in unprototyped calls,
linkage need to match the conventions expected by both vararg and non-vararg functions.
Prototype: |
f28( |
vector double, |
vector signed int |
int) |
|
|
|
Offset
in argument list |
+0 |
+16 |
+32 |
|
|
|
Stored
in argument list |
No |
No |
Yes |
|
|
|
Passed
in Registers |
VR24 |
VR25 |
|
|
|
|
Parameter
Adjust |
(none) |
Prototype: |
f29( |
int, |
vector signed int |
int) |
|
|
|
Offset
in argument list |
+0 |
+4 |
+20 |
|
|
|
Stored
in argument list |
No |
No |
Yes |
|
|
|
Passed
in Registers |
GPR1 |
VR24 |
|
|
|
|
Parameter
Adjust |
(none) |
Prototype: |
|
(none) |
Actual Parameters |
|
int |
int |
vector
double |
Offset
in argument list |
+0 |
+4 |
+8 |
+12 |
+16 |
+20 |
Stored
in argument list |
No |
No |
Yes |
Yes |
Yes |
Yes |
Passed
in Registers |
GPR1 |
GPR2 |
GPR3 |
|
|
|
VR24 |
Parameter
Adjust |
(none) |
Prototype: |
f30( |
int, |
...) |
|
|
|
|
Actual Parameters |
|
int |
int |
vector
double |
Offset
in argument list |
+0 |
+4 |
+8 |
+12 |
+16 |
+20 |
Stored
in argument list |
No |
No |
Yes |
Yes |
Yes |
Yes |
Passed
in Registers |
GPR1 |
GPR2 |
GPR3 |
|
|
|
Parameter
Adjust |
(none) |
Prototype: |
f31( |
int, |
int, |
vector double) |
Offset
in argument list |
+0 |
+4 |
+8 |
+12 |
+16 |
+20 |
Stored
in argument list |
No |
No |
No |
No |
No |
Yes |
Passed in Registers |
|
GPR1 |
GPR2 |
VR24 |
Parameter
Adjust |
(none) |