-
/* --------------------------------------------------------------------------
* Assembly code to call C and Haskell functions
*
- * Copyright (c) 1994-1999.
+ * Copyright (c) 1994-2001.
*
- * $RCSfile: universal_call_c.S,v $
- * $Revision: 1.5 $
- * $Date: 1999/10/27 11:11:11 $
+ * $Id: universal_call_c.S,v 1.11 2001/02/12 12:08:44 sewardj Exp $
* ------------------------------------------------------------------------*/
#include "config.h"
-#include "options.h"
+
+#if sparc_TARGET_ARCH
+ .text
+only_here_to_work_around_a_bug_in_GNU_ld_291_on_sparc:
+#endif
+
+#if 0 /* later: GHCI */
-#ifdef INTERPRETER
.file "universal_call_c.S"
#if 0
}
}
#endif
-
+
+#if LEADING_UNDERSCORE
+#define ADD_UNDERSCORE(sss) _##sss
+#else
+#define ADD_UNDERSCORE(sss) sss
+#endif
+
#if i386_TARGET_ARCH
-# Tricky! Calls the specified function using ccall convention,
-# *and* assumes that I myself was called using ccall.
+/*
+ * Tricky! Calls the specified function using ccall convention,
+ * *and* assumes that I myself was called using ccall.
+ */
-.globl universal_call_c_x86_ccall
-universal_call_c_x86_ccall:
+.globl ADD_UNDERSCORE(universal_call_c_x86_ccall)
+ADD_UNDERSCORE(universal_call_c_x86_ccall:)
pushl %ebp
movl %esp,%ebp
pushl %edi
movl 16(%ebp),%edi
movl 8(%ebp),%ebx
testl %ebx,%ebx
- jle cdocall
+ jle .Lcdocall
-clooptop:
+.Lclooptop:
cmpb $105,(%ebx,%edi) # 'i'
jne .Lc6
pushl (%esi,%ebx,8)
- jmp clooptest
+ jmp .Lclooptest
.Lc6:
cmpb $73,(%ebx,%edi) # 'I'
jne .Lc8
pushl 4(%esi,%ebx,8)
pushl (%esi,%ebx,8)
- jmp clooptest
+ jmp .Lclooptest
.Lc8:
cmpb $102,(%ebx,%edi) # 'f'
jne .Lc10
movl (%esi,%ebx,8),%eax
pushl %eax
- jmp clooptest
+ jmp .Lclooptest
.Lc10:
cmpb $70,(%ebx,%edi) # 'F'
- jne clooptest
+ jne .Lclooptest
movl 4(%esi,%ebx,8),%eax
movl (%esi,%ebx,8),%edx
pushl %eax
pushl %edx
-clooptest:
+.Lclooptest:
decl %ebx
testl %ebx,%ebx
- jg clooptop
+ jg .Lclooptop
-cdocall:
+.Lcdocall:
call *20(%ebp)
cmpb $102,(%edi) # 'f'
- je cfloat32
+ je .Lcfloat32
cmpb $70,(%edi) # 'F'
- je cfloat64
-ciorI:
+ je .Lcfloat64
+.LciorI:
movl %eax,0(%esi)
movl %edx,4(%esi)
- jmp cbye
-cfloat32:
+ jmp .Lcbye
+.Lcfloat32:
fstps 0(%esi)
- jmp cbye
-cfloat64:
+ jmp .Lcbye
+.Lcfloat64:
fstpl 0(%esi)
- jmp cbye
-cbye:
+ jmp .Lcbye
+.Lcbye:
leal -12(%ebp),%esp
popl %ebx
popl %esi
# stdcall convention, *but* assumes that I myself was called
# using ccall.
-.globl universal_call_c_x86_stdcall
-universal_call_c_x86_stdcall:
+.globl ADD_UNDERSCORE(universal_call_c_x86_stdcall)
+ADD_UNDERSCORE(universal_call_c_x86_stdcall:)
pushl %ebp
movl %esp,%ebp
pushl %edi
movl 16(%ebp),%edi
movl 8(%ebp),%ebx
testl %ebx,%ebx
- jle sdocall
+ jle .Lsdocall
-slooptop:
+.Lslooptop:
cmpb $105,(%ebx,%edi) # 'i'
jne .Ls6
pushl (%esi,%ebx,8)
- jmp slooptest
+ jmp .Lslooptest
.Ls6:
cmpb $73,(%ebx,%edi) # 'I'
jne .Ls8
pushl 4(%esi,%ebx,8)
pushl (%esi,%ebx,8)
- jmp slooptest
+ jmp .Lslooptest
.Ls8:
cmpb $102,(%ebx,%edi) # 'f'
jne .Ls10
movl (%esi,%ebx,8),%eax
pushl %eax
- jmp slooptest
+ jmp .Lslooptest
.Ls10:
cmpb $70,(%ebx,%edi) # 'F'
- jne slooptest
+ jne .Lslooptest
movl 4(%esi,%ebx,8),%eax
movl (%esi,%ebx,8),%edx
pushl %eax
pushl %edx
-slooptest:
+.Lslooptest:
decl %ebx
testl %ebx,%ebx
- jg slooptop
+ jg .Lslooptop
-sdocall:
+.Lsdocall:
call *20(%ebp)
cmpb $102,(%edi) # 'f'
- je sfloat32
+ je .Lsfloat32
cmpb $70,(%edi) # 'F'
- je sfloat64
-siorI:
+ je .Lsfloat64
+.LsiorI:
movl %eax,0(%esi)
movl %edx,4(%esi)
- jmp sbye
-sfloat32:
+ jmp .Lsbye
+.Lsfloat32:
fstps 0(%esi)
- jmp sbye
-sfloat64:
+ jmp .Lsbye
+.Lsfloat64:
fstpl 0(%esi)
- jmp sbye
-sbye:
- ## don_t clear the args -- the callee does it
- ## leal -12(%ebp),%esp
+ 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 $16 # but we have to clear our own! (no! we were ccall_d) */
ret
#endif /* i386_TARGET_ARCH */
-#endif /* INTERPRETER */
\ No newline at end of file
+#endif /* GHCI */