+
+
+
+# Almost identical to the above piece of code
+# see comments near end for differences
+
+# Even more tricky! Calls the specified function using
+# stdcall convention, *but* assumes that I myself was called
+# using ccall.
+
+.globl ADD_UNDERSCORE(universal_call_c_x86_stdcall)
+ADD_UNDERSCORE(universal_call_c_x86_stdcall:)
+ pushl %ebp
+ movl %esp,%ebp
+ pushl %edi
+ pushl %esi
+ pushl %ebx
+ movl 12(%ebp),%esi
+ movl 16(%ebp),%edi
+ movl 8(%ebp),%ebx
+ testl %ebx,%ebx
+ jle .Lsdocall
+
+.Lslooptop:
+ cmpb $105,(%ebx,%edi) # 'i'
+ jne .Ls6
+ pushl (%esi,%ebx,8)
+ jmp .Lslooptest
+.Ls6:
+ cmpb $73,(%ebx,%edi) # 'I'
+ jne .Ls8
+ pushl 4(%esi,%ebx,8)
+ pushl (%esi,%ebx,8)
+ jmp .Lslooptest
+.Ls8:
+ cmpb $102,(%ebx,%edi) # 'f'
+ jne .Ls10
+ movl (%esi,%ebx,8),%eax
+ pushl %eax
+ jmp .Lslooptest
+.Ls10:
+ cmpb $70,(%ebx,%edi) # 'F'
+ jne .Lslooptest
+ movl 4(%esi,%ebx,8),%eax
+ movl (%esi,%ebx,8),%edx
+ pushl %eax
+ pushl %edx
+.Lslooptest:
+ decl %ebx
+ testl %ebx,%ebx
+ jg .Lslooptop
+
+.Lsdocall:
+ call *20(%ebp)
+
+ cmpb $102,(%edi) # 'f'
+ je .Lsfloat32
+ cmpb $70,(%edi) # 'F'
+ je .Lsfloat64
+.LsiorI:
+ movl %eax,0(%esi)
+ movl %edx,4(%esi)
+ jmp .Lsbye
+.Lsfloat32:
+ fstps 0(%esi)
+ jmp .Lsbye
+.Lsfloat64:
+ fstpl 0(%esi)
+ jmp .Lsbye
+.Lsbye:
+ /* don_t clear the args -- the callee does it */
+ /* leal -12(%ebp),%esp */
+ popl %ebx
+ popl %esi
+ popl %edi
+ leave
+ /* ret $16 # but we have to clear our own! (no! we were ccall_d) */
+ ret
+