1.1 --- a/patches/gcc/3.4.6/900-nios2.patch Mon Jul 28 21:08:01 2008 +0000
1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1.3 @@ -1,10231 +0,0 @@
1.4 -diff -durN gcc-3.4.6.orig/gcc/combine.c gcc-3.4.6/gcc/combine.c
1.5 ---- gcc-3.4.6.orig/gcc/combine.c 2005-08-08 20:41:04.000000000 +0200
1.6 -+++ gcc-3.4.6/gcc/combine.c 2007-08-15 23:09:36.000000000 +0200
1.7 -@@ -4381,6 +4381,14 @@
1.8 - mode);
1.9 - }
1.10 -
1.11 -+#ifndef __nios2__
1.12 -+/* This screws up Nios II in this test case:
1.13 -+
1.14 -+if (x & 1)
1.15 -+ return 2;
1.16 -+else
1.17 -+ return 3;
1.18 -+*/
1.19 - else if (STORE_FLAG_VALUE == 1
1.20 - && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
1.21 - && op1 == const0_rtx
1.22 -@@ -4392,6 +4400,7 @@
1.23 - gen_lowpart_for_combine (mode, op0),
1.24 - const1_rtx);
1.25 - }
1.26 -+#endif
1.27 -
1.28 - else if (STORE_FLAG_VALUE == 1
1.29 - && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
1.30 -diff -durN gcc-3.4.6.orig/gcc/config/nios2/crti.asm gcc-3.4.6/gcc/config/nios2/crti.asm
1.31 ---- gcc-3.4.6.orig/gcc/config/nios2/crti.asm 1970-01-01 01:00:00.000000000 +0100
1.32 -+++ gcc-3.4.6/gcc/config/nios2/crti.asm 2007-08-15 23:09:36.000000000 +0200
1.33 -@@ -0,0 +1,88 @@
1.34 -+/*
1.35 -+ Copyright (C) 2003
1.36 -+ by Jonah Graham (jgraham@altera.com)
1.37 -+
1.38 -+This file is free software; you can redistribute it and/or modify it
1.39 -+under the terms of the GNU General Public License as published by the
1.40 -+Free Software Foundation; either version 2, or (at your option) any
1.41 -+later version.
1.42 -+
1.43 -+In addition to the permissions in the GNU General Public License, the
1.44 -+Free Software Foundation gives you unlimited permission to link the
1.45 -+compiled version of this file with other programs, and to distribute
1.46 -+those programs without any restriction coming from the use of this
1.47 -+file. (The General Public License restrictions do apply in other
1.48 -+respects; for example, they cover modification of the file, and
1.49 -+distribution when not linked into another program.)
1.50 -+
1.51 -+This file is distributed in the hope that it will be useful, but
1.52 -+WITHOUT ANY WARRANTY; without even the implied warranty of
1.53 -+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1.54 -+General Public License for more details.
1.55 -+
1.56 -+You should have received a copy of the GNU General Public License
1.57 -+along with this program; see the file COPYING. If not, write to
1.58 -+the Free Software Foundation, 59 Temple Place - Suite 330,
1.59 -+Boston, MA 02111-1307, USA.
1.60 -+
1.61 -+ As a special exception, if you link this library with files
1.62 -+ compiled with GCC to produce an executable, this does not cause
1.63 -+ the resulting executable to be covered by the GNU General Public License.
1.64 -+ This exception does not however invalidate any other reasons why
1.65 -+ the executable file might be covered by the GNU General Public License.
1.66 -+
1.67 -+
1.68 -+This file just make a stack frame for the contents of the .fini and
1.69 -+.init sections. Users may put any desired instructions in those
1.70 -+sections.
1.71 -+
1.72 -+
1.73 -+While technically any code can be put in the init and fini sections
1.74 -+most stuff will not work other than stuff which obeys the call frame
1.75 -+and ABI. All the call-preserved registers are saved, the call clobbered
1.76 -+registers should have been saved by the code calling init and fini.
1.77 -+
1.78 -+See crtstuff.c for an example of code that inserts itself in the
1.79 -+init and fini sections.
1.80 -+
1.81 -+See crt0.s for the code that calls init and fini.
1.82 -+*/
1.83 -+
1.84 -+ .file "crti.asm"
1.85 -+
1.86 -+ .section ".init"
1.87 -+ .align 2
1.88 -+ .global _init
1.89 -+_init:
1.90 -+ addi sp, sp, -48
1.91 -+ stw ra, 44(sp)
1.92 -+ stw r23, 40(sp)
1.93 -+ stw r22, 36(sp)
1.94 -+ stw r21, 32(sp)
1.95 -+ stw r20, 28(sp)
1.96 -+ stw r19, 24(sp)
1.97 -+ stw r18, 20(sp)
1.98 -+ stw r17, 16(sp)
1.99 -+ stw r16, 12(sp)
1.100 -+ stw fp, 8(sp)
1.101 -+ mov fp, sp
1.102 -+
1.103 -+
1.104 -+ .section ".fini"
1.105 -+ .align 2
1.106 -+ .global _fini
1.107 -+_fini:
1.108 -+ addi sp, sp, -48
1.109 -+ stw ra, 44(sp)
1.110 -+ stw r23, 40(sp)
1.111 -+ stw r22, 36(sp)
1.112 -+ stw r21, 32(sp)
1.113 -+ stw r20, 28(sp)
1.114 -+ stw r19, 24(sp)
1.115 -+ stw r18, 20(sp)
1.116 -+ stw r17, 16(sp)
1.117 -+ stw r16, 12(sp)
1.118 -+ stw fp, 8(sp)
1.119 -+ mov fp, sp
1.120 -+
1.121 -+
1.122 -diff -durN gcc-3.4.6.orig/gcc/config/nios2/crtn.asm gcc-3.4.6/gcc/config/nios2/crtn.asm
1.123 ---- gcc-3.4.6.orig/gcc/config/nios2/crtn.asm 1970-01-01 01:00:00.000000000 +0100
1.124 -+++ gcc-3.4.6/gcc/config/nios2/crtn.asm 2007-08-15 23:09:36.000000000 +0200
1.125 -@@ -0,0 +1,70 @@
1.126 -+/*
1.127 -+ Copyright (C) 2003
1.128 -+ by Jonah Graham (jgraham@altera.com)
1.129 -+
1.130 -+This file is free software; you can redistribute it and/or modify it
1.131 -+under the terms of the GNU General Public License as published by the
1.132 -+Free Software Foundation; either version 2, or (at your option) any
1.133 -+later version.
1.134 -+
1.135 -+In addition to the permissions in the GNU General Public License, the
1.136 -+Free Software Foundation gives you unlimited permission to link the
1.137 -+compiled version of this file with other programs, and to distribute
1.138 -+those programs without any restriction coming from the use of this
1.139 -+file. (The General Public License restrictions do apply in other
1.140 -+respects; for example, they cover modification of the file, and
1.141 -+distribution when not linked into another program.)
1.142 -+
1.143 -+This file is distributed in the hope that it will be useful, but
1.144 -+WITHOUT ANY WARRANTY; without even the implied warranty of
1.145 -+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1.146 -+General Public License for more details.
1.147 -+
1.148 -+You should have received a copy of the GNU General Public License
1.149 -+along with this program; see the file COPYING. If not, write to
1.150 -+the Free Software Foundation, 59 Temple Place - Suite 330,
1.151 -+Boston, MA 02111-1307, USA.
1.152 -+
1.153 -+ As a special exception, if you link this library with files
1.154 -+ compiled with GCC to produce an executable, this does not cause
1.155 -+ the resulting executable to be covered by the GNU General Public License.
1.156 -+ This exception does not however invalidate any other reasons why
1.157 -+ the executable file might be covered by the GNU General Public License.
1.158 -+
1.159 -+
1.160 -+This file just makes sure that the .fini and .init sections do in
1.161 -+fact return. Users may put any desired instructions in those sections.
1.162 -+This file is the last thing linked into any executable.
1.163 -+*/
1.164 -+ .file "crtn.asm"
1.165 -+
1.166 -+
1.167 -+
1.168 -+ .section ".init"
1.169 -+ ldw ra, 44(sp)
1.170 -+ ldw r23, 40(sp)
1.171 -+ ldw r22, 36(sp)
1.172 -+ ldw r21, 32(sp)
1.173 -+ ldw r20, 28(sp)
1.174 -+ ldw r19, 24(sp)
1.175 -+ ldw r18, 20(sp)
1.176 -+ ldw r17, 16(sp)
1.177 -+ ldw r16, 12(sp)
1.178 -+ ldw fp, 8(sp)
1.179 -+ addi sp, sp, -48
1.180 -+ ret
1.181 -+
1.182 -+ .section ".fini"
1.183 -+ ldw ra, 44(sp)
1.184 -+ ldw r23, 40(sp)
1.185 -+ ldw r22, 36(sp)
1.186 -+ ldw r21, 32(sp)
1.187 -+ ldw r20, 28(sp)
1.188 -+ ldw r19, 24(sp)
1.189 -+ ldw r18, 20(sp)
1.190 -+ ldw r17, 16(sp)
1.191 -+ ldw r16, 12(sp)
1.192 -+ ldw fp, 8(sp)
1.193 -+ addi sp, sp, -48
1.194 -+ ret
1.195 -+
1.196 -diff -durN gcc-3.4.6.orig/gcc/config/nios2/lib2-divmod.c gcc-3.4.6/gcc/config/nios2/lib2-divmod.c
1.197 ---- gcc-3.4.6.orig/gcc/config/nios2/lib2-divmod.c 1970-01-01 01:00:00.000000000 +0100
1.198 -+++ gcc-3.4.6/gcc/config/nios2/lib2-divmod.c 2007-08-15 23:09:36.000000000 +0200
1.199 -@@ -0,0 +1,126 @@
1.200 -+
1.201 -+/* We include auto-host.h here to get HAVE_GAS_HIDDEN. This is
1.202 -+ supposedly valid even though this is a "target" file. */
1.203 -+#include "auto-host.h"
1.204 -+
1.205 -+
1.206 -+#include "tconfig.h"
1.207 -+#include "tsystem.h"
1.208 -+#include "coretypes.h"
1.209 -+#include "tm.h"
1.210 -+
1.211 -+
1.212 -+/* Don't use `fancy_abort' here even if config.h says to use it. */
1.213 -+#ifdef abort
1.214 -+#undef abort
1.215 -+#endif
1.216 -+
1.217 -+
1.218 -+#ifdef HAVE_GAS_HIDDEN
1.219 -+#define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden")))
1.220 -+#else
1.221 -+#define ATTRIBUTE_HIDDEN
1.222 -+#endif
1.223 -+
1.224 -+#include "libgcc2.h"
1.225 -+
1.226 -+extern SItype __modsi3 (SItype, SItype);
1.227 -+extern SItype __divsi3 (SItype, SItype);
1.228 -+extern SItype __umodsi3 (SItype, SItype);
1.229 -+extern SItype __udivsi3 (SItype, SItype);
1.230 -+
1.231 -+static USItype udivmodsi4(USItype, USItype, word_type);
1.232 -+
1.233 -+/* 16-bit SI divide and modulo as used in NIOS */
1.234 -+
1.235 -+
1.236 -+static USItype
1.237 -+udivmodsi4(USItype num, USItype den, word_type modwanted)
1.238 -+{
1.239 -+ USItype bit = 1;
1.240 -+ USItype res = 0;
1.241 -+
1.242 -+ while (den < num && bit && !(den & (1L<<31)))
1.243 -+ {
1.244 -+ den <<=1;
1.245 -+ bit <<=1;
1.246 -+ }
1.247 -+ while (bit)
1.248 -+ {
1.249 -+ if (num >= den)
1.250 -+ {
1.251 -+ num -= den;
1.252 -+ res |= bit;
1.253 -+ }
1.254 -+ bit >>=1;
1.255 -+ den >>=1;
1.256 -+ }
1.257 -+ if (modwanted) return num;
1.258 -+ return res;
1.259 -+}
1.260 -+
1.261 -+
1.262 -+SItype
1.263 -+__divsi3 (SItype a, SItype b)
1.264 -+{
1.265 -+ word_type neg = 0;
1.266 -+ SItype res;
1.267 -+
1.268 -+ if (a < 0)
1.269 -+ {
1.270 -+ a = -a;
1.271 -+ neg = !neg;
1.272 -+ }
1.273 -+
1.274 -+ if (b < 0)
1.275 -+ {
1.276 -+ b = -b;
1.277 -+ neg = !neg;
1.278 -+ }
1.279 -+
1.280 -+ res = udivmodsi4 (a, b, 0);
1.281 -+
1.282 -+ if (neg)
1.283 -+ res = -res;
1.284 -+
1.285 -+ return res;
1.286 -+}
1.287 -+
1.288 -+
1.289 -+SItype
1.290 -+__modsi3 (SItype a, SItype b)
1.291 -+{
1.292 -+ word_type neg = 0;
1.293 -+ SItype res;
1.294 -+
1.295 -+ if (a < 0)
1.296 -+ {
1.297 -+ a = -a;
1.298 -+ neg = 1;
1.299 -+ }
1.300 -+
1.301 -+ if (b < 0)
1.302 -+ b = -b;
1.303 -+
1.304 -+ res = udivmodsi4 (a, b, 1);
1.305 -+
1.306 -+ if (neg)
1.307 -+ res = -res;
1.308 -+
1.309 -+ return res;
1.310 -+}
1.311 -+
1.312 -+
1.313 -+SItype
1.314 -+__udivsi3 (SItype a, SItype b)
1.315 -+{
1.316 -+ return udivmodsi4 (a, b, 0);
1.317 -+}
1.318 -+
1.319 -+
1.320 -+SItype
1.321 -+__umodsi3 (SItype a, SItype b)
1.322 -+{
1.323 -+ return udivmodsi4 (a, b, 1);
1.324 -+}
1.325 -+
1.326 -diff -durN gcc-3.4.6.orig/gcc/config/nios2/lib2-divmod-hi.c gcc-3.4.6/gcc/config/nios2/lib2-divmod-hi.c
1.327 ---- gcc-3.4.6.orig/gcc/config/nios2/lib2-divmod-hi.c 1970-01-01 01:00:00.000000000 +0100
1.328 -+++ gcc-3.4.6/gcc/config/nios2/lib2-divmod-hi.c 2007-08-15 23:09:36.000000000 +0200
1.329 -@@ -0,0 +1,123 @@
1.330 -+
1.331 -+/* We include auto-host.h here to get HAVE_GAS_HIDDEN. This is
1.332 -+ supposedly valid even though this is a "target" file. */
1.333 -+#include "auto-host.h"
1.334 -+
1.335 -+
1.336 -+#include "tconfig.h"
1.337 -+#include "tsystem.h"
1.338 -+#include "coretypes.h"
1.339 -+#include "tm.h"
1.340 -+
1.341 -+
1.342 -+/* Don't use `fancy_abort' here even if config.h says to use it. */
1.343 -+#ifdef abort
1.344 -+#undef abort
1.345 -+#endif
1.346 -+
1.347 -+
1.348 -+#ifdef HAVE_GAS_HIDDEN
1.349 -+#define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden")))
1.350 -+#else
1.351 -+#define ATTRIBUTE_HIDDEN
1.352 -+#endif
1.353 -+
1.354 -+#include "libgcc2.h"
1.355 -+
1.356 -+extern HItype __modhi3 (HItype, HItype);
1.357 -+extern HItype __divhi3 (HItype, HItype);
1.358 -+extern HItype __umodhi3 (HItype, HItype);
1.359 -+extern HItype __udivhi3 (HItype, HItype);
1.360 -+
1.361 -+static UHItype udivmodhi4(UHItype, UHItype, word_type);
1.362 -+
1.363 -+static UHItype
1.364 -+udivmodhi4(UHItype num, UHItype den, word_type modwanted)
1.365 -+{
1.366 -+ UHItype bit = 1;
1.367 -+ UHItype res = 0;
1.368 -+
1.369 -+ while (den < num && bit && !(den & (1L<<15)))
1.370 -+ {
1.371 -+ den <<=1;
1.372 -+ bit <<=1;
1.373 -+ }
1.374 -+ while (bit)
1.375 -+ {
1.376 -+ if (num >= den)
1.377 -+ {
1.378 -+ num -= den;
1.379 -+ res |= bit;
1.380 -+ }
1.381 -+ bit >>=1;
1.382 -+ den >>=1;
1.383 -+ }
1.384 -+ if (modwanted) return num;
1.385 -+ return res;
1.386 -+}
1.387 -+
1.388 -+
1.389 -+HItype
1.390 -+__divhi3 (HItype a, HItype b)
1.391 -+{
1.392 -+ word_type neg = 0;
1.393 -+ HItype res;
1.394 -+
1.395 -+ if (a < 0)
1.396 -+ {
1.397 -+ a = -a;
1.398 -+ neg = !neg;
1.399 -+ }
1.400 -+
1.401 -+ if (b < 0)
1.402 -+ {
1.403 -+ b = -b;
1.404 -+ neg = !neg;
1.405 -+ }
1.406 -+
1.407 -+ res = udivmodhi4 (a, b, 0);
1.408 -+
1.409 -+ if (neg)
1.410 -+ res = -res;
1.411 -+
1.412 -+ return res;
1.413 -+}
1.414 -+
1.415 -+
1.416 -+HItype
1.417 -+__modhi3 (HItype a, HItype b)
1.418 -+{
1.419 -+ word_type neg = 0;
1.420 -+ HItype res;
1.421 -+
1.422 -+ if (a < 0)
1.423 -+ {
1.424 -+ a = -a;
1.425 -+ neg = 1;
1.426 -+ }
1.427 -+
1.428 -+ if (b < 0)
1.429 -+ b = -b;
1.430 -+
1.431 -+ res = udivmodhi4 (a, b, 1);
1.432 -+
1.433 -+ if (neg)
1.434 -+ res = -res;
1.435 -+
1.436 -+ return res;
1.437 -+}
1.438 -+
1.439 -+
1.440 -+HItype
1.441 -+__udivhi3 (HItype a, HItype b)
1.442 -+{
1.443 -+ return udivmodhi4 (a, b, 0);
1.444 -+}
1.445 -+
1.446 -+
1.447 -+HItype
1.448 -+__umodhi3 (HItype a, HItype b)
1.449 -+{
1.450 -+ return udivmodhi4 (a, b, 1);
1.451 -+}
1.452 -+
1.453 -diff -durN gcc-3.4.6.orig/gcc/config/nios2/lib2-divtable.c gcc-3.4.6/gcc/config/nios2/lib2-divtable.c
1.454 ---- gcc-3.4.6.orig/gcc/config/nios2/lib2-divtable.c 1970-01-01 01:00:00.000000000 +0100
1.455 -+++ gcc-3.4.6/gcc/config/nios2/lib2-divtable.c 2007-08-15 23:09:36.000000000 +0200
1.456 -@@ -0,0 +1,46 @@
1.457 -+
1.458 -+/* We include auto-host.h here to get HAVE_GAS_HIDDEN. This is
1.459 -+ supposedly valid even though this is a "target" file. */
1.460 -+#include "auto-host.h"
1.461 -+
1.462 -+
1.463 -+#include "tconfig.h"
1.464 -+#include "tsystem.h"
1.465 -+#include "coretypes.h"
1.466 -+#include "tm.h"
1.467 -+
1.468 -+
1.469 -+/* Don't use `fancy_abort' here even if config.h says to use it. */
1.470 -+#ifdef abort
1.471 -+#undef abort
1.472 -+#endif
1.473 -+
1.474 -+
1.475 -+#ifdef HAVE_GAS_HIDDEN
1.476 -+#define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden")))
1.477 -+#else
1.478 -+#define ATTRIBUTE_HIDDEN
1.479 -+#endif
1.480 -+
1.481 -+#include "libgcc2.h"
1.482 -+
1.483 -+UQItype __divsi3_table[] =
1.484 -+{
1.485 -+ 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,
1.486 -+ 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,
1.487 -+ 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,
1.488 -+ 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,
1.489 -+ 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,
1.490 -+ 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,
1.491 -+ 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,
1.492 -+ 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,
1.493 -+ 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,
1.494 -+ 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,
1.495 -+ 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,
1.496 -+ 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,
1.497 -+ 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,
1.498 -+ 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,
1.499 -+ 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,
1.500 -+ 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,
1.501 -+};
1.502 -+
1.503 -diff -durN gcc-3.4.6.orig/gcc/config/nios2/lib2-mul.c gcc-3.4.6/gcc/config/nios2/lib2-mul.c
1.504 ---- gcc-3.4.6.orig/gcc/config/nios2/lib2-mul.c 1970-01-01 01:00:00.000000000 +0100
1.505 -+++ gcc-3.4.6/gcc/config/nios2/lib2-mul.c 2007-08-15 23:09:36.000000000 +0200
1.506 -@@ -0,0 +1,103 @@
1.507 -+/* while we are debugging (ie compile outside of gcc build)
1.508 -+ disable gcc specific headers */
1.509 -+#ifndef DEBUG_MULSI3
1.510 -+
1.511 -+
1.512 -+/* We include auto-host.h here to get HAVE_GAS_HIDDEN. This is
1.513 -+ supposedly valid even though this is a "target" file. */
1.514 -+#include "auto-host.h"
1.515 -+
1.516 -+
1.517 -+#include "tconfig.h"
1.518 -+#include "tsystem.h"
1.519 -+#include "coretypes.h"
1.520 -+#include "tm.h"
1.521 -+
1.522 -+
1.523 -+/* Don't use `fancy_abort' here even if config.h says to use it. */
1.524 -+#ifdef abort
1.525 -+#undef abort
1.526 -+#endif
1.527 -+
1.528 -+
1.529 -+#ifdef HAVE_GAS_HIDDEN
1.530 -+#define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden")))
1.531 -+#else
1.532 -+#define ATTRIBUTE_HIDDEN
1.533 -+#endif
1.534 -+
1.535 -+#include "libgcc2.h"
1.536 -+
1.537 -+#else
1.538 -+#define SItype int
1.539 -+#define USItype unsigned int
1.540 -+#endif
1.541 -+
1.542 -+
1.543 -+extern SItype __mulsi3 (SItype, SItype);
1.544 -+
1.545 -+SItype
1.546 -+__mulsi3 (SItype a, SItype b)
1.547 -+{
1.548 -+ SItype res = 0;
1.549 -+ USItype cnt = a;
1.550 -+
1.551 -+ while (cnt)
1.552 -+ {
1.553 -+ if (cnt & 1)
1.554 -+ {
1.555 -+ res += b;
1.556 -+ }
1.557 -+ b <<= 1;
1.558 -+ cnt >>= 1;
1.559 -+ }
1.560 -+
1.561 -+ return res;
1.562 -+}
1.563 -+/*
1.564 -+TODO: Choose best alternative implementation.
1.565 -+
1.566 -+SItype
1.567 -+__divsi3 (SItype a, SItype b)
1.568 -+{
1.569 -+ SItype res = 0;
1.570 -+ USItype cnt = 0;
1.571 -+
1.572 -+ while (cnt < 32)
1.573 -+ {
1.574 -+ if (a & (1L << cnt))
1.575 -+ {
1.576 -+ res += b;
1.577 -+ }
1.578 -+ b <<= 1;
1.579 -+ cnt++;
1.580 -+ }
1.581 -+
1.582 -+ return res;
1.583 -+}
1.584 -+*/
1.585 -+
1.586 -+
1.587 -+#ifdef DEBUG_MULSI3
1.588 -+
1.589 -+int
1.590 -+main ()
1.591 -+{
1.592 -+ int i, j;
1.593 -+ int error = 0;
1.594 -+
1.595 -+ for (i = -1000; i < 1000; i++)
1.596 -+ for (j = -1000; j < 1000; j++)
1.597 -+ {
1.598 -+ int expect = i * j;
1.599 -+ int actual = A__divsi3 (i, j);
1.600 -+ if (expect != actual)
1.601 -+ {
1.602 -+ printf ("error: %d * %d = %d not %d\n", i, j, expect, actual);
1.603 -+ error = 1;
1.604 -+ }
1.605 -+ }
1.606 -+
1.607 -+ return error;
1.608 -+}
1.609 -+#endif
1.610 -diff -durN gcc-3.4.6.orig/gcc/config/nios2/nios2.c gcc-3.4.6/gcc/config/nios2/nios2.c
1.611 ---- gcc-3.4.6.orig/gcc/config/nios2/nios2.c 1970-01-01 01:00:00.000000000 +0100
1.612 -+++ gcc-3.4.6/gcc/config/nios2/nios2.c 2007-08-15 23:09:36.000000000 +0200
1.613 -@@ -0,0 +1,2853 @@
1.614 -+/* Subroutines for assembler code output for Altera NIOS 2G NIOS2 version.
1.615 -+ Copyright (C) 2003 Altera
1.616 -+ Contributed by Jonah Graham (jgraham@altera.com).
1.617 -+
1.618 -+This file is part of GNU CC.
1.619 -+
1.620 -+GNU CC is free software; you can redistribute it and/or modify
1.621 -+it under the terms of the GNU General Public License as published by
1.622 -+the Free Software Foundation; either version 2, or (at your option)
1.623 -+any later version.
1.624 -+
1.625 -+GNU CC is distributed in the hope that it will be useful,
1.626 -+but WITHOUT ANY WARRANTY; without even the implied warranty of
1.627 -+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1.628 -+GNU General Public License for more details.
1.629 -+
1.630 -+You should have received a copy of the GNU General Public License
1.631 -+along with GNU CC; see the file COPYING. If not, write to
1.632 -+the Free Software Foundation, 59 Temple Place - Suite 330,
1.633 -+Boston, MA 02111-1307, USA. */
1.634 -+
1.635 -+
1.636 -+#include <stdio.h>
1.637 -+#include "config.h"
1.638 -+#include "system.h"
1.639 -+#include "coretypes.h"
1.640 -+#include "tm.h"
1.641 -+#include "rtl.h"
1.642 -+#include "tree.h"
1.643 -+#include "tm_p.h"
1.644 -+#include "regs.h"
1.645 -+#include "hard-reg-set.h"
1.646 -+#include "real.h"
1.647 -+#include "insn-config.h"
1.648 -+#include "conditions.h"
1.649 -+#include "output.h"
1.650 -+#include "insn-attr.h"
1.651 -+#include "flags.h"
1.652 -+#include "recog.h"
1.653 -+#include "expr.h"
1.654 -+#include "toplev.h"
1.655 -+#include "basic-block.h"
1.656 -+#include "function.h"
1.657 -+#include "ggc.h"
1.658 -+#include "reload.h"
1.659 -+#include "debug.h"
1.660 -+#include "optabs.h"
1.661 -+#include "target.h"
1.662 -+#include "target-def.h"
1.663 -+
1.664 -+/* local prototypes */
1.665 -+static bool nios2_rtx_costs (rtx, int, int, int *);
1.666 -+
1.667 -+static void nios2_asm_function_prologue (FILE *, HOST_WIDE_INT);
1.668 -+static int nios2_use_dfa_pipeline_interface (void);
1.669 -+static int nios2_issue_rate (void);
1.670 -+static struct machine_function *nios2_init_machine_status (void);
1.671 -+static bool nios2_in_small_data_p (tree);
1.672 -+static rtx save_reg (int, HOST_WIDE_INT, rtx);
1.673 -+static rtx restore_reg (int, HOST_WIDE_INT);
1.674 -+static unsigned int nios2_section_type_flags (tree, const char *, int);
1.675 -+static void nios2_init_builtins (void);
1.676 -+static rtx nios2_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
1.677 -+static bool nios2_function_ok_for_sibcall (tree, tree);
1.678 -+static void nios2_encode_section_info (tree, rtx, int);
1.679 -+
1.680 -+/* Initialize the GCC target structure. */
1.681 -+#undef TARGET_ASM_FUNCTION_PROLOGUE
1.682 -+#define TARGET_ASM_FUNCTION_PROLOGUE nios2_asm_function_prologue
1.683 -+
1.684 -+#undef TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE
1.685 -+#define TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE \
1.686 -+ nios2_use_dfa_pipeline_interface
1.687 -+#undef TARGET_SCHED_ISSUE_RATE
1.688 -+#define TARGET_SCHED_ISSUE_RATE nios2_issue_rate
1.689 -+#undef TARGET_IN_SMALL_DATA_P
1.690 -+#define TARGET_IN_SMALL_DATA_P nios2_in_small_data_p
1.691 -+#undef TARGET_ENCODE_SECTION_INFO
1.692 -+#define TARGET_ENCODE_SECTION_INFO nios2_encode_section_info
1.693 -+#undef TARGET_SECTION_TYPE_FLAGS
1.694 -+#define TARGET_SECTION_TYPE_FLAGS nios2_section_type_flags
1.695 -+
1.696 -+#undef TARGET_INIT_BUILTINS
1.697 -+#define TARGET_INIT_BUILTINS nios2_init_builtins
1.698 -+#undef TARGET_EXPAND_BUILTIN
1.699 -+#define TARGET_EXPAND_BUILTIN nios2_expand_builtin
1.700 -+
1.701 -+#undef TARGET_FUNCTION_OK_FOR_SIBCALL
1.702 -+#define TARGET_FUNCTION_OK_FOR_SIBCALL nios2_function_ok_for_sibcall
1.703 -+
1.704 -+#undef TARGET_RTX_COSTS
1.705 -+#define TARGET_RTX_COSTS nios2_rtx_costs
1.706 -+
1.707 -+
1.708 -+struct gcc_target targetm = TARGET_INITIALIZER;
1.709 -+
1.710 -+
1.711 -+
1.712 -+/* Threshold for data being put into the small data/bss area, instead
1.713 -+ of the normal data area (references to the small data/bss area take
1.714 -+ 1 instruction, and use the global pointer, references to the normal
1.715 -+ data area takes 2 instructions). */
1.716 -+unsigned HOST_WIDE_INT nios2_section_threshold = NIOS2_DEFAULT_GVALUE;
1.717 -+
1.718 -+
1.719 -+/* Structure to be filled in by compute_frame_size with register
1.720 -+ save masks, and offsets for the current function. */
1.721 -+
1.722 -+struct nios2_frame_info
1.723 -+GTY (())
1.724 -+{
1.725 -+ long total_size; /* # bytes that the entire frame takes up */
1.726 -+ long var_size; /* # bytes that variables take up */
1.727 -+ long args_size; /* # bytes that outgoing arguments take up */
1.728 -+ int save_reg_size; /* # bytes needed to store gp regs */
1.729 -+ int save_reg_rounded; /* # bytes needed to store gp regs */
1.730 -+ long save_regs_offset; /* offset from new sp to store gp registers */
1.731 -+ int initialized; /* != 0 if frame size already calculated */
1.732 -+ int num_regs; /* number of gp registers saved */
1.733 -+};
1.734 -+
1.735 -+struct machine_function
1.736 -+GTY (())
1.737 -+{
1.738 -+
1.739 -+ /* Current frame information, calculated by compute_frame_size. */
1.740 -+ struct nios2_frame_info frame;
1.741 -+};
1.742 -+
1.743 -+
1.744 -+/***************************************
1.745 -+ * Section encodings
1.746 -+ ***************************************/
1.747 -+
1.748 -+
1.749 -+
1.750 -+
1.751 -+
1.752 -+/***************************************
1.753 -+ * Stack Layout and Calling Conventions
1.754 -+ ***************************************/
1.755 -+
1.756 -+
1.757 -+#define TOO_BIG_OFFSET(X) ((X) > ((1 << 15) - 1))
1.758 -+#define TEMP_REG_NUM 8
1.759 -+
1.760 -+static void
1.761 -+nios2_asm_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
1.762 -+{
1.763 -+ if (flag_verbose_asm || flag_debug_asm)
1.764 -+ {
1.765 -+ compute_frame_size ();
1.766 -+ dump_frame_size (file);
1.767 -+ }
1.768 -+}
1.769 -+
1.770 -+static rtx
1.771 -+save_reg (int regno, HOST_WIDE_INT offset, rtx cfa_store_reg)
1.772 -+{
1.773 -+ rtx insn, stack_slot;
1.774 -+
1.775 -+ stack_slot = gen_rtx_PLUS (SImode,
1.776 -+ cfa_store_reg,
1.777 -+ GEN_INT (offset));
1.778 -+
1.779 -+ insn = emit_insn (gen_rtx_SET (SImode,
1.780 -+ gen_rtx_MEM (SImode, stack_slot),
1.781 -+ gen_rtx_REG (SImode, regno)));
1.782 -+
1.783 -+ RTX_FRAME_RELATED_P (insn) = 1;
1.784 -+
1.785 -+ return insn;
1.786 -+}
1.787 -+
1.788 -+static rtx
1.789 -+restore_reg (int regno, HOST_WIDE_INT offset)
1.790 -+{
1.791 -+ rtx insn, stack_slot;
1.792 -+
1.793 -+ if (TOO_BIG_OFFSET (offset))
1.794 -+ {
1.795 -+ stack_slot = gen_rtx_REG (SImode, TEMP_REG_NUM);
1.796 -+ insn = emit_insn (gen_rtx_SET (SImode,
1.797 -+ stack_slot,
1.798 -+ GEN_INT (offset)));
1.799 -+
1.800 -+ insn = emit_insn (gen_rtx_SET (SImode,
1.801 -+ stack_slot,
1.802 -+ gen_rtx_PLUS (SImode,
1.803 -+ stack_slot,
1.804 -+ stack_pointer_rtx)));
1.805 -+ }
1.806 -+ else
1.807 -+ {
1.808 -+ stack_slot = gen_rtx_PLUS (SImode,
1.809 -+ stack_pointer_rtx,
1.810 -+ GEN_INT (offset));
1.811 -+ }
1.812 -+
1.813 -+ stack_slot = gen_rtx_MEM (SImode, stack_slot);
1.814 -+
1.815 -+ insn = emit_move_insn (gen_rtx_REG (SImode, regno), stack_slot);
1.816 -+
1.817 -+ return insn;
1.818 -+}
1.819 -+
1.820 -+
1.821 -+/* There are two possible paths for prologue expansion,
1.822 -+- the first is if the total frame size is < 2^15-1. In that
1.823 -+case all the immediates will fit into the 16-bit immediate
1.824 -+fields.
1.825 -+- the second is when the frame size is too big, in that
1.826 -+case an additional temporary register is used, first
1.827 -+as a cfa_temp to offset the sp, second as the cfa_store
1.828 -+register.
1.829 -+
1.830 -+See the comment above dwarf2out_frame_debug_expr in
1.831 -+dwarf2out.c for more explanation of the "rules."
1.832 -+
1.833 -+
1.834 -+Case 1:
1.835 -+Rule # Example Insn Effect
1.836 -+2 addi sp, sp, -total_frame_size cfa.reg=sp, cfa.offset=total_frame_size
1.837 -+ cfa_store.reg=sp, cfa_store.offset=total_frame_size
1.838 -+12 stw ra, offset(sp)
1.839 -+12 stw r16, offset(sp)
1.840 -+1 mov fp, sp
1.841 -+
1.842 -+Case 2:
1.843 -+Rule # Example Insn Effect
1.844 -+6 movi r8, total_frame_size cfa_temp.reg=r8, cfa_temp.offset=total_frame_size
1.845 -+2 sub sp, sp, r8 cfa.reg=sp, cfa.offset=total_frame_size
1.846 -+ cfa_store.reg=sp, cfa_store.offset=total_frame_size
1.847 -+5 add r8, r8, sp cfa_store.reg=r8, cfa_store.offset=0
1.848 -+12 stw ra, offset(r8)
1.849 -+12 stw r16, offset(r8)
1.850 -+1 mov fp, sp
1.851 -+
1.852 -+*/
1.853 -+
1.854 -+void
1.855 -+expand_prologue ()
1.856 -+{
1.857 -+ int i;
1.858 -+ HOST_WIDE_INT total_frame_size;
1.859 -+ int cfa_store_offset;
1.860 -+ rtx insn;
1.861 -+ rtx cfa_store_reg = 0;
1.862 -+
1.863 -+ total_frame_size = compute_frame_size ();
1.864 -+
1.865 -+ if (total_frame_size)
1.866 -+ {
1.867 -+
1.868 -+ if (TOO_BIG_OFFSET (total_frame_size))
1.869 -+ {
1.870 -+ /* cfa_temp and cfa_store_reg are the same register,
1.871 -+ cfa_store_reg overwrites cfa_temp */
1.872 -+ cfa_store_reg = gen_rtx_REG (SImode, TEMP_REG_NUM);
1.873 -+ insn = emit_insn (gen_rtx_SET (SImode,
1.874 -+ cfa_store_reg,
1.875 -+ GEN_INT (total_frame_size)));
1.876 -+
1.877 -+ RTX_FRAME_RELATED_P (insn) = 1;
1.878 -+
1.879 -+
1.880 -+ insn = gen_rtx_SET (SImode,
1.881 -+ stack_pointer_rtx,
1.882 -+ gen_rtx_MINUS (SImode,
1.883 -+ stack_pointer_rtx,
1.884 -+ cfa_store_reg));
1.885 -+
1.886 -+ insn = emit_insn (insn);
1.887 -+ RTX_FRAME_RELATED_P (insn) = 1;
1.888 -+
1.889 -+
1.890 -+ /* if there are no registers to save, I don't need to
1.891 -+ create a cfa_store */
1.892 -+ if (cfun->machine->frame.save_reg_size)
1.893 -+ {
1.894 -+ insn = gen_rtx_SET (SImode,
1.895 -+ cfa_store_reg,
1.896 -+ gen_rtx_PLUS (SImode,
1.897 -+ cfa_store_reg,
1.898 -+ stack_pointer_rtx));
1.899 -+
1.900 -+ insn = emit_insn (insn);
1.901 -+ RTX_FRAME_RELATED_P (insn) = 1;
1.902 -+ }
1.903 -+
1.904 -+ cfa_store_offset
1.905 -+ = total_frame_size
1.906 -+ - (cfun->machine->frame.save_regs_offset
1.907 -+ + cfun->machine->frame.save_reg_rounded);
1.908 -+ }
1.909 -+ else
1.910 -+ {
1.911 -+ insn = gen_rtx_SET (SImode,
1.912 -+ stack_pointer_rtx,
1.913 -+ gen_rtx_PLUS (SImode,
1.914 -+ stack_pointer_rtx,
1.915 -+ GEN_INT (-total_frame_size)));
1.916 -+ insn = emit_insn (insn);
1.917 -+ RTX_FRAME_RELATED_P (insn) = 1;
1.918 -+
1.919 -+ cfa_store_reg = stack_pointer_rtx;
1.920 -+ cfa_store_offset
1.921 -+ = cfun->machine->frame.save_regs_offset
1.922 -+ + cfun->machine->frame.save_reg_rounded;
1.923 -+ }
1.924 -+ }
1.925 -+
1.926 -+ if (MUST_SAVE_REGISTER (RA_REGNO))
1.927 -+ {
1.928 -+ cfa_store_offset -= 4;
1.929 -+ save_reg (RA_REGNO, cfa_store_offset, cfa_store_reg);
1.930 -+ }
1.931 -+ if (MUST_SAVE_REGISTER (FP_REGNO))
1.932 -+ {
1.933 -+ cfa_store_offset -= 4;
1.934 -+ save_reg (FP_REGNO, cfa_store_offset, cfa_store_reg);
1.935 -+ }
1.936 -+
1.937 -+ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1.938 -+ {
1.939 -+ if (MUST_SAVE_REGISTER (i) && i != FP_REGNO && i != RA_REGNO)
1.940 -+ {
1.941 -+ cfa_store_offset -= 4;
1.942 -+ save_reg (i, cfa_store_offset, cfa_store_reg);
1.943 -+ }
1.944 -+ }
1.945 -+
1.946 -+ if (frame_pointer_needed)
1.947 -+ {
1.948 -+ insn = emit_insn (gen_rtx_SET (SImode,
1.949 -+ gen_rtx_REG (SImode, FP_REGNO),
1.950 -+ gen_rtx_REG (SImode, SP_REGNO)));
1.951 -+
1.952 -+ RTX_FRAME_RELATED_P (insn) = 1;
1.953 -+ }
1.954 -+
1.955 -+ /* If we are profiling, make sure no instructions are scheduled before
1.956 -+ the call to mcount. */
1.957 -+ if (current_function_profile)
1.958 -+ emit_insn (gen_blockage ());
1.959 -+}
1.960 -+
1.961 -+void
1.962 -+expand_epilogue (bool sibcall_p)
1.963 -+{
1.964 -+ rtx insn;
1.965 -+ int i;
1.966 -+ HOST_WIDE_INT total_frame_size;
1.967 -+ int register_store_offset;
1.968 -+
1.969 -+ total_frame_size = compute_frame_size ();
1.970 -+
1.971 -+ if (!sibcall_p && nios2_can_use_return_insn ())
1.972 -+ {
1.973 -+ insn = emit_jump_insn (gen_return ());
1.974 -+ return;
1.975 -+ }
1.976 -+
1.977 -+ emit_insn (gen_blockage ());
1.978 -+
1.979 -+ register_store_offset =
1.980 -+ cfun->machine->frame.save_regs_offset +
1.981 -+ cfun->machine->frame.save_reg_rounded;
1.982 -+
1.983 -+ if (MUST_SAVE_REGISTER (RA_REGNO))
1.984 -+ {
1.985 -+ register_store_offset -= 4;
1.986 -+ restore_reg (RA_REGNO, register_store_offset);
1.987 -+ }
1.988 -+
1.989 -+ if (MUST_SAVE_REGISTER (FP_REGNO))
1.990 -+ {
1.991 -+ register_store_offset -= 4;
1.992 -+ restore_reg (FP_REGNO, register_store_offset);
1.993 -+ }
1.994 -+
1.995 -+ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1.996 -+ {
1.997 -+ if (MUST_SAVE_REGISTER (i) && i != FP_REGNO && i != RA_REGNO)
1.998 -+ {
1.999 -+ register_store_offset -= 4;
1.1000 -+ restore_reg (i, register_store_offset);
1.1001 -+ }
1.1002 -+ }
1.1003 -+
1.1004 -+ if (total_frame_size)
1.1005 -+ {
1.1006 -+ rtx sp_adjust;
1.1007 -+
1.1008 -+ if (TOO_BIG_OFFSET (total_frame_size))
1.1009 -+ {
1.1010 -+ sp_adjust = gen_rtx_REG (SImode, TEMP_REG_NUM);
1.1011 -+ insn = emit_insn (gen_rtx_SET (SImode,
1.1012 -+ sp_adjust,
1.1013 -+ GEN_INT (total_frame_size)));
1.1014 -+
1.1015 -+ }
1.1016 -+ else
1.1017 -+ {
1.1018 -+ sp_adjust = GEN_INT (total_frame_size);
1.1019 -+ }
1.1020 -+
1.1021 -+ insn = gen_rtx_SET (SImode,
1.1022 -+ stack_pointer_rtx,
1.1023 -+ gen_rtx_PLUS (SImode,
1.1024 -+ stack_pointer_rtx,
1.1025 -+ sp_adjust));
1.1026 -+ insn = emit_insn (insn);
1.1027 -+ }
1.1028 -+
1.1029 -+
1.1030 -+ if (!sibcall_p)
1.1031 -+ {
1.1032 -+ insn = emit_jump_insn (gen_return_from_epilogue (gen_rtx (REG, Pmode,
1.1033 -+ RA_REGNO)));
1.1034 -+ }
1.1035 -+}
1.1036 -+
1.1037 -+
1.1038 -+bool
1.1039 -+nios2_function_ok_for_sibcall (tree a ATTRIBUTE_UNUSED, tree b ATTRIBUTE_UNUSED)
1.1040 -+{
1.1041 -+ return true;
1.1042 -+}
1.1043 -+
1.1044 -+
1.1045 -+
1.1046 -+
1.1047 -+
1.1048 -+/* ----------------------- *
1.1049 -+ * Profiling
1.1050 -+ * ----------------------- */
1.1051 -+
1.1052 -+void
1.1053 -+function_profiler (FILE *file, int labelno)
1.1054 -+{
1.1055 -+ fprintf (file, "\t%s mcount begin, label: .LP%d\n",
1.1056 -+ ASM_COMMENT_START, labelno);
1.1057 -+ fprintf (file, "\tnextpc\tr8\n");
1.1058 -+ fprintf (file, "\tmov\tr9, ra\n");
1.1059 -+ fprintf (file, "\tmovhi\tr10, %%hiadj(.LP%d)\n", labelno);
1.1060 -+ fprintf (file, "\taddi\tr10, r10, %%lo(.LP%d)\n", labelno);
1.1061 -+ fprintf (file, "\tcall\tmcount\n");
1.1062 -+ fprintf (file, "\tmov\tra, r9\n");
1.1063 -+ fprintf (file, "\t%s mcount end\n", ASM_COMMENT_START);
1.1064 -+}
1.1065 -+
1.1066 -+
1.1067 -+/***************************************
1.1068 -+ * Stack Layout
1.1069 -+ ***************************************/
1.1070 -+
1.1071 -+
1.1072 -+void
1.1073 -+dump_frame_size (FILE *file)
1.1074 -+{
1.1075 -+ fprintf (file, "\t%s Current Frame Info\n", ASM_COMMENT_START);
1.1076 -+
1.1077 -+ fprintf (file, "\t%s total_size = %ld\n", ASM_COMMENT_START,
1.1078 -+ cfun->machine->frame.total_size);
1.1079 -+ fprintf (file, "\t%s var_size = %ld\n", ASM_COMMENT_START,
1.1080 -+ cfun->machine->frame.var_size);
1.1081 -+ fprintf (file, "\t%s args_size = %ld\n", ASM_COMMENT_START,
1.1082 -+ cfun->machine->frame.args_size);
1.1083 -+ fprintf (file, "\t%s save_reg_size = %d\n", ASM_COMMENT_START,
1.1084 -+ cfun->machine->frame.save_reg_size);
1.1085 -+ fprintf (file, "\t%s save_reg_rounded = %d\n", ASM_COMMENT_START,
1.1086 -+ cfun->machine->frame.save_reg_rounded);
1.1087 -+ fprintf (file, "\t%s initialized = %d\n", ASM_COMMENT_START,
1.1088 -+ cfun->machine->frame.initialized);
1.1089 -+ fprintf (file, "\t%s num_regs = %d\n", ASM_COMMENT_START,
1.1090 -+ cfun->machine->frame.num_regs);
1.1091 -+ fprintf (file, "\t%s save_regs_offset = %ld\n", ASM_COMMENT_START,
1.1092 -+ cfun->machine->frame.save_regs_offset);
1.1093 -+ fprintf (file, "\t%s current_function_is_leaf = %d\n", ASM_COMMENT_START,
1.1094 -+ current_function_is_leaf);
1.1095 -+ fprintf (file, "\t%s frame_pointer_needed = %d\n", ASM_COMMENT_START,
1.1096 -+ frame_pointer_needed);
1.1097 -+ fprintf (file, "\t%s pretend_args_size = %d\n", ASM_COMMENT_START,
1.1098 -+ current_function_pretend_args_size);
1.1099 -+
1.1100 -+}
1.1101 -+
1.1102 -+
1.1103 -+/* Return the bytes needed to compute the frame pointer from the current
1.1104 -+ stack pointer.
1.1105 -+*/
1.1106 -+
1.1107 -+HOST_WIDE_INT
1.1108 -+compute_frame_size ()
1.1109 -+{
1.1110 -+ unsigned int regno;
1.1111 -+ HOST_WIDE_INT var_size; /* # of var. bytes allocated */
1.1112 -+ HOST_WIDE_INT total_size; /* # bytes that the entire frame takes up */
1.1113 -+ HOST_WIDE_INT save_reg_size; /* # bytes needed to store callee save regs */
1.1114 -+ HOST_WIDE_INT save_reg_rounded;
1.1115 -+ /* # bytes needed to store callee save regs (rounded) */
1.1116 -+ HOST_WIDE_INT out_args_size; /* # bytes needed for outgoing args */
1.1117 -+
1.1118 -+ save_reg_size = 0;
1.1119 -+ var_size = STACK_ALIGN (get_frame_size ());
1.1120 -+ out_args_size = STACK_ALIGN (current_function_outgoing_args_size);
1.1121 -+
1.1122 -+ total_size = var_size + out_args_size;
1.1123 -+
1.1124 -+ /* Calculate space needed for gp registers. */
1.1125 -+ for (regno = 0; regno <= FIRST_PSEUDO_REGISTER; regno++)
1.1126 -+ {
1.1127 -+ if (MUST_SAVE_REGISTER (regno))
1.1128 -+ {
1.1129 -+ save_reg_size += 4;
1.1130 -+ }
1.1131 -+ }
1.1132 -+
1.1133 -+ save_reg_rounded = STACK_ALIGN (save_reg_size);
1.1134 -+ total_size += save_reg_rounded;
1.1135 -+
1.1136 -+ total_size += STACK_ALIGN (current_function_pretend_args_size);
1.1137 -+
1.1138 -+ /* Save other computed information. */
1.1139 -+ cfun->machine->frame.total_size = total_size;
1.1140 -+ cfun->machine->frame.var_size = var_size;
1.1141 -+ cfun->machine->frame.args_size = current_function_outgoing_args_size;
1.1142 -+ cfun->machine->frame.save_reg_size = save_reg_size;
1.1143 -+ cfun->machine->frame.save_reg_rounded = save_reg_rounded;
1.1144 -+ cfun->machine->frame.initialized = reload_completed;
1.1145 -+ cfun->machine->frame.num_regs = save_reg_size / UNITS_PER_WORD;
1.1146 -+
1.1147 -+ cfun->machine->frame.save_regs_offset
1.1148 -+ = save_reg_rounded ? current_function_outgoing_args_size + var_size : 0;
1.1149 -+
1.1150 -+ return total_size;
1.1151 -+}
1.1152 -+
1.1153 -+
1.1154 -+int
1.1155 -+nios2_initial_elimination_offset (int from, int to ATTRIBUTE_UNUSED)
1.1156 -+{
1.1157 -+ int offset;
1.1158 -+
1.1159 -+ /* Set OFFSET to the offset from the stack pointer. */
1.1160 -+ switch (from)
1.1161 -+ {
1.1162 -+ case FRAME_POINTER_REGNUM:
1.1163 -+ offset = 0;
1.1164 -+ break;
1.1165 -+
1.1166 -+ case ARG_POINTER_REGNUM:
1.1167 -+ compute_frame_size ();
1.1168 -+ offset = cfun->machine->frame.total_size;
1.1169 -+ offset -= current_function_pretend_args_size;
1.1170 -+ break;
1.1171 -+
1.1172 -+ case RETURN_ADDRESS_POINTER_REGNUM:
1.1173 -+ compute_frame_size ();
1.1174 -+ /* since the return address is always the first of the
1.1175 -+ saved registers, return the offset to the beginning
1.1176 -+ of the saved registers block */
1.1177 -+ offset = cfun->machine->frame.save_regs_offset;
1.1178 -+ break;
1.1179 -+
1.1180 -+ default:
1.1181 -+ abort ();
1.1182 -+ }
1.1183 -+
1.1184 -+ return offset;
1.1185 -+}
1.1186 -+
1.1187 -+/* Return nonzero if this function is known to have a null epilogue.
1.1188 -+ This allows the optimizer to omit jumps to jumps if no stack
1.1189 -+ was created. */
1.1190 -+int
1.1191 -+nios2_can_use_return_insn ()
1.1192 -+{
1.1193 -+ if (!reload_completed)
1.1194 -+ return 0;
1.1195 -+
1.1196 -+ if (regs_ever_live[RA_REGNO] || current_function_profile)
1.1197 -+ return 0;
1.1198 -+
1.1199 -+ if (cfun->machine->frame.initialized)
1.1200 -+ return cfun->machine->frame.total_size == 0;
1.1201 -+
1.1202 -+ return compute_frame_size () == 0;
1.1203 -+}
1.1204 -+
1.1205 -+
1.1206 -+
1.1207 -+
1.1208 -+
1.1209 -+/***************************************
1.1210 -+ *
1.1211 -+ ***************************************/
1.1212 -+
1.1213 -+const char *nios2_sys_nosys_string; /* for -msys=nosys */
1.1214 -+const char *nios2_sys_lib_string; /* for -msys-lib= */
1.1215 -+const char *nios2_sys_crt0_string; /* for -msys-crt0= */
1.1216 -+
1.1217 -+void
1.1218 -+override_options ()
1.1219 -+{
1.1220 -+ /* Function to allocate machine-dependent function status. */
1.1221 -+ init_machine_status = &nios2_init_machine_status;
1.1222 -+
1.1223 -+ nios2_section_threshold
1.1224 -+ = g_switch_set ? g_switch_value : NIOS2_DEFAULT_GVALUE;
1.1225 -+
1.1226 -+ if (nios2_sys_nosys_string && *nios2_sys_nosys_string)
1.1227 -+ {
1.1228 -+ error ("invalid option '-msys=nosys%s'", nios2_sys_nosys_string);
1.1229 -+ }
1.1230 -+
1.1231 -+ /* If we don't have mul, we don't have mulx either! */
1.1232 -+ if (!TARGET_HAS_MUL && TARGET_HAS_MULX)
1.1233 -+ {
1.1234 -+ target_flags &= ~HAS_MULX_FLAG;
1.1235 -+ }
1.1236 -+
1.1237 -+}
1.1238 -+
1.1239 -+void
1.1240 -+optimization_options (int level, int size)
1.1241 -+{
1.1242 -+ if (level || size)
1.1243 -+ {
1.1244 -+ target_flags |= INLINE_MEMCPY_FLAG;
1.1245 -+ }
1.1246 -+
1.1247 -+ if (level >= 3 && !size)
1.1248 -+ {
1.1249 -+ target_flags |= FAST_SW_DIV_FLAG;
1.1250 -+ }
1.1251 -+}
1.1252 -+
1.1253 -+/* Allocate a chunk of memory for per-function machine-dependent data. */
1.1254 -+static struct machine_function *
1.1255 -+nios2_init_machine_status ()
1.1256 -+{
1.1257 -+ return ((struct machine_function *)
1.1258 -+ ggc_alloc_cleared (sizeof (struct machine_function)));
1.1259 -+}
1.1260 -+
1.1261 -+
1.1262 -+
1.1263 -+/*****************
1.1264 -+ * Describing Relative Costs of Operations
1.1265 -+ *****************/
1.1266 -+
1.1267 -+/* Compute a (partial) cost for rtx X. Return true if the complete
1.1268 -+ cost has been computed, and false if subexpressions should be
1.1269 -+ scanned. In either case, *TOTAL contains the cost result. */
1.1270 -+
1.1271 -+
1.1272 -+
1.1273 -+static bool
1.1274 -+nios2_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED, int *total)
1.1275 -+{
1.1276 -+ switch (code)
1.1277 -+ {
1.1278 -+ case CONST_INT:
1.1279 -+ if (INTVAL (x) == 0)
1.1280 -+ {
1.1281 -+ *total = COSTS_N_INSNS (0);
1.1282 -+ return true;
1.1283 -+ }
1.1284 -+ else if (SMALL_INT (INTVAL (x))
1.1285 -+ || SMALL_INT_UNSIGNED (INTVAL (x))
1.1286 -+ || UPPER16_INT (INTVAL (x)))
1.1287 -+ {
1.1288 -+ *total = COSTS_N_INSNS (2);
1.1289 -+ return true;
1.1290 -+ }
1.1291 -+ else
1.1292 -+ {
1.1293 -+ *total = COSTS_N_INSNS (4);
1.1294 -+ return true;
1.1295 -+ }
1.1296 -+
1.1297 -+ case LABEL_REF:
1.1298 -+ case SYMBOL_REF:
1.1299 -+ /* ??? gp relative stuff will fit in here */
1.1300 -+ /* fall through */
1.1301 -+ case CONST:
1.1302 -+ case CONST_DOUBLE:
1.1303 -+ {
1.1304 -+ *total = COSTS_N_INSNS (4);
1.1305 -+ return true;
1.1306 -+ }
1.1307 -+
1.1308 -+ case MULT:
1.1309 -+ {
1.1310 -+ *total = COSTS_N_INSNS (1);
1.1311 -+ return false;
1.1312 -+ }
1.1313 -+ case SIGN_EXTEND:
1.1314 -+ {
1.1315 -+ *total = COSTS_N_INSNS (3);
1.1316 -+ return false;
1.1317 -+ }
1.1318 -+ case ZERO_EXTEND:
1.1319 -+ {
1.1320 -+ *total = COSTS_N_INSNS (1);
1.1321 -+ return false;
1.1322 -+ }
1.1323 -+
1.1324 -+ default:
1.1325 -+ return false;
1.1326 -+ }
1.1327 -+}
1.1328 -+
1.1329 -+
1.1330 -+/***************************************
1.1331 -+ * INSTRUCTION SUPPORT
1.1332 -+ *
1.1333 -+ * These functions are used within the Machine Description to
1.1334 -+ * handle common or complicated output and expansions from
1.1335 -+ * instructions.
1.1336 -+ ***************************************/
1.1337 -+
1.1338 -+int
1.1339 -+nios2_emit_move_sequence (rtx *operands, enum machine_mode mode)
1.1340 -+{
1.1341 -+ rtx to = operands[0];
1.1342 -+ rtx from = operands[1];
1.1343 -+
1.1344 -+ if (!register_operand (to, mode) && !reg_or_0_operand (from, mode))
1.1345 -+ {
1.1346 -+ if (no_new_pseudos)
1.1347 -+ internal_error ("Trying to force_reg no_new_pseudos == 1");
1.1348 -+ from = copy_to_mode_reg (mode, from);
1.1349 -+ }
1.1350 -+
1.1351 -+ operands[0] = to;
1.1352 -+ operands[1] = from;
1.1353 -+ return 0;
1.1354 -+}
1.1355 -+
1.1356 -+/* Divide Support */
1.1357 -+
1.1358 -+/*
1.1359 -+ If -O3 is used, we want to output a table lookup for
1.1360 -+ divides between small numbers (both num and den >= 0
1.1361 -+ and < 0x10). The overhead of this method in the worse
1.1362 -+ case is 40 bytes in the text section (10 insns) and
1.1363 -+ 256 bytes in the data section. Additional divides do
1.1364 -+ not incur additional penalties in the data section.
1.1365 -+
1.1366 -+ Code speed is improved for small divides by about 5x
1.1367 -+ when using this method in the worse case (~9 cycles
1.1368 -+ vs ~45). And in the worse case divides not within the
1.1369 -+ table are penalized by about 10% (~5 cycles vs ~45).
1.1370 -+ However in the typical case the penalty is not as bad
1.1371 -+ because doing the long divide in only 45 cycles is
1.1372 -+ quite optimistic.
1.1373 -+
1.1374 -+ ??? It would be nice to have some benchmarks other
1.1375 -+ than Dhrystone to back this up.
1.1376 -+
1.1377 -+ This bit of expansion is to create this instruction
1.1378 -+ sequence as rtl.
1.1379 -+ or $8, $4, $5
1.1380 -+ slli $9, $4, 4
1.1381 -+ cmpgeui $3, $8, 16
1.1382 -+ beq $3, $0, .L3
1.1383 -+ or $10, $9, $5
1.1384 -+ add $12, $11, divide_table
1.1385 -+ ldbu $2, 0($12)
1.1386 -+ br .L1
1.1387 -+.L3:
1.1388 -+ call slow_div
1.1389 -+.L1:
1.1390 -+# continue here with result in $2
1.1391 -+
1.1392 -+ ??? Ideally I would like the emit libcall block to contain
1.1393 -+ all of this code, but I don't know how to do that. What it
1.1394 -+ means is that if the divide can be eliminated, it may not
1.1395 -+ completely disappear.
1.1396 -+
1.1397 -+ ??? The __divsi3_table label should ideally be moved out
1.1398 -+ of this block and into a global. If it is placed into the
1.1399 -+ sdata section we can save even more cycles by doing things
1.1400 -+ gp relative.
1.1401 -+*/
1.1402 -+int
1.1403 -+nios2_emit_expensive_div (rtx *operands, enum machine_mode mode)
1.1404 -+{
1.1405 -+ rtx or_result, shift_left_result;
1.1406 -+ rtx lookup_value;
1.1407 -+ rtx lab1, lab3;
1.1408 -+ rtx insns;
1.1409 -+ rtx libfunc;
1.1410 -+ rtx final_result;
1.1411 -+ rtx tmp;
1.1412 -+
1.1413 -+ /* it may look a little generic, but only SImode
1.1414 -+ is supported for now */
1.1415 -+ if (mode != SImode)
1.1416 -+ abort ();
1.1417 -+
1.1418 -+ libfunc = sdiv_optab->handlers[(int) SImode].libfunc;
1.1419 -+
1.1420 -+
1.1421 -+
1.1422 -+ lab1 = gen_label_rtx ();
1.1423 -+ lab3 = gen_label_rtx ();
1.1424 -+
1.1425 -+ or_result = expand_simple_binop (SImode, IOR,
1.1426 -+ operands[1], operands[2],
1.1427 -+ 0, 0, OPTAB_LIB_WIDEN);
1.1428 -+
1.1429 -+ emit_cmp_and_jump_insns (or_result, GEN_INT (15), GTU, 0,
1.1430 -+ GET_MODE (or_result), 0, lab3);
1.1431 -+ JUMP_LABEL (get_last_insn ()) = lab3;
1.1432 -+
1.1433 -+ shift_left_result = expand_simple_binop (SImode, ASHIFT,
1.1434 -+ operands[1], GEN_INT (4),
1.1435 -+ 0, 0, OPTAB_LIB_WIDEN);
1.1436 -+
1.1437 -+ lookup_value = expand_simple_binop (SImode, IOR,
1.1438 -+ shift_left_result, operands[2],
1.1439 -+ 0, 0, OPTAB_LIB_WIDEN);
1.1440 -+
1.1441 -+ convert_move (operands[0],
1.1442 -+ gen_rtx (MEM, QImode,
1.1443 -+ gen_rtx (PLUS, SImode,
1.1444 -+ lookup_value,
1.1445 -+ gen_rtx_SYMBOL_REF (SImode, "__divsi3_table"))),
1.1446 -+ 1);
1.1447 -+
1.1448 -+
1.1449 -+ tmp = emit_jump_insn (gen_jump (lab1));
1.1450 -+ JUMP_LABEL (tmp) = lab1;
1.1451 -+ emit_barrier ();
1.1452 -+
1.1453 -+ emit_label (lab3);
1.1454 -+ LABEL_NUSES (lab3) = 1;
1.1455 -+
1.1456 -+ start_sequence ();
1.1457 -+ final_result = emit_library_call_value (libfunc, NULL_RTX,
1.1458 -+ LCT_CONST, SImode, 2,
1.1459 -+ operands[1], SImode,
1.1460 -+ operands[2], SImode);
1.1461 -+
1.1462 -+
1.1463 -+ insns = get_insns ();
1.1464 -+ end_sequence ();
1.1465 -+ emit_libcall_block (insns, operands[0], final_result,
1.1466 -+ gen_rtx (DIV, SImode, operands[1], operands[2]));
1.1467 -+
1.1468 -+ emit_label (lab1);
1.1469 -+ LABEL_NUSES (lab1) = 1;
1.1470 -+ return 1;
1.1471 -+}
1.1472 -+
1.1473 -+/* Branches/Compares */
1.1474 -+
1.1475 -+/* the way of handling branches/compares
1.1476 -+ in gcc is heavily borrowed from MIPS */
1.1477 -+
1.1478 -+enum internal_test
1.1479 -+{
1.1480 -+ ITEST_EQ,
1.1481 -+ ITEST_NE,
1.1482 -+ ITEST_GT,
1.1483 -+ ITEST_GE,
1.1484 -+ ITEST_LT,
1.1485 -+ ITEST_LE,
1.1486 -+ ITEST_GTU,
1.1487 -+ ITEST_GEU,
1.1488 -+ ITEST_LTU,
1.1489 -+ ITEST_LEU,
1.1490 -+ ITEST_MAX
1.1491 -+};
1.1492 -+
1.1493 -+static enum internal_test map_test_to_internal_test (enum rtx_code);
1.1494 -+
1.1495 -+/* Cached operands, and operator to compare for use in set/branch/trap
1.1496 -+ on condition codes. */
1.1497 -+rtx branch_cmp[2];
1.1498 -+enum cmp_type branch_type;
1.1499 -+
1.1500 -+/* Make normal rtx_code into something we can index from an array */
1.1501 -+
1.1502 -+static enum internal_test
1.1503 -+map_test_to_internal_test (enum rtx_code test_code)
1.1504 -+{
1.1505 -+ enum internal_test test = ITEST_MAX;
1.1506 -+
1.1507 -+ switch (test_code)
1.1508 -+ {
1.1509 -+ case EQ:
1.1510 -+ test = ITEST_EQ;
1.1511 -+ break;
1.1512 -+ case NE:
1.1513 -+ test = ITEST_NE;
1.1514 -+ break;
1.1515 -+ case GT:
1.1516 -+ test = ITEST_GT;
1.1517 -+ break;
1.1518 -+ case GE:
1.1519 -+ test = ITEST_GE;
1.1520 -+ break;
1.1521 -+ case LT:
1.1522 -+ test = ITEST_LT;
1.1523 -+ break;
1.1524 -+ case LE:
1.1525 -+ test = ITEST_LE;
1.1526 -+ break;
1.1527 -+ case GTU:
1.1528 -+ test = ITEST_GTU;
1.1529 -+ break;
1.1530 -+ case GEU:
1.1531 -+ test = ITEST_GEU;
1.1532 -+ break;
1.1533 -+ case LTU:
1.1534 -+ test = ITEST_LTU;
1.1535 -+ break;
1.1536 -+ case LEU:
1.1537 -+ test = ITEST_LEU;
1.1538 -+ break;
1.1539 -+ default:
1.1540 -+ break;
1.1541 -+ }
1.1542 -+
1.1543 -+ return test;
1.1544 -+}
1.1545 -+
1.1546 -+/* Generate the code to compare (and possibly branch) two integer values
1.1547 -+ TEST_CODE is the comparison code we are trying to emulate
1.1548 -+ (or implement directly)
1.1549 -+ RESULT is where to store the result of the comparison,
1.1550 -+ or null to emit a branch
1.1551 -+ CMP0 CMP1 are the two comparison operands
1.1552 -+ DESTINATION is the destination of the branch, or null to only compare
1.1553 -+ */
1.1554 -+
1.1555 -+void
1.1556 -+gen_int_relational (enum rtx_code test_code, /* relational test (EQ, etc) */
1.1557 -+ rtx result, /* result to store comp. or 0 if branch */
1.1558 -+ rtx cmp0, /* first operand to compare */
1.1559 -+ rtx cmp1, /* second operand to compare */
1.1560 -+ rtx destination) /* destination of the branch, or 0 if compare */
1.1561 -+{
1.1562 -+ struct cmp_info
1.1563 -+ {
1.1564 -+ /* for register (or 0) compares */
1.1565 -+ enum rtx_code test_code_reg; /* code to use in instruction (LT vs. LTU) */
1.1566 -+ int reverse_regs; /* reverse registers in test */
1.1567 -+
1.1568 -+ /* for immediate compares */
1.1569 -+ enum rtx_code test_code_const;
1.1570 -+ /* code to use in instruction (LT vs. LTU) */
1.1571 -+ int const_low; /* low bound of constant we can accept */
1.1572 -+ int const_high; /* high bound of constant we can accept */
1.1573 -+ int const_add; /* constant to add */
1.1574 -+
1.1575 -+ /* generic info */
1.1576 -+ int unsignedp; /* != 0 for unsigned comparisons. */
1.1577 -+ };
1.1578 -+
1.1579 -+ static const struct cmp_info info[(int) ITEST_MAX] = {
1.1580 -+
1.1581 -+ {EQ, 0, EQ, -32768, 32767, 0, 0}, /* EQ */
1.1582 -+ {NE, 0, NE, -32768, 32767, 0, 0}, /* NE */
1.1583 -+
1.1584 -+ {LT, 1, GE, -32769, 32766, 1, 0}, /* GT */
1.1585 -+ {GE, 0, GE, -32768, 32767, 0, 0}, /* GE */
1.1586 -+ {LT, 0, LT, -32768, 32767, 0, 0}, /* LT */
1.1587 -+ {GE, 1, LT, -32769, 32766, 1, 0}, /* LE */
1.1588 -+
1.1589 -+ {LTU, 1, GEU, 0, 65534, 1, 0}, /* GTU */
1.1590 -+ {GEU, 0, GEU, 0, 65535, 0, 0}, /* GEU */
1.1591 -+ {LTU, 0, LTU, 0, 65535, 0, 0}, /* LTU */
1.1592 -+ {GEU, 1, LTU, 0, 65534, 1, 0}, /* LEU */
1.1593 -+ };
1.1594 -+
1.1595 -+ enum internal_test test;
1.1596 -+ enum machine_mode mode;
1.1597 -+ const struct cmp_info *p_info;
1.1598 -+ int branch_p;
1.1599 -+
1.1600 -+
1.1601 -+
1.1602 -+
1.1603 -+ test = map_test_to_internal_test (test_code);
1.1604 -+ if (test == ITEST_MAX)
1.1605 -+ abort ();
1.1606 -+
1.1607 -+ p_info = &info[(int) test];
1.1608 -+
1.1609 -+ mode = GET_MODE (cmp0);
1.1610 -+ if (mode == VOIDmode)
1.1611 -+ mode = GET_MODE (cmp1);
1.1612 -+
1.1613 -+ branch_p = (destination != 0);
1.1614 -+
1.1615 -+ /* We can't, under any circumstances, have const_ints in cmp0
1.1616 -+ ??? Actually we could have const0 */
1.1617 -+ if (GET_CODE (cmp0) == CONST_INT)
1.1618 -+ cmp0 = force_reg (mode, cmp0);
1.1619 -+
1.1620 -+ /* if the comparison is against an int not in legal range
1.1621 -+ move it into a register */
1.1622 -+ if (GET_CODE (cmp1) == CONST_INT)
1.1623 -+ {
1.1624 -+ HOST_WIDE_INT value = INTVAL (cmp1);
1.1625 -+
1.1626 -+ if (value < p_info->const_low || value > p_info->const_high)
1.1627 -+ cmp1 = force_reg (mode, cmp1);
1.1628 -+ }
1.1629 -+
1.1630 -+ /* Comparison to constants, may involve adding 1 to change a GT into GE.
1.1631 -+ Comparison between two registers, may involve switching operands. */
1.1632 -+ if (GET_CODE (cmp1) == CONST_INT)
1.1633 -+ {
1.1634 -+ if (p_info->const_add != 0)
1.1635 -+ {
1.1636 -+ HOST_WIDE_INT new = INTVAL (cmp1) + p_info->const_add;
1.1637 -+
1.1638 -+ /* If modification of cmp1 caused overflow,
1.1639 -+ we would get the wrong answer if we follow the usual path;
1.1640 -+ thus, x > 0xffffffffU would turn into x > 0U. */
1.1641 -+ if ((p_info->unsignedp
1.1642 -+ ? (unsigned HOST_WIDE_INT) new >
1.1643 -+ (unsigned HOST_WIDE_INT) INTVAL (cmp1)
1.1644 -+ : new > INTVAL (cmp1)) != (p_info->const_add > 0))
1.1645 -+ {
1.1646 -+ /* ??? This case can never happen with the current numbers,
1.1647 -+ but I am paranoid and would rather an abort than
1.1648 -+ a bug I will never find */
1.1649 -+ abort ();
1.1650 -+ }
1.1651 -+ else
1.1652 -+ cmp1 = GEN_INT (new);
1.1653 -+ }
1.1654 -+ }
1.1655 -+
1.1656 -+ else if (p_info->reverse_regs)
1.1657 -+ {
1.1658 -+ rtx temp = cmp0;
1.1659 -+ cmp0 = cmp1;
1.1660 -+ cmp1 = temp;
1.1661 -+ }
1.1662 -+
1.1663 -+
1.1664 -+
1.1665 -+ if (branch_p)
1.1666 -+ {
1.1667 -+ if (register_operand (cmp0, mode) && register_operand (cmp1, mode))
1.1668 -+ {
1.1669 -+ rtx insn;
1.1670 -+ rtx cond = gen_rtx (p_info->test_code_reg, mode, cmp0, cmp1);
1.1671 -+ rtx label = gen_rtx_LABEL_REF (VOIDmode, destination);
1.1672 -+
1.1673 -+ insn = gen_rtx_SET (VOIDmode, pc_rtx,
1.1674 -+ gen_rtx_IF_THEN_ELSE (VOIDmode,
1.1675 -+ cond, label, pc_rtx));
1.1676 -+ emit_jump_insn (insn);
1.1677 -+ }
1.1678 -+ else
1.1679 -+ {
1.1680 -+ rtx cond, label;
1.1681 -+
1.1682 -+ result = gen_reg_rtx (mode);
1.1683 -+
1.1684 -+ emit_move_insn (result,
1.1685 -+ gen_rtx (p_info->test_code_const, mode, cmp0,
1.1686 -+ cmp1));
1.1687 -+
1.1688 -+ cond = gen_rtx (NE, mode, result, const0_rtx);
1.1689 -+ label = gen_rtx_LABEL_REF (VOIDmode, destination);
1.1690 -+
1.1691 -+ emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
1.1692 -+ gen_rtx_IF_THEN_ELSE (VOIDmode,
1.1693 -+ cond,
1.1694 -+ label, pc_rtx)));
1.1695 -+ }
1.1696 -+ }
1.1697 -+ else
1.1698 -+ {
1.1699 -+ if (register_operand (cmp0, mode) && register_operand (cmp1, mode))
1.1700 -+ {
1.1701 -+ emit_move_insn (result,
1.1702 -+ gen_rtx (p_info->test_code_reg, mode, cmp0, cmp1));
1.1703 -+ }
1.1704 -+ else
1.1705 -+ {
1.1706 -+ emit_move_insn (result,
1.1707 -+ gen_rtx (p_info->test_code_const, mode, cmp0,
1.1708 -+ cmp1));
1.1709 -+ }
1.1710 -+ }
1.1711 -+
1.1712 -+}
1.1713 -+
1.1714 -+
1.1715 -+/* ??? For now conditional moves are only supported
1.1716 -+ when the mode of the operands being compared are
1.1717 -+ the same as the ones being moved */
1.1718 -+
1.1719 -+void
1.1720 -+gen_conditional_move (rtx *operands, enum machine_mode mode)
1.1721 -+{
1.1722 -+ rtx insn, cond;
1.1723 -+ rtx cmp_reg = gen_reg_rtx (mode);
1.1724 -+ enum rtx_code cmp_code = GET_CODE (operands[1]);
1.1725 -+ enum rtx_code move_code = EQ;
1.1726 -+
1.1727 -+ /* emit a comparison if it is not "simple".
1.1728 -+ Simple comparisons are X eq 0 and X ne 0 */
1.1729 -+ if ((cmp_code == EQ || cmp_code == NE) && branch_cmp[1] == const0_rtx)
1.1730 -+ {
1.1731 -+ cmp_reg = branch_cmp[0];
1.1732 -+ move_code = cmp_code;
1.1733 -+ }
1.1734 -+ else if ((cmp_code == EQ || cmp_code == NE) && branch_cmp[0] == const0_rtx)
1.1735 -+ {
1.1736 -+ cmp_reg = branch_cmp[1];
1.1737 -+ move_code = cmp_code == EQ ? NE : EQ;
1.1738 -+ }
1.1739 -+ else
1.1740 -+ gen_int_relational (cmp_code, cmp_reg, branch_cmp[0], branch_cmp[1],
1.1741 -+ NULL_RTX);
1.1742 -+
1.1743 -+ cond = gen_rtx (move_code, VOIDmode, cmp_reg, CONST0_RTX (mode));
1.1744 -+ insn = gen_rtx_SET (mode, operands[0],
1.1745 -+ gen_rtx_IF_THEN_ELSE (mode,
1.1746 -+ cond, operands[2], operands[3]));
1.1747 -+ emit_insn (insn);
1.1748 -+}
1.1749 -+
1.1750 -+/*******************
1.1751 -+ * Addressing Modes
1.1752 -+ *******************/
1.1753 -+
1.1754 -+int
1.1755 -+nios2_legitimate_address (rtx operand, enum machine_mode mode ATTRIBUTE_UNUSED,
1.1756 -+ int strict)
1.1757 -+{
1.1758 -+ int ret_val = 0;
1.1759 -+
1.1760 -+ switch (GET_CODE (operand))
1.1761 -+ {
1.1762 -+ /* direct. */
1.1763 -+ case SYMBOL_REF:
1.1764 -+ if (SYMBOL_REF_IN_NIOS2_SMALL_DATA_P (operand))
1.1765 -+ {
1.1766 -+ ret_val = 1;
1.1767 -+ break;
1.1768 -+ }
1.1769 -+ /* else, fall through */
1.1770 -+ case LABEL_REF:
1.1771 -+ case CONST_INT:
1.1772 -+ case CONST:
1.1773 -+ case CONST_DOUBLE:
1.1774 -+ /* ??? In here I need to add gp addressing */
1.1775 -+ ret_val = 0;
1.1776 -+
1.1777 -+ break;
1.1778 -+
1.1779 -+ /* Register indirect. */
1.1780 -+ case REG:
1.1781 -+ ret_val = REG_OK_FOR_BASE_P2 (operand, strict);
1.1782 -+ break;
1.1783 -+
1.1784 -+ /* Register indirect with displacement */
1.1785 -+ case PLUS:
1.1786 -+ {
1.1787 -+ rtx op0 = XEXP (operand, 0);
1.1788 -+ rtx op1 = XEXP (operand, 1);
1.1789 -+
1.1790 -+ if (REG_P (op0) && REG_P (op1))
1.1791 -+ ret_val = 0;
1.1792 -+ else if (REG_P (op0) && CONSTANT_P (op1))
1.1793 -+ ret_val = REG_OK_FOR_BASE_P2 (op0, strict)
1.1794 -+ && SMALL_INT (INTVAL (op1));
1.1795 -+ else if (REG_P (op1) && CONSTANT_P (op0))
1.1796 -+ ret_val = REG_OK_FOR_BASE_P2 (op1, strict)
1.1797 -+ && SMALL_INT (INTVAL (op0));
1.1798 -+ else
1.1799 -+ ret_val = 0;
1.1800 -+ }
1.1801 -+ break;
1.1802 -+
1.1803 -+ default:
1.1804 -+ ret_val = 0;
1.1805 -+ break;
1.1806 -+ }
1.1807 -+
1.1808 -+ return ret_val;
1.1809 -+}
1.1810 -+
1.1811 -+/* Return true if EXP should be placed in the small data section. */
1.1812 -+
1.1813 -+static bool
1.1814 -+nios2_in_small_data_p (tree exp)
1.1815 -+{
1.1816 -+ /* We want to merge strings, so we never consider them small data. */
1.1817 -+ if (TREE_CODE (exp) == STRING_CST)
1.1818 -+ return false;
1.1819 -+
1.1820 -+ if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp))
1.1821 -+ {
1.1822 -+ const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp));
1.1823 -+ /* ??? these string names need moving into
1.1824 -+ an array in some header file */
1.1825 -+ if (nios2_section_threshold > 0
1.1826 -+ && (strcmp (section, ".sbss") == 0
1.1827 -+ || strncmp (section, ".sbss.", 6) == 0
1.1828 -+ || strcmp (section, ".sdata") == 0
1.1829 -+ || strncmp (section, ".sdata.", 7) == 0))
1.1830 -+ return true;
1.1831 -+ }
1.1832 -+ else if (TREE_CODE (exp) == VAR_DECL)
1.1833 -+ {
1.1834 -+ HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
1.1835 -+
1.1836 -+ /* If this is an incomplete type with size 0, then we can't put it
1.1837 -+ in sdata because it might be too big when completed. */
1.1838 -+ if (size > 0 && size <= nios2_section_threshold)
1.1839 -+ return true;
1.1840 -+ }
1.1841 -+
1.1842 -+ return false;
1.1843 -+}
1.1844 -+
1.1845 -+static void
1.1846 -+nios2_encode_section_info (tree decl, rtx rtl, int first)
1.1847 -+{
1.1848 -+
1.1849 -+ rtx symbol;
1.1850 -+ int flags;
1.1851 -+
1.1852 -+ default_encode_section_info (decl, rtl, first);
1.1853 -+
1.1854 -+ /* Careful not to prod global register variables. */
1.1855 -+ if (GET_CODE (rtl) != MEM)
1.1856 -+ return;
1.1857 -+ symbol = XEXP (rtl, 0);
1.1858 -+ if (GET_CODE (symbol) != SYMBOL_REF)
1.1859 -+ return;
1.1860 -+
1.1861 -+ flags = SYMBOL_REF_FLAGS (symbol);
1.1862 -+
1.1863 -+ /* We don't want weak variables to be addressed with gp in case they end up with
1.1864 -+ value 0 which is not within 2^15 of $gp */
1.1865 -+ if (DECL_P (decl) && DECL_WEAK (decl))
1.1866 -+ flags |= SYMBOL_FLAG_WEAK_DECL;
1.1867 -+
1.1868 -+ SYMBOL_REF_FLAGS (symbol) = flags;
1.1869 -+}
1.1870 -+
1.1871 -+
1.1872 -+static unsigned int
1.1873 -+nios2_section_type_flags (tree decl, const char *name, int reloc)
1.1874 -+{
1.1875 -+ unsigned int flags;
1.1876 -+
1.1877 -+ flags = default_section_type_flags (decl, name, reloc);
1.1878 -+
1.1879 -+ /* ??? these string names need moving into an array in some header file */
1.1880 -+ if (strcmp (name, ".sbss") == 0
1.1881 -+ || strncmp (name, ".sbss.", 6) == 0
1.1882 -+ || strcmp (name, ".sdata") == 0
1.1883 -+ || strncmp (name, ".sdata.", 7) == 0)
1.1884 -+ flags |= SECTION_SMALL;
1.1885 -+
1.1886 -+ return flags;
1.1887 -+}
1.1888 -+
1.1889 -+
1.1890 -+
1.1891 -+
1.1892 -+/*****************************************
1.1893 -+ * Defining the Output Assembler Language
1.1894 -+ *****************************************/
1.1895 -+
1.1896 -+/* -------------- *
1.1897 -+ * Output of Data
1.1898 -+ * -------------- */
1.1899 -+
1.1900 -+
1.1901 -+/* -------------------------------- *
1.1902 -+ * Output of Assembler Instructions
1.1903 -+ * -------------------------------- */
1.1904 -+
1.1905 -+
1.1906 -+/* print the operand OP to file stream
1.1907 -+ FILE modified by LETTER. LETTER
1.1908 -+ can be one of:
1.1909 -+ i: print "i" if OP is an immediate, except 0
1.1910 -+ o: print "io" if OP is volatile
1.1911 -+
1.1912 -+ z: for const0_rtx print $0 instead of 0
1.1913 -+ H: for %hiadj
1.1914 -+ L: for %lo
1.1915 -+ U: for upper half of 32 bit value
1.1916 -+ */
1.1917 -+
1.1918 -+void
1.1919 -+nios2_print_operand (FILE *file, rtx op, int letter)
1.1920 -+{
1.1921 -+
1.1922 -+ switch (letter)
1.1923 -+ {
1.1924 -+ case 'i':
1.1925 -+ if (CONSTANT_P (op) && (op != const0_rtx))
1.1926 -+ fprintf (file, "i");
1.1927 -+ return;
1.1928 -+
1.1929 -+ case 'o':
1.1930 -+ if (GET_CODE (op) == MEM
1.1931 -+ && ((MEM_VOLATILE_P (op) && !TARGET_CACHE_VOLATILE)
1.1932 -+ || TARGET_BYPASS_CACHE))
1.1933 -+ fprintf (file, "io");
1.1934 -+ return;
1.1935 -+
1.1936 -+ default:
1.1937 -+ break;
1.1938 -+ }
1.1939 -+
1.1940 -+ if (comparison_operator (op, VOIDmode))
1.1941 -+ {
1.1942 -+ if (letter == 0)
1.1943 -+ {
1.1944 -+ fprintf (file, "%s", GET_RTX_NAME (GET_CODE (op)));
1.1945 -+ return;
1.1946 -+ }
1.1947 -+ }
1.1948 -+
1.1949 -+
1.1950 -+ switch (GET_CODE (op))
1.1951 -+ {
1.1952 -+ case REG:
1.1953 -+ if (letter == 0 || letter == 'z')
1.1954 -+ {
1.1955 -+ fprintf (file, "%s", reg_names[REGNO (op)]);
1.1956 -+ return;
1.1957 -+ }
1.1958 -+
1.1959 -+ case CONST_INT:
1.1960 -+ if (INTVAL (op) == 0 && letter == 'z')
1.1961 -+ {
1.1962 -+ fprintf (file, "zero");
1.1963 -+ return;
1.1964 -+ }
1.1965 -+ else if (letter == 'U')
1.1966 -+ {
1.1967 -+ HOST_WIDE_INT val = INTVAL (op);
1.1968 -+ rtx new_op;
1.1969 -+ val = (val / 65536) & 0xFFFF;
1.1970 -+ new_op = GEN_INT (val);
1.1971 -+ output_addr_const (file, new_op);
1.1972 -+ return;
1.1973 -+ }
1.1974 -+
1.1975 -+ /* else, fall through */
1.1976 -+ case CONST:
1.1977 -+ case LABEL_REF:
1.1978 -+ case SYMBOL_REF:
1.1979 -+ case CONST_DOUBLE:
1.1980 -+ if (letter == 0 || letter == 'z')
1.1981 -+ {
1.1982 -+ output_addr_const (file, op);
1.1983 -+ return;
1.1984 -+ }
1.1985 -+ else if (letter == 'H')
1.1986 -+ {
1.1987 -+ fprintf (file, "%%hiadj(");
1.1988 -+ output_addr_const (file, op);
1.1989 -+ fprintf (file, ")");
1.1990 -+ return;
1.1991 -+ }
1.1992 -+ else if (letter == 'L')
1.1993 -+ {
1.1994 -+ fprintf (file, "%%lo(");
1.1995 -+ output_addr_const (file, op);
1.1996 -+ fprintf (file, ")");
1.1997 -+ return;
1.1998 -+ }
1.1999 -+
1.2000 -+
1.2001 -+ case SUBREG:
1.2002 -+ case MEM:
1.2003 -+ if (letter == 0)
1.2004 -+ {
1.2005 -+ output_address (op);
1.2006 -+ return;
1.2007 -+ }
1.2008 -+
1.2009 -+ case CODE_LABEL:
1.2010 -+ if (letter == 0)
1.2011 -+ {
1.2012 -+ output_addr_const (file, op);
1.2013 -+ return;
1.2014 -+ }
1.2015 -+
1.2016 -+ default:
1.2017 -+ break;
1.2018 -+ }
1.2019 -+
1.2020 -+ fprintf (stderr, "Missing way to print (%c) ", letter);
1.2021 -+ debug_rtx (op);
1.2022 -+ abort ();
1.2023 -+}
1.2024 -+
1.2025 -+static int gprel_constant (rtx);
1.2026 -+
1.2027 -+static int
1.2028 -+gprel_constant (rtx op)
1.2029 -+{
1.2030 -+ if (GET_CODE (op) == SYMBOL_REF
1.2031 -+ && SYMBOL_REF_IN_NIOS2_SMALL_DATA_P (op))
1.2032 -+ {
1.2033 -+ return 1;
1.2034 -+ }
1.2035 -+ else if (GET_CODE (op) == CONST
1.2036 -+ && GET_CODE (XEXP (op, 0)) == PLUS)
1.2037 -+ {
1.2038 -+ return gprel_constant (XEXP (XEXP (op, 0), 0));
1.2039 -+ }
1.2040 -+ else
1.2041 -+ {
1.2042 -+ return 0;
1.2043 -+ }
1.2044 -+}
1.2045 -+
1.2046 -+void
1.2047 -+nios2_print_operand_address (FILE *file, rtx op)
1.2048 -+{
1.2049 -+ switch (GET_CODE (op))
1.2050 -+ {
1.2051 -+ case CONST:
1.2052 -+ case CONST_INT:
1.2053 -+ case LABEL_REF:
1.2054 -+ case CONST_DOUBLE:
1.2055 -+ case SYMBOL_REF:
1.2056 -+ if (gprel_constant (op))
1.2057 -+ {
1.2058 -+ fprintf (file, "%%gprel(");
1.2059 -+ output_addr_const (file, op);
1.2060 -+ fprintf (file, ")(%s)", reg_names[GP_REGNO]);
1.2061 -+ return;
1.2062 -+ }
1.2063 -+
1.2064 -+ break;
1.2065 -+
1.2066 -+ case PLUS:
1.2067 -+ {
1.2068 -+ rtx op0 = XEXP (op, 0);
1.2069 -+ rtx op1 = XEXP (op, 1);
1.2070 -+
1.2071 -+ if (REG_P (op0) && CONSTANT_P (op1))
1.2072 -+ {
1.2073 -+ output_addr_const (file, op1);
1.2074 -+ fprintf (file, "(%s)", reg_names[REGNO (op0)]);
1.2075 -+ return;
1.2076 -+ }
1.2077 -+ else if (REG_P (op1) && CONSTANT_P (op0))
1.2078 -+ {
1.2079 -+ output_addr_const (file, op0);
1.2080 -+ fprintf (file, "(%s)", reg_names[REGNO (op1)]);
1.2081 -+ return;
1.2082 -+ }
1.2083 -+ }
1.2084 -+ break;
1.2085 -+
1.2086 -+ case REG:
1.2087 -+ fprintf (file, "0(%s)", reg_names[REGNO (op)]);
1.2088 -+ return;
1.2089 -+
1.2090 -+ case MEM:
1.2091 -+ {
1.2092 -+ rtx base = XEXP (op, 0);
1.2093 -+ PRINT_OPERAND_ADDRESS (file, base);
1.2094 -+ return;
1.2095 -+ }
1.2096 -+ default:
1.2097 -+ break;
1.2098 -+ }
1.2099 -+
1.2100 -+ fprintf (stderr, "Missing way to print address\n");
1.2101 -+ debug_rtx (op);
1.2102 -+ abort ();
1.2103 -+}
1.2104 -+
1.2105 -+
1.2106 -+
1.2107 -+
1.2108 -+
1.2109 -+/****************************
1.2110 -+ * Predicates
1.2111 -+ ****************************/
1.2112 -+
1.2113 -+int
1.2114 -+arith_operand (rtx op, enum machine_mode mode)
1.2115 -+{
1.2116 -+ if (GET_CODE (op) == CONST_INT && SMALL_INT (INTVAL (op)))
1.2117 -+ return 1;
1.2118 -+
1.2119 -+ return register_operand (op, mode);
1.2120 -+}
1.2121 -+
1.2122 -+int
1.2123 -+uns_arith_operand (rtx op, enum machine_mode mode)
1.2124 -+{
1.2125 -+ if (GET_CODE (op) == CONST_INT && SMALL_INT_UNSIGNED (INTVAL (op)))
1.2126 -+ return 1;
1.2127 -+
1.2128 -+ return register_operand (op, mode);
1.2129 -+}
1.2130 -+
1.2131 -+int
1.2132 -+logical_operand (rtx op, enum machine_mode mode)
1.2133 -+{
1.2134 -+ if (GET_CODE (op) == CONST_INT
1.2135 -+ && (SMALL_INT_UNSIGNED (INTVAL (op)) || UPPER16_INT (INTVAL (op))))
1.2136 -+ return 1;
1.2137 -+
1.2138 -+ return register_operand (op, mode);
1.2139 -+}
1.2140 -+
1.2141 -+int
1.2142 -+shift_operand (rtx op, enum machine_mode mode)
1.2143 -+{
1.2144 -+ if (GET_CODE (op) == CONST_INT && SHIFT_INT (INTVAL (op)))
1.2145 -+ return 1;
1.2146 -+
1.2147 -+ return register_operand (op, mode);
1.2148 -+}
1.2149 -+
1.2150 -+int
1.2151 -+rdwrctl_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1.2152 -+{
1.2153 -+ return GET_CODE (op) == CONST_INT && RDWRCTL_INT (INTVAL (op));
1.2154 -+}
1.2155 -+
1.2156 -+/* Return truth value of whether OP is a register or the constant 0. */
1.2157 -+
1.2158 -+int
1.2159 -+reg_or_0_operand (rtx op, enum machine_mode mode)
1.2160 -+{
1.2161 -+ switch (GET_CODE (op))
1.2162 -+ {
1.2163 -+ case CONST_INT:
1.2164 -+ return INTVAL (op) == 0;
1.2165 -+
1.2166 -+ case CONST_DOUBLE:
1.2167 -+ return op == CONST0_RTX (mode);
1.2168 -+
1.2169 -+ default:
1.2170 -+ break;
1.2171 -+ }
1.2172 -+
1.2173 -+ return register_operand (op, mode);
1.2174 -+}
1.2175 -+
1.2176 -+
1.2177 -+int
1.2178 -+equality_op (rtx op, enum machine_mode mode)
1.2179 -+{
1.2180 -+ if (mode != GET_MODE (op))
1.2181 -+ return 0;
1.2182 -+
1.2183 -+ return GET_CODE (op) == EQ || GET_CODE (op) == NE;
1.2184 -+}
1.2185 -+
1.2186 -+int
1.2187 -+custom_insn_opcode (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1.2188 -+{
1.2189 -+ return GET_CODE (op) == CONST_INT && CUSTOM_INSN_OPCODE (INTVAL (op));
1.2190 -+}
1.2191 -+
1.2192 -+
1.2193 -+
1.2194 -+
1.2195 -+
1.2196 -+
1.2197 -+
1.2198 -+/*****************************************************************************
1.2199 -+**
1.2200 -+** instruction scheduler
1.2201 -+**
1.2202 -+*****************************************************************************/
1.2203 -+static int
1.2204 -+nios2_use_dfa_pipeline_interface ()
1.2205 -+{
1.2206 -+ return 1;
1.2207 -+}
1.2208 -+
1.2209 -+
1.2210 -+static int
1.2211 -+nios2_issue_rate ()
1.2212 -+{
1.2213 -+#ifdef MAX_DFA_ISSUE_RATE
1.2214 -+ return MAX_DFA_ISSUE_RATE;
1.2215 -+#else
1.2216 -+ return 1;
1.2217 -+#endif
1.2218 -+}
1.2219 -+
1.2220 -+
1.2221 -+const char *
1.2222 -+asm_output_opcode (FILE *file ATTRIBUTE_UNUSED,
1.2223 -+ const char *ptr ATTRIBUTE_UNUSED)
1.2224 -+{
1.2225 -+ const char *p;
1.2226 -+
1.2227 -+ p = ptr;
1.2228 -+ return ptr;
1.2229 -+}
1.2230 -+
1.2231 -+
1.2232 -+
1.2233 -+/*****************************************************************************
1.2234 -+**
1.2235 -+** function arguments
1.2236 -+**
1.2237 -+*****************************************************************************/
1.2238 -+
1.2239 -+void
1.2240 -+init_cumulative_args (CUMULATIVE_ARGS *cum,
1.2241 -+ tree fntype ATTRIBUTE_UNUSED,
1.2242 -+ rtx libname ATTRIBUTE_UNUSED,
1.2243 -+ tree fndecl ATTRIBUTE_UNUSED,
1.2244 -+ int n_named_args ATTRIBUTE_UNUSED)
1.2245 -+{
1.2246 -+ cum->regs_used = 0;
1.2247 -+}
1.2248 -+
1.2249 -+
1.2250 -+/* Update the data in CUM to advance over an argument
1.2251 -+ of mode MODE and data type TYPE.
1.2252 -+ (TYPE is null for libcalls where that information may not be available.) */
1.2253 -+
1.2254 -+void
1.2255 -+function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
1.2256 -+ tree type ATTRIBUTE_UNUSED, int named ATTRIBUTE_UNUSED)
1.2257 -+{
1.2258 -+ HOST_WIDE_INT param_size;
1.2259 -+
1.2260 -+ if (mode == BLKmode)
1.2261 -+ {
1.2262 -+ param_size = int_size_in_bytes (type);
1.2263 -+ if (param_size < 0)
1.2264 -+ internal_error
1.2265 -+ ("Do not know how to handle large structs or variable length types");
1.2266 -+ }
1.2267 -+ else
1.2268 -+ {
1.2269 -+ param_size = GET_MODE_SIZE (mode);
1.2270 -+ }
1.2271 -+
1.2272 -+ /* convert to words (round up) */
1.2273 -+ param_size = (3 + param_size) / 4;
1.2274 -+
1.2275 -+ if (cum->regs_used + param_size > NUM_ARG_REGS)
1.2276 -+ {
1.2277 -+ cum->regs_used = NUM_ARG_REGS;
1.2278 -+ }
1.2279 -+ else
1.2280 -+ {
1.2281 -+ cum->regs_used += param_size;
1.2282 -+ }
1.2283 -+
1.2284 -+ return;
1.2285 -+}
1.2286 -+
1.2287 -+/* Define where to put the arguments to a function. Value is zero to
1.2288 -+ push the argument on the stack, or a hard register in which to
1.2289 -+ store the argument.
1.2290 -+
1.2291 -+ MODE is the argument's machine mode.
1.2292 -+ TYPE is the data type of the argument (as a tree).
1.2293 -+ This is null for libcalls where that information may
1.2294 -+ not be available.
1.2295 -+ CUM is a variable of type CUMULATIVE_ARGS which gives info about
1.2296 -+ the preceding args and about the function being called.
1.2297 -+ NAMED is nonzero if this argument is a named parameter
1.2298 -+ (otherwise it is an extra parameter matching an ellipsis). */
1.2299 -+rtx
1.2300 -+function_arg (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
1.2301 -+ tree type ATTRIBUTE_UNUSED, int named ATTRIBUTE_UNUSED)
1.2302 -+{
1.2303 -+ rtx return_rtx = NULL_RTX;
1.2304 -+
1.2305 -+ if (cum->regs_used < NUM_ARG_REGS)
1.2306 -+ {
1.2307 -+ return_rtx = gen_rtx_REG (mode, FIRST_ARG_REGNO + cum->regs_used);
1.2308 -+ }
1.2309 -+
1.2310 -+ return return_rtx;
1.2311 -+}
1.2312 -+
1.2313 -+int
1.2314 -+function_arg_partial_nregs (const CUMULATIVE_ARGS *cum,
1.2315 -+ enum machine_mode mode, tree type,
1.2316 -+ int named ATTRIBUTE_UNUSED)
1.2317 -+{
1.2318 -+ HOST_WIDE_INT param_size;
1.2319 -+
1.2320 -+ if (mode == BLKmode)
1.2321 -+ {
1.2322 -+ param_size = int_size_in_bytes (type);
1.2323 -+ if (param_size < 0)
1.2324 -+ internal_error
1.2325 -+ ("Do not know how to handle large structs or variable length types");
1.2326 -+ }
1.2327 -+ else
1.2328 -+ {
1.2329 -+ param_size = GET_MODE_SIZE (mode);
1.2330 -+ }
1.2331 -+
1.2332 -+ /* convert to words (round up) */
1.2333 -+ param_size = (3 + param_size) / 4;
1.2334 -+
1.2335 -+ if (cum->regs_used < NUM_ARG_REGS
1.2336 -+ && cum->regs_used + param_size > NUM_ARG_REGS)
1.2337 -+ {
1.2338 -+ return NUM_ARG_REGS - cum->regs_used;
1.2339 -+ }
1.2340 -+ else
1.2341 -+ {
1.2342 -+ return 0;
1.2343 -+ }
1.2344 -+}
1.2345 -+
1.2346 -+
1.2347 -+int
1.2348 -+nios2_return_in_memory (tree type)
1.2349 -+{
1.2350 -+ int res = ((int_size_in_bytes (type) > (2 * UNITS_PER_WORD))
1.2351 -+ || (int_size_in_bytes (type) == -1));
1.2352 -+
1.2353 -+ return res;
1.2354 -+}
1.2355 -+
1.2356 -+/* ??? It may be possible to eliminate the copyback and implement
1.2357 -+ my own va_arg type, but that is more work for now. */
1.2358 -+int
1.2359 -+nios2_setup_incoming_varargs (const CUMULATIVE_ARGS *cum,
1.2360 -+ enum machine_mode mode, tree type,
1.2361 -+ int no_rtl)
1.2362 -+{
1.2363 -+ CUMULATIVE_ARGS local_cum;
1.2364 -+ int regs_to_push;
1.2365 -+
1.2366 -+ local_cum = *cum;
1.2367 -+ FUNCTION_ARG_ADVANCE (local_cum, mode, type, 1);
1.2368 -+
1.2369 -+ regs_to_push = NUM_ARG_REGS - local_cum.regs_used;
1.2370 -+
1.2371 -+ if (!no_rtl)
1.2372 -+ {
1.2373 -+ if (regs_to_push > 0)
1.2374 -+ {
1.2375 -+ rtx ptr, mem;
1.2376 -+
1.2377 -+ ptr = virtual_incoming_args_rtx;
1.2378 -+ mem = gen_rtx_MEM (BLKmode, ptr);
1.2379 -+
1.2380 -+ /* va_arg is an array access in this case, which causes
1.2381 -+ it to get MEM_IN_STRUCT_P set. We must set it here
1.2382 -+ so that the insn scheduler won't assume that these
1.2383 -+ stores can't possibly overlap with the va_arg loads. */
1.2384 -+ MEM_SET_IN_STRUCT_P (mem, 1);
1.2385 -+
1.2386 -+ emit_insn (gen_blockage ());
1.2387 -+ move_block_from_reg (local_cum.regs_used + FIRST_ARG_REGNO, mem,
1.2388 -+ regs_to_push);
1.2389 -+ emit_insn (gen_blockage ());
1.2390 -+ }
1.2391 -+ }
1.2392 -+
1.2393 -+ return regs_to_push * UNITS_PER_WORD;
1.2394 -+
1.2395 -+}
1.2396 -+
1.2397 -+
1.2398 -+
1.2399 -+/*****************************************************************************
1.2400 -+**
1.2401 -+** builtins
1.2402 -+**
1.2403 -+** This method for handling builtins is from CSP where _many_ more types of
1.2404 -+** expanders have already been written. Check there first before writing
1.2405 -+** new ones.
1.2406 -+**
1.2407 -+*****************************************************************************/
1.2408 -+
1.2409 -+enum nios2_builtins
1.2410 -+{
1.2411 -+ NIOS2_BUILTIN_LDBIO,
1.2412 -+ NIOS2_BUILTIN_LDBUIO,
1.2413 -+ NIOS2_BUILTIN_LDHIO,
1.2414 -+ NIOS2_BUILTIN_LDHUIO,
1.2415 -+ NIOS2_BUILTIN_LDWIO,
1.2416 -+ NIOS2_BUILTIN_STBIO,
1.2417 -+ NIOS2_BUILTIN_STHIO,
1.2418 -+ NIOS2_BUILTIN_STWIO,
1.2419 -+ NIOS2_BUILTIN_SYNC,
1.2420 -+ NIOS2_BUILTIN_RDCTL,
1.2421 -+ NIOS2_BUILTIN_WRCTL,
1.2422 -+
1.2423 -+ NIOS2_BUILTIN_CUSTOM_N,
1.2424 -+ NIOS2_BUILTIN_CUSTOM_NI,
1.2425 -+ NIOS2_BUILTIN_CUSTOM_NF,
1.2426 -+ NIOS2_BUILTIN_CUSTOM_NP,
1.2427 -+ NIOS2_BUILTIN_CUSTOM_NII,
1.2428 -+ NIOS2_BUILTIN_CUSTOM_NIF,
1.2429 -+ NIOS2_BUILTIN_CUSTOM_NIP,
1.2430 -+ NIOS2_BUILTIN_CUSTOM_NFI,
1.2431 -+ NIOS2_BUILTIN_CUSTOM_NFF,
1.2432 -+ NIOS2_BUILTIN_CUSTOM_NFP,
1.2433 -+ NIOS2_BUILTIN_CUSTOM_NPI,
1.2434 -+ NIOS2_BUILTIN_CUSTOM_NPF,
1.2435 -+ NIOS2_BUILTIN_CUSTOM_NPP,
1.2436 -+ NIOS2_BUILTIN_CUSTOM_IN,
1.2437 -+ NIOS2_BUILTIN_CUSTOM_INI,
1.2438 -+ NIOS2_BUILTIN_CUSTOM_INF,
1.2439 -+ NIOS2_BUILTIN_CUSTOM_INP,
1.2440 -+ NIOS2_BUILTIN_CUSTOM_INII,
1.2441 -+ NIOS2_BUILTIN_CUSTOM_INIF,
1.2442 -+ NIOS2_BUILTIN_CUSTOM_INIP,
1.2443 -+ NIOS2_BUILTIN_CUSTOM_INFI,
1.2444 -+ NIOS2_BUILTIN_CUSTOM_INFF,
1.2445 -+ NIOS2_BUILTIN_CUSTOM_INFP,
1.2446 -+ NIOS2_BUILTIN_CUSTOM_INPI,
1.2447 -+ NIOS2_BUILTIN_CUSTOM_INPF,
1.2448 -+ NIOS2_BUILTIN_CUSTOM_INPP,
1.2449 -+ NIOS2_BUILTIN_CUSTOM_FN,
1.2450 -+ NIOS2_BUILTIN_CUSTOM_FNI,
1.2451 -+ NIOS2_BUILTIN_CUSTOM_FNF,
1.2452 -+ NIOS2_BUILTIN_CUSTOM_FNP,
1.2453 -+ NIOS2_BUILTIN_CUSTOM_FNII,
1.2454 -+ NIOS2_BUILTIN_CUSTOM_FNIF,
1.2455 -+ NIOS2_BUILTIN_CUSTOM_FNIP,
1.2456 -+ NIOS2_BUILTIN_CUSTOM_FNFI,
1.2457 -+ NIOS2_BUILTIN_CUSTOM_FNFF,
1.2458 -+ NIOS2_BUILTIN_CUSTOM_FNFP,
1.2459 -+ NIOS2_BUILTIN_CUSTOM_FNPI,
1.2460 -+ NIOS2_BUILTIN_CUSTOM_FNPF,
1.2461 -+ NIOS2_BUILTIN_CUSTOM_FNPP,
1.2462 -+ NIOS2_BUILTIN_CUSTOM_PN,
1.2463 -+ NIOS2_BUILTIN_CUSTOM_PNI,
1.2464 -+ NIOS2_BUILTIN_CUSTOM_PNF,
1.2465 -+ NIOS2_BUILTIN_CUSTOM_PNP,
1.2466 -+ NIOS2_BUILTIN_CUSTOM_PNII,
1.2467 -+ NIOS2_BUILTIN_CUSTOM_PNIF,
1.2468 -+ NIOS2_BUILTIN_CUSTOM_PNIP,
1.2469 -+ NIOS2_BUILTIN_CUSTOM_PNFI,
1.2470 -+ NIOS2_BUILTIN_CUSTOM_PNFF,
1.2471 -+ NIOS2_BUILTIN_CUSTOM_PNFP,
1.2472 -+ NIOS2_BUILTIN_CUSTOM_PNPI,
1.2473 -+ NIOS2_BUILTIN_CUSTOM_PNPF,
1.2474 -+ NIOS2_BUILTIN_CUSTOM_PNPP,
1.2475 -+
1.2476 -+
1.2477 -+ LIM_NIOS2_BUILTINS
1.2478 -+};
1.2479 -+
1.2480 -+struct builtin_description
1.2481 -+{
1.2482 -+ const enum insn_code icode;
1.2483 -+ const char *const name;
1.2484 -+ const enum nios2_builtins code;
1.2485 -+ const tree *type;
1.2486 -+ rtx (* expander) PARAMS ((const struct builtin_description *,
1.2487 -+ tree, rtx, rtx, enum machine_mode, int));
1.2488 -+};
1.2489 -+
1.2490 -+static rtx nios2_expand_STXIO (const struct builtin_description *,
1.2491 -+ tree, rtx, rtx, enum machine_mode, int);
1.2492 -+static rtx nios2_expand_LDXIO (const struct builtin_description *,
1.2493 -+ tree, rtx, rtx, enum machine_mode, int);
1.2494 -+static rtx nios2_expand_sync (const struct builtin_description *,
1.2495 -+ tree, rtx, rtx, enum machine_mode, int);
1.2496 -+static rtx nios2_expand_rdctl (const struct builtin_description *,
1.2497 -+ tree, rtx, rtx, enum machine_mode, int);
1.2498 -+static rtx nios2_expand_wrctl (const struct builtin_description *,
1.2499 -+ tree, rtx, rtx, enum machine_mode, int);
1.2500 -+
1.2501 -+static rtx nios2_expand_custom_n (const struct builtin_description *,
1.2502 -+ tree, rtx, rtx, enum machine_mode, int);
1.2503 -+static rtx nios2_expand_custom_Xn (const struct builtin_description *,
1.2504 -+ tree, rtx, rtx, enum machine_mode, int);
1.2505 -+static rtx nios2_expand_custom_nX (const struct builtin_description *,
1.2506 -+ tree, rtx, rtx, enum machine_mode, int);
1.2507 -+static rtx nios2_expand_custom_XnX (const struct builtin_description *,
1.2508 -+ tree, rtx, rtx, enum machine_mode, int);
1.2509 -+static rtx nios2_expand_custom_nXX (const struct builtin_description *,
1.2510 -+ tree, rtx, rtx, enum machine_mode, int);
1.2511 -+static rtx nios2_expand_custom_XnXX (const struct builtin_description *,
1.2512 -+ tree, rtx, rtx, enum machine_mode, int);
1.2513 -+
1.2514 -+static tree endlink;
1.2515 -+
1.2516 -+/* int fn (volatile const void *)
1.2517 -+ */
1.2518 -+static tree int_ftype_volatile_const_void_p;
1.2519 -+
1.2520 -+/* int fn (int)
1.2521 -+ */
1.2522 -+static tree int_ftype_int;
1.2523 -+
1.2524 -+/* void fn (int, int)
1.2525 -+ */
1.2526 -+static tree void_ftype_int_int;
1.2527 -+
1.2528 -+/* void fn (volatile void *, int)
1.2529 -+ */
1.2530 -+static tree void_ftype_volatile_void_p_int;
1.2531 -+
1.2532 -+/* void fn (void)
1.2533 -+ */
1.2534 -+static tree void_ftype_void;
1.2535 -+
1.2536 -+static tree custom_n;
1.2537 -+static tree custom_ni;
1.2538 -+static tree custom_nf;
1.2539 -+static tree custom_np;
1.2540 -+static tree custom_nii;
1.2541 -+static tree custom_nif;
1.2542 -+static tree custom_nip;
1.2543 -+static tree custom_nfi;
1.2544 -+static tree custom_nff;
1.2545 -+static tree custom_nfp;
1.2546 -+static tree custom_npi;
1.2547 -+static tree custom_npf;
1.2548 -+static tree custom_npp;
1.2549 -+static tree custom_in;
1.2550 -+static tree custom_ini;
1.2551 -+static tree custom_inf;
1.2552 -+static tree custom_inp;
1.2553 -+static tree custom_inii;
1.2554 -+static tree custom_inif;
1.2555 -+static tree custom_inip;
1.2556 -+static tree custom_infi;
1.2557 -+static tree custom_inff;
1.2558 -+static tree custom_infp;
1.2559 -+static tree custom_inpi;
1.2560 -+static tree custom_inpf;
1.2561 -+static tree custom_inpp;
1.2562 -+static tree custom_fn;
1.2563 -+static tree custom_fni;
1.2564 -+static tree custom_fnf;
1.2565 -+static tree custom_fnp;
1.2566 -+static tree custom_fnii;
1.2567 -+static tree custom_fnif;
1.2568 -+static tree custom_fnip;
1.2569 -+static tree custom_fnfi;
1.2570 -+static tree custom_fnff;
1.2571 -+static tree custom_fnfp;
1.2572 -+static tree custom_fnpi;
1.2573 -+static tree custom_fnpf;
1.2574 -+static tree custom_fnpp;
1.2575 -+static tree custom_pn;
1.2576 -+static tree custom_pni;
1.2577 -+static tree custom_pnf;
1.2578 -+static tree custom_pnp;
1.2579 -+static tree custom_pnii;
1.2580 -+static tree custom_pnif;
1.2581 -+static tree custom_pnip;
1.2582 -+static tree custom_pnfi;
1.2583 -+static tree custom_pnff;
1.2584 -+static tree custom_pnfp;
1.2585 -+static tree custom_pnpi;
1.2586 -+static tree custom_pnpf;
1.2587 -+static tree custom_pnpp;
1.2588 -+
1.2589 -+
1.2590 -+static const struct builtin_description bdesc[] = {
1.2591 -+ {CODE_FOR_ldbio, "__builtin_ldbio", NIOS2_BUILTIN_LDBIO, &int_ftype_volatile_const_void_p, nios2_expand_LDXIO},
1.2592 -+ {CODE_FOR_ldbuio, "__builtin_ldbuio", NIOS2_BUILTIN_LDBUIO, &int_ftype_volatile_const_void_p, nios2_expand_LDXIO},
1.2593 -+ {CODE_FOR_ldhio, "__builtin_ldhio", NIOS2_BUILTIN_LDHIO, &int_ftype_volatile_const_void_p, nios2_expand_LDXIO},
1.2594 -+ {CODE_FOR_ldhuio, "__builtin_ldhuio", NIOS2_BUILTIN_LDHUIO, &int_ftype_volatile_const_void_p, nios2_expand_LDXIO},
1.2595 -+ {CODE_FOR_ldwio, "__builtin_ldwio", NIOS2_BUILTIN_LDWIO, &int_ftype_volatile_const_void_p, nios2_expand_LDXIO},
1.2596 -+
1.2597 -+ {CODE_FOR_stbio, "__builtin_stbio", NIOS2_BUILTIN_STBIO, &void_ftype_volatile_void_p_int, nios2_expand_STXIO},
1.2598 -+ {CODE_FOR_sthio, "__builtin_sthio", NIOS2_BUILTIN_STHIO, &void_ftype_volatile_void_p_int, nios2_expand_STXIO},
1.2599 -+ {CODE_FOR_stwio, "__builtin_stwio", NIOS2_BUILTIN_STWIO, &void_ftype_volatile_void_p_int, nios2_expand_STXIO},
1.2600 -+
1.2601 -+ {CODE_FOR_sync, "__builtin_sync", NIOS2_BUILTIN_SYNC, &void_ftype_void, nios2_expand_sync},
1.2602 -+ {CODE_FOR_rdctl, "__builtin_rdctl", NIOS2_BUILTIN_RDCTL, &int_ftype_int, nios2_expand_rdctl},
1.2603 -+ {CODE_FOR_wrctl, "__builtin_wrctl", NIOS2_BUILTIN_WRCTL, &void_ftype_int_int, nios2_expand_wrctl},
1.2604 -+
1.2605 -+ {CODE_FOR_custom_n, "__builtin_custom_n", NIOS2_BUILTIN_CUSTOM_N, &custom_n, nios2_expand_custom_n},
1.2606 -+ {CODE_FOR_custom_ni, "__builtin_custom_ni", NIOS2_BUILTIN_CUSTOM_NI, &custom_ni, nios2_expand_custom_nX},
1.2607 -+ {CODE_FOR_custom_nf, "__builtin_custom_nf", NIOS2_BUILTIN_CUSTOM_NF, &custom_nf, nios2_expand_custom_nX},
1.2608 -+ {CODE_FOR_custom_np, "__builtin_custom_np", NIOS2_BUILTIN_CUSTOM_NP, &custom_np, nios2_expand_custom_nX},
1.2609 -+ {CODE_FOR_custom_nii, "__builtin_custom_nii", NIOS2_BUILTIN_CUSTOM_NII, &custom_nii, nios2_expand_custom_nXX},
1.2610 -+ {CODE_FOR_custom_nif, "__builtin_custom_nif", NIOS2_BUILTIN_CUSTOM_NIF, &custom_nif, nios2_expand_custom_nXX},
1.2611 -+ {CODE_FOR_custom_nip, "__builtin_custom_nip", NIOS2_BUILTIN_CUSTOM_NIP, &custom_nip, nios2_expand_custom_nXX},
1.2612 -+ {CODE_FOR_custom_nfi, "__builtin_custom_nfi", NIOS2_BUILTIN_CUSTOM_NFI, &custom_nfi, nios2_expand_custom_nXX},
1.2613 -+ {CODE_FOR_custom_nff, "__builtin_custom_nff", NIOS2_BUILTIN_CUSTOM_NFF, &custom_nff, nios2_expand_custom_nXX},
1.2614 -+ {CODE_FOR_custom_nfp, "__builtin_custom_nfp", NIOS2_BUILTIN_CUSTOM_NFP, &custom_nfp, nios2_expand_custom_nXX},
1.2615 -+ {CODE_FOR_custom_npi, "__builtin_custom_npi", NIOS2_BUILTIN_CUSTOM_NPI, &custom_npi, nios2_expand_custom_nXX},
1.2616 -+ {CODE_FOR_custom_npf, "__builtin_custom_npf", NIOS2_BUILTIN_CUSTOM_NPF, &custom_npf, nios2_expand_custom_nXX},
1.2617 -+ {CODE_FOR_custom_npp, "__builtin_custom_npp", NIOS2_BUILTIN_CUSTOM_NPP, &custom_npp, nios2_expand_custom_nXX},
1.2618 -+ {CODE_FOR_custom_in, "__builtin_custom_in", NIOS2_BUILTIN_CUSTOM_IN, &custom_in, nios2_expand_custom_Xn},
1.2619 -+ {CODE_FOR_custom_ini, "__builtin_custom_ini", NIOS2_BUILTIN_CUSTOM_INI, &custom_ini, nios2_expand_custom_XnX},
1.2620 -+ {CODE_FOR_custom_inf, "__builtin_custom_inf", NIOS2_BUILTIN_CUSTOM_INF, &custom_inf, nios2_expand_custom_XnX},
1.2621 -+ {CODE_FOR_custom_inp, "__builtin_custom_inp", NIOS2_BUILTIN_CUSTOM_INP, &custom_inp, nios2_expand_custom_XnX},
1.2622 -+ {CODE_FOR_custom_inii, "__builtin_custom_inii", NIOS2_BUILTIN_CUSTOM_INII, &custom_inii, nios2_expand_custom_XnXX},
1.2623 -+ {CODE_FOR_custom_inif, "__builtin_custom_inif", NIOS2_BUILTIN_CUSTOM_INIF, &custom_inif, nios2_expand_custom_XnXX},
1.2624 -+ {CODE_FOR_custom_inip, "__builtin_custom_inip", NIOS2_BUILTIN_CUSTOM_INIP, &custom_inip, nios2_expand_custom_XnXX},
1.2625 -+ {CODE_FOR_custom_infi, "__builtin_custom_infi", NIOS2_BUILTIN_CUSTOM_INFI, &custom_infi, nios2_expand_custom_XnXX},
1.2626 -+ {CODE_FOR_custom_inff, "__builtin_custom_inff", NIOS2_BUILTIN_CUSTOM_INFF, &custom_inff, nios2_expand_custom_XnXX},
1.2627 -+ {CODE_FOR_custom_infp, "__builtin_custom_infp", NIOS2_BUILTIN_CUSTOM_INFP, &custom_infp, nios2_expand_custom_XnXX},
1.2628 -+ {CODE_FOR_custom_inpi, "__builtin_custom_inpi", NIOS2_BUILTIN_CUSTOM_INPI, &custom_inpi, nios2_expand_custom_XnXX},
1.2629 -+ {CODE_FOR_custom_inpf, "__builtin_custom_inpf", NIOS2_BUILTIN_CUSTOM_INPF, &custom_inpf, nios2_expand_custom_XnXX},
1.2630 -+ {CODE_FOR_custom_inpp, "__builtin_custom_inpp", NIOS2_BUILTIN_CUSTOM_INPP, &custom_inpp, nios2_expand_custom_XnXX},
1.2631 -+ {CODE_FOR_custom_fn, "__builtin_custom_fn", NIOS2_BUILTIN_CUSTOM_FN, &custom_fn, nios2_expand_custom_Xn},
1.2632 -+ {CODE_FOR_custom_fni, "__builtin_custom_fni", NIOS2_BUILTIN_CUSTOM_FNI, &custom_fni, nios2_expand_custom_XnX},
1.2633 -+ {CODE_FOR_custom_fnf, "__builtin_custom_fnf", NIOS2_BUILTIN_CUSTOM_FNF, &custom_fnf, nios2_expand_custom_XnX},
1.2634 -+ {CODE_FOR_custom_fnp, "__builtin_custom_fnp", NIOS2_BUILTIN_CUSTOM_FNP, &custom_fnp, nios2_expand_custom_XnX},
1.2635 -+ {CODE_FOR_custom_fnii, "__builtin_custom_fnii", NIOS2_BUILTIN_CUSTOM_FNII, &custom_fnii, nios2_expand_custom_XnXX},
1.2636 -+ {CODE_FOR_custom_fnif, "__builtin_custom_fnif", NIOS2_BUILTIN_CUSTOM_FNIF, &custom_fnif, nios2_expand_custom_XnXX},
1.2637 -+ {CODE_FOR_custom_fnip, "__builtin_custom_fnip", NIOS2_BUILTIN_CUSTOM_FNIP, &custom_fnip, nios2_expand_custom_XnXX},
1.2638 -+ {CODE_FOR_custom_fnfi, "__builtin_custom_fnfi", NIOS2_BUILTIN_CUSTOM_FNFI, &custom_fnfi, nios2_expand_custom_XnXX},
1.2639 -+ {CODE_FOR_custom_fnff, "__builtin_custom_fnff", NIOS2_BUILTIN_CUSTOM_FNFF, &custom_fnff, nios2_expand_custom_XnXX},
1.2640 -+ {CODE_FOR_custom_fnfp, "__builtin_custom_fnfp", NIOS2_BUILTIN_CUSTOM_FNFP, &custom_fnfp, nios2_expand_custom_XnXX},
1.2641 -+ {CODE_FOR_custom_fnpi, "__builtin_custom_fnpi", NIOS2_BUILTIN_CUSTOM_FNPI, &custom_fnpi, nios2_expand_custom_XnXX},
1.2642 -+ {CODE_FOR_custom_fnpf, "__builtin_custom_fnpf", NIOS2_BUILTIN_CUSTOM_FNPF, &custom_fnpf, nios2_expand_custom_XnXX},
1.2643 -+ {CODE_FOR_custom_fnpp, "__builtin_custom_fnpp", NIOS2_BUILTIN_CUSTOM_FNPP, &custom_fnpp, nios2_expand_custom_XnXX},
1.2644 -+ {CODE_FOR_custom_pn, "__builtin_custom_pn", NIOS2_BUILTIN_CUSTOM_PN, &custom_pn, nios2_expand_custom_Xn},
1.2645 -+ {CODE_FOR_custom_pni, "__builtin_custom_pni", NIOS2_BUILTIN_CUSTOM_PNI, &custom_pni, nios2_expand_custom_XnX},
1.2646 -+ {CODE_FOR_custom_pnf, "__builtin_custom_pnf", NIOS2_BUILTIN_CUSTOM_PNF, &custom_pnf, nios2_expand_custom_XnX},
1.2647 -+ {CODE_FOR_custom_pnp, "__builtin_custom_pnp", NIOS2_BUILTIN_CUSTOM_PNP, &custom_pnp, nios2_expand_custom_XnX},
1.2648 -+ {CODE_FOR_custom_pnii, "__builtin_custom_pnii", NIOS2_BUILTIN_CUSTOM_PNII, &custom_pnii, nios2_expand_custom_XnXX},
1.2649 -+ {CODE_FOR_custom_pnif, "__builtin_custom_pnif", NIOS2_BUILTIN_CUSTOM_PNIF, &custom_pnif, nios2_expand_custom_XnXX},
1.2650 -+ {CODE_FOR_custom_pnip, "__builtin_custom_pnip", NIOS2_BUILTIN_CUSTOM_PNIP, &custom_pnip, nios2_expand_custom_XnXX},
1.2651 -+ {CODE_FOR_custom_pnfi, "__builtin_custom_pnfi", NIOS2_BUILTIN_CUSTOM_PNFI, &custom_pnfi, nios2_expand_custom_XnXX},
1.2652 -+ {CODE_FOR_custom_pnff, "__builtin_custom_pnff", NIOS2_BUILTIN_CUSTOM_PNFF, &custom_pnff, nios2_expand_custom_XnXX},
1.2653 -+ {CODE_FOR_custom_pnfp, "__builtin_custom_pnfp", NIOS2_BUILTIN_CUSTOM_PNFP, &custom_pnfp, nios2_expand_custom_XnXX},
1.2654 -+ {CODE_FOR_custom_pnpi, "__builtin_custom_pnpi", NIOS2_BUILTIN_CUSTOM_PNPI, &custom_pnpi, nios2_expand_custom_XnXX},
1.2655 -+ {CODE_FOR_custom_pnpf, "__builtin_custom_pnpf", NIOS2_BUILTIN_CUSTOM_PNPF, &custom_pnpf, nios2_expand_custom_XnXX},
1.2656 -+ {CODE_FOR_custom_pnpp, "__builtin_custom_pnpp", NIOS2_BUILTIN_CUSTOM_PNPP, &custom_pnpp, nios2_expand_custom_XnXX},
1.2657 -+
1.2658 -+
1.2659 -+ {0, 0, 0, 0, 0},
1.2660 -+};
1.2661 -+
1.2662 -+/* This does not have a closing bracket on purpose (see use) */
1.2663 -+#define def_param(TYPE) \
1.2664 -+ tree_cons (NULL_TREE, TYPE,
1.2665 -+
1.2666 -+static void
1.2667 -+nios2_init_builtins ()
1.2668 -+{
1.2669 -+ const struct builtin_description *d;
1.2670 -+
1.2671 -+
1.2672 -+ endlink = void_list_node;
1.2673 -+
1.2674 -+ /* Special indenting here because one of the brackets is in def_param */
1.2675 -+ /* *INDENT-OFF* */
1.2676 -+
1.2677 -+ /* int fn (volatile const void *)
1.2678 -+ */
1.2679 -+ int_ftype_volatile_const_void_p
1.2680 -+ = build_function_type (integer_type_node,
1.2681 -+ def_param (build_qualified_type (ptr_type_node,
1.2682 -+ TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE))
1.2683 -+ endlink));
1.2684 -+
1.2685 -+
1.2686 -+ /* void fn (volatile void *, int)
1.2687 -+ */
1.2688 -+ void_ftype_volatile_void_p_int
1.2689 -+ = build_function_type (void_type_node,
1.2690 -+ def_param (build_qualified_type (ptr_type_node,
1.2691 -+ TYPE_QUAL_VOLATILE))
1.2692 -+ def_param (integer_type_node)
1.2693 -+ endlink)));
1.2694 -+
1.2695 -+ /* void fn (void)
1.2696 -+ */
1.2697 -+ void_ftype_void
1.2698 -+ = build_function_type (void_type_node,
1.2699 -+ endlink);
1.2700 -+
1.2701 -+ /* int fn (int)
1.2702 -+ */
1.2703 -+ int_ftype_int
1.2704 -+ = build_function_type (integer_type_node,
1.2705 -+ def_param (integer_type_node)
1.2706 -+ endlink));
1.2707 -+
1.2708 -+ /* void fn (int, int)
1.2709 -+ */
1.2710 -+ void_ftype_int_int
1.2711 -+ = build_function_type (void_type_node,
1.2712 -+ def_param (integer_type_node)
1.2713 -+ def_param (integer_type_node)
1.2714 -+ endlink)));
1.2715 -+
1.2716 -+
1.2717 -+#define CUSTOM_NUM def_param (integer_type_node)
1.2718 -+
1.2719 -+ custom_n
1.2720 -+ = build_function_type (void_type_node,
1.2721 -+ CUSTOM_NUM
1.2722 -+ endlink));
1.2723 -+ custom_ni
1.2724 -+ = build_function_type (void_type_node,
1.2725 -+ CUSTOM_NUM
1.2726 -+ def_param (integer_type_node)
1.2727 -+ endlink)));
1.2728 -+ custom_nf
1.2729 -+ = build_function_type (void_type_node,
1.2730 -+ CUSTOM_NUM
1.2731 -+ def_param (float_type_node)
1.2732 -+ endlink)));
1.2733 -+ custom_np
1.2734 -+ = build_function_type (void_type_node,
1.2735 -+ CUSTOM_NUM
1.2736 -+ def_param (ptr_type_node)
1.2737 -+ endlink)));
1.2738 -+ custom_nii
1.2739 -+ = build_function_type (void_type_node,
1.2740 -+ CUSTOM_NUM
1.2741 -+ def_param (integer_type_node)
1.2742 -+ def_param (integer_type_node)
1.2743 -+ endlink))));
1.2744 -+ custom_nif
1.2745 -+ = build_function_type (void_type_node,
1.2746 -+ CUSTOM_NUM
1.2747 -+ def_param (integer_type_node)
1.2748 -+ def_param (float_type_node)
1.2749 -+ endlink))));
1.2750 -+ custom_nip
1.2751 -+ = build_function_type (void_type_node,
1.2752 -+ CUSTOM_NUM
1.2753 -+ def_param (integer_type_node)
1.2754 -+ def_param (ptr_type_node)
1.2755 -+ endlink))));
1.2756 -+ custom_nfi
1.2757 -+ = build_function_type (void_type_node,
1.2758 -+ CUSTOM_NUM
1.2759 -+ def_param (float_type_node)
1.2760 -+ def_param (integer_type_node)
1.2761 -+ endlink))));
1.2762 -+ custom_nff
1.2763 -+ = build_function_type (void_type_node,
1.2764 -+ CUSTOM_NUM
1.2765 -+ def_param (float_type_node)
1.2766 -+ def_param (float_type_node)
1.2767 -+ endlink))));
1.2768 -+ custom_nfp
1.2769 -+ = build_function_type (void_type_node,
1.2770 -+ CUSTOM_NUM
1.2771 -+ def_param (float_type_node)
1.2772 -+ def_param (ptr_type_node)
1.2773 -+ endlink))));
1.2774 -+ custom_npi
1.2775 -+ = build_function_type (void_type_node,
1.2776 -+ CUSTOM_NUM
1.2777 -+ def_param (ptr_type_node)
1.2778 -+ def_param (integer_type_node)
1.2779 -+ endlink))));
1.2780 -+ custom_npf
1.2781 -+ = build_function_type (void_type_node,
1.2782 -+ CUSTOM_NUM
1.2783 -+ def_param (ptr_type_node)
1.2784 -+ def_param (float_type_node)
1.2785 -+ endlink))));
1.2786 -+ custom_npp
1.2787 -+ = build_function_type (void_type_node,
1.2788 -+ CUSTOM_NUM
1.2789 -+ def_param (ptr_type_node)
1.2790 -+ def_param (ptr_type_node)
1.2791 -+ endlink))));
1.2792 -+
1.2793 -+ custom_in
1.2794 -+ = build_function_type (integer_type_node,
1.2795 -+ CUSTOM_NUM
1.2796 -+ endlink));
1.2797 -+ custom_ini
1.2798 -+ = build_function_type (integer_type_node,
1.2799 -+ CUSTOM_NUM
1.2800 -+ def_param (integer_type_node)
1.2801 -+ endlink)));
1.2802 -+ custom_inf
1.2803 -+ = build_function_type (integer_type_node,
1.2804 -+ CUSTOM_NUM
1.2805 -+ def_param (float_type_node)
1.2806 -+ endlink)));
1.2807 -+ custom_inp
1.2808 -+ = build_function_type (integer_type_node,
1.2809 -+ CUSTOM_NUM
1.2810 -+ def_param (ptr_type_node)
1.2811 -+ endlink)));
1.2812 -+ custom_inii
1.2813 -+ = build_function_type (integer_type_node,
1.2814 -+ CUSTOM_NUM
1.2815 -+ def_param (integer_type_node)
1.2816 -+ def_param (integer_type_node)
1.2817 -+ endlink))));
1.2818 -+ custom_inif
1.2819 -+ = build_function_type (integer_type_node,
1.2820 -+ CUSTOM_NUM
1.2821 -+ def_param (integer_type_node)
1.2822 -+ def_param (float_type_node)
1.2823 -+ endlink))));
1.2824 -+ custom_inip
1.2825 -+ = build_function_type (integer_type_node,
1.2826 -+ CUSTOM_NUM
1.2827 -+ def_param (integer_type_node)
1.2828 -+ def_param (ptr_type_node)
1.2829 -+ endlink))));
1.2830 -+ custom_infi
1.2831 -+ = build_function_type (integer_type_node,
1.2832 -+ CUSTOM_NUM
1.2833 -+ def_param (float_type_node)
1.2834 -+ def_param (integer_type_node)
1.2835 -+ endlink))));
1.2836 -+ custom_inff
1.2837 -+ = build_function_type (integer_type_node,
1.2838 -+ CUSTOM_NUM
1.2839 -+ def_param (float_type_node)
1.2840 -+ def_param (float_type_node)
1.2841 -+ endlink))));
1.2842 -+ custom_infp
1.2843 -+ = build_function_type (integer_type_node,
1.2844 -+ CUSTOM_NUM
1.2845 -+ def_param (float_type_node)
1.2846 -+ def_param (ptr_type_node)
1.2847 -+ endlink))));
1.2848 -+ custom_inpi
1.2849 -+ = build_function_type (integer_type_node,
1.2850 -+ CUSTOM_NUM
1.2851 -+ def_param (ptr_type_node)
1.2852 -+ def_param (integer_type_node)
1.2853 -+ endlink))));
1.2854 -+ custom_inpf
1.2855 -+ = build_function_type (integer_type_node,
1.2856 -+ CUSTOM_NUM
1.2857 -+ def_param (ptr_type_node)
1.2858 -+ def_param (float_type_node)
1.2859 -+ endlink))));
1.2860 -+ custom_inpp
1.2861 -+ = build_function_type (integer_type_node,
1.2862 -+ CUSTOM_NUM
1.2863 -+ def_param (ptr_type_node)
1.2864 -+ def_param (ptr_type_node)
1.2865 -+ endlink))));
1.2866 -+
1.2867 -+ custom_fn
1.2868 -+ = build_function_type (float_type_node,
1.2869 -+ CUSTOM_NUM
1.2870 -+ endlink));
1.2871 -+ custom_fni
1.2872 -+ = build_function_type (float_type_node,
1.2873 -+ CUSTOM_NUM
1.2874 -+ def_param (integer_type_node)
1.2875 -+ endlink)));
1.2876 -+ custom_fnf
1.2877 -+ = build_function_type (float_type_node,
1.2878 -+ CUSTOM_NUM
1.2879 -+ def_param (float_type_node)
1.2880 -+ endlink)));
1.2881 -+ custom_fnp
1.2882 -+ = build_function_type (float_type_node,
1.2883 -+ CUSTOM_NUM
1.2884 -+ def_param (ptr_type_node)
1.2885 -+ endlink)));
1.2886 -+ custom_fnii
1.2887 -+ = build_function_type (float_type_node,
1.2888 -+ CUSTOM_NUM
1.2889 -+ def_param (integer_type_node)
1.2890 -+ def_param (integer_type_node)
1.2891 -+ endlink))));
1.2892 -+ custom_fnif
1.2893 -+ = build_function_type (float_type_node,
1.2894 -+ CUSTOM_NUM
1.2895 -+ def_param (integer_type_node)
1.2896 -+ def_param (float_type_node)
1.2897 -+ endlink))));
1.2898 -+ custom_fnip
1.2899 -+ = build_function_type (float_type_node,
1.2900 -+ CUSTOM_NUM
1.2901 -+ def_param (integer_type_node)
1.2902 -+ def_param (ptr_type_node)
1.2903 -+ endlink))));
1.2904 -+ custom_fnfi
1.2905 -+ = build_function_type (float_type_node,
1.2906 -+ CUSTOM_NUM
1.2907 -+ def_param (float_type_node)
1.2908 -+ def_param (integer_type_node)
1.2909 -+ endlink))));
1.2910 -+ custom_fnff
1.2911 -+ = build_function_type (float_type_node,
1.2912 -+ CUSTOM_NUM
1.2913 -+ def_param (float_type_node)
1.2914 -+ def_param (float_type_node)
1.2915 -+ endlink))));
1.2916 -+ custom_fnfp
1.2917 -+ = build_function_type (float_type_node,
1.2918 -+ CUSTOM_NUM
1.2919 -+ def_param (float_type_node)
1.2920 -+ def_param (ptr_type_node)
1.2921 -+ endlink))));
1.2922 -+ custom_fnpi
1.2923 -+ = build_function_type (float_type_node,
1.2924 -+ CUSTOM_NUM
1.2925 -+ def_param (ptr_type_node)
1.2926 -+ def_param (integer_type_node)
1.2927 -+ endlink))));
1.2928 -+ custom_fnpf
1.2929 -+ = build_function_type (float_type_node,
1.2930 -+ CUSTOM_NUM
1.2931 -+ def_param (ptr_type_node)
1.2932 -+ def_param (float_type_node)
1.2933 -+ endlink))));
1.2934 -+ custom_fnpp
1.2935 -+ = build_function_type (float_type_node,
1.2936 -+ CUSTOM_NUM
1.2937 -+ def_param (ptr_type_node)
1.2938 -+ def_param (ptr_type_node)
1.2939 -+ endlink))));
1.2940 -+
1.2941 -+
1.2942 -+ custom_pn
1.2943 -+ = build_function_type (ptr_type_node,
1.2944 -+ CUSTOM_NUM
1.2945 -+ endlink));
1.2946 -+ custom_pni
1.2947 -+ = build_function_type (ptr_type_node,
1.2948 -+ CUSTOM_NUM
1.2949 -+ def_param (integer_type_node)
1.2950 -+ endlink)));
1.2951 -+ custom_pnf
1.2952 -+ = build_function_type (ptr_type_node,
1.2953 -+ CUSTOM_NUM
1.2954 -+ def_param (float_type_node)
1.2955 -+ endlink)));
1.2956 -+ custom_pnp
1.2957 -+ = build_function_type (ptr_type_node,
1.2958 -+ CUSTOM_NUM
1.2959 -+ def_param (ptr_type_node)
1.2960 -+ endlink)));
1.2961 -+ custom_pnii
1.2962 -+ = build_function_type (ptr_type_node,
1.2963 -+ CUSTOM_NUM
1.2964 -+ def_param (integer_type_node)
1.2965 -+ def_param (integer_type_node)
1.2966 -+ endlink))));
1.2967 -+ custom_pnif
1.2968 -+ = build_function_type (ptr_type_node,
1.2969 -+ CUSTOM_NUM
1.2970 -+ def_param (integer_type_node)
1.2971 -+ def_param (float_type_node)
1.2972 -+ endlink))));
1.2973 -+ custom_pnip
1.2974 -+ = build_function_type (ptr_type_node,
1.2975 -+ CUSTOM_NUM
1.2976 -+ def_param (integer_type_node)
1.2977 -+ def_param (ptr_type_node)
1.2978 -+ endlink))));
1.2979 -+ custom_pnfi
1.2980 -+ = build_function_type (ptr_type_node,
1.2981 -+ CUSTOM_NUM
1.2982 -+ def_param (float_type_node)
1.2983 -+ def_param (integer_type_node)
1.2984 -+ endlink))));
1.2985 -+ custom_pnff
1.2986 -+ = build_function_type (ptr_type_node,
1.2987 -+ CUSTOM_NUM
1.2988 -+ def_param (float_type_node)
1.2989 -+ def_param (float_type_node)
1.2990 -+ endlink))));
1.2991 -+ custom_pnfp
1.2992 -+ = build_function_type (ptr_type_node,
1.2993 -+ CUSTOM_NUM
1.2994 -+ def_param (float_type_node)
1.2995 -+ def_param (ptr_type_node)
1.2996 -+ endlink))));
1.2997 -+ custom_pnpi
1.2998 -+ = build_function_type (ptr_type_node,
1.2999 -+ CUSTOM_NUM
1.3000 -+ def_param (ptr_type_node)
1.3001 -+ def_param (integer_type_node)
1.3002 -+ endlink))));
1.3003 -+ custom_pnpf
1.3004 -+ = build_function_type (ptr_type_node,
1.3005 -+ CUSTOM_NUM
1.3006 -+ def_param (ptr_type_node)
1.3007 -+ def_param (float_type_node)
1.3008 -+ endlink))));
1.3009 -+ custom_pnpp
1.3010 -+ = build_function_type (ptr_type_node,
1.3011 -+ CUSTOM_NUM
1.3012 -+ def_param (ptr_type_node)
1.3013 -+ def_param (ptr_type_node)
1.3014 -+ endlink))));
1.3015 -+
1.3016 -+
1.3017 -+
1.3018 -+ /* *INDENT-ON* */
1.3019 -+
1.3020 -+
1.3021 -+ for (d = bdesc; d->name; d++)
1.3022 -+ {
1.3023 -+ builtin_function (d->name, *d->type, d->code,
1.3024 -+ BUILT_IN_MD, NULL, NULL);
1.3025 -+ }
1.3026 -+}
1.3027 -+
1.3028 -+/* Expand an expression EXP that calls a built-in function,
1.3029 -+ with result going to TARGET if that's convenient
1.3030 -+ (and in mode MODE if that's convenient).
1.3031 -+ SUBTARGET may be used as the target for computing one of EXP's operands.
1.3032 -+ IGNORE is nonzero if the value is to be ignored. */
1.3033 -+
1.3034 -+static rtx
1.3035 -+nios2_expand_builtin (tree exp, rtx target, rtx subtarget,
1.3036 -+ enum machine_mode mode, int ignore)
1.3037 -+{
1.3038 -+ const struct builtin_description *d;
1.3039 -+ tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
1.3040 -+ unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
1.3041 -+
1.3042 -+ for (d = bdesc; d->name; d++)
1.3043 -+ if (d->code == fcode)
1.3044 -+ return (d->expander) (d, exp, target, subtarget, mode, ignore);
1.3045 -+
1.3046 -+ /* we should have seen one of the functins we registered */
1.3047 -+ abort ();
1.3048 -+}
1.3049 -+
1.3050 -+static rtx nios2_create_target (const struct builtin_description *, rtx);
1.3051 -+
1.3052 -+
1.3053 -+static rtx
1.3054 -+nios2_create_target (const struct builtin_description *d, rtx target)
1.3055 -+{
1.3056 -+ if (!target
1.3057 -+ || !(*insn_data[d->icode].operand[0].predicate) (target,
1.3058 -+ insn_data[d->icode].operand[0].mode))
1.3059 -+ {
1.3060 -+ target = gen_reg_rtx (insn_data[d->icode].operand[0].mode);
1.3061 -+ }
1.3062 -+
1.3063 -+ return target;
1.3064 -+}
1.3065 -+
1.3066 -+
1.3067 -+static rtx nios2_extract_opcode (const struct builtin_description *, int, tree);
1.3068 -+static rtx nios2_extract_operand (const struct builtin_description *, int, int, tree);
1.3069 -+
1.3070 -+static rtx
1.3071 -+nios2_extract_opcode (const struct builtin_description *d, int op, tree arglist)
1.3072 -+{
1.3073 -+ enum machine_mode mode = insn_data[d->icode].operand[op].mode;
1.3074 -+ tree arg = TREE_VALUE (arglist);
1.3075 -+ rtx opcode = expand_expr (arg, NULL_RTX, mode, 0);
1.3076 -+ opcode = protect_from_queue (opcode, 0);
1.3077 -+
1.3078 -+ if (!(*insn_data[d->icode].operand[op].predicate) (opcode, mode))
1.3079 -+ error ("Custom instruction opcode must be compile time constant in the range 0-255 for %s", d->name);
1.3080 -+
1.3081 -+ return opcode;
1.3082 -+}
1.3083 -+
1.3084 -+static rtx
1.3085 -+nios2_extract_operand (const struct builtin_description *d, int op, int argnum, tree arglist)
1.3086 -+{
1.3087 -+ enum machine_mode mode = insn_data[d->icode].operand[op].mode;
1.3088 -+ tree arg = TREE_VALUE (arglist);
1.3089 -+ rtx operand = expand_expr (arg, NULL_RTX, mode, 0);
1.3090 -+ operand = protect_from_queue (operand, 0);
1.3091 -+
1.3092 -+ if (!(*insn_data[d->icode].operand[op].predicate) (operand, mode))
1.3093 -+ operand = copy_to_mode_reg (mode, operand);
1.3094 -+
1.3095 -+ /* ??? Better errors would be nice */
1.3096 -+ if (!(*insn_data[d->icode].operand[op].predicate) (operand, mode))
1.3097 -+ error ("Invalid argument %d to %s", argnum, d->name);
1.3098 -+
1.3099 -+ return operand;
1.3100 -+}
1.3101 -+
1.3102 -+
1.3103 -+static rtx
1.3104 -+nios2_expand_custom_n (const struct builtin_description *d, tree exp,
1.3105 -+ rtx target ATTRIBUTE_UNUSED, rtx subtarget ATTRIBUTE_UNUSED,
1.3106 -+ enum machine_mode mode ATTRIBUTE_UNUSED, int ignore ATTRIBUTE_UNUSED)
1.3107 -+{
1.3108 -+ tree arglist = TREE_OPERAND (exp, 1);
1.3109 -+ rtx pat;
1.3110 -+ rtx opcode;
1.3111 -+
1.3112 -+ /* custom_n should have exactly one operand */
1.3113 -+ if (insn_data[d->icode].n_operands != 1)
1.3114 -+ abort ();
1.3115 -+
1.3116 -+ opcode = nios2_extract_opcode (d, 0, arglist);
1.3117 -+
1.3118 -+ pat = GEN_FCN (d->icode) (opcode);
1.3119 -+ if (!pat)
1.3120 -+ return 0;
1.3121 -+ emit_insn (pat);
1.3122 -+ return 0;
1.3123 -+}
1.3124 -+
1.3125 -+static rtx
1.3126 -+nios2_expand_custom_Xn (const struct builtin_description *d, tree exp,
1.3127 -+ rtx target, rtx subtarget ATTRIBUTE_UNUSED,
1.3128 -+ enum machine_mode mode ATTRIBUTE_UNUSED,
1.3129 -+ int ignore ATTRIBUTE_UNUSED)
1.3130 -+{
1.3131 -+ tree arglist = TREE_OPERAND (exp, 1);
1.3132 -+ rtx pat;
1.3133 -+ rtx opcode;
1.3134 -+
1.3135 -+ /* custom_Xn should have exactly two operands */
1.3136 -+ if (insn_data[d->icode].n_operands != 2)
1.3137 -+ abort ();
1.3138 -+
1.3139 -+ target = nios2_create_target (d, target);
1.3140 -+ opcode = nios2_extract_opcode (d, 1, arglist);
1.3141 -+
1.3142 -+ pat = GEN_FCN (d->icode) (target, opcode);
1.3143 -+ if (!pat)
1.3144 -+ return 0;
1.3145 -+ emit_insn (pat);
1.3146 -+ return target;
1.3147 -+}
1.3148 -+
1.3149 -+static rtx
1.3150 -+nios2_expand_custom_nX (const struct builtin_description *d, tree exp,
1.3151 -+ rtx target ATTRIBUTE_UNUSED, rtx subtarget ATTRIBUTE_UNUSED,
1.3152 -+ enum machine_mode mode ATTRIBUTE_UNUSED, int ignore ATTRIBUTE_UNUSED)
1.3153 -+{
1.3154 -+ tree arglist = TREE_OPERAND (exp, 1);
1.3155 -+ rtx pat;
1.3156 -+ rtx opcode;
1.3157 -+ rtx operands[1];
1.3158 -+ int i;
1.3159 -+
1.3160 -+
1.3161 -+ /* custom_nX should have exactly two operands */
1.3162 -+ if (insn_data[d->icode].n_operands != 2)
1.3163 -+ abort ();
1.3164 -+
1.3165 -+ opcode = nios2_extract_opcode (d, 0, arglist);
1.3166 -+ for (i = 0; i < 1; i++)
1.3167 -+ {
1.3168 -+ arglist = TREE_CHAIN (arglist);
1.3169 -+ operands[i] = nios2_extract_operand (d, i + 1, i + 1, arglist);
1.3170 -+ }
1.3171 -+
1.3172 -+ pat = GEN_FCN (d->icode) (opcode, operands[0]);
1.3173 -+ if (!pat)
1.3174 -+ return 0;
1.3175 -+ emit_insn (pat);
1.3176 -+ return 0;
1.3177 -+}
1.3178 -+
1.3179 -+static rtx
1.3180 -+nios2_expand_custom_XnX (const struct builtin_description *d, tree exp, rtx target,
1.3181 -+ rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED,
1.3182 -+ int ignore ATTRIBUTE_UNUSED)
1.3183 -+{
1.3184 -+ tree arglist = TREE_OPERAND (exp, 1);
1.3185 -+ rtx pat;
1.3186 -+ rtx opcode;
1.3187 -+ rtx operands[1];
1.3188 -+ int i;
1.3189 -+
1.3190 -+ /* custom_Xn should have exactly three operands */
1.3191 -+ if (insn_data[d->icode].n_operands != 3)
1.3192 -+ abort ();
1.3193 -+
1.3194 -+ target = nios2_create_target (d, target);
1.3195 -+ opcode = nios2_extract_opcode (d, 1, arglist);
1.3196 -+
1.3197 -+ for (i = 0; i < 1; i++)
1.3198 -+ {
1.3199 -+ arglist = TREE_CHAIN (arglist);
1.3200 -+ operands[i] = nios2_extract_operand (d, i + 2, i + 1, arglist);
1.3201 -+ }
1.3202 -+
1.3203 -+ pat = GEN_FCN (d->icode) (target, opcode, operands[0]);
1.3204 -+
1.3205 -+ if (!pat)
1.3206 -+ return 0;
1.3207 -+ emit_insn (pat);
1.3208 -+ return target;
1.3209 -+}
1.3210 -+
1.3211 -+static rtx
1.3212 -+nios2_expand_custom_nXX (const struct builtin_description *d, tree exp, rtx target ATTRIBUTE_UNUSED,
1.3213 -+ rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED,
1.3214 -+ int ignore ATTRIBUTE_UNUSED)
1.3215 -+{
1.3216 -+ tree arglist = TREE_OPERAND (exp, 1);
1.3217 -+ rtx pat;
1.3218 -+ rtx opcode;
1.3219 -+ rtx operands[2];
1.3220 -+ int i;
1.3221 -+
1.3222 -+
1.3223 -+ /* custom_nX should have exactly three operands */
1.3224 -+ if (insn_data[d->icode].n_operands != 3)
1.3225 -+ abort ();
1.3226 -+
1.3227 -+ opcode = nios2_extract_opcode (d, 0, arglist);
1.3228 -+ for (i = 0; i < 2; i++)
1.3229 -+ {
1.3230 -+ arglist = TREE_CHAIN (arglist);
1.3231 -+ operands[i] = nios2_extract_operand (d, i + 1, i + 1, arglist);
1.3232 -+ }
1.3233 -+
1.3234 -+ pat = GEN_FCN (d->icode) (opcode, operands[0], operands[1]);
1.3235 -+ if (!pat)
1.3236 -+ return 0;
1.3237 -+ emit_insn (pat);
1.3238 -+ return 0;
1.3239 -+}
1.3240 -+
1.3241 -+static rtx
1.3242 -+nios2_expand_custom_XnXX (const struct builtin_description *d, tree exp, rtx target,
1.3243 -+ rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED,
1.3244 -+ int ignore ATTRIBUTE_UNUSED)
1.3245 -+{
1.3246 -+ tree arglist = TREE_OPERAND (exp, 1);
1.3247 -+ rtx pat;
1.3248 -+ rtx opcode;
1.3249 -+ rtx operands[2];
1.3250 -+ int i;
1.3251 -+
1.3252 -+
1.3253 -+ /* custom_XnX should have exactly four operands */
1.3254 -+ if (insn_data[d->icode].n_operands != 4)
1.3255 -+ abort ();
1.3256 -+
1.3257 -+ target = nios2_create_target (d, target);
1.3258 -+ opcode = nios2_extract_opcode (d, 1, arglist);
1.3259 -+ for (i = 0; i < 2; i++)
1.3260 -+ {
1.3261 -+ arglist = TREE_CHAIN (arglist);
1.3262 -+ operands[i] = nios2_extract_operand (d, i + 2, i + 1, arglist);
1.3263 -+ }
1.3264 -+
1.3265 -+ pat = GEN_FCN (d->icode) (target, opcode, operands[0], operands[1]);
1.3266 -+
1.3267 -+ if (!pat)
1.3268 -+ return 0;
1.3269 -+ emit_insn (pat);
1.3270 -+ return target;
1.3271 -+}
1.3272 -+
1.3273 -+
1.3274 -+
1.3275 -+static rtx
1.3276 -+nios2_expand_STXIO (const struct builtin_description *d, tree exp, rtx target ATTRIBUTE_UNUSED,
1.3277 -+ rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED,
1.3278 -+ int ignore ATTRIBUTE_UNUSED)
1.3279 -+{
1.3280 -+ tree arglist = TREE_OPERAND (exp, 1);
1.3281 -+ rtx pat;
1.3282 -+ rtx store_dest, store_val;
1.3283 -+ enum insn_code icode = d->icode;
1.3284 -+
1.3285 -+ /* stores should have exactly two operands */
1.3286 -+ if (insn_data[icode].n_operands != 2)
1.3287 -+ abort ();
1.3288 -+
1.3289 -+ /* process the destination of the store */
1.3290 -+ {
1.3291 -+ enum machine_mode mode = insn_data[icode].operand[0].mode;
1.3292 -+ tree arg = TREE_VALUE (arglist);
1.3293 -+ store_dest = expand_expr (arg, NULL_RTX, VOIDmode, 0);
1.3294 -+ store_dest = protect_from_queue (store_dest, 0);
1.3295 -+
1.3296 -+ store_dest = gen_rtx_MEM (mode, copy_to_mode_reg (Pmode, store_dest));
1.3297 -+
1.3298 -+ /* ??? Better errors would be nice */
1.3299 -+ if (!(*insn_data[icode].operand[0].predicate) (store_dest, mode))
1.3300 -+ error ("Invalid argument 1 to %s", d->name);
1.3301 -+ }
1.3302 -+
1.3303 -+
1.3304 -+ /* process the value to store */
1.3305 -+ {
1.3306 -+ enum machine_mode mode = insn_data[icode].operand[1].mode;
1.3307 -+ tree arg = TREE_VALUE (TREE_CHAIN (arglist));
1.3308 -+ store_val = expand_expr (arg, NULL_RTX, mode, 0);
1.3309 -+ store_val = protect_from_queue (store_val, 0);
1.3310 -+
1.3311 -+ if (!(*insn_data[icode].operand[1].predicate) (store_val, mode))
1.3312 -+ store_val = copy_to_mode_reg (mode, store_val);
1.3313 -+
1.3314 -+ /* ??? Better errors would be nice */
1.3315 -+ if (!(*insn_data[icode].operand[1].predicate) (store_val, mode))
1.3316 -+ error ("Invalid argument 2 to %s", d->name);
1.3317 -+ }
1.3318 -+
1.3319 -+ pat = GEN_FCN (d->icode) (store_dest, store_val);
1.3320 -+ if (!pat)
1.3321 -+ return 0;
1.3322 -+ emit_insn (pat);
1.3323 -+ return 0;
1.3324 -+}
1.3325 -+
1.3326 -+
1.3327 -+static rtx
1.3328 -+nios2_expand_LDXIO (const struct builtin_description * d, tree exp, rtx target,
1.3329 -+ rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED,
1.3330 -+ int ignore ATTRIBUTE_UNUSED)
1.3331 -+{
1.3332 -+ tree arglist = TREE_OPERAND (exp, 1);
1.3333 -+ rtx pat;
1.3334 -+ rtx ld_src;
1.3335 -+ enum insn_code icode = d->icode;
1.3336 -+
1.3337 -+ /* loads should have exactly two operands */
1.3338 -+ if (insn_data[icode].n_operands != 2)
1.3339 -+ abort ();
1.3340 -+
1.3341 -+ target = nios2_create_target (d, target);
1.3342 -+
1.3343 -+ {
1.3344 -+ enum machine_mode mode = insn_data[icode].operand[1].mode;
1.3345 -+ tree arg = TREE_VALUE (arglist);
1.3346 -+ ld_src = expand_expr (arg, NULL_RTX, VOIDmode, 0);
1.3347 -+ ld_src = protect_from_queue (ld_src, 0);
1.3348 -+
1.3349 -+ ld_src = gen_rtx_MEM (mode, copy_to_mode_reg (Pmode, ld_src));
1.3350 -+
1.3351 -+ /* ??? Better errors would be nice */
1.3352 -+ if (!(*insn_data[icode].operand[1].predicate) (ld_src, mode))
1.3353 -+ {
1.3354 -+ error ("Invalid argument 1 to %s", d->name);
1.3355 -+ }
1.3356 -+ }
1.3357 -+
1.3358 -+ pat = GEN_FCN (d->icode) (target, ld_src);
1.3359 -+ if (!pat)
1.3360 -+ return 0;
1.3361 -+ emit_insn (pat);
1.3362 -+ return target;
1.3363 -+}
1.3364 -+
1.3365 -+
1.3366 -+static rtx
1.3367 -+nios2_expand_sync (const struct builtin_description * d ATTRIBUTE_UNUSED,
1.3368 -+ tree exp ATTRIBUTE_UNUSED, rtx target ATTRIBUTE_UNUSED,
1.3369 -+ rtx subtarget ATTRIBUTE_UNUSED,
1.3370 -+ enum machine_mode mode ATTRIBUTE_UNUSED,
1.3371 -+ int ignore ATTRIBUTE_UNUSED)
1.3372 -+{
1.3373 -+ emit_insn (gen_sync ());
1.3374 -+ return 0;
1.3375 -+}
1.3376 -+
1.3377 -+static rtx
1.3378 -+nios2_expand_rdctl (const struct builtin_description * d ATTRIBUTE_UNUSED,
1.3379 -+ tree exp ATTRIBUTE_UNUSED, rtx target ATTRIBUTE_UNUSED,
1.3380 -+ rtx subtarget ATTRIBUTE_UNUSED,
1.3381 -+ enum machine_mode mode ATTRIBUTE_UNUSED,
1.3382 -+ int ignore ATTRIBUTE_UNUSED)
1.3383 -+{
1.3384 -+ tree arglist = TREE_OPERAND (exp, 1);
1.3385 -+ rtx pat;
1.3386 -+ rtx rdctl_reg;
1.3387 -+ enum insn_code icode = d->icode;
1.3388 -+
1.3389 -+ /* rdctl should have exactly two operands */
1.3390 -+ if (insn_data[icode].n_operands != 2)
1.3391 -+ abort ();
1.3392 -+
1.3393 -+ target = nios2_create_target (d, target);
1.3394 -+
1.3395 -+ {
1.3396 -+ enum machine_mode mode = insn_data[icode].operand[1].mode;
1.3397 -+ tree arg = TREE_VALUE (arglist);
1.3398 -+ rdctl_reg = expand_expr (arg, NULL_RTX, VOIDmode, 0);
1.3399 -+ rdctl_reg = protect_from_queue (rdctl_reg, 0);
1.3400 -+
1.3401 -+ if (!(*insn_data[icode].operand[1].predicate) (rdctl_reg, mode))
1.3402 -+ {
1.3403 -+ error ("Control register number must be in range 0-31 for %s", d->name);
1.3404 -+ }
1.3405 -+ }
1.3406 -+
1.3407 -+ pat = GEN_FCN (d->icode) (target, rdctl_reg);
1.3408 -+ if (!pat)
1.3409 -+ return 0;
1.3410 -+ emit_insn (pat);
1.3411 -+ return target;
1.3412 -+}
1.3413 -+
1.3414 -+static rtx
1.3415 -+nios2_expand_wrctl (const struct builtin_description * d ATTRIBUTE_UNUSED,
1.3416 -+ tree exp ATTRIBUTE_UNUSED, rtx target ATTRIBUTE_UNUSED,
1.3417 -+ rtx subtarget ATTRIBUTE_UNUSED,
1.3418 -+ enum machine_mode mode ATTRIBUTE_UNUSED,
1.3419 -+ int ignore ATTRIBUTE_UNUSED)
1.3420 -+{
1.3421 -+ tree arglist = TREE_OPERAND (exp, 1);
1.3422 -+ rtx pat;
1.3423 -+ rtx wrctl_reg, store_val;
1.3424 -+ enum insn_code icode = d->icode;
1.3425 -+
1.3426 -+ /* stores should have exactly two operands */
1.3427 -+ if (insn_data[icode].n_operands != 2)
1.3428 -+ abort ();
1.3429 -+
1.3430 -+ /* process the destination of the store */
1.3431 -+ {
1.3432 -+ enum machine_mode mode = insn_data[icode].operand[0].mode;
1.3433 -+ tree arg = TREE_VALUE (arglist);
1.3434 -+ wrctl_reg = expand_expr (arg, NULL_RTX, VOIDmode, 0);
1.3435 -+ wrctl_reg = protect_from_queue (wrctl_reg, 0);
1.3436 -+
1.3437 -+ if (!(*insn_data[icode].operand[0].predicate) (wrctl_reg, mode))
1.3438 -+ error ("Control register number must be in range 0-31 for %s", d->name);
1.3439 -+ }
1.3440 -+
1.3441 -+
1.3442 -+ /* process the value to store */
1.3443 -+ {
1.3444 -+ enum machine_mode mode = insn_data[icode].operand[1].mode;
1.3445 -+ tree arg = TREE_VALUE (TREE_CHAIN (arglist));
1.3446 -+ store_val = expand_expr (arg, NULL_RTX, mode, 0);
1.3447 -+ store_val = protect_from_queue (store_val, 0);
1.3448 -+
1.3449 -+ if (!(*insn_data[icode].operand[1].predicate) (store_val, mode))
1.3450 -+ store_val = copy_to_mode_reg (mode, store_val);
1.3451 -+
1.3452 -+ /* ??? Better errors would be nice */
1.3453 -+ if (!(*insn_data[icode].operand[1].predicate) (store_val, mode))
1.3454 -+ error ("Invalid argument 2 to %s", d->name);
1.3455 -+ }
1.3456 -+
1.3457 -+ pat = GEN_FCN (d->icode) (wrctl_reg, store_val);
1.3458 -+ if (!pat)
1.3459 -+ return 0;
1.3460 -+ emit_insn (pat);
1.3461 -+ return 0;
1.3462 -+}
1.3463 -+
1.3464 -+
1.3465 -+#include "gt-nios2.h"
1.3466 -+
1.3467 -diff -durN gcc-3.4.6.orig/gcc/config/nios2/nios2-dp-bit.c gcc-3.4.6/gcc/config/nios2/nios2-dp-bit.c
1.3468 ---- gcc-3.4.6.orig/gcc/config/nios2/nios2-dp-bit.c 1970-01-01 01:00:00.000000000 +0100
1.3469 -+++ gcc-3.4.6/gcc/config/nios2/nios2-dp-bit.c 2007-08-15 23:09:36.000000000 +0200
1.3470 -@@ -0,0 +1,1652 @@
1.3471 -+
1.3472 -+/* This is a software floating point library which can be used
1.3473 -+ for targets without hardware floating point.
1.3474 -+ Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004
1.3475 -+ Free Software Foundation, Inc.
1.3476 -+
1.3477 -+This file is free software; you can redistribute it and/or modify it
1.3478 -+under the terms of the GNU General Public License as published by the
1.3479 -+Free Software Foundation; either version 2, or (at your option) any
1.3480 -+later version.
1.3481 -+
1.3482 -+In addition to the permissions in the GNU General Public License, the
1.3483 -+Free Software Foundation gives you unlimited permission to link the
1.3484 -+compiled version of this file with other programs, and to distribute
1.3485 -+those programs without any restriction coming from the use of this
1.3486 -+file. (The General Public License restrictions do apply in other
1.3487 -+respects; for example, they cover modification of the file, and
1.3488 -+distribution when not linked into another program.)
1.3489 -+
1.3490 -+This file is distributed in the hope that it will be useful, but
1.3491 -+WITHOUT ANY WARRANTY; without even the implied warranty of
1.3492 -+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1.3493 -+General Public License for more details.
1.3494 -+
1.3495 -+You should have received a copy of the GNU General Public License
1.3496 -+along with this program; see the file COPYING. If not, write to
1.3497 -+the Free Software Foundation, 59 Temple Place - Suite 330,
1.3498 -+Boston, MA 02111-1307, USA. */
1.3499 -+
1.3500 -+/* As a special exception, if you link this library with other files,
1.3501 -+ some of which are compiled with GCC, to produce an executable,
1.3502 -+ this library does not by itself cause the resulting executable
1.3503 -+ to be covered by the GNU General Public License.
1.3504 -+ This exception does not however invalidate any other reasons why
1.3505 -+ the executable file might be covered by the GNU General Public License. */
1.3506 -+
1.3507 -+/* This implements IEEE 754 format arithmetic, but does not provide a
1.3508 -+ mechanism for setting the rounding mode, or for generating or handling
1.3509 -+ exceptions.
1.3510 -+
1.3511 -+ The original code by Steve Chamberlain, hacked by Mark Eichin and Jim
1.3512 -+ Wilson, all of Cygnus Support. */
1.3513 -+
1.3514 -+/* The intended way to use this file is to make two copies, add `#define FLOAT'
1.3515 -+ to one copy, then compile both copies and add them to libgcc.a. */
1.3516 -+
1.3517 -+#include "tconfig.h"
1.3518 -+#include "coretypes.h"
1.3519 -+#include "tm.h"
1.3520 -+#include "config/fp-bit.h"
1.3521 -+
1.3522 -+/* The following macros can be defined to change the behavior of this file:
1.3523 -+ FLOAT: Implement a `float', aka SFmode, fp library. If this is not
1.3524 -+ defined, then this file implements a `double', aka DFmode, fp library.
1.3525 -+ FLOAT_ONLY: Used with FLOAT, to implement a `float' only library, i.e.
1.3526 -+ don't include float->double conversion which requires the double library.
1.3527 -+ This is useful only for machines which can't support doubles, e.g. some
1.3528 -+ 8-bit processors.
1.3529 -+ CMPtype: Specify the type that floating point compares should return.
1.3530 -+ This defaults to SItype, aka int.
1.3531 -+ US_SOFTWARE_GOFAST: This makes all entry points use the same names as the
1.3532 -+ US Software goFast library.
1.3533 -+ _DEBUG_BITFLOAT: This makes debugging the code a little easier, by adding
1.3534 -+ two integers to the FLO_union_type.
1.3535 -+ NO_DENORMALS: Disable handling of denormals.
1.3536 -+ NO_NANS: Disable nan and infinity handling
1.3537 -+ SMALL_MACHINE: Useful when operations on QIs and HIs are faster
1.3538 -+ than on an SI */
1.3539 -+
1.3540 -+/* We don't currently support extended floats (long doubles) on machines
1.3541 -+ without hardware to deal with them.
1.3542 -+
1.3543 -+ These stubs are just to keep the linker from complaining about unresolved
1.3544 -+ references which can be pulled in from libio & libstdc++, even if the
1.3545 -+ user isn't using long doubles. However, they may generate an unresolved
1.3546 -+ external to abort if abort is not used by the function, and the stubs
1.3547 -+ are referenced from within libc, since libgcc goes before and after the
1.3548 -+ system library. */
1.3549 -+
1.3550 -+#ifdef DECLARE_LIBRARY_RENAMES
1.3551 -+ DECLARE_LIBRARY_RENAMES
1.3552 -+#endif
1.3553 -+
1.3554 -+#ifdef EXTENDED_FLOAT_STUBS
1.3555 -+extern void abort (void);
1.3556 -+void __extendsfxf2 (void) { abort(); }
1.3557 -+void __extenddfxf2 (void) { abort(); }
1.3558 -+void __truncxfdf2 (void) { abort(); }
1.3559 -+void __truncxfsf2 (void) { abort(); }
1.3560 -+void __fixxfsi (void) { abort(); }
1.3561 -+void __floatsixf (void) { abort(); }
1.3562 -+void __addxf3 (void) { abort(); }
1.3563 -+void __subxf3 (void) { abort(); }
1.3564 -+void __mulxf3 (void) { abort(); }
1.3565 -+void __divxf3 (void) { abort(); }
1.3566 -+void __negxf2 (void) { abort(); }
1.3567 -+void __eqxf2 (void) { abort(); }
1.3568 -+void __nexf2 (void) { abort(); }
1.3569 -+void __gtxf2 (void) { abort(); }
1.3570 -+void __gexf2 (void) { abort(); }
1.3571 -+void __lexf2 (void) { abort(); }
1.3572 -+void __ltxf2 (void) { abort(); }
1.3573 -+
1.3574 -+void __extendsftf2 (void) { abort(); }
1.3575 -+void __extenddftf2 (void) { abort(); }
1.3576 -+void __trunctfdf2 (void) { abort(); }
1.3577 -+void __trunctfsf2 (void) { abort(); }
1.3578 -+void __fixtfsi (void) { abort(); }
1.3579 -+void __floatsitf (void) { abort(); }
1.3580 -+void __addtf3 (void) { abort(); }
1.3581 -+void __subtf3 (void) { abort(); }
1.3582 -+void __multf3 (void) { abort(); }
1.3583 -+void __divtf3 (void) { abort(); }
1.3584 -+void __negtf2 (void) { abort(); }
1.3585 -+void __eqtf2 (void) { abort(); }
1.3586 -+void __netf2 (void) { abort(); }
1.3587 -+void __gttf2 (void) { abort(); }
1.3588 -+void __getf2 (void) { abort(); }
1.3589 -+void __letf2 (void) { abort(); }
1.3590 -+void __lttf2 (void) { abort(); }
1.3591 -+#else /* !EXTENDED_FLOAT_STUBS, rest of file */
1.3592 -+
1.3593 -+/* IEEE "special" number predicates */
1.3594 -+
1.3595 -+#ifdef NO_NANS
1.3596 -+
1.3597 -+#define nan() 0
1.3598 -+#define isnan(x) 0
1.3599 -+#define isinf(x) 0
1.3600 -+#else
1.3601 -+
1.3602 -+#if defined L_thenan_sf
1.3603 -+const fp_number_type __thenan_sf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
1.3604 -+#elif defined L_thenan_df
1.3605 -+const fp_number_type __thenan_df = { CLASS_SNAN, 0, 0, {(fractype) 0} };
1.3606 -+#elif defined L_thenan_tf
1.3607 -+const fp_number_type __thenan_tf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
1.3608 -+#elif defined TFLOAT
1.3609 -+extern const fp_number_type __thenan_tf;
1.3610 -+#elif defined FLOAT
1.3611 -+extern const fp_number_type __thenan_sf;
1.3612 -+#else
1.3613 -+extern const fp_number_type __thenan_df;
1.3614 -+#endif
1.3615 -+
1.3616 -+INLINE
1.3617 -+static fp_number_type *
1.3618 -+nan (void)
1.3619 -+{
1.3620 -+ /* Discard the const qualifier... */
1.3621 -+#ifdef TFLOAT
1.3622 -+ return (fp_number_type *) (& __thenan_tf);
1.3623 -+#elif defined FLOAT
1.3624 -+ return (fp_number_type *) (& __thenan_sf);
1.3625 -+#else
1.3626 -+ return (fp_number_type *) (& __thenan_df);
1.3627 -+#endif
1.3628 -+}
1.3629 -+
1.3630 -+INLINE
1.3631 -+static int
1.3632 -+isnan ( fp_number_type * x)
1.3633 -+{
1.3634 -+ return x->class == CLASS_SNAN || x->class == CLASS_QNAN;
1.3635 -+}
1.3636 -+
1.3637 -+INLINE
1.3638 -+static int
1.3639 -+isinf ( fp_number_type * x)
1.3640 -+{
1.3641 -+ return x->class == CLASS_INFINITY;
1.3642 -+}
1.3643 -+
1.3644 -+#endif /* NO_NANS */
1.3645 -+
1.3646 -+INLINE
1.3647 -+static int
1.3648 -+iszero ( fp_number_type * x)
1.3649 -+{
1.3650 -+ return x->class == CLASS_ZERO;
1.3651 -+}
1.3652 -+
1.3653 -+INLINE
1.3654 -+static void
1.3655 -+flip_sign ( fp_number_type * x)
1.3656 -+{
1.3657 -+ x->sign = !x->sign;
1.3658 -+}
1.3659 -+
1.3660 -+extern FLO_type pack_d ( fp_number_type * );
1.3661 -+
1.3662 -+#if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf)
1.3663 -+FLO_type
1.3664 -+pack_d ( fp_number_type * src)
1.3665 -+{
1.3666 -+ FLO_union_type dst;
1.3667 -+ fractype fraction = src->fraction.ll; /* wasn't unsigned before? */
1.3668 -+ int sign = src->sign;
1.3669 -+ int exp = 0;
1.3670 -+
1.3671 -+ if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && (isnan (src) || isinf (src)))
1.3672 -+ {
1.3673 -+ /* We can't represent these values accurately. By using the
1.3674 -+ largest possible magnitude, we guarantee that the conversion
1.3675 -+ of infinity is at least as big as any finite number. */
1.3676 -+ exp = EXPMAX;
1.3677 -+ fraction = ((fractype) 1 << FRACBITS) - 1;
1.3678 -+ }
1.3679 -+ else if (isnan (src))
1.3680 -+ {
1.3681 -+ exp = EXPMAX;
1.3682 -+ if (src->class == CLASS_QNAN || 1)
1.3683 -+ {
1.3684 -+#ifdef QUIET_NAN_NEGATED
1.3685 -+ fraction |= QUIET_NAN - 1;
1.3686 -+#else
1.3687 -+ fraction |= QUIET_NAN;
1.3688 -+#endif
1.3689 -+ }
1.3690 -+ }
1.3691 -+ else if (isinf (src))
1.3692 -+ {
1.3693 -+ exp = EXPMAX;
1.3694 -+ fraction = 0;
1.3695 -+ }
1.3696 -+ else if (iszero (src))
1.3697 -+ {
1.3698 -+ exp = 0;
1.3699 -+ fraction = 0;
1.3700 -+ }
1.3701 -+ else if (fraction == 0)
1.3702 -+ {
1.3703 -+ exp = 0;
1.3704 -+ }
1.3705 -+ else
1.3706 -+ {
1.3707 -+ if (src->normal_exp < NORMAL_EXPMIN)
1.3708 -+ {
1.3709 -+#ifdef NO_DENORMALS
1.3710 -+ /* Go straight to a zero representation if denormals are not
1.3711 -+ supported. The denormal handling would be harmless but
1.3712 -+ isn't unnecessary. */
1.3713 -+ exp = 0;
1.3714 -+ fraction = 0;
1.3715 -+#else /* NO_DENORMALS */
1.3716 -+ /* This number's exponent is too low to fit into the bits
1.3717 -+ available in the number, so we'll store 0 in the exponent and
1.3718 -+ shift the fraction to the right to make up for it. */
1.3719 -+
1.3720 -+ int shift = NORMAL_EXPMIN - src->normal_exp;
1.3721 -+
1.3722 -+ exp = 0;
1.3723 -+
1.3724 -+ if (shift > FRAC_NBITS - NGARDS)
1.3725 -+ {
1.3726 -+ /* No point shifting, since it's more that 64 out. */
1.3727 -+ fraction = 0;
1.3728 -+ }
1.3729 -+ else
1.3730 -+ {
1.3731 -+ int lowbit = (fraction & (((fractype)1 << shift) - 1)) ? 1 : 0;
1.3732 -+ fraction = (fraction >> shift) | lowbit;
1.3733 -+ }
1.3734 -+ if ((fraction & GARDMASK) == GARDMSB)
1.3735 -+ {
1.3736 -+ if ((fraction & (1 << NGARDS)))
1.3737 -+ fraction += GARDROUND + 1;
1.3738 -+ }
1.3739 -+ else
1.3740 -+ {
1.3741 -+ /* Add to the guards to round up. */
1.3742 -+ fraction += GARDROUND;
1.3743 -+ }
1.3744 -+ /* Perhaps the rounding means we now need to change the
1.3745 -+ exponent, because the fraction is no longer denormal. */
1.3746 -+ if (fraction >= IMPLICIT_1)
1.3747 -+ {
1.3748 -+ exp += 1;
1.3749 -+ }
1.3750 -+ fraction >>= NGARDS;
1.3751 -+#endif /* NO_DENORMALS */
1.3752 -+ }
1.3753 -+ else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS)
1.3754 -+ && src->normal_exp > EXPBIAS)
1.3755 -+ {
1.3756 -+ exp = EXPMAX;
1.3757 -+ fraction = 0;
1.3758 -+ }
1.3759 -+ else
1.3760 -+ {
1.3761 -+ exp = src->normal_exp + EXPBIAS;
1.3762 -+ if (!ROUND_TOWARDS_ZERO)
1.3763 -+ {
1.3764 -+ /* IF the gard bits are the all zero, but the first, then we're
1.3765 -+ half way between two numbers, choose the one which makes the
1.3766 -+ lsb of the answer 0. */
1.3767 -+ if ((fraction & GARDMASK) == GARDMSB)
1.3768 -+ {
1.3769 -+ if (fraction & (1 << NGARDS))
1.3770 -+ fraction += GARDROUND + 1;
1.3771 -+ }
1.3772 -+ else
1.3773 -+ {
1.3774 -+ /* Add a one to the guards to round up */
1.3775 -+ fraction += GARDROUND;
1.3776 -+ }
1.3777 -+ if (fraction >= IMPLICIT_2)
1.3778 -+ {
1.3779 -+ fraction >>= 1;
1.3780 -+ exp += 1;
1.3781 -+ }
1.3782 -+ }
1.3783 -+ fraction >>= NGARDS;
1.3784 -+
1.3785 -+ if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && exp > EXPMAX)
1.3786 -+ {
1.3787 -+ /* Saturate on overflow. */
1.3788 -+ exp = EXPMAX;
1.3789 -+ fraction = ((fractype) 1 << FRACBITS) - 1;
1.3790 -+ }
1.3791 -+ }
1.3792 -+ }
1.3793 -+
1.3794 -+ /* We previously used bitfields to store the number, but this doesn't
1.3795 -+ handle little/big endian systems conveniently, so use shifts and
1.3796 -+ masks */
1.3797 -+#ifdef FLOAT_BIT_ORDER_MISMATCH
1.3798 -+ dst.bits.fraction = fraction;
1.3799 -+ dst.bits.exp = exp;
1.3800 -+ dst.bits.sign = sign;
1.3801 -+#else
1.3802 -+# if defined TFLOAT && defined HALFFRACBITS
1.3803 -+ {
1.3804 -+ halffractype high, low, unity;
1.3805 -+ int lowsign, lowexp;
1.3806 -+
1.3807 -+ unity = (halffractype) 1 << HALFFRACBITS;
1.3808 -+
1.3809 -+ /* Set HIGH to the high double's significand, masking out the implicit 1.
1.3810 -+ Set LOW to the low double's full significand. */
1.3811 -+ high = (fraction >> (FRACBITS - HALFFRACBITS)) & (unity - 1);
1.3812 -+ low = fraction & (unity * 2 - 1);
1.3813 -+
1.3814 -+ /* Get the initial sign and exponent of the low double. */
1.3815 -+ lowexp = exp - HALFFRACBITS - 1;
1.3816 -+ lowsign = sign;
1.3817 -+
1.3818 -+ /* HIGH should be rounded like a normal double, making |LOW| <=
1.3819 -+ 0.5 ULP of HIGH. Assume round-to-nearest. */
1.3820 -+ if (exp < EXPMAX)
1.3821 -+ if (low > unity || (low == unity && (high & 1) == 1))
1.3822 -+ {
1.3823 -+ /* Round HIGH up and adjust LOW to match. */
1.3824 -+ high++;
1.3825 -+ if (high == unity)
1.3826 -+ {
1.3827 -+ /* May make it infinite, but that's OK. */
1.3828 -+ high = 0;
1.3829 -+ exp++;
1.3830 -+ }
1.3831 -+ low = unity * 2 - low;
1.3832 -+ lowsign ^= 1;
1.3833 -+ }
1.3834 -+
1.3835 -+ high |= (halffractype) exp << HALFFRACBITS;
1.3836 -+ high |= (halffractype) sign << (HALFFRACBITS + EXPBITS);
1.3837 -+
1.3838 -+ if (exp == EXPMAX || exp == 0 || low == 0)
1.3839 -+ low = 0;
1.3840 -+ else
1.3841 -+ {
1.3842 -+ while (lowexp > 0 && low < unity)
1.3843 -+ {
1.3844 -+ low <<= 1;
1.3845 -+ lowexp--;
1.3846 -+ }
1.3847 -+
1.3848 -+ if (lowexp <= 0)
1.3849 -+ {
1.3850 -+ halffractype roundmsb, round;
1.3851 -+ int shift;
1.3852 -+
1.3853 -+ shift = 1 - lowexp;
1.3854 -+ roundmsb = (1 << (shift - 1));
1.3855 -+ round = low & ((roundmsb << 1) - 1);
1.3856 -+
1.3857 -+ low >>= shift;
1.3858 -+ lowexp = 0;
1.3859 -+
1.3860 -+ if (round > roundmsb || (round == roundmsb && (low & 1) == 1))
1.3861 -+ {
1.3862 -+ low++;
1.3863 -+ if (low == unity)
1.3864 -+ /* LOW rounds up to the smallest normal number. */
1.3865 -+ lowexp++;
1.3866 -+ }
1.3867 -+ }
1.3868 -+
1.3869 -+ low &= unity - 1;
1.3870 -+ low |= (halffractype) lowexp << HALFFRACBITS;
1.3871 -+ low |= (halffractype) lowsign << (HALFFRACBITS + EXPBITS);
1.3872 -+ }
1.3873 -+ dst.value_raw = ((fractype) high << HALFSHIFT) | low;
1.3874 -+ }
1.3875 -+# else
1.3876 -+ dst.value_raw = fraction & ((((fractype)1) << FRACBITS) - (fractype)1);
1.3877 -+ dst.value_raw |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << FRACBITS;
1.3878 -+ dst.value_raw |= ((fractype) (sign & 1)) << (FRACBITS | EXPBITS);
1.3879 -+# endif
1.3880 -+#endif
1.3881 -+
1.3882 -+#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
1.3883 -+#ifdef TFLOAT
1.3884 -+ {
1.3885 -+ qrtrfractype tmp1 = dst.words[0];
1.3886 -+ qrtrfractype tmp2 = dst.words[1];
1.3887 -+ dst.words[0] = dst.words[3];
1.3888 -+ dst.words[1] = dst.words[2];
1.3889 -+ dst.words[2] = tmp2;
1.3890 -+ dst.words[3] = tmp1;
1.3891 -+ }
1.3892 -+#else
1.3893 -+ {
1.3894 -+ halffractype tmp = dst.words[0];
1.3895 -+ dst.words[0] = dst.words[1];
1.3896 -+ dst.words[1] = tmp;
1.3897 -+ }
1.3898 -+#endif
1.3899 -+#endif
1.3900 -+
1.3901 -+ return dst.value;
1.3902 -+}
1.3903 -+#endif
1.3904 -+
1.3905 -+#if defined(L_unpack_df) || defined(L_unpack_sf) || defined(L_unpack_tf)
1.3906 -+void
1.3907 -+unpack_d (FLO_union_type * src, fp_number_type * dst)
1.3908 -+{
1.3909 -+ /* We previously used bitfields to store the number, but this doesn't
1.3910 -+ handle little/big endian systems conveniently, so use shifts and
1.3911 -+ masks */
1.3912 -+ fractype fraction;
1.3913 -+ int exp;
1.3914 -+ int sign;
1.3915 -+
1.3916 -+#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
1.3917 -+ FLO_union_type swapped;
1.3918 -+
1.3919 -+#ifdef TFLOAT
1.3920 -+ swapped.words[0] = src->words[3];
1.3921 -+ swapped.words[1] = src->words[2];
1.3922 -+ swapped.words[2] = src->words[1];
1.3923 -+ swapped.words[3] = src->words[0];
1.3924 -+#else
1.3925 -+ swapped.words[0] = src->words[1];
1.3926 -+ swapped.words[1] = src->words[0];
1.3927 -+#endif
1.3928 -+ src = &swapped;
1.3929 -+#endif
1.3930 -+
1.3931 -+#ifdef FLOAT_BIT_ORDER_MISMATCH
1.3932 -+ fraction = src->bits.fraction;
1.3933 -+ exp = src->bits.exp;
1.3934 -+ sign = src->bits.sign;
1.3935 -+#else
1.3936 -+# if defined TFLOAT && defined HALFFRACBITS
1.3937 -+ {
1.3938 -+ halffractype high, low;
1.3939 -+
1.3940 -+ high = src->value_raw >> HALFSHIFT;
1.3941 -+ low = src->value_raw & (((fractype)1 << HALFSHIFT) - 1);
1.3942 -+
1.3943 -+ fraction = high & ((((fractype)1) << HALFFRACBITS) - 1);
1.3944 -+ fraction <<= FRACBITS - HALFFRACBITS;
1.3945 -+ exp = ((int)(high >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
1.3946 -+ sign = ((int)(high >> (((HALFFRACBITS + EXPBITS))))) & 1;
1.3947 -+
1.3948 -+ if (exp != EXPMAX && exp != 0 && low != 0)
1.3949 -+ {
1.3950 -+ int lowexp = ((int)(low >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
1.3951 -+ int lowsign = ((int)(low >> (((HALFFRACBITS + EXPBITS))))) & 1;
1.3952 -+ int shift;
1.3953 -+ fractype xlow;
1.3954 -+
1.3955 -+ xlow = low & ((((fractype)1) << HALFFRACBITS) - 1);
1.3956 -+ if (lowexp)
1.3957 -+ xlow |= (((halffractype)1) << HALFFRACBITS);
1.3958 -+ else
1.3959 -+ lowexp = 1;
1.3960 -+ shift = (FRACBITS - HALFFRACBITS) - (exp - lowexp);
1.3961 -+ if (shift > 0)
1.3962 -+ xlow <<= shift;
1.3963 -+ else if (shift < 0)
1.3964 -+ xlow >>= -shift;
1.3965 -+ if (sign == lowsign)
1.3966 -+ fraction += xlow;
1.3967 -+ else if (fraction >= xlow)
1.3968 -+ fraction -= xlow;
1.3969 -+ else
1.3970 -+ {
1.3971 -+ /* The high part is a power of two but the full number is lower.
1.3972 -+ This code will leave the implicit 1 in FRACTION, but we'd
1.3973 -+ have added that below anyway. */
1.3974 -+ fraction = (((fractype) 1 << FRACBITS) - xlow) << 1;
1.3975 -+ exp--;
1.3976 -+ }
1.3977 -+ }
1.3978 -+ }
1.3979 -+# else
1.3980 -+ fraction = src->value_raw & ((((fractype)1) << FRACBITS) - 1);
1.3981 -+ exp = ((int)(src->value_raw >> FRACBITS)) & ((1 << EXPBITS) - 1);
1.3982 -+ sign = ((int)(src->value_raw >> (FRACBITS + EXPBITS))) & 1;
1.3983 -+# endif
1.3984 -+#endif
1.3985 -+
1.3986 -+ dst->sign = sign;
1.3987 -+ if (exp == 0)
1.3988 -+ {
1.3989 -+ /* Hmm. Looks like 0 */
1.3990 -+ if (fraction == 0
1.3991 -+#ifdef NO_DENORMALS
1.3992 -+ || 1
1.3993 -+#endif
1.3994 -+ )
1.3995 -+ {
1.3996 -+ /* tastes like zero */
1.3997 -+ dst->class = CLASS_ZERO;
1.3998 -+ }
1.3999 -+ else
1.4000 -+ {
1.4001 -+ /* Zero exponent with nonzero fraction - it's denormalized,
1.4002 -+ so there isn't a leading implicit one - we'll shift it so
1.4003 -+ it gets one. */
1.4004 -+ dst->normal_exp = exp - EXPBIAS + 1;
1.4005 -+ fraction <<= NGARDS;
1.4006 -+
1.4007 -+ dst->class = CLASS_NUMBER;
1.4008 -+#if 1
1.4009 -+ while (fraction < IMPLICIT_1)
1.4010 -+ {
1.4011 -+ fraction <<= 1;
1.4012 -+ dst->normal_exp--;
1.4013 -+ }
1.4014 -+#endif
1.4015 -+ dst->fraction.ll = fraction;
1.4016 -+ }
1.4017 -+ }
1.4018 -+ else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && exp == EXPMAX)
1.4019 -+ {
1.4020 -+ /* Huge exponent*/
1.4021 -+ if (fraction == 0)
1.4022 -+ {
1.4023 -+ /* Attached to a zero fraction - means infinity */
1.4024 -+ dst->class = CLASS_INFINITY;
1.4025 -+ }
1.4026 -+ else
1.4027 -+ {
1.4028 -+ /* Nonzero fraction, means nan */
1.4029 -+#ifdef QUIET_NAN_NEGATED
1.4030 -+ if ((fraction & QUIET_NAN) == 0)
1.4031 -+#else
1.4032 -+ if (fraction & QUIET_NAN)
1.4033 -+#endif
1.4034 -+ {
1.4035 -+ dst->class = CLASS_QNAN;
1.4036 -+ }
1.4037 -+ else
1.4038 -+ {
1.4039 -+ dst->class = CLASS_SNAN;
1.4040 -+ }
1.4041 -+ /* Keep the fraction part as the nan number */
1.4042 -+ dst->fraction.ll = fraction;
1.4043 -+ }
1.4044 -+ }
1.4045 -+ else
1.4046 -+ {
1.4047 -+ /* Nothing strange about this number */
1.4048 -+ dst->normal_exp = exp - EXPBIAS;
1.4049 -+ dst->class = CLASS_NUMBER;
1.4050 -+ dst->fraction.ll = (fraction << NGARDS) | IMPLICIT_1;
1.4051 -+ }
1.4052 -+}
1.4053 -+#endif /* L_unpack_df || L_unpack_sf */
1.4054 -+
1.4055 -+#if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf)
1.4056 -+static fp_number_type *
1.4057 -+_fpadd_parts (fp_number_type * a,
1.4058 -+ fp_number_type * b,
1.4059 -+ fp_number_type * tmp)
1.4060 -+{
1.4061 -+ intfrac tfraction;
1.4062 -+
1.4063 -+ /* Put commonly used fields in local variables. */
1.4064 -+ int a_normal_exp;
1.4065 -+ int b_normal_exp;
1.4066 -+ fractype a_fraction;
1.4067 -+ fractype b_fraction;
1.4068 -+
1.4069 -+ if (isnan (a))
1.4070 -+ {
1.4071 -+ return a;
1.4072 -+ }
1.4073 -+ if (isnan (b))
1.4074 -+ {
1.4075 -+ return b;
1.4076 -+ }
1.4077 -+ if (isinf (a))
1.4078 -+ {
1.4079 -+ /* Adding infinities with opposite signs yields a NaN. */
1.4080 -+ if (isinf (b) && a->sign != b->sign)
1.4081 -+ return nan ();
1.4082 -+ return a;
1.4083 -+ }
1.4084 -+ if (isinf (b))
1.4085 -+ {
1.4086 -+ return b;
1.4087 -+ }
1.4088 -+ if (iszero (b))
1.4089 -+ {
1.4090 -+ if (iszero (a))
1.4091 -+ {
1.4092 -+ *tmp = *a;
1.4093 -+ tmp->sign = a->sign & b->sign;
1.4094 -+ return tmp;
1.4095 -+ }
1.4096 -+ return a;
1.4097 -+ }
1.4098 -+ if (iszero (a))
1.4099 -+ {
1.4100 -+ return b;
1.4101 -+ }
1.4102 -+
1.4103 -+ /* Got two numbers. shift the smaller and increment the exponent till
1.4104 -+ they're the same */
1.4105 -+ {
1.4106 -+ int diff;
1.4107 -+
1.4108 -+ a_normal_exp = a->normal_exp;
1.4109 -+ b_normal_exp = b->normal_exp;
1.4110 -+ a_fraction = a->fraction.ll;
1.4111 -+ b_fraction = b->fraction.ll;
1.4112 -+
1.4113 -+ diff = a_normal_exp - b_normal_exp;
1.4114 -+
1.4115 -+ if (diff < 0)
1.4116 -+ diff = -diff;
1.4117 -+ if (diff < FRAC_NBITS)
1.4118 -+ {
1.4119 -+ /* ??? This does shifts one bit at a time. Optimize. */
1.4120 -+ while (a_normal_exp > b_normal_exp)
1.4121 -+ {
1.4122 -+ b_normal_exp++;
1.4123 -+ LSHIFT (b_fraction);
1.4124 -+ }
1.4125 -+ while (b_normal_exp > a_normal_exp)
1.4126 -+ {
1.4127 -+ a_normal_exp++;
1.4128 -+ LSHIFT (a_fraction);
1.4129 -+ }
1.4130 -+ }
1.4131 -+ else
1.4132 -+ {
1.4133 -+ /* Somethings's up.. choose the biggest */
1.4134 -+ if (a_normal_exp > b_normal_exp)
1.4135 -+ {
1.4136 -+ b_normal_exp = a_normal_exp;
1.4137 -+ b_fraction = 0;
1.4138 -+ }
1.4139 -+ else
1.4140 -+ {
1.4141 -+ a_normal_exp = b_normal_exp;
1.4142 -+ a_fraction = 0;
1.4143 -+ }
1.4144 -+ }
1.4145 -+ }
1.4146 -+
1.4147 -+ if (a->sign != b->sign)
1.4148 -+ {
1.4149 -+ if (a->sign)
1.4150 -+ {
1.4151 -+ tfraction = -a_fraction + b_fraction;
1.4152 -+ }
1.4153 -+ else
1.4154 -+ {
1.4155 -+ tfraction = a_fraction - b_fraction;
1.4156 -+ }
1.4157 -+ if (tfraction >= 0)
1.4158 -+ {
1.4159 -+ tmp->sign = 0;
1.4160 -+ tmp->normal_exp = a_normal_exp;
1.4161 -+ tmp->fraction.ll = tfraction;
1.4162 -+ }
1.4163 -+ else
1.4164 -+ {
1.4165 -+ tmp->sign = 1;
1.4166 -+ tmp->normal_exp = a_normal_exp;
1.4167 -+ tmp->fraction.ll = -tfraction;
1.4168 -+ }
1.4169 -+ /* and renormalize it */
1.4170 -+
1.4171 -+ while (tmp->fraction.ll < IMPLICIT_1 && tmp->fraction.ll)
1.4172 -+ {
1.4173 -+ tmp->fraction.ll <<= 1;
1.4174 -+ tmp->normal_exp--;
1.4175 -+ }
1.4176 -+ }
1.4177 -+ else
1.4178 -+ {
1.4179 -+ tmp->sign = a->sign;
1.4180 -+ tmp->normal_exp = a_normal_exp;
1.4181 -+ tmp->fraction.ll = a_fraction + b_fraction;
1.4182 -+ }
1.4183 -+ tmp->class = CLASS_NUMBER;
1.4184 -+ /* Now the fraction is added, we have to shift down to renormalize the
1.4185 -+ number */
1.4186 -+
1.4187 -+ if (tmp->fraction.ll >= IMPLICIT_2)
1.4188 -+ {
1.4189 -+ LSHIFT (tmp->fraction.ll);
1.4190 -+ tmp->normal_exp++;
1.4191 -+ }
1.4192 -+ return tmp;
1.4193 -+
1.4194 -+}
1.4195 -+
1.4196 -+FLO_type
1.4197 -+add (FLO_type arg_a, FLO_type arg_b)
1.4198 -+{
1.4199 -+ fp_number_type a;
1.4200 -+ fp_number_type b;
1.4201 -+ fp_number_type tmp;
1.4202 -+ fp_number_type *res;
1.4203 -+ FLO_union_type au, bu;
1.4204 -+
1.4205 -+ au.value = arg_a;
1.4206 -+ bu.value = arg_b;
1.4207 -+
1.4208 -+ unpack_d (&au, &a);
1.4209 -+ unpack_d (&bu, &b);
1.4210 -+
1.4211 -+ res = _fpadd_parts (&a, &b, &tmp);
1.4212 -+
1.4213 -+ return pack_d (res);
1.4214 -+}
1.4215 -+
1.4216 -+FLO_type
1.4217 -+sub (FLO_type arg_a, FLO_type arg_b)
1.4218 -+{
1.4219 -+ fp_number_type a;
1.4220 -+ fp_number_type b;
1.4221 -+ fp_number_type tmp;
1.4222 -+ fp_number_type *res;
1.4223 -+ FLO_union_type au, bu;
1.4224 -+
1.4225 -+ au.value = arg_a;
1.4226 -+ bu.value = arg_b;
1.4227 -+
1.4228 -+ unpack_d (&au, &a);
1.4229 -+ unpack_d (&bu, &b);
1.4230 -+
1.4231 -+ b.sign ^= 1;
1.4232 -+
1.4233 -+ res = _fpadd_parts (&a, &b, &tmp);
1.4234 -+
1.4235 -+ return pack_d (res);
1.4236 -+}
1.4237 -+#endif /* L_addsub_sf || L_addsub_df */
1.4238 -+
1.4239 -+#if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf)
1.4240 -+static inline __attribute__ ((__always_inline__)) fp_number_type *
1.4241 -+_fpmul_parts ( fp_number_type * a,
1.4242 -+ fp_number_type * b,
1.4243 -+ fp_number_type * tmp)
1.4244 -+{
1.4245 -+ fractype low = 0;
1.4246 -+ fractype high = 0;
1.4247 -+
1.4248 -+ if (isnan (a))
1.4249 -+ {
1.4250 -+ a->sign = a->sign != b->sign;
1.4251 -+ return a;
1.4252 -+ }
1.4253 -+ if (isnan (b))
1.4254 -+ {
1.4255 -+ b->sign = a->sign != b->sign;
1.4256 -+ return b;
1.4257 -+ }
1.4258 -+ if (isinf (a))
1.4259 -+ {
1.4260 -+ if (iszero (b))
1.4261 -+ return nan ();
1.4262 -+ a->sign = a->sign != b->sign;
1.4263 -+ return a;
1.4264 -+ }
1.4265 -+ if (isinf (b))
1.4266 -+ {
1.4267 -+ if (iszero (a))
1.4268 -+ {
1.4269 -+ return nan ();
1.4270 -+ }
1.4271 -+ b->sign = a->sign != b->sign;
1.4272 -+ return b;
1.4273 -+ }
1.4274 -+ if (iszero (a))
1.4275 -+ {
1.4276 -+ a->sign = a->sign != b->sign;
1.4277 -+ return a;
1.4278 -+ }
1.4279 -+ if (iszero (b))
1.4280 -+ {
1.4281 -+ b->sign = a->sign != b->sign;
1.4282 -+ return b;
1.4283 -+ }
1.4284 -+
1.4285 -+ /* Calculate the mantissa by multiplying both numbers to get a
1.4286 -+ twice-as-wide number. */
1.4287 -+ {
1.4288 -+#if defined(NO_DI_MODE) || defined(TFLOAT)
1.4289 -+ {
1.4290 -+ fractype x = a->fraction.ll;
1.4291 -+ fractype ylow = b->fraction.ll;
1.4292 -+ fractype yhigh = 0;
1.4293 -+ int bit;
1.4294 -+
1.4295 -+ /* ??? This does multiplies one bit at a time. Optimize. */
1.4296 -+ for (bit = 0; bit < FRAC_NBITS; bit++)
1.4297 -+ {
1.4298 -+ int carry;
1.4299 -+
1.4300 -+ if (x & 1)
1.4301 -+ {
1.4302 -+ carry = (low += ylow) < ylow;
1.4303 -+ high += yhigh + carry;
1.4304 -+ }
1.4305 -+ yhigh <<= 1;
1.4306 -+ if (ylow & FRACHIGH)
1.4307 -+ {
1.4308 -+ yhigh |= 1;
1.4309 -+ }
1.4310 -+ ylow <<= 1;
1.4311 -+ x >>= 1;
1.4312 -+ }
1.4313 -+ }
1.4314 -+#elif defined(FLOAT)
1.4315 -+ /* Multiplying two USIs to get a UDI, we're safe. */
1.4316 -+ {
1.4317 -+ UDItype answer = (UDItype)a->fraction.ll * (UDItype)b->fraction.ll;
1.4318 -+
1.4319 -+ high = answer >> BITS_PER_SI;
1.4320 -+ low = answer;
1.4321 -+ }
1.4322 -+#else
1.4323 -+ /* fractype is DImode, but we need the result to be twice as wide.
1.4324 -+ Assuming a widening multiply from DImode to TImode is not
1.4325 -+ available, build one by hand. */
1.4326 -+ {
1.4327 -+ USItype nl = a->fraction.ll;
1.4328 -+ USItype nh = a->fraction.ll >> BITS_PER_SI;
1.4329 -+ USItype ml = b->fraction.ll;
1.4330 -+ USItype mh = b->fraction.ll >> BITS_PER_SI;
1.4331 -+ UDItype pp_ll = (UDItype) ml * nl;
1.4332 -+ UDItype pp_hl = (UDItype) mh * nl;
1.4333 -+ UDItype pp_lh = (UDItype) ml * nh;
1.4334 -+ UDItype pp_hh = (UDItype) mh * nh;
1.4335 -+ UDItype res2 = 0;
1.4336 -+ UDItype res0 = 0;
1.4337 -+ UDItype ps_hh__ = pp_hl + pp_lh;
1.4338 -+ if (ps_hh__ < pp_hl)
1.4339 -+ res2 += (UDItype)1 << BITS_PER_SI;
1.4340 -+ pp_hl = (UDItype)(USItype)ps_hh__ << BITS_PER_SI;
1.4341 -+ res0 = pp_ll + pp_hl;
1.4342 -+ if (res0 < pp_ll)
1.4343 -+ res2++;
1.4344 -+ res2 += (ps_hh__ >> BITS_PER_SI) + pp_hh;
1.4345 -+ high = res2;
1.4346 -+ low = res0;
1.4347 -+ }
1.4348 -+#endif
1.4349 -+ }
1.4350 -+
1.4351 -+ tmp->normal_exp = a->normal_exp + b->normal_exp
1.4352 -+ + FRAC_NBITS - (FRACBITS + NGARDS);
1.4353 -+ tmp->sign = a->sign != b->sign;
1.4354 -+ while (high >= IMPLICIT_2)
1.4355 -+ {
1.4356 -+ tmp->normal_exp++;
1.4357 -+ if (high & 1)
1.4358 -+ {
1.4359 -+ low >>= 1;
1.4360 -+ low |= FRACHIGH;
1.4361 -+ }
1.4362 -+ high >>= 1;
1.4363 -+ }
1.4364 -+ while (high < IMPLICIT_1)
1.4365 -+ {
1.4366 -+ tmp->normal_exp--;
1.4367 -+
1.4368 -+ high <<= 1;
1.4369 -+ if (low & FRACHIGH)
1.4370 -+ high |= 1;
1.4371 -+ low <<= 1;
1.4372 -+ }
1.4373 -+ /* rounding is tricky. if we only round if it won't make us round later. */
1.4374 -+#if 0
1.4375 -+ if (low & FRACHIGH2)
1.4376 -+ {
1.4377 -+ if (((high & GARDMASK) != GARDMSB)
1.4378 -+ && (((high + 1) & GARDMASK) == GARDMSB))
1.4379 -+ {
1.4380 -+ /* don't round, it gets done again later. */
1.4381 -+ }
1.4382 -+ else
1.4383 -+ {
1.4384 -+ high++;
1.4385 -+ }
1.4386 -+ }
1.4387 -+#endif
1.4388 -+ if (!ROUND_TOWARDS_ZERO && (high & GARDMASK) == GARDMSB)
1.4389 -+ {
1.4390 -+ if (high & (1 << NGARDS))
1.4391 -+ {
1.4392 -+ /* half way, so round to even */
1.4393 -+ high += GARDROUND + 1;
1.4394 -+ }
1.4395 -+ else if (low)
1.4396 -+ {
1.4397 -+ /* but we really weren't half way */
1.4398 -+ high += GARDROUND + 1;
1.4399 -+ }
1.4400 -+ }
1.4401 -+ tmp->fraction.ll = high;
1.4402 -+ tmp->class = CLASS_NUMBER;
1.4403 -+ return tmp;
1.4404 -+}
1.4405 -+
1.4406 -+FLO_type
1.4407 -+multiply (FLO_type arg_a, FLO_type arg_b)
1.4408 -+{
1.4409 -+ fp_number_type a;
1.4410 -+ fp_number_type b;
1.4411 -+ fp_number_type tmp;
1.4412 -+ fp_number_type *res;
1.4413 -+ FLO_union_type au, bu;
1.4414 -+
1.4415 -+ au.value = arg_a;
1.4416 -+ bu.value = arg_b;
1.4417 -+
1.4418 -+ unpack_d (&au, &a);
1.4419 -+ unpack_d (&bu, &b);
1.4420 -+
1.4421 -+ res = _fpmul_parts (&a, &b, &tmp);
1.4422 -+
1.4423 -+ return pack_d (res);
1.4424 -+}
1.4425 -+#endif /* L_mul_sf || L_mul_df */
1.4426 -+
1.4427 -+#if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf)
1.4428 -+static inline __attribute__ ((__always_inline__)) fp_number_type *
1.4429 -+_fpdiv_parts (fp_number_type * a,
1.4430 -+ fp_number_type * b)
1.4431 -+{
1.4432 -+ fractype bit;
1.4433 -+ fractype numerator;
1.4434 -+ fractype denominator;
1.4435 -+ fractype quotient;
1.4436 -+
1.4437 -+ if (isnan (a))
1.4438 -+ {
1.4439 -+ return a;
1.4440 -+ }
1.4441 -+ if (isnan (b))
1.4442 -+ {
1.4443 -+ return b;
1.4444 -+ }
1.4445 -+
1.4446 -+ a->sign = a->sign ^ b->sign;
1.4447 -+
1.4448 -+ if (isinf (a) || iszero (a))
1.4449 -+ {
1.4450 -+ if (a->class == b->class)
1.4451 -+ return nan ();
1.4452 -+ return a;
1.4453 -+ }
1.4454 -+
1.4455 -+ if (isinf (b))
1.4456 -+ {
1.4457 -+ a->fraction.ll = 0;
1.4458 -+ a->normal_exp = 0;
1.4459 -+ return a;
1.4460 -+ }
1.4461 -+ if (iszero (b))
1.4462 -+ {
1.4463 -+ a->class = CLASS_INFINITY;
1.4464 -+ return a;
1.4465 -+ }
1.4466 -+
1.4467 -+ /* Calculate the mantissa by multiplying both 64bit numbers to get a
1.4468 -+ 128 bit number */
1.4469 -+ {
1.4470 -+ /* quotient =
1.4471 -+ ( numerator / denominator) * 2^(numerator exponent - denominator exponent)
1.4472 -+ */
1.4473 -+
1.4474 -+ a->normal_exp = a->normal_exp - b->normal_exp;
1.4475 -+ numerator = a->fraction.ll;
1.4476 -+ denominator = b->fraction.ll;
1.4477 -+
1.4478 -+ if (numerator < denominator)
1.4479 -+ {
1.4480 -+ /* Fraction will be less than 1.0 */
1.4481 -+ numerator *= 2;
1.4482 -+ a->normal_exp--;
1.4483 -+ }
1.4484 -+ bit = IMPLICIT_1;
1.4485 -+ quotient = 0;
1.4486 -+ /* ??? Does divide one bit at a time. Optimize. */
1.4487 -+ while (bit)
1.4488 -+ {
1.4489 -+ if (numerator >= denominator)
1.4490 -+ {
1.4491 -+ quotient |= bit;
1.4492 -+ numerator -= denominator;
1.4493 -+ }
1.4494 -+ bit >>= 1;
1.4495 -+ numerator *= 2;
1.4496 -+ }
1.4497 -+
1.4498 -+ if (!ROUND_TOWARDS_ZERO && (quotient & GARDMASK) == GARDMSB)
1.4499 -+ {
1.4500 -+ if (quotient & (1 << NGARDS))
1.4501 -+ {
1.4502 -+ /* half way, so round to even */
1.4503 -+ quotient += GARDROUND + 1;
1.4504 -+ }
1.4505 -+ else if (numerator)
1.4506 -+ {
1.4507 -+ /* but we really weren't half way, more bits exist */
1.4508 -+ quotient += GARDROUND + 1;
1.4509 -+ }
1.4510 -+ }
1.4511 -+
1.4512 -+ a->fraction.ll = quotient;
1.4513 -+ return (a);
1.4514 -+ }
1.4515 -+}
1.4516 -+
1.4517 -+FLO_type
1.4518 -+divide (FLO_type arg_a, FLO_type arg_b)
1.4519 -+{
1.4520 -+ fp_number_type a;
1.4521 -+ fp_number_type b;
1.4522 -+ fp_number_type *res;
1.4523 -+ FLO_union_type au, bu;
1.4524 -+
1.4525 -+ au.value = arg_a;
1.4526 -+ bu.value = arg_b;
1.4527 -+
1.4528 -+ unpack_d (&au, &a);
1.4529 -+ unpack_d (&bu, &b);
1.4530 -+
1.4531 -+ res = _fpdiv_parts (&a, &b);
1.4532 -+
1.4533 -+ return pack_d (res);
1.4534 -+}
1.4535 -+#endif /* L_div_sf || L_div_df */
1.4536 -+
1.4537 -+#if defined(L_fpcmp_parts_sf) || defined(L_fpcmp_parts_df) \
1.4538 -+ || defined(L_fpcmp_parts_tf)
1.4539 -+/* according to the demo, fpcmp returns a comparison with 0... thus
1.4540 -+ a<b -> -1
1.4541 -+ a==b -> 0
1.4542 -+ a>b -> +1
1.4543 -+ */
1.4544 -+
1.4545 -+int
1.4546 -+__fpcmp_parts (fp_number_type * a, fp_number_type * b)
1.4547 -+{
1.4548 -+#if 0
1.4549 -+ /* either nan -> unordered. Must be checked outside of this routine. */
1.4550 -+ if (isnan (a) && isnan (b))
1.4551 -+ {
1.4552 -+ return 1; /* still unordered! */
1.4553 -+ }
1.4554 -+#endif
1.4555 -+
1.4556 -+ if (isnan (a) || isnan (b))
1.4557 -+ {
1.4558 -+ return 1; /* how to indicate unordered compare? */
1.4559 -+ }
1.4560 -+ if (isinf (a) && isinf (b))
1.4561 -+ {
1.4562 -+ /* +inf > -inf, but +inf != +inf */
1.4563 -+ /* b \a| +inf(0)| -inf(1)
1.4564 -+ ______\+--------+--------
1.4565 -+ +inf(0)| a==b(0)| a<b(-1)
1.4566 -+ -------+--------+--------
1.4567 -+ -inf(1)| a>b(1) | a==b(0)
1.4568 -+ -------+--------+--------
1.4569 -+ So since unordered must be nonzero, just line up the columns...
1.4570 -+ */
1.4571 -+ return b->sign - a->sign;
1.4572 -+ }
1.4573 -+ /* but not both... */
1.4574 -+ if (isinf (a))
1.4575 -+ {
1.4576 -+ return a->sign ? -1 : 1;
1.4577 -+ }
1.4578 -+ if (isinf (b))
1.4579 -+ {
1.4580 -+ return b->sign ? 1 : -1;
1.4581 -+ }
1.4582 -+ if (iszero (a) && iszero (b))
1.4583 -+ {
1.4584 -+ return 0;
1.4585 -+ }
1.4586 -+ if (iszero (a))
1.4587 -+ {
1.4588 -+ return b->sign ? 1 : -1;
1.4589 -+ }
1.4590 -+ if (iszero (b))
1.4591 -+ {
1.4592 -+ return a->sign ? -1 : 1;
1.4593 -+ }
1.4594 -+ /* now both are "normal". */
1.4595 -+ if (a->sign != b->sign)
1.4596 -+ {
1.4597 -+ /* opposite signs */
1.4598 -+ return a->sign ? -1 : 1;
1.4599 -+ }
1.4600 -+ /* same sign; exponents? */
1.4601 -+ if (a->normal_exp > b->normal_exp)
1.4602 -+ {
1.4603 -+ return a->sign ? -1 : 1;
1.4604 -+ }
1.4605 -+ if (a->normal_exp < b->normal_exp)
1.4606 -+ {
1.4607 -+ return a->sign ? 1 : -1;
1.4608 -+ }
1.4609 -+ /* same exponents; check size. */
1.4610 -+ if (a->fraction.ll > b->fraction.ll)
1.4611 -+ {
1.4612 -+ return a->sign ? -1 : 1;
1.4613 -+ }
1.4614 -+ if (a->fraction.ll < b->fraction.ll)
1.4615 -+ {
1.4616 -+ return a->sign ? 1 : -1;
1.4617 -+ }
1.4618 -+ /* after all that, they're equal. */
1.4619 -+ return 0;
1.4620 -+}
1.4621 -+#endif
1.4622 -+
1.4623 -+#if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compoare_tf)
1.4624 -+CMPtype
1.4625 -+compare (FLO_type arg_a, FLO_type arg_b)
1.4626 -+{
1.4627 -+ fp_number_type a;
1.4628 -+ fp_number_type b;
1.4629 -+ FLO_union_type au, bu;
1.4630 -+
1.4631 -+ au.value = arg_a;
1.4632 -+ bu.value = arg_b;
1.4633 -+
1.4634 -+ unpack_d (&au, &a);
1.4635 -+ unpack_d (&bu, &b);
1.4636 -+
1.4637 -+ return __fpcmp_parts (&a, &b);
1.4638 -+}
1.4639 -+#endif /* L_compare_sf || L_compare_df */
1.4640 -+
1.4641 -+#ifndef US_SOFTWARE_GOFAST
1.4642 -+
1.4643 -+/* These should be optimized for their specific tasks someday. */
1.4644 -+
1.4645 -+#if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf)
1.4646 -+CMPtype
1.4647 -+_eq_f2 (FLO_type arg_a, FLO_type arg_b)
1.4648 -+{
1.4649 -+ fp_number_type a;
1.4650 -+ fp_number_type b;
1.4651 -+ FLO_union_type au, bu;
1.4652 -+
1.4653 -+ au.value = arg_a;
1.4654 -+ bu.value = arg_b;
1.4655 -+
1.4656 -+ unpack_d (&au, &a);
1.4657 -+ unpack_d (&bu, &b);
1.4658 -+
1.4659 -+ if (isnan (&a) || isnan (&b))
1.4660 -+ return 1; /* false, truth == 0 */
1.4661 -+
1.4662 -+ return __fpcmp_parts (&a, &b) ;
1.4663 -+}
1.4664 -+#endif /* L_eq_sf || L_eq_df */
1.4665 -+
1.4666 -+#if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf)
1.4667 -+CMPtype
1.4668 -+_ne_f2 (FLO_type arg_a, FLO_type arg_b)
1.4669 -+{
1.4670 -+ fp_number_type a;
1.4671 -+ fp_number_type b;
1.4672 -+ FLO_union_type au, bu;
1.4673 -+
1.4674 -+ au.value = arg_a;
1.4675 -+ bu.value = arg_b;
1.4676 -+
1.4677 -+ unpack_d (&au, &a);
1.4678 -+ unpack_d (&bu, &b);
1.4679 -+
1.4680 -+ if (isnan (&a) || isnan (&b))
1.4681 -+ return 1; /* true, truth != 0 */
1.4682 -+
1.4683 -+ return __fpcmp_parts (&a, &b) ;
1.4684 -+}
1.4685 -+#endif /* L_ne_sf || L_ne_df */
1.4686 -+
1.4687 -+#if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf)
1.4688 -+CMPtype
1.4689 -+_gt_f2 (FLO_type arg_a, FLO_type arg_b)
1.4690 -+{
1.4691 -+ fp_number_type a;
1.4692 -+ fp_number_type b;
1.4693 -+ FLO_union_type au, bu;
1.4694 -+
1.4695 -+ au.value = arg_a;
1.4696 -+ bu.value = arg_b;
1.4697 -+
1.4698 -+ unpack_d (&au, &a);
1.4699 -+ unpack_d (&bu, &b);
1.4700 -+
1.4701 -+ if (isnan (&a) || isnan (&b))
1.4702 -+ return -1; /* false, truth > 0 */
1.4703 -+
1.4704 -+ return __fpcmp_parts (&a, &b);
1.4705 -+}
1.4706 -+#endif /* L_gt_sf || L_gt_df */
1.4707 -+
1.4708 -+#if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf)
1.4709 -+CMPtype
1.4710 -+_ge_f2 (FLO_type arg_a, FLO_type arg_b)
1.4711 -+{
1.4712 -+ fp_number_type a;
1.4713 -+ fp_number_type b;
1.4714 -+ FLO_union_type au, bu;
1.4715 -+
1.4716 -+ au.value = arg_a;
1.4717 -+ bu.value = arg_b;
1.4718 -+
1.4719 -+ unpack_d (&au, &a);
1.4720 -+ unpack_d (&bu, &b);
1.4721 -+
1.4722 -+ if (isnan (&a) || isnan (&b))
1.4723 -+ return -1; /* false, truth >= 0 */
1.4724 -+ return __fpcmp_parts (&a, &b) ;
1.4725 -+}
1.4726 -+#endif /* L_ge_sf || L_ge_df */
1.4727 -+
1.4728 -+#if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf)
1.4729 -+CMPtype
1.4730 -+_lt_f2 (FLO_type arg_a, FLO_type arg_b)
1.4731 -+{
1.4732 -+ fp_number_type a;
1.4733 -+ fp_number_type b;
1.4734 -+ FLO_union_type au, bu;
1.4735 -+
1.4736 -+ au.value = arg_a;
1.4737 -+ bu.value = arg_b;
1.4738 -+
1.4739 -+ unpack_d (&au, &a);
1.4740 -+ unpack_d (&bu, &b);
1.4741 -+
1.4742 -+ if (isnan (&a) || isnan (&b))
1.4743 -+ return 1; /* false, truth < 0 */
1.4744 -+
1.4745 -+ return __fpcmp_parts (&a, &b);
1.4746 -+}
1.4747 -+#endif /* L_lt_sf || L_lt_df */
1.4748 -+
1.4749 -+#if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf)
1.4750 -+CMPtype
1.4751 -+_le_f2 (FLO_type arg_a, FLO_type arg_b)
1.4752 -+{
1.4753 -+ fp_number_type a;
1.4754 -+ fp_number_type b;
1.4755 -+ FLO_union_type au, bu;
1.4756 -+
1.4757 -+ au.value = arg_a;
1.4758 -+ bu.value = arg_b;
1.4759 -+
1.4760 -+ unpack_d (&au, &a);
1.4761 -+ unpack_d (&bu, &b);
1.4762 -+
1.4763 -+ if (isnan (&a) || isnan (&b))
1.4764 -+ return 1; /* false, truth <= 0 */
1.4765 -+
1.4766 -+ return __fpcmp_parts (&a, &b) ;
1.4767 -+}
1.4768 -+#endif /* L_le_sf || L_le_df */
1.4769 -+
1.4770 -+#endif /* ! US_SOFTWARE_GOFAST */
1.4771 -+
1.4772 -+#if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf)
1.4773 -+CMPtype
1.4774 -+_unord_f2 (FLO_type arg_a, FLO_type arg_b)
1.4775 -+{
1.4776 -+ fp_number_type a;
1.4777 -+ fp_number_type b;
1.4778 -+ FLO_union_type au, bu;
1.4779 -+
1.4780 -+ au.value = arg_a;
1.4781 -+ bu.value = arg_b;
1.4782 -+
1.4783 -+ unpack_d (&au, &a);
1.4784 -+ unpack_d (&bu, &b);
1.4785 -+
1.4786 -+ return (isnan (&a) || isnan (&b));
1.4787 -+}
1.4788 -+#endif /* L_unord_sf || L_unord_df */
1.4789 -+
1.4790 -+#if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf)
1.4791 -+FLO_type
1.4792 -+si_to_float (SItype arg_a)
1.4793 -+{
1.4794 -+ fp_number_type in;
1.4795 -+
1.4796 -+ in.class = CLASS_NUMBER;
1.4797 -+ in.sign = arg_a < 0;
1.4798 -+ if (!arg_a)
1.4799 -+ {
1.4800 -+ in.class = CLASS_ZERO;
1.4801 -+ }
1.4802 -+ else
1.4803 -+ {
1.4804 -+ in.normal_exp = FRACBITS + NGARDS;
1.4805 -+ if (in.sign)
1.4806 -+ {
1.4807 -+ /* Special case for minint, since there is no +ve integer
1.4808 -+ representation for it */
1.4809 -+ if (arg_a == (- MAX_SI_INT - 1))
1.4810 -+ {
1.4811 -+ return (FLO_type)(- MAX_SI_INT - 1);
1.4812 -+ }
1.4813 -+ in.fraction.ll = (-arg_a);
1.4814 -+ }
1.4815 -+ else
1.4816 -+ in.fraction.ll = arg_a;
1.4817 -+
1.4818 -+ while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS)))
1.4819 -+ {
1.4820 -+ in.fraction.ll <<= 1;
1.4821 -+ in.normal_exp -= 1;
1.4822 -+ }
1.4823 -+ }
1.4824 -+ return pack_d (&in);
1.4825 -+}
1.4826 -+#endif /* L_si_to_sf || L_si_to_df */
1.4827 -+
1.4828 -+#if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf)
1.4829 -+FLO_type
1.4830 -+usi_to_float (USItype arg_a)
1.4831 -+{
1.4832 -+ fp_number_type in;
1.4833 -+
1.4834 -+ in.sign = 0;
1.4835 -+ if (!arg_a)
1.4836 -+ {
1.4837 -+ in.class = CLASS_ZERO;
1.4838 -+ }
1.4839 -+ else
1.4840 -+ {
1.4841 -+ in.class = CLASS_NUMBER;
1.4842 -+ in.normal_exp = FRACBITS + NGARDS;
1.4843 -+ in.fraction.ll = arg_a;
1.4844 -+
1.4845 -+ while (in.fraction.ll > ((fractype)1 << (FRACBITS + NGARDS)))
1.4846 -+ {
1.4847 -+ in.fraction.ll >>= 1;
1.4848 -+ in.normal_exp += 1;
1.4849 -+ }
1.4850 -+ while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS)))
1.4851 -+ {
1.4852 -+ in.fraction.ll <<= 1;
1.4853 -+ in.normal_exp -= 1;
1.4854 -+ }
1.4855 -+ }
1.4856 -+ return pack_d (&in);
1.4857 -+}
1.4858 -+#endif
1.4859 -+
1.4860 -+#if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si)
1.4861 -+SItype
1.4862 -+float_to_si (FLO_type arg_a)
1.4863 -+{
1.4864 -+ fp_number_type a;
1.4865 -+ SItype tmp;
1.4866 -+ FLO_union_type au;
1.4867 -+
1.4868 -+ au.value = arg_a;
1.4869 -+ unpack_d (&au, &a);
1.4870 -+
1.4871 -+ if (iszero (&a))
1.4872 -+ return 0;
1.4873 -+ if (isnan (&a))
1.4874 -+ return 0;
1.4875 -+ /* get reasonable MAX_SI_INT... */
1.4876 -+ if (isinf (&a))
1.4877 -+ return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
1.4878 -+ /* it is a number, but a small one */
1.4879 -+ if (a.normal_exp < 0)
1.4880 -+ return 0;
1.4881 -+ if (a.normal_exp > BITS_PER_SI - 2)
1.4882 -+ return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
1.4883 -+ tmp = a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1.4884 -+ return a.sign ? (-tmp) : (tmp);
1.4885 -+}
1.4886 -+#endif /* L_sf_to_si || L_df_to_si */
1.4887 -+
1.4888 -+#if defined(L_sf_to_usi) || defined(L_df_to_usi) || defined(L_tf_to_usi)
1.4889 -+#if defined US_SOFTWARE_GOFAST || defined(L_tf_to_usi)
1.4890 -+/* While libgcc2.c defines its own __fixunssfsi and __fixunsdfsi routines,
1.4891 -+ we also define them for GOFAST because the ones in libgcc2.c have the
1.4892 -+ wrong names and I'd rather define these here and keep GOFAST CYG-LOC's
1.4893 -+ out of libgcc2.c. We can't define these here if not GOFAST because then
1.4894 -+ there'd be duplicate copies. */
1.4895 -+
1.4896 -+USItype
1.4897 -+float_to_usi (FLO_type arg_a)
1.4898 -+{
1.4899 -+ fp_number_type a;
1.4900 -+ FLO_union_type au;
1.4901 -+
1.4902 -+ au.value = arg_a;
1.4903 -+ unpack_d (&au, &a);
1.4904 -+
1.4905 -+ if (iszero (&a))
1.4906 -+ return 0;
1.4907 -+ if (isnan (&a))
1.4908 -+ return 0;
1.4909 -+ /* it is a negative number */
1.4910 -+ if (a.sign)
1.4911 -+ return 0;
1.4912 -+ /* get reasonable MAX_USI_INT... */
1.4913 -+ if (isinf (&a))
1.4914 -+ return MAX_USI_INT;
1.4915 -+ /* it is a number, but a small one */
1.4916 -+ if (a.normal_exp < 0)
1.4917 -+ return 0;
1.4918 -+ if (a.normal_exp > BITS_PER_SI - 1)
1.4919 -+ return MAX_USI_INT;
1.4920 -+ else if (a.normal_exp > (FRACBITS + NGARDS))
1.4921 -+ return a.fraction.ll << (a.normal_exp - (FRACBITS + NGARDS));
1.4922 -+ else
1.4923 -+ return a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1.4924 -+}
1.4925 -+#endif /* US_SOFTWARE_GOFAST */
1.4926 -+#endif /* L_sf_to_usi || L_df_to_usi */
1.4927 -+
1.4928 -+#if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf)
1.4929 -+FLO_type
1.4930 -+negate (FLO_type arg_a)
1.4931 -+{
1.4932 -+ fp_number_type a;
1.4933 -+ FLO_union_type au;
1.4934 -+
1.4935 -+ au.value = arg_a;
1.4936 -+ unpack_d (&au, &a);
1.4937 -+
1.4938 -+ flip_sign (&a);
1.4939 -+ return pack_d (&a);
1.4940 -+}
1.4941 -+#endif /* L_negate_sf || L_negate_df */
1.4942 -+
1.4943 -+#ifdef FLOAT
1.4944 -+
1.4945 -+#if defined(L_make_sf)
1.4946 -+SFtype
1.4947 -+__make_fp(fp_class_type class,
1.4948 -+ unsigned int sign,
1.4949 -+ int exp,
1.4950 -+ USItype frac)
1.4951 -+{
1.4952 -+ fp_number_type in;
1.4953 -+
1.4954 -+ in.class = class;
1.4955 -+ in.sign = sign;
1.4956 -+ in.normal_exp = exp;
1.4957 -+ in.fraction.ll = frac;
1.4958 -+ return pack_d (&in);
1.4959 -+}
1.4960 -+#endif /* L_make_sf */
1.4961 -+
1.4962 -+#ifndef FLOAT_ONLY
1.4963 -+
1.4964 -+/* This enables one to build an fp library that supports float but not double.
1.4965 -+ Otherwise, we would get an undefined reference to __make_dp.
1.4966 -+ This is needed for some 8-bit ports that can't handle well values that
1.4967 -+ are 8-bytes in size, so we just don't support double for them at all. */
1.4968 -+
1.4969 -+#if defined(L_sf_to_df)
1.4970 -+DFtype
1.4971 -+sf_to_df (SFtype arg_a)
1.4972 -+{
1.4973 -+ fp_number_type in;
1.4974 -+ FLO_union_type au;
1.4975 -+
1.4976 -+ au.value = arg_a;
1.4977 -+ unpack_d (&au, &in);
1.4978 -+
1.4979 -+ return __make_dp (in.class, in.sign, in.normal_exp,
1.4980 -+ ((UDItype) in.fraction.ll) << F_D_BITOFF);
1.4981 -+}
1.4982 -+#endif /* L_sf_to_df */
1.4983 -+
1.4984 -+#if defined(L_sf_to_tf) && defined(TMODES)
1.4985 -+TFtype
1.4986 -+sf_to_tf (SFtype arg_a)
1.4987 -+{
1.4988 -+ fp_number_type in;
1.4989 -+ FLO_union_type au;
1.4990 -+
1.4991 -+ au.value = arg_a;
1.4992 -+ unpack_d (&au, &in);
1.4993 -+
1.4994 -+ return __make_tp (in.class, in.sign, in.normal_exp,
1.4995 -+ ((UTItype) in.fraction.ll) << F_T_BITOFF);
1.4996 -+}
1.4997 -+#endif /* L_sf_to_df */
1.4998 -+
1.4999 -+#endif /* ! FLOAT_ONLY */
1.5000 -+#endif /* FLOAT */
1.5001 -+
1.5002 -+#ifndef FLOAT
1.5003 -+
1.5004 -+extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
1.5005 -+
1.5006 -+#if defined(L_make_df)
1.5007 -+DFtype
1.5008 -+__make_dp (fp_class_type class, unsigned int sign, int exp, UDItype frac)
1.5009 -+{
1.5010 -+ fp_number_type in;
1.5011 -+
1.5012 -+ in.class = class;
1.5013 -+ in.sign = sign;
1.5014 -+ in.normal_exp = exp;
1.5015 -+ in.fraction.ll = frac;
1.5016 -+ return pack_d (&in);
1.5017 -+}
1.5018 -+#endif /* L_make_df */
1.5019 -+
1.5020 -+#if defined(L_df_to_sf)
1.5021 -+SFtype
1.5022 -+df_to_sf (DFtype arg_a)
1.5023 -+{
1.5024 -+ fp_number_type in;
1.5025 -+ USItype sffrac;
1.5026 -+ FLO_union_type au;
1.5027 -+
1.5028 -+ au.value = arg_a;
1.5029 -+ unpack_d (&au, &in);
1.5030 -+
1.5031 -+ sffrac = in.fraction.ll >> F_D_BITOFF;
1.5032 -+
1.5033 -+ /* We set the lowest guard bit in SFFRAC if we discarded any non
1.5034 -+ zero bits. */
1.5035 -+ if ((in.fraction.ll & (((USItype) 1 << F_D_BITOFF) - 1)) != 0)
1.5036 -+ sffrac |= 1;
1.5037 -+
1.5038 -+ return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
1.5039 -+}
1.5040 -+#endif /* L_df_to_sf */
1.5041 -+
1.5042 -+#if defined(L_df_to_tf) && defined(TMODES) \
1.5043 -+ && !defined(FLOAT) && !defined(TFLOAT)
1.5044 -+TFtype
1.5045 -+df_to_tf (DFtype arg_a)
1.5046 -+{
1.5047 -+ fp_number_type in;
1.5048 -+ FLO_union_type au;
1.5049 -+
1.5050 -+ au.value = arg_a;
1.5051 -+ unpack_d (&au, &in);
1.5052 -+
1.5053 -+ return __make_tp (in.class, in.sign, in.normal_exp,
1.5054 -+ ((UTItype) in.fraction.ll) << D_T_BITOFF);
1.5055 -+}
1.5056 -+#endif /* L_sf_to_df */
1.5057 -+
1.5058 -+#ifdef TFLOAT
1.5059 -+#if defined(L_make_tf)
1.5060 -+TFtype
1.5061 -+__make_tp(fp_class_type class,
1.5062 -+ unsigned int sign,
1.5063 -+ int exp,
1.5064 -+ UTItype frac)
1.5065 -+{
1.5066 -+ fp_number_type in;
1.5067 -+
1.5068 -+ in.class = class;
1.5069 -+ in.sign = sign;
1.5070 -+ in.normal_exp = exp;
1.5071 -+ in.fraction.ll = frac;
1.5072 -+ return pack_d (&in);
1.5073 -+}
1.5074 -+#endif /* L_make_tf */
1.5075 -+
1.5076 -+#if defined(L_tf_to_df)
1.5077 -+DFtype
1.5078 -+tf_to_df (TFtype arg_a)
1.5079 -+{
1.5080 -+ fp_number_type in;
1.5081 -+ UDItype sffrac;
1.5082 -+ FLO_union_type au;
1.5083 -+
1.5084 -+ au.value = arg_a;
1.5085 -+ unpack_d (&au, &in);
1.5086 -+
1.5087 -+ sffrac = in.fraction.ll >> D_T_BITOFF;
1.5088 -+
1.5089 -+ /* We set the lowest guard bit in SFFRAC if we discarded any non
1.5090 -+ zero bits. */
1.5091 -+ if ((in.fraction.ll & (((UTItype) 1 << D_T_BITOFF) - 1)) != 0)
1.5092 -+ sffrac |= 1;
1.5093 -+
1.5094 -+ return __make_dp (in.class, in.sign, in.normal_exp, sffrac);
1.5095 -+}
1.5096 -+#endif /* L_tf_to_df */
1.5097 -+
1.5098 -+#if defined(L_tf_to_sf)
1.5099 -+SFtype
1.5100 -+tf_to_sf (TFtype arg_a)
1.5101 -+{
1.5102 -+ fp_number_type in;
1.5103 -+ USItype sffrac;
1.5104 -+ FLO_union_type au;
1.5105 -+
1.5106 -+ au.value = arg_a;
1.5107 -+ unpack_d (&au, &in);
1.5108 -+
1.5109 -+ sffrac = in.fraction.ll >> F_T_BITOFF;
1.5110 -+
1.5111 -+ /* We set the lowest guard bit in SFFRAC if we discarded any non
1.5112 -+ zero bits. */
1.5113 -+ if ((in.fraction.ll & (((UTItype) 1 << F_T_BITOFF) - 1)) != 0)
1.5114 -+ sffrac |= 1;
1.5115 -+
1.5116 -+ return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
1.5117 -+}
1.5118 -+#endif /* L_tf_to_sf */
1.5119 -+#endif /* TFLOAT */
1.5120 -+
1.5121 -+#endif /* ! FLOAT */
1.5122 -+#endif /* !EXTENDED_FLOAT_STUBS */
1.5123 -diff -durN gcc-3.4.6.orig/gcc/config/nios2/nios2-fp-bit.c gcc-3.4.6/gcc/config/nios2/nios2-fp-bit.c
1.5124 ---- gcc-3.4.6.orig/gcc/config/nios2/nios2-fp-bit.c 1970-01-01 01:00:00.000000000 +0100
1.5125 -+++ gcc-3.4.6/gcc/config/nios2/nios2-fp-bit.c 2007-08-15 23:09:36.000000000 +0200
1.5126 -@@ -0,0 +1,1652 @@
1.5127 -+#define FLOAT
1.5128 -+/* This is a software floating point library which can be used
1.5129 -+ for targets without hardware floating point.
1.5130 -+ Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004
1.5131 -+ Free Software Foundation, Inc.
1.5132 -+
1.5133 -+This file is free software; you can redistribute it and/or modify it
1.5134 -+under the terms of the GNU General Public License as published by the
1.5135 -+Free Software Foundation; either version 2, or (at your option) any
1.5136 -+later version.
1.5137 -+
1.5138 -+In addition to the permissions in the GNU General Public License, the
1.5139 -+Free Software Foundation gives you unlimited permission to link the
1.5140 -+compiled version of this file with other programs, and to distribute
1.5141 -+those programs without any restriction coming from the use of this
1.5142 -+file. (The General Public License restrictions do apply in other
1.5143 -+respects; for example, they cover modification of the file, and
1.5144 -+distribution when not linked into another program.)
1.5145 -+
1.5146 -+This file is distributed in the hope that it will be useful, but
1.5147 -+WITHOUT ANY WARRANTY; without even the implied warranty of
1.5148 -+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1.5149 -+General Public License for more details.
1.5150 -+
1.5151 -+You should have received a copy of the GNU General Public License
1.5152 -+along with this program; see the file COPYING. If not, write to
1.5153 -+the Free Software Foundation, 59 Temple Place - Suite 330,
1.5154 -+Boston, MA 02111-1307, USA. */
1.5155 -+
1.5156 -+/* As a special exception, if you link this library with other files,
1.5157 -+ some of which are compiled with GCC, to produce an executable,
1.5158 -+ this library does not by itself cause the resulting executable
1.5159 -+ to be covered by the GNU General Public License.
1.5160 -+ This exception does not however invalidate any other reasons why
1.5161 -+ the executable file might be covered by the GNU General Public License. */
1.5162 -+
1.5163 -+/* This implements IEEE 754 format arithmetic, but does not provide a
1.5164 -+ mechanism for setting the rounding mode, or for generating or handling
1.5165 -+ exceptions.
1.5166 -+
1.5167 -+ The original code by Steve Chamberlain, hacked by Mark Eichin and Jim
1.5168 -+ Wilson, all of Cygnus Support. */
1.5169 -+
1.5170 -+/* The intended way to use this file is to make two copies, add `#define FLOAT'
1.5171 -+ to one copy, then compile both copies and add them to libgcc.a. */
1.5172 -+
1.5173 -+#include "tconfig.h"
1.5174 -+#include "coretypes.h"
1.5175 -+#include "tm.h"
1.5176 -+#include "config/fp-bit.h"
1.5177 -+
1.5178 -+/* The following macros can be defined to change the behavior of this file:
1.5179 -+ FLOAT: Implement a `float', aka SFmode, fp library. If this is not
1.5180 -+ defined, then this file implements a `double', aka DFmode, fp library.
1.5181 -+ FLOAT_ONLY: Used with FLOAT, to implement a `float' only library, i.e.
1.5182 -+ don't include float->double conversion which requires the double library.
1.5183 -+ This is useful only for machines which can't support doubles, e.g. some
1.5184 -+ 8-bit processors.
1.5185 -+ CMPtype: Specify the type that floating point compares should return.
1.5186 -+ This defaults to SItype, aka int.
1.5187 -+ US_SOFTWARE_GOFAST: This makes all entry points use the same names as the
1.5188 -+ US Software goFast library.
1.5189 -+ _DEBUG_BITFLOAT: This makes debugging the code a little easier, by adding
1.5190 -+ two integers to the FLO_union_type.
1.5191 -+ NO_DENORMALS: Disable handling of denormals.
1.5192 -+ NO_NANS: Disable nan and infinity handling
1.5193 -+ SMALL_MACHINE: Useful when operations on QIs and HIs are faster
1.5194 -+ than on an SI */
1.5195 -+
1.5196 -+/* We don't currently support extended floats (long doubles) on machines
1.5197 -+ without hardware to deal with them.
1.5198 -+
1.5199 -+ These stubs are just to keep the linker from complaining about unresolved
1.5200 -+ references which can be pulled in from libio & libstdc++, even if the
1.5201 -+ user isn't using long doubles. However, they may generate an unresolved
1.5202 -+ external to abort if abort is not used by the function, and the stubs
1.5203 -+ are referenced from within libc, since libgcc goes before and after the
1.5204 -+ system library. */
1.5205 -+
1.5206 -+#ifdef DECLARE_LIBRARY_RENAMES
1.5207 -+ DECLARE_LIBRARY_RENAMES
1.5208 -+#endif
1.5209 -+
1.5210 -+#ifdef EXTENDED_FLOAT_STUBS
1.5211 -+extern void abort (void);
1.5212 -+void __extendsfxf2 (void) { abort(); }
1.5213 -+void __extenddfxf2 (void) { abort(); }
1.5214 -+void __truncxfdf2 (void) { abort(); }
1.5215 -+void __truncxfsf2 (void) { abort(); }
1.5216 -+void __fixxfsi (void) { abort(); }
1.5217 -+void __floatsixf (void) { abort(); }
1.5218 -+void __addxf3 (void) { abort(); }
1.5219 -+void __subxf3 (void) { abort(); }
1.5220 -+void __mulxf3 (void) { abort(); }
1.5221 -+void __divxf3 (void) { abort(); }
1.5222 -+void __negxf2 (void) { abort(); }
1.5223 -+void __eqxf2 (void) { abort(); }
1.5224 -+void __nexf2 (void) { abort(); }
1.5225 -+void __gtxf2 (void) { abort(); }
1.5226 -+void __gexf2 (void) { abort(); }
1.5227 -+void __lexf2 (void) { abort(); }
1.5228 -+void __ltxf2 (void) { abort(); }
1.5229 -+
1.5230 -+void __extendsftf2 (void) { abort(); }
1.5231 -+void __extenddftf2 (void) { abort(); }
1.5232 -+void __trunctfdf2 (void) { abort(); }
1.5233 -+void __trunctfsf2 (void) { abort(); }
1.5234 -+void __fixtfsi (void) { abort(); }
1.5235 -+void __floatsitf (void) { abort(); }
1.5236 -+void __addtf3 (void) { abort(); }
1.5237 -+void __subtf3 (void) { abort(); }
1.5238 -+void __multf3 (void) { abort(); }
1.5239 -+void __divtf3 (void) { abort(); }
1.5240 -+void __negtf2 (void) { abort(); }
1.5241 -+void __eqtf2 (void) { abort(); }
1.5242 -+void __netf2 (void) { abort(); }
1.5243 -+void __gttf2 (void) { abort(); }
1.5244 -+void __getf2 (void) { abort(); }
1.5245 -+void __letf2 (void) { abort(); }
1.5246 -+void __lttf2 (void) { abort(); }
1.5247 -+#else /* !EXTENDED_FLOAT_STUBS, rest of file */
1.5248 -+
1.5249 -+/* IEEE "special" number predicates */
1.5250 -+
1.5251 -+#ifdef NO_NANS
1.5252 -+
1.5253 -+#define nan() 0
1.5254 -+#define isnan(x) 0
1.5255 -+#define isinf(x) 0
1.5256 -+#else
1.5257 -+
1.5258 -+#if defined L_thenan_sf
1.5259 -+const fp_number_type __thenan_sf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
1.5260 -+#elif defined L_thenan_df
1.5261 -+const fp_number_type __thenan_df = { CLASS_SNAN, 0, 0, {(fractype) 0} };
1.5262 -+#elif defined L_thenan_tf
1.5263 -+const fp_number_type __thenan_tf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
1.5264 -+#elif defined TFLOAT
1.5265 -+extern const fp_number_type __thenan_tf;
1.5266 -+#elif defined FLOAT
1.5267 -+extern const fp_number_type __thenan_sf;
1.5268 -+#else
1.5269 -+extern const fp_number_type __thenan_df;
1.5270 -+#endif
1.5271 -+
1.5272 -+INLINE
1.5273 -+static fp_number_type *
1.5274 -+nan (void)
1.5275 -+{
1.5276 -+ /* Discard the const qualifier... */
1.5277 -+#ifdef TFLOAT
1.5278 -+ return (fp_number_type *) (& __thenan_tf);
1.5279 -+#elif defined FLOAT
1.5280 -+ return (fp_number_type *) (& __thenan_sf);
1.5281 -+#else
1.5282 -+ return (fp_number_type *) (& __thenan_df);
1.5283 -+#endif
1.5284 -+}
1.5285 -+
1.5286 -+INLINE
1.5287 -+static int
1.5288 -+isnan ( fp_number_type * x)
1.5289 -+{
1.5290 -+ return x->class == CLASS_SNAN || x->class == CLASS_QNAN;
1.5291 -+}
1.5292 -+
1.5293 -+INLINE
1.5294 -+static int
1.5295 -+isinf ( fp_number_type * x)
1.5296 -+{
1.5297 -+ return x->class == CLASS_INFINITY;
1.5298 -+}
1.5299 -+
1.5300 -+#endif /* NO_NANS */
1.5301 -+
1.5302 -+INLINE
1.5303 -+static int
1.5304 -+iszero ( fp_number_type * x)
1.5305 -+{
1.5306 -+ return x->class == CLASS_ZERO;
1.5307 -+}
1.5308 -+
1.5309 -+INLINE
1.5310 -+static void
1.5311 -+flip_sign ( fp_number_type * x)
1.5312 -+{
1.5313 -+ x->sign = !x->sign;
1.5314 -+}
1.5315 -+
1.5316 -+extern FLO_type pack_d ( fp_number_type * );
1.5317 -+
1.5318 -+#if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf)
1.5319 -+FLO_type
1.5320 -+pack_d ( fp_number_type * src)
1.5321 -+{
1.5322 -+ FLO_union_type dst;
1.5323 -+ fractype fraction = src->fraction.ll; /* wasn't unsigned before? */
1.5324 -+ int sign = src->sign;
1.5325 -+ int exp = 0;
1.5326 -+
1.5327 -+ if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && (isnan (src) || isinf (src)))
1.5328 -+ {
1.5329 -+ /* We can't represent these values accurately. By using the
1.5330 -+ largest possible magnitude, we guarantee that the conversion
1.5331 -+ of infinity is at least as big as any finite number. */
1.5332 -+ exp = EXPMAX;
1.5333 -+ fraction = ((fractype) 1 << FRACBITS) - 1;
1.5334 -+ }
1.5335 -+ else if (isnan (src))
1.5336 -+ {
1.5337 -+ exp = EXPMAX;
1.5338 -+ if (src->class == CLASS_QNAN || 1)
1.5339 -+ {
1.5340 -+#ifdef QUIET_NAN_NEGATED
1.5341 -+ fraction |= QUIET_NAN - 1;
1.5342 -+#else
1.5343 -+ fraction |= QUIET_NAN;
1.5344 -+#endif
1.5345 -+ }
1.5346 -+ }
1.5347 -+ else if (isinf (src))
1.5348 -+ {
1.5349 -+ exp = EXPMAX;
1.5350 -+ fraction = 0;
1.5351 -+ }
1.5352 -+ else if (iszero (src))
1.5353 -+ {
1.5354 -+ exp = 0;
1.5355 -+ fraction = 0;
1.5356 -+ }
1.5357 -+ else if (fraction == 0)
1.5358 -+ {
1.5359 -+ exp = 0;
1.5360 -+ }
1.5361 -+ else
1.5362 -+ {
1.5363 -+ if (src->normal_exp < NORMAL_EXPMIN)
1.5364 -+ {
1.5365 -+#ifdef NO_DENORMALS
1.5366 -+ /* Go straight to a zero representation if denormals are not
1.5367 -+ supported. The denormal handling would be harmless but
1.5368 -+ isn't unnecessary. */
1.5369 -+ exp = 0;
1.5370 -+ fraction = 0;
1.5371 -+#else /* NO_DENORMALS */
1.5372 -+ /* This number's exponent is too low to fit into the bits
1.5373 -+ available in the number, so we'll store 0 in the exponent and
1.5374 -+ shift the fraction to the right to make up for it. */
1.5375 -+
1.5376 -+ int shift = NORMAL_EXPMIN - src->normal_exp;
1.5377 -+
1.5378 -+ exp = 0;
1.5379 -+
1.5380 -+ if (shift > FRAC_NBITS - NGARDS)
1.5381 -+ {
1.5382 -+ /* No point shifting, since it's more that 64 out. */
1.5383 -+ fraction = 0;
1.5384 -+ }
1.5385 -+ else
1.5386 -+ {
1.5387 -+ int lowbit = (fraction & (((fractype)1 << shift) - 1)) ? 1 : 0;
1.5388 -+ fraction = (fraction >> shift) | lowbit;
1.5389 -+ }
1.5390 -+ if ((fraction & GARDMASK) == GARDMSB)
1.5391 -+ {
1.5392 -+ if ((fraction & (1 << NGARDS)))
1.5393 -+ fraction += GARDROUND + 1;
1.5394 -+ }
1.5395 -+ else
1.5396 -+ {
1.5397 -+ /* Add to the guards to round up. */
1.5398 -+ fraction += GARDROUND;
1.5399 -+ }
1.5400 -+ /* Perhaps the rounding means we now need to change the
1.5401 -+ exponent, because the fraction is no longer denormal. */
1.5402 -+ if (fraction >= IMPLICIT_1)
1.5403 -+ {
1.5404 -+ exp += 1;
1.5405 -+ }
1.5406 -+ fraction >>= NGARDS;
1.5407 -+#endif /* NO_DENORMALS */
1.5408 -+ }
1.5409 -+ else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS)
1.5410 -+ && src->normal_exp > EXPBIAS)
1.5411 -+ {
1.5412 -+ exp = EXPMAX;
1.5413 -+ fraction = 0;
1.5414 -+ }
1.5415 -+ else
1.5416 -+ {
1.5417 -+ exp = src->normal_exp + EXPBIAS;
1.5418 -+ if (!ROUND_TOWARDS_ZERO)
1.5419 -+ {
1.5420 -+ /* IF the gard bits are the all zero, but the first, then we're
1.5421 -+ half way between two numbers, choose the one which makes the
1.5422 -+ lsb of the answer 0. */
1.5423 -+ if ((fraction & GARDMASK) == GARDMSB)
1.5424 -+ {
1.5425 -+ if (fraction & (1 << NGARDS))
1.5426 -+ fraction += GARDROUND + 1;
1.5427 -+ }
1.5428 -+ else
1.5429 -+ {
1.5430 -+ /* Add a one to the guards to round up */
1.5431 -+ fraction += GARDROUND;
1.5432 -+ }
1.5433 -+ if (fraction >= IMPLICIT_2)
1.5434 -+ {
1.5435 -+ fraction >>= 1;
1.5436 -+ exp += 1;
1.5437 -+ }
1.5438 -+ }
1.5439 -+ fraction >>= NGARDS;
1.5440 -+
1.5441 -+ if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && exp > EXPMAX)
1.5442 -+ {
1.5443 -+ /* Saturate on overflow. */
1.5444 -+ exp = EXPMAX;
1.5445 -+ fraction = ((fractype) 1 << FRACBITS) - 1;
1.5446 -+ }
1.5447 -+ }
1.5448 -+ }
1.5449 -+
1.5450 -+ /* We previously used bitfields to store the number, but this doesn't
1.5451 -+ handle little/big endian systems conveniently, so use shifts and
1.5452 -+ masks */
1.5453 -+#ifdef FLOAT_BIT_ORDER_MISMATCH
1.5454 -+ dst.bits.fraction = fraction;
1.5455 -+ dst.bits.exp = exp;
1.5456 -+ dst.bits.sign = sign;
1.5457 -+#else
1.5458 -+# if defined TFLOAT && defined HALFFRACBITS
1.5459 -+ {
1.5460 -+ halffractype high, low, unity;
1.5461 -+ int lowsign, lowexp;
1.5462 -+
1.5463 -+ unity = (halffractype) 1 << HALFFRACBITS;
1.5464 -+
1.5465 -+ /* Set HIGH to the high double's significand, masking out the implicit 1.
1.5466 -+ Set LOW to the low double's full significand. */
1.5467 -+ high = (fraction >> (FRACBITS - HALFFRACBITS)) & (unity - 1);
1.5468 -+ low = fraction & (unity * 2 - 1);
1.5469 -+
1.5470 -+ /* Get the initial sign and exponent of the low double. */
1.5471 -+ lowexp = exp - HALFFRACBITS - 1;
1.5472 -+ lowsign = sign;
1.5473 -+
1.5474 -+ /* HIGH should be rounded like a normal double, making |LOW| <=
1.5475 -+ 0.5 ULP of HIGH. Assume round-to-nearest. */
1.5476 -+ if (exp < EXPMAX)
1.5477 -+ if (low > unity || (low == unity && (high & 1) == 1))
1.5478 -+ {
1.5479 -+ /* Round HIGH up and adjust LOW to match. */
1.5480 -+ high++;
1.5481 -+ if (high == unity)
1.5482 -+ {
1.5483 -+ /* May make it infinite, but that's OK. */
1.5484 -+ high = 0;
1.5485 -+ exp++;
1.5486 -+ }
1.5487 -+ low = unity * 2 - low;
1.5488 -+ lowsign ^= 1;
1.5489 -+ }
1.5490 -+
1.5491 -+ high |= (halffractype) exp << HALFFRACBITS;
1.5492 -+ high |= (halffractype) sign << (HALFFRACBITS + EXPBITS);
1.5493 -+
1.5494 -+ if (exp == EXPMAX || exp == 0 || low == 0)
1.5495 -+ low = 0;
1.5496 -+ else
1.5497 -+ {
1.5498 -+ while (lowexp > 0 && low < unity)
1.5499 -+ {
1.5500 -+ low <<= 1;
1.5501 -+ lowexp--;
1.5502 -+ }
1.5503 -+
1.5504 -+ if (lowexp <= 0)
1.5505 -+ {
1.5506 -+ halffractype roundmsb, round;
1.5507 -+ int shift;
1.5508 -+
1.5509 -+ shift = 1 - lowexp;
1.5510 -+ roundmsb = (1 << (shift - 1));
1.5511 -+ round = low & ((roundmsb << 1) - 1);
1.5512 -+
1.5513 -+ low >>= shift;
1.5514 -+ lowexp = 0;
1.5515 -+
1.5516 -+ if (round > roundmsb || (round == roundmsb && (low & 1) == 1))
1.5517 -+ {
1.5518 -+ low++;
1.5519 -+ if (low == unity)
1.5520 -+ /* LOW rounds up to the smallest normal number. */
1.5521 -+ lowexp++;
1.5522 -+ }
1.5523 -+ }
1.5524 -+
1.5525 -+ low &= unity - 1;
1.5526 -+ low |= (halffractype) lowexp << HALFFRACBITS;
1.5527 -+ low |= (halffractype) lowsign << (HALFFRACBITS + EXPBITS);
1.5528 -+ }
1.5529 -+ dst.value_raw = ((fractype) high << HALFSHIFT) | low;
1.5530 -+ }
1.5531 -+# else
1.5532 -+ dst.value_raw = fraction & ((((fractype)1) << FRACBITS) - (fractype)1);
1.5533 -+ dst.value_raw |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << FRACBITS;
1.5534 -+ dst.value_raw |= ((fractype) (sign & 1)) << (FRACBITS | EXPBITS);
1.5535 -+# endif
1.5536 -+#endif
1.5537 -+
1.5538 -+#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
1.5539 -+#ifdef TFLOAT
1.5540 -+ {
1.5541 -+ qrtrfractype tmp1 = dst.words[0];
1.5542 -+ qrtrfractype tmp2 = dst.words[1];
1.5543 -+ dst.words[0] = dst.words[3];
1.5544 -+ dst.words[1] = dst.words[2];
1.5545 -+ dst.words[2] = tmp2;
1.5546 -+ dst.words[3] = tmp1;
1.5547 -+ }
1.5548 -+#else
1.5549 -+ {
1.5550 -+ halffractype tmp = dst.words[0];
1.5551 -+ dst.words[0] = dst.words[1];
1.5552 -+ dst.words[1] = tmp;
1.5553 -+ }
1.5554 -+#endif
1.5555 -+#endif
1.5556 -+
1.5557 -+ return dst.value;
1.5558 -+}
1.5559 -+#endif
1.5560 -+
1.5561 -+#if defined(L_unpack_df) || defined(L_unpack_sf) || defined(L_unpack_tf)
1.5562 -+void
1.5563 -+unpack_d (FLO_union_type * src, fp_number_type * dst)
1.5564 -+{
1.5565 -+ /* We previously used bitfields to store the number, but this doesn't
1.5566 -+ handle little/big endian systems conveniently, so use shifts and
1.5567 -+ masks */
1.5568 -+ fractype fraction;
1.5569 -+ int exp;
1.5570 -+ int sign;
1.5571 -+
1.5572 -+#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
1.5573 -+ FLO_union_type swapped;
1.5574 -+
1.5575 -+#ifdef TFLOAT
1.5576 -+ swapped.words[0] = src->words[3];
1.5577 -+ swapped.words[1] = src->words[2];
1.5578 -+ swapped.words[2] = src->words[1];
1.5579 -+ swapped.words[3] = src->words[0];
1.5580 -+#else
1.5581 -+ swapped.words[0] = src->words[1];
1.5582 -+ swapped.words[1] = src->words[0];
1.5583 -+#endif
1.5584 -+ src = &swapped;
1.5585 -+#endif
1.5586 -+
1.5587 -+#ifdef FLOAT_BIT_ORDER_MISMATCH
1.5588 -+ fraction = src->bits.fraction;
1.5589 -+ exp = src->bits.exp;
1.5590 -+ sign = src->bits.sign;
1.5591 -+#else
1.5592 -+# if defined TFLOAT && defined HALFFRACBITS
1.5593 -+ {
1.5594 -+ halffractype high, low;
1.5595 -+
1.5596 -+ high = src->value_raw >> HALFSHIFT;
1.5597 -+ low = src->value_raw & (((fractype)1 << HALFSHIFT) - 1);
1.5598 -+
1.5599 -+ fraction = high & ((((fractype)1) << HALFFRACBITS) - 1);
1.5600 -+ fraction <<= FRACBITS - HALFFRACBITS;
1.5601 -+ exp = ((int)(high >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
1.5602 -+ sign = ((int)(high >> (((HALFFRACBITS + EXPBITS))))) & 1;
1.5603 -+
1.5604 -+ if (exp != EXPMAX && exp != 0 && low != 0)
1.5605 -+ {
1.5606 -+ int lowexp = ((int)(low >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
1.5607 -+ int lowsign = ((int)(low >> (((HALFFRACBITS + EXPBITS))))) & 1;
1.5608 -+ int shift;
1.5609 -+ fractype xlow;
1.5610 -+
1.5611 -+ xlow = low & ((((fractype)1) << HALFFRACBITS) - 1);
1.5612 -+ if (lowexp)
1.5613 -+ xlow |= (((halffractype)1) << HALFFRACBITS);
1.5614 -+ else
1.5615 -+ lowexp = 1;
1.5616 -+ shift = (FRACBITS - HALFFRACBITS) - (exp - lowexp);
1.5617 -+ if (shift > 0)
1.5618 -+ xlow <<= shift;
1.5619 -+ else if (shift < 0)
1.5620 -+ xlow >>= -shift;
1.5621 -+ if (sign == lowsign)
1.5622 -+ fraction += xlow;
1.5623 -+ else if (fraction >= xlow)
1.5624 -+ fraction -= xlow;
1.5625 -+ else
1.5626 -+ {
1.5627 -+ /* The high part is a power of two but the full number is lower.
1.5628 -+ This code will leave the implicit 1 in FRACTION, but we'd
1.5629 -+ have added that below anyway. */
1.5630 -+ fraction = (((fractype) 1 << FRACBITS) - xlow) << 1;
1.5631 -+ exp--;
1.5632 -+ }
1.5633 -+ }
1.5634 -+ }
1.5635 -+# else
1.5636 -+ fraction = src->value_raw & ((((fractype)1) << FRACBITS) - 1);
1.5637 -+ exp = ((int)(src->value_raw >> FRACBITS)) & ((1 << EXPBITS) - 1);
1.5638 -+ sign = ((int)(src->value_raw >> (FRACBITS + EXPBITS))) & 1;
1.5639 -+# endif
1.5640 -+#endif
1.5641 -+
1.5642 -+ dst->sign = sign;
1.5643 -+ if (exp == 0)
1.5644 -+ {
1.5645 -+ /* Hmm. Looks like 0 */
1.5646 -+ if (fraction == 0
1.5647 -+#ifdef NO_DENORMALS
1.5648 -+ || 1
1.5649 -+#endif
1.5650 -+ )
1.5651 -+ {
1.5652 -+ /* tastes like zero */
1.5653 -+ dst->class = CLASS_ZERO;
1.5654 -+ }
1.5655 -+ else
1.5656 -+ {
1.5657 -+ /* Zero exponent with nonzero fraction - it's denormalized,
1.5658 -+ so there isn't a leading implicit one - we'll shift it so
1.5659 -+ it gets one. */
1.5660 -+ dst->normal_exp = exp - EXPBIAS + 1;
1.5661 -+ fraction <<= NGARDS;
1.5662 -+
1.5663 -+ dst->class = CLASS_NUMBER;
1.5664 -+#if 1
1.5665 -+ while (fraction < IMPLICIT_1)
1.5666 -+ {
1.5667 -+ fraction <<= 1;
1.5668 -+ dst->normal_exp--;
1.5669 -+ }
1.5670 -+#endif
1.5671 -+ dst->fraction.ll = fraction;
1.5672 -+ }
1.5673 -+ }
1.5674 -+ else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && exp == EXPMAX)
1.5675 -+ {
1.5676 -+ /* Huge exponent*/
1.5677 -+ if (fraction == 0)
1.5678 -+ {
1.5679 -+ /* Attached to a zero fraction - means infinity */
1.5680 -+ dst->class = CLASS_INFINITY;
1.5681 -+ }
1.5682 -+ else
1.5683 -+ {
1.5684 -+ /* Nonzero fraction, means nan */
1.5685 -+#ifdef QUIET_NAN_NEGATED
1.5686 -+ if ((fraction & QUIET_NAN) == 0)
1.5687 -+#else
1.5688 -+ if (fraction & QUIET_NAN)
1.5689 -+#endif
1.5690 -+ {
1.5691 -+ dst->class = CLASS_QNAN;
1.5692 -+ }
1.5693 -+ else
1.5694 -+ {
1.5695 -+ dst->class = CLASS_SNAN;
1.5696 -+ }
1.5697 -+ /* Keep the fraction part as the nan number */
1.5698 -+ dst->fraction.ll = fraction;
1.5699 -+ }
1.5700 -+ }
1.5701 -+ else
1.5702 -+ {
1.5703 -+ /* Nothing strange about this number */
1.5704 -+ dst->normal_exp = exp - EXPBIAS;
1.5705 -+ dst->class = CLASS_NUMBER;
1.5706 -+ dst->fraction.ll = (fraction << NGARDS) | IMPLICIT_1;
1.5707 -+ }
1.5708 -+}
1.5709 -+#endif /* L_unpack_df || L_unpack_sf */
1.5710 -+
1.5711 -+#if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf)
1.5712 -+static fp_number_type *
1.5713 -+_fpadd_parts (fp_number_type * a,
1.5714 -+ fp_number_type * b,
1.5715 -+ fp_number_type * tmp)
1.5716 -+{
1.5717 -+ intfrac tfraction;
1.5718 -+
1.5719 -+ /* Put commonly used fields in local variables. */
1.5720 -+ int a_normal_exp;
1.5721 -+ int b_normal_exp;
1.5722 -+ fractype a_fraction;
1.5723 -+ fractype b_fraction;
1.5724 -+
1.5725 -+ if (isnan (a))
1.5726 -+ {
1.5727 -+ return a;
1.5728 -+ }
1.5729 -+ if (isnan (b))
1.5730 -+ {
1.5731 -+ return b;
1.5732 -+ }
1.5733 -+ if (isinf (a))
1.5734 -+ {
1.5735 -+ /* Adding infinities with opposite signs yields a NaN. */
1.5736 -+ if (isinf (b) && a->sign != b->sign)
1.5737 -+ return nan ();
1.5738 -+ return a;
1.5739 -+ }
1.5740 -+ if (isinf (b))
1.5741 -+ {
1.5742 -+ return b;
1.5743 -+ }
1.5744 -+ if (iszero (b))
1.5745 -+ {
1.5746 -+ if (iszero (a))
1.5747 -+ {
1.5748 -+ *tmp = *a;
1.5749 -+ tmp->sign = a->sign & b->sign;
1.5750 -+ return tmp;
1.5751 -+ }
1.5752 -+ return a;
1.5753 -+ }
1.5754 -+ if (iszero (a))
1.5755 -+ {
1.5756 -+ return b;
1.5757 -+ }
1.5758 -+
1.5759 -+ /* Got two numbers. shift the smaller and increment the exponent till
1.5760 -+ they're the same */
1.5761 -+ {
1.5762 -+ int diff;
1.5763 -+
1.5764 -+ a_normal_exp = a->normal_exp;
1.5765 -+ b_normal_exp = b->normal_exp;
1.5766 -+ a_fraction = a->fraction.ll;
1.5767 -+ b_fraction = b->fraction.ll;
1.5768 -+
1.5769 -+ diff = a_normal_exp - b_normal_exp;
1.5770 -+
1.5771 -+ if (diff < 0)
1.5772 -+ diff = -diff;
1.5773 -+ if (diff < FRAC_NBITS)
1.5774 -+ {
1.5775 -+ /* ??? This does shifts one bit at a time. Optimize. */
1.5776 -+ while (a_normal_exp > b_normal_exp)
1.5777 -+ {
1.5778 -+ b_normal_exp++;
1.5779 -+ LSHIFT (b_fraction);
1.5780 -+ }
1.5781 -+ while (b_normal_exp > a_normal_exp)
1.5782 -+ {
1.5783 -+ a_normal_exp++;
1.5784 -+ LSHIFT (a_fraction);
1.5785 -+ }
1.5786 -+ }
1.5787 -+ else
1.5788 -+ {
1.5789 -+ /* Somethings's up.. choose the biggest */
1.5790 -+ if (a_normal_exp > b_normal_exp)
1.5791 -+ {
1.5792 -+ b_normal_exp = a_normal_exp;
1.5793 -+ b_fraction = 0;
1.5794 -+ }
1.5795 -+ else
1.5796 -+ {
1.5797 -+ a_normal_exp = b_normal_exp;
1.5798 -+ a_fraction = 0;
1.5799 -+ }
1.5800 -+ }
1.5801 -+ }
1.5802 -+
1.5803 -+ if (a->sign != b->sign)
1.5804 -+ {
1.5805 -+ if (a->sign)
1.5806 -+ {
1.5807 -+ tfraction = -a_fraction + b_fraction;
1.5808 -+ }
1.5809 -+ else
1.5810 -+ {
1.5811 -+ tfraction = a_fraction - b_fraction;
1.5812 -+ }
1.5813 -+ if (tfraction >= 0)
1.5814 -+ {
1.5815 -+ tmp->sign = 0;
1.5816 -+ tmp->normal_exp = a_normal_exp;
1.5817 -+ tmp->fraction.ll = tfraction;
1.5818 -+ }
1.5819 -+ else
1.5820 -+ {
1.5821 -+ tmp->sign = 1;
1.5822 -+ tmp->normal_exp = a_normal_exp;
1.5823 -+ tmp->fraction.ll = -tfraction;
1.5824 -+ }
1.5825 -+ /* and renormalize it */
1.5826 -+
1.5827 -+ while (tmp->fraction.ll < IMPLICIT_1 && tmp->fraction.ll)
1.5828 -+ {
1.5829 -+ tmp->fraction.ll <<= 1;
1.5830 -+ tmp->normal_exp--;
1.5831 -+ }
1.5832 -+ }
1.5833 -+ else
1.5834 -+ {
1.5835 -+ tmp->sign = a->sign;
1.5836 -+ tmp->normal_exp = a_normal_exp;
1.5837 -+ tmp->fraction.ll = a_fraction + b_fraction;
1.5838 -+ }
1.5839 -+ tmp->class = CLASS_NUMBER;
1.5840 -+ /* Now the fraction is added, we have to shift down to renormalize the
1.5841 -+ number */
1.5842 -+
1.5843 -+ if (tmp->fraction.ll >= IMPLICIT_2)
1.5844 -+ {
1.5845 -+ LSHIFT (tmp->fraction.ll);
1.5846 -+ tmp->normal_exp++;
1.5847 -+ }
1.5848 -+ return tmp;
1.5849 -+
1.5850 -+}
1.5851 -+
1.5852 -+FLO_type
1.5853 -+add (FLO_type arg_a, FLO_type arg_b)
1.5854 -+{
1.5855 -+ fp_number_type a;
1.5856 -+ fp_number_type b;
1.5857 -+ fp_number_type tmp;
1.5858 -+ fp_number_type *res;
1.5859 -+ FLO_union_type au, bu;
1.5860 -+
1.5861 -+ au.value = arg_a;
1.5862 -+ bu.value = arg_b;
1.5863 -+
1.5864 -+ unpack_d (&au, &a);
1.5865 -+ unpack_d (&bu, &b);
1.5866 -+
1.5867 -+ res = _fpadd_parts (&a, &b, &tmp);
1.5868 -+
1.5869 -+ return pack_d (res);
1.5870 -+}
1.5871 -+
1.5872 -+FLO_type
1.5873 -+sub (FLO_type arg_a, FLO_type arg_b)
1.5874 -+{
1.5875 -+ fp_number_type a;
1.5876 -+ fp_number_type b;
1.5877 -+ fp_number_type tmp;
1.5878 -+ fp_number_type *res;
1.5879 -+ FLO_union_type au, bu;
1.5880 -+
1.5881 -+ au.value = arg_a;
1.5882 -+ bu.value = arg_b;
1.5883 -+
1.5884 -+ unpack_d (&au, &a);
1.5885 -+ unpack_d (&bu, &b);
1.5886 -+
1.5887 -+ b.sign ^= 1;
1.5888 -+
1.5889 -+ res = _fpadd_parts (&a, &b, &tmp);
1.5890 -+
1.5891 -+ return pack_d (res);
1.5892 -+}
1.5893 -+#endif /* L_addsub_sf || L_addsub_df */
1.5894 -+
1.5895 -+#if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf)
1.5896 -+static inline __attribute__ ((__always_inline__)) fp_number_type *
1.5897 -+_fpmul_parts ( fp_number_type * a,
1.5898 -+ fp_number_type * b,
1.5899 -+ fp_number_type * tmp)
1.5900 -+{
1.5901 -+ fractype low = 0;
1.5902 -+ fractype high = 0;
1.5903 -+
1.5904 -+ if (isnan (a))
1.5905 -+ {
1.5906 -+ a->sign = a->sign != b->sign;
1.5907 -+ return a;
1.5908 -+ }
1.5909 -+ if (isnan (b))
1.5910 -+ {
1.5911 -+ b->sign = a->sign != b->sign;
1.5912 -+ return b;
1.5913 -+ }
1.5914 -+ if (isinf (a))
1.5915 -+ {
1.5916 -+ if (iszero (b))
1.5917 -+ return nan ();
1.5918 -+ a->sign = a->sign != b->sign;
1.5919 -+ return a;
1.5920 -+ }
1.5921 -+ if (isinf (b))
1.5922 -+ {
1.5923 -+ if (iszero (a))
1.5924 -+ {
1.5925 -+ return nan ();
1.5926 -+ }
1.5927 -+ b->sign = a->sign != b->sign;
1.5928 -+ return b;
1.5929 -+ }
1.5930 -+ if (iszero (a))
1.5931 -+ {
1.5932 -+ a->sign = a->sign != b->sign;
1.5933 -+ return a;
1.5934 -+ }
1.5935 -+ if (iszero (b))
1.5936 -+ {
1.5937 -+ b->sign = a->sign != b->sign;
1.5938 -+ return b;
1.5939 -+ }
1.5940 -+
1.5941 -+ /* Calculate the mantissa by multiplying both numbers to get a
1.5942 -+ twice-as-wide number. */
1.5943 -+ {
1.5944 -+#if defined(NO_DI_MODE) || defined(TFLOAT)
1.5945 -+ {
1.5946 -+ fractype x = a->fraction.ll;
1.5947 -+ fractype ylow = b->fraction.ll;
1.5948 -+ fractype yhigh = 0;
1.5949 -+ int bit;
1.5950 -+
1.5951 -+ /* ??? This does multiplies one bit at a time. Optimize. */
1.5952 -+ for (bit = 0; bit < FRAC_NBITS; bit++)
1.5953 -+ {
1.5954 -+ int carry;
1.5955 -+
1.5956 -+ if (x & 1)
1.5957 -+ {
1.5958 -+ carry = (low += ylow) < ylow;
1.5959 -+ high += yhigh + carry;
1.5960 -+ }
1.5961 -+ yhigh <<= 1;
1.5962 -+ if (ylow & FRACHIGH)
1.5963 -+ {
1.5964 -+ yhigh |= 1;
1.5965 -+ }
1.5966 -+ ylow <<= 1;
1.5967 -+ x >>= 1;
1.5968 -+ }
1.5969 -+ }
1.5970 -+#elif defined(FLOAT)
1.5971 -+ /* Multiplying two USIs to get a UDI, we're safe. */
1.5972 -+ {
1.5973 -+ UDItype answer = (UDItype)a->fraction.ll * (UDItype)b->fraction.ll;
1.5974 -+
1.5975 -+ high = answer >> BITS_PER_SI;
1.5976 -+ low = answer;
1.5977 -+ }
1.5978 -+#else
1.5979 -+ /* fractype is DImode, but we need the result to be twice as wide.
1.5980 -+ Assuming a widening multiply from DImode to TImode is not
1.5981 -+ available, build one by hand. */
1.5982 -+ {
1.5983 -+ USItype nl = a->fraction.ll;
1.5984 -+ USItype nh = a->fraction.ll >> BITS_PER_SI;
1.5985 -+ USItype ml = b->fraction.ll;
1.5986 -+ USItype mh = b->fraction.ll >> BITS_PER_SI;
1.5987 -+ UDItype pp_ll = (UDItype) ml * nl;
1.5988 -+ UDItype pp_hl = (UDItype) mh * nl;
1.5989 -+ UDItype pp_lh = (UDItype) ml * nh;
1.5990 -+ UDItype pp_hh = (UDItype) mh * nh;
1.5991 -+ UDItype res2 = 0;
1.5992 -+ UDItype res0 = 0;
1.5993 -+ UDItype ps_hh__ = pp_hl + pp_lh;
1.5994 -+ if (ps_hh__ < pp_hl)
1.5995 -+ res2 += (UDItype)1 << BITS_PER_SI;
1.5996 -+ pp_hl = (UDItype)(USItype)ps_hh__ << BITS_PER_SI;
1.5997 -+ res0 = pp_ll + pp_hl;
1.5998 -+ if (res0 < pp_ll)
1.5999 -+ res2++;
1.6000 -+ res2 += (ps_hh__ >> BITS_PER_SI) + pp_hh;
1.6001 -+ high = res2;
1.6002 -+ low = res0;
1.6003 -+ }
1.6004 -+#endif
1.6005 -+ }
1.6006 -+
1.6007 -+ tmp->normal_exp = a->normal_exp + b->normal_exp
1.6008 -+ + FRAC_NBITS - (FRACBITS + NGARDS);
1.6009 -+ tmp->sign = a->sign != b->sign;
1.6010 -+ while (high >= IMPLICIT_2)
1.6011 -+ {
1.6012 -+ tmp->normal_exp++;
1.6013 -+ if (high & 1)
1.6014 -+ {
1.6015 -+ low >>= 1;
1.6016 -+ low |= FRACHIGH;
1.6017 -+ }
1.6018 -+ high >>= 1;
1.6019 -+ }
1.6020 -+ while (high < IMPLICIT_1)
1.6021 -+ {
1.6022 -+ tmp->normal_exp--;
1.6023 -+
1.6024 -+ high <<= 1;
1.6025 -+ if (low & FRACHIGH)
1.6026 -+ high |= 1;
1.6027 -+ low <<= 1;
1.6028 -+ }
1.6029 -+ /* rounding is tricky. if we only round if it won't make us round later. */
1.6030 -+#if 0
1.6031 -+ if (low & FRACHIGH2)
1.6032 -+ {
1.6033 -+ if (((high & GARDMASK) != GARDMSB)
1.6034 -+ && (((high + 1) & GARDMASK) == GARDMSB))
1.6035 -+ {
1.6036 -+ /* don't round, it gets done again later. */
1.6037 -+ }
1.6038 -+ else
1.6039 -+ {
1.6040 -+ high++;
1.6041 -+ }
1.6042 -+ }
1.6043 -+#endif
1.6044 -+ if (!ROUND_TOWARDS_ZERO && (high & GARDMASK) == GARDMSB)
1.6045 -+ {
1.6046 -+ if (high & (1 << NGARDS))
1.6047 -+ {
1.6048 -+ /* half way, so round to even */
1.6049 -+ high += GARDROUND + 1;
1.6050 -+ }
1.6051 -+ else if (low)
1.6052 -+ {
1.6053 -+ /* but we really weren't half way */
1.6054 -+ high += GARDROUND + 1;
1.6055 -+ }
1.6056 -+ }
1.6057 -+ tmp->fraction.ll = high;
1.6058 -+ tmp->class = CLASS_NUMBER;
1.6059 -+ return tmp;
1.6060 -+}
1.6061 -+
1.6062 -+FLO_type
1.6063 -+multiply (FLO_type arg_a, FLO_type arg_b)
1.6064 -+{
1.6065 -+ fp_number_type a;
1.6066 -+ fp_number_type b;
1.6067 -+ fp_number_type tmp;
1.6068 -+ fp_number_type *res;
1.6069 -+ FLO_union_type au, bu;
1.6070 -+
1.6071 -+ au.value = arg_a;
1.6072 -+ bu.value = arg_b;
1.6073 -+
1.6074 -+ unpack_d (&au, &a);
1.6075 -+ unpack_d (&bu, &b);
1.6076 -+
1.6077 -+ res = _fpmul_parts (&a, &b, &tmp);
1.6078 -+
1.6079 -+ return pack_d (res);
1.6080 -+}
1.6081 -+#endif /* L_mul_sf || L_mul_df */
1.6082 -+
1.6083 -+#if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf)
1.6084 -+static inline __attribute__ ((__always_inline__)) fp_number_type *
1.6085 -+_fpdiv_parts (fp_number_type * a,
1.6086 -+ fp_number_type * b)
1.6087 -+{
1.6088 -+ fractype bit;
1.6089 -+ fractype numerator;
1.6090 -+ fractype denominator;
1.6091 -+ fractype quotient;
1.6092 -+
1.6093 -+ if (isnan (a))
1.6094 -+ {
1.6095 -+ return a;
1.6096 -+ }
1.6097 -+ if (isnan (b))
1.6098 -+ {
1.6099 -+ return b;
1.6100 -+ }
1.6101 -+
1.6102 -+ a->sign = a->sign ^ b->sign;
1.6103 -+
1.6104 -+ if (isinf (a) || iszero (a))
1.6105 -+ {
1.6106 -+ if (a->class == b->class)
1.6107 -+ return nan ();
1.6108 -+ return a;
1.6109 -+ }
1.6110 -+
1.6111 -+ if (isinf (b))
1.6112 -+ {
1.6113 -+ a->fraction.ll = 0;
1.6114 -+ a->normal_exp = 0;
1.6115 -+ return a;
1.6116 -+ }
1.6117 -+ if (iszero (b))
1.6118 -+ {
1.6119 -+ a->class = CLASS_INFINITY;
1.6120 -+ return a;
1.6121 -+ }
1.6122 -+
1.6123 -+ /* Calculate the mantissa by multiplying both 64bit numbers to get a
1.6124 -+ 128 bit number */
1.6125 -+ {
1.6126 -+ /* quotient =
1.6127 -+ ( numerator / denominator) * 2^(numerator exponent - denominator exponent)
1.6128 -+ */
1.6129 -+
1.6130 -+ a->normal_exp = a->normal_exp - b->normal_exp;
1.6131 -+ numerator = a->fraction.ll;
1.6132 -+ denominator = b->fraction.ll;
1.6133 -+
1.6134 -+ if (numerator < denominator)
1.6135 -+ {
1.6136 -+ /* Fraction will be less than 1.0 */
1.6137 -+ numerator *= 2;
1.6138 -+ a->normal_exp--;
1.6139 -+ }
1.6140 -+ bit = IMPLICIT_1;
1.6141 -+ quotient = 0;
1.6142 -+ /* ??? Does divide one bit at a time. Optimize. */
1.6143 -+ while (bit)
1.6144 -+ {
1.6145 -+ if (numerator >= denominator)
1.6146 -+ {
1.6147 -+ quotient |= bit;
1.6148 -+ numerator -= denominator;
1.6149 -+ }
1.6150 -+ bit >>= 1;
1.6151 -+ numerator *= 2;
1.6152 -+ }
1.6153 -+
1.6154 -+ if (!ROUND_TOWARDS_ZERO && (quotient & GARDMASK) == GARDMSB)
1.6155 -+ {
1.6156 -+ if (quotient & (1 << NGARDS))
1.6157 -+ {
1.6158 -+ /* half way, so round to even */
1.6159 -+ quotient += GARDROUND + 1;
1.6160 -+ }
1.6161 -+ else if (numerator)
1.6162 -+ {
1.6163 -+ /* but we really weren't half way, more bits exist */
1.6164 -+ quotient += GARDROUND + 1;
1.6165 -+ }
1.6166 -+ }
1.6167 -+
1.6168 -+ a->fraction.ll = quotient;
1.6169 -+ return (a);
1.6170 -+ }
1.6171 -+}
1.6172 -+
1.6173 -+FLO_type
1.6174 -+divide (FLO_type arg_a, FLO_type arg_b)
1.6175 -+{
1.6176 -+ fp_number_type a;
1.6177 -+ fp_number_type b;
1.6178 -+ fp_number_type *res;
1.6179 -+ FLO_union_type au, bu;
1.6180 -+
1.6181 -+ au.value = arg_a;
1.6182 -+ bu.value = arg_b;
1.6183 -+
1.6184 -+ unpack_d (&au, &a);
1.6185 -+ unpack_d (&bu, &b);
1.6186 -+
1.6187 -+ res = _fpdiv_parts (&a, &b);
1.6188 -+
1.6189 -+ return pack_d (res);
1.6190 -+}
1.6191 -+#endif /* L_div_sf || L_div_df */
1.6192 -+
1.6193 -+#if defined(L_fpcmp_parts_sf) || defined(L_fpcmp_parts_df) \
1.6194 -+ || defined(L_fpcmp_parts_tf)
1.6195 -+/* according to the demo, fpcmp returns a comparison with 0... thus
1.6196 -+ a<b -> -1
1.6197 -+ a==b -> 0
1.6198 -+ a>b -> +1
1.6199 -+ */
1.6200 -+
1.6201 -+int
1.6202 -+__fpcmp_parts (fp_number_type * a, fp_number_type * b)
1.6203 -+{
1.6204 -+#if 0
1.6205 -+ /* either nan -> unordered. Must be checked outside of this routine. */
1.6206 -+ if (isnan (a) && isnan (b))
1.6207 -+ {
1.6208 -+ return 1; /* still unordered! */
1.6209 -+ }
1.6210 -+#endif
1.6211 -+
1.6212 -+ if (isnan (a) || isnan (b))
1.6213 -+ {
1.6214 -+ return 1; /* how to indicate unordered compare? */
1.6215 -+ }
1.6216 -+ if (isinf (a) && isinf (b))
1.6217 -+ {
1.6218 -+ /* +inf > -inf, but +inf != +inf */
1.6219 -+ /* b \a| +inf(0)| -inf(1)
1.6220 -+ ______\+--------+--------
1.6221 -+ +inf(0)| a==b(0)| a<b(-1)
1.6222 -+ -------+--------+--------
1.6223 -+ -inf(1)| a>b(1) | a==b(0)
1.6224 -+ -------+--------+--------
1.6225 -+ So since unordered must be nonzero, just line up the columns...
1.6226 -+ */
1.6227 -+ return b->sign - a->sign;
1.6228 -+ }
1.6229 -+ /* but not both... */
1.6230 -+ if (isinf (a))
1.6231 -+ {
1.6232 -+ return a->sign ? -1 : 1;
1.6233 -+ }
1.6234 -+ if (isinf (b))
1.6235 -+ {
1.6236 -+ return b->sign ? 1 : -1;
1.6237 -+ }
1.6238 -+ if (iszero (a) && iszero (b))
1.6239 -+ {
1.6240 -+ return 0;
1.6241 -+ }
1.6242 -+ if (iszero (a))
1.6243 -+ {
1.6244 -+ return b->sign ? 1 : -1;
1.6245 -+ }
1.6246 -+ if (iszero (b))
1.6247 -+ {
1.6248 -+ return a->sign ? -1 : 1;
1.6249 -+ }
1.6250 -+ /* now both are "normal". */
1.6251 -+ if (a->sign != b->sign)
1.6252 -+ {
1.6253 -+ /* opposite signs */
1.6254 -+ return a->sign ? -1 : 1;
1.6255 -+ }
1.6256 -+ /* same sign; exponents? */
1.6257 -+ if (a->normal_exp > b->normal_exp)
1.6258 -+ {
1.6259 -+ return a->sign ? -1 : 1;
1.6260 -+ }
1.6261 -+ if (a->normal_exp < b->normal_exp)
1.6262 -+ {
1.6263 -+ return a->sign ? 1 : -1;
1.6264 -+ }
1.6265 -+ /* same exponents; check size. */
1.6266 -+ if (a->fraction.ll > b->fraction.ll)
1.6267 -+ {
1.6268 -+ return a->sign ? -1 : 1;
1.6269 -+ }
1.6270 -+ if (a->fraction.ll < b->fraction.ll)
1.6271 -+ {
1.6272 -+ return a->sign ? 1 : -1;
1.6273 -+ }
1.6274 -+ /* after all that, they're equal. */
1.6275 -+ return 0;
1.6276 -+}
1.6277 -+#endif
1.6278 -+
1.6279 -+#if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compoare_tf)
1.6280 -+CMPtype
1.6281 -+compare (FLO_type arg_a, FLO_type arg_b)
1.6282 -+{
1.6283 -+ fp_number_type a;
1.6284 -+ fp_number_type b;
1.6285 -+ FLO_union_type au, bu;
1.6286 -+
1.6287 -+ au.value = arg_a;
1.6288 -+ bu.value = arg_b;
1.6289 -+
1.6290 -+ unpack_d (&au, &a);
1.6291 -+ unpack_d (&bu, &b);
1.6292 -+
1.6293 -+ return __fpcmp_parts (&a, &b);
1.6294 -+}
1.6295 -+#endif /* L_compare_sf || L_compare_df */
1.6296 -+
1.6297 -+#ifndef US_SOFTWARE_GOFAST
1.6298 -+
1.6299 -+/* These should be optimized for their specific tasks someday. */
1.6300 -+
1.6301 -+#if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf)
1.6302 -+CMPtype
1.6303 -+_eq_f2 (FLO_type arg_a, FLO_type arg_b)
1.6304 -+{
1.6305 -+ fp_number_type a;
1.6306 -+ fp_number_type b;
1.6307 -+ FLO_union_type au, bu;
1.6308 -+
1.6309 -+ au.value = arg_a;
1.6310 -+ bu.value = arg_b;
1.6311 -+
1.6312 -+ unpack_d (&au, &a);
1.6313 -+ unpack_d (&bu, &b);
1.6314 -+
1.6315 -+ if (isnan (&a) || isnan (&b))
1.6316 -+ return 1; /* false, truth == 0 */
1.6317 -+
1.6318 -+ return __fpcmp_parts (&a, &b) ;
1.6319 -+}
1.6320 -+#endif /* L_eq_sf || L_eq_df */
1.6321 -+
1.6322 -+#if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf)
1.6323 -+CMPtype
1.6324 -+_ne_f2 (FLO_type arg_a, FLO_type arg_b)
1.6325 -+{
1.6326 -+ fp_number_type a;
1.6327 -+ fp_number_type b;
1.6328 -+ FLO_union_type au, bu;
1.6329 -+
1.6330 -+ au.value = arg_a;
1.6331 -+ bu.value = arg_b;
1.6332 -+
1.6333 -+ unpack_d (&au, &a);
1.6334 -+ unpack_d (&bu, &b);
1.6335 -+
1.6336 -+ if (isnan (&a) || isnan (&b))
1.6337 -+ return 1; /* true, truth != 0 */
1.6338 -+
1.6339 -+ return __fpcmp_parts (&a, &b) ;
1.6340 -+}
1.6341 -+#endif /* L_ne_sf || L_ne_df */
1.6342 -+
1.6343 -+#if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf)
1.6344 -+CMPtype
1.6345 -+_gt_f2 (FLO_type arg_a, FLO_type arg_b)
1.6346 -+{
1.6347 -+ fp_number_type a;
1.6348 -+ fp_number_type b;
1.6349 -+ FLO_union_type au, bu;
1.6350 -+
1.6351 -+ au.value = arg_a;
1.6352 -+ bu.value = arg_b;
1.6353 -+
1.6354 -+ unpack_d (&au, &a);
1.6355 -+ unpack_d (&bu, &b);
1.6356 -+
1.6357 -+ if (isnan (&a) || isnan (&b))
1.6358 -+ return -1; /* false, truth > 0 */
1.6359 -+
1.6360 -+ return __fpcmp_parts (&a, &b);
1.6361 -+}
1.6362 -+#endif /* L_gt_sf || L_gt_df */
1.6363 -+
1.6364 -+#if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf)
1.6365 -+CMPtype
1.6366 -+_ge_f2 (FLO_type arg_a, FLO_type arg_b)
1.6367 -+{
1.6368 -+ fp_number_type a;
1.6369 -+ fp_number_type b;
1.6370 -+ FLO_union_type au, bu;
1.6371 -+
1.6372 -+ au.value = arg_a;
1.6373 -+ bu.value = arg_b;
1.6374 -+
1.6375 -+ unpack_d (&au, &a);
1.6376 -+ unpack_d (&bu, &b);
1.6377 -+
1.6378 -+ if (isnan (&a) || isnan (&b))
1.6379 -+ return -1; /* false, truth >= 0 */
1.6380 -+ return __fpcmp_parts (&a, &b) ;
1.6381 -+}
1.6382 -+#endif /* L_ge_sf || L_ge_df */
1.6383 -+
1.6384 -+#if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf)
1.6385 -+CMPtype
1.6386 -+_lt_f2 (FLO_type arg_a, FLO_type arg_b)
1.6387 -+{
1.6388 -+ fp_number_type a;
1.6389 -+ fp_number_type b;
1.6390 -+ FLO_union_type au, bu;
1.6391 -+
1.6392 -+ au.value = arg_a;
1.6393 -+ bu.value = arg_b;
1.6394 -+
1.6395 -+ unpack_d (&au, &a);
1.6396 -+ unpack_d (&bu, &b);
1.6397 -+
1.6398 -+ if (isnan (&a) || isnan (&b))
1.6399 -+ return 1; /* false, truth < 0 */
1.6400 -+
1.6401 -+ return __fpcmp_parts (&a, &b);
1.6402 -+}
1.6403 -+#endif /* L_lt_sf || L_lt_df */
1.6404 -+
1.6405 -+#if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf)
1.6406 -+CMPtype
1.6407 -+_le_f2 (FLO_type arg_a, FLO_type arg_b)
1.6408 -+{
1.6409 -+ fp_number_type a;
1.6410 -+ fp_number_type b;
1.6411 -+ FLO_union_type au, bu;
1.6412 -+
1.6413 -+ au.value = arg_a;
1.6414 -+ bu.value = arg_b;
1.6415 -+
1.6416 -+ unpack_d (&au, &a);
1.6417 -+ unpack_d (&bu, &b);
1.6418 -+
1.6419 -+ if (isnan (&a) || isnan (&b))
1.6420 -+ return 1; /* false, truth <= 0 */
1.6421 -+
1.6422 -+ return __fpcmp_parts (&a, &b) ;
1.6423 -+}
1.6424 -+#endif /* L_le_sf || L_le_df */
1.6425 -+
1.6426 -+#endif /* ! US_SOFTWARE_GOFAST */
1.6427 -+
1.6428 -+#if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf)
1.6429 -+CMPtype
1.6430 -+_unord_f2 (FLO_type arg_a, FLO_type arg_b)
1.6431 -+{
1.6432 -+ fp_number_type a;
1.6433 -+ fp_number_type b;
1.6434 -+ FLO_union_type au, bu;
1.6435 -+
1.6436 -+ au.value = arg_a;
1.6437 -+ bu.value = arg_b;
1.6438 -+
1.6439 -+ unpack_d (&au, &a);
1.6440 -+ unpack_d (&bu, &b);
1.6441 -+
1.6442 -+ return (isnan (&a) || isnan (&b));
1.6443 -+}
1.6444 -+#endif /* L_unord_sf || L_unord_df */
1.6445 -+
1.6446 -+#if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf)
1.6447 -+FLO_type
1.6448 -+si_to_float (SItype arg_a)
1.6449 -+{
1.6450 -+ fp_number_type in;
1.6451 -+
1.6452 -+ in.class = CLASS_NUMBER;
1.6453 -+ in.sign = arg_a < 0;
1.6454 -+ if (!arg_a)
1.6455 -+ {
1.6456 -+ in.class = CLASS_ZERO;
1.6457 -+ }
1.6458 -+ else
1.6459 -+ {
1.6460 -+ in.normal_exp = FRACBITS + NGARDS;
1.6461 -+ if (in.sign)
1.6462 -+ {
1.6463 -+ /* Special case for minint, since there is no +ve integer
1.6464 -+ representation for it */
1.6465 -+ if (arg_a == (- MAX_SI_INT - 1))
1.6466 -+ {
1.6467 -+ return (FLO_type)(- MAX_SI_INT - 1);
1.6468 -+ }
1.6469 -+ in.fraction.ll = (-arg_a);
1.6470 -+ }
1.6471 -+ else
1.6472 -+ in.fraction.ll = arg_a;
1.6473 -+
1.6474 -+ while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS)))
1.6475 -+ {
1.6476 -+ in.fraction.ll <<= 1;
1.6477 -+ in.normal_exp -= 1;
1.6478 -+ }
1.6479 -+ }
1.6480 -+ return pack_d (&in);
1.6481 -+}
1.6482 -+#endif /* L_si_to_sf || L_si_to_df */
1.6483 -+
1.6484 -+#if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf)
1.6485 -+FLO_type
1.6486 -+usi_to_float (USItype arg_a)
1.6487 -+{
1.6488 -+ fp_number_type in;
1.6489 -+
1.6490 -+ in.sign = 0;
1.6491 -+ if (!arg_a)
1.6492 -+ {
1.6493 -+ in.class = CLASS_ZERO;
1.6494 -+ }
1.6495 -+ else
1.6496 -+ {
1.6497 -+ in.class = CLASS_NUMBER;
1.6498 -+ in.normal_exp = FRACBITS + NGARDS;
1.6499 -+ in.fraction.ll = arg_a;
1.6500 -+
1.6501 -+ while (in.fraction.ll > ((fractype)1 << (FRACBITS + NGARDS)))
1.6502 -+ {
1.6503 -+ in.fraction.ll >>= 1;
1.6504 -+ in.normal_exp += 1;
1.6505 -+ }
1.6506 -+ while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS)))
1.6507 -+ {
1.6508 -+ in.fraction.ll <<= 1;
1.6509 -+ in.normal_exp -= 1;
1.6510 -+ }
1.6511 -+ }
1.6512 -+ return pack_d (&in);
1.6513 -+}
1.6514 -+#endif
1.6515 -+
1.6516 -+#if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si)
1.6517 -+SItype
1.6518 -+float_to_si (FLO_type arg_a)
1.6519 -+{
1.6520 -+ fp_number_type a;
1.6521 -+ SItype tmp;
1.6522 -+ FLO_union_type au;
1.6523 -+
1.6524 -+ au.value = arg_a;
1.6525 -+ unpack_d (&au, &a);
1.6526 -+
1.6527 -+ if (iszero (&a))
1.6528 -+ return 0;
1.6529 -+ if (isnan (&a))
1.6530 -+ return 0;
1.6531 -+ /* get reasonable MAX_SI_INT... */
1.6532 -+ if (isinf (&a))
1.6533 -+ return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
1.6534 -+ /* it is a number, but a small one */
1.6535 -+ if (a.normal_exp < 0)
1.6536 -+ return 0;
1.6537 -+ if (a.normal_exp > BITS_PER_SI - 2)
1.6538 -+ return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
1.6539 -+ tmp = a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1.6540 -+ return a.sign ? (-tmp) : (tmp);
1.6541 -+}
1.6542 -+#endif /* L_sf_to_si || L_df_to_si */
1.6543 -+
1.6544 -+#if defined(L_sf_to_usi) || defined(L_df_to_usi) || defined(L_tf_to_usi)
1.6545 -+#if defined US_SOFTWARE_GOFAST || defined(L_tf_to_usi)
1.6546 -+/* While libgcc2.c defines its own __fixunssfsi and __fixunsdfsi routines,
1.6547 -+ we also define them for GOFAST because the ones in libgcc2.c have the
1.6548 -+ wrong names and I'd rather define these here and keep GOFAST CYG-LOC's
1.6549 -+ out of libgcc2.c. We can't define these here if not GOFAST because then
1.6550 -+ there'd be duplicate copies. */
1.6551 -+
1.6552 -+USItype
1.6553 -+float_to_usi (FLO_type arg_a)
1.6554 -+{
1.6555 -+ fp_number_type a;
1.6556 -+ FLO_union_type au;
1.6557 -+
1.6558 -+ au.value = arg_a;
1.6559 -+ unpack_d (&au, &a);
1.6560 -+
1.6561 -+ if (iszero (&a))
1.6562 -+ return 0;
1.6563 -+ if (isnan (&a))
1.6564 -+ return 0;
1.6565 -+ /* it is a negative number */
1.6566 -+ if (a.sign)
1.6567 -+ return 0;
1.6568 -+ /* get reasonable MAX_USI_INT... */
1.6569 -+ if (isinf (&a))
1.6570 -+ return MAX_USI_INT;
1.6571 -+ /* it is a number, but a small one */
1.6572 -+ if (a.normal_exp < 0)
1.6573 -+ return 0;
1.6574 -+ if (a.normal_exp > BITS_PER_SI - 1)
1.6575 -+ return MAX_USI_INT;
1.6576 -+ else if (a.normal_exp > (FRACBITS + NGARDS))
1.6577 -+ return a.fraction.ll << (a.normal_exp - (FRACBITS + NGARDS));
1.6578 -+ else
1.6579 -+ return a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1.6580 -+}
1.6581 -+#endif /* US_SOFTWARE_GOFAST */
1.6582 -+#endif /* L_sf_to_usi || L_df_to_usi */
1.6583 -+
1.6584 -+#if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf)
1.6585 -+FLO_type
1.6586 -+negate (FLO_type arg_a)
1.6587 -+{
1.6588 -+ fp_number_type a;
1.6589 -+ FLO_union_type au;
1.6590 -+
1.6591 -+ au.value = arg_a;
1.6592 -+ unpack_d (&au, &a);
1.6593 -+
1.6594 -+ flip_sign (&a);
1.6595 -+ return pack_d (&a);
1.6596 -+}
1.6597 -+#endif /* L_negate_sf || L_negate_df */
1.6598 -+
1.6599 -+#ifdef FLOAT
1.6600 -+
1.6601 -+#if defined(L_make_sf)
1.6602 -+SFtype
1.6603 -+__make_fp(fp_class_type class,
1.6604 -+ unsigned int sign,
1.6605 -+ int exp,
1.6606 -+ USItype frac)
1.6607 -+{
1.6608 -+ fp_number_type in;
1.6609 -+
1.6610 -+ in.class = class;
1.6611 -+ in.sign = sign;
1.6612 -+ in.normal_exp = exp;
1.6613 -+ in.fraction.ll = frac;
1.6614 -+ return pack_d (&in);
1.6615 -+}
1.6616 -+#endif /* L_make_sf */
1.6617 -+
1.6618 -+#ifndef FLOAT_ONLY
1.6619 -+
1.6620 -+/* This enables one to build an fp library that supports float but not double.
1.6621 -+ Otherwise, we would get an undefined reference to __make_dp.
1.6622 -+ This is needed for some 8-bit ports that can't handle well values that
1.6623 -+ are 8-bytes in size, so we just don't support double for them at all. */
1.6624 -+
1.6625 -+#if defined(L_sf_to_df)
1.6626 -+DFtype
1.6627 -+sf_to_df (SFtype arg_a)
1.6628 -+{
1.6629 -+ fp_number_type in;
1.6630 -+ FLO_union_type au;
1.6631 -+
1.6632 -+ au.value = arg_a;
1.6633 -+ unpack_d (&au, &in);
1.6634 -+
1.6635 -+ return __make_dp (in.class, in.sign, in.normal_exp,
1.6636 -+ ((UDItype) in.fraction.ll) << F_D_BITOFF);
1.6637 -+}
1.6638 -+#endif /* L_sf_to_df */
1.6639 -+
1.6640 -+#if defined(L_sf_to_tf) && defined(TMODES)
1.6641 -+TFtype
1.6642 -+sf_to_tf (SFtype arg_a)
1.6643 -+{
1.6644 -+ fp_number_type in;
1.6645 -+ FLO_union_type au;
1.6646 -+
1.6647 -+ au.value = arg_a;
1.6648 -+ unpack_d (&au, &in);
1.6649 -+
1.6650 -+ return __make_tp (in.class, in.sign, in.normal_exp,
1.6651 -+ ((UTItype) in.fraction.ll) << F_T_BITOFF);
1.6652 -+}
1.6653 -+#endif /* L_sf_to_df */
1.6654 -+
1.6655 -+#endif /* ! FLOAT_ONLY */
1.6656 -+#endif /* FLOAT */
1.6657 -+
1.6658 -+#ifndef FLOAT
1.6659 -+
1.6660 -+extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
1.6661 -+
1.6662 -+#if defined(L_make_df)
1.6663 -+DFtype
1.6664 -+__make_dp (fp_class_type class, unsigned int sign, int exp, UDItype frac)
1.6665 -+{
1.6666 -+ fp_number_type in;
1.6667 -+
1.6668 -+ in.class = class;
1.6669 -+ in.sign = sign;
1.6670 -+ in.normal_exp = exp;
1.6671 -+ in.fraction.ll = frac;
1.6672 -+ return pack_d (&in);
1.6673 -+}
1.6674 -+#endif /* L_make_df */
1.6675 -+
1.6676 -+#if defined(L_df_to_sf)
1.6677 -+SFtype
1.6678 -+df_to_sf (DFtype arg_a)
1.6679 -+{
1.6680 -+ fp_number_type in;
1.6681 -+ USItype sffrac;
1.6682 -+ FLO_union_type au;
1.6683 -+
1.6684 -+ au.value = arg_a;
1.6685 -+ unpack_d (&au, &in);
1.6686 -+
1.6687 -+ sffrac = in.fraction.ll >> F_D_BITOFF;
1.6688 -+
1.6689 -+ /* We set the lowest guard bit in SFFRAC if we discarded any non
1.6690 -+ zero bits. */
1.6691 -+ if ((in.fraction.ll & (((USItype) 1 << F_D_BITOFF) - 1)) != 0)
1.6692 -+ sffrac |= 1;
1.6693 -+
1.6694 -+ return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
1.6695 -+}
1.6696 -+#endif /* L_df_to_sf */
1.6697 -+
1.6698 -+#if defined(L_df_to_tf) && defined(TMODES) \
1.6699 -+ && !defined(FLOAT) && !defined(TFLOAT)
1.6700 -+TFtype
1.6701 -+df_to_tf (DFtype arg_a)
1.6702 -+{
1.6703 -+ fp_number_type in;
1.6704 -+ FLO_union_type au;
1.6705 -+
1.6706 -+ au.value = arg_a;
1.6707 -+ unpack_d (&au, &in);
1.6708 -+
1.6709 -+ return __make_tp (in.class, in.sign, in.normal_exp,
1.6710 -+ ((UTItype) in.fraction.ll) << D_T_BITOFF);
1.6711 -+}
1.6712 -+#endif /* L_sf_to_df */
1.6713 -+
1.6714 -+#ifdef TFLOAT
1.6715 -+#if defined(L_make_tf)
1.6716 -+TFtype
1.6717 -+__make_tp(fp_class_type class,
1.6718 -+ unsigned int sign,
1.6719 -+ int exp,
1.6720 -+ UTItype frac)
1.6721 -+{
1.6722 -+ fp_number_type in;
1.6723 -+
1.6724 -+ in.class = class;
1.6725 -+ in.sign = sign;
1.6726 -+ in.normal_exp = exp;
1.6727 -+ in.fraction.ll = frac;
1.6728 -+ return pack_d (&in);
1.6729 -+}
1.6730 -+#endif /* L_make_tf */
1.6731 -+
1.6732 -+#if defined(L_tf_to_df)
1.6733 -+DFtype
1.6734 -+tf_to_df (TFtype arg_a)
1.6735 -+{
1.6736 -+ fp_number_type in;
1.6737 -+ UDItype sffrac;
1.6738 -+ FLO_union_type au;
1.6739 -+
1.6740 -+ au.value = arg_a;
1.6741 -+ unpack_d (&au, &in);
1.6742 -+
1.6743 -+ sffrac = in.fraction.ll >> D_T_BITOFF;
1.6744 -+
1.6745 -+ /* We set the lowest guard bit in SFFRAC if we discarded any non
1.6746 -+ zero bits. */
1.6747 -+ if ((in.fraction.ll & (((UTItype) 1 << D_T_BITOFF) - 1)) != 0)
1.6748 -+ sffrac |= 1;
1.6749 -+
1.6750 -+ return __make_dp (in.class, in.sign, in.normal_exp, sffrac);
1.6751 -+}
1.6752 -+#endif /* L_tf_to_df */
1.6753 -+
1.6754 -+#if defined(L_tf_to_sf)
1.6755 -+SFtype
1.6756 -+tf_to_sf (TFtype arg_a)
1.6757 -+{
1.6758 -+ fp_number_type in;
1.6759 -+ USItype sffrac;
1.6760 -+ FLO_union_type au;
1.6761 -+
1.6762 -+ au.value = arg_a;
1.6763 -+ unpack_d (&au, &in);
1.6764 -+
1.6765 -+ sffrac = in.fraction.ll >> F_T_BITOFF;
1.6766 -+
1.6767 -+ /* We set the lowest guard bit in SFFRAC if we discarded any non
1.6768 -+ zero bits. */
1.6769 -+ if ((in.fraction.ll & (((UTItype) 1 << F_T_BITOFF) - 1)) != 0)
1.6770 -+ sffrac |= 1;
1.6771 -+
1.6772 -+ return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
1.6773 -+}
1.6774 -+#endif /* L_tf_to_sf */
1.6775 -+#endif /* TFLOAT */
1.6776 -+
1.6777 -+#endif /* ! FLOAT */
1.6778 -+#endif /* !EXTENDED_FLOAT_STUBS */
1.6779 -diff -durN gcc-3.4.6.orig/gcc/config/nios2/nios2.h gcc-3.4.6/gcc/config/nios2/nios2.h
1.6780 ---- gcc-3.4.6.orig/gcc/config/nios2/nios2.h 1970-01-01 01:00:00.000000000 +0100
1.6781 -+++ gcc-3.4.6/gcc/config/nios2/nios2.h 2007-08-15 23:09:36.000000000 +0200
1.6782 -@@ -0,0 +1,824 @@
1.6783 -+/* Definitions of target machine for Altera NIOS 2G NIOS2 version.
1.6784 -+ Copyright (C) 2003 Altera
1.6785 -+ Contributed by Jonah Graham (jgraham@altera.com).
1.6786 -+
1.6787 -+This file is part of GNU CC.
1.6788 -+
1.6789 -+GNU CC is free software; you can redistribute it and/or modify
1.6790 -+it under the terms of the GNU General Public License as published by
1.6791 -+the Free Software Foundation; either version 2, or (at your option)
1.6792 -+any later version.
1.6793 -+
1.6794 -+GNU CC is distributed in the hope that it will be useful,
1.6795 -+but WITHOUT ANY WARRANTY; without even the implied warranty of
1.6796 -+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1.6797 -+GNU General Public License for more details.
1.6798 -+
1.6799 -+You should have received a copy of the GNU General Public License
1.6800 -+along with GNU CC; see the file COPYING. If not, write to
1.6801 -+the Free Software Foundation, 59 Temple Place - Suite 330,
1.6802 -+Boston, MA 02111-1307, USA. */
1.6803 -+
1.6804 -+
1.6805 -+
1.6806 -+#define TARGET_CPU_CPP_BUILTINS() \
1.6807 -+ do \
1.6808 -+ { \
1.6809 -+ builtin_define_std ("NIOS2"); \
1.6810 -+ builtin_define_std ("nios2"); \
1.6811 -+ builtin_define ("_GNU_SOURCE"); \
1.6812 -+ } \
1.6813 -+ while (0)
1.6814 -+#define TARGET_VERSION fprintf (stderr, " (Altera Nios II)")
1.6815 -+
1.6816 -+
1.6817 -+
1.6818 -+
1.6819 -+
1.6820 -+/*********************************
1.6821 -+ * Run-time Target Specification
1.6822 -+ *********************************/
1.6823 -+
1.6824 -+#define HAS_DIV_FLAG 0x0001
1.6825 -+#define HAS_MUL_FLAG 0x0002
1.6826 -+#define HAS_MULX_FLAG 0x0004
1.6827 -+#define FAST_SW_DIV_FLAG 0x0008
1.6828 -+#define INLINE_MEMCPY_FLAG 0x00010
1.6829 -+#define CACHE_VOLATILE_FLAG 0x0020
1.6830 -+#define BYPASS_CACHE_FLAG 0x0040
1.6831 -+
1.6832 -+extern int target_flags;
1.6833 -+#define TARGET_HAS_DIV (target_flags & HAS_DIV_FLAG)
1.6834 -+#define TARGET_HAS_MUL (target_flags & HAS_MUL_FLAG)
1.6835 -+#define TARGET_HAS_MULX (target_flags & HAS_MULX_FLAG)
1.6836 -+#define TARGET_FAST_SW_DIV (target_flags & FAST_SW_DIV_FLAG)
1.6837 -+#define TARGET_INLINE_MEMCPY (target_flags & INLINE_MEMCPY_FLAG)
1.6838 -+#define TARGET_CACHE_VOLATILE (target_flags & CACHE_VOLATILE_FLAG)
1.6839 -+#define TARGET_BYPASS_CACHE (target_flags & BYPASS_CACHE_FLAG)
1.6840 -+
1.6841 -+#define TARGET_SWITCHES \
1.6842 -+{ \
1.6843 -+ { "hw-div", HAS_DIV_FLAG, \
1.6844 -+ N_("Enable DIV, DIVU") }, \
1.6845 -+ { "no-hw-div", -HAS_DIV_FLAG, \
1.6846 -+ N_("Disable DIV, DIVU (default)") }, \
1.6847 -+ { "hw-mul", HAS_MUL_FLAG, \
1.6848 -+ N_("Enable MUL instructions (default)") }, \
1.6849 -+ { "hw-mulx", HAS_MULX_FLAG, \
1.6850 -+ N_("Enable MULX instructions, assume fast shifter") }, \
1.6851 -+ { "no-hw-mul", -HAS_MUL_FLAG, \
1.6852 -+ N_("Disable MUL instructions") }, \
1.6853 -+ { "no-hw-mulx", -HAS_MULX_FLAG, \
1.6854 -+ N_("Disable MULX instructions, assume slow shifter (default and implied by -mno-hw-mul)") }, \
1.6855 -+ { "fast-sw-div", FAST_SW_DIV_FLAG, \
1.6856 -+ N_("Use table based fast divide (default at -O3)") }, \
1.6857 -+ { "no-fast-sw-div", -FAST_SW_DIV_FLAG, \
1.6858 -+ N_("Don't use table based fast divide ever") }, \
1.6859 -+ { "inline-memcpy", INLINE_MEMCPY_FLAG, \
1.6860 -+ N_("Inline small memcpy (default when optimizing)") }, \
1.6861 -+ { "no-inline-memcpy", -INLINE_MEMCPY_FLAG, \
1.6862 -+ N_("Don't Inline small memcpy") }, \
1.6863 -+ { "cache-volatile", CACHE_VOLATILE_FLAG, \
1.6864 -+ N_("Volatile accesses use non-io variants of instructions (default)") }, \
1.6865 -+ { "no-cache-volatile", -CACHE_VOLATILE_FLAG, \
1.6866 -+ N_("Volatile accesses use io variants of instructions") }, \
1.6867 -+ { "bypass-cache", BYPASS_CACHE_FLAG, \
1.6868 -+ N_("All ld/st instructins use io variants") }, \
1.6869 -+ { "no-bypass-cache", -BYPASS_CACHE_FLAG, \
1.6870 -+ N_("All ld/st instructins do not use io variants (default)") }, \
1.6871 -+ { "smallc", 0, \
1.6872 -+ N_("Link with a limited version of the C library") }, \
1.6873 -+ { "ctors-in-init", 0, \
1.6874 -+ "" /* undocumented: N_("Link with static constructors and destructors in init") */ }, \
1.6875 -+ { "", TARGET_DEFAULT, 0 } \
1.6876 -+}
1.6877 -+
1.6878 -+
1.6879 -+extern const char *nios2_sys_nosys_string; /* for -msys=nosys */
1.6880 -+extern const char *nios2_sys_lib_string; /* for -msys-lib= */
1.6881 -+extern const char *nios2_sys_crt0_string; /* for -msys-crt0= */
1.6882 -+
1.6883 -+#define TARGET_OPTIONS \
1.6884 -+{ \
1.6885 -+ { "sys=nosys", &nios2_sys_nosys_string, \
1.6886 -+ N_("Use stub versions of OS library calls (default)"), 0}, \
1.6887 -+ { "sys-lib=", &nios2_sys_lib_string, \
1.6888 -+ N_("Name of System Library to link against. (Converted to a -l option)"), 0}, \
1.6889 -+ { "sys-crt0=", &nios2_sys_crt0_string, \
1.6890 -+ N_("Name of the startfile. (default is a crt0 for the ISS only)"), 0}, \
1.6891 -+}
1.6892 -+
1.6893 -+
1.6894 -+/* Default target_flags if no switches specified. */
1.6895 -+#ifndef TARGET_DEFAULT
1.6896 -+# define TARGET_DEFAULT (HAS_MUL_FLAG | CACHE_VOLATILE_FLAG)
1.6897 -+#endif
1.6898 -+
1.6899 -+/* Switch Recognition by gcc.c. Add -G xx support */
1.6900 -+#undef SWITCH_TAKES_ARG
1.6901 -+#define SWITCH_TAKES_ARG(CHAR) \
1.6902 -+ (DEFAULT_SWITCH_TAKES_ARG (CHAR) || (CHAR) == 'G')
1.6903 -+
1.6904 -+#define OVERRIDE_OPTIONS override_options ()
1.6905 -+#define OPTIMIZATION_OPTIONS(LEVEL, SIZE) optimization_options (LEVEL, SIZE)
1.6906 -+#define CAN_DEBUG_WITHOUT_FP
1.6907 -+
1.6908 -+#define CC1_SPEC "\
1.6909 -+%{G*}"
1.6910 -+
1.6911 -+#undef LIB_SPEC
1.6912 -+#define LIB_SPEC \
1.6913 -+"--start-group %{msmallc: -lsmallc} %{!msmallc: -lc} -lgcc \
1.6914 -+ %{msys-lib=*: -l%*} \
1.6915 -+ %{!msys-lib=*: -lc } \
1.6916 -+ --end-group \
1.6917 -+ %{msys-lib=: %eYou need a library name for -msys-lib=} \
1.6918 -+"
1.6919 -+
1.6920 -+
1.6921 -+#undef STARTFILE_SPEC
1.6922 -+#define STARTFILE_SPEC \
1.6923 -+"%{msys-crt0=*: %*} %{!msys-crt0=*: crt1%O%s} \
1.6924 -+ %{msys-crt0=: %eYou need a C startup file for -msys-crt0=} \
1.6925 -+ %{mctors-in-init: crti%O%s crtbegin%O%s} \
1.6926 -+"
1.6927 -+
1.6928 -+#undef ENDFILE_SPEC
1.6929 -+#define ENDFILE_SPEC \
1.6930 -+ "%{mctors-in-init: crtend%O%s crtn%O%s}"
1.6931 -+
1.6932 -+
1.6933 -+/***********************
1.6934 -+ * Storage Layout
1.6935 -+ ***********************/
1.6936 -+
1.6937 -+#define DEFAULT_SIGNED_CHAR 1
1.6938 -+#define BITS_BIG_ENDIAN 0
1.6939 -+#define BYTES_BIG_ENDIAN 0
1.6940 -+#define WORDS_BIG_ENDIAN 0
1.6941 -+#define BITS_PER_UNIT 8
1.6942 -+#define BITS_PER_WORD 32
1.6943 -+#define UNITS_PER_WORD 4
1.6944 -+#define POINTER_SIZE 32
1.6945 -+#define BIGGEST_ALIGNMENT 32
1.6946 -+#define STRICT_ALIGNMENT 1
1.6947 -+#define FUNCTION_BOUNDARY 32
1.6948 -+#define PARM_BOUNDARY 32
1.6949 -+#define STACK_BOUNDARY 32
1.6950 -+#define PREFERRED_STACK_BOUNDARY 32
1.6951 -+#define MAX_FIXED_MODE_SIZE 64
1.6952 -+
1.6953 -+#define CONSTANT_ALIGNMENT(EXP, ALIGN) \
1.6954 -+ ((TREE_CODE (EXP) == STRING_CST) \
1.6955 -+ && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
1.6956 -+
1.6957 -+
1.6958 -+/**********************
1.6959 -+ * Layout of Source Language Data Types
1.6960 -+ **********************/
1.6961 -+
1.6962 -+#define INT_TYPE_SIZE 32
1.6963 -+#define SHORT_TYPE_SIZE 16
1.6964 -+#define LONG_TYPE_SIZE 32
1.6965 -+#define LONG_LONG_TYPE_SIZE 64
1.6966 -+#define FLOAT_TYPE_SIZE 32
1.6967 -+#define DOUBLE_TYPE_SIZE 64
1.6968 -+#define LONG_DOUBLE_TYPE_SIZE DOUBLE_TYPE_SIZE
1.6969 -+
1.6970 -+
1.6971 -+/*************************
1.6972 -+ * Condition Code Status
1.6973 -+ ************************/
1.6974 -+
1.6975 -+/* comparison type */
1.6976 -+/* ??? currently only CMP_SI is used */
1.6977 -+enum cmp_type {
1.6978 -+ CMP_SI, /* compare four byte integers */
1.6979 -+ CMP_DI, /* compare eight byte integers */
1.6980 -+ CMP_SF, /* compare single precision floats */
1.6981 -+ CMP_DF, /* compare double precision floats */
1.6982 -+ CMP_MAX /* max comparison type */
1.6983 -+};
1.6984 -+
1.6985 -+extern GTY(()) rtx branch_cmp[2]; /* operands for compare */
1.6986 -+extern enum cmp_type branch_type; /* what type of branch to use */
1.6987 -+
1.6988 -+/**********************
1.6989 -+ * Register Usage
1.6990 -+ **********************/
1.6991 -+
1.6992 -+/* ---------------------------------- *
1.6993 -+ * Basic Characteristics of Registers
1.6994 -+ * ---------------------------------- */
1.6995 -+
1.6996 -+/*
1.6997 -+Register Number
1.6998 -+ Register Name
1.6999 -+ Alternate Name
1.7000 -+ Purpose
1.7001 -+0 r0 zero always zero
1.7002 -+1 r1 at Assembler Temporary
1.7003 -+2-3 r2-r3 Return Location
1.7004 -+4-7 r4-r7 Register Arguments
1.7005 -+8-15 r8-r15 Caller Saved Registers
1.7006 -+16-22 r16-r22 Callee Saved Registers
1.7007 -+23 r23 sc Static Chain (Callee Saved)
1.7008 -+ ??? Does $sc want to be caller or callee
1.7009 -+ saved. If caller, 15, else 23.
1.7010 -+24 r24 Exception Temporary
1.7011 -+25 r25 Breakpoint Temporary
1.7012 -+26 r26 gp Global Pointer
1.7013 -+27 r27 sp Stack Pointer
1.7014 -+28 r28 fp Frame Pointer
1.7015 -+29 r29 ea Exception Return Address
1.7016 -+30 r30 ba Breakpoint Return Address
1.7017 -+31 r31 ra Return Address
1.7018 -+
1.7019 -+32 ctl0 status
1.7020 -+33 ctl1 estatus STATUS saved by exception ?
1.7021 -+34 ctl2 bstatus STATUS saved by break ?
1.7022 -+35 ctl3 ipri Interrupt Priority Mask ?
1.7023 -+36 ctl4 ecause Exception Cause ?
1.7024 -+
1.7025 -+37 pc Not an actual register
1.7026 -+
1.7027 -+38 rap Return address pointer, this does not
1.7028 -+ actually exist and will be eliminated
1.7029 -+
1.7030 -+39 fake_fp Fake Frame Pointer which will always be eliminated.
1.7031 -+40 fake_ap Fake Argument Pointer which will always be eliminated.
1.7032 -+
1.7033 -+41 First Pseudo Register
1.7034 -+
1.7035 -+
1.7036 -+The definitions for all the hard register numbers
1.7037 -+are located in nios2.md.
1.7038 -+*/
1.7039 -+
1.7040 -+#define FIRST_PSEUDO_REGISTER 41
1.7041 -+#define NUM_ARG_REGS (LAST_ARG_REGNO - FIRST_ARG_REGNO + 1)
1.7042 -+
1.7043 -+
1.7044 -+
1.7045 -+/* also see CONDITIONAL_REGISTER_USAGE */
1.7046 -+#define FIXED_REGISTERS \
1.7047 -+ { \
1.7048 -+/* +0 1 2 3 4 5 6 7 8 9 */ \
1.7049 -+/* 0 */ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, \
1.7050 -+/* 10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
1.7051 -+/* 20 */ 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, \
1.7052 -+/* 30 */ 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, \
1.7053 -+/* 40 */ 1, \
1.7054 -+ }
1.7055 -+
1.7056 -+/* call used is the same as caller saved
1.7057 -+ + fixed regs + args + ret vals */
1.7058 -+#define CALL_USED_REGISTERS \
1.7059 -+ { \
1.7060 -+/* +0 1 2 3 4 5 6 7 8 9 */ \
1.7061 -+/* 0 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
1.7062 -+/* 10 */ 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, \
1.7063 -+/* 20 */ 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, \
1.7064 -+/* 30 */ 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, \
1.7065 -+/* 40 */ 1, \
1.7066 -+ }
1.7067 -+
1.7068 -+#define HARD_REGNO_NREGS(REGNO, MODE) \
1.7069 -+ ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) \
1.7070 -+ / UNITS_PER_WORD)
1.7071 -+
1.7072 -+/* --------------------------- *
1.7073 -+ * How Values Fit in Registers
1.7074 -+ * --------------------------- */
1.7075 -+
1.7076 -+#define HARD_REGNO_MODE_OK(REGNO, MODE) 1
1.7077 -+
1.7078 -+#define MODES_TIEABLE_P(MODE1, MODE2) 1
1.7079 -+
1.7080 -+
1.7081 -+/*************************
1.7082 -+ * Register Classes
1.7083 -+ *************************/
1.7084 -+
1.7085 -+enum reg_class
1.7086 -+{
1.7087 -+ NO_REGS,
1.7088 -+ ALL_REGS,
1.7089 -+ LIM_REG_CLASSES
1.7090 -+};
1.7091 -+
1.7092 -+#define N_REG_CLASSES (int) LIM_REG_CLASSES
1.7093 -+
1.7094 -+#define REG_CLASS_NAMES \
1.7095 -+ {"NO_REGS", \
1.7096 -+ "ALL_REGS"}
1.7097 -+
1.7098 -+#define GENERAL_REGS ALL_REGS
1.7099 -+
1.7100 -+#define REG_CLASS_CONTENTS \
1.7101 -+/* NO_REGS */ {{ 0, 0}, \
1.7102 -+/* ALL_REGS */ {~0,~0}} \
1.7103 -+
1.7104 -+#define REGNO_REG_CLASS(REGNO) ALL_REGS
1.7105 -+
1.7106 -+#define BASE_REG_CLASS ALL_REGS
1.7107 -+#define INDEX_REG_CLASS ALL_REGS
1.7108 -+
1.7109 -+/* only one reg class, 'r', is handled automatically */
1.7110 -+#define REG_CLASS_FROM_LETTER(CHAR) NO_REGS
1.7111 -+
1.7112 -+#define REGNO_OK_FOR_BASE_P2(REGNO, STRICT) \
1.7113 -+ ((STRICT) \
1.7114 -+ ? (REGNO) < FIRST_PSEUDO_REGISTER \
1.7115 -+ : (REGNO) < FIRST_PSEUDO_REGISTER || (reg_renumber && reg_renumber[REGNO] < FIRST_PSEUDO_REGISTER))
1.7116 -+
1.7117 -+#define REGNO_OK_FOR_INDEX_P2(REGNO, STRICT) \
1.7118 -+ (REGNO_OK_FOR_BASE_P2 (REGNO, STRICT))
1.7119 -+
1.7120 -+#define REGNO_OK_FOR_BASE_P(REGNO) \
1.7121 -+ (REGNO_OK_FOR_BASE_P2 (REGNO, 1))
1.7122 -+
1.7123 -+#define REGNO_OK_FOR_INDEX_P(REGNO) \
1.7124 -+ (REGNO_OK_FOR_INDEX_P2 (REGNO, 1))
1.7125 -+
1.7126 -+#define REG_OK_FOR_BASE_P2(X, STRICT) \
1.7127 -+ (STRICT \
1.7128 -+ ? REGNO_OK_FOR_BASE_P2 (REGNO (X), 1) \
1.7129 -+ : REGNO_OK_FOR_BASE_P2 (REGNO (X), 1) || REGNO(X) >= FIRST_PSEUDO_REGISTER)
1.7130 -+
1.7131 -+#define REG_OK_FOR_INDEX_P2(X, STRICT) \
1.7132 -+ (STRICT \
1.7133 -+ ? REGNO_OK_FOR_INDEX_P2 (REGNO (X), 1) \
1.7134 -+ : REGNO_OK_FOR_INDEX_P2 (REGNO (X), 1) || REGNO(X) >= FIRST_PSEUDO_REGISTER)
1.7135 -+
1.7136 -+#define CLASS_MAX_NREGS(CLASS, MODE) \
1.7137 -+ ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) \
1.7138 -+ / UNITS_PER_WORD)
1.7139 -+
1.7140 -+
1.7141 -+#define SMALL_INT(X) ((unsigned HOST_WIDE_INT) ((X) + 0x8000) < 0x10000)
1.7142 -+#define SMALL_INT_UNSIGNED(X) ((unsigned HOST_WIDE_INT) (X) < 0x10000)
1.7143 -+#define UPPER16_INT(X) (((X) & 0xffff) == 0)
1.7144 -+#define SHIFT_INT(X) ((X) >= 0 && (X) <= 31)
1.7145 -+#define RDWRCTL_INT(X) ((X) >= 0 && (X) <= 31)
1.7146 -+#define CUSTOM_INSN_OPCODE(X) ((X) >= 0 && (X) <= 255)
1.7147 -+
1.7148 -+#define CONST_OK_FOR_LETTER_P(VALUE, C) \
1.7149 -+ ( \
1.7150 -+ (C) == 'I' ? SMALL_INT (VALUE) : \
1.7151 -+ (C) == 'J' ? SMALL_INT_UNSIGNED (VALUE) : \
1.7152 -+ (C) == 'K' ? UPPER16_INT (VALUE) : \
1.7153 -+ (C) == 'L' ? SHIFT_INT (VALUE) : \
1.7154 -+ (C) == 'M' ? (VALUE) == 0 : \
1.7155 -+ (C) == 'N' ? CUSTOM_INSN_OPCODE (VALUE) : \
1.7156 -+ (C) == 'O' ? RDWRCTL_INT (VALUE) : \
1.7157 -+ 0)
1.7158 -+
1.7159 -+#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) 0
1.7160 -+
1.7161 -+#define PREFERRED_RELOAD_CLASS(X, CLASS) \
1.7162 -+ ((CLASS) == NO_REGS ? GENERAL_REGS : (CLASS))
1.7163 -+
1.7164 -+/* 'S' matches immediates which are in small data
1.7165 -+ and therefore can be added to gp to create a
1.7166 -+ 32-bit value. */
1.7167 -+#define EXTRA_CONSTRAINT(VALUE, C) \
1.7168 -+ ((C) == 'S' \
1.7169 -+ && (GET_CODE (VALUE) == SYMBOL_REF) \
1.7170 -+ && SYMBOL_REF_IN_NIOS2_SMALL_DATA_P (VALUE))
1.7171 -+
1.7172 -+
1.7173 -+
1.7174 -+
1.7175 -+/* Say that the epilogue uses the return address register. Note that
1.7176 -+ in the case of sibcalls, the values "used by the epilogue" are
1.7177 -+ considered live at the start of the called function. */
1.7178 -+#define EPILOGUE_USES(REGNO) ((REGNO) == RA_REGNO)
1.7179 -+
1.7180 -+
1.7181 -+#define DEFAULT_MAIN_RETURN c_expand_return (integer_zero_node)
1.7182 -+
1.7183 -+/**********************************
1.7184 -+ * Trampolines for Nested Functions
1.7185 -+ ***********************************/
1.7186 -+
1.7187 -+#define TRAMPOLINE_TEMPLATE(FILE) \
1.7188 -+ error ("trampolines not yet implemented")
1.7189 -+#define TRAMPOLINE_SIZE 20
1.7190 -+#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
1.7191 -+ error ("trampolines not yet implemented")
1.7192 -+
1.7193 -+/***************************
1.7194 -+ * Stack Layout and Calling Conventions
1.7195 -+ ***************************/
1.7196 -+
1.7197 -+/* ------------------ *
1.7198 -+ * Basic Stack Layout
1.7199 -+ * ------------------ */
1.7200 -+
1.7201 -+/* The downward variants are used by the compiler,
1.7202 -+ the upward ones serve as documentation */
1.7203 -+#define STACK_GROWS_DOWNWARD
1.7204 -+#define FRAME_GROWS_UPWARD
1.7205 -+#define ARGS_GROW_UPWARD
1.7206 -+
1.7207 -+#define STARTING_FRAME_OFFSET current_function_outgoing_args_size
1.7208 -+#define FIRST_PARM_OFFSET(FUNDECL) 0
1.7209 -+
1.7210 -+/* Before the prologue, RA lives in r31. */
1.7211 -+#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (VOIDmode, RA_REGNO)
1.7212 -+
1.7213 -+/* -------------------------------------- *
1.7214 -+ * Registers That Address the Stack Frame
1.7215 -+ * -------------------------------------- */
1.7216 -+
1.7217 -+#define STACK_POINTER_REGNUM SP_REGNO
1.7218 -+#define STATIC_CHAIN_REGNUM SC_REGNO
1.7219 -+#define PC_REGNUM PC_REGNO
1.7220 -+#define DWARF_FRAME_RETURN_COLUMN RA_REGNO
1.7221 -+
1.7222 -+/* Base register for access to local variables of the function. We
1.7223 -+ pretend that the frame pointer is a non-existent hard register, and
1.7224 -+ then eliminate it to HARD_FRAME_POINTER_REGNUM. */
1.7225 -+#define FRAME_POINTER_REGNUM FAKE_FP_REGNO
1.7226 -+
1.7227 -+#define HARD_FRAME_POINTER_REGNUM FP_REGNO
1.7228 -+#define RETURN_ADDRESS_POINTER_REGNUM RAP_REGNO
1.7229 -+/* the argumnet pointer needs to always be eliminated
1.7230 -+ so it is set to a fake hard register. */
1.7231 -+#define ARG_POINTER_REGNUM FAKE_AP_REGNO
1.7232 -+
1.7233 -+/* ----------------------------------------- *
1.7234 -+ * Eliminating Frame Pointer and Arg Pointer
1.7235 -+ * ----------------------------------------- */
1.7236 -+
1.7237 -+#define FRAME_POINTER_REQUIRED 0
1.7238 -+
1.7239 -+#define ELIMINABLE_REGS \
1.7240 -+{{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
1.7241 -+ { ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \
1.7242 -+ { RETURN_ADDRESS_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
1.7243 -+ { RETURN_ADDRESS_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \
1.7244 -+ { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
1.7245 -+ { FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}}
1.7246 -+
1.7247 -+#define CAN_ELIMINATE(FROM, TO) 1
1.7248 -+
1.7249 -+#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
1.7250 -+ (OFFSET) = nios2_initial_elimination_offset ((FROM), (TO))
1.7251 -+
1.7252 -+#define MUST_SAVE_REGISTER(regno) \
1.7253 -+ ((regs_ever_live[regno] && !call_used_regs[regno]) \
1.7254 -+ || (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed) \
1.7255 -+ || (regno == RA_REGNO && regs_ever_live[RA_REGNO]))
1.7256 -+
1.7257 -+/* Treat LOC as a byte offset from the stack pointer and round it up
1.7258 -+ to the next fully-aligned offset. */
1.7259 -+#define STACK_ALIGN(LOC) \
1.7260 -+ (((LOC) + ((PREFERRED_STACK_BOUNDARY / 8) - 1)) & ~((PREFERRED_STACK_BOUNDARY / 8) - 1))
1.7261 -+
1.7262 -+
1.7263 -+/* ------------------------------ *
1.7264 -+ * Passing Arguments in Registers
1.7265 -+ * ------------------------------ */
1.7266 -+
1.7267 -+/* see nios2.c */
1.7268 -+#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
1.7269 -+ (function_arg (&CUM, MODE, TYPE, NAMED))
1.7270 -+
1.7271 -+#define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) \
1.7272 -+ (function_arg_partial_nregs (&CUM, MODE, TYPE, NAMED))
1.7273 -+
1.7274 -+#define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) 0
1.7275 -+
1.7276 -+#define FUNCTION_ARG_CALLEE_COPIES(CUM, MODE, TYPE, NAMED) 0
1.7277 -+
1.7278 -+typedef struct nios2_args
1.7279 -+{
1.7280 -+ int regs_used;
1.7281 -+} CUMULATIVE_ARGS;
1.7282 -+
1.7283 -+/* This is to initialize the above unused CUM data type */
1.7284 -+#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \
1.7285 -+ (init_cumulative_args (&CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS))
1.7286 -+
1.7287 -+#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
1.7288 -+ (function_arg_advance (&CUM, MODE, TYPE, NAMED))
1.7289 -+
1.7290 -+#define FUNCTION_ARG_REGNO_P(REGNO) \
1.7291 -+ ((REGNO) >= FIRST_ARG_REGNO && (REGNO) <= LAST_ARG_REGNO)
1.7292 -+
1.7293 -+#define SETUP_INCOMING_VARARGS(CUM,MODE,TYPE,PRETEND_SIZE,NO_RTL) \
1.7294 -+ { \
1.7295 -+ int pret_size = nios2_setup_incoming_varargs (&(CUM), (MODE), \
1.7296 -+ (TYPE), (NO_RTL)); \
1.7297 -+ if (pret_size) \
1.7298 -+ (PRETEND_SIZE) = pret_size; \
1.7299 -+ }
1.7300 -+
1.7301 -+/* ----------------------------- *
1.7302 -+ * Generating Code for Profiling
1.7303 -+ * ----------------------------- */
1.7304 -+
1.7305 -+#define PROFILE_BEFORE_PROLOGUE
1.7306 -+
1.7307 -+#define FUNCTION_PROFILER(FILE, LABELNO) \
1.7308 -+ function_profiler ((FILE), (LABELNO))
1.7309 -+
1.7310 -+/* --------------------------------------- *
1.7311 -+ * Passing Function Arguments on the Stack
1.7312 -+ * --------------------------------------- */
1.7313 -+
1.7314 -+#define PROMOTE_PROTOTYPES 1
1.7315 -+
1.7316 -+#define PUSH_ARGS 0
1.7317 -+#define ACCUMULATE_OUTGOING_ARGS 1
1.7318 -+
1.7319 -+#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACKSIZE) 0
1.7320 -+
1.7321 -+/* --------------------------------------- *
1.7322 -+ * How Scalar Function Values Are Returned
1.7323 -+ * --------------------------------------- */
1.7324 -+
1.7325 -+#define FUNCTION_VALUE(VALTYPE, FUNC) \
1.7326 -+ gen_rtx(REG, TYPE_MODE(VALTYPE), FIRST_RETVAL_REGNO)
1.7327 -+
1.7328 -+#define LIBCALL_VALUE(MODE) \
1.7329 -+ gen_rtx(REG, MODE, FIRST_RETVAL_REGNO)
1.7330 -+
1.7331 -+#define FUNCTION_VALUE_REGNO_P(REGNO) ((REGNO) == FIRST_RETVAL_REGNO)
1.7332 -+
1.7333 -+/* ----------------------------- *
1.7334 -+ * How Large Values Are Returned
1.7335 -+ * ----------------------------- */
1.7336 -+
1.7337 -+
1.7338 -+#define RETURN_IN_MEMORY(TYPE) \
1.7339 -+ nios2_return_in_memory (TYPE)
1.7340 -+
1.7341 -+
1.7342 -+#define STRUCT_VALUE 0
1.7343 -+
1.7344 -+#define DEFAULT_PCC_STRUCT_RETURN 0
1.7345 -+
1.7346 -+/*******************
1.7347 -+ * Addressing Modes
1.7348 -+ *******************/
1.7349 -+
1.7350 -+
1.7351 -+#define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN)
1.7352 -+
1.7353 -+#define CONSTANT_ADDRESS_P(X) (CONSTANT_P (X))
1.7354 -+
1.7355 -+#define MAX_REGS_PER_ADDRESS 1
1.7356 -+
1.7357 -+/* Go to ADDR if X is a valid address. */
1.7358 -+#ifndef REG_OK_STRICT
1.7359 -+#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
1.7360 -+ { \
1.7361 -+ if (nios2_legitimate_address ((X), (MODE), 0)) \
1.7362 -+ goto ADDR; \
1.7363 -+ }
1.7364 -+#else
1.7365 -+#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
1.7366 -+ { \
1.7367 -+ if (nios2_legitimate_address ((X), (MODE), 1)) \
1.7368 -+ goto ADDR; \
1.7369 -+ }
1.7370 -+#endif
1.7371 -+
1.7372 -+#ifndef REG_OK_STRICT
1.7373 -+#define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P2 (REGNO (X), 0)
1.7374 -+#define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P2 (REGNO (X), 0)
1.7375 -+#else
1.7376 -+#define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P2 (REGNO (X), 1)
1.7377 -+#define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P2 (REGNO (X), 1)
1.7378 -+#endif
1.7379 -+
1.7380 -+#define LEGITIMATE_CONSTANT_P(X) 1
1.7381 -+
1.7382 -+/* Nios II has no mode dependent addresses. */
1.7383 -+#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)
1.7384 -+
1.7385 -+/* Set if this has a weak declaration */
1.7386 -+#define SYMBOL_FLAG_WEAK_DECL (1 << SYMBOL_FLAG_MACH_DEP_SHIFT)
1.7387 -+#define SYMBOL_REF_WEAK_DECL_P(RTX) \
1.7388 -+ ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_WEAK_DECL) != 0)
1.7389 -+
1.7390 -+
1.7391 -+/* true if a symbol is both small and not weak. In this case, gp
1.7392 -+ relative access can be used */
1.7393 -+#define SYMBOL_REF_IN_NIOS2_SMALL_DATA_P(RTX) \
1.7394 -+ (SYMBOL_REF_SMALL_P(RTX) && !SYMBOL_REF_WEAK_DECL_P(RTX))
1.7395 -+
1.7396 -+/*****************
1.7397 -+ * Describing Relative Costs of Operations
1.7398 -+ *****************/
1.7399 -+
1.7400 -+#define SLOW_BYTE_ACCESS 1
1.7401 -+
1.7402 -+/* It is as good to call a constant function address as to call an address
1.7403 -+ kept in a register.
1.7404 -+ ??? Not true anymore really. Now that call cannot address full range
1.7405 -+ of memory callr may need to be used */
1.7406 -+
1.7407 -+#define NO_FUNCTION_CSE
1.7408 -+#define NO_RECURSIVE_FUNCTION_CSE
1.7409 -+
1.7410 -+
1.7411 -+
1.7412 -+/*****************************************
1.7413 -+ * Defining the Output Assembler Language
1.7414 -+ *****************************************/
1.7415 -+
1.7416 -+/* ------------------------------------------ *
1.7417 -+ * The Overall Framework of an Assembler File
1.7418 -+ * ------------------------------------------ */
1.7419 -+
1.7420 -+#define ASM_APP_ON "#APP\n"
1.7421 -+#define ASM_APP_OFF "#NO_APP\n"
1.7422 -+
1.7423 -+#define ASM_COMMENT_START "# "
1.7424 -+
1.7425 -+/* ------------------------------- *
1.7426 -+ * Output and Generation of Labels
1.7427 -+ * ------------------------------- */
1.7428 -+
1.7429 -+#define GLOBAL_ASM_OP "\t.global\t"
1.7430 -+
1.7431 -+
1.7432 -+/* -------------- *
1.7433 -+ * Output of Data
1.7434 -+ * -------------- */
1.7435 -+
1.7436 -+#define DWARF2_UNWIND_INFO 0
1.7437 -+
1.7438 -+
1.7439 -+/* -------------------------------- *
1.7440 -+ * Assembler Commands for Alignment
1.7441 -+ * -------------------------------- */
1.7442 -+
1.7443 -+#define ASM_OUTPUT_ALIGN(FILE, LOG) \
1.7444 -+ do { \
1.7445 -+ fprintf ((FILE), "%s%d\n", ALIGN_ASM_OP, (LOG)); \
1.7446 -+ } while (0)
1.7447 -+
1.7448 -+
1.7449 -+/* -------------------------------- *
1.7450 -+ * Output of Assembler Instructions
1.7451 -+ * -------------------------------- */
1.7452 -+
1.7453 -+#define REGISTER_NAMES \
1.7454 -+{ \
1.7455 -+ "zero", \
1.7456 -+ "at", \
1.7457 -+ "r2", \
1.7458 -+ "r3", \
1.7459 -+ "r4", \
1.7460 -+ "r5", \
1.7461 -+ "r6", \
1.7462 -+ "r7", \
1.7463 -+ "r8", \
1.7464 -+ "r9", \
1.7465 -+ "r10", \
1.7466 -+ "r11", \
1.7467 -+ "r12", \
1.7468 -+ "r13", \
1.7469 -+ "r14", \
1.7470 -+ "r15", \
1.7471 -+ "r16", \
1.7472 -+ "r17", \
1.7473 -+ "r18", \
1.7474 -+ "r19", \
1.7475 -+ "r20", \
1.7476 -+ "r21", \
1.7477 -+ "r22", \
1.7478 -+ "r23", \
1.7479 -+ "r24", \
1.7480 -+ "r25", \
1.7481 -+ "gp", \
1.7482 -+ "sp", \
1.7483 -+ "fp", \
1.7484 -+ "ta", \
1.7485 -+ "ba", \
1.7486 -+ "ra", \
1.7487 -+ "status", \
1.7488 -+ "estatus", \
1.7489 -+ "bstatus", \
1.7490 -+ "ipri", \
1.7491 -+ "ecause", \
1.7492 -+ "pc", \
1.7493 -+ "rap", \
1.7494 -+ "fake_fp", \
1.7495 -+ "fake_ap", \
1.7496 -+}
1.7497 -+
1.7498 -+#define ASM_OUTPUT_OPCODE(STREAM, PTR)\
1.7499 -+ (PTR) = asm_output_opcode (STREAM, PTR)
1.7500 -+
1.7501 -+#define PRINT_OPERAND(STREAM, X, CODE) \
1.7502 -+ nios2_print_operand (STREAM, X, CODE)
1.7503 -+
1.7504 -+#define PRINT_OPERAND_ADDRESS(STREAM, X) \
1.7505 -+ nios2_print_operand_address (STREAM, X)
1.7506 -+
1.7507 -+#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
1.7508 -+do { fputs (integer_asm_op (POINTER_SIZE / BITS_PER_UNIT, TRUE), FILE); \
1.7509 -+ fprintf (FILE, ".L%u\n", (unsigned) (VALUE)); \
1.7510 -+ } while (0)
1.7511 -+
1.7512 -+
1.7513 -+/* ------------ *
1.7514 -+ * Label Output
1.7515 -+ * ------------ */
1.7516 -+
1.7517 -+
1.7518 -+/* ---------------------------------------------------- *
1.7519 -+ * Dividing the Output into Sections (Texts, Data, ...)
1.7520 -+ * ---------------------------------------------------- */
1.7521 -+
1.7522 -+/* Output before read-only data. */
1.7523 -+#define TEXT_SECTION_ASM_OP ("\t.section\t.text")
1.7524 -+
1.7525 -+/* Output before writable data. */
1.7526 -+#define DATA_SECTION_ASM_OP ("\t.section\t.data")
1.7527 -+
1.7528 -+
1.7529 -+/* Default the definition of "small data" to 8 bytes. */
1.7530 -+/* ??? How come I can't use HOST_WIDE_INT here? */
1.7531 -+extern unsigned long nios2_section_threshold;
1.7532 -+#define NIOS2_DEFAULT_GVALUE 8
1.7533 -+
1.7534 -+
1.7535 -+
1.7536 -+/* This says how to output assembler code to declare an
1.7537 -+ uninitialized external linkage data object. Under SVR4,
1.7538 -+ the linker seems to want the alignment of data objects
1.7539 -+ to depend on their types. We do exactly that here. */
1.7540 -+
1.7541 -+#undef COMMON_ASM_OP
1.7542 -+#define COMMON_ASM_OP "\t.comm\t"
1.7543 -+
1.7544 -+#undef ASM_OUTPUT_ALIGNED_COMMON
1.7545 -+#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
1.7546 -+do \
1.7547 -+{ \
1.7548 -+ if ((SIZE) <= nios2_section_threshold) \
1.7549 -+ { \
1.7550 -+ named_section (0, ".sbss", 0); \
1.7551 -+ (*targetm.asm_out.globalize_label) (FILE, NAME); \
1.7552 -+ ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \
1.7553 -+ if (!flag_inhibit_size_directive) \
1.7554 -+ ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE); \
1.7555 -+ ASM_OUTPUT_ALIGN ((FILE), exact_log2((ALIGN) / BITS_PER_UNIT)); \
1.7556 -+ ASM_OUTPUT_LABEL(FILE, NAME); \
1.7557 -+ ASM_OUTPUT_SKIP((FILE), (SIZE) ? (SIZE) : 1); \
1.7558 -+ } \
1.7559 -+ else \
1.7560 -+ { \
1.7561 -+ fprintf ((FILE), "%s", COMMON_ASM_OP); \
1.7562 -+ assemble_name ((FILE), (NAME)); \
1.7563 -+ fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \
1.7564 -+ } \
1.7565 -+} \
1.7566 -+while (0)
1.7567 -+
1.7568 -+
1.7569 -+/* This says how to output assembler code to declare an
1.7570 -+ uninitialized internal linkage data object. Under SVR4,
1.7571 -+ the linker seems to want the alignment of data objects
1.7572 -+ to depend on their types. We do exactly that here. */
1.7573 -+
1.7574 -+#undef ASM_OUTPUT_ALIGNED_LOCAL
1.7575 -+#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
1.7576 -+do { \
1.7577 -+ if ((SIZE) <= nios2_section_threshold) \
1.7578 -+ named_section (0, ".sbss", 0); \
1.7579 -+ else \
1.7580 -+ named_section (0, ".bss", 0); \
1.7581 -+ ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \
1.7582 -+ if (!flag_inhibit_size_directive) \
1.7583 -+ ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE); \
1.7584 -+ ASM_OUTPUT_ALIGN ((FILE), exact_log2((ALIGN) / BITS_PER_UNIT)); \
1.7585 -+ ASM_OUTPUT_LABEL(FILE, NAME); \
1.7586 -+ ASM_OUTPUT_SKIP((FILE), (SIZE) ? (SIZE) : 1); \
1.7587 -+} while (0)
1.7588 -+
1.7589 -+
1.7590 -+
1.7591 -+/***************************
1.7592 -+ * Miscellaneous Parameters
1.7593 -+ ***************************/
1.7594 -+
1.7595 -+#define MOVE_MAX 4
1.7596 -+
1.7597 -+#define Pmode SImode
1.7598 -+#define FUNCTION_MODE QImode
1.7599 -+
1.7600 -+#define CASE_VECTOR_MODE Pmode
1.7601 -+
1.7602 -+#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
1.7603 -+
1.7604 -+#define LOAD_EXTEND_OP(MODE) (ZERO_EXTEND)
1.7605 -+
1.7606 -+#define WORD_REGISTER_OPERATIONS
1.7607 -diff -durN gcc-3.4.6.orig/gcc/config/nios2/nios2.md gcc-3.4.6/gcc/config/nios2/nios2.md
1.7608 ---- gcc-3.4.6.orig/gcc/config/nios2/nios2.md 1970-01-01 01:00:00.000000000 +0100
1.7609 -+++ gcc-3.4.6/gcc/config/nios2/nios2.md 2007-08-15 23:09:36.000000000 +0200
1.7610 -@@ -0,0 +1,2078 @@
1.7611 -+;; Machine Description for Altera NIOS 2G NIOS2 version.
1.7612 -+;; Copyright (C) 2003 Altera
1.7613 -+;; Contributed by Jonah Graham (jgraham@altera.com).
1.7614 -+;;
1.7615 -+;; This file is part of GNU CC.
1.7616 -+;;
1.7617 -+;; GNU CC is free software; you can redistribute it and/or modify
1.7618 -+;; it under the terms of the GNU General Public License as published by
1.7619 -+;; the Free Software Foundation; either version 2, or (at your option)
1.7620 -+;; any later version.
1.7621 -+;;
1.7622 -+;; GNU CC is distributed in the hope that it will be useful,
1.7623 -+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
1.7624 -+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1.7625 -+;; GNU General Public License for more details.
1.7626 -+;;
1.7627 -+;; You should have received a copy of the GNU General Public License
1.7628 -+;; along with GNU CC; see the file COPYING. If not, write to
1.7629 -+;; the Free Software Foundation, 59 Temple Place - Suite 330,
1.7630 -+;; Boston, MA 02111-1307, USA. */
1.7631 -+
1.7632 -+
1.7633 -+
1.7634 -+;*****************************************************************************
1.7635 -+;*
1.7636 -+;* constants
1.7637 -+;*
1.7638 -+;*****************************************************************************
1.7639 -+(define_constants [
1.7640 -+ (GP_REGNO 26)
1.7641 -+ (SP_REGNO 27)
1.7642 -+ (FP_REGNO 28)
1.7643 -+ (RA_REGNO 31)
1.7644 -+ (RAP_REGNO 38)
1.7645 -+ (FIRST_RETVAL_REGNO 2)
1.7646 -+ (LAST_RETVAL_REGNO 3)
1.7647 -+ (FIRST_ARG_REGNO 4)
1.7648 -+ (LAST_ARG_REGNO 7)
1.7649 -+ (SC_REGNO 23)
1.7650 -+ (PC_REGNO 37)
1.7651 -+ (FAKE_FP_REGNO 39)
1.7652 -+ (FAKE_AP_REGNO 40)
1.7653 -+
1.7654 -+
1.7655 -+ (UNSPEC_BLOCKAGE 0)
1.7656 -+ (UNSPEC_LDBIO 1)
1.7657 -+ (UNSPEC_LDBUIO 2)
1.7658 -+ (UNSPEC_LDHIO 3)
1.7659 -+ (UNSPEC_LDHUIO 4)
1.7660 -+ (UNSPEC_LDWIO 5)
1.7661 -+ (UNSPEC_STBIO 6)
1.7662 -+ (UNSPEC_STHIO 7)
1.7663 -+ (UNSPEC_STWIO 8)
1.7664 -+ (UNSPEC_SYNC 9)
1.7665 -+ (UNSPEC_WRCTL 10)
1.7666 -+ (UNSPEC_RDCTL 11)
1.7667 -+
1.7668 -+])
1.7669 -+
1.7670 -+
1.7671 -+
1.7672 -+;*****************************************************************************
1.7673 -+;*
1.7674 -+;* instruction scheduler
1.7675 -+;*
1.7676 -+;*****************************************************************************
1.7677 -+
1.7678 -+; No schedule info is currently available, using an assumption that no
1.7679 -+; instruction can use the results of the previous instruction without
1.7680 -+; incuring a stall.
1.7681 -+
1.7682 -+; length of an instruction (in bytes)
1.7683 -+(define_attr "length" "" (const_int 4))
1.7684 -+(define_attr "type" "unknown,complex,control,alu,cond_alu,st,ld,shift,mul,div,custom" (const_string "complex"))
1.7685 -+
1.7686 -+(define_asm_attributes
1.7687 -+ [(set_attr "length" "4")
1.7688 -+ (set_attr "type" "complex")])
1.7689 -+
1.7690 -+(define_automaton "nios2")
1.7691 -+(automata_option "v")
1.7692 -+;(automata_option "no-minimization")
1.7693 -+(automata_option "ndfa")
1.7694 -+
1.7695 -+; The nios2 pipeline is fairly straightforward for the fast model.
1.7696 -+; Every alu operation is pipelined so that an instruction can
1.7697 -+; be issued every cycle. However, there are still potential
1.7698 -+; stalls which this description tries to deal with.
1.7699 -+
1.7700 -+(define_cpu_unit "cpu" "nios2")
1.7701 -+
1.7702 -+(define_insn_reservation "complex" 1
1.7703 -+ (eq_attr "type" "complex")
1.7704 -+ "cpu")
1.7705 -+
1.7706 -+(define_insn_reservation "control" 1
1.7707 -+ (eq_attr "type" "control")
1.7708 -+ "cpu")
1.7709 -+
1.7710 -+(define_insn_reservation "alu" 1
1.7711 -+ (eq_attr "type" "alu")
1.7712 -+ "cpu")
1.7713 -+
1.7714 -+(define_insn_reservation "cond_alu" 1
1.7715 -+ (eq_attr "type" "cond_alu")
1.7716 -+ "cpu")
1.7717 -+
1.7718 -+(define_insn_reservation "st" 1
1.7719 -+ (eq_attr "type" "st")
1.7720 -+ "cpu")
1.7721 -+
1.7722 -+(define_insn_reservation "custom" 1
1.7723 -+ (eq_attr "type" "custom")
1.7724 -+ "cpu")
1.7725 -+
1.7726 -+; shifts, muls and lds have three cycle latency
1.7727 -+(define_insn_reservation "ld" 3
1.7728 -+ (eq_attr "type" "ld")
1.7729 -+ "cpu")
1.7730 -+
1.7731 -+(define_insn_reservation "shift" 3
1.7732 -+ (eq_attr "type" "shift")
1.7733 -+ "cpu")
1.7734 -+
1.7735 -+(define_insn_reservation "mul" 3
1.7736 -+ (eq_attr "type" "mul")
1.7737 -+ "cpu")
1.7738 -+
1.7739 -+(define_insn_reservation "div" 1
1.7740 -+ (eq_attr "type" "div")
1.7741 -+ "cpu")
1.7742 -+
1.7743 -+
1.7744 -+;*****************************************************************************
1.7745 -+;*
1.7746 -+;* MOV Instructions
1.7747 -+;*
1.7748 -+;*****************************************************************************
1.7749 -+
1.7750 -+(define_expand "movqi"
1.7751 -+ [(set (match_operand:QI 0 "nonimmediate_operand" "")
1.7752 -+ (match_operand:QI 1 "general_operand" ""))]
1.7753 -+ ""
1.7754 -+{
1.7755 -+ if (nios2_emit_move_sequence (operands, QImode))
1.7756 -+ DONE;
1.7757 -+})
1.7758 -+
1.7759 -+(define_insn "movqi_internal"
1.7760 -+ [(set (match_operand:QI 0 "nonimmediate_operand" "=m, r,r, r")
1.7761 -+ (match_operand:QI 1 "general_operand" "rM,m,rM,I"))]
1.7762 -+ "(register_operand (operands[0], QImode)
1.7763 -+ || register_operand (operands[1], QImode)
1.7764 -+ || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
1.7765 -+ "@
1.7766 -+ stb%o0\\t%z1, %0
1.7767 -+ ldbu%o1\\t%0, %1
1.7768 -+ mov\\t%0, %z1
1.7769 -+ movi\\t%0, %1"
1.7770 -+ [(set_attr "type" "st,ld,alu,alu")])
1.7771 -+
1.7772 -+(define_insn "ldbio"
1.7773 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.7774 -+ (unspec_volatile:SI [(const_int 0)] UNSPEC_LDBIO))
1.7775 -+ (use (match_operand:SI 1 "memory_operand" "m"))]
1.7776 -+ ""
1.7777 -+ "ldbio\\t%0, %1"
1.7778 -+ [(set_attr "type" "ld")])
1.7779 -+
1.7780 -+(define_insn "ldbuio"
1.7781 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.7782 -+ (unspec_volatile:SI [(const_int 0)] UNSPEC_LDBUIO))
1.7783 -+ (use (match_operand:SI 1 "memory_operand" "m"))]
1.7784 -+ ""
1.7785 -+ "ldbuio\\t%0, %1"
1.7786 -+ [(set_attr "type" "ld")])
1.7787 -+
1.7788 -+(define_insn "stbio"
1.7789 -+ [(set (match_operand:SI 0 "memory_operand" "=m")
1.7790 -+ (match_operand:SI 1 "register_operand" "r"))
1.7791 -+ (unspec_volatile:SI [(const_int 0)] UNSPEC_STBIO)]
1.7792 -+ ""
1.7793 -+ "stbio\\t%z1, %0"
1.7794 -+ [(set_attr "type" "st")])
1.7795 -+
1.7796 -+
1.7797 -+(define_expand "movhi"
1.7798 -+ [(set (match_operand:HI 0 "nonimmediate_operand" "")
1.7799 -+ (match_operand:HI 1 "general_operand" ""))]
1.7800 -+ ""
1.7801 -+{
1.7802 -+ if (nios2_emit_move_sequence (operands, HImode))
1.7803 -+ DONE;
1.7804 -+})
1.7805 -+
1.7806 -+(define_insn "movhi_internal"
1.7807 -+ [(set (match_operand:HI 0 "nonimmediate_operand" "=m, r,r, r,r")
1.7808 -+ (match_operand:HI 1 "general_operand" "rM,m,rM,I,J"))]
1.7809 -+ "(register_operand (operands[0], HImode)
1.7810 -+ || register_operand (operands[1], HImode)
1.7811 -+ || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
1.7812 -+ "@
1.7813 -+ sth%o0\\t%z1, %0
1.7814 -+ ldhu%o1\\t%0, %1
1.7815 -+ mov\\t%0, %z1
1.7816 -+ movi\\t%0, %1
1.7817 -+ movui\\t%0, %1"
1.7818 -+ [(set_attr "type" "st,ld,alu,alu,alu")])
1.7819 -+
1.7820 -+(define_insn "ldhio"
1.7821 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.7822 -+ (unspec_volatile:SI [(const_int 0)] UNSPEC_LDHIO))
1.7823 -+ (use (match_operand:SI 1 "memory_operand" "m"))]
1.7824 -+ ""
1.7825 -+ "ldhio\\t%0, %1"
1.7826 -+ [(set_attr "type" "ld")])
1.7827 -+
1.7828 -+(define_insn "ldhuio"
1.7829 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.7830 -+ (unspec_volatile:SI [(const_int 0)] UNSPEC_LDHUIO))
1.7831 -+ (use (match_operand:SI 1 "memory_operand" "m"))]
1.7832 -+ ""
1.7833 -+ "ldhuio\\t%0, %1"
1.7834 -+ [(set_attr "type" "ld")])
1.7835 -+
1.7836 -+(define_insn "sthio"
1.7837 -+ [(set (match_operand:SI 0 "memory_operand" "=m")
1.7838 -+ (match_operand:SI 1 "register_operand" "r"))
1.7839 -+ (unspec_volatile:SI [(const_int 0)] UNSPEC_STHIO)]
1.7840 -+ ""
1.7841 -+ "sthio\\t%z1, %0"
1.7842 -+ [(set_attr "type" "st")])
1.7843 -+
1.7844 -+(define_expand "movsi"
1.7845 -+ [(set (match_operand:SI 0 "nonimmediate_operand" "")
1.7846 -+ (match_operand:SI 1 "general_operand" ""))]
1.7847 -+ ""
1.7848 -+{
1.7849 -+ if (nios2_emit_move_sequence (operands, SImode))
1.7850 -+ DONE;
1.7851 -+})
1.7852 -+
1.7853 -+(define_insn "movsi_internal"
1.7854 -+ [(set (match_operand:SI 0 "nonimmediate_operand" "=m, r,r, r,r,r,r")
1.7855 -+ (match_operand:SI 1 "general_operand" "rM,m,rM,I,J,S,i"))]
1.7856 -+ "(register_operand (operands[0], SImode)
1.7857 -+ || register_operand (operands[1], SImode)
1.7858 -+ || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
1.7859 -+ "@
1.7860 -+ stw%o0\\t%z1, %0
1.7861 -+ ldw%o1\\t%0, %1
1.7862 -+ mov\\t%0, %z1
1.7863 -+ movi\\t%0, %1
1.7864 -+ movui\\t%0, %1
1.7865 -+ addi\\t%0, gp, %%gprel(%1)
1.7866 -+ movhi\\t%0, %H1\;addi\\t%0, %0, %L1"
1.7867 -+ [(set_attr "type" "st,ld,alu,alu,alu,alu,alu")])
1.7868 -+
1.7869 -+(define_insn "ldwio"
1.7870 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.7871 -+ (unspec_volatile:SI [(const_int 0)] UNSPEC_LDWIO))
1.7872 -+ (use (match_operand:SI 1 "memory_operand" "m"))]
1.7873 -+ ""
1.7874 -+ "ldwio\\t%0, %1"
1.7875 -+ [(set_attr "type" "ld")])
1.7876 -+
1.7877 -+(define_insn "stwio"
1.7878 -+ [(set (match_operand:SI 0 "memory_operand" "=m")
1.7879 -+ (match_operand:SI 1 "register_operand" "r"))
1.7880 -+ (unspec_volatile:SI [(const_int 0)] UNSPEC_STWIO)]
1.7881 -+ ""
1.7882 -+ "stwio\\t%z1, %0"
1.7883 -+ [(set_attr "type" "st")])
1.7884 -+
1.7885 -+
1.7886 -+
1.7887 -+;*****************************************************************************
1.7888 -+;*
1.7889 -+;* zero extension
1.7890 -+;*
1.7891 -+;*****************************************************************************
1.7892 -+
1.7893 -+
1.7894 -+(define_insn "zero_extendhisi2"
1.7895 -+ [(set (match_operand:SI 0 "register_operand" "=r,r")
1.7896 -+ (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,m")))]
1.7897 -+ ""
1.7898 -+ "@
1.7899 -+ andi\\t%0, %1, 0xffff
1.7900 -+ ldhu%o1\\t%0, %1"
1.7901 -+ [(set_attr "type" "alu,ld")])
1.7902 -+
1.7903 -+(define_insn "zero_extendqihi2"
1.7904 -+ [(set (match_operand:HI 0 "register_operand" "=r,r")
1.7905 -+ (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "r,m")))]
1.7906 -+ ""
1.7907 -+ "@
1.7908 -+ andi\\t%0, %1, 0xff
1.7909 -+ ldbu%o1\\t%0, %1"
1.7910 -+ [(set_attr "type" "alu,ld")])
1.7911 -+
1.7912 -+(define_insn "zero_extendqisi2"
1.7913 -+ [(set (match_operand:SI 0 "register_operand" "=r,r")
1.7914 -+ (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "r,m")))]
1.7915 -+ ""
1.7916 -+ "@
1.7917 -+ andi\\t%0, %1, 0xff
1.7918 -+ ldbu%o1\\t%0, %1"
1.7919 -+ [(set_attr "type" "alu,ld")])
1.7920 -+
1.7921 -+
1.7922 -+
1.7923 -+;*****************************************************************************
1.7924 -+;*
1.7925 -+;* sign extension
1.7926 -+;*
1.7927 -+;*****************************************************************************
1.7928 -+
1.7929 -+(define_expand "extendhisi2"
1.7930 -+ [(set (match_operand:SI 0 "register_operand" "")
1.7931 -+ (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "")))]
1.7932 -+ ""
1.7933 -+{
1.7934 -+ if (optimize && GET_CODE (operands[1]) == MEM)
1.7935 -+ operands[1] = force_not_mem (operands[1]);
1.7936 -+
1.7937 -+ if (GET_CODE (operands[1]) != MEM)
1.7938 -+ {
1.7939 -+ rtx op1 = gen_lowpart (SImode, operands[1]);
1.7940 -+ rtx temp = gen_reg_rtx (SImode);
1.7941 -+ rtx shift = GEN_INT (16);
1.7942 -+
1.7943 -+ emit_insn (gen_ashlsi3 (temp, op1, shift));
1.7944 -+ emit_insn (gen_ashrsi3 (operands[0], temp, shift));
1.7945 -+ DONE;
1.7946 -+ }
1.7947 -+})
1.7948 -+
1.7949 -+(define_insn "extendhisi2_internal"
1.7950 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.7951 -+ (sign_extend:SI (match_operand:HI 1 "memory_operand" "m")))]
1.7952 -+ ""
1.7953 -+ "ldh%o1\\t%0, %1"
1.7954 -+ [(set_attr "type" "ld")])
1.7955 -+
1.7956 -+(define_expand "extendqihi2"
1.7957 -+ [(set (match_operand:HI 0 "register_operand" "")
1.7958 -+ (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "")))]
1.7959 -+ ""
1.7960 -+{
1.7961 -+ if (optimize && GET_CODE (operands[1]) == MEM)
1.7962 -+ operands[1] = force_not_mem (operands[1]);
1.7963 -+
1.7964 -+ if (GET_CODE (operands[1]) != MEM)
1.7965 -+ {
1.7966 -+ rtx op0 = gen_lowpart (SImode, operands[0]);
1.7967 -+ rtx op1 = gen_lowpart (SImode, operands[1]);
1.7968 -+ rtx temp = gen_reg_rtx (SImode);
1.7969 -+ rtx shift = GEN_INT (24);
1.7970 -+
1.7971 -+ emit_insn (gen_ashlsi3 (temp, op1, shift));
1.7972 -+ emit_insn (gen_ashrsi3 (op0, temp, shift));
1.7973 -+ DONE;
1.7974 -+ }
1.7975 -+})
1.7976 -+
1.7977 -+(define_insn "extendqihi2_internal"
1.7978 -+ [(set (match_operand:HI 0 "register_operand" "=r")
1.7979 -+ (sign_extend:HI (match_operand:QI 1 "memory_operand" "m")))]
1.7980 -+ ""
1.7981 -+ "ldb%o1\\t%0, %1"
1.7982 -+ [(set_attr "type" "ld")])
1.7983 -+
1.7984 -+
1.7985 -+(define_expand "extendqisi2"
1.7986 -+ [(set (match_operand:SI 0 "register_operand" "")
1.7987 -+ (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))]
1.7988 -+ ""
1.7989 -+{
1.7990 -+ if (optimize && GET_CODE (operands[1]) == MEM)
1.7991 -+ operands[1] = force_not_mem (operands[1]);
1.7992 -+
1.7993 -+ if (GET_CODE (operands[1]) != MEM)
1.7994 -+ {
1.7995 -+ rtx op1 = gen_lowpart (SImode, operands[1]);
1.7996 -+ rtx temp = gen_reg_rtx (SImode);
1.7997 -+ rtx shift = GEN_INT (24);
1.7998 -+
1.7999 -+ emit_insn (gen_ashlsi3 (temp, op1, shift));
1.8000 -+ emit_insn (gen_ashrsi3 (operands[0], temp, shift));
1.8001 -+ DONE;
1.8002 -+ }
1.8003 -+})
1.8004 -+
1.8005 -+(define_insn "extendqisi2_insn"
1.8006 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8007 -+ (sign_extend:SI (match_operand:QI 1 "memory_operand" "m")))]
1.8008 -+ ""
1.8009 -+ "ldb%o1\\t%0, %1"
1.8010 -+ [(set_attr "type" "ld")])
1.8011 -+
1.8012 -+
1.8013 -+
1.8014 -+;*****************************************************************************
1.8015 -+;*
1.8016 -+;* Arithmetic Operations
1.8017 -+;*
1.8018 -+;*****************************************************************************
1.8019 -+
1.8020 -+(define_insn "addsi3"
1.8021 -+ [(set (match_operand:SI 0 "register_operand" "=r,r")
1.8022 -+ (plus:SI (match_operand:SI 1 "register_operand" "%r,r")
1.8023 -+ (match_operand:SI 2 "arith_operand" "r,I")))]
1.8024 -+ ""
1.8025 -+ "add%i2\\t%0, %1, %z2"
1.8026 -+ [(set_attr "type" "alu")])
1.8027 -+
1.8028 -+(define_insn "subsi3"
1.8029 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8030 -+ (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rM")
1.8031 -+ (match_operand:SI 2 "register_operand" "r")))]
1.8032 -+ ""
1.8033 -+ "sub\\t%0, %z1, %2"
1.8034 -+ [(set_attr "type" "alu")])
1.8035 -+
1.8036 -+(define_insn "mulsi3"
1.8037 -+ [(set (match_operand:SI 0 "register_operand" "=r,r")
1.8038 -+ (mult:SI (match_operand:SI 1 "register_operand" "r,r")
1.8039 -+ (match_operand:SI 2 "arith_operand" "r,I")))]
1.8040 -+ "TARGET_HAS_MUL"
1.8041 -+ "mul%i2\\t%0, %1, %z2"
1.8042 -+ [(set_attr "type" "mul")])
1.8043 -+
1.8044 -+(define_expand "divsi3"
1.8045 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8046 -+ (div:SI (match_operand:SI 1 "register_operand" "r")
1.8047 -+ (match_operand:SI 2 "register_operand" "r")))]
1.8048 -+ ""
1.8049 -+{
1.8050 -+ if (!TARGET_HAS_DIV)
1.8051 -+ {
1.8052 -+ if (!TARGET_FAST_SW_DIV)
1.8053 -+ FAIL;
1.8054 -+ else
1.8055 -+ {
1.8056 -+ if (nios2_emit_expensive_div (operands, SImode))
1.8057 -+ DONE;
1.8058 -+ }
1.8059 -+ }
1.8060 -+})
1.8061 -+
1.8062 -+(define_insn "divsi3_insn"
1.8063 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8064 -+ (div:SI (match_operand:SI 1 "register_operand" "r")
1.8065 -+ (match_operand:SI 2 "register_operand" "r")))]
1.8066 -+ "TARGET_HAS_DIV"
1.8067 -+ "div\\t%0, %1, %2"
1.8068 -+ [(set_attr "type" "div")])
1.8069 -+
1.8070 -+(define_insn "udivsi3"
1.8071 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8072 -+ (udiv:SI (match_operand:SI 1 "register_operand" "r")
1.8073 -+ (match_operand:SI 2 "register_operand" "r")))]
1.8074 -+ "TARGET_HAS_DIV"
1.8075 -+ "divu\\t%0, %1, %2"
1.8076 -+ [(set_attr "type" "div")])
1.8077 -+
1.8078 -+(define_insn "smulsi3_highpart"
1.8079 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8080 -+ (truncate:SI
1.8081 -+ (lshiftrt:DI
1.8082 -+ (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "r"))
1.8083 -+ (sign_extend:DI (match_operand:SI 2 "register_operand" "r")))
1.8084 -+ (const_int 32))))]
1.8085 -+ "TARGET_HAS_MULX"
1.8086 -+ "mulxss\\t%0, %1, %2"
1.8087 -+ [(set_attr "type" "mul")])
1.8088 -+
1.8089 -+(define_insn "umulsi3_highpart"
1.8090 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8091 -+ (truncate:SI
1.8092 -+ (lshiftrt:DI
1.8093 -+ (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "r"))
1.8094 -+ (zero_extend:DI (match_operand:SI 2 "register_operand" "r")))
1.8095 -+ (const_int 32))))]
1.8096 -+ "TARGET_HAS_MULX"
1.8097 -+ "mulxuu\\t%0, %1, %2"
1.8098 -+ [(set_attr "type" "mul")])
1.8099 -+
1.8100 -+
1.8101 -+(define_expand "mulsidi3"
1.8102 -+ [(set (subreg:SI (match_operand:DI 0 "register_operand" "") 0)
1.8103 -+ (mult:SI (match_operand:SI 1 "register_operand" "")
1.8104 -+ (match_operand:SI 2 "register_operand" "")))
1.8105 -+ (set (subreg:SI (match_dup 0) 4)
1.8106 -+ (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (match_dup 1))
1.8107 -+ (sign_extend:DI (match_dup 2)))
1.8108 -+ (const_int 32))))]
1.8109 -+ "TARGET_HAS_MULX"
1.8110 -+ "")
1.8111 -+
1.8112 -+(define_expand "umulsidi3"
1.8113 -+ [(set (subreg:SI (match_operand:DI 0 "register_operand" "") 0)
1.8114 -+ (mult:SI (match_operand:SI 1 "register_operand" "")
1.8115 -+ (match_operand:SI 2 "register_operand" "")))
1.8116 -+ (set (subreg:SI (match_dup 0) 4)
1.8117 -+ (truncate:SI (lshiftrt:DI (mult:DI (zero_extend:DI (match_dup 1))
1.8118 -+ (zero_extend:DI (match_dup 2)))
1.8119 -+ (const_int 32))))]
1.8120 -+ "TARGET_HAS_MULX"
1.8121 -+ "")
1.8122 -+
1.8123 -+
1.8124 -+
1.8125 -+;*****************************************************************************
1.8126 -+;*
1.8127 -+;* Negate and ones complement
1.8128 -+;*
1.8129 -+;*****************************************************************************
1.8130 -+
1.8131 -+(define_insn "negsi2"
1.8132 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8133 -+ (neg:SI (match_operand:SI 1 "register_operand" "r")))]
1.8134 -+ ""
1.8135 -+{
1.8136 -+ operands[2] = const0_rtx;
1.8137 -+ return "sub\\t%0, %z2, %1";
1.8138 -+}
1.8139 -+ [(set_attr "type" "alu")])
1.8140 -+
1.8141 -+(define_insn "one_cmplsi2"
1.8142 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8143 -+ (not:SI (match_operand:SI 1 "register_operand" "r")))]
1.8144 -+ ""
1.8145 -+{
1.8146 -+ operands[2] = const0_rtx;
1.8147 -+ return "nor\\t%0, %z2, %1";
1.8148 -+}
1.8149 -+ [(set_attr "type" "alu")])
1.8150 -+
1.8151 -+
1.8152 -+
1.8153 -+; Logical Operantions
1.8154 -+
1.8155 -+(define_insn "andsi3"
1.8156 -+ [(set (match_operand:SI 0 "register_operand" "=r, r,r")
1.8157 -+ (and:SI (match_operand:SI 1 "register_operand" "%r, r,r")
1.8158 -+ (match_operand:SI 2 "logical_operand" "rM,J,K")))]
1.8159 -+ ""
1.8160 -+ "@
1.8161 -+ and\\t%0, %1, %z2
1.8162 -+ and%i2\\t%0, %1, %2
1.8163 -+ andh%i2\\t%0, %1, %U2"
1.8164 -+ [(set_attr "type" "alu")])
1.8165 -+
1.8166 -+(define_insn "iorsi3"
1.8167 -+ [(set (match_operand:SI 0 "register_operand" "=r, r,r")
1.8168 -+ (ior:SI (match_operand:SI 1 "register_operand" "%r, r,r")
1.8169 -+ (match_operand:SI 2 "logical_operand" "rM,J,K")))]
1.8170 -+ ""
1.8171 -+ "@
1.8172 -+ or\\t%0, %1, %z2
1.8173 -+ or%i2\\t%0, %1, %2
1.8174 -+ orh%i2\\t%0, %1, %U2"
1.8175 -+ [(set_attr "type" "alu")])
1.8176 -+
1.8177 -+(define_insn "*norsi3"
1.8178 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8179 -+ (and:SI (not:SI (match_operand:SI 1 "register_operand" "%r"))
1.8180 -+ (not:SI (match_operand:SI 2 "reg_or_0_operand" "rM"))))]
1.8181 -+ ""
1.8182 -+ "nor\\t%0, %1, %z2"
1.8183 -+ [(set_attr "type" "alu")])
1.8184 -+
1.8185 -+(define_insn "xorsi3"
1.8186 -+ [(set (match_operand:SI 0 "register_operand" "=r, r,r")
1.8187 -+ (xor:SI (match_operand:SI 1 "register_operand" "%r, r,r")
1.8188 -+ (match_operand:SI 2 "logical_operand" "rM,J,K")))]
1.8189 -+ ""
1.8190 -+ "@
1.8191 -+ xor\\t%0, %1, %z2
1.8192 -+ xor%i2\\t%0, %1, %2
1.8193 -+ xorh%i2\\t%0, %1, %U2"
1.8194 -+ [(set_attr "type" "alu")])
1.8195 -+
1.8196 -+
1.8197 -+
1.8198 -+;*****************************************************************************
1.8199 -+;*
1.8200 -+;* Shifts
1.8201 -+;*
1.8202 -+;*****************************************************************************
1.8203 -+
1.8204 -+(define_insn "ashlsi3"
1.8205 -+ [(set (match_operand:SI 0 "register_operand" "=r,r")
1.8206 -+ (ashift:SI (match_operand:SI 1 "register_operand" "r,r")
1.8207 -+ (match_operand:SI 2 "shift_operand" "r,L")))]
1.8208 -+ ""
1.8209 -+ "sll%i2\\t%0, %1, %z2"
1.8210 -+ [(set_attr "type" "shift")])
1.8211 -+
1.8212 -+(define_insn "ashrsi3"
1.8213 -+ [(set (match_operand:SI 0 "register_operand" "=r,r")
1.8214 -+ (ashiftrt:SI (match_operand:SI 1 "register_operand" "r,r")
1.8215 -+ (match_operand:SI 2 "shift_operand" "r,L")))]
1.8216 -+ ""
1.8217 -+ "sra%i2\\t%0, %1, %z2"
1.8218 -+ [(set_attr "type" "shift")])
1.8219 -+
1.8220 -+(define_insn "lshrsi3"
1.8221 -+ [(set (match_operand:SI 0 "register_operand" "=r,r")
1.8222 -+ (lshiftrt:SI (match_operand:SI 1 "register_operand" "r,r")
1.8223 -+ (match_operand:SI 2 "shift_operand" "r,L")))]
1.8224 -+ ""
1.8225 -+ "srl%i2\\t%0, %1, %z2"
1.8226 -+ [(set_attr "type" "shift")])
1.8227 -+
1.8228 -+(define_insn "rotlsi3"
1.8229 -+ [(set (match_operand:SI 0 "register_operand" "=r,r")
1.8230 -+ (rotate:SI (match_operand:SI 1 "register_operand" "r,r")
1.8231 -+ (match_operand:SI 2 "shift_operand" "r,L")))]
1.8232 -+ ""
1.8233 -+ "rol%i2\\t%0, %1, %z2"
1.8234 -+ [(set_attr "type" "shift")])
1.8235 -+
1.8236 -+(define_insn "rotrsi3"
1.8237 -+ [(set (match_operand:SI 0 "register_operand" "=r,r")
1.8238 -+ (rotatert:SI (match_operand:SI 1 "register_operand" "r,r")
1.8239 -+ (match_operand:SI 2 "register_operand" "r,r")))]
1.8240 -+ ""
1.8241 -+ "ror\\t%0, %1, %2"
1.8242 -+ [(set_attr "type" "shift")])
1.8243 -+
1.8244 -+(define_insn "*shift_mul_constants"
1.8245 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8246 -+ (ashift:SI (mult:SI (match_operand:SI 1 "register_operand" "r")
1.8247 -+ (match_operand:SI 2 "const_int_operand" "I"))
1.8248 -+ (match_operand:SI 3 "const_int_operand" "I")))]
1.8249 -+ "TARGET_HAS_MUL && SMALL_INT (INTVAL (operands[2]) << INTVAL (operands[3]))"
1.8250 -+{
1.8251 -+ HOST_WIDE_INT mul = INTVAL (operands[2]) << INTVAL (operands[3]);
1.8252 -+ rtx ops[3];
1.8253 -+
1.8254 -+ ops[0] = operands[0];
1.8255 -+ ops[1] = operands[1];
1.8256 -+ ops[2] = GEN_INT (mul);
1.8257 -+
1.8258 -+ output_asm_insn ("muli\t%0, %1, %2", ops);
1.8259 -+ return "";
1.8260 -+}
1.8261 -+ [(set_attr "type" "mul")])
1.8262 -+
1.8263 -+
1.8264 -+
1.8265 -+
1.8266 -+;*****************************************************************************
1.8267 -+;*
1.8268 -+;* Prologue, Epilogue and Return
1.8269 -+;*
1.8270 -+;*****************************************************************************
1.8271 -+
1.8272 -+(define_expand "prologue"
1.8273 -+ [(const_int 1)]
1.8274 -+ ""
1.8275 -+{
1.8276 -+ expand_prologue ();
1.8277 -+ DONE;
1.8278 -+})
1.8279 -+
1.8280 -+(define_expand "epilogue"
1.8281 -+ [(return)]
1.8282 -+ ""
1.8283 -+{
1.8284 -+ expand_epilogue (false);
1.8285 -+ DONE;
1.8286 -+})
1.8287 -+
1.8288 -+(define_expand "sibcall_epilogue"
1.8289 -+ [(return)]
1.8290 -+ ""
1.8291 -+{
1.8292 -+ expand_epilogue (true);
1.8293 -+ DONE;
1.8294 -+})
1.8295 -+
1.8296 -+(define_insn "return"
1.8297 -+ [(return)]
1.8298 -+ "reload_completed && nios2_can_use_return_insn ()"
1.8299 -+ "ret\\t"
1.8300 -+)
1.8301 -+
1.8302 -+(define_insn "return_from_epilogue"
1.8303 -+ [(use (match_operand 0 "pmode_register_operand" ""))
1.8304 -+ (return)]
1.8305 -+ "reload_completed"
1.8306 -+ "ret\\t"
1.8307 -+)
1.8308 -+
1.8309 -+;; Block any insns from being moved before this point, since the
1.8310 -+;; profiling call to mcount can use various registers that aren't
1.8311 -+;; saved or used to pass arguments.
1.8312 -+
1.8313 -+(define_insn "blockage"
1.8314 -+ [(unspec_volatile [(const_int 0)] UNSPEC_BLOCKAGE)]
1.8315 -+ ""
1.8316 -+ ""
1.8317 -+ [(set_attr "type" "unknown")
1.8318 -+ (set_attr "length" "0")])
1.8319 -+
1.8320 -+
1.8321 -+
1.8322 -+;*****************************************************************************
1.8323 -+;*
1.8324 -+;* Jumps and Calls
1.8325 -+;*
1.8326 -+;*****************************************************************************
1.8327 -+
1.8328 -+(define_insn "indirect_jump"
1.8329 -+ [(set (pc) (match_operand:SI 0 "register_operand" "r"))]
1.8330 -+ ""
1.8331 -+ "jmp\\t%0"
1.8332 -+ [(set_attr "type" "control")])
1.8333 -+
1.8334 -+(define_insn "jump"
1.8335 -+ [(set (pc)
1.8336 -+ (label_ref (match_operand 0 "" "")))]
1.8337 -+ ""
1.8338 -+ "br\\t%0"
1.8339 -+ [(set_attr "type" "control")])
1.8340 -+
1.8341 -+
1.8342 -+(define_insn "indirect_call"
1.8343 -+ [(call (mem:QI (match_operand:SI 0 "register_operand" "r"))
1.8344 -+ (match_operand 1 "" ""))
1.8345 -+ (clobber (reg:SI RA_REGNO))]
1.8346 -+ ""
1.8347 -+ "callr\\t%0"
1.8348 -+ [(set_attr "type" "control")])
1.8349 -+
1.8350 -+(define_insn "indirect_call_value"
1.8351 -+ [(set (match_operand 0 "" "")
1.8352 -+ (call (mem:QI (match_operand:SI 1 "register_operand" "r"))
1.8353 -+ (match_operand 2 "" "")))
1.8354 -+ (clobber (reg:SI RA_REGNO))]
1.8355 -+ ""
1.8356 -+ "callr\\t%1"
1.8357 -+)
1.8358 -+
1.8359 -+(define_expand "call"
1.8360 -+ [(parallel [(call (match_operand 0 "" "")
1.8361 -+ (match_operand 1 "" ""))
1.8362 -+ (clobber (reg:SI RA_REGNO))])]
1.8363 -+ ""
1.8364 -+ "")
1.8365 -+
1.8366 -+(define_expand "call_value"
1.8367 -+ [(parallel [(set (match_operand 0 "" "")
1.8368 -+ (call (match_operand 1 "" "")
1.8369 -+ (match_operand 2 "" "")))
1.8370 -+ (clobber (reg:SI RA_REGNO))])]
1.8371 -+ ""
1.8372 -+ "")
1.8373 -+
1.8374 -+(define_insn "*call"
1.8375 -+ [(call (mem:QI (match_operand:SI 0 "immediate_operand" "i"))
1.8376 -+ (match_operand 1 "" ""))
1.8377 -+ (clobber (match_operand:SI 2 "register_operand" "=r"))]
1.8378 -+ ""
1.8379 -+ "call\\t%0"
1.8380 -+ [(set_attr "type" "control")])
1.8381 -+
1.8382 -+(define_insn "*call_value"
1.8383 -+ [(set (match_operand 0 "" "")
1.8384 -+ (call (mem:QI (match_operand:SI 1 "immediate_operand" "i"))
1.8385 -+ (match_operand 2 "" "")))
1.8386 -+ (clobber (match_operand:SI 3 "register_operand" "=r"))]
1.8387 -+ ""
1.8388 -+ "call\\t%1"
1.8389 -+ [(set_attr "type" "control")])
1.8390 -+
1.8391 -+(define_expand "sibcall"
1.8392 -+ [(parallel [(call (match_operand 0 "" "")
1.8393 -+ (match_operand 1 "" ""))
1.8394 -+ (return)
1.8395 -+ (use (match_operand 2 "" ""))])]
1.8396 -+ ""
1.8397 -+ {
1.8398 -+ XEXP (operands[0], 0) = copy_to_mode_reg (SImode, XEXP (operands[0], 0));
1.8399 -+
1.8400 -+ if (operands[2] == NULL_RTX)
1.8401 -+ operands[2] = const0_rtx;
1.8402 -+ }
1.8403 -+)
1.8404 -+
1.8405 -+(define_expand "sibcall_value"
1.8406 -+ [(parallel [(set (match_operand 0 "" "")
1.8407 -+ (call (match_operand 1 "" "")
1.8408 -+ (match_operand 2 "" "")))
1.8409 -+ (return)
1.8410 -+ (use (match_operand 3 "" ""))])]
1.8411 -+ ""
1.8412 -+ {
1.8413 -+ XEXP (operands[1], 0) = copy_to_mode_reg (SImode, XEXP (operands[1], 0));
1.8414 -+
1.8415 -+ if (operands[3] == NULL_RTX)
1.8416 -+ operands[3] = const0_rtx;
1.8417 -+ }
1.8418 -+)
1.8419 -+
1.8420 -+(define_insn "sibcall_insn"
1.8421 -+ [(call (mem:QI (match_operand:SI 0 "register_operand" "r"))
1.8422 -+ (match_operand 1 "" ""))
1.8423 -+ (return)
1.8424 -+ (use (match_operand 2 "" ""))]
1.8425 -+ ""
1.8426 -+ "jmp\\t%0"
1.8427 -+)
1.8428 -+
1.8429 -+(define_insn "sibcall_value_insn"
1.8430 -+ [(set (match_operand 0 "register_operand" "")
1.8431 -+ (call (mem:QI (match_operand:SI 1 "register_operand" "r"))
1.8432 -+ (match_operand 2 "" "")))
1.8433 -+ (return)
1.8434 -+ (use (match_operand 3 "" ""))]
1.8435 -+ ""
1.8436 -+ "jmp\\t%1"
1.8437 -+)
1.8438 -+
1.8439 -+
1.8440 -+
1.8441 -+
1.8442 -+(define_expand "tablejump"
1.8443 -+ [(parallel [(set (pc) (match_operand 0 "register_operand" "r"))
1.8444 -+ (use (label_ref (match_operand 1 "" "")))])]
1.8445 -+ ""
1.8446 -+ ""
1.8447 -+)
1.8448 -+
1.8449 -+(define_insn "*tablejump"
1.8450 -+ [(set (pc)
1.8451 -+ (match_operand:SI 0 "register_operand" "r"))
1.8452 -+ (use (label_ref (match_operand 1 "" "")))]
1.8453 -+ ""
1.8454 -+ "jmp\\t%0"
1.8455 -+ [(set_attr "type" "control")])
1.8456 -+
1.8457 -+
1.8458 -+
1.8459 -+;*****************************************************************************
1.8460 -+;*
1.8461 -+;* Comparisons
1.8462 -+;*
1.8463 -+;*****************************************************************************
1.8464 -+;; Flow here is rather complex (based on MIPS):
1.8465 -+;;
1.8466 -+;; 1) The cmp{si,di,sf,df} routine is called. It deposits the
1.8467 -+;; arguments into the branch_cmp array, and the type into
1.8468 -+;; branch_type. No RTL is generated.
1.8469 -+;;
1.8470 -+;; 2) The appropriate branch define_expand is called, which then
1.8471 -+;; creates the appropriate RTL for the comparison and branch.
1.8472 -+;; Different CC modes are used, based on what type of branch is
1.8473 -+;; done, so that we can constrain things appropriately. There
1.8474 -+;; are assumptions in the rest of GCC that break if we fold the
1.8475 -+;; operands into the branchs for integer operations, and use cc0
1.8476 -+;; for floating point, so we use the fp status register instead.
1.8477 -+;; If needed, an appropriate temporary is created to hold the
1.8478 -+;; of the integer compare.
1.8479 -+
1.8480 -+(define_expand "cmpsi"
1.8481 -+ [(set (cc0)
1.8482 -+ (compare:CC (match_operand:SI 0 "register_operand" "")
1.8483 -+ (match_operand:SI 1 "arith_operand" "")))]
1.8484 -+ ""
1.8485 -+{
1.8486 -+ branch_cmp[0] = operands[0];
1.8487 -+ branch_cmp[1] = operands[1];
1.8488 -+ branch_type = CMP_SI;
1.8489 -+ DONE;
1.8490 -+})
1.8491 -+
1.8492 -+(define_expand "tstsi"
1.8493 -+ [(set (cc0)
1.8494 -+ (match_operand:SI 0 "register_operand" ""))]
1.8495 -+ ""
1.8496 -+{
1.8497 -+ branch_cmp[0] = operands[0];
1.8498 -+ branch_cmp[1] = const0_rtx;
1.8499 -+ branch_type = CMP_SI;
1.8500 -+ DONE;
1.8501 -+})
1.8502 -+
1.8503 -+
1.8504 -+;*****************************************************************************
1.8505 -+;*
1.8506 -+;* setting a register from a comparison
1.8507 -+;*
1.8508 -+;*****************************************************************************
1.8509 -+
1.8510 -+(define_expand "seq"
1.8511 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8512 -+ (eq:SI (match_dup 1)
1.8513 -+ (match_dup 2)))]
1.8514 -+ ""
1.8515 -+{
1.8516 -+ if (branch_type != CMP_SI)
1.8517 -+ FAIL;
1.8518 -+
1.8519 -+ /* set up operands from compare. */
1.8520 -+ operands[1] = branch_cmp[0];
1.8521 -+ operands[2] = branch_cmp[1];
1.8522 -+
1.8523 -+ gen_int_relational (EQ, operands[0], operands[1], operands[2], NULL_RTX);
1.8524 -+ DONE;
1.8525 -+})
1.8526 -+
1.8527 -+
1.8528 -+(define_insn "*seq"
1.8529 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8530 -+ (eq:SI (match_operand:SI 1 "reg_or_0_operand" "%rM")
1.8531 -+ (match_operand:SI 2 "arith_operand" "rI")))]
1.8532 -+ ""
1.8533 -+ "cmpeq%i2\\t%0, %z1, %z2"
1.8534 -+ [(set_attr "type" "alu")])
1.8535 -+
1.8536 -+
1.8537 -+(define_expand "sne"
1.8538 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8539 -+ (ne:SI (match_dup 1)
1.8540 -+ (match_dup 2)))]
1.8541 -+ ""
1.8542 -+{
1.8543 -+ if (branch_type != CMP_SI)
1.8544 -+ FAIL;
1.8545 -+
1.8546 -+ /* set up operands from compare. */
1.8547 -+ operands[1] = branch_cmp[0];
1.8548 -+ operands[2] = branch_cmp[1];
1.8549 -+
1.8550 -+ gen_int_relational (NE, operands[0], operands[1], operands[2], NULL_RTX);
1.8551 -+ DONE;
1.8552 -+})
1.8553 -+
1.8554 -+
1.8555 -+(define_insn "*sne"
1.8556 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8557 -+ (ne:SI (match_operand:SI 1 "reg_or_0_operand" "%rM")
1.8558 -+ (match_operand:SI 2 "arith_operand" "rI")))]
1.8559 -+ ""
1.8560 -+ "cmpne%i2\\t%0, %z1, %z2"
1.8561 -+ [(set_attr "type" "alu")])
1.8562 -+
1.8563 -+
1.8564 -+(define_expand "sgt"
1.8565 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8566 -+ (gt:SI (match_dup 1)
1.8567 -+ (match_dup 2)))]
1.8568 -+ ""
1.8569 -+{
1.8570 -+ if (branch_type != CMP_SI)
1.8571 -+ FAIL;
1.8572 -+
1.8573 -+ /* set up operands from compare. */
1.8574 -+ operands[1] = branch_cmp[0];
1.8575 -+ operands[2] = branch_cmp[1];
1.8576 -+
1.8577 -+ gen_int_relational (GT, operands[0], operands[1], operands[2], NULL_RTX);
1.8578 -+ DONE;
1.8579 -+})
1.8580 -+
1.8581 -+
1.8582 -+(define_insn "*sgt"
1.8583 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8584 -+ (gt:SI (match_operand:SI 1 "reg_or_0_operand" "rM")
1.8585 -+ (match_operand:SI 2 "reg_or_0_operand" "rM")))]
1.8586 -+ ""
1.8587 -+ "cmplt\\t%0, %z2, %z1"
1.8588 -+ [(set_attr "type" "alu")])
1.8589 -+
1.8590 -+
1.8591 -+(define_expand "sge"
1.8592 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8593 -+ (ge:SI (match_dup 1)
1.8594 -+ (match_dup 2)))]
1.8595 -+ ""
1.8596 -+{
1.8597 -+ if (branch_type != CMP_SI)
1.8598 -+ FAIL;
1.8599 -+
1.8600 -+ /* set up operands from compare. */
1.8601 -+ operands[1] = branch_cmp[0];
1.8602 -+ operands[2] = branch_cmp[1];
1.8603 -+
1.8604 -+ gen_int_relational (GE, operands[0], operands[1], operands[2], NULL_RTX);
1.8605 -+ DONE;
1.8606 -+})
1.8607 -+
1.8608 -+
1.8609 -+(define_insn "*sge"
1.8610 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8611 -+ (ge:SI (match_operand:SI 1 "reg_or_0_operand" "rM")
1.8612 -+ (match_operand:SI 2 "arith_operand" "rI")))]
1.8613 -+ ""
1.8614 -+ "cmpge%i2\\t%0, %z1, %z2"
1.8615 -+ [(set_attr "type" "alu")])
1.8616 -+
1.8617 -+(define_expand "sle"
1.8618 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8619 -+ (le:SI (match_dup 1)
1.8620 -+ (match_dup 2)))]
1.8621 -+ ""
1.8622 -+{
1.8623 -+ if (branch_type != CMP_SI)
1.8624 -+ FAIL;
1.8625 -+
1.8626 -+ /* set up operands from compare. */
1.8627 -+ operands[1] = branch_cmp[0];
1.8628 -+ operands[2] = branch_cmp[1];
1.8629 -+
1.8630 -+ gen_int_relational (LE, operands[0], operands[1], operands[2], NULL_RTX);
1.8631 -+ DONE;
1.8632 -+})
1.8633 -+
1.8634 -+
1.8635 -+(define_insn "*sle"
1.8636 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8637 -+ (le:SI (match_operand:SI 1 "reg_or_0_operand" "rM")
1.8638 -+ (match_operand:SI 2 "reg_or_0_operand" "rM")))]
1.8639 -+ ""
1.8640 -+ "cmpge\\t%0, %z2, %z1"
1.8641 -+ [(set_attr "type" "alu")])
1.8642 -+
1.8643 -+
1.8644 -+(define_expand "slt"
1.8645 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8646 -+ (lt:SI (match_dup 1)
1.8647 -+ (match_dup 2)))]
1.8648 -+ ""
1.8649 -+{
1.8650 -+ if (branch_type != CMP_SI)
1.8651 -+ FAIL;
1.8652 -+
1.8653 -+ /* set up operands from compare. */
1.8654 -+ operands[1] = branch_cmp[0];
1.8655 -+ operands[2] = branch_cmp[1];
1.8656 -+
1.8657 -+ gen_int_relational (LT, operands[0], operands[1], operands[2], NULL_RTX);
1.8658 -+ DONE;
1.8659 -+})
1.8660 -+
1.8661 -+
1.8662 -+(define_insn "*slt"
1.8663 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8664 -+ (lt:SI (match_operand:SI 1 "reg_or_0_operand" "rM")
1.8665 -+ (match_operand:SI 2 "arith_operand" "rI")))]
1.8666 -+ ""
1.8667 -+ "cmplt%i2\\t%0, %z1, %z2"
1.8668 -+ [(set_attr "type" "alu")])
1.8669 -+
1.8670 -+
1.8671 -+(define_expand "sgtu"
1.8672 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8673 -+ (gtu:SI (match_dup 1)
1.8674 -+ (match_dup 2)))]
1.8675 -+ ""
1.8676 -+{
1.8677 -+ if (branch_type != CMP_SI)
1.8678 -+ FAIL;
1.8679 -+
1.8680 -+ /* set up operands from compare. */
1.8681 -+ operands[1] = branch_cmp[0];
1.8682 -+ operands[2] = branch_cmp[1];
1.8683 -+
1.8684 -+ gen_int_relational (GTU, operands[0], operands[1], operands[2], NULL_RTX);
1.8685 -+ DONE;
1.8686 -+})
1.8687 -+
1.8688 -+
1.8689 -+(define_insn "*sgtu"
1.8690 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8691 -+ (gtu:SI (match_operand:SI 1 "reg_or_0_operand" "rM")
1.8692 -+ (match_operand:SI 2 "reg_or_0_operand" "rM")))]
1.8693 -+ ""
1.8694 -+ "cmpltu\\t%0, %z2, %z1"
1.8695 -+ [(set_attr "type" "alu")])
1.8696 -+
1.8697 -+
1.8698 -+(define_expand "sgeu"
1.8699 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8700 -+ (geu:SI (match_dup 1)
1.8701 -+ (match_dup 2)))]
1.8702 -+ ""
1.8703 -+{
1.8704 -+ if (branch_type != CMP_SI)
1.8705 -+ FAIL;
1.8706 -+
1.8707 -+ /* set up operands from compare. */
1.8708 -+ operands[1] = branch_cmp[0];
1.8709 -+ operands[2] = branch_cmp[1];
1.8710 -+
1.8711 -+ gen_int_relational (GEU, operands[0], operands[1], operands[2], NULL_RTX);
1.8712 -+ DONE;
1.8713 -+})
1.8714 -+
1.8715 -+
1.8716 -+(define_insn "*sgeu"
1.8717 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8718 -+ (geu:SI (match_operand:SI 1 "reg_or_0_operand" "rM")
1.8719 -+ (match_operand:SI 2 "uns_arith_operand" "rJ")))]
1.8720 -+ ""
1.8721 -+ "cmpgeu%i2\\t%0, %z1, %z2"
1.8722 -+ [(set_attr "type" "alu")])
1.8723 -+
1.8724 -+(define_expand "sleu"
1.8725 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8726 -+ (leu:SI (match_dup 1)
1.8727 -+ (match_dup 2)))]
1.8728 -+ ""
1.8729 -+{
1.8730 -+ if (branch_type != CMP_SI)
1.8731 -+ FAIL;
1.8732 -+
1.8733 -+ /* set up operands from compare. */
1.8734 -+ operands[1] = branch_cmp[0];
1.8735 -+ operands[2] = branch_cmp[1];
1.8736 -+
1.8737 -+ gen_int_relational (LEU, operands[0], operands[1], operands[2], NULL_RTX);
1.8738 -+ DONE;
1.8739 -+})
1.8740 -+
1.8741 -+
1.8742 -+(define_insn "*sleu"
1.8743 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8744 -+ (leu:SI (match_operand:SI 1 "reg_or_0_operand" "rM")
1.8745 -+ (match_operand:SI 2 "reg_or_0_operand" "rM")))]
1.8746 -+ ""
1.8747 -+ "cmpgeu\\t%0, %z2, %z1"
1.8748 -+ [(set_attr "type" "alu")])
1.8749 -+
1.8750 -+
1.8751 -+(define_expand "sltu"
1.8752 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8753 -+ (ltu:SI (match_dup 1)
1.8754 -+ (match_dup 2)))]
1.8755 -+ ""
1.8756 -+{
1.8757 -+ if (branch_type != CMP_SI)
1.8758 -+ FAIL;
1.8759 -+
1.8760 -+ /* set up operands from compare. */
1.8761 -+ operands[1] = branch_cmp[0];
1.8762 -+ operands[2] = branch_cmp[1];
1.8763 -+
1.8764 -+ gen_int_relational (LTU, operands[0], operands[1], operands[2], NULL_RTX);
1.8765 -+ DONE;
1.8766 -+})
1.8767 -+
1.8768 -+
1.8769 -+(define_insn "*sltu"
1.8770 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.8771 -+ (ltu:SI (match_operand:SI 1 "reg_or_0_operand" "rM")
1.8772 -+ (match_operand:SI 2 "uns_arith_operand" "rJ")))]
1.8773 -+ ""
1.8774 -+ "cmpltu%i2\\t%0, %z1, %z2"
1.8775 -+ [(set_attr "type" "alu")])
1.8776 -+
1.8777 -+
1.8778 -+
1.8779 -+
1.8780 -+;*****************************************************************************
1.8781 -+;*
1.8782 -+;* branches
1.8783 -+;*
1.8784 -+;*****************************************************************************
1.8785 -+
1.8786 -+(define_insn "*cbranch"
1.8787 -+ [(set (pc)
1.8788 -+ (if_then_else
1.8789 -+ (match_operator:SI 0 "comparison_operator"
1.8790 -+ [(match_operand:SI 2 "reg_or_0_operand" "rM")
1.8791 -+ (match_operand:SI 3 "reg_or_0_operand" "rM")])
1.8792 -+ (label_ref (match_operand 1 "" ""))
1.8793 -+ (pc)))]
1.8794 -+ ""
1.8795 -+ "b%0\\t%z2, %z3, %l1"
1.8796 -+ [(set_attr "type" "control")])
1.8797 -+
1.8798 -+
1.8799 -+(define_expand "beq"
1.8800 -+ [(set (pc)
1.8801 -+ (if_then_else (eq:CC (cc0)
1.8802 -+ (const_int 0))
1.8803 -+ (label_ref (match_operand 0 "" ""))
1.8804 -+ (pc)))]
1.8805 -+ ""
1.8806 -+{
1.8807 -+ gen_int_relational (EQ, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
1.8808 -+ DONE;
1.8809 -+})
1.8810 -+
1.8811 -+
1.8812 -+(define_expand "bne"
1.8813 -+ [(set (pc)
1.8814 -+ (if_then_else (ne:CC (cc0)
1.8815 -+ (const_int 0))
1.8816 -+ (label_ref (match_operand 0 "" ""))
1.8817 -+ (pc)))]
1.8818 -+ ""
1.8819 -+{
1.8820 -+ gen_int_relational (NE, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
1.8821 -+ DONE;
1.8822 -+})
1.8823 -+
1.8824 -+
1.8825 -+(define_expand "bgt"
1.8826 -+ [(set (pc)
1.8827 -+ (if_then_else (gt:CC (cc0)
1.8828 -+ (const_int 0))
1.8829 -+ (label_ref (match_operand 0 "" ""))
1.8830 -+ (pc)))]
1.8831 -+ ""
1.8832 -+{
1.8833 -+ gen_int_relational (GT, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
1.8834 -+ DONE;
1.8835 -+})
1.8836 -+
1.8837 -+(define_expand "bge"
1.8838 -+ [(set (pc)
1.8839 -+ (if_then_else (ge:CC (cc0)
1.8840 -+ (const_int 0))
1.8841 -+ (label_ref (match_operand 0 "" ""))
1.8842 -+ (pc)))]
1.8843 -+ ""
1.8844 -+{
1.8845 -+ gen_int_relational (GE, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
1.8846 -+ DONE;
1.8847 -+})
1.8848 -+
1.8849 -+(define_expand "ble"
1.8850 -+ [(set (pc)
1.8851 -+ (if_then_else (le:CC (cc0)
1.8852 -+ (const_int 0))
1.8853 -+ (label_ref (match_operand 0 "" ""))
1.8854 -+ (pc)))]
1.8855 -+ ""
1.8856 -+{
1.8857 -+ gen_int_relational (LE, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
1.8858 -+ DONE;
1.8859 -+})
1.8860 -+
1.8861 -+(define_expand "blt"
1.8862 -+ [(set (pc)
1.8863 -+ (if_then_else (lt:CC (cc0)
1.8864 -+ (const_int 0))
1.8865 -+ (label_ref (match_operand 0 "" ""))
1.8866 -+ (pc)))]
1.8867 -+ ""
1.8868 -+{
1.8869 -+ gen_int_relational (LT, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
1.8870 -+ DONE;
1.8871 -+})
1.8872 -+
1.8873 -+
1.8874 -+(define_expand "bgtu"
1.8875 -+ [(set (pc)
1.8876 -+ (if_then_else (gtu:CC (cc0)
1.8877 -+ (const_int 0))
1.8878 -+ (label_ref (match_operand 0 "" ""))
1.8879 -+ (pc)))]
1.8880 -+ ""
1.8881 -+{
1.8882 -+ gen_int_relational (GTU, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
1.8883 -+ DONE;
1.8884 -+})
1.8885 -+
1.8886 -+(define_expand "bgeu"
1.8887 -+ [(set (pc)
1.8888 -+ (if_then_else (geu:CC (cc0)
1.8889 -+ (const_int 0))
1.8890 -+ (label_ref (match_operand 0 "" ""))
1.8891 -+ (pc)))]
1.8892 -+ ""
1.8893 -+{
1.8894 -+ gen_int_relational (GEU, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
1.8895 -+ DONE;
1.8896 -+})
1.8897 -+
1.8898 -+(define_expand "bleu"
1.8899 -+ [(set (pc)
1.8900 -+ (if_then_else (leu:CC (cc0)
1.8901 -+ (const_int 0))
1.8902 -+ (label_ref (match_operand 0 "" ""))
1.8903 -+ (pc)))]
1.8904 -+ ""
1.8905 -+{
1.8906 -+ gen_int_relational (LEU, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
1.8907 -+ DONE;
1.8908 -+})
1.8909 -+
1.8910 -+(define_expand "bltu"
1.8911 -+ [(set (pc)
1.8912 -+ (if_then_else (ltu:CC (cc0)
1.8913 -+ (const_int 0))
1.8914 -+ (label_ref (match_operand 0 "" ""))
1.8915 -+ (pc)))]
1.8916 -+ ""
1.8917 -+{
1.8918 -+ gen_int_relational (LTU, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
1.8919 -+ DONE;
1.8920 -+})
1.8921 -+
1.8922 -+
1.8923 -+;*****************************************************************************
1.8924 -+;*
1.8925 -+;* String and Block Operations
1.8926 -+;*
1.8927 -+;*****************************************************************************
1.8928 -+
1.8929 -+; ??? This is all really a hack to get Dhrystone to work as fast as possible
1.8930 -+; things to be fixed:
1.8931 -+; * let the compiler core handle all of this, for that to work the extra
1.8932 -+; aliasing needs to be addressed.
1.8933 -+; * we use three temporary registers for loading and storing to ensure no
1.8934 -+; ld use stalls, this is excessive, because after the first ld/st only
1.8935 -+; two are needed. Only two would be needed all the way through if
1.8936 -+; we could schedule with other code. Consider:
1.8937 -+; 1 ld $1, 0($src)
1.8938 -+; 2 ld $2, 4($src)
1.8939 -+; 3 ld $3, 8($src)
1.8940 -+; 4 st $1, 0($dest)
1.8941 -+; 5 ld $1, 12($src)
1.8942 -+; 6 st $2, 4($src)
1.8943 -+; 7 etc.
1.8944 -+; The first store has to wait until 4. If it does not there will be one
1.8945 -+; cycle of stalling. However, if any other instruction could be placed
1.8946 -+; between 1 and 4, $3 would not be needed.
1.8947 -+; * In small we probably don't want to ever do this ourself because there
1.8948 -+; is no ld use stall.
1.8949 -+
1.8950 -+(define_expand "movstrsi"
1.8951 -+ [(parallel [(set (match_operand:BLK 0 "general_operand" "")
1.8952 -+ (match_operand:BLK 1 "general_operand" ""))
1.8953 -+ (use (match_operand:SI 2 "const_int_operand" ""))
1.8954 -+ (use (match_operand:SI 3 "const_int_operand" ""))
1.8955 -+ (clobber (match_scratch:SI 4 "=&r"))
1.8956 -+ (clobber (match_scratch:SI 5 "=&r"))
1.8957 -+ (clobber (match_scratch:SI 6 "=&r"))])]
1.8958 -+ "TARGET_INLINE_MEMCPY"
1.8959 -+{
1.8960 -+ rtx ld_addr_reg, st_addr_reg;
1.8961 -+
1.8962 -+ /* If the predicate for op2 fails in expr.c:emit_block_move_via_movstr
1.8963 -+ it trys to copy to a register, but does not re-try the predicate.
1.8964 -+ ??? Intead of fixing expr.c, I fix it here. */
1.8965 -+ if (!const_int_operand (operands[2], SImode))
1.8966 -+ FAIL;
1.8967 -+
1.8968 -+ /* ??? there are some magic numbers which need to be sorted out here.
1.8969 -+ the basis for them is not increasing code size hugely or going
1.8970 -+ out of range of offset addressing */
1.8971 -+ if (INTVAL (operands[3]) < 4)
1.8972 -+ FAIL;
1.8973 -+ if (!optimize
1.8974 -+ || (optimize_size && INTVAL (operands[2]) > 12)
1.8975 -+ || (optimize < 3 && INTVAL (operands[2]) > 100)
1.8976 -+ || INTVAL (operands[2]) > 200)
1.8977 -+ FAIL;
1.8978 -+
1.8979 -+ st_addr_reg
1.8980 -+ = replace_equiv_address (operands[0],
1.8981 -+ copy_to_mode_reg (Pmode, XEXP (operands[0], 0)));
1.8982 -+ ld_addr_reg
1.8983 -+ = replace_equiv_address (operands[1],
1.8984 -+ copy_to_mode_reg (Pmode, XEXP (operands[1], 0)));
1.8985 -+ emit_insn (gen_movstrsi_internal (st_addr_reg, ld_addr_reg,
1.8986 -+ operands[2], operands[3]));
1.8987 -+
1.8988 -+ DONE;
1.8989 -+})
1.8990 -+
1.8991 -+
1.8992 -+(define_insn "movstrsi_internal"
1.8993 -+ [(set (match_operand:BLK 0 "memory_operand" "=o")
1.8994 -+ (match_operand:BLK 1 "memory_operand" "o"))
1.8995 -+ (use (match_operand:SI 2 "const_int_operand" "i"))
1.8996 -+ (use (match_operand:SI 3 "const_int_operand" "i"))
1.8997 -+ (clobber (match_scratch:SI 4 "=&r"))
1.8998 -+ (clobber (match_scratch:SI 5 "=&r"))
1.8999 -+ (clobber (match_scratch:SI 6 "=&r"))]
1.9000 -+ "TARGET_INLINE_MEMCPY"
1.9001 -+{
1.9002 -+ int ld_offset = INTVAL (operands[2]);
1.9003 -+ int ld_len = INTVAL (operands[2]);
1.9004 -+ int ld_reg = 0;
1.9005 -+ rtx ld_addr_reg = XEXP (operands[1], 0);
1.9006 -+ int st_offset = INTVAL (operands[2]);
1.9007 -+ int st_len = INTVAL (operands[2]);
1.9008 -+ int st_reg = 0;
1.9009 -+ rtx st_addr_reg = XEXP (operands[0], 0);
1.9010 -+ int delay_count = 0;
1.9011 -+
1.9012 -+ /* ops[0] is the address used by the insn
1.9013 -+ ops[1] is the register being loaded or stored */
1.9014 -+ rtx ops[2];
1.9015 -+
1.9016 -+ if (INTVAL (operands[3]) < 4)
1.9017 -+ abort ();
1.9018 -+
1.9019 -+ while (ld_offset >= 4)
1.9020 -+ {
1.9021 -+ /* if the load use delay has been met, I can start
1.9022 -+ storing */
1.9023 -+ if (delay_count >= 3)
1.9024 -+ {
1.9025 -+ ops[0] = gen_rtx (MEM, SImode,
1.9026 -+ plus_constant (st_addr_reg, st_len - st_offset));
1.9027 -+ ops[1] = operands[st_reg + 4];
1.9028 -+ output_asm_insn ("stw\t%1, %0", ops);
1.9029 -+
1.9030 -+ st_reg = (st_reg + 1) % 3;
1.9031 -+ st_offset -= 4;
1.9032 -+ }
1.9033 -+
1.9034 -+ ops[0] = gen_rtx (MEM, SImode,
1.9035 -+ plus_constant (ld_addr_reg, ld_len - ld_offset));
1.9036 -+ ops[1] = operands[ld_reg + 4];
1.9037 -+ output_asm_insn ("ldw\t%1, %0", ops);
1.9038 -+
1.9039 -+ ld_reg = (ld_reg + 1) % 3;
1.9040 -+ ld_offset -= 4;
1.9041 -+ delay_count++;
1.9042 -+ }
1.9043 -+
1.9044 -+ if (ld_offset >= 2)
1.9045 -+ {
1.9046 -+ /* if the load use delay has been met, I can start
1.9047 -+ storing */
1.9048 -+ if (delay_count >= 3)
1.9049 -+ {
1.9050 -+ ops[0] = gen_rtx (MEM, SImode,
1.9051 -+ plus_constant (st_addr_reg, st_len - st_offset));
1.9052 -+ ops[1] = operands[st_reg + 4];
1.9053 -+ output_asm_insn ("stw\t%1, %0", ops);
1.9054 -+
1.9055 -+ st_reg = (st_reg + 1) % 3;
1.9056 -+ st_offset -= 4;
1.9057 -+ }
1.9058 -+
1.9059 -+ ops[0] = gen_rtx (MEM, HImode,
1.9060 -+ plus_constant (ld_addr_reg, ld_len - ld_offset));
1.9061 -+ ops[1] = operands[ld_reg + 4];
1.9062 -+ output_asm_insn ("ldh\t%1, %0", ops);
1.9063 -+
1.9064 -+ ld_reg = (ld_reg + 1) % 3;
1.9065 -+ ld_offset -= 2;
1.9066 -+ delay_count++;
1.9067 -+ }
1.9068 -+
1.9069 -+ if (ld_offset >= 1)
1.9070 -+ {
1.9071 -+ /* if the load use delay has been met, I can start
1.9072 -+ storing */
1.9073 -+ if (delay_count >= 3)
1.9074 -+ {
1.9075 -+ ops[0] = gen_rtx (MEM, SImode,
1.9076 -+ plus_constant (st_addr_reg, st_len - st_offset));
1.9077 -+ ops[1] = operands[st_reg + 4];
1.9078 -+ output_asm_insn ("stw\t%1, %0", ops);
1.9079 -+
1.9080 -+ st_reg = (st_reg + 1) % 3;
1.9081 -+ st_offset -= 4;
1.9082 -+ }
1.9083 -+
1.9084 -+ ops[0] = gen_rtx (MEM, QImode,
1.9085 -+ plus_constant (ld_addr_reg, ld_len - ld_offset));
1.9086 -+ ops[1] = operands[ld_reg + 4];
1.9087 -+ output_asm_insn ("ldb\t%1, %0", ops);
1.9088 -+
1.9089 -+ ld_reg = (ld_reg + 1) % 3;
1.9090 -+ ld_offset -= 1;
1.9091 -+ delay_count++;
1.9092 -+ }
1.9093 -+
1.9094 -+ while (st_offset >= 4)
1.9095 -+ {
1.9096 -+ ops[0] = gen_rtx (MEM, SImode,
1.9097 -+ plus_constant (st_addr_reg, st_len - st_offset));
1.9098 -+ ops[1] = operands[st_reg + 4];
1.9099 -+ output_asm_insn ("stw\t%1, %0", ops);
1.9100 -+
1.9101 -+ st_reg = (st_reg + 1) % 3;
1.9102 -+ st_offset -= 4;
1.9103 -+ }
1.9104 -+
1.9105 -+ while (st_offset >= 2)
1.9106 -+ {
1.9107 -+ ops[0] = gen_rtx (MEM, HImode,
1.9108 -+ plus_constant (st_addr_reg, st_len - st_offset));
1.9109 -+ ops[1] = operands[st_reg + 4];
1.9110 -+ output_asm_insn ("sth\t%1, %0", ops);
1.9111 -+
1.9112 -+ st_reg = (st_reg + 1) % 3;
1.9113 -+ st_offset -= 2;
1.9114 -+ }
1.9115 -+
1.9116 -+ while (st_offset >= 1)
1.9117 -+ {
1.9118 -+ ops[0] = gen_rtx (MEM, QImode,
1.9119 -+ plus_constant (st_addr_reg, st_len - st_offset));
1.9120 -+ ops[1] = operands[st_reg + 4];
1.9121 -+ output_asm_insn ("stb\t%1, %0", ops);
1.9122 -+
1.9123 -+ st_reg = (st_reg + 1) % 3;
1.9124 -+ st_offset -= 1;
1.9125 -+ }
1.9126 -+
1.9127 -+ return "";
1.9128 -+}
1.9129 -+; ??? lengths are not being used yet, but I will probably forget
1.9130 -+; to update this once I am using lengths, so set it to something
1.9131 -+; definetely big enough to cover it. 400 allows for 200 bytes
1.9132 -+; of motion.
1.9133 -+ [(set_attr "length" "400")])
1.9134 -+
1.9135 -+
1.9136 -+
1.9137 -+;*****************************************************************************
1.9138 -+;*
1.9139 -+;* Custom instructions
1.9140 -+;*
1.9141 -+;*****************************************************************************
1.9142 -+
1.9143 -+(define_constants [
1.9144 -+ (CUSTOM_N 100)
1.9145 -+ (CUSTOM_NI 101)
1.9146 -+ (CUSTOM_NF 102)
1.9147 -+ (CUSTOM_NP 103)
1.9148 -+ (CUSTOM_NII 104)
1.9149 -+ (CUSTOM_NIF 105)
1.9150 -+ (CUSTOM_NIP 106)
1.9151 -+ (CUSTOM_NFI 107)
1.9152 -+ (CUSTOM_NFF 108)
1.9153 -+ (CUSTOM_NFP 109)
1.9154 -+ (CUSTOM_NPI 110)
1.9155 -+ (CUSTOM_NPF 111)
1.9156 -+ (CUSTOM_NPP 112)
1.9157 -+ (CUSTOM_IN 113)
1.9158 -+ (CUSTOM_INI 114)
1.9159 -+ (CUSTOM_INF 115)
1.9160 -+ (CUSTOM_INP 116)
1.9161 -+ (CUSTOM_INII 117)
1.9162 -+ (CUSTOM_INIF 118)
1.9163 -+ (CUSTOM_INIP 119)
1.9164 -+ (CUSTOM_INFI 120)
1.9165 -+ (CUSTOM_INFF 121)
1.9166 -+ (CUSTOM_INFP 122)
1.9167 -+ (CUSTOM_INPI 123)
1.9168 -+ (CUSTOM_INPF 124)
1.9169 -+ (CUSTOM_INPP 125)
1.9170 -+ (CUSTOM_FN 126)
1.9171 -+ (CUSTOM_FNI 127)
1.9172 -+ (CUSTOM_FNF 128)
1.9173 -+ (CUSTOM_FNP 129)
1.9174 -+ (CUSTOM_FNII 130)
1.9175 -+ (CUSTOM_FNIF 131)
1.9176 -+ (CUSTOM_FNIP 132)
1.9177 -+ (CUSTOM_FNFI 133)
1.9178 -+ (CUSTOM_FNFF 134)
1.9179 -+ (CUSTOM_FNFP 135)
1.9180 -+ (CUSTOM_FNPI 136)
1.9181 -+ (CUSTOM_FNPF 137)
1.9182 -+ (CUSTOM_FNPP 138)
1.9183 -+ (CUSTOM_PN 139)
1.9184 -+ (CUSTOM_PNI 140)
1.9185 -+ (CUSTOM_PNF 141)
1.9186 -+ (CUSTOM_PNP 142)
1.9187 -+ (CUSTOM_PNII 143)
1.9188 -+ (CUSTOM_PNIF 144)
1.9189 -+ (CUSTOM_PNIP 145)
1.9190 -+ (CUSTOM_PNFI 146)
1.9191 -+ (CUSTOM_PNFF 147)
1.9192 -+ (CUSTOM_PNFP 148)
1.9193 -+ (CUSTOM_PNPI 149)
1.9194 -+ (CUSTOM_PNPF 150)
1.9195 -+ (CUSTOM_PNPP 151)
1.9196 -+])
1.9197 -+
1.9198 -+
1.9199 -+(define_insn "custom_n"
1.9200 -+ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")] CUSTOM_N)]
1.9201 -+ ""
1.9202 -+ "custom\\t%0, zero, zero, zero"
1.9203 -+ [(set_attr "type" "custom")])
1.9204 -+
1.9205 -+(define_insn "custom_ni"
1.9206 -+ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
1.9207 -+ (match_operand:SI 1 "register_operand" "r")] CUSTOM_NI)]
1.9208 -+ ""
1.9209 -+ "custom\\t%0, zero, %1, zero"
1.9210 -+ [(set_attr "type" "custom")])
1.9211 -+
1.9212 -+(define_insn "custom_nf"
1.9213 -+ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
1.9214 -+ (match_operand:SF 1 "register_operand" "r")] CUSTOM_NF)]
1.9215 -+ ""
1.9216 -+ "custom\\t%0, zero, %1, zero"
1.9217 -+ [(set_attr "type" "custom")])
1.9218 -+
1.9219 -+(define_insn "custom_np"
1.9220 -+ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
1.9221 -+ (match_operand:SI 1 "register_operand" "r")] CUSTOM_NP)]
1.9222 -+ ""
1.9223 -+ "custom\\t%0, zero, %1, zero"
1.9224 -+ [(set_attr "type" "custom")])
1.9225 -+
1.9226 -+(define_insn "custom_nii"
1.9227 -+ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
1.9228 -+ (match_operand:SI 1 "register_operand" "r")
1.9229 -+ (match_operand:SI 2 "register_operand" "r")] CUSTOM_NII)]
1.9230 -+ ""
1.9231 -+ "custom\\t%0, zero, %1, %2"
1.9232 -+ [(set_attr "type" "custom")])
1.9233 -+
1.9234 -+(define_insn "custom_nif"
1.9235 -+ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
1.9236 -+ (match_operand:SI 1 "register_operand" "r")
1.9237 -+ (match_operand:SF 2 "register_operand" "r")] CUSTOM_NIF)]
1.9238 -+ ""
1.9239 -+ "custom\\t%0, zero, %1, %2"
1.9240 -+ [(set_attr "type" "custom")])
1.9241 -+
1.9242 -+(define_insn "custom_nip"
1.9243 -+ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
1.9244 -+ (match_operand:SI 1 "register_operand" "r")
1.9245 -+ (match_operand:SI 2 "register_operand" "r")] CUSTOM_NIP)]
1.9246 -+ ""
1.9247 -+ "custom\\t%0, zero, %1, %2"
1.9248 -+ [(set_attr "type" "custom")])
1.9249 -+
1.9250 -+(define_insn "custom_nfi"
1.9251 -+ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
1.9252 -+ (match_operand:SF 1 "register_operand" "r")
1.9253 -+ (match_operand:SI 2 "register_operand" "r")] CUSTOM_NFI)]
1.9254 -+ ""
1.9255 -+ "custom\\t%0, zero, %1, %2"
1.9256 -+ [(set_attr "type" "custom")])
1.9257 -+
1.9258 -+(define_insn "custom_nff"
1.9259 -+ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
1.9260 -+ (match_operand:SF 1 "register_operand" "r")
1.9261 -+ (match_operand:SF 2 "register_operand" "r")] CUSTOM_NFF)]
1.9262 -+ ""
1.9263 -+ "custom\\t%0, zero, %1, %2"
1.9264 -+ [(set_attr "type" "custom")])
1.9265 -+
1.9266 -+(define_insn "custom_nfp"
1.9267 -+ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
1.9268 -+ (match_operand:SF 1 "register_operand" "r")
1.9269 -+ (match_operand:SI 2 "register_operand" "r")] CUSTOM_NFP)]
1.9270 -+ ""
1.9271 -+ "custom\\t%0, zero, %1, %2"
1.9272 -+ [(set_attr "type" "custom")])
1.9273 -+
1.9274 -+(define_insn "custom_npi"
1.9275 -+ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
1.9276 -+ (match_operand:SI 1 "register_operand" "r")
1.9277 -+ (match_operand:SI 2 "register_operand" "r")] CUSTOM_NPI)]
1.9278 -+ ""
1.9279 -+ "custom\\t%0, zero, %1, %2"
1.9280 -+ [(set_attr "type" "custom")])
1.9281 -+
1.9282 -+(define_insn "custom_npf"
1.9283 -+ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
1.9284 -+ (match_operand:SI 1 "register_operand" "r")
1.9285 -+ (match_operand:SF 2 "register_operand" "r")] CUSTOM_NPF)]
1.9286 -+ ""
1.9287 -+ "custom\\t%0, zero, %1, %2"
1.9288 -+ [(set_attr "type" "custom")])
1.9289 -+
1.9290 -+(define_insn "custom_npp"
1.9291 -+ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
1.9292 -+ (match_operand:SI 1 "register_operand" "r")
1.9293 -+ (match_operand:SI 2 "register_operand" "r")] CUSTOM_NPP)]
1.9294 -+ ""
1.9295 -+ "custom\\t%0, zero, %1, %2"
1.9296 -+ [(set_attr "type" "custom")])
1.9297 -+
1.9298 -+
1.9299 -+
1.9300 -+(define_insn "custom_in"
1.9301 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9302 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")] CUSTOM_IN))]
1.9303 -+ ""
1.9304 -+ "custom\\t%1, %0, zero, zero"
1.9305 -+ [(set_attr "type" "custom")])
1.9306 -+
1.9307 -+(define_insn "custom_ini"
1.9308 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9309 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9310 -+ (match_operand:SI 2 "register_operand" "r")] CUSTOM_INI))]
1.9311 -+ ""
1.9312 -+ "custom\\t%1, %0, %2, zero"
1.9313 -+ [(set_attr "type" "custom")])
1.9314 -+
1.9315 -+(define_insn "custom_inf"
1.9316 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9317 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9318 -+ (match_operand:SF 2 "register_operand" "r")] CUSTOM_INF))]
1.9319 -+ ""
1.9320 -+ "custom\\t%1, %0, %2, zero"
1.9321 -+ [(set_attr "type" "custom")])
1.9322 -+
1.9323 -+(define_insn "custom_inp"
1.9324 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9325 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9326 -+ (match_operand:SI 2 "register_operand" "r")] CUSTOM_INP))]
1.9327 -+ ""
1.9328 -+ "custom\\t%1, %0, %2, zero"
1.9329 -+ [(set_attr "type" "custom")])
1.9330 -+
1.9331 -+(define_insn "custom_inii"
1.9332 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9333 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9334 -+ (match_operand:SI 2 "register_operand" "r")
1.9335 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_INII))]
1.9336 -+ ""
1.9337 -+ "custom\\t%1, %0, %2, %3"
1.9338 -+ [(set_attr "type" "custom")])
1.9339 -+
1.9340 -+(define_insn "custom_inif"
1.9341 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9342 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9343 -+ (match_operand:SI 2 "register_operand" "r")
1.9344 -+ (match_operand:SF 3 "register_operand" "r")] CUSTOM_INIF))]
1.9345 -+ ""
1.9346 -+ "custom\\t%1, %0, %2, %3"
1.9347 -+ [(set_attr "type" "custom")])
1.9348 -+
1.9349 -+(define_insn "custom_inip"
1.9350 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9351 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9352 -+ (match_operand:SI 2 "register_operand" "r")
1.9353 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_INIP))]
1.9354 -+ ""
1.9355 -+ "custom\\t%1, %0, %2, %3"
1.9356 -+ [(set_attr "type" "custom")])
1.9357 -+
1.9358 -+(define_insn "custom_infi"
1.9359 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9360 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9361 -+ (match_operand:SF 2 "register_operand" "r")
1.9362 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_INFI))]
1.9363 -+ ""
1.9364 -+ "custom\\t%1, %0, %2, %3"
1.9365 -+ [(set_attr "type" "custom")])
1.9366 -+
1.9367 -+(define_insn "custom_inff"
1.9368 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9369 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9370 -+ (match_operand:SF 2 "register_operand" "r")
1.9371 -+ (match_operand:SF 3 "register_operand" "r")] CUSTOM_INFF))]
1.9372 -+ ""
1.9373 -+ "custom\\t%1, %0, %2, %3"
1.9374 -+ [(set_attr "type" "custom")])
1.9375 -+
1.9376 -+(define_insn "custom_infp"
1.9377 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9378 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9379 -+ (match_operand:SF 2 "register_operand" "r")
1.9380 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_INFP))]
1.9381 -+ ""
1.9382 -+ "custom\\t%1, %0, %2, %3"
1.9383 -+ [(set_attr "type" "custom")])
1.9384 -+
1.9385 -+(define_insn "custom_inpi"
1.9386 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9387 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9388 -+ (match_operand:SI 2 "register_operand" "r")
1.9389 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_INPI))]
1.9390 -+ ""
1.9391 -+ "custom\\t%1, %0, %2, %3"
1.9392 -+ [(set_attr "type" "custom")])
1.9393 -+
1.9394 -+(define_insn "custom_inpf"
1.9395 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9396 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9397 -+ (match_operand:SI 2 "register_operand" "r")
1.9398 -+ (match_operand:SF 3 "register_operand" "r")] CUSTOM_INPF))]
1.9399 -+ ""
1.9400 -+ "custom\\t%1, %0, %2, %3"
1.9401 -+ [(set_attr "type" "custom")])
1.9402 -+
1.9403 -+(define_insn "custom_inpp"
1.9404 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9405 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9406 -+ (match_operand:SI 2 "register_operand" "r")
1.9407 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_INPP))]
1.9408 -+ ""
1.9409 -+ "custom\\t%1, %0, %2, %3"
1.9410 -+ [(set_attr "type" "custom")])
1.9411 -+
1.9412 -+
1.9413 -+
1.9414 -+
1.9415 -+
1.9416 -+(define_insn "custom_fn"
1.9417 -+ [(set (match_operand:SF 0 "register_operand" "=r")
1.9418 -+ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")] CUSTOM_FN))]
1.9419 -+ ""
1.9420 -+ "custom\\t%1, %0, zero, zero"
1.9421 -+ [(set_attr "type" "custom")])
1.9422 -+
1.9423 -+(define_insn "custom_fni"
1.9424 -+ [(set (match_operand:SF 0 "register_operand" "=r")
1.9425 -+ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9426 -+ (match_operand:SI 2 "register_operand" "r")] CUSTOM_FNI))]
1.9427 -+ ""
1.9428 -+ "custom\\t%1, %0, %2, zero"
1.9429 -+ [(set_attr "type" "custom")])
1.9430 -+
1.9431 -+(define_insn "custom_fnf"
1.9432 -+ [(set (match_operand:SF 0 "register_operand" "=r")
1.9433 -+ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9434 -+ (match_operand:SF 2 "register_operand" "r")] CUSTOM_FNF))]
1.9435 -+ ""
1.9436 -+ "custom\\t%1, %0, %2, zero"
1.9437 -+ [(set_attr "type" "custom")])
1.9438 -+
1.9439 -+(define_insn "custom_fnp"
1.9440 -+ [(set (match_operand:SF 0 "register_operand" "=r")
1.9441 -+ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9442 -+ (match_operand:SI 2 "register_operand" "r")] CUSTOM_FNP))]
1.9443 -+ ""
1.9444 -+ "custom\\t%1, %0, %2, zero"
1.9445 -+ [(set_attr "type" "custom")])
1.9446 -+
1.9447 -+(define_insn "custom_fnii"
1.9448 -+ [(set (match_operand:SF 0 "register_operand" "=r")
1.9449 -+ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9450 -+ (match_operand:SI 2 "register_operand" "r")
1.9451 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_FNII))]
1.9452 -+ ""
1.9453 -+ "custom\\t%1, %0, %2, %3"
1.9454 -+ [(set_attr "type" "custom")])
1.9455 -+
1.9456 -+(define_insn "custom_fnif"
1.9457 -+ [(set (match_operand:SF 0 "register_operand" "=r")
1.9458 -+ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9459 -+ (match_operand:SI 2 "register_operand" "r")
1.9460 -+ (match_operand:SF 3 "register_operand" "r")] CUSTOM_FNIF))]
1.9461 -+ ""
1.9462 -+ "custom\\t%1, %0, %2, %3"
1.9463 -+ [(set_attr "type" "custom")])
1.9464 -+
1.9465 -+(define_insn "custom_fnip"
1.9466 -+ [(set (match_operand:SF 0 "register_operand" "=r")
1.9467 -+ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9468 -+ (match_operand:SI 2 "register_operand" "r")
1.9469 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_FNIP))]
1.9470 -+ ""
1.9471 -+ "custom\\t%1, %0, %2, %3"
1.9472 -+ [(set_attr "type" "custom")])
1.9473 -+
1.9474 -+(define_insn "custom_fnfi"
1.9475 -+ [(set (match_operand:SF 0 "register_operand" "=r")
1.9476 -+ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9477 -+ (match_operand:SF 2 "register_operand" "r")
1.9478 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_FNFI))]
1.9479 -+ ""
1.9480 -+ "custom\\t%1, %0, %2, %3"
1.9481 -+ [(set_attr "type" "custom")])
1.9482 -+
1.9483 -+(define_insn "custom_fnff"
1.9484 -+ [(set (match_operand:SF 0 "register_operand" "=r")
1.9485 -+ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9486 -+ (match_operand:SF 2 "register_operand" "r")
1.9487 -+ (match_operand:SF 3 "register_operand" "r")] CUSTOM_FNFF))]
1.9488 -+ ""
1.9489 -+ "custom\\t%1, %0, %2, %3"
1.9490 -+ [(set_attr "type" "custom")])
1.9491 -+
1.9492 -+(define_insn "custom_fnfp"
1.9493 -+ [(set (match_operand:SF 0 "register_operand" "=r")
1.9494 -+ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9495 -+ (match_operand:SF 2 "register_operand" "r")
1.9496 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_FNFP))]
1.9497 -+ ""
1.9498 -+ "custom\\t%1, %0, %2, %3"
1.9499 -+ [(set_attr "type" "custom")])
1.9500 -+
1.9501 -+(define_insn "custom_fnpi"
1.9502 -+ [(set (match_operand:SF 0 "register_operand" "=r")
1.9503 -+ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9504 -+ (match_operand:SI 2 "register_operand" "r")
1.9505 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_FNPI))]
1.9506 -+ ""
1.9507 -+ "custom\\t%1, %0, %2, %3"
1.9508 -+ [(set_attr "type" "custom")])
1.9509 -+
1.9510 -+(define_insn "custom_fnpf"
1.9511 -+ [(set (match_operand:SF 0 "register_operand" "=r")
1.9512 -+ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9513 -+ (match_operand:SI 2 "register_operand" "r")
1.9514 -+ (match_operand:SF 3 "register_operand" "r")] CUSTOM_FNPF))]
1.9515 -+ ""
1.9516 -+ "custom\\t%1, %0, %2, %3"
1.9517 -+ [(set_attr "type" "custom")])
1.9518 -+
1.9519 -+(define_insn "custom_fnpp"
1.9520 -+ [(set (match_operand:SF 0 "register_operand" "=r")
1.9521 -+ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9522 -+ (match_operand:SI 2 "register_operand" "r")
1.9523 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_FNPP))]
1.9524 -+ ""
1.9525 -+ "custom\\t%1, %0, %2, %3"
1.9526 -+ [(set_attr "type" "custom")])
1.9527 -+
1.9528 -+
1.9529 -+
1.9530 -+(define_insn "custom_pn"
1.9531 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9532 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")] CUSTOM_PN))]
1.9533 -+ ""
1.9534 -+ "custom\\t%1, %0, zero, zero"
1.9535 -+ [(set_attr "type" "custom")])
1.9536 -+
1.9537 -+(define_insn "custom_pni"
1.9538 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9539 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9540 -+ (match_operand:SI 2 "register_operand" "r")] CUSTOM_PNI))]
1.9541 -+ ""
1.9542 -+ "custom\\t%1, %0, %2, zero"
1.9543 -+ [(set_attr "type" "custom")])
1.9544 -+
1.9545 -+(define_insn "custom_pnf"
1.9546 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9547 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9548 -+ (match_operand:SF 2 "register_operand" "r")] CUSTOM_PNF))]
1.9549 -+ ""
1.9550 -+ "custom\\t%1, %0, %2, zero"
1.9551 -+ [(set_attr "type" "custom")])
1.9552 -+
1.9553 -+(define_insn "custom_pnp"
1.9554 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9555 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9556 -+ (match_operand:SI 2 "register_operand" "r")] CUSTOM_PNP))]
1.9557 -+ ""
1.9558 -+ "custom\\t%1, %0, %2, zero"
1.9559 -+ [(set_attr "type" "custom")])
1.9560 -+
1.9561 -+(define_insn "custom_pnii"
1.9562 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9563 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9564 -+ (match_operand:SI 2 "register_operand" "r")
1.9565 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_PNII))]
1.9566 -+ ""
1.9567 -+ "custom\\t%1, %0, %2, %3"
1.9568 -+ [(set_attr "type" "custom")])
1.9569 -+
1.9570 -+(define_insn "custom_pnif"
1.9571 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9572 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9573 -+ (match_operand:SI 2 "register_operand" "r")
1.9574 -+ (match_operand:SF 3 "register_operand" "r")] CUSTOM_PNIF))]
1.9575 -+ ""
1.9576 -+ "custom\\t%1, %0, %2, %3"
1.9577 -+ [(set_attr "type" "custom")])
1.9578 -+
1.9579 -+(define_insn "custom_pnip"
1.9580 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9581 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9582 -+ (match_operand:SI 2 "register_operand" "r")
1.9583 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_PNIP))]
1.9584 -+ ""
1.9585 -+ "custom\\t%1, %0, %2, %3"
1.9586 -+ [(set_attr "type" "custom")])
1.9587 -+
1.9588 -+(define_insn "custom_pnfi"
1.9589 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9590 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9591 -+ (match_operand:SF 2 "register_operand" "r")
1.9592 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_PNFI))]
1.9593 -+ ""
1.9594 -+ "custom\\t%1, %0, %2, %3"
1.9595 -+ [(set_attr "type" "custom")])
1.9596 -+
1.9597 -+(define_insn "custom_pnff"
1.9598 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9599 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9600 -+ (match_operand:SF 2 "register_operand" "r")
1.9601 -+ (match_operand:SF 3 "register_operand" "r")] CUSTOM_PNFF))]
1.9602 -+ ""
1.9603 -+ "custom\\t%1, %0, %2, %3"
1.9604 -+ [(set_attr "type" "custom")])
1.9605 -+
1.9606 -+(define_insn "custom_pnfp"
1.9607 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9608 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9609 -+ (match_operand:SF 2 "register_operand" "r")
1.9610 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_PNFP))]
1.9611 -+ ""
1.9612 -+ "custom\\t%1, %0, %2, %3"
1.9613 -+ [(set_attr "type" "custom")])
1.9614 -+
1.9615 -+(define_insn "custom_pnpi"
1.9616 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9617 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9618 -+ (match_operand:SI 2 "register_operand" "r")
1.9619 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_PNPI))]
1.9620 -+ ""
1.9621 -+ "custom\\t%1, %0, %2, %3"
1.9622 -+ [(set_attr "type" "custom")])
1.9623 -+
1.9624 -+(define_insn "custom_pnpf"
1.9625 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9626 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9627 -+ (match_operand:SI 2 "register_operand" "r")
1.9628 -+ (match_operand:SF 3 "register_operand" "r")] CUSTOM_PNPF))]
1.9629 -+ ""
1.9630 -+ "custom\\t%1, %0, %2, %3"
1.9631 -+ [(set_attr "type" "custom")])
1.9632 -+
1.9633 -+(define_insn "custom_pnpp"
1.9634 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9635 -+ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
1.9636 -+ (match_operand:SI 2 "register_operand" "r")
1.9637 -+ (match_operand:SI 3 "register_operand" "r")] CUSTOM_PNPP))]
1.9638 -+ ""
1.9639 -+ "custom\\t%1, %0, %2, %3"
1.9640 -+ [(set_attr "type" "custom")])
1.9641 -+
1.9642 -+
1.9643 -+
1.9644 -+
1.9645 -+
1.9646 -+
1.9647 -+;*****************************************************************************
1.9648 -+;*
1.9649 -+;* Misc
1.9650 -+;*
1.9651 -+;*****************************************************************************
1.9652 -+
1.9653 -+(define_insn "nop"
1.9654 -+ [(const_int 0)]
1.9655 -+ ""
1.9656 -+ "nop\\t"
1.9657 -+ [(set_attr "type" "alu")])
1.9658 -+
1.9659 -+(define_insn "sync"
1.9660 -+ [(unspec_volatile [(const_int 0)] UNSPEC_SYNC)]
1.9661 -+ ""
1.9662 -+ "sync\\t"
1.9663 -+ [(set_attr "type" "control")])
1.9664 -+
1.9665 -+
1.9666 -+(define_insn "rdctl"
1.9667 -+ [(set (match_operand:SI 0 "register_operand" "=r")
1.9668 -+ (unspec_volatile:SI [(match_operand:SI 1 "rdwrctl_operand" "O")] UNSPEC_RDCTL))]
1.9669 -+ ""
1.9670 -+ "rdctl\\t%0, ctl%1"
1.9671 -+ [(set_attr "type" "control")])
1.9672 -+
1.9673 -+(define_insn "wrctl"
1.9674 -+ [(unspec_volatile:SI [(match_operand:SI 0 "rdwrctl_operand" "O")
1.9675 -+ (match_operand:SI 1 "register_operand" "r")] UNSPEC_WRCTL)]
1.9676 -+ ""
1.9677 -+ "wrctl\\tctl%0, %1"
1.9678 -+ [(set_attr "type" "control")])
1.9679 -+
1.9680 -+
1.9681 -+
1.9682 -+;*****************************************************************************
1.9683 -+;*
1.9684 -+;* Peepholes
1.9685 -+;*
1.9686 -+;*****************************************************************************
1.9687 -+
1.9688 -+
1.9689 -diff -durN gcc-3.4.6.orig/gcc/config/nios2/nios2-protos.h gcc-3.4.6/gcc/config/nios2/nios2-protos.h
1.9690 ---- gcc-3.4.6.orig/gcc/config/nios2/nios2-protos.h 1970-01-01 01:00:00.000000000 +0100
1.9691 -+++ gcc-3.4.6/gcc/config/nios2/nios2-protos.h 2007-08-15 23:09:36.000000000 +0200
1.9692 -@@ -0,0 +1,70 @@
1.9693 -+/* Subroutines for assembler code output for Altera NIOS 2G NIOS2 version.
1.9694 -+ Copyright (C) 2003 Altera
1.9695 -+ Contributed by Jonah Graham (jgraham@altera.com).
1.9696 -+
1.9697 -+This file is part of GNU CC.
1.9698 -+
1.9699 -+GNU CC is free software; you can redistribute it and/or modify
1.9700 -+it under the terms of the GNU General Public License as published by
1.9701 -+the Free Software Foundation; either version 2, or (at your option)
1.9702 -+any later version.
1.9703 -+
1.9704 -+GNU CC is distributed in the hope that it will be useful,
1.9705 -+but WITHOUT ANY WARRANTY; without even the implied warranty of
1.9706 -+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1.9707 -+GNU General Public License for more details.
1.9708 -+
1.9709 -+You should have received a copy of the GNU General Public License
1.9710 -+along with GNU CC; see the file COPYING. If not, write to
1.9711 -+the Free Software Foundation, 59 Temple Place - Suite 330,
1.9712 -+Boston, MA 02111-1307, USA. */
1.9713 -+
1.9714 -+extern void dump_frame_size (FILE *);
1.9715 -+extern HOST_WIDE_INT compute_frame_size (void);
1.9716 -+extern int nios2_initial_elimination_offset (int, int);
1.9717 -+extern void override_options (void);
1.9718 -+extern void optimization_options (int, int);
1.9719 -+extern int nios2_can_use_return_insn (void);
1.9720 -+extern void expand_prologue (void);
1.9721 -+extern void expand_epilogue (bool);
1.9722 -+extern void function_profiler (FILE *, int);
1.9723 -+
1.9724 -+
1.9725 -+#ifdef RTX_CODE
1.9726 -+extern int nios2_legitimate_address (rtx, enum machine_mode, int);
1.9727 -+extern void nios2_print_operand (FILE *, rtx, int);
1.9728 -+extern void nios2_print_operand_address (FILE *, rtx);
1.9729 -+
1.9730 -+extern int nios2_emit_move_sequence (rtx *, enum machine_mode);
1.9731 -+extern int nios2_emit_expensive_div (rtx *, enum machine_mode);
1.9732 -+
1.9733 -+extern void gen_int_relational (enum rtx_code, rtx, rtx, rtx, rtx);
1.9734 -+extern void gen_conditional_move (rtx *, enum machine_mode);
1.9735 -+extern const char *asm_output_opcode (FILE *, const char *);
1.9736 -+
1.9737 -+/* predicates */
1.9738 -+extern int arith_operand (rtx, enum machine_mode);
1.9739 -+extern int uns_arith_operand (rtx, enum machine_mode);
1.9740 -+extern int logical_operand (rtx, enum machine_mode);
1.9741 -+extern int shift_operand (rtx, enum machine_mode);
1.9742 -+extern int reg_or_0_operand (rtx, enum machine_mode);
1.9743 -+extern int equality_op (rtx, enum machine_mode);
1.9744 -+extern int custom_insn_opcode (rtx, enum machine_mode);
1.9745 -+extern int rdwrctl_operand (rtx, enum machine_mode);
1.9746 -+
1.9747 -+# ifdef HAVE_MACHINE_MODES
1.9748 -+# if defined TREE_CODE
1.9749 -+extern void function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode, tree, int);
1.9750 -+extern rtx function_arg (const CUMULATIVE_ARGS *, enum machine_mode, tree, int);
1.9751 -+extern int function_arg_partial_nregs (const CUMULATIVE_ARGS *, enum machine_mode, tree, int);
1.9752 -+extern void init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree, int);
1.9753 -+extern int nios2_setup_incoming_varargs (const CUMULATIVE_ARGS *, enum machine_mode, tree, int);
1.9754 -+
1.9755 -+# endif /* TREE_CODE */
1.9756 -+# endif /* HAVE_MACHINE_MODES */
1.9757 -+#endif
1.9758 -+
1.9759 -+#ifdef TREE_CODE
1.9760 -+extern int nios2_return_in_memory (tree);
1.9761 -+
1.9762 -+#endif /* TREE_CODE */
1.9763 -diff -durN gcc-3.4.6.orig/gcc/config/nios2/t-nios2 gcc-3.4.6/gcc/config/nios2/t-nios2
1.9764 ---- gcc-3.4.6.orig/gcc/config/nios2/t-nios2 1970-01-01 01:00:00.000000000 +0100
1.9765 -+++ gcc-3.4.6/gcc/config/nios2/t-nios2 2007-08-15 23:09:36.000000000 +0200
1.9766 -@@ -0,0 +1,123 @@
1.9767 -+##
1.9768 -+## Compiler flags to use when compiling libgcc2.c.
1.9769 -+##
1.9770 -+## LIB2FUNCS_EXTRA
1.9771 -+## A list of source file names to be compiled or assembled and inserted into libgcc.a.
1.9772 -+
1.9773 -+LIB2FUNCS_EXTRA=$(srcdir)/config/nios2/lib2-divmod.c \
1.9774 -+ $(srcdir)/config/nios2/lib2-divmod-hi.c \
1.9775 -+ $(srcdir)/config/nios2/lib2-divtable.c \
1.9776 -+ $(srcdir)/config/nios2/lib2-mul.c
1.9777 -+
1.9778 -+##
1.9779 -+## Floating Point Emulation
1.9780 -+## To have GCC include software floating point libraries in libgcc.a define FPBIT
1.9781 -+## and DPBIT along with a few rules as follows:
1.9782 -+##
1.9783 -+## # We want fine grained libraries, so use the new code
1.9784 -+## # to build the floating point emulation libraries.
1.9785 -+FPBIT=$(srcdir)/config/nios2/nios2-fp-bit.c
1.9786 -+DPBIT=$(srcdir)/config/nios2/nios2-dp-bit.c
1.9787 -+
1.9788 -+TARGET_LIBGCC2_CFLAGS = -O2
1.9789 -+
1.9790 -+# FLOAT_ONLY - no doubles
1.9791 -+# SMALL_MACHINE - QI/HI is faster than SI
1.9792 -+# Actually SMALL_MACHINE uses chars and shorts instead of ints
1.9793 -+# since ints (16-bit ones as they are today) are at least as fast
1.9794 -+# as chars and shorts, don't define SMALL_MACHINE
1.9795 -+# CMPtype - type returned by FP compare, i.e. INT (hard coded in fp-bit - see code )
1.9796 -+
1.9797 -+$(FPBIT): $(srcdir)/config/fp-bit.c Makefile
1.9798 -+ echo '#define FLOAT' > ${FPBIT}
1.9799 -+ cat $(srcdir)/config/fp-bit.c >> ${FPBIT}
1.9800 -+
1.9801 -+$(DPBIT): $(srcdir)/config/fp-bit.c Makefile
1.9802 -+ echo '' > ${DPBIT}
1.9803 -+ cat $(srcdir)/config/fp-bit.c >> ${DPBIT}
1.9804 -+
1.9805 -+EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crti.o crtn.o
1.9806 -+
1.9807 -+# Assemble startup files.
1.9808 -+$(T)crti.o: $(srcdir)/config/nios2/crti.asm $(GCC_PASSES)
1.9809 -+ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
1.9810 -+ -c -o $(T)crti.o -x assembler-with-cpp $(srcdir)/config/nios2/crti.asm
1.9811 -+
1.9812 -+$(T)crtn.o: $(srcdir)/config/nios2/crtn.asm $(GCC_PASSES)
1.9813 -+ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
1.9814 -+ -c -o $(T)crtn.o -x assembler-with-cpp $(srcdir)/config/nios2/crtn.asm
1.9815 -+
1.9816 -+
1.9817 -+## You may need to provide additional #defines at the beginning of
1.9818 -+## fp-bit.c and dp-bit.c to control target endianness and other options
1.9819 -+##
1.9820 -+## CRTSTUFF_T_CFLAGS
1.9821 -+## Special flags used when compiling crtstuff.c. See Initialization.
1.9822 -+##
1.9823 -+## CRTSTUFF_T_CFLAGS_S
1.9824 -+## Special flags used when compiling crtstuff.c for shared linking. Used
1.9825 -+## if you use crtbeginS.o and crtendS.o in EXTRA-PARTS. See Initialization.
1.9826 -+##
1.9827 -+## MULTILIB_OPTIONS
1.9828 -+## For some targets, invoking GCC in different ways produces objects that
1.9829 -+## can not be linked together. For example, for some targets GCC produces
1.9830 -+## both big and little endian code. For these targets, you must arrange
1.9831 -+## for multiple versions of libgcc.a to be compiled, one for each set of
1.9832 -+## incompatible options. When GCC invokes the linker, it arranges to link
1.9833 -+## in the right version of libgcc.a, based on the command line options
1.9834 -+## used.
1.9835 -+## The MULTILIB_OPTIONS macro lists the set of options for which special
1.9836 -+## versions of libgcc.a must be built. Write options that are mutually
1.9837 -+## incompatible side by side, separated by a slash. Write options that may
1.9838 -+## be used together separated by a space. The build procedure will build
1.9839 -+## all combinations of compatible options.
1.9840 -+##
1.9841 -+## For example, if you set MULTILIB_OPTIONS to m68000/m68020 msoft-float,
1.9842 -+## Makefile will build special versions of libgcc.a using the following
1.9843 -+## sets of options: -m68000, -m68020, -msoft-float, -m68000 -msoft-float,
1.9844 -+## and -m68020 -msoft-float.
1.9845 -+
1.9846 -+MULTILIB_OPTIONS = mno-hw-mul mhw-mulx
1.9847 -+
1.9848 -+## MULTILIB_DIRNAMES
1.9849 -+## If MULTILIB_OPTIONS is used, this variable specifies the directory names
1.9850 -+## that should be used to hold the various libraries. Write one element in
1.9851 -+## MULTILIB_DIRNAMES for each element in MULTILIB_OPTIONS. If
1.9852 -+## MULTILIB_DIRNAMES is not used, the default value will be
1.9853 -+## MULTILIB_OPTIONS, with all slashes treated as spaces.
1.9854 -+## For example, if MULTILIB_OPTIONS is set to m68000/m68020 msoft-float,
1.9855 -+## then the default value of MULTILIB_DIRNAMES is m68000 m68020
1.9856 -+## msoft-float. You may specify a different value if you desire a
1.9857 -+## different set of directory names.
1.9858 -+
1.9859 -+# MULTILIB_DIRNAMES =
1.9860 -+
1.9861 -+## MULTILIB_MATCHES
1.9862 -+## Sometimes the same option may be written in two different ways. If an
1.9863 -+## option is listed in MULTILIB_OPTIONS, GCC needs to know about any
1.9864 -+## synonyms. In that case, set MULTILIB_MATCHES to a list of items of the
1.9865 -+## form option=option to describe all relevant synonyms. For example,
1.9866 -+## m68000=mc68000 m68020=mc68020.
1.9867 -+##
1.9868 -+## MULTILIB_EXCEPTIONS
1.9869 -+## Sometimes when there are multiple sets of MULTILIB_OPTIONS being
1.9870 -+## specified, there are combinations that should not be built. In that
1.9871 -+## case, set MULTILIB_EXCEPTIONS to be all of the switch exceptions in
1.9872 -+## shell case syntax that should not be built.
1.9873 -+## For example, in the PowerPC embedded ABI support, it is not desirable to
1.9874 -+## build libraries compiled with the -mcall-aix option and either of the
1.9875 -+## -fleading-underscore or -mlittle options at the same time. Therefore
1.9876 -+## MULTILIB_EXCEPTIONS is set to
1.9877 -+##
1.9878 -+## *mcall-aix/*fleading-underscore* *mlittle/*mcall-aix*
1.9879 -+##
1.9880 -+
1.9881 -+MULTILIB_EXCEPTIONS = *mno-hw-mul/*mhw-mulx*
1.9882 -+
1.9883 -+##
1.9884 -+## MULTILIB_EXTRA_OPTS Sometimes it is desirable that when building
1.9885 -+## multiple versions of libgcc.a certain options should always be passed on
1.9886 -+## to the compiler. In that case, set MULTILIB_EXTRA_OPTS to be the list
1.9887 -+## of options to be used for all builds.
1.9888 -+##
1.9889 -+
1.9890 -diff -durN gcc-3.4.6.orig/gcc/config.gcc gcc-3.4.6/gcc/config.gcc
1.9891 ---- gcc-3.4.6.orig/gcc/config.gcc 2007-08-15 23:07:00.000000000 +0200
1.9892 -+++ gcc-3.4.6/gcc/config.gcc 2007-08-15 23:09:36.000000000 +0200
1.9893 -@@ -1342,6 +1342,10 @@
1.9894 - thread_file='posix'
1.9895 - fi
1.9896 - ;;
1.9897 -+# JBG
1.9898 -+nios2-*-* | nios2-*-*)
1.9899 -+ tm_file="elfos.h ${tm_file}"
1.9900 -+ ;;
1.9901 - # m68hc11 and m68hc12 share the same machine description.
1.9902 - m68hc11-*-*|m6811-*-*)
1.9903 - tm_file="dbxelf.h elfos.h m68hc11/m68hc11.h"
1.9904 -diff -durN gcc-3.4.6.orig/gcc/cse.c gcc-3.4.6/gcc/cse.c
1.9905 ---- gcc-3.4.6.orig/gcc/cse.c 2005-12-31 01:39:42.000000000 +0100
1.9906 -+++ gcc-3.4.6/gcc/cse.c 2007-08-15 23:09:36.000000000 +0200
1.9907 -@@ -3134,6 +3134,10 @@
1.9908 - #ifdef FLOAT_STORE_FLAG_VALUE
1.9909 - REAL_VALUE_TYPE fsfv;
1.9910 - #endif
1.9911 -+#ifdef __nios2__
1.9912 -+ if (p->is_const)
1.9913 -+ break;
1.9914 -+#endif
1.9915 -
1.9916 - /* If the entry isn't valid, skip it. */
1.9917 - if (! exp_equiv_p (p->exp, p->exp, 1, 0))
1.9918 -diff -durN gcc-3.4.6.orig/gcc/doc/extend.texi gcc-3.4.6/gcc/doc/extend.texi
1.9919 ---- gcc-3.4.6.orig/gcc/doc/extend.texi 2005-02-26 23:17:26.000000000 +0100
1.9920 -+++ gcc-3.4.6/gcc/doc/extend.texi 2007-08-15 23:09:36.000000000 +0200
1.9921 -@@ -5638,12 +5638,118 @@
1.9922 - instructions, but allow the compiler to schedule those calls.
1.9923 -
1.9924 - @menu
1.9925 -+* Altera Nios II Built-in Functions::
1.9926 - * Alpha Built-in Functions::
1.9927 - * ARM Built-in Functions::
1.9928 - * X86 Built-in Functions::
1.9929 - * PowerPC AltiVec Built-in Functions::
1.9930 - @end menu
1.9931 -
1.9932 -+@node Altera Nios II Built-in Functions
1.9933 -+@subsection Altera Nios II Built-in Functions
1.9934 -+
1.9935 -+These built-in functions are available for the Altera Nios II
1.9936 -+family of processors.
1.9937 -+
1.9938 -+The following built-in functions are always available. They
1.9939 -+all generate the machine instruction that is part of the name.
1.9940 -+
1.9941 -+@example
1.9942 -+int __builtin_ldbio (volatile const void *)
1.9943 -+int __builtin_ldbuio (volatile const void *)
1.9944 -+int __builtin_ldhio (volatile const void *)
1.9945 -+int __builtin_ldhuio (volatile const void *)
1.9946 -+int __builtin_ldwio (volatile const void *)
1.9947 -+void __builtin_stbio (volatile void *, int)
1.9948 -+void __builtin_sthio (volatile void *, int)
1.9949 -+void __builtin_stwio (volatile void *, int)
1.9950 -+void __builtin_sync (void)
1.9951 -+int __builtin_rdctl (int)
1.9952 -+void __builtin_wrctl (int, int)
1.9953 -+@end example
1.9954 -+
1.9955 -+The following built-in functions are always available. They
1.9956 -+all generate a Nios II Custom Instruction. The name of the
1.9957 -+function represents the types that the function takes and
1.9958 -+returns. The letter before the @code{n} is the return type
1.9959 -+or void if absent. The @code{n} represnts the first parameter
1.9960 -+to all the custom instructions, the custom instruction number.
1.9961 -+The two letters after the @code{n} represent the up to two
1.9962 -+parameters to the function.
1.9963 -+
1.9964 -+The letters reprsent the following data types:
1.9965 -+@table @code
1.9966 -+@item <no letter>
1.9967 -+@code{void} for return type and no parameter for parameter types.
1.9968 -+
1.9969 -+@item i
1.9970 -+@code{int} for return type and parameter type
1.9971 -+
1.9972 -+@item f
1.9973 -+@code{float} for return type and parameter type
1.9974 -+
1.9975 -+@item p
1.9976 -+@code{void *} for return type and parameter type
1.9977 -+
1.9978 -+@end table
1.9979 -+
1.9980 -+And the function names are:
1.9981 -+@example
1.9982 -+void __builtin_custom_n (void)
1.9983 -+void __builtin_custom_ni (int)
1.9984 -+void __builtin_custom_nf (float)
1.9985 -+void __builtin_custom_np (void *)
1.9986 -+void __builtin_custom_nii (int, int)
1.9987 -+void __builtin_custom_nif (int, float)
1.9988 -+void __builtin_custom_nip (int, void *)
1.9989 -+void __builtin_custom_nfi (float, int)
1.9990 -+void __builtin_custom_nff (float, float)
1.9991 -+void __builtin_custom_nfp (float, void *)
1.9992 -+void __builtin_custom_npi (void *, int)
1.9993 -+void __builtin_custom_npf (void *, float)
1.9994 -+void __builtin_custom_npp (void *, void *)
1.9995 -+int __builtin_custom_in (void)
1.9996 -+int __builtin_custom_ini (int)
1.9997 -+int __builtin_custom_inf (float)
1.9998 -+int __builtin_custom_inp (void *)
1.9999 -+int __builtin_custom_inii (int, int)
1.10000 -+int __builtin_custom_inif (int, float)
1.10001 -+int __builtin_custom_inip (int, void *)
1.10002 -+int __builtin_custom_infi (float, int)
1.10003 -+int __builtin_custom_inff (float, float)
1.10004 -+int __builtin_custom_infp (float, void *)
1.10005 -+int __builtin_custom_inpi (void *, int)
1.10006 -+int __builtin_custom_inpf (void *, float)
1.10007 -+int __builtin_custom_inpp (void *, void *)
1.10008 -+float __builtin_custom_fn (void)
1.10009 -+float __builtin_custom_fni (int)
1.10010 -+float __builtin_custom_fnf (float)
1.10011 -+float __builtin_custom_fnp (void *)
1.10012 -+float __builtin_custom_fnii (int, int)
1.10013 -+float __builtin_custom_fnif (int, float)
1.10014 -+float __builtin_custom_fnip (int, void *)
1.10015 -+float __builtin_custom_fnfi (float, int)
1.10016 -+float __builtin_custom_fnff (float, float)
1.10017 -+float __builtin_custom_fnfp (float, void *)
1.10018 -+float __builtin_custom_fnpi (void *, int)
1.10019 -+float __builtin_custom_fnpf (void *, float)
1.10020 -+float __builtin_custom_fnpp (void *, void *)
1.10021 -+void * __builtin_custom_pn (void)
1.10022 -+void * __builtin_custom_pni (int)
1.10023 -+void * __builtin_custom_pnf (float)
1.10024 -+void * __builtin_custom_pnp (void *)
1.10025 -+void * __builtin_custom_pnii (int, int)
1.10026 -+void * __builtin_custom_pnif (int, float)
1.10027 -+void * __builtin_custom_pnip (int, void *)
1.10028 -+void * __builtin_custom_pnfi (float, int)
1.10029 -+void * __builtin_custom_pnff (float, float)
1.10030 -+void * __builtin_custom_pnfp (float, void *)
1.10031 -+void * __builtin_custom_pnpi (void *, int)
1.10032 -+void * __builtin_custom_pnpf (void *, float)
1.10033 -+void * __builtin_custom_pnpp (void *, void *)
1.10034 -+@end example
1.10035 -+
1.10036 -+
1.10037 - @node Alpha Built-in Functions
1.10038 - @subsection Alpha Built-in Functions
1.10039 -
1.10040 -diff -durN gcc-3.4.6.orig/gcc/doc/invoke.texi gcc-3.4.6/gcc/doc/invoke.texi
1.10041 ---- gcc-3.4.6.orig/gcc/doc/invoke.texi 2005-10-08 02:22:20.000000000 +0200
1.10042 -+++ gcc-3.4.6/gcc/doc/invoke.texi 2007-08-15 23:09:36.000000000 +0200
1.10043 -@@ -337,6 +337,14 @@
1.10044 - @item Machine Dependent Options
1.10045 - @xref{Submodel Options,,Hardware Models and Configurations}.
1.10046 -
1.10047 -+@emph{Altera Nios II Options}
1.10048 -+@gccoptlist{-msmallc -mno-bypass-cache -mbypass-cache @gol
1.10049 -+-mno-cache-volatile -mcache-volatile -mno-inline-memcpy @gol
1.10050 -+-minline-memcpy -mno-fast-sw-div -mfast-sw-div @gol
1.10051 -+-mhw-mul -mno-hw-mul -mhw-mulx -mno-hw-mulx @gol
1.10052 -+-mno-hw-div -mhw-div @gol
1.10053 -+-msys-crt0= -msys-lib= -msys=nosys }
1.10054 -+
1.10055 - @emph{M680x0 Options}
1.10056 - @gccoptlist{-m68000 -m68020 -m68020-40 -m68020-60 -m68030 -m68040 @gol
1.10057 - -m68060 -mcpu32 -m5200 -m68881 -mbitfield -mc68000 -mc68020 @gol
1.10058 -@@ -5839,6 +5847,7 @@
1.10059 - that macro, which enables you to change the defaults.
1.10060 -
1.10061 - @menu
1.10062 -+* Altera Nios II Options::
1.10063 - * M680x0 Options::
1.10064 - * M68hc1x Options::
1.10065 - * VAX Options::
1.10066 -@@ -5874,6 +5883,103 @@
1.10067 - * FRV Options::
1.10068 - @end menu
1.10069 -
1.10070 -+
1.10071 -+@node Altera Nios II Options
1.10072 -+@subsection Altera Nios II Options
1.10073 -+@cindex Altera Nios II options
1.10074 -+
1.10075 -+These are the @samp{-m} options defined for the Altera Nios II
1.10076 -+processor.
1.10077 -+
1.10078 -+@table @gcctabopt
1.10079 -+
1.10080 -+@item -msmallc
1.10081 -+@opindex msmallc
1.10082 -+
1.10083 -+Link with a limited version of the C library, -lsmallc. For more
1.10084 -+information see the C Library Documentation.
1.10085 -+
1.10086 -+
1.10087 -+@item -mbypass-cache
1.10088 -+@itemx -mno-bypass-cache
1.10089 -+@opindex mno-bypass-cache
1.10090 -+@opindex mbypass-cache
1.10091 -+
1.10092 -+Force all load and store instructions to always bypass cache by
1.10093 -+using io variants of the instructions. The default is to not
1.10094 -+bypass the cache.
1.10095 -+
1.10096 -+@item -mno-cache-volatile
1.10097 -+@itemx -mcache-volatile
1.10098 -+@opindex mcache-volatile
1.10099 -+@opindex mno-cache-volatile
1.10100 -+
1.10101 -+Volatile memory access bypass the cache using the io variants of
1.10102 -+the ld and st instructions. The default is to cache volatile
1.10103 -+accesses.
1.10104 -+
1.10105 -+-mno-cache-volatile is deprecated and will be deleted in a
1.10106 -+future GCC release.
1.10107 -+
1.10108 -+
1.10109 -+@item -mno-inline-memcpy
1.10110 -+@itemx -minline-memcpy
1.10111 -+@opindex mno-inline-memcpy
1.10112 -+@opindex minline-memcpy
1.10113 -+
1.10114 -+Do not inline memcpy. The default is to inline when -O is on.
1.10115 -+
1.10116 -+
1.10117 -+@item -mno-fast-sw-div
1.10118 -+@itemx -mfast-sw-div
1.10119 -+@opindex mno-fast-sw-div
1.10120 -+@opindex mfast-sw-div
1.10121 -+
1.10122 -+Do no use table based fast divide for small numbers. The default
1.10123 -+is to use the fast divide at -O3 and above.
1.10124 -+
1.10125 -+
1.10126 -+@item -mno-hw-mul
1.10127 -+@itemx -mhw-mul
1.10128 -+@itemx -mno-hw-mulx
1.10129 -+@itemx -mhw-mulx
1.10130 -+@itemx -mno-hw-div
1.10131 -+@itemx -mhw-div
1.10132 -+@opindex mno-hw-mul
1.10133 -+@opindex mhw-mul
1.10134 -+@opindex mno-hw-mulx
1.10135 -+@opindex mhw-mulx
1.10136 -+@opindex mno-hw-div
1.10137 -+@opindex mhw-div
1.10138 -+
1.10139 -+Enable or disable emitting @code{mul}, @code{mulx} and @code{div} family of
1.10140 -+instructions by the compiler. The default is to emit @code{mul}
1.10141 -+and not emit @code{div} and @code{mulx}.
1.10142 -+
1.10143 -+The different combinations of @code{mul} and @code{mulx} instructions
1.10144 -+generate a different multilib options.
1.10145 -+
1.10146 -+
1.10147 -+@item -msys-crt0=@var{startfile}
1.10148 -+@opindex msys-crt0
1.10149 -+
1.10150 -+@var{startfile} is the file name of the startfile (crt0) to use
1.10151 -+when linking. The default is crt0.o that comes with libgloss
1.10152 -+and is only suitable for use with the instruction set
1.10153 -+simulator.
1.10154 -+
1.10155 -+@item -msys-lib=@var{systemlib}
1.10156 -+@itemx -msys-lib=nosys
1.10157 -+@opindex msys-lib
1.10158 -+
1.10159 -+@var{systemlib} is the library name of the library which provides
1.10160 -+the system calls required by the C library, e.g. @code{read}, @code{write}
1.10161 -+etc. The default is to use nosys, this library provides
1.10162 -+stub implementations of the calls and is part of libgloss.
1.10163 -+
1.10164 -+@end table
1.10165 -+
1.10166 -+
1.10167 - @node M680x0 Options
1.10168 - @subsection M680x0 Options
1.10169 - @cindex M680x0 options
1.10170 -diff -durN gcc-3.4.6.orig/gcc/doc/md.texi gcc-3.4.6/gcc/doc/md.texi
1.10171 ---- gcc-3.4.6.orig/gcc/doc/md.texi 2004-11-13 23:31:42.000000000 +0100
1.10172 -+++ gcc-3.4.6/gcc/doc/md.texi 2007-08-15 23:09:36.000000000 +0200
1.10173 -@@ -1337,6 +1337,49 @@
1.10174 - available on some particular machines.
1.10175 -
1.10176 - @table @emph
1.10177 -+
1.10178 -+@item Altera Nios II family---@file{nios2.h}
1.10179 -+@table @code
1.10180 -+
1.10181 -+@item I
1.10182 -+Integer that is valid as an immediate operand in an
1.10183 -+instruction taking a signed 16-bit number. Range
1.10184 -+@minus{}32768 to 32767.
1.10185 -+
1.10186 -+@item J
1.10187 -+Integer that is valid as an immediate operand in an
1.10188 -+instruction taking an unsigned 16-bit number. Range
1.10189 -+0 to 65535.
1.10190 -+
1.10191 -+@item K
1.10192 -+Integer that is valid as an immediate operand in an
1.10193 -+instruction taking only the upper 16-bits of a
1.10194 -+32-bit number. Range 32-bit numbers with the lower
1.10195 -+16-bits being 0.
1.10196 -+
1.10197 -+@item L
1.10198 -+Integer that is valid as an immediate operand for a
1.10199 -+shift instruction. Range 0 to 31.
1.10200 -+
1.10201 -+
1.10202 -+@item M
1.10203 -+Integer that is valid as an immediate operand for
1.10204 -+only the value 0. Can be used in conjunction with
1.10205 -+the format modifier @code{z} to use @code{r0}
1.10206 -+instead of @code{0} in the assembly output.
1.10207 -+
1.10208 -+@item N
1.10209 -+Integer that is valid as an immediate operand for
1.10210 -+a custom instruction opcode. Range 0 to 255.
1.10211 -+
1.10212 -+@item S
1.10213 -+Matches immediates which are addresses in the small
1.10214 -+data section and therefore can be added to @code{gp}
1.10215 -+as a 16-bit immediate to re-create their 32-bit value.
1.10216 -+
1.10217 -+@end table
1.10218 -+
1.10219 -+
1.10220 - @item ARM family---@file{arm.h}
1.10221 - @table @code
1.10222 - @item f
1.10223 -diff -durN gcc-3.4.6.orig/gcc/Makefile.in gcc-3.4.6/gcc/Makefile.in
1.10224 ---- gcc-3.4.6.orig/gcc/Makefile.in 2005-02-24 10:26:59.000000000 +0100
1.10225 -+++ gcc-3.4.6/gcc/Makefile.in 2007-08-15 23:09:36.000000000 +0200
1.10226 -@@ -3094,7 +3094,7 @@
1.10227 - $(INSTALL_DATA) $(srcdir)/README-fixinc \
1.10228 - $(DESTDIR)$(itoolsdatadir)/include/README ; \
1.10229 - $(INSTALL_SCRIPT) fixinc.sh $(DESTDIR)$(itoolsdir)/fixinc.sh ; \
1.10230 -- $(INSTALL_PROGRAM) fixinc/fixincl $(DESTDIR)$(itoolsdir)/fixincl ; \
1.10231 -+ $(INSTALL_PROGRAM) fixinc/fixincl$(build_exeext) $(DESTDIR)$(itoolsdir)/fixincl$(build_exeext) ; \
1.10232 - $(INSTALL_DATA) $(srcdir)/gsyslimits.h \
1.10233 - $(DESTDIR)$(itoolsdatadir)/gsyslimits.h ; \
1.10234 - else :; fi