BSD 3 development
[unix-history] / usr / src / cmd / px / 28fun.s
CommitLineData
2595e71b
CH
1#\f
2# 28fun.s
3#
4# BUILT IN FUNCTIONS
5#
6_LLIMIT:
7 incl r10
8 movl (sp)+,r0 #r0 has line limit
9 bgtr l2811
10 movl $0x7fffffff,r0 #non-positive indicates no limit
11l2811:
12 movl *(sp)+,r1 #r1 has file
13 movl r0,LLIMIT(r1)
14 jmp (r8)
15_ARGC:
16 incl r10
17 pushl _argc
18 jmp (r8)
19_ARGV:
20 cvtbl (r10)+,r2
21 bneq l2801
22 cvtwl (r10)+,r2 #r2 has size of character array
23l2801:
24 movl (sp)+,r3 #r3 has addr of character array
25 cvtwl (sp)+,r4 #r4 has subscript into argv
26 blss eargv
27 cmpl r4,_argc
28 bgeq eargv
29 movl *_argv[r4],r4 #r4 has pointer to argv string
30 locc $0,r2,(r4) #find end of string
31 subl3 r0,r2,r0 #calculate actual string length
32 movc5 r0,(r4),$blank,r2,(r3) #move with blank fill
33 jmp (r8)
34eargv:
35 movw $EARGV,_perrno
36 jbr error
37_WCLCK:
38 incl r10
39 pushal -(sp) #space for time
40 calls $1,_time
41 jmp (r8)
42_SCLCK:
43 cvtbl $1,r2
44 brb l2805
45_CLCK:
46 clrl r2
47l2805:
48 incl r10
49 subl2 $16,sp
50 pushl sp
51 calls $1,_times
52 movl (sp)[r2],r0
53 addl2 $16,sp
54 mull2 $1000,r0
55 cvtld r0,r0
56 divd2 $HZ,r0
57 cvtdl r0,-(sp)
58 jmp (r8)
59_DATE:
60 incl r10
61 pushl $O_DATE
62 calls $2,_pdattim
63 jmp (r8)
64_TIME:
65 incl r10
66 pushl $O_TIME
67 calls $2,_pdattim
68 jmp (r8)
69_STLIM:
70 incl r10
71 movl (sp)+,_stlim
72 aoblss _stlim,_stcnt,l2812
73 movw $ESTLIM,_perrno
74 jbr error
75l2812:
76 jmp (r8)
77_SEED:
78 incl r10
79 calls $0,_srand
80 jmp (r8)
81_RANDOM:
82 incl r10
83 calls $0,_rand
84 cvtld r0,r1
85 divd2 maxint,r1
86 movd r1,(sp)
87 jmp (r8)
88maxint:
89 .double 0d2.147483647e+09
90_DISPOSE:
91 incl r10
92 movl (sp)+,r6 #r6 points to pointer
93 pushl (r6) #fetch pointer value
94 calls $1,_pfree #free space
95 clrl (r6) #set pointer to nil
96 jmp (r8)
97_NEW:
98 movzbl (r10)+,r0
99 bneq l2806
100 movzwl (r10)+,r0
101l2806:
102 pushl r0
103 calls $1,_palloc
104 movl r0,*(sp)+
105 jmp (r8)
106_EXPO:
107 incl r10
108 clrl 4(sp)
109 movl (sp)+,r0
110 beql l2807
111 bicl2 $0xffff8000,r0
112 ashl $-7,r0,r0
113 subl2 $128,r0
114 movl r0,(sp)
115l2807:
116 jmp (r8)
117_ATAN:
118 incl r10
119 calls $2,_atan
120 movd r0,-(sp)
121 jmp (r8)
122_COS:
123 incl r10
124 calls $2,_cos
125 movd r0,-(sp)
126 jmp (r8)
127_EXP:
128 incl r10
129 calls $2,_exp
130 movd r0,-(sp)
131 jmp (r8)
132_SIN:
133 incl r10
134 calls $2,_sin
135 movd r0,-(sp)
136 jmp (r8)
137_LN:
138 incl r10
139 tstd (sp)
140 bleq eln
141 calls $2,_log
142 movd r0,-(sp)
143 jmp (r8)
144eln:
145 movw $ELN,_perrno
146 jbr error
147_SQRT:
148 incl r10
149 tstd (sp)
150 blss esqrt
151 calls $2,_sqrt
152 movd r0,-(sp)
153 jmp (r8)
154esqrt:
155 movw $ESQRT,_perrno
156 jbr error
157_CHR2:
158 incl r10
159 movw (sp),r0
160 blss echr
161 cmpw r0,$177
162 bgtru echr
163 jmp (r8)
164echr:
165 movw $ECHR,_perrno
166 jbr error
167_CHR4:
168 incl r10
169 movl (sp)+,r0
170 blss echr
171 cmpl r0,$177
172 bgtru echr
173 movw r0,-(sp)
174 jmp (r8)
175_ODD4:
176 movw (sp)+,(sp)
177_ODD2:
178 incl r10
179 bicw2 $0xfffe,(sp)
180 jmp (r8)
181_PRED2:
182 incl r10
183 decw (sp)
184 jmp (r8)
185_PRED4:
186 incl r10
187 decl (sp)
188 jmp (r8)
189_PRED24:
190 incl r10
191 cvtwl (sp)+,r0
192 subl3 $1,r0,-(sp)
193 jmp (r8)
194_SUCC2:
195 incl r10
196 incw (sp)
197 jmp (r8)
198_SUCC4:
199 incl r10
200 incl (sp)
201 jmp (r8)
202_SUCC24:
203 incl r10
204 cvtwl (sp)+,r0
205 addl3 $1,r0,-(sp)
206 jmp (r8)
207_ROUND:
208 incl r10
209 cvtrdl (sp)+,-(sp)
210 jmp (r8)
211_TRUNC:
212 incl r10
213 cvtdl (sp)+,-(sp)
214 jmp (r8)
215_UNDEF:
216 incl r10
217 addl2 $8,sp
218 clrw -(sp)
219 jmp (r8)
220#
221# pack(a,i,z)
222#
223# with: a: array[m..n] of t
224# z: packed array[u..v] of t
225#
226# semantics: for j := u to v do
227# z[j] := a[j-u+i];
228#
229# need to check:
230# 1. i >= m
231# 2. i+(v-u) <= n (i.e. i-m <= (n-m)-(v-u))
232#
233# on stack: lv(z), lv(a), rv(i) (len 2)
234#
235# move w(t)*(v-u+1) bytes from lv(a)+w(t)*(i-m) to lv(z)
236#
237_PACK:
238 cvtbl (r10)+,r0
239 bneq l2809
240 cvtwl (r10)+,r0 #r0 has size of "a" types
241l2809:
242 clrl r1 #r1 := subscript - lower_bound
243 subw3 (r10)+,8(sp),r1
244 cvtwl (r10)+,r3 #r3 := high_bound
245 index r1,$0,r3,r0,$0,r4 #r4 has index of "a"
246 movc3 (r10)+,*4(sp)[r4],*(sp) #make the move
247 addl2 $10,sp #clear the stack
248 jmp (r8)
249#
250# unpack(z,a,i)
251#
252# with: z and a as in pack
253#
254# semantics: for j := u to v do
255# a[j-u+i] := z[j]
256#
257_UNPACK:
258 cvtbl (r10)+,r0
259 bneq l2810
260 cvtwl (r10)+,r0 #r0 has size of "a" types
261l2810:
262 clrl r1 #r1 := subscript - lower_bound
263 subw3 (r10)+,8(sp),r1
264 cvtwl (r10)+,r3 #r3 := high_bound
265 index r1,$0,r3,r0,$0,r4 #r4 has index of "a"
266 movc3 (r10)+,*(sp),*4(sp)[r4] #make the move
267 addl2 $10,sp #clear the stack
268 jmp (r8)