Mercurial > hg > CbC > CbC_gcc
comparison gcc/config/pa/milli64.S @ 0:a06113de4d67
first commit
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2009 14:47:48 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:a06113de4d67 |
---|---|
1 /* 32 and 64-bit millicode, original author Hewlett-Packard | |
2 adapted for gcc by Paul Bame <bame@debian.org> | |
3 and Alan Modra <alan@linuxcare.com.au>. | |
4 | |
5 Copyright 2001, 2002, 2003, 2007, 2009 Free Software Foundation, Inc. | |
6 | |
7 This file is part of GCC. | |
8 | |
9 GCC is free software; you can redistribute it and/or modify it under | |
10 the terms of the GNU General Public License as published by the Free | |
11 Software Foundation; either version 3, or (at your option) any later | |
12 version. | |
13 | |
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
17 for more details. | |
18 | |
19 Under Section 7 of GPL version 3, you are granted additional | |
20 permissions described in the GCC Runtime Library Exception, version | |
21 3.1, as published by the Free Software Foundation. | |
22 | |
23 You should have received a copy of the GNU General Public License and | |
24 a copy of the GCC Runtime Library Exception along with this program; | |
25 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |
26 <http://www.gnu.org/licenses/>. */ | |
27 | |
28 #ifdef pa64 | |
29 .level 2.0w | |
30 #endif | |
31 | |
32 /* Hardware General Registers. */ | |
33 r0: .reg %r0 | |
34 r1: .reg %r1 | |
35 r2: .reg %r2 | |
36 r3: .reg %r3 | |
37 r4: .reg %r4 | |
38 r5: .reg %r5 | |
39 r6: .reg %r6 | |
40 r7: .reg %r7 | |
41 r8: .reg %r8 | |
42 r9: .reg %r9 | |
43 r10: .reg %r10 | |
44 r11: .reg %r11 | |
45 r12: .reg %r12 | |
46 r13: .reg %r13 | |
47 r14: .reg %r14 | |
48 r15: .reg %r15 | |
49 r16: .reg %r16 | |
50 r17: .reg %r17 | |
51 r18: .reg %r18 | |
52 r19: .reg %r19 | |
53 r20: .reg %r20 | |
54 r21: .reg %r21 | |
55 r22: .reg %r22 | |
56 r23: .reg %r23 | |
57 r24: .reg %r24 | |
58 r25: .reg %r25 | |
59 r26: .reg %r26 | |
60 r27: .reg %r27 | |
61 r28: .reg %r28 | |
62 r29: .reg %r29 | |
63 r30: .reg %r30 | |
64 r31: .reg %r31 | |
65 | |
66 /* Hardware Space Registers. */ | |
67 sr0: .reg %sr0 | |
68 sr1: .reg %sr1 | |
69 sr2: .reg %sr2 | |
70 sr3: .reg %sr3 | |
71 sr4: .reg %sr4 | |
72 sr5: .reg %sr5 | |
73 sr6: .reg %sr6 | |
74 sr7: .reg %sr7 | |
75 | |
76 /* Hardware Floating Point Registers. */ | |
77 fr0: .reg %fr0 | |
78 fr1: .reg %fr1 | |
79 fr2: .reg %fr2 | |
80 fr3: .reg %fr3 | |
81 fr4: .reg %fr4 | |
82 fr5: .reg %fr5 | |
83 fr6: .reg %fr6 | |
84 fr7: .reg %fr7 | |
85 fr8: .reg %fr8 | |
86 fr9: .reg %fr9 | |
87 fr10: .reg %fr10 | |
88 fr11: .reg %fr11 | |
89 fr12: .reg %fr12 | |
90 fr13: .reg %fr13 | |
91 fr14: .reg %fr14 | |
92 fr15: .reg %fr15 | |
93 | |
94 /* Hardware Control Registers. */ | |
95 cr11: .reg %cr11 | |
96 sar: .reg %cr11 /* Shift Amount Register */ | |
97 | |
98 /* Software Architecture General Registers. */ | |
99 rp: .reg r2 /* return pointer */ | |
100 #ifdef pa64 | |
101 mrp: .reg r2 /* millicode return pointer */ | |
102 #else | |
103 mrp: .reg r31 /* millicode return pointer */ | |
104 #endif | |
105 ret0: .reg r28 /* return value */ | |
106 ret1: .reg r29 /* return value (high part of double) */ | |
107 sp: .reg r30 /* stack pointer */ | |
108 dp: .reg r27 /* data pointer */ | |
109 arg0: .reg r26 /* argument */ | |
110 arg1: .reg r25 /* argument or high part of double argument */ | |
111 arg2: .reg r24 /* argument */ | |
112 arg3: .reg r23 /* argument or high part of double argument */ | |
113 | |
114 /* Software Architecture Space Registers. */ | |
115 /* sr0 ; return link from BLE */ | |
116 sret: .reg sr1 /* return value */ | |
117 sarg: .reg sr1 /* argument */ | |
118 /* sr4 ; PC SPACE tracker */ | |
119 /* sr5 ; process private data */ | |
120 | |
121 /* Frame Offsets (millicode convention!) Used when calling other | |
122 millicode routines. Stack unwinding is dependent upon these | |
123 definitions. */ | |
124 r31_slot: .equ -20 /* "current RP" slot */ | |
125 sr0_slot: .equ -16 /* "static link" slot */ | |
126 #if defined(pa64) | |
127 mrp_slot: .equ -16 /* "current RP" slot */ | |
128 psp_slot: .equ -8 /* "previous SP" slot */ | |
129 #else | |
130 mrp_slot: .equ -20 /* "current RP" slot (replacing "r31_slot") */ | |
131 #endif | |
132 | |
133 | |
134 #define DEFINE(name,value)name: .EQU value | |
135 #define RDEFINE(name,value)name: .REG value | |
136 #ifdef milliext | |
137 #define MILLI_BE(lbl) BE lbl(sr7,r0) | |
138 #define MILLI_BEN(lbl) BE,n lbl(sr7,r0) | |
139 #define MILLI_BLE(lbl) BLE lbl(sr7,r0) | |
140 #define MILLI_BLEN(lbl) BLE,n lbl(sr7,r0) | |
141 #define MILLIRETN BE,n 0(sr0,mrp) | |
142 #define MILLIRET BE 0(sr0,mrp) | |
143 #define MILLI_RETN BE,n 0(sr0,mrp) | |
144 #define MILLI_RET BE 0(sr0,mrp) | |
145 #else | |
146 #define MILLI_BE(lbl) B lbl | |
147 #define MILLI_BEN(lbl) B,n lbl | |
148 #define MILLI_BLE(lbl) BL lbl,mrp | |
149 #define MILLI_BLEN(lbl) BL,n lbl,mrp | |
150 #define MILLIRETN BV,n 0(mrp) | |
151 #define MILLIRET BV 0(mrp) | |
152 #define MILLI_RETN BV,n 0(mrp) | |
153 #define MILLI_RET BV 0(mrp) | |
154 #endif | |
155 | |
156 #ifdef __STDC__ | |
157 #define CAT(a,b) a##b | |
158 #else | |
159 #define CAT(a,b) a/**/b | |
160 #endif | |
161 | |
162 #ifdef ELF | |
163 #define SUBSPA_MILLI .section .text | |
164 #define SUBSPA_MILLI_DIV .section .text.div,"ax",@progbits! .align 16 | |
165 #define SUBSPA_MILLI_MUL .section .text.mul,"ax",@progbits! .align 16 | |
166 #define ATTR_MILLI | |
167 #define SUBSPA_DATA .section .data | |
168 #define ATTR_DATA | |
169 #define GLOBAL $global$ | |
170 #define GSYM(sym) !sym: | |
171 #define LSYM(sym) !CAT(.L,sym:) | |
172 #define LREF(sym) CAT(.L,sym) | |
173 | |
174 #else | |
175 | |
176 #ifdef coff | |
177 /* This used to be .milli but since link32 places different named | |
178 sections in different segments millicode ends up a long ways away | |
179 from .text (1meg?). This way they will be a lot closer. | |
180 | |
181 The SUBSPA_MILLI_* specify locality sets for certain millicode | |
182 modules in order to ensure that modules that call one another are | |
183 placed close together. Without locality sets this is unlikely to | |
184 happen because of the Dynamite linker library search algorithm. We | |
185 want these modules close together so that short calls always reach | |
186 (we don't want to require long calls or use long call stubs). */ | |
187 | |
188 #define SUBSPA_MILLI .subspa .text | |
189 #define SUBSPA_MILLI_DIV .subspa .text$dv,align=16 | |
190 #define SUBSPA_MILLI_MUL .subspa .text$mu,align=16 | |
191 #define ATTR_MILLI .attr code,read,execute | |
192 #define SUBSPA_DATA .subspa .data | |
193 #define ATTR_DATA .attr init_data,read,write | |
194 #define GLOBAL _gp | |
195 #else | |
196 #define SUBSPA_MILLI .subspa $MILLICODE$,QUAD=0,ALIGN=4,ACCESS=0x2c,SORT=8 | |
197 #define SUBSPA_MILLI_DIV SUBSPA_MILLI | |
198 #define SUBSPA_MILLI_MUL SUBSPA_MILLI | |
199 #define ATTR_MILLI | |
200 #define SUBSPA_DATA .subspa $BSS$,quad=1,align=8,access=0x1f,sort=80,zero | |
201 #define ATTR_DATA | |
202 #define GLOBAL $global$ | |
203 #endif | |
204 #define SPACE_DATA .space $PRIVATE$,spnum=1,sort=16 | |
205 | |
206 #define GSYM(sym) !sym | |
207 #define LSYM(sym) !CAT(L$,sym) | |
208 #define LREF(sym) CAT(L$,sym) | |
209 #endif | |
210 | |
211 #ifdef L_dyncall | |
212 SUBSPA_MILLI | |
213 ATTR_DATA | |
214 GSYM($$dyncall) | |
215 .export $$dyncall,millicode | |
216 .proc | |
217 .callinfo millicode | |
218 .entry | |
219 bb,>=,n %r22,30,LREF(1) ; branch if not plabel address | |
220 depi 0,31,2,%r22 ; clear the two least significant bits | |
221 ldw 4(%r22),%r19 ; load new LTP value | |
222 ldw 0(%r22),%r22 ; load address of target | |
223 LSYM(1) | |
224 #ifdef LINUX | |
225 bv %r0(%r22) ; branch to the real target | |
226 #else | |
227 ldsid (%sr0,%r22),%r1 ; get the "space ident" selected by r22 | |
228 mtsp %r1,%sr0 ; move that space identifier into sr0 | |
229 be 0(%sr0,%r22) ; branch to the real target | |
230 #endif | |
231 stw %r2,-24(%r30) ; save return address into frame marker | |
232 .exit | |
233 .procend | |
234 #endif | |
235 | |
236 #ifdef L_divI | |
237 /* ROUTINES: $$divI, $$divoI | |
238 | |
239 Single precision divide for signed binary integers. | |
240 | |
241 The quotient is truncated towards zero. | |
242 The sign of the quotient is the XOR of the signs of the dividend and | |
243 divisor. | |
244 Divide by zero is trapped. | |
245 Divide of -2**31 by -1 is trapped for $$divoI but not for $$divI. | |
246 | |
247 INPUT REGISTERS: | |
248 . arg0 == dividend | |
249 . arg1 == divisor | |
250 . mrp == return pc | |
251 . sr0 == return space when called externally | |
252 | |
253 OUTPUT REGISTERS: | |
254 . arg0 = undefined | |
255 . arg1 = undefined | |
256 . ret1 = quotient | |
257 | |
258 OTHER REGISTERS AFFECTED: | |
259 . r1 = undefined | |
260 | |
261 SIDE EFFECTS: | |
262 . Causes a trap under the following conditions: | |
263 . divisor is zero (traps with ADDIT,= 0,25,0) | |
264 . dividend==-2**31 and divisor==-1 and routine is $$divoI | |
265 . (traps with ADDO 26,25,0) | |
266 . Changes memory at the following places: | |
267 . NONE | |
268 | |
269 PERMISSIBLE CONTEXT: | |
270 . Unwindable. | |
271 . Suitable for internal or external millicode. | |
272 . Assumes the special millicode register conventions. | |
273 | |
274 DISCUSSION: | |
275 . Branchs to other millicode routines using BE | |
276 . $$div_# for # being 2,3,4,5,6,7,8,9,10,12,14,15 | |
277 . | |
278 . For selected divisors, calls a divide by constant routine written by | |
279 . Karl Pettis. Eligible divisors are 1..15 excluding 11 and 13. | |
280 . | |
281 . The only overflow case is -2**31 divided by -1. | |
282 . Both routines return -2**31 but only $$divoI traps. */ | |
283 | |
284 RDEFINE(temp,r1) | |
285 RDEFINE(retreg,ret1) /* r29 */ | |
286 RDEFINE(temp1,arg0) | |
287 SUBSPA_MILLI_DIV | |
288 ATTR_MILLI | |
289 .import $$divI_2,millicode | |
290 .import $$divI_3,millicode | |
291 .import $$divI_4,millicode | |
292 .import $$divI_5,millicode | |
293 .import $$divI_6,millicode | |
294 .import $$divI_7,millicode | |
295 .import $$divI_8,millicode | |
296 .import $$divI_9,millicode | |
297 .import $$divI_10,millicode | |
298 .import $$divI_12,millicode | |
299 .import $$divI_14,millicode | |
300 .import $$divI_15,millicode | |
301 .export $$divI,millicode | |
302 .export $$divoI,millicode | |
303 .proc | |
304 .callinfo millicode | |
305 .entry | |
306 GSYM($$divoI) | |
307 comib,=,n -1,arg1,LREF(negative1) /* when divisor == -1 */ | |
308 GSYM($$divI) | |
309 ldo -1(arg1),temp /* is there at most one bit set ? */ | |
310 and,<> arg1,temp,r0 /* if not, don't use power of 2 divide */ | |
311 addi,> 0,arg1,r0 /* if divisor > 0, use power of 2 divide */ | |
312 b,n LREF(neg_denom) | |
313 LSYM(pow2) | |
314 addi,>= 0,arg0,retreg /* if numerator is negative, add the */ | |
315 add arg0,temp,retreg /* (denominaotr -1) to correct for shifts */ | |
316 extru,= arg1,15,16,temp /* test denominator with 0xffff0000 */ | |
317 extrs retreg,15,16,retreg /* retreg = retreg >> 16 */ | |
318 or arg1,temp,arg1 /* arg1 = arg1 | (arg1 >> 16) */ | |
319 ldi 0xcc,temp1 /* setup 0xcc in temp1 */ | |
320 extru,= arg1,23,8,temp /* test denominator with 0xff00 */ | |
321 extrs retreg,23,24,retreg /* retreg = retreg >> 8 */ | |
322 or arg1,temp,arg1 /* arg1 = arg1 | (arg1 >> 8) */ | |
323 ldi 0xaa,temp /* setup 0xaa in temp */ | |
324 extru,= arg1,27,4,r0 /* test denominator with 0xf0 */ | |
325 extrs retreg,27,28,retreg /* retreg = retreg >> 4 */ | |
326 and,= arg1,temp1,r0 /* test denominator with 0xcc */ | |
327 extrs retreg,29,30,retreg /* retreg = retreg >> 2 */ | |
328 and,= arg1,temp,r0 /* test denominator with 0xaa */ | |
329 extrs retreg,30,31,retreg /* retreg = retreg >> 1 */ | |
330 MILLIRETN | |
331 LSYM(neg_denom) | |
332 addi,< 0,arg1,r0 /* if arg1 >= 0, it's not power of 2 */ | |
333 b,n LREF(regular_seq) | |
334 sub r0,arg1,temp /* make denominator positive */ | |
335 comb,=,n arg1,temp,LREF(regular_seq) /* test against 0x80000000 and 0 */ | |
336 ldo -1(temp),retreg /* is there at most one bit set ? */ | |
337 and,= temp,retreg,r0 /* if so, the denominator is power of 2 */ | |
338 b,n LREF(regular_seq) | |
339 sub r0,arg0,retreg /* negate numerator */ | |
340 comb,=,n arg0,retreg,LREF(regular_seq) /* test against 0x80000000 */ | |
341 copy retreg,arg0 /* set up arg0, arg1 and temp */ | |
342 copy temp,arg1 /* before branching to pow2 */ | |
343 b LREF(pow2) | |
344 ldo -1(arg1),temp | |
345 LSYM(regular_seq) | |
346 comib,>>=,n 15,arg1,LREF(small_divisor) | |
347 add,>= 0,arg0,retreg /* move dividend, if retreg < 0, */ | |
348 LSYM(normal) | |
349 subi 0,retreg,retreg /* make it positive */ | |
350 sub 0,arg1,temp /* clear carry, */ | |
351 /* negate the divisor */ | |
352 ds 0,temp,0 /* set V-bit to the comple- */ | |
353 /* ment of the divisor sign */ | |
354 add retreg,retreg,retreg /* shift msb bit into carry */ | |
355 ds r0,arg1,temp /* 1st divide step, if no carry */ | |
356 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
357 ds temp,arg1,temp /* 2nd divide step */ | |
358 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
359 ds temp,arg1,temp /* 3rd divide step */ | |
360 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
361 ds temp,arg1,temp /* 4th divide step */ | |
362 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
363 ds temp,arg1,temp /* 5th divide step */ | |
364 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
365 ds temp,arg1,temp /* 6th divide step */ | |
366 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
367 ds temp,arg1,temp /* 7th divide step */ | |
368 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
369 ds temp,arg1,temp /* 8th divide step */ | |
370 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
371 ds temp,arg1,temp /* 9th divide step */ | |
372 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
373 ds temp,arg1,temp /* 10th divide step */ | |
374 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
375 ds temp,arg1,temp /* 11th divide step */ | |
376 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
377 ds temp,arg1,temp /* 12th divide step */ | |
378 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
379 ds temp,arg1,temp /* 13th divide step */ | |
380 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
381 ds temp,arg1,temp /* 14th divide step */ | |
382 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
383 ds temp,arg1,temp /* 15th divide step */ | |
384 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
385 ds temp,arg1,temp /* 16th divide step */ | |
386 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
387 ds temp,arg1,temp /* 17th divide step */ | |
388 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
389 ds temp,arg1,temp /* 18th divide step */ | |
390 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
391 ds temp,arg1,temp /* 19th divide step */ | |
392 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
393 ds temp,arg1,temp /* 20th divide step */ | |
394 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
395 ds temp,arg1,temp /* 21st divide step */ | |
396 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
397 ds temp,arg1,temp /* 22nd divide step */ | |
398 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
399 ds temp,arg1,temp /* 23rd divide step */ | |
400 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
401 ds temp,arg1,temp /* 24th divide step */ | |
402 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
403 ds temp,arg1,temp /* 25th divide step */ | |
404 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
405 ds temp,arg1,temp /* 26th divide step */ | |
406 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
407 ds temp,arg1,temp /* 27th divide step */ | |
408 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
409 ds temp,arg1,temp /* 28th divide step */ | |
410 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
411 ds temp,arg1,temp /* 29th divide step */ | |
412 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
413 ds temp,arg1,temp /* 30th divide step */ | |
414 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
415 ds temp,arg1,temp /* 31st divide step */ | |
416 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
417 ds temp,arg1,temp /* 32nd divide step, */ | |
418 addc retreg,retreg,retreg /* shift last retreg bit into retreg */ | |
419 xor,>= arg0,arg1,0 /* get correct sign of quotient */ | |
420 sub 0,retreg,retreg /* based on operand signs */ | |
421 MILLIRETN | |
422 nop | |
423 | |
424 LSYM(small_divisor) | |
425 | |
426 #if defined(pa64) | |
427 /* Clear the upper 32 bits of the arg1 register. We are working with */ | |
428 /* small divisors (and 32-bit integers) We must not be mislead */ | |
429 /* by "1" bits left in the upper 32 bits. */ | |
430 depd %r0,31,32,%r25 | |
431 #endif | |
432 blr,n arg1,r0 | |
433 nop | |
434 /* table for divisor == 0,1, ... ,15 */ | |
435 addit,= 0,arg1,r0 /* trap if divisor == 0 */ | |
436 nop | |
437 MILLIRET /* divisor == 1 */ | |
438 copy arg0,retreg | |
439 MILLI_BEN($$divI_2) /* divisor == 2 */ | |
440 nop | |
441 MILLI_BEN($$divI_3) /* divisor == 3 */ | |
442 nop | |
443 MILLI_BEN($$divI_4) /* divisor == 4 */ | |
444 nop | |
445 MILLI_BEN($$divI_5) /* divisor == 5 */ | |
446 nop | |
447 MILLI_BEN($$divI_6) /* divisor == 6 */ | |
448 nop | |
449 MILLI_BEN($$divI_7) /* divisor == 7 */ | |
450 nop | |
451 MILLI_BEN($$divI_8) /* divisor == 8 */ | |
452 nop | |
453 MILLI_BEN($$divI_9) /* divisor == 9 */ | |
454 nop | |
455 MILLI_BEN($$divI_10) /* divisor == 10 */ | |
456 nop | |
457 b LREF(normal) /* divisor == 11 */ | |
458 add,>= 0,arg0,retreg | |
459 MILLI_BEN($$divI_12) /* divisor == 12 */ | |
460 nop | |
461 b LREF(normal) /* divisor == 13 */ | |
462 add,>= 0,arg0,retreg | |
463 MILLI_BEN($$divI_14) /* divisor == 14 */ | |
464 nop | |
465 MILLI_BEN($$divI_15) /* divisor == 15 */ | |
466 nop | |
467 | |
468 LSYM(negative1) | |
469 sub 0,arg0,retreg /* result is negation of dividend */ | |
470 MILLIRET | |
471 addo arg0,arg1,r0 /* trap iff dividend==0x80000000 && divisor==-1 */ | |
472 .exit | |
473 .procend | |
474 .end | |
475 #endif | |
476 | |
477 #ifdef L_divU | |
478 /* ROUTINE: $$divU | |
479 . | |
480 . Single precision divide for unsigned integers. | |
481 . | |
482 . Quotient is truncated towards zero. | |
483 . Traps on divide by zero. | |
484 | |
485 INPUT REGISTERS: | |
486 . arg0 == dividend | |
487 . arg1 == divisor | |
488 . mrp == return pc | |
489 . sr0 == return space when called externally | |
490 | |
491 OUTPUT REGISTERS: | |
492 . arg0 = undefined | |
493 . arg1 = undefined | |
494 . ret1 = quotient | |
495 | |
496 OTHER REGISTERS AFFECTED: | |
497 . r1 = undefined | |
498 | |
499 SIDE EFFECTS: | |
500 . Causes a trap under the following conditions: | |
501 . divisor is zero | |
502 . Changes memory at the following places: | |
503 . NONE | |
504 | |
505 PERMISSIBLE CONTEXT: | |
506 . Unwindable. | |
507 . Does not create a stack frame. | |
508 . Suitable for internal or external millicode. | |
509 . Assumes the special millicode register conventions. | |
510 | |
511 DISCUSSION: | |
512 . Branchs to other millicode routines using BE: | |
513 . $$divU_# for 3,5,6,7,9,10,12,14,15 | |
514 . | |
515 . For selected small divisors calls the special divide by constant | |
516 . routines written by Karl Pettis. These are: 3,5,6,7,9,10,12,14,15. */ | |
517 | |
518 RDEFINE(temp,r1) | |
519 RDEFINE(retreg,ret1) /* r29 */ | |
520 RDEFINE(temp1,arg0) | |
521 SUBSPA_MILLI_DIV | |
522 ATTR_MILLI | |
523 .export $$divU,millicode | |
524 .import $$divU_3,millicode | |
525 .import $$divU_5,millicode | |
526 .import $$divU_6,millicode | |
527 .import $$divU_7,millicode | |
528 .import $$divU_9,millicode | |
529 .import $$divU_10,millicode | |
530 .import $$divU_12,millicode | |
531 .import $$divU_14,millicode | |
532 .import $$divU_15,millicode | |
533 .proc | |
534 .callinfo millicode | |
535 .entry | |
536 GSYM($$divU) | |
537 /* The subtract is not nullified since it does no harm and can be used | |
538 by the two cases that branch back to "normal". */ | |
539 ldo -1(arg1),temp /* is there at most one bit set ? */ | |
540 and,= arg1,temp,r0 /* if so, denominator is power of 2 */ | |
541 b LREF(regular_seq) | |
542 addit,= 0,arg1,0 /* trap for zero dvr */ | |
543 copy arg0,retreg | |
544 extru,= arg1,15,16,temp /* test denominator with 0xffff0000 */ | |
545 extru retreg,15,16,retreg /* retreg = retreg >> 16 */ | |
546 or arg1,temp,arg1 /* arg1 = arg1 | (arg1 >> 16) */ | |
547 ldi 0xcc,temp1 /* setup 0xcc in temp1 */ | |
548 extru,= arg1,23,8,temp /* test denominator with 0xff00 */ | |
549 extru retreg,23,24,retreg /* retreg = retreg >> 8 */ | |
550 or arg1,temp,arg1 /* arg1 = arg1 | (arg1 >> 8) */ | |
551 ldi 0xaa,temp /* setup 0xaa in temp */ | |
552 extru,= arg1,27,4,r0 /* test denominator with 0xf0 */ | |
553 extru retreg,27,28,retreg /* retreg = retreg >> 4 */ | |
554 and,= arg1,temp1,r0 /* test denominator with 0xcc */ | |
555 extru retreg,29,30,retreg /* retreg = retreg >> 2 */ | |
556 and,= arg1,temp,r0 /* test denominator with 0xaa */ | |
557 extru retreg,30,31,retreg /* retreg = retreg >> 1 */ | |
558 MILLIRETN | |
559 nop | |
560 LSYM(regular_seq) | |
561 comib,>= 15,arg1,LREF(special_divisor) | |
562 subi 0,arg1,temp /* clear carry, negate the divisor */ | |
563 ds r0,temp,r0 /* set V-bit to 1 */ | |
564 LSYM(normal) | |
565 add arg0,arg0,retreg /* shift msb bit into carry */ | |
566 ds r0,arg1,temp /* 1st divide step, if no carry */ | |
567 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
568 ds temp,arg1,temp /* 2nd divide step */ | |
569 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
570 ds temp,arg1,temp /* 3rd divide step */ | |
571 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
572 ds temp,arg1,temp /* 4th divide step */ | |
573 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
574 ds temp,arg1,temp /* 5th divide step */ | |
575 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
576 ds temp,arg1,temp /* 6th divide step */ | |
577 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
578 ds temp,arg1,temp /* 7th divide step */ | |
579 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
580 ds temp,arg1,temp /* 8th divide step */ | |
581 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
582 ds temp,arg1,temp /* 9th divide step */ | |
583 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
584 ds temp,arg1,temp /* 10th divide step */ | |
585 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
586 ds temp,arg1,temp /* 11th divide step */ | |
587 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
588 ds temp,arg1,temp /* 12th divide step */ | |
589 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
590 ds temp,arg1,temp /* 13th divide step */ | |
591 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
592 ds temp,arg1,temp /* 14th divide step */ | |
593 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
594 ds temp,arg1,temp /* 15th divide step */ | |
595 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
596 ds temp,arg1,temp /* 16th divide step */ | |
597 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
598 ds temp,arg1,temp /* 17th divide step */ | |
599 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
600 ds temp,arg1,temp /* 18th divide step */ | |
601 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
602 ds temp,arg1,temp /* 19th divide step */ | |
603 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
604 ds temp,arg1,temp /* 20th divide step */ | |
605 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
606 ds temp,arg1,temp /* 21st divide step */ | |
607 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
608 ds temp,arg1,temp /* 22nd divide step */ | |
609 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
610 ds temp,arg1,temp /* 23rd divide step */ | |
611 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
612 ds temp,arg1,temp /* 24th divide step */ | |
613 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
614 ds temp,arg1,temp /* 25th divide step */ | |
615 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
616 ds temp,arg1,temp /* 26th divide step */ | |
617 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
618 ds temp,arg1,temp /* 27th divide step */ | |
619 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
620 ds temp,arg1,temp /* 28th divide step */ | |
621 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
622 ds temp,arg1,temp /* 29th divide step */ | |
623 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
624 ds temp,arg1,temp /* 30th divide step */ | |
625 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
626 ds temp,arg1,temp /* 31st divide step */ | |
627 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
628 ds temp,arg1,temp /* 32nd divide step, */ | |
629 MILLIRET | |
630 addc retreg,retreg,retreg /* shift last retreg bit into retreg */ | |
631 | |
632 /* Handle the cases where divisor is a small constant or has high bit on. */ | |
633 LSYM(special_divisor) | |
634 /* blr arg1,r0 */ | |
635 /* comib,>,n 0,arg1,LREF(big_divisor) ; nullify previous instruction */ | |
636 | |
637 /* Pratap 8/13/90. The 815 Stirling chip set has a bug that prevents us from | |
638 generating such a blr, comib sequence. A problem in nullification. So I | |
639 rewrote this code. */ | |
640 | |
641 #if defined(pa64) | |
642 /* Clear the upper 32 bits of the arg1 register. We are working with | |
643 small divisors (and 32-bit unsigned integers) We must not be mislead | |
644 by "1" bits left in the upper 32 bits. */ | |
645 depd %r0,31,32,%r25 | |
646 #endif | |
647 comib,> 0,arg1,LREF(big_divisor) | |
648 nop | |
649 blr arg1,r0 | |
650 nop | |
651 | |
652 LSYM(zero_divisor) /* this label is here to provide external visibility */ | |
653 addit,= 0,arg1,0 /* trap for zero dvr */ | |
654 nop | |
655 MILLIRET /* divisor == 1 */ | |
656 copy arg0,retreg | |
657 MILLIRET /* divisor == 2 */ | |
658 extru arg0,30,31,retreg | |
659 MILLI_BEN($$divU_3) /* divisor == 3 */ | |
660 nop | |
661 MILLIRET /* divisor == 4 */ | |
662 extru arg0,29,30,retreg | |
663 MILLI_BEN($$divU_5) /* divisor == 5 */ | |
664 nop | |
665 MILLI_BEN($$divU_6) /* divisor == 6 */ | |
666 nop | |
667 MILLI_BEN($$divU_7) /* divisor == 7 */ | |
668 nop | |
669 MILLIRET /* divisor == 8 */ | |
670 extru arg0,28,29,retreg | |
671 MILLI_BEN($$divU_9) /* divisor == 9 */ | |
672 nop | |
673 MILLI_BEN($$divU_10) /* divisor == 10 */ | |
674 nop | |
675 b LREF(normal) /* divisor == 11 */ | |
676 ds r0,temp,r0 /* set V-bit to 1 */ | |
677 MILLI_BEN($$divU_12) /* divisor == 12 */ | |
678 nop | |
679 b LREF(normal) /* divisor == 13 */ | |
680 ds r0,temp,r0 /* set V-bit to 1 */ | |
681 MILLI_BEN($$divU_14) /* divisor == 14 */ | |
682 nop | |
683 MILLI_BEN($$divU_15) /* divisor == 15 */ | |
684 nop | |
685 | |
686 /* Handle the case where the high bit is on in the divisor. | |
687 Compute: if( dividend>=divisor) quotient=1; else quotient=0; | |
688 Note: dividend>==divisor iff dividend-divisor does not borrow | |
689 and not borrow iff carry. */ | |
690 LSYM(big_divisor) | |
691 sub arg0,arg1,r0 | |
692 MILLIRET | |
693 addc r0,r0,retreg | |
694 .exit | |
695 .procend | |
696 .end | |
697 #endif | |
698 | |
699 #ifdef L_remI | |
700 /* ROUTINE: $$remI | |
701 | |
702 DESCRIPTION: | |
703 . $$remI returns the remainder of the division of two signed 32-bit | |
704 . integers. The sign of the remainder is the same as the sign of | |
705 . the dividend. | |
706 | |
707 | |
708 INPUT REGISTERS: | |
709 . arg0 == dividend | |
710 . arg1 == divisor | |
711 . mrp == return pc | |
712 . sr0 == return space when called externally | |
713 | |
714 OUTPUT REGISTERS: | |
715 . arg0 = destroyed | |
716 . arg1 = destroyed | |
717 . ret1 = remainder | |
718 | |
719 OTHER REGISTERS AFFECTED: | |
720 . r1 = undefined | |
721 | |
722 SIDE EFFECTS: | |
723 . Causes a trap under the following conditions: DIVIDE BY ZERO | |
724 . Changes memory at the following places: NONE | |
725 | |
726 PERMISSIBLE CONTEXT: | |
727 . Unwindable | |
728 . Does not create a stack frame | |
729 . Is usable for internal or external microcode | |
730 | |
731 DISCUSSION: | |
732 . Calls other millicode routines via mrp: NONE | |
733 . Calls other millicode routines: NONE */ | |
734 | |
735 RDEFINE(tmp,r1) | |
736 RDEFINE(retreg,ret1) | |
737 | |
738 SUBSPA_MILLI | |
739 ATTR_MILLI | |
740 .proc | |
741 .callinfo millicode | |
742 .entry | |
743 GSYM($$remI) | |
744 GSYM($$remoI) | |
745 .export $$remI,MILLICODE | |
746 .export $$remoI,MILLICODE | |
747 ldo -1(arg1),tmp /* is there at most one bit set ? */ | |
748 and,<> arg1,tmp,r0 /* if not, don't use power of 2 */ | |
749 addi,> 0,arg1,r0 /* if denominator > 0, use power */ | |
750 /* of 2 */ | |
751 b,n LREF(neg_denom) | |
752 LSYM(pow2) | |
753 comb,>,n 0,arg0,LREF(neg_num) /* is numerator < 0 ? */ | |
754 and arg0,tmp,retreg /* get the result */ | |
755 MILLIRETN | |
756 LSYM(neg_num) | |
757 subi 0,arg0,arg0 /* negate numerator */ | |
758 and arg0,tmp,retreg /* get the result */ | |
759 subi 0,retreg,retreg /* negate result */ | |
760 MILLIRETN | |
761 LSYM(neg_denom) | |
762 addi,< 0,arg1,r0 /* if arg1 >= 0, it's not power */ | |
763 /* of 2 */ | |
764 b,n LREF(regular_seq) | |
765 sub r0,arg1,tmp /* make denominator positive */ | |
766 comb,=,n arg1,tmp,LREF(regular_seq) /* test against 0x80000000 and 0 */ | |
767 ldo -1(tmp),retreg /* is there at most one bit set ? */ | |
768 and,= tmp,retreg,r0 /* if not, go to regular_seq */ | |
769 b,n LREF(regular_seq) | |
770 comb,>,n 0,arg0,LREF(neg_num_2) /* if arg0 < 0, negate it */ | |
771 and arg0,retreg,retreg | |
772 MILLIRETN | |
773 LSYM(neg_num_2) | |
774 subi 0,arg0,tmp /* test against 0x80000000 */ | |
775 and tmp,retreg,retreg | |
776 subi 0,retreg,retreg | |
777 MILLIRETN | |
778 LSYM(regular_seq) | |
779 addit,= 0,arg1,0 /* trap if div by zero */ | |
780 add,>= 0,arg0,retreg /* move dividend, if retreg < 0, */ | |
781 sub 0,retreg,retreg /* make it positive */ | |
782 sub 0,arg1, tmp /* clear carry, */ | |
783 /* negate the divisor */ | |
784 ds 0, tmp,0 /* set V-bit to the comple- */ | |
785 /* ment of the divisor sign */ | |
786 or 0,0, tmp /* clear tmp */ | |
787 add retreg,retreg,retreg /* shift msb bit into carry */ | |
788 ds tmp,arg1, tmp /* 1st divide step, if no carry */ | |
789 /* out, msb of quotient = 0 */ | |
790 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
791 LSYM(t1) | |
792 ds tmp,arg1, tmp /* 2nd divide step */ | |
793 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
794 ds tmp,arg1, tmp /* 3rd divide step */ | |
795 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
796 ds tmp,arg1, tmp /* 4th divide step */ | |
797 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
798 ds tmp,arg1, tmp /* 5th divide step */ | |
799 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
800 ds tmp,arg1, tmp /* 6th divide step */ | |
801 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
802 ds tmp,arg1, tmp /* 7th divide step */ | |
803 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
804 ds tmp,arg1, tmp /* 8th divide step */ | |
805 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
806 ds tmp,arg1, tmp /* 9th divide step */ | |
807 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
808 ds tmp,arg1, tmp /* 10th divide step */ | |
809 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
810 ds tmp,arg1, tmp /* 11th divide step */ | |
811 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
812 ds tmp,arg1, tmp /* 12th divide step */ | |
813 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
814 ds tmp,arg1, tmp /* 13th divide step */ | |
815 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
816 ds tmp,arg1, tmp /* 14th divide step */ | |
817 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
818 ds tmp,arg1, tmp /* 15th divide step */ | |
819 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
820 ds tmp,arg1, tmp /* 16th divide step */ | |
821 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
822 ds tmp,arg1, tmp /* 17th divide step */ | |
823 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
824 ds tmp,arg1, tmp /* 18th divide step */ | |
825 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
826 ds tmp,arg1, tmp /* 19th divide step */ | |
827 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
828 ds tmp,arg1, tmp /* 20th divide step */ | |
829 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
830 ds tmp,arg1, tmp /* 21st divide step */ | |
831 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
832 ds tmp,arg1, tmp /* 22nd divide step */ | |
833 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
834 ds tmp,arg1, tmp /* 23rd divide step */ | |
835 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
836 ds tmp,arg1, tmp /* 24th divide step */ | |
837 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
838 ds tmp,arg1, tmp /* 25th divide step */ | |
839 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
840 ds tmp,arg1, tmp /* 26th divide step */ | |
841 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
842 ds tmp,arg1, tmp /* 27th divide step */ | |
843 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
844 ds tmp,arg1, tmp /* 28th divide step */ | |
845 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
846 ds tmp,arg1, tmp /* 29th divide step */ | |
847 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
848 ds tmp,arg1, tmp /* 30th divide step */ | |
849 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
850 ds tmp,arg1, tmp /* 31st divide step */ | |
851 addc retreg,retreg,retreg /* shift retreg with/into carry */ | |
852 ds tmp,arg1, tmp /* 32nd divide step, */ | |
853 addc retreg,retreg,retreg /* shift last bit into retreg */ | |
854 movb,>=,n tmp,retreg,LREF(finish) /* branch if pos. tmp */ | |
855 add,< arg1,0,0 /* if arg1 > 0, add arg1 */ | |
856 add,tr tmp,arg1,retreg /* for correcting remainder tmp */ | |
857 sub tmp,arg1,retreg /* else add absolute value arg1 */ | |
858 LSYM(finish) | |
859 add,>= arg0,0,0 /* set sign of remainder */ | |
860 sub 0,retreg,retreg /* to sign of dividend */ | |
861 MILLIRET | |
862 nop | |
863 .exit | |
864 .procend | |
865 #ifdef milliext | |
866 .origin 0x00000200 | |
867 #endif | |
868 .end | |
869 #endif | |
870 | |
871 #ifdef L_remU | |
872 /* ROUTINE: $$remU | |
873 . Single precision divide for remainder with unsigned binary integers. | |
874 . | |
875 . The remainder must be dividend-(dividend/divisor)*divisor. | |
876 . Divide by zero is trapped. | |
877 | |
878 INPUT REGISTERS: | |
879 . arg0 == dividend | |
880 . arg1 == divisor | |
881 . mrp == return pc | |
882 . sr0 == return space when called externally | |
883 | |
884 OUTPUT REGISTERS: | |
885 . arg0 = undefined | |
886 . arg1 = undefined | |
887 . ret1 = remainder | |
888 | |
889 OTHER REGISTERS AFFECTED: | |
890 . r1 = undefined | |
891 | |
892 SIDE EFFECTS: | |
893 . Causes a trap under the following conditions: DIVIDE BY ZERO | |
894 . Changes memory at the following places: NONE | |
895 | |
896 PERMISSIBLE CONTEXT: | |
897 . Unwindable. | |
898 . Does not create a stack frame. | |
899 . Suitable for internal or external millicode. | |
900 . Assumes the special millicode register conventions. | |
901 | |
902 DISCUSSION: | |
903 . Calls other millicode routines using mrp: NONE | |
904 . Calls other millicode routines: NONE */ | |
905 | |
906 | |
907 RDEFINE(temp,r1) | |
908 RDEFINE(rmndr,ret1) /* r29 */ | |
909 SUBSPA_MILLI | |
910 ATTR_MILLI | |
911 .export $$remU,millicode | |
912 .proc | |
913 .callinfo millicode | |
914 .entry | |
915 GSYM($$remU) | |
916 ldo -1(arg1),temp /* is there at most one bit set ? */ | |
917 and,= arg1,temp,r0 /* if not, don't use power of 2 */ | |
918 b LREF(regular_seq) | |
919 addit,= 0,arg1,r0 /* trap on div by zero */ | |
920 and arg0,temp,rmndr /* get the result for power of 2 */ | |
921 MILLIRETN | |
922 LSYM(regular_seq) | |
923 comib,>=,n 0,arg1,LREF(special_case) | |
924 subi 0,arg1,rmndr /* clear carry, negate the divisor */ | |
925 ds r0,rmndr,r0 /* set V-bit to 1 */ | |
926 add arg0,arg0,temp /* shift msb bit into carry */ | |
927 ds r0,arg1,rmndr /* 1st divide step, if no carry */ | |
928 addc temp,temp,temp /* shift temp with/into carry */ | |
929 ds rmndr,arg1,rmndr /* 2nd divide step */ | |
930 addc temp,temp,temp /* shift temp with/into carry */ | |
931 ds rmndr,arg1,rmndr /* 3rd divide step */ | |
932 addc temp,temp,temp /* shift temp with/into carry */ | |
933 ds rmndr,arg1,rmndr /* 4th divide step */ | |
934 addc temp,temp,temp /* shift temp with/into carry */ | |
935 ds rmndr,arg1,rmndr /* 5th divide step */ | |
936 addc temp,temp,temp /* shift temp with/into carry */ | |
937 ds rmndr,arg1,rmndr /* 6th divide step */ | |
938 addc temp,temp,temp /* shift temp with/into carry */ | |
939 ds rmndr,arg1,rmndr /* 7th divide step */ | |
940 addc temp,temp,temp /* shift temp with/into carry */ | |
941 ds rmndr,arg1,rmndr /* 8th divide step */ | |
942 addc temp,temp,temp /* shift temp with/into carry */ | |
943 ds rmndr,arg1,rmndr /* 9th divide step */ | |
944 addc temp,temp,temp /* shift temp with/into carry */ | |
945 ds rmndr,arg1,rmndr /* 10th divide step */ | |
946 addc temp,temp,temp /* shift temp with/into carry */ | |
947 ds rmndr,arg1,rmndr /* 11th divide step */ | |
948 addc temp,temp,temp /* shift temp with/into carry */ | |
949 ds rmndr,arg1,rmndr /* 12th divide step */ | |
950 addc temp,temp,temp /* shift temp with/into carry */ | |
951 ds rmndr,arg1,rmndr /* 13th divide step */ | |
952 addc temp,temp,temp /* shift temp with/into carry */ | |
953 ds rmndr,arg1,rmndr /* 14th divide step */ | |
954 addc temp,temp,temp /* shift temp with/into carry */ | |
955 ds rmndr,arg1,rmndr /* 15th divide step */ | |
956 addc temp,temp,temp /* shift temp with/into carry */ | |
957 ds rmndr,arg1,rmndr /* 16th divide step */ | |
958 addc temp,temp,temp /* shift temp with/into carry */ | |
959 ds rmndr,arg1,rmndr /* 17th divide step */ | |
960 addc temp,temp,temp /* shift temp with/into carry */ | |
961 ds rmndr,arg1,rmndr /* 18th divide step */ | |
962 addc temp,temp,temp /* shift temp with/into carry */ | |
963 ds rmndr,arg1,rmndr /* 19th divide step */ | |
964 addc temp,temp,temp /* shift temp with/into carry */ | |
965 ds rmndr,arg1,rmndr /* 20th divide step */ | |
966 addc temp,temp,temp /* shift temp with/into carry */ | |
967 ds rmndr,arg1,rmndr /* 21st divide step */ | |
968 addc temp,temp,temp /* shift temp with/into carry */ | |
969 ds rmndr,arg1,rmndr /* 22nd divide step */ | |
970 addc temp,temp,temp /* shift temp with/into carry */ | |
971 ds rmndr,arg1,rmndr /* 23rd divide step */ | |
972 addc temp,temp,temp /* shift temp with/into carry */ | |
973 ds rmndr,arg1,rmndr /* 24th divide step */ | |
974 addc temp,temp,temp /* shift temp with/into carry */ | |
975 ds rmndr,arg1,rmndr /* 25th divide step */ | |
976 addc temp,temp,temp /* shift temp with/into carry */ | |
977 ds rmndr,arg1,rmndr /* 26th divide step */ | |
978 addc temp,temp,temp /* shift temp with/into carry */ | |
979 ds rmndr,arg1,rmndr /* 27th divide step */ | |
980 addc temp,temp,temp /* shift temp with/into carry */ | |
981 ds rmndr,arg1,rmndr /* 28th divide step */ | |
982 addc temp,temp,temp /* shift temp with/into carry */ | |
983 ds rmndr,arg1,rmndr /* 29th divide step */ | |
984 addc temp,temp,temp /* shift temp with/into carry */ | |
985 ds rmndr,arg1,rmndr /* 30th divide step */ | |
986 addc temp,temp,temp /* shift temp with/into carry */ | |
987 ds rmndr,arg1,rmndr /* 31st divide step */ | |
988 addc temp,temp,temp /* shift temp with/into carry */ | |
989 ds rmndr,arg1,rmndr /* 32nd divide step, */ | |
990 comiclr,<= 0,rmndr,r0 | |
991 add rmndr,arg1,rmndr /* correction */ | |
992 MILLIRETN | |
993 nop | |
994 | |
995 /* Putting >= on the last DS and deleting COMICLR does not work! */ | |
996 LSYM(special_case) | |
997 sub,>>= arg0,arg1,rmndr | |
998 copy arg0,rmndr | |
999 MILLIRETN | |
1000 nop | |
1001 .exit | |
1002 .procend | |
1003 .end | |
1004 #endif | |
1005 | |
1006 #ifdef L_div_const | |
1007 /* ROUTINE: $$divI_2 | |
1008 . $$divI_3 $$divU_3 | |
1009 . $$divI_4 | |
1010 . $$divI_5 $$divU_5 | |
1011 . $$divI_6 $$divU_6 | |
1012 . $$divI_7 $$divU_7 | |
1013 . $$divI_8 | |
1014 . $$divI_9 $$divU_9 | |
1015 . $$divI_10 $$divU_10 | |
1016 . | |
1017 . $$divI_12 $$divU_12 | |
1018 . | |
1019 . $$divI_14 $$divU_14 | |
1020 . $$divI_15 $$divU_15 | |
1021 . $$divI_16 | |
1022 . $$divI_17 $$divU_17 | |
1023 . | |
1024 . Divide by selected constants for single precision binary integers. | |
1025 | |
1026 INPUT REGISTERS: | |
1027 . arg0 == dividend | |
1028 . mrp == return pc | |
1029 . sr0 == return space when called externally | |
1030 | |
1031 OUTPUT REGISTERS: | |
1032 . arg0 = undefined | |
1033 . arg1 = undefined | |
1034 . ret1 = quotient | |
1035 | |
1036 OTHER REGISTERS AFFECTED: | |
1037 . r1 = undefined | |
1038 | |
1039 SIDE EFFECTS: | |
1040 . Causes a trap under the following conditions: NONE | |
1041 . Changes memory at the following places: NONE | |
1042 | |
1043 PERMISSIBLE CONTEXT: | |
1044 . Unwindable. | |
1045 . Does not create a stack frame. | |
1046 . Suitable for internal or external millicode. | |
1047 . Assumes the special millicode register conventions. | |
1048 | |
1049 DISCUSSION: | |
1050 . Calls other millicode routines using mrp: NONE | |
1051 . Calls other millicode routines: NONE */ | |
1052 | |
1053 | |
1054 /* TRUNCATED DIVISION BY SMALL INTEGERS | |
1055 | |
1056 We are interested in q(x) = floor(x/y), where x >= 0 and y > 0 | |
1057 (with y fixed). | |
1058 | |
1059 Let a = floor(z/y), for some choice of z. Note that z will be | |
1060 chosen so that division by z is cheap. | |
1061 | |
1062 Let r be the remainder(z/y). In other words, r = z - ay. | |
1063 | |
1064 Now, our method is to choose a value for b such that | |
1065 | |
1066 q'(x) = floor((ax+b)/z) | |
1067 | |
1068 is equal to q(x) over as large a range of x as possible. If the | |
1069 two are equal over a sufficiently large range, and if it is easy to | |
1070 form the product (ax), and it is easy to divide by z, then we can | |
1071 perform the division much faster than the general division algorithm. | |
1072 | |
1073 So, we want the following to be true: | |
1074 | |
1075 . For x in the following range: | |
1076 . | |
1077 . ky <= x < (k+1)y | |
1078 . | |
1079 . implies that | |
1080 . | |
1081 . k <= (ax+b)/z < (k+1) | |
1082 | |
1083 We want to determine b such that this is true for all k in the | |
1084 range {0..K} for some maximum K. | |
1085 | |
1086 Since (ax+b) is an increasing function of x, we can take each | |
1087 bound separately to determine the "best" value for b. | |
1088 | |
1089 (ax+b)/z < (k+1) implies | |
1090 | |
1091 (a((k+1)y-1)+b < (k+1)z implies | |
1092 | |
1093 b < a + (k+1)(z-ay) implies | |
1094 | |
1095 b < a + (k+1)r | |
1096 | |
1097 This needs to be true for all k in the range {0..K}. In | |
1098 particular, it is true for k = 0 and this leads to a maximum | |
1099 acceptable value for b. | |
1100 | |
1101 b < a+r or b <= a+r-1 | |
1102 | |
1103 Taking the other bound, we have | |
1104 | |
1105 k <= (ax+b)/z implies | |
1106 | |
1107 k <= (aky+b)/z implies | |
1108 | |
1109 k(z-ay) <= b implies | |
1110 | |
1111 kr <= b | |
1112 | |
1113 Clearly, the largest range for k will be achieved by maximizing b, | |
1114 when r is not zero. When r is zero, then the simplest choice for b | |
1115 is 0. When r is not 0, set | |
1116 | |
1117 . b = a+r-1 | |
1118 | |
1119 Now, by construction, q'(x) = floor((ax+b)/z) = q(x) = floor(x/y) | |
1120 for all x in the range: | |
1121 | |
1122 . 0 <= x < (K+1)y | |
1123 | |
1124 We need to determine what K is. Of our two bounds, | |
1125 | |
1126 . b < a+(k+1)r is satisfied for all k >= 0, by construction. | |
1127 | |
1128 The other bound is | |
1129 | |
1130 . kr <= b | |
1131 | |
1132 This is always true if r = 0. If r is not 0 (the usual case), then | |
1133 K = floor((a+r-1)/r), is the maximum value for k. | |
1134 | |
1135 Therefore, the formula q'(x) = floor((ax+b)/z) yields the correct | |
1136 answer for q(x) = floor(x/y) when x is in the range | |
1137 | |
1138 (0,(K+1)y-1) K = floor((a+r-1)/r) | |
1139 | |
1140 To be most useful, we want (K+1)y-1 = (max x) >= 2**32-1 so that | |
1141 the formula for q'(x) yields the correct value of q(x) for all x | |
1142 representable by a single word in HPPA. | |
1143 | |
1144 We are also constrained in that computing the product (ax), adding | |
1145 b, and dividing by z must all be done quickly, otherwise we will be | |
1146 better off going through the general algorithm using the DS | |
1147 instruction, which uses approximately 70 cycles. | |
1148 | |
1149 For each y, there is a choice of z which satisfies the constraints | |
1150 for (K+1)y >= 2**32. We may not, however, be able to satisfy the | |
1151 timing constraints for arbitrary y. It seems that z being equal to | |
1152 a power of 2 or a power of 2 minus 1 is as good as we can do, since | |
1153 it minimizes the time to do division by z. We want the choice of z | |
1154 to also result in a value for (a) that minimizes the computation of | |
1155 the product (ax). This is best achieved if (a) has a regular bit | |
1156 pattern (so the multiplication can be done with shifts and adds). | |
1157 The value of (a) also needs to be less than 2**32 so the product is | |
1158 always guaranteed to fit in 2 words. | |
1159 | |
1160 In actual practice, the following should be done: | |
1161 | |
1162 1) For negative x, you should take the absolute value and remember | |
1163 . the fact so that the result can be negated. This obviously does | |
1164 . not apply in the unsigned case. | |
1165 2) For even y, you should factor out the power of 2 that divides y | |
1166 . and divide x by it. You can then proceed by dividing by the | |
1167 . odd factor of y. | |
1168 | |
1169 Here is a table of some odd values of y, and corresponding choices | |
1170 for z which are "good". | |
1171 | |
1172 y z r a (hex) max x (hex) | |
1173 | |
1174 3 2**32 1 55555555 100000001 | |
1175 5 2**32 1 33333333 100000003 | |
1176 7 2**24-1 0 249249 (infinite) | |
1177 9 2**24-1 0 1c71c7 (infinite) | |
1178 11 2**20-1 0 1745d (infinite) | |
1179 13 2**24-1 0 13b13b (infinite) | |
1180 15 2**32 1 11111111 10000000d | |
1181 17 2**32 1 f0f0f0f 10000000f | |
1182 | |
1183 If r is 1, then b = a+r-1 = a. This simplifies the computation | |
1184 of (ax+b), since you can compute (x+1)(a) instead. If r is 0, | |
1185 then b = 0 is ok to use which simplifies (ax+b). | |
1186 | |
1187 The bit patterns for 55555555, 33333333, and 11111111 are obviously | |
1188 very regular. The bit patterns for the other values of a above are: | |
1189 | |
1190 y (hex) (binary) | |
1191 | |
1192 7 249249 001001001001001001001001 << regular >> | |
1193 9 1c71c7 000111000111000111000111 << regular >> | |
1194 11 1745d 000000010111010001011101 << irregular >> | |
1195 13 13b13b 000100111011000100111011 << irregular >> | |
1196 | |
1197 The bit patterns for (a) corresponding to (y) of 11 and 13 may be | |
1198 too irregular to warrant using this method. | |
1199 | |
1200 When z is a power of 2 minus 1, then the division by z is slightly | |
1201 more complicated, involving an iterative solution. | |
1202 | |
1203 The code presented here solves division by 1 through 17, except for | |
1204 11 and 13. There are algorithms for both signed and unsigned | |
1205 quantities given. | |
1206 | |
1207 TIMINGS (cycles) | |
1208 | |
1209 divisor positive negative unsigned | |
1210 | |
1211 . 1 2 2 2 | |
1212 . 2 4 4 2 | |
1213 . 3 19 21 19 | |
1214 . 4 4 4 2 | |
1215 . 5 18 22 19 | |
1216 . 6 19 22 19 | |
1217 . 8 4 4 2 | |
1218 . 10 18 19 17 | |
1219 . 12 18 20 18 | |
1220 . 15 16 18 16 | |
1221 . 16 4 4 2 | |
1222 . 17 16 18 16 | |
1223 | |
1224 Now, the algorithm for 7, 9, and 14 is an iterative one. That is, | |
1225 a loop body is executed until the tentative quotient is 0. The | |
1226 number of times the loop body is executed varies depending on the | |
1227 dividend, but is never more than two times. If the dividend is | |
1228 less than the divisor, then the loop body is not executed at all. | |
1229 Each iteration adds 4 cycles to the timings. | |
1230 | |
1231 divisor positive negative unsigned | |
1232 | |
1233 . 7 19+4n 20+4n 20+4n n = number of iterations | |
1234 . 9 21+4n 22+4n 21+4n | |
1235 . 14 21+4n 22+4n 20+4n | |
1236 | |
1237 To give an idea of how the number of iterations varies, here is a | |
1238 table of dividend versus number of iterations when dividing by 7. | |
1239 | |
1240 smallest largest required | |
1241 dividend dividend iterations | |
1242 | |
1243 . 0 6 0 | |
1244 . 7 0x6ffffff 1 | |
1245 0x1000006 0xffffffff 2 | |
1246 | |
1247 There is some overlap in the range of numbers requiring 1 and 2 | |
1248 iterations. */ | |
1249 | |
1250 RDEFINE(t2,r1) | |
1251 RDEFINE(x2,arg0) /* r26 */ | |
1252 RDEFINE(t1,arg1) /* r25 */ | |
1253 RDEFINE(x1,ret1) /* r29 */ | |
1254 | |
1255 SUBSPA_MILLI_DIV | |
1256 ATTR_MILLI | |
1257 | |
1258 .proc | |
1259 .callinfo millicode | |
1260 .entry | |
1261 /* NONE of these routines require a stack frame | |
1262 ALL of these routines are unwindable from millicode */ | |
1263 | |
1264 GSYM($$divide_by_constant) | |
1265 .export $$divide_by_constant,millicode | |
1266 /* Provides a "nice" label for the code covered by the unwind descriptor | |
1267 for things like gprof. */ | |
1268 | |
1269 /* DIVISION BY 2 (shift by 1) */ | |
1270 GSYM($$divI_2) | |
1271 .export $$divI_2,millicode | |
1272 comclr,>= arg0,0,0 | |
1273 addi 1,arg0,arg0 | |
1274 MILLIRET | |
1275 extrs arg0,30,31,ret1 | |
1276 | |
1277 | |
1278 /* DIVISION BY 4 (shift by 2) */ | |
1279 GSYM($$divI_4) | |
1280 .export $$divI_4,millicode | |
1281 comclr,>= arg0,0,0 | |
1282 addi 3,arg0,arg0 | |
1283 MILLIRET | |
1284 extrs arg0,29,30,ret1 | |
1285 | |
1286 | |
1287 /* DIVISION BY 8 (shift by 3) */ | |
1288 GSYM($$divI_8) | |
1289 .export $$divI_8,millicode | |
1290 comclr,>= arg0,0,0 | |
1291 addi 7,arg0,arg0 | |
1292 MILLIRET | |
1293 extrs arg0,28,29,ret1 | |
1294 | |
1295 /* DIVISION BY 16 (shift by 4) */ | |
1296 GSYM($$divI_16) | |
1297 .export $$divI_16,millicode | |
1298 comclr,>= arg0,0,0 | |
1299 addi 15,arg0,arg0 | |
1300 MILLIRET | |
1301 extrs arg0,27,28,ret1 | |
1302 | |
1303 /**************************************************************************** | |
1304 * | |
1305 * DIVISION BY DIVISORS OF FFFFFFFF, and powers of 2 times these | |
1306 * | |
1307 * includes 3,5,15,17 and also 6,10,12 | |
1308 * | |
1309 ****************************************************************************/ | |
1310 | |
1311 /* DIVISION BY 3 (use z = 2**32; a = 55555555) */ | |
1312 | |
1313 GSYM($$divI_3) | |
1314 .export $$divI_3,millicode | |
1315 comb,<,N x2,0,LREF(neg3) | |
1316 | |
1317 addi 1,x2,x2 /* this cannot overflow */ | |
1318 extru x2,1,2,x1 /* multiply by 5 to get started */ | |
1319 sh2add x2,x2,x2 | |
1320 b LREF(pos) | |
1321 addc x1,0,x1 | |
1322 | |
1323 LSYM(neg3) | |
1324 subi 1,x2,x2 /* this cannot overflow */ | |
1325 extru x2,1,2,x1 /* multiply by 5 to get started */ | |
1326 sh2add x2,x2,x2 | |
1327 b LREF(neg) | |
1328 addc x1,0,x1 | |
1329 | |
1330 GSYM($$divU_3) | |
1331 .export $$divU_3,millicode | |
1332 addi 1,x2,x2 /* this CAN overflow */ | |
1333 addc 0,0,x1 | |
1334 shd x1,x2,30,t1 /* multiply by 5 to get started */ | |
1335 sh2add x2,x2,x2 | |
1336 b LREF(pos) | |
1337 addc x1,t1,x1 | |
1338 | |
1339 /* DIVISION BY 5 (use z = 2**32; a = 33333333) */ | |
1340 | |
1341 GSYM($$divI_5) | |
1342 .export $$divI_5,millicode | |
1343 comb,<,N x2,0,LREF(neg5) | |
1344 | |
1345 addi 3,x2,t1 /* this cannot overflow */ | |
1346 sh1add x2,t1,x2 /* multiply by 3 to get started */ | |
1347 b LREF(pos) | |
1348 addc 0,0,x1 | |
1349 | |
1350 LSYM(neg5) | |
1351 sub 0,x2,x2 /* negate x2 */ | |
1352 addi 1,x2,x2 /* this cannot overflow */ | |
1353 shd 0,x2,31,x1 /* get top bit (can be 1) */ | |
1354 sh1add x2,x2,x2 /* multiply by 3 to get started */ | |
1355 b LREF(neg) | |
1356 addc x1,0,x1 | |
1357 | |
1358 GSYM($$divU_5) | |
1359 .export $$divU_5,millicode | |
1360 addi 1,x2,x2 /* this CAN overflow */ | |
1361 addc 0,0,x1 | |
1362 shd x1,x2,31,t1 /* multiply by 3 to get started */ | |
1363 sh1add x2,x2,x2 | |
1364 b LREF(pos) | |
1365 addc t1,x1,x1 | |
1366 | |
1367 /* DIVISION BY 6 (shift to divide by 2 then divide by 3) */ | |
1368 GSYM($$divI_6) | |
1369 .export $$divI_6,millicode | |
1370 comb,<,N x2,0,LREF(neg6) | |
1371 extru x2,30,31,x2 /* divide by 2 */ | |
1372 addi 5,x2,t1 /* compute 5*(x2+1) = 5*x2+5 */ | |
1373 sh2add x2,t1,x2 /* multiply by 5 to get started */ | |
1374 b LREF(pos) | |
1375 addc 0,0,x1 | |
1376 | |
1377 LSYM(neg6) | |
1378 subi 2,x2,x2 /* negate, divide by 2, and add 1 */ | |
1379 /* negation and adding 1 are done */ | |
1380 /* at the same time by the SUBI */ | |
1381 extru x2,30,31,x2 | |
1382 shd 0,x2,30,x1 | |
1383 sh2add x2,x2,x2 /* multiply by 5 to get started */ | |
1384 b LREF(neg) | |
1385 addc x1,0,x1 | |
1386 | |
1387 GSYM($$divU_6) | |
1388 .export $$divU_6,millicode | |
1389 extru x2,30,31,x2 /* divide by 2 */ | |
1390 addi 1,x2,x2 /* cannot carry */ | |
1391 shd 0,x2,30,x1 /* multiply by 5 to get started */ | |
1392 sh2add x2,x2,x2 | |
1393 b LREF(pos) | |
1394 addc x1,0,x1 | |
1395 | |
1396 /* DIVISION BY 10 (shift to divide by 2 then divide by 5) */ | |
1397 GSYM($$divU_10) | |
1398 .export $$divU_10,millicode | |
1399 extru x2,30,31,x2 /* divide by 2 */ | |
1400 addi 3,x2,t1 /* compute 3*(x2+1) = (3*x2)+3 */ | |
1401 sh1add x2,t1,x2 /* multiply by 3 to get started */ | |
1402 addc 0,0,x1 | |
1403 LSYM(pos) | |
1404 shd x1,x2,28,t1 /* multiply by 0x11 */ | |
1405 shd x2,0,28,t2 | |
1406 add x2,t2,x2 | |
1407 addc x1,t1,x1 | |
1408 LSYM(pos_for_17) | |
1409 shd x1,x2,24,t1 /* multiply by 0x101 */ | |
1410 shd x2,0,24,t2 | |
1411 add x2,t2,x2 | |
1412 addc x1,t1,x1 | |
1413 | |
1414 shd x1,x2,16,t1 /* multiply by 0x10001 */ | |
1415 shd x2,0,16,t2 | |
1416 add x2,t2,x2 | |
1417 MILLIRET | |
1418 addc x1,t1,x1 | |
1419 | |
1420 GSYM($$divI_10) | |
1421 .export $$divI_10,millicode | |
1422 comb,< x2,0,LREF(neg10) | |
1423 copy 0,x1 | |
1424 extru x2,30,31,x2 /* divide by 2 */ | |
1425 addib,TR 1,x2,LREF(pos) /* add 1 (cannot overflow) */ | |
1426 sh1add x2,x2,x2 /* multiply by 3 to get started */ | |
1427 | |
1428 LSYM(neg10) | |
1429 subi 2,x2,x2 /* negate, divide by 2, and add 1 */ | |
1430 /* negation and adding 1 are done */ | |
1431 /* at the same time by the SUBI */ | |
1432 extru x2,30,31,x2 | |
1433 sh1add x2,x2,x2 /* multiply by 3 to get started */ | |
1434 LSYM(neg) | |
1435 shd x1,x2,28,t1 /* multiply by 0x11 */ | |
1436 shd x2,0,28,t2 | |
1437 add x2,t2,x2 | |
1438 addc x1,t1,x1 | |
1439 LSYM(neg_for_17) | |
1440 shd x1,x2,24,t1 /* multiply by 0x101 */ | |
1441 shd x2,0,24,t2 | |
1442 add x2,t2,x2 | |
1443 addc x1,t1,x1 | |
1444 | |
1445 shd x1,x2,16,t1 /* multiply by 0x10001 */ | |
1446 shd x2,0,16,t2 | |
1447 add x2,t2,x2 | |
1448 addc x1,t1,x1 | |
1449 MILLIRET | |
1450 sub 0,x1,x1 | |
1451 | |
1452 /* DIVISION BY 12 (shift to divide by 4 then divide by 3) */ | |
1453 GSYM($$divI_12) | |
1454 .export $$divI_12,millicode | |
1455 comb,< x2,0,LREF(neg12) | |
1456 copy 0,x1 | |
1457 extru x2,29,30,x2 /* divide by 4 */ | |
1458 addib,tr 1,x2,LREF(pos) /* compute 5*(x2+1) = 5*x2+5 */ | |
1459 sh2add x2,x2,x2 /* multiply by 5 to get started */ | |
1460 | |
1461 LSYM(neg12) | |
1462 subi 4,x2,x2 /* negate, divide by 4, and add 1 */ | |
1463 /* negation and adding 1 are done */ | |
1464 /* at the same time by the SUBI */ | |
1465 extru x2,29,30,x2 | |
1466 b LREF(neg) | |
1467 sh2add x2,x2,x2 /* multiply by 5 to get started */ | |
1468 | |
1469 GSYM($$divU_12) | |
1470 .export $$divU_12,millicode | |
1471 extru x2,29,30,x2 /* divide by 4 */ | |
1472 addi 5,x2,t1 /* cannot carry */ | |
1473 sh2add x2,t1,x2 /* multiply by 5 to get started */ | |
1474 b LREF(pos) | |
1475 addc 0,0,x1 | |
1476 | |
1477 /* DIVISION BY 15 (use z = 2**32; a = 11111111) */ | |
1478 GSYM($$divI_15) | |
1479 .export $$divI_15,millicode | |
1480 comb,< x2,0,LREF(neg15) | |
1481 copy 0,x1 | |
1482 addib,tr 1,x2,LREF(pos)+4 | |
1483 shd x1,x2,28,t1 | |
1484 | |
1485 LSYM(neg15) | |
1486 b LREF(neg) | |
1487 subi 1,x2,x2 | |
1488 | |
1489 GSYM($$divU_15) | |
1490 .export $$divU_15,millicode | |
1491 addi 1,x2,x2 /* this CAN overflow */ | |
1492 b LREF(pos) | |
1493 addc 0,0,x1 | |
1494 | |
1495 /* DIVISION BY 17 (use z = 2**32; a = f0f0f0f) */ | |
1496 GSYM($$divI_17) | |
1497 .export $$divI_17,millicode | |
1498 comb,<,n x2,0,LREF(neg17) | |
1499 addi 1,x2,x2 /* this cannot overflow */ | |
1500 shd 0,x2,28,t1 /* multiply by 0xf to get started */ | |
1501 shd x2,0,28,t2 | |
1502 sub t2,x2,x2 | |
1503 b LREF(pos_for_17) | |
1504 subb t1,0,x1 | |
1505 | |
1506 LSYM(neg17) | |
1507 subi 1,x2,x2 /* this cannot overflow */ | |
1508 shd 0,x2,28,t1 /* multiply by 0xf to get started */ | |
1509 shd x2,0,28,t2 | |
1510 sub t2,x2,x2 | |
1511 b LREF(neg_for_17) | |
1512 subb t1,0,x1 | |
1513 | |
1514 GSYM($$divU_17) | |
1515 .export $$divU_17,millicode | |
1516 addi 1,x2,x2 /* this CAN overflow */ | |
1517 addc 0,0,x1 | |
1518 shd x1,x2,28,t1 /* multiply by 0xf to get started */ | |
1519 LSYM(u17) | |
1520 shd x2,0,28,t2 | |
1521 sub t2,x2,x2 | |
1522 b LREF(pos_for_17) | |
1523 subb t1,x1,x1 | |
1524 | |
1525 | |
1526 /* DIVISION BY DIVISORS OF FFFFFF, and powers of 2 times these | |
1527 includes 7,9 and also 14 | |
1528 | |
1529 | |
1530 z = 2**24-1 | |
1531 r = z mod x = 0 | |
1532 | |
1533 so choose b = 0 | |
1534 | |
1535 Also, in order to divide by z = 2**24-1, we approximate by dividing | |
1536 by (z+1) = 2**24 (which is easy), and then correcting. | |
1537 | |
1538 (ax) = (z+1)q' + r | |
1539 . = zq' + (q'+r) | |
1540 | |
1541 So to compute (ax)/z, compute q' = (ax)/(z+1) and r = (ax) mod (z+1) | |
1542 Then the true remainder of (ax)/z is (q'+r). Repeat the process | |
1543 with this new remainder, adding the tentative quotients together, | |
1544 until a tentative quotient is 0 (and then we are done). There is | |
1545 one last correction to be done. It is possible that (q'+r) = z. | |
1546 If so, then (q'+r)/(z+1) = 0 and it looks like we are done. But, | |
1547 in fact, we need to add 1 more to the quotient. Now, it turns | |
1548 out that this happens if and only if the original value x is | |
1549 an exact multiple of y. So, to avoid a three instruction test at | |
1550 the end, instead use 1 instruction to add 1 to x at the beginning. */ | |
1551 | |
1552 /* DIVISION BY 7 (use z = 2**24-1; a = 249249) */ | |
1553 GSYM($$divI_7) | |
1554 .export $$divI_7,millicode | |
1555 comb,<,n x2,0,LREF(neg7) | |
1556 LSYM(7) | |
1557 addi 1,x2,x2 /* cannot overflow */ | |
1558 shd 0,x2,29,x1 | |
1559 sh3add x2,x2,x2 | |
1560 addc x1,0,x1 | |
1561 LSYM(pos7) | |
1562 shd x1,x2,26,t1 | |
1563 shd x2,0,26,t2 | |
1564 add x2,t2,x2 | |
1565 addc x1,t1,x1 | |
1566 | |
1567 shd x1,x2,20,t1 | |
1568 shd x2,0,20,t2 | |
1569 add x2,t2,x2 | |
1570 addc x1,t1,t1 | |
1571 | |
1572 /* computed <t1,x2>. Now divide it by (2**24 - 1) */ | |
1573 | |
1574 copy 0,x1 | |
1575 shd,= t1,x2,24,t1 /* tentative quotient */ | |
1576 LSYM(1) | |
1577 addb,tr t1,x1,LREF(2) /* add to previous quotient */ | |
1578 extru x2,31,24,x2 /* new remainder (unadjusted) */ | |
1579 | |
1580 MILLIRETN | |
1581 | |
1582 LSYM(2) | |
1583 addb,tr t1,x2,LREF(1) /* adjust remainder */ | |
1584 extru,= x2,7,8,t1 /* new quotient */ | |
1585 | |
1586 LSYM(neg7) | |
1587 subi 1,x2,x2 /* negate x2 and add 1 */ | |
1588 LSYM(8) | |
1589 shd 0,x2,29,x1 | |
1590 sh3add x2,x2,x2 | |
1591 addc x1,0,x1 | |
1592 | |
1593 LSYM(neg7_shift) | |
1594 shd x1,x2,26,t1 | |
1595 shd x2,0,26,t2 | |
1596 add x2,t2,x2 | |
1597 addc x1,t1,x1 | |
1598 | |
1599 shd x1,x2,20,t1 | |
1600 shd x2,0,20,t2 | |
1601 add x2,t2,x2 | |
1602 addc x1,t1,t1 | |
1603 | |
1604 /* computed <t1,x2>. Now divide it by (2**24 - 1) */ | |
1605 | |
1606 copy 0,x1 | |
1607 shd,= t1,x2,24,t1 /* tentative quotient */ | |
1608 LSYM(3) | |
1609 addb,tr t1,x1,LREF(4) /* add to previous quotient */ | |
1610 extru x2,31,24,x2 /* new remainder (unadjusted) */ | |
1611 | |
1612 MILLIRET | |
1613 sub 0,x1,x1 /* negate result */ | |
1614 | |
1615 LSYM(4) | |
1616 addb,tr t1,x2,LREF(3) /* adjust remainder */ | |
1617 extru,= x2,7,8,t1 /* new quotient */ | |
1618 | |
1619 GSYM($$divU_7) | |
1620 .export $$divU_7,millicode | |
1621 addi 1,x2,x2 /* can carry */ | |
1622 addc 0,0,x1 | |
1623 shd x1,x2,29,t1 | |
1624 sh3add x2,x2,x2 | |
1625 b LREF(pos7) | |
1626 addc t1,x1,x1 | |
1627 | |
1628 /* DIVISION BY 9 (use z = 2**24-1; a = 1c71c7) */ | |
1629 GSYM($$divI_9) | |
1630 .export $$divI_9,millicode | |
1631 comb,<,n x2,0,LREF(neg9) | |
1632 addi 1,x2,x2 /* cannot overflow */ | |
1633 shd 0,x2,29,t1 | |
1634 shd x2,0,29,t2 | |
1635 sub t2,x2,x2 | |
1636 b LREF(pos7) | |
1637 subb t1,0,x1 | |
1638 | |
1639 LSYM(neg9) | |
1640 subi 1,x2,x2 /* negate and add 1 */ | |
1641 shd 0,x2,29,t1 | |
1642 shd x2,0,29,t2 | |
1643 sub t2,x2,x2 | |
1644 b LREF(neg7_shift) | |
1645 subb t1,0,x1 | |
1646 | |
1647 GSYM($$divU_9) | |
1648 .export $$divU_9,millicode | |
1649 addi 1,x2,x2 /* can carry */ | |
1650 addc 0,0,x1 | |
1651 shd x1,x2,29,t1 | |
1652 shd x2,0,29,t2 | |
1653 sub t2,x2,x2 | |
1654 b LREF(pos7) | |
1655 subb t1,x1,x1 | |
1656 | |
1657 /* DIVISION BY 14 (shift to divide by 2 then divide by 7) */ | |
1658 GSYM($$divI_14) | |
1659 .export $$divI_14,millicode | |
1660 comb,<,n x2,0,LREF(neg14) | |
1661 GSYM($$divU_14) | |
1662 .export $$divU_14,millicode | |
1663 b LREF(7) /* go to 7 case */ | |
1664 extru x2,30,31,x2 /* divide by 2 */ | |
1665 | |
1666 LSYM(neg14) | |
1667 subi 2,x2,x2 /* negate (and add 2) */ | |
1668 b LREF(8) | |
1669 extru x2,30,31,x2 /* divide by 2 */ | |
1670 .exit | |
1671 .procend | |
1672 .end | |
1673 #endif | |
1674 | |
1675 #ifdef L_mulI | |
1676 /* VERSION "@(#)$$mulI $ Revision: 12.4 $ $ Date: 94/03/17 17:18:51 $" */ | |
1677 /****************************************************************************** | |
1678 This routine is used on PA2.0 processors when gcc -mno-fpregs is used | |
1679 | |
1680 ROUTINE: $$mulI | |
1681 | |
1682 | |
1683 DESCRIPTION: | |
1684 | |
1685 $$mulI multiplies two single word integers, giving a single | |
1686 word result. | |
1687 | |
1688 | |
1689 INPUT REGISTERS: | |
1690 | |
1691 arg0 = Operand 1 | |
1692 arg1 = Operand 2 | |
1693 r31 == return pc | |
1694 sr0 == return space when called externally | |
1695 | |
1696 | |
1697 OUTPUT REGISTERS: | |
1698 | |
1699 arg0 = undefined | |
1700 arg1 = undefined | |
1701 ret1 = result | |
1702 | |
1703 OTHER REGISTERS AFFECTED: | |
1704 | |
1705 r1 = undefined | |
1706 | |
1707 SIDE EFFECTS: | |
1708 | |
1709 Causes a trap under the following conditions: NONE | |
1710 Changes memory at the following places: NONE | |
1711 | |
1712 PERMISSIBLE CONTEXT: | |
1713 | |
1714 Unwindable | |
1715 Does not create a stack frame | |
1716 Is usable for internal or external microcode | |
1717 | |
1718 DISCUSSION: | |
1719 | |
1720 Calls other millicode routines via mrp: NONE | |
1721 Calls other millicode routines: NONE | |
1722 | |
1723 ***************************************************************************/ | |
1724 | |
1725 | |
1726 #define a0 %arg0 | |
1727 #define a1 %arg1 | |
1728 #define t0 %r1 | |
1729 #define r %ret1 | |
1730 | |
1731 #define a0__128a0 zdep a0,24,25,a0 | |
1732 #define a0__256a0 zdep a0,23,24,a0 | |
1733 #define a1_ne_0_b_l0 comb,<> a1,0,LREF(l0) | |
1734 #define a1_ne_0_b_l1 comb,<> a1,0,LREF(l1) | |
1735 #define a1_ne_0_b_l2 comb,<> a1,0,LREF(l2) | |
1736 #define b_n_ret_t0 b,n LREF(ret_t0) | |
1737 #define b_e_shift b LREF(e_shift) | |
1738 #define b_e_t0ma0 b LREF(e_t0ma0) | |
1739 #define b_e_t0 b LREF(e_t0) | |
1740 #define b_e_t0a0 b LREF(e_t0a0) | |
1741 #define b_e_t02a0 b LREF(e_t02a0) | |
1742 #define b_e_t04a0 b LREF(e_t04a0) | |
1743 #define b_e_2t0 b LREF(e_2t0) | |
1744 #define b_e_2t0a0 b LREF(e_2t0a0) | |
1745 #define b_e_2t04a0 b LREF(e2t04a0) | |
1746 #define b_e_3t0 b LREF(e_3t0) | |
1747 #define b_e_4t0 b LREF(e_4t0) | |
1748 #define b_e_4t0a0 b LREF(e_4t0a0) | |
1749 #define b_e_4t08a0 b LREF(e4t08a0) | |
1750 #define b_e_5t0 b LREF(e_5t0) | |
1751 #define b_e_8t0 b LREF(e_8t0) | |
1752 #define b_e_8t0a0 b LREF(e_8t0a0) | |
1753 #define r__r_a0 add r,a0,r | |
1754 #define r__r_2a0 sh1add a0,r,r | |
1755 #define r__r_4a0 sh2add a0,r,r | |
1756 #define r__r_8a0 sh3add a0,r,r | |
1757 #define r__r_t0 add r,t0,r | |
1758 #define r__r_2t0 sh1add t0,r,r | |
1759 #define r__r_4t0 sh2add t0,r,r | |
1760 #define r__r_8t0 sh3add t0,r,r | |
1761 #define t0__3a0 sh1add a0,a0,t0 | |
1762 #define t0__4a0 sh2add a0,0,t0 | |
1763 #define t0__5a0 sh2add a0,a0,t0 | |
1764 #define t0__8a0 sh3add a0,0,t0 | |
1765 #define t0__9a0 sh3add a0,a0,t0 | |
1766 #define t0__16a0 zdep a0,27,28,t0 | |
1767 #define t0__32a0 zdep a0,26,27,t0 | |
1768 #define t0__64a0 zdep a0,25,26,t0 | |
1769 #define t0__128a0 zdep a0,24,25,t0 | |
1770 #define t0__t0ma0 sub t0,a0,t0 | |
1771 #define t0__t0_a0 add t0,a0,t0 | |
1772 #define t0__t0_2a0 sh1add a0,t0,t0 | |
1773 #define t0__t0_4a0 sh2add a0,t0,t0 | |
1774 #define t0__t0_8a0 sh3add a0,t0,t0 | |
1775 #define t0__2t0_a0 sh1add t0,a0,t0 | |
1776 #define t0__3t0 sh1add t0,t0,t0 | |
1777 #define t0__4t0 sh2add t0,0,t0 | |
1778 #define t0__4t0_a0 sh2add t0,a0,t0 | |
1779 #define t0__5t0 sh2add t0,t0,t0 | |
1780 #define t0__8t0 sh3add t0,0,t0 | |
1781 #define t0__8t0_a0 sh3add t0,a0,t0 | |
1782 #define t0__9t0 sh3add t0,t0,t0 | |
1783 #define t0__16t0 zdep t0,27,28,t0 | |
1784 #define t0__32t0 zdep t0,26,27,t0 | |
1785 #define t0__256a0 zdep a0,23,24,t0 | |
1786 | |
1787 | |
1788 SUBSPA_MILLI | |
1789 ATTR_MILLI | |
1790 .align 16 | |
1791 .proc | |
1792 .callinfo millicode | |
1793 .export $$mulI,millicode | |
1794 GSYM($$mulI) | |
1795 combt,<<= a1,a0,LREF(l4) /* swap args if unsigned a1>a0 */ | |
1796 copy 0,r /* zero out the result */ | |
1797 xor a0,a1,a0 /* swap a0 & a1 using the */ | |
1798 xor a0,a1,a1 /* old xor trick */ | |
1799 xor a0,a1,a0 | |
1800 LSYM(l4) | |
1801 combt,<= 0,a0,LREF(l3) /* if a0>=0 then proceed like unsigned */ | |
1802 zdep a1,30,8,t0 /* t0 = (a1&0xff)<<1 ********* */ | |
1803 sub,> 0,a1,t0 /* otherwise negate both and */ | |
1804 combt,<=,n a0,t0,LREF(l2) /* swap back if |a0|<|a1| */ | |
1805 sub 0,a0,a1 | |
1806 movb,tr,n t0,a0,LREF(l2) /* 10th inst. */ | |
1807 | |
1808 LSYM(l0) r__r_t0 /* add in this partial product */ | |
1809 LSYM(l1) a0__256a0 /* a0 <<= 8 ****************** */ | |
1810 LSYM(l2) zdep a1,30,8,t0 /* t0 = (a1&0xff)<<1 ********* */ | |
1811 LSYM(l3) blr t0,0 /* case on these 8 bits ****** */ | |
1812 extru a1,23,24,a1 /* a1 >>= 8 ****************** */ | |
1813 | |
1814 /*16 insts before this. */ | |
1815 /* a0 <<= 8 ************************** */ | |
1816 LSYM(x0) a1_ne_0_b_l2 ! a0__256a0 ! MILLIRETN ! nop | |
1817 LSYM(x1) a1_ne_0_b_l1 ! r__r_a0 ! MILLIRETN ! nop | |
1818 LSYM(x2) a1_ne_0_b_l1 ! r__r_2a0 ! MILLIRETN ! nop | |
1819 LSYM(x3) a1_ne_0_b_l0 ! t0__3a0 ! MILLIRET ! r__r_t0 | |
1820 LSYM(x4) a1_ne_0_b_l1 ! r__r_4a0 ! MILLIRETN ! nop | |
1821 LSYM(x5) a1_ne_0_b_l0 ! t0__5a0 ! MILLIRET ! r__r_t0 | |
1822 LSYM(x6) t0__3a0 ! a1_ne_0_b_l1 ! r__r_2t0 ! MILLIRETN | |
1823 LSYM(x7) t0__3a0 ! a1_ne_0_b_l0 ! r__r_4a0 ! b_n_ret_t0 | |
1824 LSYM(x8) a1_ne_0_b_l1 ! r__r_8a0 ! MILLIRETN ! nop | |
1825 LSYM(x9) a1_ne_0_b_l0 ! t0__9a0 ! MILLIRET ! r__r_t0 | |
1826 LSYM(x10) t0__5a0 ! a1_ne_0_b_l1 ! r__r_2t0 ! MILLIRETN | |
1827 LSYM(x11) t0__3a0 ! a1_ne_0_b_l0 ! r__r_8a0 ! b_n_ret_t0 | |
1828 LSYM(x12) t0__3a0 ! a1_ne_0_b_l1 ! r__r_4t0 ! MILLIRETN | |
1829 LSYM(x13) t0__5a0 ! a1_ne_0_b_l0 ! r__r_8a0 ! b_n_ret_t0 | |
1830 LSYM(x14) t0__3a0 ! t0__2t0_a0 ! b_e_shift ! r__r_2t0 | |
1831 LSYM(x15) t0__5a0 ! a1_ne_0_b_l0 ! t0__3t0 ! b_n_ret_t0 | |
1832 LSYM(x16) t0__16a0 ! a1_ne_0_b_l1 ! r__r_t0 ! MILLIRETN | |
1833 LSYM(x17) t0__9a0 ! a1_ne_0_b_l0 ! t0__t0_8a0 ! b_n_ret_t0 | |
1834 LSYM(x18) t0__9a0 ! a1_ne_0_b_l1 ! r__r_2t0 ! MILLIRETN | |
1835 LSYM(x19) t0__9a0 ! a1_ne_0_b_l0 ! t0__2t0_a0 ! b_n_ret_t0 | |
1836 LSYM(x20) t0__5a0 ! a1_ne_0_b_l1 ! r__r_4t0 ! MILLIRETN | |
1837 LSYM(x21) t0__5a0 ! a1_ne_0_b_l0 ! t0__4t0_a0 ! b_n_ret_t0 | |
1838 LSYM(x22) t0__5a0 ! t0__2t0_a0 ! b_e_shift ! r__r_2t0 | |
1839 LSYM(x23) t0__5a0 ! t0__2t0_a0 ! b_e_t0 ! t0__2t0_a0 | |
1840 LSYM(x24) t0__3a0 ! a1_ne_0_b_l1 ! r__r_8t0 ! MILLIRETN | |
1841 LSYM(x25) t0__5a0 ! a1_ne_0_b_l0 ! t0__5t0 ! b_n_ret_t0 | |
1842 LSYM(x26) t0__3a0 ! t0__4t0_a0 ! b_e_shift ! r__r_2t0 | |
1843 LSYM(x27) t0__3a0 ! a1_ne_0_b_l0 ! t0__9t0 ! b_n_ret_t0 | |
1844 LSYM(x28) t0__3a0 ! t0__2t0_a0 ! b_e_shift ! r__r_4t0 | |
1845 LSYM(x29) t0__3a0 ! t0__2t0_a0 ! b_e_t0 ! t0__4t0_a0 | |
1846 LSYM(x30) t0__5a0 ! t0__3t0 ! b_e_shift ! r__r_2t0 | |
1847 LSYM(x31) t0__32a0 ! a1_ne_0_b_l0 ! t0__t0ma0 ! b_n_ret_t0 | |
1848 LSYM(x32) t0__32a0 ! a1_ne_0_b_l1 ! r__r_t0 ! MILLIRETN | |
1849 LSYM(x33) t0__8a0 ! a1_ne_0_b_l0 ! t0__4t0_a0 ! b_n_ret_t0 | |
1850 LSYM(x34) t0__16a0 ! t0__t0_a0 ! b_e_shift ! r__r_2t0 | |
1851 LSYM(x35) t0__9a0 ! t0__3t0 ! b_e_t0 ! t0__t0_8a0 | |
1852 LSYM(x36) t0__9a0 ! a1_ne_0_b_l1 ! r__r_4t0 ! MILLIRETN | |
1853 LSYM(x37) t0__9a0 ! a1_ne_0_b_l0 ! t0__4t0_a0 ! b_n_ret_t0 | |
1854 LSYM(x38) t0__9a0 ! t0__2t0_a0 ! b_e_shift ! r__r_2t0 | |
1855 LSYM(x39) t0__9a0 ! t0__2t0_a0 ! b_e_t0 ! t0__2t0_a0 | |
1856 LSYM(x40) t0__5a0 ! a1_ne_0_b_l1 ! r__r_8t0 ! MILLIRETN | |
1857 LSYM(x41) t0__5a0 ! a1_ne_0_b_l0 ! t0__8t0_a0 ! b_n_ret_t0 | |
1858 LSYM(x42) t0__5a0 ! t0__4t0_a0 ! b_e_shift ! r__r_2t0 | |
1859 LSYM(x43) t0__5a0 ! t0__4t0_a0 ! b_e_t0 ! t0__2t0_a0 | |
1860 LSYM(x44) t0__5a0 ! t0__2t0_a0 ! b_e_shift ! r__r_4t0 | |
1861 LSYM(x45) t0__9a0 ! a1_ne_0_b_l0 ! t0__5t0 ! b_n_ret_t0 | |
1862 LSYM(x46) t0__9a0 ! t0__5t0 ! b_e_t0 ! t0__t0_a0 | |
1863 LSYM(x47) t0__9a0 ! t0__5t0 ! b_e_t0 ! t0__t0_2a0 | |
1864 LSYM(x48) t0__3a0 ! a1_ne_0_b_l0 ! t0__16t0 ! b_n_ret_t0 | |
1865 LSYM(x49) t0__9a0 ! t0__5t0 ! b_e_t0 ! t0__t0_4a0 | |
1866 LSYM(x50) t0__5a0 ! t0__5t0 ! b_e_shift ! r__r_2t0 | |
1867 LSYM(x51) t0__9a0 ! t0__t0_8a0 ! b_e_t0 ! t0__3t0 | |
1868 LSYM(x52) t0__3a0 ! t0__4t0_a0 ! b_e_shift ! r__r_4t0 | |
1869 LSYM(x53) t0__3a0 ! t0__4t0_a0 ! b_e_t0 ! t0__4t0_a0 | |
1870 LSYM(x54) t0__9a0 ! t0__3t0 ! b_e_shift ! r__r_2t0 | |
1871 LSYM(x55) t0__9a0 ! t0__3t0 ! b_e_t0 ! t0__2t0_a0 | |
1872 LSYM(x56) t0__3a0 ! t0__2t0_a0 ! b_e_shift ! r__r_8t0 | |
1873 LSYM(x57) t0__9a0 ! t0__2t0_a0 ! b_e_t0 ! t0__3t0 | |
1874 LSYM(x58) t0__3a0 ! t0__2t0_a0 ! b_e_2t0 ! t0__4t0_a0 | |
1875 LSYM(x59) t0__9a0 ! t0__2t0_a0 ! b_e_t02a0 ! t0__3t0 | |
1876 LSYM(x60) t0__5a0 ! t0__3t0 ! b_e_shift ! r__r_4t0 | |
1877 LSYM(x61) t0__5a0 ! t0__3t0 ! b_e_t0 ! t0__4t0_a0 | |
1878 LSYM(x62) t0__32a0 ! t0__t0ma0 ! b_e_shift ! r__r_2t0 | |
1879 LSYM(x63) t0__64a0 ! a1_ne_0_b_l0 ! t0__t0ma0 ! b_n_ret_t0 | |
1880 LSYM(x64) t0__64a0 ! a1_ne_0_b_l1 ! r__r_t0 ! MILLIRETN | |
1881 LSYM(x65) t0__8a0 ! a1_ne_0_b_l0 ! t0__8t0_a0 ! b_n_ret_t0 | |
1882 LSYM(x66) t0__32a0 ! t0__t0_a0 ! b_e_shift ! r__r_2t0 | |
1883 LSYM(x67) t0__8a0 ! t0__4t0_a0 ! b_e_t0 ! t0__2t0_a0 | |
1884 LSYM(x68) t0__8a0 ! t0__2t0_a0 ! b_e_shift ! r__r_4t0 | |
1885 LSYM(x69) t0__8a0 ! t0__2t0_a0 ! b_e_t0 ! t0__4t0_a0 | |
1886 LSYM(x70) t0__64a0 ! t0__t0_4a0 ! b_e_t0 ! t0__t0_2a0 | |
1887 LSYM(x71) t0__9a0 ! t0__8t0 ! b_e_t0 ! t0__t0ma0 | |
1888 LSYM(x72) t0__9a0 ! a1_ne_0_b_l1 ! r__r_8t0 ! MILLIRETN | |
1889 LSYM(x73) t0__9a0 ! t0__8t0_a0 ! b_e_shift ! r__r_t0 | |
1890 LSYM(x74) t0__9a0 ! t0__4t0_a0 ! b_e_shift ! r__r_2t0 | |
1891 LSYM(x75) t0__9a0 ! t0__4t0_a0 ! b_e_t0 ! t0__2t0_a0 | |
1892 LSYM(x76) t0__9a0 ! t0__2t0_a0 ! b_e_shift ! r__r_4t0 | |
1893 LSYM(x77) t0__9a0 ! t0__2t0_a0 ! b_e_t0 ! t0__4t0_a0 | |
1894 LSYM(x78) t0__9a0 ! t0__2t0_a0 ! b_e_2t0 ! t0__2t0_a0 | |
1895 LSYM(x79) t0__16a0 ! t0__5t0 ! b_e_t0 ! t0__t0ma0 | |
1896 LSYM(x80) t0__16a0 ! t0__5t0 ! b_e_shift ! r__r_t0 | |
1897 LSYM(x81) t0__9a0 ! t0__9t0 ! b_e_shift ! r__r_t0 | |
1898 LSYM(x82) t0__5a0 ! t0__8t0_a0 ! b_e_shift ! r__r_2t0 | |
1899 LSYM(x83) t0__5a0 ! t0__8t0_a0 ! b_e_t0 ! t0__2t0_a0 | |
1900 LSYM(x84) t0__5a0 ! t0__4t0_a0 ! b_e_shift ! r__r_4t0 | |
1901 LSYM(x85) t0__8a0 ! t0__2t0_a0 ! b_e_t0 ! t0__5t0 | |
1902 LSYM(x86) t0__5a0 ! t0__4t0_a0 ! b_e_2t0 ! t0__2t0_a0 | |
1903 LSYM(x87) t0__9a0 ! t0__9t0 ! b_e_t02a0 ! t0__t0_4a0 | |
1904 LSYM(x88) t0__5a0 ! t0__2t0_a0 ! b_e_shift ! r__r_8t0 | |
1905 LSYM(x89) t0__5a0 ! t0__2t0_a0 ! b_e_t0 ! t0__8t0_a0 | |
1906 LSYM(x90) t0__9a0 ! t0__5t0 ! b_e_shift ! r__r_2t0 | |
1907 LSYM(x91) t0__9a0 ! t0__5t0 ! b_e_t0 ! t0__2t0_a0 | |
1908 LSYM(x92) t0__5a0 ! t0__2t0_a0 ! b_e_4t0 ! t0__2t0_a0 | |
1909 LSYM(x93) t0__32a0 ! t0__t0ma0 ! b_e_t0 ! t0__3t0 | |
1910 LSYM(x94) t0__9a0 ! t0__5t0 ! b_e_2t0 ! t0__t0_2a0 | |
1911 LSYM(x95) t0__9a0 ! t0__2t0_a0 ! b_e_t0 ! t0__5t0 | |
1912 LSYM(x96) t0__8a0 ! t0__3t0 ! b_e_shift ! r__r_4t0 | |
1913 LSYM(x97) t0__8a0 ! t0__3t0 ! b_e_t0 ! t0__4t0_a0 | |
1914 LSYM(x98) t0__32a0 ! t0__3t0 ! b_e_t0 ! t0__t0_2a0 | |
1915 LSYM(x99) t0__8a0 ! t0__4t0_a0 ! b_e_t0 ! t0__3t0 | |
1916 LSYM(x100) t0__5a0 ! t0__5t0 ! b_e_shift ! r__r_4t0 | |
1917 LSYM(x101) t0__5a0 ! t0__5t0 ! b_e_t0 ! t0__4t0_a0 | |
1918 LSYM(x102) t0__32a0 ! t0__t0_2a0 ! b_e_t0 ! t0__3t0 | |
1919 LSYM(x103) t0__5a0 ! t0__5t0 ! b_e_t02a0 ! t0__4t0_a0 | |
1920 LSYM(x104) t0__3a0 ! t0__4t0_a0 ! b_e_shift ! r__r_8t0 | |
1921 LSYM(x105) t0__5a0 ! t0__4t0_a0 ! b_e_t0 ! t0__5t0 | |
1922 LSYM(x106) t0__3a0 ! t0__4t0_a0 ! b_e_2t0 ! t0__4t0_a0 | |
1923 LSYM(x107) t0__9a0 ! t0__t0_4a0 ! b_e_t02a0 ! t0__8t0_a0 | |
1924 LSYM(x108) t0__9a0 ! t0__3t0 ! b_e_shift ! r__r_4t0 | |
1925 LSYM(x109) t0__9a0 ! t0__3t0 ! b_e_t0 ! t0__4t0_a0 | |
1926 LSYM(x110) t0__9a0 ! t0__3t0 ! b_e_2t0 ! t0__2t0_a0 | |
1927 LSYM(x111) t0__9a0 ! t0__4t0_a0 ! b_e_t0 ! t0__3t0 | |
1928 LSYM(x112) t0__3a0 ! t0__2t0_a0 ! b_e_t0 ! t0__16t0 | |
1929 LSYM(x113) t0__9a0 ! t0__4t0_a0 ! b_e_t02a0 ! t0__3t0 | |
1930 LSYM(x114) t0__9a0 ! t0__2t0_a0 ! b_e_2t0 ! t0__3t0 | |
1931 LSYM(x115) t0__9a0 ! t0__2t0_a0 ! b_e_2t0a0 ! t0__3t0 | |
1932 LSYM(x116) t0__3a0 ! t0__2t0_a0 ! b_e_4t0 ! t0__4t0_a0 | |
1933 LSYM(x117) t0__3a0 ! t0__4t0_a0 ! b_e_t0 ! t0__9t0 | |
1934 LSYM(x118) t0__3a0 ! t0__4t0_a0 ! b_e_t0a0 ! t0__9t0 | |
1935 LSYM(x119) t0__3a0 ! t0__4t0_a0 ! b_e_t02a0 ! t0__9t0 | |
1936 LSYM(x120) t0__5a0 ! t0__3t0 ! b_e_shift ! r__r_8t0 | |
1937 LSYM(x121) t0__5a0 ! t0__3t0 ! b_e_t0 ! t0__8t0_a0 | |
1938 LSYM(x122) t0__5a0 ! t0__3t0 ! b_e_2t0 ! t0__4t0_a0 | |
1939 LSYM(x123) t0__5a0 ! t0__8t0_a0 ! b_e_t0 ! t0__3t0 | |
1940 LSYM(x124) t0__32a0 ! t0__t0ma0 ! b_e_shift ! r__r_4t0 | |
1941 LSYM(x125) t0__5a0 ! t0__5t0 ! b_e_t0 ! t0__5t0 | |
1942 LSYM(x126) t0__64a0 ! t0__t0ma0 ! b_e_shift ! r__r_2t0 | |
1943 LSYM(x127) t0__128a0 ! a1_ne_0_b_l0 ! t0__t0ma0 ! b_n_ret_t0 | |
1944 LSYM(x128) t0__128a0 ! a1_ne_0_b_l1 ! r__r_t0 ! MILLIRETN | |
1945 LSYM(x129) t0__128a0 ! a1_ne_0_b_l0 ! t0__t0_a0 ! b_n_ret_t0 | |
1946 LSYM(x130) t0__64a0 ! t0__t0_a0 ! b_e_shift ! r__r_2t0 | |
1947 LSYM(x131) t0__8a0 ! t0__8t0_a0 ! b_e_t0 ! t0__2t0_a0 | |
1948 LSYM(x132) t0__8a0 ! t0__4t0_a0 ! b_e_shift ! r__r_4t0 | |
1949 LSYM(x133) t0__8a0 ! t0__4t0_a0 ! b_e_t0 ! t0__4t0_a0 | |
1950 LSYM(x134) t0__8a0 ! t0__4t0_a0 ! b_e_2t0 ! t0__2t0_a0 | |
1951 LSYM(x135) t0__9a0 ! t0__5t0 ! b_e_t0 ! t0__3t0 | |
1952 LSYM(x136) t0__8a0 ! t0__2t0_a0 ! b_e_shift ! r__r_8t0 | |
1953 LSYM(x137) t0__8a0 ! t0__2t0_a0 ! b_e_t0 ! t0__8t0_a0 | |
1954 LSYM(x138) t0__8a0 ! t0__2t0_a0 ! b_e_2t0 ! t0__4t0_a0 | |
1955 LSYM(x139) t0__8a0 ! t0__2t0_a0 ! b_e_2t0a0 ! t0__4t0_a0 | |
1956 LSYM(x140) t0__3a0 ! t0__2t0_a0 ! b_e_4t0 ! t0__5t0 | |
1957 LSYM(x141) t0__8a0 ! t0__2t0_a0 ! b_e_4t0a0 ! t0__2t0_a0 | |
1958 LSYM(x142) t0__9a0 ! t0__8t0 ! b_e_2t0 ! t0__t0ma0 | |
1959 LSYM(x143) t0__16a0 ! t0__9t0 ! b_e_t0 ! t0__t0ma0 | |
1960 LSYM(x144) t0__9a0 ! t0__8t0 ! b_e_shift ! r__r_2t0 | |
1961 LSYM(x145) t0__9a0 ! t0__8t0 ! b_e_t0 ! t0__2t0_a0 | |
1962 LSYM(x146) t0__9a0 ! t0__8t0_a0 ! b_e_shift ! r__r_2t0 | |
1963 LSYM(x147) t0__9a0 ! t0__8t0_a0 ! b_e_t0 ! t0__2t0_a0 | |
1964 LSYM(x148) t0__9a0 ! t0__4t0_a0 ! b_e_shift ! r__r_4t0 | |
1965 LSYM(x149) t0__9a0 ! t0__4t0_a0 ! b_e_t0 ! t0__4t0_a0 | |
1966 LSYM(x150) t0__9a0 ! t0__4t0_a0 ! b_e_2t0 ! t0__2t0_a0 | |
1967 LSYM(x151) t0__9a0 ! t0__4t0_a0 ! b_e_2t0a0 ! t0__2t0_a0 | |
1968 LSYM(x152) t0__9a0 ! t0__2t0_a0 ! b_e_shift ! r__r_8t0 | |
1969 LSYM(x153) t0__9a0 ! t0__2t0_a0 ! b_e_t0 ! t0__8t0_a0 | |
1970 LSYM(x154) t0__9a0 ! t0__2t0_a0 ! b_e_2t0 ! t0__4t0_a0 | |
1971 LSYM(x155) t0__32a0 ! t0__t0ma0 ! b_e_t0 ! t0__5t0 | |
1972 LSYM(x156) t0__9a0 ! t0__2t0_a0 ! b_e_4t0 ! t0__2t0_a0 | |
1973 LSYM(x157) t0__32a0 ! t0__t0ma0 ! b_e_t02a0 ! t0__5t0 | |
1974 LSYM(x158) t0__16a0 ! t0__5t0 ! b_e_2t0 ! t0__t0ma0 | |
1975 LSYM(x159) t0__32a0 ! t0__5t0 ! b_e_t0 ! t0__t0ma0 | |
1976 LSYM(x160) t0__5a0 ! t0__4t0 ! b_e_shift ! r__r_8t0 | |
1977 LSYM(x161) t0__8a0 ! t0__5t0 ! b_e_t0 ! t0__4t0_a0 | |
1978 LSYM(x162) t0__9a0 ! t0__9t0 ! b_e_shift ! r__r_2t0 | |
1979 LSYM(x163) t0__9a0 ! t0__9t0 ! b_e_t0 ! t0__2t0_a0 | |
1980 LSYM(x164) t0__5a0 ! t0__8t0_a0 ! b_e_shift ! r__r_4t0 | |
1981 LSYM(x165) t0__8a0 ! t0__4t0_a0 ! b_e_t0 ! t0__5t0 | |
1982 LSYM(x166) t0__5a0 ! t0__8t0_a0 ! b_e_2t0 ! t0__2t0_a0 | |
1983 LSYM(x167) t0__5a0 ! t0__8t0_a0 ! b_e_2t0a0 ! t0__2t0_a0 | |
1984 LSYM(x168) t0__5a0 ! t0__4t0_a0 ! b_e_shift ! r__r_8t0 | |
1985 LSYM(x169) t0__5a0 ! t0__4t0_a0 ! b_e_t0 ! t0__8t0_a0 | |
1986 LSYM(x170) t0__32a0 ! t0__t0_2a0 ! b_e_t0 ! t0__5t0 | |
1987 LSYM(x171) t0__9a0 ! t0__2t0_a0 ! b_e_t0 ! t0__9t0 | |
1988 LSYM(x172) t0__5a0 ! t0__4t0_a0 ! b_e_4t0 ! t0__2t0_a0 | |
1989 LSYM(x173) t0__9a0 ! t0__2t0_a0 ! b_e_t02a0 ! t0__9t0 | |
1990 LSYM(x174) t0__32a0 ! t0__t0_2a0 ! b_e_t04a0 ! t0__5t0 | |
1991 LSYM(x175) t0__8a0 ! t0__2t0_a0 ! b_e_5t0 ! t0__2t0_a0 | |
1992 LSYM(x176) t0__5a0 ! t0__4t0_a0 ! b_e_8t0 ! t0__t0_a0 | |
1993 LSYM(x177) t0__5a0 ! t0__4t0_a0 ! b_e_8t0a0 ! t0__t0_a0 | |
1994 LSYM(x178) t0__5a0 ! t0__2t0_a0 ! b_e_2t0 ! t0__8t0_a0 | |
1995 LSYM(x179) t0__5a0 ! t0__2t0_a0 ! b_e_2t0a0 ! t0__8t0_a0 | |
1996 LSYM(x180) t0__9a0 ! t0__5t0 ! b_e_shift ! r__r_4t0 | |
1997 LSYM(x181) t0__9a0 ! t0__5t0 ! b_e_t0 ! t0__4t0_a0 | |
1998 LSYM(x182) t0__9a0 ! t0__5t0 ! b_e_2t0 ! t0__2t0_a0 | |
1999 LSYM(x183) t0__9a0 ! t0__5t0 ! b_e_2t0a0 ! t0__2t0_a0 | |
2000 LSYM(x184) t0__5a0 ! t0__9t0 ! b_e_4t0 ! t0__t0_a0 | |
2001 LSYM(x185) t0__9a0 ! t0__4t0_a0 ! b_e_t0 ! t0__5t0 | |
2002 LSYM(x186) t0__32a0 ! t0__t0ma0 ! b_e_2t0 ! t0__3t0 | |
2003 LSYM(x187) t0__9a0 ! t0__4t0_a0 ! b_e_t02a0 ! t0__5t0 | |
2004 LSYM(x188) t0__9a0 ! t0__5t0 ! b_e_4t0 ! t0__t0_2a0 | |
2005 LSYM(x189) t0__5a0 ! t0__4t0_a0 ! b_e_t0 ! t0__9t0 | |
2006 LSYM(x190) t0__9a0 ! t0__2t0_a0 ! b_e_2t0 ! t0__5t0 | |
2007 LSYM(x191) t0__64a0 ! t0__3t0 ! b_e_t0 ! t0__t0ma0 | |
2008 LSYM(x192) t0__8a0 ! t0__3t0 ! b_e_shift ! r__r_8t0 | |
2009 LSYM(x193) t0__8a0 ! t0__3t0 ! b_e_t0 ! t0__8t0_a0 | |
2010 LSYM(x194) t0__8a0 ! t0__3t0 ! b_e_2t0 ! t0__4t0_a0 | |
2011 LSYM(x195) t0__8a0 ! t0__8t0_a0 ! b_e_t0 ! t0__3t0 | |
2012 LSYM(x196) t0__8a0 ! t0__3t0 ! b_e_4t0 ! t0__2t0_a0 | |
2013 LSYM(x197) t0__8a0 ! t0__3t0 ! b_e_4t0a0 ! t0__2t0_a0 | |
2014 LSYM(x198) t0__64a0 ! t0__t0_2a0 ! b_e_t0 ! t0__3t0 | |
2015 LSYM(x199) t0__8a0 ! t0__4t0_a0 ! b_e_2t0a0 ! t0__3t0 | |
2016 LSYM(x200) t0__5a0 ! t0__5t0 ! b_e_shift ! r__r_8t0 | |
2017 LSYM(x201) t0__5a0 ! t0__5t0 ! b_e_t0 ! t0__8t0_a0 | |
2018 LSYM(x202) t0__5a0 ! t0__5t0 ! b_e_2t0 ! t0__4t0_a0 | |
2019 LSYM(x203) t0__5a0 ! t0__5t0 ! b_e_2t0a0 ! t0__4t0_a0 | |
2020 LSYM(x204) t0__8a0 ! t0__2t0_a0 ! b_e_4t0 ! t0__3t0 | |
2021 LSYM(x205) t0__5a0 ! t0__8t0_a0 ! b_e_t0 ! t0__5t0 | |
2022 LSYM(x206) t0__64a0 ! t0__t0_4a0 ! b_e_t02a0 ! t0__3t0 | |
2023 LSYM(x207) t0__8a0 ! t0__2t0_a0 ! b_e_3t0 ! t0__4t0_a0 | |
2024 LSYM(x208) t0__5a0 ! t0__5t0 ! b_e_8t0 ! t0__t0_a0 | |
2025 LSYM(x209) t0__5a0 ! t0__5t0 ! b_e_8t0a0 ! t0__t0_a0 | |
2026 LSYM(x210) t0__5a0 ! t0__4t0_a0 ! b_e_2t0 ! t0__5t0 | |
2027 LSYM(x211) t0__5a0 ! t0__4t0_a0 ! b_e_2t0a0 ! t0__5t0 | |
2028 LSYM(x212) t0__3a0 ! t0__4t0_a0 ! b_e_4t0 ! t0__4t0_a0 | |
2029 LSYM(x213) t0__3a0 ! t0__4t0_a0 ! b_e_4t0a0 ! t0__4t0_a0 | |
2030 LSYM(x214) t0__9a0 ! t0__t0_4a0 ! b_e_2t04a0 ! t0__8t0_a0 | |
2031 LSYM(x215) t0__5a0 ! t0__4t0_a0 ! b_e_5t0 ! t0__2t0_a0 | |
2032 LSYM(x216) t0__9a0 ! t0__3t0 ! b_e_shift ! r__r_8t0 | |
2033 LSYM(x217) t0__9a0 ! t0__3t0 ! b_e_t0 ! t0__8t0_a0 | |
2034 LSYM(x218) t0__9a0 ! t0__3t0 ! b_e_2t0 ! t0__4t0_a0 | |
2035 LSYM(x219) t0__9a0 ! t0__8t0_a0 ! b_e_t0 ! t0__3t0 | |
2036 LSYM(x220) t0__3a0 ! t0__9t0 ! b_e_4t0 ! t0__2t0_a0 | |
2037 LSYM(x221) t0__3a0 ! t0__9t0 ! b_e_4t0a0 ! t0__2t0_a0 | |
2038 LSYM(x222) t0__9a0 ! t0__4t0_a0 ! b_e_2t0 ! t0__3t0 | |
2039 LSYM(x223) t0__9a0 ! t0__4t0_a0 ! b_e_2t0a0 ! t0__3t0 | |
2040 LSYM(x224) t0__9a0 ! t0__3t0 ! b_e_8t0 ! t0__t0_a0 | |
2041 LSYM(x225) t0__9a0 ! t0__5t0 ! b_e_t0 ! t0__5t0 | |
2042 LSYM(x226) t0__3a0 ! t0__2t0_a0 ! b_e_t02a0 ! t0__32t0 | |
2043 LSYM(x227) t0__9a0 ! t0__5t0 ! b_e_t02a0 ! t0__5t0 | |
2044 LSYM(x228) t0__9a0 ! t0__2t0_a0 ! b_e_4t0 ! t0__3t0 | |
2045 LSYM(x229) t0__9a0 ! t0__2t0_a0 ! b_e_4t0a0 ! t0__3t0 | |
2046 LSYM(x230) t0__9a0 ! t0__5t0 ! b_e_5t0 ! t0__t0_a0 | |
2047 LSYM(x231) t0__9a0 ! t0__2t0_a0 ! b_e_3t0 ! t0__4t0_a0 | |
2048 LSYM(x232) t0__3a0 ! t0__2t0_a0 ! b_e_8t0 ! t0__4t0_a0 | |
2049 LSYM(x233) t0__3a0 ! t0__2t0_a0 ! b_e_8t0a0 ! t0__4t0_a0 | |
2050 LSYM(x234) t0__3a0 ! t0__4t0_a0 ! b_e_2t0 ! t0__9t0 | |
2051 LSYM(x235) t0__3a0 ! t0__4t0_a0 ! b_e_2t0a0 ! t0__9t0 | |
2052 LSYM(x236) t0__9a0 ! t0__2t0_a0 ! b_e_4t08a0 ! t0__3t0 | |
2053 LSYM(x237) t0__16a0 ! t0__5t0 ! b_e_3t0 ! t0__t0ma0 | |
2054 LSYM(x238) t0__3a0 ! t0__4t0_a0 ! b_e_2t04a0 ! t0__9t0 | |
2055 LSYM(x239) t0__16a0 ! t0__5t0 ! b_e_t0ma0 ! t0__3t0 | |
2056 LSYM(x240) t0__9a0 ! t0__t0_a0 ! b_e_8t0 ! t0__3t0 | |
2057 LSYM(x241) t0__9a0 ! t0__t0_a0 ! b_e_8t0a0 ! t0__3t0 | |
2058 LSYM(x242) t0__5a0 ! t0__3t0 ! b_e_2t0 ! t0__8t0_a0 | |
2059 LSYM(x243) t0__9a0 ! t0__9t0 ! b_e_t0 ! t0__3t0 | |
2060 LSYM(x244) t0__5a0 ! t0__3t0 ! b_e_4t0 ! t0__4t0_a0 | |
2061 LSYM(x245) t0__8a0 ! t0__3t0 ! b_e_5t0 ! t0__2t0_a0 | |
2062 LSYM(x246) t0__5a0 ! t0__8t0_a0 ! b_e_2t0 ! t0__3t0 | |
2063 LSYM(x247) t0__5a0 ! t0__8t0_a0 ! b_e_2t0a0 ! t0__3t0 | |
2064 LSYM(x248) t0__32a0 ! t0__t0ma0 ! b_e_shift ! r__r_8t0 | |
2065 LSYM(x249) t0__32a0 ! t0__t0ma0 ! b_e_t0 ! t0__8t0_a0 | |
2066 LSYM(x250) t0__5a0 ! t0__5t0 ! b_e_2t0 ! t0__5t0 | |
2067 LSYM(x251) t0__5a0 ! t0__5t0 ! b_e_2t0a0 ! t0__5t0 | |
2068 LSYM(x252) t0__64a0 ! t0__t0ma0 ! b_e_shift ! r__r_4t0 | |
2069 LSYM(x253) t0__64a0 ! t0__t0ma0 ! b_e_t0 ! t0__4t0_a0 | |
2070 LSYM(x254) t0__128a0 ! t0__t0ma0 ! b_e_shift ! r__r_2t0 | |
2071 LSYM(x255) t0__256a0 ! a1_ne_0_b_l0 ! t0__t0ma0 ! b_n_ret_t0 | |
2072 /*1040 insts before this. */ | |
2073 LSYM(ret_t0) MILLIRET | |
2074 LSYM(e_t0) r__r_t0 | |
2075 LSYM(e_shift) a1_ne_0_b_l2 | |
2076 a0__256a0 /* a0 <<= 8 *********** */ | |
2077 MILLIRETN | |
2078 LSYM(e_t0ma0) a1_ne_0_b_l0 | |
2079 t0__t0ma0 | |
2080 MILLIRET | |
2081 r__r_t0 | |
2082 LSYM(e_t0a0) a1_ne_0_b_l0 | |
2083 t0__t0_a0 | |
2084 MILLIRET | |
2085 r__r_t0 | |
2086 LSYM(e_t02a0) a1_ne_0_b_l0 | |
2087 t0__t0_2a0 | |
2088 MILLIRET | |
2089 r__r_t0 | |
2090 LSYM(e_t04a0) a1_ne_0_b_l0 | |
2091 t0__t0_4a0 | |
2092 MILLIRET | |
2093 r__r_t0 | |
2094 LSYM(e_2t0) a1_ne_0_b_l1 | |
2095 r__r_2t0 | |
2096 MILLIRETN | |
2097 LSYM(e_2t0a0) a1_ne_0_b_l0 | |
2098 t0__2t0_a0 | |
2099 MILLIRET | |
2100 r__r_t0 | |
2101 LSYM(e2t04a0) t0__t0_2a0 | |
2102 a1_ne_0_b_l1 | |
2103 r__r_2t0 | |
2104 MILLIRETN | |
2105 LSYM(e_3t0) a1_ne_0_b_l0 | |
2106 t0__3t0 | |
2107 MILLIRET | |
2108 r__r_t0 | |
2109 LSYM(e_4t0) a1_ne_0_b_l1 | |
2110 r__r_4t0 | |
2111 MILLIRETN | |
2112 LSYM(e_4t0a0) a1_ne_0_b_l0 | |
2113 t0__4t0_a0 | |
2114 MILLIRET | |
2115 r__r_t0 | |
2116 LSYM(e4t08a0) t0__t0_2a0 | |
2117 a1_ne_0_b_l1 | |
2118 r__r_4t0 | |
2119 MILLIRETN | |
2120 LSYM(e_5t0) a1_ne_0_b_l0 | |
2121 t0__5t0 | |
2122 MILLIRET | |
2123 r__r_t0 | |
2124 LSYM(e_8t0) a1_ne_0_b_l1 | |
2125 r__r_8t0 | |
2126 MILLIRETN | |
2127 LSYM(e_8t0a0) a1_ne_0_b_l0 | |
2128 t0__8t0_a0 | |
2129 MILLIRET | |
2130 r__r_t0 | |
2131 | |
2132 .procend | |
2133 .end | |
2134 #endif |