Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/runtime/c-libs/smlnj-ccalls/c-entry.asm
ViewVC logotype

Annotation of /sml/trunk/src/runtime/c-libs/smlnj-ccalls/c-entry.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2 - (view) (download)

1 : monnier 2 /* c-entry.asm
2 :     *
3 :     * COPYRIGHT (c) 1995 by AT&T Bell Laboratories.
4 :     */
5 :    
6 :     #include "asm-base.h"
7 :    
8 :     #if defined(TARGET_X86)
9 :     #define CALL_BIAS 5
10 :     #define cresult %eax
11 :    
12 :     #elif defined(TARGET_MIPS)
13 :    
14 :     #define CALL_BIAS 20
15 :    
16 :     #define cresult $2
17 :     #define carg0 $4
18 :     #define carg1 $5
19 :     #define carg2 $6
20 :     #define carg3 $7
21 :     /* #define ra $31 */
22 :    
23 :     #define tmp0 $3
24 :     #define tmp1 $8
25 :    
26 :     #elif defined(TARGET_SPARC)
27 :    
28 :     #define CALL_BIAS 8
29 :     #define DELAY nop
30 :    
31 :     #endif
32 :    
33 :     /* offsets must match the C declaration of code_header_t */
34 :     #define NARGS_OFFSET -4
35 :    
36 :     /* grabPC:
37 :     * routine to return the PC at entry to this function
38 :     *
39 :     * NOTE: this code must relocatable using bcopy.
40 :     */
41 :    
42 :     #ifdef OPSYS_WIN32
43 :    
44 :     ENTRY_M MACRO name
45 :     PUBLIC &name
46 :     &name LABEL FAR
47 :     EVEN
48 :     ENDM
49 :    
50 :     .386
51 :     .MODEL FLAT
52 :    
53 :    
54 :     EXTRN _last_entry:DWORD
55 :     EXTRN _no_args_entry:FAR
56 :     EXTRN _some_args_entry:FAR
57 :    
58 :     TEXT
59 :     EVEN
60 :    
61 :     #else
62 :    
63 :     .text
64 :    
65 :     .align 2
66 :     .globl CSYM(grabPC)
67 :     .globl CSYM(grabPCend)
68 :    
69 :     #endif
70 :    
71 :     #if defined(TARGET_X86)
72 :     #if defined(OPSYS_LINUX)
73 :     CSYM(grabPC):
74 :     /*->*/ call grabPCaux /* put pc in %eax */
75 :     subl $CALL_BIAS,%eax /* adjust pc to point at "->" */
76 :     lea CSYM(last_entry),%ecx /* save it */
77 :     movl %eax,(%ecx)
78 :     cmpl $0,NARGS_OFFSET(%eax)
79 :     jne some_args
80 :     lea CSYM(no_args_entry),%ecx
81 :     jmp %ecx
82 :     /* should never get here */
83 :     some_args:
84 :     lea CSYM(some_args_entry),%ecx
85 :     jmp %ecx
86 :     /* should never get here */
87 :    
88 :     /* WARNING: this is x86-linux assembler specific!
89 :     * Above call must be relative.
90 :     */
91 :     grabPCaux:
92 :     pop %eax /* grab return address */
93 :     push %eax /* put it back */
94 :     ret
95 :     CSYM(grabPCend):
96 :     nop
97 :     #elif defined(OPSYS_WIN32)
98 :     PUBLIC CSYM(grabPCend)
99 :     PUBLIC CSYM(grabPC)
100 :     CSYM(grabPC) LABEL FAR
101 :     /*->*/ call grabPCaux /* put pc in %eax */
102 :     sub eax,CALL_BIAS /* adjust pc to point at "->" */
103 :     lea ecx,CSYM(last_entry) /* save it */
104 :     mov dword ptr 0 [ecx],eax
105 :     cmp dword ptr (NARGS_OFFSET) [eax],0
106 :     jne some_args
107 :     lea ecx,CSYM(no_args_entry)
108 :     jmp ecx
109 :     /* should never get here */
110 :     some_args:
111 :     lea ecx,CSYM(some_args_entry)
112 :     jmp ecx
113 :     /* should never get here */
114 :    
115 :     grabPCaux:
116 :     pop eax /* grab return address */
117 :     push eax /* put it back */
118 :     ret
119 :     CSYM(grabPCend) LABEL FAR
120 :    
121 :     DATA
122 :     PUBLIC CSYM(asm_entry_szb)
123 :     CSYM(asm_entry_szb) DWORD CSYM(grabPCend) - CSYM(grabPC)
124 :    
125 :     #else
126 :     #error unknown x86 opsys
127 :     #endif
128 :     #elif defined(TARGET_MIPS)
129 :    
130 :     grabPCaux:
131 :     j tmp1
132 :    
133 :     .align 2
134 :     .ent grabPC 2
135 :     CSYM(grabPC):
136 :     /*->*/ la tmp0,grabPCaux /* load address of grabPCaux */
137 :     jalr tmp1,tmp0 /* call it, putting pc in tmp1 */
138 :     subu tmp1,CALL_BIAS /* adjust pc to point at "->" */
139 :     la tmp0,CSYM(last_entry) /* save it */
140 :     sw tmp1,0(tmp0)
141 :     lw tmp0,NARGS_OFFSET(tmp1)
142 :     bnez tmp0,some_args
143 :     la t9,CSYM(no_args_entry)
144 :     j t9 /* call C, must use t9 here */
145 :     /* should never get here */
146 :     some_args:
147 :     la t9,CSYM(some_args_entry)
148 :     j t9 /* call C, must use t9 here */
149 :     /* should never get here */
150 :     CSYM(grabPCend):
151 :    
152 :     #elif defined(TARGET_SPARC)
153 :     .align 4
154 :     CSYM(grabPC):
155 :     /*->*/ st %o0,[%sp-4] /* get some temps */
156 :     mov %o7,%g1 /* save ret addr in %g1 */
157 :     call grabPCaux /* call leaves pc in %o7 */
158 :     DELAY
159 :     mov %o7,%o0 /* restore ret addr */
160 :     mov %g1,%o7
161 :     sub %o0,CALL_BIAS,%o0 /* unbias saved pc */
162 :     set CSYM(last_entry),%g1 /* store it */
163 :     st %o0,[%g1]
164 :     ld [%o0+NARGS_OFFSET],%o0 /* get # of args */
165 :     tst %o0
166 :     ld [%sp-4],%o0 /* relinquish temps */
167 :     bnz some_args
168 :     nop
169 :     set CSYM(no_args_entry),%g1
170 :     jmp %g1
171 :     nop
172 :     /* should never get here */
173 :     some_args:
174 :     set CSYM(some_args_entry),%g1
175 :     jmp %g1
176 :     nop
177 :     /* should never get here */
178 :    
179 :     grabPCaux:
180 :     /* return address is in %o7 */
181 :     retl
182 :     DELAY
183 :     CSYM(grabPCend):
184 :     #else
185 :     #error unknown target arch
186 :     #endif
187 :    
188 :     #ifdef OPSYS_WIN32
189 :     END
190 :     #elif !defined(TARGET_SPARC)
191 :     .end
192 :     #endif
193 :    
194 :     /* end of c-entry.asm */

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0