|
|
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: r2 = closure; can be ignored because contains no free vars
10: r0 = arg
11: r1 = continuation
12:
13: registers 0-7 can contain only pointers or tagged integers
14: r8 is the data limit
15: registers 9-10 can contain anything except pointers
16: r11 is the store pointer
17: r12 is the data ptr
18: r13 is the exception handler
19: r14 is the stack pointer (mostly unused)
20: r15 is the program counter
21: */
22: #define Closure(name) .align 2;\
23: .long mak_desc(1,tag_record);\
24: name: .long 9f;\
25: .long 1;\
26: .long tag_backptr;\
27: 9:
28:
29: .text
30: .globl _runvec
31: .align 2
32: .long mak_desc(8,tag_record)
33: _runvec:
34: .long _array_v
35: .long _callc_v
36: .long _create_b_v
37: .long _create_s_v
38: .long _floor_v
39: .long _logb_v
40: .long _scalb_v
41: .long _syscall_v
42:
43: Closure(_array_v)
44: 4: ashl $-1,(r0),r9 /* r9 = length */
45: ashl $2,r9,r10
46: addl2 r12,r10
47: addl2 $0x80000000,r10
48: subl2 $4096,r10
49: addl2 r8,r10
50: jgeq 3f
51: ashl $width_tags,r9,r10
52: bisl3 $tag_array,r10,-4(r12)
53: movl 4(r0),r2 /* r2 = initial value */
54: movl r12,r0
55: jbr 2f
56: 1: movl r2,(r12)+ /* store default */
57: 2: sobgeq r9,1b
58: addl2 $4,r12
59: jmp *(r1)
60: 3: movl $0x7fffffff,r8
61: addl3 r12,r8,r9 /* guaranteed to fault */
62: jbr 4b
63:
64: Closure(_create_b_v)
65: movl $tag_bytearray,r4
66: jbr 2f
67: Closure(_create_s_v)
68: movl $tag_string,r4
69: 2: addl3 $13,r0,r10
70: ashl $-3,r10,r10
71: ashl $2,r10,r10 /* r9 = bytes in string including tag */
72: movl r10,r9
73: addl2 r12,r10
74: addl2 $0x80000000,r10
75: subl2 $4096,r10
76: addl2 r8,r10
77: jgeq 3f
78: ashl $-1,r0,r10 /* r10 = length */
79: ashl $width_tags,r10,r10
80: bisl3 r4,r10,-4(r12) /* new tag */
81: movl r12,r0
82: addl2 r9,r12
83: jmp *(r1)
84: 3: movl $0x7fffffff,r8
85: addl3 r12,r8,r9 /* guaranteed to fault */
86: jbr 2b
87:
88: .globl _saveregs
89: .globl _handle_c
90: .globl _return_c
91: .globl _restoreregs
92: Closure(_handle_c)
93: movl $CAUSE_EXN,_cause;
94: jbr _saveregs
95: Closure(_return_c)
96: movl $CAUSE_RET,_cause;
97: _saveregs:
98: subl3 $4,r12,_saved_dataptr
99: movl r13,_saved_exnptr
100: movl r11,_saved_storeptr
101: movq r0,_saved_ptrs
102: movq r2,_saved_ptrs+8
103: movq r4,_saved_ptrs+16
104: movq r6,_saved_ptrs+24
105: /* movl r8,_saved_limit */
106: movq r9,_saved_nonptrs
107: movl _bottom,sp
108: movl _fpsave,fp
109: ret
110:
111: _restoreregs:
112: .word 0x4000
113: movl fp,_fpsave
114: movl sp,_bottom
115: movq _saved_nonptrs,r9
116: addl3 $4,_saved_dataptr,r12
117: movl _saved_exnptr,r13
118: movl _saved_storeptr,r11
119: #ifdef BSD
120: pushl $0
121: calls $1,_sigsetmask
122: #endif
123: #ifdef V9
124: calls $0,_setupsignals
125: #endif
126: subl3 _saved_limit,$0x7fffffff,r8
127: incl r8
128: movq _saved_ptrs,r0
129: movq _saved_ptrs+8,r2
130: movq _saved_ptrs+16,r4
131: movq _saved_ptrs+24,r6
132: go: jmp *_saved_pc
133:
134: /* Floating exceptions raised (assuming ROP's are never passed to functions):
135: * DIVIDE BY ZERO - (div)
136: * OVERFLOW/UNDERFLOW - (add,div,sub,mul) as appropriate
137: *
138: * floor raises integer overflow if the float is out of 32-bit range,
139: * so the float is tested before conversion, to make sure it is in (31-bit)
140: * range */
141:
142: Closure(_floor_v)
143: .byte 0xfd; cvtfl (r0),r9 # cvtgl
144: .byte 0xfd; tstf (r0) # tstg
145: bgeq 1f
146: .byte 0xfd; cvtlf r9,r4 # cvtlg, to handle negative
147: .byte 0xfd; cmpf (r0),r4 # cmpg
148: beql 2f
149: decl r9
150: 2: clrq r4
151: 1: ashl $1,r9,r9
152: bisl3 $1,r9,r0
153: jmp *(r1)
154:
155: Closure(_logb_v)
156: bicl3 $0xffff800f,(r0),r9 # grab exponent
157: ashl $-3,r9,r9
158: subl2 $2048,r9 # unbias
159: bisl3 $1,r9,r0
160: jmp *(r1)
161:
162: Closure(_scalb_v)
163: addl3 r12,r8,r9
164: bicl3 $1,4(r0),r9 # grab add value
165: beql 1f # 0?
166: ashl $3,r9,r9 # shift to exponent field
167: movl (r0),r0 # grab old float
168: bicl3 $0xffff800f,(r0),r10 # grab exponent
169: addl2 r9,r10 # check out the new exponent
170: bleq under # too small?
171: cmpl r10,$0x8000
172: bgeq over # too large?
173: movl 4(r0),4(r12)
174: addl3 (r0),r9,(r12)
175: movl $mak_desc(8,tag_string),-4(r12)
176: movl r12,r0
177: addl2 $12,r12
178: jmp *(r1)
179: 1: movl (r0),r0
180: jmp *(r1)
181: over: moval 1f,r0
182: jbr _raise_real
183: String(1,8,"overflow")
184: under: moval 1f,r0
185: jbr _raise_real
186: String(1,9,"underflow\0\0\0")
187:
188: _raise_real:
189: addl3 r12,r8,r9 /* ensure enough space */
190: moval _real_e,4(r12)
191: movl r0,(r12)
192: movl $mak_desc(2,tag_record),-4(r12)
193: movl r12,r0
194: addl2 $12,r12
195: movl r13,r1
196: jmp *(r13)
197:
198: Closure(_syscall_v) /* ARGS: call#, arglist, argcount */
199: addl3 r12,r8,r9 /* ensure enough space */
200: ashl $-1,8(r0),r9
201: clrl r10
202: movl 4(r0),r5
203: 1: tstl r9
204: jleq 2f
205: decl r9
206: incl r10
207: movl (r5),r2
208: movl 4(r5),r5
209: jlbs r2,3f
210: movl r2,(ap)[r10]
211: jbr 1b
212: 3: ashl $-1,r2,(ap)[r10]
213: jbr 1b
214: 2: ashl $-1,8(r0),(ap)
215: ashl $-1,(r0),r0
216: clrl r2
217: chmk r0
218: jcs 1f
219: addl2 r0,r0
220: incl r0
221: jmp *(r1)
222: 1: movl r0,_errno
223: movl $-1,r0
224: jmp *(r1)
225:
226: Closure(_callc_v)
227: pushl r1
228: pushl 4(r0)
229: calls $1,*(r0)
230: movl (sp)+,r1
231: clrq r2
232: clrq r4
233: tstl _cause
234: jneq _saveregs
235: jmp *(r1)
236:
237: /* this bogosity is for export.c */
238: .globl _startptr
239: _startptr: .long start
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.