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