]> git.wh0rd.org - patches.git/blame - nios2-5.1.patch
more random patches. who knows.
[patches.git] / nios2-5.1.patch
CommitLineData
b53d1f41
MF
1the niosii-gnutools-src-5.1.tgz release from altera is missing a lot of
2core gcc files, this patch adds them back in
3
4--- ./gcc/gcc/config/nios2/crti.asm
5+++ ./gcc/gcc/config/nios2/crti.asm
6@@ -0,0 +1,88 @@
7+/*
8+ Copyright (C) 2003
9+ by Jonah Graham (jgraham@altera.com)
10+
11+This file is free software; you can redistribute it and/or modify it
12+under the terms of the GNU General Public License as published by the
13+Free Software Foundation; either version 2, or (at your option) any
14+later version.
15+
16+In addition to the permissions in the GNU General Public License, the
17+Free Software Foundation gives you unlimited permission to link the
18+compiled version of this file with other programs, and to distribute
19+those programs without any restriction coming from the use of this
20+file. (The General Public License restrictions do apply in other
21+respects; for example, they cover modification of the file, and
22+distribution when not linked into another program.)
23+
24+This file is distributed in the hope that it will be useful, but
25+WITHOUT ANY WARRANTY; without even the implied warranty of
26+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
27+General Public License for more details.
28+
29+You should have received a copy of the GNU General Public License
30+along with this program; see the file COPYING. If not, write to
31+the Free Software Foundation, 59 Temple Place - Suite 330,
32+Boston, MA 02111-1307, USA.
33+
34+ As a special exception, if you link this library with files
35+ compiled with GCC to produce an executable, this does not cause
36+ the resulting executable to be covered by the GNU General Public License.
37+ This exception does not however invalidate any other reasons why
38+ the executable file might be covered by the GNU General Public License.
39+
40+
41+This file just make a stack frame for the contents of the .fini and
42+.init sections. Users may put any desired instructions in those
43+sections.
44+
45+
46+While technically any code can be put in the init and fini sections
47+most stuff will not work other than stuff which obeys the call frame
48+and ABI. All the call-preserved registers are saved, the call clobbered
49+registers should have been saved by the code calling init and fini.
50+
51+See crtstuff.c for an example of code that inserts itself in the
52+init and fini sections.
53+
54+See crt0.s for the code that calls init and fini.
55+*/
56+
57+ .file "crti.asm"
58+
59+ .section ".init"
60+ .align 2
61+ .global _init
62+_init:
63+ addi sp, sp, -48
64+ stw ra, 44(sp)
65+ stw r23, 40(sp)
66+ stw r22, 36(sp)
67+ stw r21, 32(sp)
68+ stw r20, 28(sp)
69+ stw r19, 24(sp)
70+ stw r18, 20(sp)
71+ stw r17, 16(sp)
72+ stw r16, 12(sp)
73+ stw fp, 8(sp)
74+ mov fp, sp
75+
76+
77+ .section ".fini"
78+ .align 2
79+ .global _fini
80+_fini:
81+ addi sp, sp, -48
82+ stw ra, 44(sp)
83+ stw r23, 40(sp)
84+ stw r22, 36(sp)
85+ stw r21, 32(sp)
86+ stw r20, 28(sp)
87+ stw r19, 24(sp)
88+ stw r18, 20(sp)
89+ stw r17, 16(sp)
90+ stw r16, 12(sp)
91+ stw fp, 8(sp)
92+ mov fp, sp
93+
94+
95--- ./gcc/gcc/config/nios2/crtn.asm
96+++ ./gcc/gcc/config/nios2/crtn.asm
97@@ -0,0 +1,70 @@
98+/*
99+ Copyright (C) 2003
100+ by Jonah Graham (jgraham@altera.com)
101+
102+This file is free software; you can redistribute it and/or modify it
103+under the terms of the GNU General Public License as published by the
104+Free Software Foundation; either version 2, or (at your option) any
105+later version.
106+
107+In addition to the permissions in the GNU General Public License, the
108+Free Software Foundation gives you unlimited permission to link the
109+compiled version of this file with other programs, and to distribute
110+those programs without any restriction coming from the use of this
111+file. (The General Public License restrictions do apply in other
112+respects; for example, they cover modification of the file, and
113+distribution when not linked into another program.)
114+
115+This file is distributed in the hope that it will be useful, but
116+WITHOUT ANY WARRANTY; without even the implied warranty of
117+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
118+General Public License for more details.
119+
120+You should have received a copy of the GNU General Public License
121+along with this program; see the file COPYING. If not, write to
122+the Free Software Foundation, 59 Temple Place - Suite 330,
123+Boston, MA 02111-1307, USA.
124+
125+ As a special exception, if you link this library with files
126+ compiled with GCC to produce an executable, this does not cause
127+ the resulting executable to be covered by the GNU General Public License.
128+ This exception does not however invalidate any other reasons why
129+ the executable file might be covered by the GNU General Public License.
130+
131+
132+This file just makes sure that the .fini and .init sections do in
133+fact return. Users may put any desired instructions in those sections.
134+This file is the last thing linked into any executable.
135+*/
136+ .file "crtn.asm"
137+
138+
139+
140+ .section ".init"
141+ ldw ra, 44(sp)
142+ ldw r23, 40(sp)
143+ ldw r22, 36(sp)
144+ ldw r21, 32(sp)
145+ ldw r20, 28(sp)
146+ ldw r19, 24(sp)
147+ ldw r18, 20(sp)
148+ ldw r17, 16(sp)
149+ ldw r16, 12(sp)
150+ ldw fp, 8(sp)
151+ addi sp, sp, -48
152+ ret
153+
154+ .section ".fini"
155+ ldw ra, 44(sp)
156+ ldw r23, 40(sp)
157+ ldw r22, 36(sp)
158+ ldw r21, 32(sp)
159+ ldw r20, 28(sp)
160+ ldw r19, 24(sp)
161+ ldw r18, 20(sp)
162+ ldw r17, 16(sp)
163+ ldw r16, 12(sp)
164+ ldw fp, 8(sp)
165+ addi sp, sp, -48
166+ ret
167+
168--- ./gcc/gcc/config/nios2/lib2-divmod-hi.c
169+++ ./gcc/gcc/config/nios2/lib2-divmod-hi.c
170@@ -0,0 +1,123 @@
171+
172+/* We include auto-host.h here to get HAVE_GAS_HIDDEN. This is
173+ supposedly valid even though this is a "target" file. */
174+#include "auto-host.h"
175+
176+
177+#include "tconfig.h"
178+#include "tsystem.h"
179+#include "coretypes.h"
180+#include "tm.h"
181+
182+
183+/* Don't use `fancy_abort' here even if config.h says to use it. */
184+#ifdef abort
185+#undef abort
186+#endif
187+
188+
189+#ifdef HAVE_GAS_HIDDEN
190+#define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden")))
191+#else
192+#define ATTRIBUTE_HIDDEN
193+#endif
194+
195+#include "libgcc2.h"
196+
197+extern HItype __modhi3 (HItype, HItype);
198+extern HItype __divhi3 (HItype, HItype);
199+extern HItype __umodhi3 (HItype, HItype);
200+extern HItype __udivhi3 (HItype, HItype);
201+
202+static UHItype udivmodhi4(UHItype, UHItype, word_type);
203+
204+static UHItype
205+udivmodhi4(UHItype num, UHItype den, word_type modwanted)
206+{
207+ UHItype bit = 1;
208+ UHItype res = 0;
209+
210+ while (den < num && bit && !(den & (1L<<15)))
211+ {
212+ den <<=1;
213+ bit <<=1;
214+ }
215+ while (bit)
216+ {
217+ if (num >= den)
218+ {
219+ num -= den;
220+ res |= bit;
221+ }
222+ bit >>=1;
223+ den >>=1;
224+ }
225+ if (modwanted) return num;
226+ return res;
227+}
228+
229+
230+HItype
231+__divhi3 (HItype a, HItype b)
232+{
233+ word_type neg = 0;
234+ HItype res;
235+
236+ if (a < 0)
237+ {
238+ a = -a;
239+ neg = !neg;
240+ }
241+
242+ if (b < 0)
243+ {
244+ b = -b;
245+ neg = !neg;
246+ }
247+
248+ res = udivmodhi4 (a, b, 0);
249+
250+ if (neg)
251+ res = -res;
252+
253+ return res;
254+}
255+
256+
257+HItype
258+__modhi3 (HItype a, HItype b)
259+{
260+ word_type neg = 0;
261+ HItype res;
262+
263+ if (a < 0)
264+ {
265+ a = -a;
266+ neg = 1;
267+ }
268+
269+ if (b < 0)
270+ b = -b;
271+
272+ res = udivmodhi4 (a, b, 1);
273+
274+ if (neg)
275+ res = -res;
276+
277+ return res;
278+}
279+
280+
281+HItype
282+__udivhi3 (HItype a, HItype b)
283+{
284+ return udivmodhi4 (a, b, 0);
285+}
286+
287+
288+HItype
289+__umodhi3 (HItype a, HItype b)
290+{
291+ return udivmodhi4 (a, b, 1);
292+}
293+
294--- ./gcc/gcc/config/nios2/lib2-divmod.c
295+++ ./gcc/gcc/config/nios2/lib2-divmod.c
296@@ -0,0 +1,126 @@
297+
298+/* We include auto-host.h here to get HAVE_GAS_HIDDEN. This is
299+ supposedly valid even though this is a "target" file. */
300+#include "auto-host.h"
301+
302+
303+#include "tconfig.h"
304+#include "tsystem.h"
305+#include "coretypes.h"
306+#include "tm.h"
307+
308+
309+/* Don't use `fancy_abort' here even if config.h says to use it. */
310+#ifdef abort
311+#undef abort
312+#endif
313+
314+
315+#ifdef HAVE_GAS_HIDDEN
316+#define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden")))
317+#else
318+#define ATTRIBUTE_HIDDEN
319+#endif
320+
321+#include "libgcc2.h"
322+
323+extern SItype __modsi3 (SItype, SItype);
324+extern SItype __divsi3 (SItype, SItype);
325+extern SItype __umodsi3 (SItype, SItype);
326+extern SItype __udivsi3 (SItype, SItype);
327+
328+static USItype udivmodsi4(USItype, USItype, word_type);
329+
330+/* 16-bit SI divide and modulo as used in NIOS */
331+
332+
333+static USItype
334+udivmodsi4(USItype num, USItype den, word_type modwanted)
335+{
336+ USItype bit = 1;
337+ USItype res = 0;
338+
339+ while (den < num && bit && !(den & (1L<<31)))
340+ {
341+ den <<=1;
342+ bit <<=1;
343+ }
344+ while (bit)
345+ {
346+ if (num >= den)
347+ {
348+ num -= den;
349+ res |= bit;
350+ }
351+ bit >>=1;
352+ den >>=1;
353+ }
354+ if (modwanted) return num;
355+ return res;
356+}
357+
358+
359+SItype
360+__divsi3 (SItype a, SItype b)
361+{
362+ word_type neg = 0;
363+ SItype res;
364+
365+ if (a < 0)
366+ {
367+ a = -a;
368+ neg = !neg;
369+ }
370+
371+ if (b < 0)
372+ {
373+ b = -b;
374+ neg = !neg;
375+ }
376+
377+ res = udivmodsi4 (a, b, 0);
378+
379+ if (neg)
380+ res = -res;
381+
382+ return res;
383+}
384+
385+
386+SItype
387+__modsi3 (SItype a, SItype b)
388+{
389+ word_type neg = 0;
390+ SItype res;
391+
392+ if (a < 0)
393+ {
394+ a = -a;
395+ neg = 1;
396+ }
397+
398+ if (b < 0)
399+ b = -b;
400+
401+ res = udivmodsi4 (a, b, 1);
402+
403+ if (neg)
404+ res = -res;
405+
406+ return res;
407+}
408+
409+
410+SItype
411+__udivsi3 (SItype a, SItype b)
412+{
413+ return udivmodsi4 (a, b, 0);
414+}
415+
416+
417+SItype
418+__umodsi3 (SItype a, SItype b)
419+{
420+ return udivmodsi4 (a, b, 1);
421+}
422+
423--- ./gcc/gcc/config/nios2/lib2-divtable.c
424+++ ./gcc/gcc/config/nios2/lib2-divtable.c
425@@ -0,0 +1,46 @@
426+
427+/* We include auto-host.h here to get HAVE_GAS_HIDDEN. This is
428+ supposedly valid even though this is a "target" file. */
429+#include "auto-host.h"
430+
431+
432+#include "tconfig.h"
433+#include "tsystem.h"
434+#include "coretypes.h"
435+#include "tm.h"
436+
437+
438+/* Don't use `fancy_abort' here even if config.h says to use it. */
439+#ifdef abort
440+#undef abort
441+#endif
442+
443+
444+#ifdef HAVE_GAS_HIDDEN
445+#define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden")))
446+#else
447+#define ATTRIBUTE_HIDDEN
448+#endif
449+
450+#include "libgcc2.h"
451+
452+UQItype __divsi3_table[] =
453+{
454+ 0, 0/1, 0/2, 0/3, 0/4, 0/5, 0/6, 0/7, 0/8, 0/9, 0/10, 0/11, 0/12, 0/13, 0/14, 0/15,
455+ 0, 1/1, 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 1/8, 1/9, 1/10, 1/11, 1/12, 1/13, 1/14, 1/15,
456+ 0, 2/1, 2/2, 2/3, 2/4, 2/5, 2/6, 2/7, 2/8, 2/9, 2/10, 2/11, 2/12, 2/13, 2/14, 2/15,
457+ 0, 3/1, 3/2, 3/3, 3/4, 3/5, 3/6, 3/7, 3/8, 3/9, 3/10, 3/11, 3/12, 3/13, 3/14, 3/15,
458+ 0, 4/1, 4/2, 4/3, 4/4, 4/5, 4/6, 4/7, 4/8, 4/9, 4/10, 4/11, 4/12, 4/13, 4/14, 4/15,
459+ 0, 5/1, 5/2, 5/3, 5/4, 5/5, 5/6, 5/7, 5/8, 5/9, 5/10, 5/11, 5/12, 5/13, 5/14, 5/15,
460+ 0, 6/1, 6/2, 6/3, 6/4, 6/5, 6/6, 6/7, 6/8, 6/9, 6/10, 6/11, 6/12, 6/13, 6/14, 6/15,
461+ 0, 7/1, 7/2, 7/3, 7/4, 7/5, 7/6, 7/7, 7/8, 7/9, 7/10, 7/11, 7/12, 7/13, 7/14, 7/15,
462+ 0, 8/1, 8/2, 8/3, 8/4, 8/5, 8/6, 8/7, 8/8, 8/9, 8/10, 8/11, 8/12, 8/13, 8/14, 8/15,
463+ 0, 9/1, 9/2, 9/3, 9/4, 9/5, 9/6, 9/7, 9/8, 9/9, 9/10, 9/11, 9/12, 9/13, 9/14, 9/15,
464+ 0, 10/1, 10/2, 10/3, 10/4, 10/5, 10/6, 10/7, 10/8, 10/9, 10/10, 10/11, 10/12, 10/13, 10/14, 10/15,
465+ 0, 11/1, 11/2, 11/3, 11/4, 11/5, 11/6, 11/7, 11/8, 11/9, 11/10, 11/11, 11/12, 11/13, 11/14, 11/15,
466+ 0, 12/1, 12/2, 12/3, 12/4, 12/5, 12/6, 12/7, 12/8, 12/9, 12/10, 12/11, 12/12, 12/13, 12/14, 12/15,
467+ 0, 13/1, 13/2, 13/3, 13/4, 13/5, 13/6, 13/7, 13/8, 13/9, 13/10, 13/11, 13/12, 13/13, 13/14, 13/15,
468+ 0, 14/1, 14/2, 14/3, 14/4, 14/5, 14/6, 14/7, 14/8, 14/9, 14/10, 14/11, 14/12, 14/13, 14/14, 14/15,
469+ 0, 15/1, 15/2, 15/3, 15/4, 15/5, 15/6, 15/7, 15/8, 15/9, 15/10, 15/11, 15/12, 15/13, 15/14, 15/15,
470+};
471+
472--- ./gcc/gcc/config/nios2/lib2-mul.c
473+++ ./gcc/gcc/config/nios2/lib2-mul.c
474@@ -0,0 +1,103 @@
475+/* while we are debugging (ie compile outside of gcc build)
476+ disable gcc specific headers */
477+#ifndef DEBUG_MULSI3
478+
479+
480+/* We include auto-host.h here to get HAVE_GAS_HIDDEN. This is
481+ supposedly valid even though this is a "target" file. */
482+#include "auto-host.h"
483+
484+
485+#include "tconfig.h"
486+#include "tsystem.h"
487+#include "coretypes.h"
488+#include "tm.h"
489+
490+
491+/* Don't use `fancy_abort' here even if config.h says to use it. */
492+#ifdef abort
493+#undef abort
494+#endif
495+
496+
497+#ifdef HAVE_GAS_HIDDEN
498+#define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden")))
499+#else
500+#define ATTRIBUTE_HIDDEN
501+#endif
502+
503+#include "libgcc2.h"
504+
505+#else
506+#define SItype int
507+#define USItype unsigned int
508+#endif
509+
510+
511+extern SItype __mulsi3 (SItype, SItype);
512+
513+SItype
514+__mulsi3 (SItype a, SItype b)
515+{
516+ SItype res = 0;
517+ USItype cnt = a;
518+
519+ while (cnt)
520+ {
521+ if (cnt & 1)
522+ {
523+ res += b;
524+ }
525+ b <<= 1;
526+ cnt >>= 1;
527+ }
528+
529+ return res;
530+}
531+/*
532+TODO: Choose best alternative implementation.
533+
534+SItype
535+__divsi3 (SItype a, SItype b)
536+{
537+ SItype res = 0;
538+ USItype cnt = 0;
539+
540+ while (cnt < 32)
541+ {
542+ if (a & (1L << cnt))
543+ {
544+ res += b;
545+ }
546+ b <<= 1;
547+ cnt++;
548+ }
549+
550+ return res;
551+}
552+*/
553+
554+
555+#ifdef DEBUG_MULSI3
556+
557+int
558+main ()
559+{
560+ int i, j;
561+ int error = 0;
562+
563+ for (i = -1000; i < 1000; i++)
564+ for (j = -1000; j < 1000; j++)
565+ {
566+ int expect = i * j;
567+ int actual = A__divsi3 (i, j);
568+ if (expect != actual)
569+ {
570+ printf ("error: %d * %d = %d not %d\n", i, j, expect, actual);
571+ error = 1;
572+ }
573+ }
574+
575+ return error;
576+}
577+#endif
578--- ./gcc/gcc/config/nios2/nios2-dp-bit.c
579+++ ./gcc/gcc/config/nios2/nios2-dp-bit.c
580@@ -0,0 +1,1652 @@
581+
582+/* This is a software floating point library which can be used
583+ for targets without hardware floating point.
584+ Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004
585+ Free Software Foundation, Inc.
586+
587+This file is free software; you can redistribute it and/or modify it
588+under the terms of the GNU General Public License as published by the
589+Free Software Foundation; either version 2, or (at your option) any
590+later version.
591+
592+In addition to the permissions in the GNU General Public License, the
593+Free Software Foundation gives you unlimited permission to link the
594+compiled version of this file with other programs, and to distribute
595+those programs without any restriction coming from the use of this
596+file. (The General Public License restrictions do apply in other
597+respects; for example, they cover modification of the file, and
598+distribution when not linked into another program.)
599+
600+This file is distributed in the hope that it will be useful, but
601+WITHOUT ANY WARRANTY; without even the implied warranty of
602+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
603+General Public License for more details.
604+
605+You should have received a copy of the GNU General Public License
606+along with this program; see the file COPYING. If not, write to
607+the Free Software Foundation, 59 Temple Place - Suite 330,
608+Boston, MA 02111-1307, USA. */
609+
610+/* As a special exception, if you link this library with other files,
611+ some of which are compiled with GCC, to produce an executable,
612+ this library does not by itself cause the resulting executable
613+ to be covered by the GNU General Public License.
614+ This exception does not however invalidate any other reasons why
615+ the executable file might be covered by the GNU General Public License. */
616+
617+/* This implements IEEE 754 format arithmetic, but does not provide a
618+ mechanism for setting the rounding mode, or for generating or handling
619+ exceptions.
620+
621+ The original code by Steve Chamberlain, hacked by Mark Eichin and Jim
622+ Wilson, all of Cygnus Support. */
623+
624+/* The intended way to use this file is to make two copies, add `#define FLOAT'
625+ to one copy, then compile both copies and add them to libgcc.a. */
626+
627+#include "tconfig.h"
628+#include "coretypes.h"
629+#include "tm.h"
630+#include "config/fp-bit.h"
631+
632+/* The following macros can be defined to change the behavior of this file:
633+ FLOAT: Implement a `float', aka SFmode, fp library. If this is not
634+ defined, then this file implements a `double', aka DFmode, fp library.
635+ FLOAT_ONLY: Used with FLOAT, to implement a `float' only library, i.e.
636+ don't include float->double conversion which requires the double library.
637+ This is useful only for machines which can't support doubles, e.g. some
638+ 8-bit processors.
639+ CMPtype: Specify the type that floating point compares should return.
640+ This defaults to SItype, aka int.
641+ US_SOFTWARE_GOFAST: This makes all entry points use the same names as the
642+ US Software goFast library.
643+ _DEBUG_BITFLOAT: This makes debugging the code a little easier, by adding
644+ two integers to the FLO_union_type.
645+ NO_DENORMALS: Disable handling of denormals.
646+ NO_NANS: Disable nan and infinity handling
647+ SMALL_MACHINE: Useful when operations on QIs and HIs are faster
648+ than on an SI */
649+
650+/* We don't currently support extended floats (long doubles) on machines
651+ without hardware to deal with them.
652+
653+ These stubs are just to keep the linker from complaining about unresolved
654+ references which can be pulled in from libio & libstdc++, even if the
655+ user isn't using long doubles. However, they may generate an unresolved
656+ external to abort if abort is not used by the function, and the stubs
657+ are referenced from within libc, since libgcc goes before and after the
658+ system library. */
659+
660+#ifdef DECLARE_LIBRARY_RENAMES
661+ DECLARE_LIBRARY_RENAMES
662+#endif
663+
664+#ifdef EXTENDED_FLOAT_STUBS
665+extern void abort (void);
666+void __extendsfxf2 (void) { abort(); }
667+void __extenddfxf2 (void) { abort(); }
668+void __truncxfdf2 (void) { abort(); }
669+void __truncxfsf2 (void) { abort(); }
670+void __fixxfsi (void) { abort(); }
671+void __floatsixf (void) { abort(); }
672+void __addxf3 (void) { abort(); }
673+void __subxf3 (void) { abort(); }
674+void __mulxf3 (void) { abort(); }
675+void __divxf3 (void) { abort(); }
676+void __negxf2 (void) { abort(); }
677+void __eqxf2 (void) { abort(); }
678+void __nexf2 (void) { abort(); }
679+void __gtxf2 (void) { abort(); }
680+void __gexf2 (void) { abort(); }
681+void __lexf2 (void) { abort(); }
682+void __ltxf2 (void) { abort(); }
683+
684+void __extendsftf2 (void) { abort(); }
685+void __extenddftf2 (void) { abort(); }
686+void __trunctfdf2 (void) { abort(); }
687+void __trunctfsf2 (void) { abort(); }
688+void __fixtfsi (void) { abort(); }
689+void __floatsitf (void) { abort(); }
690+void __addtf3 (void) { abort(); }
691+void __subtf3 (void) { abort(); }
692+void __multf3 (void) { abort(); }
693+void __divtf3 (void) { abort(); }
694+void __negtf2 (void) { abort(); }
695+void __eqtf2 (void) { abort(); }
696+void __netf2 (void) { abort(); }
697+void __gttf2 (void) { abort(); }
698+void __getf2 (void) { abort(); }
699+void __letf2 (void) { abort(); }
700+void __lttf2 (void) { abort(); }
701+#else /* !EXTENDED_FLOAT_STUBS, rest of file */
702+
703+/* IEEE "special" number predicates */
704+
705+#ifdef NO_NANS
706+
707+#define nan() 0
708+#define isnan(x) 0
709+#define isinf(x) 0
710+#else
711+
712+#if defined L_thenan_sf
713+const fp_number_type __thenan_sf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
714+#elif defined L_thenan_df
715+const fp_number_type __thenan_df = { CLASS_SNAN, 0, 0, {(fractype) 0} };
716+#elif defined L_thenan_tf
717+const fp_number_type __thenan_tf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
718+#elif defined TFLOAT
719+extern const fp_number_type __thenan_tf;
720+#elif defined FLOAT
721+extern const fp_number_type __thenan_sf;
722+#else
723+extern const fp_number_type __thenan_df;
724+#endif
725+
726+INLINE
727+static fp_number_type *
728+nan (void)
729+{
730+ /* Discard the const qualifier... */
731+#ifdef TFLOAT
732+ return (fp_number_type *) (& __thenan_tf);
733+#elif defined FLOAT
734+ return (fp_number_type *) (& __thenan_sf);
735+#else
736+ return (fp_number_type *) (& __thenan_df);
737+#endif
738+}
739+
740+INLINE
741+static int
742+isnan ( fp_number_type * x)
743+{
744+ return x->class == CLASS_SNAN || x->class == CLASS_QNAN;
745+}
746+
747+INLINE
748+static int
749+isinf ( fp_number_type * x)
750+{
751+ return x->class == CLASS_INFINITY;
752+}
753+
754+#endif /* NO_NANS */
755+
756+INLINE
757+static int
758+iszero ( fp_number_type * x)
759+{
760+ return x->class == CLASS_ZERO;
761+}
762+
763+INLINE
764+static void
765+flip_sign ( fp_number_type * x)
766+{
767+ x->sign = !x->sign;
768+}
769+
770+extern FLO_type pack_d ( fp_number_type * );
771+
772+#if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf)
773+FLO_type
774+pack_d ( fp_number_type * src)
775+{
776+ FLO_union_type dst;
777+ fractype fraction = src->fraction.ll; /* wasn't unsigned before? */
778+ int sign = src->sign;
779+ int exp = 0;
780+
781+ if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && (isnan (src) || isinf (src)))
782+ {
783+ /* We can't represent these values accurately. By using the
784+ largest possible magnitude, we guarantee that the conversion
785+ of infinity is at least as big as any finite number. */
786+ exp = EXPMAX;
787+ fraction = ((fractype) 1 << FRACBITS) - 1;
788+ }
789+ else if (isnan (src))
790+ {
791+ exp = EXPMAX;
792+ if (src->class == CLASS_QNAN || 1)
793+ {
794+#ifdef QUIET_NAN_NEGATED
795+ fraction |= QUIET_NAN - 1;
796+#else
797+ fraction |= QUIET_NAN;
798+#endif
799+ }
800+ }
801+ else if (isinf (src))
802+ {
803+ exp = EXPMAX;
804+ fraction = 0;
805+ }
806+ else if (iszero (src))
807+ {
808+ exp = 0;
809+ fraction = 0;
810+ }
811+ else if (fraction == 0)
812+ {
813+ exp = 0;
814+ }
815+ else
816+ {
817+ if (src->normal_exp < NORMAL_EXPMIN)
818+ {
819+#ifdef NO_DENORMALS
820+ /* Go straight to a zero representation if denormals are not
821+ supported. The denormal handling would be harmless but
822+ isn't unnecessary. */
823+ exp = 0;
824+ fraction = 0;
825+#else /* NO_DENORMALS */
826+ /* This number's exponent is too low to fit into the bits
827+ available in the number, so we'll store 0 in the exponent and
828+ shift the fraction to the right to make up for it. */
829+
830+ int shift = NORMAL_EXPMIN - src->normal_exp;
831+
832+ exp = 0;
833+
834+ if (shift > FRAC_NBITS - NGARDS)
835+ {
836+ /* No point shifting, since it's more that 64 out. */
837+ fraction = 0;
838+ }
839+ else
840+ {
841+ int lowbit = (fraction & (((fractype)1 << shift) - 1)) ? 1 : 0;
842+ fraction = (fraction >> shift) | lowbit;
843+ }
844+ if ((fraction & GARDMASK) == GARDMSB)
845+ {
846+ if ((fraction & (1 << NGARDS)))
847+ fraction += GARDROUND + 1;
848+ }
849+ else
850+ {
851+ /* Add to the guards to round up. */
852+ fraction += GARDROUND;
853+ }
854+ /* Perhaps the rounding means we now need to change the
855+ exponent, because the fraction is no longer denormal. */
856+ if (fraction >= IMPLICIT_1)
857+ {
858+ exp += 1;
859+ }
860+ fraction >>= NGARDS;
861+#endif /* NO_DENORMALS */
862+ }
863+ else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS)
864+ && src->normal_exp > EXPBIAS)
865+ {
866+ exp = EXPMAX;
867+ fraction = 0;
868+ }
869+ else
870+ {
871+ exp = src->normal_exp + EXPBIAS;
872+ if (!ROUND_TOWARDS_ZERO)
873+ {
874+ /* IF the gard bits are the all zero, but the first, then we're
875+ half way between two numbers, choose the one which makes the
876+ lsb of the answer 0. */
877+ if ((fraction & GARDMASK) == GARDMSB)
878+ {
879+ if (fraction & (1 << NGARDS))
880+ fraction += GARDROUND + 1;
881+ }
882+ else
883+ {
884+ /* Add a one to the guards to round up */
885+ fraction += GARDROUND;
886+ }
887+ if (fraction >= IMPLICIT_2)
888+ {
889+ fraction >>= 1;
890+ exp += 1;
891+ }
892+ }
893+ fraction >>= NGARDS;
894+
895+ if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && exp > EXPMAX)
896+ {
897+ /* Saturate on overflow. */
898+ exp = EXPMAX;
899+ fraction = ((fractype) 1 << FRACBITS) - 1;
900+ }
901+ }
902+ }
903+
904+ /* We previously used bitfields to store the number, but this doesn't
905+ handle little/big endian systems conveniently, so use shifts and
906+ masks */
907+#ifdef FLOAT_BIT_ORDER_MISMATCH
908+ dst.bits.fraction = fraction;
909+ dst.bits.exp = exp;
910+ dst.bits.sign = sign;
911+#else
912+# if defined TFLOAT && defined HALFFRACBITS
913+ {
914+ halffractype high, low, unity;
915+ int lowsign, lowexp;
916+
917+ unity = (halffractype) 1 << HALFFRACBITS;
918+
919+ /* Set HIGH to the high double's significand, masking out the implicit 1.
920+ Set LOW to the low double's full significand. */
921+ high = (fraction >> (FRACBITS - HALFFRACBITS)) & (unity - 1);
922+ low = fraction & (unity * 2 - 1);
923+
924+ /* Get the initial sign and exponent of the low double. */
925+ lowexp = exp - HALFFRACBITS - 1;
926+ lowsign = sign;
927+
928+ /* HIGH should be rounded like a normal double, making |LOW| <=
929+ 0.5 ULP of HIGH. Assume round-to-nearest. */
930+ if (exp < EXPMAX)
931+ if (low > unity || (low == unity && (high & 1) == 1))
932+ {
933+ /* Round HIGH up and adjust LOW to match. */
934+ high++;
935+ if (high == unity)
936+ {
937+ /* May make it infinite, but that's OK. */
938+ high = 0;
939+ exp++;
940+ }
941+ low = unity * 2 - low;
942+ lowsign ^= 1;
943+ }
944+
945+ high |= (halffractype) exp << HALFFRACBITS;
946+ high |= (halffractype) sign << (HALFFRACBITS + EXPBITS);
947+
948+ if (exp == EXPMAX || exp == 0 || low == 0)
949+ low = 0;
950+ else
951+ {
952+ while (lowexp > 0 && low < unity)
953+ {
954+ low <<= 1;
955+ lowexp--;
956+ }
957+
958+ if (lowexp <= 0)
959+ {
960+ halffractype roundmsb, round;
961+ int shift;
962+
963+ shift = 1 - lowexp;
964+ roundmsb = (1 << (shift - 1));
965+ round = low & ((roundmsb << 1) - 1);
966+
967+ low >>= shift;
968+ lowexp = 0;
969+
970+ if (round > roundmsb || (round == roundmsb && (low & 1) == 1))
971+ {
972+ low++;
973+ if (low == unity)
974+ /* LOW rounds up to the smallest normal number. */
975+ lowexp++;
976+ }
977+ }
978+
979+ low &= unity - 1;
980+ low |= (halffractype) lowexp << HALFFRACBITS;
981+ low |= (halffractype) lowsign << (HALFFRACBITS + EXPBITS);
982+ }
983+ dst.value_raw = ((fractype) high << HALFSHIFT) | low;
984+ }
985+# else
986+ dst.value_raw = fraction & ((((fractype)1) << FRACBITS) - (fractype)1);
987+ dst.value_raw |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << FRACBITS;
988+ dst.value_raw |= ((fractype) (sign & 1)) << (FRACBITS | EXPBITS);
989+# endif
990+#endif
991+
992+#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
993+#ifdef TFLOAT
994+ {
995+ qrtrfractype tmp1 = dst.words[0];
996+ qrtrfractype tmp2 = dst.words[1];
997+ dst.words[0] = dst.words[3];
998+ dst.words[1] = dst.words[2];
999+ dst.words[2] = tmp2;
1000+ dst.words[3] = tmp1;
1001+ }
1002+#else
1003+ {
1004+ halffractype tmp = dst.words[0];
1005+ dst.words[0] = dst.words[1];
1006+ dst.words[1] = tmp;
1007+ }
1008+#endif
1009+#endif
1010+
1011+ return dst.value;
1012+}
1013+#endif
1014+
1015+#if defined(L_unpack_df) || defined(L_unpack_sf) || defined(L_unpack_tf)
1016+void
1017+unpack_d (FLO_union_type * src, fp_number_type * dst)
1018+{
1019+ /* We previously used bitfields to store the number, but this doesn't
1020+ handle little/big endian systems conveniently, so use shifts and
1021+ masks */
1022+ fractype fraction;
1023+ int exp;
1024+ int sign;
1025+
1026+#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
1027+ FLO_union_type swapped;
1028+
1029+#ifdef TFLOAT
1030+ swapped.words[0] = src->words[3];
1031+ swapped.words[1] = src->words[2];
1032+ swapped.words[2] = src->words[1];
1033+ swapped.words[3] = src->words[0];
1034+#else
1035+ swapped.words[0] = src->words[1];
1036+ swapped.words[1] = src->words[0];
1037+#endif
1038+ src = &swapped;
1039+#endif
1040+
1041+#ifdef FLOAT_BIT_ORDER_MISMATCH
1042+ fraction = src->bits.fraction;
1043+ exp = src->bits.exp;
1044+ sign = src->bits.sign;
1045+#else
1046+# if defined TFLOAT && defined HALFFRACBITS
1047+ {
1048+ halffractype high, low;
1049+
1050+ high = src->value_raw >> HALFSHIFT;
1051+ low = src->value_raw & (((fractype)1 << HALFSHIFT) - 1);
1052+
1053+ fraction = high & ((((fractype)1) << HALFFRACBITS) - 1);
1054+ fraction <<= FRACBITS - HALFFRACBITS;
1055+ exp = ((int)(high >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
1056+ sign = ((int)(high >> (((HALFFRACBITS + EXPBITS))))) & 1;
1057+
1058+ if (exp != EXPMAX && exp != 0 && low != 0)
1059+ {
1060+ int lowexp = ((int)(low >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
1061+ int lowsign = ((int)(low >> (((HALFFRACBITS + EXPBITS))))) & 1;
1062+ int shift;
1063+ fractype xlow;
1064+
1065+ xlow = low & ((((fractype)1) << HALFFRACBITS) - 1);
1066+ if (lowexp)
1067+ xlow |= (((halffractype)1) << HALFFRACBITS);
1068+ else
1069+ lowexp = 1;
1070+ shift = (FRACBITS - HALFFRACBITS) - (exp - lowexp);
1071+ if (shift > 0)
1072+ xlow <<= shift;
1073+ else if (shift < 0)
1074+ xlow >>= -shift;
1075+ if (sign == lowsign)
1076+ fraction += xlow;
1077+ else if (fraction >= xlow)
1078+ fraction -= xlow;
1079+ else
1080+ {
1081+ /* The high part is a power of two but the full number is lower.
1082+ This code will leave the implicit 1 in FRACTION, but we'd
1083+ have added that below anyway. */
1084+ fraction = (((fractype) 1 << FRACBITS) - xlow) << 1;
1085+ exp--;
1086+ }
1087+ }
1088+ }
1089+# else
1090+ fraction = src->value_raw & ((((fractype)1) << FRACBITS) - 1);
1091+ exp = ((int)(src->value_raw >> FRACBITS)) & ((1 << EXPBITS) - 1);
1092+ sign = ((int)(src->value_raw >> (FRACBITS + EXPBITS))) & 1;
1093+# endif
1094+#endif
1095+
1096+ dst->sign = sign;
1097+ if (exp == 0)
1098+ {
1099+ /* Hmm. Looks like 0 */
1100+ if (fraction == 0
1101+#ifdef NO_DENORMALS
1102+ || 1
1103+#endif
1104+ )
1105+ {
1106+ /* tastes like zero */
1107+ dst->class = CLASS_ZERO;
1108+ }
1109+ else
1110+ {
1111+ /* Zero exponent with nonzero fraction - it's denormalized,
1112+ so there isn't a leading implicit one - we'll shift it so
1113+ it gets one. */
1114+ dst->normal_exp = exp - EXPBIAS + 1;
1115+ fraction <<= NGARDS;
1116+
1117+ dst->class = CLASS_NUMBER;
1118+#if 1
1119+ while (fraction < IMPLICIT_1)
1120+ {
1121+ fraction <<= 1;
1122+ dst->normal_exp--;
1123+ }
1124+#endif
1125+ dst->fraction.ll = fraction;
1126+ }
1127+ }
1128+ else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && exp == EXPMAX)
1129+ {
1130+ /* Huge exponent*/
1131+ if (fraction == 0)
1132+ {
1133+ /* Attached to a zero fraction - means infinity */
1134+ dst->class = CLASS_INFINITY;
1135+ }
1136+ else
1137+ {
1138+ /* Nonzero fraction, means nan */
1139+#ifdef QUIET_NAN_NEGATED
1140+ if ((fraction & QUIET_NAN) == 0)
1141+#else
1142+ if (fraction & QUIET_NAN)
1143+#endif
1144+ {
1145+ dst->class = CLASS_QNAN;
1146+ }
1147+ else
1148+ {
1149+ dst->class = CLASS_SNAN;
1150+ }
1151+ /* Keep the fraction part as the nan number */
1152+ dst->fraction.ll = fraction;
1153+ }
1154+ }
1155+ else
1156+ {
1157+ /* Nothing strange about this number */
1158+ dst->normal_exp = exp - EXPBIAS;
1159+ dst->class = CLASS_NUMBER;
1160+ dst->fraction.ll = (fraction << NGARDS) | IMPLICIT_1;
1161+ }
1162+}
1163+#endif /* L_unpack_df || L_unpack_sf */
1164+
1165+#if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf)
1166+static fp_number_type *
1167+_fpadd_parts (fp_number_type * a,
1168+ fp_number_type * b,
1169+ fp_number_type * tmp)
1170+{
1171+ intfrac tfraction;
1172+
1173+ /* Put commonly used fields in local variables. */
1174+ int a_normal_exp;
1175+ int b_normal_exp;
1176+ fractype a_fraction;
1177+ fractype b_fraction;
1178+
1179+ if (isnan (a))
1180+ {
1181+ return a;
1182+ }
1183+ if (isnan (b))
1184+ {
1185+ return b;
1186+ }
1187+ if (isinf (a))
1188+ {
1189+ /* Adding infinities with opposite signs yields a NaN. */
1190+ if (isinf (b) && a->sign != b->sign)
1191+ return nan ();
1192+ return a;
1193+ }
1194+ if (isinf (b))
1195+ {
1196+ return b;
1197+ }
1198+ if (iszero (b))
1199+ {
1200+ if (iszero (a))
1201+ {
1202+ *tmp = *a;
1203+ tmp->sign = a->sign & b->sign;
1204+ return tmp;
1205+ }
1206+ return a;
1207+ }
1208+ if (iszero (a))
1209+ {
1210+ return b;
1211+ }
1212+
1213+ /* Got two numbers. shift the smaller and increment the exponent till
1214+ they're the same */
1215+ {
1216+ int diff;
1217+
1218+ a_normal_exp = a->normal_exp;
1219+ b_normal_exp = b->normal_exp;
1220+ a_fraction = a->fraction.ll;
1221+ b_fraction = b->fraction.ll;
1222+
1223+ diff = a_normal_exp - b_normal_exp;
1224+
1225+ if (diff < 0)
1226+ diff = -diff;
1227+ if (diff < FRAC_NBITS)
1228+ {
1229+ /* ??? This does shifts one bit at a time. Optimize. */
1230+ while (a_normal_exp > b_normal_exp)
1231+ {
1232+ b_normal_exp++;
1233+ LSHIFT (b_fraction);
1234+ }
1235+ while (b_normal_exp > a_normal_exp)
1236+ {
1237+ a_normal_exp++;
1238+ LSHIFT (a_fraction);
1239+ }
1240+ }
1241+ else
1242+ {
1243+ /* Somethings's up.. choose the biggest */
1244+ if (a_normal_exp > b_normal_exp)
1245+ {
1246+ b_normal_exp = a_normal_exp;
1247+ b_fraction = 0;
1248+ }
1249+ else
1250+ {
1251+ a_normal_exp = b_normal_exp;
1252+ a_fraction = 0;
1253+ }
1254+ }
1255+ }
1256+
1257+ if (a->sign != b->sign)
1258+ {
1259+ if (a->sign)
1260+ {
1261+ tfraction = -a_fraction + b_fraction;
1262+ }
1263+ else
1264+ {
1265+ tfraction = a_fraction - b_fraction;
1266+ }
1267+ if (tfraction >= 0)
1268+ {
1269+ tmp->sign = 0;
1270+ tmp->normal_exp = a_normal_exp;
1271+ tmp->fraction.ll = tfraction;
1272+ }
1273+ else
1274+ {
1275+ tmp->sign = 1;
1276+ tmp->normal_exp = a_normal_exp;
1277+ tmp->fraction.ll = -tfraction;
1278+ }
1279+ /* and renormalize it */
1280+
1281+ while (tmp->fraction.ll < IMPLICIT_1 && tmp->fraction.ll)
1282+ {
1283+ tmp->fraction.ll <<= 1;
1284+ tmp->normal_exp--;
1285+ }
1286+ }
1287+ else
1288+ {
1289+ tmp->sign = a->sign;
1290+ tmp->normal_exp = a_normal_exp;
1291+ tmp->fraction.ll = a_fraction + b_fraction;
1292+ }
1293+ tmp->class = CLASS_NUMBER;
1294+ /* Now the fraction is added, we have to shift down to renormalize the
1295+ number */
1296+
1297+ if (tmp->fraction.ll >= IMPLICIT_2)
1298+ {
1299+ LSHIFT (tmp->fraction.ll);
1300+ tmp->normal_exp++;
1301+ }
1302+ return tmp;
1303+
1304+}
1305+
1306+FLO_type
1307+add (FLO_type arg_a, FLO_type arg_b)
1308+{
1309+ fp_number_type a;
1310+ fp_number_type b;
1311+ fp_number_type tmp;
1312+ fp_number_type *res;
1313+ FLO_union_type au, bu;
1314+
1315+ au.value = arg_a;
1316+ bu.value = arg_b;
1317+
1318+ unpack_d (&au, &a);
1319+ unpack_d (&bu, &b);
1320+
1321+ res = _fpadd_parts (&a, &b, &tmp);
1322+
1323+ return pack_d (res);
1324+}
1325+
1326+FLO_type
1327+sub (FLO_type arg_a, FLO_type arg_b)
1328+{
1329+ fp_number_type a;
1330+ fp_number_type b;
1331+ fp_number_type tmp;
1332+ fp_number_type *res;
1333+ FLO_union_type au, bu;
1334+
1335+ au.value = arg_a;
1336+ bu.value = arg_b;
1337+
1338+ unpack_d (&au, &a);
1339+ unpack_d (&bu, &b);
1340+
1341+ b.sign ^= 1;
1342+
1343+ res = _fpadd_parts (&a, &b, &tmp);
1344+
1345+ return pack_d (res);
1346+}
1347+#endif /* L_addsub_sf || L_addsub_df */
1348+
1349+#if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf)
1350+static inline __attribute__ ((__always_inline__)) fp_number_type *
1351+_fpmul_parts ( fp_number_type * a,
1352+ fp_number_type * b,
1353+ fp_number_type * tmp)
1354+{
1355+ fractype low = 0;
1356+ fractype high = 0;
1357+
1358+ if (isnan (a))
1359+ {
1360+ a->sign = a->sign != b->sign;
1361+ return a;
1362+ }
1363+ if (isnan (b))
1364+ {
1365+ b->sign = a->sign != b->sign;
1366+ return b;
1367+ }
1368+ if (isinf (a))
1369+ {
1370+ if (iszero (b))
1371+ return nan ();
1372+ a->sign = a->sign != b->sign;
1373+ return a;
1374+ }
1375+ if (isinf (b))
1376+ {
1377+ if (iszero (a))
1378+ {
1379+ return nan ();
1380+ }
1381+ b->sign = a->sign != b->sign;
1382+ return b;
1383+ }
1384+ if (iszero (a))
1385+ {
1386+ a->sign = a->sign != b->sign;
1387+ return a;
1388+ }
1389+ if (iszero (b))
1390+ {
1391+ b->sign = a->sign != b->sign;
1392+ return b;
1393+ }
1394+
1395+ /* Calculate the mantissa by multiplying both numbers to get a
1396+ twice-as-wide number. */
1397+ {
1398+#if defined(NO_DI_MODE) || defined(TFLOAT)
1399+ {
1400+ fractype x = a->fraction.ll;
1401+ fractype ylow = b->fraction.ll;
1402+ fractype yhigh = 0;
1403+ int bit;
1404+
1405+ /* ??? This does multiplies one bit at a time. Optimize. */
1406+ for (bit = 0; bit < FRAC_NBITS; bit++)
1407+ {
1408+ int carry;
1409+
1410+ if (x & 1)
1411+ {
1412+ carry = (low += ylow) < ylow;
1413+ high += yhigh + carry;
1414+ }
1415+ yhigh <<= 1;
1416+ if (ylow & FRACHIGH)
1417+ {
1418+ yhigh |= 1;
1419+ }
1420+ ylow <<= 1;
1421+ x >>= 1;
1422+ }
1423+ }
1424+#elif defined(FLOAT)
1425+ /* Multiplying two USIs to get a UDI, we're safe. */
1426+ {
1427+ UDItype answer = (UDItype)a->fraction.ll * (UDItype)b->fraction.ll;
1428+
1429+ high = answer >> BITS_PER_SI;
1430+ low = answer;
1431+ }
1432+#else
1433+ /* fractype is DImode, but we need the result to be twice as wide.
1434+ Assuming a widening multiply from DImode to TImode is not
1435+ available, build one by hand. */
1436+ {
1437+ USItype nl = a->fraction.ll;
1438+ USItype nh = a->fraction.ll >> BITS_PER_SI;
1439+ USItype ml = b->fraction.ll;
1440+ USItype mh = b->fraction.ll >> BITS_PER_SI;
1441+ UDItype pp_ll = (UDItype) ml * nl;
1442+ UDItype pp_hl = (UDItype) mh * nl;
1443+ UDItype pp_lh = (UDItype) ml * nh;
1444+ UDItype pp_hh = (UDItype) mh * nh;
1445+ UDItype res2 = 0;
1446+ UDItype res0 = 0;
1447+ UDItype ps_hh__ = pp_hl + pp_lh;
1448+ if (ps_hh__ < pp_hl)
1449+ res2 += (UDItype)1 << BITS_PER_SI;
1450+ pp_hl = (UDItype)(USItype)ps_hh__ << BITS_PER_SI;
1451+ res0 = pp_ll + pp_hl;
1452+ if (res0 < pp_ll)
1453+ res2++;
1454+ res2 += (ps_hh__ >> BITS_PER_SI) + pp_hh;
1455+ high = res2;
1456+ low = res0;
1457+ }
1458+#endif
1459+ }
1460+
1461+ tmp->normal_exp = a->normal_exp + b->normal_exp
1462+ + FRAC_NBITS - (FRACBITS + NGARDS);
1463+ tmp->sign = a->sign != b->sign;
1464+ while (high >= IMPLICIT_2)
1465+ {
1466+ tmp->normal_exp++;
1467+ if (high & 1)
1468+ {
1469+ low >>= 1;
1470+ low |= FRACHIGH;
1471+ }
1472+ high >>= 1;
1473+ }
1474+ while (high < IMPLICIT_1)
1475+ {
1476+ tmp->normal_exp--;
1477+
1478+ high <<= 1;
1479+ if (low & FRACHIGH)
1480+ high |= 1;
1481+ low <<= 1;
1482+ }
1483+ /* rounding is tricky. if we only round if it won't make us round later. */
1484+#if 0
1485+ if (low & FRACHIGH2)
1486+ {
1487+ if (((high & GARDMASK) != GARDMSB)
1488+ && (((high + 1) & GARDMASK) == GARDMSB))
1489+ {
1490+ /* don't round, it gets done again later. */
1491+ }
1492+ else
1493+ {
1494+ high++;
1495+ }
1496+ }
1497+#endif
1498+ if (!ROUND_TOWARDS_ZERO && (high & GARDMASK) == GARDMSB)
1499+ {
1500+ if (high & (1 << NGARDS))
1501+ {
1502+ /* half way, so round to even */
1503+ high += GARDROUND + 1;
1504+ }
1505+ else if (low)
1506+ {
1507+ /* but we really weren't half way */
1508+ high += GARDROUND + 1;
1509+ }
1510+ }
1511+ tmp->fraction.ll = high;
1512+ tmp->class = CLASS_NUMBER;
1513+ return tmp;
1514+}
1515+
1516+FLO_type
1517+multiply (FLO_type arg_a, FLO_type arg_b)
1518+{
1519+ fp_number_type a;
1520+ fp_number_type b;
1521+ fp_number_type tmp;
1522+ fp_number_type *res;
1523+ FLO_union_type au, bu;
1524+
1525+ au.value = arg_a;
1526+ bu.value = arg_b;
1527+
1528+ unpack_d (&au, &a);
1529+ unpack_d (&bu, &b);
1530+
1531+ res = _fpmul_parts (&a, &b, &tmp);
1532+
1533+ return pack_d (res);
1534+}
1535+#endif /* L_mul_sf || L_mul_df */
1536+
1537+#if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf)
1538+static inline __attribute__ ((__always_inline__)) fp_number_type *
1539+_fpdiv_parts (fp_number_type * a,
1540+ fp_number_type * b)
1541+{
1542+ fractype bit;
1543+ fractype numerator;
1544+ fractype denominator;
1545+ fractype quotient;
1546+
1547+ if (isnan (a))
1548+ {
1549+ return a;
1550+ }
1551+ if (isnan (b))
1552+ {
1553+ return b;
1554+ }
1555+
1556+ a->sign = a->sign ^ b->sign;
1557+
1558+ if (isinf (a) || iszero (a))
1559+ {
1560+ if (a->class == b->class)
1561+ return nan ();
1562+ return a;
1563+ }
1564+
1565+ if (isinf (b))
1566+ {
1567+ a->fraction.ll = 0;
1568+ a->normal_exp = 0;
1569+ return a;
1570+ }
1571+ if (iszero (b))
1572+ {
1573+ a->class = CLASS_INFINITY;
1574+ return a;
1575+ }
1576+
1577+ /* Calculate the mantissa by multiplying both 64bit numbers to get a
1578+ 128 bit number */
1579+ {
1580+ /* quotient =
1581+ ( numerator / denominator) * 2^(numerator exponent - denominator exponent)
1582+ */
1583+
1584+ a->normal_exp = a->normal_exp - b->normal_exp;
1585+ numerator = a->fraction.ll;
1586+ denominator = b->fraction.ll;
1587+
1588+ if (numerator < denominator)
1589+ {
1590+ /* Fraction will be less than 1.0 */
1591+ numerator *= 2;
1592+ a->normal_exp--;
1593+ }
1594+ bit = IMPLICIT_1;
1595+ quotient = 0;
1596+ /* ??? Does divide one bit at a time. Optimize. */
1597+ while (bit)
1598+ {
1599+ if (numerator >= denominator)
1600+ {
1601+ quotient |= bit;
1602+ numerator -= denominator;
1603+ }
1604+ bit >>= 1;
1605+ numerator *= 2;
1606+ }
1607+
1608+ if (!ROUND_TOWARDS_ZERO && (quotient & GARDMASK) == GARDMSB)
1609+ {
1610+ if (quotient & (1 << NGARDS))
1611+ {
1612+ /* half way, so round to even */
1613+ quotient += GARDROUND + 1;
1614+ }
1615+ else if (numerator)
1616+ {
1617+ /* but we really weren't half way, more bits exist */
1618+ quotient += GARDROUND + 1;
1619+ }
1620+ }
1621+
1622+ a->fraction.ll = quotient;
1623+ return (a);
1624+ }
1625+}
1626+
1627+FLO_type
1628+divide (FLO_type arg_a, FLO_type arg_b)
1629+{
1630+ fp_number_type a;
1631+ fp_number_type b;
1632+ fp_number_type *res;
1633+ FLO_union_type au, bu;
1634+
1635+ au.value = arg_a;
1636+ bu.value = arg_b;
1637+
1638+ unpack_d (&au, &a);
1639+ unpack_d (&bu, &b);
1640+
1641+ res = _fpdiv_parts (&a, &b);
1642+
1643+ return pack_d (res);
1644+}
1645+#endif /* L_div_sf || L_div_df */
1646+
1647+#if defined(L_fpcmp_parts_sf) || defined(L_fpcmp_parts_df) \
1648+ || defined(L_fpcmp_parts_tf)
1649+/* according to the demo, fpcmp returns a comparison with 0... thus
1650+ a<b -> -1
1651+ a==b -> 0
1652+ a>b -> +1
1653+ */
1654+
1655+int
1656+__fpcmp_parts (fp_number_type * a, fp_number_type * b)
1657+{
1658+#if 0
1659+ /* either nan -> unordered. Must be checked outside of this routine. */
1660+ if (isnan (a) && isnan (b))
1661+ {
1662+ return 1; /* still unordered! */
1663+ }
1664+#endif
1665+
1666+ if (isnan (a) || isnan (b))
1667+ {
1668+ return 1; /* how to indicate unordered compare? */
1669+ }
1670+ if (isinf (a) && isinf (b))
1671+ {
1672+ /* +inf > -inf, but +inf != +inf */
1673+ /* b \a| +inf(0)| -inf(1)
1674+ ______\+--------+--------
1675+ +inf(0)| a==b(0)| a<b(-1)
1676+ -------+--------+--------
1677+ -inf(1)| a>b(1) | a==b(0)
1678+ -------+--------+--------
1679+ So since unordered must be nonzero, just line up the columns...
1680+ */
1681+ return b->sign - a->sign;
1682+ }
1683+ /* but not both... */
1684+ if (isinf (a))
1685+ {
1686+ return a->sign ? -1 : 1;
1687+ }
1688+ if (isinf (b))
1689+ {
1690+ return b->sign ? 1 : -1;
1691+ }
1692+ if (iszero (a) && iszero (b))
1693+ {
1694+ return 0;
1695+ }
1696+ if (iszero (a))
1697+ {
1698+ return b->sign ? 1 : -1;
1699+ }
1700+ if (iszero (b))
1701+ {
1702+ return a->sign ? -1 : 1;
1703+ }
1704+ /* now both are "normal". */
1705+ if (a->sign != b->sign)
1706+ {
1707+ /* opposite signs */
1708+ return a->sign ? -1 : 1;
1709+ }
1710+ /* same sign; exponents? */
1711+ if (a->normal_exp > b->normal_exp)
1712+ {
1713+ return a->sign ? -1 : 1;
1714+ }
1715+ if (a->normal_exp < b->normal_exp)
1716+ {
1717+ return a->sign ? 1 : -1;
1718+ }
1719+ /* same exponents; check size. */
1720+ if (a->fraction.ll > b->fraction.ll)
1721+ {
1722+ return a->sign ? -1 : 1;
1723+ }
1724+ if (a->fraction.ll < b->fraction.ll)
1725+ {
1726+ return a->sign ? 1 : -1;
1727+ }
1728+ /* after all that, they're equal. */
1729+ return 0;
1730+}
1731+#endif
1732+
1733+#if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compoare_tf)
1734+CMPtype
1735+compare (FLO_type arg_a, FLO_type arg_b)
1736+{
1737+ fp_number_type a;
1738+ fp_number_type b;
1739+ FLO_union_type au, bu;
1740+
1741+ au.value = arg_a;
1742+ bu.value = arg_b;
1743+
1744+ unpack_d (&au, &a);
1745+ unpack_d (&bu, &b);
1746+
1747+ return __fpcmp_parts (&a, &b);
1748+}
1749+#endif /* L_compare_sf || L_compare_df */
1750+
1751+#ifndef US_SOFTWARE_GOFAST
1752+
1753+/* These should be optimized for their specific tasks someday. */
1754+
1755+#if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf)
1756+CMPtype
1757+_eq_f2 (FLO_type arg_a, FLO_type arg_b)
1758+{
1759+ fp_number_type a;
1760+ fp_number_type b;
1761+ FLO_union_type au, bu;
1762+
1763+ au.value = arg_a;
1764+ bu.value = arg_b;
1765+
1766+ unpack_d (&au, &a);
1767+ unpack_d (&bu, &b);
1768+
1769+ if (isnan (&a) || isnan (&b))
1770+ return 1; /* false, truth == 0 */
1771+
1772+ return __fpcmp_parts (&a, &b) ;
1773+}
1774+#endif /* L_eq_sf || L_eq_df */
1775+
1776+#if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf)
1777+CMPtype
1778+_ne_f2 (FLO_type arg_a, FLO_type arg_b)
1779+{
1780+ fp_number_type a;
1781+ fp_number_type b;
1782+ FLO_union_type au, bu;
1783+
1784+ au.value = arg_a;
1785+ bu.value = arg_b;
1786+
1787+ unpack_d (&au, &a);
1788+ unpack_d (&bu, &b);
1789+
1790+ if (isnan (&a) || isnan (&b))
1791+ return 1; /* true, truth != 0 */
1792+
1793+ return __fpcmp_parts (&a, &b) ;
1794+}
1795+#endif /* L_ne_sf || L_ne_df */
1796+
1797+#if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf)
1798+CMPtype
1799+_gt_f2 (FLO_type arg_a, FLO_type arg_b)
1800+{
1801+ fp_number_type a;
1802+ fp_number_type b;
1803+ FLO_union_type au, bu;
1804+
1805+ au.value = arg_a;
1806+ bu.value = arg_b;
1807+
1808+ unpack_d (&au, &a);
1809+ unpack_d (&bu, &b);
1810+
1811+ if (isnan (&a) || isnan (&b))
1812+ return -1; /* false, truth > 0 */
1813+
1814+ return __fpcmp_parts (&a, &b);
1815+}
1816+#endif /* L_gt_sf || L_gt_df */
1817+
1818+#if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf)
1819+CMPtype
1820+_ge_f2 (FLO_type arg_a, FLO_type arg_b)
1821+{
1822+ fp_number_type a;
1823+ fp_number_type b;
1824+ FLO_union_type au, bu;
1825+
1826+ au.value = arg_a;
1827+ bu.value = arg_b;
1828+
1829+ unpack_d (&au, &a);
1830+ unpack_d (&bu, &b);
1831+
1832+ if (isnan (&a) || isnan (&b))
1833+ return -1; /* false, truth >= 0 */
1834+ return __fpcmp_parts (&a, &b) ;
1835+}
1836+#endif /* L_ge_sf || L_ge_df */
1837+
1838+#if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf)
1839+CMPtype
1840+_lt_f2 (FLO_type arg_a, FLO_type arg_b)
1841+{
1842+ fp_number_type a;
1843+ fp_number_type b;
1844+ FLO_union_type au, bu;
1845+
1846+ au.value = arg_a;
1847+ bu.value = arg_b;
1848+
1849+ unpack_d (&au, &a);
1850+ unpack_d (&bu, &b);
1851+
1852+ if (isnan (&a) || isnan (&b))
1853+ return 1; /* false, truth < 0 */
1854+
1855+ return __fpcmp_parts (&a, &b);
1856+}
1857+#endif /* L_lt_sf || L_lt_df */
1858+
1859+#if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf)
1860+CMPtype
1861+_le_f2 (FLO_type arg_a, FLO_type arg_b)
1862+{
1863+ fp_number_type a;
1864+ fp_number_type b;
1865+ FLO_union_type au, bu;
1866+
1867+ au.value = arg_a;
1868+ bu.value = arg_b;
1869+
1870+ unpack_d (&au, &a);
1871+ unpack_d (&bu, &b);
1872+
1873+ if (isnan (&a) || isnan (&b))
1874+ return 1; /* false, truth <= 0 */
1875+
1876+ return __fpcmp_parts (&a, &b) ;
1877+}
1878+#endif /* L_le_sf || L_le_df */
1879+
1880+#endif /* ! US_SOFTWARE_GOFAST */
1881+
1882+#if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf)
1883+CMPtype
1884+_unord_f2 (FLO_type arg_a, FLO_type arg_b)
1885+{
1886+ fp_number_type a;
1887+ fp_number_type b;
1888+ FLO_union_type au, bu;
1889+
1890+ au.value = arg_a;
1891+ bu.value = arg_b;
1892+
1893+ unpack_d (&au, &a);
1894+ unpack_d (&bu, &b);
1895+
1896+ return (isnan (&a) || isnan (&b));
1897+}
1898+#endif /* L_unord_sf || L_unord_df */
1899+
1900+#if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf)
1901+FLO_type
1902+si_to_float (SItype arg_a)
1903+{
1904+ fp_number_type in;
1905+
1906+ in.class = CLASS_NUMBER;
1907+ in.sign = arg_a < 0;
1908+ if (!arg_a)
1909+ {
1910+ in.class = CLASS_ZERO;
1911+ }
1912+ else
1913+ {
1914+ in.normal_exp = FRACBITS + NGARDS;
1915+ if (in.sign)
1916+ {
1917+ /* Special case for minint, since there is no +ve integer
1918+ representation for it */
1919+ if (arg_a == (- MAX_SI_INT - 1))
1920+ {
1921+ return (FLO_type)(- MAX_SI_INT - 1);
1922+ }
1923+ in.fraction.ll = (-arg_a);
1924+ }
1925+ else
1926+ in.fraction.ll = arg_a;
1927+
1928+ while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS)))
1929+ {
1930+ in.fraction.ll <<= 1;
1931+ in.normal_exp -= 1;
1932+ }
1933+ }
1934+ return pack_d (&in);
1935+}
1936+#endif /* L_si_to_sf || L_si_to_df */
1937+
1938+#if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf)
1939+FLO_type
1940+usi_to_float (USItype arg_a)
1941+{
1942+ fp_number_type in;
1943+
1944+ in.sign = 0;
1945+ if (!arg_a)
1946+ {
1947+ in.class = CLASS_ZERO;
1948+ }
1949+ else
1950+ {
1951+ in.class = CLASS_NUMBER;
1952+ in.normal_exp = FRACBITS + NGARDS;
1953+ in.fraction.ll = arg_a;
1954+
1955+ while (in.fraction.ll > ((fractype)1 << (FRACBITS + NGARDS)))
1956+ {
1957+ in.fraction.ll >>= 1;
1958+ in.normal_exp += 1;
1959+ }
1960+ while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS)))
1961+ {
1962+ in.fraction.ll <<= 1;
1963+ in.normal_exp -= 1;
1964+ }
1965+ }
1966+ return pack_d (&in);
1967+}
1968+#endif
1969+
1970+#if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si)
1971+SItype
1972+float_to_si (FLO_type arg_a)
1973+{
1974+ fp_number_type a;
1975+ SItype tmp;
1976+ FLO_union_type au;
1977+
1978+ au.value = arg_a;
1979+ unpack_d (&au, &a);
1980+
1981+ if (iszero (&a))
1982+ return 0;
1983+ if (isnan (&a))
1984+ return 0;
1985+ /* get reasonable MAX_SI_INT... */
1986+ if (isinf (&a))
1987+ return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
1988+ /* it is a number, but a small one */
1989+ if (a.normal_exp < 0)
1990+ return 0;
1991+ if (a.normal_exp > BITS_PER_SI - 2)
1992+ return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
1993+ tmp = a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1994+ return a.sign ? (-tmp) : (tmp);
1995+}
1996+#endif /* L_sf_to_si || L_df_to_si */
1997+
1998+#if defined(L_sf_to_usi) || defined(L_df_to_usi) || defined(L_tf_to_usi)
1999+#if defined US_SOFTWARE_GOFAST || defined(L_tf_to_usi)
2000+/* While libgcc2.c defines its own __fixunssfsi and __fixunsdfsi routines,
2001+ we also define them for GOFAST because the ones in libgcc2.c have the
2002+ wrong names and I'd rather define these here and keep GOFAST CYG-LOC's
2003+ out of libgcc2.c. We can't define these here if not GOFAST because then
2004+ there'd be duplicate copies. */
2005+
2006+USItype
2007+float_to_usi (FLO_type arg_a)
2008+{
2009+ fp_number_type a;
2010+ FLO_union_type au;
2011+
2012+ au.value = arg_a;
2013+ unpack_d (&au, &a);
2014+
2015+ if (iszero (&a))
2016+ return 0;
2017+ if (isnan (&a))
2018+ return 0;
2019+ /* it is a negative number */
2020+ if (a.sign)
2021+ return 0;
2022+ /* get reasonable MAX_USI_INT... */
2023+ if (isinf (&a))
2024+ return MAX_USI_INT;
2025+ /* it is a number, but a small one */
2026+ if (a.normal_exp < 0)
2027+ return 0;
2028+ if (a.normal_exp > BITS_PER_SI - 1)
2029+ return MAX_USI_INT;
2030+ else if (a.normal_exp > (FRACBITS + NGARDS))
2031+ return a.fraction.ll << (a.normal_exp - (FRACBITS + NGARDS));
2032+ else
2033+ return a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
2034+}
2035+#endif /* US_SOFTWARE_GOFAST */
2036+#endif /* L_sf_to_usi || L_df_to_usi */
2037+
2038+#if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf)
2039+FLO_type
2040+negate (FLO_type arg_a)
2041+{
2042+ fp_number_type a;
2043+ FLO_union_type au;
2044+
2045+ au.value = arg_a;
2046+ unpack_d (&au, &a);
2047+
2048+ flip_sign (&a);
2049+ return pack_d (&a);
2050+}
2051+#endif /* L_negate_sf || L_negate_df */
2052+
2053+#ifdef FLOAT
2054+
2055+#if defined(L_make_sf)
2056+SFtype
2057+__make_fp(fp_class_type class,
2058+ unsigned int sign,
2059+ int exp,
2060+ USItype frac)
2061+{
2062+ fp_number_type in;
2063+
2064+ in.class = class;
2065+ in.sign = sign;
2066+ in.normal_exp = exp;
2067+ in.fraction.ll = frac;
2068+ return pack_d (&in);
2069+}
2070+#endif /* L_make_sf */
2071+
2072+#ifndef FLOAT_ONLY
2073+
2074+/* This enables one to build an fp library that supports float but not double.
2075+ Otherwise, we would get an undefined reference to __make_dp.
2076+ This is needed for some 8-bit ports that can't handle well values that
2077+ are 8-bytes in size, so we just don't support double for them at all. */
2078+
2079+#if defined(L_sf_to_df)
2080+DFtype
2081+sf_to_df (SFtype arg_a)
2082+{
2083+ fp_number_type in;
2084+ FLO_union_type au;
2085+
2086+ au.value = arg_a;
2087+ unpack_d (&au, &in);
2088+
2089+ return __make_dp (in.class, in.sign, in.normal_exp,
2090+ ((UDItype) in.fraction.ll) << F_D_BITOFF);
2091+}
2092+#endif /* L_sf_to_df */
2093+
2094+#if defined(L_sf_to_tf) && defined(TMODES)
2095+TFtype
2096+sf_to_tf (SFtype arg_a)
2097+{
2098+ fp_number_type in;
2099+ FLO_union_type au;
2100+
2101+ au.value = arg_a;
2102+ unpack_d (&au, &in);
2103+
2104+ return __make_tp (in.class, in.sign, in.normal_exp,
2105+ ((UTItype) in.fraction.ll) << F_T_BITOFF);
2106+}
2107+#endif /* L_sf_to_df */
2108+
2109+#endif /* ! FLOAT_ONLY */
2110+#endif /* FLOAT */
2111+
2112+#ifndef FLOAT
2113+
2114+extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
2115+
2116+#if defined(L_make_df)
2117+DFtype
2118+__make_dp (fp_class_type class, unsigned int sign, int exp, UDItype frac)
2119+{
2120+ fp_number_type in;
2121+
2122+ in.class = class;
2123+ in.sign = sign;
2124+ in.normal_exp = exp;
2125+ in.fraction.ll = frac;
2126+ return pack_d (&in);
2127+}
2128+#endif /* L_make_df */
2129+
2130+#if defined(L_df_to_sf)
2131+SFtype
2132+df_to_sf (DFtype arg_a)
2133+{
2134+ fp_number_type in;
2135+ USItype sffrac;
2136+ FLO_union_type au;
2137+
2138+ au.value = arg_a;
2139+ unpack_d (&au, &in);
2140+
2141+ sffrac = in.fraction.ll >> F_D_BITOFF;
2142+
2143+ /* We set the lowest guard bit in SFFRAC if we discarded any non
2144+ zero bits. */
2145+ if ((in.fraction.ll & (((USItype) 1 << F_D_BITOFF) - 1)) != 0)
2146+ sffrac |= 1;
2147+
2148+ return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
2149+}
2150+#endif /* L_df_to_sf */
2151+
2152+#if defined(L_df_to_tf) && defined(TMODES) \
2153+ && !defined(FLOAT) && !defined(TFLOAT)
2154+TFtype
2155+df_to_tf (DFtype arg_a)
2156+{
2157+ fp_number_type in;
2158+ FLO_union_type au;
2159+
2160+ au.value = arg_a;
2161+ unpack_d (&au, &in);
2162+
2163+ return __make_tp (in.class, in.sign, in.normal_exp,
2164+ ((UTItype) in.fraction.ll) << D_T_BITOFF);
2165+}
2166+#endif /* L_sf_to_df */
2167+
2168+#ifdef TFLOAT
2169+#if defined(L_make_tf)
2170+TFtype
2171+__make_tp(fp_class_type class,
2172+ unsigned int sign,
2173+ int exp,
2174+ UTItype frac)
2175+{
2176+ fp_number_type in;
2177+
2178+ in.class = class;
2179+ in.sign = sign;
2180+ in.normal_exp = exp;
2181+ in.fraction.ll = frac;
2182+ return pack_d (&in);
2183+}
2184+#endif /* L_make_tf */
2185+
2186+#if defined(L_tf_to_df)
2187+DFtype
2188+tf_to_df (TFtype arg_a)
2189+{
2190+ fp_number_type in;
2191+ UDItype sffrac;
2192+ FLO_union_type au;
2193+
2194+ au.value = arg_a;
2195+ unpack_d (&au, &in);
2196+
2197+ sffrac = in.fraction.ll >> D_T_BITOFF;
2198+
2199+ /* We set the lowest guard bit in SFFRAC if we discarded any non
2200+ zero bits. */
2201+ if ((in.fraction.ll & (((UTItype) 1 << D_T_BITOFF) - 1)) != 0)
2202+ sffrac |= 1;
2203+
2204+ return __make_dp (in.class, in.sign, in.normal_exp, sffrac);
2205+}
2206+#endif /* L_tf_to_df */
2207+
2208+#if defined(L_tf_to_sf)
2209+SFtype
2210+tf_to_sf (TFtype arg_a)
2211+{
2212+ fp_number_type in;
2213+ USItype sffrac;
2214+ FLO_union_type au;
2215+
2216+ au.value = arg_a;
2217+ unpack_d (&au, &in);
2218+
2219+ sffrac = in.fraction.ll >> F_T_BITOFF;
2220+
2221+ /* We set the lowest guard bit in SFFRAC if we discarded any non
2222+ zero bits. */
2223+ if ((in.fraction.ll & (((UTItype) 1 << F_T_BITOFF) - 1)) != 0)
2224+ sffrac |= 1;
2225+
2226+ return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
2227+}
2228+#endif /* L_tf_to_sf */
2229+#endif /* TFLOAT */
2230+
2231+#endif /* ! FLOAT */
2232+#endif /* !EXTENDED_FLOAT_STUBS */
2233--- ./gcc/gcc/config/nios2/nios2-fp-bit.c
2234+++ ./gcc/gcc/config/nios2/nios2-fp-bit.c
2235@@ -0,0 +1,1652 @@
2236+#define FLOAT
2237+/* This is a software floating point library which can be used
2238+ for targets without hardware floating point.
2239+ Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004
2240+ Free Software Foundation, Inc.
2241+
2242+This file is free software; you can redistribute it and/or modify it
2243+under the terms of the GNU General Public License as published by the
2244+Free Software Foundation; either version 2, or (at your option) any
2245+later version.
2246+
2247+In addition to the permissions in the GNU General Public License, the
2248+Free Software Foundation gives you unlimited permission to link the
2249+compiled version of this file with other programs, and to distribute
2250+those programs without any restriction coming from the use of this
2251+file. (The General Public License restrictions do apply in other
2252+respects; for example, they cover modification of the file, and
2253+distribution when not linked into another program.)
2254+
2255+This file is distributed in the hope that it will be useful, but
2256+WITHOUT ANY WARRANTY; without even the implied warranty of
2257+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2258+General Public License for more details.
2259+
2260+You should have received a copy of the GNU General Public License
2261+along with this program; see the file COPYING. If not, write to
2262+the Free Software Foundation, 59 Temple Place - Suite 330,
2263+Boston, MA 02111-1307, USA. */
2264+
2265+/* As a special exception, if you link this library with other files,
2266+ some of which are compiled with GCC, to produce an executable,
2267+ this library does not by itself cause the resulting executable
2268+ to be covered by the GNU General Public License.
2269+ This exception does not however invalidate any other reasons why
2270+ the executable file might be covered by the GNU General Public License. */
2271+
2272+/* This implements IEEE 754 format arithmetic, but does not provide a
2273+ mechanism for setting the rounding mode, or for generating or handling
2274+ exceptions.
2275+
2276+ The original code by Steve Chamberlain, hacked by Mark Eichin and Jim
2277+ Wilson, all of Cygnus Support. */
2278+
2279+/* The intended way to use this file is to make two copies, add `#define FLOAT'
2280+ to one copy, then compile both copies and add them to libgcc.a. */
2281+
2282+#include "tconfig.h"
2283+#include "coretypes.h"
2284+#include "tm.h"
2285+#include "config/fp-bit.h"
2286+
2287+/* The following macros can be defined to change the behavior of this file:
2288+ FLOAT: Implement a `float', aka SFmode, fp library. If this is not
2289+ defined, then this file implements a `double', aka DFmode, fp library.
2290+ FLOAT_ONLY: Used with FLOAT, to implement a `float' only library, i.e.
2291+ don't include float->double conversion which requires the double library.
2292+ This is useful only for machines which can't support doubles, e.g. some
2293+ 8-bit processors.
2294+ CMPtype: Specify the type that floating point compares should return.
2295+ This defaults to SItype, aka int.
2296+ US_SOFTWARE_GOFAST: This makes all entry points use the same names as the
2297+ US Software goFast library.
2298+ _DEBUG_BITFLOAT: This makes debugging the code a little easier, by adding
2299+ two integers to the FLO_union_type.
2300+ NO_DENORMALS: Disable handling of denormals.
2301+ NO_NANS: Disable nan and infinity handling
2302+ SMALL_MACHINE: Useful when operations on QIs and HIs are faster
2303+ than on an SI */
2304+
2305+/* We don't currently support extended floats (long doubles) on machines
2306+ without hardware to deal with them.
2307+
2308+ These stubs are just to keep the linker from complaining about unresolved
2309+ references which can be pulled in from libio & libstdc++, even if the
2310+ user isn't using long doubles. However, they may generate an unresolved
2311+ external to abort if abort is not used by the function, and the stubs
2312+ are referenced from within libc, since libgcc goes before and after the
2313+ system library. */
2314+
2315+#ifdef DECLARE_LIBRARY_RENAMES
2316+ DECLARE_LIBRARY_RENAMES
2317+#endif
2318+
2319+#ifdef EXTENDED_FLOAT_STUBS
2320+extern void abort (void);
2321+void __extendsfxf2 (void) { abort(); }
2322+void __extenddfxf2 (void) { abort(); }
2323+void __truncxfdf2 (void) { abort(); }
2324+void __truncxfsf2 (void) { abort(); }
2325+void __fixxfsi (void) { abort(); }
2326+void __floatsixf (void) { abort(); }
2327+void __addxf3 (void) { abort(); }
2328+void __subxf3 (void) { abort(); }
2329+void __mulxf3 (void) { abort(); }
2330+void __divxf3 (void) { abort(); }
2331+void __negxf2 (void) { abort(); }
2332+void __eqxf2 (void) { abort(); }
2333+void __nexf2 (void) { abort(); }
2334+void __gtxf2 (void) { abort(); }
2335+void __gexf2 (void) { abort(); }
2336+void __lexf2 (void) { abort(); }
2337+void __ltxf2 (void) { abort(); }
2338+
2339+void __extendsftf2 (void) { abort(); }
2340+void __extenddftf2 (void) { abort(); }
2341+void __trunctfdf2 (void) { abort(); }
2342+void __trunctfsf2 (void) { abort(); }
2343+void __fixtfsi (void) { abort(); }
2344+void __floatsitf (void) { abort(); }
2345+void __addtf3 (void) { abort(); }
2346+void __subtf3 (void) { abort(); }
2347+void __multf3 (void) { abort(); }
2348+void __divtf3 (void) { abort(); }
2349+void __negtf2 (void) { abort(); }
2350+void __eqtf2 (void) { abort(); }
2351+void __netf2 (void) { abort(); }
2352+void __gttf2 (void) { abort(); }
2353+void __getf2 (void) { abort(); }
2354+void __letf2 (void) { abort(); }
2355+void __lttf2 (void) { abort(); }
2356+#else /* !EXTENDED_FLOAT_STUBS, rest of file */
2357+
2358+/* IEEE "special" number predicates */
2359+
2360+#ifdef NO_NANS
2361+
2362+#define nan() 0
2363+#define isnan(x) 0
2364+#define isinf(x) 0
2365+#else
2366+
2367+#if defined L_thenan_sf
2368+const fp_number_type __thenan_sf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
2369+#elif defined L_thenan_df
2370+const fp_number_type __thenan_df = { CLASS_SNAN, 0, 0, {(fractype) 0} };
2371+#elif defined L_thenan_tf
2372+const fp_number_type __thenan_tf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
2373+#elif defined TFLOAT
2374+extern const fp_number_type __thenan_tf;
2375+#elif defined FLOAT
2376+extern const fp_number_type __thenan_sf;
2377+#else
2378+extern const fp_number_type __thenan_df;
2379+#endif
2380+
2381+INLINE
2382+static fp_number_type *
2383+nan (void)
2384+{
2385+ /* Discard the const qualifier... */
2386+#ifdef TFLOAT
2387+ return (fp_number_type *) (& __thenan_tf);
2388+#elif defined FLOAT
2389+ return (fp_number_type *) (& __thenan_sf);
2390+#else
2391+ return (fp_number_type *) (& __thenan_df);
2392+#endif
2393+}
2394+
2395+INLINE
2396+static int
2397+isnan ( fp_number_type * x)
2398+{
2399+ return x->class == CLASS_SNAN || x->class == CLASS_QNAN;
2400+}
2401+
2402+INLINE
2403+static int
2404+isinf ( fp_number_type * x)
2405+{
2406+ return x->class == CLASS_INFINITY;
2407+}
2408+
2409+#endif /* NO_NANS */
2410+
2411+INLINE
2412+static int
2413+iszero ( fp_number_type * x)
2414+{
2415+ return x->class == CLASS_ZERO;
2416+}
2417+
2418+INLINE
2419+static void
2420+flip_sign ( fp_number_type * x)
2421+{
2422+ x->sign = !x->sign;
2423+}
2424+
2425+extern FLO_type pack_d ( fp_number_type * );
2426+
2427+#if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf)
2428+FLO_type
2429+pack_d ( fp_number_type * src)
2430+{
2431+ FLO_union_type dst;
2432+ fractype fraction = src->fraction.ll; /* wasn't unsigned before? */
2433+ int sign = src->sign;
2434+ int exp = 0;
2435+
2436+ if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && (isnan (src) || isinf (src)))
2437+ {
2438+ /* We can't represent these values accurately. By using the
2439+ largest possible magnitude, we guarantee that the conversion
2440+ of infinity is at least as big as any finite number. */
2441+ exp = EXPMAX;
2442+ fraction = ((fractype) 1 << FRACBITS) - 1;
2443+ }
2444+ else if (isnan (src))
2445+ {
2446+ exp = EXPMAX;
2447+ if (src->class == CLASS_QNAN || 1)
2448+ {
2449+#ifdef QUIET_NAN_NEGATED
2450+ fraction |= QUIET_NAN - 1;
2451+#else
2452+ fraction |= QUIET_NAN;
2453+#endif
2454+ }
2455+ }
2456+ else if (isinf (src))
2457+ {
2458+ exp = EXPMAX;
2459+ fraction = 0;
2460+ }
2461+ else if (iszero (src))
2462+ {
2463+ exp = 0;
2464+ fraction = 0;
2465+ }
2466+ else if (fraction == 0)
2467+ {
2468+ exp = 0;
2469+ }
2470+ else
2471+ {
2472+ if (src->normal_exp < NORMAL_EXPMIN)
2473+ {
2474+#ifdef NO_DENORMALS
2475+ /* Go straight to a zero representation if denormals are not
2476+ supported. The denormal handling would be harmless but
2477+ isn't unnecessary. */
2478+ exp = 0;
2479+ fraction = 0;
2480+#else /* NO_DENORMALS */
2481+ /* This number's exponent is too low to fit into the bits
2482+ available in the number, so we'll store 0 in the exponent and
2483+ shift the fraction to the right to make up for it. */
2484+
2485+ int shift = NORMAL_EXPMIN - src->normal_exp;
2486+
2487+ exp = 0;
2488+
2489+ if (shift > FRAC_NBITS - NGARDS)
2490+ {
2491+ /* No point shifting, since it's more that 64 out. */
2492+ fraction = 0;
2493+ }
2494+ else
2495+ {
2496+ int lowbit = (fraction & (((fractype)1 << shift) - 1)) ? 1 : 0;
2497+ fraction = (fraction >> shift) | lowbit;
2498+ }
2499+ if ((fraction & GARDMASK) == GARDMSB)
2500+ {
2501+ if ((fraction & (1 << NGARDS)))
2502+ fraction += GARDROUND + 1;
2503+ }
2504+ else
2505+ {
2506+ /* Add to the guards to round up. */
2507+ fraction += GARDROUND;
2508+ }
2509+ /* Perhaps the rounding means we now need to change the
2510+ exponent, because the fraction is no longer denormal. */
2511+ if (fraction >= IMPLICIT_1)
2512+ {
2513+ exp += 1;
2514+ }
2515+ fraction >>= NGARDS;
2516+#endif /* NO_DENORMALS */
2517+ }
2518+ else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS)
2519+ && src->normal_exp > EXPBIAS)
2520+ {
2521+ exp = EXPMAX;
2522+ fraction = 0;
2523+ }
2524+ else
2525+ {
2526+ exp = src->normal_exp + EXPBIAS;
2527+ if (!ROUND_TOWARDS_ZERO)
2528+ {
2529+ /* IF the gard bits are the all zero, but the first, then we're
2530+ half way between two numbers, choose the one which makes the
2531+ lsb of the answer 0. */
2532+ if ((fraction & GARDMASK) == GARDMSB)
2533+ {
2534+ if (fraction & (1 << NGARDS))
2535+ fraction += GARDROUND + 1;
2536+ }
2537+ else
2538+ {
2539+ /* Add a one to the guards to round up */
2540+ fraction += GARDROUND;
2541+ }
2542+ if (fraction >= IMPLICIT_2)
2543+ {
2544+ fraction >>= 1;
2545+ exp += 1;
2546+ }
2547+ }
2548+ fraction >>= NGARDS;
2549+
2550+ if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && exp > EXPMAX)
2551+ {
2552+ /* Saturate on overflow. */
2553+ exp = EXPMAX;
2554+ fraction = ((fractype) 1 << FRACBITS) - 1;
2555+ }
2556+ }
2557+ }
2558+
2559+ /* We previously used bitfields to store the number, but this doesn't
2560+ handle little/big endian systems conveniently, so use shifts and
2561+ masks */
2562+#ifdef FLOAT_BIT_ORDER_MISMATCH
2563+ dst.bits.fraction = fraction;
2564+ dst.bits.exp = exp;
2565+ dst.bits.sign = sign;
2566+#else
2567+# if defined TFLOAT && defined HALFFRACBITS
2568+ {
2569+ halffractype high, low, unity;
2570+ int lowsign, lowexp;
2571+
2572+ unity = (halffractype) 1 << HALFFRACBITS;
2573+
2574+ /* Set HIGH to the high double's significand, masking out the implicit 1.
2575+ Set LOW to the low double's full significand. */
2576+ high = (fraction >> (FRACBITS - HALFFRACBITS)) & (unity - 1);
2577+ low = fraction & (unity * 2 - 1);
2578+
2579+ /* Get the initial sign and exponent of the low double. */
2580+ lowexp = exp - HALFFRACBITS - 1;
2581+ lowsign = sign;
2582+
2583+ /* HIGH should be rounded like a normal double, making |LOW| <=
2584+ 0.5 ULP of HIGH. Assume round-to-nearest. */
2585+ if (exp < EXPMAX)
2586+ if (low > unity || (low == unity && (high & 1) == 1))
2587+ {
2588+ /* Round HIGH up and adjust LOW to match. */
2589+ high++;
2590+ if (high == unity)
2591+ {
2592+ /* May make it infinite, but that's OK. */
2593+ high = 0;
2594+ exp++;
2595+ }
2596+ low = unity * 2 - low;
2597+ lowsign ^= 1;
2598+ }
2599+
2600+ high |= (halffractype) exp << HALFFRACBITS;
2601+ high |= (halffractype) sign << (HALFFRACBITS + EXPBITS);
2602+
2603+ if (exp == EXPMAX || exp == 0 || low == 0)
2604+ low = 0;
2605+ else
2606+ {
2607+ while (lowexp > 0 && low < unity)
2608+ {
2609+ low <<= 1;
2610+ lowexp--;
2611+ }
2612+
2613+ if (lowexp <= 0)
2614+ {
2615+ halffractype roundmsb, round;
2616+ int shift;
2617+
2618+ shift = 1 - lowexp;
2619+ roundmsb = (1 << (shift - 1));
2620+ round = low & ((roundmsb << 1) - 1);
2621+
2622+ low >>= shift;
2623+ lowexp = 0;
2624+
2625+ if (round > roundmsb || (round == roundmsb && (low & 1) == 1))
2626+ {
2627+ low++;
2628+ if (low == unity)
2629+ /* LOW rounds up to the smallest normal number. */
2630+ lowexp++;
2631+ }
2632+ }
2633+
2634+ low &= unity - 1;
2635+ low |= (halffractype) lowexp << HALFFRACBITS;
2636+ low |= (halffractype) lowsign << (HALFFRACBITS + EXPBITS);
2637+ }
2638+ dst.value_raw = ((fractype) high << HALFSHIFT) | low;
2639+ }
2640+# else
2641+ dst.value_raw = fraction & ((((fractype)1) << FRACBITS) - (fractype)1);
2642+ dst.value_raw |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << FRACBITS;
2643+ dst.value_raw |= ((fractype) (sign & 1)) << (FRACBITS | EXPBITS);
2644+# endif
2645+#endif
2646+
2647+#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
2648+#ifdef TFLOAT
2649+ {
2650+ qrtrfractype tmp1 = dst.words[0];
2651+ qrtrfractype tmp2 = dst.words[1];
2652+ dst.words[0] = dst.words[3];
2653+ dst.words[1] = dst.words[2];
2654+ dst.words[2] = tmp2;
2655+ dst.words[3] = tmp1;
2656+ }
2657+#else
2658+ {
2659+ halffractype tmp = dst.words[0];
2660+ dst.words[0] = dst.words[1];
2661+ dst.words[1] = tmp;
2662+ }
2663+#endif
2664+#endif
2665+
2666+ return dst.value;
2667+}
2668+#endif
2669+
2670+#if defined(L_unpack_df) || defined(L_unpack_sf) || defined(L_unpack_tf)
2671+void
2672+unpack_d (FLO_union_type * src, fp_number_type * dst)
2673+{
2674+ /* We previously used bitfields to store the number, but this doesn't
2675+ handle little/big endian systems conveniently, so use shifts and
2676+ masks */
2677+ fractype fraction;
2678+ int exp;
2679+ int sign;
2680+
2681+#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
2682+ FLO_union_type swapped;
2683+
2684+#ifdef TFLOAT
2685+ swapped.words[0] = src->words[3];
2686+ swapped.words[1] = src->words[2];
2687+ swapped.words[2] = src->words[1];
2688+ swapped.words[3] = src->words[0];
2689+#else
2690+ swapped.words[0] = src->words[1];
2691+ swapped.words[1] = src->words[0];
2692+#endif
2693+ src = &swapped;
2694+#endif
2695+
2696+#ifdef FLOAT_BIT_ORDER_MISMATCH
2697+ fraction = src->bits.fraction;
2698+ exp = src->bits.exp;
2699+ sign = src->bits.sign;
2700+#else
2701+# if defined TFLOAT && defined HALFFRACBITS
2702+ {
2703+ halffractype high, low;
2704+
2705+ high = src->value_raw >> HALFSHIFT;
2706+ low = src->value_raw & (((fractype)1 << HALFSHIFT) - 1);
2707+
2708+ fraction = high & ((((fractype)1) << HALFFRACBITS) - 1);
2709+ fraction <<= FRACBITS - HALFFRACBITS;
2710+ exp = ((int)(high >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
2711+ sign = ((int)(high >> (((HALFFRACBITS + EXPBITS))))) & 1;
2712+
2713+ if (exp != EXPMAX && exp != 0 && low != 0)
2714+ {
2715+ int lowexp = ((int)(low >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
2716+ int lowsign = ((int)(low >> (((HALFFRACBITS + EXPBITS))))) & 1;
2717+ int shift;
2718+ fractype xlow;
2719+
2720+ xlow = low & ((((fractype)1) << HALFFRACBITS) - 1);
2721+ if (lowexp)
2722+ xlow |= (((halffractype)1) << HALFFRACBITS);
2723+ else
2724+ lowexp = 1;
2725+ shift = (FRACBITS - HALFFRACBITS) - (exp - lowexp);
2726+ if (shift > 0)
2727+ xlow <<= shift;
2728+ else if (shift < 0)
2729+ xlow >>= -shift;
2730+ if (sign == lowsign)
2731+ fraction += xlow;
2732+ else if (fraction >= xlow)
2733+ fraction -= xlow;
2734+ else
2735+ {
2736+ /* The high part is a power of two but the full number is lower.
2737+ This code will leave the implicit 1 in FRACTION, but we'd
2738+ have added that below anyway. */
2739+ fraction = (((fractype) 1 << FRACBITS) - xlow) << 1;
2740+ exp--;
2741+ }
2742+ }
2743+ }
2744+# else
2745+ fraction = src->value_raw & ((((fractype)1) << FRACBITS) - 1);
2746+ exp = ((int)(src->value_raw >> FRACBITS)) & ((1 << EXPBITS) - 1);
2747+ sign = ((int)(src->value_raw >> (FRACBITS + EXPBITS))) & 1;
2748+# endif
2749+#endif
2750+
2751+ dst->sign = sign;
2752+ if (exp == 0)
2753+ {
2754+ /* Hmm. Looks like 0 */
2755+ if (fraction == 0
2756+#ifdef NO_DENORMALS
2757+ || 1
2758+#endif
2759+ )
2760+ {
2761+ /* tastes like zero */
2762+ dst->class = CLASS_ZERO;
2763+ }
2764+ else
2765+ {
2766+ /* Zero exponent with nonzero fraction - it's denormalized,
2767+ so there isn't a leading implicit one - we'll shift it so
2768+ it gets one. */
2769+ dst->normal_exp = exp - EXPBIAS + 1;
2770+ fraction <<= NGARDS;
2771+
2772+ dst->class = CLASS_NUMBER;
2773+#if 1
2774+ while (fraction < IMPLICIT_1)
2775+ {
2776+ fraction <<= 1;
2777+ dst->normal_exp--;
2778+ }
2779+#endif
2780+ dst->fraction.ll = fraction;
2781+ }
2782+ }
2783+ else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && exp == EXPMAX)
2784+ {
2785+ /* Huge exponent*/
2786+ if (fraction == 0)
2787+ {
2788+ /* Attached to a zero fraction - means infinity */
2789+ dst->class = CLASS_INFINITY;
2790+ }
2791+ else
2792+ {
2793+ /* Nonzero fraction, means nan */
2794+#ifdef QUIET_NAN_NEGATED
2795+ if ((fraction & QUIET_NAN) == 0)
2796+#else
2797+ if (fraction & QUIET_NAN)
2798+#endif
2799+ {
2800+ dst->class = CLASS_QNAN;
2801+ }
2802+ else
2803+ {
2804+ dst->class = CLASS_SNAN;
2805+ }
2806+ /* Keep the fraction part as the nan number */
2807+ dst->fraction.ll = fraction;
2808+ }
2809+ }
2810+ else
2811+ {
2812+ /* Nothing strange about this number */
2813+ dst->normal_exp = exp - EXPBIAS;
2814+ dst->class = CLASS_NUMBER;
2815+ dst->fraction.ll = (fraction << NGARDS) | IMPLICIT_1;
2816+ }
2817+}
2818+#endif /* L_unpack_df || L_unpack_sf */
2819+
2820+#if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf)
2821+static fp_number_type *
2822+_fpadd_parts (fp_number_type * a,
2823+ fp_number_type * b,
2824+ fp_number_type * tmp)
2825+{
2826+ intfrac tfraction;
2827+
2828+ /* Put commonly used fields in local variables. */
2829+ int a_normal_exp;
2830+ int b_normal_exp;
2831+ fractype a_fraction;
2832+ fractype b_fraction;
2833+
2834+ if (isnan (a))
2835+ {
2836+ return a;
2837+ }
2838+ if (isnan (b))
2839+ {
2840+ return b;
2841+ }
2842+ if (isinf (a))
2843+ {
2844+ /* Adding infinities with opposite signs yields a NaN. */
2845+ if (isinf (b) && a->sign != b->sign)
2846+ return nan ();
2847+ return a;
2848+ }
2849+ if (isinf (b))
2850+ {
2851+ return b;
2852+ }
2853+ if (iszero (b))
2854+ {
2855+ if (iszero (a))
2856+ {
2857+ *tmp = *a;
2858+ tmp->sign = a->sign & b->sign;
2859+ return tmp;
2860+ }
2861+ return a;
2862+ }
2863+ if (iszero (a))
2864+ {
2865+ return b;
2866+ }
2867+
2868+ /* Got two numbers. shift the smaller and increment the exponent till
2869+ they're the same */
2870+ {
2871+ int diff;
2872+
2873+ a_normal_exp = a->normal_exp;
2874+ b_normal_exp = b->normal_exp;
2875+ a_fraction = a->fraction.ll;
2876+ b_fraction = b->fraction.ll;
2877+
2878+ diff = a_normal_exp - b_normal_exp;
2879+
2880+ if (diff < 0)
2881+ diff = -diff;
2882+ if (diff < FRAC_NBITS)
2883+ {
2884+ /* ??? This does shifts one bit at a time. Optimize. */
2885+ while (a_normal_exp > b_normal_exp)
2886+ {
2887+ b_normal_exp++;
2888+ LSHIFT (b_fraction);
2889+ }
2890+ while (b_normal_exp > a_normal_exp)
2891+ {
2892+ a_normal_exp++;
2893+ LSHIFT (a_fraction);
2894+ }
2895+ }
2896+ else
2897+ {
2898+ /* Somethings's up.. choose the biggest */
2899+ if (a_normal_exp > b_normal_exp)
2900+ {
2901+ b_normal_exp = a_normal_exp;
2902+ b_fraction = 0;
2903+ }
2904+ else
2905+ {
2906+ a_normal_exp = b_normal_exp;
2907+ a_fraction = 0;
2908+ }
2909+ }
2910+ }
2911+
2912+ if (a->sign != b->sign)
2913+ {
2914+ if (a->sign)
2915+ {
2916+ tfraction = -a_fraction + b_fraction;
2917+ }
2918+ else
2919+ {
2920+ tfraction = a_fraction - b_fraction;
2921+ }
2922+ if (tfraction >= 0)
2923+ {
2924+ tmp->sign = 0;
2925+ tmp->normal_exp = a_normal_exp;
2926+ tmp->fraction.ll = tfraction;
2927+ }
2928+ else
2929+ {
2930+ tmp->sign = 1;
2931+ tmp->normal_exp = a_normal_exp;
2932+ tmp->fraction.ll = -tfraction;
2933+ }
2934+ /* and renormalize it */
2935+
2936+ while (tmp->fraction.ll < IMPLICIT_1 && tmp->fraction.ll)
2937+ {
2938+ tmp->fraction.ll <<= 1;
2939+ tmp->normal_exp--;
2940+ }
2941+ }
2942+ else
2943+ {
2944+ tmp->sign = a->sign;
2945+ tmp->normal_exp = a_normal_exp;
2946+ tmp->fraction.ll = a_fraction + b_fraction;
2947+ }
2948+ tmp->class = CLASS_NUMBER;
2949+ /* Now the fraction is added, we have to shift down to renormalize the
2950+ number */
2951+
2952+ if (tmp->fraction.ll >= IMPLICIT_2)
2953+ {
2954+ LSHIFT (tmp->fraction.ll);
2955+ tmp->normal_exp++;
2956+ }
2957+ return tmp;
2958+
2959+}
2960+
2961+FLO_type
2962+add (FLO_type arg_a, FLO_type arg_b)
2963+{
2964+ fp_number_type a;
2965+ fp_number_type b;
2966+ fp_number_type tmp;
2967+ fp_number_type *res;
2968+ FLO_union_type au, bu;
2969+
2970+ au.value = arg_a;
2971+ bu.value = arg_b;
2972+
2973+ unpack_d (&au, &a);
2974+ unpack_d (&bu, &b);
2975+
2976+ res = _fpadd_parts (&a, &b, &tmp);
2977+
2978+ return pack_d (res);
2979+}
2980+
2981+FLO_type
2982+sub (FLO_type arg_a, FLO_type arg_b)
2983+{
2984+ fp_number_type a;
2985+ fp_number_type b;
2986+ fp_number_type tmp;
2987+ fp_number_type *res;
2988+ FLO_union_type au, bu;
2989+
2990+ au.value = arg_a;
2991+ bu.value = arg_b;
2992+
2993+ unpack_d (&au, &a);
2994+ unpack_d (&bu, &b);
2995+
2996+ b.sign ^= 1;
2997+
2998+ res = _fpadd_parts (&a, &b, &tmp);
2999+
3000+ return pack_d (res);
3001+}
3002+#endif /* L_addsub_sf || L_addsub_df */
3003+
3004+#if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf)
3005+static inline __attribute__ ((__always_inline__)) fp_number_type *
3006+_fpmul_parts ( fp_number_type * a,
3007+ fp_number_type * b,
3008+ fp_number_type * tmp)
3009+{
3010+ fractype low = 0;
3011+ fractype high = 0;
3012+
3013+ if (isnan (a))
3014+ {
3015+ a->sign = a->sign != b->sign;
3016+ return a;
3017+ }
3018+ if (isnan (b))
3019+ {
3020+ b->sign = a->sign != b->sign;
3021+ return b;
3022+ }
3023+ if (isinf (a))
3024+ {
3025+ if (iszero (b))
3026+ return nan ();
3027+ a->sign = a->sign != b->sign;
3028+ return a;
3029+ }
3030+ if (isinf (b))
3031+ {
3032+ if (iszero (a))
3033+ {
3034+ return nan ();
3035+ }
3036+ b->sign = a->sign != b->sign;
3037+ return b;
3038+ }
3039+ if (iszero (a))
3040+ {
3041+ a->sign = a->sign != b->sign;
3042+ return a;
3043+ }
3044+ if (iszero (b))
3045+ {
3046+ b->sign = a->sign != b->sign;
3047+ return b;
3048+ }
3049+
3050+ /* Calculate the mantissa by multiplying both numbers to get a
3051+ twice-as-wide number. */
3052+ {
3053+#if defined(NO_DI_MODE) || defined(TFLOAT)
3054+ {
3055+ fractype x = a->fraction.ll;
3056+ fractype ylow = b->fraction.ll;
3057+ fractype yhigh = 0;
3058+ int bit;
3059+
3060+ /* ??? This does multiplies one bit at a time. Optimize. */
3061+ for (bit = 0; bit < FRAC_NBITS; bit++)
3062+ {
3063+ int carry;
3064+
3065+ if (x & 1)
3066+ {
3067+ carry = (low += ylow) < ylow;
3068+ high += yhigh + carry;
3069+ }
3070+ yhigh <<= 1;
3071+ if (ylow & FRACHIGH)
3072+ {
3073+ yhigh |= 1;
3074+ }
3075+ ylow <<= 1;
3076+ x >>= 1;
3077+ }
3078+ }
3079+#elif defined(FLOAT)
3080+ /* Multiplying two USIs to get a UDI, we're safe. */
3081+ {
3082+ UDItype answer = (UDItype)a->fraction.ll * (UDItype)b->fraction.ll;
3083+
3084+ high = answer >> BITS_PER_SI;
3085+ low = answer;
3086+ }
3087+#else
3088+ /* fractype is DImode, but we need the result to be twice as wide.
3089+ Assuming a widening multiply from DImode to TImode is not
3090+ available, build one by hand. */
3091+ {
3092+ USItype nl = a->fraction.ll;
3093+ USItype nh = a->fraction.ll >> BITS_PER_SI;
3094+ USItype ml = b->fraction.ll;
3095+ USItype mh = b->fraction.ll >> BITS_PER_SI;
3096+ UDItype pp_ll = (UDItype) ml * nl;
3097+ UDItype pp_hl = (UDItype) mh * nl;
3098+ UDItype pp_lh = (UDItype) ml * nh;
3099+ UDItype pp_hh = (UDItype) mh * nh;
3100+ UDItype res2 = 0;
3101+ UDItype res0 = 0;
3102+ UDItype ps_hh__ = pp_hl + pp_lh;
3103+ if (ps_hh__ < pp_hl)
3104+ res2 += (UDItype)1 << BITS_PER_SI;
3105+ pp_hl = (UDItype)(USItype)ps_hh__ << BITS_PER_SI;
3106+ res0 = pp_ll + pp_hl;
3107+ if (res0 < pp_ll)
3108+ res2++;
3109+ res2 += (ps_hh__ >> BITS_PER_SI) + pp_hh;
3110+ high = res2;
3111+ low = res0;
3112+ }
3113+#endif
3114+ }
3115+
3116+ tmp->normal_exp = a->normal_exp + b->normal_exp
3117+ + FRAC_NBITS - (FRACBITS + NGARDS);
3118+ tmp->sign = a->sign != b->sign;
3119+ while (high >= IMPLICIT_2)
3120+ {
3121+ tmp->normal_exp++;
3122+ if (high & 1)
3123+ {
3124+ low >>= 1;
3125+ low |= FRACHIGH;
3126+ }
3127+ high >>= 1;
3128+ }
3129+ while (high < IMPLICIT_1)
3130+ {
3131+ tmp->normal_exp--;
3132+
3133+ high <<= 1;
3134+ if (low & FRACHIGH)
3135+ high |= 1;
3136+ low <<= 1;
3137+ }
3138+ /* rounding is tricky. if we only round if it won't make us round later. */
3139+#if 0
3140+ if (low & FRACHIGH2)
3141+ {
3142+ if (((high & GARDMASK) != GARDMSB)
3143+ && (((high + 1) & GARDMASK) == GARDMSB))
3144+ {
3145+ /* don't round, it gets done again later. */
3146+ }
3147+ else
3148+ {
3149+ high++;
3150+ }
3151+ }
3152+#endif
3153+ if (!ROUND_TOWARDS_ZERO && (high & GARDMASK) == GARDMSB)
3154+ {
3155+ if (high & (1 << NGARDS))
3156+ {
3157+ /* half way, so round to even */
3158+ high += GARDROUND + 1;
3159+ }
3160+ else if (low)
3161+ {
3162+ /* but we really weren't half way */
3163+ high += GARDROUND + 1;
3164+ }
3165+ }
3166+ tmp->fraction.ll = high;
3167+ tmp->class = CLASS_NUMBER;
3168+ return tmp;
3169+}
3170+
3171+FLO_type
3172+multiply (FLO_type arg_a, FLO_type arg_b)
3173+{
3174+ fp_number_type a;
3175+ fp_number_type b;
3176+ fp_number_type tmp;
3177+ fp_number_type *res;
3178+ FLO_union_type au, bu;
3179+
3180+ au.value = arg_a;
3181+ bu.value = arg_b;
3182+
3183+ unpack_d (&au, &a);
3184+ unpack_d (&bu, &b);
3185+
3186+ res = _fpmul_parts (&a, &b, &tmp);
3187+
3188+ return pack_d (res);
3189+}
3190+#endif /* L_mul_sf || L_mul_df */
3191+
3192+#if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf)
3193+static inline __attribute__ ((__always_inline__)) fp_number_type *
3194+_fpdiv_parts (fp_number_type * a,
3195+ fp_number_type * b)
3196+{
3197+ fractype bit;
3198+ fractype numerator;
3199+ fractype denominator;
3200+ fractype quotient;
3201+
3202+ if (isnan (a))
3203+ {
3204+ return a;
3205+ }
3206+ if (isnan (b))
3207+ {
3208+ return b;
3209+ }
3210+
3211+ a->sign = a->sign ^ b->sign;
3212+
3213+ if (isinf (a) || iszero (a))
3214+ {
3215+ if (a->class == b->class)
3216+ return nan ();
3217+ return a;
3218+ }
3219+
3220+ if (isinf (b))
3221+ {
3222+ a->fraction.ll = 0;
3223+ a->normal_exp = 0;
3224+ return a;
3225+ }
3226+ if (iszero (b))
3227+ {
3228+ a->class = CLASS_INFINITY;
3229+ return a;
3230+ }
3231+
3232+ /* Calculate the mantissa by multiplying both 64bit numbers to get a
3233+ 128 bit number */
3234+ {
3235+ /* quotient =
3236+ ( numerator / denominator) * 2^(numerator exponent - denominator exponent)
3237+ */
3238+
3239+ a->normal_exp = a->normal_exp - b->normal_exp;
3240+ numerator = a->fraction.ll;
3241+ denominator = b->fraction.ll;
3242+
3243+ if (numerator < denominator)
3244+ {
3245+ /* Fraction will be less than 1.0 */
3246+ numerator *= 2;
3247+ a->normal_exp--;
3248+ }
3249+ bit = IMPLICIT_1;
3250+ quotient = 0;
3251+ /* ??? Does divide one bit at a time. Optimize. */
3252+ while (bit)
3253+ {
3254+ if (numerator >= denominator)
3255+ {
3256+ quotient |= bit;
3257+ numerator -= denominator;
3258+ }
3259+ bit >>= 1;
3260+ numerator *= 2;
3261+ }
3262+
3263+ if (!ROUND_TOWARDS_ZERO && (quotient & GARDMASK) == GARDMSB)
3264+ {
3265+ if (quotient & (1 << NGARDS))
3266+ {
3267+ /* half way, so round to even */
3268+ quotient += GARDROUND + 1;
3269+ }
3270+ else if (numerator)
3271+ {
3272+ /* but we really weren't half way, more bits exist */
3273+ quotient += GARDROUND + 1;
3274+ }
3275+ }
3276+
3277+ a->fraction.ll = quotient;
3278+ return (a);
3279+ }
3280+}
3281+
3282+FLO_type
3283+divide (FLO_type arg_a, FLO_type arg_b)
3284+{
3285+ fp_number_type a;
3286+ fp_number_type b;
3287+ fp_number_type *res;
3288+ FLO_union_type au, bu;
3289+
3290+ au.value = arg_a;
3291+ bu.value = arg_b;
3292+
3293+ unpack_d (&au, &a);
3294+ unpack_d (&bu, &b);
3295+
3296+ res = _fpdiv_parts (&a, &b);
3297+
3298+ return pack_d (res);
3299+}
3300+#endif /* L_div_sf || L_div_df */
3301+
3302+#if defined(L_fpcmp_parts_sf) || defined(L_fpcmp_parts_df) \
3303+ || defined(L_fpcmp_parts_tf)
3304+/* according to the demo, fpcmp returns a comparison with 0... thus
3305+ a<b -> -1
3306+ a==b -> 0
3307+ a>b -> +1
3308+ */
3309+
3310+int
3311+__fpcmp_parts (fp_number_type * a, fp_number_type * b)
3312+{
3313+#if 0
3314+ /* either nan -> unordered. Must be checked outside of this routine. */
3315+ if (isnan (a) && isnan (b))
3316+ {
3317+ return 1; /* still unordered! */
3318+ }
3319+#endif
3320+
3321+ if (isnan (a) || isnan (b))
3322+ {
3323+ return 1; /* how to indicate unordered compare? */
3324+ }
3325+ if (isinf (a) && isinf (b))
3326+ {
3327+ /* +inf > -inf, but +inf != +inf */
3328+ /* b \a| +inf(0)| -inf(1)
3329+ ______\+--------+--------
3330+ +inf(0)| a==b(0)| a<b(-1)
3331+ -------+--------+--------
3332+ -inf(1)| a>b(1) | a==b(0)
3333+ -------+--------+--------
3334+ So since unordered must be nonzero, just line up the columns...
3335+ */
3336+ return b->sign - a->sign;
3337+ }
3338+ /* but not both... */
3339+ if (isinf (a))
3340+ {
3341+ return a->sign ? -1 : 1;
3342+ }
3343+ if (isinf (b))
3344+ {
3345+ return b->sign ? 1 : -1;
3346+ }
3347+ if (iszero (a) && iszero (b))
3348+ {
3349+ return 0;
3350+ }
3351+ if (iszero (a))
3352+ {
3353+ return b->sign ? 1 : -1;
3354+ }
3355+ if (iszero (b))
3356+ {
3357+ return a->sign ? -1 : 1;
3358+ }
3359+ /* now both are "normal". */
3360+ if (a->sign != b->sign)
3361+ {
3362+ /* opposite signs */
3363+ return a->sign ? -1 : 1;
3364+ }
3365+ /* same sign; exponents? */
3366+ if (a->normal_exp > b->normal_exp)
3367+ {
3368+ return a->sign ? -1 : 1;
3369+ }
3370+ if (a->normal_exp < b->normal_exp)
3371+ {
3372+ return a->sign ? 1 : -1;
3373+ }
3374+ /* same exponents; check size. */
3375+ if (a->fraction.ll > b->fraction.ll)
3376+ {
3377+ return a->sign ? -1 : 1;
3378+ }
3379+ if (a->fraction.ll < b->fraction.ll)
3380+ {
3381+ return a->sign ? 1 : -1;
3382+ }
3383+ /* after all that, they're equal. */
3384+ return 0;
3385+}
3386+#endif
3387+
3388+#if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compoare_tf)
3389+CMPtype
3390+compare (FLO_type arg_a, FLO_type arg_b)
3391+{
3392+ fp_number_type a;
3393+ fp_number_type b;
3394+ FLO_union_type au, bu;
3395+
3396+ au.value = arg_a;
3397+ bu.value = arg_b;
3398+
3399+ unpack_d (&au, &a);
3400+ unpack_d (&bu, &b);
3401+
3402+ return __fpcmp_parts (&a, &b);
3403+}
3404+#endif /* L_compare_sf || L_compare_df */
3405+
3406+#ifndef US_SOFTWARE_GOFAST
3407+
3408+/* These should be optimized for their specific tasks someday. */
3409+
3410+#if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf)
3411+CMPtype
3412+_eq_f2 (FLO_type arg_a, FLO_type arg_b)
3413+{
3414+ fp_number_type a;
3415+ fp_number_type b;
3416+ FLO_union_type au, bu;
3417+
3418+ au.value = arg_a;
3419+ bu.value = arg_b;
3420+
3421+ unpack_d (&au, &a);
3422+ unpack_d (&bu, &b);
3423+
3424+ if (isnan (&a) || isnan (&b))
3425+ return 1; /* false, truth == 0 */
3426+
3427+ return __fpcmp_parts (&a, &b) ;
3428+}
3429+#endif /* L_eq_sf || L_eq_df */
3430+
3431+#if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf)
3432+CMPtype
3433+_ne_f2 (FLO_type arg_a, FLO_type arg_b)
3434+{
3435+ fp_number_type a;
3436+ fp_number_type b;
3437+ FLO_union_type au, bu;
3438+
3439+ au.value = arg_a;
3440+ bu.value = arg_b;
3441+
3442+ unpack_d (&au, &a);
3443+ unpack_d (&bu, &b);
3444+
3445+ if (isnan (&a) || isnan (&b))
3446+ return 1; /* true, truth != 0 */
3447+
3448+ return __fpcmp_parts (&a, &b) ;
3449+}
3450+#endif /* L_ne_sf || L_ne_df */
3451+
3452+#if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf)
3453+CMPtype
3454+_gt_f2 (FLO_type arg_a, FLO_type arg_b)
3455+{
3456+ fp_number_type a;
3457+ fp_number_type b;
3458+ FLO_union_type au, bu;
3459+
3460+ au.value = arg_a;
3461+ bu.value = arg_b;
3462+
3463+ unpack_d (&au, &a);
3464+ unpack_d (&bu, &b);
3465+
3466+ if (isnan (&a) || isnan (&b))
3467+ return -1; /* false, truth > 0 */
3468+
3469+ return __fpcmp_parts (&a, &b);
3470+}
3471+#endif /* L_gt_sf || L_gt_df */
3472+
3473+#if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf)
3474+CMPtype
3475+_ge_f2 (FLO_type arg_a, FLO_type arg_b)
3476+{
3477+ fp_number_type a;
3478+ fp_number_type b;
3479+ FLO_union_type au, bu;
3480+
3481+ au.value = arg_a;
3482+ bu.value = arg_b;
3483+
3484+ unpack_d (&au, &a);
3485+ unpack_d (&bu, &b);
3486+
3487+ if (isnan (&a) || isnan (&b))
3488+ return -1; /* false, truth >= 0 */
3489+ return __fpcmp_parts (&a, &b) ;
3490+}
3491+#endif /* L_ge_sf || L_ge_df */
3492+
3493+#if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf)
3494+CMPtype
3495+_lt_f2 (FLO_type arg_a, FLO_type arg_b)
3496+{
3497+ fp_number_type a;
3498+ fp_number_type b;
3499+ FLO_union_type au, bu;
3500+
3501+ au.value = arg_a;
3502+ bu.value = arg_b;
3503+
3504+ unpack_d (&au, &a);
3505+ unpack_d (&bu, &b);
3506+
3507+ if (isnan (&a) || isnan (&b))
3508+ return 1; /* false, truth < 0 */
3509+
3510+ return __fpcmp_parts (&a, &b);
3511+}
3512+#endif /* L_lt_sf || L_lt_df */
3513+
3514+#if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf)
3515+CMPtype
3516+_le_f2 (FLO_type arg_a, FLO_type arg_b)
3517+{
3518+ fp_number_type a;
3519+ fp_number_type b;
3520+ FLO_union_type au, bu;
3521+
3522+ au.value = arg_a;
3523+ bu.value = arg_b;
3524+
3525+ unpack_d (&au, &a);
3526+ unpack_d (&bu, &b);
3527+
3528+ if (isnan (&a) || isnan (&b))
3529+ return 1; /* false, truth <= 0 */
3530+
3531+ return __fpcmp_parts (&a, &b) ;
3532+}
3533+#endif /* L_le_sf || L_le_df */
3534+
3535+#endif /* ! US_SOFTWARE_GOFAST */
3536+
3537+#if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf)
3538+CMPtype
3539+_unord_f2 (FLO_type arg_a, FLO_type arg_b)
3540+{
3541+ fp_number_type a;
3542+ fp_number_type b;
3543+ FLO_union_type au, bu;
3544+
3545+ au.value = arg_a;
3546+ bu.value = arg_b;
3547+
3548+ unpack_d (&au, &a);
3549+ unpack_d (&bu, &b);
3550+
3551+ return (isnan (&a) || isnan (&b));
3552+}
3553+#endif /* L_unord_sf || L_unord_df */
3554+
3555+#if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf)
3556+FLO_type
3557+si_to_float (SItype arg_a)
3558+{
3559+ fp_number_type in;
3560+
3561+ in.class = CLASS_NUMBER;
3562+ in.sign = arg_a < 0;
3563+ if (!arg_a)
3564+ {
3565+ in.class = CLASS_ZERO;
3566+ }
3567+ else
3568+ {
3569+ in.normal_exp = FRACBITS + NGARDS;
3570+ if (in.sign)
3571+ {
3572+ /* Special case for minint, since there is no +ve integer
3573+ representation for it */
3574+ if (arg_a == (- MAX_SI_INT - 1))
3575+ {
3576+ return (FLO_type)(- MAX_SI_INT - 1);
3577+ }
3578+ in.fraction.ll = (-arg_a);
3579+ }
3580+ else
3581+ in.fraction.ll = arg_a;
3582+
3583+ while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS)))
3584+ {
3585+ in.fraction.ll <<= 1;
3586+ in.normal_exp -= 1;
3587+ }
3588+ }
3589+ return pack_d (&in);
3590+}
3591+#endif /* L_si_to_sf || L_si_to_df */
3592+
3593+#if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf)
3594+FLO_type
3595+usi_to_float (USItype arg_a)
3596+{
3597+ fp_number_type in;
3598+
3599+ in.sign = 0;
3600+ if (!arg_a)
3601+ {
3602+ in.class = CLASS_ZERO;
3603+ }
3604+ else
3605+ {
3606+ in.class = CLASS_NUMBER;
3607+ in.normal_exp = FRACBITS + NGARDS;
3608+ in.fraction.ll = arg_a;
3609+
3610+ while (in.fraction.ll > ((fractype)1 << (FRACBITS + NGARDS)))
3611+ {
3612+ in.fraction.ll >>= 1;
3613+ in.normal_exp += 1;
3614+ }
3615+ while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS)))
3616+ {
3617+ in.fraction.ll <<= 1;
3618+ in.normal_exp -= 1;
3619+ }
3620+ }
3621+ return pack_d (&in);
3622+}
3623+#endif
3624+
3625+#if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si)
3626+SItype
3627+float_to_si (FLO_type arg_a)
3628+{
3629+ fp_number_type a;
3630+ SItype tmp;
3631+ FLO_union_type au;
3632+
3633+ au.value = arg_a;
3634+ unpack_d (&au, &a);
3635+
3636+ if (iszero (&a))
3637+ return 0;
3638+ if (isnan (&a))
3639+ return 0;
3640+ /* get reasonable MAX_SI_INT... */
3641+ if (isinf (&a))
3642+ return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
3643+ /* it is a number, but a small one */
3644+ if (a.normal_exp < 0)
3645+ return 0;
3646+ if (a.normal_exp > BITS_PER_SI - 2)
3647+ return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
3648+ tmp = a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
3649+ return a.sign ? (-tmp) : (tmp);
3650+}
3651+#endif /* L_sf_to_si || L_df_to_si */
3652+
3653+#if defined(L_sf_to_usi) || defined(L_df_to_usi) || defined(L_tf_to_usi)
3654+#if defined US_SOFTWARE_GOFAST || defined(L_tf_to_usi)
3655+/* While libgcc2.c defines its own __fixunssfsi and __fixunsdfsi routines,
3656+ we also define them for GOFAST because the ones in libgcc2.c have the
3657+ wrong names and I'd rather define these here and keep GOFAST CYG-LOC's
3658+ out of libgcc2.c. We can't define these here if not GOFAST because then
3659+ there'd be duplicate copies. */
3660+
3661+USItype
3662+float_to_usi (FLO_type arg_a)
3663+{
3664+ fp_number_type a;
3665+ FLO_union_type au;
3666+
3667+ au.value = arg_a;
3668+ unpack_d (&au, &a);
3669+
3670+ if (iszero (&a))
3671+ return 0;
3672+ if (isnan (&a))
3673+ return 0;
3674+ /* it is a negative number */
3675+ if (a.sign)
3676+ return 0;
3677+ /* get reasonable MAX_USI_INT... */
3678+ if (isinf (&a))
3679+ return MAX_USI_INT;
3680+ /* it is a number, but a small one */
3681+ if (a.normal_exp < 0)
3682+ return 0;
3683+ if (a.normal_exp > BITS_PER_SI - 1)
3684+ return MAX_USI_INT;
3685+ else if (a.normal_exp > (FRACBITS + NGARDS))
3686+ return a.fraction.ll << (a.normal_exp - (FRACBITS + NGARDS));
3687+ else
3688+ return a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
3689+}
3690+#endif /* US_SOFTWARE_GOFAST */
3691+#endif /* L_sf_to_usi || L_df_to_usi */
3692+
3693+#if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf)
3694+FLO_type
3695+negate (FLO_type arg_a)
3696+{
3697+ fp_number_type a;
3698+ FLO_union_type au;
3699+
3700+ au.value = arg_a;
3701+ unpack_d (&au, &a);
3702+
3703+ flip_sign (&a);
3704+ return pack_d (&a);
3705+}
3706+#endif /* L_negate_sf || L_negate_df */
3707+
3708+#ifdef FLOAT
3709+
3710+#if defined(L_make_sf)
3711+SFtype
3712+__make_fp(fp_class_type class,
3713+ unsigned int sign,
3714+ int exp,
3715+ USItype frac)
3716+{
3717+ fp_number_type in;
3718+
3719+ in.class = class;
3720+ in.sign = sign;
3721+ in.normal_exp = exp;
3722+ in.fraction.ll = frac;
3723+ return pack_d (&in);
3724+}
3725+#endif /* L_make_sf */
3726+
3727+#ifndef FLOAT_ONLY
3728+
3729+/* This enables one to build an fp library that supports float but not double.
3730+ Otherwise, we would get an undefined reference to __make_dp.
3731+ This is needed for some 8-bit ports that can't handle well values that
3732+ are 8-bytes in size, so we just don't support double for them at all. */
3733+
3734+#if defined(L_sf_to_df)
3735+DFtype
3736+sf_to_df (SFtype arg_a)
3737+{
3738+ fp_number_type in;
3739+ FLO_union_type au;
3740+
3741+ au.value = arg_a;
3742+ unpack_d (&au, &in);
3743+
3744+ return __make_dp (in.class, in.sign, in.normal_exp,
3745+ ((UDItype) in.fraction.ll) << F_D_BITOFF);
3746+}
3747+#endif /* L_sf_to_df */
3748+
3749+#if defined(L_sf_to_tf) && defined(TMODES)
3750+TFtype
3751+sf_to_tf (SFtype arg_a)
3752+{
3753+ fp_number_type in;
3754+ FLO_union_type au;
3755+
3756+ au.value = arg_a;
3757+ unpack_d (&au, &in);
3758+
3759+ return __make_tp (in.class, in.sign, in.normal_exp,
3760+ ((UTItype) in.fraction.ll) << F_T_BITOFF);
3761+}
3762+#endif /* L_sf_to_df */
3763+
3764+#endif /* ! FLOAT_ONLY */
3765+#endif /* FLOAT */
3766+
3767+#ifndef FLOAT
3768+
3769+extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
3770+
3771+#if defined(L_make_df)
3772+DFtype
3773+__make_dp (fp_class_type class, unsigned int sign, int exp, UDItype frac)
3774+{
3775+ fp_number_type in;
3776+
3777+ in.class = class;
3778+ in.sign = sign;
3779+ in.normal_exp = exp;
3780+ in.fraction.ll = frac;
3781+ return pack_d (&in);
3782+}
3783+#endif /* L_make_df */
3784+
3785+#if defined(L_df_to_sf)
3786+SFtype
3787+df_to_sf (DFtype arg_a)
3788+{
3789+ fp_number_type in;
3790+ USItype sffrac;
3791+ FLO_union_type au;
3792+
3793+ au.value = arg_a;
3794+ unpack_d (&au, &in);
3795+
3796+ sffrac = in.fraction.ll >> F_D_BITOFF;
3797+
3798+ /* We set the lowest guard bit in SFFRAC if we discarded any non
3799+ zero bits. */
3800+ if ((in.fraction.ll & (((USItype) 1 << F_D_BITOFF) - 1)) != 0)
3801+ sffrac |= 1;
3802+
3803+ return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
3804+}
3805+#endif /* L_df_to_sf */
3806+
3807+#if defined(L_df_to_tf) && defined(TMODES) \
3808+ && !defined(FLOAT) && !defined(TFLOAT)
3809+TFtype
3810+df_to_tf (DFtype arg_a)
3811+{
3812+ fp_number_type in;
3813+ FLO_union_type au;
3814+
3815+ au.value = arg_a;
3816+ unpack_d (&au, &in);
3817+
3818+ return __make_tp (in.class, in.sign, in.normal_exp,
3819+ ((UTItype) in.fraction.ll) << D_T_BITOFF);
3820+}
3821+#endif /* L_sf_to_df */
3822+
3823+#ifdef TFLOAT
3824+#if defined(L_make_tf)
3825+TFtype
3826+__make_tp(fp_class_type class,
3827+ unsigned int sign,
3828+ int exp,
3829+ UTItype frac)
3830+{
3831+ fp_number_type in;
3832+
3833+ in.class = class;
3834+ in.sign = sign;
3835+ in.normal_exp = exp;
3836+ in.fraction.ll = frac;
3837+ return pack_d (&in);
3838+}
3839+#endif /* L_make_tf */
3840+
3841+#if defined(L_tf_to_df)
3842+DFtype
3843+tf_to_df (TFtype arg_a)
3844+{
3845+ fp_number_type in;
3846+ UDItype sffrac;
3847+ FLO_union_type au;
3848+
3849+ au.value = arg_a;
3850+ unpack_d (&au, &in);
3851+
3852+ sffrac = in.fraction.ll >> D_T_BITOFF;
3853+
3854+ /* We set the lowest guard bit in SFFRAC if we discarded any non
3855+ zero bits. */
3856+ if ((in.fraction.ll & (((UTItype) 1 << D_T_BITOFF) - 1)) != 0)
3857+ sffrac |= 1;
3858+
3859+ return __make_dp (in.class, in.sign, in.normal_exp, sffrac);
3860+}
3861+#endif /* L_tf_to_df */
3862+
3863+#if defined(L_tf_to_sf)
3864+SFtype
3865+tf_to_sf (TFtype arg_a)
3866+{
3867+ fp_number_type in;
3868+ USItype sffrac;
3869+ FLO_union_type au;
3870+
3871+ au.value = arg_a;
3872+ unpack_d (&au, &in);
3873+
3874+ sffrac = in.fraction.ll >> F_T_BITOFF;
3875+
3876+ /* We set the lowest guard bit in SFFRAC if we discarded any non
3877+ zero bits. */
3878+ if ((in.fraction.ll & (((UTItype) 1 << F_T_BITOFF) - 1)) != 0)
3879+ sffrac |= 1;
3880+
3881+ return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
3882+}
3883+#endif /* L_tf_to_sf */
3884+#endif /* TFLOAT */
3885+
3886+#endif /* ! FLOAT */
3887+#endif /* !EXTENDED_FLOAT_STUBS */
3888--- ./gcc/gcc/libgcc2.c
3889+++ ./gcc/gcc/libgcc2.c
3890@@ -0,0 +1,1669 @@
3891+/* More subroutines needed by GCC output code on some machines. */
3892+/* Compile this one with gcc. */
3893+/* Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3894+ 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
3895+
3896+This file is part of GCC.
3897+
3898+GCC is free software; you can redistribute it and/or modify it under
3899+the terms of the GNU General Public License as published by the Free
3900+Software Foundation; either version 2, or (at your option) any later
3901+version.
3902+
3903+In addition to the permissions in the GNU General Public License, the
3904+Free Software Foundation gives you unlimited permission to link the
3905+compiled version of this file into combinations with other programs,
3906+and to distribute those combinations without any restriction coming
3907+from the use of this file. (The General Public License restrictions
3908+do apply in other respects; for example, they cover modification of
3909+the file, and distribution when not linked into a combine
3910+executable.)
3911+
3912+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
3913+WARRANTY; without even the implied warranty of MERCHANTABILITY or
3914+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3915+for more details.
3916+
3917+You should have received a copy of the GNU General Public License
3918+along with GCC; see the file COPYING. If not, write to the Free
3919+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
3920+02111-1307, USA. */
3921+
3922+
3923+/* We include auto-host.h here to get HAVE_GAS_HIDDEN. This is
3924+ supposedly valid even though this is a "target" file. */
3925+#include "auto-host.h"
3926+
3927+/* It is incorrect to include config.h here, because this file is being
3928+ compiled for the target, and hence definitions concerning only the host
3929+ do not apply. */
3930+#include "tconfig.h"
3931+#include "tsystem.h"
3932+#include "coretypes.h"
3933+#include "tm.h"
3934+
3935+/* Don't use `fancy_abort' here even if config.h says to use it. */
3936+#ifdef abort
3937+#undef abort
3938+#endif
3939+
3940+#ifdef HAVE_GAS_HIDDEN
3941+#define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden")))
3942+#else
3943+#define ATTRIBUTE_HIDDEN
3944+#endif
3945+
3946+#include "libgcc2.h"
3947+\f
3948+#ifdef DECLARE_LIBRARY_RENAMES
3949+ DECLARE_LIBRARY_RENAMES
3950+#endif
3951+
3952+#if defined (L_negdi2)
3953+DWtype
3954+__negdi2 (DWtype u)
3955+{
3956+ const DWunion uu = {.ll = u};
3957+ const DWunion w = { {.low = -uu.s.low,
3958+ .high = -uu.s.high - ((UWtype) -uu.s.low > 0) } };
3959+
3960+ return w.ll;
3961+}
3962+#endif
3963+
3964+#ifdef L_addvsi3
3965+Wtype
3966+__addvsi3 (Wtype a, Wtype b)
3967+{
3968+ const Wtype w = a + b;
3969+
3970+ if (b >= 0 ? w < a : w > a)
3971+ abort ();
3972+
3973+ return w;
3974+}
3975+#endif
3976+\f
3977+#ifdef L_addvdi3
3978+DWtype
3979+__addvdi3 (DWtype a, DWtype b)
3980+{
3981+ const DWtype w = a + b;
3982+
3983+ if (b >= 0 ? w < a : w > a)
3984+ abort ();
3985+
3986+ return w;
3987+}
3988+#endif
3989+\f
3990+#ifdef L_subvsi3
3991+Wtype
3992+__subvsi3 (Wtype a, Wtype b)
3993+{
3994+ const DWtype w = a - b;
3995+
3996+ if (b >= 0 ? w > a : w < a)
3997+ abort ();
3998+
3999+ return w;
4000+}
4001+#endif
4002+\f
4003+#ifdef L_subvdi3
4004+DWtype
4005+__subvdi3 (DWtype a, DWtype b)
4006+{
4007+ const DWtype w = a - b;
4008+
4009+ if (b >= 0 ? w > a : w < a)
4010+ abort ();
4011+
4012+ return w;
4013+}
4014+#endif
4015+\f
4016+#ifdef L_mulvsi3
4017+#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
4018+Wtype
4019+__mulvsi3 (Wtype a, Wtype b)
4020+{
4021+ const DWtype w = (DWtype) a * (DWtype) b;
4022+
4023+ if (((a >= 0) == (b >= 0))
4024+ ? (UDWtype) w > (UDWtype) (((DWtype) 1 << (WORD_SIZE - 1)) - 1)
4025+ : (UDWtype) w < (UDWtype) ((DWtype) -1 << (WORD_SIZE - 1)))
4026+ abort ();
4027+
4028+ return w;
4029+}
4030+#endif
4031+\f
4032+#ifdef L_negvsi2
4033+Wtype
4034+__negvsi2 (Wtype a)
4035+{
4036+ const Wtype w = -a;
4037+
4038+ if (a >= 0 ? w > 0 : w < 0)
4039+ abort ();
4040+
4041+ return w;
4042+}
4043+#endif
4044+\f
4045+#ifdef L_negvdi2
4046+DWtype
4047+__negvdi2 (DWtype a)
4048+{
4049+ const DWtype w = -a;
4050+
4051+ if (a >= 0 ? w > 0 : w < 0)
4052+ abort ();
4053+
4054+ return w;
4055+}
4056+#endif
4057+\f
4058+#ifdef L_absvsi2
4059+Wtype
4060+__absvsi2 (Wtype a)
4061+{
4062+ Wtype w = a;
4063+
4064+ if (a < 0)
4065+#ifdef L_negvsi2
4066+ w = __negvsi2 (a);
4067+#else
4068+ w = -a;
4069+
4070+ if (w < 0)
4071+ abort ();
4072+#endif
4073+
4074+ return w;
4075+}
4076+#endif
4077+\f
4078+#ifdef L_absvdi2
4079+DWtype
4080+__absvdi2 (DWtype a)
4081+{
4082+ DWtype w = a;
4083+
4084+ if (a < 0)
4085+#ifdef L_negvdi2
4086+ w = __negvdi2 (a);
4087+#else
4088+ w = -a;
4089+
4090+ if (w < 0)
4091+ abort ();
4092+#endif
4093+
4094+ return w;
4095+}
4096+#endif
4097+\f
4098+#ifdef L_mulvdi3
4099+#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
4100+DWtype
4101+__mulvdi3 (DWtype u, DWtype v)
4102+{
4103+ /* The unchecked multiplication needs 3 Wtype x Wtype multiplications,
4104+ but the checked multiplication needs only two. */
4105+ const DWunion uu = {.ll = u};
4106+ const DWunion vv = {.ll = v};
4107+
4108+ if (__builtin_expect (uu.s.high == uu.s.low >> (WORD_SIZE - 1), 1))
4109+ {
4110+ /* u fits in a single Wtype. */
4111+ if (__builtin_expect (vv.s.high == vv.s.low >> (WORD_SIZE - 1), 1))
4112+ {
4113+ /* v fits in a single Wtype as well. */
4114+ /* A single multiplication. No overflow risk. */
4115+ return (DWtype) uu.s.low * (DWtype) vv.s.low;
4116+ }
4117+ else
4118+ {
4119+ /* Two multiplications. */
4120+ DWunion w0 = {.ll = (UDWtype) (UWtype) uu.s.low
4121+ * (UDWtype) (UWtype) vv.s.low};
4122+ DWunion w1 = {.ll = (UDWtype) (UWtype) uu.s.low
4123+ * (UDWtype) (UWtype) vv.s.high};
4124+
4125+ if (vv.s.high < 0)
4126+ w1.s.high -= uu.s.low;
4127+ if (uu.s.low < 0)
4128+ w1.ll -= vv.ll;
4129+ w1.ll += (UWtype) w0.s.high;
4130+ if (__builtin_expect (w1.s.high == w1.s.low >> (WORD_SIZE - 1), 1))
4131+ {
4132+ w0.s.high = w1.s.low;
4133+ return w0.ll;
4134+ }
4135+ }
4136+ }
4137+ else
4138+ {
4139+ if (__builtin_expect (vv.s.high == vv.s.low >> (WORD_SIZE - 1), 1))
4140+ {
4141+ /* v fits into a single Wtype. */
4142+ /* Two multiplications. */
4143+ DWunion w0 = {.ll = (UDWtype) (UWtype) uu.s.low
4144+ * (UDWtype) (UWtype) vv.s.low};
4145+ DWunion w1 = {.ll = (UDWtype) (UWtype) uu.s.high
4146+ * (UDWtype) (UWtype) vv.s.low};
4147+
4148+ if (uu.s.high < 0)
4149+ w1.s.high -= vv.s.low;
4150+ if (vv.s.low < 0)
4151+ w1.ll -= uu.ll;
4152+ w1.ll += (UWtype) w0.s.high;
4153+ if (__builtin_expect (w1.s.high == w1.s.low >> (WORD_SIZE - 1), 1))
4154+ {
4155+ w0.s.high = w1.s.low;
4156+ return w0.ll;
4157+ }
4158+ }
4159+ else
4160+ {
4161+ /* A few sign checks and a single multiplication. */
4162+ if (uu.s.high >= 0)
4163+ {
4164+ if (vv.s.high >= 0)
4165+ {
4166+ if (uu.s.high == 0 && vv.s.high == 0)
4167+ {
4168+ const DWtype w = (UDWtype) (UWtype) uu.s.low
4169+ * (UDWtype) (UWtype) vv.s.low;
4170+ if (__builtin_expect (w >= 0, 1))
4171+ return w;
4172+ }
4173+ }
4174+ else
4175+ {
4176+ if (uu.s.high == 0 && vv.s.high == (Wtype) -1)
4177+ {
4178+ DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low
4179+ * (UDWtype) (UWtype) vv.s.low};
4180+
4181+ ww.s.high -= uu.s.low;
4182+ if (__builtin_expect (ww.s.high < 0, 1))
4183+ return ww.ll;
4184+ }
4185+ }
4186+ }
4187+ else
4188+ {
4189+ if (vv.s.high >= 0)
4190+ {
4191+ if (uu.s.high == (Wtype) -1 && vv.s.high == 0)
4192+ {
4193+ DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low
4194+ * (UDWtype) (UWtype) vv.s.low};
4195+
4196+ ww.s.high -= vv.s.low;
4197+ if (__builtin_expect (ww.s.high < 0, 1))
4198+ return ww.ll;
4199+ }
4200+ }
4201+ else
4202+ {
4203+ if (uu.s.high == (Wtype) -1 && vv.s.high == (Wtype) - 1)
4204+ {
4205+ DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low
4206+ * (UDWtype) (UWtype) vv.s.low};
4207+
4208+ ww.s.high -= uu.s.low;
4209+ ww.s.high -= vv.s.low;
4210+ if (__builtin_expect (ww.s.high >= 0, 1))
4211+ return ww.ll;
4212+ }
4213+ }
4214+ }
4215+ }
4216+ }
4217+
4218+ /* Overflow. */
4219+ abort ();
4220+}
4221+#endif
4222+\f
4223+
4224+/* Unless shift functions are defined with full ANSI prototypes,
4225+ parameter b will be promoted to int if word_type is smaller than an int. */
4226+#ifdef L_lshrdi3
4227+DWtype
4228+__lshrdi3 (DWtype u, word_type b)
4229+{
4230+ if (b == 0)
4231+ return u;
4232+
4233+ const DWunion uu = {.ll = u};
4234+ const word_type bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
4235+ DWunion w;
4236+
4237+ if (bm <= 0)
4238+ {
4239+ w.s.high = 0;
4240+ w.s.low = (UWtype) uu.s.high >> -bm;
4241+ }
4242+ else
4243+ {
4244+ const UWtype carries = (UWtype) uu.s.high << bm;
4245+
4246+ w.s.high = (UWtype) uu.s.high >> b;
4247+ w.s.low = ((UWtype) uu.s.low >> b) | carries;
4248+ }
4249+
4250+ return w.ll;
4251+}
4252+#endif
4253+
4254+#ifdef L_ashldi3
4255+DWtype
4256+__ashldi3 (DWtype u, word_type b)
4257+{
4258+ if (b == 0)
4259+ return u;
4260+
4261+ const DWunion uu = {.ll = u};
4262+ const word_type bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
4263+ DWunion w;
4264+
4265+ if (bm <= 0)
4266+ {
4267+ w.s.low = 0;
4268+ w.s.high = (UWtype) uu.s.low << -bm;
4269+ }
4270+ else
4271+ {
4272+ const UWtype carries = (UWtype) uu.s.low >> bm;
4273+
4274+ w.s.low = (UWtype) uu.s.low << b;
4275+ w.s.high = ((UWtype) uu.s.high << b) | carries;
4276+ }
4277+
4278+ return w.ll;
4279+}
4280+#endif
4281+
4282+#ifdef L_ashrdi3
4283+DWtype
4284+__ashrdi3 (DWtype u, word_type b)
4285+{
4286+ if (b == 0)
4287+ return u;
4288+
4289+ const DWunion uu = {.ll = u};
4290+ const word_type bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
4291+ DWunion w;
4292+
4293+ if (bm <= 0)
4294+ {
4295+ /* w.s.high = 1..1 or 0..0 */
4296+ w.s.high = uu.s.high >> (sizeof (Wtype) * BITS_PER_UNIT - 1);
4297+ w.s.low = uu.s.high >> -bm;
4298+ }
4299+ else
4300+ {
4301+ const UWtype carries = (UWtype) uu.s.high << bm;
4302+
4303+ w.s.high = uu.s.high >> b;
4304+ w.s.low = ((UWtype) uu.s.low >> b) | carries;
4305+ }
4306+
4307+ return w.ll;
4308+}
4309+#endif
4310+\f
4311+#ifdef L_ffssi2
4312+#undef int
4313+extern int __ffsSI2 (UWtype u);
4314+int
4315+__ffsSI2 (UWtype u)
4316+{
4317+ UWtype count;
4318+
4319+ if (u == 0)
4320+ return 0;
4321+
4322+ count_trailing_zeros (count, u);
4323+ return count + 1;
4324+}
4325+#endif
4326+\f
4327+#ifdef L_ffsdi2
4328+#undef int
4329+extern int __ffsDI2 (DWtype u);
4330+int
4331+__ffsDI2 (DWtype u)
4332+{
4333+ const DWunion uu = {.ll = u};
4334+ UWtype word, count, add;
4335+
4336+ if (uu.s.low != 0)
4337+ word = uu.s.low, add = 0;
4338+ else if (uu.s.high != 0)
4339+ word = uu.s.high, add = BITS_PER_UNIT * sizeof (Wtype);
4340+ else
4341+ return 0;
4342+
4343+ count_trailing_zeros (count, word);
4344+ return count + add + 1;
4345+}
4346+#endif
4347+\f
4348+#ifdef L_muldi3
4349+DWtype
4350+__muldi3 (DWtype u, DWtype v)
4351+{
4352+ const DWunion uu = {.ll = u};
4353+ const DWunion vv = {.ll = v};
4354+ DWunion w = {.ll = __umulsidi3 (uu.s.low, vv.s.low)};
4355+
4356+ w.s.high += ((UWtype) uu.s.low * (UWtype) vv.s.high
4357+ + (UWtype) uu.s.high * (UWtype) vv.s.low);
4358+
4359+ return w.ll;
4360+}
4361+#endif
4362+\f
4363+#if (defined (L_udivdi3) || defined (L_divdi3) || \
4364+ defined (L_umoddi3) || defined (L_moddi3))
4365+#if defined (sdiv_qrnnd)
4366+#define L_udiv_w_sdiv
4367+#endif
4368+#endif
4369+
4370+#ifdef L_udiv_w_sdiv
4371+#if defined (sdiv_qrnnd)
4372+#if (defined (L_udivdi3) || defined (L_divdi3) || \
4373+ defined (L_umoddi3) || defined (L_moddi3))
4374+static inline __attribute__ ((__always_inline__))
4375+#endif
4376+UWtype
4377+__udiv_w_sdiv (UWtype *rp, UWtype a1, UWtype a0, UWtype d)
4378+{
4379+ UWtype q, r;
4380+ UWtype c0, c1, b1;
4381+
4382+ if ((Wtype) d >= 0)
4383+ {
4384+ if (a1 < d - a1 - (a0 >> (W_TYPE_SIZE - 1)))
4385+ {
4386+ /* dividend, divisor, and quotient are nonnegative */
4387+ sdiv_qrnnd (q, r, a1, a0, d);
4388+ }
4389+ else
4390+ {
4391+ /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d */
4392+ sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (W_TYPE_SIZE - 1));
4393+ /* Divide (c1*2^32 + c0) by d */
4394+ sdiv_qrnnd (q, r, c1, c0, d);
4395+ /* Add 2^31 to quotient */
4396+ q += (UWtype) 1 << (W_TYPE_SIZE - 1);
4397+ }
4398+ }
4399+ else
4400+ {
4401+ b1 = d >> 1; /* d/2, between 2^30 and 2^31 - 1 */
4402+ c1 = a1 >> 1; /* A/2 */
4403+ c0 = (a1 << (W_TYPE_SIZE - 1)) + (a0 >> 1);
4404+
4405+ if (a1 < b1) /* A < 2^32*b1, so A/2 < 2^31*b1 */
4406+ {
4407+ sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
4408+
4409+ r = 2*r + (a0 & 1); /* Remainder from A/(2*b1) */
4410+ if ((d & 1) != 0)
4411+ {
4412+ if (r >= q)
4413+ r = r - q;
4414+ else if (q - r <= d)
4415+ {
4416+ r = r - q + d;
4417+ q--;
4418+ }
4419+ else
4420+ {
4421+ r = r - q + 2*d;
4422+ q -= 2;
4423+ }
4424+ }
4425+ }
4426+ else if (c1 < b1) /* So 2^31 <= (A/2)/b1 < 2^32 */
4427+ {
4428+ c1 = (b1 - 1) - c1;
4429+ c0 = ~c0; /* logical NOT */
4430+
4431+ sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
4432+
4433+ q = ~q; /* (A/2)/b1 */
4434+ r = (b1 - 1) - r;
4435+
4436+ r = 2*r + (a0 & 1); /* A/(2*b1) */
4437+
4438+ if ((d & 1) != 0)
4439+ {
4440+ if (r >= q)
4441+ r = r - q;
4442+ else if (q - r <= d)
4443+ {
4444+ r = r - q + d;
4445+ q--;
4446+ }
4447+ else
4448+ {
4449+ r = r - q + 2*d;
4450+ q -= 2;
4451+ }
4452+ }
4453+ }
4454+ else /* Implies c1 = b1 */
4455+ { /* Hence a1 = d - 1 = 2*b1 - 1 */
4456+ if (a0 >= -d)
4457+ {
4458+ q = -1;
4459+ r = a0 + d;
4460+ }
4461+ else
4462+ {
4463+ q = -2;
4464+ r = a0 + 2*d;
4465+ }
4466+ }
4467+ }
4468+
4469+ *rp = r;
4470+ return q;
4471+}
4472+#else
4473+/* If sdiv_qrnnd doesn't exist, define dummy __udiv_w_sdiv. */
4474+UWtype
4475+__udiv_w_sdiv (UWtype *rp __attribute__ ((__unused__)),
4476+ UWtype a1 __attribute__ ((__unused__)),
4477+ UWtype a0 __attribute__ ((__unused__)),
4478+ UWtype d __attribute__ ((__unused__)))
4479+{
4480+ return 0;
4481+}
4482+#endif
4483+#endif
4484+\f
4485+#if (defined (L_udivdi3) || defined (L_divdi3) || \
4486+ defined (L_umoddi3) || defined (L_moddi3))
4487+#define L_udivmoddi4
4488+#endif
4489+
4490+#ifdef L_clz
4491+const UQItype __clz_tab[] =
4492+{
4493+ 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
4494+ 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
4495+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
4496+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
4497+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4498+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4499+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4500+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4501+};
4502+#endif
4503+\f
4504+#ifdef L_clzsi2
4505+#undef int
4506+extern int __clzSI2 (UWtype x);
4507+int
4508+__clzSI2 (UWtype x)
4509+{
4510+ Wtype ret;
4511+
4512+ count_leading_zeros (ret, x);
4513+
4514+ return ret;
4515+}
4516+#endif
4517+\f
4518+#ifdef L_clzdi2
4519+#undef int
4520+extern int __clzDI2 (UDWtype x);
4521+int
4522+__clzDI2 (UDWtype x)
4523+{
4524+ const DWunion uu = {.ll = x};
4525+ UWtype word;
4526+ Wtype ret, add;
4527+
4528+ if (uu.s.high)
4529+ word = uu.s.high, add = 0;
4530+ else
4531+ word = uu.s.low, add = W_TYPE_SIZE;
4532+
4533+ count_leading_zeros (ret, word);
4534+ return ret + add;
4535+}
4536+#endif
4537+\f
4538+#ifdef L_ctzsi2
4539+#undef int
4540+extern int __ctzSI2 (UWtype x);
4541+int
4542+__ctzSI2 (UWtype x)
4543+{
4544+ Wtype ret;
4545+
4546+ count_trailing_zeros (ret, x);
4547+
4548+ return ret;
4549+}
4550+#endif
4551+\f
4552+#ifdef L_ctzdi2
4553+#undef int
4554+extern int __ctzDI2 (UDWtype x);
4555+int
4556+__ctzDI2 (UDWtype x)
4557+{
4558+ const DWunion uu = {.ll = x};
4559+ UWtype word;
4560+ Wtype ret, add;
4561+
4562+ if (uu.s.low)
4563+ word = uu.s.low, add = 0;
4564+ else
4565+ word = uu.s.high, add = W_TYPE_SIZE;
4566+
4567+ count_trailing_zeros (ret, word);
4568+ return ret + add;
4569+}
4570+#endif
4571+
4572+#if (defined (L_popcountsi2) || defined (L_popcountdi2) \
4573+ || defined (L_popcount_tab))
4574+extern const UQItype __popcount_tab[] ATTRIBUTE_HIDDEN;
4575+#endif
4576+
4577+#ifdef L_popcount_tab
4578+const UQItype __popcount_tab[] =
4579+{
4580+ 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
4581+ 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
4582+ 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
4583+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
4584+ 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
4585+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
4586+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
4587+ 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,
4588+};
4589+#endif
4590+\f
4591+#ifdef L_popcountsi2
4592+#undef int
4593+extern int __popcountSI2 (UWtype x);
4594+int
4595+__popcountSI2 (UWtype x)
4596+{
4597+ UWtype i, ret = 0;
4598+
4599+ for (i = 0; i < W_TYPE_SIZE; i += 8)
4600+ ret += __popcount_tab[(x >> i) & 0xff];
4601+
4602+ return ret;
4603+}
4604+#endif
4605+\f
4606+#ifdef L_popcountdi2
4607+#undef int
4608+extern int __popcountDI2 (UDWtype x);
4609+int
4610+__popcountDI2 (UDWtype x)
4611+{
4612+ UWtype i, ret = 0;
4613+
4614+ for (i = 0; i < 2*W_TYPE_SIZE; i += 8)
4615+ ret += __popcount_tab[(x >> i) & 0xff];
4616+
4617+ return ret;
4618+}
4619+#endif
4620+\f
4621+#ifdef L_paritysi2
4622+#undef int
4623+extern int __paritySI2 (UWtype x);
4624+int
4625+__paritySI2 (UWtype x)
4626+{
4627+#if W_TYPE_SIZE > 64
4628+# error "fill out the table"
4629+#endif
4630+#if W_TYPE_SIZE > 32
4631+ x ^= x >> 32;
4632+#endif
4633+#if W_TYPE_SIZE > 16
4634+ x ^= x >> 16;
4635+#endif
4636+ x ^= x >> 8;
4637+ x ^= x >> 4;
4638+ x &= 0xf;
4639+ return (0x6996 >> x) & 1;
4640+}
4641+#endif
4642+\f
4643+#ifdef L_paritydi2
4644+#undef int
4645+extern int __parityDI2 (UDWtype x);
4646+int
4647+__parityDI2 (UDWtype x)
4648+{
4649+ const DWunion uu = {.ll = x};
4650+ UWtype nx = uu.s.low ^ uu.s.high;
4651+
4652+#if W_TYPE_SIZE > 64
4653+# error "fill out the table"
4654+#endif
4655+#if W_TYPE_SIZE > 32
4656+ nx ^= nx >> 32;
4657+#endif
4658+#if W_TYPE_SIZE > 16
4659+ nx ^= nx >> 16;
4660+#endif
4661+ nx ^= nx >> 8;
4662+ nx ^= nx >> 4;
4663+ nx &= 0xf;
4664+ return (0x6996 >> nx) & 1;
4665+}
4666+#endif
4667+
4668+#ifdef L_udivmoddi4
4669+
4670+#if (defined (L_udivdi3) || defined (L_divdi3) || \
4671+ defined (L_umoddi3) || defined (L_moddi3))
4672+static inline __attribute__ ((__always_inline__))
4673+#endif
4674+UDWtype
4675+__udivmoddi4 (UDWtype n, UDWtype d, UDWtype *rp)
4676+{
4677+ const DWunion nn = {.ll = n};
4678+ const DWunion dd = {.ll = d};
4679+ DWunion rr;
4680+ UWtype d0, d1, n0, n1, n2;
4681+ UWtype q0, q1;
4682+ UWtype b, bm;
4683+
4684+ d0 = dd.s.low;
4685+ d1 = dd.s.high;
4686+ n0 = nn.s.low;
4687+ n1 = nn.s.high;
4688+
4689+#if !UDIV_NEEDS_NORMALIZATION
4690+ if (d1 == 0)
4691+ {
4692+ if (d0 > n1)
4693+ {
4694+ /* 0q = nn / 0D */
4695+
4696+ udiv_qrnnd (q0, n0, n1, n0, d0);
4697+ q1 = 0;
4698+
4699+ /* Remainder in n0. */
4700+ }
4701+ else
4702+ {
4703+ /* qq = NN / 0d */
4704+
4705+ if (d0 == 0)
4706+ d0 = 1 / d0; /* Divide intentionally by zero. */
4707+
4708+ udiv_qrnnd (q1, n1, 0, n1, d0);
4709+ udiv_qrnnd (q0, n0, n1, n0, d0);
4710+
4711+ /* Remainder in n0. */
4712+ }
4713+
4714+ if (rp != 0)
4715+ {
4716+ rr.s.low = n0;
4717+ rr.s.high = 0;
4718+ *rp = rr.ll;
4719+ }
4720+ }
4721+
4722+#else /* UDIV_NEEDS_NORMALIZATION */
4723+
4724+ if (d1 == 0)
4725+ {
4726+ if (d0 > n1)
4727+ {
4728+ /* 0q = nn / 0D */
4729+
4730+ count_leading_zeros (bm, d0);
4731+
4732+ if (bm != 0)
4733+ {
4734+ /* Normalize, i.e. make the most significant bit of the
4735+ denominator set. */
4736+
4737+ d0 = d0 << bm;
4738+ n1 = (n1 << bm) | (n0 >> (W_TYPE_SIZE - bm));
4739+ n0 = n0 << bm;
4740+ }
4741+
4742+ udiv_qrnnd (q0, n0, n1, n0, d0);
4743+ q1 = 0;
4744+
4745+ /* Remainder in n0 >> bm. */
4746+ }
4747+ else
4748+ {
4749+ /* qq = NN / 0d */
4750+
4751+ if (d0 == 0)
4752+ d0 = 1 / d0; /* Divide intentionally by zero. */
4753+
4754+ count_leading_zeros (bm, d0);
4755+
4756+ if (bm == 0)
4757+ {
4758+ /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
4759+ conclude (the most significant bit of n1 is set) /\ (the
4760+ leading quotient digit q1 = 1).
4761+
4762+ This special case is necessary, not an optimization.
4763+ (Shifts counts of W_TYPE_SIZE are undefined.) */
4764+
4765+ n1 -= d0;
4766+ q1 = 1;
4767+ }
4768+ else
4769+ {
4770+ /* Normalize. */
4771+
4772+ b = W_TYPE_SIZE - bm;
4773+
4774+ d0 = d0 << bm;
4775+ n2 = n1 >> b;
4776+ n1 = (n1 << bm) | (n0 >> b);
4777+ n0 = n0 << bm;
4778+
4779+ udiv_qrnnd (q1, n1, n2, n1, d0);
4780+ }
4781+
4782+ /* n1 != d0... */
4783+
4784+ udiv_qrnnd (q0, n0, n1, n0, d0);
4785+
4786+ /* Remainder in n0 >> bm. */
4787+ }
4788+
4789+ if (rp != 0)
4790+ {
4791+ rr.s.low = n0 >> bm;
4792+ rr.s.high = 0;
4793+ *rp = rr.ll;
4794+ }
4795+ }
4796+#endif /* UDIV_NEEDS_NORMALIZATION */
4797+
4798+ else
4799+ {
4800+ if (d1 > n1)
4801+ {
4802+ /* 00 = nn / DD */
4803+
4804+ q0 = 0;
4805+ q1 = 0;
4806+
4807+ /* Remainder in n1n0. */
4808+ if (rp != 0)
4809+ {
4810+ rr.s.low = n0;
4811+ rr.s.high = n1;
4812+ *rp = rr.ll;
4813+ }
4814+ }
4815+ else
4816+ {
4817+ /* 0q = NN / dd */
4818+
4819+ count_leading_zeros (bm, d1);
4820+ if (bm == 0)
4821+ {
4822+ /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
4823+ conclude (the most significant bit of n1 is set) /\ (the
4824+ quotient digit q0 = 0 or 1).
4825+
4826+ This special case is necessary, not an optimization. */
4827+
4828+ /* The condition on the next line takes advantage of that
4829+ n1 >= d1 (true due to program flow). */
4830+ if (n1 > d1 || n0 >= d0)
4831+ {
4832+ q0 = 1;
4833+ sub_ddmmss (n1, n0, n1, n0, d1, d0);
4834+ }
4835+ else
4836+ q0 = 0;
4837+
4838+ q1 = 0;
4839+
4840+ if (rp != 0)
4841+ {
4842+ rr.s.low = n0;
4843+ rr.s.high = n1;
4844+ *rp = rr.ll;
4845+ }
4846+ }
4847+ else
4848+ {
4849+ UWtype m1, m0;
4850+ /* Normalize. */
4851+
4852+ b = W_TYPE_SIZE - bm;
4853+
4854+ d1 = (d1 << bm) | (d0 >> b);
4855+ d0 = d0 << bm;
4856+ n2 = n1 >> b;
4857+ n1 = (n1 << bm) | (n0 >> b);
4858+ n0 = n0 << bm;
4859+
4860+ udiv_qrnnd (q0, n1, n2, n1, d1);
4861+ umul_ppmm (m1, m0, q0, d0);
4862+
4863+ if (m1 > n1 || (m1 == n1 && m0 > n0))
4864+ {
4865+ q0--;
4866+ sub_ddmmss (m1, m0, m1, m0, d1, d0);
4867+ }
4868+
4869+ q1 = 0;
4870+
4871+ /* Remainder in (n1n0 - m1m0) >> bm. */
4872+ if (rp != 0)
4873+ {
4874+ sub_ddmmss (n1, n0, n1, n0, m1, m0);
4875+ rr.s.low = (n1 << b) | (n0 >> bm);
4876+ rr.s.high = n1 >> bm;
4877+ *rp = rr.ll;
4878+ }
4879+ }
4880+ }
4881+ }
4882+
4883+ const DWunion ww = {{.low = q0, .high = q1}};
4884+ return ww.ll;
4885+}
4886+#endif
4887+
4888+#ifdef L_divdi3
4889+DWtype
4890+__divdi3 (DWtype u, DWtype v)
4891+{
4892+ word_type c = 0;
4893+ DWunion uu = {.ll = u};
4894+ DWunion vv = {.ll = v};
4895+ DWtype w;
4896+
4897+ if (uu.s.high < 0)
4898+ c = ~c,
4899+ uu.ll = -uu.ll;
4900+ if (vv.s.high < 0)
4901+ c = ~c,
4902+ vv.ll = -vv.ll;
4903+
4904+ w = __udivmoddi4 (uu.ll, vv.ll, (UDWtype *) 0);
4905+ if (c)
4906+ w = -w;
4907+
4908+ return w;
4909+}
4910+#endif
4911+
4912+#ifdef L_moddi3
4913+DWtype
4914+__moddi3 (DWtype u, DWtype v)
4915+{
4916+ word_type c = 0;
4917+ DWunion uu = {.ll = u};
4918+ DWunion vv = {.ll = v};
4919+ DWtype w;
4920+
4921+ if (uu.s.high < 0)
4922+ c = ~c,
4923+ uu.ll = -uu.ll;
4924+ if (vv.s.high < 0)
4925+ vv.ll = -vv.ll;
4926+
4927+ (void) __udivmoddi4 (uu.ll, vv.ll, &w);
4928+ if (c)
4929+ w = -w;
4930+
4931+ return w;
4932+}
4933+#endif
4934+
4935+#ifdef L_umoddi3
4936+UDWtype
4937+__umoddi3 (UDWtype u, UDWtype v)
4938+{
4939+ UDWtype w;
4940+
4941+ (void) __udivmoddi4 (u, v, &w);
4942+
4943+ return w;
4944+}
4945+#endif
4946+
4947+#ifdef L_udivdi3
4948+UDWtype
4949+__udivdi3 (UDWtype n, UDWtype d)
4950+{
4951+ return __udivmoddi4 (n, d, (UDWtype *) 0);
4952+}
4953+#endif
4954+\f
4955+#ifdef L_cmpdi2
4956+word_type
4957+__cmpdi2 (DWtype a, DWtype b)
4958+{
4959+ const DWunion au = {.ll = a};
4960+ const DWunion bu = {.ll = b};
4961+
4962+ if (au.s.high < bu.s.high)
4963+ return 0;
4964+ else if (au.s.high > bu.s.high)
4965+ return 2;
4966+ if ((UWtype) au.s.low < (UWtype) bu.s.low)
4967+ return 0;
4968+ else if ((UWtype) au.s.low > (UWtype) bu.s.low)
4969+ return 2;
4970+ return 1;
4971+}
4972+#endif
4973+
4974+#ifdef L_ucmpdi2
4975+word_type
4976+__ucmpdi2 (DWtype a, DWtype b)
4977+{
4978+ const DWunion au = {.ll = a};
4979+ const DWunion bu = {.ll = b};
4980+
4981+ if ((UWtype) au.s.high < (UWtype) bu.s.high)
4982+ return 0;
4983+ else if ((UWtype) au.s.high > (UWtype) bu.s.high)
4984+ return 2;
4985+ if ((UWtype) au.s.low < (UWtype) bu.s.low)
4986+ return 0;
4987+ else if ((UWtype) au.s.low > (UWtype) bu.s.low)
4988+ return 2;
4989+ return 1;
4990+}
4991+#endif
4992+\f
4993+#if defined(L_fixunstfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
4994+#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
4995+#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
4996+
4997+DWtype
4998+__fixunstfDI (TFtype a)
4999+{
5000+ if (a < 0)
5001+ return 0;
5002+
5003+ /* Compute high word of result, as a flonum. */
5004+ const TFtype b = (a / HIGH_WORD_COEFF);
5005+ /* Convert that to fixed (but not to DWtype!),
5006+ and shift it into the high word. */
5007+ UDWtype v = (UWtype) b;
5008+ v <<= WORD_SIZE;
5009+ /* Remove high part from the TFtype, leaving the low part as flonum. */
5010+ a -= (TFtype)v;
5011+ /* Convert that to fixed (but not to DWtype!) and add it in.
5012+ Sometimes A comes out negative. This is significant, since
5013+ A has more bits than a long int does. */
5014+ if (a < 0)
5015+ v -= (UWtype) (- a);
5016+ else
5017+ v += (UWtype) a;
5018+ return v;
5019+}
5020+#endif
5021+
5022+#if defined(L_fixtfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
5023+DWtype
5024+__fixtfdi (TFtype a)
5025+{
5026+ if (a < 0)
5027+ return - __fixunstfDI (-a);
5028+ return __fixunstfDI (a);
5029+}
5030+#endif
5031+
5032+#if defined(L_fixunsxfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
5033+#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
5034+#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
5035+
5036+DWtype
5037+__fixunsxfDI (XFtype a)
5038+{
5039+ if (a < 0)
5040+ return 0;
5041+
5042+ /* Compute high word of result, as a flonum. */
5043+ const XFtype b = (a / HIGH_WORD_COEFF);
5044+ /* Convert that to fixed (but not to DWtype!),
5045+ and shift it into the high word. */
5046+ UDWtype v = (UWtype) b;
5047+ v <<= WORD_SIZE;
5048+ /* Remove high part from the XFtype, leaving the low part as flonum. */
5049+ a -= (XFtype)v;
5050+ /* Convert that to fixed (but not to DWtype!) and add it in.
5051+ Sometimes A comes out negative. This is significant, since
5052+ A has more bits than a long int does. */
5053+ if (a < 0)
5054+ v -= (UWtype) (- a);
5055+ else
5056+ v += (UWtype) a;
5057+ return v;
5058+}
5059+#endif
5060+
5061+#if defined(L_fixxfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
5062+DWtype
5063+__fixxfdi (XFtype a)
5064+{
5065+ if (a < 0)
5066+ return - __fixunsxfDI (-a);
5067+ return __fixunsxfDI (a);
5068+}
5069+#endif
5070+
5071+#ifdef L_fixunsdfdi
5072+#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
5073+#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
5074+
5075+DWtype
5076+__fixunsdfDI (DFtype a)
5077+{
5078+ /* Get high part of result. The division here will just moves the radix
5079+ point and will not cause any rounding. Then the conversion to integral
5080+ type chops result as desired. */
5081+ const UWtype hi = a / HIGH_WORD_COEFF;
5082+
5083+ /* Get low part of result. Convert `hi' to floating type and scale it back,
5084+ then subtract this from the number being converted. This leaves the low
5085+ part. Convert that to integral type. */
5086+ const UWtype lo = (a - ((DFtype) hi) * HIGH_WORD_COEFF);
5087+
5088+ /* Assemble result from the two parts. */
5089+ return ((UDWtype) hi << WORD_SIZE) | lo;
5090+}
5091+#endif
5092+
5093+#ifdef L_fixdfdi
5094+DWtype
5095+__fixdfdi (DFtype a)
5096+{
5097+ if (a < 0)
5098+ return - __fixunsdfDI (-a);
5099+ return __fixunsdfDI (a);
5100+}
5101+#endif
5102+
5103+#ifdef L_fixunssfdi
5104+#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
5105+#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
5106+
5107+DWtype
5108+__fixunssfDI (SFtype original_a)
5109+{
5110+ /* Convert the SFtype to a DFtype, because that is surely not going
5111+ to lose any bits. Some day someone else can write a faster version
5112+ that avoids converting to DFtype, and verify it really works right. */
5113+ const DFtype a = original_a;
5114+
5115+ /* Get high part of result. The division here will just moves the radix
5116+ point and will not cause any rounding. Then the conversion to integral
5117+ type chops result as desired. */
5118+ const UWtype hi = a / HIGH_WORD_COEFF;
5119+
5120+ /* Get low part of result. Convert `hi' to floating type and scale it back,
5121+ then subtract this from the number being converted. This leaves the low
5122+ part. Convert that to integral type. */
5123+ const UWtype lo = (a - ((DFtype) hi) * HIGH_WORD_COEFF);
5124+
5125+ /* Assemble result from the two parts. */
5126+ return ((UDWtype) hi << WORD_SIZE) | lo;
5127+}
5128+#endif
5129+
5130+#ifdef L_fixsfdi
5131+DWtype
5132+__fixsfdi (SFtype a)
5133+{
5134+ if (a < 0)
5135+ return - __fixunssfDI (-a);
5136+ return __fixunssfDI (a);
5137+}
5138+#endif
5139+
5140+#if defined(L_floatdixf) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
5141+#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
5142+#define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
5143+#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
5144+
5145+XFtype
5146+__floatdixf (DWtype u)
5147+{
5148+ XFtype d = (Wtype) (u >> WORD_SIZE);
5149+ d *= HIGH_HALFWORD_COEFF;
5150+ d *= HIGH_HALFWORD_COEFF;
5151+ d += (UWtype) (u & (HIGH_WORD_COEFF - 1));
5152+
5153+ return d;
5154+}
5155+#endif
5156+
5157+#if defined(L_floatditf) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
5158+#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
5159+#define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
5160+#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
5161+
5162+TFtype
5163+__floatditf (DWtype u)
5164+{
5165+ TFtype d = (Wtype) (u >> WORD_SIZE);
5166+ d *= HIGH_HALFWORD_COEFF;
5167+ d *= HIGH_HALFWORD_COEFF;
5168+ d += (UWtype) (u & (HIGH_WORD_COEFF - 1));
5169+
5170+ return d;
5171+}
5172+#endif
5173+
5174+#ifdef L_floatdidf
5175+#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
5176+#define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
5177+#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
5178+
5179+DFtype
5180+__floatdidf (DWtype u)
5181+{
5182+ DFtype d = (Wtype) (u >> WORD_SIZE);
5183+ d *= HIGH_HALFWORD_COEFF;
5184+ d *= HIGH_HALFWORD_COEFF;
5185+ d += (UWtype) (u & (HIGH_WORD_COEFF - 1));
5186+
5187+ return d;
5188+}
5189+#endif
5190+
5191+#ifdef L_floatdisf
5192+#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
5193+#define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
5194+#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
5195+
5196+#define DI_SIZE (sizeof (DWtype) * BITS_PER_UNIT)
5197+#define DF_SIZE DBL_MANT_DIG
5198+#define SF_SIZE FLT_MANT_DIG
5199+
5200+SFtype
5201+__floatdisf (DWtype u)
5202+{
5203+ /* Protect against double-rounding error.
5204+ Represent any low-order bits, that might be truncated in DFmode,
5205+ by a bit that won't be lost. The bit can go in anywhere below the
5206+ rounding position of the SFmode. A fixed mask and bit position
5207+ handles all usual configurations. It doesn't handle the case
5208+ of 128-bit DImode, however. */
5209+ if (DF_SIZE < DI_SIZE
5210+ && DF_SIZE > (DI_SIZE - DF_SIZE + SF_SIZE))
5211+ {
5212+#define REP_BIT ((UDWtype) 1 << (DI_SIZE - DF_SIZE))
5213+ if (! (- ((DWtype) 1 << DF_SIZE) < u
5214+ && u < ((DWtype) 1 << DF_SIZE)))
5215+ {
5216+ if ((UDWtype) u & (REP_BIT - 1))
5217+ {
5218+ u &= ~ (REP_BIT - 1);
5219+ u |= REP_BIT;
5220+ }
5221+ }
5222+ }
5223+ /* Do the calculation in DFmode
5224+ so that we don't lose any of the precision of the high word
5225+ while multiplying it. */
5226+ DFtype f = (Wtype) (u >> WORD_SIZE);
5227+ f *= HIGH_HALFWORD_COEFF;
5228+ f *= HIGH_HALFWORD_COEFF;
5229+ f += (UWtype) (u & (HIGH_WORD_COEFF - 1));
5230+
5231+ return (SFtype) f;
5232+}
5233+#endif
5234+
5235+#if defined(L_fixunsxfsi) && LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96
5236+/* Reenable the normal types, in case limits.h needs them. */
5237+#undef char
5238+#undef short
5239+#undef int
5240+#undef long
5241+#undef unsigned
5242+#undef float
5243+#undef double
5244+#undef MIN
5245+#undef MAX
5246+#include <limits.h>
5247+
5248+UWtype
5249+__fixunsxfSI (XFtype a)
5250+{
5251+ if (a >= - (DFtype) Wtype_MIN)
5252+ return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
5253+ return (Wtype) a;
5254+}
5255+#endif
5256+
5257+#ifdef L_fixunsdfsi
5258+/* Reenable the normal types, in case limits.h needs them. */
5259+#undef char
5260+#undef short
5261+#undef int
5262+#undef long
5263+#undef unsigned
5264+#undef float
5265+#undef double
5266+#undef MIN
5267+#undef MAX
5268+#include <limits.h>
5269+
5270+UWtype
5271+__fixunsdfSI (DFtype a)
5272+{
5273+ if (a >= - (DFtype) Wtype_MIN)
5274+ return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
5275+ return (Wtype) a;
5276+}
5277+#endif
5278+
5279+#ifdef L_fixunssfsi
5280+/* Reenable the normal types, in case limits.h needs them. */
5281+#undef char
5282+#undef short
5283+#undef int
5284+#undef long
5285+#undef unsigned
5286+#undef float
5287+#undef double
5288+#undef MIN
5289+#undef MAX
5290+#include <limits.h>
5291+
5292+UWtype
5293+__fixunssfSI (SFtype a)
5294+{
5295+ if (a >= - (SFtype) Wtype_MIN)
5296+ return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
5297+ return (Wtype) a;
5298+}
5299+#endif
5300+\f
5301+/* From here on down, the routines use normal data types. */
5302+
5303+#define SItype bogus_type
5304+#define USItype bogus_type
5305+#define DItype bogus_type
5306+#define UDItype bogus_type
5307+#define SFtype bogus_type
5308+#define DFtype bogus_type
5309+#undef Wtype
5310+#undef UWtype
5311+#undef HWtype
5312+#undef UHWtype
5313+#undef DWtype
5314+#undef UDWtype
5315+
5316+#undef char
5317+#undef short
5318+#undef int
5319+#undef long
5320+#undef unsigned
5321+#undef float
5322+#undef double
5323+\f
5324+#ifdef L__gcc_bcmp
5325+
5326+/* Like bcmp except the sign is meaningful.
5327+ Result is negative if S1 is less than S2,
5328+ positive if S1 is greater, 0 if S1 and S2 are equal. */
5329+
5330+int
5331+__gcc_bcmp (const unsigned char *s1, const unsigned char *s2, size_t size)
5332+{
5333+ while (size > 0)
5334+ {
5335+ const unsigned char c1 = *s1++, c2 = *s2++;
5336+ if (c1 != c2)
5337+ return c1 - c2;
5338+ size--;
5339+ }
5340+ return 0;
5341+}
5342+
5343+#endif
5344+\f
5345+/* __eprintf used to be used by GCC's private version of <assert.h>.
5346+ We no longer provide that header, but this routine remains in libgcc.a
5347+ for binary backward compatibility. Note that it is not included in
5348+ the shared version of libgcc. */
5349+#ifdef L_eprintf
5350+#ifndef inhibit_libc
5351+
5352+#undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
5353+#include <stdio.h>
5354+
5355+void
5356+__eprintf (const char *string, const char *expression,
5357+ unsigned int line, const char *filename)
5358+{
5359+ fprintf (stderr, string, expression, line, filename);
5360+ fflush (stderr);
5361+ abort ();
5362+}
5363+
5364+#endif
5365+#endif
5366+
5367+\f
5368+#ifdef L_clear_cache
5369+/* Clear part of an instruction cache. */
5370+
5371+void
5372+__clear_cache (char *beg __attribute__((__unused__)),
5373+ char *end __attribute__((__unused__)))
5374+{
5375+#ifdef CLEAR_INSN_CACHE
5376+ CLEAR_INSN_CACHE (beg, end);
5377+#endif /* CLEAR_INSN_CACHE */
5378+}
5379+
5380+#endif /* L_clear_cache */
5381+\f
5382+#ifdef L_trampoline
5383+
5384+/* Jump to a trampoline, loading the static chain address. */
5385+
5386+#if defined(WINNT) && ! defined(__CYGWIN__) && ! defined (_UWIN)
5387+
5388+long
5389+getpagesize (void)
5390+{
5391+#ifdef _ALPHA_
5392+ return 8192;
5393+#else
5394+ return 4096;
5395+#endif
5396+}
5397+
5398+#ifdef __i386__
5399+extern int VirtualProtect (char *, int, int, int *) __attribute__((stdcall));
5400+#endif
5401+
5402+int
5403+mprotect (char *addr, int len, int prot)
5404+{
5405+ int np, op;
5406+
5407+ if (prot == 7)
5408+ np = 0x40;
5409+ else if (prot == 5)
5410+ np = 0x20;
5411+ else if (prot == 4)
5412+ np = 0x10;
5413+ else if (prot == 3)
5414+ np = 0x04;
5415+ else if (prot == 1)
5416+ np = 0x02;
5417+ else if (prot == 0)
5418+ np = 0x01;
5419+
5420+ if (VirtualProtect (addr, len, np, &op))
5421+ return 0;
5422+ else
5423+ return -1;
5424+}
5425+
5426+#endif /* WINNT && ! __CYGWIN__ && ! _UWIN */
5427+
5428+#ifdef TRANSFER_FROM_TRAMPOLINE
5429+TRANSFER_FROM_TRAMPOLINE
5430+#endif
5431+#endif /* L_trampoline */
5432+\f
5433+#ifndef __CYGWIN__
5434+#ifdef L__main
5435+
5436+#include "gbl-ctors.h"
5437+/* Some systems use __main in a way incompatible with its use in gcc, in these
5438+ cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
5439+ give the same symbol without quotes for an alternative entry point. You
5440+ must define both, or neither. */
5441+#ifndef NAME__MAIN
5442+#define NAME__MAIN "__main"
5443+#define SYMBOL__MAIN __main
5444+#endif
5445+
5446+#ifdef INIT_SECTION_ASM_OP
5447+#undef HAS_INIT_SECTION
5448+#define HAS_INIT_SECTION
5449+#endif
5450+
5451+#if !defined (HAS_INIT_SECTION) || !defined (OBJECT_FORMAT_ELF)
5452+
5453+/* Some ELF crosses use crtstuff.c to provide __CTOR_LIST__, but use this
5454+ code to run constructors. In that case, we need to handle EH here, too. */
5455+
5456+#ifdef EH_FRAME_SECTION_NAME
5457+#include "unwind-dw2-fde.h"
5458+extern unsigned char __EH_FRAME_BEGIN__[];
5459+#endif
5460+
5461+/* Run all the global destructors on exit from the program. */
5462+
5463+void
5464+__do_global_dtors (void)
5465+{
5466+#ifdef DO_GLOBAL_DTORS_BODY
5467+ DO_GLOBAL_DTORS_BODY;
5468+#else
5469+ static func_ptr *p = __DTOR_LIST__ + 1;
5470+ while (*p)
5471+ {
5472+ p++;
5473+ (*(p-1)) ();
5474+ }
5475+#endif
5476+#if defined (EH_FRAME_SECTION_NAME) && !defined (HAS_INIT_SECTION)
5477+ {
5478+ static int completed = 0;
5479+ if (! completed)
5480+ {
5481+ completed = 1;
5482+ __deregister_frame_info (__EH_FRAME_BEGIN__);
5483+ }
5484+ }
5485+#endif
5486+}
5487+#endif
5488+
5489+#ifndef HAS_INIT_SECTION
5490+/* Run all the global constructors on entry to the program. */
5491+
5492+void
5493+__do_global_ctors (void)
5494+{
5495+#ifdef EH_FRAME_SECTION_NAME
5496+ {
5497+ static struct object object;
5498+ __register_frame_info (__EH_FRAME_BEGIN__, &object);
5499+ }
5500+#endif
5501+ DO_GLOBAL_CTORS_BODY;
5502+ atexit (__do_global_dtors);
5503+}
5504+#endif /* no HAS_INIT_SECTION */
5505+
5506+#if !defined (HAS_INIT_SECTION) || defined (INVOKE__main)
5507+/* Subroutine called automatically by `main'.
5508+ Compiling a global function named `main'
5509+ produces an automatic call to this function at the beginning.
5510+
5511+ For many systems, this routine calls __do_global_ctors.
5512+ For systems which support a .init section we use the .init section
5513+ to run __do_global_ctors, so we need not do anything here. */
5514+
5515+extern void SYMBOL__MAIN (void);
5516+void
5517+SYMBOL__MAIN (void)
5518+{
5519+ /* Support recursive calls to `main': run initializers just once. */
5520+ static int initialized;
5521+ if (! initialized)
5522+ {
5523+ initialized = 1;
5524+ __do_global_ctors ();
5525+ }
5526+}
5527+#endif /* no HAS_INIT_SECTION or INVOKE__main */
5528+
5529+#endif /* L__main */
5530+#endif /* __CYGWIN__ */
5531+\f
5532+#ifdef L_ctors
5533+
5534+#include "gbl-ctors.h"
5535+
5536+/* Provide default definitions for the lists of constructors and
5537+ destructors, so that we don't get linker errors. These symbols are
5538+ intentionally bss symbols, so that gld and/or collect will provide
5539+ the right values. */
5540+
5541+/* We declare the lists here with two elements each,
5542+ so that they are valid empty lists if no other definition is loaded.
5543+
5544+ If we are using the old "set" extensions to have the gnu linker
5545+ collect ctors and dtors, then we __CTOR_LIST__ and __DTOR_LIST__
5546+ must be in the bss/common section.
5547+
5548+ Long term no port should use those extensions. But many still do. */
5549+#if !defined(INIT_SECTION_ASM_OP) && !defined(CTOR_LISTS_DEFINED_EXTERNALLY)
5550+#if defined (TARGET_ASM_CONSTRUCTOR) || defined (USE_COLLECT2)
5551+func_ptr __CTOR_LIST__[2] = {0, 0};
5552+func_ptr __DTOR_LIST__[2] = {0, 0};
5553+#else
5554+func_ptr __CTOR_LIST__[2];
5555+func_ptr __DTOR_LIST__[2];
5556+#endif
5557+#endif /* no INIT_SECTION_ASM_OP and not CTOR_LISTS_DEFINED_EXTERNALLY */
5558+#endif /* L_ctors */
5559+
5560--- ./gcc/gcc/libgcc2.h
5561+++ ./gcc/gcc/libgcc2.h
5562@@ -0,0 +1,310 @@
5563+/* Header file for libgcc2.c. */
5564+/* Copyright (C) 2000, 2001
5565+ Free Software Foundation, Inc.
5566+
5567+This file is part of GCC.
5568+
5569+GCC is free software; you can redistribute it and/or modify it under
5570+the terms of the GNU General Public License as published by the Free
5571+Software Foundation; either version 2, or (at your option) any later
5572+version.
5573+
5574+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
5575+WARRANTY; without even the implied warranty of MERCHANTABILITY or
5576+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
5577+for more details.
5578+
5579+You should have received a copy of the GNU General Public License
5580+along with GCC; see the file COPYING. If not, write to the Free
5581+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
5582+02111-1307, USA. */
5583+
5584+/* As a special exception, if you link this library with other files,
5585+ some of which are compiled with GCC, to produce an executable,
5586+ this library does not by itself cause the resulting executable
5587+ to be covered by the GNU General Public License.
5588+ This exception does not however invalidate any other reasons why
5589+ the executable file might be covered by the GNU General Public License. */
5590+
5591+
5592+#ifndef GCC_LIBGCC2_H
5593+#define GCC_LIBGCC2_H
5594+
5595+extern int __gcc_bcmp (const unsigned char *, const unsigned char *, size_t);
5596+extern void __clear_cache (char *, char *);
5597+extern void __eprintf (const char *, const char *, unsigned int, const char *)
5598+ __attribute__ ((__noreturn__));
5599+
5600+struct exception_descriptor;
5601+extern short int __get_eh_table_language (struct exception_descriptor *);
5602+extern short int __get_eh_table_version (struct exception_descriptor *);
5603+
5604+/* Permit the tm.h file to select the endianness to use just for this
5605+ file. This is used when the endianness is determined when the
5606+ compiler is run. */
5607+
5608+#ifndef LIBGCC2_WORDS_BIG_ENDIAN
5609+#define LIBGCC2_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
5610+#endif
5611+
5612+#ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE
5613+#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE
5614+#endif
5615+
5616+#ifndef MIN_UNITS_PER_WORD
5617+#define MIN_UNITS_PER_WORD UNITS_PER_WORD
5618+#endif
5619+
5620+/* In the first part of this file, we are interfacing to calls generated
5621+ by the compiler itself. These calls pass values into these routines
5622+ which have very specific modes (rather than very specific types), and
5623+ these compiler-generated calls also expect any return values to have
5624+ very specific modes (rather than very specific types). Thus, we need
5625+ to avoid using regular C language type names in this part of the file
5626+ because the sizes for those types can be configured to be anything.
5627+ Instead we use the following special type names. */
5628+
5629+typedef int QItype __attribute__ ((mode (QI)));
5630+typedef unsigned int UQItype __attribute__ ((mode (QI)));
5631+typedef int HItype __attribute__ ((mode (HI)));
5632+typedef unsigned int UHItype __attribute__ ((mode (HI)));
5633+#if MIN_UNITS_PER_WORD > 1
5634+/* These typedefs are usually forbidden on dsp's with UNITS_PER_WORD 1. */
5635+typedef int SItype __attribute__ ((mode (SI)));
5636+typedef unsigned int USItype __attribute__ ((mode (SI)));
5637+#if LONG_LONG_TYPE_SIZE > 32
5638+/* These typedefs are usually forbidden on archs with UNITS_PER_WORD 2. */
5639+typedef int DItype __attribute__ ((mode (DI)));
5640+typedef unsigned int UDItype __attribute__ ((mode (DI)));
5641+#if MIN_UNITS_PER_WORD > 4
5642+/* These typedefs are usually forbidden on archs with UNITS_PER_WORD 4. */
5643+typedef int TItype __attribute__ ((mode (TI)));
5644+typedef unsigned int UTItype __attribute__ ((mode (TI)));
5645+#endif
5646+#endif
5647+#endif
5648+
5649+#if BITS_PER_UNIT == 8
5650+
5651+typedef float SFtype __attribute__ ((mode (SF)));
5652+typedef float DFtype __attribute__ ((mode (DF)));
5653+
5654+#if LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96
5655+typedef float XFtype __attribute__ ((mode (XF)));
5656+#endif
5657+#if LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128
5658+typedef float TFtype __attribute__ ((mode (TF)));
5659+#endif
5660+
5661+#else /* BITS_PER_UNIT != 8 */
5662+
5663+/* On dsp's there are usually qf/hf/tqf modes used instead of the above.
5664+ For now we don't support them in libgcc2.c. */
5665+
5666+#undef L_fixdfdi
5667+#undef L_fixsfdi
5668+#undef L_fixtfdi
5669+#undef L_fixunsdfdi
5670+#undef L_fixunsdfsi
5671+#undef L_fixunssfdi
5672+#undef L_fixunssfsi
5673+#undef L_fixunstfdi
5674+#undef L_fixunsxfdi
5675+#undef L_fixunsxfsi
5676+#undef L_fixxfdi
5677+#undef L_floatdidf
5678+#undef L_floatdisf
5679+#undef L_floatditf
5680+#undef L_floatdixf
5681+
5682+#endif /* BITS_PER_UNIT != 8 */
5683+
5684+typedef int word_type __attribute__ ((mode (__word__)));
5685+
5686+/* Make sure that we don't accidentally use any normal C language built-in
5687+ type names in the first part of this file. Instead we want to use *only*
5688+ the type names defined above. The following macro definitions insure
5689+ that if we *do* accidentally use some normal C language built-in type name,
5690+ we will get a syntax error. */
5691+
5692+#define char bogus_type
5693+#define short bogus_type
5694+#define int bogus_type
5695+#define long bogus_type
5696+#define unsigned bogus_type
5697+#define float bogus_type
5698+#define double bogus_type
5699+
5700+#if MIN_UNITS_PER_WORD > 4
5701+#define W_TYPE_SIZE (8 * BITS_PER_UNIT)
5702+#define Wtype DItype
5703+#define UWtype UDItype
5704+#define HWtype DItype
5705+#define UHWtype UDItype
5706+#define DWtype TItype
5707+#define UDWtype UTItype
5708+#define __NW(a,b) __ ## a ## di ## b
5709+#define __NDW(a,b) __ ## a ## ti ## b
5710+#elif MIN_UNITS_PER_WORD > 2 \
5711+ || (MIN_UNITS_PER_WORD > 1 && LONG_LONG_TYPE_SIZE > 32)
5712+#define W_TYPE_SIZE (4 * BITS_PER_UNIT)
5713+#define Wtype SItype
5714+#define UWtype USItype
5715+#define HWtype SItype
5716+#define UHWtype USItype
5717+#define DWtype DItype
5718+#define UDWtype UDItype
5719+#define __NW(a,b) __ ## a ## si ## b
5720+#define __NDW(a,b) __ ## a ## di ## b
5721+#elif MIN_UNITS_PER_WORD > 1
5722+#define W_TYPE_SIZE (2 * BITS_PER_UNIT)
5723+#define Wtype HItype
5724+#define UWtype UHItype
5725+#define HWtype HItype
5726+#define UHWtype UHItype
5727+#define DWtype SItype
5728+#define UDWtype USItype
5729+#define __NW(a,b) __ ## a ## hi ## b
5730+#define __NDW(a,b) __ ## a ## si ## b
5731+#else
5732+#define W_TYPE_SIZE BITS_PER_UNIT
5733+#define Wtype QItype
5734+#define UWtype UQItype
5735+#define HWtype QItype
5736+#define UHWtype UQItype
5737+#define DWtype HItype
5738+#define UDWtype UHItype
5739+#define __NW(a,b) __ ## a ## qi ## b
5740+#define __NDW(a,b) __ ## a ## hi ## b
5741+#endif
5742+
5743+#define Wtype_MAX ((Wtype)(((UWtype)1 << (W_TYPE_SIZE - 1)) - 1))
5744+#define Wtype_MIN (- Wtype_MAX - 1)
5745+
5746+#define __muldi3 __NDW(mul,3)
5747+#define __divdi3 __NDW(div,3)
5748+#define __udivdi3 __NDW(udiv,3)
5749+#define __moddi3 __NDW(mod,3)
5750+#define __umoddi3 __NDW(umod,3)
5751+#define __negdi2 __NDW(neg,2)
5752+#define __lshrdi3 __NDW(lshr,3)
5753+#define __ashldi3 __NDW(ashl,3)
5754+#define __ashrdi3 __NDW(ashr,3)
5755+#define __cmpdi2 __NDW(cmp,2)
5756+#define __ucmpdi2 __NDW(ucmp,2)
5757+#define __udivmoddi4 __NDW(udivmod,4)
5758+#define __fixunstfDI __NDW(fixunstf,)
5759+#define __fixtfdi __NDW(fixtf,)
5760+#define __fixunsxfDI __NDW(fixunsxf,)
5761+#define __fixxfdi __NDW(fixxf,)
5762+#define __fixunsdfDI __NDW(fixunsdf,)
5763+#define __fixdfdi __NDW(fixdf,)
5764+#define __fixunssfDI __NDW(fixunssf,)
5765+#define __fixsfdi __NDW(fixsf,)
5766+#define __floatdixf __NDW(float,xf)
5767+#define __floatditf __NDW(float,tf)
5768+#define __floatdidf __NDW(float,df)
5769+#define __floatdisf __NDW(float,sf)
5770+#define __fixunsxfSI __NW(fixunsxf,)
5771+#define __fixunstfSI __NW(fixunstf,)
5772+#define __fixunsdfSI __NW(fixunsdf,)
5773+#define __fixunssfSI __NW(fixunssf,)
5774+
5775+#define __ffsSI2 __NW(ffs,2)
5776+#define __clzSI2 __NW(clz,2)
5777+#define __ctzSI2 __NW(ctz,2)
5778+#define __popcountSI2 __NW(popcount,2)
5779+#define __paritySI2 __NW(parity,2)
5780+#define __ffsDI2 __NDW(ffs,2)
5781+#define __clzDI2 __NDW(clz,2)
5782+#define __ctzDI2 __NDW(ctz,2)
5783+#define __popcountDI2 __NDW(popcount,2)
5784+#define __parityDI2 __NDW(parity,2)
5785+
5786+extern DWtype __muldi3 (DWtype, DWtype);
5787+extern DWtype __divdi3 (DWtype, DWtype);
5788+extern UDWtype __udivdi3 (UDWtype, UDWtype);
5789+extern UDWtype __umoddi3 (UDWtype, UDWtype);
5790+extern DWtype __moddi3 (DWtype, DWtype);
5791+
5792+/* __udivmoddi4 is static inline when building other libgcc2 portions. */
5793+#if (!defined (L_udivdi3) && !defined (L_divdi3) && \
5794+ !defined (L_umoddi3) && !defined (L_moddi3))
5795+extern UDWtype __udivmoddi4 (UDWtype, UDWtype, UDWtype *);
5796+#endif
5797+
5798+/* __negdi2 is static inline when building other libgcc2 portions. */
5799+#if !defined(L_divdi3) && !defined(L_moddi3)
5800+extern DWtype __negdi2 (DWtype);
5801+#endif
5802+
5803+extern DWtype __lshrdi3 (DWtype, word_type);
5804+extern DWtype __ashldi3 (DWtype, word_type);
5805+extern DWtype __ashrdi3 (DWtype, word_type);
5806+
5807+/* __udiv_w_sdiv is static inline when building other libgcc2 portions. */
5808+#if (!defined(L_udivdi3) && !defined(L_divdi3) && \
5809+ !defined(L_umoddi3) && !defined(L_moddi3))
5810+extern UWtype __udiv_w_sdiv (UWtype *, UWtype, UWtype, UWtype);
5811+#endif
5812+
5813+extern word_type __cmpdi2 (DWtype, DWtype);
5814+extern word_type __ucmpdi2 (DWtype, DWtype);
5815+
5816+extern Wtype __absvsi2 (Wtype);
5817+extern DWtype __absvdi2 (DWtype);
5818+extern Wtype __addvsi3 (Wtype, Wtype);
5819+extern DWtype __addvdi3 (DWtype, DWtype);
5820+extern Wtype __subvsi3 (Wtype, Wtype);
5821+extern DWtype __subvdi3 (DWtype, DWtype);
5822+extern Wtype __mulvsi3 (Wtype, Wtype);
5823+extern DWtype __mulvdi3 (DWtype, DWtype);
5824+extern Wtype __negvsi2 (Wtype);
5825+extern DWtype __negvdi2 (DWtype);
5826+
5827+#if BITS_PER_UNIT == 8
5828+extern DWtype __fixdfdi (DFtype);
5829+extern DWtype __fixsfdi (SFtype);
5830+extern DFtype __floatdidf (DWtype);
5831+extern SFtype __floatdisf (DWtype);
5832+extern UWtype __fixunsdfSI (DFtype);
5833+extern UWtype __fixunssfSI (SFtype);
5834+extern DWtype __fixunsdfDI (DFtype);
5835+extern DWtype __fixunssfDI (SFtype);
5836+
5837+#if LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96
5838+extern DWtype __fixxfdi (XFtype);
5839+extern DWtype __fixunsxfDI (XFtype);
5840+extern XFtype __floatdixf (DWtype);
5841+extern UWtype __fixunsxfSI (XFtype);
5842+#endif
5843+
5844+#if LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128
5845+extern DWtype __fixunstfDI (TFtype);
5846+extern DWtype __fixtfdi (TFtype);
5847+extern TFtype __floatditf (DWtype);
5848+#endif
5849+#endif /* BITS_PER_UNIT == 8 */
5850+
5851+/* DWstructs are pairs of Wtype values in the order determined by
5852+ LIBGCC2_WORDS_BIG_ENDIAN. */
5853+
5854+#if LIBGCC2_WORDS_BIG_ENDIAN
5855+ struct DWstruct {Wtype high, low;};
5856+#else
5857+ struct DWstruct {Wtype low, high;};
5858+#endif
5859+
5860+/* We need this union to unpack/pack DImode values, since we don't have
5861+ any arithmetic yet. Incoming DImode parameters are stored into the
5862+ `ll' field, and the unpacked result is read from the struct `s'. */
5863+
5864+typedef union
5865+{
5866+ struct DWstruct s;
5867+ DWtype ll;
5868+} DWunion;
5869+
5870+#include "longlong.h"
5871+
5872+#endif /* ! GCC_LIBGCC2_H */
5873--- ./gcc/gcc/longlong.h
5874+++ ./gcc/gcc/longlong.h
5875@@ -0,0 +1,1360 @@
5876+/* longlong.h -- definitions for mixed size 32/64 bit arithmetic.
5877+ Copyright (C) 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000
5878+ Free Software Foundation, Inc.
5879+
5880+ This definition file is free software; you can redistribute it
5881+ and/or modify it under the terms of the GNU General Public
5882+ License as published by the Free Software Foundation; either
5883+ version 2, or (at your option) any later version.
5884+
5885+ This definition file is distributed in the hope that it will be
5886+ useful, but WITHOUT ANY WARRANTY; without even the implied
5887+ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5888+ See the GNU General Public License for more details.
5889+
5890+ You should have received a copy of the GNU General Public License
5891+ along with this program; if not, write to the Free Software
5892+ Foundation, Inc., 59 Temple Place - Suite 330,
5893+ Boston, MA 02111-1307, USA. */
5894+
5895+/* You have to define the following before including this file:
5896+
5897+ UWtype -- An unsigned type, default type for operations (typically a "word")
5898+ UHWtype -- An unsigned type, at least half the size of UWtype.
5899+ UDWtype -- An unsigned type, at least twice as large a UWtype
5900+ W_TYPE_SIZE -- size in bits of UWtype
5901+
5902+ UQItype -- Unsigned 8 bit type.
5903+ SItype, USItype -- Signed and unsigned 32 bit types.
5904+ DItype, UDItype -- Signed and unsigned 64 bit types.
5905+
5906+ On a 32 bit machine UWtype should typically be USItype;
5907+ on a 64 bit machine, UWtype should typically be UDItype.
5908+*/
5909+
5910+#define __BITS4 (W_TYPE_SIZE / 4)
5911+#define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2))
5912+#define __ll_lowpart(t) ((UWtype) (t) & (__ll_B - 1))
5913+#define __ll_highpart(t) ((UWtype) (t) >> (W_TYPE_SIZE / 2))
5914+
5915+#ifndef W_TYPE_SIZE
5916+#define W_TYPE_SIZE 32
5917+#define UWtype USItype
5918+#define UHWtype USItype
5919+#define UDWtype UDItype
5920+#endif
5921+
5922+/* Define auxiliary asm macros.
5923+
5924+ 1) umul_ppmm(high_prod, low_prod, multipler, multiplicand) multiplies two
5925+ UWtype integers MULTIPLER and MULTIPLICAND, and generates a two UWtype
5926+ word product in HIGH_PROD and LOW_PROD.
5927+
5928+ 2) __umulsidi3(a,b) multiplies two UWtype integers A and B, and returns a
5929+ UDWtype product. This is just a variant of umul_ppmm.
5930+
5931+ 3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
5932+ denominator) divides a UDWtype, composed by the UWtype integers
5933+ HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and places the quotient
5934+ in QUOTIENT and the remainder in REMAINDER. HIGH_NUMERATOR must be less
5935+ than DENOMINATOR for correct operation. If, in addition, the most
5936+ significant bit of DENOMINATOR must be 1, then the pre-processor symbol
5937+ UDIV_NEEDS_NORMALIZATION is defined to 1.
5938+
5939+ 4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
5940+ denominator). Like udiv_qrnnd but the numbers are signed. The quotient
5941+ is rounded towards 0.
5942+
5943+ 5) count_leading_zeros(count, x) counts the number of zero-bits from the
5944+ msb to the first nonzero bit in the UWtype X. This is the number of
5945+ steps X needs to be shifted left to set the msb. Undefined for X == 0,
5946+ unless the symbol COUNT_LEADING_ZEROS_0 is defined to some value.
5947+
5948+ 6) count_trailing_zeros(count, x) like count_leading_zeros, but counts
5949+ from the least significant end.
5950+
5951+ 7) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1,
5952+ high_addend_2, low_addend_2) adds two UWtype integers, composed by
5953+ HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and LOW_ADDEND_2
5954+ respectively. The result is placed in HIGH_SUM and LOW_SUM. Overflow
5955+ (i.e. carry out) is not stored anywhere, and is lost.
5956+
5957+ 8) sub_ddmmss(high_difference, low_difference, high_minuend, low_minuend,
5958+ high_subtrahend, low_subtrahend) subtracts two two-word UWtype integers,
5959+ composed by HIGH_MINUEND_1 and LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and
5960+ LOW_SUBTRAHEND_2 respectively. The result is placed in HIGH_DIFFERENCE
5961+ and LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere,
5962+ and is lost.
5963+
5964+ If any of these macros are left undefined for a particular CPU,
5965+ C macros are used. */
5966+
5967+/* The CPUs come in alphabetical order below.
5968+
5969+ Please add support for more CPUs here, or improve the current support
5970+ for the CPUs below!
5971+ (E.g. WE32100, IBM360.) */
5972+
5973+#if defined (__GNUC__) && !defined (NO_ASM)
5974+
5975+/* We sometimes need to clobber "cc" with gcc2, but that would not be
5976+ understood by gcc1. Use cpp to avoid major code duplication. */
5977+#if __GNUC__ < 2
5978+#define __CLOBBER_CC
5979+#define __AND_CLOBBER_CC
5980+#else /* __GNUC__ >= 2 */
5981+#define __CLOBBER_CC : "cc"
5982+#define __AND_CLOBBER_CC , "cc"
5983+#endif /* __GNUC__ < 2 */
5984+
5985+#if defined (__alpha) && W_TYPE_SIZE == 64
5986+#define umul_ppmm(ph, pl, m0, m1) \
5987+ do { \
5988+ UDItype __m0 = (m0), __m1 = (m1); \
5989+ (ph) = __builtin_alpha_umulh (__m0, __m1); \
5990+ (pl) = __m0 * __m1; \
5991+ } while (0)
5992+#define UMUL_TIME 46
5993+#ifndef LONGLONG_STANDALONE
5994+#define udiv_qrnnd(q, r, n1, n0, d) \
5995+ do { UDItype __r; \
5996+ (q) = __udiv_qrnnd (&__r, (n1), (n0), (d)); \
5997+ (r) = __r; \
5998+ } while (0)
5999+extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
6000+#define UDIV_TIME 220
6001+#endif /* LONGLONG_STANDALONE */
6002+#ifdef __alpha_cix__
6003+#define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clzl (X))
6004+#define count_trailing_zeros(COUNT,X) ((COUNT) = __builtin_ctzl (X))
6005+#define COUNT_LEADING_ZEROS_0 64
6006+#else
6007+extern const UQItype __clz_tab[] ATTRIBUTE_HIDDEN;
6008+#define count_leading_zeros(COUNT,X) \
6009+ do { \
6010+ UDItype __xr = (X), __t, __a; \
6011+ __t = __builtin_alpha_cmpbge (0, __xr); \
6012+ __a = __clz_tab[__t ^ 0xff] - 1; \
6013+ __t = __builtin_alpha_extbl (__xr, __a); \
6014+ (COUNT) = 64 - (__clz_tab[__t] + __a*8); \
6015+ } while (0)
6016+#define count_trailing_zeros(COUNT,X) \
6017+ do { \
6018+ UDItype __xr = (X), __t, __a; \
6019+ __t = __builtin_alpha_cmpbge (0, __xr); \
6020+ __t = ~__t & -~__t; \
6021+ __a = ((__t & 0xCC) != 0) * 2; \
6022+ __a += ((__t & 0xF0) != 0) * 4; \
6023+ __a += ((__t & 0xAA) != 0); \
6024+ __t = __builtin_alpha_extbl (__xr, __a); \
6025+ __a <<= 3; \
6026+ __t &= -__t; \
6027+ __a += ((__t & 0xCC) != 0) * 2; \
6028+ __a += ((__t & 0xF0) != 0) * 4; \
6029+ __a += ((__t & 0xAA) != 0); \
6030+ (COUNT) = __a; \
6031+ } while (0)
6032+#endif /* __alpha_cix__ */
6033+#endif /* __alpha */
6034+
6035+#if defined (__arc__) && W_TYPE_SIZE == 32
6036+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
6037+ __asm__ ("add.f %1, %4, %5\n\tadc %0, %2, %3" \
6038+ : "=r" ((USItype) (sh)), \
6039+ "=&r" ((USItype) (sl)) \
6040+ : "%r" ((USItype) (ah)), \
6041+ "rIJ" ((USItype) (bh)), \
6042+ "%r" ((USItype) (al)), \
6043+ "rIJ" ((USItype) (bl)))
6044+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
6045+ __asm__ ("sub.f %1, %4, %5\n\tsbc %0, %2, %3" \
6046+ : "=r" ((USItype) (sh)), \
6047+ "=&r" ((USItype) (sl)) \
6048+ : "r" ((USItype) (ah)), \
6049+ "rIJ" ((USItype) (bh)), \
6050+ "r" ((USItype) (al)), \
6051+ "rIJ" ((USItype) (bl)))
6052+/* Call libgcc routine. */
6053+#define umul_ppmm(w1, w0, u, v) \
6054+do { \
6055+ DWunion __w; \
6056+ __w.ll = __umulsidi3 (u, v); \
6057+ w1 = __w.s.high; \
6058+ w0 = __w.s.low; \
6059+} while (0)
6060+#define __umulsidi3 __umulsidi3
6061+UDItype __umulsidi3 (USItype, USItype);
6062+#endif
6063+
6064+#if defined (__arm__) && W_TYPE_SIZE == 32
6065+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
6066+ __asm__ ("adds %1, %4, %5\n\tadc %0, %2, %3" \
6067+ : "=r" ((USItype) (sh)), \
6068+ "=&r" ((USItype) (sl)) \
6069+ : "%r" ((USItype) (ah)), \
6070+ "rI" ((USItype) (bh)), \
6071+ "%r" ((USItype) (al)), \
6072+ "rI" ((USItype) (bl)))
6073+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
6074+ __asm__ ("subs %1, %4, %5\n\tsbc %0, %2, %3" \
6075+ : "=r" ((USItype) (sh)), \
6076+ "=&r" ((USItype) (sl)) \
6077+ : "r" ((USItype) (ah)), \
6078+ "rI" ((USItype) (bh)), \
6079+ "r" ((USItype) (al)), \
6080+ "rI" ((USItype) (bl)))
6081+#define umul_ppmm(xh, xl, a, b) \
6082+{register USItype __t0, __t1, __t2; \
6083+ __asm__ ("%@ Inlined umul_ppmm\n" \
6084+ " mov %2, %5, lsr #16\n" \
6085+ " mov %0, %6, lsr #16\n" \
6086+ " bic %3, %5, %2, lsl #16\n" \
6087+ " bic %4, %6, %0, lsl #16\n" \
6088+ " mul %1, %3, %4\n" \
6089+ " mul %4, %2, %4\n" \
6090+ " mul %3, %0, %3\n" \
6091+ " mul %0, %2, %0\n" \
6092+ " adds %3, %4, %3\n" \
6093+ " addcs %0, %0, #65536\n" \
6094+ " adds %1, %1, %3, lsl #16\n" \
6095+ " adc %0, %0, %3, lsr #16" \
6096+ : "=&r" ((USItype) (xh)), \
6097+ "=r" ((USItype) (xl)), \
6098+ "=&r" (__t0), "=&r" (__t1), "=r" (__t2) \
6099+ : "r" ((USItype) (a)), \
6100+ "r" ((USItype) (b)));}
6101+#define UMUL_TIME 20
6102+#define UDIV_TIME 100
6103+#endif /* __arm__ */
6104+
6105+#if defined (__hppa) && W_TYPE_SIZE == 32
6106+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
6107+ __asm__ ("add %4,%5,%1\n\taddc %2,%3,%0" \
6108+ : "=r" ((USItype) (sh)), \
6109+ "=&r" ((USItype) (sl)) \
6110+ : "%rM" ((USItype) (ah)), \
6111+ "rM" ((USItype) (bh)), \
6112+ "%rM" ((USItype) (al)), \
6113+ "rM" ((USItype) (bl)))
6114+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
6115+ __asm__ ("sub %4,%5,%1\n\tsubb %2,%3,%0" \
6116+ : "=r" ((USItype) (sh)), \
6117+ "=&r" ((USItype) (sl)) \
6118+ : "rM" ((USItype) (ah)), \
6119+ "rM" ((USItype) (bh)), \
6120+ "rM" ((USItype) (al)), \
6121+ "rM" ((USItype) (bl)))
6122+#if defined (_PA_RISC1_1)
6123+#define umul_ppmm(w1, w0, u, v) \
6124+ do { \
6125+ union \
6126+ { \
6127+ UDItype __f; \
6128+ struct {USItype __w1, __w0;} __w1w0; \
6129+ } __t; \
6130+ __asm__ ("xmpyu %1,%2,%0" \
6131+ : "=x" (__t.__f) \
6132+ : "x" ((USItype) (u)), \
6133+ "x" ((USItype) (v))); \
6134+ (w1) = __t.__w1w0.__w1; \
6135+ (w0) = __t.__w1w0.__w0; \
6136+ } while (0)
6137+#define UMUL_TIME 8
6138+#else
6139+#define UMUL_TIME 30
6140+#endif
6141+#define UDIV_TIME 40
6142+#define count_leading_zeros(count, x) \
6143+ do { \
6144+ USItype __tmp; \
6145+ __asm__ ( \
6146+ "ldi 1,%0\n" \
6147+" extru,= %1,15,16,%%r0 ; Bits 31..16 zero?\n" \
6148+" extru,tr %1,15,16,%1 ; No. Shift down, skip add.\n"\
6149+" ldo 16(%0),%0 ; Yes. Perform add.\n" \
6150+" extru,= %1,23,8,%%r0 ; Bits 15..8 zero?\n" \
6151+" extru,tr %1,23,8,%1 ; No. Shift down, skip add.\n"\
6152+" ldo 8(%0),%0 ; Yes. Perform add.\n" \
6153+" extru,= %1,27,4,%%r0 ; Bits 7..4 zero?\n" \
6154+" extru,tr %1,27,4,%1 ; No. Shift down, skip add.\n"\
6155+" ldo 4(%0),%0 ; Yes. Perform add.\n" \
6156+" extru,= %1,29,2,%%r0 ; Bits 3..2 zero?\n" \
6157+" extru,tr %1,29,2,%1 ; No. Shift down, skip add.\n"\
6158+" ldo 2(%0),%0 ; Yes. Perform add.\n" \
6159+" extru %1,30,1,%1 ; Extract bit 1.\n" \
6160+" sub %0,%1,%0 ; Subtract it.\n" \
6161+ : "=r" (count), "=r" (__tmp) : "1" (x)); \
6162+ } while (0)
6163+#endif
6164+
6165+#if (defined (__i370__) || defined (__s390__) || defined (__mvs__)) && W_TYPE_SIZE == 32
6166+#define smul_ppmm(xh, xl, m0, m1) \
6167+ do { \
6168+ union {DItype __ll; \
6169+ struct {USItype __h, __l;} __i; \
6170+ } __x; \
6171+ __asm__ ("lr %N0,%1\n\tmr %0,%2" \
6172+ : "=&r" (__x.__ll) \
6173+ : "r" (m0), "r" (m1)); \
6174+ (xh) = __x.__i.__h; (xl) = __x.__i.__l; \
6175+ } while (0)
6176+#define sdiv_qrnnd(q, r, n1, n0, d) \
6177+ do { \
6178+ union {DItype __ll; \
6179+ struct {USItype __h, __l;} __i; \
6180+ } __x; \
6181+ __x.__i.__h = n1; __x.__i.__l = n0; \
6182+ __asm__ ("dr %0,%2" \
6183+ : "=r" (__x.__ll) \
6184+ : "0" (__x.__ll), "r" (d)); \
6185+ (q) = __x.__i.__l; (r) = __x.__i.__h; \
6186+ } while (0)
6187+#endif
6188+
6189+#if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32
6190+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
6191+ __asm__ ("addl %5,%1\n\tadcl %3,%0" \
6192+ : "=r" ((USItype) (sh)), \
6193+ "=&r" ((USItype) (sl)) \
6194+ : "%0" ((USItype) (ah)), \
6195+ "g" ((USItype) (bh)), \
6196+ "%1" ((USItype) (al)), \
6197+ "g" ((USItype) (bl)))
6198+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
6199+ __asm__ ("subl %5,%1\n\tsbbl %3,%0" \
6200+ : "=r" ((USItype) (sh)), \
6201+ "=&r" ((USItype) (sl)) \
6202+ : "0" ((USItype) (ah)), \
6203+ "g" ((USItype) (bh)), \
6204+ "1" ((USItype) (al)), \
6205+ "g" ((USItype) (bl)))
6206+#define umul_ppmm(w1, w0, u, v) \
6207+ __asm__ ("mull %3" \
6208+ : "=a" ((USItype) (w0)), \
6209+ "=d" ((USItype) (w1)) \
6210+ : "%0" ((USItype) (u)), \
6211+ "rm" ((USItype) (v)))
6212+#define udiv_qrnnd(q, r, n1, n0, dv) \
6213+ __asm__ ("divl %4" \
6214+ : "=a" ((USItype) (q)), \
6215+ "=d" ((USItype) (r)) \
6216+ : "0" ((USItype) (n0)), \
6217+ "1" ((USItype) (n1)), \
6218+ "rm" ((USItype) (dv)))
6219+#define count_leading_zeros(count, x) \
6220+ do { \
6221+ USItype __cbtmp; \
6222+ __asm__ ("bsrl %1,%0" \
6223+ : "=r" (__cbtmp) : "rm" ((USItype) (x))); \
6224+ (count) = __cbtmp ^ 31; \
6225+ } while (0)
6226+#define count_trailing_zeros(count, x) \
6227+ __asm__ ("bsfl %1,%0" : "=r" (count) : "rm" ((USItype)(x)))
6228+#define UMUL_TIME 40
6229+#define UDIV_TIME 40
6230+#endif /* 80x86 */
6231+
6232+#if defined (__i960__) && W_TYPE_SIZE == 32
6233+#define umul_ppmm(w1, w0, u, v) \
6234+ ({union {UDItype __ll; \
6235+ struct {USItype __l, __h;} __i; \
6236+ } __xx; \
6237+ __asm__ ("emul %2,%1,%0" \
6238+ : "=d" (__xx.__ll) \
6239+ : "%dI" ((USItype) (u)), \
6240+ "dI" ((USItype) (v))); \
6241+ (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
6242+#define __umulsidi3(u, v) \
6243+ ({UDItype __w; \
6244+ __asm__ ("emul %2,%1,%0" \
6245+ : "=d" (__w) \
6246+ : "%dI" ((USItype) (u)), \
6247+ "dI" ((USItype) (v))); \
6248+ __w; })
6249+#endif /* __i960__ */
6250+
6251+#if defined (__M32R__) && W_TYPE_SIZE == 32
6252+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
6253+ /* The cmp clears the condition bit. */ \
6254+ __asm__ ("cmp %0,%0\n\taddx %1,%5\n\taddx %0,%3" \
6255+ : "=r" ((USItype) (sh)), \
6256+ "=&r" ((USItype) (sl)) \
6257+ : "0" ((USItype) (ah)), \
6258+ "r" ((USItype) (bh)), \
6259+ "1" ((USItype) (al)), \
6260+ "r" ((USItype) (bl)) \
6261+ : "cbit")
6262+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
6263+ /* The cmp clears the condition bit. */ \
6264+ __asm__ ("cmp %0,%0\n\tsubx %1,%5\n\tsubx %0,%3" \
6265+ : "=r" ((USItype) (sh)), \
6266+ "=&r" ((USItype) (sl)) \
6267+ : "0" ((USItype) (ah)), \
6268+ "r" ((USItype) (bh)), \
6269+ "1" ((USItype) (al)), \
6270+ "r" ((USItype) (bl)) \
6271+ : "cbit")
6272+#endif /* __M32R__ */
6273+
6274+#if defined (__mc68000__) && W_TYPE_SIZE == 32
6275+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
6276+ __asm__ ("add%.l %5,%1\n\taddx%.l %3,%0" \
6277+ : "=d" ((USItype) (sh)), \
6278+ "=&d" ((USItype) (sl)) \
6279+ : "%0" ((USItype) (ah)), \
6280+ "d" ((USItype) (bh)), \
6281+ "%1" ((USItype) (al)), \
6282+ "g" ((USItype) (bl)))
6283+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
6284+ __asm__ ("sub%.l %5,%1\n\tsubx%.l %3,%0" \
6285+ : "=d" ((USItype) (sh)), \
6286+ "=&d" ((USItype) (sl)) \
6287+ : "0" ((USItype) (ah)), \
6288+ "d" ((USItype) (bh)), \
6289+ "1" ((USItype) (al)), \
6290+ "g" ((USItype) (bl)))
6291+
6292+/* The '020, '030, '040 and CPU32 have 32x32->64 and 64/32->32q-32r. */
6293+#if defined (__mc68020__) || defined(mc68020) \
6294+ || defined(__mc68030__) || defined(mc68030) \
6295+ || defined(__mc68040__) || defined(mc68040) \
6296+ || defined(__mcpu32__) || defined(mcpu32)
6297+#define umul_ppmm(w1, w0, u, v) \
6298+ __asm__ ("mulu%.l %3,%1:%0" \
6299+ : "=d" ((USItype) (w0)), \
6300+ "=d" ((USItype) (w1)) \
6301+ : "%0" ((USItype) (u)), \
6302+ "dmi" ((USItype) (v)))
6303+#define UMUL_TIME 45
6304+#define udiv_qrnnd(q, r, n1, n0, d) \
6305+ __asm__ ("divu%.l %4,%1:%0" \
6306+ : "=d" ((USItype) (q)), \
6307+ "=d" ((USItype) (r)) \
6308+ : "0" ((USItype) (n0)), \
6309+ "1" ((USItype) (n1)), \
6310+ "dmi" ((USItype) (d)))
6311+#define UDIV_TIME 90
6312+#define sdiv_qrnnd(q, r, n1, n0, d) \
6313+ __asm__ ("divs%.l %4,%1:%0" \
6314+ : "=d" ((USItype) (q)), \
6315+ "=d" ((USItype) (r)) \
6316+ : "0" ((USItype) (n0)), \
6317+ "1" ((USItype) (n1)), \
6318+ "dmi" ((USItype) (d)))
6319+
6320+#else /* not mc68020 */
6321+#if defined(__mcoldfire__)
6322+#define umul_ppmm(xh, xl, a, b) \
6323+ __asm__ ("| Inlined umul_ppmm\n" \
6324+ " move%.l %2,%/d0\n" \
6325+ " move%.l %3,%/d1\n" \
6326+ " move%.l %/d0,%/d2\n" \
6327+ " swap %/d0\n" \
6328+ " move%.l %/d1,%/d3\n" \
6329+ " swap %/d1\n" \
6330+ " move%.w %/d2,%/d4\n" \
6331+ " mulu %/d3,%/d4\n" \
6332+ " mulu %/d1,%/d2\n" \
6333+ " mulu %/d0,%/d3\n" \
6334+ " mulu %/d0,%/d1\n" \
6335+ " move%.l %/d4,%/d0\n" \
6336+ " clr%.w %/d0\n" \
6337+ " swap %/d0\n" \
6338+ " add%.l %/d0,%/d2\n" \
6339+ " add%.l %/d3,%/d2\n" \
6340+ " jcc 1f\n" \
6341+ " add%.l %#65536,%/d1\n" \
6342+ "1: swap %/d2\n" \
6343+ " moveq %#0,%/d0\n" \
6344+ " move%.w %/d2,%/d0\n" \
6345+ " move%.w %/d4,%/d2\n" \
6346+ " move%.l %/d2,%1\n" \
6347+ " add%.l %/d1,%/d0\n" \
6348+ " move%.l %/d0,%0" \
6349+ : "=g" ((USItype) (xh)), \
6350+ "=g" ((USItype) (xl)) \
6351+ : "g" ((USItype) (a)), \
6352+ "g" ((USItype) (b)) \
6353+ : "d0", "d1", "d2", "d3", "d4")
6354+#define UMUL_TIME 100
6355+#define UDIV_TIME 400
6356+#else /* not ColdFire */
6357+/* %/ inserts REGISTER_PREFIX, %# inserts IMMEDIATE_PREFIX. */
6358+#define umul_ppmm(xh, xl, a, b) \
6359+ __asm__ ("| Inlined umul_ppmm\n" \
6360+ " move%.l %2,%/d0\n" \
6361+ " move%.l %3,%/d1\n" \
6362+ " move%.l %/d0,%/d2\n" \
6363+ " swap %/d0\n" \
6364+ " move%.l %/d1,%/d3\n" \
6365+ " swap %/d1\n" \
6366+ " move%.w %/d2,%/d4\n" \
6367+ " mulu %/d3,%/d4\n" \
6368+ " mulu %/d1,%/d2\n" \
6369+ " mulu %/d0,%/d3\n" \
6370+ " mulu %/d0,%/d1\n" \
6371+ " move%.l %/d4,%/d0\n" \
6372+ " eor%.w %/d0,%/d0\n" \
6373+ " swap %/d0\n" \
6374+ " add%.l %/d0,%/d2\n" \
6375+ " add%.l %/d3,%/d2\n" \
6376+ " jcc 1f\n" \
6377+ " add%.l %#65536,%/d1\n" \
6378+ "1: swap %/d2\n" \
6379+ " moveq %#0,%/d0\n" \
6380+ " move%.w %/d2,%/d0\n" \
6381+ " move%.w %/d4,%/d2\n" \
6382+ " move%.l %/d2,%1\n" \
6383+ " add%.l %/d1,%/d0\n" \
6384+ " move%.l %/d0,%0" \
6385+ : "=g" ((USItype) (xh)), \
6386+ "=g" ((USItype) (xl)) \
6387+ : "g" ((USItype) (a)), \
6388+ "g" ((USItype) (b)) \
6389+ : "d0", "d1", "d2", "d3", "d4")
6390+#define UMUL_TIME 100
6391+#define UDIV_TIME 400
6392+#endif /* not ColdFire */
6393+#endif /* not mc68020 */
6394+
6395+/* The '020, '030, '040 and '060 have bitfield insns.
6396+ cpu32 disguises as a 68020, but lacks them. */
6397+#if ( defined (__mc68020__) || defined(mc68020) \
6398+ || defined(__mc68030__) || defined(mc68030) \
6399+ || defined(__mc68040__) || defined(mc68040) \
6400+ || defined(__mc68060__) || defined(mc68060) ) \
6401+ && !defined(__mcpu32__)
6402+#define count_leading_zeros(count, x) \
6403+ __asm__ ("bfffo %1{%b2:%b2},%0" \
6404+ : "=d" ((USItype) (count)) \
6405+ : "od" ((USItype) (x)), "n" (0))
6406+#endif
6407+#endif /* mc68000 */
6408+
6409+#if defined (__m88000__) && W_TYPE_SIZE == 32
6410+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
6411+ __asm__ ("addu.co %1,%r4,%r5\n\taddu.ci %0,%r2,%r3" \
6412+ : "=r" ((USItype) (sh)), \
6413+ "=&r" ((USItype) (sl)) \
6414+ : "%rJ" ((USItype) (ah)), \
6415+ "rJ" ((USItype) (bh)), \
6416+ "%rJ" ((USItype) (al)), \
6417+ "rJ" ((USItype) (bl)))
6418+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
6419+ __asm__ ("subu.co %1,%r4,%r5\n\tsubu.ci %0,%r2,%r3" \
6420+ : "=r" ((USItype) (sh)), \
6421+ "=&r" ((USItype) (sl)) \
6422+ : "rJ" ((USItype) (ah)), \
6423+ "rJ" ((USItype) (bh)), \
6424+ "rJ" ((USItype) (al)), \
6425+ "rJ" ((USItype) (bl)))
6426+#define count_leading_zeros(count, x) \
6427+ do { \
6428+ USItype __cbtmp; \
6429+ __asm__ ("ff1 %0,%1" \
6430+ : "=r" (__cbtmp) \
6431+ : "r" ((USItype) (x))); \
6432+ (count) = __cbtmp ^ 31; \
6433+ } while (0)
6434+#define COUNT_LEADING_ZEROS_0 63 /* sic */
6435+#if defined (__mc88110__)
6436+#define umul_ppmm(wh, wl, u, v) \
6437+ do { \
6438+ union {UDItype __ll; \
6439+ struct {USItype __h, __l;} __i; \
6440+ } __xx; \
6441+ __asm__ ("mulu.d %0,%1,%2" \
6442+ : "=r" (__xx.__ll) \
6443+ : "r" ((USItype) (u)), \
6444+ "r" ((USItype) (v))); \
6445+ (wh) = __xx.__i.__h; \
6446+ (wl) = __xx.__i.__l; \
6447+ } while (0)
6448+#define udiv_qrnnd(q, r, n1, n0, d) \
6449+ ({union {UDItype __ll; \
6450+ struct {USItype __h, __l;} __i; \
6451+ } __xx; \
6452+ USItype __q; \
6453+ __xx.__i.__h = (n1); __xx.__i.__l = (n0); \
6454+ __asm__ ("divu.d %0,%1,%2" \
6455+ : "=r" (__q) \
6456+ : "r" (__xx.__ll), \
6457+ "r" ((USItype) (d))); \
6458+ (r) = (n0) - __q * (d); (q) = __q; })
6459+#define UMUL_TIME 5
6460+#define UDIV_TIME 25
6461+#else
6462+#define UMUL_TIME 17
6463+#define UDIV_TIME 150
6464+#endif /* __mc88110__ */
6465+#endif /* __m88000__ */
6466+
6467+#if defined (__mips__) && W_TYPE_SIZE == 32
6468+#define umul_ppmm(w1, w0, u, v) \
6469+ __asm__ ("multu %2,%3" \
6470+ : "=l" ((USItype) (w0)), \
6471+ "=h" ((USItype) (w1)) \
6472+ : "d" ((USItype) (u)), \
6473+ "d" ((USItype) (v)))
6474+#define UMUL_TIME 10
6475+#define UDIV_TIME 100
6476+#endif /* __mips__ */
6477+
6478+#if defined (__ns32000__) && W_TYPE_SIZE == 32
6479+#define umul_ppmm(w1, w0, u, v) \
6480+ ({union {UDItype __ll; \
6481+ struct {USItype __l, __h;} __i; \
6482+ } __xx; \
6483+ __asm__ ("meid %2,%0" \
6484+ : "=g" (__xx.__ll) \
6485+ : "%0" ((USItype) (u)), \
6486+ "g" ((USItype) (v))); \
6487+ (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
6488+#define __umulsidi3(u, v) \
6489+ ({UDItype __w; \
6490+ __asm__ ("meid %2,%0" \
6491+ : "=g" (__w) \
6492+ : "%0" ((USItype) (u)), \
6493+ "g" ((USItype) (v))); \
6494+ __w; })
6495+#define udiv_qrnnd(q, r, n1, n0, d) \
6496+ ({union {UDItype __ll; \
6497+ struct {USItype __l, __h;} __i; \
6498+ } __xx; \
6499+ __xx.__i.__h = (n1); __xx.__i.__l = (n0); \
6500+ __asm__ ("deid %2,%0" \
6501+ : "=g" (__xx.__ll) \
6502+ : "0" (__xx.__ll), \
6503+ "g" ((USItype) (d))); \
6504+ (r) = __xx.__i.__l; (q) = __xx.__i.__h; })
6505+#define count_trailing_zeros(count,x) \
6506+ do { \
6507+ __asm__ ("ffsd %2,%0" \
6508+ : "=r" ((USItype) (count)) \
6509+ : "0" ((USItype) 0), \
6510+ "r" ((USItype) (x))); \
6511+ } while (0)
6512+#endif /* __ns32000__ */
6513+
6514+/* FIXME: We should test _IBMR2 here when we add assembly support for the
6515+ system vendor compilers.
6516+ FIXME: What's needed for gcc PowerPC VxWorks? __vxworks__ is not good
6517+ enough, since that hits ARM and m68k too. */
6518+#if (defined (_ARCH_PPC) /* AIX */ \
6519+ || defined (_ARCH_PWR) /* AIX */ \
6520+ || defined (_ARCH_COM) /* AIX */ \
6521+ || defined (__powerpc__) /* gcc */ \
6522+ || defined (__POWERPC__) /* BEOS */ \
6523+ || defined (__ppc__) /* Darwin */ \
6524+ || defined (PPC) /* GNU/Linux, SysV */ \
6525+ ) && W_TYPE_SIZE == 32
6526+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
6527+ do { \
6528+ if (__builtin_constant_p (bh) && (bh) == 0) \
6529+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \
6530+ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
6531+ else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \
6532+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \
6533+ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
6534+ else \
6535+ __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \
6536+ : "=r" (sh), "=&r" (sl) \
6537+ : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \
6538+ } while (0)
6539+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
6540+ do { \
6541+ if (__builtin_constant_p (ah) && (ah) == 0) \
6542+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \
6543+ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
6544+ else if (__builtin_constant_p (ah) && (ah) == ~(USItype) 0) \
6545+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \
6546+ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
6547+ else if (__builtin_constant_p (bh) && (bh) == 0) \
6548+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \
6549+ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
6550+ else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \
6551+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \
6552+ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
6553+ else \
6554+ __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \
6555+ : "=r" (sh), "=&r" (sl) \
6556+ : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \
6557+ } while (0)
6558+#define count_leading_zeros(count, x) \
6559+ __asm__ ("{cntlz|cntlzw} %0,%1" : "=r" (count) : "r" (x))
6560+#define COUNT_LEADING_ZEROS_0 32
6561+#if defined (_ARCH_PPC) || defined (__powerpc__) || defined (__POWERPC__) \
6562+ || defined (__ppc__) || defined (PPC)
6563+#define umul_ppmm(ph, pl, m0, m1) \
6564+ do { \
6565+ USItype __m0 = (m0), __m1 = (m1); \
6566+ __asm__ ("mulhwu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \
6567+ (pl) = __m0 * __m1; \
6568+ } while (0)
6569+#define UMUL_TIME 15
6570+#define smul_ppmm(ph, pl, m0, m1) \
6571+ do { \
6572+ SItype __m0 = (m0), __m1 = (m1); \
6573+ __asm__ ("mulhw %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \
6574+ (pl) = __m0 * __m1; \
6575+ } while (0)
6576+#define SMUL_TIME 14
6577+#define UDIV_TIME 120
6578+#elif defined (_ARCH_PWR)
6579+#define UMUL_TIME 8
6580+#define smul_ppmm(xh, xl, m0, m1) \
6581+ __asm__ ("mul %0,%2,%3" : "=r" (xh), "=q" (xl) : "r" (m0), "r" (m1))
6582+#define SMUL_TIME 4
6583+#define sdiv_qrnnd(q, r, nh, nl, d) \
6584+ __asm__ ("div %0,%2,%4" : "=r" (q), "=q" (r) : "r" (nh), "1" (nl), "r" (d))
6585+#define UDIV_TIME 100
6586+#endif
6587+#endif /* 32-bit POWER architecture variants. */
6588+
6589+/* We should test _IBMR2 here when we add assembly support for the system
6590+ vendor compilers. */
6591+#if (defined (_ARCH_PPC64) || defined (__powerpc64__)) && W_TYPE_SIZE == 64
6592+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
6593+ do { \
6594+ if (__builtin_constant_p (bh) && (bh) == 0) \
6595+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \
6596+ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
6597+ else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \
6598+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \
6599+ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
6600+ else \
6601+ __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \
6602+ : "=r" (sh), "=&r" (sl) \
6603+ : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \
6604+ } while (0)
6605+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
6606+ do { \
6607+ if (__builtin_constant_p (ah) && (ah) == 0) \
6608+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \
6609+ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
6610+ else if (__builtin_constant_p (ah) && (ah) == ~(UDItype) 0) \
6611+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \
6612+ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
6613+ else if (__builtin_constant_p (bh) && (bh) == 0) \
6614+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \
6615+ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
6616+ else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \
6617+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \
6618+ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
6619+ else \
6620+ __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \
6621+ : "=r" (sh), "=&r" (sl) \
6622+ : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \
6623+ } while (0)
6624+#define count_leading_zeros(count, x) \
6625+ __asm__ ("cntlzd %0,%1" : "=r" (count) : "r" (x))
6626+#define COUNT_LEADING_ZEROS_0 64
6627+#define umul_ppmm(ph, pl, m0, m1) \
6628+ do { \
6629+ UDItype __m0 = (m0), __m1 = (m1); \
6630+ __asm__ ("mulhdu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \
6631+ (pl) = __m0 * __m1; \
6632+ } while (0)
6633+#define UMUL_TIME 15
6634+#define smul_ppmm(ph, pl, m0, m1) \
6635+ do { \
6636+ DItype __m0 = (m0), __m1 = (m1); \
6637+ __asm__ ("mulhd %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \
6638+ (pl) = __m0 * __m1; \
6639+ } while (0)
6640+#define SMUL_TIME 14 /* ??? */
6641+#define UDIV_TIME 120 /* ??? */
6642+#endif /* 64-bit PowerPC. */
6643+
6644+#if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32
6645+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
6646+ __asm__ ("a %1,%5\n\tae %0,%3" \
6647+ : "=r" ((USItype) (sh)), \
6648+ "=&r" ((USItype) (sl)) \
6649+ : "%0" ((USItype) (ah)), \
6650+ "r" ((USItype) (bh)), \
6651+ "%1" ((USItype) (al)), \
6652+ "r" ((USItype) (bl)))
6653+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
6654+ __asm__ ("s %1,%5\n\tse %0,%3" \
6655+ : "=r" ((USItype) (sh)), \
6656+ "=&r" ((USItype) (sl)) \
6657+ : "0" ((USItype) (ah)), \
6658+ "r" ((USItype) (bh)), \
6659+ "1" ((USItype) (al)), \
6660+ "r" ((USItype) (bl)))
6661+#define umul_ppmm(ph, pl, m0, m1) \
6662+ do { \
6663+ USItype __m0 = (m0), __m1 = (m1); \
6664+ __asm__ ( \
6665+ "s r2,r2\n" \
6666+" mts r10,%2\n" \
6667+" m r2,%3\n" \
6668+" m r2,%3\n" \
6669+" m r2,%3\n" \
6670+" m r2,%3\n" \
6671+" m r2,%3\n" \
6672+" m r2,%3\n" \
6673+" m r2,%3\n" \
6674+" m r2,%3\n" \
6675+" m r2,%3\n" \
6676+" m r2,%3\n" \
6677+" m r2,%3\n" \
6678+" m r2,%3\n" \
6679+" m r2,%3\n" \
6680+" m r2,%3\n" \
6681+" m r2,%3\n" \
6682+" m r2,%3\n" \
6683+" cas %0,r2,r0\n" \
6684+" mfs r10,%1" \
6685+ : "=r" ((USItype) (ph)), \
6686+ "=r" ((USItype) (pl)) \
6687+ : "%r" (__m0), \
6688+ "r" (__m1) \
6689+ : "r2"); \
6690+ (ph) += ((((SItype) __m0 >> 31) & __m1) \
6691+ + (((SItype) __m1 >> 31) & __m0)); \
6692+ } while (0)
6693+#define UMUL_TIME 20
6694+#define UDIV_TIME 200
6695+#define count_leading_zeros(count, x) \
6696+ do { \
6697+ if ((x) >= 0x10000) \
6698+ __asm__ ("clz %0,%1" \
6699+ : "=r" ((USItype) (count)) \
6700+ : "r" ((USItype) (x) >> 16)); \
6701+ else \
6702+ { \
6703+ __asm__ ("clz %0,%1" \
6704+ : "=r" ((USItype) (count)) \
6705+ : "r" ((USItype) (x))); \
6706+ (count) += 16; \
6707+ } \
6708+ } while (0)
6709+#endif
6710+
6711+#if defined (__sh2__) && W_TYPE_SIZE == 32
6712+#define umul_ppmm(w1, w0, u, v) \
6713+ __asm__ ( \
6714+ "dmulu.l %2,%3\n\tsts macl,%1\n\tsts mach,%0" \
6715+ : "=r" ((USItype)(w1)), \
6716+ "=r" ((USItype)(w0)) \
6717+ : "r" ((USItype)(u)), \
6718+ "r" ((USItype)(v)) \
6719+ : "macl", "mach")
6720+#define UMUL_TIME 5
6721+#endif
6722+
6723+#if defined (__SH5__) && __SHMEDIA__ && W_TYPE_SIZE == 32
6724+#define __umulsidi3(u,v) ((UDItype)(USItype)u*(USItype)v)
6725+#define count_leading_zeros(count, x) \
6726+ do \
6727+ { \
6728+ UDItype x_ = (USItype)(x); \
6729+ SItype c_; \
6730+ \
6731+ __asm__ ("nsb %1, %0" : "=r" (c_) : "r" (x_)); \
6732+ (count) = c_ - 31; \
6733+ } \
6734+ while (0)
6735+#define COUNT_LEADING_ZEROS_0 32
6736+#endif
6737+
6738+#if defined (__sparc__) && !defined (__arch64__) && !defined (__sparcv9) \
6739+ && W_TYPE_SIZE == 32
6740+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
6741+ __asm__ ("addcc %r4,%5,%1\n\taddx %r2,%3,%0" \
6742+ : "=r" ((USItype) (sh)), \
6743+ "=&r" ((USItype) (sl)) \
6744+ : "%rJ" ((USItype) (ah)), \
6745+ "rI" ((USItype) (bh)), \
6746+ "%rJ" ((USItype) (al)), \
6747+ "rI" ((USItype) (bl)) \
6748+ __CLOBBER_CC)
6749+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
6750+ __asm__ ("subcc %r4,%5,%1\n\tsubx %r2,%3,%0" \
6751+ : "=r" ((USItype) (sh)), \
6752+ "=&r" ((USItype) (sl)) \
6753+ : "rJ" ((USItype) (ah)), \
6754+ "rI" ((USItype) (bh)), \
6755+ "rJ" ((USItype) (al)), \
6756+ "rI" ((USItype) (bl)) \
6757+ __CLOBBER_CC)
6758+#if defined (__sparc_v8__)
6759+#define umul_ppmm(w1, w0, u, v) \
6760+ __asm__ ("umul %2,%3,%1;rd %%y,%0" \
6761+ : "=r" ((USItype) (w1)), \
6762+ "=r" ((USItype) (w0)) \
6763+ : "r" ((USItype) (u)), \
6764+ "r" ((USItype) (v)))
6765+#define udiv_qrnnd(__q, __r, __n1, __n0, __d) \
6766+ __asm__ ("mov %2,%%y;nop;nop;nop;udiv %3,%4,%0;umul %0,%4,%1;sub %3,%1,%1"\
6767+ : "=&r" ((USItype) (__q)), \
6768+ "=&r" ((USItype) (__r)) \
6769+ : "r" ((USItype) (__n1)), \
6770+ "r" ((USItype) (__n0)), \
6771+ "r" ((USItype) (__d)))
6772+#else
6773+#if defined (__sparclite__)
6774+/* This has hardware multiply but not divide. It also has two additional
6775+ instructions scan (ffs from high bit) and divscc. */
6776+#define umul_ppmm(w1, w0, u, v) \
6777+ __asm__ ("umul %2,%3,%1;rd %%y,%0" \
6778+ : "=r" ((USItype) (w1)), \
6779+ "=r" ((USItype) (w0)) \
6780+ : "r" ((USItype) (u)), \
6781+ "r" ((USItype) (v)))
6782+#define udiv_qrnnd(q, r, n1, n0, d) \
6783+ __asm__ ("! Inlined udiv_qrnnd\n" \
6784+" wr %%g0,%2,%%y ! Not a delayed write for sparclite\n" \
6785+" tst %%g0\n" \
6786+" divscc %3,%4,%%g1\n" \
6787+" divscc %%g1,%4,%%g1\n" \
6788+" divscc %%g1,%4,%%g1\n" \
6789+" divscc %%g1,%4,%%g1\n" \
6790+" divscc %%g1,%4,%%g1\n" \
6791+" divscc %%g1,%4,%%g1\n" \
6792+" divscc %%g1,%4,%%g1\n" \
6793+" divscc %%g1,%4,%%g1\n" \
6794+" divscc %%g1,%4,%%g1\n" \
6795+" divscc %%g1,%4,%%g1\n" \
6796+" divscc %%g1,%4,%%g1\n" \
6797+" divscc %%g1,%4,%%g1\n" \
6798+" divscc %%g1,%4,%%g1\n" \
6799+" divscc %%g1,%4,%%g1\n" \
6800+" divscc %%g1,%4,%%g1\n" \
6801+" divscc %%g1,%4,%%g1\n" \
6802+" divscc %%g1,%4,%%g1\n" \
6803+" divscc %%g1,%4,%%g1\n" \
6804+" divscc %%g1,%4,%%g1\n" \
6805+" divscc %%g1,%4,%%g1\n" \
6806+" divscc %%g1,%4,%%g1\n" \
6807+" divscc %%g1,%4,%%g1\n" \
6808+" divscc %%g1,%4,%%g1\n" \
6809+" divscc %%g1,%4,%%g1\n" \
6810+" divscc %%g1,%4,%%g1\n" \
6811+" divscc %%g1,%4,%%g1\n" \
6812+" divscc %%g1,%4,%%g1\n" \
6813+" divscc %%g1,%4,%%g1\n" \
6814+" divscc %%g1,%4,%%g1\n" \
6815+" divscc %%g1,%4,%%g1\n" \
6816+" divscc %%g1,%4,%%g1\n" \
6817+" divscc %%g1,%4,%0\n" \
6818+" rd %%y,%1\n" \
6819+" bl,a 1f\n" \
6820+" add %1,%4,%1\n" \
6821+"1: ! End of inline udiv_qrnnd" \
6822+ : "=r" ((USItype) (q)), \
6823+ "=r" ((USItype) (r)) \
6824+ : "r" ((USItype) (n1)), \
6825+ "r" ((USItype) (n0)), \
6826+ "rI" ((USItype) (d)) \
6827+ : "g1" __AND_CLOBBER_CC)
6828+#define UDIV_TIME 37
6829+#define count_leading_zeros(count, x) \
6830+ do { \
6831+ __asm__ ("scan %1,1,%0" \
6832+ : "=r" ((USItype) (count)) \
6833+ : "r" ((USItype) (x))); \
6834+ } while (0)
6835+/* Early sparclites return 63 for an argument of 0, but they warn that future
6836+ implementations might change this. Therefore, leave COUNT_LEADING_ZEROS_0
6837+ undefined. */
6838+#else
6839+/* SPARC without integer multiplication and divide instructions.
6840+ (i.e. at least Sun4/20,40,60,65,75,110,260,280,330,360,380,470,490) */
6841+#define umul_ppmm(w1, w0, u, v) \
6842+ __asm__ ("! Inlined umul_ppmm\n" \
6843+" wr %%g0,%2,%%y ! SPARC has 0-3 delay insn after a wr\n"\
6844+" sra %3,31,%%o5 ! Don't move this insn\n" \
6845+" and %2,%%o5,%%o5 ! Don't move this insn\n" \
6846+" andcc %%g0,0,%%g1 ! Don't move this insn\n" \
6847+" mulscc %%g1,%3,%%g1\n" \
6848+" mulscc %%g1,%3,%%g1\n" \
6849+" mulscc %%g1,%3,%%g1\n" \
6850+" mulscc %%g1,%3,%%g1\n" \
6851+" mulscc %%g1,%3,%%g1\n" \
6852+" mulscc %%g1,%3,%%g1\n" \
6853+" mulscc %%g1,%3,%%g1\n" \
6854+" mulscc %%g1,%3,%%g1\n" \
6855+" mulscc %%g1,%3,%%g1\n" \
6856+" mulscc %%g1,%3,%%g1\n" \
6857+" mulscc %%g1,%3,%%g1\n" \
6858+" mulscc %%g1,%3,%%g1\n" \
6859+" mulscc %%g1,%3,%%g1\n" \
6860+" mulscc %%g1,%3,%%g1\n" \
6861+" mulscc %%g1,%3,%%g1\n" \
6862+" mulscc %%g1,%3,%%g1\n" \
6863+" mulscc %%g1,%3,%%g1\n" \
6864+" mulscc %%g1,%3,%%g1\n" \
6865+" mulscc %%g1,%3,%%g1\n" \
6866+" mulscc %%g1,%3,%%g1\n" \
6867+" mulscc %%g1,%3,%%g1\n" \
6868+" mulscc %%g1,%3,%%g1\n" \
6869+" mulscc %%g1,%3,%%g1\n" \
6870+" mulscc %%g1,%3,%%g1\n" \
6871+" mulscc %%g1,%3,%%g1\n" \
6872+" mulscc %%g1,%3,%%g1\n" \
6873+" mulscc %%g1,%3,%%g1\n" \
6874+" mulscc %%g1,%3,%%g1\n" \
6875+" mulscc %%g1,%3,%%g1\n" \
6876+" mulscc %%g1,%3,%%g1\n" \
6877+" mulscc %%g1,%3,%%g1\n" \
6878+" mulscc %%g1,%3,%%g1\n" \
6879+" mulscc %%g1,0,%%g1\n" \
6880+" add %%g1,%%o5,%0\n" \
6881+" rd %%y,%1" \
6882+ : "=r" ((USItype) (w1)), \
6883+ "=r" ((USItype) (w0)) \
6884+ : "%rI" ((USItype) (u)), \
6885+ "r" ((USItype) (v)) \
6886+ : "g1", "o5" __AND_CLOBBER_CC)
6887+#define UMUL_TIME 39 /* 39 instructions */
6888+/* It's quite necessary to add this much assembler for the sparc.
6889+ The default udiv_qrnnd (in C) is more than 10 times slower! */
6890+#define udiv_qrnnd(__q, __r, __n1, __n0, __d) \
6891+ __asm__ ("! Inlined udiv_qrnnd\n" \
6892+" mov 32,%%g1\n" \
6893+" subcc %1,%2,%%g0\n" \
6894+"1: bcs 5f\n" \
6895+" addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n" \
6896+" sub %1,%2,%1 ! this kills msb of n\n" \
6897+" addx %1,%1,%1 ! so this can't give carry\n" \
6898+" subcc %%g1,1,%%g1\n" \
6899+"2: bne 1b\n" \
6900+" subcc %1,%2,%%g0\n" \
6901+" bcs 3f\n" \
6902+" addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n" \
6903+" b 3f\n" \
6904+" sub %1,%2,%1 ! this kills msb of n\n" \
6905+"4: sub %1,%2,%1\n" \
6906+"5: addxcc %1,%1,%1\n" \
6907+" bcc 2b\n" \
6908+" subcc %%g1,1,%%g1\n" \
6909+"! Got carry from n. Subtract next step to cancel this carry.\n" \
6910+" bne 4b\n" \
6911+" addcc %0,%0,%0 ! shift n1n0 and a 0-bit in lsb\n" \
6912+" sub %1,%2,%1\n" \
6913+"3: xnor %0,0,%0\n" \
6914+" ! End of inline udiv_qrnnd" \
6915+ : "=&r" ((USItype) (__q)), \
6916+ "=&r" ((USItype) (__r)) \
6917+ : "r" ((USItype) (__d)), \
6918+ "1" ((USItype) (__n1)), \
6919+ "0" ((USItype) (__n0)) : "g1" __AND_CLOBBER_CC)
6920+#define UDIV_TIME (3+7*32) /* 7 instructions/iteration. 32 iterations. */
6921+#endif /* __sparclite__ */
6922+#endif /* __sparc_v8__ */
6923+#endif /* sparc32 */
6924+
6925+#if ((defined (__sparc__) && defined (__arch64__)) || defined (__sparcv9)) \
6926+ && W_TYPE_SIZE == 64
6927+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
6928+ __asm__ ("addcc %r4,%5,%1\n\t" \
6929+ "add %r2,%3,%0\n\t" \
6930+ "bcs,a,pn %%xcc, 1f\n\t" \
6931+ "add %0, 1, %0\n" \
6932+ "1:" \
6933+ : "=r" ((UDItype)(sh)), \
6934+ "=&r" ((UDItype)(sl)) \
6935+ : "%rJ" ((UDItype)(ah)), \
6936+ "rI" ((UDItype)(bh)), \
6937+ "%rJ" ((UDItype)(al)), \
6938+ "rI" ((UDItype)(bl)) \
6939+ __CLOBBER_CC)
6940+
6941+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
6942+ __asm__ ("subcc %r4,%5,%1\n\t" \
6943+ "sub %r2,%3,%0\n\t" \
6944+ "bcs,a,pn %%xcc, 1f\n\t" \
6945+ "sub %0, 1, %0\n\t" \
6946+ "1:" \
6947+ : "=r" ((UDItype)(sh)), \
6948+ "=&r" ((UDItype)(sl)) \
6949+ : "rJ" ((UDItype)(ah)), \
6950+ "rI" ((UDItype)(bh)), \
6951+ "rJ" ((UDItype)(al)), \
6952+ "rI" ((UDItype)(bl)) \
6953+ __CLOBBER_CC)
6954+
6955+#define umul_ppmm(wh, wl, u, v) \
6956+ do { \
6957+ UDItype tmp1, tmp2, tmp3, tmp4; \
6958+ __asm__ __volatile__ ( \
6959+ "srl %7,0,%3\n\t" \
6960+ "mulx %3,%6,%1\n\t" \
6961+ "srlx %6,32,%2\n\t" \
6962+ "mulx %2,%3,%4\n\t" \
6963+ "sllx %4,32,%5\n\t" \
6964+ "srl %6,0,%3\n\t" \
6965+ "sub %1,%5,%5\n\t" \
6966+ "srlx %5,32,%5\n\t" \
6967+ "addcc %4,%5,%4\n\t" \
6968+ "srlx %7,32,%5\n\t" \
6969+ "mulx %3,%5,%3\n\t" \
6970+ "mulx %2,%5,%5\n\t" \
6971+ "sethi %%hi(0x80000000),%2\n\t" \
6972+ "addcc %4,%3,%4\n\t" \
6973+ "srlx %4,32,%4\n\t" \
6974+ "add %2,%2,%2\n\t" \
6975+ "movcc %%xcc,%%g0,%2\n\t" \
6976+ "addcc %5,%4,%5\n\t" \
6977+ "sllx %3,32,%3\n\t" \
6978+ "add %1,%3,%1\n\t" \
6979+ "add %5,%2,%0" \
6980+ : "=r" ((UDItype)(wh)), \
6981+ "=&r" ((UDItype)(wl)), \
6982+ "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4) \
6983+ : "r" ((UDItype)(u)), \
6984+ "r" ((UDItype)(v)) \
6985+ __CLOBBER_CC); \
6986+ } while (0)
6987+#define UMUL_TIME 96
6988+#define UDIV_TIME 230
6989+#endif /* sparc64 */
6990+
6991+#if defined (__vax__) && W_TYPE_SIZE == 32
6992+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
6993+ __asm__ ("addl2 %5,%1\n\tadwc %3,%0" \
6994+ : "=g" ((USItype) (sh)), \
6995+ "=&g" ((USItype) (sl)) \
6996+ : "%0" ((USItype) (ah)), \
6997+ "g" ((USItype) (bh)), \
6998+ "%1" ((USItype) (al)), \
6999+ "g" ((USItype) (bl)))
7000+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
7001+ __asm__ ("subl2 %5,%1\n\tsbwc %3,%0" \
7002+ : "=g" ((USItype) (sh)), \
7003+ "=&g" ((USItype) (sl)) \
7004+ : "0" ((USItype) (ah)), \
7005+ "g" ((USItype) (bh)), \
7006+ "1" ((USItype) (al)), \
7007+ "g" ((USItype) (bl)))
7008+#define umul_ppmm(xh, xl, m0, m1) \
7009+ do { \
7010+ union { \
7011+ UDItype __ll; \
7012+ struct {USItype __l, __h;} __i; \
7013+ } __xx; \
7014+ USItype __m0 = (m0), __m1 = (m1); \
7015+ __asm__ ("emul %1,%2,$0,%0" \
7016+ : "=r" (__xx.__ll) \
7017+ : "g" (__m0), \
7018+ "g" (__m1)); \
7019+ (xh) = __xx.__i.__h; \
7020+ (xl) = __xx.__i.__l; \
7021+ (xh) += ((((SItype) __m0 >> 31) & __m1) \
7022+ + (((SItype) __m1 >> 31) & __m0)); \
7023+ } while (0)
7024+#define sdiv_qrnnd(q, r, n1, n0, d) \
7025+ do { \
7026+ union {DItype __ll; \
7027+ struct {SItype __l, __h;} __i; \
7028+ } __xx; \
7029+ __xx.__i.__h = n1; __xx.__i.__l = n0; \
7030+ __asm__ ("ediv %3,%2,%0,%1" \
7031+ : "=g" (q), "=g" (r) \
7032+ : "g" (__xx.__ll), "g" (d)); \
7033+ } while (0)
7034+#endif /* __vax__ */
7035+
7036+#if defined (__z8000__) && W_TYPE_SIZE == 16
7037+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
7038+ __asm__ ("add %H1,%H5\n\tadc %H0,%H3" \
7039+ : "=r" ((unsigned int)(sh)), \
7040+ "=&r" ((unsigned int)(sl)) \
7041+ : "%0" ((unsigned int)(ah)), \
7042+ "r" ((unsigned int)(bh)), \
7043+ "%1" ((unsigned int)(al)), \
7044+ "rQR" ((unsigned int)(bl)))
7045+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
7046+ __asm__ ("sub %H1,%H5\n\tsbc %H0,%H3" \
7047+ : "=r" ((unsigned int)(sh)), \
7048+ "=&r" ((unsigned int)(sl)) \
7049+ : "0" ((unsigned int)(ah)), \
7050+ "r" ((unsigned int)(bh)), \
7051+ "1" ((unsigned int)(al)), \
7052+ "rQR" ((unsigned int)(bl)))
7053+#define umul_ppmm(xh, xl, m0, m1) \
7054+ do { \
7055+ union {long int __ll; \
7056+ struct {unsigned int __h, __l;} __i; \
7057+ } __xx; \
7058+ unsigned int __m0 = (m0), __m1 = (m1); \
7059+ __asm__ ("mult %S0,%H3" \
7060+ : "=r" (__xx.__i.__h), \
7061+ "=r" (__xx.__i.__l) \
7062+ : "%1" (__m0), \
7063+ "rQR" (__m1)); \
7064+ (xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \
7065+ (xh) += ((((signed int) __m0 >> 15) & __m1) \
7066+ + (((signed int) __m1 >> 15) & __m0)); \
7067+ } while (0)
7068+#endif /* __z8000__ */
7069+
7070+#endif /* __GNUC__ */
7071+
7072+/* If this machine has no inline assembler, use C macros. */
7073+
7074+#if !defined (add_ssaaaa)
7075+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
7076+ do { \
7077+ UWtype __x; \
7078+ __x = (al) + (bl); \
7079+ (sh) = (ah) + (bh) + (__x < (al)); \
7080+ (sl) = __x; \
7081+ } while (0)
7082+#endif
7083+
7084+#if !defined (sub_ddmmss)
7085+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
7086+ do { \
7087+ UWtype __x; \
7088+ __x = (al) - (bl); \
7089+ (sh) = (ah) - (bh) - (__x > (al)); \
7090+ (sl) = __x; \
7091+ } while (0)
7092+#endif
7093+
7094+/* If we lack umul_ppmm but have smul_ppmm, define umul_ppmm in terms of
7095+ smul_ppmm. */
7096+#if !defined (umul_ppmm) && defined (smul_ppmm)
7097+#define umul_ppmm(w1, w0, u, v) \
7098+ do { \
7099+ UWtype __w1; \
7100+ UWtype __xm0 = (u), __xm1 = (v); \
7101+ smul_ppmm (__w1, w0, __xm0, __xm1); \
7102+ (w1) = __w1 + (-(__xm0 >> (W_TYPE_SIZE - 1)) & __xm1) \
7103+ + (-(__xm1 >> (W_TYPE_SIZE - 1)) & __xm0); \
7104+ } while (0)
7105+#endif
7106+
7107+/* If we still don't have umul_ppmm, define it using plain C. */
7108+#if !defined (umul_ppmm)
7109+#define umul_ppmm(w1, w0, u, v) \
7110+ do { \
7111+ UWtype __x0, __x1, __x2, __x3; \
7112+ UHWtype __ul, __vl, __uh, __vh; \
7113+ \
7114+ __ul = __ll_lowpart (u); \
7115+ __uh = __ll_highpart (u); \
7116+ __vl = __ll_lowpart (v); \
7117+ __vh = __ll_highpart (v); \
7118+ \
7119+ __x0 = (UWtype) __ul * __vl; \
7120+ __x1 = (UWtype) __ul * __vh; \
7121+ __x2 = (UWtype) __uh * __vl; \
7122+ __x3 = (UWtype) __uh * __vh; \
7123+ \
7124+ __x1 += __ll_highpart (__x0);/* this can't give carry */ \
7125+ __x1 += __x2; /* but this indeed can */ \
7126+ if (__x1 < __x2) /* did we get it? */ \
7127+ __x3 += __ll_B; /* yes, add it in the proper pos. */ \
7128+ \
7129+ (w1) = __x3 + __ll_highpart (__x1); \
7130+ (w0) = __ll_lowpart (__x1) * __ll_B + __ll_lowpart (__x0); \
7131+ } while (0)
7132+#endif
7133+
7134+#if !defined (__umulsidi3)
7135+#define __umulsidi3(u, v) \
7136+ ({DWunion __w; \
7137+ umul_ppmm (__w.s.high, __w.s.low, u, v); \
7138+ __w.ll; })
7139+#endif
7140+
7141+/* Define this unconditionally, so it can be used for debugging. */
7142+#define __udiv_qrnnd_c(q, r, n1, n0, d) \
7143+ do { \
7144+ UWtype __d1, __d0, __q1, __q0; \
7145+ UWtype __r1, __r0, __m; \
7146+ __d1 = __ll_highpart (d); \
7147+ __d0 = __ll_lowpart (d); \
7148+ \
7149+ __r1 = (n1) % __d1; \
7150+ __q1 = (n1) / __d1; \
7151+ __m = (UWtype) __q1 * __d0; \
7152+ __r1 = __r1 * __ll_B | __ll_highpart (n0); \
7153+ if (__r1 < __m) \
7154+ { \
7155+ __q1--, __r1 += (d); \
7156+ if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\
7157+ if (__r1 < __m) \
7158+ __q1--, __r1 += (d); \
7159+ } \
7160+ __r1 -= __m; \
7161+ \
7162+ __r0 = __r1 % __d1; \
7163+ __q0 = __r1 / __d1; \
7164+ __m = (UWtype) __q0 * __d0; \
7165+ __r0 = __r0 * __ll_B | __ll_lowpart (n0); \
7166+ if (__r0 < __m) \
7167+ { \
7168+ __q0--, __r0 += (d); \
7169+ if (__r0 >= (d)) \
7170+ if (__r0 < __m) \
7171+ __q0--, __r0 += (d); \
7172+ } \
7173+ __r0 -= __m; \
7174+ \
7175+ (q) = (UWtype) __q1 * __ll_B | __q0; \
7176+ (r) = __r0; \
7177+ } while (0)
7178+
7179+/* If the processor has no udiv_qrnnd but sdiv_qrnnd, go through
7180+ __udiv_w_sdiv (defined in libgcc or elsewhere). */
7181+#if !defined (udiv_qrnnd) && defined (sdiv_qrnnd)
7182+#define udiv_qrnnd(q, r, nh, nl, d) \
7183+ do { \
7184+ USItype __r; \
7185+ (q) = __udiv_w_sdiv (&__r, nh, nl, d); \
7186+ (r) = __r; \
7187+ } while (0)
7188+#endif
7189+
7190+/* If udiv_qrnnd was not defined for this processor, use __udiv_qrnnd_c. */
7191+#if !defined (udiv_qrnnd)
7192+#define UDIV_NEEDS_NORMALIZATION 1
7193+#define udiv_qrnnd __udiv_qrnnd_c
7194+#endif
7195+
7196+#if !defined (count_leading_zeros)
7197+extern const UQItype __clz_tab[] ATTRIBUTE_HIDDEN;
7198+#define count_leading_zeros(count, x) \
7199+ do { \
7200+ UWtype __xr = (x); \
7201+ UWtype __a; \
7202+ \
7203+ if (W_TYPE_SIZE <= 32) \
7204+ { \
7205+ __a = __xr < ((UWtype)1<<2*__BITS4) \
7206+ ? (__xr < ((UWtype)1<<__BITS4) ? 0 : __BITS4) \
7207+ : (__xr < ((UWtype)1<<3*__BITS4) ? 2*__BITS4 : 3*__BITS4); \
7208+ } \
7209+ else \
7210+ { \
7211+ for (__a = W_TYPE_SIZE - 8; __a > 0; __a -= 8) \
7212+ if (((__xr >> __a) & 0xff) != 0) \
7213+ break; \
7214+ } \
7215+ \
7216+ (count) = W_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a); \
7217+ } while (0)
7218+#define COUNT_LEADING_ZEROS_0 W_TYPE_SIZE
7219+#endif
7220+
7221+#if !defined (count_trailing_zeros)
7222+/* Define count_trailing_zeros using count_leading_zeros. The latter might be
7223+ defined in asm, but if it is not, the C version above is good enough. */
7224+#define count_trailing_zeros(count, x) \
7225+ do { \
7226+ UWtype __ctz_x = (x); \
7227+ UWtype __ctz_c; \
7228+ count_leading_zeros (__ctz_c, __ctz_x & -__ctz_x); \
7229+ (count) = W_TYPE_SIZE - 1 - __ctz_c; \
7230+ } while (0)
7231+#endif
7232+
7233+#ifndef UDIV_NEEDS_NORMALIZATION
7234+#define UDIV_NEEDS_NORMALIZATION 0
7235+#endif