OSDN Git Service

Move libgcc2 to toplevel libgcc
[pf3gnuchains/gcc-fork.git] / libgcc / config / pa / milli64.S
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