Annotation of OpenXM_contrib/pari/src/kernel/sparcv8/level0_sparcv8_super.S, Revision 1.1.1.1
1.1 maekawa 1: /* $Id: level0_sparcv8_super.S,v 1.1.1.1 1999/09/16 13:47:58 karim Exp $ */
2:
3: /* This file defines some "level 0" kernel functions for SPARC V8 */
4: /* These are optimised for SuperSparc */
5: /* The following symbols are defined in this file : */
6: /* divll bfffo (& tabshi) */
7: /* But divll have to use hiremainder, so it is different when */
8: /* hiremainder is inline or not */
9: /* If libpari.so is compiled with gcc, you should compile all */
10: /* files with gcc */
11:
12: #if defined(sun) || defined(NeXT)
13: # ifdef __STDC__
14: # define C(entrypoint) _##entrypoint
15: # else
16: # define C(entrypoint) _/**/entrypoint
17: # endif
18: #elif defined(linux)
19: # define C(entrypoint) entrypoint
20: #endif
21: #if defined(sun) || defined(linux)
22: # define GLOBL .global
23: #elif defined(NeXT)
24: # define GLOBL .globl
25: #endif
26:
27: #if defined(sun) || defined(linux)
28: .seg "data"
29: .align 4
30: C(tabshi): .word 4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0
31:
32: .seg "text"
33: #elif defined(NeXT)
34: .data
35: .align 3
36: C(tabshi):
37: .long 4
38: .long 3
39: .long 2
40: .long 2
41: .long 1
42: .long 1
43: .long 1
44: .long 1
45: .long 0
46: .long 0
47: .long 0
48: .long 0
49: .long 0
50: .long 0
51: .long 0
52: .long 0
53:
54: .text
55: .align 2
56: #endif
57: GLOBL C(bfffo),C(divll)
58:
59: C(bfffo): sethi %hi(65535),%o2
60: or %o2,%lo(65535),%o2
61: cmp %o0,%o2
62: bleu 1f
63: mov 28,%o1
64: mov 12,%o1
65: srl %o0,16,%o0
66: 1: cmp %o0,255
67: bleu 2f
68: cmp %o0,15
69: add %o1,-8,%o1
70: srl %o0,8,%o0
71: cmp %o0,15
72: 2: bleu 3f
73: sethi %hi(C(tabshi)),%o2
74: add %o1,-4,%o1
75: srl %o0,4,%o0
76: 3: or %o2,%lo(C(tabshi)),%o2
77: sll %o0,2,%o3
78: ld [%o3+%o2],%o0
79: retl
80: add %o1,%o0,%o0
81:
82: #ifdef __GNUC__
83: #define SAVE_HI(X) mov X,%g5
84: #define LOAD_HI(X) mov %g5,X
85: #define LOAD_Hi(X)
86: #else
87: #define SAVE_HI(X) st X,[%o4+%lo(C(hiremainder))]
88: #define LOAD_HI(X) sethi %hi(C(hiremainder)),%o4
89: #define LOAD_Hi(X) ld [%o4+%lo(C(hiremainder))],X
90: #endif
91:
92: C(divll): LOAD_HI(%o2)
93: LOAD_Hi(%o2)
94: sethi %hi(0xfff00000),%o5
95: andcc %o5,%o2,%g0
96: bnz,a C(divlllong)
97: subcc %o2,%o1,%g0
98: wr %o2,%g0,%y
99: mov %o0,%o3
100: nop
101: nop
102: udivcc %o0,%o1,%o0
103: bvc 1f
104: umul %o0,%o1,%o5
105: mov 0x2f,%o0
106: call C(pari_err),1
107: nop
108: 1: subcc %o3,%o5,%o2
109: retl
110: SAVE_HI(%o2)
111:
112: #define SS0(label) \
113: addx %o2,%o2,%o2;\
114: subcc %o2,%o1,%o3;\
115: bcc label;\
116: addxcc %o0,%o0,%o0
117:
118: #define SS1(label) \
119: addx %o3,%o3,%o3;\
120: subcc %o3,%o1,%o2;\
121: bcc label;\
122: addxcc %o0,%o0,%o0
123:
124:
125: C(divlllong):
126: blu 1f
127: addcc %o1,%o1,%g0
128: mov 0x2f,%o0
129: call C(pari_err),1
130: nop
131: 1: bcc Lsmalldiv
132: andcc %o1,1,%g0
133: be Levendiv
134: srl %o1,1,%o1
135: add %o1,1,%o1
136: subcc %o2,%o1,%o3
137: bcc Lb01
138: addxcc %o0,%o0,%o0
139: La01: SS0(Lb02)
140: La02: SS0(Lb03)
141: La03: SS0(Lb04)
142: La04: SS0(Lb05)
143: La05: SS0(Lb06)
144: La06: SS0(Lb07)
145: La07: SS0(Lb08)
146: La08: SS0(Lb09)
147: La09: SS0(Lb10)
148: La10: SS0(Lb11)
149: La11: SS0(Lb12)
150: La12: SS0(Lb13)
151: La13: SS0(Lb14)
152: La14: SS0(Lb15)
153: La15: SS0(Lb16)
154: La16: SS0(Lb17)
155: La17: SS0(Lb18)
156: La18: SS0(Lb19)
157: La19: SS0(Lb20)
158: La20: SS0(Lb21)
159: La21: SS0(Lb22)
160: La22: SS0(Lb23)
161: La23: SS0(Lb24)
162: La24: SS0(Lb25)
163: La25: SS0(Lb26)
164: La26: SS0(Lb27)
165: La27: SS0(Lb28)
166: La28: SS0(Lb29)
167: La29: SS0(Lb30)
168: La30: SS0(Lb31)
169: La31: SS0(Lb32)
170: La32: addx %o2,%o2,%o2
171: xor %o0,-1,%o0
172: add %o1,%o1,%o1
173: sub %o1,1,%o1
174: addcc %o0,%o2,%o2
175: bcc 1f
176: subcc %o2,%o1,%o3
177: subcc %o3,%o1,%o2
178: bcs 2f
179: add %o0,1,%o0
180: add %o0,1,%o0
181: 3: retl
182: SAVE_HI(%o2)
183: 1: bcs 3b
184: nop
185: add %o0,1,%o0
186: 2: retl
187: SAVE_HI(%o3)
188:
189: Lb01: SS1(La02)
190: Lb02: SS1(La03)
191: Lb03: SS1(La04)
192: Lb04: SS1(La05)
193: Lb05: SS1(La06)
194: Lb06: SS1(La07)
195: Lb07: SS1(La08)
196: Lb08: SS1(La09)
197: Lb09: SS1(La10)
198: Lb10: SS1(La11)
199: Lb11: SS1(La12)
200: Lb12: SS1(La13)
201: Lb13: SS1(La14)
202: Lb14: SS1(La15)
203: Lb15: SS1(La16)
204: Lb16: SS1(La17)
205: Lb17: SS1(La18)
206: Lb18: SS1(La19)
207: Lb19: SS1(La20)
208: Lb20: SS1(La21)
209: Lb21: SS1(La22)
210: Lb22: SS1(La23)
211: Lb23: SS1(La24)
212: Lb24: SS1(La25)
213: Lb25: SS1(La26)
214: Lb26: SS1(La27)
215: Lb27: SS1(La28)
216: Lb28: SS1(La29)
217: Lb29: SS1(La30)
218: Lb30: SS1(La31)
219: Lb31: SS1(La32)
220: Lb32: addx %o3,%o3,%o2
221: xor %o0,-1,%o0
222: add %o1,%o1,%o1
223: sub %o1,1,%o1
224: addcc %o0,%o2,%o2
225: bcc 1f
226: subcc %o2,%o1,%o3
227: subcc %o3,%o1,%o2
228: bcs 2f
229: add %o0,1,%o0
230: add %o0,1,%o0
231: 3: retl
232: SAVE_HI(%o2)
233: 1: bcs 3b
234: nop
235: add %o0,1,%o0
236: 2: retl
237: SAVE_HI(%o3)
238:
239: Lsmalldiv:
240: addcc %o0,%o0,%o0
241: Lc00: SS0(Ld01)
242: Lc01: SS0(Ld02)
243: Lc02: SS0(Ld03)
244: Lc03: SS0(Ld04)
245: Lc04: SS0(Ld05)
246: Lc05: SS0(Ld06)
247: Lc06: SS0(Ld07)
248: Lc07: SS0(Ld08)
249: Lc08: SS0(Ld09)
250: Lc09: SS0(Ld10)
251: Lc10: SS0(Ld11)
252: Lc11: SS0(Ld12)
253: Lc12: SS0(Ld13)
254: Lc13: SS0(Ld14)
255: Lc14: SS0(Ld15)
256: Lc15: SS0(Ld16)
257: Lc16: SS0(Ld17)
258: Lc17: SS0(Ld18)
259: Lc18: SS0(Ld19)
260: Lc19: SS0(Ld20)
261: Lc20: SS0(Ld21)
262: Lc21: SS0(Ld22)
263: Lc22: SS0(Ld23)
264: Lc23: SS0(Ld24)
265: Lc24: SS0(Ld25)
266: Lc25: SS0(Ld26)
267: Lc26: SS0(Ld27)
268: Lc27: SS0(Ld28)
269: Lc28: SS0(Ld29)
270: Lc29: SS0(Ld30)
271: Lc30: SS0(Ld31)
272: Lc31: SS0(Ld32)
273: Lc32: xor %o0,-1,%o0
274: retl
275: SAVE_HI(%o2)
276:
277: Ld01: SS1(Lc02)
278: Ld02: SS1(Lc03)
279: Ld03: SS1(Lc04)
280: Ld04: SS1(Lc05)
281: Ld05: SS1(Lc06)
282: Ld06: SS1(Lc07)
283: Ld07: SS1(Lc08)
284: Ld08: SS1(Lc09)
285: Ld09: SS1(Lc10)
286: Ld10: SS1(Lc11)
287: Ld11: SS1(Lc12)
288: Ld12: SS1(Lc13)
289: Ld13: SS1(Lc14)
290: Ld14: SS1(Lc15)
291: Ld15: SS1(Lc16)
292: Ld16: SS1(Lc17)
293: Ld17: SS1(Lc18)
294: Ld18: SS1(Lc19)
295: Ld19: SS1(Lc20)
296: Ld20: SS1(Lc21)
297: Ld21: SS1(Lc22)
298: Ld22: SS1(Lc23)
299: Ld23: SS1(Lc24)
300: Ld24: SS1(Lc25)
301: Ld25: SS1(Lc26)
302: Ld26: SS1(Lc27)
303: Ld27: SS1(Lc28)
304: Ld28: SS1(Lc29)
305: Ld29: SS1(Lc30)
306: Ld30: SS1(Lc31)
307: Ld31: SS1(Lc32)
308: Ld32: xor %o0,-1,%o0
309: retl
310: SAVE_HI(%o3)
311:
312: Levendiv:
313: subcc %o2,%o1,%o3
314: bcc Lf01
315: addxcc %o0,%o0,%o0
316: Le01: SS0(Lf02)
317: Le02: SS0(Lf03)
318: Le03: SS0(Lf04)
319: Le04: SS0(Lf05)
320: Le05: SS0(Lf06)
321: Le06: SS0(Lf07)
322: Le07: SS0(Lf08)
323: Le08: SS0(Lf09)
324: Le09: SS0(Lf10)
325: Le10: SS0(Lf11)
326: Le11: SS0(Lf12)
327: Le12: SS0(Lf13)
328: Le13: SS0(Lf14)
329: Le14: SS0(Lf15)
330: Le15: SS0(Lf16)
331: Le16: SS0(Lf17)
332: Le17: SS0(Lf18)
333: Le18: SS0(Lf19)
334: Le19: SS0(Lf20)
335: Le20: SS0(Lf21)
336: Le21: SS0(Lf22)
337: Le22: SS0(Lf23)
338: Le23: SS0(Lf24)
339: Le24: SS0(Lf25)
340: Le25: SS0(Lf26)
341: Le26: SS0(Lf27)
342: Le27: SS0(Lf28)
343: Le28: SS0(Lf29)
344: Le29: SS0(Lf30)
345: Le30: SS0(Lf31)
346: Le31: SS0(Lf32)
347: Le32: addx %o2,%o2,%o2
348: xor %o0,-1,%o0
349: retl
350: SAVE_HI(%o2)
351:
352: Lf01: SS1(Le02)
353: Lf02: SS1(Le03)
354: Lf03: SS1(Le04)
355: Lf04: SS1(Le05)
356: Lf05: SS1(Le06)
357: Lf06: SS1(Le07)
358: Lf07: SS1(Le08)
359: Lf08: SS1(Le09)
360: Lf09: SS1(Le10)
361: Lf10: SS1(Le11)
362: Lf11: SS1(Le12)
363: Lf12: SS1(Le13)
364: Lf13: SS1(Le14)
365: Lf14: SS1(Le15)
366: Lf15: SS1(Le16)
367: Lf16: SS1(Le17)
368: Lf17: SS1(Le18)
369: Lf18: SS1(Le19)
370: Lf19: SS1(Le20)
371: Lf20: SS1(Le21)
372: Lf21: SS1(Le22)
373: Lf22: SS1(Le23)
374: Lf23: SS1(Le24)
375: Lf24: SS1(Le25)
376: Lf25: SS1(Le26)
377: Lf26: SS1(Le27)
378: Lf27: SS1(Le28)
379: Lf28: SS1(Le29)
380: Lf29: SS1(Le30)
381: Lf30: SS1(Le31)
382: Lf31: SS1(Le32)
383: Lf32: addx %o3,%o3,%o3
384: xor %o0,-1,%o0
385: retl
386: SAVE_HI(%o3)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>