Pristine Ack-5.5
[Ack-5.5.git] / mach / sparc / libem / libem_s.a
1 eÿcsa.s\0\0\0\0\0\0\0\0\0\0\0\0\0\ 2\ 2¤\ 1\0\0ö\ 1.global     csa
2
3 ECASE=20
4 STACK_CLICK=4
5
6 csa:
7                 ! jump table address in %o0
8                 ! index in %o1
9
10         ld      [%o0], %o4              ! default address
11         ld      [%o0+4], %o2
12         subcc   %o1, %o2, %o1           ! index - lower bound
13         bl      1f
14         ld      [%o0+2*4], %o3
15         cmp     %o1, %o3                ! rel. index, upper - lower bound
16         bgt     1f
17         nop
18         sll     %o1, 2, %o5
19         add     %o0, %o5, %o3           ! %o3 = @jump address
20         ld      [%o3+12], %o2           ! %o2 = jump address
21         tst     %o2
22         be      1f
23         nop
24         jmp     %o2
25         nop
26 1:
27         tst     %o4
28         beq     2f
29         nop
30         jmp     %o4
31         nop
32 2:
33         mov     ECASE, %o0
34         set     trp, %g1
35         jmp     %g1
36         nop
37 .align 4
38 csb.s\0\0\0\0\0\0\0\0\0\0\0\0\0\ 2\ 2¤\ 1\0\0·\ 1.global csb
39 ECASE=20
40
41 csb:
42                 ! case descriptor in %o0
43                 ! index in %o1
44         ld      [%o0], %o2      ! default jump address
45         ld      [%o0+4], %o3    ! # entries
46         inc     8, %o0
47         tst     %o3
48         be      3f
49         nop
50         dec     %o3
51         set     0xffff, %o4
52         and     %o3, %o4, %o5
53         sll     %o5, 3, %o3
54 1:
55         ld      [%o0+%o3], %o4
56         cmp     %o4, %o1
57         be      2f
58         nop
59         deccc   8, %o3
60         bge     1b
61         nop
62         b       3f
63         nop
64 2:      
65         inc     4, %o3
66         ld      [%o0+%o3], %o2
67 3:
68         tst     %o2
69         be      4f
70         nop
71         jmp     %o2
72         nop
73 4:
74         set     ECASE, %o0
75         set     trp, %g1
76         jmp     %g1
77         nop
78 4dvu.s\0\0\0\0\0\0\0\0\0\0\0\0\0\ 2\ 2¤\ 1\0\0b\ 6.global dvu4
79 .global dvi4
80 .global mathdvi4
81
82 EIDIVZ=6
83
84 dvi4:
85 ! %o0' = %o0 / %o1
86 ! %o1' = %o0 % %o1
87         tst     %o1
88         be      0f
89         clr     %o5
90         tst     %o0
91         bge     1f
92         nop
93         neg     %o0
94         xor     %o5, 1, %o5
95 1:
96         tst     %o1
97         bge     3f
98         nop
99         neg     %o1
100         xor     %o5, 2, %o5
101
102 3:      /* div common */
103         clr     %o2
104         mov     %o1, %o3
105         clr     %o4
106
107 4:
108         cmp     %o1, %o0
109         bgeu    5f
110         nop
111         inc     %o4
112         sll     %o1, 1, %o1
113         b       4b
114         nop
115
116 5:
117         sll     %o2, 1, %o2
118         subcc   %o0, %o1, %o0
119         bgeu    3f
120         nop
121         add     %o0, %o1, %o0
122         b       4f
123         nop
124 3:
125         inc     %o2
126 4:
127         srl     %o1, 1, %o1
128         tst     %o4
129         bz      5f
130         nop
131         dec     %o4
132         b       5b
133         nop
134
135 5:
136         andcc   %o5, 1, %g0
137         bz      6f
138         nop
139         neg     %o0
140         neg     %o2
141 6:
142         andcc   %o5, 2, %g0
143         bz      8f
144         nop
145         neg     %o2
146 8:
147         mov     %o0, %o1
148         mov     %o2, %o0
149         retl
150         nop
151
152 dvu4:
153 ! %o0' = %o0 / %o1
154 ! %o1' = %o0 % %o1
155         tst     %o1
156         be      0f
157         nop
158         clr     %o5
159         tst     %o0
160         bge     3f      /* jump if msb clear */
161         nop
162
163         clr     %o2
164         mov     %o1, %o3
165         clr     %o4
166 1:      tst     %o1
167         bl      5f      /* jump if msb set */
168         nop
169         sll     %o1, 1, %o1
170         inc     %o4
171         b       1b
172         nop
173
174
175 mathdvi4:
176 ! %o0' = %o0 / %o1
177 ! %o1' = %o0 % %o1
178         tst     %o1
179         be      0f
180         clr     %o5
181         tst     %o0
182         bge     1f
183         nop
184         neg     %o0
185         xor     %o5, 1, %o5
186 1:
187         tst     %o1
188         bge     3f
189         nop
190         neg     %o1
191         xor     %o5, 3, %o5
192
193 3:      /* div common */
194         clr     %o2
195         mov     %o1, %o3
196         clr     %o4
197
198 4:
199         cmp     %o1, %o0
200         bgeu    5f
201         nop
202         inc     %o4
203         sll     %o1, 1, %o1
204         b       4b
205         nop
206
207 5:      /* div common for dvu4 && ( %o0 & 0x80000000) */
208         sll     %o2, 1, %o2
209         subcc   %o0, %o1, %o0
210         bgeu    3f
211         nop
212         add     %o0, %o1, %o0
213         b       4f
214         nop
215 3:
216         inc     %o2
217 4:
218         srl     %o1, 1, %o1
219         tst     %o4
220         bz      5f
221         nop
222         dec     %o4
223         b       5b
224         nop
225
226 5:
227         andcc   %o5, 1, %g0
228         bz      6f
229         nop
230         tst     %o0
231         bz      7f
232         nop
233         inc     %o2
234         sub     %o3, %o0, %o0
235 7:
236         neg     %o2
237 6:
238         andcc   %o5, 2, %g0
239         bz      8f
240         nop
241         neg     %o0
242 8:
243         mov     %o0, %o1
244         mov     %o2, %o0
245         retl
246         nop
247
248 0:                                      /* divide by zero */
249         set     EIDIVZ, %o0
250         call    trp
251         nop
252         retl
253         nop
254 lar.s\0\0\0\0\0\0\0\0\0\0\0\0\0\ 2\ 2¤\ 1\0\0;\ 6.global aar
255 .global lar
256 .global sar
257
258 aar:    ! %o0 = descr   %o1 = index     %o2 = array_ptr
259
260         save    %sp, -64, %sp
261         ld      [%i0], %o0      ! lower bound
262         subcc   %i1, %o0, %o1   ! 0..N-1
263         bl      1f              ! <0
264         nop
265         ld      [%i0+4], %o0    ! n
266         cmp     %o1, %o0
267         bgt     1f              ! > N
268         nop
269         call    mli4            ! descr *= n.size
270         ld      [%i0+8], %o0    ! el.size
271         add     %i2, %o0, %i0   ! &base_addr[n]
272         ret
273         restore                 ! delay slot
274 1:      restore 
275         set     EARRAY, %o0
276         call    trp
277         nop
278         retl
279         nop
280
281 lar:    ! %o0 = descr   %o1 = index     %o2 = array_ptr
282         
283         mov     %o7, %o4
284         call    aar
285         mov     %o0, %o3
286         mov     %o4, %o7
287         
288         ! %o0 = address of el, %o1 = sizeof(el), %o2 = word, %o3 = descr
289         ld      [%o3+8], %o1    ! el.size
290         cmp     %o1, 1
291         bne     2f      
292         nop
293         ldub    [%o0], %o2      ! el.size == 1
294         dec     4, %l0
295         retl
296         st      %o2, [%l0]      ! delay slot
297 2:      cmp     %o1,2
298         bne     3f
299         nop
300         lduh    [%o0], %o2      ! el.size == 2
301         dec     4, %l0
302         retl
303         st      %o2, [%l0]      ! delay slot
304 3:      cmp     %o1, 4
305         bne     4f
306         nop
307         ld      [%o0], %o2
308         dec     4, %l0
309         retl
310         st      %o2, [%l0]      ! delay slot
311 4:      sub     %l0, %o1, %l0
312 5:      deccc   4, %o1
313         ld      [%o0+%o1], %o2
314         bnz     5b
315         st      %o2, [%l0+%o1]
316         retl
317         nop
318
319 sar:    ! %o0 = descr   %o1 = index     %o2 = array_ptr
320         
321         mov     %o7, %o4
322         call    aar
323         mov     %o0, %o3
324         mov     %o4, %o7
325         
326         ! %o0 = address of el, %o1 = sizeof(el), %o2 = word, %o3 = descr
327
328         ld      [%o3+8], %o1    ! el.size
329         cmp     %o1, 1
330         bne     2f      
331         nop
332         ld      [%l0], %o2
333         stb     %o2, [%o0]
334         retl
335         inc     4, %l0          ! delay slot
336 2:      cmp     %o1,2
337         bne     3f
338         nop
339         ld      [%l0], %o2
340         sth     %o2, [%o0]
341         retl
342         inc     4, %l0          ! delay slot
343 3:      cmp     %o1, 4
344         bne     4f
345         nop
346         ld      [%l0], %o2
347         st      %o2, [%o0]
348         retl
349         inc     4, %l0          ! delay slot
350
351 4:      mov     %o1, %o4
352 5:      deccc   4, %o1
353         ld      [%l0+%o1], %o2
354         bnz     5b
355         st      %o2, [%o0+%o1]  ! delay slot
356         retl
357         add     %l0, %o4, %l0   ! delay slot
358         muldiv.s\0\0\0\0\0\0\0\0\0\0\ 2\ 2¤\ 1\0\0=
359 .global mli4
360 .global mlu4
361
362 mli4:
363         mov     %o0, %y
364         andncc  %o0, 0xfff, %g0
365         bn      mul_shortway1
366         nop
367         andcc   %g0, %g0, %o4
368
369         mulscc  %o4, %o1, %o4
370         mulscc  %o4, %o1, %o4
371         mulscc  %o4, %o1, %o4
372         mulscc  %o4, %o1, %o4
373         mulscc  %o4, %o1, %o4
374         mulscc  %o4, %o1, %o4
375         mulscc  %o4, %o1, %o4
376         mulscc  %o4, %o1, %o4
377         mulscc  %o4, %o1, %o4
378         mulscc  %o4, %o1, %o4
379         mulscc  %o4, %o1, %o4
380         mulscc  %o4, %o1, %o4
381         mulscc  %o4, %o1, %o4
382         mulscc  %o4, %o1, %o4
383         mulscc  %o4, %o1, %o4
384         mulscc  %o4, %o1, %o4
385         mulscc  %o4, %o1, %o4
386         mulscc  %o4, %o1, %o4
387         mulscc  %o4, %o1, %o4
388         mulscc  %o4, %o1, %o4
389         mulscc  %o4, %o1, %o4
390         mulscc  %o4, %o1, %o4
391         mulscc  %o4, %o1, %o4
392         mulscc  %o4, %o1, %o4
393         mulscc  %o4, %o1, %o4
394         mulscc  %o4, %o1, %o4
395         mulscc  %o4, %o1, %o4
396         mulscc  %o4, %o1, %o4
397         mulscc  %o4, %o1, %o4
398         mulscc  %o4, %o1, %o4
399         mulscc  %o4, %o1, %o4
400         mulscc  %o4, %o1, %o4
401         mulscc  %o4, %g0, %o4
402
403         tst     %o0
404         rd      %y, %o0
405         bge     1f
406         tst     %o0
407         sub     %o4, %o1, %o4
408 1:      retl
409         mov     %o4, %o1
410
411 mul_shortway1:
412         mulscc  %o4, %o1, %o4
413         mulscc  %o4, %o1, %o4
414         mulscc  %o4, %o1, %o4
415         mulscc  %o4, %o1, %o4
416         mulscc  %o4, %o1, %o4
417         mulscc  %o4, %o1, %o4
418         mulscc  %o4, %o1, %o4
419         mulscc  %o4, %o1, %o4
420         mulscc  %o4, %o1, %o4
421         mulscc  %o4, %o1, %o4
422         mulscc  %o4, %o1, %o4
423         mulscc  %o4, %o1, %o4
424         mulscc  %o4, %g0, %o4
425
426         rd      %y, %o5
427         sll     %o4, 12, %o0
428         srl     %o5, 20, %o5
429
430         or      %o5, %o4, %o0
431         retl
432         mov     %o4, %o1
433
434 mlu4:
435         or      %o0, %o1, %o4
436         mov     %o0, %y
437         andncc  %o4, 0xfff, %o5
438         bn      mul_shortway2
439         andcc   %g0, %g0, %o4
440
441         mulscc  %o4, %o1, %o4
442         mulscc  %o4, %o1, %o4
443         mulscc  %o4, %o1, %o4
444         mulscc  %o4, %o1, %o4
445         mulscc  %o4, %o1, %o4
446         mulscc  %o4, %o1, %o4
447         mulscc  %o4, %o1, %o4
448         mulscc  %o4, %o1, %o4
449         mulscc  %o4, %o1, %o4
450         mulscc  %o4, %o1, %o4
451         mulscc  %o4, %o1, %o4
452         mulscc  %o4, %o1, %o4
453         mulscc  %o4, %o1, %o4
454         mulscc  %o4, %o1, %o4
455         mulscc  %o4, %o1, %o4
456         mulscc  %o4, %o1, %o4
457         mulscc  %o4, %o1, %o4
458         mulscc  %o4, %o1, %o4
459         mulscc  %o4, %o1, %o4
460         mulscc  %o4, %o1, %o4
461         mulscc  %o4, %o1, %o4
462         mulscc  %o4, %o1, %o4
463         mulscc  %o4, %o1, %o4
464         mulscc  %o4, %o1, %o4
465         mulscc  %o4, %o1, %o4
466         mulscc  %o4, %o1, %o4
467         mulscc  %o4, %o1, %o4
468         mulscc  %o4, %o1, %o4
469         mulscc  %o4, %o1, %o4
470         mulscc  %o4, %o1, %o4
471         mulscc  %o4, %o1, %o4
472         mulscc  %o4, %o1, %o4
473         mulscc  %o4, %g0, %o4
474
475         tst     %o0
476         bge     1f
477         nop
478         add     %o4, %o0, %o4
479 1:
480         rd      %y, %o0
481         retl
482         addcc   %o4, %g0, %o1
483
484 mul_shortway2:
485         mulscc  %o4, %o1, %o4
486         mulscc  %o4, %o1, %o4
487         mulscc  %o4, %o1, %o4
488         mulscc  %o4, %o1, %o4
489         mulscc  %o4, %o1, %o4
490         mulscc  %o4, %o1, %o4
491         mulscc  %o4, %o1, %o4
492         mulscc  %o4, %o1, %o4
493         mulscc  %o4, %o1, %o4
494         mulscc  %o4, %o1, %o4
495         mulscc  %o4, %o1, %o4
496         mulscc  %o4, %o1, %o4
497         mulscc  %o4, %g0, %o4
498
499         rd      %y, %o5
500         sll     %o4, 12, %o0
501         srl     %o5, 20, %o5
502
503         or      %o5, %o4, %o0
504         retl
505         addcc   %g0, %g0, %o1
506
507 \0fif.s\0.s\0\0\0\0\0\0\0\0\0\0\ 2\ 2¤\ 1\0\0¡\ 3.global fif8, Fd0, Fd1, Fd80000000, Fs80000000, Fs0
508
509 .align 8
510 Fd0:
511 .double 0r0
512 Fd1:
513 .double 0r1
514 FxE15:
515 .word 0x43300000, 0x0   ! magic const: (a.b + x) - x == a.0
516 Fd80000000:
517 .align 8
518 .double 0r4294967296
519 Fs80000000:
520 .single 0r4294967296
521 Fs0:
522 .single 0r0
523
524 fif8:
525         ld      [%l0], %f0
526         ld      [%l0+4], %f1
527         ld      [%l0+8], %f2
528         ld      [%l0+12], %f3
529         fmuld   %f0, %f2, %f0
530         fmovs   %f0, %f6
531         fmovs   %f1, %f7
532         set     Fd0, %o0
533         ldd     [%o0], %f8
534         fcmpd   %f0, %f8
535         nop
536         fbuge,a 1f
537         mov     %g0, %o1
538         set     1, %o1
539         fnegs   %f0, %f0
540 1:
541         set     FxE15, %o0
542         ldd     [%o0], %f10
543         fcmpd   %f0, %f10
544         nop
545         fbuge   2f
546         nop
547         faddd   %f0, %f10, %f4
548         fsubd   %f4, %f10, %f4
549         fsubd   %f0, %f4, %f2
550         set     Fd1, %o0
551         ldd     [%o0], %f12
552 4:      fcmpd   %f2, %f12
553         nop
554         fbge,a  4b
555         fsubd   %f2, %f12, %f2
556 5:      fcmpd   %f2, %f8
557         nop
558         fbl,a   5b
559         faddd   %f2, %f12, %f2
560         fsubd   %f0, %f2, %f0
561 2:
562         tst     %o1
563         bz      3f
564         nop
565         fnegs   %f0, %f0
566 3:
567         fsubd   %f6, %f0, %f2
568         st      %f0, [%l0]
569         st      %f1, [%l0+4]
570         st      %f2, [%l0+8]
571         st      %f3, [%l0+12]
572         retl
573         nop
574 rfef.s\0.s\0\0\0\0\0\0\0\0\0\0\ 2\ 2¤\ 1\0\0¡\ 2#
575 .global fef8, Fd0
576
577 fef8:
578         dec     4,%l0
579         ld      [%l0+4], %f0
580         ld      [%l0+8], %f1
581         set     Fd0, %o0
582         ldd     [%o0], %f8
583         fcmpd   %f0, %f8
584         nop
585         fbne    1f
586         nop
587         st      %g0,[%l0]
588         retl
589         nop
590 1:      
591 #ifdef __solaris
592         fdtoq   %f0,%f0
593 #else
594         fdtox   %f0,%f0
595 #endif
596         st      %f0,[%l0+4]
597         ld      [%l0+4],%o0
598         srl     %o0,16,%o0
599         set     0x7fff,%o2
600         and     %o0,%o2,%o1
601         set     16382,%o3
602         sub     %o1,%o3,%o1
603         set     1024,%o2
604         cmp     %o1,%o2
605         bl      1f
606         nop
607         mov     %o2,%o1
608 1:
609         st      %o1,[%l0]
610         set     0x8000,%o2
611         and     %o0,%o2,%o0
612         or      %o0,%o3,%o0
613         sll     %o0,16,%o0
614         ld      [%l0+4],%o1
615         set     0xffff,%o2
616         and     %o1,%o2,%o1
617         or      %o1,%o0,%o0
618         st      %o0,[%l0+4]
619         ld      [%l0+4],%f0
620 #ifdef __solaris
621         fqtod   %f0,%f0
622 #else
623         fxtod   %f0,%f0
624 #endif
625         st      %f0,[%l0+4]
626         st      %f1,[%l0+8]
627         retl
628         nop
629         nop.s\0.s\0\0\0\0\0\0\0\0\0\0\ 2\ 2¤\ 1\0\0\1d\0.global nop
630
631 nop:
632         retl
633         nop
634 eshp.s\0.s\0\0\0\0\0\0\0\0\0\0\ 2\ 2¤\ 1\0\0¾\ 1.global      strhp
635 EHEAP=17
636
637 strhp:                          ! %o0 = new heap pointer
638         save    %sp, -64, %sp
639         set     reghp, %o1
640         st      %i0, [%o1]      ! it'll probably go right, anyway
641         set     limhp, %o1
642         ld      [%o1], %o2
643         cmp     %i0, %o2
644         blt     1f
645         nop
646         add     %i0, 0x400, %i0 ! extra 1K
647         andn    %i0, 0x3ff, %o0
648         st      %o0, [%o1]      ! prematurely set limhp
649         call    brk
650         nop
651         tst     %o0
652         blt     2f              ! failed
653         nop
654         set     limhp, %o1
655         st      %o0, [%o1]
656 1:      ret
657         restore
658 2:      
659         restore
660         set     EHEAP, %o0
661         set     trp, %o1
662         jmp     %o1
663         nop
664 trp.s\0.s\0\0\0\0\0\0\0\0\0\0\ 2\ 2¤\ 1\0\0¤\ 1.global trp, write
665
666 trp:
667         set     trpim, %o1
668         ld      [%o1], %o2
669         srl     %o2, %o0, %o1
670         andcc   %o2, 1, %g0
671         bz      2f
672         nop
673         retl
674         nop
675 2:
676         set     trppc, %o2
677         ld      [%o2], %o1
678         tst     %o1
679         bz      1f
680         nop
681         st      %g0,[%o2]
682         dec     4, %l0
683         st      %o0, [%l0]
684         jmp     %o1
685         nop
686 1:
687         save    %sp, -64, %sp
688         set     2, %o0
689         set     message, %o1
690         set     message_high-message, %o2
691         call    write   
692         nop
693         restore
694         ta      2
695         st      %g0, [%g0]
696
697 message:
698         .ascii  "the error code is in %o0\n"
699 message_high:
700 cfu.s\0.s\0\0\0\0\0\0\0\0\0\0\ 2\ 2¤\ 1\0\0Ê\ 2.global cfu4, cfu8
701
702 .align 8
703 Fdmaxint:
704 .double 0r2147483648
705 Fsmaxint:
706 .single 0r2147483648
707 maxint:
708 .word   0x80000000
709
710 cfu4:
711         ld      [%l0], %f0
712         set     Fsmaxint, %o0
713         ld      [%o0], %f1
714         fcmps   %f0, %f1
715         nop
716         fbul    1f
717         nop
718         fsubs   %f0, %f1, %f0
719         fstoi   %f0, %f1
720         st      %f1,[%l0]
721         ld      [%l0],%o0
722         set     maxint, %o1
723         ld      [%o1],%o2
724         add     %o0, %o2, %o0
725         ba      2f
726         nop
727 1:
728         fstoi   %f0, %f1
729         st      %f1,[%l0]
730         ld      [%l0],%o0
731 2:
732         inc     4,%l0
733         retl
734         nop
735
736 cfu8:
737         ld      [%l0], %f0
738         ld      [%l0+4], %f1
739         set     Fdmaxint, %o0
740         ldd     [%o0], %f2
741         fcmpd   %f0, %f2
742         nop
743         fbul    1f
744         nop
745         fsubd   %f0, %f2, %f0
746         fdtoi   %f0, %f2
747         st      %f2,[%l0]
748         ld      [%l0],%o0
749         set     maxint, %o1
750         ld      [%o1],%o2
751         add     %o0, %o2, %o0
752         ba      2f
753         nop
754 1:
755         fdtoi   %f0, %f2
756         st      %f2,[%l0]
757         ld      [%l0],%o0
758 2:
759         inc     8,%l0
760         retl
761         nop