Passing Floating-Point Parameters to an Unprototyped Routine

This example differs from the example of Passing Floating-Point Parameters to a Prototyped Routine by the presence of an eyecatcher after the call to fred in the caller's code and the code necessary to perform the default widening rules required by ANSI.

   double a, b, c;
   float  d, e;

   a = b + fred(a, d, (long double)(a + c), e, c);

Caller's code up until call:

   PUSH    2ND DWORD OF c       ; Push upper 4 bytes of c onto stack
   PUSH    1ST DWORD OF c       ; Push lower 4 bytes of c onto stack
   FLD     DWORD_PTR e          ; Load e into 80387, promotion
                                ;  requires no conversion code
   FLD     QWORD_PTR a          ; Load a to calculate p3
   FADD    ST(0), QWORD_PTR c   ; Calculate p3, result is long double
                                ;  from nature of 80387 hardware
   FLD     DWORD_PTR d          ; Load d, no conversion necessary
   FLD     QWORD_PTR a          ; Load a, no conversion necessary
   SUB     ESP, 40              ; Allocate the stack space for
                                ;  parameter list
   CALL    FRED                 ; Make call
   TEST    EAX, 00ae0000h       ; Eyecatcher maps the register parameters
   ADD     ESP, 48              ; Clean up parameters from stack


Calling Conventions
Eyecatchers


Examples of Passing Parameters Using _Optlink