.ad 8
.bm 8
.fm 4
.bt $Copyright (c) 1998-2004 SAP AG$$Page %$
.tm 12
.hm 6
.hs 3
.tt 1 $NME$Project Distributed Database System$vos38a$
.tt 2 $$$
.tt 3 $FerdiF$ N A M E $2000-10-02$
***********************************************************
.nf

.nf


    ========== licence begin  GPL
    Copyright (c) 1998-2004 SAP AG

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    ========== licence end

.fo


.fo
.nf
.sp
Module  :
=========
.sp
Purpose :
.CM *-END-* purpose -------------------------------------
.sp
.cp 3
Define  :

.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :

.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :

.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  :
.sp
.cp 3
Created :
.sp
.cp 3
Version :
.sp
.cp 3
Release :      Date : 2000-10-02
.br
.sp
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Specification:

.CM *-END-* specification -------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Description:

.CM *-END-* description ---------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.nf
.oc _/1
Structure:

.CM *-END-* structure -----------------------------------
.sp 2
**********************************************************
.sp
.cp 10
.nf
.oc _/1
.CM -lll-
Code    :

&if $OS == WIN32 AND $MACH == I386 AND $BIT64 == 1

//****************************************************************************
//*                                                                          *
//*  I N T E L   I A 6 4   ( W I N 6 4)                                      *
//*                                                                          *
//****************************************************************************

//
//  EXTERN_C LONG __stdcall sql38aVdcomCall( IUnknown *lpIUnknown,
//                                           PROC  pProc,
//                                           void* pBufAddr,
//                                           long  BufLen,
//                                           void* pfBufAddr,
//                                           long  fBufLen,
//                                           long  StackSize );
//


// Parameters:
// 
// r32 = lpIUnknown
// r33 = pProc
// r34 = pBufAddr
// r35 = BufLen
// r36 = pfBufAddr,
// r37 = fBufLen
// r38 = StackSize  :	is not needed here


.section .text
.proc sql38aVdcomCall#
.align 32
.global sql38aVdcomCall#

sql38aVdcomCall::

// Allocate the register stack for 7 input parameters, 4 local 
// variables, 8 output registers, and 0 rotating registers.  Note 
// that we may or may not use all 8 output registers.

	alloc	r39 = ar.pfs, 7, 4, 8, 0 ;;

// save preserved registers
	mov	r40 = rp ;; // save return pointer 
	mov	r41 = gp ;; // save global data pointer
	mov	r42 = sp ;; // save stack pointer

// Setup the target function information
	mov	r8  = r33 ;; // get pProc (pointer to function descriptor)
	ld8	r3 = [r8], 8 ;; // load the function's address into B6
	mov	b6 = r3 ;;
	ld8	gp = [r8] ;; // load the function's gp into GP.

// Copy the first 8 floating point parameters into F8 through F15
	mov	r9 = r36 ;; // pfBufAddr
	mov	r10 = r37 ;; // fBufLen

	//mov	r3 = 0x07 ;; // round up fBufLen to a multiple of 8 bytes, note 
	//add	r10 = r10, r3 ;;  // that this should not be necessary.
	//andcm	r10 = r10, r3 ;;

	cmp.eq	p1, p2 = r10, r0 ;;
(p2)	ld8	r8 = [r9], 8 ;;
(p2)	setf.d	f8 = r8 ;;
(p2)	add	r10 = -0x08, r10 ;;

	cmp.eq	p1, p2 = r10, r0 ;;
(p2)	ld8	r8 = [r9], 8 ;;
(p2)	setf.d	f9 = r8 ;;
(p2)	add	r10 = -0x08, r10 ;;

	cmp.eq	p1, p2 = r10, r0 ;;
(p2)	ld8	r8 = [r9], 8 ;;
(p2)	setf.d	f10 = r8 ;;
(p2)	add	r10 = -0x08, r10 ;;

	cmp.eq	p1, p2 = r10, r0 ;;
(p2)	ld8	r8 = [r9], 8 ;;
(p2)	setf.d	f11 = r8 ;;
(p2)	add	r10 = -0x08, r10 ;;

	cmp.eq	p1, p2 = r10, r0 ;;
(p2)	ld8	r8 = [r9], 8 ;;
(p2)	setf.d	f12 = r8 ;;
(p2)	add	r10 = -0x08, r10 ;;

	cmp.eq	p1, p2 = r10, r0 ;;
(p2)	ld8	r8 = [r9], 8 ;;
(p2)	setf.d	f13 = r8 ;;
(p2)	add	r10 = -0x08, r10 ;;

	cmp.eq	p1, p2 = r10, r0 ;;
(p2)	ld8	r8 = [r9], 8 ;;
(p2)	setf.d	f14 = r8 ;;
(p2)	add	r10 = -0x08, r10 ;;

	cmp.eq	p1, p2 = r10, r0 ;;
(p2)	ld8	r8 = [r9], 8 ;;
(p2)	setf.d	f15 = r8 ;;


// Copy the first 8 general parameters into registers R43 through R50.
// Note that R43 through R50 are the output registers for sql38aVdcomCall.
// However, they will be the input registers R32 through R39 for the 
// target function.

	mov	r9  = r34 ;; // pBufAddr
	mov	r10 = r35 ;; // BufLen

	//mov	r3 = 0x07 ;; // round up BufLen to a multiple of 8 bytes, note 
	//add	r10 = r10, r3 ;; // that this should not be necessary
	//andcm	r10 = r10, r3 ;;

	mov	r43 = r32 ;; // lpIUnknown ("this" ptr)

	cmp.eq	p1, p2 = r10, r0 ;;
(p2)	ld8	r44 = [r9], 8 ;;
(p2)	add	r10 = -0x08, r10 ;;

	cmp.eq	p1, p2 = r10, r0 ;;
(p2)	ld8	r45 = [r9], 8 ;;
(p2)	add	r10 = -0x08, r10 ;;

	cmp.eq	p1, p2 = r10, r0 ;;
(p2)	ld8	r46 = [r9], 8 ;;
(p2)	add	r10 = -0x08, r10 ;;

	cmp.eq	p1, p2 = r10, r0 ;;
(p2)	ld8	r47 = [r9], 8 ;;
(p2)	add	r10 = -0x08, r10 ;;

	cmp.eq	p1, p2 = r10, r0 ;;
(p2)	ld8	r48 = [r9], 8 ;;
(p2)	add	r10 = -0x08, r10 ;;

	cmp.eq	p1, p2 = r10, r0 ;;
(p2)	ld8	r49 = [r9], 8 ;;
(p2)	add	r10 = -0x08, r10 ;;

	cmp.eq	p1, p2 = r10, r0 ;;
(p2)	ld8	r50 = [r9], 8 ;;
(p2)	add	r10 = -0x08, r10 ;;

	cmp.eq	p1, p2 = r10, r0 ;;
(p1)	br.cond.spnt.few e38a_call


// Copy all parameters beyond the first 8 parameters and onto 
// the memory stack.

	sub	r3 = sp, r10 ;; // Make space for the rest of the parameters on 
	mov	r2 = 0x0F    ;; // stack.  This space must be a multiple of 16 
	andcm	r3 = r3, r2  ;; // bytes in size.
	mov	sp = r3 ;;

e38a_copy:
	ld8	r2 = [r9], 8 ;;
	st8	[r3] = r2, 8 ;;
	add	r10 = -0x08, r10 ;;
	cmp.eq	p1, p2 = r10, r0 ;;
(p2)	br.cond.sptk.few e38a_copy ;;


e38a_call:
	mov 	r2 = 0x10
	sub	sp = sp, r2 ;; 	// Make space for the parameter scratch area on 
		                // the stack.

	br.call.sptk rp = b6 ;; // Call the target function.

// Restore the saved registers and the previous function state for the register stack.
	mov	rp = r40 ;;
	mov	gp = r41 ;;
	mov	sp = r42 ;;
	mov.i	ar.pfs = r39 ;;

	mov	ret0 = r0 ;; // return value is always zero

	br.ret.sptk rp ;; // return

.endp	sql38aVdcomCall#


&elif $OS = WIN32 AND $MACH == I386 AND BIT64 != 1


;****************************************************************************
;*                                                                          *
;*  I N T E L    I A  3 2   ( W I N 3 2 )                                   *
;*                                                                          *
;****************************************************************************

 TITLE   vos38a.asm
 PAGE    ,80
.386
.MODEL   SMALL,C
 SYSTEM_LINKAGE=1

 ASSUME  CS: CODE32

 CODE32 SEGMENT DWORD USE32 PUBLIC 'CODE'

 ;
 ;  EXTERN_C LONG __stdcall sql38aVdcomCall( IUnknown *lpIUnknown,
 ;                                           PROC  pProc,
 ;                                           void* pDebugStackBufAddr,
 ;                                           long  DebugStackSize,
 ;                                           long  RealStackSize);
 ;
 PUBLIC  sql38aVdcomCall@20
    sql38aVdcomCall@20 PROC NEAR

       push    ebp                     ; enter-sequence
       mov     ebp , esp

       pushfd                          ; save registers
       push    esi
       push    edi
       push    edx
       push    ecx
       push    ebx
       mov     ebx,esp                 ; save param beginn
       sub esp, dword ptr[ebp + 018h]  ; reserve real stack size
       mov ecx, dword ptr[ebp + 014h]  ; load debug stack size (16B elements)
       add esp, 4                      ; this pointer is pushed extra, we don't need reserved space
       shr ecx, 4                      ; convert into count of elements
       mov esi, [ebp + 010h]           ; load source address of debug stack
       mov edi, esp                    ; load destination for parameters in stack

       cld
       test ecx, ecx
       jz short l1
l0:
       movs dword ptr es:[edi], dword ptr[esi]
       add esi, 12                     ; point to the next debug stack frame
       loop l0
l1:

       mov edx, dword ptr[ebp + 008h]
       push edx                        ; this Pointer
       mov edx, dword ptr[ebp + 00Ch]
       call edx
       mov  esp,ebx                    ; in case call-stack was wrong
	                                   ; don't crash ...
    sql38aVdcomCall_ret:
       mov     eax, 0                  ; NO ERROR
       pop     ebx                     ; restore registers
       pop     ecx
       pop     edx
       pop     edi
       pop     esi
       popfd
       pop     ebp                     ; imcomplete leave-sequence
       ret     20                      ; remove 20 bytes parameter
       sql38aVdcomCall@20   ENDP
     CODE32 ENDS
    END

&elif $OS = WIN32 AND $MACH == AMD64

;****************************************************************************
;*                                                                          *
;*  A M D 6 4   ( W I N 6 4 )                                               *
;*                                                                          *
;****************************************************************************
;
; vos38c.asm
;

PUBLIC	?sql38aVdcomCall@@YAJPEAX00_J1@Z

_TEXT	SEGMENT

i$ = 0
type$ = 8
cnt$ = 16
ipar$ = 24
fpar$ = 32
param$ = 40
thisptr$ = 64
func$ = 72
arg$ = 80
argsize$ = 88
stacksize$ = 96

?sql38aVdcomCall@@YAJPEAX00_J1@Z PROC FRAME
; Line 127
$LN90:
	mov	QWORD PTR [rsp+32], r9
	mov	QWORD PTR [rsp+24], r8
	mov	QWORD PTR [rsp+16], rdx
	mov	QWORD PTR [rsp+8], rcx
; use rbp instead of rsp to access local variables
	push	rbp
.PUSHREG rbp
	sub	rsp, 80
.ALLOCSTACK 80
	lea	rbp, QWORD PTR [rsp+32]
.SETFRAME rbp, 32
.ENDPROLOG
; calculate number of arguments
; Line 144
; Line 145
	mov	rax, QWORD PTR argsize$[rbp]
	sar	rax, 4
	mov	QWORD PTR cnt$[rbp], rax
; Line 148
; Line 149
; align stack of neccesary
	cmp	QWORD PTR cnt$[rbp], 4
	jl	SHORT $LN87@sql38aVdco
	and	rax, 1
	cmp	rax, 1
	je	SHORT $LN87@sql38aVdco
	sub	rsp, 8
$LN87@sql38aVdco:
; Line 151
; i = cnt - 1
	mov	rax, QWORD PTR cnt$[rbp]
	dec	rax
	mov	QWORD PTR i$[rbp], rax
	jmp	SHORT $LN86@sql38aVdco
$LN85@sql38aVdco:
; i--
	mov	rax, QWORD PTR i$[rbp]
	dec	rax
	mov	QWORD PTR i$[rbp], rax
$LN86@sql38aVdco:
; while (i >= 0)
	cmp	QWORD PTR i$[rbp], 0
	jl	$LN84@sql38aVdco
; Line 152
; param = arg [i]
	mov	rax, QWORD PTR i$[rbp]
	sal rax, 4
	mov	rcx, rax
	mov	rax, QWORD PTR arg$[rbp]
	add	rax, rcx
	mov	QWORD PTR param$[rbp], rax
; Line 153
; type = param->type
	mov	rax, QWORD PTR param$[rbp]
	movsx	rax, WORD PTR [rax+8]
	mov	QWORD PTR type$[rbp], rax
; Line 155
; if (param->isptr)
	mov	rax, QWORD PTR param$[rbp]
	movsx	eax, BYTE PTR [rax+11]
	test	eax, eax
	je	SHORT $LN83@sql38aVdco
; Line 156
	cmp	QWORD PTR i$[rbp], 0
	jne	SHORT $LN82@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	mov	rdx, QWORD PTR [rax]
	jmp	SHORT $LN81@sql38aVdco
$LN82@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 1
	jne	SHORT $LN80@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	mov	r8, QWORD PTR [rax]
	jmp	SHORT $LN79@sql38aVdco
$LN80@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 2
	jne	SHORT $LN78@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	mov	r9, QWORD PTR [rax]
	jmp	SHORT $LN77@sql38aVdco
$LN78@sql38aVdco:
	mov	rax, QWORD PTR param$[rbp]
	mov	rax, QWORD PTR [rax]
	push rax
$LN77@sql38aVdco:
$LN79@sql38aVdco:
$LN81@sql38aVdco:
	jmp	$LN76@sql38aVdco
$LN83@sql38aVdco:
; Line 157
; if (type == vt_i1 || type == vt_lc_int1) 
	cmp	QWORD PTR type$[rbp], 16
	je	SHORT $LN74@sql38aVdco
	cmp	QWORD PTR type$[rbp], 207
	jne	SHORT $LN75@sql38aVdco
$LN74@sql38aVdco:
; Line 158
	cmp	QWORD PTR i$[rbp], 0
	jne	SHORT $LN73@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movsx	rdx, BYTE PTR [rax]
	jmp	SHORT $LN72@sql38aVdco
$LN73@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 1
	jne	SHORT $LN71@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movsx	r8, BYTE PTR [rax]
	jmp	SHORT $LN70@sql38aVdco
$LN71@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 2
	jne	SHORT $LN69@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movsx	r9, BYTE PTR [rax]
	jmp	SHORT $LN68@sql38aVdco
$LN69@sql38aVdco:
	mov	rax, QWORD PTR param$[rbp]
	movsx	rax, BYTE PTR [rax]
	push rax
$LN68@sql38aVdco:
$LN70@sql38aVdco:
$LN72@sql38aVdco:
	jmp	$LN67@sql38aVdco
$LN75@sql38aVdco:
; Line 159
; if (
; type == vt_bool || type == vt_ui1 ||
; type == vt_lc_char || type == vt_lc_uint1
; )
;
	cmp	QWORD PTR type$[rbp], 17
	je	SHORT $LN65@sql38aVdco
	cmp	QWORD PTR type$[rbp], 209
	je	SHORT $LN65@sql38aVdco
	cmp	QWORD PTR type$[rbp], 201
	je	SHORT $LN65@sql38aVdco
	cmp	QWORD PTR type$[rbp], 11
	jne	SHORT $LN66@sql38aVdco
$LN65@sql38aVdco:
; Line 160
	cmp	QWORD PTR i$[rbp], 0
	jne	SHORT $LN64@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movzx	edx, BYTE PTR [rax]
	jmp	SHORT $LN63@sql38aVdco
$LN64@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 1
	jne	SHORT $LN62@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movzx	r8d, BYTE PTR [rax]
	jmp	SHORT $LN61@sql38aVdco
$LN62@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 2
	jne	SHORT $LN60@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movzx	r9d, BYTE PTR [rax]
	jmp	SHORT $LN59@sql38aVdco
$LN60@sql38aVdco:
	mov	rax, QWORD PTR param$[rbp]
	movzx	eax, BYTE PTR [rax]
	push rax
$LN59@sql38aVdco:
$LN61@sql38aVdco:
$LN63@sql38aVdco:
	jmp	$LN58@sql38aVdco
$LN66@sql38aVdco:
; Line 161
; if (type == vt_i2)
	cmp	QWORD PTR type$[rbp], 2
	jne	SHORT $LN57@sql38aVdco
; Line 162
	cmp	QWORD PTR i$[rbp], 0
	jne	SHORT $LN56@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movsx	rdx, WORD PTR [rax]
	jmp	SHORT $LN55@sql38aVdco
$LN56@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 1
	jne	SHORT $LN54@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movsx	r8, WORD PTR [rax]
	jmp	SHORT $LN53@sql38aVdco
$LN54@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 2
	jne	SHORT $LN52@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movsx	r9, WORD PTR [rax]
	jmp	SHORT $LN51@sql38aVdco
$LN52@sql38aVdco:
	mov	rax, QWORD PTR param$[rbp]
	movsx	rax, WORD PTR [rax]
	push rax
$LN51@sql38aVdco:
$LN53@sql38aVdco:
$LN55@sql38aVdco:
	jmp	$LN50@sql38aVdco
$LN57@sql38aVdco:
; Line 163
;if (type == vt_ui2 || type == vt_lc_wchar)
	cmp	QWORD PTR type$[rbp], 18
	je	SHORT $LN48@sql38aVdco
	cmp	QWORD PTR type$[rbp], 202
	jne	SHORT $LN49@sql38aVdco
$LN48@sql38aVdco:
; Line 164
	cmp	QWORD PTR i$[rbp], 0
	jne	SHORT $LN47@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movzx	edx, WORD PTR [rax]
	jmp	SHORT $LN46@sql38aVdco
$LN47@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 1
	jne	SHORT $LN45@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movzx	r8d, WORD PTR [rax]
	jmp	SHORT $LN44@sql38aVdco
$LN45@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 2
	jne	SHORT $LN43@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movzx	r9d, WORD PTR [rax]
	jmp	SHORT $LN42@sql38aVdco
$LN43@sql38aVdco:
	mov	rax, QWORD PTR param$[rbp]
	movzx	eax, WORD PTR [rax]
	push rax
$LN42@sql38aVdco:
$LN44@sql38aVdco:
$LN46@sql38aVdco:
	jmp	$LN41@sql38aVdco
$LN49@sql38aVdco:
; Line 165
; if (type == vt_i4 || type == vt_int)
	cmp	QWORD PTR type$[rbp], 3
	je	SHORT $LN39@sql38aVdco
	cmp	QWORD PTR type$[rbp], 22
	jne	SHORT $LN40@sql38aVdco
$LN39@sql38aVdco:
; Line 166
	cmp	QWORD PTR i$[rbp], 0
	jne	SHORT $LN38@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movsxd	rdx, DWORD PTR [rax]
	jmp	SHORT $LN37@sql38aVdco
$LN38@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 1
	jne	SHORT $LN36@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movsxd	r8, DWORD PTR [rax]
	jmp	SHORT $LN35@sql38aVdco
$LN36@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 2
	jne	SHORT $LN34@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movsxd	r9, DWORD PTR [rax]
	jmp	SHORT $LN33@sql38aVdco
$LN34@sql38aVdco:
	mov	rax, QWORD PTR param$[rbp]
	movsxd	rax, DWORD PTR [rax]
	push rax
$LN33@sql38aVdco:
$LN35@sql38aVdco:
$LN37@sql38aVdco:
	jmp	$LN32@sql38aVdco
$LN40@sql38aVdco:
; Line 167
; if (type == vt_ui4 || type == vt_uint)
	cmp	QWORD PTR type$[rbp], 19
	je	SHORT $LN30@sql38aVdco
	cmp	QWORD PTR type$[rbp], 23
	jne	SHORT $LN31@sql38aVdco
$LN30@sql38aVdco:
; Line 168
	cmp	QWORD PTR i$[rbp], 0
	jne	SHORT $LN29@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	mov	edx, DWORD PTR [rax]
	jmp	SHORT $LN28@sql38aVdco
$LN29@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 1
	jne	SHORT $LN27@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	mov	r8d, DWORD PTR [rax]
	jmp	SHORT $LN26@sql38aVdco
$LN27@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 2
	jne	SHORT $LN25@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	mov	r9d, DWORD PTR [rax]
	jmp	SHORT $LN24@sql38aVdco
$LN25@sql38aVdco:
	mov	rax, QWORD PTR param$[rbp]
	mov	eax, DWORD PTR [rax]
	push rax
$LN24@sql38aVdco:
$LN26@sql38aVdco:
$LN28@sql38aVdco:
	jmp	$LN23@sql38aVdco
$LN31@sql38aVdco:
; Line 169
; if (type == vt_r4)
	cmp	QWORD PTR type$[rbp], 4
	jne	SHORT $LN22@sql38aVdco
; Line 170
	cmp	QWORD PTR i$[rbp], 0
	jne	SHORT $LN21@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	cvtss2sd xmm1, DWORD PTR [rax]
	jmp	SHORT $LN20@sql38aVdco
$LN21@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 1
	jne	SHORT $LN19@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	cvtss2sd xmm2, DWORD PTR [rax]
	jmp	SHORT $LN18@sql38aVdco
$LN19@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 2
	jne	SHORT $LN17@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	cvtss2sd xmm3, DWORD PTR [rax]
	jmp	SHORT $LN16@sql38aVdco
$LN17@sql38aVdco:
	mov	rax, QWORD PTR param$[rbp]
	cvtss2sd xmm0, DWORD PTR [rax]
	sub rsp, 8
	movlpd  QWORD PTR [rsp], xmm0
$LN16@sql38aVdco:
$LN18@sql38aVdco:
$LN20@sql38aVdco:
	jmp	$LN15@sql38aVdco
$LN22@sql38aVdco:
; Line 171
; if (type == vt_r8)
	cmp	QWORD PTR type$[rbp], 5
	jne	SHORT $LN14@sql38aVdco
; Line 172
	cmp	QWORD PTR i$[rbp], 0
	jne	SHORT $LN13@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movlpd	xmm1, QWORD PTR [rax]
	jmp	SHORT $LN12@sql38aVdco
$LN13@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 1
	jne	SHORT $LN11@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movlpd	xmm2, QWORD PTR [rax]
	jmp	SHORT $LN10@sql38aVdco
$LN11@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 2
	jne	SHORT $LN9@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	movlpd	xmm3, QWORD PTR [rax]
	jmp	SHORT $LN8@sql38aVdco
$LN9@sql38aVdco:
	mov	rax, QWORD PTR param$[rbp]
	movlpd	xmm0, QWORD PTR [rax]
	sub rsp, 8
	movlpd  QWORD PTR [rsp], xmm0
$LN8@sql38aVdco:
$LN10@sql38aVdco:
$LN12@sql38aVdco:
; Line 173
	jmp	SHORT $LN7@sql38aVdco
$LN14@sql38aVdco:
; Line 174
; else /* should be any 8-byte integer type */
	cmp	QWORD PTR i$[rbp], 0
	jne	SHORT $LN6@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	mov	rdx, QWORD PTR [rax]
	jmp	SHORT $LN5@sql38aVdco
$LN6@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 1
	jne	SHORT $LN4@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	mov	r8, QWORD PTR [rax]
	jmp	SHORT $LN3@sql38aVdco
$LN4@sql38aVdco:
	cmp	QWORD PTR i$[rbp], 2
	jne	SHORT $LN2@sql38aVdco
	mov	rax, QWORD PTR param$[rbp]
	mov	r9, QWORD PTR [rax]
	jmp	SHORT $LN1@sql38aVdco
$LN2@sql38aVdco:
	mov	rax, QWORD PTR param$[rbp]
	mov	rax, QWORD PTR [rax]
	push rax
$LN1@sql38aVdco:
$LN3@sql38aVdco:
$LN5@sql38aVdco:
$LN7@sql38aVdco:
$LN15@sql38aVdco:
$LN23@sql38aVdco:
$LN32@sql38aVdco:
$LN41@sql38aVdco:
$LN50@sql38aVdco:
$LN58@sql38aVdco:
$LN67@sql38aVdco:
$LN76@sql38aVdco:
; Line 176
	jmp	$LN85@sql38aVdco
$LN84@sql38aVdco:
; reserve stack for first 4 args if needed
	mov	rax, QWORD PTR cnt$[rbp]
	cmp	rax, 4
	jl	SHORT $LN176@sql38aVdco
	sub rsp, 32
$LN176@sql38aVdco:
; Line 178
	mov	rcx, QWORD PTR thisptr$[rbp]
	call	QWORD PTR func$[rbp]
	cdqe
; Line 179
; restore current rsp
	lea	rsp, QWORD PTR [rbp+48]
; restore current rbp
	pop	rbp
	ret	0
?sql38aVdcomCall@@YAJPEAX00_J1@Z ENDP

_TEXT	ENDS

END

&endif

.CM *-END-* code ----------------------------------------
.SP 2
***********************************************************
.PA


