|
|
1.1 root 1: /* Copyright 1989 by AT&T Bell Laboratories */
2: #include "tags.h"
3: #include "prof.h"
4: #include "prim.h"
5: #define String(handle,len,str) .align 2;\
6: .long len*power_tags+tag_string;\
7: handle: .ascii str
8: /* args come in as
9: a0 = arg
10: a1 = continuation
11: a2 = closure; can be ignored because contains no free vars
12: a3,a4 = general purpose pointers
13: a5 = pointer temp
14: a6 = data ptr
15: a7 = stack ptr
16: d0 = unused
17: d1,d2,d4 = arithtemps
18: d3 = pointer temp
19: d5 = data limit
20: d6 = store ptr
21: d7 = exception handler
22: */
23: #define Closure(name) .align 2;\
24: .long mak_desc(1,tag_record);\
25: name: .long 7f;\
26: .long 1;\
27: .long tag_backptr;\
28: 7:
29:
30: .text
31: .globl _runvec
32: .align 2
33: .long mak_desc(8,tag_record)
34: _runvec:
35: .long _array_v
36: .long _callc_v
37: .long _create_b_v
38: .long _create_s_v
39: .long _floor_v
40: .long _logb_v
41: .long _scalb_v
42: .long _syscall_v
43:
44: Closure(_array_v)
45: movl a0@,d1 /* a0 = (int * int) */
46: movl a0@(4),d3 /* d3 = initial value */
47: asrl #1,d1 /* d1 = length */
48: movl d1,d2
49: asll #width_tags,d2
50: orl #tag_array,d2 /* d2 = new tag */
51: asll #2,d1
52: 3: movl a6,d4
53: addl d1,d4
54: cmpl d4,d5
55: jmi 6f
56: movl d2,a6@+
57: movl a6,a0
58: jra 2f
59: 1: movl d3,a6@+ /* store default */
60: 2: subql #4,d1
61: jge 1b
62: movl a1@,a2
63: jmp a2@
64:
65: clrl d0
66: 6: trapmi
67: jra 3b
68:
69: Closure(_create_b_v)
70: movl #tag_bytearray,d3
71: jra 2f
72: Closure(_create_s_v)
73: movl #tag_string,d3
74: 2: movl a0,d1
75: asrl #1,d1 /* d1 = length */
76: movl d1,d2
77: asll #width_tags,d2
78: addl d3,d2 /* d2 = new tag */
79: andl #~3,d1 /* d1+4 = bytes in string, not including tag */
80: 3: movl a6,d4
81: addl d1,d4
82: cmpl d4,d5
83: jmi 1f
84: movl d2,a6@+
85: movl a6,a0
86: addl d1,a6
87: clrl a6@+ /* must clear the last 4 bytes */
88: movl a1@,a2
89: jmp a2@
90:
91: clrl d0
92: 1: trapmi
93: jra 3b
94:
95: #define RAISE \
96: movl d7,a1 ; \
97: movl a1@,a2 ; \
98: jra a2@
99:
100: .align 2
101: .globl _handleinterrupt
102: _handleinterrupt:
103: movl #0,sp@-
104: jsr _sigsetmask
105: movl _bottom, sp
106: clrl d3
107: movl d3,a0
108: movl d3,a1
109: movl d3,a2
110: movl d3,a3
111: movl d3,a4
112: movl d3,a5
113: lea _interrupt_e,a0
114: RAISE
115:
116: .globl _saveregs
117: .globl _handle_c
118: .globl _return_c
119: .globl _restoreregs
120: Closure(_handle_c)
121: movl #CAUSE_EXN,_cause;
122: jra _saveregs
123:
124: Closure(_return_c)
125: movl #CAUSE_RET,_cause;
126: _saveregs:
127: movl a6,_saved_dataptr
128: movl d7,_saved_exnptr
129: movl d6,_saved_storeptr
130: movl d5,_saved_limit
131: movl a0,_saved_ptrs
132: movl a1,_saved_ptrs+4
133: movl a2,_saved_ptrs+8
134: movl a3,_saved_ptrs+12
135: movl a4,_saved_ptrs+16
136: movl a5,_saved_ptrs+20
137: movl d3,_saved_ptrs+24
138: movl d1,_saved_nonptrs
139: movl d2,_saved_nonptrs+4
140: movl d4,_saved_nonptrs+8
141: movl _bottom,sp
142: movl _fpsave,a6
143: #ifdef MACH
144: moveml sp@+, a0-a5/d0-d7
145: #endif MACH
146: rts
147:
148: _restoreregs:
149: #ifdef MACH
150: /* C requires callee to save, and NeXT/MACH compiler uses registers */
151: moveml a0-a5/d0-d7,sp@-
152: #endif MACH
153: movl a6,_fpsave
154: movl sp,_bottom
155: movl _saved_dataptr,a6
156: movl _saved_exnptr,d7
157: movl _saved_storeptr,d6
158: movl _saved_limit,d5
159: movl _saved_ptrs,a0
160: movl _saved_ptrs+4,a1
161: movl _saved_ptrs+8,a2
162: movl _saved_ptrs+12,a3
163: movl _saved_ptrs+16,a4
164: movl _saved_ptrs+20,a5
165: movl _saved_ptrs+24,d3
166: movl _saved_nonptrs,d1
167: movl _saved_nonptrs+4,d2
168: movl _saved_nonptrs+8,d4
169: go: movl _saved_pc,sp@-
170: rts
171:
172: /* Floating point primitives
173: *
174: * All the m68code for ML reals assumes that NaN's and INF's are never
175: * generated and therefore do not need to be handled.
176: * This code does not produce NaN's or INF's as long as none are passed to it
177: * and overflow, underflow, and operr are handled.
178: *
179: * Floating exceptions raised (assuming NaN's and INF's are never passed to
180: * functions):
181: * OPERR - (div) for 0.0/0.0 (does NOT also cause DZ)
182: * DZ - (div) for (in range) / 0.0
183: * OVERFLOW/UNDERFLOW - (add,div,sub,mul) as appropriate */
184:
185: Closure(_floor_v)
186: fmoved a0@,fp0
187: ftstx fp0 | handle positive and negative cases separately
188: fblt 1f
189: /* positive numbers */
190: fintrzx fp0,fp0 | round towards zero (down)
191: fmovel fp0,d0
192: asll #1,d0
193: trapv
194: addql #1,d0
195: movl d0,a0
196: movl a1@,a2
197: jmp a2@
198: /* negative numbers */
199: 1: fintrzx fp0,fp1 | round towards zero (up)
200: fmovel fp1,d0
201: asll #1,d0
202: trapv
203: fcmpx fp0,fp1
204: fjeq 1f
205: subql #1,d0
206: trapv
207: movl d0,a0
208: movl a1@,a2
209: jmp a2@
210: 1: addql #1,d0
211: movl d0,a0
212: movl a1@,a2
213: jmp a2@
214:
215: /* returns 0 on 0. */
216: Closure(_logb_v)
217: fgetexpd a0@,fp0
218: fmovel fp0,d0
219: asll #1,d0
220: addql #1,d0
221: movl d0,a0
222: movl a1@,a2
223: jmp a2@
224:
225: Closure(_scalb_v)
226: lea 2f,a0
227: RAISE
228: .align 2
229: .long mak_desc(2,tag_record);
230: 2: .long 1f
231: .long _real_e
232: String(1,19,"scalb unimplemented\0")
233:
234: Closure(_callc_v)
235: movl a1,sp@-
236: movl a0@,a1
237: movl a0@(4),sp@-
238: jsr a1@
239: movl d0,a0
240: addql #4,sp
241: movl sp@+,a1
242: tstl _cause
243: jne _saveregs
244: movl a1@,a2
245: jmp a2@
246:
247: #ifdef sony_news
248: .data
249: .align 2
250: _freestart:
251: .long 0
252: .text
253: #endif sony_news
254:
255: Closure(_syscall_v) /* ARGS: call#, arglist, argcount */
256: movl a0@(8),d0 /* arg count */
257: asrl #1,d0
258: movl d0,d1
259: asll #2,d1
260: subl d1,sp
261: movl sp,a2
262: movl a0@(4),a3
263: 1: subl #1,d0
264: blt 2f
265: movl a3@,d1
266: movl a3@(4),a3
267: btst #0,d1
268: jeq 3f
269: asrl #1,d1
270: 3: movl d1,a2@+
271: jra 1b
272: 2: pea 0
273: movl a0@,d0
274: asrl #1,d0
275: movl d0,sp@-
276: #ifdef sony_news
277: movl a6,_freestart /* save help pointer */
278: movl sp,a6 /* tell kernel args ptr */
279: #endif sony_news
280: trap #0
281: jcs 1f
282: #ifdef sony_news
283: movl _freestart,a6 /* restore heap pointer */
284: #endif sony_news
285: movl a2,sp
286: addl d0,d0
287: addql #1,d0
288: movl d0,a0
289: movl a1@,a2
290: jmp a2@
291:
292: #ifdef sony_news
293: 1: movl _freestart,a6 /* restore heap pointer */
294: movl a2,sp
295: #else
296: 1: movl a2,sp
297: #endif sony_news
298: movl d0,_errno
299: movl #-1,d0
300: movl d0,a0
301: movl a1@,a2
302: jmp a2@
303:
304:
305: #ifndef sony_news
306: #ifndef MACH
307: .globl _minitfp_ /* checks for 68881 and sets flags */
308: .globl _fp_state_mc68881 /* a flag that gets set */
309: #define fp_enabled 2 /* from /usr/src/lib/libc/sun/crt/fpcrttypes.h */
310: #endif MACH
311: #endif sony_news
312: .align 2
313: /* Enable/disable float operand error, overflow, and div. If no 68881
314: is present, nothing happens. */
315: .globl _fpenable
316: .globl _fpdisable
317: _fpenable:
318: #ifndef sony_news
319: #ifndef MACH
320: jsr _minitfp_ /* checks for 68881 and sets flags.
321: normally executed on startup,
322: but won't be if compiled without
323: -f68881 (for possible sun/50
324: compatibility). This is just
325: to make sure. */
326: cmpl #fp_enabled,_fp_state_mc68881
327: jne 1f
328: #endif MACH
329: #endif sony_news
330: fmovel #0x3400,fpcr
331: 1: rts
332: _fpdisable:
333: #ifndef sony_news
334: #ifndef MACH
335: cmpl #fp_enabled,_fp_state_mc68881
336: jne 1f
337: #endif MACH
338: #endif sony_news
339: fmovel #0,fpcr
340: 1: rts
341:
342: /* From here on used to be M68.math.s */
343: .text
344: .align 2
345: .globl _mathvec
346: .long mak_desc(9,tag_record)
347: _mathvec:
348: .long _exp_e
349: .long _ln_e
350: .long _sqrt_e
351: .long _atan_v
352: .long _cos_v
353: .long _exp_v
354: .long _ln_v
355: .long _sin_v
356: .long _sqrt_v
357: end_mathvec:
358:
359: .align 2
360: .globl _math_functor
361: Closure(_math_functor)
362: lea _mathvec,a0
363: movl a1@,a2
364: jmp a2@
365:
366: .align 2
367: .long mak_desc(2,tag_record)
368: _exp_e: .long 1
369: .long 1f
370: .long mak_desc(1,tag_array)
371: 1: .long 1f
372: String(1,3,"Exp\0")
373:
374: .align 2
375: .long mak_desc(2,tag_record)
376: _ln_e: .long 1
377: .long 1f
378: .long mak_desc(1,tag_array)
379: 1: .long 1f
380: String(1,2,"Ln\0\0")
381:
382: .align 2
383: .long mak_desc(2,tag_record)
384: _sqrt_e:
385: .long 1
386: .long 1f
387: .long mak_desc(1,tag_array)
388: 1: .long 1f
389: String(1,4,"Sqrt")
390:
391: Closure(_sin_v)
392: fsind a0@,fp0
393: finishfloat:
394: cmpl a6,d5
395: trapmi
396: movl #mak_desc(8,tag_string),a6@+
397: movl a6,a0
398: fmoved fp0,a6@+
399: movl a1@,a2
400: jmp a2@
401:
402: Closure(_cos_v)
403: fcosd a0@,fp0
404: jra finishfloat
405: Closure(_ln_v)
406: flognd a0@,fp0
407: jra finishfloat
408: Closure(_exp_v)
409: fetoxd a0@,fp0
410: jra finishfloat
411: Closure(_sqrt_v)
412: fsqrtd a0@,fp0
413: jra finishfloat
414: Closure(_atan_v)
415: fatand a0@,fp0
416: jra finishfloat
417:
418: /* this bogosity is for export.c */
419: .globl _startptr
420: _startptr: .long start
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.