XPLINK CALL linkage argument examples

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        

Start of changeThe 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.End of change

Start of change
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)
End of change
Start of change
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)
End of change
Start of change
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)
End of change
Start of change
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)
End of change
Start of change
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)
End of change